--- /dev/null
+language: c
+os:
+ - linux
+ - osx
+sudo: required
+dist: trusty
+install:
+ - if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then ./.travis/install-debian.sh; fi
+ - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then ./.travis/install-macos.sh; fi
+script:
+ - if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then ./.travis/build-debian.sh; fi
+ - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then ./.travis/build-macos.sh; fi
+deploy:
+ - provider: releases
+ api_key:
+ secure: dDlkIawHcODlW9B/20/cQCtzeoocvs0hKuNngRKXKqzXLWTRq33oq/B7+39tAixWbmv6exTpijiKrRNFiSCW5Z4iwHLwaRD4XJznxw63e/Hus/dxg2Tvqx7XFpkCz8mT1Z+gZQE5YxAngeZPpI/sZbZtF1UO3yH5eLeeokZ15p26ZskQUPoYuzrTgTzYL3XfpG3F+20rNBawH1ycsCTVD/08/n31d2m3CrKAsbW7er92ek6w4fzKr7NW8WeXjrPJETVpw5fQg1Od3pRGW8dPQaJcvKQEogMp8Mm0ETYd0qigg89/giBz7QwOgmAWQ4dH+DfZH4Ojl//127QztBolMvyDMQBykWrtJoGcij05sT6K2IJr2FHeUBO12MAEdjiVvhQj3DtTzjPiZAHHDBSLWxLKWWhlhHE4pq7g1MQhqXkaAHI2BLNzwLmaowbMT0bECf9yfz6xx18h6XPQFX44oOktraobVALFlyHqeKa8zdcUt22LF6uAL1m5dxL0tny3eXCIPE4UH/RZgua/cHV9G3cUvKQa/QnFSLRhvWVSbGB+7YsHouBJcsUOOW1gmd5442XuC7mpppccRldh+GSxUk6TBJRAx7TeQ0ybDUaoco9MUqp2twv3KreR2+8Q12PDaAhfQVNEGdF3wTm1sShImjCN4VN3eSLlBEbve1QRQXM=
+ skip_cleanup: true
+ file: build/solvespace.dmg
+ on:
+ repo: solvespace/solvespace
+ tags: true
+ condition: "$TRAVIS_OS_NAME == osx"
--- /dev/null
+Changelog
+=========
+
+2.3
+---
+
+Bug fixes:
+ * Do not crash when applying a symmetry constraint to two points.
+ * Fix TTF font metrics again (properly this time).
+ * Fix the "draw back faces in red" option.
+ * Fix export of wireframe as 3D DXF.
+ * Various minor crashes.
+
+2.2
+---
+
+Other new features:
+ * OS X: support 3Dconnexion devices (SpaceMouse, SpaceNavigator, etc).
+ * GTK: files with uppercase extensions can be opened.
+
+Bug fixes:
+ * Do not remove autosaves after successfully opening a file, preventing
+ data loss in case of two abnormal terminations in a row.
+ * Do not crash when changing autosave interval.
+ * Unbreak the "Show degrees of freedom" command.
+ * Three.js: correctly respond to controls when browser zoom is used.
+ * OS X: do not completely hide main window when defocused.
+ * GTK: unbreak 3Dconnexion support.
+ * When pasting transformed entities, multiply constraint values by scale.
+ * Fix TTF font metrics (restore the behavior from version 2.0).
+ * Forcibly show the current group once we start a drawing operation.
+ * DXF export: always declare layers before using them.
+ * Do not truncate operations on selections to first 32 selected entities.
+ * Translate and rotate groups inherit the "suppress solid model" setting.
+ * DXF: files with paths containing non-ASCII or spaces can be exported
+ or imported.
+ * Significantly improved performance when dragging an entity.
+ * Various crashes and minor glitches.
+
+2.1
+---
+
+New sketch features:
+ * Lathe groups create circle and face entities.
+ * New toolbar button for creating lathe groups.
+ * Chord tolerance is separated into two: display chord tolerance (specified
+ in percents, relative to model bounding box), and export chord tolerance
+ (specified in millimeters as absolute value).
+ * Bezier spline points can be added and removed after the spline is created.
+ * When an unconstrained extrusion is switched between "union" and
+ "difference", its normal is flipped.
+ * Groups can be added in the middle of the stack. Note that this results
+ in files incompatible with version 2.0.
+ * Active group can be removed.
+ * Removing an imported group does not cause all subsequent groups to also
+ be removed.
+ * When a new group with a solid is created, the color is taken from
+ a previous group with a solid, if any.
+ * Entities in a newly active group do not become visible.
+ * When entities are selected, "Zoom to fit" zooms to fit only these
+ entities and not the entire sketch.
+ * Zero-length edges are reported with a "zero-length error", not
+ "points not all coplanar".
+
+New constraint features:
+ * Height of the font used for drawing constraint labels can be changed.
+ * New constraint, length difference, placed with J.
+ (Patch by Peter Ruevski)
+ * Horizontal/vertical constraints are automatically added if a line segment
+ is close enough to being horizontal/vertical. This can be disabled by
+ holding Ctrl.
+ * Reference dimensions and angles can be placed with Shift+D and Shift+N.
+ * Copying and pasting entities duplicates any constraints that only involve
+ entities in the clipboard, as well as selected comments.
+ * Diameter constraints can be shown as radius.
+ * The "pi" identifier can be used in expressions.
+ * Constraint labels can be snapped to grid.
+ * Integer angles are displayed without trailing zeroes.
+ * Angle constraints have proper reference lines and arrowheads.
+ * Extension lines are drawn for point-line distance constraints.
+
+New solver features:
+ * Sketches with redundant and unsolvable constraints are distinguished.
+ * New group setting, "allow redundant constraints". Note that it makes
+ the solver less stable.
+
+New rendering and styling features:
+ * New line style parameter: stippling, based on ISO 128.
+ * Outlines of solids can be drawn in a particular style (by default, thick
+ lines) controlled by the "Show outline of solid model" button.
+ * Occluded edges can be drawn in a particular style (by default, stippled
+ with short dashes) controlled by the "Show hidden lines" button.
+ * Solids can be made transparent.
+
+New export/import features:
+ * The old "import" command (for .slvs files) is renamed to "link".
+ * If a linked .slvs file is not found, first the relative path recorded
+ in the .slvs file is checked and then the absolute path; this is
+ an inversion of the previously used order. If it is still not found,
+ a dialog appears offering to locate it.
+ * DXF and DWG files can be imported, with point-coincident, horizontal and
+ vertical constraints automatically inferred from geometry, and distance
+ and angle constraints created when a dimension placed against geometry
+ exists.
+ * Triangle mesh can be exported for viewing in the browser through WebGL.
+ * Export dialogs remember the last file format used, and preselect it.
+ * Exported DXF files have exact circles, arcs and splines instead of
+ a piecewise linear approximation (unless hidden line removal was needed).
+ * Exported DXF files preserve color and line thickness.
+ * In exported DXF files, constraints are represented as DXF dimensions,
+ instead of piecewise linear geometry.
+ * When exporting 2d views, overlapping lines are removed.
+
+Other new features:
+ * Native Linux (GTK 2 and GTK 3) and Mac OS X ports.
+ * Automatically save and then restore sketches if SolveSpace crashes.
+ (Patch by Marc Britten)
+ * Unicode is supported everywhere (filenames, group names, TTF text,
+ comments), although RTL scripts and scripts making heavy use of ligatures
+ are not rendered correctly.
+ * The vector font is grid-fitted when rendered on screen to make it easier
+ to read regardless of its size.
+
+2.0
+---
+
+Initial public release.
--- /dev/null
+# cmake configuration
+
+cmake_minimum_required(VERSION 3.1.0 FATAL_ERROR)
+cmake_policy(VERSION 3.1.0)
+set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH}
+ "${CMAKE_SOURCE_DIR}/cmake/")
+set(CMAKE_CXX_STANDARD 11)
+set(CMAKE_CXX_STANDARD_REQUIRED YES)
+
+include(CheckIncludeFile)
+
+# for /MT on MSVC
+set(CMAKE_USER_MAKE_RULES_OVERRIDE
+ "${CMAKE_SOURCE_DIR}/cmake/c_flag_overrides.cmake")
+set(CMAKE_USER_MAKE_RULES_OVERRIDE_CXX
+ "${CMAKE_SOURCE_DIR}/cmake/cxx_flag_overrides.cmake")
+
+# project
+
+# NOTE TO PACKAGERS: The embedded git commit hash is critical for rapid bug triage when the builds
+# can come from a variety of sources. If you are mirroring the sources or otherwise build when
+# the .git directory is not present, please comment the following line:
+include(GetGitCommitHash)
+# and instead uncomment the following, adding the complete git hash of the checkout you are using:
+# set(GIT_COMMIT_HASH 0000000000000000000000000000000000000000)
+
+project(solvespace)
+set(solvespace_VERSION_MAJOR 2)
+set(solvespace_VERSION_MINOR 3)
+string(SUBSTRING "${GIT_COMMIT_HASH}" 0 8 solvespace_GIT_HASH)
+
+if(NOT WIN32 AND NOT APPLE)
+ set(GUI gtk2 CACHE STRING "GUI toolkit to use (one of: gtk2 gtk3)")
+endif()
+
+# compiler
+
+if(WIN32)
+ add_definitions(
+ -D_CRT_SECURE_NO_DEPRECATE
+ -D_CRT_SECURE_NO_WARNINGS
+ -D_SCL_SECURE_NO_WARNINGS
+ -D_WIN32_WINNT=0x500
+ -D_WIN32_IE=_WIN32_WINNT
+ -DISOLATION_AWARE_ENABLED
+ -DWIN32
+ -DWIN32_LEAN_AND_MEAN
+ -DUNICODE
+ -DNOMINMAX
+ -D_UNICODE)
+endif()
+
+if(MSVC)
+ # Many versions of MSVC do not have the (C99) inline keyword, instead
+ # they have their own __inline; this breaks `static inline` functions.
+ # We do not want to care and so we fix this with a definition.
+ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /Dinline=__inline")
+endif()
+
+if(CMAKE_CXX_COMPILER_ID STREQUAL GNU OR CMAKE_CXX_COMPILER_ID STREQUAL Clang)
+ set(WARNING_FLAGS "-Wall -Wextra -Wno-unused-parameter")
+ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${WARNING_FLAGS}")
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 ${WARNING_FLAGS}")
+endif()
+
+if(MINGW)
+ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -static-libgcc")
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -static-libgcc -static-libstdc++")
+endif()
+
+if(APPLE)
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++")
+endif()
+
+if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
+ set(CMAKE_EXE_LINKER_FLAGS "-Wl,--as-needed ${CMAKE_EXE_LINKER_FLAGS}")
+endif()
+
+if(CMAKE_SYSTEM_NAME STREQUAL "FreeBSD")
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++")
+ set(CMAKE_EXE_LINKER_FLAGS "-Wl,--as-needed ${CMAKE_EXE_LINKER_FLAGS}")
+endif()
+
+if(SANITIZE)
+ if(NOT (CMAKE_C_COMPILER_ID STREQUAL Clang AND CMAKE_CXX_COMPILER_ID STREQUAL Clang))
+ message(ERROR "Sanitizers are only available in Clang/Clang++")
+ endif()
+ set(SANITIZE_FLAGS "-O1 -fno-omit-frame-pointer -fno-optimize-sibling-calls")
+ set(SANITIZE_FLAGS "${SANITIZE_FLAGS} -fsanitize=address,undefined,integer")
+ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${SANITIZE_FLAGS}")
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${SANITIZE_FLAGS}")
+endif()
+
+# dependencies
+
+find_package(OpenGL REQUIRED)
+
+message(STATUS "Using in-tree libdxfrw")
+add_subdirectory(extlib/libdxfrw)
+
+if(WIN32)
+ # Configure Freetype first. If done later, it will notice that
+ # zlib is available, try to use it and promptly break on MSVC
+ # in a very obscure way. Given that the only use of zlib, bzip2
+ # and png support is in support for extremely obsolete Unix fonts,
+ # we don't care.
+ find_package(Freetype)
+
+ if(NOT FREETYPE_FOUND)
+ message(STATUS "Using in-tree libfreetype")
+
+ add_subdirectory(extlib/libfreetype EXCLUDE_FROM_ALL)
+
+ set(FREETYPE_LIBRARY
+ freetype)
+ set(FREETYPE_INCLUDE_DIRS
+ "${CMAKE_SOURCE_DIR}/extlib/libfreetype/include")
+ find_package(Freetype REQUIRED)
+ endif()
+
+ find_package(ZLIB)
+
+ if(NOT ZLIB_FOUND)
+ message(STATUS "Using in-tree zlib")
+ add_subdirectory(extlib/zlib EXCLUDE_FROM_ALL)
+
+ message(STATUS "Using in-tree libpng")
+ set(ZLIB_LIBRARY
+ zlibstatic)
+ set(ZLIB_INCLUDE_DIR
+ "${CMAKE_SOURCE_DIR}/extlib/zlib"
+ "${CMAKE_BINARY_DIR}/extlib/zlib")
+ find_package(ZLIB REQUIRED)
+ endif()
+
+ find_package(PNG)
+
+ if(NOT PNG_FOUND)
+ message(STATUS "Using in-tree libpng")
+
+ set(SKIP_INSTALL_ALL
+ ON)
+ add_subdirectory(extlib/libpng EXCLUDE_FROM_ALL)
+
+ set(PNG_LIBRARY
+ png16_static)
+ set(PNG_PNG_INCLUDE_DIR
+ "${CMAKE_SOURCE_DIR}/extlib/libpng"
+ "${CMAKE_BINARY_DIR}/extlib/libpng")
+ find_package(PNG REQUIRED)
+ endif()
+
+ if(NOT MINGW)
+ message(STATUS "Using prebuilt SpaceWare")
+ set(SPACEWARE_FOUND TRUE)
+ set(SPACEWARE_INCLUDE_DIR
+ "${CMAKE_SOURCE_DIR}/extlib/si")
+ set(SPACEWARE_LIBRARIES
+ "${CMAKE_SOURCE_DIR}/extlib/si/siapp.lib")
+ endif()
+elseif(APPLE)
+ set(CMAKE_FIND_FRAMEWORK LAST)
+
+ find_package(PNG REQUIRED)
+ find_package(Freetype REQUIRED)
+ find_library(APPKIT_LIBRARY AppKit REQUIRED)
+else() # Linux and compatible systems
+ find_package(SpaceWare)
+
+ # Use freedesktop's pkg-config to locate everything.
+ find_package(PkgConfig REQUIRED)
+ pkg_check_modules(ZLIB REQUIRED zlib)
+ pkg_check_modules(PNG REQUIRED libpng)
+ pkg_check_modules(FONTCONFIG REQUIRED fontconfig)
+ pkg_check_modules(JSONC REQUIRED json-c)
+ pkg_check_modules(GLEW REQUIRED glew)
+ pkg_check_modules(FREETYPE REQUIRED freetype2)
+
+ set(HAVE_GTK TRUE)
+ if(GUI STREQUAL "gtk3")
+ set(HAVE_GTK3 TRUE)
+ pkg_check_modules(GTKMM REQUIRED gtkmm-3.0 pangomm-1.4 x11)
+ elseif(GUI STREQUAL "gtk2")
+ set(HAVE_GTK2 TRUE)
+ pkg_check_modules(GTKMM REQUIRED gtkmm-2.4 pangomm-1.4 x11)
+ else()
+ message(FATAL_ERROR "GUI unrecognized: ${GUI}")
+ endif()
+endif()
+
+# components
+
+add_subdirectory(tools)
+add_subdirectory(src)
+add_subdirectory(exposed)
--- /dev/null
+
+ GNU GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users. We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors. You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+ To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights. Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received. You must make sure that they, too, receive
+or can get the source code. And you must show them these terms so they
+know their rights.
+
+ Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+ For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software. For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+ Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so. This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software. The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable. Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products. If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+ Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary. To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ TERMS AND CONDITIONS
+
+ 0. Definitions.
+
+ "This License" refers to version 3 of the GNU General Public License.
+
+ "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+ "The Program" refers to any copyrightable work licensed under this
+License. Each licensee is addressed as "you". "Licensees" and
+"recipients" may be individuals or organizations.
+
+ To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy. The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+ A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+ To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+ To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+ An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+ 1. Source Code.
+
+ The "source code" for a work means the preferred form of the work
+for making modifications to it. "Object code" means any non-source
+form of a work.
+
+ A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+ The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+ The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+ The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+ The Corresponding Source for a work in source code form is that
+same work.
+
+ 2. Basic Permissions.
+
+ All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+ You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force. You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright. Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+ Conveying under any other circumstances is permitted solely under
+the conditions stated below. Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+ No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+ When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+ 4. Conveying Verbatim Copies.
+
+ You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+ You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+ 5. Conveying Modified Source Versions.
+
+ You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+ a) The work must carry prominent notices stating that you modified
+ it, and giving a relevant date.
+
+ b) The work must carry prominent notices stating that it is
+ released under this License and any conditions added under section
+ 7. This requirement modifies the requirement in section 4 to
+ "keep intact all notices".
+
+ c) You must license the entire work, as a whole, under this
+ License to anyone who comes into possession of a copy. This
+ License will therefore apply, along with any applicable section 7
+ additional terms, to the whole of the work, and all its parts,
+ regardless of how they are packaged. This License gives no
+ permission to license the work in any other way, but it does not
+ invalidate such permission if you have separately received it.
+
+ d) If the work has interactive user interfaces, each must display
+ Appropriate Legal Notices; however, if the Program has interactive
+ interfaces that do not display Appropriate Legal Notices, your
+ work need not make them do so.
+
+ A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+ 6. Conveying Non-Source Forms.
+
+ You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+ a) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by the
+ Corresponding Source fixed on a durable physical medium
+ customarily used for software interchange.
+
+ b) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by a
+ written offer, valid for at least three years and valid for as
+ long as you offer spare parts or customer support for that product
+ model, to give anyone who possesses the object code either (1) a
+ copy of the Corresponding Source for all the software in the
+ product that is covered by this License, on a durable physical
+ medium customarily used for software interchange, for a price no
+ more than your reasonable cost of physically performing this
+ conveying of source, or (2) access to copy the
+ Corresponding Source from a network server at no charge.
+
+ c) Convey individual copies of the object code with a copy of the
+ written offer to provide the Corresponding Source. This
+ alternative is allowed only occasionally and noncommercially, and
+ only if you received the object code with such an offer, in accord
+ with subsection 6b.
+
+ d) Convey the object code by offering access from a designated
+ place (gratis or for a charge), and offer equivalent access to the
+ Corresponding Source in the same way through the same place at no
+ further charge. You need not require recipients to copy the
+ Corresponding Source along with the object code. If the place to
+ copy the object code is a network server, the Corresponding Source
+ may be on a different server (operated by you or a third party)
+ that supports equivalent copying facilities, provided you maintain
+ clear directions next to the object code saying where to find the
+ Corresponding Source. Regardless of what server hosts the
+ Corresponding Source, you remain obligated to ensure that it is
+ available for as long as needed to satisfy these requirements.
+
+ e) Convey the object code using peer-to-peer transmission, provided
+ you inform other peers where the object code and Corresponding
+ Source of the work are being offered to the general public at no
+ charge under subsection 6d.
+
+ A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+ A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling. In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage. For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product. A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+ "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source. The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+ If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+ The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed. Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+ Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+ 7. Additional Terms.
+
+ "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+ When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+ Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+ a) Disclaiming warranty or limiting liability differently from the
+ terms of sections 15 and 16 of this License; or
+
+ b) Requiring preservation of specified reasonable legal notices or
+ author attributions in that material or in the Appropriate Legal
+ Notices displayed by works containing it; or
+
+ c) Prohibiting misrepresentation of the origin of that material, or
+ requiring that modified versions of such material be marked in
+ reasonable ways as different from the original version; or
+
+ d) Limiting the use for publicity purposes of names of licensors or
+ authors of the material; or
+
+ e) Declining to grant rights under trademark law for use of some
+ trade names, trademarks, or service marks; or
+
+ f) Requiring indemnification of licensors and authors of that
+ material by anyone who conveys the material (or modified versions of
+ it) with contractual assumptions of liability to the recipient, for
+ any liability that these contractual assumptions directly impose on
+ those licensors and authors.
+
+ All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+ If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+ Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+ 8. Termination.
+
+ You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+ However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+ Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+ 9. Acceptance Not Required for Having Copies.
+
+ You are not required to accept this License in order to receive or
+run a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+ 10. Automatic Licensing of Downstream Recipients.
+
+ Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+
+ An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+ You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+ 11. Patents.
+
+ A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's "contributor version".
+
+ A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+ In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+ If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+ If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+ A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License. You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+ Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+ 12. No Surrender of Others' Freedom.
+
+ If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all. For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+ 13. Use with the GNU Affero General Public License.
+
+ Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work. The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+ If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+ Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+ 15. Disclaimer of Warranty.
+
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. Limitation of Liability.
+
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+ 17. Interpretation of Sections 15 and 16.
+
+ If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+ If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+ <program> Copyright (C) <year> <name of author>
+ This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+ You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+ The GNU General Public License does not permit incorporating your program
+into proprietary programs. If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License. But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
--- /dev/null
+SolveSpace
+==========
+
+This repository contains the source code of [SolveSpace][], a parametric
+2d/3d CAD.
+
+[solvespace]: http://solvespace.com
+
+Installation
+------------
+
+### Mac OS X (>=10.6 64-bit), Debian (>=jessie) and Ubuntu (>=trusty)
+
+Binary packages for Mac OS X and Debian derivatives are available
+via [GitHub releases][rel].
+
+[rel]: https://github.com/solvespace/solvespace/releases
+
+### Other systems
+
+See below.
+
+Building on Linux
+-----------------
+
+### Building for Linux
+
+You will need CMake, libpng, zlib, json-c, fontconfig, freetype, gtkmm 2.4,
+pangomm 1.4, OpenGL, OpenGL GLU and OpenGL GLEW, and optionally, the Space Navigator
+client library.
+On a Debian derivative (e.g. Ubuntu) these can be installed with:
+
+ apt-get install libpng12-dev libjson-c-dev libfreetype6-dev \
+ libfontconfig1-dev libgtkmm-2.4-dev libpangomm-1.4-dev \
+ libgl-dev libglu-dev libglew-dev libspnav-dev cmake
+
+Before building, check out the necessary submodules:
+
+ git submodule update --init extlib/libdxfrw
+
+After that, build SolveSpace as following:
+
+ mkdir build
+ cd build
+ cmake ..
+ make
+ sudo make install
+
+A fully functional port to GTK3 is available, but not recommended
+for use due to bugs in this toolkit.
+
+### Building for Windows
+
+You will need CMake, a Windows cross-compiler, and Wine with binfmt support.
+On a Debian derivative (e.g. Ubuntu) these can be installed with:
+
+ apt-get install cmake mingw-w64 wine-binfmt
+
+Before building, check out the necessary submodules:
+
+ git submodule update --init
+
+After that, build 32-bit SolveSpace as following:
+
+ mkdir build
+ cd build
+ cmake -DCMAKE_TOOLCHAIN_FILE=../cmake/Toolchain-mingw32.cmake ..
+ make solvespace
+
+Or, build 64-bit SolveSpace as following:
+
+ mkdir build
+ cd build
+ cmake -DCMAKE_TOOLCHAIN_FILE=../cmake/Toolchain-mingw64.cmake ..
+ make solvespace
+
+The application is built as `build/src/solvespace.exe`.
+
+Space Navigator support will not be available.
+
+Building on Mac OS X
+--------------------
+
+You will need XCode tools, CMake, libpng and Freetype. Assuming you use
+[homebrew][], these can be installed with:
+
+ brew install cmake libpng freetype
+
+XCode has to be installed via AppStore; it requires a free Apple ID.
+
+Before building, check out the necessary submodules:
+
+ git submodule update --init extlib/libdxfrw
+
+After that, build SolveSpace as following:
+
+ mkdir build
+ cd build
+ cmake ..
+ make
+
+The app bundle is built in `build/src/solvespace.app`.
+
+[homebrew]: http://brew.sh/
+
+Building on Windows
+-------------------
+
+You will need [cmake][cmakewin] and Visual C++.
+
+### GUI build
+
+Check out the git submodules. Create a directory `build` in
+the source tree and point cmake-gui to the source tree and that directory.
+Press "Configure" and "Generate", then open `build\solvespace.sln` with
+Visual C++ and build it.
+
+### Command-line build
+
+First, ensure that git and cl (the Visual C++ compiler driver) are in your
+`%PATH%`; the latter is usually done by invoking `vcvarsall.bat` from your
+Visual Studio install. Then, run the following in cmd or PowerShell:
+
+ git submodule update --init
+ mkdir build
+ cd build
+ cmake .. -G "NMake Makefiles"
+ nmake
+
+### MSVC build
+
+It is also possible to build SolveSpace using [MinGW][mingw], though
+Space Navigator support will be disabled.
+
+First, ensure that git and gcc are in your `$PATH`. Then, run the following
+in bash:
+
+ git submodule update --init
+ mkdir build
+ cd build
+ cmake ..
+ make
+
+[cmakewin]: http://www.cmake.org/download/#latest
+[mingw]: http://www.mingw.org/
+
+License
+-------
+
+SolveSpace is distributed under the terms of the [GPL3 license](COPYING.txt).
--- /dev/null
+version: 2.2.{build}
+clone_depth: 1
+before_build:
+ - git submodule update --init
+ - mkdir build
+ - cd build
+ - set tag=x%APPVEYOR_REPO_TAG_NAME%
+ - if %tag:~,2% == xv (set BUILD_TYPE=RelWithDebInfo) else (set BUILD_TYPE=Debug)
+ - cmake -G"Visual Studio 12" -T v120_xp -DCMAKE_BUILD_TYPE=%BUILD_TYPE% ..
+build_script:
+ - msbuild "src\solvespace.vcxproj" /verbosity:minimal /property:Configuration=%BUILD_TYPE% /logger:"C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll"
+artifacts:
+ - path: build\src\Debug\solvespace.exe
+ name: solvespace.exe
+ - path: build\src\Debug\solvespace.pdb
+ name: solvespace.pdb
+ - path: build\src\RelWithDebInfo\solvespace.exe
+ name: solvespace.exe
+ - path: build\src\RelWithDebInfo\solvespace.pdb
+ name: solvespace.pdb
+deploy:
+ - provider: GitHub
+ auth_token:
+ secure: P9/pf2nM+jlWKe7pCjMp41HycBNP/+5AsmE/TETrDUoBOa/9WFHelqdVFrbRn9IC
+ description: ""
+ artifact: solvespace.exe
+ on:
+ appveyor_repo_tag: true
--- /dev/null
+# Find the libspnav library and header.
+#
+# Sets the usual variables expected for find_package scripts:
+#
+# SPACEWARE_INCLUDE_DIR - header location
+# SPACEWARE_LIBRARIES - library to link against
+# SPACEWARE_FOUND - true if pugixml was found.
+
+if(UNIX)
+
+ find_path(SPACEWARE_INCLUDE_DIR
+ spnav.h)
+
+ find_library(SPACEWARE_LIBRARY
+ NAMES spnav libspnav)
+
+ # Support the REQUIRED and QUIET arguments, and set SPACEWARE_FOUND if found.
+ include(FindPackageHandleStandardArgs)
+ FIND_PACKAGE_HANDLE_STANDARD_ARGS(SPACEWARE DEFAULT_MSG
+ SPACEWARE_LIBRARY SPACEWARE_INCLUDE_DIR)
+
+ if(SPACEWARE_FOUND)
+ set(SPACEWARE_LIBRARIES ${SPACEWARE_LIBRARY})
+ endif()
+
+ mark_as_advanced(SPACEWARE_LIBRARY SPACEWARE_INCLUDE_DIR)
+
+endif()
--- /dev/null
+function(get_git_commit_hash)
+ get_filename_component(GIT_DESCRIBE_CMAKE_DIR ${CMAKE_CURRENT_LIST_FILE} PATH)
+ get_filename_component(GIT_ROOT ${GIT_DESCRIBE_CMAKE_DIR} PATH)
+ set(GIT_DIR "${GIT_ROOT}/.git")
+
+ # Add a CMake configure dependency to the currently checked out revision.
+ set(GIT_DEPENDS ${GIT_DIR}/HEAD)
+ file(READ ${GIT_DIR}/HEAD HEAD_REF)
+ if(HEAD_REF MATCHES "ref: (.+)\n")
+ set(HEAD_REF ${CMAKE_MATCH_1})
+ if(EXISTS "${GIT_DIR}/${HEAD_REF}")
+ list(APPEND GIT_DEPENDS ${GIT_DIR}/${HEAD_REF})
+ file(READ ${GIT_DIR}/${HEAD_REF} HEAD_REF)
+ elseif(EXISTS "${GIT_DIR}/packed-refs")
+ list(APPEND GIT_DEPENDS ${GIT_DIR}/packed-refs)
+ file(READ "${GIT_DIR}/packed-refs" PACKED_REFS)
+ if(${PACKED_REFS} MATCHES "([0-9a-z]*) ${HEAD_REF}")
+ set(HEAD_REF ${CMAKE_MATCH_1})
+ else()
+ set(HEAD_REF "")
+ endif()
+ else()
+ set(HEAD_REF "")
+ endif()
+ endif()
+ set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS ${GIT_DEPENDS})
+
+ string(STRIP ${HEAD_REF} HEAD_REF)
+ if(HEAD_REF STREQUAL "")
+ message(WARNING "Cannot determine git HEAD")
+ else()
+ set(GIT_COMMIT_HASH ${HEAD_REF} PARENT_SCOPE)
+ endif()
+endfunction()
+get_git_commit_hash()
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>CFBundleDevelopmentRegion</key>
+ <string>English</string>
+ <key>CFBundleExecutable</key>
+ <string>solvespace</string>
+ <key>CFBundleInfoDictionaryVersion</key>
+ <string>6.0</string>
+ <key>CFBundleName</key>
+ <string>SolveSpace</string>
+ <key>CFBundlePackageType</key>
+ <string>APPL</string>
+ <key>CFBundleVersion</key>
+ <string>${solvespace_VERSION_MAJOR}.${solvespace_VERSION_MINOR}</string>
+ <key>CFBundleShortVersionString</key>
+ <string>${solvespace_VERSION_MAJOR}.${solvespace_VERSION_MINOR}</string>
+ <key>NSHumanReadableCopyright</key>
+ <string>© 2008-2015 Jonathan Westhues and other authors</string>
+ <key>NSPrincipalClass</key>
+ <string>NSApplication</string>
+ <key>NSMainNibFile</key>
+ <string>MainMenu</string>
+ <key>CFBundleIconFile</key>
+ <string>AppIcon</string>
+ <key>CFBundleDocumentTypes</key>
+ <array>
+ <dict>
+ <key>CFBundleTypeExtensions</key>
+ <array>
+ <string>slvs</string>
+ </array>
+ <key>CFBundleTypeIconFile</key>
+ <string>AppIcon.icns</string>
+ <key>CFBundleTypeName</key>
+ <string>SolveSpace sketch</string>
+ <key>CFBundleTypeOSTypes</key>
+ <array>
+ <string>slvs</string>
+ </array>
+ <key>CFBundleTypeRole</key>
+ <string>Editor</string>
+ </dict>
+ </array>
+</dict>
+</plist>
--- /dev/null
+SET(CMAKE_SYSTEM_NAME Windows)
+
+SET(TRIPLE i686-w64-mingw32)
+
+SET(CMAKE_C_COMPILER ${TRIPLE}-gcc)
+SET(CMAKE_CXX_COMPILER ${TRIPLE}-g++)
+SET(CMAKE_RC_COMPILER ${TRIPLE}-windres)
+
+SET(CMAKE_FIND_ROOT_PATH /usr/${TRIPLE})
+
+set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
+set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
+set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
--- /dev/null
+SET(CMAKE_SYSTEM_NAME Windows)
+
+SET(TRIPLE x86_64-w64-mingw32)
+
+SET(CMAKE_C_COMPILER ${TRIPLE}-gcc)
+SET(CMAKE_CXX_COMPILER ${TRIPLE}-g++)
+SET(CMAKE_RC_COMPILER ${TRIPLE}-windres)
+
+SET(CMAKE_FIND_ROOT_PATH /usr/${TRIPLE})
+
+set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
+set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
+set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
--- /dev/null
+if(MSVC)
+ set(CMAKE_C_FLAGS_DEBUG_INIT "/D_DEBUG /MTd /Zi /Ob0 /Od /RTC1")
+ set(CMAKE_C_FLAGS_MINSIZEREL_INIT "/MT /O1 /Ob1 /D NDEBUG")
+ set(CMAKE_C_FLAGS_RELEASE_INIT "/MT /O2 /Ob2 /D NDEBUG")
+ set(CMAKE_C_FLAGS_RELWITHDEBINFO_INIT "/MT /Zi /O2 /Ob1 /D NDEBUG")
+endif()
\ No newline at end of file
--- /dev/null
+if(MSVC)
+ set(CMAKE_CXX_FLAGS_DEBUG_INIT "/D_DEBUG /MTd /Zi /Ob0 /Od /RTC1")
+ set(CMAKE_CXX_FLAGS_MINSIZEREL_INIT "/MT /O1 /Ob1 /D NDEBUG")
+ set(CMAKE_CXX_FLAGS_RELEASE_INIT "/MT /O2 /Ob2 /D NDEBUG")
+ set(CMAKE_CXX_FLAGS_RELWITHDEBINFO_INIT "/MT /Zi /O2 /Ob1 /D NDEBUG")
+endif()
--- /dev/null
+/*-----------------------------------------------------------------------------
+ * Some sample code for slvs.dll. We draw some geometric entities, provide
+ * initial guesses for their positions, and then constrain them. The solver
+ * calculates their new positions, in order to satisfy the constraints.
+ *
+ * Copyright 2008-2013 Jonathan Westhues.
+ *---------------------------------------------------------------------------*/
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#ifdef WIN32
+# include <windows.h>
+#endif
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#ifdef HAVE_STDINT_H
+# include <stdint.h>
+#endif
+
+#include <slvs.h>
+
+static Slvs_System sys;
+
+static void *CheckMalloc(size_t n)
+{
+ void *r = malloc(n);
+ if(!r) {
+ printf("out of memory!\n");
+ exit(-1);
+ }
+ return r;
+}
+
+/*-----------------------------------------------------------------------------
+ * An example of a constraint in 3d. We create a single group, with some
+ * entities and constraints.
+ *---------------------------------------------------------------------------*/
+void Example3d(void)
+{
+ /* This will contain a single group, which will arbitrarily number 1. */
+ Slvs_hGroup g = 1;
+
+ /* A point, initially at (x y z) = (10 10 10) */
+ sys.param[sys.params++] = Slvs_MakeParam(1, g, 10.0);
+ sys.param[sys.params++] = Slvs_MakeParam(2, g, 10.0);
+ sys.param[sys.params++] = Slvs_MakeParam(3, g, 10.0);
+ sys.entity[sys.entities++] = Slvs_MakePoint3d(101, g, 1, 2, 3);
+ /* and a second point at (20 20 20) */
+ sys.param[sys.params++] = Slvs_MakeParam(4, g, 20.0);
+ sys.param[sys.params++] = Slvs_MakeParam(5, g, 20.0);
+ sys.param[sys.params++] = Slvs_MakeParam(6, g, 20.0);
+ sys.entity[sys.entities++] = Slvs_MakePoint3d(102, g, 4, 5, 6);
+ /* and a line segment connecting them. */
+ sys.entity[sys.entities++] = Slvs_MakeLineSegment(200, g,
+ SLVS_FREE_IN_3D, 101, 102);
+
+ /* The distance between the points should be 30.0 units. */
+ sys.constraint[sys.constraints++] = Slvs_MakeConstraint(
+ 1, g,
+ SLVS_C_PT_PT_DISTANCE,
+ SLVS_FREE_IN_3D,
+ 30.0,
+ 101, 102, 0, 0);
+
+ /* Let's tell the solver to keep the second point as close to constant
+ * as possible, instead moving the first point. */
+ sys.dragged[0] = 4;
+ sys.dragged[1] = 5;
+ sys.dragged[2] = 6;
+
+ /* Now that we have written our system, we solve. */
+ Slvs_Solve(&sys, g);
+
+ if(sys.result == SLVS_RESULT_OKAY) {
+ printf("okay; now at (%.3f %.3f %.3f)\n"
+ " (%.3f %.3f %.3f)\n",
+ sys.param[0].val, sys.param[1].val, sys.param[2].val,
+ sys.param[3].val, sys.param[4].val, sys.param[5].val);
+ printf("%d DOF\n", sys.dof);
+ } else {
+ printf("solve failed");
+ }
+}
+
+/*-----------------------------------------------------------------------------
+ * An example of a constraint in 2d. In our first group, we create a workplane
+ * along the reference frame's xy plane. In a second group, we create some
+ * entities in that group and dimension them.
+ *---------------------------------------------------------------------------*/
+void Example2d(void)
+{
+ Slvs_hGroup g;
+ double qw, qx, qy, qz;
+
+ g = 1;
+ /* First, we create our workplane. Its origin corresponds to the origin
+ * of our base frame (x y z) = (0 0 0) */
+ sys.param[sys.params++] = Slvs_MakeParam(1, g, 0.0);
+ sys.param[sys.params++] = Slvs_MakeParam(2, g, 0.0);
+ sys.param[sys.params++] = Slvs_MakeParam(3, g, 0.0);
+ sys.entity[sys.entities++] = Slvs_MakePoint3d(101, g, 1, 2, 3);
+ /* and it is parallel to the xy plane, so it has basis vectors (1 0 0)
+ * and (0 1 0). */
+ Slvs_MakeQuaternion(1, 0, 0,
+ 0, 1, 0, &qw, &qx, &qy, &qz);
+ sys.param[sys.params++] = Slvs_MakeParam(4, g, qw);
+ sys.param[sys.params++] = Slvs_MakeParam(5, g, qx);
+ sys.param[sys.params++] = Slvs_MakeParam(6, g, qy);
+ sys.param[sys.params++] = Slvs_MakeParam(7, g, qz);
+ sys.entity[sys.entities++] = Slvs_MakeNormal3d(102, g, 4, 5, 6, 7);
+
+ sys.entity[sys.entities++] = Slvs_MakeWorkplane(200, g, 101, 102);
+
+ /* Now create a second group. We'll solve group 2, while leaving group 1
+ * constant; so the workplane that we've created will be locked down,
+ * and the solver can't move it. */
+ g = 2;
+ /* These points are represented by their coordinates (u v) within the
+ * workplane, so they need only two parameters each. */
+ sys.param[sys.params++] = Slvs_MakeParam(11, g, 10.0);
+ sys.param[sys.params++] = Slvs_MakeParam(12, g, 20.0);
+ sys.entity[sys.entities++] = Slvs_MakePoint2d(301, g, 200, 11, 12);
+
+ sys.param[sys.params++] = Slvs_MakeParam(13, g, 20.0);
+ sys.param[sys.params++] = Slvs_MakeParam(14, g, 10.0);
+ sys.entity[sys.entities++] = Slvs_MakePoint2d(302, g, 200, 13, 14);
+
+ /* And we create a line segment with those endpoints. */
+ sys.entity[sys.entities++] = Slvs_MakeLineSegment(400, g,
+ 200, 301, 302);
+
+ /* Now three more points. */
+ sys.param[sys.params++] = Slvs_MakeParam(15, g, 100.0);
+ sys.param[sys.params++] = Slvs_MakeParam(16, g, 120.0);
+ sys.entity[sys.entities++] = Slvs_MakePoint2d(303, g, 200, 15, 16);
+
+ sys.param[sys.params++] = Slvs_MakeParam(17, g, 120.0);
+ sys.param[sys.params++] = Slvs_MakeParam(18, g, 110.0);
+ sys.entity[sys.entities++] = Slvs_MakePoint2d(304, g, 200, 17, 18);
+
+ sys.param[sys.params++] = Slvs_MakeParam(19, g, 115.0);
+ sys.param[sys.params++] = Slvs_MakeParam(20, g, 115.0);
+ sys.entity[sys.entities++] = Slvs_MakePoint2d(305, g, 200, 19, 20);
+
+ /* And arc, centered at point 303, starting at point 304, ending at
+ * point 305. */
+ sys.entity[sys.entities++] = Slvs_MakeArcOfCircle(401, g, 200, 102,
+ 303, 304, 305);
+
+ /* Now one more point, and a distance */
+ sys.param[sys.params++] = Slvs_MakeParam(21, g, 200.0);
+ sys.param[sys.params++] = Slvs_MakeParam(22, g, 200.0);
+ sys.entity[sys.entities++] = Slvs_MakePoint2d(306, g, 200, 21, 22);
+
+ sys.param[sys.params++] = Slvs_MakeParam(23, g, 30.0);
+ sys.entity[sys.entities++] = Slvs_MakeDistance(307, g, 200, 23);
+
+ /* And a complete circle, centered at point 306 with radius equal to
+ * distance 307. The normal is 102, the same as our workplane. */
+ sys.entity[sys.entities++] = Slvs_MakeCircle(402, g, 200,
+ 306, 102, 307);
+
+
+ /* The length of our line segment is 30.0 units. */
+ sys.constraint[sys.constraints++] = Slvs_MakeConstraint(
+ 1, g,
+ SLVS_C_PT_PT_DISTANCE,
+ 200,
+ 30.0,
+ 301, 302, 0, 0);
+
+ /* And the distance from our line segment to the origin is 10.0 units. */
+ sys.constraint[sys.constraints++] = Slvs_MakeConstraint(
+ 2, g,
+ SLVS_C_PT_LINE_DISTANCE,
+ 200,
+ 10.0,
+ 101, 0, 400, 0);
+ /* And the line segment is vertical. */
+ sys.constraint[sys.constraints++] = Slvs_MakeConstraint(
+ 3, g,
+ SLVS_C_VERTICAL,
+ 200,
+ 0.0,
+ 0, 0, 400, 0);
+ /* And the distance from one endpoint to the origin is 15.0 units. */
+ sys.constraint[sys.constraints++] = Slvs_MakeConstraint(
+ 4, g,
+ SLVS_C_PT_PT_DISTANCE,
+ 200,
+ 15.0,
+ 301, 101, 0, 0);
+#if 0
+ /* And same for the other endpoint; so if you add this constraint then
+ * the sketch is overconstrained and will signal an error. */
+ sys.constraint[sys.constraints++] = Slvs_MakeConstraint(
+ 5, g,
+ SLVS_C_PT_PT_DISTANCE,
+ 200,
+ 18.0,
+ 302, 101, 0, 0);
+#endif /* 0 */
+
+ /* The arc and the circle have equal radius. */
+ sys.constraint[sys.constraints++] = Slvs_MakeConstraint(
+ 6, g,
+ SLVS_C_EQUAL_RADIUS,
+ 200,
+ 0.0,
+ 0, 0, 401, 402);
+ /* The arc has radius 17.0 units. */
+ sys.constraint[sys.constraints++] = Slvs_MakeConstraint(
+ 7, g,
+ SLVS_C_DIAMETER,
+ 200,
+ 17.0*2,
+ 0, 0, 401, 0);
+
+ /* If the solver fails, then ask it to report which constraints caused
+ * the problem. */
+ sys.calculateFaileds = 1;
+
+ /* And solve. */
+ Slvs_Solve(&sys, g);
+
+ if(sys.result == SLVS_RESULT_OKAY) {
+ printf("solved okay\n");
+ printf("line from (%.3f %.3f) to (%.3f %.3f)\n",
+ sys.param[7].val, sys.param[8].val,
+ sys.param[9].val, sys.param[10].val);
+
+ printf("arc center (%.3f %.3f) start (%.3f %.3f) finish (%.3f %.3f)\n",
+ sys.param[11].val, sys.param[12].val,
+ sys.param[13].val, sys.param[14].val,
+ sys.param[15].val, sys.param[16].val);
+
+ printf("circle center (%.3f %.3f) radius %.3f\n",
+ sys.param[17].val, sys.param[18].val,
+ sys.param[19].val);
+ printf("%d DOF\n", sys.dof);
+ } else {
+ int i;
+ printf("solve failed: problematic constraints are:");
+ for(i = 0; i < sys.faileds; i++) {
+ printf(" %d", sys.failed[i]);
+ }
+ printf("\n");
+ if(sys.result == SLVS_RESULT_INCONSISTENT) {
+ printf("system inconsistent\n");
+ } else {
+ printf("system nonconvergent\n");
+ }
+ }
+}
+
+int main(void)
+{
+ sys.param = CheckMalloc(50*sizeof(sys.param[0]));
+ sys.entity = CheckMalloc(50*sizeof(sys.entity[0]));
+ sys.constraint = CheckMalloc(50*sizeof(sys.constraint[0]));
+
+ sys.failed = CheckMalloc(50*sizeof(sys.failed[0]));
+ sys.faileds = 50;
+
+ /*Example3d();*/
+ for(;;) {
+ Example2d();
+ sys.params = sys.constraints = sys.entities = 0;
+ break;
+ }
+ return 0;
+}
+
--- /dev/null
+include_directories(
+ ${CMAKE_SOURCE_DIR}/include)
+
+add_executable(CDemo
+ CDemo.c)
+
+target_link_libraries(CDemo
+ slvs)
--- /dev/null
+
+INTRODUCTION
+============
+
+A sketch in SolveSpace consists of three basic elements: parameters,
+entities, and constraints.
+
+A parameter (Slvs_Param) is a single real number, represented internally
+by a double-precision floating point variable. The parameters are unknown
+variables that the solver modifies in order to satisfy the constraints.
+
+An entity (Slvs_Entity) is a geometric thing, like a point or a line
+segment or a circle. Entities are defined in terms of parameters,
+and in terms of other entities. For example, a point in three-space
+is represented by three parameters, corresponding to its x, y, and z
+coordinates in our base coordinate frame. A line segment is represented
+by two point entities, corresponding to its endpoints.
+
+A constraint (Slvs_Constraint) is a geometric property of an entity,
+or a relationship among multiple entities. For example, a point-point
+distance constraint will set the distance between two point entities.
+
+Parameters, entities, and constraints are typically referenced by their
+handles (Slvs_hParam, Slvs_hEntity, Slvs_hConstraint). These handles are
+32-bit integer values starting from 1. The zero handle is reserved. Each
+object has a unique handle within its type (but it's acceptable, for
+example to have a constraint with an Slvs_hConstraint of 7, and also to
+have an entity with an Slvs_hEntity of 7). The use of handles instead
+of pointers helps to avoid memory corruption.
+
+Entities and constraints are assigned into groups. A group is a set of
+entities and constraints that is solved simultaneously. In a parametric
+CAD system, a single group would typically correspond to a single sketch.
+Constraints within a group may refer to entities outside that group,
+but only the entities within that group will be modified by the solver.
+
+Consider point A in group 1, and point B in group 2. We have a constraint
+in group 2 that makes the points coincident. When we solve group 2, the
+solver is allowed to move point B to place it on top of point A. It is
+not allowed to move point A to put it on top of point B, because point
+A is outside the group being solved.
+
+This corresponds to the typical structure of a parametric CAD system. In a
+later sketch, we may constrain our entities against existing geometry from
+earlier sketches. The constraints will move the entities in our current
+sketch, but will not change the geometry from the earlier sketches.
+
+To use the solver, we first define a set of parameters, entities, and
+constraints. We provide an initial guess for each parameter; this is
+necessary to achieve convergence, and also determines which solution
+gets chosen when (finitely many) multiple solutions exist. Typically,
+these initial guesses are provided by the initial configuration in which
+the user drew the entities before constraining them.
+
+We then run the solver for a given group. The entities within that group
+are modified in an attempt to satisfy the constraints.
+
+After running the solver, there are three possible outcomes:
+
+ * All constraints were satisfied to within our numerical
+ tolerance (i.e., success). The result is equal to SLVS_RESULT_OKAY,
+ and the parameters in param[] have been updated.
+
+ * The solver can prove that two constraints are inconsistent (for
+ example, if a line with nonzero length is constrained both
+ horizontal and vertical). In that case, a list of inconsistent
+ constraints is generated in failed[].
+
+ * The solver cannot prove that two constraints are inconsistent, but
+ it cannot find a solution. In that case, the list of unsatisfied
+ constraints is generated in failed[].
+
+
+TYPES OF ENTITIES
+=================
+
+SLVS_E_POINT_IN_3D
+
+ A point in 3d. Defined by three parameters:
+
+ param[0] the point's x coordinate
+ param[1] y
+ param[1] z
+
+
+SLVS_E_POINT_IN_2D
+
+ A point within a workplane. Defined by the workplane
+
+ wrkpl
+
+ and by two parameters
+
+ param[0] the point's u coordinate
+ param[1] v
+
+ within the coordinate system of the workplane. For example, if the
+ workplane is the zx plane, then u = z and v = x. If the workplane is
+ parallel to the zx plane, but translated so that the workplane's
+ origin is (3, 4, 5), then u = z - 5 and v = x - 3.
+
+
+SLVS_E_NORMAL_IN_3D
+
+ A normal. In SolveSpace, "normals" represent a 3x3 rotation matrix
+ from our base coordinate system to a new frame. Defined by the
+ unit quaternion
+
+ param[0] w
+ param[1] x
+ param[2] y
+ param[3] z
+
+ where the quaternion is given by w + x*i + y*j + z*k.
+
+ It is useful to think of this quaternion as representing a plane
+ through the origin. This plane has three associated vectors: basis
+ vectors U, V that lie within the plane, and normal N that is
+ perpendicular to it. This means that
+
+ [ U V N ]'
+
+ defines a 3x3 rotation matrix. So U, V, and N all have unit length,
+ and are orthogonal so that
+
+ U cross V = N
+ V cross N = U
+ N cross U = V
+
+ Convenience functions (Slvs_Quaternion*) are provided to convert
+ between this representation as vectors U, V, N and the unit
+ quaternion.
+
+ A unit quaternion has only 3 degrees of freedom, but is specified in
+ terms of 4 parameters. An extra constraint is therefore generated
+ implicitly, that
+
+ w^2 + x^2 + y^2 + z^2 = 1
+
+
+SLVS_E_NORMAL_IN_2D
+
+ A normal within a workplane. This is identical to the workplane's
+ normal, so it is simply defined by
+
+ wrkpl
+
+ This entity type is used, for example, to define a circle that lies
+ within a workplane. The circle's normal is the same as the workplane's
+ normal, so we can use an SLVS_E_NORMAL_IN_2D to copy the workplane's
+ normal.
+
+
+SLVS_E_DISTANCE
+
+ A distance. This entity is used to define the radius of a circle, by
+ a single parameter
+
+ param[0] r
+
+
+SLVS_E_WORKPLANE
+
+ An oriented plane, somewhere in 3d. This entity therefore has 6
+ degrees of freedom: three translational, and three rotational. It is
+ specified in terms of its origin
+
+ point[0] origin
+
+ and a normal
+
+ normal
+
+ The normal describes three vectors U, V, N, as discussed in the
+ documentation for SLVS_E_NORMAL_IN_3D. The plane is therefore given
+ by the equation
+
+ p = origin + s*U + t*V
+
+ for any scalar s and t.
+
+
+SLVS_E_LINE_SEGMENT
+
+ A line segment between two endpoints
+
+ point[0]
+ point[1]
+
+
+SLVS_E_CUBIC
+
+ A nonrational cubic Bezier segment
+
+ point[0] starting point P0
+ point[1] control point P1
+ point[2] control point P2
+ point[3] ending point P3
+
+ The curve then has equation
+
+ p(t) = P0*(1 - t)^3 + 3*P1*(1 - t)^2*t + 3*P2*(1 - t)*t^2 + P3*t^3
+
+ as t goes from 0 to 1.
+
+
+SLVS_E_CIRCLE
+
+ A complete circle. The circle lies within a plane with normal
+
+ normal
+
+ The circle is centered at
+
+ point[0]
+
+ The circle's radius is
+
+ distance
+
+
+SLVS_E_ARC_OF_CIRCLE
+
+ An arc of a circle. An arc must always lie within a workplane; it
+ cannot be free in 3d. So it is specified with a workplane
+
+ wrkpl
+
+ It is then defined by three points
+
+ point[0] center of the circle
+ point[1] beginning of the arc
+ point[2] end of the arc
+
+ and its normal
+
+ normal identical to the normal of the workplane
+
+ The arc runs counter-clockwise from its beginning to its end (with
+ the workplane's normal pointing towards the viewer). If the beginning
+ and end of the arc are coincident, then the arc is considered to
+ represent a full circle.
+
+ This representation has an extra degree of freedom. An extra
+ constraint is therefore generated implicitly, so that
+
+ distance(center, beginning) = distance(center, end)
+
+
+TYPES OF CONSTRAINTS
+====================
+
+Many constraints can apply either in 3d, or in a workplane. This is
+determined by the wrkpl member of the constraint. If that member is set
+to SLVS_FREE_IN_3D, then the constraint applies in 3d. If that member
+is set equal to a workplane, the the constraint applies projected into
+that workplane. (For example, a constraint on the distance between two
+points actually applies to the projected distance).
+
+Constraints that may be used in 3d or projected into a workplane are
+marked with a single star (*). Constraints that must always be used with
+a workplane are marked with a double star (**). Constraints that ignore
+the wrkpl member are marked with no star.
+
+SLVS_C_PT_PT_DISTANCE*
+
+ The distance between points ptA and ptB is equal to valA. This is an
+ unsigned distance, so valA must always be positive.
+
+SLVS_C_PROJ_PT_DISTANCE
+
+ The distance between points ptA and ptB, as projected along the line
+ or normal entityA, is equal to valA. This is a signed distance.
+
+SLVS_C_POINTS_COINCIDENT*
+
+ Points ptA and ptB are coincident (i.e., exactly on top of each
+ other).
+
+SLVS_C_PT_PLANE_DISTANCE
+
+ The distance from point ptA to workplane entityA is equal to
+ valA. This is a signed distance; positive versus negative valA
+ correspond to a point that is above vs. below the plane.
+
+SLVS_C_PT_LINE_DISTANCE*
+
+ The distance from point ptA to line segment entityA is equal to valA.
+
+ If the constraint is projected, then valA is a signed distance;
+ positive versus negative valA correspond to a point that is above
+ vs. below the line.
+
+ If the constraint applies in 3d, then valA must always be positive.
+
+SLVS_C_PT_IN_PLANE
+
+ The point ptA lies in plane entityA.
+
+SLVS_C_PT_ON_LINE*
+
+ The point ptA lies on the line entityA.
+
+ Note that this constraint removes one degree of freedom when projected
+ in to the plane, but two degrees of freedom in 3d.
+
+SLVS_C_EQUAL_LENGTH_LINES*
+
+ The lines entityA and entityB have equal length.
+
+SLVS_C_LENGTH_RATIO*
+
+ The length of line entityA divided by the length of line entityB is
+ equal to valA.
+
+SLVS_C_LENGTH_DIFFERENCE*
+
+ The lengths of line entityA and line entityB differ by valA.
+
+SLVS_C_EQ_LEN_PT_LINE_D*
+
+ The length of the line entityA is equal to the distance from point
+ ptA to line entityB.
+
+SLVS_C_EQ_PT_LN_DISTANCES*
+
+ The distance from the line entityA to the point ptA is equal to the
+ distance from the line entityB to the point ptB.
+
+SLVS_C_EQUAL_ANGLE*
+
+ The angle between lines entityA and entityB is equal to the angle
+ between lines entityC and entityD.
+
+ If other is true, then the angles are supplementary (i.e., theta1 =
+ 180 - theta2) instead of equal.
+
+SLVS_C_EQUAL_LINE_ARC_LEN*
+
+ The length of the line entityA is equal to the length of the circular
+ arc entityB.
+
+SLVS_C_SYMMETRIC*
+
+ The points ptA and ptB are symmetric about the plane entityA. This
+ means that they are on opposite sides of the plane and at equal
+ distances from the plane, and that the line connecting ptA and ptB
+ is normal to the plane.
+
+SLVS_C_SYMMETRIC_HORIZ
+SLVS_C_SYMMETRIC_VERT**
+
+ The points ptA and ptB are symmetric about the horizontal or vertical
+ axis of the specified workplane.
+
+SLVS_C_SYMMETRIC_LINE**
+
+ The points ptA and ptB are symmetric about the line entityA.
+
+SLVS_C_AT_MIDPOINT*
+
+ The point ptA lies at the midpoint of the line entityA.
+
+SLVS_C_HORIZONTAL
+SLVS_C_VERTICAL**
+
+ The line connecting points ptA and ptB is horizontal or vertical. Or,
+ the line segment entityA is horizontal or vertical. If points are
+ specified then the line segment should be left zero, and if a line
+ is specified then the points should be left zero.
+
+SLVS_C_DIAMETER
+
+ The diameter of circle or arc entityA is equal to valA.
+
+SLVS_C_PT_ON_CIRCLE
+
+ The point ptA lies on the right cylinder obtained by extruding circle
+ or arc entityA normal to its plane.
+
+SLVS_C_SAME_ORIENTATION
+
+ The normals entityA and entityB describe identical rotations. This
+ constraint therefore restricts three degrees of freedom.
+
+SLVS_C_ANGLE*
+
+ The angle between lines entityA and entityB is equal to valA, where
+ valA is specified in degrees. This constraint equation is written
+ in the form
+
+ (A dot B)/(|A||B|) = cos(valA)
+
+ where A and B are vectors in the directions of lines A and B. This
+ equation does not specify the angle unambiguously; for example,
+ note that valA = +/- 90 degrees will produce the same equation.
+
+ If other is true, then the constraint is instead that
+
+ (A dot B)/(|A||B|) = -cos(valA)
+
+SLVS_C_PERPENDICULAR*
+
+ Identical to SLVS_C_ANGLE with valA = 90 degrees.
+
+SLVS_C_PARALLEL*
+
+ Lines entityA and entityB are parallel.
+
+ Note that this constraint removes one degree of freedom when projected
+ in to the plane, but two degrees of freedom in 3d.
+
+SLVS_C_ARC_LINE_TANGENT**
+
+ The arc entityA is tangent to the line entityB. If other is false,
+ then the arc is tangent at its beginning (point[1]). If other is true,
+ then the arc is tangent at its end (point[2]).
+
+SLVS_C_CUBIC_LINE_TANGENT*
+
+ The cubic entityA is tangent to the line entityB. The variable
+ other indicates:
+
+ if false: the cubic is tangent at its beginning
+ if true: the cubic is tangent at its end
+
+ The beginning of the cubic is point[0], and the end is point[3].
+
+SLVS_C_CURVE_CURVE_TANGENT**
+
+ The two entities entityA and entityB are tangent. These entities can
+ each be either an arc or a cubic, in any combination. The flags
+ other and other2 indicate which endpoint of the curve is tangent,
+ for entityA and entityB respectively:
+
+ if false: the entity is tangent at its beginning
+ if true: the entity is tangent at its end
+
+ For cubics, point[0] is the beginning, and point[3] is the end. For
+ arcs, point[1] is the beginning, and point[2] is the end.
+
+SLVS_C_EQUAL_RADIUS
+
+ The circles or arcs entityA and entityB have equal radius.
+
+SLVS_C_WHERE_DRAGGED*
+
+ The point ptA is locked at its initial numerical guess, and cannot
+ be moved. This constrains two degrees of freedom in a workplane,
+ and three in free space. It's therefore possible for this constraint
+ to overconstrain the sketch, for example if it's applied to a point
+ with one remaining degree of freedom.
+
+
+USING THE SOLVER
+================
+
+The solver is provided as a DLL, and will be usable with most
+Windows-based developement tools. Examples are provided:
+
+ in C/C++ - CDemo.c
+
+ in VB.NET - VbDemo.vb
+
+
+Copyright 2009-2013 Jonathan Westhues.
+
--- /dev/null
+'-----------------------------------------------------------------------------
+' Some sample code for slvs.dll. We draw some geometric entities, provide
+' initial guesses for their positions, and then constrain them. The solver
+' calculates their new positions, in order to satisfy the constraints.
+'
+' The library is distributed as a DLL, but the functions are designed to
+' be usable from .net languages through a P/Invoke. This file contains an
+' example of that process, and a wrapper class around those P/Invoke'd
+' functions that you may wish to use a starting point in your own
+' application.
+'
+' Copyright 2008-2013 Jonathan Westhues.
+'-----------------------------------------------------------------------------
+
+Imports System.Runtime.InteropServices
+
+Module VbDemo
+
+ ' Call our example functions, which set up some kind of sketch, solve
+ ' it, and then print the result.
+ Sub Main()
+ Console.WriteLine("EXAMPLE IN 3d (by objects):")
+ Example3dWithObjects()
+ Console.WriteLine("")
+
+ Console.WriteLine("EXAMPLE IN 2d (by objects):")
+ Example2dWithObjects()
+ Console.WriteLine("")
+
+ Console.WriteLine("EXAMPLE IN 3d (by handles):")
+ Example3dWithHandles()
+ Console.WriteLine("")
+
+ Console.WriteLine("EXAMPLE IN 2d (by handles):")
+ Example2dWithHandles()
+ Console.WriteLine("")
+ End Sub
+
+
+ '''''''''''''''''''''''''''''''
+ ' This is the simplest way to use the library. A set of wrapper
+ ' classes allow us to represent entities (e.g., lines and points)
+ ' as .net objects. So we create an Slvs object, which will contain
+ ' the entire sketch, with all the entities and constraints.
+ '
+ ' We then create entity objects (for example, points and lines)
+ ' associated with that sketch, indicating the initial positions of
+ ' those entities and any hierarchical relationships among them (e.g.,
+ ' defining a line entity in terms of endpoint entities). We also add
+ ' constraints associated with those entities.
+ '
+ ' Finally, we solve, and print the new positions of the entities. If the
+ ' solution succeeded, then the entities will satisfy the constraints. If
+ ' not, then the solver will suggest problematic constraints that, if
+ ' removed, would render the sketch solvable.
+
+ Sub Example3dWithObjects()
+ Dim g As UInteger
+ Dim slv As New Slvs
+
+ ' This will contain a single group, which will arbitrarily number 1.
+ g = 1
+
+ Dim p1, p2 As Slvs.Point3d
+ ' A point, initially at (x y z) = (10 10 10)
+ p1 = slv.NewPoint3d(g, 10.0, 10.0, 10.0)
+ ' and a second point at (20 20 20)
+ p2 = slv.NewPoint3d(g, 20.0, 20.0, 20.0)
+
+ Dim ln As Slvs.LineSegment
+ ' and a line segment connecting them.
+ ln = slv.NewLineSegment(g, slv.FreeIn3d(), p1, p2)
+
+ ' The distance between the points should be 30.0 units.
+ slv.AddConstraint(1, g, Slvs.SLVS_C_PT_PT_DISTANCE, _
+ slv.FreeIn3d(), 30.0, p1, p2, Nothing, Nothing)
+
+ ' Let's tell the solver to keep the second point as close to constant
+ ' as possible, instead moving the first point.
+ slv.Solve(g, p2, True)
+
+ If (slv.GetResult() = Slvs.SLVS_RESULT_OKAY) Then
+ ' We call the GetX(), GetY(), and GetZ() functions to see
+ ' where the solver moved our points to.
+ Console.WriteLine(String.Format( _
+ "okay; now at ({0:F3}, {1:F3}, {2:F3})", _
+ p1.GetX(), p1.GetY(), p1.GetZ()))
+ Console.WriteLine(String.Format( _
+ " ({0:F3}, {1:F3}, {2:F3})", _
+ p2.GetX(), p2.GetY(), p2.GetZ()))
+ Console.WriteLine(slv.GetDof().ToString() + " DOF")
+ Else
+ Console.WriteLine("solve failed")
+ End If
+ End Sub
+
+ Sub Example2dWithObjects()
+ Dim g As UInteger
+ Dim slv As New Slvs
+
+ g = 1
+
+ ' First, we create our workplane. Its origin corresponds to the origin
+ ' of our base frame (x y z) = (0 0 0)
+ Dim origin As Slvs.Point3d
+ origin = slv.NewPoint3d(g, 0.0, 0.0, 0.0)
+ ' and it is parallel to the xy plane, so it has basis vectors (1 0 0)
+ ' and (0 1 0).
+ Dim normal As Slvs.Normal3d
+ normal = slv.NewNormal3d(g, 1.0, 0.0, 0.0, _
+ 0.0, 1.0, 0.0)
+
+ Dim wrkpl As Slvs.Workplane
+ wrkpl = slv.NewWorkplane(g, origin, normal)
+
+ ' Now create a second group. We'll solve group 2, while leaving group 1
+ ' constant; so the workplane that we've created will be locked down,
+ ' and the solver can't move it.
+ g = 2
+ ' These points are represented by their coordinates (u v) within the
+ ' workplane, so they need only two parameters each.
+ Dim pl1, pl2 As Slvs.Point2d
+ pl1 = slv.NewPoint2d(g, wrkpl, 10.0, 20.0)
+ pl2 = slv.NewPoint2d(g, wrkpl, 20.0, 10.0)
+
+ ' And we create a line segment with those endpoints.
+ Dim ln As Slvs.LineSegment
+ ln = slv.NewLineSegment(g, wrkpl, pl1, pl2)
+
+ ' Now three more points.
+ Dim pc, ps, pf As Slvs.Point2d
+ pc = slv.NewPoint2d(g, wrkpl, 100.0, 120.0)
+ ps = slv.NewPoint2d(g, wrkpl, 120.0, 110.0)
+ pf = slv.NewPoint2d(g, wrkpl, 115.0, 115.0)
+
+ ' And arc, centered at point pc, starting at point ps, ending at
+ ' point pf.
+ Dim arc As Slvs.ArcOfCircle
+ arc = slv.NewArcOfCircle(g, wrkpl, normal, pc, ps, pf)
+
+ ' Now one more point, and a distance
+ Dim pcc As Slvs.Point2d
+ pcc = slv.NewPoint2d(g, wrkpl, 200.0, 200.0)
+ Dim r As Slvs.Distance
+ r = slv.NewDistance(g, wrkpl, 30.0)
+
+ ' And a complete circle, centered at point pcc with radius equal to
+ ' distance r. The normal is the same as for our workplane.
+ Dim circle As Slvs.Circle
+ circle = slv.NewCircle(g, wrkpl, pcc, normal, r)
+
+ ' The length of our line segment is 30.0 units.
+ slv.AddConstraint(1, g, Slvs.SLVS_C_PT_PT_DISTANCE, _
+ wrkpl, 30.0, pl1, pl2, Nothing, Nothing)
+
+ ' And the distance from our line segment to the origin is 10.0 units.
+ slv.AddConstraint(2, g, Slvs.SLVS_C_PT_LINE_DISTANCE, _
+ wrkpl, 10.0, origin, Nothing, ln, Nothing)
+
+ ' And the line segment is vertical.
+ slv.AddConstraint(3, g, Slvs.SLVS_C_VERTICAL, _
+ wrkpl, 0.0, Nothing, Nothing, ln, Nothing)
+
+ ' And the distance from one endpoint to the origin is 15.0 units.
+ slv.AddConstraint(4, g, Slvs.SLVS_C_PT_PT_DISTANCE, _
+ wrkpl, 15.0, pl1, origin, Nothing, Nothing)
+
+ ' And same for the other endpoint; so if you add this constraint then
+ ' the sketch is overconstrained and will signal an error.
+ 'slv.AddConstraint(5, g, Slvs.SLVS_C_PT_PT_DISTANCE, _
+ ' wrkpl, 18.0, pl2, origin, Nothing, Nothing)
+
+ ' The arc and the circle have equal radius.
+ slv.AddConstraint(6, g, Slvs.SLVS_C_EQUAL_RADIUS, _
+ wrkpl, 0.0, Nothing, Nothing, arc, circle)
+
+ ' The arc has radius 17.0 units.
+ slv.AddConstraint(7, g, Slvs.SLVS_C_DIAMETER, _
+ wrkpl, 2 * 17.0, Nothing, Nothing, arc, Nothing)
+
+ ' If the solver fails, then ask it to report which constraints caused
+ ' the problem.
+ slv.Solve(g, True)
+
+ If (slv.GetResult() = Slvs.SLVS_RESULT_OKAY) Then
+ Console.WriteLine("solved okay")
+ ' We call the GetU(), GetV(), and GetDistance() functions to
+ ' see where the solver moved our points and distances to.
+ Console.WriteLine(String.Format( _
+ "line from ({0:F3} {1:F3}) to ({2:F3} {3:F3})", _
+ pl1.GetU(), pl1.GetV(), _
+ pl2.GetU(), pl2.GetV()))
+ Console.WriteLine(String.Format( _
+ "arc center ({0:F3} {1:F3}) start ({2:F3} {3:F3}) " + _
+ "finish ({4:F3} {5:F3})", _
+ pc.GetU(), pc.GetV(), _
+ ps.GetU(), ps.GetV(), _
+ pf.GetU(), pf.GetV()))
+ Console.WriteLine(String.Format( _
+ "circle center ({0:F3} {1:F3}) radius {2:F3}", _
+ pcc.GetU(), pcc.GetV(), _
+ r.GetDistance()))
+
+ Console.WriteLine(slv.GetDof().ToString() + " DOF")
+ Else
+ Console.Write("solve failed; problematic constraints are:")
+ Dim t As UInteger
+ For Each t In slv.GetFaileds()
+ Console.Write(" " + t.ToString())
+ Next
+ Console.WriteLine("")
+ If (slv.GetResult() = Slvs.SLVS_RESULT_INCONSISTENT) Then
+ Console.WriteLine("system inconsistent")
+ Else
+ Console.WriteLine("system nonconvergent")
+ End If
+ End If
+
+ End Sub
+
+
+ '''''''''''''''''''''''''''''''
+ ' This is a lower-level way to use the library. Internally, the library
+ ' represents parameters, entities, and constraints by integer handles.
+ ' Here, those handles are assigned manually, and not by the wrapper
+ ' classes.
+
+ Sub Example3dWithHandles()
+ Dim g As UInteger
+ Dim slv As New Slvs
+
+ ' This will contain a single group, which will arbitrarily number 1.
+ g = 1
+
+ ' A point, initially at (x y z) = (10 10 10)
+ slv.AddParam(1, g, 10.0)
+ slv.AddParam(2, g, 10.0)
+ slv.AddParam(3, g, 10.0)
+ slv.AddPoint3d(101, g, 1, 2, 3)
+
+ ' and a second point at (20 20 20)
+ slv.AddParam(4, g, 20.0)
+ slv.AddParam(5, g, 20.0)
+ slv.AddParam(6, g, 20.0)
+ slv.AddPoint3d(102, g, 4, 5, 6)
+
+ ' and a line segment connecting them.
+ slv.AddLineSegment(200, g, Slvs.SLVS_FREE_IN_3D, 101, 102)
+
+ ' The distance between the points should be 30.0 units.
+ slv.AddConstraint(1, g, Slvs.SLVS_C_PT_PT_DISTANCE, _
+ Slvs.SLVS_FREE_IN_3D, 30.0, 101, 102, 0, 0)
+
+ ' Let's tell the solver to keep the second point as close to constant
+ ' as possible, instead moving the first point. That's parameters
+ ' 4, 5, and 6.
+ slv.Solve(g, 4, 5, 6, 0, True)
+
+ If (slv.GetResult() = Slvs.SLVS_RESULT_OKAY) Then
+ ' Note that we are referring to the parameters by their handles,
+ ' and not by their index in the list. This is a difference from
+ ' the C example.
+ Console.WriteLine(String.Format( _
+ "okay; now at ({0:F3}, {1:F3}, {2:F3})", _
+ slv.GetParamByHandle(1), slv.GetParamByHandle(2), _
+ slv.GetParamByHandle(3)))
+ Console.WriteLine(String.Format( _
+ " ({0:F3}, {1:F3}, {2:F3})", _
+ slv.GetParamByHandle(4), slv.GetParamByHandle(5), _
+ slv.GetParamByHandle(6)))
+ Console.WriteLine(slv.GetDof().ToString() + " DOF")
+ Else
+ Console.WriteLine("solve failed")
+ End If
+ End Sub
+
+
+ Sub Example2dWithHandles()
+ Dim g As UInteger
+ Dim qw, qx, qy, qz As Double
+
+ Dim slv As New Slvs
+
+ g = 1
+
+ ' First, we create our workplane. Its origin corresponds to the origin
+ ' of our base frame (x y z) = (0 0 0)
+ slv.AddParam(1, g, 0.0)
+ slv.AddParam(2, g, 0.0)
+ slv.AddParam(3, g, 0.0)
+ slv.AddPoint3d(101, g, 1, 2, 3)
+ ' and it is parallel to the xy plane, so it has basis vectors (1 0 0)
+ ' and (0 1 0).
+ slv.MakeQuaternion(1, 0, 0, _
+ 0, 1, 0, qw, qx, qy, qz)
+ slv.AddParam(4, g, qw)
+ slv.AddParam(5, g, qx)
+ slv.AddParam(6, g, qy)
+ slv.AddParam(7, g, qz)
+ slv.AddNormal3d(102, g, 4, 5, 6, 7)
+
+ slv.AddWorkplane(200, g, 101, 102)
+
+ ' Now create a second group. We'll solve group 2, while leaving group 1
+ ' constant; so the workplane that we've created will be locked down,
+ ' and the solver can't move it.
+ g = 2
+ ' These points are represented by their coordinates (u v) within the
+ ' workplane, so they need only two parameters each.
+ slv.AddParam(11, g, 10.0)
+ slv.AddParam(12, g, 20.0)
+ slv.AddPoint2d(301, g, 200, 11, 12)
+
+ slv.AddParam(13, g, 20.0)
+ slv.AddParam(14, g, 10.0)
+ slv.AddPoint2d(302, g, 200, 13, 14)
+
+ ' And we create a line segment with those endpoints.
+ slv.AddLineSegment(400, g, 200, 301, 302)
+
+ ' Now three more points.
+ slv.AddParam(15, g, 100.0)
+ slv.AddParam(16, g, 120.0)
+ slv.AddPoint2d(303, g, 200, 15, 16)
+
+ slv.AddParam(17, g, 120.0)
+ slv.AddParam(18, g, 110.0)
+ slv.AddPoint2d(304, g, 200, 17, 18)
+
+ slv.AddParam(19, g, 115.0)
+ slv.AddParam(20, g, 115.0)
+ slv.AddPoint2d(305, g, 200, 19, 20)
+
+ ' And arc, centered at point 303, starting at point 304, ending at
+ ' point 305.
+ slv.AddArcOfCircle(401, g, 200, 102, 303, 304, 305)
+
+ ' Now one more point, and a distance
+ slv.AddParam(21, g, 200.0)
+ slv.AddParam(22, g, 200.0)
+ slv.AddPoint2d(306, g, 200, 21, 22)
+
+ slv.AddParam(23, g, 30.0)
+ slv.AddDistance(307, g, 200, 23)
+
+ ' And a complete circle, centered at point 306 with radius equal to
+ ' distance 307. The normal is 102, the same as our workplane.
+ slv.AddCircle(402, g, 200, 306, 102, 307)
+
+ ' The length of our line segment is 30.0 units.
+ slv.AddConstraint(1, g, Slvs.SLVS_C_PT_PT_DISTANCE, _
+ 200, 30.0, 301, 302, 0, 0)
+
+ ' And the distance from our line segment to the origin is 10.0 units.
+ slv.AddConstraint(2, g, Slvs.SLVS_C_PT_LINE_DISTANCE, _
+ 200, 10.0, 101, 0, 400, 0)
+
+ ' And the line segment is vertical.
+ slv.AddConstraint(3, g, Slvs.SLVS_C_VERTICAL, _
+ 200, 0.0, 0, 0, 400, 0)
+
+ ' And the distance from one endpoint to the origin is 15.0 units.
+ slv.AddConstraint(4, g, Slvs.SLVS_C_PT_PT_DISTANCE, _
+ 200, 15.0, 301, 101, 0, 0)
+
+ ' And same for the other endpoint; so if you add this constraint then
+ ' the sketch is overconstrained and will signal an error.
+ 'slv.AddConstraint(5, g, Slvs.SLVS_C_PT_PT_DISTANCE, _
+ ' 200, 18.0, 302, 101, 0, 0)
+
+ ' The arc and the circle have equal radius.
+ slv.AddConstraint(6, g, Slvs.SLVS_C_EQUAL_RADIUS, _
+ 200, 0.0, 0, 0, 401, 402)
+
+ ' The arc has radius 17.0 units.
+ slv.AddConstraint(7, g, Slvs.SLVS_C_DIAMETER, _
+ 200, 2 * 17.0, 0, 0, 401, 0)
+
+ ' If the solver fails, then ask it to report which constraints caused
+ ' the problem.
+ slv.Solve(g, 0, 0, 0, 0, True)
+
+ If (slv.GetResult() = Slvs.SLVS_RESULT_OKAY) Then
+ Console.WriteLine("solved okay")
+ ' Note that we are referring to the parameters by their handles,
+ ' and not by their index in the list. This is a difference from
+ ' the C example.
+ Console.WriteLine(String.Format( _
+ "line from ({0:F3} {1:F3}) to ({2:F3} {3:F3})", _
+ slv.GetParamByHandle(11), slv.GetParamByHandle(12), _
+ slv.GetParamByHandle(13), slv.GetParamByHandle(14)))
+ Console.WriteLine(String.Format( _
+ "arc center ({0:F3} {1:F3}) start ({2:F3} {3:F3}) " + _
+ "finish ({4:F3} {5:F3})", _
+ slv.GetParamByHandle(15), slv.GetParamByHandle(16), _
+ slv.GetParamByHandle(17), slv.GetParamByHandle(18), _
+ slv.GetParamByHandle(19), slv.GetParamByHandle(20)))
+ Console.WriteLine(String.Format( _
+ "circle center ({0:F3} {1:F3}) radius {2:F3}", _
+ slv.GetParamByHandle(21), slv.GetParamByHandle(22), _
+ slv.GetParamByHandle(23)))
+
+ Console.WriteLine(slv.GetDof().ToString() + " DOF")
+ Else
+ Console.Write("solve failed; problematic constraints are:")
+ Dim t As UInteger
+ For Each t In slv.GetFaileds()
+ Console.Write(" " + t.ToString())
+ Next
+ Console.WriteLine("")
+ If (slv.GetResult() = Slvs.SLVS_RESULT_INCONSISTENT) Then
+ Console.WriteLine("system inconsistent")
+ Else
+ Console.WriteLine("system nonconvergent")
+ End If
+ End If
+
+ End Sub
+
+
+ '''''''''''''''''''''''''''''''
+ ' The interface to the library, and the wrapper functions around
+ ' that interface, follow.
+
+ ' These are the core functions imported from the DLL
+ <DllImport("slvs.dll", CallingConvention:=CallingConvention.Cdecl)> _
+ Public Sub Slvs_Solve(ByVal sys As IntPtr, ByVal hg As UInteger)
+ End Sub
+
+ <DllImport("slvs.dll", CallingConvention:=CallingConvention.Cdecl)> _
+ Public Sub Slvs_MakeQuaternion(
+ ByVal ux As Double, ByVal uy As Double, ByVal uz As Double,
+ ByVal vx As Double, ByVal vy As Double, ByVal vz As Double,
+ ByRef qw As Double, ByRef qx As Double, ByRef qy As Double,
+ ByRef qz As Double)
+ End Sub
+
+ ' And this is a thin wrapper around those functions, which provides
+ ' convenience functions similar to those provided in slvs.h for the C API.
+ Public Class Slvs
+
+ <StructLayout(LayoutKind.Sequential)> Public Structure Slvs_Param
+ Public h As UInteger
+ Public group As UInteger
+ Public val As Double
+ End Structure
+
+ Public Const SLVS_FREE_IN_3D As Integer = 0
+
+ Public Const SLVS_E_POINT_IN_3D As Integer = 50000
+ Public Const SLVS_E_POINT_IN_2D As Integer = 50001
+ Public Const SLVS_E_NORMAL_IN_3D As Integer = 60000
+ Public Const SLVS_E_NORMAL_IN_2D As Integer = 60001
+ Public Const SLVS_E_DISTANCE As Integer = 70000
+ Public Const SLVS_E_WORKPLANE As Integer = 80000
+ Public Const SLVS_E_LINE_SEGMENT As Integer = 80001
+ Public Const SLVS_E_CUBIC As Integer = 80002
+ Public Const SLVS_E_CIRCLE As Integer = 80003
+ Public Const SLVS_E_ARC_OF_CIRCLE As Integer = 80004
+
+ <StructLayout(LayoutKind.Sequential)> Public Structure Slvs_Entity
+ Public h As UInteger
+ Public group As UInteger
+
+ Public type As Integer
+
+ Public wrkpl As UInteger
+ Public point0 As UInteger
+ Public point1 As UInteger
+ Public point2 As UInteger
+ Public point3 As UInteger
+ Public normal As UInteger
+ Public distance As UInteger
+
+ Public param0 As UInteger
+ Public param1 As UInteger
+ Public param2 As UInteger
+ Public param3 As UInteger
+ End Structure
+
+ Public Const SLVS_C_POINTS_COINCIDENT As Integer = 100000
+ Public Const SLVS_C_PT_PT_DISTANCE As Integer = 100001
+ Public Const SLVS_C_PT_PLANE_DISTANCE As Integer = 100002
+ Public Const SLVS_C_PT_LINE_DISTANCE As Integer = 100003
+ Public Const SLVS_C_PT_FACE_DISTANCE As Integer = 100004
+ Public Const SLVS_C_PT_IN_PLANE As Integer = 100005
+ Public Const SLVS_C_PT_ON_LINE As Integer = 100006
+ Public Const SLVS_C_PT_ON_FACE As Integer = 100007
+ Public Const SLVS_C_EQUAL_LENGTH_LINES As Integer = 100008
+ Public Const SLVS_C_LENGTH_RATIO As Integer = 100009
+ Public Const SLVS_C_EQ_LEN_PT_LINE_D As Integer = 100010
+ Public Const SLVS_C_EQ_PT_LN_DISTANCES As Integer = 100011
+ Public Const SLVS_C_EQUAL_ANGLE As Integer = 100012
+ Public Const SLVS_C_EQUAL_LINE_ARC_LEN As Integer = 100013
+ Public Const SLVS_C_SYMMETRIC As Integer = 100014
+ Public Const SLVS_C_SYMMETRIC_HORIZ As Integer = 100015
+ Public Const SLVS_C_SYMMETRIC_VERT As Integer = 100016
+ Public Const SLVS_C_SYMMETRIC_LINE As Integer = 100017
+ Public Const SLVS_C_AT_MIDPOINT As Integer = 100018
+ Public Const SLVS_C_HORIZONTAL As Integer = 100019
+ Public Const SLVS_C_VERTICAL As Integer = 100020
+ Public Const SLVS_C_DIAMETER As Integer = 100021
+ Public Const SLVS_C_PT_ON_CIRCLE As Integer = 100022
+ Public Const SLVS_C_SAME_ORIENTATION As Integer = 100023
+ Public Const SLVS_C_ANGLE As Integer = 100024
+ Public Const SLVS_C_PARALLEL As Integer = 100025
+ Public Const SLVS_C_PERPENDICULAR As Integer = 100026
+ Public Const SLVS_C_ARC_LINE_TANGENT As Integer = 100027
+ Public Const SLVS_C_CUBIC_LINE_TANGENT As Integer = 100028
+ Public Const SLVS_C_EQUAL_RADIUS As Integer = 100029
+ Public Const SLVS_C_PROJ_PT_DISTANCE As Integer = 100030
+ Public Const SLVS_C_WHERE_DRAGGED As Integer = 100031
+ Public Const SLVS_C_CURVE_CURVE_TANGENT As Integer = 100032
+ Public Const SLVS_C_LENGTH_DIFFERENCE As Integer = 100033
+
+ <StructLayout(LayoutKind.Sequential)> Public Structure Slvs_Constraint
+ Public h As UInteger
+ Public group As UInteger
+
+ Public type As Integer
+
+ Public wrkpl As UInteger
+
+ Public valA As Double
+ Public ptA As UInteger
+ Public ptB As UInteger
+ Public entityA As UInteger
+ Public entityB As UInteger
+ Public entityC As UInteger
+ Public entityD As UInteger
+
+ Public other As Integer
+ Public other2 As Integer
+ End Structure
+
+ Public Const SLVS_RESULT_OKAY As Integer = 0
+ Public Const SLVS_RESULT_INCONSISTENT As Integer = 1
+ Public Const SLVS_RESULT_DIDNT_CONVERGE As Integer = 2
+ Public Const SLVS_RESULT_TOO_MANY_UNKNOWNS As Integer = 3
+
+ <StructLayout(LayoutKind.Sequential)> Public Structure Slvs_System
+ Public param As IntPtr
+ Public params As Integer
+ Public entity As IntPtr
+ Public entities As Integer
+ Public constraint As IntPtr
+ Public constraints As Integer
+
+ Public dragged0 As UInteger
+ Public dragged1 As UInteger
+ Public dragged2 As UInteger
+ Public dragged3 As UInteger
+
+ Public calculatedFaileds As Integer
+
+ Public failed As IntPtr
+ Public faileds As Integer
+
+ Public dof As Integer
+
+ Public result As Integer
+ End Structure
+
+ Dim Params As New List(Of Slvs_Param)
+ Dim Entities As New List(Of Slvs_Entity)
+ Dim Constraints As New List(Of Slvs_Constraint)
+
+ Dim Faileds As New List(Of UInteger)
+
+ Dim Result As Integer
+ Dim Dof As Integer
+
+ ' Return the value of a parameter, by its handle. This function
+ ' may be used, for example, to obtain the new values of the
+ ' parameters after a call to Solve().
+ Public Function GetParamByHandle(ByVal h As UInteger) As Double
+ Dim t As Slvs_Param
+ For Each t In Params
+ If (t.h = h) Then
+ Return t.val
+ End If
+ Next
+ Throw New Exception("Invalid parameter handle.")
+ End Function
+
+ ' Return the value of a parameter, by its index in the list (where
+ ' that index is determined by the order in which the parameters
+ ' were inserted with AddParam(), not by its handle).
+ Public Function GetParamByIndex(ByVal i As Integer) As Double
+ Return Params(i).val
+ End Function
+
+ ' Get the result after a call to Solve(). This may be
+ ' SLVS_RESULT_OKAY - it worked
+ ' SLVS_RESULT_INCONSISTENT - failed, inconsistent
+ ' SLVS_RESULT_DIDNT_CONVERGE - consistent, but still failed
+ ' SLVS_RESULT_TOO_MANY_UNKNOWNS - too many parameters in one group
+ Public Function GetResult() As Integer
+ Return Result
+ End Function
+
+ ' After a call to Solve(), this returns the number of unconstrained
+ ' degrees of freedom for the sketch.
+ Public Function GetDof() As Integer
+ Return Dof
+ End Function
+
+ ' After a failing call to Solve(), this returns the list of
+ ' constraints, identified by ther handle, that would fix the
+ ' system if they were deleted. This list will be populated only
+ ' if calculateFaileds is True in the Solve() call.
+ Public Function GetFaileds() As List(Of UInteger)
+ Return Faileds
+ End Function
+
+ ' Clear our lists of entities, constraints, and parameters.
+ Public Sub ResetAll()
+ Params.Clear()
+ Entities.Clear()
+ Constraints.Clear()
+ End Sub
+
+
+ '''''''''''''''''''''''''''''''
+ ' These functions are broadly similar to the Slvs_Make...
+ ' functions in slvs.h. See the file DOC.txt accompanying the
+ ' library for details.
+
+ Public Sub AddParam(ByVal h As UInteger, ByVal group As UInteger,
+ ByVal val As Double)
+ Dim p As Slvs_Param
+ p.h = h
+ p.group = group
+ p.val = val
+ Params.Add(p)
+ End Sub
+
+ Public Sub AddPoint2d(ByVal h As UInteger, ByVal group As UInteger,
+ ByVal wrkpl As UInteger,
+ ByVal u As UInteger, ByVal v As UInteger)
+ Dim e As Slvs_Entity
+ e.h = h
+ e.group = group
+ e.type = SLVS_E_POINT_IN_2D
+ e.wrkpl = wrkpl
+ e.param0 = u
+ e.param1 = v
+ Entities.Add(e)
+ End Sub
+
+ Public Sub AddPoint3d(ByVal h As UInteger, ByVal group As UInteger,
+ ByVal x As UInteger, ByVal y As UInteger, ByVal z As UInteger)
+ Dim e As Slvs_Entity
+ e.h = h
+ e.group = group
+ e.type = SLVS_E_POINT_IN_3D
+ e.wrkpl = SLVS_FREE_IN_3D
+ e.param0 = x
+ e.param1 = y
+ e.param2 = z
+ Entities.Add(e)
+ End Sub
+
+ Public Sub AddNormal3d(ByVal h As UInteger, ByVal group As UInteger,
+ ByVal qw As UInteger, ByVal qx As UInteger,
+ ByVal qy As UInteger, ByVal qz As UInteger)
+ Dim e As Slvs_Entity
+ e.h = h
+ e.group = group
+ e.type = SLVS_E_NORMAL_IN_3D
+ e.wrkpl = SLVS_FREE_IN_3D
+ e.param0 = qw
+ e.param1 = qx
+ e.param2 = qy
+ e.param3 = qz
+ Entities.Add(e)
+ End Sub
+
+ Public Sub AddNormal2d(ByVal h As UInteger, ByVal group As UInteger,
+ ByVal wrkpl As UInteger)
+ Dim e As Slvs_Entity
+ e.h = h
+ e.group = group
+ e.type = SLVS_E_NORMAL_IN_2D
+ e.wrkpl = wrkpl
+ Entities.Add(e)
+ End Sub
+
+ Public Sub AddDistance(ByVal h As UInteger, ByVal group As UInteger,
+ ByVal wrkpl As UInteger, ByVal d As UInteger)
+ Dim e As Slvs_Entity
+ e.h = h
+ e.group = group
+ e.type = SLVS_E_DISTANCE
+ e.wrkpl = wrkpl
+ e.param0 = d
+ Entities.Add(e)
+ End Sub
+
+ Public Sub AddLineSegment(ByVal h As UInteger, ByVal group As UInteger,
+ ByVal wrkpl As UInteger,
+ ByVal ptA As UInteger, ByVal ptB As UInteger)
+ Dim e As Slvs_Entity
+ e.h = h
+ e.group = group
+ e.type = SLVS_E_LINE_SEGMENT
+ e.wrkpl = wrkpl
+ e.point0 = ptA
+ e.point1 = ptB
+ Entities.Add(e)
+ End Sub
+
+ Public Sub AddCubic(ByVal h As UInteger, ByVal group As UInteger,
+ ByVal wrkpl As UInteger,
+ ByVal pt0 As UInteger, ByVal pt1 As UInteger,
+ ByVal pt2 As UInteger, ByVal pt3 As UInteger)
+ Dim e As Slvs_Entity
+ e.h = h
+ e.group = group
+ e.type = SLVS_E_CUBIC
+ e.wrkpl = wrkpl
+ e.point0 = pt0
+ e.point1 = pt1
+ e.point2 = pt2
+ e.point3 = pt3
+ Entities.Add(e)
+ End Sub
+
+ Public Sub AddArcOfCircle(ByVal h As UInteger, ByVal group As UInteger,
+ ByVal wrkpl As UInteger,
+ ByVal normal As UInteger,
+ ByVal center As UInteger,
+ ByVal pstart As UInteger,
+ ByVal pend As UInteger)
+ Dim e As Slvs_Entity
+ e.h = h
+ e.group = group
+ e.type = SLVS_E_ARC_OF_CIRCLE
+ e.wrkpl = wrkpl
+ e.normal = normal
+ e.point0 = center
+ e.point1 = pstart
+ e.point2 = pend
+ Entities.Add(e)
+ End Sub
+
+ Public Sub AddCircle(ByVal h As UInteger, ByVal group As UInteger,
+ ByVal wrkpl As UInteger,
+ ByVal center As UInteger, ByVal normal As UInteger,
+ ByVal radius As UInteger)
+ Dim e As Slvs_Entity
+ e.h = h
+ e.group = group
+ e.type = SLVS_E_CIRCLE
+ e.wrkpl = wrkpl
+ e.point0 = center
+ e.normal = normal
+ e.distance = radius
+ Entities.Add(e)
+ End Sub
+
+ Public Sub AddWorkplane(ByVal h As UInteger, ByVal group As UInteger,
+ ByVal origin As UInteger,
+ ByVal normal As UInteger)
+ Dim e As Slvs_Entity
+ e.h = h
+ e.group = group
+ e.type = SLVS_E_WORKPLANE
+ e.wrkpl = SLVS_FREE_IN_3D
+ e.point0 = origin
+ e.normal = normal
+ Entities.Add(e)
+ End Sub
+
+ Public Sub AddConstraint(ByVal h As UInteger,
+ ByVal group As UInteger,
+ ByVal type As Integer,
+ ByVal wrkpl As UInteger,
+ ByVal valA As Double,
+ ByVal ptA As UInteger,
+ ByVal ptB As UInteger,
+ ByVal entityA As UInteger,
+ ByVal entityB As UInteger)
+ Dim c As Slvs_Constraint
+ c.h = h
+ c.group = group
+ c.type = type
+ c.wrkpl = wrkpl
+ c.valA = valA
+ c.ptA = ptA
+ c.ptB = ptB
+ c.entityA = entityA
+ c.entityB = entityB
+ Constraints.Add(c)
+ End Sub
+
+ ' Solve the system. The geometry of the system must already have
+ ' been specified through the Add...() calls. The result of the
+ ' solution process may be obtained by calling GetResult(),
+ ' GetFaileds(), GetDof(), and GetParamByXXX().
+ '
+ ' The parameters draggedx (indicated by their handles) will be held
+ ' as close as possible to their original positions, even if this
+ ' results in large moves for other parameters. This feature may be
+ ' useful if, for example, the user is dragging the point whose
+ ' location is defined by those parameters. Unused draggedx
+ ' parameters may be specified as zero.
+ Public Sub Solve(ByVal group As UInteger,
+ ByVal dragged0 As UInteger, ByVal dragged1 As UInteger,
+ ByVal dragged2 As UInteger, ByVal dragged3 As UInteger,
+ ByVal calculateFaileds As Boolean)
+ Dim i As Integer
+
+ Dim pp, p(Params.Count()) As Slvs_Param
+ i = 0
+ For Each pp In Params
+ p(i) = pp
+ i += 1
+ Next
+
+ Dim ee, e(Entities.Count()) As Slvs_Entity
+ i = 0
+ For Each ee In Entities
+ e(i) = ee
+ i += 1
+ Next
+
+ Dim cc, c(Constraints.Count()) As Slvs_Constraint
+ i = 0
+ For Each cc In Constraints
+ c(i) = cc
+ i += 1
+ Next
+ Dim f(Constraints.Count()) As UInteger
+
+ Dim sys As Slvs_System
+
+ Dim pgc, egc, cgc As GCHandle
+ pgc = GCHandle.Alloc(p, GCHandleType.Pinned)
+ sys.param = pgc.AddrOfPinnedObject()
+ sys.params = Params.Count()
+ egc = GCHandle.Alloc(e, GCHandleType.Pinned)
+ sys.entity = egc.AddrOfPinnedObject()
+ sys.entities = Entities.Count()
+ cgc = GCHandle.Alloc(c, GCHandleType.Pinned)
+ sys.constraint = cgc.AddrOfPinnedObject()
+ sys.constraints = Constraints.Count()
+
+ sys.dragged0 = dragged0
+ sys.dragged1 = dragged1
+ sys.dragged2 = dragged2
+ sys.dragged3 = dragged3
+
+ Dim fgc As GCHandle
+ fgc = GCHandle.Alloc(f, GCHandleType.Pinned)
+ If calculateFaileds Then
+ sys.calculatedFaileds = 1
+ Else
+ sys.calculatedFaileds = 0
+ End If
+ sys.faileds = Constraints.Count()
+ sys.failed = fgc.AddrOfPinnedObject()
+
+ Dim sysgc As GCHandle
+ sysgc = GCHandle.Alloc(sys, GCHandleType.Pinned)
+
+ Slvs_Solve(sysgc.AddrOfPinnedObject(), group)
+
+ sys = sysgc.Target
+
+ For i = 0 To Params.Count() - 1
+ Params(i) = p(i)
+ Next
+
+ Faileds.Clear()
+ For i = 0 To sys.faileds - 1
+ Faileds.Add(f(i))
+ Next
+
+ sysgc.Free()
+ fgc.Free()
+ pgc.Free()
+ egc.Free()
+ cgc.Free()
+
+ Result = sys.result
+ Dof = sys.dof
+ End Sub
+ ' A simpler version of the function, if the parameters being dragged
+ ' correspond to a single point.
+ Public Sub Solve(ByVal group As UInteger, ByVal dragged As Point,
+ ByVal calculatedFaileds As Boolean)
+ If TypeOf dragged Is Point2d Then
+ Dim p As Point2d
+ p = dragged
+ Solve(group, p.up.H, p.vp.H, 0, 0, calculatedFaileds)
+ ElseIf TypeOf dragged Is Point3d Then
+ Dim p As Point3d
+ p = dragged
+ Solve(group, p.xp.H, p.yp.H, p.zp.H, 0, calculatedFaileds)
+ Else
+ Throw New Exception("Can't get dragged params for point.")
+ End If
+ End Sub
+ ' or if it's a single distance (e.g., the radius of a circle)
+ Public Sub Solve(ByVal group As UInteger, ByVal dragged As Distance,
+ ByVal calculatedFaileds As Boolean)
+ Solve(group, dragged.dp.H, 0, 0, 0, calculatedFaileds)
+ End Sub
+ ' or if it's nothing.
+ Public Sub Solve(ByVal group As UInteger,
+ ByVal calculateFaileds As Boolean)
+ Solve(group, 0, 0, 0, 0, calculateFaileds)
+ End Sub
+
+ ' Return the quaternion in (qw, qx, qy, qz) that represents a
+ ' rotation from the base frame to a coordinate system with the
+ ' specified basis vectors u and v. For example, u = (0, 1, 0)
+ ' and v = (0, 0, 1) specifies the yz plane, such that a point with
+ ' (u, v) = (7, 12) has (x, y, z) = (0, 7, 12).
+ Public Sub MakeQuaternion(
+ ByVal ux As Double, ByVal uy As Double, ByVal uz As Double,
+ ByVal vx As Double, ByVal vy As Double, ByVal vz As Double,
+ ByRef qw As Double, ByRef qx As Double, ByRef qy As Double,
+ ByRef qz As Double)
+ Slvs_MakeQuaternion(ux, uy, uz, _
+ vx, vy, vz, _
+ qw, qx, qy, qz)
+ End Sub
+
+ Public Function FreeIn3d()
+ Return New Workplane(Me)
+ End Function
+
+
+ '''''''''''''''''''''''''''''''
+ ' Functions to create the object-oriented wrappers defined below.
+
+ Public Function NewParam(ByVal group As UInteger, ByVal val As Double)
+ Return New Param(Me, group, val)
+ End Function
+ Public Function NewPoint2d(ByVal group As UInteger,
+ ByVal wrkpl As Workplane,
+ ByVal u As Double, ByVal v As Double)
+ Return New Point2d(Me, group, wrkpl, u, v)
+ End Function
+ Public Function NewPoint2d(ByVal group As UInteger,
+ ByVal wrkpl As Workplane,
+ ByVal u As Param, ByVal v As Param)
+ Return New Point2d(Me, group, wrkpl, u, v)
+ End Function
+ Public Function NewPoint3d(ByVal group As UInteger,
+ ByVal x As Double,
+ ByVal y As Double,
+ ByVal z As Double)
+ Return New Point3d(Me, group, x, y, z)
+ End Function
+ Public Function NewPoint3d(ByVal group As UInteger,
+ ByVal x As Param,
+ ByVal y As Param,
+ ByVal z As Param)
+ Return New Point3d(Me, group, x, y, z)
+ End Function
+ Public Function NewNormal3d(ByVal group As UInteger,
+ ByVal ux As Double, ByVal uy As Double, ByVal uz As Double,
+ ByVal vx As Double, ByVal vy As Double, ByVal vz As Double)
+ Return New Normal3d(Me, group, ux, uy, uz, vx, vy, vz)
+ End Function
+ Public Function NewNormal3d(ByVal group As UInteger,
+ ByVal qw As Param, ByVal qx As Param,
+ ByVal qy As Param, ByVal qz As Param)
+ Return New Normal3d(Me, group, qw, qx, qy, qz)
+ End Function
+ Public Function NewNormal2d(ByVal group As UInteger,
+ ByVal wrkpl As Workplane)
+ Return New Normal2d(Me, group, wrkpl)
+ End Function
+ Public Function NewDistance(ByVal group As UInteger,
+ ByVal wrkpl As Workplane, ByVal d As Double)
+ Return New Distance(Me, group, wrkpl, d)
+ End Function
+ Public Function NewDistance(ByVal group As UInteger,
+ ByVal wrkpl As Workplane, ByVal d As Param)
+ Return New Distance(Me, group, wrkpl, d)
+ End Function
+ Public Function NewLineSegment(ByVal group As UInteger,
+ ByVal wrkpl As Workplane,
+ ByVal ptA As Point, ByVal ptB As Point)
+ Return New LineSegment(Me, group, wrkpl, ptA, ptB)
+ End Function
+ Public Function NewArcOfCircle(ByVal group As UInteger,
+ ByVal wrkpl As Workplane,
+ ByVal normal As Normal,
+ ByVal center As Point,
+ ByVal pstart As Point,
+ ByVal pend As Point)
+ Return New ArcOfCircle(Me, group, wrkpl, normal, _
+ center, pstart, pend)
+ End Function
+ Public Function NewCircle(ByVal group As UInteger,
+ ByVal wrkpl As Workplane,
+ ByVal center As Point,
+ ByVal normal As Normal,
+ ByVal radius As Distance)
+ Return New Circle(Me, group, wrkpl, center, normal, radius)
+ End Function
+ Public Function NewWorkplane(ByVal group As UInteger,
+ ByVal origin As Point,
+ ByVal normal As Normal)
+ Return New Workplane(Me, group, origin, normal)
+ End Function
+
+ Public Sub AddConstraint(ByVal H As UInteger, ByVal group As UInteger,
+ ByVal type As Integer,
+ ByVal wrkpl As Workplane,
+ ByVal valA As Double,
+ ByVal ptA As Point, ByVal ptB As Point,
+ ByVal entityA As Entity,
+ ByVal entityB As Entity)
+ AddConstraint(H, group, type, _
+ If(IsNothing(wrkpl), 0, wrkpl.H), _
+ valA, _
+ If(IsNothing(ptA), 0, ptA.H), _
+ If(IsNothing(ptB), 0, ptB.H), _
+ If(IsNothing(entityA), 0, entityA.H), _
+ If(IsNothing(entityB), 0, entityB.H))
+ End Sub
+
+
+ '''''''''''''''''''''''''''''''
+ ' The object-oriented wrapper classes themselves, to allow the
+ ' representation of entities and constraints as .net objects, not
+ ' integer handles. These don't do any work themselves, beyond
+ ' allocating and storing a unique integer handle.
+ '
+ ' These functions will assign parameters and entities with
+ ' consecutive handles starting from 1. If they are intermixed
+ ' with parameters and entities with user-specified handles, then
+ ' those handles must be chosen not to conflict, e.g. starting
+ ' from 100 000 or another large number.
+
+ Public Class Param
+ Public Slv As Slvs
+ Public H As UInteger
+
+ Public Sub New(ByVal s As Slvs, ByVal group As UInteger,
+ ByVal val As Double)
+ Slv = s
+ H = Slv.Params.Count() + 1
+ Slv.AddParam(H, group, val)
+ End Sub
+ End Class
+
+ Public MustInherit Class Entity
+ Public Slv As Slvs
+ Public H As UInteger
+
+ Public Sub New(ByVal s As Slvs)
+ Slv = s
+ H = Slv.Entities.Count() + 1
+ End Sub
+ End Class
+
+ Public MustInherit Class Point
+ Inherits Entity
+ Public Sub New(ByVal s As Slvs)
+ MyBase.New(s)
+ End Sub
+ End Class
+
+ Public MustInherit Class Normal
+ Inherits Entity
+ Public Sub New(ByVal s As Slvs)
+ MyBase.New(s)
+ End Sub
+ End Class
+
+ Public Class Point2d
+ Inherits Point
+ Public up, vp As Param
+ Public Sub New(ByVal s As Slvs, ByVal group As UInteger,
+ ByVal wrkpl As Workplane,
+ ByVal u As Double, ByVal v As Double)
+ MyBase.New(s)
+ up = New Param(Slv, group, u)
+ vp = New Param(Slv, group, v)
+ Slv.AddPoint2d(H, group, wrkpl.H, up.H, vp.H)
+ End Sub
+ Public Sub New(ByVal s As Slvs, ByVal group As UInteger,
+ ByVal wrkpl As Workplane,
+ ByVal u As Param, ByVal v As Param)
+ MyBase.New(s)
+ Slv.AddPoint2d(H, group, wrkpl.H, u.H, v.H)
+ up = u
+ vp = v
+ End Sub
+ Function GetU()
+ Return Slv.GetParamByHandle(up.H)
+ End Function
+ Function GetV()
+ Return Slv.GetParamByHandle(vp.H)
+ End Function
+ End Class
+
+ Public Class Point3d
+ Inherits Point
+ Public xp, yp, zp As Param
+ Public Sub New(ByVal s As Slvs, ByVal group As UInteger,
+ ByVal x As Double, ByVal y As Double,
+ ByVal z As Double)
+ MyBase.New(s)
+ xp = New Param(Slv, group, x)
+ yp = New Param(Slv, group, y)
+ zp = New Param(Slv, group, z)
+ Slv.AddPoint3d(H, group, xp.H, yp.H, zp.H)
+ End Sub
+ Public Sub New(ByVal s As Slvs, ByVal group As UInteger,
+ ByVal x As Param, ByVal y As Param, ByVal z As Param)
+ MyBase.New(s)
+ Slv.AddPoint3d(H, group, x.H, y.H, z.H)
+ xp = x
+ yp = y
+ zp = z
+ End Sub
+ Function GetX()
+ Return Slv.GetParamByHandle(xp.H)
+ End Function
+ Function GetY()
+ Return Slv.GetParamByHandle(yp.H)
+ End Function
+ Function GetZ()
+ Return Slv.GetParamByHandle(zp.H)
+ End Function
+ End Class
+
+ Public Class Normal3d
+ Inherits Normal
+ Dim qwp, qxp, qyp, qzp As Param
+ Public Sub New(ByVal s As Slvs, ByVal group As UInteger,
+ ByVal ux As Double, ByVal uy As Double, ByVal uz As Double,
+ ByVal vx As Double, ByVal vy As Double, ByVal vz As Double)
+ MyBase.New(s)
+ Dim qw, qx, qy, qz As Double
+ Slv.MakeQuaternion(ux, uy, uz, vx, vy, vz, qw, qx, qy, qz)
+ qwp = New Param(Slv, group, qw)
+ qxp = New Param(Slv, group, qx)
+ qyp = New Param(Slv, group, qy)
+ qzp = New Param(Slv, group, qz)
+ Slv.AddNormal3d(H, group, qwp.H, qxp.H, qyp.H, qzp.H)
+ End Sub
+ Public Sub New(ByVal s As Slvs, ByVal group As UInteger,
+ ByVal qw As Param, ByVal qx As Param,
+ ByVal qy As Param, ByVal qz As Param)
+ MyBase.New(s)
+ Slv.AddNormal3d(H, group, qw.H, qx.H, qy.H, qz.H)
+ qwp = qw
+ qxp = qx
+ qyp = qy
+ qzp = qz
+ End Sub
+ End Class
+
+ Public Class Normal2d
+ Inherits Normal
+ Public Sub New(ByVal s As Slvs, ByVal group As UInteger,
+ ByVal wrkpl As Workplane)
+ MyBase.New(s)
+ Slv.AddNormal2d(H, group, wrkpl.H)
+ End Sub
+ End Class
+
+ Public Class Distance
+ Inherits Entity
+ Public dp As Param
+
+ Public Sub New(ByVal s As Slvs, ByVal group As UInteger,
+ ByVal wrkpl As Workplane, ByVal d As Double)
+ MyBase.New(s)
+ dp = New Param(Slv, group, d)
+ Slv.AddDistance(H, group, wrkpl.H, dp.H)
+ End Sub
+ Public Sub New(ByVal s As Slvs, ByVal group As UInteger,
+ ByVal wrkpl As Workplane, ByVal d As Param)
+ MyBase.New(s)
+ Slv.AddDistance(H, group, wrkpl.H, d.H)
+ dp = d
+ End Sub
+ Function GetDistance() As Double
+ Return Slv.GetParamByHandle(dp.H)
+ End Function
+ End Class
+
+ Public Class LineSegment
+ Inherits Entity
+ Public Sub New(ByVal s As Slvs, ByVal group As UInteger,
+ ByVal wrkpl As Workplane,
+ ByVal ptA As Point, ByVal ptB As Point)
+ MyBase.New(s)
+ Slv.AddLineSegment(H, group, wrkpl.H, ptA.H, ptB.H)
+ End Sub
+ End Class
+
+ Public Class Cubic
+ Inherits Entity
+ Public Sub New(ByVal s As Slvs, ByVal group As UInteger,
+ ByVal wrkpl As Workplane,
+ ByVal pt0 As Point, ByVal pt1 As Point,
+ ByVal pt2 As Point, ByVal pt3 As Point)
+ MyBase.New(s)
+ Slv.AddCubic(H, group, wrkpl.H, pt0.H, pt1.H, pt2.H, pt3.H)
+ End Sub
+ End Class
+
+ Public Class ArcOfCircle
+ Inherits Entity
+ Public Sub New(ByVal s As Slvs, ByVal group As UInteger,
+ ByVal wrkpl As Workplane, ByVal normal As Normal,
+ ByVal center As Point, ByVal pstart As Point,
+ ByVal pend As Point)
+ MyBase.New(s)
+ Slv.AddArcOfCircle(H, group, wrkpl.H, normal.H, _
+ center.H, pstart.H, pend.H)
+ End Sub
+ End Class
+
+ Public Class Circle
+ Inherits Entity
+ Public Sub New(ByVal s As Slvs, ByVal group As UInteger,
+ ByVal wrkpl As Workplane, ByVal center As Point,
+ ByVal normal As Normal, ByVal radius As Distance)
+ MyBase.New(s)
+ Slv.AddCircle(H, group, wrkpl.H, center.H, normal.H, radius.H)
+ End Sub
+ End Class
+
+ Public Class Workplane
+ Inherits Entity
+ Public Sub New(ByVal s As Slvs)
+ MyBase.New(s)
+ H = SLVS_FREE_IN_3D
+ End Sub
+ Public Sub New(ByVal s As Slvs, ByVal group As UInteger,
+ ByVal origin As Point, ByVal normal As Normal)
+ MyBase.New(s)
+ Slv.AddWorkplane(H, group, origin.H, normal.H)
+ End Sub
+ End Class
+
+ End Class
+
+End Module
+
--- /dev/null
+if(MSVC)
+ # Disable some overly strict MSVC warnings.
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -wd4244 -wd4800 -wd4805")
+endif()
+
+set(intern_HEADERS
+ intern/drw_cptable932.h
+ intern/drw_cptable936.h
+ intern/drw_cptable949.h
+ intern/drw_cptable950.h
+ intern/drw_cptables.h
+ intern/drw_dbg.h
+ intern/drw_textcodec.h
+ intern/dwgbuffer.h
+ intern/dwgreader15.h
+ intern/dwgreader18.h
+ intern/dwgreader21.h
+ intern/dwgreader24.h
+ intern/dwgreader27.h
+ intern/dwgreader.h
+ intern/dwgutil.h
+ intern/dxfreader.h
+ intern/dxfwriter.h
+ intern/rscodec.h)
+
+set(intern_SOURCES
+ intern/drw_dbg.cpp
+ intern/drw_textcodec.cpp
+ intern/dwgbuffer.cpp
+ intern/dwgreader15.cpp
+ intern/dwgreader18.cpp
+ intern/dwgreader21.cpp
+ intern/dwgreader24.cpp
+ intern/dwgreader27.cpp
+ intern/dwgreader.cpp
+ intern/dwgutil.cpp
+ intern/dxfreader.cpp
+ intern/dxfwriter.cpp
+ intern/rscodec.cpp)
+
+set(libdxfrw_HEADERS
+ drw_base.h
+ drw_interface.h
+ drw_header.h
+ drw_classes.h
+ drw_entities.h
+ drw_objects.h
+ libdxfrw.h)
+
+set(libdxfrw_SOURCES
+ drw_header.cpp
+ drw_classes.cpp
+ drw_entities.cpp
+ drw_objects.cpp
+ libdxfrw.cpp)
+
+set(libdwgr_HEADERS
+ libdwgr.h)
+
+set(libdwgr_SOURCES
+ libdwgr.cpp)
+
+add_library(dxfrw STATIC
+ ${intern_HEADERS}
+ ${intern_SOURCES}
+ ${libdxfrw_HEADERS}
+ ${libdxfrw_SOURCES}
+ ${libdwgr_HEADERS}
+ ${libdwgr_SOURCES})
+
+target_include_directories(dxfrw PRIVATE
+ ${CMAKE_CURRENT_SOURCE_DIR}/intern/)
+
+target_include_directories(dxfrw PUBLIC
+ ${CMAKE_CURRENT_SOURCE_DIR}/)
--- /dev/null
+/******************************************************************************
+** libDXFrw - Library to read/write DXF files (ascii & binary) **
+** **
+** Copyright (C) 2011-2015 José F. Soriano, rallazz@gmail.com **
+** **
+** This library is free software, licensed under the terms of the GNU **
+** General Public License as published by the Free Software Foundation, **
+** either version 2 of the License, or (at your option) any later version. **
+** You should have received a copy of the GNU General Public License **
+** along with this program. If not, see <http://www.gnu.org/licenses/>. **
+******************************************************************************/
+
+#ifndef DRW_BASE_H
+#define DRW_BASE_H
+
+#define DRW_VERSION "0.6.3"
+
+#include <string>
+#include <list>
+#include <cmath>
+
+#ifdef DRW_ASSERTS
+# define drw_assert(a) assert(a)
+#else
+# define drw_assert(a)
+#endif
+
+#define UTF8STRING std::string
+#define DRW_UNUSED(x) (void)x
+
+#if defined(WIN64) || defined(_WIN64) || defined(__WIN64__)
+# define DRW_WIN
+#elif defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || defined(__NT__)
+# define DRW_WIN
+#elif defined(__MWERKS__) && defined(__INTEL__)
+# define DRW_WIN
+#else
+# define DRW_POSIX
+#endif
+
+#ifndef M_PI
+ #define M_PI 3.141592653589793238462643
+#endif
+#ifndef M_PI_2
+ #define M_PI_2 1.57079632679489661923
+#endif
+#define M_PIx2 6.283185307179586 // 2*PI
+#define ARAD 57.29577951308232
+
+typedef signed char dint8; /* 8 bit signed */
+typedef signed short dint16; /* 16 bit signed */
+typedef signed int dint32; /* 32 bit signed */
+typedef long long int dint64; /* 64 bit signed */
+
+typedef unsigned char duint8; /* 8 bit unsigned */
+typedef unsigned short duint16; /* 16 bit unsigned */
+typedef unsigned int duint32; /* 32 bit unsigned */
+typedef unsigned long long int duint64; /* 64 bit unsigned */
+
+typedef float dfloat32; /* 32 bit floating point */
+typedef double ddouble64; /* 64 bit floating point */
+typedef long double ddouble80; /* 80 bit floating point */
+
+
+namespace DRW {
+
+//! Version numbers for the DXF Format.
+enum Version {
+ UNKNOWNV, /*!< UNKNOWN VERSION. */
+ AC1006, /*!< R10. */
+ AC1009, /*!< R11 & R12. */
+ AC1012, /*!< R13. */
+ AC1014, /*!< R14. */
+ AC1015, /*!< ACAD 2000. */
+ AC1018, /*!< ACAD 2004. */
+ AC1021, /*!< ACAD 2007. */
+ AC1024, /*!< ACAD 2010. */
+ AC1027 /*!< ACAD 2013. */
+};
+
+enum error {
+BAD_NONE, /*!< No error. */
+BAD_UNKNOWN, /*!< UNKNOWN. */
+BAD_OPEN, /*!< error opening file. */
+BAD_VERSION, /*!< unsupported version. */
+BAD_READ_METADATA, /*!< error reading matadata. */
+BAD_READ_FILE_HEADER, /*!< error in file header read process. */
+BAD_READ_HEADER, /*!< error in header vars read process. */
+BAD_READ_HANDLES, /*!< error in object map read process. */
+BAD_READ_CLASSES, /*!< error in classes read process. */
+BAD_READ_TABLES, /*!< error in tables read process. */
+BAD_READ_BLOCKS, /*!< error in block read process. */
+BAD_READ_ENTITIES, /*!< error in entities read process. */
+BAD_READ_OBJECTS /*!< error in objects read process. */
+};
+
+enum DBG_LEVEL {
+ NONE,
+ DEBUG
+};
+
+//! Special codes for colors
+enum ColorCodes {
+ ColorByLayer = 256,
+ ColorByBlock = 0
+};
+
+//! Spaces
+enum Space {
+ ModelSpace = 0,
+ PaperSpace = 1
+};
+
+//! Special kinds of handles
+enum HandleCodes {
+ NoHandle = 0
+};
+
+//! Shadow mode
+enum ShadowMode {
+ CastAndReceieveShadows = 0,
+ CastShadows = 1,
+ ReceiveShadows = 2,
+ IgnoreShadows = 3
+};
+
+//! Special kinds of materials
+enum MaterialCodes {
+ MaterialByLayer = 0
+};
+
+//! Special kinds of plot styles
+enum PlotStyleCodes {
+ DefaultPlotStyle = 0
+};
+
+//! Special kinds of transparencies
+enum TransparencyCodes {
+ Opaque = 0,
+ Transparent = -1
+};
+
+} // namespace DRW
+
+//! Class to handle 3D coordinate point
+/*!
+* Class to handle 3D coordinate point
+* @author Rallaz
+*/
+class DRW_Coord {
+public:
+ DRW_Coord() { x = 0; y = 0; z = 0; }
+ DRW_Coord(double ix, double iy, double iz) {
+ x = ix; y = iy; z = iz;
+ }
+
+ DRW_Coord operator = (const DRW_Coord& data) {
+ x = data.x; y = data.y; z = data.z;
+ return *this;
+ }
+/*!< convert to unitary vector */
+ void unitize(){
+ double dist;
+ dist = sqrt(x*x + y*y + z*z);
+ if (dist > 0.0) {
+ x= x/dist;
+ y= y/dist;
+ z= z/dist;
+ }
+ }
+
+public:
+ double x;
+ double y;
+ double z;
+};
+
+
+//! Class to handle vertex
+/*!
+* Class to handle vertex for lwpolyline entity
+* @author Rallaz
+*/
+class DRW_Vertex2D {
+public:
+ DRW_Vertex2D() {
+// eType = DRW::LWPOLYLINE;
+ stawidth = endwidth = bulge = 0;
+ }
+ DRW_Vertex2D(double sx, double sy, double b) {
+ stawidth = endwidth = 0;
+ x = sx;
+ y =sy;
+ bulge = b;
+ }
+
+public:
+ double x; /*!< x coordinate, code 10 */
+ double y; /*!< y coordinate, code 20 */
+ double stawidth; /*!< Start width, code 40 */
+ double endwidth; /*!< End width, code 41 */
+ double bulge; /*!< bulge, code 42 */
+};
+
+
+//! Class to handle header vars
+/*!
+* Class to handle header vars
+* @author Rallaz
+*/
+class DRW_Variant {
+public:
+ enum TYPE {
+ STRING,
+ INTEGER,
+ DOUBLE,
+ COORD,
+ INVALID
+ };
+//TODO: add INT64 support
+ DRW_Variant() {
+ type = INVALID;
+ }
+
+ DRW_Variant(int c, dint32 i) {
+ code = c; addInt(i);
+ }
+ DRW_Variant(int c, duint32 i) {
+ code = c; addInt(static_cast<dint32>(i));//RLZ: verify if worrk with big numbers
+ }
+ DRW_Variant(int c, double d) {
+ code = c; addDouble(d);
+ }
+ DRW_Variant(int c, UTF8STRING s) {
+ code = c; addString(s);
+ }
+ DRW_Variant(int c, DRW_Coord crd) {
+ code = c; addCoord(crd);
+ }
+ DRW_Variant(const DRW_Variant& d) {
+ code = d.code;
+ type = d.type;
+ content = d.content;
+ if (d.type == COORD) {
+ vdata = d.vdata;
+ content.v = &vdata;
+ }
+ if (d.type == STRING) {
+ sdata = d.sdata;
+ content.s = &sdata;
+ }
+ }
+
+ ~DRW_Variant() {
+ }
+
+ void addString(UTF8STRING s) {setType(STRING); sdata = s; content.s = &sdata;}
+ void addInt(int i) {setType(INTEGER); content.i = i;}
+ void addDouble(double d) {setType(DOUBLE); content.d = d;}
+ void addCoord() {setType(COORD); vdata.x=0.0; vdata.y=0.0; vdata.z=0.0; content.v = &vdata;}
+ void addCoord(DRW_Coord v) {setType(COORD); vdata = v; content.v = &vdata;}
+ void setType(enum TYPE t) { type = t;}
+ void setCoordX(double d) { if (type == COORD) vdata.x = d;}
+ void setCoordY(double d) { if (type == COORD) vdata.y = d;}
+ void setCoordZ(double d) { if (type == COORD) vdata.z = d;}
+
+private:
+ typedef union {
+ UTF8STRING *s;
+ dint32 i;
+ double d;
+ DRW_Coord *v;
+ } DRW_VarContent;
+
+public:
+ DRW_VarContent content;
+ enum TYPE type;
+ int code; /*!< dxf code of this value*/
+
+private:
+ std::string sdata;
+ DRW_Coord vdata;
+};
+
+//! Class to handle dwg handles
+/*!
+* Class to handle dwg handles
+* @author Rallaz
+*/
+class dwgHandle{
+public:
+ dwgHandle(){
+ code=0;
+ size=0;
+ ref=0;
+ }
+ ~dwgHandle(){}
+ duint8 code;
+ duint8 size;
+ duint32 ref;
+};
+
+//! Class to convert between line width and integer
+/*!
+* Class to convert between line width and integer
+* verifing valid values, if value is not valid
+* returns widthDefault.
+* @author Rallaz
+*/
+class DRW_LW_Conv{
+public:
+ enum lineWidth {
+ width00 = 0, /*!< 0.00mm (dxf 0)*/
+ width01 = 1, /*!< 0.05mm (dxf 5)*/
+ width02 = 2, /*!< 0.09mm (dxf 9)*/
+ width03 = 3, /*!< 0.13mm (dxf 13)*/
+ width04 = 4, /*!< 0.15mm (dxf 15)*/
+ width05 = 5, /*!< 0.18mm (dxf 18)*/
+ width06 = 6, /*!< 0.20mm (dxf 20)*/
+ width07 = 7, /*!< 0.25mm (dxf 25)*/
+ width08 = 8, /*!< 0.30mm (dxf 30)*/
+ width09 = 9, /*!< 0.35mm (dxf 35)*/
+ width10 = 10, /*!< 0.40mm (dxf 40)*/
+ width11 = 11, /*!< 0.50mm (dxf 50)*/
+ width12 = 12, /*!< 0.53mm (dxf 53)*/
+ width13 = 13, /*!< 0.60mm (dxf 60)*/
+ width14 = 14, /*!< 0.70mm (dxf 70)*/
+ width15 = 15, /*!< 0.80mm (dxf 80)*/
+ width16 = 16, /*!< 0.90mm (dxf 90)*/
+ width17 = 17, /*!< 1.00mm (dxf 100)*/
+ width18 = 18, /*!< 1.06mm (dxf 106)*/
+ width19 = 19, /*!< 1.20mm (dxf 120)*/
+ width20 = 20, /*!< 1.40mm (dxf 140)*/
+ width21 = 21, /*!< 1.58mm (dxf 158)*/
+ width22 = 22, /*!< 2.00mm (dxf 200)*/
+ width23 = 23, /*!< 2.11mm (dxf 211)*/
+ widthByLayer = 29, /*!< by layer (dxf -1) */
+ widthByBlock = 30, /*!< by block (dxf -2) */
+ widthDefault = 31 /*!< by default (dxf -3) */
+ };
+
+ static int lineWidth2dxfInt(enum lineWidth lw){
+ switch (lw){
+ case widthByLayer:
+ return -1;
+ case widthByBlock:
+ return -2;
+ case widthDefault:
+ return -3;
+ case width00:
+ return 0;
+ case width01:
+ return 5;
+ case width02:
+ return 9;
+ case width03:
+ return 13;
+ case width04:
+ return 15;
+ case width05:
+ return 18;
+ case width06:
+ return 20;
+ case width07:
+ return 25;
+ case width08:
+ return 30;
+ case width09:
+ return 35;
+ case width10:
+ return 40;
+ case width11:
+ return 50;
+ case width12:
+ return 53;
+ case width13:
+ return 60;
+ case width14:
+ return 70;
+ case width15:
+ return 80;
+ case width16:
+ return 90;
+ case width17:
+ return 100;
+ case width18:
+ return 106;
+ case width19:
+ return 120;
+ case width20:
+ return 140;
+ case width21:
+ return 158;
+ case width22:
+ return 200;
+ case width23:
+ return 211;
+ default:
+ break;
+ }
+ return -3;
+ }
+
+ static int lineWidth2dwgInt(enum lineWidth lw){
+ return static_cast<int> (lw);
+ }
+
+ static enum lineWidth dxfInt2lineWidth(int i){
+ if (i<0) {
+ if (i==-1)
+ return widthByLayer;
+ else if (i==-2)
+ return widthByBlock;
+ else if (i==-3)
+ return widthDefault;
+ } else if (i<3) {
+ return width00;
+ } else if (i<7) {
+ return width01;
+ } else if (i<11) {
+ return width02;
+ } else if (i<14) {
+ return width03;
+ } else if (i<16) {
+ return width04;
+ } else if (i<19) {
+ return width05;
+ } else if (i<22) {
+ return width06;
+ } else if (i<27) {
+ return width07;
+ } else if (i<32) {
+ return width08;
+ } else if (i<37) {
+ return width09;
+ } else if (i<45) {
+ return width10;
+ } else if (i<52) {
+ return width11;
+ } else if (i<57) {
+ return width12;
+ } else if (i<65) {
+ return width13;
+ } else if (i<75) {
+ return width14;
+ } else if (i<85) {
+ return width15;
+ } else if (i<95) {
+ return width16;
+ } else if (i<103) {
+ return width17;
+ } else if (i<112) {
+ return width18;
+ } else if (i<130) {
+ return width19;
+ } else if (i<149) {
+ return width20;
+ } else if (i<180) {
+ return width21;
+ } else if (i<205) {
+ return width22;
+ } else {
+ return width23;
+ }
+ //default by default
+ return widthDefault;
+ }
+
+ static enum lineWidth dwgInt2lineWidth(int i){
+ if ( (i>-1 && i<24) || (i>28 && i<32) ) {
+ return static_cast<lineWidth> (i);
+ }
+ //default by default
+ return widthDefault;
+ }
+};
+
+#endif
+
+// EOF
--- /dev/null
+/******************************************************************************
+** libDXFrw - Library to read/write DXF files (ascii & binary) **
+** **
+** Copyright (C) 2011-2015 José F. Soriano, rallazz@gmail.com **
+** **
+** This library is free software, licensed under the terms of the GNU **
+** General Public License as published by the Free Software Foundation, **
+** either version 2 of the License, or (at your option) any later version. **
+** You should have received a copy of the GNU General Public License **
+** along with this program. If not, see <http://www.gnu.org/licenses/>. **
+******************************************************************************/
+
+#include "drw_classes.h"
+#include "intern/dxfreader.h"
+#include "intern/dxfwriter.h"
+#include "intern/dwgbuffer.h"
+#include "intern/drw_dbg.h"
+
+void DRW_Class::parseCode(int code, dxfReader *reader){
+ switch (code) {
+ case 1:
+ recName = reader->getUtf8String();
+ break;
+ case 2:
+ className = reader->getUtf8String();
+ break;
+ case 3:
+ appName = reader->getUtf8String();
+ break;
+ case 90:
+ proxyFlag = reader->getInt32();
+ break;
+ case 91:
+ instanceCount = reader->getInt32();
+ break;
+ case 280:
+ wasaProxyFlag = reader->getInt32();
+ break;
+ case 281:
+ entityFlag = reader->getInt32();
+ break;
+ default:
+ break;
+ }
+}
+
+bool DRW_Class::parseDwg(DRW::Version version, dwgBuffer *buf, dwgBuffer *strBuf){
+ DRW_DBG("\n***************************** parsing Class *********************************************\n");
+
+ classNum = buf->getBitShort();
+ DRW_DBG("Class number: "); DRW_DBG(classNum);
+ proxyFlag = buf->getBitShort(); //in dwg specs says "version"
+
+ appName = strBuf->getVariableText(version, false);
+ className = strBuf->getVariableText(version, false);
+ recName = strBuf->getVariableText(version, false);
+
+ DRW_DBG("\napp name: "); DRW_DBG(appName.c_str());
+ DRW_DBG("\nclass name: "); DRW_DBG(className.c_str());
+ DRW_DBG("\ndxf rec name: "); DRW_DBG(recName.c_str());
+ wasaProxyFlag = buf->getBit(); //in dwg says wasazombie
+ entityFlag = buf->getBitShort();
+ entityFlag = entityFlag == 0x1F2 ? 1: 0;
+
+ DRW_DBG("\nProxy capabilities flag: "); DRW_DBG(proxyFlag);
+ DRW_DBG(", proxy flag (280): "); DRW_DBG(wasaProxyFlag);
+ DRW_DBG(", entity flag: "); DRW_DBGH(entityFlag);
+
+ if (version > DRW::AC1015) {//2004+
+ instanceCount = buf->getBitLong();
+ DRW_DBG("\nInstance Count: "); DRW_DBG(instanceCount);
+ duint32 dwgVersion = buf->getBitLong();
+ DRW_DBG("\nDWG version: "); DRW_DBG(dwgVersion);
+ DRW_DBG("\nmaintenance version: "); DRW_DBG(buf->getBitLong());
+ DRW_DBG("\nunknown 1: "); DRW_DBG(buf->getBitLong());
+ DRW_DBG("\nunknown 2: "); DRW_DBG(buf->getBitLong());
+ }
+ DRW_DBG("\n");
+ toDwgType();
+ return buf->isGood();
+}
+
+void DRW_Class::write(dxfWriter *writer, DRW::Version ver){
+ if (ver > DRW::AC1009) {
+ writer->writeString(0, "CLASS");
+ writer->writeString(1, recName);
+ writer->writeString(2, className);
+ writer->writeString(3, appName);
+ writer->writeInt32(90, proxyFlag);
+ if (ver > DRW::AC1015) { //2004+
+ writer->writeInt32(91, instanceCount);
+ }
+ writer->writeInt16(280, wasaProxyFlag);
+ writer->writeInt16(281, entityFlag);
+ }
+}
+
+void DRW_Class::toDwgType(){
+ if (recName == "LWPOLYLINE")
+ dwgType = 77;
+ else if (recName == "HATCH")
+ dwgType = 78;
+ else if (recName == "GROUP")
+ dwgType = 72;
+/* else if (recName == "GROUP")
+ dwgType = 72;*/
+ else if (recName == "LAYOUT")
+ dwgType = 82;
+ else if (recName == "IMAGE")
+ dwgType = 101;
+ else if (recName == "IMAGEDEF")
+ dwgType = 102;
+ else
+ dwgType =0;
+}
--- /dev/null
+/******************************************************************************
+** libDXFrw - Library to read/write DXF files (ascii & binary) **
+** **
+** Copyright (C) 2011-2015 José F. Soriano, rallazz@gmail.com **
+** **
+** This library is free software, licensed under the terms of the GNU **
+** General Public License as published by the Free Software Foundation, **
+** either version 2 of the License, or (at your option) any later version. **
+** You should have received a copy of the GNU General Public License **
+** along with this program. If not, see <http://www.gnu.org/licenses/>. **
+******************************************************************************/
+
+#ifndef DRW_CLASSES_H
+#define DRW_CLASSES_H
+
+
+#include "drw_base.h"
+//#include "libdwgr.h"
+
+class dxfReader;
+class dxfWriter;
+class dwgBuffer;
+
+//! Class to handle classes entries
+/*!
+* Class to handle classes table entries
+* TODO: verify the dxf read/write part
+* @author Rallaz
+*/
+class DRW_Class {
+public:
+ DRW_Class() {
+ }
+ ~DRW_Class() {
+ }
+
+ void parseCode(int code, dxfReader *reader);
+ void write(dxfWriter *writer, DRW::Version ver);
+ bool parseDwg(DRW::Version version, dwgBuffer *buf, dwgBuffer *strBuf);
+
+private:
+ void toDwgType();
+public:
+ UTF8STRING recName; /*!< record name, code 1 */
+ UTF8STRING className; /*!< C++ class name, code 2 */
+ UTF8STRING appName; /*!< app name, code 3 */
+ int proxyFlag; /*!< Proxy capabilities flag, code 90 */
+ int instanceCount; /*!< number of instances for a custom class, code 91*/
+ int wasaProxyFlag; /*!< proxy flag (app loaded on save), code 280 */
+ int entityFlag; /*!< entity flag, code 281 (0 object, 1 entity)*/
+public: //only for read dwg
+ duint16 classNum;
+ int dwgType;
+};
+
+#endif
+
+// EOF
--- /dev/null
+/******************************************************************************
+** libDXFrw - Library to read/write DXF files (ascii & binary) **
+** **
+** Copyright (C) 2011-2015 José F. Soriano, rallazz@gmail.com **
+** **
+** This library is free software, licensed under the terms of the GNU **
+** General Public License as published by the Free Software Foundation, **
+** either version 2 of the License, or (at your option) any later version. **
+** You should have received a copy of the GNU General Public License **
+** along with this program. If not, see <http://www.gnu.org/licenses/>. **
+******************************************************************************/
+
+#include <cstdlib>
+#include "drw_entities.h"
+#include "intern/dxfreader.h"
+#include "intern/dwgbuffer.h"
+#include "intern/drw_dbg.h"
+
+
+//! Calculate arbitary axis
+/*!
+* Calculate arbitary axis for apply extrusions
+* @author Rallaz
+*/
+void DRW_Entity::calculateAxis(DRW_Coord extPoint){
+ //Follow the arbitrary DXF definitions for extrusion axes.
+ if (fabs(extPoint.x) < 0.015625 && fabs(extPoint.y) < 0.015625) {
+ //If we get here, implement Ax = Wy x N where Wy is [0,1,0] per the DXF spec.
+ //The cross product works out to Wy.y*N.z-Wy.z*N.y, Wy.z*N.x-Wy.x*N.z, Wy.x*N.y-Wy.y*N.x
+ //Factoring in the fixed values for Wy gives N.z,0,-N.x
+ extAxisX.x = extPoint.z;
+ extAxisX.y = 0;
+ extAxisX.z = -extPoint.x;
+ } else {
+ //Otherwise, implement Ax = Wz x N where Wz is [0,0,1] per the DXF spec.
+ //The cross product works out to Wz.y*N.z-Wz.z*N.y, Wz.z*N.x-Wz.x*N.z, Wz.x*N.y-Wz.y*N.x
+ //Factoring in the fixed values for Wz gives -N.y,N.x,0.
+ extAxisX.x = -extPoint.y;
+ extAxisX.y = extPoint.x;
+ extAxisX.z = 0;
+ }
+
+ extAxisX.unitize();
+
+ //Ay = N x Ax
+ extAxisY.x = (extPoint.y * extAxisX.z) - (extAxisX.y * extPoint.z);
+ extAxisY.y = (extPoint.z * extAxisX.x) - (extAxisX.z * extPoint.x);
+ extAxisY.z = (extPoint.x * extAxisX.y) - (extAxisX.x * extPoint.y);
+
+ extAxisY.unitize();
+}
+
+//! Extrude a point using arbitary axis
+/*!
+* apply extrusion in a point using arbitary axis (previous calculated)
+* @author Rallaz
+*/
+void DRW_Entity::extrudePoint(DRW_Coord extPoint, DRW_Coord *point){
+ double px, py, pz;
+ px = (extAxisX.x*point->x)+(extAxisY.x*point->y)+(extPoint.x*point->z);
+ py = (extAxisX.y*point->x)+(extAxisY.y*point->y)+(extPoint.y*point->z);
+ pz = (extAxisX.z*point->x)+(extAxisY.z*point->y)+(extPoint.z*point->z);
+
+ point->x = px;
+ point->y = py;
+ point->z = pz;
+}
+
+bool DRW_Entity::parseCode(int code, dxfReader *reader){
+ switch (code) {
+ case 5:
+ handle = reader->getHandleString();
+ break;
+ case 330:
+ parentHandle = reader->getHandleString();
+ break;
+ case 8:
+ layer = reader->getUtf8String();
+ break;
+ case 6:
+ lineType = reader->getUtf8String();
+ break;
+ case 62:
+ color = reader->getInt32();
+ break;
+ case 370:
+ lWeight = DRW_LW_Conv::dxfInt2lineWidth(reader->getInt32());
+ break;
+ case 48:
+ ltypeScale = reader->getDouble();
+ break;
+ case 60:
+ visible = reader->getBool();
+ break;
+ case 420:
+ color24 = reader->getInt32();
+ break;
+ case 430:
+ colorName = reader->getString();
+ break;
+ case 67:
+ space = static_cast<DRW::Space>(reader->getInt32());
+ break;
+ case 102:
+ parseDxfGroups(code, reader);
+ break;
+ case 1000:
+ case 1001:
+ case 1002:
+ case 1003:
+ case 1004:
+ case 1005:
+ extData.push_back(new DRW_Variant(code, reader->getString()));
+ break;
+ case 1010:
+ case 1011:
+ case 1012:
+ case 1013:
+ curr = new DRW_Variant();
+ curr->addCoord();
+ curr->setCoordX(reader->getDouble());
+ curr->code = code;
+ extData.push_back(curr);
+ break;
+ case 1020:
+ case 1021:
+ case 1022:
+ case 1023:
+ if (curr)
+ curr->setCoordY(reader->getDouble());
+ break;
+ case 1030:
+ case 1031:
+ case 1032:
+ case 1033:
+ if (curr)
+ curr->setCoordZ(reader->getDouble());
+ curr=NULL;
+ break;
+ case 1040:
+ case 1041:
+ case 1042:
+ extData.push_back(new DRW_Variant(code, reader->getDouble() ));
+ break;
+ case 1070:
+ case 1071:
+ extData.push_back(new DRW_Variant(code, reader->getInt32() ));
+ break;
+ default:
+ break;
+ }
+ return true;
+}
+
+//parses dxf 102 groups to read entity
+bool DRW_Entity::parseDxfGroups(int code, dxfReader *reader){
+ std::list<DRW_Variant> ls;
+ DRW_Variant curr;
+ int nc;
+ std::string appName= reader->getString();
+ if (!appName.empty() && appName.at(0)== '{'){
+ curr.addString(appName.substr(1, (int) appName.size()-1));
+ curr.code = code;
+ ls.push_back(curr);
+ while (code !=102 && appName.at(0)== '}'){
+ reader->readRec(&nc);
+ curr.code = code;
+ if (code == 330 || code == 360)
+ curr.addInt(reader->getHandleString());
+ else {
+ switch (reader->type) {
+ case dxfReader::STRING:
+ curr.addString(reader->getString());
+ break;
+ case dxfReader::INT32:
+ case dxfReader::INT64:
+ curr.addInt(reader->getInt32());
+ break;
+ case dxfReader::DOUBLE:
+ curr.addDouble(reader->getDouble());
+ break;
+ case dxfReader::BOOL:
+ curr.addInt(reader->getInt32());
+ break;
+ default:
+ break;
+ }
+ }
+ ls.push_back(curr);
+ }
+ }
+
+ appData.push_back(ls);
+ return true;
+}
+
+bool DRW_Entity::parseDwg(DRW::Version version, dwgBuffer *buf, dwgBuffer* strBuf, duint32 bs){
+ objSize=0;
+ DRW_DBG("\n***************************** parsing entity *********************************************\n");
+ oType = buf->getObjType(version);
+ DRW_DBG("Object type: "); DRW_DBG(oType); DRW_DBG(", "); DRW_DBGH(oType);
+
+ if (version > DRW::AC1014 && version < DRW::AC1024) {//2000 & 2004
+ objSize = buf->getRawLong32(); //RL 32bits object size in bits
+ DRW_DBG(" Object size: "); DRW_DBG(objSize); DRW_DBG("\n");
+ }
+ if (version > DRW::AC1021) {//2010+
+ duint32 ms = buf->size();
+ objSize = ms*8 - bs;
+ DRW_DBG(" Object size: "); DRW_DBG(objSize); DRW_DBG("\n");
+ }
+
+ if (strBuf != NULL && version > DRW::AC1018) {//2007+
+ strBuf->moveBitPos(objSize-1);
+ DRW_DBG(" strBuf strbit pos 2007: "); DRW_DBG(strBuf->getPosition()); DRW_DBG(" strBuf bpos 2007: "); DRW_DBG(strBuf->getBitPos()); DRW_DBG("\n");
+ if (strBuf->getBit() == 1){
+ DRW_DBG("DRW_TableEntry::parseDwg string bit is 1\n");
+ strBuf->moveBitPos(-17);
+ duint16 strDataSize = strBuf->getRawShort16();
+ DRW_DBG("\nDRW_TableEntry::parseDwg string strDataSize: "); DRW_DBGH(strDataSize); DRW_DBG("\n");
+ if ( (strDataSize& 0x8000) == 0x8000){
+ DRW_DBG("\nDRW_TableEntry::parseDwg string 0x8000 bit is set");
+ strBuf->moveBitPos(-33);//RLZ pending to verify
+ duint16 hiSize = strBuf->getRawShort16();
+ strDataSize = ((strDataSize&0x7fff) | (hiSize<<15));
+ }
+ strBuf->moveBitPos( -strDataSize -16); //-14
+ DRW_DBG("strBuf start strDataSize pos 2007: "); DRW_DBG(strBuf->getPosition()); DRW_DBG(" strBuf bpos 2007: "); DRW_DBG(strBuf->getBitPos()); DRW_DBG("\n");
+ } else
+ DRW_DBG("\nDRW_TableEntry::parseDwg string bit is 0");
+ DRW_DBG("strBuf start pos 2007: "); DRW_DBG(strBuf->getPosition()); DRW_DBG(" strBuf bpos 2007: "); DRW_DBG(strBuf->getBitPos()); DRW_DBG("\n");
+ }
+
+ dwgHandle ho = buf->getHandle();
+ handle = ho.ref;
+ DRW_DBG("Entity Handle: "); DRW_DBGHL(ho.code, ho.size, ho.ref);
+ dint16 extDataSize = buf->getBitShort(); //BS
+ DRW_DBG(" ext data size: "); DRW_DBG(extDataSize);
+ while (extDataSize>0 && buf->isGood()) {
+ /* RLZ: TODO */
+ dwgHandle ah = buf->getHandle();
+ DRW_DBG("App Handle: "); DRW_DBGHL(ah.code, ah.size, ah.ref);
+ duint8 *tmpExtData = new duint8[extDataSize];
+ buf->getBytes(tmpExtData, extDataSize);
+ dwgBuffer tmpExtDataBuf(tmpExtData, extDataSize, buf->decoder);
+
+ duint8 dxfCode = tmpExtDataBuf.getRawChar8();
+ DRW_DBG(" dxfCode: "); DRW_DBG(dxfCode);
+ switch (dxfCode){
+ case 0:{
+ duint8 strLength = tmpExtDataBuf.getRawChar8();
+ DRW_DBG(" strLength: "); DRW_DBG(strLength);
+ duint16 cp = tmpExtDataBuf.getBERawShort16();
+ DRW_DBG(" str codepage: "); DRW_DBG(cp);
+ for (int i=0;i< strLength+1;i++) {//string length + null terminating char
+ duint8 dxfChar = tmpExtDataBuf.getRawChar8();
+ DRW_DBG(" dxfChar: "); DRW_DBG(dxfChar);
+ }
+ break;
+ }
+ default:
+ /* RLZ: TODO */
+ break;
+ }
+ delete[]tmpExtData;
+ extDataSize = buf->getBitShort(); //BS
+ DRW_DBG(" ext data size: "); DRW_DBG(extDataSize);
+ } //end parsing extData (EED)
+ duint8 graphFlag = buf->getBit(); //B
+ DRW_DBG(" graphFlag: "); DRW_DBG(graphFlag); DRW_DBG("\n");
+ if (graphFlag) {
+ duint32 graphDataSize = buf->getRawLong32(); //RL 32bits
+ DRW_DBG("graphData in bytes: "); DRW_DBG(graphDataSize); DRW_DBG("\n");
+// RLZ: TODO
+ //skip graphData bytes
+ duint8 *tmpGraphData = new duint8[graphDataSize];
+ buf->getBytes(tmpGraphData, graphDataSize);
+ dwgBuffer tmpGraphDataBuf(tmpGraphData, graphDataSize, buf->decoder);
+ DRW_DBG("graph data remaining bytes: "); DRW_DBG(tmpGraphDataBuf.numRemainingBytes()); DRW_DBG("\n");
+ delete[]tmpGraphData;
+ }
+ if (version < DRW::AC1015) {//14-
+ objSize = buf->getRawLong32(); //RL 32bits object size in bits
+ DRW_DBG(" Object size in bits: "); DRW_DBG(objSize); DRW_DBG("\n");
+ }
+
+ duint8 entmode = buf->get2Bits(); //BB
+ if (entmode == 0)
+ ownerHandle= true;
+// entmode = 2;
+ else if(entmode ==2)
+ entmode = 0;
+ space = (DRW::Space)entmode; //RLZ verify cast values
+ DRW_DBG("entmode: "); DRW_DBG(entmode);
+ numReactors = buf->getBitShort(); //BS
+ DRW_DBG(", numReactors: "); DRW_DBG(numReactors);
+
+ if (version < DRW::AC1015) {//14-
+ if(buf->getBit()) {//is bylayer line type
+ lineType = "BYLAYER";
+ ltFlags = 0;
+ } else {
+ lineType = "";
+ ltFlags = 3;
+ }
+ DRW_DBG(" lineType: "); DRW_DBG(lineType.c_str());
+ DRW_DBG(" ltFlags: "); DRW_DBG(ltFlags);
+ }
+ if (version > DRW::AC1015) {//2004+
+ xDictFlag = buf->getBit();
+ DRW_DBG(" xDictFlag: "); DRW_DBG(xDictFlag); DRW_DBG("\n");
+ }
+
+ if (version > DRW::AC1024 || version < DRW::AC1018) {
+ haveNextLinks = buf->getBit(); //aka nolinks //B
+ DRW_DBG(", haveNextLinks (0 yes, 1 prev next): "); DRW_DBG(haveNextLinks); DRW_DBG("\n");
+ } else {
+ haveNextLinks = 1; //aka nolinks //B
+ DRW_DBG(", haveNextLinks (forced): "); DRW_DBG(haveNextLinks); DRW_DBG("\n");
+ }
+//ENC color
+ color = buf->getEnColor(version); //BS or CMC //ok for R14 or negate
+ ltypeScale = buf->getBitDouble(); //BD
+ DRW_DBG(" entity color: "); DRW_DBG(color);
+ DRW_DBG(" ltScale: "); DRW_DBG(ltypeScale); DRW_DBG("\n");
+ if (version > DRW::AC1014) {//2000+
+ UTF8STRING plotStyleName;
+ for (duint8 i = 0; i<2;++i) { //two flags in one
+ plotFlags = buf->get2Bits(); //BB
+ if (plotFlags == 1)
+ plotStyleName = "byblock";
+ else if (plotFlags == 2)
+ plotStyleName = "continuous";
+ else if (plotFlags == 0)
+ plotStyleName = "bylayer";
+ else //handle at end
+ plotStyleName = "";
+ if (i == 0) {
+ ltFlags = plotFlags;
+ lineType = plotStyleName; //RLZ: howto solve? if needed plotStyleName;
+ DRW_DBG("ltFlags: "); DRW_DBG(ltFlags);
+ DRW_DBG(" lineType: "); DRW_DBG(lineType.c_str());
+ } else {
+ DRW_DBG(", plotFlags: "); DRW_DBG(plotFlags);
+ }
+ }
+ }
+ if (version > DRW::AC1018) {//2007+
+ materialFlag = buf->get2Bits(); //BB
+ DRW_DBG("materialFlag: "); DRW_DBG(materialFlag);
+ shadowFlag = buf->getRawChar8(); //RC
+ DRW_DBG("shadowFlag: "); DRW_DBG(shadowFlag); DRW_DBG("\n");
+ }
+ if (version > DRW::AC1021) {//2010+
+ duint8 visualFlags = buf->get2Bits(); //full & face visual style
+ DRW_DBG("shadowFlag 2: "); DRW_DBG(visualFlags); DRW_DBG("\n");
+ duint8 unk = buf->getBit(); //edge visual style
+ DRW_DBG("unknown bit: "); DRW_DBG(unk); DRW_DBG("\n");
+ }
+ dint16 invisibleFlag = buf->getBitShort(); //BS
+ DRW_DBG(" invisibleFlag: "); DRW_DBG(invisibleFlag);
+ if (version > DRW::AC1014) {//2000+
+ lWeight = DRW_LW_Conv::dwgInt2lineWidth( buf->getRawChar8() ); //RC
+ DRW_DBG(" lwFlag (lWeight): "); DRW_DBG(lWeight); DRW_DBG("\n");
+ }
+ //Only in blocks ????????
+// if (version > DRW::AC1018) {//2007+
+// duint8 unk = buf->getBit();
+// DRW_DBG("unknown bit: "); DRW_DBG(unk); DRW_DBG("\n");
+// }
+ return buf->isGood();
+}
+
+bool DRW_Entity::parseDwgEntHandle(DRW::Version version, dwgBuffer *buf){
+ if (version > DRW::AC1018) {//2007+ skip string area
+ buf->setPosition(objSize >> 3);
+ buf->setBitPos(objSize & 7);
+ }
+
+ if(ownerHandle){//entity are in block or in a polyline
+ dwgHandle ownerH = buf->getOffsetHandle(handle);
+ DRW_DBG("owner (parent) Handle: "); DRW_DBGHL(ownerH.code, ownerH.size, ownerH.ref); DRW_DBG("\n");
+ DRW_DBG(" Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n");
+ parentHandle = ownerH.ref;
+ DRW_DBG("Block (parent) Handle: "); DRW_DBGHL(ownerH.code, ownerH.size, parentHandle); DRW_DBG("\n");
+ } else
+ DRW_DBG("NO Block (parent) Handle\n");
+
+ DRW_DBG("\n Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n");
+ for (int i=0; i< numReactors;++i) {
+ dwgHandle reactorsH = buf->getHandle();
+ DRW_DBG(" reactorsH control Handle: "); DRW_DBGHL(reactorsH.code, reactorsH.size, reactorsH.ref); DRW_DBG("\n");
+ }
+ if (xDictFlag !=1){//linetype in 2004 seems not have XDicObjH or NULL handle
+ dwgHandle XDicObjH = buf->getHandle();
+ DRW_DBG(" XDicObj control Handle: "); DRW_DBGHL(XDicObjH.code, XDicObjH.size, XDicObjH.ref); DRW_DBG("\n");
+ }
+ DRW_DBG("Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n");
+
+ if (version < DRW::AC1015) {//R14-
+ //layer handle
+ layerH = buf->getOffsetHandle(handle);
+ DRW_DBG(" layer Handle: "); DRW_DBGHL(layerH.code, layerH.size, layerH.ref); DRW_DBG("\n");
+ DRW_DBG(" Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n");
+ //lineType handle
+ if(ltFlags == 3){
+ lTypeH = buf->getOffsetHandle(handle);
+ DRW_DBG("linetype Handle: "); DRW_DBGHL(lTypeH.code, lTypeH.size, lTypeH.ref); DRW_DBG("\n");
+ DRW_DBG(" Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n");
+ }
+ }
+ if (version < DRW::AC1018) {//2000+
+ if (haveNextLinks == 0) {
+ dwgHandle nextLinkH = buf->getOffsetHandle(handle);
+ DRW_DBG(" prev nextLinkers Handle: "); DRW_DBGHL(nextLinkH.code, nextLinkH.size, nextLinkH.ref); DRW_DBG("\n");
+ DRW_DBG("\n Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n");
+ prevEntLink = nextLinkH.ref;
+ nextLinkH = buf->getOffsetHandle(handle);
+ DRW_DBG(" next nextLinkers Handle: "); DRW_DBGHL(nextLinkH.code, nextLinkH.size, nextLinkH.ref); DRW_DBG("\n");
+ DRW_DBG("\n Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n");
+ nextEntLink = nextLinkH.ref;
+ } else {
+ nextEntLink = handle+1;
+ prevEntLink = handle-1;
+ }
+ }
+ if (version > DRW::AC1015) {//2004+
+ //Parses Bookcolor handle
+ }
+ if (version > DRW::AC1014) {//2000+
+ //layer handle
+ layerH = buf->getOffsetHandle(handle);
+ DRW_DBG(" layer Handle: "); DRW_DBGHL(layerH.code, layerH.size, layerH.ref); DRW_DBG("\n");
+ DRW_DBG(" Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n");
+ //lineType handle
+ if(ltFlags == 3){
+ lTypeH = buf->getOffsetHandle(handle);
+ DRW_DBG("linetype Handle: "); DRW_DBGHL(lTypeH.code, lTypeH.size, lTypeH.ref); DRW_DBG("\n");
+ DRW_DBG(" Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n");
+ }
+ }
+ if (version > DRW::AC1014) {//2000+
+ if (version > DRW::AC1018) {//2007+
+ if (materialFlag == 3) {
+ dwgHandle materialH = buf->getOffsetHandle(handle);
+ DRW_DBG(" material Handle: "); DRW_DBGHL(materialH.code, materialH.size, materialH.ref); DRW_DBG("\n");
+ DRW_DBG("\n Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n");
+ }
+ if (shadowFlag == 3) {
+ dwgHandle shadowH = buf->getOffsetHandle(handle);
+ DRW_DBG(" shadow Handle: "); DRW_DBGHL(shadowH.code, shadowH.size, shadowH.ref); DRW_DBG("\n");
+ DRW_DBG("\n Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n");
+ }
+ }
+ if (plotFlags == 3) {
+ dwgHandle plotStyleH = buf->getOffsetHandle(handle);
+ DRW_DBG(" plot style Handle: "); DRW_DBGHL(plotStyleH.code, plotStyleH.size, plotStyleH.ref); DRW_DBG("\n");
+ DRW_DBG("\n Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n");
+ }
+ }
+ DRW_DBG("\n DRW_Entity::parseDwgEntHandle Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n");
+ return buf->isGood();
+}
+
+void DRW_Point::parseCode(int code, dxfReader *reader){
+ switch (code) {
+ case 10:
+ basePoint.x = reader->getDouble();
+ break;
+ case 20:
+ basePoint.y = reader->getDouble();
+ break;
+ case 30:
+ basePoint.z = reader->getDouble();
+ break;
+ case 39:
+ thickness = reader->getDouble();
+ break;
+ case 210:
+ haveExtrusion = true;
+ extPoint.x = reader->getDouble();
+ break;
+ case 220:
+ extPoint.y = reader->getDouble();
+ break;
+ case 230:
+ extPoint.z = reader->getDouble();
+ break;
+ default:
+ DRW_Entity::parseCode(code, reader);
+ break;
+ }
+}
+
+bool DRW_Point::parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs){
+ bool ret = DRW_Entity::parseDwg(version, buf, NULL, bs);
+ if (!ret)
+ return ret;
+ DRW_DBG("\n***************************** parsing point *********************************************\n");
+
+ basePoint.x = buf->getBitDouble();
+ basePoint.y = buf->getBitDouble();
+ basePoint.z = buf->getBitDouble();
+ DRW_DBG("point: "); DRW_DBGPT(basePoint.x, basePoint.y, basePoint.z);
+ thickness = buf->getThickness(version > DRW::AC1014);//BD
+ DRW_DBG("\nthickness: "); DRW_DBG(thickness);
+ extPoint = buf->getExtrusion(version > DRW::AC1014);
+ DRW_DBG(", Extrusion: "); DRW_DBGPT(extPoint.x, extPoint.y, extPoint.z);
+
+ double x_axis = buf->getBitDouble();//BD
+ DRW_DBG("\n x_axis: ");DRW_DBG(x_axis);DRW_DBG("\n");
+ ret = DRW_Entity::parseDwgEntHandle(version, buf);
+ if (!ret)
+ return ret;
+ // RS crc; //RS */
+
+ return buf->isGood();
+}
+
+void DRW_Line::parseCode(int code, dxfReader *reader){
+ switch (code) {
+ case 11:
+ secPoint.x = reader->getDouble();
+ break;
+ case 21:
+ secPoint.y = reader->getDouble();
+ break;
+ case 31:
+ secPoint.z = reader->getDouble();
+ break;
+ default:
+ DRW_Point::parseCode(code, reader);
+ break;
+ }
+}
+
+bool DRW_Line::parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs){
+ bool ret = DRW_Entity::parseDwg(version, buf, NULL, bs);
+ if (!ret)
+ return ret;
+ DRW_DBG("\n***************************** parsing line *********************************************\n");
+
+ if (version < DRW::AC1015) {//14-
+ basePoint.x = buf->getBitDouble();
+ basePoint.y = buf->getBitDouble();
+ basePoint.z = buf->getBitDouble();
+ secPoint.x = buf->getBitDouble();
+ secPoint.y = buf->getBitDouble();
+ secPoint.z = buf->getBitDouble();
+ }
+ if (version > DRW::AC1014) {//2000+
+ bool zIsZero = buf->getBit(); //B
+ basePoint.x = buf->getRawDouble();//RD
+ secPoint.x = buf->getDefaultDouble(basePoint.x);//DD
+ basePoint.y = buf->getRawDouble();//RD
+ secPoint.y = buf->getDefaultDouble(basePoint.y);//DD
+ if (!zIsZero) {
+ basePoint.z = buf->getRawDouble();//RD
+ secPoint.z = buf->getDefaultDouble(basePoint.z);//DD
+ }
+ }
+ DRW_DBG("start point: "); DRW_DBGPT(basePoint.x, basePoint.y, basePoint.z);
+ DRW_DBG("\nend point: "); DRW_DBGPT(secPoint.x, secPoint.y, secPoint.z);
+ thickness = buf->getThickness(version > DRW::AC1014);//BD
+ DRW_DBG("\nthickness: "); DRW_DBG(thickness);
+ extPoint = buf->getExtrusion(version > DRW::AC1014);
+ DRW_DBG(", Extrusion: "); DRW_DBGPT(extPoint.x, extPoint.y, extPoint.z);DRW_DBG("\n");
+ ret = DRW_Entity::parseDwgEntHandle(version, buf);
+ if (!ret)
+ return ret;
+// RS crc; //RS */
+ return buf->isGood();
+}
+
+bool DRW_Ray::parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs){
+ bool ret = DRW_Entity::parseDwg(version, buf, NULL, bs);
+ if (!ret)
+ return ret;
+ DRW_DBG("\n***************************** parsing ray/xline *********************************************\n");
+ basePoint.x = buf->getBitDouble();
+ basePoint.y = buf->getBitDouble();
+ basePoint.z = buf->getBitDouble();
+ secPoint.x = buf->getBitDouble();
+ secPoint.y = buf->getBitDouble();
+ secPoint.z = buf->getBitDouble();
+ DRW_DBG("start point: "); DRW_DBGPT(basePoint.x, basePoint.y, basePoint.z);
+ DRW_DBG("\nvector: "); DRW_DBGPT(secPoint.x, secPoint.y, secPoint.z);
+ ret = DRW_Entity::parseDwgEntHandle(version, buf);
+ if (!ret)
+ return ret;
+// RS crc; //RS */
+ return buf->isGood();
+}
+
+void DRW_Circle::applyExtrusion(){
+ if (haveExtrusion) {
+ //NOTE: Commenting these out causes the the arcs being tested to be located
+ //on the other side of the y axis (all x dimensions are negated).
+ calculateAxis(extPoint);
+ extrudePoint(extPoint, &basePoint);
+ }
+}
+
+void DRW_Circle::parseCode(int code, dxfReader *reader){
+ switch (code) {
+ case 40:
+ radious = reader->getDouble();
+ break;
+ default:
+ DRW_Point::parseCode(code, reader);
+ break;
+ }
+}
+
+bool DRW_Circle::parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs){
+ bool ret = DRW_Entity::parseDwg(version, buf, NULL, bs);
+ if (!ret)
+ return ret;
+ DRW_DBG("\n***************************** parsing circle *********************************************\n");
+
+ basePoint.x = buf->getBitDouble();
+ basePoint.y = buf->getBitDouble();
+ basePoint.z = buf->getBitDouble();
+ DRW_DBG("center: "); DRW_DBGPT(basePoint.x, basePoint.y, basePoint.z);
+ radious = buf->getBitDouble();
+ DRW_DBG("\nradius: "); DRW_DBG(radious);
+
+ thickness = buf->getThickness(version > DRW::AC1014);
+ DRW_DBG(" thickness: "); DRW_DBG(thickness);
+ extPoint = buf->getExtrusion(version > DRW::AC1014);
+ DRW_DBG("\nextrusion: "); DRW_DBGPT(extPoint.x, extPoint.y, extPoint.z); DRW_DBG("\n");
+
+ ret = DRW_Entity::parseDwgEntHandle(version, buf);
+ if (!ret)
+ return ret;
+// RS crc; //RS */
+ return buf->isGood();
+}
+
+void DRW_Arc::applyExtrusion(){
+ DRW_Circle::applyExtrusion();
+
+ if(haveExtrusion){
+ // If the extrusion vector has a z value less than 0, the angles for the arc
+ // have to be mirrored since DXF files use the right hand rule.
+ // Note that the following code only handles the special case where there is a 2D
+ // drawing with the z axis heading into the paper (or rather screen). An arbitrary
+ // extrusion axis (with x and y values greater than 1/64) may still have issues.
+ if (fabs(extPoint.x) < 0.015625 && fabs(extPoint.y) < 0.015625 && extPoint.z < 0.0) {
+ staangle=M_PI-staangle;
+ endangle=M_PI-endangle;
+
+ double temp = staangle;
+ staangle=endangle;
+ endangle=temp;
+ }
+ }
+}
+
+void DRW_Arc::parseCode(int code, dxfReader *reader){
+ switch (code) {
+ case 50:
+ staangle = reader->getDouble()/ ARAD;
+ break;
+ case 51:
+ endangle = reader->getDouble()/ ARAD;
+ break;
+ default:
+ DRW_Circle::parseCode(code, reader);
+ break;
+ }
+}
+
+bool DRW_Arc::parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs){
+ bool ret = DRW_Entity::parseDwg(version, buf, NULL, bs);
+ if (!ret)
+ return ret;
+ DRW_DBG("\n***************************** parsing circle arc *********************************************\n");
+
+ basePoint.x = buf->getBitDouble();
+ basePoint.y = buf->getBitDouble();
+ basePoint.z = buf->getBitDouble();
+ DRW_DBG("center point: "); DRW_DBGPT(basePoint.x, basePoint.y, basePoint.z);
+
+ radious = buf->getBitDouble();
+ DRW_DBG("\nradius: "); DRW_DBG(radious);
+ thickness = buf->getThickness(version > DRW::AC1014);
+ DRW_DBG(" thickness: "); DRW_DBG(thickness);
+ extPoint = buf->getExtrusion(version > DRW::AC1014);
+ DRW_DBG("\nextrusion: "); DRW_DBGPT(extPoint.x, extPoint.y, extPoint.z);
+ staangle = buf->getBitDouble();
+ DRW_DBG("\nstart angle: "); DRW_DBG(staangle);
+ endangle = buf->getBitDouble();
+ DRW_DBG(" end angle: "); DRW_DBG(endangle); DRW_DBG("\n");
+ ret = DRW_Entity::parseDwgEntHandle(version, buf);
+ if (!ret)
+ return ret;
+ return buf->isGood();
+}
+
+void DRW_Ellipse::parseCode(int code, dxfReader *reader){
+ switch (code) {
+ case 40:
+ ratio = reader->getDouble();
+ break;
+ case 41:
+ staparam = reader->getDouble();
+ break;
+ case 42:
+ endparam = reader->getDouble();
+ break;
+ default:
+ DRW_Line::parseCode(code, reader);
+ break;
+ }
+}
+
+void DRW_Ellipse::applyExtrusion(){
+ if (haveExtrusion) {
+ calculateAxis(extPoint);
+ extrudePoint(extPoint, &secPoint);
+ double intialparam = staparam;
+ if (extPoint.z < 0.){
+ staparam = M_PIx2 - endparam;
+ endparam = M_PIx2 - intialparam;
+ }
+ }
+}
+
+//if ratio > 1 minor axis are greather than major axis, correct it
+void DRW_Ellipse::correctAxis(){
+ bool complete = false;
+ if (staparam == endparam) {
+ staparam = 0.0;
+ endparam = M_PIx2; //2*M_PI;
+ complete = true;
+ }
+ if (ratio > 1){
+ if ( fabs(endparam - staparam - M_PIx2) < 1.0e-10)
+ complete = true;
+ double incX = secPoint.x;
+ secPoint.x = -(secPoint.y * ratio);
+ secPoint.y = incX*ratio;
+ ratio = 1/ratio;
+ if (!complete){
+ if (staparam < M_PI_2)
+ staparam += M_PI *2;
+ if (endparam < M_PI_2)
+ endparam += M_PI *2;
+ endparam -= M_PI_2;
+ staparam -= M_PI_2;
+ }
+ }
+}
+
+bool DRW_Ellipse::parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs){
+ bool ret = DRW_Entity::parseDwg(version, buf, NULL, bs);
+ if (!ret)
+ return ret;
+ DRW_DBG("\n***************************** parsing ellipse *********************************************\n");
+
+ basePoint =buf->get3BitDouble();
+ DRW_DBG("center: "); DRW_DBGPT(basePoint.x, basePoint.y, basePoint.z);
+ secPoint =buf->get3BitDouble();
+ DRW_DBG(", axis: "); DRW_DBGPT(secPoint.x, secPoint.y, secPoint.z); DRW_DBG("\n");
+ extPoint =buf->get3BitDouble();
+ DRW_DBG("Extrusion: "); DRW_DBGPT(extPoint.x, extPoint.y, extPoint.z);
+ ratio = buf->getBitDouble();//BD
+ DRW_DBG("\nratio: "); DRW_DBG(ratio);
+ staparam = buf->getBitDouble();//BD
+ DRW_DBG(" start param: "); DRW_DBG(staparam);
+ endparam = buf->getBitDouble();//BD
+ DRW_DBG(" end param: "); DRW_DBG(endparam); DRW_DBG("\n");
+
+ ret = DRW_Entity::parseDwgEntHandle(version, buf);
+ if (!ret)
+ return ret;
+// RS crc; //RS */
+ return buf->isGood();
+}
+
+//parts are the number of vertex to split polyline, default 128
+void DRW_Ellipse::toPolyline(DRW_Polyline *pol, int parts){
+ double radMajor, radMinor, cosRot, sinRot, incAngle, curAngle;
+ double cosCurr, sinCurr;
+ radMajor = sqrt(secPoint.x*secPoint.x + secPoint.y*secPoint.y);
+ radMinor = radMajor*ratio;
+ //calculate sin & cos of included angle
+ incAngle = atan2(secPoint.y, secPoint.x);
+ cosRot = cos(incAngle);
+ sinRot = sin(incAngle);
+ incAngle = M_PIx2 / parts;
+ curAngle = staparam;
+ int i = static_cast<int>(curAngle / incAngle);
+ do {
+ if (curAngle > endparam) {
+ curAngle = endparam;
+ i = parts+2;
+ }
+ cosCurr = cos(curAngle);
+ sinCurr = sin(curAngle);
+ double x = basePoint.x + (cosCurr*cosRot*radMajor) - (sinCurr*sinRot*radMinor);
+ double y = basePoint.y + (cosCurr*sinRot*radMajor) + (sinCurr*cosRot*radMinor);
+ pol->addVertex( DRW_Vertex(x, y, 0.0, 0.0));
+ curAngle = (++i)*incAngle;
+ } while (i<parts);
+ if ( fabs(endparam - staparam - M_PIx2) < 1.0e-10){
+ pol->flags = 1;
+ }
+ pol->layer = this->layer;
+ pol->lineType = this->lineType;
+ pol->color = this->color;
+ pol->lWeight = this->lWeight;
+ pol->extPoint = this->extPoint;
+}
+
+void DRW_Trace::applyExtrusion(){
+ if (haveExtrusion) {
+ calculateAxis(extPoint);
+ extrudePoint(extPoint, &basePoint);
+ extrudePoint(extPoint, &secPoint);
+ extrudePoint(extPoint, &thirdPoint);
+ extrudePoint(extPoint, &fourPoint);
+ }
+}
+
+void DRW_Trace::parseCode(int code, dxfReader *reader){
+ switch (code) {
+ case 12:
+ thirdPoint.x = reader->getDouble();
+ break;
+ case 22:
+ thirdPoint.y = reader->getDouble();
+ break;
+ case 32:
+ thirdPoint.z = reader->getDouble();
+ break;
+ case 13:
+ fourPoint.x = reader->getDouble();
+ break;
+ case 23:
+ fourPoint.y = reader->getDouble();
+ break;
+ case 33:
+ fourPoint.z = reader->getDouble();
+ break;
+ default:
+ DRW_Line::parseCode(code, reader);
+ break;
+ }
+}
+
+bool DRW_Trace::parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs){
+ bool ret = DRW_Entity::parseDwg(version, buf, NULL, bs);
+ if (!ret)
+ return ret;
+ DRW_DBG("\n***************************** parsing Trace *********************************************\n");
+
+ thickness = buf->getThickness(version>DRW::AC1014);
+ basePoint.z = buf->getBitDouble();
+ basePoint.x = buf->getRawDouble();
+ basePoint.y = buf->getRawDouble();
+ secPoint.x = buf->getRawDouble();
+ secPoint.y = buf->getRawDouble();
+ secPoint.z = basePoint.z;
+ thirdPoint.x = buf->getRawDouble();
+ thirdPoint.y = buf->getRawDouble();
+ thirdPoint.z = basePoint.z;
+ fourPoint.x = buf->getRawDouble();
+ fourPoint.y = buf->getRawDouble();
+ fourPoint.z = basePoint.z;
+ extPoint = buf->getExtrusion(version>DRW::AC1014);
+
+ DRW_DBG(" - base "); DRW_DBGPT(basePoint.x, basePoint.y, basePoint.z);
+ DRW_DBG("\n - sec "); DRW_DBGPT(secPoint.x, secPoint.y, secPoint.z);
+ DRW_DBG("\n - third "); DRW_DBGPT(thirdPoint.x, thirdPoint.y, thirdPoint.z);
+ DRW_DBG("\n - fourth "); DRW_DBGPT(fourPoint.x, fourPoint.y, fourPoint.z);
+ DRW_DBG("\n - extrusion: "); DRW_DBGPT(extPoint.x, extPoint.y, extPoint.z);
+ DRW_DBG("\n - thickness: "); DRW_DBG(thickness); DRW_DBG("\n");
+
+ /* Common Entity Handle Data */
+ ret = DRW_Entity::parseDwgEntHandle(version, buf);
+ if (!ret)
+ return ret;
+
+ /* CRC X --- */
+ return buf->isGood();
+}
+
+
+void DRW_Solid::parseCode(int code, dxfReader *reader){
+ DRW_Trace::parseCode(code, reader);
+}
+
+bool DRW_Solid::parseDwg(DRW::Version v, dwgBuffer *buf, duint32 bs){
+ DRW_DBG("\n***************************** parsing Solid *********************************************\n");
+ return DRW_Trace::parseDwg(v, buf, bs);
+}
+
+void DRW_3Dface::parseCode(int code, dxfReader *reader){
+ switch (code) {
+ case 70:
+ invisibleflag = reader->getInt32();
+ break;
+ default:
+ DRW_Trace::parseCode(code, reader);
+ break;
+ }
+}
+
+bool DRW_3Dface::parseDwg(DRW::Version v, dwgBuffer *buf, duint32 bs){
+ bool ret = DRW_Entity::parseDwg(v, buf, NULL, bs);
+ if (!ret)
+ return ret;
+ DRW_DBG("\n***************************** parsing 3Dface *********************************************\n");
+
+ if ( v < DRW::AC1015 ) {// R13 & R14
+ basePoint.x = buf->getBitDouble();
+ basePoint.y = buf->getBitDouble();
+ basePoint.z = buf->getBitDouble();
+ secPoint.x = buf->getBitDouble();
+ secPoint.y = buf->getBitDouble();
+ secPoint.z = buf->getBitDouble();
+ thirdPoint.x = buf->getBitDouble();
+ thirdPoint.y = buf->getBitDouble();
+ thirdPoint.z = buf->getBitDouble();
+ fourPoint.x = buf->getBitDouble();
+ fourPoint.y = buf->getBitDouble();
+ fourPoint.z = buf->getBitDouble();
+ invisibleflag = buf->getBitShort();
+ } else { // 2000+
+ bool has_no_flag = buf->getBit();
+ bool z_is_zero = buf->getBit();
+ basePoint.x = buf->getRawDouble();
+ basePoint.y = buf->getRawDouble();
+ basePoint.z = z_is_zero ? 0.0 : buf->getRawDouble();
+ secPoint.x = buf->getDefaultDouble(basePoint.x);
+ secPoint.y = buf->getDefaultDouble(basePoint.y);
+ secPoint.z = buf->getDefaultDouble(basePoint.z);
+ thirdPoint.x = buf->getDefaultDouble(secPoint.x);
+ thirdPoint.y = buf->getDefaultDouble(secPoint.y);
+ thirdPoint.z = buf->getDefaultDouble(secPoint.z);
+ fourPoint.x = buf->getDefaultDouble(thirdPoint.x);
+ fourPoint.y = buf->getDefaultDouble(thirdPoint.y);
+ fourPoint.z = buf->getDefaultDouble(thirdPoint.z);
+ invisibleflag = has_no_flag ? (int)NoEdge : buf->getBitShort();
+ }
+ drw_assert(invisibleflag>=NoEdge);
+ drw_assert(invisibleflag<=AllEdges);
+
+ DRW_DBG(" - base "); DRW_DBGPT(basePoint.x, basePoint.y, basePoint.z); DRW_DBG("\n");
+ DRW_DBG(" - sec "); DRW_DBGPT(secPoint.x, secPoint.y, secPoint.z); DRW_DBG("\n");
+ DRW_DBG(" - third "); DRW_DBGPT(thirdPoint.x, thirdPoint.y, thirdPoint.z); DRW_DBG("\n");
+ DRW_DBG(" - fourth "); DRW_DBGPT(fourPoint.x, fourPoint.y, fourPoint.z); DRW_DBG("\n");
+ DRW_DBG(" - Invisibility mask: "); DRW_DBG(invisibleflag); DRW_DBG("\n");
+
+ /* Common Entity Handle Data */
+ ret = DRW_Entity::parseDwgEntHandle(v, buf);
+ if (!ret)
+ return ret;
+ return buf->isGood();
+}
+
+void DRW_Block::parseCode(int code, dxfReader *reader){
+ switch (code) {
+ case 2:
+ name = reader->getUtf8String();
+ break;
+ case 70:
+ flags = reader->getInt32();
+ break;
+ default:
+ DRW_Point::parseCode(code, reader);
+ break;
+ }
+}
+
+bool DRW_Block::parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs){
+ dwgBuffer sBuff = *buf;
+ dwgBuffer *sBuf = buf;
+ if (version > DRW::AC1018) {//2007+
+ sBuf = &sBuff; //separate buffer for strings
+ }
+ bool ret = DRW_Entity::parseDwg(version, buf, sBuf, bs);
+ if (!ret)
+ return ret;
+ if (!isEnd){
+ DRW_DBG("\n***************************** parsing block *********************************************\n");
+ name = sBuf->getVariableText(version, false);
+ DRW_DBG("Block name: "); DRW_DBG(name.c_str()); DRW_DBG("\n");
+ } else {
+ DRW_DBG("\n***************************** parsing end block *********************************************\n");
+ }
+ if (version > DRW::AC1018) {//2007+
+ duint8 unk = buf->getBit();
+ DRW_DBG("unknown bit: "); DRW_DBG(unk); DRW_DBG("\n");
+ }
+// X handleAssoc; //X
+ ret = DRW_Entity::parseDwgEntHandle(version, buf);
+ if (!ret)
+ return ret;
+// RS crc; //RS */
+ return buf->isGood();
+}
+
+void DRW_Insert::parseCode(int code, dxfReader *reader){
+ switch (code) {
+ case 2:
+ name = reader->getUtf8String();
+ break;
+ case 41:
+ xscale = reader->getDouble();
+ break;
+ case 42:
+ yscale = reader->getDouble();
+ break;
+ case 43:
+ zscale = reader->getDouble();
+ break;
+ case 50:
+ angle = reader->getDouble();
+ angle = angle/ARAD; //convert to radian
+ break;
+ case 70:
+ colcount = reader->getInt32();
+ break;
+ case 71:
+ rowcount = reader->getInt32();
+ break;
+ case 44:
+ colspace = reader->getDouble();
+ break;
+ case 45:
+ rowspace = reader->getDouble();
+ break;
+ default:
+ DRW_Point::parseCode(code, reader);
+ break;
+ }
+}
+
+bool DRW_Insert::parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs){
+ dint32 objCount = 0;
+ bool ret = DRW_Entity::parseDwg(version, buf, NULL, bs);
+ if (!ret)
+ return ret;
+ DRW_DBG("\n************************** parsing insert/minsert *****************************************\n");
+ basePoint.x = buf->getBitDouble();
+ basePoint.y = buf->getBitDouble();
+ basePoint.z = buf->getBitDouble();
+ DRW_DBG("insertion point: "); DRW_DBGPT(basePoint.x, basePoint.y, basePoint.z); DRW_DBG("\n");
+ if (version < DRW::AC1015) {//14-
+ xscale = buf->getBitDouble();
+ yscale = buf->getBitDouble();
+ zscale = buf->getBitDouble();
+ } else {
+ duint8 dataFlags = buf->get2Bits();
+ if (dataFlags == 3){
+ //none default value 1,1,1
+ } else if (dataFlags == 1){ //x default value 1, y & z can be x value
+ yscale = buf->getDefaultDouble(xscale);
+ zscale = buf->getDefaultDouble(xscale);
+ } else if (dataFlags == 2){
+ xscale = buf->getRawDouble();
+ yscale = zscale = xscale;
+ } else { //dataFlags == 0
+ xscale = buf->getRawDouble();
+ yscale = buf->getDefaultDouble(xscale);
+ zscale = buf->getDefaultDouble(xscale);
+ }
+ }
+ angle = buf->getBitDouble();
+ DRW_DBG("scale : "); DRW_DBGPT(xscale, yscale, zscale); DRW_DBG(", angle: "); DRW_DBG(angle);
+ extPoint = buf->getExtrusion(false); //3BD R14 style
+ DRW_DBG("\nextrusion: "); DRW_DBGPT(extPoint.x, extPoint.y, extPoint.z);
+
+ bool hasAttrib = buf->getBit();
+ DRW_DBG(" has Attrib: "); DRW_DBG(hasAttrib);
+
+ if (hasAttrib && version > DRW::AC1015) {//2004+
+ objCount = buf->getBitLong();
+ DRW_UNUSED(objCount);
+ DRW_DBG(" objCount: "); DRW_DBG(objCount); DRW_DBG("\n");
+ }
+ if (oType == 8) {//entity are minsert
+ colcount = buf->getBitShort();
+ rowcount = buf->getBitShort();
+ colspace = buf->getBitDouble();
+ rowspace = buf->getBitDouble();
+ }
+ DRW_DBG(" Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n");
+ ret = DRW_Entity::parseDwgEntHandle(version, buf);
+ blockRecH = buf->getHandle(); /* H 2 BLOCK HEADER (hard pointer) */
+ DRW_DBG("BLOCK HEADER Handle: "); DRW_DBGHL(blockRecH.code, blockRecH.size, blockRecH.ref); DRW_DBG("\n");
+ DRW_DBG(" Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n");
+
+ /*attribs follows*/
+ if (hasAttrib) {
+ if (version < DRW::AC1018) {//2000-
+ dwgHandle attH = buf->getHandle(); /* H 2 BLOCK HEADER (hard pointer) */
+ DRW_DBG("first attrib Handle: "); DRW_DBGHL(attH.code, attH.size, attH.ref); DRW_DBG("\n");
+ attH = buf->getHandle(); /* H 2 BLOCK HEADER (hard pointer) */
+ DRW_DBG("second attrib Handle: "); DRW_DBGHL(attH.code, attH.size, attH.ref); DRW_DBG("\n");
+ } else {
+ for (duint8 i=0; i< objCount; ++i){
+ dwgHandle attH = buf->getHandle(); /* H 2 BLOCK HEADER (hard pointer) */
+ DRW_DBG("attrib Handle #"); DRW_DBG(i); DRW_DBG(": "); DRW_DBGHL(attH.code, attH.size, attH.ref); DRW_DBG("\n");
+ }
+ }
+ seqendH = buf->getHandle(); /* H 2 BLOCK HEADER (hard pointer) */
+ DRW_DBG("seqendH Handle: "); DRW_DBGHL(seqendH.code, seqendH.size, seqendH.ref); DRW_DBG("\n");
+ }
+ DRW_DBG(" Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n");
+
+ if (!ret)
+ return ret;
+// RS crc; //RS */
+ return buf->isGood();
+}
+
+void DRW_LWPolyline::applyExtrusion(){
+ if (haveExtrusion) {
+ calculateAxis(extPoint);
+ for (unsigned int i=0; i<vertlist.size(); i++) {
+ DRW_Vertex2D *vert = vertlist.at(i);
+ DRW_Coord v(vert->x, vert->y, elevation);
+ extrudePoint(extPoint, &v);
+ vert->x = v.x;
+ vert->y = v.y;
+ }
+ }
+}
+
+void DRW_LWPolyline::parseCode(int code, dxfReader *reader){
+ switch (code) {
+ case 10: {
+ vertex = new DRW_Vertex2D();
+ vertlist.push_back(vertex);
+ vertex->x = reader->getDouble();
+ break; }
+ case 20:
+ if(vertex != NULL)
+ vertex->y = reader->getDouble();
+ break;
+ case 40:
+ if(vertex != NULL)
+ vertex->stawidth = reader->getDouble();
+ break;
+ case 41:
+ if(vertex != NULL)
+ vertex->endwidth = reader->getDouble();
+ break;
+ case 42:
+ if(vertex != NULL)
+ vertex->bulge = reader->getDouble();
+ break;
+ case 38:
+ elevation = reader->getDouble();
+ break;
+ case 39:
+ thickness = reader->getDouble();
+ break;
+ case 43:
+ width = reader->getDouble();
+ break;
+ case 70:
+ flags = reader->getInt32();
+ break;
+ case 90:
+ vertexnum = reader->getInt32();
+ vertlist.reserve(vertexnum);
+ break;
+ case 210:
+ haveExtrusion = true;
+ extPoint.x = reader->getDouble();
+ break;
+ case 220:
+ extPoint.y = reader->getDouble();
+ break;
+ case 230:
+ extPoint.z = reader->getDouble();
+ break;
+ default:
+ DRW_Entity::parseCode(code, reader);
+ break;
+ }
+}
+
+bool DRW_LWPolyline::parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs){
+ bool ret = DRW_Entity::parseDwg(version, buf, NULL, bs);
+ if (!ret)
+ return ret;
+ DRW_DBG("\n***************************** parsing LWPolyline *******************************************\n");
+
+ flags = buf->getBitShort();
+ DRW_DBG("flags value: "); DRW_DBG(flags);
+ if (flags & 4)
+ width = buf->getBitDouble();
+ if (flags & 8)
+ elevation = buf->getBitDouble();
+ if (flags & 2)
+ thickness = buf->getBitDouble();
+ if (flags & 1)
+ extPoint = buf->getExtrusion(false);
+ vertexnum = buf->getBitLong();
+ vertlist.reserve(vertexnum);
+ unsigned int bulgesnum = 0;
+ if (flags & 16)
+ bulgesnum = buf->getBitLong();
+ int vertexIdCount = 0;
+ if (version > DRW::AC1021) {//2010+
+ if (flags & 1024)
+ vertexIdCount = buf->getBitLong();
+ }
+
+ unsigned int widthsnum = 0;
+ if (flags & 32)
+ widthsnum = buf->getBitLong();
+ DRW_DBG("\nvertex num: "); DRW_DBG(vertexnum); DRW_DBG(" bulges num: "); DRW_DBG(bulgesnum);
+ DRW_DBG(" vertexIdCount: "); DRW_DBG(vertexIdCount); DRW_DBG(" widths num: "); DRW_DBG(widthsnum);
+ //clear all bit except 128 = plinegen and set 1 to open/close //RLZ:verify plinegen & open
+ //dxf: plinegen 128 & open 1
+ flags = (flags & 512)? (flags | 1):(flags | 0);
+ flags &= 129;
+ DRW_DBG("end flags value: "); DRW_DBG(flags);
+
+ if (vertexnum > 0) { //verify if is lwpol without vertex (empty)
+ // add vertexs
+ vertex = new DRW_Vertex2D();
+ vertex->x = buf->getRawDouble();
+ vertex->y = buf->getRawDouble();
+ vertlist.push_back(vertex);
+ DRW_Vertex2D* pv = vertex;
+ for (int i = 1; i< vertexnum; i++){
+ vertex = new DRW_Vertex2D();
+ if (version < DRW::AC1015) {//14-
+ vertex->x = buf->getRawDouble();
+ vertex->y = buf->getRawDouble();
+ } else {
+// DRW_Vertex2D *pv = vertlist.back();
+ vertex->x = buf->getDefaultDouble(pv->x);
+ vertex->y = buf->getDefaultDouble(pv->y);
+ }
+ pv = vertex;
+ vertlist.push_back(vertex);
+ }
+ //add bulges
+ for (unsigned int i = 0; i < bulgesnum; i++){
+ double bulge = buf->getBitDouble();
+ if (vertlist.size()> i)
+ vertlist.at(i)->bulge = bulge;
+ }
+ //add vertexId
+ if (version > DRW::AC1021) {//2010+
+ for (int i = 0; i < vertexIdCount; i++){
+ dint32 vertexId = buf->getBitLong();
+ //TODO implement vertexId, do not exist in dxf
+ DRW_UNUSED(vertexId);
+// if (vertlist.size()< i)
+// vertlist.at(i)->vertexId = vertexId;
+ }
+ }
+ //add widths
+ for (unsigned int i = 0; i < widthsnum; i++){
+ double staW = buf->getBitDouble();
+ double endW = buf->getBitDouble();
+ if (vertlist.size()< i) {
+ vertlist.at(i)->stawidth = staW;
+ vertlist.at(i)->endwidth = endW;
+ }
+ }
+ }
+ if (DRW_DBGGL == DRW_dbg::DEBUG){
+ DRW_DBG("\nVertex list: ");
+ for (std::vector<DRW_Vertex2D *>::iterator it = vertlist.begin() ; it != vertlist.end(); ++it){
+ DRW_Vertex2D* pv = *it;
+ DRW_DBG("\n x: "); DRW_DBG(pv->x); DRW_DBG(" y: "); DRW_DBG(pv->y); DRW_DBG(" bulge: "); DRW_DBG(pv->bulge);
+ DRW_DBG(" stawidth: "); DRW_DBG(pv->stawidth); DRW_DBG(" endwidth: "); DRW_DBG(pv->endwidth);
+ }
+ }
+
+ DRW_DBG("\n");
+ /* Common Entity Handle Data */
+ ret = DRW_Entity::parseDwgEntHandle(version, buf);
+ if (!ret)
+ return ret;
+ /* CRC X --- */
+ return buf->isGood();
+}
+
+
+void DRW_Text::parseCode(int code, dxfReader *reader){
+ switch (code) {
+ case 40:
+ height = reader->getDouble();
+ break;
+ case 41:
+ widthscale = reader->getDouble();
+ break;
+ case 50:
+ angle = reader->getDouble();
+ break;
+ case 51:
+ oblique = reader->getDouble();
+ break;
+ case 71:
+ textgen = reader->getInt32();
+ break;
+ case 72:
+ alignH = (HAlign)reader->getInt32();
+ break;
+ case 73:
+ alignV = (VAlign)reader->getInt32();
+ break;
+ case 1:
+ text = reader->getUtf8String();
+ break;
+ case 7:
+ style = reader->getUtf8String();
+ break;
+ default:
+ DRW_Line::parseCode(code, reader);
+ break;
+ }
+}
+
+bool DRW_Text::parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs){
+ dwgBuffer sBuff = *buf;
+ dwgBuffer *sBuf = buf;
+ if (version > DRW::AC1018) {//2007+
+ sBuf = &sBuff; //separate buffer for strings
+ }
+ bool ret = DRW_Entity::parseDwg(version, buf, sBuf, bs);
+ if (!ret)
+ return ret;
+ DRW_DBG("\n***************************** parsing text *********************************************\n");
+
+ // DataFlags RC Used to determine presence of subsquent data, set to 0xFF for R14-
+ duint8 data_flags = 0x00;
+ if (version > DRW::AC1014) {//2000+
+ data_flags = buf->getRawChar8(); /* DataFlags RC Used to determine presence of subsquent data */
+ DRW_DBG("data_flags: "); DRW_DBG(data_flags); DRW_DBG("\n");
+ if ( !(data_flags & 0x01) ) { /* Elevation RD --- present if !(DataFlags & 0x01) */
+ basePoint.z = buf->getRawDouble();
+ }
+ } else {//14-
+ basePoint.z = buf->getBitDouble(); /* Elevation BD --- */
+ }
+ basePoint.x = buf->getRawDouble(); /* Insertion pt 2RD 10 */
+ basePoint.y = buf->getRawDouble();
+ DRW_DBG("Insert point: "); DRW_DBGPT(basePoint.x, basePoint.y, basePoint.z); DRW_DBG("\n");
+ if (version > DRW::AC1014) {//2000+
+ if ( !(data_flags & 0x02) ) { /* Alignment pt 2DD 11 present if !(DataFlags & 0x02), use 10 & 20 values for 2 default values.*/
+ secPoint.x = buf->getDefaultDouble(basePoint.x);
+ secPoint.y = buf->getDefaultDouble(basePoint.y);
+ } else {
+ secPoint = basePoint;
+ }
+ } else {//14-
+ secPoint.x = buf->getRawDouble(); /* Alignment pt 2RD 11 */
+ secPoint.y = buf->getRawDouble();
+ }
+ secPoint.z = basePoint.z;
+ DRW_DBG("Alignment: "); DRW_DBGPT(secPoint.x, secPoint.y, basePoint.z); DRW_DBG("\n");
+ extPoint = buf->getExtrusion(version > DRW::AC1014);
+ DRW_DBG("Extrusion: "); DRW_DBGPT(extPoint.x, extPoint.y, extPoint.z); DRW_DBG("\n");
+ thickness = buf->getThickness(version > DRW::AC1014); /* Thickness BD 39 */
+
+ if (version > DRW::AC1014) {//2000+
+ if ( !(data_flags & 0x04) ) { /* Oblique ang RD 51 present if !(DataFlags & 0x04) */
+ oblique = buf->getRawDouble();
+ }
+ if ( !(data_flags & 0x08) ) { /* Rotation ang RD 50 present if !(DataFlags & 0x08) */
+ angle = buf->getRawDouble();
+ }
+ height = buf->getRawDouble(); /* Height RD 40 */
+ if ( !(data_flags & 0x10) ) { /* Width factor RD 41 present if !(DataFlags & 0x10) */
+ widthscale = buf->getRawDouble();
+ }
+ } else {//14-
+ oblique = buf->getBitDouble(); /* Oblique ang BD 51 */
+ angle = buf->getBitDouble(); /* Rotation ang BD 50 */
+ height = buf->getBitDouble(); /* Height BD 40 */
+ widthscale = buf->getBitDouble(); /* Width factor BD 41 */
+ }
+ DRW_DBG("thickness: "); DRW_DBG(thickness); DRW_DBG(", Oblique ang: "); DRW_DBG(oblique); DRW_DBG(", Width: ");
+ DRW_DBG(widthscale); DRW_DBG(", Rotation: "); DRW_DBG(angle); DRW_DBG(", height: "); DRW_DBG(height); DRW_DBG("\n");
+ text = sBuf->getVariableText(version, false); /* Text value TV 1 */
+ DRW_DBG("text string: "); DRW_DBG(text.c_str());DRW_DBG("\n");
+ //textgen, alignH, alignV always present in R14-, data_flags set in initialisation
+ if ( !(data_flags & 0x20) ) { /* Generation BS 71 present if !(DataFlags & 0x20) */
+ textgen = buf->getBitShort();
+ DRW_DBG("textgen: "); DRW_DBG(textgen);
+ }
+ if ( !(data_flags & 0x40) ) { /* Horiz align. BS 72 present if !(DataFlags & 0x40) */
+ alignH = (HAlign)buf->getBitShort();
+ DRW_DBG(", alignH: "); DRW_DBG(alignH);
+ }
+ if ( !(data_flags & 0x80) ) { /* Vert align. BS 73 present if !(DataFlags & 0x80) */
+ alignV = (VAlign)buf->getBitShort();
+ DRW_DBG(", alignV: "); DRW_DBG(alignV);
+ }
+ DRW_DBG("\n");
+
+ /* Common Entity Handle Data */
+ ret = DRW_Entity::parseDwgEntHandle(version, buf);
+ if (!ret)
+ return ret;
+
+ styleH = buf->getHandle(); /* H 7 STYLE (hard pointer) */
+ DRW_DBG("text style Handle: "); DRW_DBGHL(styleH.code, styleH.size, styleH.ref); DRW_DBG("\n");
+
+ /* CRC X --- */
+ return buf->isGood();
+}
+
+void DRW_MText::parseCode(int code, dxfReader *reader){
+ switch (code) {
+ case 1:
+ text += reader->getString();
+ text = reader->toUtf8String(text);
+ break;
+ case 11:
+ haveXAxis = true;
+ DRW_Text::parseCode(code, reader);
+ break;
+ case 3:
+ text += reader->getString();
+ break;
+ case 44:
+ interlin = reader->getDouble();
+ break;
+ case 71: {
+ // Attachment point
+ Attach a = (Attach)reader->getInt32();
+
+ switch(a) {
+ case TopLeft:
+ alignV = VTop;
+ alignH = HLeft;
+ break;
+ case TopCenter:
+ alignV = VTop;
+ alignH = HCenter;
+ break;
+ case TopRight:
+ alignV = VTop;
+ alignH = HRight;
+ break;
+ case MiddleLeft:
+ alignV = VMiddle;
+ alignH = HLeft;
+ break;
+ case MiddleCenter:
+ alignV = VMiddle;
+ alignH = HCenter;
+ break;
+ case MiddleRight:
+ alignV = VMiddle;
+ alignH = HRight;
+ break;
+ case BottomLeft:
+ alignV = VBottom;
+ alignH = HLeft;
+ break;
+ case BottomCenter:
+ alignV = VBottom;
+ alignH = HCenter;
+ break;
+ case BottomRight:
+ alignV = VBottom;
+ alignH = HRight;
+ break;
+ }
+ } break;
+ case 72:
+ // To prevent redirection to DRW_Text::parseCode.
+ // This code meaning is different for MTEXT.
+ // Actually: Drawing direction
+ break;
+ case 73:
+ // To prevent redirection to DRW_Text::parseCode.
+ // This code meaning is different for MTEXT.
+ // Actually: Mtext line spacing style
+ break;
+ default:
+ DRW_Text::parseCode(code, reader);
+ break;
+ }
+}
+
+bool DRW_MText::parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs){
+ dwgBuffer sBuff = *buf;
+ dwgBuffer *sBuf = buf;
+ if (version > DRW::AC1018) {//2007+
+ sBuf = &sBuff; //separate buffer for strings
+ }
+ bool ret = DRW_Entity::parseDwg(version, buf, sBuf, bs);
+ if (!ret)
+ return ret;
+ DRW_DBG("\n***************************** parsing mtext *********************************************\n");
+
+ basePoint = buf->get3BitDouble(); /* Insertion pt 3BD 10 - First picked point. */
+ DRW_DBG("Insertion: "); DRW_DBGPT(basePoint.x, basePoint.y, basePoint.z); DRW_DBG("\n");
+ extPoint = buf->get3BitDouble(); /* Extrusion 3BD 210 Undocumented; */
+ secPoint = buf->get3BitDouble(); /* X-axis dir 3BD 11 */
+ updateAngle();
+ widthscale = buf->getBitDouble(); /* Rect width BD 41 */
+ if (version > DRW::AC1018) {//2007+
+ /* Rect height BD 46 Reference rectangle height. */
+ /** @todo */buf->getBitDouble();
+ }
+ height = buf->getBitDouble();/* Text height BD 40 Undocumented */
+ textgen = buf->getBitShort(); /* Attachment BS 71 Similar to justification; */
+ /* Drawing dir BS 72 Left to right, etc.; see DXF doc */
+ dint16 draw_dir = buf->getBitShort();
+ DRW_UNUSED(draw_dir);
+ /* Extents ht BD Undocumented and not present in DXF or entget */
+ double ext_ht = buf->getBitDouble();
+ DRW_UNUSED(ext_ht);
+ /* Extents wid BD Undocumented and not present in DXF or entget The extents
+ rectangle, when rotated the same as the text, fits the actual text image on
+ the screen (altough we've seen it include an extra row of text in height). */
+ double ext_wid = buf->getBitDouble();
+ DRW_UNUSED(ext_wid);
+ /* Text TV 1 All text in one long string (without '\n's 3 for line wrapping).
+ ACAD seems to add braces ({ }) and backslash-P's to indicate paragraphs
+ based on the "\r\n"'s found in the imported file. But, all the text is in
+ this one long string -- not broken into 1- and 3-groups as in DXF and
+ entget. ACAD's entget breaks this string into 250-char pieces (not 255 as
+ doc'd) – even if it's mid-word. The 1-group always gets the tag end;
+ therefore, the 3's are always 250 chars long. */
+ text = sBuf->getVariableText(version, false); /* Text value TV 1 */
+ if (version > DRW::AC1014) {//2000+
+ buf->getBitShort();/* Linespacing Style BS 73 */
+ buf->getBitDouble();/* Linespacing Factor BD 44 */
+ buf->getBit();/* Unknown bit B */
+ }
+ if (version > DRW::AC1015) {//2004+
+ /* Background flags BL 0 = no background, 1 = background fill, 2 =background
+ fill with drawing fill color. */
+ dint32 bk_flags = buf->getBitLong(); /** @todo add to DRW_MText */
+ if ( bk_flags == 1 ) {
+ /* Background scale factor BL Present if background flags = 1, default = 1.5*/
+ buf->getBitLong();
+ /* Background color CMC Present if background flags = 1 */
+ buf->getCmColor(version); //RLZ: warning CMC or ENC
+ /** @todo buf->getCMC */
+ /* Background transparency BL Present if background flags = 1 */
+ buf->getBitLong();
+ }
+ }
+
+ /* Common Entity Handle Data */
+ ret = DRW_Entity::parseDwgEntHandle(version, buf);
+ if (!ret)
+ return ret;
+
+ styleH = buf->getHandle(); /* H 7 STYLE (hard pointer) */
+ DRW_DBG("text style Handle: "); DRW_DBG(styleH.code); DRW_DBG(".");
+ DRW_DBG(styleH.size); DRW_DBG("."); DRW_DBG(styleH.ref); DRW_DBG("\n");
+
+ /* CRC X --- */
+ return buf->isGood();
+}
+
+void DRW_MText::updateAngle(){
+ if (haveXAxis) {
+ angle = atan2(secPoint.y, secPoint.x)*180/M_PI;
+ }
+}
+
+void DRW_Polyline::parseCode(int code, dxfReader *reader){
+ switch (code) {
+ case 70:
+ flags = reader->getInt32();
+ break;
+ case 40:
+ defstawidth = reader->getDouble();
+ break;
+ case 41:
+ defendwidth = reader->getDouble();
+ break;
+ case 71:
+ vertexcount = reader->getInt32();
+ break;
+ case 72:
+ facecount = reader->getInt32();
+ break;
+ case 73:
+ smoothM = reader->getInt32();
+ break;
+ case 74:
+ smoothN = reader->getInt32();
+ break;
+ case 75:
+ curvetype = reader->getInt32();
+ break;
+ default:
+ DRW_Point::parseCode(code, reader);
+ break;
+ }
+}
+
+//0x0F polyline 2D bit 4(8) & 5(16) NOT set
+//0x10 polyline 3D bit 4(8) set
+//0x1D PFACE bit 5(16) set
+bool DRW_Polyline::parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs){
+ bool ret = DRW_Entity::parseDwg(version, buf, NULL, bs);
+ if (!ret)
+ return ret;
+ DRW_DBG("\n***************************** parsing polyline *********************************************\n");
+
+ dint32 ooCount = 0;
+ if (oType == 0x0F) { //pline 2D
+ flags = buf->getBitShort();
+ DRW_DBG("flags value: "); DRW_DBG(flags);
+ curvetype = buf->getBitShort();
+ defstawidth = buf->getBitDouble();
+ defendwidth = buf->getBitDouble();
+ thickness = buf->getThickness(version > DRW::AC1014);
+ basePoint = DRW_Coord(0,0,buf->getBitDouble());
+ extPoint = buf->getExtrusion(version > DRW::AC1014);
+ } else if (oType == 0x10) { //pline 3D
+ duint8 tmpFlag = buf->getRawChar8();
+ DRW_DBG("flags 1 value: "); DRW_DBG(tmpFlag);
+ if (tmpFlag & 1)
+ curvetype = 5;
+ else if (tmpFlag & 2)
+ curvetype = 6;
+ if (tmpFlag & 3) {
+ curvetype = 8;
+ flags |= 4;
+ }
+ tmpFlag = buf->getRawChar8();
+ if (tmpFlag & 1)
+ flags |= 1;
+ flags |= 8; //indicate 3DPOL
+ DRW_DBG("flags 2 value: "); DRW_DBG(tmpFlag);
+ } else if (oType == 0x1D) { //PFACE
+ flags = 64;
+ vertexcount = buf->getBitShort();
+ DRW_DBG("vertex count: "); DRW_DBG(vertexcount);
+ facecount = buf->getBitShort();
+ DRW_DBG("face count: "); DRW_DBG(facecount);
+ DRW_DBG("flags value: "); DRW_DBG(flags);
+ }
+ if (version > DRW::AC1015){ //2004+
+ ooCount = buf->getBitLong();
+ }
+
+ ret = DRW_Entity::parseDwgEntHandle(version, buf);
+ if (!ret)
+ return ret;
+
+ if (version < DRW::AC1018){ //2000-
+ dwgHandle objectH = buf->getOffsetHandle(handle);
+ firstEH = objectH.ref;
+ DRW_DBG(" first Vertex Handle: "); DRW_DBGHL(objectH.code, objectH.size, objectH.ref); DRW_DBG("\n");
+ objectH = buf->getOffsetHandle(handle);
+ lastEH = objectH.ref;
+ DRW_DBG(" last Vertex Handle: "); DRW_DBGHL(objectH.code, objectH.size, objectH.ref); DRW_DBG("\n");
+ DRW_DBG("Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n");
+ } else {
+ for (dint32 i = 0; i < ooCount; ++i){
+ dwgHandle objectH = buf->getOffsetHandle(handle);
+ hadlesList.push_back (objectH.ref);
+ DRW_DBG(" Vertex Handle: "); DRW_DBGHL(objectH.code, objectH.size, objectH.ref); DRW_DBG("\n");
+ DRW_DBG("Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n");
+ }
+ }
+ seqEndH = buf->getOffsetHandle(handle);
+ DRW_DBG(" SEQEND Handle: "); DRW_DBGHL(seqEndH.code, seqEndH.size, seqEndH.ref); DRW_DBG("\n");
+ DRW_DBG("Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n");
+
+// RS crc; //RS */
+ return buf->isGood();
+}
+
+void DRW_Vertex::parseCode(int code, dxfReader *reader){
+ switch (code) {
+ case 70:
+ flags = reader->getInt32();
+ break;
+ case 40:
+ stawidth = reader->getDouble();
+ break;
+ case 41:
+ endwidth = reader->getDouble();
+ break;
+ case 42:
+ bulge = reader->getDouble();
+ break;
+ case 50:
+ tgdir = reader->getDouble();
+ break;
+ case 71:
+ vindex1 = reader->getInt32();
+ break;
+ case 72:
+ vindex2 = reader->getInt32();
+ break;
+ case 73:
+ vindex3 = reader->getInt32();
+ break;
+ case 74:
+ vindex4 = reader->getInt32();
+ break;
+ case 91:
+ identifier = reader->getInt32();
+ break;
+ default:
+ DRW_Point::parseCode(code, reader);
+ break;
+ }
+}
+
+//0x0A vertex 2D
+//0x0B vertex 3D
+//0x0C MESH
+//0x0D PFACE
+//0x0E PFACE FACE
+bool DRW_Vertex::parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs, double el){
+ bool ret = DRW_Entity::parseDwg(version, buf, NULL, bs);
+ if (!ret)
+ return ret;
+ DRW_DBG("\n***************************** parsing pline Vertex *********************************************\n");
+
+ if (oType == 0x0A) { //pline 2D, needed example
+ flags = buf->getRawChar8(); //RLZ: EC unknown type
+ DRW_DBG("flags value: "); DRW_DBG(flags);
+ basePoint = buf->get3BitDouble();
+ basePoint.z = el;
+ DRW_DBG("basePoint: "); DRW_DBGPT(basePoint.x, basePoint.y, basePoint.z);
+ stawidth = buf->getBitDouble();
+ if (stawidth < 0)
+ endwidth = stawidth = fabs(stawidth);
+ else
+ endwidth = buf->getBitDouble();
+ bulge = buf->getBitDouble();
+ if (version > DRW::AC1021) //2010+
+ DRW_DBG("Vertex ID: "); DRW_DBG(buf->getBitLong());
+ tgdir = buf->getBitDouble();
+ } else if (oType == 0x0B || oType == 0x0C || oType == 0x0D) { //PFACE
+ flags = buf->getRawChar8(); //RLZ: EC unknown type
+ DRW_DBG("flags value: "); DRW_DBG(flags);
+ basePoint = buf->get3BitDouble();
+ DRW_DBG("basePoint: "); DRW_DBGPT(basePoint.x, basePoint.y, basePoint.z);
+ } else if (oType == 0x0E) { //PFACE FACE
+ vindex1 = buf->getBitShort();
+ vindex2 = buf->getBitShort();
+ vindex3 = buf->getBitShort();
+ vindex4 = buf->getBitShort();
+ }
+
+ ret = DRW_Entity::parseDwgEntHandle(version, buf);
+ if (!ret)
+ return ret;
+// RS crc; //RS */
+ return buf->isGood();
+}
+
+void DRW_Hatch::parseCode(int code, dxfReader *reader){
+ switch (code) {
+ case 2:
+ name = reader->getUtf8String();
+ break;
+ case 70:
+ solid = reader->getInt32();
+ break;
+ case 71:
+ associative = reader->getInt32();
+ break;
+ case 72: /*edge type*/
+ if (ispol){ //if is polyline is a as_bulge flag
+ break;
+ } else if (reader->getInt32() == 1){ //line
+ addLine();
+ } else if (reader->getInt32() == 2){ //arc
+ addArc();
+ } else if (reader->getInt32() == 3){ //elliptic arc
+ addEllipse();
+ } else if (reader->getInt32() == 4){ //spline
+ addSpline();
+ }
+ break;
+ case 10:
+ if (pt) pt->basePoint.x = reader->getDouble();
+ else if (pline) {
+ plvert = pline->addVertex();
+ plvert->x = reader->getDouble();
+ }
+ break;
+ case 20:
+ if (pt) pt->basePoint.y = reader->getDouble();
+ else if (plvert) plvert ->y = reader->getDouble();
+ break;
+ case 11:
+ if (line) line->secPoint.x = reader->getDouble();
+ else if (ellipse) ellipse->secPoint.x = reader->getDouble();
+ break;
+ case 21:
+ if (line) line->secPoint.y = reader->getDouble();
+ else if (ellipse) ellipse->secPoint.y = reader->getDouble();
+ break;
+ case 40:
+ if (arc) arc->radious = reader->getDouble();
+ else if (ellipse) ellipse->ratio = reader->getDouble();
+ break;
+ case 41:
+ scale = reader->getDouble();
+ break;
+ case 42:
+ if (plvert) plvert ->bulge = reader->getDouble();
+ break;
+ case 50:
+ if (arc) arc->staangle = reader->getDouble()/ARAD;
+ else if (ellipse) ellipse->staparam = reader->getDouble()/ARAD;
+ break;
+ case 51:
+ if (arc) arc->endangle = reader->getDouble()/ARAD;
+ else if (ellipse) ellipse->endparam = reader->getDouble()/ARAD;
+ break;
+ case 52:
+ angle = reader->getDouble();
+ break;
+ case 73:
+ if (arc) arc->isccw = reader->getInt32();
+ else if (pline) pline->flags = reader->getInt32();
+ break;
+ case 75:
+ hstyle = reader->getInt32();
+ break;
+ case 76:
+ hpattern = reader->getInt32();
+ break;
+ case 77:
+ doubleflag = reader->getInt32();
+ break;
+ case 78:
+ deflines = reader->getInt32();
+ break;
+ case 91:
+ loopsnum = reader->getInt32();
+ looplist.reserve(loopsnum);
+ break;
+ case 92:
+ loop = new DRW_HatchLoop(reader->getInt32());
+ looplist.push_back(loop);
+ if (reader->getInt32() & 2) {
+ ispol = true;
+ clearEntities();
+ pline = new DRW_LWPolyline;
+ loop->objlist.push_back(pline);
+ } else ispol = false;
+ break;
+ case 93:
+ if (pline) pline->vertexnum = reader->getInt32();
+ else loop->numedges = reader->getInt32();//aqui reserve
+ break;
+ case 98: //seed points ??
+ clearEntities();
+ break;
+ default:
+ DRW_Point::parseCode(code, reader);
+ break;
+ }
+}
+
+bool DRW_Hatch::parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs){
+ dwgBuffer sBuff = *buf;
+ dwgBuffer *sBuf = buf;
+ duint32 totalBoundItems = 0;
+ bool havePixelSize = false;
+
+ if (version > DRW::AC1018) {//2007+
+ sBuf = &sBuff; //separate buffer for strings
+ }
+ bool ret = DRW_Entity::parseDwg(version, buf, sBuf, bs);
+ if (!ret)
+ return ret;
+ DRW_DBG("\n***************************** parsing hatch *********************************************\n");
+
+ //Gradient data, RLZ: is ok or if grad > 0 continue read ?
+ if (version > DRW::AC1015) { //2004+
+ dint32 isGradient = buf->getBitLong();
+ DRW_DBG("is Gradient: "); DRW_DBG(isGradient);
+ dint32 res = buf->getBitLong();
+ DRW_DBG(" reserved: "); DRW_DBG(res);
+ double gradAngle = buf->getBitDouble();
+ DRW_DBG(" Gradient angle: "); DRW_DBG(gradAngle);
+ double gradShift = buf->getBitDouble();
+ DRW_DBG(" Gradient shift: "); DRW_DBG(gradShift);
+ dint32 singleCol = buf->getBitLong();
+ DRW_DBG("\nsingle color Grad: "); DRW_DBG(singleCol);
+ double gradTint = buf->getBitDouble();
+ DRW_DBG(" Gradient tint: "); DRW_DBG(gradTint);
+ dint32 numCol = buf->getBitLong();
+ DRW_DBG(" num colors: "); DRW_DBG(numCol);
+ for (dint32 i = 0 ; i < numCol; ++i){
+ double unkDouble = buf->getBitDouble();
+ DRW_DBG("\nunkDouble: "); DRW_DBG(unkDouble);
+ duint16 unkShort = buf->getBitShort();
+ DRW_DBG(" unkShort: "); DRW_DBG(unkShort);
+ dint32 rgbCol = buf->getBitLong();
+ DRW_DBG(" rgb color: "); DRW_DBG(rgbCol);
+ duint8 ignCol = buf->getRawChar8();
+ DRW_DBG(" ignored color: "); DRW_DBG(ignCol);
+ }
+ UTF8STRING gradName = sBuf->getVariableText(version, false);
+ DRW_DBG("\ngradient name: "); DRW_DBG(gradName.c_str()); DRW_DBG("\n");
+ }
+ basePoint.z = buf->getBitDouble();
+ extPoint = buf->get3BitDouble();
+ DRW_DBG("base point: "); DRW_DBGPT(basePoint.x, basePoint.y, basePoint.z);
+ DRW_DBG("\nextrusion: "); DRW_DBGPT(extPoint.x, extPoint.y, extPoint.z);
+ name = sBuf->getVariableText(version, false);
+ DRW_DBG("\nhatch pattern name: "); DRW_DBG(name.c_str()); DRW_DBG("\n");
+ solid = buf->getBit();
+ associative = buf->getBit();
+ loopsnum = buf->getBitLong();
+
+ //read loops
+ for (dint32 i = 0 ; i < loopsnum; ++i){
+ loop = new DRW_HatchLoop(buf->getBitLong());
+ havePixelSize |= loop->type & 4;
+ if (!(loop->type & 2)){ //Not polyline
+ dint32 numPathSeg = buf->getBitLong();
+ for (dint32 j = 0; j<numPathSeg;++j){
+ duint8 typePath = buf->getRawChar8();
+ if (typePath == 1){ //line
+ addLine();
+ line->basePoint = buf->get2RawDouble();
+ line->secPoint = buf->get2RawDouble();
+ } else if (typePath == 2){ //circle arc
+ addArc();
+ arc->basePoint = buf->get2RawDouble();
+ arc->radious = buf->getBitDouble();
+ arc->staangle = buf->getBitDouble();
+ arc->endangle = buf->getBitDouble();
+ arc->isccw = buf->getBit();
+ } else if (typePath == 3){ //ellipse arc
+ addEllipse();
+ ellipse->basePoint = buf->get2RawDouble();
+ ellipse->secPoint = buf->get2RawDouble();
+ ellipse->ratio = buf->getBitDouble();
+ ellipse->staparam = buf->getBitDouble();
+ ellipse->endparam = buf->getBitDouble();
+ ellipse->isccw = buf->getBit();
+ } else if (typePath == 4){ //spline
+ addSpline();
+ spline->degree = buf->getBitLong();
+ bool isRational = buf->getBit();
+ spline->flags |= (isRational << 2); //rational
+ spline->flags |= (buf->getBit() << 1); //periodic
+ spline->nknots = buf->getBitLong();
+ spline->knotslist.reserve(spline->nknots);
+ for (dint32 j = 0; j < spline->nknots;++j){
+ spline->knotslist.push_back (buf->getBitDouble());
+ }
+ spline->ncontrol = buf->getBitLong();
+ spline->controllist.reserve(spline->ncontrol);
+ for (dint32 j = 0; j < spline->ncontrol;++j){
+ DRW_Coord* crd = new DRW_Coord(buf->get3BitDouble());
+ if(isRational)
+ crd->z = buf->getBitDouble(); //RLZ: investigate how store weight
+ spline->controllist.push_back(crd);
+ }
+ if (version > DRW::AC1021) { //2010+
+ spline->nfit = buf->getBitLong();
+ spline->fitlist.reserve(spline->nfit);
+ for (dint32 j = 0; j < spline->nfit;++j){
+ DRW_Coord* crd = new DRW_Coord(buf->get3BitDouble());
+ spline->fitlist.push_back (crd);
+ }
+ spline->tgStart = buf->get2RawDouble();
+ spline->tgEnd = buf->get2RawDouble();
+ }
+ }
+ }
+ } else { //end not pline, start polyline
+ pline = new DRW_LWPolyline;
+ bool asBulge = buf->getBit();
+ pline->flags = buf->getBit();//closed bit
+ dint32 numVert = buf->getBitLong();
+ for (dint32 j = 0; j<numVert;++j){
+ DRW_Vertex2D v;
+ v.x = buf->getRawDouble();
+ v.y = buf->getRawDouble();
+ if (asBulge)
+ v.bulge = buf->getBitDouble();
+ pline->addVertex(v);
+ }
+ loop->objlist.push_back(pline);
+ }//end polyline
+ loop->update();
+ looplist.push_back(loop);
+ totalBoundItems += buf->getBitLong();
+ DRW_DBG(" totalBoundItems: "); DRW_DBG(totalBoundItems);
+ } //end read loops
+
+ hstyle = buf->getBitShort();
+ hpattern = buf->getBitShort();
+ DRW_DBG("\nhatch style: "); DRW_DBG(hstyle); DRW_DBG(" pattern type"); DRW_DBG(hpattern);
+ if (!solid){
+ angle = buf->getBitDouble();
+ scale = buf->getBitDouble();
+ doubleflag = buf->getBit();
+ deflines = buf->getBitShort();
+ for (dint32 i = 0 ; i < deflines; ++i){
+ DRW_Coord ptL, offL;
+ double angleL = buf->getBitDouble();
+ ptL.x = buf->getBitDouble();
+ ptL.y = buf->getBitDouble();
+ offL.x = buf->getBitDouble();
+ offL.y = buf->getBitDouble();
+ duint16 numDashL = buf->getBitShort();
+ DRW_DBG("\ndef line: "); DRW_DBG(angleL); DRW_DBG(","); DRW_DBG(ptL.x); DRW_DBG(","); DRW_DBG(ptL.y);
+ DRW_DBG(","); DRW_DBG(offL.x); DRW_DBG(","); DRW_DBG(offL.y); DRW_DBG(","); DRW_DBG(angleL);
+ for (duint16 i = 0 ; i < numDashL; ++i){
+ double lenghtL = buf->getBitDouble();
+ DRW_DBG(","); DRW_DBG(lenghtL);
+ }
+ }//end deflines
+ } //end not solid
+
+ if (havePixelSize){
+ ddouble64 pixsize = buf->getBitDouble();
+ DRW_DBG("\npixel size: "); DRW_DBG(pixsize);
+ }
+ dint32 numSeedPoints = buf->getBitLong();
+ DRW_DBG("\nnum Seed Points "); DRW_DBG(numSeedPoints);
+ //read Seed Points
+ DRW_Coord seedPt;
+ for (dint32 i = 0 ; i < numSeedPoints; ++i){
+ seedPt.x = buf->getRawDouble();
+ seedPt.y = buf->getRawDouble();
+ DRW_DBG("\n "); DRW_DBG(seedPt.x); DRW_DBG(","); DRW_DBG(seedPt.y);
+ }
+
+ DRW_DBG("\n");
+ ret = DRW_Entity::parseDwgEntHandle(version, buf);
+ if (!ret)
+ return ret;
+ DRW_DBG("Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n");
+
+ for (duint32 i = 0 ; i < totalBoundItems; ++i){
+ dwgHandle biH = buf->getHandle();
+ DRW_DBG("Boundary Items Handle: "); DRW_DBGHL(biH.code, biH.size, biH.ref);
+ }
+ DRW_DBG("Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n");
+// RS crc; //RS */
+ return buf->isGood();
+}
+
+void DRW_Spline::parseCode(int code, dxfReader *reader){
+ switch (code) {
+ case 210:
+ normalVec.x = reader->getDouble();
+ break;
+ case 220:
+ normalVec.y = reader->getDouble();
+ break;
+ case 230:
+ normalVec.z = reader->getDouble();
+ break;
+ case 12:
+ tgStart.x = reader->getDouble();
+ break;
+ case 22:
+ tgStart.y = reader->getDouble();
+ break;
+ case 32:
+ tgStart.z = reader->getDouble();
+ break;
+ case 13:
+ tgEnd.x = reader->getDouble();
+ break;
+ case 23:
+ tgEnd.y = reader->getDouble();
+ break;
+ case 33:
+ tgEnd.z = reader->getDouble();
+ break;
+ case 70:
+ flags = reader->getInt32();
+ break;
+ case 71:
+ degree = reader->getInt32();
+ break;
+ case 72:
+ nknots = reader->getInt32();
+ break;
+ case 73:
+ ncontrol = reader->getInt32();
+ break;
+ case 74:
+ nfit = reader->getInt32();
+ break;
+ case 42:
+ tolknot = reader->getDouble();
+ break;
+ case 43:
+ tolcontrol = reader->getDouble();
+ break;
+ case 44:
+ tolfit = reader->getDouble();
+ break;
+ case 10: {
+ controlpoint = new DRW_Coord();
+ controllist.push_back(controlpoint);
+ controlpoint->x = reader->getDouble();
+ break; }
+ case 20:
+ if(controlpoint != NULL)
+ controlpoint->y = reader->getDouble();
+ break;
+ case 30:
+ if(controlpoint != NULL)
+ controlpoint->z = reader->getDouble();
+ break;
+ case 11: {
+ fitpoint = new DRW_Coord();
+ fitlist.push_back(fitpoint);
+ fitpoint->x = reader->getDouble();
+ break; }
+ case 21:
+ if(fitpoint != NULL)
+ fitpoint->y = reader->getDouble();
+ break;
+ case 31:
+ if(fitpoint != NULL)
+ fitpoint->z = reader->getDouble();
+ break;
+ case 40:
+ knotslist.push_back(reader->getDouble());
+ break;
+ case 41:
+ weightlist.push_back(reader->getDouble());
+ break;
+ default:
+ DRW_Entity::parseCode(code, reader);
+ break;
+ }
+}
+
+bool DRW_Spline::parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs){
+ bool ret = DRW_Entity::parseDwg(version, buf, NULL, bs);
+ if (!ret)
+ return ret;
+ DRW_DBG("\n***************************** parsing spline *********************************************\n");
+ duint8 weight = 0; // RLZ ??? flags, weight, code 70, bit 4 (16)
+
+ dint32 scenario = buf->getBitLong();
+ DRW_DBG("scenario: "); DRW_DBG(scenario);
+ if (version > DRW::AC1024) {
+ dint32 splFlag1 = buf->getBitLong();
+ if (splFlag1 & 1)
+ scenario = 2;
+ dint32 knotParam = buf->getBitLong();
+ DRW_DBG("2013 splFlag1: "); DRW_DBG(splFlag1); DRW_DBG(" 2013 knotParam: ");
+ DRW_DBG(knotParam);
+// DRW_DBG("unk bit: "); DRW_DBG(buf->getBit());
+ }
+ degree = buf->getBitLong(); //RLZ: code 71, verify with dxf
+ DRW_DBG(" degree: "); DRW_DBG(degree); DRW_DBG("\n");
+ if (scenario == 2) {
+ flags = 8;//scenario 2 = not rational & planar
+ tolfit = buf->getBitDouble();//BD
+ DRW_DBG("flags: "); DRW_DBG(flags); DRW_DBG(" tolfit: "); DRW_DBG(tolfit);
+ tgStart =buf->get3BitDouble();
+ DRW_DBG(" Start Tangent: "); DRW_DBGPT(tgStart.x, tgStart.y, tgStart.z);
+ tgEnd =buf->get3BitDouble();
+ DRW_DBG("\nEnd Tangent: "); DRW_DBGPT(tgEnd.x, tgEnd.y, tgEnd.z);
+ nfit = buf->getBitLong();
+ DRW_DBG("\nnumber of fit points: "); DRW_DBG(nfit);
+ } else if (scenario == 1) {
+ flags = 8;//scenario 1 = rational & planar
+ flags |= buf->getBit() << 2; //flags, rational, code 70, bit 2 (4)
+ flags |= buf->getBit(); //flags, closed, code 70, bit 0 (1)
+ flags |= buf->getBit() << 1; //flags, periodic, code 70, bit 1 (2)
+ tolknot = buf->getBitDouble();
+ tolcontrol = buf->getBitDouble();
+ DRW_DBG("flags: "); DRW_DBG(flags); DRW_DBG(" knot tolerance: "); DRW_DBG(tolknot);
+ DRW_DBG(" control point tolerance: "); DRW_DBG(tolcontrol);
+ nknots = buf->getBitLong();
+ ncontrol = buf->getBitLong();
+ weight = buf->getBit(); // RLZ ??? flags, weight, code 70, bit 4 (16)
+ DRW_DBG("\nnum of knots: "); DRW_DBG(nknots); DRW_DBG(" num of control pt: ");
+ DRW_DBG(ncontrol); DRW_DBG(" weight bit: "); DRW_DBG(weight);
+ } else {
+ DRW_DBG("\ndwg Ellipse, unknouwn scenario\n");
+ return false; //RLZ: from doc only 1 or 2 are ok ?
+ }
+
+ knotslist.reserve(nknots);
+ for (dint32 i= 0; i<nknots; ++i){
+ knotslist.push_back (buf->getBitDouble());
+ }
+ controllist.reserve(ncontrol);
+ for (dint32 i= 0; i<ncontrol; ++i){
+ DRW_Coord* crd = new DRW_Coord(buf->get3BitDouble());
+ controllist.push_back(crd);
+ if (weight){
+ DRW_DBG("\n w: "); DRW_DBG(buf->getBitDouble()); //RLZ Warning: D (BD or RD)
+ }
+ }
+ fitlist.reserve(nfit);
+ for (dint32 i= 0; i<nfit; ++i){
+ DRW_Coord* crd = new DRW_Coord(buf->get3BitDouble());
+ fitlist.push_back (crd);
+ }
+ if (DRW_DBGGL == DRW_dbg::DEBUG){
+ DRW_DBG("\nknots list: ");
+ for (std::vector<double>::iterator it = knotslist.begin() ; it != knotslist.end(); ++it){
+ DRW_DBG("\n"); DRW_DBG(*it);
+ }
+ DRW_DBG("\ncontrol point list: ");
+ for (std::vector<DRW_Coord *>::iterator it = controllist.begin() ; it != controllist.end(); ++it){
+ DRW_DBG("\n"); DRW_DBGPT((*it)->x,(*it)->y,(*it)->z);
+ }
+ DRW_DBG("\nfit point list: ");
+ for (std::vector<DRW_Coord *>::iterator it = fitlist.begin() ; it != fitlist.end(); ++it){
+ DRW_DBG("\n"); DRW_DBGPT((*it)->x,(*it)->y,(*it)->z);
+ }
+ }
+
+ /* Common Entity Handle Data */
+ ret = DRW_Entity::parseDwgEntHandle(version, buf);
+ if (!ret)
+ return ret;
+// RS crc; //RS */
+ return buf->isGood();
+}
+
+void DRW_Image::parseCode(int code, dxfReader *reader){
+ switch (code) {
+ case 12:
+ vVector.x = reader->getDouble();
+ break;
+ case 22:
+ vVector.y = reader->getDouble();
+ break;
+ case 32:
+ vVector.z = reader->getDouble();
+ break;
+ case 13:
+ sizeu = reader->getDouble();
+ break;
+ case 23:
+ sizev = reader->getDouble();
+ break;
+ case 340:
+ ref = reader->getHandleString();
+ break;
+ case 280:
+ clip = reader->getInt32();
+ break;
+ case 281:
+ brightness = reader->getInt32();
+ break;
+ case 282:
+ contrast = reader->getInt32();
+ break;
+ case 283:
+ fade = reader->getInt32();
+ break;
+ default:
+ DRW_Line::parseCode(code, reader);
+ break;
+ }
+}
+
+bool DRW_Image::parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs){
+ dwgBuffer sBuff = *buf;
+ dwgBuffer *sBuf = buf;
+ if (version > DRW::AC1018) {//2007+
+ sBuf = &sBuff; //separate buffer for strings
+ }
+ bool ret = DRW_Entity::parseDwg(version, buf, sBuf, bs);
+ if (!ret)
+ return ret;
+ DRW_DBG("\n***************************** parsing image *********************************************\n");
+
+ dint32 classVersion = buf->getBitLong();
+ DRW_DBG("class Version: "); DRW_DBG(classVersion);
+ basePoint = buf->get3BitDouble();
+ DRW_DBG("\nbase point: "); DRW_DBGPT(basePoint.x, basePoint.y, basePoint.z);
+ secPoint = buf->get3BitDouble();
+ DRW_DBG("\nU vector: "); DRW_DBGPT(secPoint.x, secPoint.y, secPoint.z);
+ vVector = buf->get3BitDouble();
+ DRW_DBG("\nV vector: "); DRW_DBGPT(vVector.x, vVector.y, vVector.z);
+ sizeu = buf->getRawDouble();
+ sizev = buf->getRawDouble();
+ DRW_DBG("\nsize U: "); DRW_DBG(sizeu); DRW_DBG("\nsize V: "); DRW_DBG(sizev);
+ duint16 displayProps = buf->getBitShort();
+ (void)displayProps;
+ clip = buf->getBit();
+ brightness = buf->getRawChar8();
+ contrast = buf->getRawChar8();
+ fade = buf->getRawChar8();
+ if (version > DRW::AC1021){ //2010+
+ bool clipMode = buf->getBit();
+ (void)clipMode;
+ }
+ duint16 clipType = buf->getBitShort();
+ if (clipType == 1){
+ buf->get2RawDouble();
+ buf->get2RawDouble();
+ } else { //clipType == 2
+ dint32 numVerts = buf->getBitLong();
+ for (int i= 0; i< numVerts;++i)
+ buf->get2RawDouble();
+ }
+
+ ret = DRW_Entity::parseDwgEntHandle(version, buf);
+ if (!ret)
+ return ret;
+ DRW_DBG("Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n");
+
+ dwgHandle biH = buf->getHandle();
+ DRW_DBG("ImageDef Handle: "); DRW_DBGHL(biH.code, biH.size, biH.ref);
+ ref = biH.ref;
+ biH = buf->getHandle();
+ DRW_DBG("ImageDefReactor Handle: "); DRW_DBGHL(biH.code, biH.size, biH.ref);
+ DRW_DBG("Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n");
+// RS crc; //RS */
+ return buf->isGood();
+}
+
+void DRW_Dimension::parseCode(int code, dxfReader *reader){
+ switch (code) {
+ case 1:
+ text = reader->getUtf8String();
+ break;
+ case 2:
+ name = reader->getString();
+ break;
+ case 3:
+ style = reader->getUtf8String();
+ break;
+ case 70:
+ type = reader->getInt32();
+ break;
+ case 71:
+ align = reader->getInt32();
+ break;
+ case 72:
+ linesty = reader->getInt32();
+ break;
+ case 10:
+ defPoint.x = reader->getDouble();
+ break;
+ case 20:
+ defPoint.y = reader->getDouble();
+ break;
+ case 30:
+ defPoint.z = reader->getDouble();
+ break;
+ case 11:
+ textPoint.x = reader->getDouble();
+ break;
+ case 21:
+ textPoint.y = reader->getDouble();
+ break;
+ case 31:
+ textPoint.z = reader->getDouble();
+ break;
+ case 12:
+ clonePoint.x = reader->getDouble();
+ break;
+ case 22:
+ clonePoint.y = reader->getDouble();
+ break;
+ case 32:
+ clonePoint.z = reader->getDouble();
+ break;
+ case 13:
+ def1.x = reader->getDouble();
+ break;
+ case 23:
+ def1.y = reader->getDouble();
+ break;
+ case 33:
+ def1.z = reader->getDouble();
+ break;
+ case 14:
+ def2.x = reader->getDouble();
+ break;
+ case 24:
+ def2.y = reader->getDouble();
+ break;
+ case 34:
+ def2.z = reader->getDouble();
+ break;
+ case 15:
+ circlePoint.x = reader->getDouble();
+ break;
+ case 25:
+ circlePoint.y = reader->getDouble();
+ break;
+ case 35:
+ circlePoint.z = reader->getDouble();
+ break;
+ case 16:
+ arcPoint.x = reader->getDouble();
+ break;
+ case 26:
+ arcPoint.y = reader->getDouble();
+ break;
+ case 36:
+ arcPoint.z = reader->getDouble();
+ break;
+ case 41:
+ linefactor = reader->getDouble();
+ break;
+ case 42:
+ actual = reader->getDouble();
+ hasActual = (actual != 0.0);
+ break;
+ case 53:
+ rot = reader->getDouble();
+ break;
+ case 50:
+ angle = reader->getDouble();
+ break;
+ case 52:
+ oblique = reader->getDouble();
+ break;
+ case 40:
+ length = reader->getDouble();
+ break;
+ case 51:
+ hdir = reader->getDouble();
+ break;
+ default:
+ DRW_Entity::parseCode(code, reader);
+ break;
+ }
+}
+
+bool DRW_Dimension::parseDwg(DRW::Version version, dwgBuffer *buf, dwgBuffer *sBuf){
+ DRW_DBG("\n***************************** parsing dimension *********************************************");
+ if (version > DRW::AC1021) { //2010+
+ duint8 dimVersion = buf->getRawChar8();
+ DRW_DBG("\ndimVersion: "); DRW_DBG(dimVersion);
+ }
+ extPoint = buf->getExtrusion(version > DRW::AC1014);
+ DRW_DBG("\nextPoint: "); DRW_DBGPT(extPoint.x, extPoint.y, extPoint.z);
+ if (version > DRW::AC1014) { //2000+
+ DRW_DBG("\nFive unknown bits: "); DRW_DBG(buf->getBit()); DRW_DBG(buf->getBit());
+ DRW_DBG(buf->getBit()); DRW_DBG(buf->getBit()); DRW_DBG(buf->getBit());
+ }
+ textPoint.x = buf->getRawDouble();
+ textPoint.y = buf->getRawDouble();
+ textPoint.z = buf->getBitDouble();
+ DRW_DBG("\ntextPoint: "); DRW_DBGPT(textPoint.x, textPoint.y, textPoint.z);
+ type = buf->getRawChar8();
+ DRW_DBG("\ntype (70) read: "); DRW_DBG(type);
+ type = (type & 1) ? type & 0x7F : type | 0x80; //set bit 7
+ type = (type & 2) ? type | 0x20 : type & 0xDF; //set bit 5
+ DRW_DBG(" type (70) set: "); DRW_DBG(type);
+ //clear last 3 bits to set integer dim type
+ type &= 0xF8;
+ text = sBuf->getVariableText(version, false);
+ DRW_DBG("\nforced dim text: "); DRW_DBG(text.c_str());
+ rot = buf->getBitDouble();
+ hdir = buf->getBitDouble();
+ DRW_Coord inspoint = buf->get3BitDouble();
+ DRW_DBG("\ninspoint: "); DRW_DBGPT(inspoint.x, inspoint.y, inspoint.z);
+ double insRot_code54 = buf->getBitDouble(); //RLZ: unknown, investigate
+ DRW_DBG(" insRot_code54: "); DRW_DBG(insRot_code54);
+ if (version > DRW::AC1014) { //2000+
+ align = buf->getBitShort();
+ linesty = buf->getBitShort();
+ linefactor = buf->getBitDouble();
+ double actMeas = buf->getBitDouble();
+ DRW_DBG("\n actMeas_code42: "); DRW_DBG(actMeas);
+ if (version > DRW::AC1018) { //2007+
+ bool unk = buf->getBit();
+ bool flip1 = buf->getBit();
+ bool flip2 = buf->getBit();
+ DRW_DBG("\n2007, unk, flip1, flip2: "); DRW_DBG(unk); DRW_DBG(flip1); DRW_DBG(flip2);
+ }
+ }
+ clonePoint.x = buf->getRawDouble();
+ clonePoint.y = buf->getRawDouble();
+ DRW_DBG("\nclonePoint: "); DRW_DBGPT(clonePoint.x, clonePoint.y, clonePoint.z);
+
+ return buf->isGood();
+}
+
+bool DRW_DimAligned::parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs){
+ dwgBuffer sBuff = *buf;
+ dwgBuffer *sBuf = buf;
+ if (version > DRW::AC1018) {//2007+
+ sBuf = &sBuff; //separate buffer for strings
+ }
+ bool ret = DRW_Entity::parseDwg(version, buf, sBuf, bs);
+ if (!ret)
+ return ret;
+ ret = DRW_Dimension::parseDwg(version, buf, sBuf);
+ if (!ret)
+ return ret;
+ if (oType == 0x15)
+ DRW_DBG("\n***************************** parsing dim linear *********************************************\n");
+ else
+ DRW_DBG("\n***************************** parsing dim aligned *********************************************\n");
+ DRW_Coord pt = buf->get3BitDouble();
+ setPt3(pt); //def1
+ DRW_DBG("def1: "); DRW_DBGPT(pt.x, pt.y, pt.z);
+ pt = buf->get3BitDouble();
+ setPt4(pt);
+ DRW_DBG("\ndef2: "); DRW_DBGPT(pt.x, pt.y, pt.z);
+ pt = buf->get3BitDouble();
+ setDefPoint(pt);
+ DRW_DBG("\ndefPoint: "); DRW_DBGPT(pt.x, pt.y, pt.z);
+ setOb52(buf->getBitDouble());
+ if (oType == 0x15)
+ setAn50(buf->getBitDouble() * ARAD);
+ else
+ type |= 1;
+ DRW_DBG("\n type (70) final: "); DRW_DBG(type); DRW_DBG("\n");
+
+ ret = DRW_Entity::parseDwgEntHandle(version, buf);
+ DRW_DBG("Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n");
+ if (!ret)
+ return ret;
+ dimStyleH = buf->getHandle();
+ DRW_DBG("dim style Handle: "); DRW_DBGHL(dimStyleH.code, dimStyleH.size, dimStyleH.ref); DRW_DBG("\n");
+ blockH = buf->getHandle(); /* H 7 STYLE (hard pointer) */
+ DRW_DBG("anon block Handle: "); DRW_DBGHL(blockH.code, blockH.size, blockH.ref); DRW_DBG("\n");
+ DRW_DBG("Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n");
+
+ // RS crc; //RS */
+ return buf->isGood();
+ }
+
+ bool DRW_DimRadial::parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs){
+ dwgBuffer sBuff = *buf;
+ dwgBuffer *sBuf = buf;
+ if (version > DRW::AC1018) {//2007+
+ sBuf = &sBuff; //separate buffer for strings
+ }
+ bool ret = DRW_Entity::parseDwg(version, buf, sBuf, bs);
+ if (!ret)
+ return ret;
+ ret = DRW_Dimension::parseDwg(version, buf, sBuf);
+ if (!ret)
+ return ret;
+ DRW_DBG("\n***************************** parsing dim radial *********************************************\n");
+ DRW_Coord pt = buf->get3BitDouble();
+ setDefPoint(pt); //code 10
+ DRW_DBG("defPoint: "); DRW_DBGPT(pt.x, pt.y, pt.z);
+ pt = buf->get3BitDouble();
+ setPt5(pt); //center pt code 15
+ DRW_DBG("\ncenter point: "); DRW_DBGPT(pt.x, pt.y, pt.z);
+ setRa40(buf->getBitDouble()); //leader length code 40
+ DRW_DBG("\nleader length: "); DRW_DBG(getRa40());
+ type |= 4;
+ DRW_DBG("\n type (70) final: "); DRW_DBG(type); DRW_DBG("\n");
+
+ ret = DRW_Entity::parseDwgEntHandle(version, buf);
+ DRW_DBG("Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n");
+ if (!ret)
+ return ret;
+ dimStyleH = buf->getHandle();
+ DRW_DBG("dim style Handle: "); DRW_DBGHL(dimStyleH.code, dimStyleH.size, dimStyleH.ref); DRW_DBG("\n");
+ blockH = buf->getHandle(); /* H 7 STYLE (hard pointer) */
+ DRW_DBG("anon block Handle: "); DRW_DBGHL(blockH.code, blockH.size, blockH.ref); DRW_DBG("\n");
+ DRW_DBG("Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n");
+
+ // RS crc; //RS */
+ return buf->isGood();
+ }
+
+ bool DRW_DimDiametric::parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs){
+ dwgBuffer sBuff = *buf;
+ dwgBuffer *sBuf = buf;
+ if (version > DRW::AC1018) {//2007+
+ sBuf = &sBuff; //separate buffer for strings
+ }
+ bool ret = DRW_Entity::parseDwg(version, buf, sBuf, bs);
+ if (!ret)
+ return ret;
+ ret = DRW_Dimension::parseDwg(version, buf, sBuf);
+ if (!ret)
+ return ret;
+ DRW_DBG("\n***************************** parsing dim diametric *********************************************\n");
+ DRW_Coord pt = buf->get3BitDouble();
+ setPt5(pt); //center pt code 15
+ DRW_DBG("center point: "); DRW_DBGPT(pt.x, pt.y, pt.z);
+ pt = buf->get3BitDouble();
+ setDefPoint(pt); //code 10
+ DRW_DBG("\ndefPoint: "); DRW_DBGPT(pt.x, pt.y, pt.z);
+ setRa40(buf->getBitDouble()); //leader length code 40
+ DRW_DBG("\nleader length: "); DRW_DBG(getRa40());
+ type |= 3;
+ DRW_DBG("\n type (70) final: "); DRW_DBG(type); DRW_DBG("\n");
+
+ ret = DRW_Entity::parseDwgEntHandle(version, buf);
+ DRW_DBG("Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n");
+ if (!ret)
+ return ret;
+ dimStyleH = buf->getHandle();
+ DRW_DBG("dim style Handle: "); DRW_DBGHL(dimStyleH.code, dimStyleH.size, dimStyleH.ref); DRW_DBG("\n");
+ blockH = buf->getHandle(); /* H 7 STYLE (hard pointer) */
+ DRW_DBG("anon block Handle: "); DRW_DBGHL(blockH.code, blockH.size, blockH.ref); DRW_DBG("\n");
+ DRW_DBG("Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n");
+
+ // RS crc; //RS */
+ return buf->isGood();
+ }
+
+bool DRW_DimAngular::parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs){
+ dwgBuffer sBuff = *buf;
+ dwgBuffer *sBuf = buf;
+ if (version > DRW::AC1018) {//2007+
+ sBuf = &sBuff; //separate buffer for strings
+ }
+ bool ret = DRW_Entity::parseDwg(version, buf, sBuf, bs);
+ if (!ret)
+ return ret;
+ ret = DRW_Dimension::parseDwg(version, buf, sBuf);
+ if (!ret)
+ return ret;
+ DRW_DBG("\n***************************** parsing dim angular *********************************************\n");
+ DRW_Coord pt;
+ pt.x = buf->getRawDouble();
+ pt.y = buf->getRawDouble();
+ setPt6(pt); //code 16
+ DRW_DBG("arc Point: "); DRW_DBGPT(pt.x, pt.y, pt.z);
+ pt = buf->get3BitDouble();
+ setPt3(pt); //def1 code 13
+ DRW_DBG("\ndef1: "); DRW_DBGPT(pt.x, pt.y, pt.z);
+ pt = buf->get3BitDouble();
+ setPt4(pt); //def2 code 14
+ DRW_DBG("\ndef2: "); DRW_DBGPT(pt.x, pt.y, pt.z);
+ pt = buf->get3BitDouble();
+ setPt5(pt); //center pt code 15
+ DRW_DBG("\ncenter point: "); DRW_DBGPT(pt.x, pt.y, pt.z);
+ pt = buf->get3BitDouble();
+ setDefPoint(pt); //code 10
+ DRW_DBG("\ndefPoint: "); DRW_DBGPT(pt.x, pt.y, pt.z);
+ type |= 0x02;
+ DRW_DBG("\n type (70) final: "); DRW_DBG(type); DRW_DBG("\n");
+
+ ret = DRW_Entity::parseDwgEntHandle(version, buf);
+ DRW_DBG("Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n");
+ if (!ret)
+ return ret;
+ dimStyleH = buf->getHandle();
+ DRW_DBG("dim style Handle: "); DRW_DBGHL(dimStyleH.code, dimStyleH.size, dimStyleH.ref); DRW_DBG("\n");
+ blockH = buf->getHandle(); /* H 7 STYLE (hard pointer) */
+ DRW_DBG("anon block Handle: "); DRW_DBGHL(blockH.code, blockH.size, blockH.ref); DRW_DBG("\n");
+ DRW_DBG("Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n");
+
+ // RS crc; //RS */
+ return buf->isGood();
+}
+
+bool DRW_DimAngular3p::parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs){
+ dwgBuffer sBuff = *buf;
+ dwgBuffer *sBuf = buf;
+ if (version > DRW::AC1018) {//2007+
+ sBuf = &sBuff; //separate buffer for strings
+ }
+ bool ret = DRW_Entity::parseDwg(version, buf, sBuf, bs);
+ if (!ret)
+ return ret;
+ ret = DRW_Dimension::parseDwg(version, buf, sBuf);
+ if (!ret)
+ return ret;
+ DRW_DBG("\n***************************** parsing dim angular3p *********************************************\n");
+ DRW_Coord pt = buf->get3BitDouble();
+ setDefPoint(pt); //code 10
+ DRW_DBG("defPoint: "); DRW_DBGPT(pt.x, pt.y, pt.z);
+ pt = buf->get3BitDouble();
+ setPt3(pt); //def1 code 13
+ DRW_DBG("\ndef1: "); DRW_DBGPT(pt.x, pt.y, pt.z);
+ pt = buf->get3BitDouble();
+ setPt4(pt); //def2 code 14
+ DRW_DBG("\ndef2: "); DRW_DBGPT(pt.x, pt.y, pt.z);
+ pt = buf->get3BitDouble();
+ setPt5(pt); //center pt code 15
+ DRW_DBG("\ncenter point: "); DRW_DBGPT(pt.x, pt.y, pt.z);
+ type |= 0x05;
+ DRW_DBG("\n type (70) final: "); DRW_DBG(type); DRW_DBG("\n");
+
+ ret = DRW_Entity::parseDwgEntHandle(version, buf);
+ DRW_DBG("Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n");
+ if (!ret)
+ return ret;
+ dimStyleH = buf->getHandle();
+ DRW_DBG("dim style Handle: "); DRW_DBGHL(dimStyleH.code, dimStyleH.size, dimStyleH.ref); DRW_DBG("\n");
+ blockH = buf->getHandle(); /* H 7 STYLE (hard pointer) */
+ DRW_DBG("anon block Handle: "); DRW_DBGHL(blockH.code, blockH.size, blockH.ref); DRW_DBG("\n");
+ DRW_DBG("Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n");
+
+ // RS crc; //RS */
+ return buf->isGood();
+}
+
+bool DRW_DimOrdinate::parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs){
+ dwgBuffer sBuff = *buf;
+ dwgBuffer *sBuf = buf;
+ if (version > DRW::AC1018) {//2007+
+ sBuf = &sBuff; //separate buffer for strings
+ }
+ bool ret = DRW_Entity::parseDwg(version, buf, sBuf, bs);
+ if (!ret)
+ return ret;
+ ret = DRW_Dimension::parseDwg(version, buf, sBuf);
+ if (!ret)
+ return ret;
+ DRW_DBG("\n***************************** parsing dim ordinate *********************************************\n");
+ DRW_Coord pt = buf->get3BitDouble();
+ setDefPoint(pt);
+ DRW_DBG("defPoint: "); DRW_DBGPT(pt.x, pt.y, pt.z);
+ pt = buf->get3BitDouble();
+ setPt3(pt); //def1
+ DRW_DBG("\ndef1: "); DRW_DBGPT(pt.x, pt.y, pt.z);
+ pt = buf->get3BitDouble();
+ setPt4(pt);
+ DRW_DBG("\ndef2: "); DRW_DBGPT(pt.x, pt.y, pt.z);
+ duint8 type2 = buf->getRawChar8();//RLZ: correct this
+ DRW_DBG("type2 (70) read: "); DRW_DBG(type2);
+ type = (type2 & 1) ? type | 0x80 : type & 0xBF; //set bit 6
+ DRW_DBG(" type (70) set: "); DRW_DBG(type);
+ type |= 6;
+ DRW_DBG("\n type (70) final: "); DRW_DBG(type);
+
+ ret = DRW_Entity::parseDwgEntHandle(version, buf); DRW_DBG("\n");
+ DRW_DBG("Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n");
+ if (!ret)
+ return ret;
+ dimStyleH = buf->getHandle();
+ DRW_DBG("dim style Handle: "); DRW_DBGHL(dimStyleH.code, dimStyleH.size, dimStyleH.ref); DRW_DBG("\n");
+ blockH = buf->getHandle(); /* H 7 STYLE (hard pointer) */
+ DRW_DBG("anon block Handle: "); DRW_DBGHL(blockH.code, blockH.size, blockH.ref); DRW_DBG("\n");
+ DRW_DBG("Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n");
+
+ // RS crc; //RS */
+ return buf->isGood();
+}
+
+void DRW_Leader::parseCode(int code, dxfReader *reader){
+ switch (code) {
+ case 3:
+ style = reader->getUtf8String();
+ break;
+ case 71:
+ arrow = reader->getInt32();
+ break;
+ case 72:
+ leadertype = reader->getInt32();
+ break;
+ case 73:
+ flag = reader->getInt32();
+ break;
+ case 74:
+ hookline = reader->getInt32();
+ break;
+ case 75:
+ hookflag = reader->getInt32();
+ break;
+ case 76:
+ vertnum = reader->getInt32();
+ break;
+ case 77:
+ coloruse = reader->getInt32();
+ break;
+ case 40:
+ textheight = reader->getDouble();
+ break;
+ case 41:
+ textwidth = reader->getDouble();
+ break;
+ case 10: {
+ vertexpoint = new DRW_Coord();
+ vertexlist.push_back(vertexpoint);
+ vertexpoint->x = reader->getDouble();
+ break; }
+ case 20:
+ if(vertexpoint != NULL)
+ vertexpoint->y = reader->getDouble();
+ break;
+ case 30:
+ if(vertexpoint != NULL)
+ vertexpoint->z = reader->getDouble();
+ break;
+ case 340:
+ annotHandle = reader->getHandleString();
+ break;
+ case 210:
+ extrusionPoint.x = reader->getDouble();
+ break;
+ case 220:
+ extrusionPoint.y = reader->getDouble();
+ break;
+ case 230:
+ extrusionPoint.z = reader->getDouble();
+ break;
+ case 211:
+ horizdir.x = reader->getDouble();
+ break;
+ case 221:
+ horizdir.y = reader->getDouble();
+ break;
+ case 231:
+ horizdir.z = reader->getDouble();
+ break;
+ case 212:
+ offsetblock.x = reader->getDouble();
+ break;
+ case 222:
+ offsetblock.y = reader->getDouble();
+ break;
+ case 232:
+ offsetblock.z = reader->getDouble();
+ break;
+ case 213:
+ offsettext.x = reader->getDouble();
+ break;
+ case 223:
+ offsettext.y = reader->getDouble();
+ break;
+ case 233:
+ offsettext.z = reader->getDouble();
+ break;
+ default:
+ DRW_Entity::parseCode(code, reader);
+ break;
+ }
+}
+
+bool DRW_Leader::parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs){
+ dwgBuffer sBuff = *buf;
+ dwgBuffer *sBuf = buf;
+ if (version > DRW::AC1018) {//2007+
+ sBuf = &sBuff; //separate buffer for strings
+ }
+ bool ret = DRW_Entity::parseDwg(version, buf, sBuf, bs);
+ if (!ret)
+ return ret;
+ DRW_DBG("\n***************************** parsing leader *********************************************\n");
+ DRW_DBG("unknown bit "); DRW_DBG(buf->getBit());
+ DRW_DBG(" annot type "); DRW_DBG(buf->getBitShort());
+ DRW_DBG(" Path type "); DRW_DBG(buf->getBitShort());
+ dint32 nPt = buf->getBitLong();
+ DRW_DBG(" Num pts "); DRW_DBG(nPt);
+
+ // add vertexs
+ for (int i = 0; i< nPt; i++){
+ DRW_Coord* vertex = new DRW_Coord(buf->get3BitDouble());
+ vertexlist.push_back(vertex);
+ DRW_DBG("\nvertex "); DRW_DBGPT(vertex->x, vertex->y, vertex->z);
+ }
+ DRW_Coord Endptproj = buf->get3BitDouble();
+ DRW_DBG("\nEndptproj "); DRW_DBGPT(Endptproj.x, Endptproj.y, Endptproj.z);
+ extrusionPoint = buf->getExtrusion(version > DRW::AC1014);
+ DRW_DBG("\nextrusionPoint "); DRW_DBGPT(extrusionPoint.x, extrusionPoint.y, extrusionPoint.z);
+ if (version > DRW::AC1014) { //2000+
+ DRW_DBG("\nFive unknown bits: "); DRW_DBG(buf->getBit()); DRW_DBG(buf->getBit());
+ DRW_DBG(buf->getBit()); DRW_DBG(buf->getBit()); DRW_DBG(buf->getBit());
+ }
+ horizdir = buf->get3BitDouble();
+ DRW_DBG("\nhorizdir "); DRW_DBGPT(horizdir.x, horizdir.y, horizdir.z);
+ offsetblock = buf->get3BitDouble();
+ DRW_DBG("\noffsetblock "); DRW_DBGPT(offsetblock.x, offsetblock.y, offsetblock.z);
+ if (version > DRW::AC1012) { //R14+
+ DRW_Coord unk = buf->get3BitDouble();
+ DRW_DBG("\nunknown "); DRW_DBGPT(unk.x, unk.y, unk.z);
+ }
+ if (version < DRW::AC1015) { //R14 -
+ DRW_DBG("\ndimgap "); DRW_DBG(buf->getBitDouble());
+ }
+ if (version < DRW::AC1024) { //2010-
+ textheight = buf->getBitDouble();
+ textwidth = buf->getBitDouble();
+ DRW_DBG("\ntextheight "); DRW_DBG(textheight); DRW_DBG(" textwidth "); DRW_DBG(textwidth);
+ }
+ hookline = buf->getBit();
+ arrow = buf->getBit();
+ DRW_DBG(" hookline "); DRW_DBG(hookline); DRW_DBG(" arrow flag "); DRW_DBG(arrow);
+
+ if (version < DRW::AC1015) { //R14 -
+ DRW_DBG("\nArrow head type "); DRW_DBG(buf->getBitShort());
+ DRW_DBG("dimasz "); DRW_DBG(buf->getBitDouble());
+ DRW_DBG("\nunk bit "); DRW_DBG(buf->getBit());
+ DRW_DBG(" unk bit "); DRW_DBG(buf->getBit());
+ DRW_DBG(" unk short "); DRW_DBG(buf->getBitShort());
+ DRW_DBG(" byBlock color "); DRW_DBG(buf->getBitShort());
+ DRW_DBG(" unk bit "); DRW_DBG(buf->getBit());
+ DRW_DBG(" unk bit "); DRW_DBG(buf->getBit());
+ } else { //R2000+
+ DRW_DBG("\nunk short "); DRW_DBG(buf->getBitShort());
+ DRW_DBG(" unk bit "); DRW_DBG(buf->getBit());
+ DRW_DBG(" unk bit "); DRW_DBG(buf->getBit());
+ }
+ DRW_DBG("\n");
+ ret = DRW_Entity::parseDwgEntHandle(version, buf);
+ if (!ret)
+ return ret;
+ DRW_DBG("Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n");
+ AnnotH = buf->getHandle();
+ annotHandle = AnnotH.ref;
+ DRW_DBG("annot block Handle: "); DRW_DBGHL(AnnotH.code, AnnotH.size, dimStyleH.ref); DRW_DBG("\n");
+ dimStyleH = buf->getHandle(); /* H 7 STYLE (hard pointer) */
+ DRW_DBG("dim style Handle: "); DRW_DBGHL(dimStyleH.code, dimStyleH.size, dimStyleH.ref); DRW_DBG("\n");
+ DRW_DBG("Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n");
+// RS crc; //RS */
+ return buf->isGood();
+}
+
+void DRW_Viewport::parseCode(int code, dxfReader *reader){
+ switch (code) {
+ case 40:
+ pswidth = reader->getDouble();
+ break;
+ case 41:
+ psheight = reader->getDouble();
+ break;
+ case 68:
+ vpstatus = reader->getInt32();
+ break;
+ case 69:
+ vpID = reader->getInt32();
+ break;
+ case 12: {
+ centerPX = reader->getDouble();
+ break; }
+ case 22:
+ centerPY = reader->getDouble();
+ break;
+ default:
+ DRW_Point::parseCode(code, reader);
+ break;
+ }
+}
+//ex 22 dec 34
+bool DRW_Viewport::parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs){
+ dwgBuffer sBuff = *buf;
+ dwgBuffer *sBuf = buf;
+ if (version > DRW::AC1018) {//2007+
+ sBuf = &sBuff; //separate buffer for strings
+ }
+ bool ret = DRW_Entity::parseDwg(version, buf, sBuf, bs);
+ if (!ret)
+ return ret;
+ DRW_DBG("\n***************************** parsing viewport *****************************************\n");
+ basePoint.x = buf->getBitDouble();
+ basePoint.y = buf->getBitDouble();
+ basePoint.z = buf->getBitDouble();
+ DRW_DBG("center "); DRW_DBGPT(basePoint.x, basePoint.y, basePoint.z);
+ pswidth = buf->getBitDouble();
+ psheight = buf->getBitDouble();
+ DRW_DBG("\nWidth: "); DRW_DBG(pswidth); DRW_DBG(", Height: "); DRW_DBG(psheight); DRW_DBG("\n");
+ //RLZ TODO: complete in dxf
+ if (version > DRW::AC1014) {//2000+
+ viewTarget.x = buf->getBitDouble();
+ viewTarget.y = buf->getBitDouble();
+ viewTarget.z = buf->getBitDouble();
+ DRW_DBG("view Target "); DRW_DBGPT(viewTarget.x, viewTarget.y, viewTarget.z);
+ viewDir.x = buf->getBitDouble();
+ viewDir.y = buf->getBitDouble();
+ viewDir.z = buf->getBitDouble();
+ DRW_DBG("\nview direction "); DRW_DBGPT(viewDir.x, viewDir.y, viewDir.z);
+ twistAngle = buf->getBitDouble();
+ DRW_DBG("\nView twist Angle: "); DRW_DBG(twistAngle);
+ viewHeight = buf->getBitDouble();
+ DRW_DBG("\nview Height: "); DRW_DBG(viewHeight);
+ viewLength = buf->getBitDouble();
+ DRW_DBG(" Lens Length: "); DRW_DBG(viewLength);
+ frontClip = buf->getBitDouble();
+ DRW_DBG("\nfront Clip Z: "); DRW_DBG(frontClip);
+ backClip = buf->getBitDouble();
+ DRW_DBG(" back Clip Z: "); DRW_DBG(backClip);
+ snapAngle = buf->getBitDouble();
+ DRW_DBG("\n snap Angle: "); DRW_DBG(snapAngle);
+ centerPX = buf->getRawDouble();
+ centerPY = buf->getRawDouble();
+ DRW_DBG("\nview center X: "); DRW_DBG(centerPX); DRW_DBG(", Y: "); DRW_DBG(centerPX);
+ snapPX = buf->getRawDouble();
+ snapPY = buf->getRawDouble();
+ DRW_DBG("\nSnap base point X: "); DRW_DBG(snapPX); DRW_DBG(", Y: "); DRW_DBG(snapPY);
+ snapSpPX = buf->getRawDouble();
+ snapSpPY = buf->getRawDouble();
+ DRW_DBG("\nSnap spacing X: "); DRW_DBG(snapSpPX); DRW_DBG(", Y: "); DRW_DBG(snapSpPY);
+ //RLZ: need to complete
+ DRW_DBG("\nGrid spacing X: "); DRW_DBG(buf->getRawDouble()); DRW_DBG(", Y: "); DRW_DBG(buf->getRawDouble());DRW_DBG("\n");
+ DRW_DBG("Circle zoom?: "); DRW_DBG(buf->getBitShort()); DRW_DBG("\n");
+ }
+ if (version > DRW::AC1018) {//2007+
+ DRW_DBG("Grid major?: "); DRW_DBG(buf->getBitShort()); DRW_DBG("\n");
+ }
+ if (version > DRW::AC1014) {//2000+
+ frozenLyCount = buf->getBitLong();
+ DRW_DBG("Frozen Layer count?: "); DRW_DBG(frozenLyCount); DRW_DBG("\n");
+ DRW_DBG("Status Flags?: "); DRW_DBG(buf->getBitLong()); DRW_DBG("\n");
+ //RLZ: Warning needed separate string bufer
+ DRW_DBG("Style sheet?: "); DRW_DBG(sBuf->getVariableText(version, false)); DRW_DBG("\n");
+ DRW_DBG("Render mode?: "); DRW_DBG(buf->getRawChar8()); DRW_DBG("\n");
+ DRW_DBG("UCS OMore...: "); DRW_DBG(buf->getBit()); DRW_DBG("\n");
+ DRW_DBG("UCS VMore...: "); DRW_DBG(buf->getBit()); DRW_DBG("\n");
+ DRW_DBG("UCS OMore...: "); DRW_DBGPT(buf->getBitDouble(), buf->getBitDouble(), buf->getBitDouble()); DRW_DBG("\n");
+ DRW_DBG("ucs XAMore...: "); DRW_DBGPT(buf->getBitDouble(), buf->getBitDouble(), buf->getBitDouble()); DRW_DBG("\n");
+ DRW_DBG("UCS YMore....: "); DRW_DBGPT(buf->getBitDouble(), buf->getBitDouble(), buf->getBitDouble()); DRW_DBG("\n");
+ DRW_DBG("UCS EMore...: "); DRW_DBG(buf->getBitDouble()); DRW_DBG("\n");
+ DRW_DBG("UCS OVMore...: "); DRW_DBG(buf->getBitShort()); DRW_DBG("\n");
+ }
+ if (version > DRW::AC1015) {//2004+
+ DRW_DBG("ShadePlot Mode...: "); DRW_DBG(buf->getBitShort()); DRW_DBG("\n");
+ }
+ if (version > DRW::AC1018) {//2007+
+ DRW_DBG("Use def Ligth...: "); DRW_DBG(buf->getBit()); DRW_DBG("\n");
+ DRW_DBG("Def ligth tipe?: "); DRW_DBG(buf->getRawChar8()); DRW_DBG("\n");
+ DRW_DBG("Brightness: "); DRW_DBG(buf->getBitDouble()); DRW_DBG("\n");
+ DRW_DBG("Contrast: "); DRW_DBG(buf->getBitDouble()); DRW_DBG("\n");
+// DRW_DBG("Ambient Cmc or Enc: "); DRW_DBG(buf->getCmColor(version)); DRW_DBG("\n");
+ DRW_DBG("Ambient (Cmc or Enc?), Enc: "); DRW_DBG(buf->getEnColor(version)); DRW_DBG("\n");
+ }
+ ret = DRW_Entity::parseDwgEntHandle(version, buf);
+
+ dwgHandle someHdl;
+ if (version < DRW::AC1015) {//R13 & R14 only
+ DRW_DBG("\n Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n");
+ someHdl = buf->getHandle();
+ DRW_DBG("ViewPort ent header: "); DRW_DBGHL(someHdl.code, someHdl.size, someHdl.ref); DRW_DBG("\n");
+ }
+ if (version > DRW::AC1014) {//2000+
+ for (duint8 i=0; i < frozenLyCount; ++i){
+ someHdl = buf->getHandle();
+ DRW_DBG("Frozen layer handle "); DRW_DBG(i); DRW_DBG(": "); DRW_DBGHL(someHdl.code, someHdl.size, someHdl.ref); DRW_DBG("\n");
+ }
+ someHdl = buf->getHandle();
+ DRW_DBG("Clip bpundary handle: "); DRW_DBGHL(someHdl.code, someHdl.size, someHdl.ref); DRW_DBG("\n");
+ if (version == DRW::AC1015) {//2000 only
+ someHdl = buf->getHandle();
+ DRW_DBG("ViewPort ent header: "); DRW_DBGHL(someHdl.code, someHdl.size, someHdl.ref); DRW_DBG("\n");
+ }
+ someHdl = buf->getHandle();
+ DRW_DBG("Named ucs handle: "); DRW_DBGHL(someHdl.code, someHdl.size, someHdl.ref); DRW_DBG("\n");
+ DRW_DBG("\n Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n");
+ someHdl = buf->getHandle();
+ DRW_DBG("base ucs handle: "); DRW_DBGHL(someHdl.code, someHdl.size, someHdl.ref); DRW_DBG("\n");
+ }
+ if (version > DRW::AC1018) {//2007+
+ someHdl = buf->getHandle();
+ DRW_DBG("background handle: "); DRW_DBGHL(someHdl.code, someHdl.size, someHdl.ref); DRW_DBG("\n");
+ someHdl = buf->getHandle();
+ DRW_DBG("visual style handle: "); DRW_DBGHL(someHdl.code, someHdl.size, someHdl.ref); DRW_DBG("\n");
+ someHdl = buf->getHandle();
+ DRW_DBG("shadeplot ID handle: "); DRW_DBGHL(someHdl.code, someHdl.size, someHdl.ref); DRW_DBG("\n");
+ DRW_DBG("\n Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n");
+ someHdl = buf->getHandle();
+ DRW_DBG("SUN handle: "); DRW_DBGHL(someHdl.code, someHdl.size, someHdl.ref); DRW_DBG("\n");
+ }
+ DRW_DBG("\n Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n");
+
+ if (!ret)
+ return ret;
+ return buf->isGood();
+}
--- /dev/null
+/******************************************************************************
+** libDXFrw - Library to read/write DXF files (ascii & binary) **
+** **
+** Copyright (C) 2011-2015 José F. Soriano, rallazz@gmail.com **
+** **
+** This library is free software, licensed under the terms of the GNU **
+** General Public License as published by the Free Software Foundation, **
+** either version 2 of the License, or (at your option) any later version. **
+** You should have received a copy of the GNU General Public License **
+** along with this program. If not, see <http://www.gnu.org/licenses/>. **
+******************************************************************************/
+
+#ifndef DRW_ENTITIES_H
+#define DRW_ENTITIES_H
+
+
+#include <string>
+#include <vector>
+#include <list>
+#include "drw_base.h"
+
+class dxfReader;
+class dwgBuffer;
+class DRW_Polyline;
+
+namespace DRW {
+
+ //! Entity's type.
+ enum ETYPE {
+ E3DFACE,
+// E3DSOLID, //encripted propietry data
+// ACAD_PROXY_ENTITY,
+ ARC,
+// ATTDEF,
+// ATTRIB,
+ BLOCK,// and ENDBLK
+// BODY, //encripted propietry data
+ CIRCLE,
+ DIMENSION,
+ DIMALIGNED,
+ DIMLINEAR,
+ DIMRADIAL,
+ DIMDIAMETRIC,
+ DIMANGULAR,
+ DIMANGULAR3P,
+ DIMORDINATE,
+ ELLIPSE,
+ HATCH,
+// HELIX,
+ IMAGE,
+ INSERT,
+ LEADER,
+// LIGHT,
+ LINE,
+ LWPOLYLINE,
+// MESH,
+// MLINE,
+// MLEADERSTYLE,
+// MLEADER,
+ MTEXT,
+// OLEFRAME,
+// OLE2FRAME,
+ POINT,
+ POLYLINE,
+ RAY,
+// REGION, //encripted propietry data
+// SECTION,
+// SEQEND,//not needed?? used in polyline and insert/attrib and dwg
+// SHAPE,
+ SOLID,
+ SPLINE,
+// SUN,
+// SURFACE, //encripted propietry data can be four types
+// TABLE,
+ TEXT,
+// TOLERANCE,
+ TRACE,
+ UNDERLAY,
+ VERTEX,
+ VIEWPORT,
+// WIPEOUT, //WIPEOUTVARIABLE
+ XLINE,
+ UNKNOWN
+ };
+
+}
+//only in DWG: MINSERT, 5 types of vertex, 4 types of polylines: 2d, 3d, pface & mesh
+//shape, dictionary, MLEADER, MLEADERSTYLE
+
+#define SETENTFRIENDS friend class dxfRW; \
+ friend class dwgReader;
+
+//! Base class for entities
+/*!
+* Base class for entities
+* @author Rallaz
+*/
+class DRW_Entity {
+ SETENTFRIENDS
+public:
+ //initializes default values
+ DRW_Entity() {
+ eType = DRW::UNKNOWN;
+ handle = parentHandle = DRW::NoHandle; //no handle (0)
+ lineType = "BYLAYER";
+ color = DRW::ColorByLayer; // default BYLAYER (256)
+ ltypeScale = 1.0;
+ visible = true;
+ layer = "0";
+ lWeight = DRW_LW_Conv::widthByLayer; // default BYLAYER (dxf -1, dwg 29)
+ space = DRW::ModelSpace; // default ModelSpace (0)
+ haveExtrusion = false;
+ color24 = -1; //default -1 not set
+ numProxyGraph = 0;
+ shadow = DRW::CastAndReceieveShadows;
+ material = DRW::MaterialByLayer;
+ plotStyle = DRW::DefaultPlotStyle;
+ transparency = DRW::Opaque;
+ nextEntLink = prevEntLink = 0;
+ numReactors = xDictFlag = 0;
+ curr = NULL;
+ ownerHandle= false;
+ }
+
+ DRW_Entity(const DRW_Entity& e) {
+ eType = e.eType;
+ handle = e.handle;
+ parentHandle = e.parentHandle; //no handle (0)
+ lineType = e.lineType;
+ color = e.color; // default BYLAYER (256)
+ ltypeScale = e.ltypeScale;
+ visible = e.visible;
+ layer = e.layer;
+ lWeight = e.lWeight;
+ space = e.space;
+ haveExtrusion = e.haveExtrusion;
+ color24 = e.color24; //default -1 not set
+ numProxyGraph = e.numProxyGraph;
+ shadow = e.shadow;
+ material = e.material;
+ plotStyle = e.plotStyle;
+ transparency = e.transparency;
+ nextEntLink = e.nextEntLink;
+ prevEntLink = e.prevEntLink;
+ numReactors = e.numReactors;
+ xDictFlag = e.xDictFlag;
+ curr = NULL;
+ ownerHandle= false;
+// curr = e.curr;
+ for (std::vector<DRW_Variant*>::const_iterator it=e.extData.begin(); it!=e.extData.end(); ++it){
+ extData.push_back(new DRW_Variant(*(*it)));
+ }
+ }
+
+ virtual ~DRW_Entity() {
+ for (std::vector<DRW_Variant*>::iterator it=extData.begin(); it!=extData.end(); ++it)
+ delete *it;
+
+ extData.clear();
+ }
+
+ void reset(){
+ for (std::vector<DRW_Variant*>::iterator it=extData.begin(); it!=extData.end(); ++it)
+ delete *it;
+ extData.clear();
+ }
+
+ virtual void applyExtrusion() = 0;
+
+ void setWidthMm(double millimeters) {
+ if(millimeters < 0.0) {
+ lWeight = DRW_LW_Conv::widthByLayer;
+ return;
+ }
+ if(millimeters > 2.11) millimeters = 2.11;
+ lWeight = DRW_LW_Conv::dxfInt2lineWidth(int(floor(millimeters * 100.0)));
+ }
+
+protected:
+ //parses dxf pair to read entity
+ bool parseCode(int code, dxfReader *reader);
+ //calculates extrusion axis (normal vector)
+ void calculateAxis(DRW_Coord extPoint);
+ //apply extrusion to @extPoint and return data in @point
+ void extrudePoint(DRW_Coord extPoint, DRW_Coord *point);
+ virtual bool parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs=0)=0;
+ //parses dwg common start part to read entity
+ bool parseDwg(DRW::Version version, dwgBuffer *buf, dwgBuffer* strBuf, duint32 bs=0);
+ //parses dwg common handles part to read entity
+ bool parseDwgEntHandle(DRW::Version version, dwgBuffer *buf);
+
+ //parses dxf 102 groups to read entity
+ bool parseDxfGroups(int code, dxfReader *reader);
+
+public:
+ enum DRW::ETYPE eType; /*!< enum: entity type, code 0 */
+ duint32 handle; /*!< entity identifier, code 5 */
+ std::list<std::list<DRW_Variant> > appData; /*!< list of application data, code 102 */
+ duint32 parentHandle; /*!< Soft-pointer ID/handle to owner BLOCK_RECORD object, code 330 */
+ DRW::Space space; /*!< space indicator, code 67*/
+ UTF8STRING layer; /*!< layer name, code 8 */
+ UTF8STRING lineType; /*!< line type, code 6 */
+ duint32 material; /*!< hard pointer id to material object, code 347 */
+ int color; /*!< entity color, code 62 */
+ enum DRW_LW_Conv::lineWidth lWeight; /*!< entity lineweight, code 370 */
+ double ltypeScale; /*!< linetype scale, code 48 */
+ bool visible; /*!< entity visibility, code 60 */
+ int numProxyGraph; /*!< Number of bytes in proxy graphics, code 92 */
+ std::string proxyGraphics; /*!< proxy graphics bytes, code 310 */
+ int color24; /*!< 24-bit color, code 420 */
+ std::string colorName; /*!< color name, code 430 */
+ int transparency; /*!< transparency, code 440 */
+ int plotStyle; /*!< hard pointer id to plot style object, code 390 */
+ DRW::ShadowMode shadow; /*!< shadow mode, code 284 */
+ bool haveExtrusion; /*!< set to true if the entity have extrusion*/
+ std::vector<DRW_Variant*> extData; /*!< FIFO list of extended data, codes 1000 to 1071*/
+
+protected: //only for read dwg
+ duint8 haveNextLinks; //aka nolinks //B
+ duint8 plotFlags; //presence of plot style //BB
+ duint8 ltFlags; //presence of linetype handle //BB
+ duint8 materialFlag; //presence of material handle //BB
+ duint8 shadowFlag; //presence of shadow handle ?? (in dwg may be plotflag)//RC
+ dwgHandle lTypeH;
+ dwgHandle layerH;
+ duint32 nextEntLink;
+ duint32 prevEntLink;
+ bool ownerHandle;
+
+ duint8 xDictFlag;
+ dint32 numReactors; //
+ duint32 objSize; //RL 32bits object data size in bits
+ dint16 oType;
+
+private:
+ DRW_Coord extAxisX;
+ DRW_Coord extAxisY;
+ DRW_Variant* curr;
+};
+
+
+//! Class to handle point entity
+/*!
+* Class to handle point entity
+* @author Rallaz
+*/
+class DRW_Point : public DRW_Entity {
+ SETENTFRIENDS
+public:
+ DRW_Point() {
+ eType = DRW::POINT;
+ basePoint.z = extPoint.x = extPoint.y = 0;
+ extPoint.z = 1;
+ thickness = 0;
+ }
+
+ virtual void applyExtrusion(){}
+
+protected:
+ void parseCode(int code, dxfReader *reader);
+ virtual bool parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs=0);
+
+public:
+ DRW_Coord basePoint; /*!< base point, code 10, 20 & 30 */
+ double thickness; /*!< thickness, code 39 */
+ DRW_Coord extPoint; /*!< Dir extrusion normal vector, code 210, 220 & 230 */
+ // TNick: we're not handling code 50 - Angle of the X axis for
+ // the UCS in effect when the point was drawn
+};
+
+//! Class to handle line entity
+/*!
+* Class to handle line entity
+* @author Rallaz
+*/
+class DRW_Line : public DRW_Point {
+ SETENTFRIENDS
+public:
+ DRW_Line() {
+ eType = DRW::LINE;
+ secPoint.z = 0;
+ }
+
+ virtual void applyExtrusion(){}
+
+protected:
+ void parseCode(int code, dxfReader *reader);
+ virtual bool parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs=0);
+
+public:
+ DRW_Coord secPoint; /*!< second point, code 11, 21 & 31 */
+};
+
+//! Class to handle ray entity
+/*!
+* Class to handle ray entity
+* @author Rallaz
+*/
+class DRW_Ray : public DRW_Line {
+ SETENTFRIENDS
+public:
+ DRW_Ray() {
+ eType = DRW::RAY;
+ }
+protected:
+ virtual bool parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs=0);
+};
+
+//! Class to handle xline entity
+/*!
+* Class to handle xline entity
+* @author Rallaz
+*/
+class DRW_Xline : public DRW_Ray {
+public:
+ DRW_Xline() {
+ eType = DRW::XLINE;
+ }
+};
+
+//! Class to handle circle entity
+/*!
+* Class to handle circle entity
+* @author Rallaz
+*/
+class DRW_Circle : public DRW_Point {
+ SETENTFRIENDS
+public:
+ DRW_Circle() {
+ eType = DRW::CIRCLE;
+ }
+
+ virtual void applyExtrusion();
+
+protected:
+ void parseCode(int code, dxfReader *reader);
+ virtual bool parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs=0);
+
+public:
+ double radious; /*!< radius, code 40 */
+};
+
+//! Class to handle arc entity
+/*!
+* Class to handle arc entity
+* @author Rallaz
+*/
+class DRW_Arc : public DRW_Circle {
+ SETENTFRIENDS
+public:
+ DRW_Arc() {
+ eType = DRW::ARC;
+ isccw = 1;
+ }
+
+ virtual void applyExtrusion();
+
+ //! center point in OCS
+ const DRW_Coord & center() { return basePoint; }
+ //! the radius of the circle
+ double radius() { return radious; }
+ //! start angle in radians
+ double startAngle() { return staangle; }
+ //! end angle in radians
+ double endAngle() { return endangle; }
+ //! thickness
+ double thick() { return thickness; }
+ //! extrusion
+ const DRW_Coord & extrusion() { return extPoint; }
+
+protected:
+ //! interpret code in dxf reading process or dispatch to inherited class
+ void parseCode(int code, dxfReader *reader);
+ //! interpret dwg data (was already determined to be part of this object)
+ virtual bool parseDwg(DRW::Version v, dwgBuffer *buf, duint32 bs=0);
+
+public:
+ double staangle; /*!< start angle, code 50 in radians*/
+ double endangle; /*!< end angle, code 51 in radians */
+ int isccw; /*!< is counter clockwise arc?, only used in hatch, code 73 */
+};
+
+//! Class to handle ellipse entity
+/*!
+* Class to handle ellipse and elliptic arc entity
+* Note: start/end parameter are in radians for ellipse entity but
+* for hatch boundary are in degrees
+* @author Rallaz
+*/
+class DRW_Ellipse : public DRW_Line {
+ SETENTFRIENDS
+public:
+ DRW_Ellipse() {
+ eType = DRW::ELLIPSE;
+ isccw = 1;
+ }
+
+ void toPolyline(DRW_Polyline *pol, int parts = 128);
+ virtual void applyExtrusion();
+
+protected:
+ //! interpret code in dxf reading process or dispatch to inherited class
+ void parseCode(int code, dxfReader *reader);
+ //! interpret dwg data (was already determined to be part of this object)
+ virtual bool parseDwg(DRW::Version v, dwgBuffer *buf, duint32 bs=0);
+
+private:
+ void correctAxis();
+
+public:
+ double ratio; /*!< ratio, code 40 */
+ double staparam; /*!< start parameter, code 41, 0.0 for full ellipse*/
+ double endparam; /*!< end parameter, code 42, 2*PI for full ellipse */
+ int isccw; /*!< is counter clockwise arc?, only used in hatch, code 73 */
+};
+
+//! Class to handle trace entity
+/*!
+* Class to handle trace entity
+* @author Rallaz
+*/
+class DRW_Trace : public DRW_Line {
+ SETENTFRIENDS
+public:
+ DRW_Trace() {
+ eType = DRW::TRACE;
+ thirdPoint.z = 0;
+ fourPoint.z = 0;
+ }
+
+ virtual void applyExtrusion();
+
+protected:
+ void parseCode(int code, dxfReader *reader);
+ virtual bool parseDwg(DRW::Version v, dwgBuffer *buf, duint32 bs=0);
+
+public:
+ DRW_Coord thirdPoint; /*!< third point, code 12, 22 & 32 */
+ DRW_Coord fourPoint; /*!< four point, code 13, 23 & 33 */
+};
+
+//! Class to handle solid entity
+/*!
+* Class to handle solid entity
+* @author Rallaz
+*/
+class DRW_Solid : public DRW_Trace {
+ SETENTFRIENDS
+public:
+ DRW_Solid() {
+ eType = DRW::SOLID;
+ }
+
+protected:
+ //! interpret code in dxf reading process or dispatch to inherited class
+ void parseCode(int code, dxfReader *reader);
+ //! interpret dwg data (was already determined to be part of this object)
+ virtual bool parseDwg(DRW::Version v, dwgBuffer *buf, duint32 bs=0);
+
+public:
+ //! first corner (2D)
+ const DRW_Coord & firstCorner() { return basePoint; }
+ //! second corner (2D)
+ const DRW_Coord & secondCorner() { return secPoint; }
+ //! third corner (2D)
+ const DRW_Coord & thirdCorner() { return thirdPoint; }
+ //! fourth corner (2D)
+ const DRW_Coord & fourthCorner() { return thirdPoint; }
+ //! thickness
+ double thick() { return thickness; }
+ //! elevation
+ double elevation() { return basePoint.z; }
+ //! extrusion
+ const DRW_Coord & extrusion() { return extPoint; }
+
+};
+
+//! Class to handle 3dface entity
+/*!
+* Class to handle 3dface entity
+* @author Rallaz
+*/
+class DRW_3Dface : public DRW_Trace {
+ SETENTFRIENDS
+public:
+ enum InvisibleEdgeFlags {
+ NoEdge = 0x00,
+ FirstEdge = 0x01,
+ SecodEdge = 0x02,
+ ThirdEdge = 0x04,
+ FourthEdge = 0x08,
+ AllEdges = 0x0F
+ };
+
+ DRW_3Dface() {
+ eType = DRW::E3DFACE;
+ invisibleflag = 0;
+ }
+
+ virtual void applyExtrusion(){}
+
+ //! first corner in WCS
+ const DRW_Coord & firstCorner() { return basePoint; }
+ //! second corner in WCS
+ const DRW_Coord & secondCorner() { return secPoint; }
+ //! third corner in WCS
+ const DRW_Coord & thirdCorner() { return thirdPoint; }
+ //! fourth corner in WCS
+ const DRW_Coord & fourthCorner() { return fourPoint; }
+ //! edge visibility flags
+ InvisibleEdgeFlags edgeFlags() { return (InvisibleEdgeFlags)invisibleflag; }
+
+protected:
+ //! interpret code in dxf reading process or dispatch to inherited class
+ void parseCode(int code, dxfReader *reader);
+ //! interpret dwg data (was already determined to be part of this object)
+ virtual bool parseDwg(DRW::Version v, dwgBuffer *buf, duint32 bs=0);
+
+public:
+ int invisibleflag; /*!< invisible edge flag, code 70 */
+
+};
+
+//! Class to handle block entries
+/*!
+* Class to handle block entries
+* @author Rallaz
+*/
+class DRW_Block : public DRW_Point {
+ SETENTFRIENDS
+public:
+ DRW_Block() {
+ eType = DRW::BLOCK;
+ layer = "0";
+ flags = 0;
+ name = "*U0";
+ isEnd = false;
+ }
+
+ virtual void applyExtrusion(){}
+
+protected:
+ void parseCode(int code, dxfReader *reader);
+ virtual bool parseDwg(DRW::Version v, dwgBuffer *buf, duint32 bs=0);
+
+public:
+ UTF8STRING name; /*!< block name, code 2 */
+ int flags; /*!< block type, code 70 */
+private:
+ bool isEnd; //for dwg parsing
+};
+
+
+//! Class to handle insert entries
+/*!
+* Class to handle insert entries
+* @author Rallaz
+*/
+class DRW_Insert : public DRW_Point {
+ SETENTFRIENDS
+public:
+ DRW_Insert() {
+ eType = DRW::INSERT;
+ xscale = 1;
+ yscale = 1;
+ zscale = 1;
+ angle = 0;
+ colcount = 1;
+ rowcount = 1;
+ colspace = 0;
+ rowspace = 0;
+ }
+
+ virtual void applyExtrusion(){DRW_Point::applyExtrusion();}
+
+protected:
+ void parseCode(int code, dxfReader *reader);
+ virtual bool parseDwg(DRW::Version v, dwgBuffer *buf, duint32 bs=0);
+
+public:
+ UTF8STRING name; /*!< block name, code 2 */
+ double xscale; /*!< x scale factor, code 41 */
+ double yscale; /*!< y scale factor, code 42 */
+ double zscale; /*!< z scale factor, code 43 */
+ double angle; /*!< rotation angle in radians, code 50 */
+ int colcount; /*!< column count, code 70 */
+ int rowcount; /*!< row count, code 71 */
+ double colspace; /*!< column space, code 44 */
+ double rowspace; /*!< row space, code 45 */
+public: //only for read dwg
+ dwgHandle blockRecH;
+ dwgHandle seqendH; //RLZ: on implement attrib remove this handle from obj list (see pline/vertex code)
+};
+
+//! Class to handle lwpolyline entity
+/*!
+* Class to handle lwpolyline entity
+* @author Rallaz
+*/
+class DRW_LWPolyline : public DRW_Entity {
+ SETENTFRIENDS
+public:
+ DRW_LWPolyline() {
+ eType = DRW::LWPOLYLINE;
+ elevation = thickness = width = 0.0;
+ flags = 0;
+ extPoint.x = extPoint.y = 0;
+ extPoint.z = 1;
+ vertex = NULL;
+ }
+
+ DRW_LWPolyline(const DRW_LWPolyline& p):DRW_Entity(p){
+ this->eType = DRW::LWPOLYLINE;
+ this->elevation = p.elevation;
+ this->thickness = p.thickness;
+ this->width = p.width;
+ this->flags = p.flags;
+ this->extPoint = p.extPoint;
+ this->vertex = NULL;
+ for (unsigned i=0; i<p.vertlist.size(); i++)// RLZ ok or new
+ this->vertlist.push_back( new DRW_Vertex2D( *(p.vertlist.at(i)) ) );
+
+ this->vertex = NULL;
+ }
+
+ ~DRW_LWPolyline() {
+ for(DRW_Vertex2D *item : vertlist) delete item;
+ }
+ virtual void applyExtrusion();
+ void addVertex (DRW_Vertex2D v) {
+ DRW_Vertex2D *vert = new DRW_Vertex2D();
+ vert->x = v.x;
+ vert->y = v.y;
+ vert->stawidth = v.stawidth;
+ vert->endwidth = v.endwidth;
+ vert->bulge = v.bulge;
+ vertlist.push_back(vert);
+ }
+ DRW_Vertex2D *addVertex () {
+ DRW_Vertex2D *vert = new DRW_Vertex2D();
+ vert->stawidth = 0;
+ vert->endwidth = 0;
+ vert->bulge = 0;
+ vertlist.push_back(vert);
+ return vert;
+ }
+
+protected:
+ void parseCode(int code, dxfReader *reader);
+ bool parseDwg(DRW::Version v, dwgBuffer *buf, duint32 bs=0);
+
+public:
+ int vertexnum; /*!< number of vertex, code 90 */
+ int flags; /*!< polyline flag, code 70, default 0 */
+ double width; /*!< constant width, code 43 */
+ double elevation; /*!< elevation, code 38 */
+ double thickness; /*!< thickness, code 39 */
+ DRW_Coord extPoint; /*!< Dir extrusion normal vector, code 210, 220 & 230 */
+ DRW_Vertex2D *vertex; /*!< current vertex to add data */
+ std::vector<DRW_Vertex2D *> vertlist; /*!< vertex list */
+};
+
+//! Class to handle insert entries
+/*!
+* Class to handle insert entries
+* @author Rallaz
+*/
+class DRW_Text : public DRW_Line {
+ SETENTFRIENDS
+public:
+ //! Vertical alignments.
+ enum VAlign {
+ VBaseLine = 0, /*!< Top = 0 */
+ VBottom, /*!< Bottom = 1 */
+ VMiddle, /*!< Middle = 2 */
+ VTop /*!< Top = 3 */
+ };
+
+ //! Horizontal alignments.
+ enum HAlign {
+ HLeft = 0, /*!< Left = 0 */
+ HCenter, /*!< Centered = 1 */
+ HRight, /*!< Right = 2 */
+ HAligned, /*!< Aligned = 3 (if VAlign==0) */
+ HMiddle, /*!< middle = 4 (if VAlign==0) */
+ HFit /*!< fit into point = 5 (if VAlign==0) */
+ };
+
+ DRW_Text() {
+ eType = DRW::TEXT;
+ angle = 0;
+ widthscale = 1;
+ oblique = 0;
+ style = "STANDARD";
+ textgen = 0;
+ alignH = HLeft;
+ alignV = VBaseLine;
+ }
+
+ virtual void applyExtrusion(){} //RLZ TODO
+
+protected:
+ void parseCode(int code, dxfReader *reader);
+ virtual bool parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs=0);
+
+public:
+ double height; /*!< height text, code 40 */
+ UTF8STRING text; /*!< text string, code 1 */
+ double angle; /*!< rotation angle in degrees (360), code 50 */
+ double widthscale; /*!< width factor, code 41 */
+ double oblique; /*!< oblique angle, code 51 */
+ UTF8STRING style; /*!< style name, code 7 */
+ int textgen; /*!< text generation, code 71 */
+ enum HAlign alignH; /*!< horizontal align, code 72 */
+ enum VAlign alignV; /*!< vertical align, code 73 */
+ dwgHandle styleH; /*!< handle for text style */
+};
+
+//! Class to handle insert entries
+/*!
+* Class to handle insert entries
+* @author Rallaz
+*/
+class DRW_MText : public DRW_Text {
+ SETENTFRIENDS
+public:
+ //! Attachments.
+ enum Attach {
+ TopLeft = 1,
+ TopCenter,
+ TopRight,
+ MiddleLeft,
+ MiddleCenter,
+ MiddleRight,
+ BottomLeft,
+ BottomCenter,
+ BottomRight
+ };
+
+ DRW_MText() {
+ eType = DRW::MTEXT;
+ interlin = 1;
+ alignV = (VAlign)TopLeft;
+ textgen = 1;
+ haveXAxis = false; //if true needed to recalculate angle
+ }
+
+protected:
+ void parseCode(int code, dxfReader *reader);
+ void updateAngle(); //recalculate angle if 'haveXAxis' is true
+ virtual bool parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs=0);
+
+public:
+ double interlin; /*!< width factor, code 44 */
+private:
+ bool haveXAxis;
+};
+
+//! Class to handle vertex
+/*!
+* Class to handle vertex for polyline entity
+* @author Rallaz
+*/
+class DRW_Vertex : public DRW_Point {
+ SETENTFRIENDS
+public:
+ DRW_Vertex() {
+ eType = DRW::VERTEX;
+ stawidth = endwidth = bulge = 0;
+ vindex1 = vindex2 = vindex3 = vindex4 = 0;
+ flags = identifier = 0;
+ }
+ DRW_Vertex(double sx, double sy, double sz, double b) {
+ stawidth = endwidth = 0;
+ vindex1 = vindex2 = vindex3 = vindex4 = 0;
+ flags = identifier = 0;
+ basePoint.x = sx;
+ basePoint.y =sy;
+ basePoint.z =sz;
+ bulge = b;
+ }
+
+protected:
+ void parseCode(int code, dxfReader *reader);
+ bool parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs=0, double el=0);
+ virtual bool parseDwg(DRW::Version version, dwgBuffer* buf, duint32 bs=0){
+ DRW_UNUSED(version); DRW_UNUSED(buf); DRW_UNUSED(bs); return true;}
+
+public:
+ double stawidth; /*!< Start width, code 40 */
+ double endwidth; /*!< End width, code 41 */
+ double bulge; /*!< bulge, code 42 */
+
+ int flags; /*!< vertex flag, code 70, default 0 */
+ double tgdir; /*!< curve fit tangent direction, code 50 */
+ int vindex1; /*!< polyface mesh vertex index, code 71, default 0 */
+ int vindex2; /*!< polyface mesh vertex index, code 72, default 0 */
+ int vindex3; /*!< polyface mesh vertex index, code 73, default 0 */
+ int vindex4; /*!< polyface mesh vertex index, code 74, default 0 */
+ int identifier; /*!< vertex identifier, code 91, default 0 */
+};
+
+//! Class to handle polyline entity
+/*!
+* Class to handle polyline entity
+* @author Rallaz
+*/
+class DRW_Polyline : public DRW_Point {
+ SETENTFRIENDS
+public:
+ DRW_Polyline() {
+ eType = DRW::POLYLINE;
+ defstawidth = defendwidth = 0.0;
+ basePoint.x = basePoint.y = 0.0;
+ flags = vertexcount = facecount = 0;
+ smoothM = smoothN = curvetype = 0;
+ }
+
+ DRW_Polyline(const DRW_Polyline& p) : DRW_Point(p) {
+ flags = p.flags ;
+ defstawidth = p.defstawidth;
+ defendwidth = p.defendwidth;
+ vertexcount = p.vertexcount;
+ facecount = p.facecount ;
+ smoothM = p.smoothM ;
+ smoothN = p.smoothN ;
+ curvetype = p.curvetype ;
+ for (unsigned i=0; i<p.vertlist.size(); i++)// RLZ ok or new
+ this->vertlist.push_back( new DRW_Vertex( *(p.vertlist.at(i)) ) );
+ }
+
+ ~DRW_Polyline() {
+ for(DRW_Vertex *item : vertlist) delete item;
+ }
+ void addVertex (DRW_Vertex v) {
+ DRW_Vertex *vert = new DRW_Vertex();
+ vert->basePoint.x = v.basePoint.x;
+ vert->basePoint.y = v.basePoint.y;
+ vert->basePoint.z = v.basePoint.z;
+ vert->stawidth = v.stawidth;
+ vert->endwidth = v.endwidth;
+ vert->bulge = v.bulge;
+ vertlist.push_back(vert);
+ }
+ void appendVertex (DRW_Vertex *v) {
+ vertlist.push_back(v);
+ }
+
+protected:
+ void parseCode(int code, dxfReader *reader);
+ virtual bool parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs=0);
+
+public:
+ int flags; /*!< polyline flag, code 70, default 0 */
+ double defstawidth; /*!< Start width, code 40, default 0 */
+ double defendwidth; /*!< End width, code 41, default 0 */
+ int vertexcount; /*!< polygon mesh M vertex or polyface vertex num, code 71, default 0 */
+ int facecount; /*!< polygon mesh N vertex or polyface face num, code 72, default 0 */
+ int smoothM; /*!< smooth surface M density, code 73, default 0 */
+ int smoothN; /*!< smooth surface M density, code 74, default 0 */
+ int curvetype; /*!< curves & smooth surface type, code 75, default 0 */
+
+ std::vector<DRW_Vertex *> vertlist; /*!< vertex list */
+
+private:
+ std::list<duint32>hadlesList; //list of handles, only in 2004+
+ duint32 firstEH; //handle of first entity, only in pre-2004
+ duint32 lastEH; //handle of last entity, only in pre-2004
+ dwgHandle seqEndH; //handle of SEQEND entity
+};
+
+
+//! Class to handle spline entity
+/*!
+* Class to handle spline entity
+* @author Rallaz
+*/
+class DRW_Spline : public DRW_Entity {
+ SETENTFRIENDS
+public:
+ DRW_Spline() {
+ eType = DRW::SPLINE;
+ flags = nknots = ncontrol = nfit = 0;
+ tolknot = tolcontrol = tolfit = 0.0000001;
+
+ }
+
+ DRW_Spline(const DRW_Spline& p):DRW_Entity(p){
+ eType = DRW::SPLINE;
+ normalVec = p.normalVec ;
+ tgStart = p.tgStart ;
+ tgEnd = p.tgEnd ;
+ flags = p.flags ;
+ degree = p.degree ;
+ nknots = p.nknots ;
+ ncontrol = p.ncontrol ;
+ nfit = p.nfit ;
+ tolknot = p.tolknot ;
+ tolcontrol = p.tolcontrol;
+ tolfit = p.tolfit ;
+
+ for(double v : p.knotslist) knotslist.push_back(v);
+ for(double v : p.weightlist) weightlist.push_back(v);
+ for(DRW_Coord *v : p.controllist) controllist.push_back(new DRW_Coord(*v));
+ for(DRW_Coord *v : p.fitlist) fitlist.push_back(new DRW_Coord(*v));
+ }
+
+ ~DRW_Spline() {
+ for(DRW_Coord *item : controllist) delete item;
+ for(DRW_Coord *item : fitlist) delete item;
+ }
+ virtual void applyExtrusion(){}
+
+protected:
+ void parseCode(int code, dxfReader *reader);
+ virtual bool parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs=0);
+
+public:
+// double ex; /*!< normal vector x coordinate, code 210 */
+// double ey; /*!< normal vector y coordinate, code 220 */
+// double ez; /*!< normal vector z coordinate, code 230 */
+ DRW_Coord normalVec; /*!< normal vector, code 210, 220, 230 */
+ DRW_Coord tgStart; /*!< start tangent, code 12, 22, 32 */
+// double tgsx; /*!< start tangent x coordinate, code 12 */
+// double tgsy; /*!< start tangent y coordinate, code 22 */
+// double tgsz; /*!< start tangent z coordinate, code 32 */
+ DRW_Coord tgEnd; /*!< end tangent, code 13, 23, 33 */
+// double tgex; /*!< end tangent x coordinate, code 13 */
+// double tgey; /*!< end tangent y coordinate, code 23 */
+// double tgez; /*!< end tangent z coordinate, code 33 */
+ int flags; /*!< spline flag, code 70 */
+ int degree; /*!< degree of the spline, code 71 */
+ dint32 nknots; /*!< number of knots, code 72, default 0 */
+ dint32 ncontrol; /*!< number of control points, code 73, default 0 */
+ dint32 nfit; /*!< number of fit points, code 74, default 0 */
+ double tolknot; /*!< knot tolerance, code 42, default 0.0000001 */
+ double tolcontrol; /*!< control point tolerance, code 43, default 0.0000001 */
+ double tolfit; /*!< fit point tolerance, code 44, default 0.0000001 */
+
+ std::vector<double> knotslist; /*!< knots list, code 40 */
+ std::vector<double> weightlist; /*!< weight list, code 41 */
+ std::vector<DRW_Coord *> controllist; /*!< control points list, code 10, 20 & 30 */
+ std::vector<DRW_Coord *> fitlist; /*!< fit points list, code 11, 21 & 31 */
+
+private:
+ DRW_Coord *controlpoint; /*!< current control point to add data */
+ DRW_Coord *fitpoint; /*!< current fit point to add data */
+};
+
+//! Class to handle hatch loop
+/*!
+* Class to handle hatch loop
+* @author Rallaz
+*/
+class DRW_HatchLoop {
+public:
+ DRW_HatchLoop(int t) {
+ type = t;
+ numedges = 0;
+ }
+
+ ~DRW_HatchLoop() {
+ // for(DRW_LWPolyline *item : pollist) delete item;
+ for(DRW_Entity *item : objlist) delete item;
+ }
+
+ void update() {
+ numedges = objlist.size();
+ }
+
+public:
+ int type; /*!< boundary path type, code 92, polyline=2, default=0 */
+ int numedges; /*!< number of edges (if not a polyline), code 93 */
+//TODO: store lwpolylines as entities
+// std::vector<DRW_LWPolyline *> pollist; /*!< polyline list */
+ std::vector<DRW_Entity *> objlist; /*!< entities list */
+};
+
+//! Class to handle hatch entity
+/*!
+* Class to handle hatch entity
+* @author Rallaz
+*/
+//TODO: handle lwpolylines, splines and ellipses
+class DRW_Hatch : public DRW_Point {
+ SETENTFRIENDS
+public:
+ DRW_Hatch() {
+ eType = DRW::HATCH;
+ angle = scale = 0.0;
+ basePoint.x = basePoint.y = basePoint.z = 0.0;
+ loopsnum = hstyle = associative = 0;
+ solid = hpattern = 1;
+ deflines = doubleflag = 0;
+ loop = NULL;
+ clearEntities();
+ }
+
+ ~DRW_Hatch() {
+ for(DRW_HatchLoop *item : looplist) delete item;
+ }
+
+ void appendLoop (DRW_HatchLoop *v) {
+ looplist.push_back(v);
+ }
+
+ virtual void applyExtrusion(){}
+
+protected:
+ void parseCode(int code, dxfReader *reader);
+ virtual bool parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs=0);
+
+public:
+ UTF8STRING name; /*!< hatch pattern name, code 2 */
+ int solid; /*!< solid fill flag, code 70, solid=1, pattern=0 */
+ int associative; /*!< associativity, code 71, associatve=1, non-assoc.=0 */
+ int hstyle; /*!< hatch style, code 75 */
+ int hpattern; /*!< hatch pattern type, code 76 */
+ int doubleflag; /*!< hatch pattern double flag, code 77, double=1, single=0 */
+ int loopsnum; /*!< namber of boundary paths (loops), code 91 */
+ double angle; /*!< hatch pattern angle, code 52 */
+ double scale; /*!< hatch pattern scale, code 41 */
+ int deflines; /*!< number of pattern definition lines, code 78 */
+
+ std::vector<DRW_HatchLoop *> looplist; /*!< polyline list */
+
+private:
+ void clearEntities(){
+ pt = line = NULL;
+ pline = NULL;
+ arc = NULL;
+ ellipse = NULL;
+ spline = NULL;
+ plvert = NULL;
+ }
+
+ void addLine() {
+ clearEntities();
+ if (loop) {
+ pt = line = new DRW_Line;
+ loop->objlist.push_back(line);
+ }
+ }
+
+ void addArc() {
+ clearEntities();
+ if (loop) {
+ pt = arc = new DRW_Arc;
+ loop->objlist.push_back(arc);
+ }
+ }
+
+ void addEllipse() {
+ clearEntities();
+ if (loop) {
+ pt = ellipse = new DRW_Ellipse;
+ loop->objlist.push_back(ellipse);
+ }
+ }
+
+ void addSpline() {
+ clearEntities();
+ if (loop) {
+ pt = NULL;
+ spline = new DRW_Spline;
+ loop->objlist.push_back(spline);
+ }
+ }
+
+ DRW_HatchLoop *loop; /*!< current loop to add data */
+ DRW_Line *line;
+ DRW_Arc *arc;
+ DRW_Ellipse *ellipse;
+ DRW_Spline *spline;
+ DRW_LWPolyline *pline;
+ DRW_Point *pt;
+ DRW_Vertex2D *plvert;
+ bool ispol;
+};
+
+//! Class to handle image entity
+/*!
+* Class to handle image entity
+* @author Rallaz
+*/
+class DRW_Image : public DRW_Line {
+ SETENTFRIENDS
+public:
+ DRW_Image() {
+ eType = DRW::IMAGE;
+ fade = clip = 0;
+ brightness = contrast = 50;
+ }
+
+protected:
+ void parseCode(int code, dxfReader *reader);
+ virtual bool parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs=0);
+
+public:
+ duint32 ref; /*!< Hard reference to imagedef object, code 340 */
+ DRW_Coord vVector; /*!< V-vector of single pixel, x coordinate, code 12, 22 & 32 */
+// double vx; /*!< V-vector of single pixel, x coordinate, code 12 */
+// double vy; /*!< V-vector of single pixel, y coordinate, code 22 */
+// double vz; /*!< V-vector of single pixel, z coordinate, code 32 */
+ double sizeu; /*!< image size in pixels, U value, code 13 */
+ double sizev; /*!< image size in pixels, V value, code 23 */
+ double dz; /*!< z coordinate, code 33 */
+ int clip; /*!< Clipping state, code 280, 0=off 1=on */
+ int brightness; /*!< Brightness value, code 281, (0-100) default 50 */
+ int contrast; /*!< Brightness value, code 282, (0-100) default 50 */
+ int fade; /*!< Brightness value, code 283, (0-100) default 0 */
+
+};
+
+
+//! Base class for dimension entity
+/*!
+* Base class for dimension entity
+* @author Rallaz
+*/
+class DRW_Dimension : public DRW_Entity {
+ SETENTFRIENDS
+public:
+ DRW_Dimension() {
+ eType = DRW::DIMENSION;
+ type = 0;
+ linesty = 1;
+ linefactor = extPoint.z = 1.0;
+ angle = oblique = rot = 0.0;
+ align = 5;
+ style = "STANDARD";
+ defPoint.z = extPoint.x = extPoint.y = 0;
+ textPoint.z = rot = 0;
+ clonePoint.x = clonePoint.y = clonePoint.z = 0;
+ length = 0.0;
+ hasActual = false;
+ actual = 0.0;
+ }
+
+ DRW_Dimension(const DRW_Dimension& d): DRW_Entity(d) {
+ eType = DRW::DIMENSION;
+ type =d.type;
+ name = d.name;
+ defPoint = d.defPoint;
+ textPoint = d.textPoint;
+ text = d.text;
+ style = d.style;
+ align = d.align;
+ linesty = d.linesty;
+ linefactor = d.linefactor;
+ rot = d.rot;
+ extPoint = d.extPoint;
+ clonePoint = d.clonePoint;
+ def1 = d.def1;
+ def2 = d.def2;
+ angle = d.angle;
+ oblique = d.oblique;
+ arcPoint = d.arcPoint;
+ circlePoint = d.circlePoint;
+ length = d.length;
+ hasActual = d.hasActual;
+ actual = d.actual;
+ //RLZ needed a def value for this: hdir = ???
+ }
+ virtual ~DRW_Dimension() {}
+
+ virtual void applyExtrusion(){}
+
+protected:
+ void parseCode(int code, dxfReader *reader);
+ bool parseDwg(DRW::Version version, dwgBuffer *buf, dwgBuffer *sBuf);
+ virtual bool parseDwg(DRW::Version version, dwgBuffer* buf, duint32 bs=0){
+ DRW_UNUSED(version); DRW_UNUSED(buf); DRW_UNUSED(bs); return true;}
+
+public:
+ DRW_Coord getDefPoint() const {return defPoint;} /*!< Definition point, code 10, 20 & 30 */
+ void setDefPoint(const DRW_Coord p) {defPoint =p;}
+ DRW_Coord getTextPoint() const {return textPoint;} /*!< Middle point of text, code 11, 21 & 31 */
+ void setTextPoint(const DRW_Coord p) {textPoint =p;}
+ std::string getStyle() const {return style;} /*!< Dimension style, code 3 */
+ void setStyle(const std::string s) {style = s;}
+ int getAlign() const { return align;} /*!< attachment point, code 71 */
+ void setAlign(const int a) { align = a;}
+ int getTextLineStyle() const { return linesty;} /*!< Dimension text line spacing style, code 72, default 1 */
+ void setTextLineStyle(const int l) { linesty = l;}
+ std::string getText() const {return text;} /*!< Dimension text explicitly entered by the user, code 1 */
+ void setText(const std::string t) {text = t;}
+ double getTextLineFactor() const { return linefactor;} /*!< Dimension text line spacing factor, code 41, default 1? */
+ void setTextLineFactor(const double l) { linefactor = l;}
+ double getDir() const { return rot;} /*!< rotation angle of the dimension text, code 53 (optional) default 0 */
+ void setDir(const double d) { rot = d;}
+
+ DRW_Coord getExtrusion(){return extPoint;} /*!< extrusion, code 210, 220 & 230 */
+ void setExtrusion(const DRW_Coord p) {extPoint =p;}
+ std::string getName(){return name;} /*!< Name of the block that contains the entities, code 2 */
+ void setName(const std::string s) {name = s;}
+// int getType(){ return type;} /*!< Dimension type, code 70 */
+ bool hasActualMeasurement() const { return hasActual; }
+ void setActualMeasurement(double value) { hasActual = true; actual = value; }
+ double getActualMeasurement() const { return actual; }
+
+protected:
+ DRW_Coord getPt2() const {return clonePoint;}
+ void setPt2(const DRW_Coord p) {clonePoint= p;}
+ DRW_Coord getPt3() const {return def1;}
+ void setPt3(const DRW_Coord p) {def1= p;}
+ DRW_Coord getPt4() const {return def2;}
+ void setPt4(const DRW_Coord p) {def2= p;}
+ DRW_Coord getPt5() const {return circlePoint;}
+ void setPt5(const DRW_Coord p) {circlePoint= p;}
+ DRW_Coord getPt6() const {return arcPoint;}
+ void setPt6(const DRW_Coord p) {arcPoint= p;}
+ double getAn50() const {return angle;} /*!< Angle of rotated, horizontal, or vertical dimensions, code 50 */
+ void setAn50(const double d) {angle = d;}
+ double getOb52() const {return oblique;} /*!< oblique angle, code 52 */
+ void setOb52(const double d) {oblique = d;}
+ double getRa40() const {return length;} /*!< Leader length, code 40 */
+ void setRa40(const double d) {length = d;}
+public:
+ int type; /*!< Dimension type, code 70 */
+private:
+ std::string name; /*!< Name of the block that contains the entities, code 2 */
+ DRW_Coord defPoint; /*!< definition point, code 10, 20 & 30 (WCS) */
+ DRW_Coord textPoint; /*!< Middle point of text, code 11, 21 & 31 (OCS) */
+ UTF8STRING text; /*!< Dimension text explicitly entered by the user, code 1 */
+ UTF8STRING style; /*!< Dimension style, code 3 */
+ int align; /*!< attachment point, code 71 */
+ int linesty; /*!< Dimension text line spacing style, code 72, default 1 */
+ double linefactor; /*!< Dimension text line spacing factor, code 41, default 1? (value range 0.25 to 4.00*/
+ double rot; /*!< rotation angle of the dimension text, code 53 */
+ DRW_Coord extPoint; /*!< extrusion normal vector, code 210, 220 & 230 */
+
+ double hdir; /*!< horizontal direction for the dimension, code 51, default ? */
+ DRW_Coord clonePoint; /*!< Insertion point for clones (Baseline & Continue), code 12, 22 & 32 (OCS) */
+ DRW_Coord def1; /*!< Definition point 1for linear & angular, code 13, 23 & 33 (WCS) */
+ DRW_Coord def2; /*!< Definition point 2, code 14, 24 & 34 (WCS) */
+ double angle; /*!< Angle of rotated, horizontal, or vertical dimensions, code 50 */
+ double oblique; /*!< oblique angle, code 52 */
+
+ DRW_Coord circlePoint; /*!< Definition point for diameter, radius & angular dims code 15, 25 & 35 (WCS) */
+ DRW_Coord arcPoint; /*!< Point defining dimension arc, x coordinate, code 16, 26 & 36 (OCS) */
+ double length; /*!< Leader length, code 40 */
+ bool hasActual; /*!< Actual measurement has been read, code 42 */
+ double actual; /*!< Actual measurement (optional; read-only value), code 42 */
+
+protected:
+ dwgHandle dimStyleH;
+ dwgHandle blockH;
+};
+
+
+//! Class to handle aligned dimension entity
+/*!
+* Class to handle aligned dimension entity
+* @author Rallaz
+*/
+class DRW_DimAligned : public DRW_Dimension {
+ SETENTFRIENDS
+public:
+ DRW_DimAligned(){
+ eType = DRW::DIMALIGNED;
+ type = 1;
+ }
+ DRW_DimAligned(const DRW_Dimension& d): DRW_Dimension(d) {
+ eType = DRW::DIMALIGNED;
+ }
+
+ DRW_Coord getClonepoint() const {return getPt2();} /*!< Insertion for clones (Baseline & Continue), 12, 22 & 32 */
+ void setClonePoint(DRW_Coord c){setPt2(c);}
+
+ DRW_Coord getDimPoint() const {return getDefPoint();} /*!< dim line location point, code 10, 20 & 30 */
+ void setDimPoint(const DRW_Coord p){setDefPoint(p);}
+ DRW_Coord getDef1Point() const {return getPt3();} /*!< Definition point 1, code 13, 23 & 33 */
+ void setDef1Point(const DRW_Coord p) {setPt3(p);}
+ DRW_Coord getDef2Point() const {return getPt4();} /*!< Definition point 2, code 14, 24 & 34 */
+ void setDef2Point(const DRW_Coord p) {setPt4(p);}
+
+protected:
+ virtual bool parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs=0);
+};
+
+//! Class to handle linear or rotated dimension entity
+/*!
+* Class to handle linear or rotated dimension entity
+* @author Rallaz
+*/
+class DRW_DimLinear : public DRW_DimAligned {
+public:
+ DRW_DimLinear() {
+ eType = DRW::DIMLINEAR;
+ type = 0;
+ }
+ DRW_DimLinear(const DRW_Dimension& d): DRW_DimAligned(d) {
+ eType = DRW::DIMLINEAR;
+ }
+
+ double getAngle() const {return getAn50();} /*!< Angle of rotated, horizontal, or vertical dimensions, code 50 */
+ void setAngle(const double d) {setAn50(d);}
+ double getOblique() const {return getOb52();} /*!< oblique angle, code 52 */
+ void setOblique(const double d) {setOb52(d);}
+};
+
+//! Class to handle radial dimension entity
+/*!
+* Class to handle aligned, linear or rotated dimension entity
+* @author Rallaz
+*/
+class DRW_DimRadial : public DRW_Dimension {
+ SETENTFRIENDS
+public:
+ DRW_DimRadial() {
+ eType = DRW::DIMRADIAL;
+ type = 4;
+ }
+ DRW_DimRadial(const DRW_Dimension& d): DRW_Dimension(d) {
+ eType = DRW::DIMRADIAL;
+ }
+
+ DRW_Coord getCenterPoint() const {return getDefPoint();} /*!< center point, code 10, 20 & 30 */
+ void setCenterPoint(const DRW_Coord p){setDefPoint(p);}
+ DRW_Coord getDiameterPoint() const {return getPt5();} /*!< Definition point for radius, code 15, 25 & 35 */
+ void setDiameterPoint(const DRW_Coord p){setPt5(p);}
+ double getLeaderLength() const {return getRa40();} /*!< Leader length, code 40 */
+ void setLeaderLength(const double d) {setRa40(d);}
+
+protected:
+ virtual bool parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs=0);
+};
+
+//! Class to handle radial dimension entity
+/*!
+* Class to handle aligned, linear or rotated dimension entity
+* @author Rallaz
+*/
+class DRW_DimDiametric : public DRW_Dimension {
+ SETENTFRIENDS
+public:
+ DRW_DimDiametric() {
+ eType = DRW::DIMDIAMETRIC;
+ type = 3;
+ }
+ DRW_DimDiametric(const DRW_Dimension& d): DRW_Dimension(d) {
+ eType = DRW::DIMDIAMETRIC;
+ }
+
+ DRW_Coord getDiameter1Point() const {return getPt5();} /*!< First definition point for diameter, code 15, 25 & 35 */
+ void setDiameter1Point(const DRW_Coord p){setPt5(p);}
+ DRW_Coord getDiameter2Point() const {return getDefPoint();} /*!< Oposite point for diameter, code 10, 20 & 30 */
+ void setDiameter2Point(const DRW_Coord p){setDefPoint(p);}
+ double getLeaderLength() const {return getRa40();} /*!< Leader length, code 40 */
+ void setLeaderLength(const double d) {setRa40(d);}
+
+protected:
+ virtual bool parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs=0);
+};
+
+//! Class to handle angular dimension entity
+/*!
+* Class to handle angular dimension entity
+* @author Rallaz
+*/
+class DRW_DimAngular : public DRW_Dimension {
+ SETENTFRIENDS
+public:
+ DRW_DimAngular() {
+ eType = DRW::DIMANGULAR;
+ type = 2;
+ }
+ DRW_DimAngular(const DRW_Dimension& d): DRW_Dimension(d) {
+ eType = DRW::DIMANGULAR;
+ }
+
+ DRW_Coord getFirstLine1() const {return getPt3();} /*!< Definition point line 1-1, code 13, 23 & 33 */
+ void setFirstLine1(const DRW_Coord p) {setPt3(p);}
+ DRW_Coord getFirstLine2() const {return getPt4();} /*!< Definition point line 1-2, code 14, 24 & 34 */
+ void setFirstLine2(const DRW_Coord p) {setPt4(p);}
+ DRW_Coord getSecondLine1() const {return getPt5();} /*!< Definition point line 2-1, code 15, 25 & 35 */
+ void setSecondLine1(const DRW_Coord p) {setPt5(p);}
+ DRW_Coord getSecondLine2() const {return getDefPoint();} /*!< Definition point line 2-2, code 10, 20 & 30 */
+ void setSecondLine2(const DRW_Coord p){setDefPoint(p);}
+ DRW_Coord getDimPoint() const {return getPt6();} /*!< Dimension definition point, code 16, 26 & 36 */
+ void setDimPoint(const DRW_Coord p) {setPt6(p);}
+
+protected:
+ virtual bool parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs=0);
+};
+
+
+//! Class to handle angular 3p dimension entity
+/*!
+* Class to handle angular 3p dimension entity
+* @author Rallaz
+*/
+class DRW_DimAngular3p : public DRW_Dimension {
+ SETENTFRIENDS
+public:
+ DRW_DimAngular3p() {
+ eType = DRW::DIMANGULAR3P;
+ type = 5;
+ }
+ DRW_DimAngular3p(const DRW_Dimension& d): DRW_Dimension(d) {
+ eType = DRW::DIMANGULAR3P;
+ }
+
+ DRW_Coord getFirstLine() const {return getPt3();} /*!< Definition point line 1, code 13, 23 & 33 */
+ void setFirstLine(const DRW_Coord p) {setPt3(p);}
+ DRW_Coord getSecondLine() const {return getPt4();} /*!< Definition point line 2, code 14, 24 & 34 */
+ void setSecondLine(const DRW_Coord p) {setPt4(p);}
+ DRW_Coord getVertexPoint() const {return getPt5();} /*!< Vertex point, code 15, 25 & 35 */
+ void SetVertexPoint(const DRW_Coord p) {setPt5(p);}
+ DRW_Coord getDimPoint() const {return getDefPoint();} /*!< Dimension definition point, code 10, 20 & 30 */
+ void setDimPoint(const DRW_Coord p) {setDefPoint(p);}
+
+protected:
+ virtual bool parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs=0);
+};
+
+//! Class to handle ordinate dimension entity
+/*!
+* Class to handle ordinate dimension entity
+* @author Rallaz
+*/
+class DRW_DimOrdinate : public DRW_Dimension {
+ SETENTFRIENDS
+public:
+ DRW_DimOrdinate() {
+ eType = DRW::DIMORDINATE;
+ type = 6;
+ }
+ DRW_DimOrdinate(const DRW_Dimension& d): DRW_Dimension(d) {
+ eType = DRW::DIMORDINATE;
+ }
+
+ DRW_Coord getOriginPoint() const {return getDefPoint();} /*!< Origin definition point, code 10, 20 & 30 */
+ void setOriginPoint(const DRW_Coord p) {setDefPoint(p);}
+ DRW_Coord getFirstLine() const {return getPt3();} /*!< Feature location point, code 13, 23 & 33 */
+ void setFirstLine(const DRW_Coord p) {setPt3(p);}
+ DRW_Coord getSecondLine() const {return getPt4();} /*!< Leader end point, code 14, 24 & 34 */
+ void setSecondLine(const DRW_Coord p) {setPt4(p);}
+
+protected:
+ virtual bool parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs=0);
+};
+
+
+//! Class to handle leader entity
+/*!
+* Class to handle leader entity
+* @author Rallaz
+*/
+class DRW_Leader : public DRW_Entity {
+ SETENTFRIENDS
+public:
+ DRW_Leader() {
+ eType = DRW::LEADER;
+ flag = 3;
+ hookflag = vertnum = leadertype = 0;
+ extrusionPoint.x = extrusionPoint.y = 0.0;
+ arrow = 1;
+ extrusionPoint.z = 1.0;
+ }
+ ~DRW_Leader() {
+ for(DRW_Coord *item : vertexlist) delete item;
+ }
+
+ virtual void applyExtrusion(){}
+
+protected:
+ void parseCode(int code, dxfReader *reader);
+ virtual bool parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs=0);
+
+public:
+ UTF8STRING style; /*!< Dimension style name, code 3 */
+ int arrow; /*!< Arrowhead flag, code 71, 0=Disabled; 1=Enabled */
+ int leadertype; /*!< Leader path type, code 72, 0=Straight line segments; 1=Spline */
+ int flag; /*!< Leader creation flag, code 73, default 3 */
+ int hookline; /*!< Hook line direction flag, code 74, default 1 */
+ int hookflag; /*!< Hook line flag, code 75 */
+ double textheight; /*!< Text annotation height, code 40 */
+ double textwidth; /*!< Text annotation width, code 41 */
+ int vertnum; /*!< Number of vertices, code 76 */
+ int coloruse; /*!< Color to use if leader's DIMCLRD = BYBLOCK, code 77 */
+ duint32 annotHandle; /*!< Hard reference to associated annotation, code 340 */
+ DRW_Coord extrusionPoint; /*!< Normal vector, code 210, 220 & 230 */
+ DRW_Coord horizdir; /*!< "Horizontal" direction for leader, code 211, 221 & 231 */
+ DRW_Coord offsetblock; /*!< Offset of last leader vertex from block, code 212, 222 & 232 */
+ DRW_Coord offsettext; /*!< Offset of last leader vertex from annotation, code 213, 223 & 233 */
+
+ std::vector<DRW_Coord *> vertexlist; /*!< vertex points list, code 10, 20 & 30 */
+
+private:
+ DRW_Coord *vertexpoint; /*!< current control point to add data */
+ dwgHandle dimStyleH;
+ dwgHandle AnnotH;
+};
+
+//! Class to handle viewport entity
+/*!
+* Class to handle viewport entity
+* @author Rallaz
+*/
+class DRW_Viewport : public DRW_Point {
+ SETENTFRIENDS
+public:
+ DRW_Viewport() {
+ eType = DRW::VIEWPORT;
+ vpstatus = 0;
+ pswidth = 205;
+ psheight = 156;
+ centerPX = 128.5;
+ centerPY = 97.5;
+ }
+
+ virtual void applyExtrusion(){}
+
+protected:
+ void parseCode(int code, dxfReader *reader);
+ virtual bool parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs=0);
+
+public:
+ double pswidth; /*!< Width in paper space units, code 40 */
+ double psheight; /*!< Height in paper space units, code 41 */
+ int vpstatus; /*!< Viewport status, code 68 */
+ int vpID; /*!< Viewport ID, code 69 */
+ double centerPX; /*!< view center point X, code 12 */
+ double centerPY; /*!< view center point Y, code 22 */
+ double snapPX; /*!< Snap base point X, code 13 */
+ double snapPY; /*!< Snap base point Y, code 23 */
+ double snapSpPX; /*!< Snap spacing X, code 14 */
+ double snapSpPY; /*!< Snap spacing Y, code 24 */
+ //TODO: complete in dxf
+ DRW_Coord viewDir; /*!< View direction vector, code 16, 26 & 36 */
+ DRW_Coord viewTarget; /*!< View target point, code 17, 27, 37 */
+ double viewLength; /*!< Perspective lens length, code 42 */
+ double frontClip; /*!< Front clip plane Z value, code 43 */
+ double backClip; /*!< Back clip plane Z value, code 44 */
+ double viewHeight; /*!< View height in model space units, code 45 */
+ double snapAngle; /*!< Snap angle, code 50 */
+ double twistAngle; /*!< view twist angle, code 51 */
+
+private:
+ duint32 frozenLyCount;
+};//RLZ: missing 15,25, 72, 331, 90, 340, 1, 281, 71, 74, 110, 120, 130, 111, 121,131, 112,122, 132, 345,346, and more...
+
+//used //DRW_Coord basePoint; /*!< base point, code 10, 20 & 30 */
+
+//double thickness; /*!< thickness, code 39 */
+//DRW_Coord extPoint; /*!< Dir extrusion normal vector, code 210, 220 & 230 */
+//enum DRW::ETYPE eType; /*!< enum: entity type, code 0 */
+//duint32 handle; /*!< entity identifier, code 5 */
+//std::list<std::list<DRW_Variant> > appData; /*!< list of application data, code 102 */
+//duint32 parentHandle; /*!< Soft-pointer ID/handle to owner BLOCK_RECORD object, code 330 */
+//DRW::Space space; /*!< space indicator, code 67*/
+//UTF8STRING layer; /*!< layer name, code 8 */
+//UTF8STRING lineType; /*!< line type, code 6 */
+//duint32 material; /*!< hard pointer id to material object, code 347 */
+//int color; /*!< entity color, code 62 */
+//enum DRW_LW_Conv::lineWidth lWeight; /*!< entity lineweight, code 370 */
+//double ltypeScale; /*!< linetype scale, code 48 */
+//bool visible; /*!< entity visibility, code 60 */
+//int numProxyGraph; /*!< Number of bytes in proxy graphics, code 92 */
+//std::string proxyGraphics; /*!< proxy graphics bytes, code 310 */
+//int color24; /*!< 24-bit color, code 420 */
+//std::string colorName; /*!< color name, code 430 */
+//int transparency; /*!< transparency, code 440 */
+//int plotStyle; /*!< hard pointer id to plot style object, code 390 */
+//DRW::ShadowMode shadow; /*!< shadow mode, code 284 */
+//bool haveExtrusion; /*!< set to true if the entity have extrusion*/
+
+#endif
+
+// EOF
--- /dev/null
+/******************************************************************************
+** libDXFrw - Library to read/write DXF files (ascii & binary) **
+** **
+** Copyright (C) 2011-2015 José F. Soriano, rallazz@gmail.com **
+** **
+** This library is free software, licensed under the terms of the GNU **
+** General Public License as published by the Free Software Foundation, **
+** either version 2 of the License, or (at your option) any later version. **
+** You should have received a copy of the GNU General Public License **
+** along with this program. If not, see <http://www.gnu.org/licenses/>. **
+******************************************************************************/
+
+#include "drw_header.h"
+#include "intern/dxfreader.h"
+#include "intern/dxfwriter.h"
+#include "intern/drw_dbg.h"
+#include "intern/dwgbuffer.h"
+
+DRW_Header::DRW_Header() {
+ linetypeCtrl = layerCtrl = styleCtrl = dimstyleCtrl = appidCtrl = 0;
+ blockCtrl = viewCtrl = ucsCtrl = vportCtrl = vpEntHeaderCtrl = 0;
+ version = DRW::AC1021;
+}
+
+void DRW_Header::addComment(std::string c){
+ if (!comments.empty())
+ comments += '\n';
+ comments += c;
+}
+
+void DRW_Header::parseCode(int code, dxfReader *reader){
+ switch (code) {
+ case 9:
+ curr = new DRW_Variant();
+ name = reader->getString();
+ if (version < DRW::AC1015 && name == "$DIMUNIT")
+ name="$DIMLUNIT";
+ vars[name]=curr;
+ break;
+ case 1:
+ curr->addString(reader->getUtf8String());
+ if (name =="$ACADVER") {
+ reader->setVersion(curr->content.s, true);
+ version = reader->getVersion();
+ }
+ curr->code = code;
+ break;
+ case 2:
+ curr->addString(reader->getUtf8String());
+ curr->code = code;
+ break;
+ case 3:
+ curr->addString(reader->getUtf8String());
+ if (name =="$DWGCODEPAGE") {
+ reader->setCodePage(curr->content.s);
+ curr->addString(reader->getCodePage());
+ }
+ curr->code = code;
+ break;
+ case 6:
+ curr->addString(reader->getUtf8String());
+ curr->code = code;
+ break;
+ case 7:
+ curr->addString(reader->getUtf8String());
+ curr->code = code;
+ break;
+ case 8:
+ curr->addString(reader->getUtf8String());
+ curr->code = code;
+ break;
+ case 10:
+ curr->addCoord();
+ curr->setCoordX(reader->getDouble());
+ curr->code = code;
+ break;
+ case 20:
+ curr->setCoordY(reader->getDouble());
+ break;
+ case 30:
+ curr->setCoordZ(reader->getDouble());
+ curr->code = code;
+ break;
+ case 40:
+ curr->addDouble(reader->getDouble());
+ curr->code = code;
+ break;
+ case 50:
+ curr->addDouble(reader->getDouble());
+ curr->code = code;
+ break;
+ case 62:
+ curr->addInt(reader->getInt32());
+ curr->code = code;
+ break;
+ case 70:
+ curr->addInt(reader->getInt32());
+ curr->code = code;
+ break;
+ case 280:
+ curr->addInt(reader->getInt32());
+ curr->code = code;
+ break;
+ case 290:
+ curr->addInt(reader->getInt32());
+ curr->code = code;
+ break;
+ case 370:
+ curr->addInt(reader->getInt32());
+ curr->code = code;
+ break;
+ case 380:
+ curr->addInt(reader->getInt32());
+ curr->code = code;
+ break;
+ case 390:
+ curr->addString(reader->getUtf8String());
+ curr->code = code;
+ break;
+ default:
+ break;
+ }
+}
+
+void DRW_Header::write(dxfWriter *writer, DRW::Version ver){
+/*RLZ: TODO complete all vars to AC1024*/
+ double varDouble;
+ int varInt;
+ std::string varStr;
+ DRW_Coord varCoord;
+ writer->writeString(2, "HEADER");
+ writer->writeString(9, "$ACADVER");
+ switch (ver) {
+ case DRW::AC1006: //unsupported version acad 10
+ case DRW::AC1009: //acad 11 & 12
+ varStr = "AC1009";
+ break;
+ case DRW::AC1012: //unsupported version acad 13
+ case DRW::AC1014: //acad 14
+ varStr = "AC1014";
+ break;
+ case DRW::AC1015: //acad 2000
+ varStr = "AC1015";
+ break;
+ case DRW::AC1018: //acad 2004
+ varStr = "AC1018";
+ break;
+/* case DRW::AC1021: //acad 2007
+ varStr = "AC1021";
+ break;*/
+ case DRW::AC1024: //acad 2010
+ varStr = "AC1024";
+ break;
+ case DRW::AC1027: //acad 2013
+ varStr = "AC1027";
+ break;
+ default: //acad 2007 default version
+ varStr = "AC1021";
+ break;
+ }
+ writer->writeString(1, varStr);
+ writer->setVersion(&varStr, true);
+
+ getStr("$ACADVER", &varStr);
+ getStr("$ACADMAINTVER", &varStr);
+
+ if (!getStr("$DWGCODEPAGE", &varStr)) {
+ varStr = "ANSI_1252";
+ }
+ writer->writeString(9, "$DWGCODEPAGE");
+ writer->setCodePage(&varStr);
+ writer->writeString(3, writer->getCodePage() );
+ writer->writeString(9, "$INSBASE");
+ if (getCoord("$INSBASE", &varCoord)) {
+ writer->writeDouble(10, varCoord.x);
+ writer->writeDouble(20, varCoord.y);
+ writer->writeDouble(30, varCoord.z);
+ } else {
+ writer->writeDouble(10, 0.0);
+ writer->writeDouble(20, 0.0);
+ writer->writeDouble(30, 0.0);
+ }
+ writer->writeString(9, "$EXTMIN");
+ if (getCoord("$EXTMIN", &varCoord)) {
+ writer->writeDouble(10, varCoord.x);
+ writer->writeDouble(20, varCoord.y);
+ writer->writeDouble(30, varCoord.z);
+ } else {
+ writer->writeDouble(10, 1.0000000000000000E+020);
+ writer->writeDouble(20, 1.0000000000000000E+020);
+ writer->writeDouble(30, 1.0000000000000000E+020);
+ }
+ writer->writeString(9, "$EXTMAX");
+ if (getCoord("$EXTMAX", &varCoord)) {
+ writer->writeDouble(10, varCoord.x);
+ writer->writeDouble(20, varCoord.y);
+ writer->writeDouble(30, varCoord.z);
+ } else {
+ writer->writeDouble(10, -1.0000000000000000E+020);
+ writer->writeDouble(20, -1.0000000000000000E+020);
+ writer->writeDouble(30, -1.0000000000000000E+020);
+ }
+ writer->writeString(9, "$LIMMIN");
+ if (getCoord("$LIMMIN", &varCoord)) {
+ writer->writeDouble(10, varCoord.x);
+ writer->writeDouble(20, varCoord.y);
+ } else {
+ writer->writeDouble(10, 0.0);
+ writer->writeDouble(20, 0.0);
+ }
+ writer->writeString(9, "$LIMMAX");
+ if (getCoord("$LIMMAX", &varCoord)) {
+ writer->writeDouble(10, varCoord.x);
+ writer->writeDouble(20, varCoord.y);
+ } else {
+ writer->writeDouble(10, 420.0);
+ writer->writeDouble(20, 297.0);
+ }
+ writer->writeString(9, "$ORTHOMODE");
+ if (getInt("$ORTHOMODE", &varInt))
+ writer->writeInt16(70, varInt);
+ else
+ writer->writeInt16(70, 0);
+ writer->writeString(9, "$REGENMODE");
+ if (getInt("$REGENMODE", &varInt))
+ writer->writeInt16(70, varInt);
+ else
+ writer->writeInt16(70, 1);
+ writer->writeString(9, "$FILLMODE");
+ if (getInt("$FILLMODE", &varInt))
+ writer->writeInt16(70, varInt);
+ else
+ writer->writeInt16(70, 1);
+ writer->writeString(9, "$QTEXTMODE");
+ if (getInt("$QTEXTMODE", &varInt))
+ writer->writeInt16(70, varInt);
+ else
+ writer->writeInt16(70, 0);
+ writer->writeString(9, "$MIRRTEXT");
+ if (getInt("$MIRRTEXT", &varInt))
+ writer->writeInt16(70, varInt);
+ else
+ writer->writeInt16(70, 0);
+ if (ver == DRW::AC1009){
+ writer->writeString(9, "$DRAGMODE");
+ if (getInt("$DRAGMODE", &varInt))
+ writer->writeInt16(70, varInt);
+ else
+ writer->writeInt16(70, 2);
+ }
+ writer->writeString(9, "$LTSCALE");
+ if (getDouble("$LTSCALE", &varDouble))
+ writer->writeDouble(40, varDouble);
+ else
+ writer->writeDouble(40, 1.0);
+ if (ver == DRW::AC1009){
+ writer->writeString(9, "$OSMODE");
+ if (getInt("$OSMODE", &varInt))
+ writer->writeInt16(70, varInt);
+ else
+ writer->writeInt16(70, 0);
+ }
+ writer->writeString(9, "$ATTMODE");
+ if (getInt("$ATTMODE", &varInt))
+ writer->writeInt16(70, varInt);
+ else
+ writer->writeInt16(70, 0);
+ writer->writeString(9, "$TEXTSIZE");
+ if (getDouble("$TEXTSIZE", &varDouble))
+ writer->writeDouble(40, varDouble);
+ else
+ writer->writeDouble(40, 2.5);
+ writer->writeString(9, "$TRACEWID");
+ if (getDouble("$TRACEWID", &varDouble))
+ writer->writeDouble(40, varDouble);
+ else
+ writer->writeDouble(40, 15.68);
+ writer->writeString(9, "$TEXTSTYLE");
+ if (getStr("$TEXTSTYLE", &varStr))
+ if (ver == DRW::AC1009)
+ writer->writeUtf8Caps(7, varStr);
+ else
+ writer->writeUtf8String(7, varStr);
+ else
+ writer->writeString(7, "STANDARD");
+ writer->writeString(9, "$CLAYER");
+ if (getStr("$CLAYER", &varStr))
+ if (ver == DRW::AC1009)
+ writer->writeUtf8Caps(8, varStr);
+ else
+ writer->writeUtf8String(8, varStr);
+ else
+ writer->writeString(8, "0");
+ writer->writeString(9, "$CELTYPE");
+ if (getStr("$CELTYPE", &varStr))
+ if (ver == DRW::AC1009)
+ writer->writeUtf8Caps(6, varStr);
+ else
+ writer->writeUtf8String(6, varStr);
+ else
+ writer->writeString(6, "BYLAYER");
+ writer->writeString(9, "$CECOLOR");
+ if (getInt("$CECOLOR", &varInt))
+ writer->writeInt16(62, varInt);
+ else
+ writer->writeInt16(62, 256);
+ if (ver > DRW::AC1009){
+ writer->writeString(9, "$CELTSCALE");
+ if (getDouble("$CELTSCALE", &varDouble))
+ writer->writeDouble(40, varDouble);
+ else
+ writer->writeDouble(40, 1.0);
+ writer->writeString(9, "$DISPSILH");
+ if (getInt("$DISPSILH", &varInt))
+ writer->writeInt16(70, varInt);
+ else
+ writer->writeInt16(70, 0);
+ }
+
+ writer->writeString(9, "$DIMSCALE");
+ if (getDouble("$DIMSCALE", &varDouble))
+ writer->writeDouble(40, varDouble);
+ else
+ writer->writeDouble(40, 1.0);
+ writer->writeString(9, "$DIMASZ");
+ if (getDouble("$DIMASZ", &varDouble))
+ writer->writeDouble(40, varDouble);
+ else
+ writer->writeDouble(40, 2.5);
+ writer->writeString(9, "$DIMEXO");
+ if (getDouble("$DIMEXO", &varDouble))
+ writer->writeDouble(40, varDouble);
+ else
+ writer->writeDouble(40, 0.625);
+ writer->writeString(9, "$DIMDLI");
+ if (getDouble("$DIMDLI", &varDouble))
+ writer->writeDouble(40, varDouble);
+ else
+ writer->writeDouble(40, 3.75);
+ writer->writeString(9, "$DIMRND");
+ if (getDouble("$DIMRND", &varDouble))
+ writer->writeDouble(40, varDouble);
+ else
+ writer->writeDouble(40, 0.0);
+ writer->writeString(9, "$DIMDLE");
+ if (getDouble("$DIMDLE", &varDouble))
+ writer->writeDouble(40, varDouble);
+ else
+ writer->writeDouble(40, 0.0);
+ writer->writeString(9, "$DIMEXE");
+ if (getDouble("$DIMEXE", &varDouble))
+ writer->writeDouble(40, varDouble);
+ else
+ writer->writeDouble(40, 1.25);
+ writer->writeString(9, "$DIMTP");
+ if (getDouble("$DIMTP", &varDouble))
+ writer->writeDouble(40, varDouble);
+ else
+ writer->writeDouble(40, 0.0);
+ writer->writeString(9, "$DIMTM");
+ if (getDouble("$DIMTM", &varDouble))
+ writer->writeDouble(40, varDouble);
+ else
+ writer->writeDouble(40, 0.0);
+ writer->writeString(9, "$DIMTXT");
+ if (getDouble("$DIMTXT", &varDouble))
+ writer->writeDouble(40, varDouble);
+ else
+ writer->writeDouble(40, 2.5);
+ writer->writeString(9, "$DIMCEN");
+ if (getDouble("$DIMCEN", &varDouble))
+ writer->writeDouble(40, varDouble);
+ else
+ writer->writeDouble(40, 2.5);
+ writer->writeString(9, "$DIMTSZ");
+ if (getDouble("$DIMTSZ", &varDouble))
+ writer->writeDouble(40, varDouble);
+ else
+ writer->writeDouble(40, 0.0);
+ writer->writeString(9, "$DIMTOL");
+ if (getInt("$DIMTOL", &varInt))
+ writer->writeInt16(70, varInt);
+ else
+ writer->writeInt16(70, 0);
+ writer->writeString(9, "$DIMLIM");
+ if (getInt("$DIMLIM", &varInt))
+ writer->writeInt16(70, varInt);
+ else
+ writer->writeInt16(70, 0);
+ writer->writeString(9, "$DIMTIH");
+ if (getInt("$DIMTIH", &varInt))
+ writer->writeInt16(70, varInt);
+ else
+ writer->writeInt16(70, 0);
+ writer->writeString(9, "$DIMTOH");
+ if (getInt("$DIMTOH", &varInt))
+ writer->writeInt16(70, varInt);
+ else
+ writer->writeInt16(70, 0);
+ writer->writeString(9, "$DIMSE1");
+ if (getInt("$DIMSE1", &varInt))
+ writer->writeInt16(70, varInt);
+ else
+ writer->writeInt16(70, 0);
+ writer->writeString(9, "$DIMSE2");
+ if (getInt("$DIMSE2", &varInt))
+ writer->writeInt16(70, varInt);
+ else
+ writer->writeInt16(70, 0);
+ writer->writeString(9, "$DIMTAD");
+ if (getInt("$DIMTAD", &varInt))
+ writer->writeInt16(70, varInt);
+ else
+ writer->writeInt16(70, 1);
+ writer->writeString(9, "$DIMZIN");
+ if (getInt("$DIMZIN", &varInt))
+ writer->writeInt16(70, varInt);
+ else
+ writer->writeInt16(70, 8);
+ writer->writeString(9, "$DIMBLK");
+ if (getStr("$DIMBLK", &varStr))
+ if (ver == DRW::AC1009)
+ writer->writeUtf8Caps(1, varStr);
+ else
+ writer->writeUtf8String(1, varStr);
+ else
+ writer->writeString(1, "");
+ writer->writeString(9, "$DIMASO");
+ if (getInt("$DIMASO", &varInt))
+ writer->writeInt16(70, varInt);
+ else
+ writer->writeInt16(70, 1);
+ writer->writeString(9, "$DIMSHO");
+ if (getInt("$DIMSHO", &varInt))
+ writer->writeInt16(70, varInt);
+ else
+ writer->writeInt16(70, 1);
+ writer->writeString(9, "$DIMPOST");
+ if (getStr("$DIMPOST", &varStr))
+ if (ver == DRW::AC1009)
+ writer->writeUtf8Caps(1, varStr);
+ else
+ writer->writeUtf8String(1, varStr);
+ else
+ writer->writeString(1, "");
+ writer->writeString(9, "$DIMAPOST");
+ if (getStr("$DIMAPOST", &varStr))
+ if (ver == DRW::AC1009)
+ writer->writeUtf8Caps(1, varStr);
+ else
+ writer->writeUtf8String(1, varStr);
+ else
+ writer->writeString(1, "");
+ writer->writeString(9, "$DIMALT");
+ if (getInt("$DIMALT", &varInt))
+ writer->writeInt16(70, varInt);
+ else
+ writer->writeInt16(70, 0);
+ writer->writeString(9, "$DIMALTD");
+ if (getInt("$DIMALTD", &varInt))
+ writer->writeInt16(70, varInt);
+ else
+ writer->writeInt16(70, 3);
+ writer->writeString(9, "$DIMALTF");
+ if (getDouble("$DIMALTF", &varDouble))
+ writer->writeDouble(40, varDouble);
+ else
+ writer->writeDouble(40, 0.03937);
+ writer->writeString(9, "$DIMLFAC");
+ if (getDouble("$DIMLFAC", &varDouble))
+ writer->writeDouble(40, varDouble);
+ else
+ writer->writeDouble(40, 1.0);
+ writer->writeString(9, "$DIMTOFL");
+ if (getInt("$DIMTOFL", &varInt))
+ writer->writeInt16(70, varInt);
+ else
+ writer->writeInt16(70, 1);
+ writer->writeString(9, "$DIMTVP");
+ if (getDouble("$DIMTVP", &varDouble))
+ writer->writeDouble(40, varDouble);
+ else
+ writer->writeDouble(40, 0.0);
+ writer->writeString(9, "$DIMTIX");
+ if (getInt("$DIMTIX", &varInt))
+ writer->writeInt16(70, varInt);
+ else
+ writer->writeInt16(70, 0);
+ writer->writeString(9, "$DIMSOXD");
+ if (getInt("$DIMSOXD", &varInt))
+ writer->writeInt16(70, varInt);
+ else
+ writer->writeInt16(70, 0);
+ writer->writeString(9, "$DIMSAH");
+ if (getInt("$DIMSAH", &varInt))
+ writer->writeInt16(70, varInt);
+ else
+ writer->writeInt16(70, 0);
+ writer->writeString(9, "$DIMBLK1");
+ if (getStr("$DIMBLK1", &varStr))
+ if (ver == DRW::AC1009)
+ writer->writeUtf8Caps(1, varStr);
+ else
+ writer->writeUtf8String(1, varStr);
+ else
+ writer->writeString(1, "");
+ writer->writeString(9, "$DIMBLK2");
+ if (getStr("$DIMBLK2", &varStr))
+ if (ver == DRW::AC1009)
+ writer->writeUtf8Caps(1, varStr);
+ else
+ writer->writeUtf8String(1, varStr);
+ else
+ writer->writeString(1, "");
+ writer->writeString(9, "$DIMSTYLE");
+ if (getStr("$DIMSTYLE", &varStr))
+ if (ver == DRW::AC1009)
+ writer->writeUtf8Caps(2, varStr);
+ else
+ writer->writeUtf8String(2, varStr);
+ else
+ writer->writeString(2, "STANDARD");
+ writer->writeString(9, "$DIMCLRD");
+ if (getInt("$DIMCLRD", &varInt))
+ writer->writeInt16(70, varInt);
+ else
+ writer->writeInt16(70, 0);
+ writer->writeString(9, "$DIMCLRE");
+ if (getInt("$DIMCLRE", &varInt))
+ writer->writeInt16(70, varInt);
+ else
+ writer->writeInt16(70, 0);
+ writer->writeString(9, "$DIMCLRT");
+ if (getInt("$DIMCLRT", &varInt))
+ writer->writeInt16(70, varInt);
+ else
+ writer->writeInt16(70, 0);
+ writer->writeString(9, "$DIMTFAC");
+ if (getDouble("$DIMTFAC", &varDouble))
+ writer->writeDouble(40, varDouble);
+ else
+ writer->writeDouble(40, 1.0);
+ writer->writeString(9, "$DIMGAP");
+ if (getDouble("$DIMGAP", &varDouble))
+ writer->writeDouble(40, varDouble);
+ else
+ writer->writeDouble(40, 0.625);
+ //post r12 dim vars
+ if (ver > DRW::AC1009) {
+ writer->writeString(9, "$DIMJUST");
+ if (getInt("$DIMJUST", &varInt))
+ writer->writeInt16(70, varInt);
+ else
+ writer->writeInt16(70, 0);
+ writer->writeString(9, "$DIMSD1");
+ if (getInt("$DIMSD1", &varInt))
+ writer->writeInt16(70, varInt);
+ else
+ writer->writeInt16(70, 0);
+ writer->writeString(9, "$DIMSD2");
+ if (getInt("$DIMSD2", &varInt))
+ writer->writeInt16(70, varInt);
+ else
+ writer->writeInt16(70, 0);
+ writer->writeString(9, "$DIMTOLJ");
+ if (getInt("$DIMTOLJ", &varInt))
+ writer->writeInt16(70, varInt);
+ else
+ writer->writeInt16(70, 0);
+ writer->writeString(9, "$DIMTZIN");
+ if (getInt("$DIMTZIN", &varInt))
+ writer->writeInt16(70, varInt);
+ else
+ writer->writeInt16(70, 8);
+ writer->writeString(9, "$DIMALTZ");
+ if (getInt("$DIMALTZ", &varInt))
+ writer->writeInt16(70, varInt);
+ else
+ writer->writeInt16(70, 0);
+ writer->writeString(9, "$DIMALTTZ");
+ if (getInt("$DIMALTTZ", &varInt))
+ writer->writeInt16(70, varInt);
+ else
+ writer->writeInt16(70, 0);
+ writer->writeString(9, "$DIMUPT");
+ if (getInt("$DIMUPT", &varInt))
+ writer->writeInt16(70, varInt);
+ else
+ writer->writeInt16(70, 0);
+ writer->writeString(9, "$DIMDEC");
+ if (getInt("$DIMDEC", &varInt))
+ writer->writeInt16(70, varInt);
+ else
+ writer->writeInt16(70, 2);
+ writer->writeString(9, "$DIMTDEC");
+ if (getInt("$DIMTDEC", &varInt))
+ writer->writeInt16(70, varInt);
+ else
+ writer->writeInt16(70, 2);
+ writer->writeString(9, "$DIMALTU");
+ if (getInt("$DIMALTU", &varInt))
+ writer->writeInt16(70, varInt);
+ else
+ writer->writeInt16(70, 2);
+ writer->writeString(9, "$DIMALTTD");
+ if (getInt("$DIMALTTD", &varInt))
+ writer->writeInt16(70, varInt);
+ else
+ writer->writeInt16(70, 3);
+ writer->writeString(9, "$DIMTXSTY");
+ if (getStr("$DIMTXSTY", &varStr))
+ if (ver == DRW::AC1009)
+ writer->writeUtf8Caps(7, varStr);
+ else
+ writer->writeUtf8String(7, varStr);
+ else
+ writer->writeString(7, "STANDARD");
+ writer->writeString(9, "$DIMAUNIT");
+ if (getInt("$DIMAUNIT", &varInt))
+ writer->writeInt16(70, varInt);
+ else
+ writer->writeInt16(70, 0);
+ writer->writeString(9, "$DIMADEC");
+ if (getInt("$DIMADEC", &varInt))
+ writer->writeInt16(70, varInt);
+ else
+ writer->writeInt16(70, 0);
+ writer->writeString(9, "$DIMALTRND");
+ if (getDouble("$DIMALTRND", &varDouble))
+ writer->writeDouble(40, varDouble);
+ else
+ writer->writeDouble(40, 0.0);
+ writer->writeString(9, "$DIMAZIN");
+ if (getInt("$DIMAZIN", &varInt))
+ writer->writeInt16(70, varInt);
+ else
+ writer->writeInt16(70, 0);
+ writer->writeString(9, "$DIMDSEP");
+ if (getInt("$DIMDSEP", &varInt))
+ writer->writeInt16(70, varInt);
+ else
+ writer->writeInt16(70, 44);
+ writer->writeString(9, "$DIMATFIT");
+ if (getInt("$DIMATFIT", &varInt))
+ writer->writeInt16(70, varInt);
+ else
+ writer->writeInt16(70, 3);
+ writer->writeString(9, "$DIMFRAC");
+ if (getInt("$DIMFRAC", &varInt))
+ writer->writeInt16(70, varInt);
+ else
+ writer->writeInt16(70, 0);
+ writer->writeString(9, "$DIMLDRBLK");
+ if (getStr("$DIMLDRBLK", &varStr))
+ if (ver == DRW::AC1009)
+ writer->writeUtf8Caps(1, varStr);
+ else
+ writer->writeUtf8String(1, varStr);
+ else
+ writer->writeString(1, "STANDARD");
+ //verify if exist "$DIMLUNIT" or obsolete "$DIMUNIT" (pre v2000)
+ if ( !getInt("$DIMLUNIT", &varInt) ){
+ if (!getInt("$DIMUNIT", &varInt))
+ varInt = 2;
+ }
+ //verify valid values from 1 to 6
+ if (varInt<1 || varInt>6)
+ varInt = 2;
+ if (ver > DRW::AC1014) {
+ writer->writeString(9, "$DIMLUNIT");
+ writer->writeInt16(70, varInt);
+ } else {
+ writer->writeString(9, "$DIMUNIT");
+ writer->writeInt16(70, varInt);
+ }
+ writer->writeString(9, "$DIMLWD");
+ if (getInt("$DIMLWD", &varInt))
+ writer->writeInt16(70, varInt);
+ else
+ writer->writeInt16(70, -2);
+ writer->writeString(9, "$DIMLWE");
+ if (getInt("$DIMLWE", &varInt))
+ writer->writeInt16(70, varInt);
+ else
+ writer->writeInt16(70, -2);
+ writer->writeString(9, "$DIMTMOVE");
+ if (getInt("$DIMTMOVE", &varInt))
+ writer->writeInt16(70, varInt);
+ else
+ writer->writeInt16(70, 0);
+
+ if (ver > DRW::AC1018) {// and post v2004 dim vars
+ writer->writeString(9, "$DIMFXL");
+ if (getDouble("$DIMFXL", &varDouble))
+ writer->writeDouble(40, varDouble);
+ else
+ writer->writeDouble(40, 1.0);
+ writer->writeString(9, "$DIMFXLON");
+ if (getInt("$DIMFXLON", &varInt))
+ writer->writeInt16(70, varInt);
+ else
+ writer->writeInt16(70, 0);
+ writer->writeString(9, "$DIMJOGANG");
+ if (getDouble("$DIMJOGANG", &varDouble))
+ writer->writeDouble(40, varDouble);
+ else
+ writer->writeDouble(40, 0.7854);
+ writer->writeString(9, "$DIMTFILL");
+ if (getInt("$DIMTFILL", &varInt))
+ writer->writeInt16(70, varInt);
+ else
+ writer->writeInt16(70, 0);
+ writer->writeString(9, "$DIMTFILLCLR");
+ if (getInt("$DIMTFILLCLR", &varInt))
+ writer->writeInt16(70, varInt);
+ else
+ writer->writeInt16(70, 0);
+ writer->writeString(9, "$DIMARCSYM");
+ if (getInt("$DIMARCSYM", &varInt))
+ writer->writeInt16(70, varInt);
+ else
+ writer->writeInt16(70, 0);
+ writer->writeString(9, "$DIMLTYPE");
+ if (getStr("$DIMLTYPE", &varStr))
+ if (ver == DRW::AC1009)
+ writer->writeUtf8Caps(6, varStr);
+ else
+ writer->writeUtf8String(6, varStr);
+ else
+ writer->writeString(6, "");
+ writer->writeString(9, "$DIMLTEX1");
+ if (getStr("$DIMLTEX1", &varStr))
+ if (ver == DRW::AC1009)
+ writer->writeUtf8Caps(6, varStr);
+ else
+ writer->writeUtf8String(6, varStr);
+ else
+ writer->writeString(6, "");
+ writer->writeString(9, "$DIMLTEX2");
+ if (getStr("$DIMLTEX2", &varStr))
+ if (ver == DRW::AC1009)
+ writer->writeUtf8Caps(6, varStr);
+ else
+ writer->writeUtf8String(6, varStr);
+ else
+ writer->writeString(6, "");
+ if (ver > DRW::AC1021) {// and post v2007 dim vars
+ writer->writeString(9, "$DIMTXTDIRECTION");
+ if (getInt("$DIMTXTDIRECTION", &varInt))
+ writer->writeInt16(70, varInt);
+ else
+ writer->writeInt16(70, 0);
+ }
+ }// end post v2004 dim vars
+ }//end post r12 dim vars
+
+ writer->writeString(9, "$LUNITS");
+ if (getInt("$LUNITS", &varInt))
+ writer->writeInt16(70, varInt);
+ else
+ writer->writeInt16(70, 2);
+ writer->writeString(9, "$LUPREC");
+ if (getInt("$LUPREC", &varInt))
+ writer->writeInt16(70, varInt);
+ else
+ writer->writeInt16(70, 4);
+ writer->writeString(9, "$SKETCHINC");
+ if (getDouble("$SKETCHINC", &varDouble))
+ writer->writeDouble(40, varDouble);
+ else
+ writer->writeDouble(40, 1.0);
+ writer->writeString(9, "$FILLETRAD");
+ if (getDouble("$FILLETRAD", &varDouble))
+ writer->writeDouble(40, varDouble);
+ else
+ writer->writeDouble(40, 0.0);
+ writer->writeString(9, "$AUNITS");
+ if (getInt("$AUNITS", &varInt))
+ writer->writeInt16(70, varInt);
+ else
+ writer->writeInt16(70, 0);
+ writer->writeString(9, "$AUPREC");
+ if (getInt("$AUPREC", &varInt))
+ writer->writeInt16(70, varInt);
+ else
+ writer->writeInt16(70, 2);
+ writer->writeString(9, "$MENU");
+ if (getStr("$MENU", &varStr))
+ if (ver == DRW::AC1009)
+ writer->writeUtf8Caps(1, varStr);
+ else
+ writer->writeUtf8String(1, varStr);
+ else
+ writer->writeString(1, ".");
+ writer->writeString(9, "$ELEVATION");
+ if (getDouble("$ELEVATION", &varDouble))
+ writer->writeDouble(40, varDouble);
+ else
+ writer->writeDouble(40, 0.0);
+ writer->writeString(9, "$PELEVATION");
+ if (getDouble("$PELEVATION", &varDouble))
+ writer->writeDouble(40, varDouble);
+ else
+ writer->writeDouble(40, 0.0);
+ writer->writeString(9, "$THICKNESS");
+ if (getDouble("$THICKNESS", &varDouble))
+ writer->writeDouble(40, varDouble);
+ else
+ writer->writeDouble(40, 0.0);
+ writer->writeString(9, "$LIMCHECK");
+ if (getInt("$LIMCHECK", &varInt))
+ writer->writeInt16(70, varInt);
+ else
+ writer->writeInt16(70, 0);
+ if (ver < DRW::AC1015) {
+ writer->writeString(9, "$BLIPMODE");
+ if (getInt("$BLIPMODE", &varInt))
+ writer->writeInt16(70, varInt);
+ else
+ writer->writeInt16(70, 0);
+ }
+ writer->writeString(9, "$CHAMFERA");
+ if (getDouble("$CHAMFERA", &varDouble))
+ writer->writeDouble(40, varDouble);
+ else
+ writer->writeDouble(40, 0.0);
+ writer->writeString(9, "$CHAMFERB");
+ if (getDouble("$CHAMFERB", &varDouble))
+ writer->writeDouble(40, varDouble);
+ else
+ writer->writeDouble(40, 0.0);
+ if (ver > DRW::AC1009) {
+ writer->writeString(9, "$CHAMFERC");
+ if (getDouble("$CHAMFERC", &varDouble))
+ writer->writeDouble(40, varDouble);
+ else
+ writer->writeDouble(40, 0.0);
+ writer->writeString(9, "$CHAMFERD");
+ if (getDouble("$CHAMFERD", &varDouble))
+ writer->writeDouble(40, varDouble);
+ else
+ writer->writeDouble(40, 0.0);
+ }
+ writer->writeString(9, "$SKPOLY");
+ if (getInt("$SKPOLY", &varInt)) {
+ writer->writeInt16(70, varInt);
+ } else
+ writer->writeInt16(70, 0);
+ //rlz: todo, times
+ writer->writeString(9, "$USRTIMER");
+ if (getInt("$USRTIMER", &varInt)) {
+ writer->writeInt16(70, varInt);
+ } else
+ writer->writeInt16(70, 1);
+ writer->writeString(9, "$ANGBASE");
+ if (getDouble("$ANGBASE", &varDouble))
+ writer->writeDouble(50, varDouble);
+ else
+ writer->writeDouble(50, 0.0);
+ writer->writeString(9, "$ANGDIR");
+ if (getInt("$ANGDIR", &varInt)) {
+ writer->writeInt16(70, varInt);
+ } else
+ writer->writeInt16(70, 0);
+ writer->writeString(9, "$PDMODE");
+ if (getInt("$PDMODE", &varInt)) {
+ writer->writeInt16(70, varInt);
+ } else
+ writer->writeInt16(70, 34);
+ writer->writeString(9, "$PDSIZE");
+ if (getDouble("$PDSIZE", &varDouble))
+ writer->writeDouble(40, varDouble);
+ else
+ writer->writeDouble(40, 0.0);
+ writer->writeString(9, "$PLINEWID");
+ if (getDouble("$PLINEWID", &varDouble))
+ writer->writeDouble(40, varDouble);
+ else
+ writer->writeDouble(40, 0.0);
+ if (ver < DRW::AC1012) {
+ writer->writeString(9, "$COORDS");
+ if (getInt("$COORDS", &varInt)) {
+ writer->writeInt16(70, varInt);
+ } else
+ writer->writeInt16(70, 2);
+ }
+ writer->writeString(9, "$SPLFRAME");
+ if (getInt("$SPLFRAME", &varInt)) {
+ writer->writeInt16(70, varInt);
+ } else
+ writer->writeInt16(70, 0);
+ writer->writeString(9, "$SPLINETYPE");
+ if (getInt("$SPLINETYPE", &varInt)) {
+ writer->writeInt16(70, varInt);
+ } else
+ writer->writeInt16(70, 2);
+ writer->writeString(9, "$SPLINESEGS");
+ if (getInt("$SPLINESEGS", &varInt)) {
+ writer->writeInt16(70, varInt);
+ } else
+ writer->writeInt16(70, 8);
+ if (ver < DRW::AC1012) {
+ writer->writeString(9, "$ATTDIA");
+ if (getInt("$ATTDIA", &varInt)) {
+ writer->writeInt16(70, varInt);
+ } else
+ writer->writeInt16(70, 1);
+ writer->writeString(9, "$ATTREQ");
+ if (getInt("$ATTREQ", &varInt)) {
+ writer->writeInt16(70, varInt);
+ } else
+ writer->writeInt16(70, 1);
+ writer->writeString(9, "$HANDLING");
+ if (getInt("$HANDLING", &varInt)) {
+ writer->writeInt16(70, varInt);
+ } else
+ writer->writeInt16(70, 1);
+ }
+ writer->writeString(9, "$HANDSEED");
+ //RLZ dxfHex(5, 0xFFFF);
+ writer->writeString(5, "20000");
+ writer->writeString(9, "$SURFTAB1");
+ if (getInt("$SURFTAB1", &varInt)) {
+ writer->writeInt16(70, varInt);
+ } else
+ writer->writeInt16(70, 6);
+ writer->writeString(9, "$SURFTAB2");
+ if (getInt("$SURFTAB2", &varInt)) {
+ writer->writeInt16(70, varInt);
+ } else
+ writer->writeInt16(70, 6);
+ writer->writeString(9, "$SURFTYPE");
+ if (getInt("$SURFTYPE", &varInt)) {
+ writer->writeInt16(70, varInt);
+ } else
+ writer->writeInt16(70, 6);
+ writer->writeString(9, "$SURFU");
+ if (getInt("$SURFU", &varInt)) {
+ writer->writeInt16(70, varInt);
+ } else
+ writer->writeInt16(70, 6);
+ writer->writeString(9, "$SURFV");
+ if (getInt("$SURFV", &varInt)) {
+ writer->writeInt16(70, varInt);
+ } else
+ writer->writeInt16(70, 6);
+ if (ver > DRW::AC1009) {
+ writer->writeString(9, "$UCSBASE");
+ if (getStr("$UCSBASE", &varStr))
+ if (ver == DRW::AC1009)
+ writer->writeUtf8Caps(2, varStr);
+ else
+ writer->writeUtf8String(2, varStr);
+ else
+ writer->writeString(2, "");
+}
+ writer->writeString(9, "$UCSNAME");
+ if (getStr("$UCSNAME", &varStr))
+ if (ver == DRW::AC1009)
+ writer->writeUtf8Caps(2, varStr);
+ else
+ writer->writeUtf8String(2, varStr);
+ else
+ writer->writeString(2, "");
+ writer->writeString(9, "$UCSORG");
+ if (getCoord("$UCSORG", &varCoord)) {
+ writer->writeDouble(10, varCoord.x);
+ writer->writeDouble(20, varCoord.y);
+ writer->writeDouble(30, varCoord.z);
+ } else {
+ writer->writeDouble(10, 0.0);
+ writer->writeDouble(20, 0.0);
+ writer->writeDouble(30, 0.0);
+ }
+ writer->writeString(9, "$UCSXDIR");
+ if (getCoord("$UCSXDIR", &varCoord)) {
+ writer->writeDouble(10, varCoord.x);
+ writer->writeDouble(20, varCoord.y);
+ writer->writeDouble(30, varCoord.z);
+ } else {
+ writer->writeDouble(10, 1.0);
+ writer->writeDouble(20, 0.0);
+ writer->writeDouble(30, 0.0);
+ }
+ writer->writeString(9, "$UCSYDIR");
+ if (getCoord("$UCSYDIR", &varCoord)) {
+ writer->writeDouble(10, varCoord.x);
+ writer->writeDouble(20, varCoord.y);
+ writer->writeDouble(30, varCoord.z);
+ } else {
+ writer->writeDouble(10, 0.0);
+ writer->writeDouble(20, 1.0);
+ writer->writeDouble(30, 0.0);
+ }
+ if (ver > DRW::AC1009) { //begin post r12 UCS vars
+ writer->writeString(9, "$UCSORTHOREF");
+ if (getStr("$UCSORTHOREF", &varStr))
+ if (ver == DRW::AC1009)
+ writer->writeUtf8Caps(2, varStr);
+ else
+ writer->writeUtf8String(2, varStr);
+ else
+ writer->writeString(2, "");
+ writer->writeString(9, "$UCSORTHOVIEW");
+ if (getInt("$UCSORTHOVIEW", &varInt))
+ writer->writeInt16(70, varInt);
+ else
+ writer->writeInt16(70, 0);
+ writer->writeString(9, "$UCSORGTOP");
+ if (getCoord("$UCSORGTOP", &varCoord)) {
+ writer->writeDouble(10, varCoord.x);
+ writer->writeDouble(20, varCoord.y);
+ writer->writeDouble(30, varCoord.z);
+ } else {
+ writer->writeDouble(10, 0.0);
+ writer->writeDouble(20, 0.0);
+ writer->writeDouble(30, 0.0);
+ }
+ writer->writeString(9, "$UCSORGBOTTOM");
+ if (getCoord("$UCSORGBOTTOM", &varCoord)) {
+ writer->writeDouble(10, varCoord.x);
+ writer->writeDouble(20, varCoord.y);
+ writer->writeDouble(30, varCoord.z);
+ } else {
+ writer->writeDouble(10, 0.0);
+ writer->writeDouble(20, 0.0);
+ writer->writeDouble(30, 0.0);
+ }
+ writer->writeString(9, "$UCSORGLEFT");
+ if (getCoord("$UCSORGLEFT", &varCoord)) {
+ writer->writeDouble(10, varCoord.x);
+ writer->writeDouble(20, varCoord.y);
+ writer->writeDouble(30, varCoord.z);
+ } else {
+ writer->writeDouble(10, 0.0);
+ writer->writeDouble(20, 0.0);
+ writer->writeDouble(30, 0.0);
+ }
+ writer->writeString(9, "$UCSORGRIGHT");
+ if (getCoord("$UCSORGRIGHT", &varCoord)) {
+ writer->writeDouble(10, varCoord.x);
+ writer->writeDouble(20, varCoord.y);
+ writer->writeDouble(30, varCoord.z);
+ } else {
+ writer->writeDouble(10, 0.0);
+ writer->writeDouble(20, 0.0);
+ writer->writeDouble(30, 0.0);
+ }
+ writer->writeString(9, "$UCSORGFRONT");
+ if (getCoord("$UCSORGFRONT", &varCoord)) {
+ writer->writeDouble(10, varCoord.x);
+ writer->writeDouble(20, varCoord.y);
+ writer->writeDouble(30, varCoord.z);
+ } else {
+ writer->writeDouble(10, 0.0);
+ writer->writeDouble(20, 0.0);
+ writer->writeDouble(30, 0.0);
+ }
+ writer->writeString(9, "$UCSORGBACK");
+ if (getCoord("$UCSORGBACK", &varCoord)) {
+ writer->writeDouble(10, varCoord.x);
+ writer->writeDouble(20, varCoord.y);
+ writer->writeDouble(30, varCoord.z);
+ } else {
+ writer->writeDouble(10, 0.0);
+ writer->writeDouble(20, 0.0);
+ writer->writeDouble(30, 0.0);
+ }
+ writer->writeString(9, "$PUCSBASE");
+ if (getStr("$PUCSBASE", &varStr))
+ if (ver == DRW::AC1009)
+ writer->writeUtf8Caps(2, varStr);
+ else
+ writer->writeUtf8String(2, varStr);
+ else
+ writer->writeString(2, "");
+ } //end post r12 UCS vars
+ writer->writeString(9, "$PUCSNAME");
+ if (getStr("$PUCSNAME", &varStr))
+ if (ver == DRW::AC1009)
+ writer->writeUtf8Caps(2, varStr);
+ else
+ writer->writeUtf8String(2, varStr);
+ else
+ writer->writeString(2, "");
+ writer->writeString(9, "$PUCSORG");
+ if (getCoord("$PUCSORG", &varCoord)) {
+ writer->writeDouble(10, varCoord.x);
+ writer->writeDouble(20, varCoord.y);
+ writer->writeDouble(30, varCoord.z);
+ } else {
+ writer->writeDouble(10, 0.0);
+ writer->writeDouble(20, 0.0);
+ writer->writeDouble(30, 0.0);
+ }
+ writer->writeString(9, "$PUCSXDIR");
+ if (getCoord("$PUCSXDIR", &varCoord)) {
+ writer->writeDouble(10, varCoord.x);
+ writer->writeDouble(20, varCoord.y);
+ writer->writeDouble(30, varCoord.z);
+ } else {
+ writer->writeDouble(10, 1.0);
+ writer->writeDouble(20, 0.0);
+ writer->writeDouble(30, 0.0);
+ }
+ writer->writeString(9, "$PUCSYDIR");
+ if (getCoord("$PUCSYDIR", &varCoord)) {
+ writer->writeDouble(10, varCoord.x);
+ writer->writeDouble(20, varCoord.y);
+ writer->writeDouble(30, varCoord.z);
+ } else {
+ writer->writeDouble(10, 0.0);
+ writer->writeDouble(20, 1.0);
+ writer->writeDouble(30, 0.0);
+ }
+ if (ver > DRW::AC1009) { //begin post r12 PUCS vars
+ writer->writeString(9, "$PUCSORTHOREF");
+ if (getStr("$PUCSORTHOREF", &varStr))
+ if (ver == DRW::AC1009)
+ writer->writeUtf8Caps(2, varStr);
+ else
+ writer->writeUtf8String(2, varStr);
+ else
+ writer->writeString(2, "");
+ writer->writeString(9, "$PUCSORTHOVIEW");
+ if (getInt("$PUCSORTHOVIEW", &varInt))
+ writer->writeInt16(70, varInt);
+ else
+ writer->writeInt16(70, 0);
+ writer->writeString(9, "$PUCSORGTOP");
+ if (getCoord("$PUCSORGTOP", &varCoord)) {
+ writer->writeDouble(10, varCoord.x);
+ writer->writeDouble(20, varCoord.y);
+ writer->writeDouble(30, varCoord.z);
+ } else {
+ writer->writeDouble(10, 0.0);
+ writer->writeDouble(20, 0.0);
+ writer->writeDouble(30, 0.0);
+ }
+ writer->writeString(9, "$PUCSORGBOTTOM");
+ if (getCoord("$PUCSORGBOTTOM", &varCoord)) {
+ writer->writeDouble(10, varCoord.x);
+ writer->writeDouble(20, varCoord.y);
+ writer->writeDouble(30, varCoord.z);
+ } else {
+ writer->writeDouble(10, 0.0);
+ writer->writeDouble(20, 0.0);
+ writer->writeDouble(30, 0.0);
+ }
+ writer->writeString(9, "$PUCSORGLEFT");
+ if (getCoord("$PUCSORGLEFT", &varCoord)) {
+ writer->writeDouble(10, varCoord.x);
+ writer->writeDouble(20, varCoord.y);
+ writer->writeDouble(30, varCoord.z);
+ } else {
+ writer->writeDouble(10, 0.0);
+ writer->writeDouble(20, 0.0);
+ writer->writeDouble(30, 0.0);
+ }
+ writer->writeString(9, "$PUCSORGRIGHT");
+ if (getCoord("$PUCSORGRIGHT", &varCoord)) {
+ writer->writeDouble(10, varCoord.x);
+ writer->writeDouble(20, varCoord.y);
+ writer->writeDouble(30, varCoord.z);
+ } else {
+ writer->writeDouble(10, 0.0);
+ writer->writeDouble(20, 0.0);
+ writer->writeDouble(30, 0.0);
+ }
+ writer->writeString(9, "$PUCSORGFRONT");
+ if (getCoord("$PUCSORGFRONT", &varCoord)) {
+ writer->writeDouble(10, varCoord.x);
+ writer->writeDouble(20, varCoord.y);
+ writer->writeDouble(30, varCoord.z);
+ } else {
+ writer->writeDouble(10, 0.0);
+ writer->writeDouble(20, 0.0);
+ writer->writeDouble(30, 0.0);
+ }
+ writer->writeString(9, "$PUCSORGBACK");
+ if (getCoord("$PUCSORGBACK", &varCoord)) {
+ writer->writeDouble(10, varCoord.x);
+ writer->writeDouble(20, varCoord.y);
+ writer->writeDouble(30, varCoord.z);
+ } else {
+ writer->writeDouble(10, 0.0);
+ writer->writeDouble(20, 0.0);
+ writer->writeDouble(30, 0.0);
+ }
+ } //end post r12 PUCS vars
+
+ writer->writeString(9, "$USERI1");
+ if (getInt("$USERI1", &varInt))
+ writer->writeInt16(70, varInt);
+ else
+ writer->writeInt16(70, 0);
+ writer->writeString(9, "$USERI2");
+ if (getInt("$USERI2", &varInt))
+ writer->writeInt16(70, varInt);
+ else
+ writer->writeInt16(70, 0);
+ writer->writeString(9, "$USERI3");
+ if (getInt("$USERI3", &varInt))
+ writer->writeInt16(70, varInt);
+ else
+ writer->writeInt16(70, 0);
+ writer->writeString(9, "$USERI4");
+ if (getInt("$USERI4", &varInt))
+ writer->writeInt16(70, varInt);
+ else
+ writer->writeInt16(70, 0);
+ writer->writeString(9, "$USERI5");
+ if (getInt("$USERI5", &varInt))
+ writer->writeInt16(70, varInt);
+ else
+ writer->writeInt16(70, 0);
+ writer->writeString(9, "$USERR1");
+ if (getDouble("$USERR1", &varDouble))
+ writer->writeDouble(40, varDouble);
+ else
+ writer->writeDouble(40, 0.0);
+ writer->writeString(9, "$USERR2");
+ if (getDouble("$USERR2", &varDouble))
+ writer->writeDouble(40, varDouble);
+ else
+ writer->writeDouble(40, 0.0);
+ writer->writeString(9, "$USERR3");
+ if (getDouble("$USERR3", &varDouble))
+ writer->writeDouble(40, varDouble);
+ else
+ writer->writeDouble(40, 0.0);
+ writer->writeString(9, "$USERR4");
+ if (getDouble("$USERR4", &varDouble))
+ writer->writeDouble(40, varDouble);
+ else
+ writer->writeDouble(40, 0.0);
+ writer->writeString(9, "$USERR5");
+ if (getDouble("$USERR5", &varDouble))
+ writer->writeDouble(40, varDouble);
+ else
+ writer->writeDouble(40, 0.0);
+ writer->writeString(9, "$WORLDVIEW");
+ if (getInt("$WORLDVIEW", &varInt))
+ writer->writeInt16(70, varInt);
+ else
+ writer->writeInt16(70, 1);
+ writer->writeString(9, "$SHADEDGE");
+ if (getInt("$SHADEDGE", &varInt))
+ writer->writeInt16(70, varInt);
+ else
+ writer->writeInt16(70, 3);
+ writer->writeString(9, "$SHADEDIF");
+ if (getInt("$SHADEDIF", &varInt))
+ writer->writeInt16(70, varInt);
+ else
+ writer->writeInt16(70, 70);
+ writer->writeString(9, "$TILEMODE");
+ if (getInt("$TILEMODE", &varInt))
+ writer->writeInt16(70, varInt);
+ else
+ writer->writeInt16(70, 1);
+ writer->writeString(9, "$MAXACTVP");
+ if (getInt("$MAXACTVP", &varInt))
+ writer->writeInt16(70, varInt);
+ else
+ writer->writeInt16(70, 64);
+ if (ver > DRW::AC1009) { //begin post r12 PUCS vars
+ writer->writeString(9, "$PINSBASE");
+ if (getCoord("$PINSBASE", &varCoord)) {
+ writer->writeDouble(10, varCoord.x);
+ writer->writeDouble(20, varCoord.y);
+ writer->writeDouble(30, varCoord.z);
+ } else {
+ writer->writeDouble(10, 0.0);
+ writer->writeDouble(20, 0.0);
+ writer->writeDouble(30, 0.0);
+ }
+ }
+ writer->writeString(9, "$PLIMCHECK");
+ if (getInt("$PLIMCHECK", &varInt))
+ writer->writeInt16(70, varInt);
+ else
+ writer->writeInt16(70, 0);
+ writer->writeString(9, "$PEXTMIN");
+ if (getCoord("$PEXTMIN", &varCoord)) {
+ writer->writeDouble(10, varCoord.x);
+ writer->writeDouble(20, varCoord.y);
+ writer->writeDouble(30, varCoord.z);
+ } else {
+ writer->writeDouble(10, 0.0);
+ writer->writeDouble(20, 0.0);
+ writer->writeDouble(30, 0.0);
+ }
+ writer->writeString(9, "$PEXTMAX");
+ if (getCoord("$PEXTMAX", &varCoord)) {
+ writer->writeDouble(10, varCoord.x);
+ writer->writeDouble(20, varCoord.y);
+ writer->writeDouble(30, varCoord.z);
+ } else {
+ writer->writeDouble(10, 0.0);
+ writer->writeDouble(20, 0.0);
+ writer->writeDouble(30, 0.0);
+ }
+
+/* RLZ: moved to active VPORT, but can write in header if present*/
+ if (getInt("$GRIDMODE", &varInt)) {
+ writer->writeString(9, "$GRIDMODE");
+ writer->writeInt16(70, varInt);
+ }
+ if (getInt("$SNAPSTYLE", &varInt)) {
+ writer->writeString(9, "$SNAPSTYLE");
+ writer->writeInt16(70, varInt);
+ }
+ if (getCoord("$GRIDUNIT", &varCoord)) {
+ writer->writeString(9, "$GRIDUNIT");
+ writer->writeDouble(10, varCoord.x);
+ writer->writeDouble(20, varCoord.y);
+ }
+ if (getCoord("$VIEWCTR", &varCoord)) {
+ writer->writeString(9, "$VIEWCTR");
+ writer->writeDouble(10, varCoord.x);
+ writer->writeDouble(20, varCoord.y);
+ }
+/* RLZ: moved to active VPORT, but can write in header if present*/
+
+ writer->writeString(9, "$PLIMMIN");
+ if (getCoord("$PLIMMIN", &varCoord)) {
+ writer->writeDouble(10, varCoord.x);
+ writer->writeDouble(20, varCoord.y);
+ } else {
+ writer->writeDouble(10, 0.0);
+ writer->writeDouble(20, 0.0);
+ }
+ writer->writeString(9, "$PLIMMAX");
+ if (getCoord("$PLIMMAX", &varCoord)) {
+ writer->writeDouble(10, varCoord.x);
+ writer->writeDouble(20, varCoord.y);
+ } else {
+ writer->writeDouble(10, 297.0);
+ writer->writeDouble(20, 210.0);
+ }
+ writer->writeString(9, "$UNITMODE");
+ if (getInt("$UNITMODE", &varInt))
+ writer->writeInt16(70, varInt);
+ else
+ writer->writeInt16(70, 0);
+ writer->writeString(9, "$VISRETAIN");
+ if (getInt("$VISRETAIN", &varInt))
+ writer->writeInt16(70, varInt);
+ else
+ writer->writeInt16(70, 1);
+ writer->writeString(9, "$PLINEGEN");
+ if (getInt("$PLINEGEN", &varInt))
+ writer->writeInt16(70, varInt);
+ else
+ writer->writeInt16(70, 0);
+ writer->writeString(9, "$PSLTSCALE");
+ if (getInt("$PSLTSCALE", &varInt))
+ writer->writeInt16(70, varInt);
+ else
+ writer->writeInt16(70, 1);
+ if (ver > DRW::AC1009){//start port r12 vars
+ writer->writeString(9, "$TREEDEPTH");
+ if (getInt("$TREEDEPTH", &varInt))
+ writer->writeInt16(70, varInt);
+ else
+ writer->writeInt16(70, 3020);
+ writer->writeString(9, "$CMLSTYLE");
+ if (getStr("$CMLSTYLE", &varStr))
+ if (ver == DRW::AC1009)
+ writer->writeUtf8Caps(2, varStr);
+ else
+ writer->writeUtf8String(2, varStr);
+ else
+ writer->writeString(2, "Standard");
+ writer->writeString(9, "$CMLJUST");
+ if (getInt("$CMLJUST", &varInt))
+ writer->writeInt16(70, varInt);
+ else
+ writer->writeInt16(70, 0);
+ writer->writeString(9, "$CMLSCALE");
+ if (getDouble("$CMLSCALE", &varDouble))
+ writer->writeDouble(40, varDouble);
+ else
+ writer->writeDouble(40, 20.0);
+ writer->writeString(9, "$PROXYGRAPHICS");
+ if (getInt("$PROXYGRAPHICS", &varInt))
+ writer->writeInt16(70, varInt);
+ else
+ writer->writeInt16(70, 1);
+ writer->writeString(9, "$MEASUREMENT");
+ if (getInt("$MEASUREMENT", &varInt))
+ writer->writeInt16(70, varInt);
+ else
+ writer->writeInt16(70, 1);
+ writer->writeString(9, "$CELWEIGHT");
+ if (getInt("$CELWEIGHT", &varInt))
+ writer->writeInt16(370, varInt);
+ else
+ writer->writeInt16(370, -1);
+ writer->writeString(9, "$ENDCAPS");
+ if (getInt("$ENDCAPS", &varInt))
+ writer->writeInt16(280, varInt);
+ else
+ writer->writeInt16(280, 0);
+ writer->writeString(9, "$JOINSTYLE");
+ if (getInt("$JOINSTYLE", &varInt))
+ writer->writeInt16(280, varInt);
+ else
+ writer->writeInt16(280, 0);
+ writer->writeString(9, "$LWDISPLAY"); //RLZ bool flag, verify in bin version
+ if (getInt("$LWDISPLAY", &varInt))
+ writer->writeInt16(290, varInt);
+ else
+ writer->writeInt16(290, 0);
+ if (ver > DRW::AC1014) {
+ writer->writeString(9, "$INSUNITS");
+ if (getInt("$INSUNITS", &varInt))
+ writer->writeInt16(70, varInt);
+ else
+ writer->writeInt16(70, 0);
+ }
+ writer->writeString(9, "$HYPERLINKBASE");
+ if (getStr("$HYPERLINKBASE", &varStr))
+ if (ver == DRW::AC1009)
+ writer->writeUtf8Caps(1, varStr);
+ else
+ writer->writeUtf8String(1, varStr);
+ else
+ writer->writeString(1, "");
+ writer->writeString(9, "$STYLESHEET");
+ if (getStr("$STYLESHEET", &varStr))
+ if (ver == DRW::AC1009)
+ writer->writeUtf8Caps(1, varStr);
+ else
+ writer->writeUtf8String(1, varStr);
+ else
+ writer->writeString(1, "");
+ writer->writeString(9, "$XEDIT"); //RLZ bool flag, verify in bin version
+ if (getInt("$XEDIT", &varInt))
+ writer->writeInt16(290, varInt);
+ else
+ writer->writeInt16(290, 1);
+ writer->writeString(9, "$CEPSNTYPE");
+ if (getInt("$CEPSNTYPE", &varInt))
+ writer->writeInt16(380, varInt);
+ else
+ writer->writeInt16(380, 0);
+ writer->writeString(9, "$PSTYLEMODE"); //RLZ bool flag, verify in bin version
+ if (getInt("$PSTYLEMODE", &varInt))
+ writer->writeInt16(290, varInt);
+ else
+ writer->writeInt16(290, 1);
+//RLZ: here $FINGERPRINTGUID and $VERSIONGUID, do not add?
+ writer->writeString(9, "$EXTNAMES"); //RLZ bool flag, verify in bin version
+ if (getInt("$EXTNAMES", &varInt))
+ writer->writeInt16(290, varInt);
+ else
+ writer->writeInt16(290, 1);
+ writer->writeString(9, "$PSVPSCALE");
+ if (getDouble("$PSVPSCALE", &varDouble))
+ writer->writeDouble(40, varDouble);
+ else
+ writer->writeDouble(40, 0.0);
+ writer->writeString(9, "$OLESTARTUP"); //RLZ bool flag, verify in bin version
+ if (getInt("$OLESTARTUP", &varInt))
+ writer->writeInt16(290, varInt);
+ else
+ writer->writeInt16(290, 0);
+ }
+ if (ver > DRW::AC1015) {// and post v2004 vars
+ writer->writeString(9, "$SORTENTS");
+ if (getInt("$SORTENTS", &varInt))
+ writer->writeInt16(280, varInt);
+ else
+ writer->writeInt16(280, 127);
+ writer->writeString(9, "$INDEXCTL");
+ if (getInt("$INDEXCTL", &varInt))
+ writer->writeInt16(280, varInt);
+ else
+ writer->writeInt16(280, 0);
+ writer->writeString(9, "$HIDETEXT");
+ if (getInt("$HIDETEXT", &varInt))
+ writer->writeInt16(280, varInt);
+ else
+ writer->writeInt16(280, 1);
+ writer->writeString(9, "$XCLIPFRAME"); //RLZ bool flag, verify in bin version
+ if (ver > DRW::AC1021) {
+ if (getInt("$XCLIPFRAME", &varInt))
+ writer->writeInt16(280, varInt);
+ else
+ writer->writeInt16(280, 0);
+ } else {
+ if (getInt("$XCLIPFRAME", &varInt))
+ writer->writeInt16(290, varInt);
+ else
+ writer->writeInt16(290, 0);
+ }
+ writer->writeString(9, "$HALOGAP");
+ if (getInt("$HALOGAP", &varInt))
+ writer->writeInt16(280, varInt);
+ else
+ writer->writeInt16(280, 0);
+ writer->writeString(9, "$OBSCOLOR");
+ if (getInt("$OBSCOLOR", &varInt))
+ writer->writeInt16(70, varInt);
+ else
+ writer->writeInt16(70, 257);
+ writer->writeString(9, "$OBSLTYPE");
+ if (getInt("$OBSLTYPE", &varInt))
+ writer->writeInt16(280, varInt);
+ else
+ writer->writeInt16(280, 0);
+ writer->writeString(9, "$INTERSECTIONDISPLAY");
+ if (getInt("$INTERSECTIONDISPLAY", &varInt))
+ writer->writeInt16(280, varInt);
+ else
+ writer->writeInt16(280, 0);
+ writer->writeString(9, "$INTERSECTIONCOLOR");
+ if (getInt("$INTERSECTIONCOLOR", &varInt))
+ writer->writeInt16(70, varInt);
+ else
+ writer->writeInt16(70, 257);
+ writer->writeString(9, "$DIMASSOC");
+ if (getInt("$DIMASSOC", &varInt))
+ writer->writeInt16(280, varInt);
+ else
+ writer->writeInt16(280, 1);
+ writer->writeString(9, "$PROJECTNAME");
+ if (getStr("$PROJECTNAME", &varStr))
+ writer->writeUtf8String(1, varStr);
+ else
+ writer->writeString(1, "");
+ }
+ if (ver > DRW::AC1018) {// and post v2007 vars
+ writer->writeString(9, "$CAMERADISPLAY"); //RLZ bool flag, verify in bin version
+ if (getInt("$CAMERADISPLAY", &varInt))
+ writer->writeInt16(290, varInt);
+ else
+ writer->writeInt16(290, 0);
+ writer->writeString(9, "$LENSLENGTH");
+ if (getDouble("$LENSLENGTH", &varDouble))
+ writer->writeDouble(40, varDouble);
+ else
+ writer->writeDouble(40, 50.0);
+ writer->writeString(9, "$CAMERAHEIGHT");
+ if (getDouble("$CAMERAHEIGTH", &varDouble))
+ writer->writeDouble(40, varDouble);
+ else
+ writer->writeDouble(40, 0.0);
+ writer->writeString(9, "$STEPSPERSEC");
+ if (getDouble("$STEPSPERSEC", &varDouble))
+ writer->writeDouble(40, varDouble);
+ else
+ writer->writeDouble(40, 2.0);
+ writer->writeString(9, "$STEPSIZE");
+ if (getDouble("$STEPSIZE", &varDouble))
+ writer->writeDouble(40, varDouble);
+ else
+ writer->writeDouble(40, 50.0);
+ writer->writeString(9, "$3DDWFPREC");
+ if (getDouble("$3DDWFPREC", &varDouble))
+ writer->writeDouble(40, varDouble);
+ else
+ writer->writeDouble(40, 2.0);
+ writer->writeString(9, "$PSOLWIDTH");
+ if (getDouble("$PSOLWIDTH", &varDouble))
+ writer->writeDouble(40, varDouble);
+ else
+ writer->writeDouble(40, 5.0);
+ writer->writeString(9, "$PSOLHEIGHT");
+ if (getDouble("$PSOLHEIGHT", &varDouble))
+ writer->writeDouble(40, varDouble);
+ else
+ writer->writeDouble(40, 80.0);
+ writer->writeString(9, "$LOFTANG1");
+ if (getDouble("$LOFTANG1", &varDouble))
+ writer->writeDouble(40, varDouble);
+ else
+ writer->writeDouble(40, M_PI_2);
+ writer->writeString(9, "$LOFTANG2");
+ if (getDouble("$LOFTANG2", &varDouble))
+ writer->writeDouble(40, varDouble);
+ else
+ writer->writeDouble(40, M_PI_2);
+ writer->writeString(9, "$LOFTMAG1");
+ if (getDouble("$LOFTMAG1", &varDouble))
+ writer->writeDouble(40, varDouble);
+ else
+ writer->writeDouble(40, 0.0);
+ writer->writeString(9, "$LOFTMAG2");
+ if (getDouble("$LOFTMAG2", &varDouble))
+ writer->writeDouble(40, varDouble);
+ else
+ writer->writeDouble(40, 0.0);
+ writer->writeString(9, "$LOFTPARAM");
+ if (getInt("$LOFTPARAM", &varInt))
+ writer->writeInt16(70, varInt);
+ else
+ writer->writeInt16(70, 7);
+ writer->writeString(9, "$LOFTNORMALS");
+ if (getInt("$LOFTNORMALS", &varInt))
+ writer->writeInt16(280, varInt);
+ else
+ writer->writeInt16(280, 1);
+ writer->writeString(9, "$LATITUDE");
+ if (getDouble("$LATITUDE", &varDouble))
+ writer->writeDouble(40, varDouble);
+ else
+ writer->writeDouble(40, 1.0);
+ writer->writeString(9, "$LONGITUDE");
+ if (getDouble("$LONGITUDE", &varDouble))
+ writer->writeDouble(40, varDouble);
+ else
+ writer->writeDouble(40, 1.0);
+ writer->writeString(9, "$NORTHDIRECTION");
+ if (getDouble("$LONGITUDE", &varDouble))
+ writer->writeDouble(40, varDouble);
+ else
+ writer->writeDouble(40, 0.0);
+ writer->writeString(9, "$TIMEZONE");
+ if (getInt("$TIMEZONE", &varInt))
+ writer->writeInt16(70, varInt);
+ else
+ writer->writeInt16(70, -8000);
+ writer->writeString(9, "$LIGHTGLYPHDISPLAY");
+ if (getInt("$LIGHTGLYPHDISPLAY", &varInt))
+ writer->writeInt16(280, varInt);
+ else
+ writer->writeInt16(280, 1);
+ writer->writeString(9, "$TILEMODELIGHTSYNCH");
+ if (getInt("$TILEMODELIGHTSYNCH", &varInt))
+ writer->writeInt16(280, varInt);
+ else
+ writer->writeInt16(280, 1);
+ //$CMATERIAL is a handle
+ writer->writeString(9, "$SOLIDHIST");
+ if (getInt("$SOLIDHIST", &varInt))
+ writer->writeInt16(280, varInt);
+ else
+ writer->writeInt16(280, 1);
+ writer->writeString(9, "$SHOWHIST");
+ if (getInt("$SHOWHIST", &varInt))
+ writer->writeInt16(280, varInt);
+ else
+ writer->writeInt16(280, 1);
+ writer->writeString(9, "$DWFFRAME");
+ if (getInt("$DWFFRAME", &varInt))
+ writer->writeInt16(280, varInt);
+ else
+ writer->writeInt16(280, 2);
+ writer->writeString(9, "$DGNFRAME");
+ if (getInt("$DGNFRAME", &varInt))
+ writer->writeInt16(280, varInt);
+ else
+ writer->writeInt16(280, 0);
+ writer->writeString(9, "$REALWORLDSCALE"); //RLZ bool flag, verify in bin version
+ if (getInt("$REALWORLDSCALE", &varInt))
+ writer->writeInt16(290, varInt);
+ else
+ writer->writeInt16(290, 1);
+ writer->writeString(9, "$INTERFERECOLOR");
+ if (getInt("$INTERFERECOLOR", &varInt))
+ writer->writeInt16(62, varInt);
+ else
+ writer->writeInt16(62, 1);
+ //$INTERFEREOBJVS is a handle
+ //$INTERFEREVPVS is a handle
+ writer->writeString(9, "$CSHADOW");
+ if (getInt("$CSHADOW", &varInt))
+ writer->writeInt16(280, varInt);
+ else
+ writer->writeInt16(280, 0);
+ writer->writeString(9, "$SHADOWPLANELOCATION");
+ if (getDouble("$SHADOWPLANELOCATION", &varDouble))
+ writer->writeDouble(40, varDouble);
+ else
+ writer->writeDouble(40, 0.0);
+ }
+
+#ifdef DRW_DBG
+ std::map<std::string,DRW_Variant *>::const_iterator it;
+ for ( it=vars.begin() ; it != vars.end(); ++it ){
+ DRW_DBG((*it).first); DRW_DBG("\n");
+ }
+#endif
+}
+
+void DRW_Header::addDouble(std::string key, double value, int code){
+ curr = new DRW_Variant();
+ curr->addDouble( value );
+ curr->code = code;
+ vars[key] =curr;
+}
+
+void DRW_Header::addInt(std::string key, int value, int code){
+ curr = new DRW_Variant();
+ curr->addInt( value );
+ curr->code = code;
+ vars[key] =curr;
+}
+
+void DRW_Header::addStr(std::string key, std::string value, int code){
+ curr = new DRW_Variant();
+ curr->addString( value );
+ curr->code = code;
+ vars[key] =curr;
+}
+
+void DRW_Header::addCoord(std::string key, DRW_Coord value, int code){
+ curr = new DRW_Variant();
+ curr->addCoord( value );
+ curr->code = code;
+ vars[key] =curr;
+}
+
+bool DRW_Header::getDouble(std::string key, double *varDouble){
+ bool result = false;
+ std::map<std::string,DRW_Variant *>::iterator it;
+ it=vars.find( key);
+ if (it != vars.end()) {
+ DRW_Variant *var = (*it).second;
+ if (var->type == DRW_Variant::DOUBLE) {
+ *varDouble = var->content.d;
+ result = true;
+ }
+ delete var;
+ vars.erase (it);
+ }
+ return result;
+}
+
+bool DRW_Header::getInt(std::string key, int *varInt){
+ bool result = false;
+ std::map<std::string,DRW_Variant *>::iterator it;
+ it=vars.find( key);
+ if (it != vars.end()) {
+ DRW_Variant *var = (*it).second;
+ if (var->type == DRW_Variant::INTEGER) {
+ *varInt = var->content.i;
+ result = true;
+ }
+ delete var;
+ vars.erase (it);
+ }
+ return result;
+}
+
+bool DRW_Header::getStr(std::string key, std::string *varStr){
+ bool result = false;
+ std::map<std::string,DRW_Variant *>::iterator it;
+ it=vars.find( key);
+ if (it != vars.end()) {
+ DRW_Variant *var = (*it).second;
+ if (var->type == DRW_Variant::STRING) {
+ *varStr = *var->content.s;
+ result = true;
+ }
+ delete var;
+ vars.erase (it);
+ }
+ return result;
+}
+
+bool DRW_Header::getCoord(std::string key, DRW_Coord *varCoord){
+ bool result = false;
+ std::map<std::string,DRW_Variant *>::iterator it;
+ it=vars.find( key);
+ if (it != vars.end()) {
+ DRW_Variant *var = (*it).second;
+ if (var->type == DRW_Variant::COORD) {
+ *varCoord = *var->content.v;
+ result = true;
+ }
+ delete var;
+ vars.erase (it);
+ }
+ return result;
+}
+
+bool DRW_Header::parseDwg(DRW::Version version, dwgBuffer *buf, dwgBuffer *hBbuf, duint8 mv){
+ bool result = true;
+ duint32 size = buf->getRawLong32();
+ duint32 bitSize = 0;
+ duint32 endBitPos = 160; //start bit: 16 sentinel + 4 size
+ DRW_DBG("\nbyte size of data: "); DRW_DBG(size);
+ if (version > DRW::AC1021 && mv > 3) { //2010+
+ duint32 hSize = buf->getRawLong32();
+ endBitPos += 32; //start bit: + 4 hight size
+ DRW_DBG("\n2010+ & MV> 3, higth 32b: "); DRW_DBG(hSize);
+ }
+//RLZ TODO add $ACADVER var & $DWGCODEPAGE & $MEASUREMENT
+//RLZ TODO EN 2000 falta $CELWEIGHT, $ENDCAPS, $EXTNAMES $JOINSTYLE $LWDISPLAY $PSTYLEMODE $TDUCREATE $TDUUPDATE $XEDIT
+
+ //bit size of data needed to locate start of string stream in 2007+
+ //and mark the start of handle stream
+ //header is one object reads data and continue read strings ???
+ if (version > DRW::AC1018) {//2007+
+ bitSize = buf->getRawLong32();
+ DRW_DBG("\nsize in bits: "); DRW_DBG(bitSize);
+ endBitPos += bitSize;
+ hBbuf->setPosition(endBitPos >>3);
+ hBbuf->setBitPos(endBitPos&7);
+ }
+
+ if (version > DRW::AC1024) {//2013+
+ duint64 requiredVersions = buf->getBitLongLong();
+ DRW_DBG("\nREQUIREDVERSIONS var: "); DRW_DBG(requiredVersions);
+ }
+ DRW_DBG("\nUnknown1: "); DRW_DBG(buf->getBitDouble());
+ DRW_DBG("\nUnknown2: "); DRW_DBG(buf->getBitDouble());
+ DRW_DBG("\nUnknown3: "); DRW_DBG(buf->getBitDouble());
+ DRW_DBG("\nUnknown4: "); DRW_DBG(buf->getBitDouble());
+ if (version < DRW::AC1021) {//2007-
+ DRW_DBG("\nUnknown text1: "); DRW_DBG(buf->getCP8Text());
+ DRW_DBG("\nUnknown text2: "); DRW_DBG(buf->getCP8Text());
+ DRW_DBG("\nUnknown text3: "); DRW_DBG(buf->getCP8Text());
+ DRW_DBG("\nUnknown text4: "); DRW_DBG(buf->getCP8Text());
+ }
+ DRW_DBG("\nUnknown long1 (24L): "); DRW_DBG(buf->getBitLong());
+ DRW_DBG("\nUnknown long2 (0L): "); DRW_DBG(buf->getBitLong());
+ if (version < DRW::AC1015) {//pre 2000
+ DRW_DBG("\nUnknown short (0): "); DRW_DBG(buf->getBitShort());
+ }
+ if (version < DRW::AC1018) {//pre 2004
+ dwgHandle hcv = hBbuf->getHandle();
+ DRW_DBG("\nhandle of current view: "); DRW_DBGHL(hcv.code, hcv.size, hcv.ref);
+ }
+ vars["DIMASO"]=new DRW_Variant(70, buf->getBit());
+ vars["DIMSHO"]=new DRW_Variant(70, buf->getBit());
+ if (version < DRW::AC1015) {//pre 2000
+ vars["DIMSAV"]=new DRW_Variant(70, buf->getBit());
+ }
+ vars["PLINEGEN"]=new DRW_Variant(70, buf->getBit());
+ vars["ORTHOMODE"]=new DRW_Variant(70, buf->getBit());
+ vars["REGENMODE"]=new DRW_Variant(70, buf->getBit());
+ vars["FILLMODE"]=new DRW_Variant(70, buf->getBit());
+ vars["QTEXTMODE"]=new DRW_Variant(70, buf->getBit());
+ vars["PSLTSCALE"]=new DRW_Variant(70, buf->getBit());
+ vars["LIMCHECK"]=new DRW_Variant(70, buf->getBit());
+ if (version < DRW::AC1015) {//pre 2000
+ vars["BLIPMODE"]=new DRW_Variant(70, buf->getBit());
+ }
+ if (version > DRW::AC1015) {//2004+
+ DRW_DBG("\nUndocumented: "); DRW_DBG(buf->getBit());
+ }
+ vars["USRTIMER"]=new DRW_Variant(70, buf->getBit());
+ vars["SKPOLY"]=new DRW_Variant(70, buf->getBit());
+ vars["ANGDIR"]=new DRW_Variant(70, buf->getBit());
+ vars["SPLFRAME"]=new DRW_Variant(70, buf->getBit());
+ if (version < DRW::AC1015) {//pre 2000
+ vars["ATTREQ"]=new DRW_Variant(70, buf->getBit());
+ vars["ATTDIA"]=new DRW_Variant(70, buf->getBit());
+ }
+ vars["MIRRTEXT"]=new DRW_Variant(70, buf->getBit());
+ vars["WORLDVIEW"]=new DRW_Variant(70, buf->getBit());
+ if (version < DRW::AC1015) {//pre 2000
+ vars["WIREFRAME"]=new DRW_Variant(70, buf->getBit());
+ }
+ vars["TILEMODE"]=new DRW_Variant(70, buf->getBit());
+ vars["PLIMCHECK"]=new DRW_Variant(70, buf->getBit());
+ vars["VISRETAIN"]=new DRW_Variant(70, buf->getBit());
+ if (version < DRW::AC1015) {//pre 2000
+ vars["DELOBJ"]=new DRW_Variant(70, buf->getBit());
+ }
+ vars["DISPSILH"]=new DRW_Variant(70, buf->getBit());
+ vars["PELLIPSE"]=new DRW_Variant(70, buf->getBit());
+ vars["PROXIGRAPHICS"]=new DRW_Variant(70, buf->getBitShort());//RLZ short or bit??
+ if (version < DRW::AC1015) {//pre 2000
+ vars["DRAGMODE"]=new DRW_Variant(70, buf->getBitShort());//RLZ short or bit??
+ }
+ vars["TREEDEPTH"]=new DRW_Variant(70, buf->getBitShort());//RLZ short or bit??
+ vars["LUNITS"]=new DRW_Variant(70, buf->getBitShort());
+ vars["LUPREC"]=new DRW_Variant(70, buf->getBitShort());
+ vars["AUNITS"]=new DRW_Variant(70, buf->getBitShort());
+ vars["AUPREC"]=new DRW_Variant(70, buf->getBitShort());
+ if (version < DRW::AC1015) {//pre 2000
+ vars["OSMODE"]=new DRW_Variant(70, buf->getBitShort());
+ }
+ vars["ATTMODE"]=new DRW_Variant(70, buf->getBitShort());
+ if (version < DRW::AC1015) {//pre 2000
+ vars["COORDS"]=new DRW_Variant(70, buf->getBitShort());
+ }
+ vars["PDMODE"]=new DRW_Variant(70, buf->getBitShort());
+ if (version < DRW::AC1015) {//pre 2000
+ vars["PICKSTYLE"]=new DRW_Variant(70, buf->getBitShort());
+ }
+ if (version > DRW::AC1015) {//2004+
+ DRW_DBG("\nUnknown long 1: "); DRW_DBG(buf->getBitLong());
+ DRW_DBG("\nUnknown long 2: "); DRW_DBG(buf->getBitLong());
+ DRW_DBG("\nUnknown long 3: "); DRW_DBG(buf->getBitLong());
+ }
+ vars["USERI1"]=new DRW_Variant(70, buf->getBitShort());
+ vars["USERI2"]=new DRW_Variant(70, buf->getBitShort());
+ vars["USERI3"]=new DRW_Variant(70, buf->getBitShort());
+ vars["USERI4"]=new DRW_Variant(70, buf->getBitShort());
+ vars["USERI5"]=new DRW_Variant(70, buf->getBitShort());
+ vars["SPLINESEGS"]=new DRW_Variant(70, buf->getBitShort());
+ vars["SURFU"]=new DRW_Variant(70, buf->getBitShort());
+ vars["SURFV"]=new DRW_Variant(70, buf->getBitShort());
+ vars["SURFTYPE"]=new DRW_Variant(70, buf->getBitShort());
+ vars["SURFTAB1"]=new DRW_Variant(70, buf->getBitShort());
+ vars["SURFTAB2"]=new DRW_Variant(70, buf->getBitShort());
+ vars["SPLINETYPE"]=new DRW_Variant(70, buf->getBitShort());
+ vars["SHADEDGE"]=new DRW_Variant(70, buf->getBitShort());
+ vars["SHADEDIF"]=new DRW_Variant(70, buf->getBitShort());
+ vars["UNITMODE"]=new DRW_Variant(70, buf->getBitShort());
+ vars["MAXACTVP"]=new DRW_Variant(70, buf->getBitShort());
+ vars["ISOLINES"]=new DRW_Variant(70, buf->getBitShort());//////////////////
+ vars["CMLJUST"]=new DRW_Variant(70, buf->getBitShort());
+ vars["TEXTQLTY"]=new DRW_Variant(70, buf->getBitShort());/////////////////////
+ vars["LTSCALE"]=new DRW_Variant(40, buf->getBitDouble());
+ vars["TEXTSIZE"]=new DRW_Variant(40, buf->getBitDouble());
+ vars["TRACEWID"]=new DRW_Variant(40, buf->getBitDouble());
+ vars["SKETCHINC"]=new DRW_Variant(40, buf->getBitDouble());
+ vars["FILLETRAD"]=new DRW_Variant(40, buf->getBitDouble());
+ vars["THICKNESS"]=new DRW_Variant(40, buf->getBitDouble());
+ vars["ANGBASE"]=new DRW_Variant(50, buf->getBitDouble());
+ vars["PDSIZE"]=new DRW_Variant(40, buf->getBitDouble());
+ vars["PLINEWID"]=new DRW_Variant(40, buf->getBitDouble());
+ vars["USERR1"]=new DRW_Variant(40, buf->getBitDouble());
+ vars["USERR2"]=new DRW_Variant(40, buf->getBitDouble());
+ vars["USERR3"]=new DRW_Variant(40, buf->getBitDouble());
+ vars["USERR4"]=new DRW_Variant(40, buf->getBitDouble());
+ vars["USERR5"]=new DRW_Variant(40, buf->getBitDouble());
+ vars["CHAMFERA"]=new DRW_Variant(40, buf->getBitDouble());
+ vars["CHAMFERB"]=new DRW_Variant(40, buf->getBitDouble());
+ vars["CHAMFERC"]=new DRW_Variant(40, buf->getBitDouble());
+ vars["CHAMFERD"]=new DRW_Variant(40, buf->getBitDouble());
+ vars["FACETRES"]=new DRW_Variant(40, buf->getBitDouble());/////////////////////////
+ vars["CMLSCALE"]=new DRW_Variant(40, buf->getBitDouble());
+ vars["CELTSCALE"]=new DRW_Variant(40, buf->getBitDouble());
+ if (version < DRW::AC1021) {//2004-
+ vars["MENU"]=new DRW_Variant(1, buf->getCP8Text());
+ }
+ ddouble64 msec, day;
+ day = buf->getBitLong();
+ msec = buf->getBitLong();
+ while (msec > 0)
+ msec /=10;
+ vars["TDCREATE"]=new DRW_Variant(40, day+msec);//RLZ: TODO convert to day.msec
+// vars["TDCREATE"]=new DRW_Variant(40, buf->getBitLong());//RLZ: TODO convert to day.msec
+// vars["TDCREATE"]=new DRW_Variant(40, buf->getBitLong());
+ day = buf->getBitLong();
+ msec = buf->getBitLong();
+ while (msec > 0)
+ msec /=10;
+ vars["TDUPDATE"]=new DRW_Variant(40, day+msec);//RLZ: TODO convert to day.msec
+// vars["TDUPDATE"]=new DRW_Variant(40, buf->getBitLong());//RLZ: TODO convert to day.msec
+// vars["TDUPDATE"]=new DRW_Variant(40, buf->getBitLong());
+ if (version > DRW::AC1015) {//2004+
+ DRW_DBG("\nUnknown long 4: "); DRW_DBG(buf->getBitLong());
+ DRW_DBG("\nUnknown long 5: "); DRW_DBG(buf->getBitLong());
+ DRW_DBG("\nUnknown long 6: "); DRW_DBG(buf->getBitLong());
+ }
+ day = buf->getBitLong();
+ msec = buf->getBitLong();
+ while (msec > 0)
+ msec /=10;
+ vars["TDINDWG"]=new DRW_Variant(40, day+msec);//RLZ: TODO convert to day.msec
+// vars["TDINDWG"]=new DRW_Variant(40, buf->getBitLong());//RLZ: TODO convert to day.msec
+// vars["TDINDWG"]=new DRW_Variant(40, buf->getBitLong());//RLZ: TODO convert to day.msec
+ day = buf->getBitLong();
+ msec = buf->getBitLong();
+ while (msec > 0)
+ msec /=10;
+ vars["TDUSRTIMER"]=new DRW_Variant(40, day+msec);//RLZ: TODO convert to day.msec
+// vars["TDUSRTIMER"]=new DRW_Variant(40, buf->getBitLong());//RLZ: TODO convert to day.msec
+// vars["TDUSRTIMER"]=new DRW_Variant(40, buf->getBitLong());//RLZ: TODO convert to day.msec
+ vars["CECOLOR"]=new DRW_Variant(62, buf->getCmColor(version));//RLZ: TODO read CMC or EMC color
+ dwgHandle HANDSEED = buf->getHandle();//allways present in data stream
+ DRW_DBG("\nHANDSEED: "); DRW_DBGHL(HANDSEED.code, HANDSEED.size, HANDSEED.ref);
+ dwgHandle CLAYER = hBbuf->getHandle();
+ DRW_DBG("\nCLAYER: "); DRW_DBGHL(CLAYER.code, CLAYER.size, CLAYER.ref);
+ dwgHandle TEXTSTYLE = hBbuf->getHandle();
+ DRW_DBG("\nTEXTSTYLE: "); DRW_DBGHL(TEXTSTYLE.code, TEXTSTYLE.size, TEXTSTYLE.ref);
+ dwgHandle CELTYPE = hBbuf->getHandle();
+ DRW_DBG("\nCELTYPE: "); DRW_DBGHL(CELTYPE.code, CELTYPE.size, CELTYPE.ref);
+ if (version > DRW::AC1018) {//2007+
+ dwgHandle CMATERIAL = hBbuf->getHandle();
+ DRW_DBG("\nCMATERIAL: "); DRW_DBGHL(CMATERIAL.code, CMATERIAL.size, CMATERIAL.ref);
+ }
+ dwgHandle DIMSTYLE = hBbuf->getHandle();
+ DRW_DBG("\nDIMSTYLE: "); DRW_DBGHL(DIMSTYLE.code, DIMSTYLE.size, DIMSTYLE.ref);
+ dwgHandle CMLSTYLE = hBbuf->getHandle();
+ DRW_DBG("\nCMLSTYLE: "); DRW_DBGHL(CMLSTYLE.code, CMLSTYLE.size, CMLSTYLE.ref);
+ if (version > DRW::AC1014) {//2000+
+ vars["PSVPSCALE"]=new DRW_Variant(40, buf->getBitDouble());
+ }
+ vars["PINSBASE"]=new DRW_Variant(10, buf->get3BitDouble());
+ vars["PEXTMIN"]=new DRW_Variant(10, buf->get3BitDouble());
+ vars["PEXTMAX"]=new DRW_Variant(10, buf->get3BitDouble());
+ vars["PLIMMIN"]=new DRW_Variant(10, buf->get2RawDouble());
+ vars["PLIMMAX"]=new DRW_Variant(10, buf->get2RawDouble());
+ vars["PELEVATION"]=new DRW_Variant(40, buf->getBitDouble());
+ vars["PUCSORG"]=new DRW_Variant(10, buf->get3BitDouble());
+ vars["PUCSXDIR"]=new DRW_Variant(10, buf->get3BitDouble());
+ vars["PUCSYDIR"]=new DRW_Variant(10, buf->get3BitDouble());
+ dwgHandle PUCSNAME = hBbuf->getHandle();
+ DRW_DBG("\nPUCSNAME: "); DRW_DBGHL(PUCSNAME.code, PUCSNAME.size, PUCSNAME.ref);
+ if (version > DRW::AC1014) {//2000+
+ dwgHandle PUCSORTHOREF = hBbuf->getHandle();
+ DRW_DBG("\nPUCSORTHOREF: "); DRW_DBGHL(PUCSORTHOREF.code, PUCSORTHOREF.size, PUCSORTHOREF.ref);
+ vars["PUCSORTHOVIEW"]=new DRW_Variant(70, buf->getBitShort());
+ dwgHandle PUCSBASE = hBbuf->getHandle();
+ DRW_DBG("\nPUCSBASE: "); DRW_DBGHL(PUCSBASE.code, PUCSBASE.size, PUCSBASE.ref);
+ vars["PUCSORGTOP"]=new DRW_Variant(10, buf->get3BitDouble());
+ vars["PUCSORGBOTTOM"]=new DRW_Variant(10, buf->get3BitDouble());
+ vars["PUCSORGLEFT"]=new DRW_Variant(10, buf->get3BitDouble());
+ vars["PUCSORGRIGHT"]=new DRW_Variant(10, buf->get3BitDouble());
+ vars["PUCSORGFRONT"]=new DRW_Variant(10, buf->get3BitDouble());
+ vars["PUCSORGBACK"]=new DRW_Variant(10, buf->get3BitDouble());
+ }
+ vars["INSBASE"]=new DRW_Variant(10, buf->get3BitDouble());
+ vars["EXTMIN"]=new DRW_Variant(10, buf->get3BitDouble());
+ vars["EXTMAX"]=new DRW_Variant(10, buf->get3BitDouble());
+ vars["LIMMIN"]=new DRW_Variant(10, buf->get2RawDouble());
+ vars["LIMMAX"]=new DRW_Variant(10, buf->get2RawDouble());
+ vars["ELEVATION"]=new DRW_Variant(40, buf->getBitDouble());
+ vars["UCSORG"]=new DRW_Variant(10, buf->get3BitDouble());
+ vars["UCSXDIR"]=new DRW_Variant(10, buf->get3BitDouble());
+ vars["UCSYDIR"]=new DRW_Variant(10, buf->get3BitDouble());
+ dwgHandle UCSNAME = hBbuf->getHandle();
+ DRW_DBG("\nUCSNAME: "); DRW_DBGHL(UCSNAME.code, UCSNAME.size, UCSNAME.ref);
+ if (version > DRW::AC1014) {//2000+
+ dwgHandle UCSORTHOREF = hBbuf->getHandle();
+ DRW_DBG("\nUCSORTHOREF: "); DRW_DBGHL(UCSORTHOREF.code, UCSORTHOREF.size, UCSORTHOREF.ref);
+ vars["UCSORTHOVIEW"]=new DRW_Variant(70, buf->getBitShort());
+ dwgHandle UCSBASE = hBbuf->getHandle();
+ DRW_DBG("\nUCSBASE: "); DRW_DBGHL(UCSBASE.code, UCSBASE.size, UCSBASE.ref);
+ vars["UCSORGTOP"]=new DRW_Variant(10, buf->get3BitDouble());
+ vars["UCSORGBOTTOM"]=new DRW_Variant(10, buf->get3BitDouble());
+ vars["UCSORGLEFT"]=new DRW_Variant(10, buf->get3BitDouble());
+ vars["UCSORGRIGHT"]=new DRW_Variant(10, buf->get3BitDouble());
+ vars["UCSORGFRONT"]=new DRW_Variant(10, buf->get3BitDouble());
+ vars["UCSORGBACK"]=new DRW_Variant(10, buf->get3BitDouble());
+ if (version < DRW::AC1021) {//2004-
+ vars["DIMPOST"]=new DRW_Variant(1, buf->getCP8Text());
+ vars["DIMAPOST"]=new DRW_Variant(1, buf->getCP8Text());
+ }
+ }
+ if (version < DRW::AC1015) {//r14-
+ vars["DIMTOL"]=new DRW_Variant(70, buf->getBit());
+ vars["DIMLIM"]=new DRW_Variant(70, buf->getBit());
+ vars["DIMTIH"]=new DRW_Variant(70, buf->getBit());
+ vars["DIMTOH"]=new DRW_Variant(70, buf->getBit());
+ vars["DIMSE1"]=new DRW_Variant(70, buf->getBit());
+ vars["DIMSE2"]=new DRW_Variant(70, buf->getBit());
+ vars["DIMALT"]=new DRW_Variant(70, buf->getBit());
+ vars["DIMTOFL"]=new DRW_Variant(70, buf->getBit());
+ vars["DIMSAH"]=new DRW_Variant(70, buf->getBit());
+ vars["DIMTIX"]=new DRW_Variant(70, buf->getBit());
+ vars["DIMSOXD"]=new DRW_Variant(70, buf->getBit());
+ vars["DIMALTD"]=new DRW_Variant(70, buf->getRawChar8());
+ vars["DIMZIN"]=new DRW_Variant(70, buf->getRawChar8());
+ vars["DIMSD1"]=new DRW_Variant(70, buf->getBit());
+ vars["DIMSD2"]=new DRW_Variant(70, buf->getBit());
+ vars["DIMTOLJ"]=new DRW_Variant(70, buf->getRawChar8());
+ vars["DIMJUST"]=new DRW_Variant(70, buf->getRawChar8());
+ vars["DIMFIT"]=new DRW_Variant(70, buf->getRawChar8());///////////
+ vars["DIMUPT"]=new DRW_Variant(70, buf->getBit());
+ vars["DIMTZIN"]=new DRW_Variant(70, buf->getRawChar8());
+ vars["DIMALTZ"]=new DRW_Variant(70, buf->getRawChar8());
+ vars["DIMALTTZ"]=new DRW_Variant(70, buf->getRawChar8());
+ vars["DIMTAD"]=new DRW_Variant(70, buf->getRawChar8());
+ vars["DIMUNIT"]=new DRW_Variant(70, buf->getBitShort());///////////
+ vars["DIMAUNIT"]=new DRW_Variant(70, buf->getBitShort());
+ vars["DIMDEC"]=new DRW_Variant(70, buf->getBitShort());
+ vars["DIMTDEC"]=new DRW_Variant(70, buf->getBitShort());
+ vars["DIMALTU"]=new DRW_Variant(70, buf->getBitShort());
+ vars["DIMALTTD"]=new DRW_Variant(70, buf->getBitShort());
+ dwgHandle DIMTXSTY = hBbuf->getHandle();
+ DRW_DBG("\nDIMTXSTY: "); DRW_DBGHL(DIMTXSTY.code, DIMTXSTY.size, DIMTXSTY.ref);
+ }
+ vars["DIMSCALE"]=new DRW_Variant(40, buf->getBitDouble());
+ vars["DIMASZ"]=new DRW_Variant(40, buf->getBitDouble());
+ vars["DIMEXO"]=new DRW_Variant(40, buf->getBitDouble());
+ vars["DIMDLI"]=new DRW_Variant(40, buf->getBitDouble());
+ vars["DIMEXE"]=new DRW_Variant(40, buf->getBitDouble());
+ vars["DIMRND"]=new DRW_Variant(40, buf->getBitDouble());
+ vars["DIMDLE"]=new DRW_Variant(40, buf->getBitDouble());
+ vars["DIMTP"]=new DRW_Variant(40, buf->getBitDouble());
+ vars["DIMTM"]=new DRW_Variant(40, buf->getBitDouble());
+ if (version > DRW::AC1018) {//2007+
+ vars["DIMFXL"]=new DRW_Variant(40, buf->getBitDouble());//////////////////
+ vars["DIMJOGANG"]=new DRW_Variant(40, buf->getBitDouble());///////////////
+ vars["DIMTFILL"]=new DRW_Variant(70, buf->getBitShort());
+ vars["DIMTFILLCLR"]=new DRW_Variant(62, buf->getCmColor(version));
+ }
+ if (version > DRW::AC1014) {//2000+
+ vars["DIMTOL"]=new DRW_Variant(70, buf->getBit());
+ vars["DIMLIM"]=new DRW_Variant(70, buf->getBit());
+ vars["DIMTIH"]=new DRW_Variant(70, buf->getBit());
+ vars["DIMTOH"]=new DRW_Variant(70, buf->getBit());
+ vars["DIMSE1"]=new DRW_Variant(70, buf->getBit());
+ vars["DIMSE2"]=new DRW_Variant(70, buf->getBit());
+ vars["DIMTAD"]=new DRW_Variant(70, buf->getBitShort());
+ vars["DIMZIN"]=new DRW_Variant(70, buf->getBitShort());
+ vars["DIMAZIN"]=new DRW_Variant(70, buf->getBitShort());
+ }
+ if (version > DRW::AC1018) {//2007+
+ vars["DIMARCSYM"]=new DRW_Variant(70, buf->getBitShort());
+ }
+ vars["DIMTXT"]=new DRW_Variant(40, buf->getBitDouble());
+ vars["DIMCEN"]=new DRW_Variant(40, buf->getBitDouble());
+ vars["DIMTSZ"]=new DRW_Variant(40, buf->getBitDouble());
+ vars["DIMALTF"]=new DRW_Variant(40, buf->getBitDouble());
+ vars["DIMLFAC"]=new DRW_Variant(40, buf->getBitDouble());
+ vars["DIMTVP"]=new DRW_Variant(40, buf->getBitDouble());
+ vars["DIMTFAC"]=new DRW_Variant(40, buf->getBitDouble());
+ vars["DIMGAP"]=new DRW_Variant(40, buf->getBitDouble());
+ if (version < DRW::AC1015) {//r14-
+ vars["DIMPOST"]=new DRW_Variant(1, buf->getCP8Text());
+ vars["DIMAPOST"]=new DRW_Variant(1, buf->getCP8Text());
+ vars["DIMBLK"]=new DRW_Variant(1, buf->getCP8Text());
+ vars["DIMBLK1"]=new DRW_Variant(1, buf->getCP8Text());
+ vars["DIMBLK2"]=new DRW_Variant(1, buf->getCP8Text());
+ }
+ if (version > DRW::AC1014) {//2000+
+ vars["DIMALTRND"]=new DRW_Variant(40, buf->getBitDouble());
+ vars["DIMALT"]=new DRW_Variant(70, buf->getBit());
+ vars["DIMALTD"]=new DRW_Variant(70, buf->getBitShort());
+ vars["DIMTOFL"]=new DRW_Variant(70, buf->getBit());
+ vars["DIMSAH"]=new DRW_Variant(70, buf->getBit());
+ vars["DIMTIX"]=new DRW_Variant(70, buf->getBit());
+ vars["DIMSOXD"]=new DRW_Variant(70, buf->getBit());
+ }
+ vars["DIMCLRD"]=new DRW_Variant(70, buf->getCmColor(version));//RLZ: TODO read CMC or EMC color
+ vars["DIMCLRE"]=new DRW_Variant(70, buf->getCmColor(version));//RLZ: TODO read CMC or EMC color
+ vars["DIMCLRT"]=new DRW_Variant(70, buf->getCmColor(version));//RLZ: TODO read CMC or EMC color
+ if (version > DRW::AC1014) {//2000+
+ vars["DIAMDEC"]=new DRW_Variant(70, buf->getBitShort());
+ vars["DIMDEC"]=new DRW_Variant(70, buf->getBitShort());
+ vars["DIMTDEC"]=new DRW_Variant(70, buf->getBitShort());
+ vars["DIMALTU"]=new DRW_Variant(70, buf->getBitShort());
+ vars["DIMALTTD"]=new DRW_Variant(70, buf->getBitShort());
+ vars["DIMAUNIT"]=new DRW_Variant(70, buf->getBitShort());
+ vars["DIMFAC"]=new DRW_Variant(70, buf->getBitShort());///////////////// DIMFAC O DIMFRAC
+ vars["DIMLUNIT"]=new DRW_Variant(70, buf->getBitShort());
+ vars["DIMDSEP"]=new DRW_Variant(70, buf->getBitShort());
+ vars["DIMTMOVE"]=new DRW_Variant(70, buf->getBitShort());
+ vars["DIMJUST"]=new DRW_Variant(70, buf->getBitShort());
+ vars["DIMSD1"]=new DRW_Variant(70, buf->getBit());
+ vars["DIMSD2"]=new DRW_Variant(70, buf->getBit());
+ vars["DIMTOLJ"]=new DRW_Variant(70, buf->getBitShort());
+ vars["DIMTZIN"]=new DRW_Variant(70, buf->getBitShort());
+ vars["DIMALTZ"]=new DRW_Variant(70, buf->getBitShort());
+ vars["DIMALTTZ"]=new DRW_Variant(70, buf->getBitShort());
+ vars["DIMUPT"]=new DRW_Variant(70, buf->getBit());
+ vars["DIMATFIT"]=new DRW_Variant(70, buf->getBitShort());
+ }
+ if (version > DRW::AC1018) {//2007+
+ vars["DIMFXLON"]=new DRW_Variant(70, buf->getBit());////////////////
+ }
+ if (version > DRW::AC1021) {//2010+
+ vars["DIMTXTDIRECTION"]=new DRW_Variant(70, buf->getBit());////////////////
+ vars["DIMALTMZF"]=new DRW_Variant(40, buf->getBitDouble());////////////////
+ vars["DIMMZF"]=new DRW_Variant(40, buf->getBitDouble());////////////////
+ }
+ if (version > DRW::AC1014) {//2000+
+ dwgHandle DIMTXSTY = hBbuf->getHandle();
+ DRW_DBG("\nDIMTXSTY: "); DRW_DBGHL(DIMTXSTY.code, DIMTXSTY.size, DIMTXSTY.ref);
+ dwgHandle DIMLDRBLK = hBbuf->getHandle();
+ DRW_DBG("\nDIMLDRBLK: "); DRW_DBGHL(DIMLDRBLK.code, DIMLDRBLK.size, DIMLDRBLK.ref);
+ dwgHandle DIMBLK = hBbuf->getHandle();
+ DRW_DBG("\nDIMBLK: "); DRW_DBGHL(DIMBLK.code, DIMBLK.size, DIMBLK.ref);
+ dwgHandle DIMBLK1 = hBbuf->getHandle();
+ DRW_DBG("\nDIMBLK1: "); DRW_DBGHL(DIMBLK1.code, DIMBLK1.size, DIMBLK1.ref);
+ dwgHandle DIMBLK2 = hBbuf->getHandle();
+ DRW_DBG("\nDIMBLK2: "); DRW_DBGHL(DIMBLK2.code, DIMBLK2.size, DIMBLK2.ref);
+ }
+ if (version > DRW::AC1018) {//2007+
+ dwgHandle DIMLTYPE = hBbuf->getHandle();
+ DRW_DBG("\nDIMLTYPE: "); DRW_DBGHL(DIMLTYPE.code, DIMLTYPE.size, DIMLTYPE.ref);
+ dwgHandle DIMLTEX1 = hBbuf->getHandle();
+ DRW_DBG("\nDIMLTEX1: "); DRW_DBGHL(DIMLTEX1.code, DIMLTEX1.size, DIMLTEX1.ref);
+ dwgHandle DIMLTEX2 = hBbuf->getHandle();
+ DRW_DBG("\nDIMLTEX2: "); DRW_DBGHL(DIMLTEX2.code, DIMLTEX2.size, DIMLTEX2.ref);
+ }
+ if (version > DRW::AC1014) {//2000+
+ vars["DIMLWD"]=new DRW_Variant(70, buf->getBitShort());
+ vars["DIMLWE"]=new DRW_Variant(70, buf->getBitShort());
+ }
+ dwgHandle CONTROL = hBbuf->getHandle();
+ DRW_DBG("\nBLOCK CONTROL: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref);
+ blockCtrl = CONTROL.ref;
+ CONTROL = hBbuf->getHandle();
+ DRW_DBG("\nLAYER CONTROL: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref);
+ layerCtrl = CONTROL.ref;
+ CONTROL = hBbuf->getHandle();
+ DRW_DBG("\nSTYLE CONTROL: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref);
+ styleCtrl = CONTROL.ref;
+ CONTROL = hBbuf->getHandle();
+ DRW_DBG("\nLINETYPE CONTROL: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref);
+ linetypeCtrl = CONTROL.ref;
+ CONTROL = hBbuf->getHandle();
+ DRW_DBG("\nVIEW CONTROL: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref);
+ viewCtrl = CONTROL.ref;
+ CONTROL = hBbuf->getHandle();
+ DRW_DBG("\nUCS CONTROL: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref);
+ ucsCtrl = CONTROL.ref;
+ CONTROL = hBbuf->getHandle();
+ DRW_DBG("\nVPORT CONTROL: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref);
+ vportCtrl = CONTROL.ref;
+ CONTROL = hBbuf->getHandle();
+ DRW_DBG("\nAPPID CONTROL: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref);
+ appidCtrl = CONTROL.ref;
+ CONTROL = hBbuf->getHandle();
+ DRW_DBG("\nDIMSTYLE CONTROL: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref);
+ dimstyleCtrl = CONTROL.ref;
+ if (version < DRW::AC1018) {//r2000-
+ CONTROL = hBbuf->getHandle();
+ DRW_DBG("\nVIEWPORT ENTITY HEADER CONTROL: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref);
+ vpEntHeaderCtrl = CONTROL.ref; //RLZ: only in R13-R15 ????
+ }
+ CONTROL = hBbuf->getHandle();
+ DRW_DBG("\nDICT ACAD_GROUP: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref);
+ CONTROL = hBbuf->getHandle();
+ DRW_DBG("\nDICT ACAD_MLINESTYLE: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref);
+ CONTROL = hBbuf->getHandle();
+ DRW_DBG("\nDICT NAMED OBJS: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref);
+
+ if (version > DRW::AC1014) {//2000+
+ vars["TSTACKALIGN"]=new DRW_Variant(70, buf->getBitShort());
+ vars["TSTACKSIZE"]=new DRW_Variant(70, buf->getBitShort());
+ if (version < DRW::AC1021) {//2004-
+ vars["HYPERLINKBASE"]=new DRW_Variant(1, buf->getCP8Text());
+ vars["STYLESHEET"]=new DRW_Variant(1, buf->getCP8Text());
+ }
+ CONTROL = hBbuf->getHandle();
+ DRW_DBG("\nDICT LAYOUTS: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref);
+ CONTROL = hBbuf->getHandle();
+ DRW_DBG("\nDICT PLOTSETTINGS: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref);
+ CONTROL = hBbuf->getHandle();
+ DRW_DBG("\nDICT PLOTSTYLES: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref);
+ }
+ if (version > DRW::AC1015) {//2004+
+ CONTROL = hBbuf->getHandle();
+ DRW_DBG("\nDICT MATERIALS: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref);
+ CONTROL = hBbuf->getHandle();
+ DRW_DBG("\nDICT COLORS: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref);
+ }
+ if (version > DRW::AC1018) {//2007+
+ CONTROL = hBbuf->getHandle();
+ DRW_DBG("\nDICT VISUALSTYLE: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref);
+ }
+ if (version > DRW::AC1024) {//2013+
+ CONTROL = hBbuf->getHandle();
+ DRW_DBG("\nUNKNOWN HANDLE: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref);
+ }
+ if (version > DRW::AC1014) {//2000+
+ DRW_DBG("\nFlags: "); DRW_DBGH(buf->getBitLong());//RLZ TODO change to 8 vars
+ vars["INSUNITS"]=new DRW_Variant(70, buf->getBitShort());
+ duint16 cepsntype = buf->getBitShort();
+ vars["CEPSNTYPE"]=new DRW_Variant(70, cepsntype);
+ if (cepsntype == 3){
+ CONTROL = hBbuf->getHandle();
+ DRW_DBG("\nCPSNID HANDLE: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref);
+ }
+ if (version < DRW::AC1021) {//2004-
+ vars["FINGERPRINTGUID"]=new DRW_Variant(1, buf->getCP8Text());
+ vars["VERSIONGUID"]=new DRW_Variant(1, buf->getCP8Text());
+ }
+ }
+ if (version > DRW::AC1015) {//2004+
+ vars["SORTENTS"]=new DRW_Variant(70, buf->getRawChar8());
+ vars["INDEXCTL"]=new DRW_Variant(70, buf->getRawChar8());
+ vars["HIDETEXT"]=new DRW_Variant(70, buf->getRawChar8());
+ vars["XCLIPFRAME"]=new DRW_Variant(70, buf->getRawChar8());
+ vars["DIMASSOC"]=new DRW_Variant(70, buf->getRawChar8());
+ vars["HALOGAP"]=new DRW_Variant(70, buf->getRawChar8());
+ vars["OBSCUREDCOLOR"]=new DRW_Variant(70, buf->getBitShort());
+ vars["INTERSECTIONCOLOR"]=new DRW_Variant(70, buf->getBitShort());
+ vars["OBSCUREDLTYPE"]=new DRW_Variant(70, buf->getRawChar8());
+ vars["INTERSECTIONDISPLAY"]=new DRW_Variant(70, buf->getRawChar8());
+ if (version < DRW::AC1021) {//2004-
+ vars["PROJECTNAME"]=new DRW_Variant(1, buf->getCP8Text());
+ }
+ }
+ CONTROL = hBbuf->getHandle();
+ DRW_DBG("\nBLOCK PAPER_SPACE: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref);
+ CONTROL = hBbuf->getHandle();
+ DRW_DBG("\nBLOCK MODEL_SPACE: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref);
+ CONTROL = hBbuf->getHandle();
+ DRW_DBG("\nLTYPE BYLAYER: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref);
+ CONTROL = hBbuf->getHandle();
+ DRW_DBG("\nLTYPE BYBLOCK: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref);
+ CONTROL = hBbuf->getHandle();
+ DRW_DBG("\nLTYPE CONTINUOUS: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref);
+ if (version > DRW::AC1018) {//2007+
+ vars["CAMERADISPLAY"]=new DRW_Variant(70, buf->getBit());
+ DRW_DBG("\nUnknown 2007+ long1: "); DRW_DBG(buf->getBitLong());
+ DRW_DBG("\nUnknown 2007+ long2: "); DRW_DBG(buf->getBitLong());
+ DRW_DBG("\nUnknown 2007+ double2: "); DRW_DBG(buf->getBitDouble());
+ vars["STEPSPERSEC"]=new DRW_Variant(40, buf->getBitDouble());
+ vars["STEPSIZE"]=new DRW_Variant(40, buf->getBitDouble());
+ vars["3DDWFPREC"]=new DRW_Variant(40, buf->getBitDouble());
+ vars["LENSLENGTH"]=new DRW_Variant(40, buf->getBitDouble());
+ vars["CAMERAHEIGHT"]=new DRW_Variant(40, buf->getBitDouble());
+ vars["SOLIDHIST"]=new DRW_Variant(70, buf->getRawChar8());
+ vars["SHOWHIST"]=new DRW_Variant(70, buf->getRawChar8());
+ vars["PSOLWIDTH"]=new DRW_Variant(40, buf->getBitDouble());
+ vars["PSOLHEIGHT"]=new DRW_Variant(40, buf->getBitDouble());
+ vars["LOFTANG1"]=new DRW_Variant(40, buf->getBitDouble());
+ vars["LOFTANG2"]=new DRW_Variant(40, buf->getBitDouble());
+ vars["LOFTMAG1"]=new DRW_Variant(40, buf->getBitDouble());
+ vars["LOFTMAG2"]=new DRW_Variant(40, buf->getBitDouble());
+ vars["LOFTPARAM"]=new DRW_Variant(70, buf->getBitShort());
+ vars["LOFTNORMALS"]=new DRW_Variant(40, buf->getRawChar8());
+ vars["LATITUDE"]=new DRW_Variant(40, buf->getBitDouble());
+ vars["LONGITUDE"]=new DRW_Variant(40, buf->getBitDouble());
+ vars["NORTHDIRECTION"]=new DRW_Variant(40, buf->getBitDouble());
+ vars["TIMEZONE"]=new DRW_Variant(70, buf->getBitLong());
+ vars["LIGHTGLYPHDISPLAY"]=new DRW_Variant(70, buf->getRawChar8());
+ vars["TILEMODELIGHTSYNCH"]=new DRW_Variant(70, buf->getRawChar8());
+ vars["DWFFRAME"]=new DRW_Variant(70, buf->getRawChar8());
+ vars["DGNFRAME"]=new DRW_Variant(70, buf->getRawChar8());
+ DRW_DBG("\nUnknown 2007+ BIT: "); DRW_DBG(buf->getBit());
+ vars["INTERFERECOLOR"]=new DRW_Variant(70, buf->getCmColor(version));
+ CONTROL = hBbuf->getHandle();
+ DRW_DBG("\nINTERFEREOBJVS: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref);
+ CONTROL = hBbuf->getHandle();
+ DRW_DBG("\nINTERFEREVPVS: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref);
+ CONTROL = hBbuf->getHandle();
+ DRW_DBG("\nDRAGVS: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref);
+ vars["CSHADOW"]=new DRW_Variant(70, buf->getRawChar8());
+ DRW_DBG("\nUnknown 2007+ double2: "); DRW_DBG(buf->getBitDouble());
+ }
+ if (version > DRW::AC1012) {//R14+
+ DRW_DBG("\nUnknown R14+ short1: "); DRW_DBG(buf->getBitShort());
+ DRW_DBG("\nUnknown R14+ short2: "); DRW_DBG(buf->getBitShort());
+ DRW_DBG("\nUnknown R14+ short3: "); DRW_DBG(buf->getBitShort());
+ DRW_DBG("\nUnknown R14+ short4: "); DRW_DBG(buf->getBitShort());
+ }
+
+ DRW_DBG("\nbuf position: "); DRW_DBG(buf->getPosition());
+ DRW_DBG(" buf bit position: "); DRW_DBG(buf->getBitPos());
+
+
+ /**** RLZ: disabled, pending to read all data ***/
+ //Start reading string stream for 2007 and further
+ if (version > DRW::AC1018) {//2007+
+ duint32 strStartPos = endBitPos -1;
+ buf->setPosition(strStartPos >>3);
+ buf->setBitPos(strStartPos&7);
+ if (buf->getBit() == 1){
+ strStartPos -= 16;
+ buf->setPosition(strStartPos >>3);
+ buf->setBitPos(strStartPos&7);
+ duint32 strDataSize = buf->getRawShort16();
+ if (strDataSize & 0x8000) {
+ strStartPos -= 16;//decrement 16 bits
+ strDataSize &= 0x7FFF; //strip 0x8000;
+ buf->setPosition(strStartPos >> 3);
+ buf->setBitPos(strStartPos & 7);
+ duint32 hiSize = buf->getRawShort16();
+ strDataSize |= (hiSize << 15);
+ }
+ strStartPos -= strDataSize;
+ buf->setPosition(strStartPos >> 3);
+ buf->setBitPos(strStartPos & 7);
+
+ DRW_DBG("\nstring buf position: "); DRW_DBG(buf->getPosition());
+ DRW_DBG("\nstring buf bit position: "); DRW_DBG(buf->getBitPos());
+ }
+ DRW_DBG("\nUnknown text1: "); DRW_DBG(buf->getUCSText(false));
+ DRW_DBG("\nUnknown text2: "); DRW_DBG(buf->getUCSText(false));
+ DRW_DBG("\nUnknown text3: "); DRW_DBG(buf->getUCSText(false));
+ DRW_DBG("\nUnknown text4: "); DRW_DBG(buf->getUCSText(false));
+ vars["MENU"]=new DRW_Variant(1, buf->getUCSText(false));
+ vars["DIMPOST"]=new DRW_Variant(1, buf->getUCSText(false));
+ vars["DIMAPOST"]=new DRW_Variant(1, buf->getUCSText(false));
+ if (version > DRW::AC1021) {//2010+
+ vars["DIMALTMZS"]=new DRW_Variant(70, buf->getUCSText(false));//RLZ: pending to verify//////////////
+ vars["DIMMZS"]=new DRW_Variant(70, buf->getUCSText(false));//RLZ: pending to verify//////////////
+ }
+ vars["HYPERLINKBASE"]=new DRW_Variant(1, buf->getUCSText(false));
+ vars["STYLESHEET"]=new DRW_Variant(1, buf->getUCSText(false));
+ vars["FINGERPRINTGUID"]=new DRW_Variant(1, buf->getUCSText(false));
+ DRW_DBG("\nstring buf position: "); DRW_DBG(buf->getPosition());
+ DRW_DBG(" string buf bit position: "); DRW_DBG(buf->getBitPos());
+ vars["VERSIONGUID"]=new DRW_Variant(1, buf->getUCSText(false));
+ DRW_DBG("\nstring buf position: "); DRW_DBG(buf->getPosition());
+ DRW_DBG(" string buf bit position: "); DRW_DBG(buf->getBitPos());
+ vars["PROJECTNAME"]=new DRW_Variant(1, buf->getUCSText(false));
+ }
+/*** ****/
+ DRW_DBG("\nstring buf position: "); DRW_DBG(buf->getPosition());
+ DRW_DBG(" string buf bit position: "); DRW_DBG(buf->getBitPos());
+
+ if (DRW_DBGGL == DRW_dbg::DEBUG){
+ for (std::map<std::string,DRW_Variant*>::iterator it=vars.begin(); it!=vars.end(); ++it){
+ DRW_DBG("\n"); DRW_DBG(it->first); DRW_DBG(": ");
+ switch (it->second->type){
+ case DRW_Variant::INTEGER:
+ DRW_DBG(it->second->content.i);
+ break;
+ case DRW_Variant::DOUBLE:
+ DRW_DBG(it->second->content.d);
+ break;
+ case DRW_Variant::STRING:
+ DRW_DBG(it->second->content.s->c_str());
+ break;
+ case DRW_Variant::COORD:
+ DRW_DBG("x= "); DRW_DBG(it->second->content.v->x);
+ DRW_DBG(", y= "); DRW_DBG(it->second->content.v->y);
+ DRW_DBG(", z= "); DRW_DBG(it->second->content.v->z);
+ break;
+ default:
+ break;
+ }
+ DRW_DBG(" code: ");DRW_DBG(it->second->code);
+ }
+ }
+
+ buf->setPosition(size+16+4); //readed size +16 start sentinel + 4 size
+ if (version > DRW::AC1021 && mv > 3) { //2010+
+ buf->getRawLong32();//advance 4 bytes (hisize)
+ }
+ DRW_DBG("\nseting position to: "); DRW_DBG(buf->getPosition());
+ DRW_DBG("\nHeader CRC: "); DRW_DBGH(buf->getRawShort16());
+ DRW_DBG("\nbuf position: "); DRW_DBG(buf->getPosition());
+ DRW_DBG("\ndwg header end sentinel= ");
+ for (int i=0; i<16;i++) {
+ DRW_DBGH(buf->getRawChar8()); DRW_DBG(" ");
+ }
+
+ //temporary code to show header end sentinel
+ duint64 sz= buf->size()-1;
+ if (version < DRW::AC1018) {//pre 2004
+ sz= buf->size()-16;
+ buf->setPosition(sz);
+ DRW_DBG("\nseting position to: "); DRW_DBG(buf->getPosition());
+ DRW_DBG("\ndwg header end sentinel= ");
+ for (int i=0; i<16;i++) {
+ DRW_DBGH(buf->getRawChar8()); DRW_DBG(" ");
+ }
+ } else if (version == DRW::AC1018) {//2004
+// sz= buf->size()-132;
+// buf->setPosition(sz);
+ buf->moveBitPos(-128);
+ DRW_DBG("\nseting position to: "); DRW_DBG(buf->getPosition());
+ DRW_DBG("\ndwg header end sentinel= ");
+ for (int i=0; i<16;i++) {
+ DRW_DBGH(buf->getRawChar8()); DRW_DBG(" ");
+ }
+ } else if (version == DRW::AC1021) {//2007
+ sz= buf->size()-16;
+ buf->setPosition(sz);
+ DRW_DBG("\nseting position to: "); DRW_DBG(buf->getPosition());
+ DRW_DBG("\ndwg header end sentinel= ");
+ for (int i=0; i<16;i++) {
+ DRW_DBGH(buf->getRawChar8()); DRW_DBG(" ");
+ }
+ } else if (version == DRW::AC1024) {//2010
+// sz= buf->size()-93;
+// buf->setPosition(sz);
+ buf->moveBitPos(-128);
+ DRW_DBG("\nseting position to: "); DRW_DBG(buf->getPosition());
+ DRW_DBG("\ndwg header end sentinel= ");
+ for (int i=0; i<16;i++) {
+ DRW_DBGH(buf->getRawChar8()); DRW_DBG(" ");
+ }
+ } else if (version == DRW::AC1027) {//2013
+// sz= buf->size()-76;
+// buf->setPosition(sz);
+ buf->moveBitPos(-128);
+ DRW_DBG("\nseting position to: "); DRW_DBG(buf->getPosition());
+ DRW_DBG("\ndwg header end sentinel= ");
+ for (int i=0; i<16;i++) {
+ DRW_DBGH(buf->getRawChar8()); DRW_DBG(" ");
+ }
+ }
+
+ return result;
+}
--- /dev/null
+/******************************************************************************
+** libDXFrw - Library to read/write DXF files (ascii & binary) **
+** **
+** Copyright (C) 2011-2015 José F. Soriano, rallazz@gmail.com **
+** **
+** This library is free software, licensed under the terms of the GNU **
+** General Public License as published by the Free Software Foundation, **
+** either version 2 of the License, or (at your option) any later version. **
+** You should have received a copy of the GNU General Public License **
+** along with this program. If not, see <http://www.gnu.org/licenses/>. **
+******************************************************************************/
+
+#ifndef DRW_HEADER_H
+#define DRW_HEADER_H
+
+
+#include <map>
+#include "drw_base.h"
+
+class dxfReader;
+class dxfWriter;
+class dwgBuffer;
+
+#define SETHDRFRIENDS friend class dxfRW; \
+ friend class dwgReader;
+
+//! Class to handle header entries
+/*!
+* Class to handle header vars, to read iterate over "std::map vars"
+* to write add a DRW_Variant* into "std::map vars" (do not delete it, are cleared in dtor)
+* or use add* helper functions.
+* @author Rallaz
+*/
+class DRW_Header {
+ SETHDRFRIENDS
+public:
+ DRW_Header();
+ ~DRW_Header() {
+ clearVars();
+ }
+
+ DRW_Header(const DRW_Header& h){
+ this->version = h.version;
+ this->comments = h.comments;
+ for (std::map<std::string,DRW_Variant*>::const_iterator it=h.vars.begin(); it!=h.vars.end(); ++it){
+ this->vars[it->first] = new DRW_Variant( *(it->second) );
+ }
+ this->curr = NULL;
+ }
+ DRW_Header& operator=(const DRW_Header &h) {
+ if(this != &h) {
+ clearVars();
+ this->version = h.version;
+ this->comments = h.comments;
+ for (std::map<std::string,DRW_Variant*>::const_iterator it=h.vars.begin(); it!=h.vars.end(); ++it){
+ this->vars[it->first] = new DRW_Variant( *(it->second) );
+ }
+ }
+ return *this;
+ }
+
+ void addDouble(std::string key, double value, int code);
+ void addInt(std::string key, int value, int code);
+ void addStr(std::string key, std::string value, int code);
+ void addCoord(std::string key, DRW_Coord value, int code);
+ std::string getComments() const {return comments;}
+ void write(dxfWriter *writer, DRW::Version ver);
+ void addComment(std::string c);
+
+protected:
+ void parseCode(int code, dxfReader *reader);
+ bool parseDwg(DRW::Version version, dwgBuffer *buf, dwgBuffer *hBbuf, duint8 mv=0);
+private:
+ bool getDouble(std::string key, double *varDouble);
+ bool getInt(std::string key, int *varInt);
+ bool getStr(std::string key, std::string *varStr);
+ bool getCoord(std::string key, DRW_Coord *varStr);
+ void clearVars(){
+ for (std::map<std::string,DRW_Variant*>::iterator it=vars.begin(); it!=vars.end(); ++it)
+ delete it->second;
+
+ vars.clear();
+ }
+
+public:
+ std::map<std::string,DRW_Variant*> vars;
+private:
+ std::string comments;
+ std::string name;
+ DRW_Variant* curr;
+ int version; //to use on read
+
+ duint32 linetypeCtrl;
+ duint32 layerCtrl;
+ duint32 styleCtrl;
+ duint32 dimstyleCtrl;
+ duint32 appidCtrl;
+ duint32 blockCtrl;
+ duint32 viewCtrl;
+ duint32 ucsCtrl;
+ duint32 vportCtrl;
+ duint32 vpEntHeaderCtrl;
+};
+
+#endif
+
+// EOF
--- /dev/null
+/******************************************************************************
+** libDXFrw - Library to read/write DXF files (ascii & binary) **
+** **
+** Copyright (C) 2011-2015 José F. Soriano, rallazz@gmail.com **
+** **
+** This library is free software, licensed under the terms of the GNU **
+** General Public License as published by the Free Software Foundation, **
+** either version 2 of the License, or (at your option) any later version. **
+** You should have received a copy of the GNU General Public License **
+** along with this program. If not, see <http://www.gnu.org/licenses/>. **
+******************************************************************************/
+
+#ifndef DRW_INTERFACE_H
+#define DRW_INTERFACE_H
+
+#include <cstring>
+
+#include "drw_entities.h"
+#include "drw_objects.h"
+#include "drw_header.h"
+
+/**
+ * Abstract class (interface) for comunicate dxfReader with the application.
+ * Inherit your class which takes care of the entities in the
+ * processed DXF file from this interface.
+ *
+ * @author Rallaz
+ */
+class DRW_Interface {
+public:
+ DRW_Interface() {
+ }
+ virtual ~DRW_Interface() {
+ }
+
+ /** Called when header is parsed. */
+ virtual void addHeader(const DRW_Header *) { }
+
+ /** Called for every line Type. */
+ virtual void addLType(const DRW_LType &) { }
+ /** Called for every layer. */
+ virtual void addLayer(const DRW_Layer &) { }
+ /** Called for every dim style. */
+ virtual void addDimStyle(const DRW_Dimstyle &) { }
+ /** Called for every VPORT table. */
+ virtual void addVport(const DRW_Vport &) { }
+ /** Called for every text style. */
+ virtual void addTextStyle(const DRW_Textstyle &) { }
+ /** Called for every AppId entry. */
+ virtual void addAppId(const DRW_AppId &) { }
+
+ /**
+ * Called for every block. Note: all entities added after this
+ * command go into this block until endBlock() is called.
+ *
+ * @see endBlock()
+ */
+ virtual void addBlock(const DRW_Block &) { }
+
+ /** Called to end the current block */
+ virtual void endBlock() { }
+
+ /** Called for every point */
+ virtual void addPoint(const DRW_Point &) { }
+
+ /** Called for every line */
+ virtual void addLine(const DRW_Line &) { }
+
+ /** Called for every ray */
+ virtual void addRay(const DRW_Ray &) { }
+
+ /** Called for every xline */
+ virtual void addXline(const DRW_Xline &) { }
+
+ /** Called for every arc */
+ virtual void addArc(const DRW_Arc &) { }
+
+ /** Called for every circle */
+ virtual void addCircle(const DRW_Circle &) { }
+
+ /** Called for every ellipse */
+ virtual void addEllipse(const DRW_Ellipse &) { }
+
+ /** Called for every lwpolyline */
+ virtual void addLWPolyline(const DRW_LWPolyline &) { }
+
+ /** Called for every polyline start */
+ virtual void addPolyline(const DRW_Polyline &) { }
+
+ /** Called for every spline */
+ virtual void addSpline(const DRW_Spline *) { }
+
+ /** Called for every spline knot value */
+ virtual void addKnot(const DRW_Entity &) { }
+
+ /** Called for every insert. */
+ virtual void addInsert(const DRW_Insert &) { }
+
+ /** Called for every trace start */
+ virtual void addTrace(const DRW_Trace &) { }
+
+ /** Called for every 3dface start */
+ virtual void add3dFace(const DRW_3Dface &) { }
+
+ /** Called for every solid start */
+ virtual void addSolid(const DRW_Solid &) { }
+
+
+ /** Called for every Multi Text entity. */
+ virtual void addMText(const DRW_MText &) { }
+
+ /** Called for every Text entity. */
+ virtual void addText(const DRW_Text &) { }
+
+ /**
+ * Called for every aligned dimension entity.
+ */
+ virtual void addDimAlign(const DRW_DimAligned *) { }
+ /**
+ * Called for every linear or rotated dimension entity.
+ */
+ virtual void addDimLinear(const DRW_DimLinear *) { }
+
+ /**
+ * Called for every radial dimension entity.
+ */
+ virtual void addDimRadial(const DRW_DimRadial *) { }
+
+ /**
+ * Called for every diametric dimension entity.
+ */
+ virtual void addDimDiametric(const DRW_DimDiametric *) { }
+
+ /**
+ * Called for every angular dimension (2 lines version) entity.
+ */
+ virtual void addDimAngular(const DRW_DimAngular *) { }
+
+ /**
+ * Called for every angular dimension (3 points version) entity.
+ */
+ virtual void addDimAngular3P(const DRW_DimAngular3p *) { }
+
+ /**
+ * Called for every ordinate dimension entity.
+ */
+ virtual void addDimOrdinate(const DRW_DimOrdinate *) { }
+
+ /**
+ * Called for every leader start.
+ */
+ virtual void addLeader(const DRW_Leader *) { }
+
+ /**
+ * Called for every hatch entity.
+ */
+ virtual void addHatch(const DRW_Hatch *) { }
+
+ /**
+ * Called for every viewport entity.
+ */
+ virtual void addViewport(const DRW_Viewport &) { }
+
+ /**
+ * Called for every image entity.
+ */
+ virtual void addImage(const DRW_Image *) { }
+
+ /**
+ * Called for every image definition.
+ */
+ virtual void linkImage(const DRW_ImageDef *) { }
+
+ /**
+ * Called for every comment in the DXF file (code 999).
+ */
+ virtual void addComment(const char *) { }
+
+ virtual void writeHeader(DRW_Header &) { }
+ virtual void writeBlocks() { }
+ virtual void writeBlockRecords() { }
+ virtual void writeEntities() { }
+ virtual void writeLTypes() { }
+ virtual void writeLayers() { }
+ virtual void writeTextstyles() { }
+ virtual void writeVports() { }
+ virtual void writeDimstyles() { }
+ virtual void writeAppId() { }
+};
+
+#endif
--- /dev/null
+/******************************************************************************
+** libDXFrw - Library to read/write DXF files (ascii & binary) **
+** **
+** Copyright (C) 2011-2015 José F. Soriano, rallazz@gmail.com **
+** **
+** This library is free software, licensed under the terms of the GNU **
+** General Public License as published by the Free Software Foundation, **
+** either version 2 of the License, or (at your option) any later version. **
+** You should have received a copy of the GNU General Public License **
+** along with this program. If not, see <http://www.gnu.org/licenses/>. **
+******************************************************************************/
+
+#include <iostream>
+#include <cmath>
+#include "drw_objects.h"
+#include "intern/dxfreader.h"
+#include "intern/dxfwriter.h"
+#include "intern/dwgbuffer.h"
+#include "intern/drw_dbg.h"
+#include "intern/dwgutil.h"
+
+//! Base class for tables entries
+/*!
+* Base class for tables entries
+* @author Rallaz
+*/
+void DRW_TableEntry::parseCode(int code, dxfReader *reader){
+ switch (code) {
+ case 5:
+ handle = reader->getHandleString();
+ break;
+ case 330:
+ parentHandle = reader->getHandleString();
+ break;
+ case 2:
+ name = reader->getUtf8String();
+ break;
+ case 70:
+ flags = reader->getInt32();
+ break;
+ case 1000:
+ case 1001:
+ case 1002:
+ case 1003:
+ case 1004:
+ case 1005:
+ extData.push_back(new DRW_Variant(code, reader->getString()));
+ break;
+ case 1010:
+ case 1011:
+ case 1012:
+ case 1013:
+ curr = new DRW_Variant();
+ curr->addCoord();
+ curr->setCoordX(reader->getDouble());
+ curr->code = code;
+ extData.push_back(curr);
+ break;
+ case 1020:
+ case 1021:
+ case 1022:
+ case 1023:
+ if (curr)
+ curr->setCoordY(reader->getDouble());
+ break;
+ case 1030:
+ case 1031:
+ case 1032:
+ case 1033:
+ if (curr)
+ curr->setCoordZ(reader->getDouble());
+ curr=NULL;
+ break;
+ case 1040:
+ case 1041:
+ case 1042:
+ extData.push_back(new DRW_Variant(code, reader->getDouble()));
+ break;
+ case 1070:
+ case 1071:
+ extData.push_back(new DRW_Variant(code, reader->getInt32() ));
+ break;
+ default:
+ break;
+ }
+}
+
+bool DRW_TableEntry::parseDwg(DRW::Version version, dwgBuffer *buf, dwgBuffer *strBuf, duint32 bs){
+DRW_DBG("\n***************************** parsing table entry *********************************************\n");
+ objSize=0;
+ oType = buf->getObjType(version);
+ DRW_DBG("Object type: "); DRW_DBG(oType); DRW_DBG(", "); DRW_DBGH(oType);
+ if (version > DRW::AC1014 && version < DRW::AC1024) {//2000 to 2007
+ objSize = buf->getRawLong32(); //RL 32bits object size in bits
+ DRW_DBG(" Object size: "); DRW_DBG(objSize); DRW_DBG("\n");
+ }
+ if (version > DRW::AC1021) {//2010+
+ duint32 ms = buf->size();
+ objSize = ms*8 - bs;
+ DRW_DBG(" Object size: "); DRW_DBG(objSize); DRW_DBG("\n");
+ }
+ if (strBuf != NULL && version > DRW::AC1018) {//2007+
+ strBuf->moveBitPos(objSize-1);
+ DRW_DBG(" strBuf strbit pos 2007: "); DRW_DBG(strBuf->getPosition()); DRW_DBG(" strBuf bpos 2007: "); DRW_DBG(strBuf->getBitPos()); DRW_DBG("\n");
+ if (strBuf->getBit() == 1){
+ DRW_DBG("DRW_TableEntry::parseDwg string bit is 1\n");
+ strBuf->moveBitPos(-17);
+ duint16 strDataSize = strBuf->getRawShort16();
+ DRW_DBG("\nDRW_TableEntry::parseDwg string strDataSize: "); DRW_DBGH(strDataSize); DRW_DBG("\n");
+ if ( (strDataSize& 0x8000) == 0x8000){
+ DRW_DBG("\nDRW_TableEntry::parseDwg string 0x8000 bit is set");
+ strBuf->moveBitPos(-33);//RLZ pending to verify
+ duint16 hiSize = strBuf->getRawShort16();
+ strDataSize = ((strDataSize&0x7fff) | (hiSize<<15));
+ }
+ strBuf->moveBitPos( -strDataSize -16); //-14
+ DRW_DBG("strBuf start strDataSize pos 2007: "); DRW_DBG(strBuf->getPosition()); DRW_DBG(" strBuf bpos 2007: "); DRW_DBG(strBuf->getBitPos()); DRW_DBG("\n");
+ } else
+ DRW_DBG("\nDRW_TableEntry::parseDwg string bit is 0");
+ DRW_DBG("strBuf start pos 2007: "); DRW_DBG(strBuf->getPosition()); DRW_DBG(" strBuf bpos 2007: "); DRW_DBG(strBuf->getBitPos()); DRW_DBG("\n");
+ }
+
+ dwgHandle ho = buf->getHandle();
+ handle = ho.ref;
+ DRW_DBG("TableEntry Handle: "); DRW_DBGHL(ho.code, ho.size, ho.ref);
+ dint16 extDataSize = buf->getBitShort(); //BS
+ DRW_DBG(" ext data size: "); DRW_DBG(extDataSize);
+ while (extDataSize>0 && buf->isGood()) {
+ /* RLZ: TODO */
+ dwgHandle ah = buf->getHandle();
+ DRW_DBG("App Handle: "); DRW_DBGHL(ah.code, ah.size, ah.ref);
+ duint8 *tmpExtData = new duint8[extDataSize];
+ buf->getBytes(tmpExtData, extDataSize);
+ dwgBuffer tmpExtDataBuf(tmpExtData, extDataSize, buf->decoder);
+ int pos = tmpExtDataBuf.getPosition();
+ int bpos = tmpExtDataBuf.getBitPos();
+ DRW_DBG("ext data pos: "); DRW_DBG(pos); DRW_DBG("."); DRW_DBG(bpos); DRW_DBG("\n");
+ duint8 dxfCode = tmpExtDataBuf.getRawChar8();
+ DRW_DBG(" dxfCode: "); DRW_DBG(dxfCode);
+ switch (dxfCode){
+ case 0:{
+ duint8 strLength = tmpExtDataBuf.getRawChar8();
+ DRW_DBG(" strLength: "); DRW_DBG(strLength);
+ duint16 cp = tmpExtDataBuf.getBERawShort16();
+ DRW_DBG(" str codepage: "); DRW_DBG(cp);
+ for (int i=0;i< strLength+1;i++) {//string length + null terminating char
+ duint8 dxfChar = tmpExtDataBuf.getRawChar8();
+ DRW_DBG(" dxfChar: "); DRW_DBG(dxfChar);
+ }
+ break;
+ }
+ default:
+ /* RLZ: TODO */
+ break;
+ }
+ DRW_DBG("ext data pos: "); DRW_DBG(tmpExtDataBuf.getPosition()); DRW_DBG("."); DRW_DBG(tmpExtDataBuf.getBitPos()); DRW_DBG("\n");
+ delete[]tmpExtData;
+ extDataSize = buf->getBitShort(); //BS
+ DRW_DBG(" ext data size: "); DRW_DBG(extDataSize);
+ } //end parsing extData (EED)
+ if (version < DRW::AC1015) {//14-
+ objSize = buf->getRawLong32(); //RL 32bits size in bits
+ }
+ DRW_DBG(" objSize in bits: "); DRW_DBG(objSize);
+
+ numReactors = buf->getBitLong(); //BL
+ DRW_DBG(", numReactors: "); DRW_DBG(numReactors); DRW_DBG("\n");
+ if (version > DRW::AC1015) {//2004+
+ xDictFlag = buf->getBit();
+ DRW_DBG("xDictFlag: "); DRW_DBG(xDictFlag);
+ }
+ if (version > DRW::AC1024) {//2013+
+ duint8 bd = buf->getBit();
+ DRW_DBG(" Have binary data: "); DRW_DBG(bd); DRW_DBG("\n");
+ }
+ return buf->isGood();
+}
+
+//! Class to handle dimstyle entries
+/*!
+* Class to handle ldim style symbol table entries
+* @author Rallaz
+*/
+void DRW_Dimstyle::parseCode(int code, dxfReader *reader){
+ switch (code) {
+ case 105:
+ handle = reader->getHandleString();
+ break;
+ case 3:
+ dimpost = reader->getUtf8String();
+ break;
+ case 4:
+ dimapost = reader->getUtf8String();
+ break;
+ case 5:
+ dimblk = reader->getUtf8String();
+ break;
+ case 6:
+ dimblk1 = reader->getUtf8String();
+ break;
+ case 7:
+ dimblk2 = reader->getUtf8String();
+ break;
+ case 40:
+ dimscale = reader->getDouble();
+ break;
+ case 41:
+ dimasz = reader->getDouble();
+ break;
+ case 42:
+ dimexo = reader->getDouble();
+ break;
+ case 43:
+ dimdli = reader->getDouble();
+ break;
+ case 44:
+ dimexe = reader->getDouble();
+ break;
+ case 45:
+ dimrnd = reader->getDouble();
+ break;
+ case 46:
+ dimdle = reader->getDouble();
+ break;
+ case 47:
+ dimtp = reader->getDouble();
+ break;
+ case 48:
+ dimtm = reader->getDouble();
+ break;
+ case 49:
+ dimfxl = reader->getDouble();
+ break;
+ case 140:
+ dimtxt = reader->getDouble();
+ break;
+ case 141:
+ dimcen = reader->getDouble();
+ break;
+ case 142:
+ dimtsz = reader->getDouble();
+ break;
+ case 143:
+ dimaltf = reader->getDouble();
+ break;
+ case 144:
+ dimlfac = reader->getDouble();
+ break;
+ case 145:
+ dimtvp = reader->getDouble();
+ break;
+ case 146:
+ dimtfac = reader->getDouble();
+ break;
+ case 147:
+ dimgap = reader->getDouble();
+ break;
+ case 148:
+ dimaltrnd = reader->getDouble();
+ break;
+ case 71:
+ dimtol = reader->getInt32();
+ break;
+ case 72:
+ dimlim = reader->getInt32();
+ break;
+ case 73:
+ dimtih = reader->getInt32();
+ break;
+ case 74:
+ dimtoh = reader->getInt32();
+ break;
+ case 75:
+ dimse1 = reader->getInt32();
+ break;
+ case 76:
+ dimse2 = reader->getInt32();
+ break;
+ case 77:
+ dimtad = reader->getInt32();
+ break;
+ case 78:
+ dimzin = reader->getInt32();
+ break;
+ case 79:
+ dimazin = reader->getInt32();
+ break;
+ case 170:
+ dimalt = reader->getInt32();
+ break;
+ case 171:
+ dimaltd = reader->getInt32();
+ break;
+ case 172:
+ dimtofl = reader->getInt32();
+ break;
+ case 173:
+ dimsah = reader->getInt32();
+ break;
+ case 174:
+ dimtix = reader->getInt32();
+ break;
+ case 175:
+ dimsoxd = reader->getInt32();
+ break;
+ case 176:
+ dimclrd = reader->getInt32();
+ break;
+ case 177:
+ dimclre = reader->getInt32();
+ break;
+ case 178:
+ dimclrt = reader->getInt32();
+ break;
+ case 179:
+ dimadec = reader->getInt32();
+ break;
+ case 270:
+ dimunit = reader->getInt32();
+ break;
+ case 271:
+ dimdec = reader->getInt32();
+ break;
+ case 272:
+ dimtdec = reader->getInt32();
+ break;
+ case 273:
+ dimaltu = reader->getInt32();
+ break;
+ case 274:
+ dimalttd = reader->getInt32();
+ break;
+ case 275:
+ dimaunit = reader->getInt32();
+ break;
+ case 276:
+ dimfrac = reader->getInt32();
+ break;
+ case 277:
+ dimlunit = reader->getInt32();
+ break;
+ case 278:
+ dimdsep = reader->getInt32();
+ break;
+ case 279:
+ dimtmove = reader->getInt32();
+ break;
+ case 280:
+ dimjust = reader->getInt32();
+ break;
+ case 281:
+ dimsd1 = reader->getInt32();
+ break;
+ case 282:
+ dimsd2 = reader->getInt32();
+ break;
+ case 283:
+ dimtolj = reader->getInt32();
+ break;
+ case 284:
+ dimtzin = reader->getInt32();
+ break;
+ case 285:
+ dimaltz = reader->getInt32();
+ break;
+ case 286:
+ dimaltttz = reader->getInt32();
+ break;
+ case 287:
+ dimfit = reader->getInt32();
+ break;
+ case 288:
+ dimupt = reader->getInt32();
+ break;
+ case 289:
+ dimatfit = reader->getInt32();
+ break;
+ case 290:
+ dimfxlon = reader->getInt32();
+ break;
+ case 340:
+ dimtxsty = reader->getUtf8String();
+ break;
+ case 341:
+ dimldrblk = reader->getUtf8String();
+ break;
+ case 342:
+ dimblk = reader->getUtf8String();
+ break;
+ case 343:
+ dimblk1 = reader->getUtf8String();
+ break;
+ case 344:
+ dimblk2 = reader->getUtf8String();
+ break;
+ default:
+ DRW_TableEntry::parseCode(code, reader);
+ break;
+ }
+}
+
+bool DRW_Dimstyle::parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs){
+ dwgBuffer sBuff = *buf;
+ dwgBuffer *sBuf = buf;
+ if (version > DRW::AC1018) {//2007+
+ sBuf = &sBuff; //separate buffer for strings
+ }
+ bool ret = DRW_TableEntry::parseDwg(version, buf, sBuf, bs);
+ DRW_DBG("\n***************************** parsing dimension style **************************************\n");
+ if (!ret)
+ return ret;
+ name = sBuf->getVariableText(version, false);
+ DRW_DBG("dimension style name: "); DRW_DBG(name.c_str()); DRW_DBG("\n");
+
+// handleObj = shpControlH.ref;
+ DRW_DBG("\n Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n");
+ // RS crc; //RS */
+ return buf->isGood();
+}
+
+
+//! Class to handle line type entries
+/*!
+* Class to handle line type symbol table entries
+* @author Rallaz
+*/
+void DRW_LType::parseCode(int code, dxfReader *reader){
+ switch (code) {
+ case 3:
+ desc = reader->getUtf8String();
+ break;
+ case 73:
+ size = reader->getInt32();
+ path.reserve(size);
+ break;
+ case 40:
+ length = reader->getDouble();
+ break;
+ case 49:
+ path.push_back(reader->getDouble());
+ pathIdx++;
+ break;
+/* case 74:
+ haveShape = reader->getInt32();
+ break;*/
+ default:
+ DRW_TableEntry::parseCode(code, reader);
+ break;
+ }
+}
+
+//! Update line type
+/*!
+* Update the size and length of line type acording to the path
+* @author Rallaz
+*/
+/*TODO: control max length permited */
+void DRW_LType::update(){
+ double d =0;
+ size = path.size();
+ for (int i = 0; i< size; i++){
+ d += fabs(path.at(i));
+ }
+ length = d;
+}
+
+bool DRW_LType::parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs){
+ dwgBuffer sBuff = *buf;
+ dwgBuffer *sBuf = buf;
+ if (version > DRW::AC1018) {//2007+
+ sBuf = &sBuff; //separate buffer for strings
+ }
+ bool ret = DRW_TableEntry::parseDwg(version, buf, sBuf, bs);
+ DRW_DBG("\n***************************** parsing line type *********************************************\n");
+ if (!ret)
+ return ret;
+ name = sBuf->getVariableText(version, false);
+ DRW_DBG("linetype name: "); DRW_DBG(name.c_str()); DRW_DBG("\n");
+ flags = buf->getBit()<< 6;
+ DRW_DBG("flags: "); DRW_DBG(flags);
+ if (version > DRW::AC1018) {//2007+
+ } else {//2004- //RLZ: verify in 2004, 2010 &2013
+ dint16 xrefindex = buf->getBitShort();
+ DRW_DBG(" xrefindex: "); DRW_DBG(xrefindex);
+ }
+ duint8 xdep = buf->getBit();
+ DRW_DBG(" xdep: "); DRW_DBG(xdep);
+ flags |= xdep<< 4;
+ DRW_DBG(" flags: "); DRW_DBG(flags);
+ desc = sBuf->getVariableText(version, false);
+ DRW_DBG(" desc: "); DRW_DBG(desc.c_str());
+ length = buf->getBitDouble();
+ DRW_DBG(" pattern length: "); DRW_DBG(length);
+ char align = buf->getRawChar8();
+ DRW_DBG(" align: "); DRW_DBG(std::string(&align, 1));
+ size = buf->getRawChar8();
+ DRW_DBG(" num dashes, size: "); DRW_DBG(size);
+ DRW_DBG("\n dashes:\n");
+ bool haveStrArea = false;
+ for (int i=0; i< size; i++){
+ path.push_back(buf->getBitDouble());
+ /*int bs1 =*/ buf->getBitShort();
+ /*double d1= */buf->getRawDouble();
+ /*double d2=*/ buf->getRawDouble();
+ /*double d3= */buf->getBitDouble();
+ /*double d4= */buf->getBitDouble();
+ int bs2 = buf->getBitShort();
+ if((bs2 & 2) !=0) haveStrArea = true;
+ }
+ for (unsigned i=0; i<path.size() ; i++){
+ DRW_DBG(", "); DRW_DBG(path[i]); DRW_DBG("\n");
+ }
+ DRW_DBG("\n Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n");
+ if (version < DRW::AC1021) { //2004-
+ duint8 strarea[256];
+ buf->getBytes(strarea, 256);
+ DRW_DBG("string area 256 bytes:\n"); DRW_DBG(reinterpret_cast<char*>(strarea)); DRW_DBG("\n");
+ } else { //2007+
+ //first verify flag
+ if (haveStrArea) {
+ duint8 strarea[512];
+ buf->getBytes(strarea, 512);
+ DRW_DBG("string area 512 bytes:\n"); DRW_DBG(reinterpret_cast<char*>(strarea)); DRW_DBG("\n");
+ } else
+ DRW_DBG("string area 512 bytes not present\n");
+ }
+
+ if (version > DRW::AC1021) {//2007+ skip string area
+ DRW_DBG(" ltype end of object data pos 2010: "); DRW_DBG(buf->getPosition()); DRW_DBG(" strBuf bpos 2007: "); DRW_DBG(buf->getBitPos()); DRW_DBG("\n");
+ }
+ if (version > DRW::AC1018) {//2007+ skip string area
+ buf->setPosition(objSize >> 3);
+ buf->setBitPos(objSize & 7);
+ }
+
+ if (version > DRW::AC1021) {//2007+ skip string area
+ DRW_DBG(" ltype start of handles data pos 2010: "); DRW_DBG(buf->getPosition()); DRW_DBG(" strBuf bpos 2007: "); DRW_DBG(buf->getBitPos()); DRW_DBG("\n");
+ }
+
+ DRW_DBG("\n Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n");
+ dwgHandle ltControlH = buf->getHandle();
+ DRW_DBG("linetype control Handle: "); DRW_DBGHL(ltControlH.code, ltControlH.size, ltControlH.ref);
+ parentHandle = ltControlH.ref;
+ DRW_DBG("\n Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n");
+ for (int i=0; i< numReactors;++i) {
+ dwgHandle reactorsH = buf->getHandle();
+ DRW_DBG(" reactorsH control Handle: "); DRW_DBGHL(reactorsH.code, reactorsH.size, reactorsH.ref); DRW_DBG("\n");
+ }
+ if (xDictFlag !=1){//linetype in 2004 seems not have XDicObjH or NULL handle
+ dwgHandle XDicObjH = buf->getHandle();
+ DRW_DBG(" XDicObj control Handle: "); DRW_DBGHL(XDicObjH.code, XDicObjH.size, XDicObjH.ref); DRW_DBG("\n");
+ DRW_DBG("\n Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n");
+ }
+ if(size>0){
+ dwgHandle XRefH = buf->getHandle();
+ DRW_DBG(" XRefH control Handle: "); DRW_DBGHL(XRefH.code, XRefH.size, XRefH.ref); DRW_DBG("\n");
+ dwgHandle shpHandle = buf->getHandle();
+ DRW_DBG(" shapeFile Handle: "); DRW_DBGHL(shpHandle.code, shpHandle.size, shpHandle.ref);
+ DRW_DBG("\n Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n");
+ }
+ dwgHandle shpHandle = buf->getHandle();
+ DRW_DBG(" shapeFile +1 Handle ??: "); DRW_DBGHL(shpHandle.code, shpHandle.size, shpHandle.ref); DRW_DBG("\n");
+
+ DRW_DBG("\n Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n");
+// RS crc; //RS */
+ return buf->isGood();
+}
+
+//! Class to handle layer entries
+/*!
+* Class to handle layer symbol table entries
+* @author Rallaz
+*/
+void DRW_Layer::parseCode(int code, dxfReader *reader){
+ switch (code) {
+ case 6:
+ lineType = reader->getUtf8String();
+ break;
+ case 62:
+ color = reader->getInt32();
+ break;
+ case 290:
+ plotF = reader->getBool();
+ break;
+ case 370:
+ lWeight = DRW_LW_Conv::dxfInt2lineWidth(reader->getInt32());
+ break;
+ case 390:
+ handlePlotS = reader->getString();
+ break;
+ case 347:
+ handleMaterialS = reader->getString();
+ break;
+ case 420:
+ color24 = reader->getInt32();
+ break;
+ default:
+ DRW_TableEntry::parseCode(code, reader);
+ break;
+ }
+}
+
+bool DRW_Layer::parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs){
+ dwgBuffer sBuff = *buf;
+ dwgBuffer *sBuf = buf;
+ if (version > DRW::AC1018) {//2007+
+ sBuf = &sBuff; //separate buffer for strings
+ }
+ bool ret = DRW_TableEntry::parseDwg(version, buf, sBuf, bs);
+ DRW_DBG("\n***************************** parsing layer *********************************************\n");
+ if (!ret)
+ return ret;
+ name = sBuf->getVariableText(version, false);
+ DRW_DBG("layer name: "); DRW_DBG(name.c_str());
+
+ flags |= buf->getBit()<< 6;//layer have entity
+ if (version < DRW::AC1021) {//2004-
+ DRW_DBG(", xrefindex = "); DRW_DBG(buf->getBitShort()); DRW_DBG("\n");
+ //dint16 xrefindex = buf->getBitShort();
+ }
+ flags |= buf->getBit() << 4;//is refx dependent
+ if (version < DRW::AC1015) {//14-
+ flags |= buf->getBit(); //layer frozen
+ /*flags |=*/ buf->getBit(); //unused, negate the color
+ flags |= buf->getBit() << 1;//frozen in new
+ flags |= buf->getBit()<< 3;//locked
+ }
+ if (version > DRW::AC1014) {//2000+
+ dint16 f = buf->getSBitShort();//bit2 are layer on
+ DRW_DBG(", flags 2000+: "); DRW_DBG(f); DRW_DBG("\n");
+ flags |= f & 0x0001; //layer frozen
+ flags |= ( f>> 1) & 0x0002;//frozen in new
+ flags |= ( f>> 1) & 0x0004;//locked
+ plotF = ( f>> 4) & 0x0001;
+ lWeight = DRW_LW_Conv::dwgInt2lineWidth( (f & 0x03E0) >> 5 );
+ }
+ color = buf->getCmColor(version); //BS or CMC //ok for R14 or negate
+ DRW_DBG(", entity color: "); DRW_DBG(color); DRW_DBG("\n");
+
+ if (version > DRW::AC1018) {//2007+ skip string area
+ buf->setPosition(objSize >> 3);
+ buf->setBitPos(objSize & 7);
+ }
+ dwgHandle layerControlH = buf->getHandle();
+ DRW_DBG("layer control Handle: "); DRW_DBGHL(layerControlH.code, layerControlH.size, layerControlH.ref);
+ parentHandle = layerControlH.ref;
+
+ if (xDictFlag !=1){//linetype in 2004 seems not have XDicObjH or NULL handle
+ dwgHandle XDicObjH = buf->getHandle();
+ DRW_DBG(" XDicObj control Handle: "); DRW_DBGHL(XDicObjH.code, XDicObjH.size, XDicObjH.ref); DRW_DBG("\n");
+ }
+ dwgHandle XRefH = buf->getHandle();
+ DRW_DBG(" XRefH control Handle: "); DRW_DBGHL(XRefH.code, XRefH.size, XRefH.ref); DRW_DBG("\n");
+ if (version > DRW::AC1014) {//2000+
+ dwgHandle plotStyH = buf->getHandle();
+ DRW_DBG(" PLot style control Handle: "); DRW_DBGHL(plotStyH.code, plotStyH.size, plotStyH.ref); DRW_DBG("\n");
+ handlePlotS = DRW::toHexStr(plotStyH.ref);// std::string(plotStyH.ref);//RLZ: verify conversion
+ }
+ if (version > DRW::AC1018) {//2007+
+ dwgHandle materialH = buf->getHandle();
+ DRW_DBG(" Material control Handle: "); DRW_DBGHL(materialH.code, materialH.size, materialH.ref); DRW_DBG("\n");
+ handleMaterialS = DRW::toHexStr(materialH.ref);//RLZ: verify conversion
+ }
+ //lineType handle
+ DRW_DBG("Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n");
+ lTypeH = buf->getHandle();
+ DRW_DBG("line type Handle: "); DRW_DBGHL(lTypeH.code, lTypeH.size, lTypeH.ref);
+ DRW_DBG("\n Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n");
+// RS crc; //RS */
+ return buf->isGood();
+}
+
+bool DRW_Block_Record::parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs){
+ dwgBuffer sBuff = *buf;
+ dwgBuffer *sBuf = buf;
+ if (version > DRW::AC1018) {//2007+
+ sBuf = &sBuff; //separate buffer for strings
+ }
+ bool ret = DRW_TableEntry::parseDwg(version, buf, sBuf, bs);
+ DRW_DBG("\n***************************** parsing block record ******************************************\n");
+ if (!ret)
+ return ret;
+ duint32 insertCount = 0;//only 2000+
+ duint32 objectCount = 0; //only 2004+
+
+ name = sBuf->getVariableText(version, false);
+ DRW_DBG("block record name: "); DRW_DBG(name.c_str()); DRW_DBG("\n");
+
+ flags |= buf->getBit()<< 6;//referenced external reference, block code 70, bit 7 (64)
+ if (version > DRW::AC1018) {//2007+
+ } else {//2004- //RLZ: verify in 2004, 2010 &2013
+ dint16 xrefindex = buf->getBitShort();
+ DRW_DBG(" xrefindex: "); DRW_DBG(xrefindex); DRW_DBG("\n");
+ }
+ flags |= buf->getBit() << 4;//is refx dependent, block code 70, bit 5 (16)
+ flags |= buf->getBit(); //if is anonimous block (*U) block code 70, bit 1 (1)
+ flags |= buf->getBit() << 1; //if block contains attdefs, block code 70, bit 2 (2)
+ bool blockIsXref = buf->getBit(); //if is a Xref, block code 70, bit 3 (4)
+ bool xrefOverlaid = buf->getBit(); //if is a overlaid Xref, block code 70, bit 4 (8)
+ flags |= blockIsXref << 2; //if is a Xref, block code 70, bit 3 (4)
+ flags |= xrefOverlaid << 3; //if is a overlaid Xref, block code 70, bit 4 (8)
+ if (version > DRW::AC1014) {//2000+
+ flags |= buf->getBit() << 5; //if is a loaded Xref, block code 70, bit 6 (32)
+ }
+ DRW_DBG("flags: "); DRW_DBG(flags); DRW_DBG(", ");
+ if (version > DRW::AC1015) {//2004+ fails in 2007
+ objectCount = buf->getBitLong(); //Number of objects owned by this block
+ entMap.reserve(objectCount);
+ }
+ basePoint.x = buf->getBitDouble();
+ basePoint.y = buf->getBitDouble();
+ basePoint.z = buf->getBitDouble();
+ DRW_DBG("insertion point: "); DRW_DBGPT(basePoint.x, basePoint.y, basePoint.z); DRW_DBG("\n");
+ UTF8STRING path = sBuf->getVariableText(version, false);
+ DRW_DBG("XRef path name: "); DRW_DBG(path.c_str()); DRW_DBG("\n");
+
+ if (version > DRW::AC1014) {//2000+
+ insertCount = 0;
+ while (duint8 i = buf->getRawChar8() != 0)
+ insertCount +=i;
+ UTF8STRING bkdesc = sBuf->getVariableText(version, false);
+ DRW_DBG("Block description: "); DRW_DBG(bkdesc.c_str()); DRW_DBG("\n");
+
+ duint32 prevData = buf->getBitLong();
+ for (unsigned int j= 0; j < prevData; ++j)
+ buf->getRawChar8();
+ }
+ if (version > DRW::AC1018) {//2007+
+ duint16 insUnits = buf->getBitShort();
+ bool canExplode = buf->getBit(); //if block can be exploded
+ duint8 bkScaling = buf->getRawChar8();
+
+ DRW_UNUSED(insUnits);
+ DRW_UNUSED(canExplode);
+ DRW_UNUSED(bkScaling);
+ }
+
+ if (version > DRW::AC1018) {//2007+ skip string area
+ buf->setPosition(objSize >> 3);
+ buf->setBitPos(objSize & 7);
+ }
+
+ dwgHandle blockControlH = buf->getHandle();
+ DRW_DBG("block control Handle: "); DRW_DBGHL(blockControlH.code, blockControlH.size, blockControlH.ref); DRW_DBG("\n");
+ parentHandle = blockControlH.ref;
+
+ for (int i=0; i<numReactors; i++){
+ dwgHandle reactorH = buf->getHandle();
+ DRW_DBG(" reactor Handle #"); DRW_DBG(i); DRW_DBG(": "); DRW_DBGHL(reactorH.code, reactorH.size, reactorH.ref); DRW_DBG("\n");
+ }
+ if (xDictFlag !=1) {//R14+ //seems present in 2000
+ dwgHandle XDicObjH = buf->getHandle();
+ DRW_DBG(" XDicObj control Handle: "); DRW_DBGHL(XDicObjH.code, XDicObjH.size, XDicObjH.ref); DRW_DBG("\n");
+ }
+ if (version != DRW::AC1021) {//2007+ XDicObjH or NullH not present
+ }
+ dwgHandle NullH = buf->getHandle();
+ DRW_DBG(" NullH control Handle: "); DRW_DBGHL(NullH.code, NullH.size, NullH.ref); DRW_DBG("\n");
+ dwgHandle blockH = buf->getOffsetHandle(handle);
+ DRW_DBG(" blockH Handle: "); DRW_DBGHL(blockH.code, blockH.size, blockH.ref); DRW_DBG("\n");
+ block = blockH.ref;
+
+ if (version > DRW::AC1015) {//2004+
+ for (unsigned int i=0; i< objectCount; i++){
+ dwgHandle entityH = buf->getHandle();
+ DRW_DBG(" entityH Handle #"); DRW_DBG(i); DRW_DBG(": "); DRW_DBGHL(entityH.code, entityH.size, entityH.ref); DRW_DBG("\n");
+ entMap.push_back(entityH.ref);
+ }
+ } else {//2000-
+ if(!blockIsXref && !xrefOverlaid){
+ dwgHandle firstH = buf->getHandle();
+ DRW_DBG(" firstH entity Handle: "); DRW_DBGHL(firstH.code, firstH.size, firstH.ref); DRW_DBG("\n");
+ firstEH = firstH.ref;
+ dwgHandle lastH = buf->getHandle();
+ DRW_DBG(" lastH entity Handle: "); DRW_DBGHL(lastH.code, lastH.size, lastH.ref); DRW_DBG("\n");
+ lastEH = lastH.ref;
+ }
+ }
+ DRW_DBG("Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n");
+ dwgHandle endBlockH = buf->getOffsetHandle(handle);
+ DRW_DBG(" endBlockH Handle: "); DRW_DBGHL(endBlockH.code, endBlockH.size, endBlockH.ref); DRW_DBG("\n");
+ endBlock = endBlockH.ref;
+
+ if (version > DRW::AC1014) {//2000+
+ for (unsigned int i=0; i< insertCount; i++){
+ dwgHandle insertsH = buf->getHandle();
+ DRW_DBG(" insertsH Handle #"); DRW_DBG(i); DRW_DBG(": "); DRW_DBGHL(insertsH.code, insertsH.size, insertsH.ref); DRW_DBG("\n");
+ }
+ DRW_DBG("Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n");
+ dwgHandle layoutH = buf->getHandle();
+ DRW_DBG(" layoutH Handle: "); DRW_DBGHL(layoutH.code, layoutH.size, layoutH.ref); DRW_DBG("\n");
+ }
+ DRW_DBG("Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n\n");
+// RS crc; //RS */
+ return buf->isGood();
+}
+
+//! Class to handle text style entries
+/*!
+* Class to handle text style symbol table entries
+* @author Rallaz
+*/
+void DRW_Textstyle::parseCode(int code, dxfReader *reader){
+ switch (code) {
+ case 3:
+ font = reader->getUtf8String();
+ break;
+ case 4:
+ bigFont = reader->getUtf8String();
+ break;
+ case 40:
+ height = reader->getDouble();
+ break;
+ case 41:
+ width = reader->getDouble();
+ break;
+ case 50:
+ oblique = reader->getDouble();
+ break;
+ case 42:
+ lastHeight = reader->getDouble();
+ break;
+ case 71:
+ genFlag = reader->getInt32();
+ break;
+ case 1071:
+ fontFamily = reader->getInt32();
+ break;
+ default:
+ DRW_TableEntry::parseCode(code, reader);
+ break;
+ }
+}
+
+bool DRW_Textstyle::parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs){
+ dwgBuffer sBuff = *buf;
+ dwgBuffer *sBuf = buf;
+ if (version > DRW::AC1018) {//2007+
+ sBuf = &sBuff; //separate buffer for strings
+ }
+ bool ret = DRW_TableEntry::parseDwg(version, buf, sBuf, bs);
+ DRW_DBG("\n***************************** parsing text style *********************************************\n");
+ if (!ret)
+ return ret;
+ name = sBuf->getVariableText(version, false);
+ DRW_DBG("text style name: "); DRW_DBG(name.c_str()); DRW_DBG("\n");
+ flags |= buf->getBit()<< 6;//style are referenced for a entity, style code 70, bit 7 (64)
+ /*dint16 xrefindex =*/ buf->getBitShort();
+ flags |= buf->getBit() << 4; //is refx dependent, style code 70, bit 5 (16)
+ flags |= buf->getBit() << 2; //vertical text, stile code 70, bit 3 (4)
+ flags |= buf->getBit(); //if is a shape file instead of text, style code 70, bit 1 (1)
+ height = buf->getBitDouble();
+ width = buf->getBitDouble();
+ oblique = buf->getBitDouble();
+ genFlag = buf->getRawChar8();
+ lastHeight = buf->getBitDouble();
+ font = sBuf->getVariableText(version, false);
+ bigFont = sBuf->getVariableText(version, false);
+ if (version > DRW::AC1018) {//2007+ skip string area
+ buf->setPosition(objSize >> 3);
+ buf->setBitPos(objSize & 7);
+ }
+ dwgHandle shpControlH = buf->getHandle();
+ DRW_DBG(" parentControlH Handle: "); DRW_DBGHL(shpControlH.code, shpControlH.size, shpControlH.ref); DRW_DBG("\n");
+ parentHandle = shpControlH.ref;
+ DRW_DBG("Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n");
+ if (xDictFlag !=1){//linetype in 2004 seems not have XDicObjH or NULL handle
+ dwgHandle XDicObjH = buf->getHandle();
+ DRW_DBG(" XDicObj control Handle: "); DRW_DBGHL(XDicObjH.code, XDicObjH.size, XDicObjH.ref); DRW_DBG("\n");
+ DRW_DBG("Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n");
+ }
+/*RLZ: fails verify this part*/ dwgHandle XRefH = buf->getHandle();
+ DRW_DBG(" XRefH control Handle: "); DRW_DBGHL(XRefH.code, XRefH.size, XRefH.ref); DRW_DBG("\n");
+
+ DRW_DBG("Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n\n");
+ // RS crc; //RS */
+ return buf->isGood();
+}
+
+//! Class to handle vport entries
+/*!
+* Class to handle vport symbol table entries
+* @author Rallaz
+*/
+void DRW_Vport::parseCode(int code, dxfReader *reader){
+ switch (code) {
+ case 10:
+ lowerLeft.x = reader->getDouble();
+ break;
+ case 20:
+ lowerLeft.y = reader->getDouble();
+ break;
+ case 11:
+ UpperRight.x = reader->getDouble();
+ break;
+ case 21:
+ UpperRight.y = reader->getDouble();
+ break;
+ case 12:
+ center.x = reader->getDouble();
+ break;
+ case 22:
+ center.y = reader->getDouble();
+ break;
+ case 13:
+ snapBase.x = reader->getDouble();
+ break;
+ case 23:
+ snapBase.y = reader->getDouble();
+ break;
+ case 14:
+ snapSpacing.x = reader->getDouble();
+ break;
+ case 24:
+ snapSpacing.y = reader->getDouble();
+ break;
+ case 15:
+ gridSpacing.x = reader->getDouble();
+ break;
+ case 25:
+ gridSpacing.y = reader->getDouble();
+ break;
+ case 16:
+ viewDir.x = reader->getDouble();
+ break;
+ case 26:
+ viewDir.y = reader->getDouble();
+ break;
+ case 36:
+ viewDir.z = reader->getDouble();
+ break;
+ case 17:
+ viewTarget.x = reader->getDouble();
+ break;
+ case 27:
+ viewTarget.y = reader->getDouble();
+ break;
+ case 37:
+ viewTarget.z = reader->getDouble();
+ break;
+ case 40:
+ height = reader->getDouble();
+ break;
+ case 41:
+ ratio = reader->getDouble();
+ break;
+ case 42:
+ lensHeight = reader->getDouble();
+ break;
+ case 43:
+ frontClip = reader->getDouble();
+ break;
+ case 44:
+ backClip = reader->getDouble();
+ break;
+ case 50:
+ snapAngle = reader->getDouble();
+ break;
+ case 51:
+ twistAngle = reader->getDouble();
+ break;
+ case 71:
+ viewMode = reader->getInt32();
+ break;
+ case 72:
+ circleZoom = reader->getInt32();
+ break;
+ case 73:
+ fastZoom = reader->getInt32();
+ break;
+ case 74:
+ ucsIcon = reader->getInt32();
+ break;
+ case 75:
+ snap = reader->getInt32();
+ break;
+ case 76:
+ grid = reader->getInt32();
+ break;
+ case 77:
+ snapStyle = reader->getInt32();
+ break;
+ case 78:
+ snapIsopair = reader->getInt32();
+ break;
+ default:
+ DRW_TableEntry::parseCode(code, reader);
+ break;
+ }
+}
+
+bool DRW_Vport::parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs){
+ dwgBuffer sBuff = *buf;
+ dwgBuffer *sBuf = buf;
+ if (version > DRW::AC1018) {//2007+
+ sBuf = &sBuff; //separate buffer for strings
+ }
+ bool ret = DRW_TableEntry::parseDwg(version, buf, sBuf, bs);
+ DRW_DBG("\n***************************** parsing VPort ************************************************\n");
+ if (!ret)
+ return ret;
+ name = sBuf->getVariableText(version, false);
+ DRW_DBG("vport name: "); DRW_DBG(name.c_str()); DRW_DBG("\n");
+ flags |= buf->getBit()<< 6;// code 70, bit 7 (64)
+ if (version < DRW::AC1021) { //2004-
+ /*dint16 xrefindex =*/ buf->getBitShort();
+ }
+ flags |= buf->getBit() << 4; //is refx dependent, style code 70, bit 5 (16)
+ height = buf->getBitDouble();
+ ratio = buf->getBitDouble();
+ DRW_DBG("flags: "); DRW_DBG(flags); DRW_DBG(" height: "); DRW_DBG(height);
+ DRW_DBG(" ratio: "); DRW_DBG(ratio);
+ center = buf->get2RawDouble();
+ DRW_DBG("\nview center: "); DRW_DBGPT(center.x, center.y, center.z);
+ viewTarget.x = buf->getBitDouble();
+ viewTarget.y = buf->getBitDouble();
+ viewTarget.z = buf->getBitDouble();
+ DRW_DBG("\nview target: "); DRW_DBGPT(viewTarget.x, viewTarget.y, viewTarget.z);
+ viewDir.x = buf->getBitDouble();
+ viewDir.y = buf->getBitDouble();
+ viewDir.z = buf->getBitDouble();
+ DRW_DBG("\nview dir: "); DRW_DBGPT(viewDir.x, viewDir.y, viewDir.z);
+ twistAngle = buf->getBitDouble();
+ lensHeight = buf->getBitDouble();
+ frontClip = buf->getBitDouble();
+ backClip = buf->getBitDouble();
+ DRW_DBG("\ntwistAngle: "); DRW_DBG(twistAngle); DRW_DBG(" lensHeight: "); DRW_DBG(lensHeight);
+ DRW_DBG(" frontClip: "); DRW_DBG(frontClip); DRW_DBG(" backClip: "); DRW_DBG(backClip);
+ viewMode = buf->getBit(); //view mode, code 71, bit 0 (1)
+ viewMode |= buf->getBit() << 1; //view mode, code 71, bit 1 (2)
+ viewMode |= buf->getBit() << 2; //view mode, code 71, bit 2 (4)
+ viewMode |= buf->getBit() << 4; //view mode, code 71, bit 4 (16)
+ if (version > DRW::AC1014) { //2000+
+ //duint8 renderMode = buf->getRawChar8();
+ DRW_DBG("\n renderMode: "); DRW_DBG(buf->getRawChar8());
+ if (version > DRW::AC1018) { //2007+
+ DRW_DBG("\n use default lights: "); DRW_DBG(buf->getBit());
+ DRW_DBG(" default lighting type: "); DRW_DBG(buf->getRawChar8());
+ DRW_DBG(" brightness: "); DRW_DBG(buf->getBitDouble());
+ DRW_DBG("\n contrast: "); DRW_DBG(buf->getBitDouble()); DRW_DBG("\n");
+ DRW_DBG(" ambient color CMC: "); DRW_DBG(buf->getCmColor(version));
+ }
+ }
+ lowerLeft = buf->get2RawDouble();
+ DRW_DBG("\nlowerLeft: "); DRW_DBGPT(lowerLeft.x, lowerLeft.y, lowerLeft.z);
+ UpperRight = buf->get2RawDouble();
+ DRW_DBG("\nUpperRight: "); DRW_DBGPT(UpperRight.x, UpperRight.y, UpperRight.z);
+ viewMode |= buf->getBit() << 3; //UCSFOLLOW, view mode, code 71, bit 3 (8)
+ circleZoom = buf->getBitShort();
+ fastZoom = buf->getBit();
+ DRW_DBG("\nviewMode: "); DRW_DBG(viewMode); DRW_DBG(" circleZoom: ");
+ DRW_DBG(circleZoom); DRW_DBG(" fastZoom: "); DRW_DBG(fastZoom);
+ ucsIcon = buf->getBit(); //ucs Icon, code 74, bit 0 (1)
+ ucsIcon |= buf->getBit() << 1; //ucs Icon, code 74, bit 1 (2)
+ grid = buf->getBit();
+ DRW_DBG("\nucsIcon: "); DRW_DBG(ucsIcon); DRW_DBG(" grid: "); DRW_DBG(grid);
+ gridSpacing = buf->get2RawDouble();
+ DRW_DBG("\ngrid Spacing: "); DRW_DBGPT(gridSpacing.x, gridSpacing.y, gridSpacing.z);
+ snap = buf->getBit();
+ snapStyle = buf->getBit();
+ DRW_DBG("\nsnap on/off: "); DRW_DBG(snap); DRW_DBG(" snap Style: "); DRW_DBG(snapStyle);
+ snapIsopair = buf->getBitShort();
+ snapAngle = buf->getBitDouble();
+ DRW_DBG("\nsnap Isopair: "); DRW_DBG(snapIsopair); DRW_DBG(" snap Angle: "); DRW_DBG(snapAngle);
+ snapBase = buf->get2RawDouble();
+ DRW_DBG("\nsnap Base: "); DRW_DBGPT(snapBase.x, snapBase.y, snapBase.z);
+ snapSpacing = buf->get2RawDouble();
+ DRW_DBG("\nsnap Spacing: "); DRW_DBGPT(snapSpacing.x, snapSpacing.y, snapSpacing.z);
+ if (version > DRW::AC1014) { //2000+
+ DRW_DBG("\n Unknown: "); DRW_DBG(buf->getBit());
+ DRW_DBG(" UCS per Viewport: "); DRW_DBG(buf->getBit());
+ DRW_DBG("\nUCS origin: "); DRW_DBGPT(buf->getBitDouble(), buf->getBitDouble(), buf->getBitDouble());
+ DRW_DBG("\nUCS X Axis: "); DRW_DBGPT(buf->getBitDouble(), buf->getBitDouble(), buf->getBitDouble());
+ DRW_DBG("\nUCS Y Axis: "); DRW_DBGPT(buf->getBitDouble(), buf->getBitDouble(), buf->getBitDouble());
+ DRW_DBG("\nUCS elevation: "); DRW_DBG(buf->getBitDouble());
+ DRW_DBG(" UCS Orthographic type: "); DRW_DBG(buf->getBitShort());
+ if (version > DRW::AC1018) { //2007+
+ gridBehavior = buf->getBitShort();
+ DRW_DBG(" gridBehavior (flags): "); DRW_DBG(gridBehavior);
+ DRW_DBG(" Grid major: "); DRW_DBG(buf->getBitShort());
+ }
+ }
+
+ //common handles
+ if (version > DRW::AC1018) {//2007+ skip string area
+ buf->setPosition(objSize >> 3);
+ buf->setBitPos(objSize & 7);
+ }
+ dwgHandle vpControlH = buf->getHandle();
+ DRW_DBG("\n parentControlH Handle: "); DRW_DBGHL(vpControlH.code, vpControlH.size, vpControlH.ref); DRW_DBG("\n");
+ parentHandle = vpControlH.ref;
+ DRW_DBG("Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n");
+ if (xDictFlag !=1){
+ dwgHandle XDicObjH = buf->getHandle();
+ DRW_DBG(" XDicObj control Handle: "); DRW_DBGHL(XDicObjH.code, XDicObjH.size, XDicObjH.ref); DRW_DBG("\n");
+ DRW_DBG("Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n");
+ }
+/*RLZ: fails verify this part*/ dwgHandle XRefH = buf->getHandle();
+ DRW_DBG(" XRefH control Handle: "); DRW_DBGHL(XRefH.code, XRefH.size, XRefH.ref);
+
+ if (version > DRW::AC1014) { //2000+
+ DRW_DBG("\nRemaining bytes: "); DRW_DBG(buf->numRemainingBytes());
+ if (version > DRW::AC1018) { //2007+
+ dwgHandle bkgrdH = buf->getHandle();
+ DRW_DBG(" background Handle: "); DRW_DBGHL(bkgrdH.code, bkgrdH.size, bkgrdH.ref);
+ DRW_DBG("\nRemaining bytes: "); DRW_DBG(buf->numRemainingBytes());
+ dwgHandle visualStH = buf->getHandle();
+ DRW_DBG(" visual style Handle: "); DRW_DBGHL(visualStH.code, visualStH.size, visualStH.ref);
+ DRW_DBG("\nRemaining bytes: "); DRW_DBG(buf->numRemainingBytes());
+ dwgHandle sunH = buf->getHandle();
+ DRW_DBG(" sun Handle: "); DRW_DBGHL(sunH.code, sunH.size, sunH.ref);
+ DRW_DBG("\nRemaining bytes: "); DRW_DBG(buf->numRemainingBytes());
+ }
+ dwgHandle namedUCSH = buf->getHandle();
+ DRW_DBG(" named UCS Handle: "); DRW_DBGHL(namedUCSH.code, namedUCSH.size, namedUCSH.ref);
+ DRW_DBG("\nRemaining bytes: "); DRW_DBG(buf->numRemainingBytes());
+ dwgHandle baseUCSH = buf->getHandle();
+ DRW_DBG(" base UCS Handle: "); DRW_DBGHL(baseUCSH.code, baseUCSH.size, baseUCSH.ref);
+ }
+
+ DRW_DBG("\n Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n");
+ // RS crc; //RS */
+ return buf->isGood();
+}
+
+void DRW_ImageDef::parseCode(int code, dxfReader *reader){
+ switch (code) {
+ case 1:
+ name = reader->getUtf8String();
+ break;
+ case 5:
+ handle = reader->getHandleString();
+ break;
+ case 10:
+ u = reader->getDouble();
+ break;
+ case 20:
+ v = reader->getDouble();
+ break;
+ case 11:
+ up = reader->getDouble();
+ break;
+ case 12:
+ vp = reader->getDouble();
+ break;
+ case 21:
+ vp = reader->getDouble();
+ break;
+ case 280:
+ loaded = reader->getInt32();
+ break;
+ case 281:
+ resolution = reader->getInt32();
+ break;
+ default:
+ break;
+ }
+}
+
+bool DRW_ImageDef::parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs){
+ dwgBuffer sBuff = *buf;
+ dwgBuffer *sBuf = buf;
+ if (version > DRW::AC1018) {//2007+
+ sBuf = &sBuff; //separate buffer for strings
+ }
+ bool ret = DRW_TableEntry::parseDwg(version, buf, sBuf, bs);
+ DRW_DBG("\n***************************** parsing Image Def *********************************************\n");
+ if (!ret)
+ return ret;
+ dint32 imgVersion = buf->getBitLong();
+ DRW_DBG("class Version: "); DRW_DBG(imgVersion);
+ DRW_Coord size = buf->get2RawDouble();
+ (void)size;
+ name = sBuf->getVariableText(version, false);
+ DRW_DBG("appId name: "); DRW_DBG(name.c_str()); DRW_DBG("\n");
+ loaded = buf->getBit();
+ resolution = buf->getRawChar8();
+ up = buf->getRawDouble();
+ vp = buf->getRawDouble();
+
+ dwgHandle parentH = buf->getHandle();
+ DRW_DBG(" parentH Handle: "); DRW_DBGHL(parentH.code, parentH.size, parentH.ref); DRW_DBG("\n");
+ parentHandle = parentH.ref;
+ DRW_DBG("Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n");
+ //RLZ: Reactors handles
+ if (xDictFlag !=1){
+ dwgHandle XDicObjH = buf->getHandle();
+ DRW_DBG(" XDicObj control Handle: "); DRW_DBGHL(XDicObjH.code, XDicObjH.size, XDicObjH.ref); DRW_DBG("\n");
+ DRW_DBG("Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n");
+ }
+/*RLZ: fails verify this part*/ dwgHandle XRefH = buf->getHandle();
+ DRW_DBG(" XRefH control Handle: "); DRW_DBGHL(XRefH.code, XRefH.size, XRefH.ref); DRW_DBG("\n");
+
+ DRW_DBG("Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n\n");
+ // RS crc; //RS */
+ return buf->isGood();
+}
+
+bool DRW_AppId::parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs){
+ dwgBuffer sBuff = *buf;
+ dwgBuffer *sBuf = buf;
+ if (version > DRW::AC1018) {//2007+
+ sBuf = &sBuff; //separate buffer for strings
+ }
+ bool ret = DRW_TableEntry::parseDwg(version, buf, sBuf, bs);
+ DRW_DBG("\n***************************** parsing app Id *********************************************\n");
+ if (!ret)
+ return ret;
+ name = sBuf->getVariableText(version, false);
+ DRW_DBG("appId name: "); DRW_DBG(name.c_str()); DRW_DBG("\n");
+ flags |= buf->getBit()<< 6;// code 70, bit 7 (64)
+ /*dint16 xrefindex =*/ buf->getBitShort();
+ flags |= buf->getBit() << 4; //is refx dependent, style code 70, bit 5 (16)
+ duint8 unknown = buf->getRawChar8(); // unknown code 71
+ DRW_DBG("unknown code 71: "); DRW_DBG(unknown); DRW_DBG("\n");
+ if (version > DRW::AC1018) {//2007+ skip string area
+ buf->setPosition(objSize >> 3);
+ buf->setBitPos(objSize & 7);
+ }
+ dwgHandle appIdControlH = buf->getHandle();
+ DRW_DBG(" parentControlH Handle: "); DRW_DBGHL(appIdControlH.code, appIdControlH.size, appIdControlH.ref); DRW_DBG("\n");
+ parentHandle = appIdControlH.ref;
+ DRW_DBG("Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n");
+ if (xDictFlag !=1){//linetype in 2004 seems not have XDicObjH or NULL handle
+ dwgHandle XDicObjH = buf->getHandle();
+ DRW_DBG(" XDicObj control Handle: "); DRW_DBGHL(XDicObjH.code, XDicObjH.size, XDicObjH.ref); DRW_DBG("\n");
+ DRW_DBG("Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n");
+ }
+/*RLZ: fails verify this part*/ dwgHandle XRefH = buf->getHandle();
+ DRW_DBG(" XRefH control Handle: "); DRW_DBGHL(XRefH.code, XRefH.size, XRefH.ref); DRW_DBG("\n");
+
+ DRW_DBG("Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n\n");
+ // RS crc; //RS */
+ return buf->isGood();
+}
--- /dev/null
+/******************************************************************************
+** libDXFrw - Library to read/write DXF files (ascii & binary) **
+** **
+** Copyright (C) 2011-2015 José F. Soriano, rallazz@gmail.com **
+** **
+** This library is free software, licensed under the terms of the GNU **
+** General Public License as published by the Free Software Foundation, **
+** either version 2 of the License, or (at your option) any later version. **
+** You should have received a copy of the GNU General Public License **
+** along with this program. If not, see <http://www.gnu.org/licenses/>. **
+******************************************************************************/
+
+#ifndef DRW_OBJECTS_H
+#define DRW_OBJECTS_H
+
+
+#include <string>
+#include <vector>
+#include <map>
+#include "drw_base.h"
+
+class dxfReader;
+class dxfWriter;
+class dwgBuffer;
+
+namespace DRW {
+
+//! Table entries type.
+ enum TTYPE {
+ UNKNOWNT,
+ LTYPE,
+ LAYER,
+ STYLE,
+ DIMSTYLE,
+ VPORT,
+ BLOCK_RECORD,
+ APPID,
+ IMAGEDEF
+ };
+
+//pending VIEW, UCS, APPID, VP_ENT_HDR, GROUP, MLINESTYLE, LONG_TRANSACTION, XRECORD,
+//ACDBPLACEHOLDER, VBA_PROJECT, ACAD_TABLE, CELLSTYLEMAP, DBCOLOR, DICTIONARYVAR,
+//DICTIONARYWDFLT, FIELD, IDBUFFER, IMAGEDEF, IMAGEDEFREACTOR, LAYER_INDEX, LAYOUT
+//MATERIAL, PLACEHOLDER, PLOTSETTINGS, RASTERVARIABLES, SCALE, SORTENTSTABLE,
+//SPATIAL_INDEX, SPATIAL_FILTER, TABLEGEOMETRY, TABLESTYLES,VISUALSTYLE,
+}
+
+#define SETOBJFRIENDS friend class dxfRW; \
+ friend class dwgReader;
+
+//! Base class for tables entries
+/*!
+* Base class for tables entries
+* @author Rallaz
+*/
+class DRW_TableEntry {
+public:
+ //initializes default values
+ DRW_TableEntry() {
+ tType = DRW::UNKNOWNT;
+ flags = 0;
+ numReactors = xDictFlag = 0;
+ parentHandle = 0;
+ curr = NULL;
+ }
+
+ virtual~DRW_TableEntry() {
+ for (std::vector<DRW_Variant*>::iterator it=extData.begin(); it!=extData.end(); ++it)
+ delete *it;
+
+ extData.clear();
+ }
+
+ DRW_TableEntry(const DRW_TableEntry& e) {
+ tType = e.tType;
+ handle = e.handle;
+ parentHandle = e.parentHandle;
+ name = e.name;
+ flags = e.flags;
+ numReactors = e.numReactors;
+ xDictFlag = e.xDictFlag;
+ curr = e.curr;
+ for (std::vector<DRW_Variant*>::const_iterator it=e.extData.begin(); it!=e.extData.end(); ++it){
+ extData.push_back(new DRW_Variant(*(*it)));
+ }
+ }
+
+protected:
+ void parseCode(int code, dxfReader *reader);
+ virtual bool parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs=0) = 0;
+ bool parseDwg(DRW::Version version, dwgBuffer *buf, dwgBuffer* strBuf, duint32 bs=0);
+ void reset(){
+ flags =0;
+ for (std::vector<DRW_Variant*>::iterator it=extData.begin(); it!=extData.end(); ++it)
+ delete *it;
+ extData.clear();
+ }
+
+public:
+ enum DRW::TTYPE tType; /*!< enum: entity type, code 0 */
+ duint32 handle; /*!< entity identifier, code 5 */
+ int parentHandle; /*!< Soft-pointer ID/handle to owner object, code 330 */
+ UTF8STRING name; /*!< entry name, code 2 */
+ int flags; /*!< Flags relevant to entry, code 70 */
+ std::vector<DRW_Variant*> extData; /*!< FIFO list of extended data, codes 1000 to 1071*/
+
+private:
+ DRW_Variant* curr;
+
+ //***** dwg parse ********/
+protected:
+ dint16 oType;
+ duint8 xDictFlag;
+ dint32 numReactors; //
+ duint32 objSize; //RL 32bits object data size in bits
+};
+
+
+//! Class to handle dimstyle entries
+/*!
+* Class to handle dim style symbol table entries
+* @author Rallaz
+*/
+class DRW_Dimstyle : public DRW_TableEntry {
+ SETOBJFRIENDS
+public:
+ DRW_Dimstyle() { reset();}
+
+ void reset(){
+ tType = DRW::DIMSTYLE;
+ dimasz = dimtxt = dimcen = 2.5;
+ dimexe = 1.25;
+ dimexo = dimgap = 0.625;
+ dimtxsty = "";
+ dimscale = dimlfac = dimtfac = dimfxl = 1.0;
+ dimdli = 3.75;
+ dimrnd = dimdle = dimtp = dimtm = dimtsz = dimtvp = 0.0;
+ dimaltf = 1.0 / 25.4;
+ dimtol = dimlim = dimse1 = dimse2 = 0;
+ dimtad = 1;
+ dimzin = 8;
+ dimtoh = dimtolj = 0;
+ dimalt = dimsah = dimtix = dimsoxd = dimfxlon = 0;
+ dimtofl = 1;
+ dimunit = dimaltu = dimlunit = 2;
+ dimaltd = dimalttd = 3;
+ dimclrd = dimclre = dimclrt = dimjust = dimupt = 0;
+ dimtzin = 8;
+ dimazin = dimaltz = dimaltttz = dimfrac = 0;
+ dimtih = dimadec = dimaunit = dimsd1 = dimsd2 = dimtmove = 0;
+ dimaltrnd = 0.0;
+ dimdec = dimtdec = 2;
+ dimfit = dimatfit = 3;
+ dimdsep = ',';
+ dimlwd = dimlwe = -2;
+ DRW_TableEntry::reset();
+ }
+
+protected:
+ void parseCode(int code, dxfReader *reader);
+ bool parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs=0);
+
+public:
+ //V12
+ UTF8STRING dimpost; /*!< code 3 */
+ UTF8STRING dimapost; /*!< code 4 */
+/* handle are code 105 */
+ UTF8STRING dimblk; /*!< code 5, code 342 V2000+ */
+ UTF8STRING dimblk1; /*!< code 6, code 343 V2000+ */
+ UTF8STRING dimblk2; /*!< code 7, code 344 V2000+ */
+ double dimscale; /*!< code 40 */
+ double dimasz; /*!< code 41 */
+ double dimexo; /*!< code 42 */
+ double dimdli; /*!< code 43 */
+ double dimexe; /*!< code 44 */
+ double dimrnd; /*!< code 45 */
+ double dimdle; /*!< code 46 */
+ double dimtp; /*!< code 47 */
+ double dimtm; /*!< code 48 */
+ double dimfxl; /*!< code 49 V2007+ */
+ double dimtxt; /*!< code 140 */
+ double dimcen; /*!< code 141 */
+ double dimtsz; /*!< code 142 */
+ double dimaltf; /*!< code 143 */
+ double dimlfac; /*!< code 144 */
+ double dimtvp; /*!< code 145 */
+ double dimtfac; /*!< code 146 */
+ double dimgap; /*!< code 147 */
+ double dimaltrnd; /*!< code 148 V2000+ */
+ int dimtol; /*!< code 71 */
+ int dimlim; /*!< code 72 */
+ int dimtih; /*!< code 73 */
+ int dimtoh; /*!< code 74 */
+ int dimse1; /*!< code 75 */
+ int dimse2; /*!< code 76 */
+ int dimtad; /*!< code 77 */
+ int dimzin; /*!< code 78 */
+ int dimazin; /*!< code 79 V2000+ */
+ int dimalt; /*!< code 170 */
+ int dimaltd; /*!< code 171 */
+ int dimtofl; /*!< code 172 */
+ int dimsah; /*!< code 173 */
+ int dimtix; /*!< code 174 */
+ int dimsoxd; /*!< code 175 */
+ int dimclrd; /*!< code 176 */
+ int dimclre; /*!< code 177 */
+ int dimclrt; /*!< code 178 */
+ int dimadec; /*!< code 179 V2000+ */
+ int dimunit; /*!< code 270 R13+ (obsolete 2000+, use dimlunit & dimfrac) */
+ int dimdec; /*!< code 271 R13+ */
+ int dimtdec; /*!< code 272 R13+ */
+ int dimaltu; /*!< code 273 R13+ */
+ int dimalttd; /*!< code 274 R13+ */
+ int dimaunit; /*!< code 275 R13+ */
+ int dimfrac; /*!< code 276 V2000+ */
+ int dimlunit; /*!< code 277 V2000+ */
+ int dimdsep; /*!< code 278 V2000+ */
+ int dimtmove; /*!< code 279 V2000+ */
+ int dimjust; /*!< code 280 R13+ */
+ int dimsd1; /*!< code 281 R13+ */
+ int dimsd2; /*!< code 282 R13+ */
+ int dimtolj; /*!< code 283 R13+ */
+ int dimtzin; /*!< code 284 R13+ */
+ int dimaltz; /*!< code 285 R13+ */
+ int dimaltttz; /*!< code 286 R13+ */
+ int dimfit; /*!< code 287 R13+ (obsolete 2000+, use dimatfit & dimtmove)*/
+ int dimupt; /*!< code 288 R13+ */
+ int dimatfit; /*!< code 289 V2000+ */
+ int dimfxlon; /*!< code 290 V2007+ */
+ UTF8STRING dimtxsty; /*!< code 340 R13+ */
+ UTF8STRING dimldrblk; /*!< code 341 V2000+ */
+ int dimlwd; /*!< code 371 V2000+ */
+ int dimlwe; /*!< code 372 V2000+ */
+};
+
+
+//! Class to handle line type entries
+/*!
+* Class to handle line type symbol table entries
+* @author Rallaz
+*/
+/*TODO: handle complex lineType*/
+class DRW_LType : public DRW_TableEntry {
+ SETOBJFRIENDS
+public:
+ DRW_LType() { reset();}
+
+ void reset(){
+ tType = DRW::LTYPE;
+ desc = "";
+ size = 0;
+ length = 0.0;
+ pathIdx = 0;
+ DRW_TableEntry::reset();
+ }
+
+protected:
+ void parseCode(int code, dxfReader *reader);
+ bool parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs=0);
+ void update();
+
+public:
+ UTF8STRING desc; /*!< descriptive string, code 3 */
+// int align; /*!< align code, always 65 ('A') code 72 */
+ int size; /*!< element number, code 73 */
+ double length; /*!< total length of pattern, code 40 */
+// int haveShape; /*!< complex linetype type, code 74 */
+ std::vector<double> path; /*!< trace, point or space length sequence, code 49 */
+private:
+ int pathIdx;
+};
+
+
+//! Class to handle layer entries
+/*!
+* Class to handle layer symbol table entries
+* @author Rallaz
+*/
+class DRW_Layer : public DRW_TableEntry {
+ SETOBJFRIENDS
+public:
+ DRW_Layer() { reset();}
+
+ void reset() {
+ tType = DRW::LAYER;
+ lineType = "CONTINUOUS";
+ color = 7; // default BYLAYER (256)
+ plotF = true; // default TRUE (plot yes)
+ lWeight = DRW_LW_Conv::widthDefault; // default BYDEFAULT (dxf -3, dwg 31)
+ color24 = -1; //default -1 not set
+ DRW_TableEntry::reset();
+ }
+
+protected:
+ void parseCode(int code, dxfReader *reader);
+ bool parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs=0);
+
+public:
+ UTF8STRING lineType; /*!< line type, code 6 */
+ int color; /*!< layer color, code 62 */
+ int color24; /*!< 24-bit color, code 420 */
+ bool plotF; /*!< Plot flag, code 290 */
+ enum DRW_LW_Conv::lineWidth lWeight; /*!< layer lineweight, code 370 */
+ std::string handlePlotS; /*!< Hard-pointer ID/handle of plotstyle, code 390 */
+ std::string handleMaterialS; /*!< Hard-pointer ID/handle of materialstyle, code 347 */
+/*only used for read dwg*/
+ dwgHandle lTypeH;
+};
+
+//! Class to handle block record entries
+/*!
+* Class to handle block record table entries
+* @author Rallaz
+*/
+class DRW_Block_Record : public DRW_TableEntry {
+ SETOBJFRIENDS
+public:
+ DRW_Block_Record() { reset();}
+ void reset() {
+ tType = DRW::BLOCK_RECORD;
+ flags = 0;
+ firstEH = lastEH = DRW::NoHandle;
+ DRW_TableEntry::reset();
+ }
+
+protected:
+// void parseCode(int code, dxfReader *reader);
+ bool parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs=0);
+
+public:
+//Note: int DRW_TableEntry::flags; contains code 70 of block
+ int insUnits; /*!< block insertion units, code 70 of block_record*/
+ DRW_Coord basePoint; /*!< block insertion base point dwg only */
+protected:
+ //dwg parser
+private:
+ duint32 block; //handle for block entity
+ duint32 endBlock;//handle for end block entity
+ duint32 firstEH; //handle of first entity, only in pre-2004
+ duint32 lastEH; //handle of last entity, only in pre-2004
+ std::vector<duint32>entMap;
+};
+
+//! Class to handle text style entries
+/*!
+* Class to handle text style symbol table entries
+* @author Rallaz
+*/
+class DRW_Textstyle : public DRW_TableEntry {
+ SETOBJFRIENDS
+public:
+ DRW_Textstyle() { reset();}
+
+ void reset(){
+ tType = DRW::STYLE;
+ height = oblique = 0.0;
+ width = lastHeight = 1.0;
+ font="txt";
+ genFlag = 0; //2= X mirror, 4= Y mirror
+ fontFamily = 0;
+ DRW_TableEntry::reset();
+ }
+
+protected:
+ void parseCode(int code, dxfReader *reader);
+ bool parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs=0);
+
+public:
+ double height; /*!< Fixed text height (0 not set), code 40 */
+ double width; /*!< Width factor, code 41 */
+ double oblique; /*!< Oblique angle, code 50 */
+ int genFlag; /*!< Text generation flags, code 71 */
+ double lastHeight; /*!< Last height used, code 42 */
+ UTF8STRING font; /*!< primary font file name, code 3 */
+ UTF8STRING bigFont; /*!< bigfont file name or blank if none, code 4 */
+ int fontFamily; /*!< ttf font family, italic and bold flags, code 1071 */
+};
+
+//! Class to handle vport entries
+/*!
+* Class to handle vport symbol table entries
+* @author Rallaz
+*/
+class DRW_Vport : public DRW_TableEntry {
+ SETOBJFRIENDS
+public:
+ DRW_Vport() { reset();}
+
+ void reset(){
+ tType = DRW::VPORT;
+ UpperRight.x = UpperRight.y = 1.0;
+ snapSpacing.x = snapSpacing.y = 10.0;
+ gridSpacing = snapSpacing;
+ center.x = 0.651828;
+ center.y = -0.16;
+ viewDir.z = 1;
+ height = 5.13732;
+ ratio = 2.4426877;
+ lensHeight = 50;
+ frontClip = backClip = snapAngle = twistAngle = 0.0;
+ viewMode = snap = grid = snapStyle = snapIsopair = 0;
+ fastZoom = 1;
+ circleZoom = 100;
+ ucsIcon = 3;
+ gridBehavior = 7;
+ DRW_TableEntry::reset();
+ }
+
+protected:
+ void parseCode(int code, dxfReader *reader);
+ bool parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs=0);
+
+public:
+ DRW_Coord lowerLeft; /*!< Lower left corner, code 10 & 20 */
+ DRW_Coord UpperRight; /*!< Upper right corner, code 11 & 21 */
+ DRW_Coord center; /*!< center point in WCS, code 12 & 22 */
+ DRW_Coord snapBase; /*!< snap base point in DCS, code 13 & 23 */
+ DRW_Coord snapSpacing; /*!< snap Spacing, code 14 & 24 */
+ DRW_Coord gridSpacing; /*!< grid Spacing, code 15 & 25 */
+ DRW_Coord viewDir; /*!< view direction from target point, code 16, 26 & 36 */
+ DRW_Coord viewTarget; /*!< view target point, code 17, 27 & 37 */
+ double height; /*!< view height, code 40 */
+ double ratio; /*!< viewport aspect ratio, code 41 */
+ double lensHeight; /*!< lens height, code 42 */
+ double frontClip; /*!< front clipping plane, code 43 */
+ double backClip; /*!< back clipping plane, code 44 */
+ double snapAngle; /*!< snap rotation angle, code 50 */
+ double twistAngle; /*!< view twist angle, code 51 */
+ int viewMode; /*!< view mode, code 71 */
+ int circleZoom; /*!< circle zoom percent, code 72 */
+ int fastZoom; /*!< fast zoom setting, code 73 */
+ int ucsIcon; /*!< UCSICON setting, code 74 */
+ int snap; /*!< snap on/off, code 75 */
+ int grid; /*!< grid on/off, code 76 */
+ int snapStyle; /*!< snap style, code 77 */
+ int snapIsopair; /*!< snap isopair, code 78 */
+ int gridBehavior; /*!< grid behavior, code 60, undocummented */
+ /** code 60, bit coded possible value are
+ * bit 1 (1) show out of limits
+ * bit 2 (2) adaptive grid
+ * bit 3 (4) allow subdivision
+ * bit 4 (8) follow dinamic SCP
+ **/
+};
+
+
+//! Class to handle imagedef entries
+/*!
+* Class to handle image definitions object entries
+* @author Rallaz
+*/
+class DRW_ImageDef : public DRW_TableEntry {//
+ SETOBJFRIENDS
+public:
+ DRW_ImageDef() {
+ reset();
+ }
+
+ void reset(){
+ tType = DRW::IMAGEDEF;
+ imgVersion = 0;
+ DRW_TableEntry::reset();
+ }
+
+protected:
+ void parseCode(int code, dxfReader *reader);
+ bool parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs=0);
+
+public:
+// std::string handle; /*!< entity identifier, code 5 */
+ UTF8STRING name; /*!< File name of image, code 1 */
+ int imgVersion; /*!< class version, code 90, 0=R14 version */
+ double u; /*!< image size in pixels U value, code 10 */
+ double v; /*!< image size in pixels V value, code 20 */
+ double up; /*!< default size of one pixel U value, code 11 */
+ double vp; /*!< default size of one pixel V value, code 12 really is 21*/
+ int loaded; /*!< image is loaded flag, code 280, 0=unloaded, 1=loaded */
+ int resolution; /*!< resolution units, code 281, 0=no, 2=centimeters, 5=inch */
+
+ std::map<std::string,std::string> reactors;
+};
+
+//! Class to handle AppId entries
+/*!
+* Class to handle AppId symbol table entries
+* @author Rallaz
+*/
+class DRW_AppId : public DRW_TableEntry {
+ SETOBJFRIENDS
+public:
+ DRW_AppId() { reset();}
+
+ void reset(){
+ tType = DRW::APPID;
+ flags = 0;
+ name = "";
+ }
+
+protected:
+ void parseCode(int code, dxfReader *reader){DRW_TableEntry::parseCode(code, reader);}
+ bool parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs=0);
+};
+
+namespace DRW {
+
+// Extended color palette:
+// The first entry is only for direct indexing starting with [1]
+// Color 1 is red (1,0,0)
+const unsigned char dxfColors[][3] = {
+ { 0, 0, 0}, // unused
+ {255, 0, 0}, // 1 red
+ {255,255, 0}, // 2 yellow
+ { 0,255, 0}, // 3 green
+ { 0,255,255}, // 4 cyan
+ { 0, 0,255}, // 5 blue
+ {255, 0,255}, // 6 magenta
+ { 0, 0, 0}, // 7 black or white
+ {128,128,128}, // 8 50% gray
+ {192,192,192}, // 9 75% gray
+ {255, 0, 0}, // 10
+ {255,127,127},
+ {204, 0, 0},
+ {204,102,102},
+ {153, 0, 0},
+ {153, 76, 76}, // 15
+ {127, 0, 0},
+ {127, 63, 63},
+ { 76, 0, 0},
+ { 76, 38, 38},
+ {255, 63, 0}, // 20
+ {255,159,127},
+ {204, 51, 0},
+ {204,127,102},
+ {153, 38, 0},
+ {153, 95, 76}, // 25
+ {127, 31, 0},
+ {127, 79, 63},
+ { 76, 19, 0},
+ { 76, 47, 38},
+ {255,127, 0}, // 30
+ {255,191,127},
+ {204,102, 0},
+ {204,153,102},
+ {153, 76, 0},
+ {153,114, 76}, // 35
+ {127, 63, 0},
+ {127, 95, 63},
+ { 76, 38, 0},
+ { 76, 57, 38},
+ {255,191, 0}, // 40
+ {255,223,127},
+ {204,153, 0},
+ {204,178,102},
+ {153,114, 0},
+ {153,133, 76}, // 45
+ {127, 95, 0},
+ {127,111, 63},
+ { 76, 57, 0},
+ { 76, 66, 38},
+ {255,255, 0}, // 50
+ {255,255,127},
+ {204,204, 0},
+ {204,204,102},
+ {153,153, 0},
+ {153,153, 76}, // 55
+ {127,127, 0},
+ {127,127, 63},
+ { 76, 76, 0},
+ { 76, 76, 38},
+ {191,255, 0}, // 60
+ {223,255,127},
+ {153,204, 0},
+ {178,204,102},
+ {114,153, 0},
+ {133,153, 76}, // 65
+ { 95,127, 0},
+ {111,127, 63},
+ { 57, 76, 0},
+ { 66, 76, 38},
+ {127,255, 0}, // 70
+ {191,255,127},
+ {102,204, 0},
+ {153,204,102},
+ { 76,153, 0},
+ {114,153, 76}, // 75
+ { 63,127, 0},
+ { 95,127, 63},
+ { 38, 76, 0},
+ { 57, 76, 38},
+ { 63,255, 0}, // 80
+ {159,255,127},
+ { 51,204, 0},
+ {127,204,102},
+ { 38,153, 0},
+ { 95,153, 76}, // 85
+ { 31,127, 0},
+ { 79,127, 63},
+ { 19, 76, 0},
+ { 47, 76, 38},
+ { 0,255, 0}, // 90
+ {127,255,127},
+ { 0,204, 0},
+ {102,204,102},
+ { 0,153, 0},
+ { 76,153, 76}, // 95
+ { 0,127, 0},
+ { 63,127, 63},
+ { 0, 76, 0},
+ { 38, 76, 38},
+ { 0,255, 63}, // 100
+ {127,255,159},
+ { 0,204, 51},
+ {102,204,127},
+ { 0,153, 38},
+ { 76,153, 95}, // 105
+ { 0,127, 31},
+ { 63,127, 79},
+ { 0, 76, 19},
+ { 38, 76, 47},
+ { 0,255,127}, // 110
+ {127,255,191},
+ { 0,204,102},
+ {102,204,153},
+ { 0,153, 76},
+ { 76,153,114}, // 115
+ { 0,127, 63},
+ { 63,127, 95},
+ { 0, 76, 38},
+ { 38, 76, 57},
+ { 0,255,191}, // 120
+ {127,255,223},
+ { 0,204,153},
+ {102,204,178},
+ { 0,153,114},
+ { 76,153,133}, // 125
+ { 0,127, 95},
+ { 63,127,111},
+ { 0, 76, 57},
+ { 38, 76, 66},
+ { 0,255,255}, // 130
+ {127,255,255},
+ { 0,204,204},
+ {102,204,204},
+ { 0,153,153},
+ { 76,153,153}, // 135
+ { 0,127,127},
+ { 63,127,127},
+ { 0, 76, 76},
+ { 38, 76, 76},
+ { 0,191,255}, // 140
+ {127,223,255},
+ { 0,153,204},
+ {102,178,204},
+ { 0,114,153},
+ { 76,133,153}, // 145
+ { 0, 95,127},
+ { 63,111,127},
+ { 0, 57, 76},
+ { 38, 66, 76},
+ { 0,127,255}, // 150
+ {127,191,255},
+ { 0,102,204},
+ {102,153,204},
+ { 0, 76,153},
+ { 76,114,153}, // 155
+ { 0, 63,127},
+ { 63, 95,127},
+ { 0, 38, 76},
+ { 38, 57, 76},
+ { 0, 66,255}, // 160
+ {127,159,255},
+ { 0, 51,204},
+ {102,127,204},
+ { 0, 38,153},
+ { 76, 95,153}, // 165
+ { 0, 31,127},
+ { 63, 79,127},
+ { 0, 19, 76},
+ { 38, 47, 76},
+ { 0, 0,255}, // 170
+ {127,127,255},
+ { 0, 0,204},
+ {102,102,204},
+ { 0, 0,153},
+ { 76, 76,153}, // 175
+ { 0, 0,127},
+ { 63, 63,127},
+ { 0, 0, 76},
+ { 38, 38, 76},
+ { 63, 0,255}, // 180
+ {159,127,255},
+ { 50, 0,204},
+ {127,102,204},
+ { 38, 0,153},
+ { 95, 76,153}, // 185
+ { 31, 0,127},
+ { 79, 63,127},
+ { 19, 0, 76},
+ { 47, 38, 76},
+ {127, 0,255}, // 190
+ {191,127,255},
+ {102, 0,204},
+ {153,102,204},
+ { 76, 0,153},
+ {114, 76,153}, // 195
+ { 63, 0,127},
+ { 95, 63,127},
+ { 38, 0, 76},
+ { 57, 38, 76},
+ {191, 0,255}, // 200
+ {223,127,255},
+ {153, 0,204},
+ {178,102,204},
+ {114, 0,153},
+ {133, 76,153}, // 205
+ { 95, 0,127},
+ {111, 63,127},
+ { 57, 0, 76},
+ { 66, 38, 76},
+ {255, 0,255}, // 210
+ {255,127,255},
+ {204, 0,204},
+ {204,102,204},
+ {153, 0,153},
+ {153, 76,153}, // 215
+ {127, 0,127},
+ {127, 63,127},
+ { 76, 0, 76},
+ { 76, 38, 76},
+ {255, 0,191}, // 220
+ {255,127,223},
+ {204, 0,153},
+ {204,102,178},
+ {153, 0,114},
+ {153, 76,133}, // 225
+ {127, 0, 95},
+ {127, 63, 11},
+ { 76, 0, 57},
+ { 76, 38, 66},
+ {255, 0,127}, // 230
+ {255,127,191},
+ {204, 0,102},
+ {204,102,153},
+ {153, 0, 76},
+ {153, 76,114}, // 235
+ {127, 0, 63},
+ {127, 63, 95},
+ { 76, 0, 38},
+ { 76, 38, 57},
+ {255, 0, 63}, // 240
+ {255,127,159},
+ {204, 0, 51},
+ {204,102,127},
+ {153, 0, 38},
+ {153, 76, 95}, // 245
+ {127, 0, 31},
+ {127, 63, 79},
+ { 76, 0, 19},
+ { 76, 38, 47},
+ { 51, 51, 51}, // 250
+ { 91, 91, 91},
+ {132,132,132},
+ {173,173,173},
+ {214,214,214},
+ {255,255,255} // 255
+};
+
+}
+
+#endif
+
+// EOF
--- /dev/null
+#ifndef DRW_CPTABLE932_H
+#define DRW_CPTABLE932_H
+
+//Japanese
+
+//first entry in this table are 0xA1
+#define CPOFFSET932 0xFEC0
+//#define CP1LENGHT932 63
+#define CPLENGHT932 7724
+#define NOTFOUND932 0x30FB
+
+//Table 932 one byte are
+//from 0xA1 -> 0xFF61
+//to 0xDF .> 0xFF9F
+static const int DRW_Table932[1] = {
+};
+
+//Table 932 lead byte
+//pairs of start/end in DRW_DoubleTable932
+static const int DRW_LeadTable932[] = {
+ 0, //1 #DBCS LEAD BYTE 0x81
+ 147, //2 #DBCS LEAD BYTE 0x82
+ 292, //3 #DBCS LEAD BYTE 0x83
+ 426, //4 #DBCS LEAD BYTE 0x84
+ 524, //5 #DBCS LEAD BYTE 0x85, empty
+ 524, //6 #DBCS LEAD BYTE 0x86, empty
+ 524, //7 #DBCS LEAD BYTE 0x87
+ 607, //8 #DBCS LEAD BYTE 0x88
+ 701, //9 #DBCS LEAD BYTE 0x89
+ 889, //10 #DBCS LEAD BYTE 0x8A
+ 1077, //11 #DBCS LEAD BYTE 0x8B
+ 1265, //12 #DBCS LEAD BYTE 0x8C
+ 1453, //13 #DBCS LEAD BYTE 0x8D
+ 1641, //14 #DBCS LEAD BYTE 0x8E
+ 1829, //15 #DBCS LEAD BYTE 0x8F
+ 2017, //16 #DBCS LEAD BYTE 0x90
+ 2205, //17 #DBCS LEAD BYTE 0x91
+ 2393, //18 #DBCS LEAD BYTE 0x92
+ 2581, //19 #DBCS LEAD BYTE 0x93
+ 2769, //20 #DBCS LEAD BYTE 0x94
+ 2957, //21 #DBCS LEAD BYTE 0x95
+ 3145, //22 #DBCS LEAD BYTE 0x96
+ 3333, //23 #DBCS LEAD BYTE 0x97
+ 3521, //24 #DBCS LEAD BYTE 0x98
+ 3666, //25 #DBCS LEAD BYTE 0x99
+ 3854, //26 #DBCS LEAD BYTE 0x9A
+ 4042, //27 #DBCS LEAD BYTE 0x9B
+ 4230, //28 #DBCS LEAD BYTE 0x9C
+ 4418, //29 #DBCS LEAD BYTE 0x9D
+ 4606, //30 #DBCS LEAD BYTE 0x9E
+ 4794, //31 #DBCS LEAD BYTE 0x9F
+//0xA0 to 0xDF are empty
+ 4982, //32 #DBCS LEAD BYTE 0xE0
+ 5170, //33 #DBCS LEAD BYTE 0xE1
+ 5358, //34 #DBCS LEAD BYTE 0xE2
+ 5546, //35 #DBCS LEAD BYTE 0xE3
+ 5734, //36 #DBCS LEAD BYTE 0xE4
+ 5922, //37 #DBCS LEAD BYTE 0xE5
+ 6110, //38 #DBCS LEAD BYTE 0xE6
+ 6298, //39 #DBCS LEAD BYTE 0xE7
+ 6486, //40 #DBCS LEAD BYTE 0xE8
+ 6674, //41 #DBCS LEAD BYTE 0xE9
+ 6862, //42 #DBCS LEAD BYTE 0xEA
+ 6962, //43 #DBCS LEAD BYTE 0xEB, empty
+ 6962, //44 #DBCS LEAD BYTE 0xEC, empty
+ 6962, //45 #DBCS LEAD BYTE 0xED
+ 7150, //46 #DBCS LEAD BYTE 0xEE
+ 7336, //47 #DBCS LEAD BYTE 0xEF, empty
+ 7336, //48 #DBCS LEAD BYTE 0xF0, empty
+ 7336, //49 #DBCS LEAD BYTE 0xF1, empty
+ 7336, //50 #DBCS LEAD BYTE 0xF2, empty
+ 7336, //51 #DBCS LEAD BYTE 0xF3, empty
+ 7336, //52 #DBCS LEAD BYTE 0xF4, empty
+ 7336, //53 #DBCS LEAD BYTE 0xF5, empty
+ 7336, //54 #DBCS LEAD BYTE 0xF6, empty
+ 7336, //55 #DBCS LEAD BYTE 0xF7, empty
+ 7336, //56 #DBCS LEAD BYTE 0xF8, empty
+ 7336, //57 #DBCS LEAD BYTE 0xF9, empty
+ 7336, //58 #DBCS LEAD BYTE 0xFA
+ 7524, //59 #DBCS LEAD BYTE 0xFB
+ 7712, //60 #DBCS LEAD BYTE 0xFC
+ 7724 //61 #END OF TABLE 0xFD
+};
+
+//Table 932 tail byte
+static const int DRW_DoubleTable932[][2] = {
+ {0x8140, 0x3000}, //1 #IDEOGRAPHIC SPACE
+ {0x8141, 0x3001}, //2 #IDEOGRAPHIC COMMA
+ {0x8142, 0x3002}, //3 #IDEOGRAPHIC FULL STOP
+ {0x8143, 0xFF0C}, //4 #FULLWIDTH COMMA
+ {0x8144, 0xFF0E}, //5 #FULLWIDTH FULL STOP
+ {0x8145, 0x30FB}, //6 #KATAKANA MIDDLE DOT
+ {0x8146, 0xFF1A}, //7 #FULLWIDTH COLON
+ {0x8147, 0xFF1B}, //8 #FULLWIDTH SEMICOLON
+ {0x8148, 0xFF1F}, //9 #FULLWIDTH QUESTION MARK
+ {0x8149, 0xFF01}, //10 #FULLWIDTH EXCLAMATION MARK
+ {0x814A, 0x309B}, //11 #KATAKANA-HIRAGANA VOICED SOUND MARK
+ {0x814B, 0x309C}, //12 #KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
+ {0x814C, 0x00B4}, //13 #ACUTE ACCENT
+ {0x814D, 0xFF40}, //14 #FULLWIDTH GRAVE ACCENT
+ {0x814E, 0x00A8}, //15 #DIAERESIS
+ {0x814F, 0xFF3E}, //16 #FULLWIDTH CIRCUMFLEX ACCENT
+ {0x8150, 0xFFE3}, //17 #FULLWIDTH MACRON
+ {0x8151, 0xFF3F}, //18 #FULLWIDTH LOW LINE
+ {0x8152, 0x30FD}, //19 #KATAKANA ITERATION MARK
+ {0x8153, 0x30FE}, //20 #KATAKANA VOICED ITERATION MARK
+ {0x8154, 0x309D}, //21 #HIRAGANA ITERATION MARK
+ {0x8155, 0x309E}, //22 #HIRAGANA VOICED ITERATION MARK
+ {0x8156, 0x3003}, //23 #DITTO MARK
+ {0x8157, 0x4EDD}, //24 #CJK UNIFIED IDEOGRAPH
+ {0x8158, 0x3005}, //25 #IDEOGRAPHIC ITERATION MARK
+ {0x8159, 0x3006}, //26 #IDEOGRAPHIC CLOSING MARK
+ {0x815A, 0x3007}, //27 #IDEOGRAPHIC NUMBER ZERO
+ {0x815B, 0x30FC}, //28 #KATAKANA-HIRAGANA PROLONGED SOUND MARK
+ {0x815C, 0x2015}, //29 #HORIZONTAL BAR
+ {0x815D, 0x2010}, //30 #HYPHEN
+ {0x815E, 0xFF0F}, //31 #FULLWIDTH SOLIDUS
+ {0x815F, 0xFF3C}, //32 #FULLWIDTH REVERSE SOLIDUS
+ {0x8160, 0xFF5E}, //33 #FULLWIDTH TILDE
+ {0x8161, 0x2225}, //34 #PARALLEL TO
+ {0x8162, 0xFF5C}, //35 #FULLWIDTH VERTICAL LINE
+ {0x8163, 0x2026}, //36 #HORIZONTAL ELLIPSIS
+ {0x8164, 0x2025}, //37 #TWO DOT LEADER
+ {0x8165, 0x2018}, //38 #LEFT SINGLE QUOTATION MARK
+ {0x8166, 0x2019}, //39 #RIGHT SINGLE QUOTATION MARK
+ {0x8167, 0x201C}, //40 #LEFT DOUBLE QUOTATION MARK
+ {0x8168, 0x201D}, //41 #RIGHT DOUBLE QUOTATION MARK
+ {0x8169, 0xFF08}, //42 #FULLWIDTH LEFT PARENTHESIS
+ {0x816A, 0xFF09}, //43 #FULLWIDTH RIGHT PARENTHESIS
+ {0x816B, 0x3014}, //44 #LEFT TORTOISE SHELL BRACKET
+ {0x816C, 0x3015}, //45 #RIGHT TORTOISE SHELL BRACKET
+ {0x816D, 0xFF3B}, //46 #FULLWIDTH LEFT SQUARE BRACKET
+ {0x816E, 0xFF3D}, //47 #FULLWIDTH RIGHT SQUARE BRACKET
+ {0x816F, 0xFF5B}, //48 #FULLWIDTH LEFT CURLY BRACKET
+ {0x8170, 0xFF5D}, //49 #FULLWIDTH RIGHT CURLY BRACKET
+ {0x8171, 0x3008}, //50 #LEFT ANGLE BRACKET
+ {0x8172, 0x3009}, //51 #RIGHT ANGLE BRACKET
+ {0x8173, 0x300A}, //52 #LEFT DOUBLE ANGLE BRACKET
+ {0x8174, 0x300B}, //53 #RIGHT DOUBLE ANGLE BRACKET
+ {0x8175, 0x300C}, //54 #LEFT CORNER BRACKET
+ {0x8176, 0x300D}, //55 #RIGHT CORNER BRACKET
+ {0x8177, 0x300E}, //56 #LEFT WHITE CORNER BRACKET
+ {0x8178, 0x300F}, //57 #RIGHT WHITE CORNER BRACKET
+ {0x8179, 0x3010}, //58 #LEFT BLACK LENTICULAR BRACKET
+ {0x817A, 0x3011}, //59 #RIGHT BLACK LENTICULAR BRACKET
+ {0x817B, 0xFF0B}, //60 #FULLWIDTH PLUS SIGN
+ {0x817C, 0xFF0D}, //61 #FULLWIDTH HYPHEN-MINUS
+ {0x817D, 0x00B1}, //62 #PLUS-MINUS SIGN
+ {0x817E, 0x00D7}, //63 #MULTIPLICATION SIGN
+ {0x8180, 0x00F7}, //64 #DIVISION SIGN
+ {0x8181, 0xFF1D}, //65 #FULLWIDTH EQUALS SIGN
+ {0x8182, 0x2260}, //66 #NOT EQUAL TO
+ {0x8183, 0xFF1C}, //67 #FULLWIDTH LESS-THAN SIGN
+ {0x8184, 0xFF1E}, //68 #FULLWIDTH GREATER-THAN SIGN
+ {0x8185, 0x2266}, //69 #LESS-THAN OVER EQUAL TO
+ {0x8186, 0x2267}, //70 #GREATER-THAN OVER EQUAL TO
+ {0x8187, 0x221E}, //71 #INFINITY
+ {0x8188, 0x2234}, //72 #THEREFORE
+ {0x8189, 0x2642}, //73 #MALE SIGN
+ {0x818A, 0x2640}, //74 #FEMALE SIGN
+ {0x818B, 0x00B0}, //75 #DEGREE SIGN
+ {0x818C, 0x2032}, //76 #PRIME
+ {0x818D, 0x2033}, //77 #DOUBLE PRIME
+ {0x818E, 0x2103}, //78 #DEGREE CELSIUS
+ {0x818F, 0xFFE5}, //79 #FULLWIDTH YEN SIGN
+ {0x8190, 0xFF04}, //80 #FULLWIDTH DOLLAR SIGN
+ {0x8191, 0xFFE0}, //81 #FULLWIDTH CENT SIGN
+ {0x8192, 0xFFE1}, //82 #FULLWIDTH POUND SIGN
+ {0x8193, 0xFF05}, //83 #FULLWIDTH PERCENT SIGN
+ {0x8194, 0xFF03}, //84 #FULLWIDTH NUMBER SIGN
+ {0x8195, 0xFF06}, //85 #FULLWIDTH AMPERSAND
+ {0x8196, 0xFF0A}, //86 #FULLWIDTH ASTERISK
+ {0x8197, 0xFF20}, //87 #FULLWIDTH COMMERCIAL AT
+ {0x8198, 0x00A7}, //88 #SECTION SIGN
+ {0x8199, 0x2606}, //89 #WHITE STAR
+ {0x819A, 0x2605}, //90 #BLACK STAR
+ {0x819B, 0x25CB}, //91 #WHITE CIRCLE
+ {0x819C, 0x25CF}, //92 #BLACK CIRCLE
+ {0x819D, 0x25CE}, //93 #BULLSEYE
+ {0x819E, 0x25C7}, //94 #WHITE DIAMOND
+ {0x819F, 0x25C6}, //95 #BLACK DIAMOND
+ {0x81A0, 0x25A1}, //96 #WHITE SQUARE
+ {0x81A1, 0x25A0}, //97 #BLACK SQUARE
+ {0x81A2, 0x25B3}, //98 #WHITE UP-POINTING TRIANGLE
+ {0x81A3, 0x25B2}, //99 #BLACK UP-POINTING TRIANGLE
+ {0x81A4, 0x25BD}, //100 #WHITE DOWN-POINTING TRIANGLE
+ {0x81A5, 0x25BC}, //101 #BLACK DOWN-POINTING TRIANGLE
+ {0x81A6, 0x203B}, //102 #REFERENCE MARK
+ {0x81A7, 0x3012}, //103 #POSTAL MARK
+ {0x81A8, 0x2192}, //104 #RIGHTWARDS ARROW
+ {0x81A9, 0x2190}, //105 #LEFTWARDS ARROW
+ {0x81AA, 0x2191}, //106 #UPWARDS ARROW
+ {0x81AB, 0x2193}, //107 #DOWNWARDS ARROW
+ {0x81AC, 0x3013}, //108 #GETA MARK
+ {0x81B8, 0x2208}, //109 #ELEMENT OF
+ {0x81B9, 0x220B}, //110 #CONTAINS AS MEMBER
+ {0x81BA, 0x2286}, //111 #SUBSET OF OR EQUAL TO
+ {0x81BB, 0x2287}, //112 #SUPERSET OF OR EQUAL TO
+ {0x81BC, 0x2282}, //113 #SUBSET OF
+ {0x81BD, 0x2283}, //114 #SUPERSET OF
+ {0x81BE, 0x222A}, //115 #UNION
+ {0x81BF, 0x2229}, //116 #INTERSECTION
+ {0x81C8, 0x2227}, //117 #LOGICAL AND
+ {0x81C9, 0x2228}, //118 #LOGICAL OR
+ {0x81CA, 0xFFE2}, //119 #FULLWIDTH NOT SIGN
+ {0x81CB, 0x21D2}, //120 #RIGHTWARDS DOUBLE ARROW
+ {0x81CC, 0x21D4}, //121 #LEFT RIGHT DOUBLE ARROW
+ {0x81CD, 0x2200}, //122 #FOR ALL
+ {0x81CE, 0x2203}, //123 #THERE EXISTS
+ {0x81DA, 0x2220}, //124 #ANGLE
+ {0x81DB, 0x22A5}, //125 #UP TACK
+ {0x81DC, 0x2312}, //126 #ARC
+ {0x81DD, 0x2202}, //127 #PARTIAL DIFFERENTIAL
+ {0x81DE, 0x2207}, //128 #NABLA
+ {0x81DF, 0x2261}, //129 #IDENTICAL TO
+ {0x81E0, 0x2252}, //130 #APPROXIMATELY EQUAL TO OR THE IMAGE OF
+ {0x81E1, 0x226A}, //131 #MUCH LESS-THAN
+ {0x81E2, 0x226B}, //132 #MUCH GREATER-THAN
+ {0x81E3, 0x221A}, //133 #SQUARE ROOT
+ {0x81E4, 0x223D}, //134 #REVERSED TILDE
+ {0x81E5, 0x221D}, //135 #PROPORTIONAL TO
+ {0x81E6, 0x2235}, //136 #BECAUSE
+ {0x81E7, 0x222B}, //137 #INTEGRAL
+ {0x81E8, 0x222C}, //138 #DOUBLE INTEGRAL
+ {0x81F0, 0x212B}, //139 #ANGSTROM SIGN
+ {0x81F1, 0x2030}, //140 #PER MILLE SIGN
+ {0x81F2, 0x266F}, //141 #MUSIC SHARP SIGN
+ {0x81F3, 0x266D}, //142 #MUSIC FLAT SIGN
+ {0x81F4, 0x266A}, //143 #EIGHTH NOTE
+ {0x81F5, 0x2020}, //144 #DAGGER
+ {0x81F6, 0x2021}, //145 #DOUBLE DAGGER
+ {0x81F7, 0x00B6}, //146 #PILCROW SIGN
+ {0x81FC, 0x25EF}, //147 #LARGE CIRCLE
+ {0x824F, 0xFF10}, //148 #FULLWIDTH DIGIT ZERO
+ {0x8250, 0xFF11}, //149 #FULLWIDTH DIGIT ONE
+ {0x8251, 0xFF12}, //150 #FULLWIDTH DIGIT TWO
+ {0x8252, 0xFF13}, //151 #FULLWIDTH DIGIT THREE
+ {0x8253, 0xFF14}, //152 #FULLWIDTH DIGIT FOUR
+ {0x8254, 0xFF15}, //153 #FULLWIDTH DIGIT FIVE
+ {0x8255, 0xFF16}, //154 #FULLWIDTH DIGIT SIX
+ {0x8256, 0xFF17}, //155 #FULLWIDTH DIGIT SEVEN
+ {0x8257, 0xFF18}, //156 #FULLWIDTH DIGIT EIGHT
+ {0x8258, 0xFF19}, //157 #FULLWIDTH DIGIT NINE
+ {0x8260, 0xFF21}, //158 #FULLWIDTH LATIN CAPITAL LETTER A
+ {0x8261, 0xFF22}, //159 #FULLWIDTH LATIN CAPITAL LETTER B
+ {0x8262, 0xFF23}, //160 #FULLWIDTH LATIN CAPITAL LETTER C
+ {0x8263, 0xFF24}, //161 #FULLWIDTH LATIN CAPITAL LETTER D
+ {0x8264, 0xFF25}, //162 #FULLWIDTH LATIN CAPITAL LETTER E
+ {0x8265, 0xFF26}, //163 #FULLWIDTH LATIN CAPITAL LETTER F
+ {0x8266, 0xFF27}, //164 #FULLWIDTH LATIN CAPITAL LETTER G
+ {0x8267, 0xFF28}, //165 #FULLWIDTH LATIN CAPITAL LETTER H
+ {0x8268, 0xFF29}, //166 #FULLWIDTH LATIN CAPITAL LETTER I
+ {0x8269, 0xFF2A}, //167 #FULLWIDTH LATIN CAPITAL LETTER J
+ {0x826A, 0xFF2B}, //168 #FULLWIDTH LATIN CAPITAL LETTER K
+ {0x826B, 0xFF2C}, //169 #FULLWIDTH LATIN CAPITAL LETTER L
+ {0x826C, 0xFF2D}, //170 #FULLWIDTH LATIN CAPITAL LETTER M
+ {0x826D, 0xFF2E}, //171 #FULLWIDTH LATIN CAPITAL LETTER N
+ {0x826E, 0xFF2F}, //172 #FULLWIDTH LATIN CAPITAL LETTER O
+ {0x826F, 0xFF30}, //173 #FULLWIDTH LATIN CAPITAL LETTER P
+ {0x8270, 0xFF31}, //174 #FULLWIDTH LATIN CAPITAL LETTER Q
+ {0x8271, 0xFF32}, //175 #FULLWIDTH LATIN CAPITAL LETTER R
+ {0x8272, 0xFF33}, //176 #FULLWIDTH LATIN CAPITAL LETTER S
+ {0x8273, 0xFF34}, //177 #FULLWIDTH LATIN CAPITAL LETTER T
+ {0x8274, 0xFF35}, //178 #FULLWIDTH LATIN CAPITAL LETTER U
+ {0x8275, 0xFF36}, //179 #FULLWIDTH LATIN CAPITAL LETTER V
+ {0x8276, 0xFF37}, //180 #FULLWIDTH LATIN CAPITAL LETTER W
+ {0x8277, 0xFF38}, //181 #FULLWIDTH LATIN CAPITAL LETTER X
+ {0x8278, 0xFF39}, //182 #FULLWIDTH LATIN CAPITAL LETTER Y
+ {0x8279, 0xFF3A}, //183 #FULLWIDTH LATIN CAPITAL LETTER Z
+ {0x8281, 0xFF41}, //184 #FULLWIDTH LATIN SMALL LETTER A
+ {0x8282, 0xFF42}, //185 #FULLWIDTH LATIN SMALL LETTER B
+ {0x8283, 0xFF43}, //186 #FULLWIDTH LATIN SMALL LETTER C
+ {0x8284, 0xFF44}, //187 #FULLWIDTH LATIN SMALL LETTER D
+ {0x8285, 0xFF45}, //188 #FULLWIDTH LATIN SMALL LETTER E
+ {0x8286, 0xFF46}, //189 #FULLWIDTH LATIN SMALL LETTER F
+ {0x8287, 0xFF47}, //190 #FULLWIDTH LATIN SMALL LETTER G
+ {0x8288, 0xFF48}, //191 #FULLWIDTH LATIN SMALL LETTER H
+ {0x8289, 0xFF49}, //192 #FULLWIDTH LATIN SMALL LETTER I
+ {0x828A, 0xFF4A}, //193 #FULLWIDTH LATIN SMALL LETTER J
+ {0x828B, 0xFF4B}, //194 #FULLWIDTH LATIN SMALL LETTER K
+ {0x828C, 0xFF4C}, //195 #FULLWIDTH LATIN SMALL LETTER L
+ {0x828D, 0xFF4D}, //196 #FULLWIDTH LATIN SMALL LETTER M
+ {0x828E, 0xFF4E}, //197 #FULLWIDTH LATIN SMALL LETTER N
+ {0x828F, 0xFF4F}, //198 #FULLWIDTH LATIN SMALL LETTER O
+ {0x8290, 0xFF50}, //199 #FULLWIDTH LATIN SMALL LETTER P
+ {0x8291, 0xFF51}, //200 #FULLWIDTH LATIN SMALL LETTER Q
+ {0x8292, 0xFF52}, //201 #FULLWIDTH LATIN SMALL LETTER R
+ {0x8293, 0xFF53}, //202 #FULLWIDTH LATIN SMALL LETTER S
+ {0x8294, 0xFF54}, //203 #FULLWIDTH LATIN SMALL LETTER T
+ {0x8295, 0xFF55}, //204 #FULLWIDTH LATIN SMALL LETTER U
+ {0x8296, 0xFF56}, //205 #FULLWIDTH LATIN SMALL LETTER V
+ {0x8297, 0xFF57}, //206 #FULLWIDTH LATIN SMALL LETTER W
+ {0x8298, 0xFF58}, //207 #FULLWIDTH LATIN SMALL LETTER X
+ {0x8299, 0xFF59}, //208 #FULLWIDTH LATIN SMALL LETTER Y
+ {0x829A, 0xFF5A}, //209 #FULLWIDTH LATIN SMALL LETTER Z
+ {0x829F, 0x3041}, //210 #HIRAGANA LETTER SMALL A
+ {0x82A0, 0x3042}, //211 #HIRAGANA LETTER A
+ {0x82A1, 0x3043}, //212 #HIRAGANA LETTER SMALL I
+ {0x82A2, 0x3044}, //213 #HIRAGANA LETTER I
+ {0x82A3, 0x3045}, //214 #HIRAGANA LETTER SMALL U
+ {0x82A4, 0x3046}, //215 #HIRAGANA LETTER U
+ {0x82A5, 0x3047}, //216 #HIRAGANA LETTER SMALL E
+ {0x82A6, 0x3048}, //217 #HIRAGANA LETTER E
+ {0x82A7, 0x3049}, //218 #HIRAGANA LETTER SMALL O
+ {0x82A8, 0x304A}, //219 #HIRAGANA LETTER O
+ {0x82A9, 0x304B}, //220 #HIRAGANA LETTER KA
+ {0x82AA, 0x304C}, //221 #HIRAGANA LETTER GA
+ {0x82AB, 0x304D}, //222 #HIRAGANA LETTER KI
+ {0x82AC, 0x304E}, //223 #HIRAGANA LETTER GI
+ {0x82AD, 0x304F}, //224 #HIRAGANA LETTER KU
+ {0x82AE, 0x3050}, //225 #HIRAGANA LETTER GU
+ {0x82AF, 0x3051}, //226 #HIRAGANA LETTER KE
+ {0x82B0, 0x3052}, //227 #HIRAGANA LETTER GE
+ {0x82B1, 0x3053}, //228 #HIRAGANA LETTER KO
+ {0x82B2, 0x3054}, //229 #HIRAGANA LETTER GO
+ {0x82B3, 0x3055}, //230 #HIRAGANA LETTER SA
+ {0x82B4, 0x3056}, //231 #HIRAGANA LETTER ZA
+ {0x82B5, 0x3057}, //232 #HIRAGANA LETTER SI
+ {0x82B6, 0x3058}, //233 #HIRAGANA LETTER ZI
+ {0x82B7, 0x3059}, //234 #HIRAGANA LETTER SU
+ {0x82B8, 0x305A}, //235 #HIRAGANA LETTER ZU
+ {0x82B9, 0x305B}, //236 #HIRAGANA LETTER SE
+ {0x82BA, 0x305C}, //237 #HIRAGANA LETTER ZE
+ {0x82BB, 0x305D}, //238 #HIRAGANA LETTER SO
+ {0x82BC, 0x305E}, //239 #HIRAGANA LETTER ZO
+ {0x82BD, 0x305F}, //240 #HIRAGANA LETTER TA
+ {0x82BE, 0x3060}, //241 #HIRAGANA LETTER DA
+ {0x82BF, 0x3061}, //242 #HIRAGANA LETTER TI
+ {0x82C0, 0x3062}, //243 #HIRAGANA LETTER DI
+ {0x82C1, 0x3063}, //244 #HIRAGANA LETTER SMALL TU
+ {0x82C2, 0x3064}, //245 #HIRAGANA LETTER TU
+ {0x82C3, 0x3065}, //246 #HIRAGANA LETTER DU
+ {0x82C4, 0x3066}, //247 #HIRAGANA LETTER TE
+ {0x82C5, 0x3067}, //248 #HIRAGANA LETTER DE
+ {0x82C6, 0x3068}, //249 #HIRAGANA LETTER TO
+ {0x82C7, 0x3069}, //250 #HIRAGANA LETTER DO
+ {0x82C8, 0x306A}, //251 #HIRAGANA LETTER NA
+ {0x82C9, 0x306B}, //252 #HIRAGANA LETTER NI
+ {0x82CA, 0x306C}, //253 #HIRAGANA LETTER NU
+ {0x82CB, 0x306D}, //254 #HIRAGANA LETTER NE
+ {0x82CC, 0x306E}, //255 #HIRAGANA LETTER NO
+ {0x82CD, 0x306F}, //256 #HIRAGANA LETTER HA
+ {0x82CE, 0x3070}, //257 #HIRAGANA LETTER BA
+ {0x82CF, 0x3071}, //258 #HIRAGANA LETTER PA
+ {0x82D0, 0x3072}, //259 #HIRAGANA LETTER HI
+ {0x82D1, 0x3073}, //260 #HIRAGANA LETTER BI
+ {0x82D2, 0x3074}, //261 #HIRAGANA LETTER PI
+ {0x82D3, 0x3075}, //262 #HIRAGANA LETTER HU
+ {0x82D4, 0x3076}, //263 #HIRAGANA LETTER BU
+ {0x82D5, 0x3077}, //264 #HIRAGANA LETTER PU
+ {0x82D6, 0x3078}, //265 #HIRAGANA LETTER HE
+ {0x82D7, 0x3079}, //266 #HIRAGANA LETTER BE
+ {0x82D8, 0x307A}, //267 #HIRAGANA LETTER PE
+ {0x82D9, 0x307B}, //268 #HIRAGANA LETTER HO
+ {0x82DA, 0x307C}, //269 #HIRAGANA LETTER BO
+ {0x82DB, 0x307D}, //270 #HIRAGANA LETTER PO
+ {0x82DC, 0x307E}, //271 #HIRAGANA LETTER MA
+ {0x82DD, 0x307F}, //272 #HIRAGANA LETTER MI
+ {0x82DE, 0x3080}, //273 #HIRAGANA LETTER MU
+ {0x82DF, 0x3081}, //274 #HIRAGANA LETTER ME
+ {0x82E0, 0x3082}, //275 #HIRAGANA LETTER MO
+ {0x82E1, 0x3083}, //276 #HIRAGANA LETTER SMALL YA
+ {0x82E2, 0x3084}, //277 #HIRAGANA LETTER YA
+ {0x82E3, 0x3085}, //278 #HIRAGANA LETTER SMALL YU
+ {0x82E4, 0x3086}, //279 #HIRAGANA LETTER YU
+ {0x82E5, 0x3087}, //280 #HIRAGANA LETTER SMALL YO
+ {0x82E6, 0x3088}, //281 #HIRAGANA LETTER YO
+ {0x82E7, 0x3089}, //282 #HIRAGANA LETTER RA
+ {0x82E8, 0x308A}, //283 #HIRAGANA LETTER RI
+ {0x82E9, 0x308B}, //284 #HIRAGANA LETTER RU
+ {0x82EA, 0x308C}, //285 #HIRAGANA LETTER RE
+ {0x82EB, 0x308D}, //286 #HIRAGANA LETTER RO
+ {0x82EC, 0x308E}, //287 #HIRAGANA LETTER SMALL WA
+ {0x82ED, 0x308F}, //288 #HIRAGANA LETTER WA
+ {0x82EE, 0x3090}, //289 #HIRAGANA LETTER WI
+ {0x82EF, 0x3091}, //290 #HIRAGANA LETTER WE
+ {0x82F0, 0x3092}, //291 #HIRAGANA LETTER WO
+ {0x82F1, 0x3093}, //292 #HIRAGANA LETTER N
+ {0x8340, 0x30A1}, //293 #KATAKANA LETTER SMALL A
+ {0x8341, 0x30A2}, //294 #KATAKANA LETTER A
+ {0x8342, 0x30A3}, //295 #KATAKANA LETTER SMALL I
+ {0x8343, 0x30A4}, //296 #KATAKANA LETTER I
+ {0x8344, 0x30A5}, //297 #KATAKANA LETTER SMALL U
+ {0x8345, 0x30A6}, //298 #KATAKANA LETTER U
+ {0x8346, 0x30A7}, //299 #KATAKANA LETTER SMALL E
+ {0x8347, 0x30A8}, //300 #KATAKANA LETTER E
+ {0x8348, 0x30A9}, //301 #KATAKANA LETTER SMALL O
+ {0x8349, 0x30AA}, //302 #KATAKANA LETTER O
+ {0x834A, 0x30AB}, //303 #KATAKANA LETTER KA
+ {0x834B, 0x30AC}, //304 #KATAKANA LETTER GA
+ {0x834C, 0x30AD}, //305 #KATAKANA LETTER KI
+ {0x834D, 0x30AE}, //306 #KATAKANA LETTER GI
+ {0x834E, 0x30AF}, //307 #KATAKANA LETTER KU
+ {0x834F, 0x30B0}, //308 #KATAKANA LETTER GU
+ {0x8350, 0x30B1}, //309 #KATAKANA LETTER KE
+ {0x8351, 0x30B2}, //310 #KATAKANA LETTER GE
+ {0x8352, 0x30B3}, //311 #KATAKANA LETTER KO
+ {0x8353, 0x30B4}, //312 #KATAKANA LETTER GO
+ {0x8354, 0x30B5}, //313 #KATAKANA LETTER SA
+ {0x8355, 0x30B6}, //314 #KATAKANA LETTER ZA
+ {0x8356, 0x30B7}, //315 #KATAKANA LETTER SI
+ {0x8357, 0x30B8}, //316 #KATAKANA LETTER ZI
+ {0x8358, 0x30B9}, //317 #KATAKANA LETTER SU
+ {0x8359, 0x30BA}, //318 #KATAKANA LETTER ZU
+ {0x835A, 0x30BB}, //319 #KATAKANA LETTER SE
+ {0x835B, 0x30BC}, //320 #KATAKANA LETTER ZE
+ {0x835C, 0x30BD}, //321 #KATAKANA LETTER SO
+ {0x835D, 0x30BE}, //322 #KATAKANA LETTER ZO
+ {0x835E, 0x30BF}, //323 #KATAKANA LETTER TA
+ {0x835F, 0x30C0}, //324 #KATAKANA LETTER DA
+ {0x8360, 0x30C1}, //325 #KATAKANA LETTER TI
+ {0x8361, 0x30C2}, //326 #KATAKANA LETTER DI
+ {0x8362, 0x30C3}, //327 #KATAKANA LETTER SMALL TU
+ {0x8363, 0x30C4}, //328 #KATAKANA LETTER TU
+ {0x8364, 0x30C5}, //329 #KATAKANA LETTER DU
+ {0x8365, 0x30C6}, //330 #KATAKANA LETTER TE
+ {0x8366, 0x30C7}, //331 #KATAKANA LETTER DE
+ {0x8367, 0x30C8}, //332 #KATAKANA LETTER TO
+ {0x8368, 0x30C9}, //333 #KATAKANA LETTER DO
+ {0x8369, 0x30CA}, //334 #KATAKANA LETTER NA
+ {0x836A, 0x30CB}, //335 #KATAKANA LETTER NI
+ {0x836B, 0x30CC}, //336 #KATAKANA LETTER NU
+ {0x836C, 0x30CD}, //337 #KATAKANA LETTER NE
+ {0x836D, 0x30CE}, //338 #KATAKANA LETTER NO
+ {0x836E, 0x30CF}, //339 #KATAKANA LETTER HA
+ {0x836F, 0x30D0}, //340 #KATAKANA LETTER BA
+ {0x8370, 0x30D1}, //341 #KATAKANA LETTER PA
+ {0x8371, 0x30D2}, //342 #KATAKANA LETTER HI
+ {0x8372, 0x30D3}, //343 #KATAKANA LETTER BI
+ {0x8373, 0x30D4}, //344 #KATAKANA LETTER PI
+ {0x8374, 0x30D5}, //345 #KATAKANA LETTER HU
+ {0x8375, 0x30D6}, //346 #KATAKANA LETTER BU
+ {0x8376, 0x30D7}, //347 #KATAKANA LETTER PU
+ {0x8377, 0x30D8}, //348 #KATAKANA LETTER HE
+ {0x8378, 0x30D9}, //349 #KATAKANA LETTER BE
+ {0x8379, 0x30DA}, //350 #KATAKANA LETTER PE
+ {0x837A, 0x30DB}, //351 #KATAKANA LETTER HO
+ {0x837B, 0x30DC}, //352 #KATAKANA LETTER BO
+ {0x837C, 0x30DD}, //353 #KATAKANA LETTER PO
+ {0x837D, 0x30DE}, //354 #KATAKANA LETTER MA
+ {0x837E, 0x30DF}, //355 #KATAKANA LETTER MI
+ {0x8380, 0x30E0}, //356 #KATAKANA LETTER MU
+ {0x8381, 0x30E1}, //357 #KATAKANA LETTER ME
+ {0x8382, 0x30E2}, //358 #KATAKANA LETTER MO
+ {0x8383, 0x30E3}, //359 #KATAKANA LETTER SMALL YA
+ {0x8384, 0x30E4}, //360 #KATAKANA LETTER YA
+ {0x8385, 0x30E5}, //361 #KATAKANA LETTER SMALL YU
+ {0x8386, 0x30E6}, //362 #KATAKANA LETTER YU
+ {0x8387, 0x30E7}, //363 #KATAKANA LETTER SMALL YO
+ {0x8388, 0x30E8}, //364 #KATAKANA LETTER YO
+ {0x8389, 0x30E9}, //365 #KATAKANA LETTER RA
+ {0x838A, 0x30EA}, //366 #KATAKANA LETTER RI
+ {0x838B, 0x30EB}, //367 #KATAKANA LETTER RU
+ {0x838C, 0x30EC}, //368 #KATAKANA LETTER RE
+ {0x838D, 0x30ED}, //369 #KATAKANA LETTER RO
+ {0x838E, 0x30EE}, //370 #KATAKANA LETTER SMALL WA
+ {0x838F, 0x30EF}, //371 #KATAKANA LETTER WA
+ {0x8390, 0x30F0}, //372 #KATAKANA LETTER WI
+ {0x8391, 0x30F1}, //373 #KATAKANA LETTER WE
+ {0x8392, 0x30F2}, //374 #KATAKANA LETTER WO
+ {0x8393, 0x30F3}, //375 #KATAKANA LETTER N
+ {0x8394, 0x30F4}, //376 #KATAKANA LETTER VU
+ {0x8395, 0x30F5}, //377 #KATAKANA LETTER SMALL KA
+ {0x8396, 0x30F6}, //378 #KATAKANA LETTER SMALL KE
+ {0x839F, 0x0391}, //379 #GREEK CAPITAL LETTER ALPHA
+ {0x83A0, 0x0392}, //380 #GREEK CAPITAL LETTER BETA
+ {0x83A1, 0x0393}, //381 #GREEK CAPITAL LETTER GAMMA
+ {0x83A2, 0x0394}, //382 #GREEK CAPITAL LETTER DELTA
+ {0x83A3, 0x0395}, //383 #GREEK CAPITAL LETTER EPSILON
+ {0x83A4, 0x0396}, //384 #GREEK CAPITAL LETTER ZETA
+ {0x83A5, 0x0397}, //385 #GREEK CAPITAL LETTER ETA
+ {0x83A6, 0x0398}, //386 #GREEK CAPITAL LETTER THETA
+ {0x83A7, 0x0399}, //387 #GREEK CAPITAL LETTER IOTA
+ {0x83A8, 0x039A}, //388 #GREEK CAPITAL LETTER KAPPA
+ {0x83A9, 0x039B}, //389 #GREEK CAPITAL LETTER LAMDA
+ {0x83AA, 0x039C}, //390 #GREEK CAPITAL LETTER MU
+ {0x83AB, 0x039D}, //391 #GREEK CAPITAL LETTER NU
+ {0x83AC, 0x039E}, //392 #GREEK CAPITAL LETTER XI
+ {0x83AD, 0x039F}, //393 #GREEK CAPITAL LETTER OMICRON
+ {0x83AE, 0x03A0}, //394 #GREEK CAPITAL LETTER PI
+ {0x83AF, 0x03A1}, //395 #GREEK CAPITAL LETTER RHO
+ {0x83B0, 0x03A3}, //396 #GREEK CAPITAL LETTER SIGMA
+ {0x83B1, 0x03A4}, //397 #GREEK CAPITAL LETTER TAU
+ {0x83B2, 0x03A5}, //398 #GREEK CAPITAL LETTER UPSILON
+ {0x83B3, 0x03A6}, //399 #GREEK CAPITAL LETTER PHI
+ {0x83B4, 0x03A7}, //400 #GREEK CAPITAL LETTER CHI
+ {0x83B5, 0x03A8}, //401 #GREEK CAPITAL LETTER PSI
+ {0x83B6, 0x03A9}, //402 #GREEK CAPITAL LETTER OMEGA
+ {0x83BF, 0x03B1}, //403 #GREEK SMALL LETTER ALPHA
+ {0x83C0, 0x03B2}, //404 #GREEK SMALL LETTER BETA
+ {0x83C1, 0x03B3}, //405 #GREEK SMALL LETTER GAMMA
+ {0x83C2, 0x03B4}, //406 #GREEK SMALL LETTER DELTA
+ {0x83C3, 0x03B5}, //407 #GREEK SMALL LETTER EPSILON
+ {0x83C4, 0x03B6}, //408 #GREEK SMALL LETTER ZETA
+ {0x83C5, 0x03B7}, //409 #GREEK SMALL LETTER ETA
+ {0x83C6, 0x03B8}, //410 #GREEK SMALL LETTER THETA
+ {0x83C7, 0x03B9}, //411 #GREEK SMALL LETTER IOTA
+ {0x83C8, 0x03BA}, //412 #GREEK SMALL LETTER KAPPA
+ {0x83C9, 0x03BB}, //413 #GREEK SMALL LETTER LAMDA
+ {0x83CA, 0x03BC}, //414 #GREEK SMALL LETTER MU
+ {0x83CB, 0x03BD}, //415 #GREEK SMALL LETTER NU
+ {0x83CC, 0x03BE}, //416 #GREEK SMALL LETTER XI
+ {0x83CD, 0x03BF}, //417 #GREEK SMALL LETTER OMICRON
+ {0x83CE, 0x03C0}, //418 #GREEK SMALL LETTER PI
+ {0x83CF, 0x03C1}, //419 #GREEK SMALL LETTER RHO
+ {0x83D0, 0x03C3}, //420 #GREEK SMALL LETTER SIGMA
+ {0x83D1, 0x03C4}, //421 #GREEK SMALL LETTER TAU
+ {0x83D2, 0x03C5}, //422 #GREEK SMALL LETTER UPSILON
+ {0x83D3, 0x03C6}, //423 #GREEK SMALL LETTER PHI
+ {0x83D4, 0x03C7}, //424 #GREEK SMALL LETTER CHI
+ {0x83D5, 0x03C8}, //425 #GREEK SMALL LETTER PSI
+ {0x83D6, 0x03C9}, //426 #GREEK SMALL LETTER OMEGA
+ {0x8440, 0x0410}, //427 #CYRILLIC CAPITAL LETTER A
+ {0x8441, 0x0411}, //428 #CYRILLIC CAPITAL LETTER BE
+ {0x8442, 0x0412}, //429 #CYRILLIC CAPITAL LETTER VE
+ {0x8443, 0x0413}, //430 #CYRILLIC CAPITAL LETTER GHE
+ {0x8444, 0x0414}, //431 #CYRILLIC CAPITAL LETTER DE
+ {0x8445, 0x0415}, //432 #CYRILLIC CAPITAL LETTER IE
+ {0x8446, 0x0401}, //433 #CYRILLIC CAPITAL LETTER IO
+ {0x8447, 0x0416}, //434 #CYRILLIC CAPITAL LETTER ZHE
+ {0x8448, 0x0417}, //435 #CYRILLIC CAPITAL LETTER ZE
+ {0x8449, 0x0418}, //436 #CYRILLIC CAPITAL LETTER I
+ {0x844A, 0x0419}, //437 #CYRILLIC CAPITAL LETTER SHORT I
+ {0x844B, 0x041A}, //438 #CYRILLIC CAPITAL LETTER KA
+ {0x844C, 0x041B}, //439 #CYRILLIC CAPITAL LETTER EL
+ {0x844D, 0x041C}, //440 #CYRILLIC CAPITAL LETTER EM
+ {0x844E, 0x041D}, //441 #CYRILLIC CAPITAL LETTER EN
+ {0x844F, 0x041E}, //442 #CYRILLIC CAPITAL LETTER O
+ {0x8450, 0x041F}, //443 #CYRILLIC CAPITAL LETTER PE
+ {0x8451, 0x0420}, //444 #CYRILLIC CAPITAL LETTER ER
+ {0x8452, 0x0421}, //445 #CYRILLIC CAPITAL LETTER ES
+ {0x8453, 0x0422}, //446 #CYRILLIC CAPITAL LETTER TE
+ {0x8454, 0x0423}, //447 #CYRILLIC CAPITAL LETTER U
+ {0x8455, 0x0424}, //448 #CYRILLIC CAPITAL LETTER EF
+ {0x8456, 0x0425}, //449 #CYRILLIC CAPITAL LETTER HA
+ {0x8457, 0x0426}, //450 #CYRILLIC CAPITAL LETTER TSE
+ {0x8458, 0x0427}, //451 #CYRILLIC CAPITAL LETTER CHE
+ {0x8459, 0x0428}, //452 #CYRILLIC CAPITAL LETTER SHA
+ {0x845A, 0x0429}, //453 #CYRILLIC CAPITAL LETTER SHCHA
+ {0x845B, 0x042A}, //454 #CYRILLIC CAPITAL LETTER HARD SIGN
+ {0x845C, 0x042B}, //455 #CYRILLIC CAPITAL LETTER YERU
+ {0x845D, 0x042C}, //456 #CYRILLIC CAPITAL LETTER SOFT SIGN
+ {0x845E, 0x042D}, //457 #CYRILLIC CAPITAL LETTER E
+ {0x845F, 0x042E}, //458 #CYRILLIC CAPITAL LETTER YU
+ {0x8460, 0x042F}, //459 #CYRILLIC CAPITAL LETTER YA
+ {0x8470, 0x0430}, //460 #CYRILLIC SMALL LETTER A
+ {0x8471, 0x0431}, //461 #CYRILLIC SMALL LETTER BE
+ {0x8472, 0x0432}, //462 #CYRILLIC SMALL LETTER VE
+ {0x8473, 0x0433}, //463 #CYRILLIC SMALL LETTER GHE
+ {0x8474, 0x0434}, //464 #CYRILLIC SMALL LETTER DE
+ {0x8475, 0x0435}, //465 #CYRILLIC SMALL LETTER IE
+ {0x8476, 0x0451}, //466 #CYRILLIC SMALL LETTER IO
+ {0x8477, 0x0436}, //467 #CYRILLIC SMALL LETTER ZHE
+ {0x8478, 0x0437}, //468 #CYRILLIC SMALL LETTER ZE
+ {0x8479, 0x0438}, //469 #CYRILLIC SMALL LETTER I
+ {0x847A, 0x0439}, //470 #CYRILLIC SMALL LETTER SHORT I
+ {0x847B, 0x043A}, //471 #CYRILLIC SMALL LETTER KA
+ {0x847C, 0x043B}, //472 #CYRILLIC SMALL LETTER EL
+ {0x847D, 0x043C}, //473 #CYRILLIC SMALL LETTER EM
+ {0x847E, 0x043D}, //474 #CYRILLIC SMALL LETTER EN
+ {0x8480, 0x043E}, //475 #CYRILLIC SMALL LETTER O
+ {0x8481, 0x043F}, //476 #CYRILLIC SMALL LETTER PE
+ {0x8482, 0x0440}, //477 #CYRILLIC SMALL LETTER ER
+ {0x8483, 0x0441}, //478 #CYRILLIC SMALL LETTER ES
+ {0x8484, 0x0442}, //479 #CYRILLIC SMALL LETTER TE
+ {0x8485, 0x0443}, //480 #CYRILLIC SMALL LETTER U
+ {0x8486, 0x0444}, //481 #CYRILLIC SMALL LETTER EF
+ {0x8487, 0x0445}, //482 #CYRILLIC SMALL LETTER HA
+ {0x8488, 0x0446}, //483 #CYRILLIC SMALL LETTER TSE
+ {0x8489, 0x0447}, //484 #CYRILLIC SMALL LETTER CHE
+ {0x848A, 0x0448}, //485 #CYRILLIC SMALL LETTER SHA
+ {0x848B, 0x0449}, //486 #CYRILLIC SMALL LETTER SHCHA
+ {0x848C, 0x044A}, //487 #CYRILLIC SMALL LETTER HARD SIGN
+ {0x848D, 0x044B}, //488 #CYRILLIC SMALL LETTER YERU
+ {0x848E, 0x044C}, //489 #CYRILLIC SMALL LETTER SOFT SIGN
+ {0x848F, 0x044D}, //490 #CYRILLIC SMALL LETTER E
+ {0x8490, 0x044E}, //491 #CYRILLIC SMALL LETTER YU
+ {0x8491, 0x044F}, //492 #CYRILLIC SMALL LETTER YA
+ {0x849F, 0x2500}, //493 #BOX DRAWINGS LIGHT HORIZONTAL
+ {0x84A0, 0x2502}, //494 #BOX DRAWINGS LIGHT VERTICAL
+ {0x84A1, 0x250C}, //495 #BOX DRAWINGS LIGHT DOWN AND RIGHT
+ {0x84A2, 0x2510}, //496 #BOX DRAWINGS LIGHT DOWN AND LEFT
+ {0x84A3, 0x2518}, //497 #BOX DRAWINGS LIGHT UP AND LEFT
+ {0x84A4, 0x2514}, //498 #BOX DRAWINGS LIGHT UP AND RIGHT
+ {0x84A5, 0x251C}, //499 #BOX DRAWINGS LIGHT VERTICAL AND RIGHT
+ {0x84A6, 0x252C}, //500 #BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
+ {0x84A7, 0x2524}, //501 #BOX DRAWINGS LIGHT VERTICAL AND LEFT
+ {0x84A8, 0x2534}, //502 #BOX DRAWINGS LIGHT UP AND HORIZONTAL
+ {0x84A9, 0x253C}, //503 #BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
+ {0x84AA, 0x2501}, //504 #BOX DRAWINGS HEAVY HORIZONTAL
+ {0x84AB, 0x2503}, //505 #BOX DRAWINGS HEAVY VERTICAL
+ {0x84AC, 0x250F}, //506 #BOX DRAWINGS HEAVY DOWN AND RIGHT
+ {0x84AD, 0x2513}, //507 #BOX DRAWINGS HEAVY DOWN AND LEFT
+ {0x84AE, 0x251B}, //508 #BOX DRAWINGS HEAVY UP AND LEFT
+ {0x84AF, 0x2517}, //509 #BOX DRAWINGS HEAVY UP AND RIGHT
+ {0x84B0, 0x2523}, //510 #BOX DRAWINGS HEAVY VERTICAL AND RIGHT
+ {0x84B1, 0x2533}, //511 #BOX DRAWINGS HEAVY DOWN AND HORIZONTAL
+ {0x84B2, 0x252B}, //512 #BOX DRAWINGS HEAVY VERTICAL AND LEFT
+ {0x84B3, 0x253B}, //513 #BOX DRAWINGS HEAVY UP AND HORIZONTAL
+ {0x84B4, 0x254B}, //514 #BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL
+ {0x84B5, 0x2520}, //515 #BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT
+ {0x84B6, 0x252F}, //516 #BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY
+ {0x84B7, 0x2528}, //517 #BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT
+ {0x84B8, 0x2537}, //518 #BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY
+ {0x84B9, 0x253F}, //519 #BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY
+ {0x84BA, 0x251D}, //520 #BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY
+ {0x84BB, 0x2530}, //521 #BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT
+ {0x84BC, 0x2525}, //522 #BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY
+ {0x84BD, 0x2538}, //523 #BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT
+ {0x84BE, 0x2542}, //524 #BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT
+ {0x8740, 0x2460}, //525 #CIRCLED DIGIT ONE
+ {0x8741, 0x2461}, //526 #CIRCLED DIGIT TWO
+ {0x8742, 0x2462}, //527 #CIRCLED DIGIT THREE
+ {0x8743, 0x2463}, //528 #CIRCLED DIGIT FOUR
+ {0x8744, 0x2464}, //529 #CIRCLED DIGIT FIVE
+ {0x8745, 0x2465}, //530 #CIRCLED DIGIT SIX
+ {0x8746, 0x2466}, //531 #CIRCLED DIGIT SEVEN
+ {0x8747, 0x2467}, //532 #CIRCLED DIGIT EIGHT
+ {0x8748, 0x2468}, //533 #CIRCLED DIGIT NINE
+ {0x8749, 0x2469}, //534 #CIRCLED NUMBER TEN
+ {0x874A, 0x246A}, //535 #CIRCLED NUMBER ELEVEN
+ {0x874B, 0x246B}, //536 #CIRCLED NUMBER TWELVE
+ {0x874C, 0x246C}, //537 #CIRCLED NUMBER THIRTEEN
+ {0x874D, 0x246D}, //538 #CIRCLED NUMBER FOURTEEN
+ {0x874E, 0x246E}, //539 #CIRCLED NUMBER FIFTEEN
+ {0x874F, 0x246F}, //540 #CIRCLED NUMBER SIXTEEN
+ {0x8750, 0x2470}, //541 #CIRCLED NUMBER SEVENTEEN
+ {0x8751, 0x2471}, //542 #CIRCLED NUMBER EIGHTEEN
+ {0x8752, 0x2472}, //543 #CIRCLED NUMBER NINETEEN
+ {0x8753, 0x2473}, //544 #CIRCLED NUMBER TWENTY
+ {0x8754, 0x2160}, //545 #ROMAN NUMERAL ONE
+ {0x8755, 0x2161}, //546 #ROMAN NUMERAL TWO
+ {0x8756, 0x2162}, //547 #ROMAN NUMERAL THREE
+ {0x8757, 0x2163}, //548 #ROMAN NUMERAL FOUR
+ {0x8758, 0x2164}, //549 #ROMAN NUMERAL FIVE
+ {0x8759, 0x2165}, //550 #ROMAN NUMERAL SIX
+ {0x875A, 0x2166}, //551 #ROMAN NUMERAL SEVEN
+ {0x875B, 0x2167}, //552 #ROMAN NUMERAL EIGHT
+ {0x875C, 0x2168}, //553 #ROMAN NUMERAL NINE
+ {0x875D, 0x2169}, //554 #ROMAN NUMERAL TEN
+ {0x875F, 0x3349}, //555 #SQUARE MIRI
+ {0x8760, 0x3314}, //556 #SQUARE KIRO
+ {0x8761, 0x3322}, //557 #SQUARE SENTI
+ {0x8762, 0x334D}, //558 #SQUARE MEETORU
+ {0x8763, 0x3318}, //559 #SQUARE GURAMU
+ {0x8764, 0x3327}, //560 #SQUARE TON
+ {0x8765, 0x3303}, //561 #SQUARE AARU
+ {0x8766, 0x3336}, //562 #SQUARE HEKUTAARU
+ {0x8767, 0x3351}, //563 #SQUARE RITTORU
+ {0x8768, 0x3357}, //564 #SQUARE WATTO
+ {0x8769, 0x330D}, //565 #SQUARE KARORII
+ {0x876A, 0x3326}, //566 #SQUARE DORU
+ {0x876B, 0x3323}, //567 #SQUARE SENTO
+ {0x876C, 0x332B}, //568 #SQUARE PAASENTO
+ {0x876D, 0x334A}, //569 #SQUARE MIRIBAARU
+ {0x876E, 0x333B}, //570 #SQUARE PEEZI
+ {0x876F, 0x339C}, //571 #SQUARE MM
+ {0x8770, 0x339D}, //572 #SQUARE CM
+ {0x8771, 0x339E}, //573 #SQUARE KM
+ {0x8772, 0x338E}, //574 #SQUARE MG
+ {0x8773, 0x338F}, //575 #SQUARE KG
+ {0x8774, 0x33C4}, //576 #SQUARE CC
+ {0x8775, 0x33A1}, //577 #SQUARE M SQUARED
+ {0x877E, 0x337B}, //578 #SQUARE ERA NAME HEISEI
+ {0x8780, 0x301D}, //579 #REVERSED DOUBLE PRIME QUOTATION MARK
+ {0x8781, 0x301F}, //580 #LOW DOUBLE PRIME QUOTATION MARK
+ {0x8782, 0x2116}, //581 #NUMERO SIGN
+ {0x8783, 0x33CD}, //582 #SQUARE KK
+ {0x8784, 0x2121}, //583 #TELEPHONE SIGN
+ {0x8785, 0x32A4}, //584 #CIRCLED IDEOGRAPH HIGH
+ {0x8786, 0x32A5}, //585 #CIRCLED IDEOGRAPH CENTRE
+ {0x8787, 0x32A6}, //586 #CIRCLED IDEOGRAPH LOW
+ {0x8788, 0x32A7}, //587 #CIRCLED IDEOGRAPH LEFT
+ {0x8789, 0x32A8}, //588 #CIRCLED IDEOGRAPH RIGHT
+ {0x878A, 0x3231}, //589 #PARENTHESIZED IDEOGRAPH STOCK
+ {0x878B, 0x3232}, //590 #PARENTHESIZED IDEOGRAPH HAVE
+ {0x878C, 0x3239}, //591 #PARENTHESIZED IDEOGRAPH REPRESENT
+ {0x878D, 0x337E}, //592 #SQUARE ERA NAME MEIZI
+ {0x878E, 0x337D}, //593 #SQUARE ERA NAME TAISYOU
+ {0x878F, 0x337C}, //594 #SQUARE ERA NAME SYOUWA
+ {0x8790, 0x2252}, //595 #APPROXIMATELY EQUAL TO OR THE IMAGE OF
+ {0x8791, 0x2261}, //596 #IDENTICAL TO
+ {0x8792, 0x222B}, //597 #INTEGRAL
+ {0x8793, 0x222E}, //598 #CONTOUR INTEGRAL
+ {0x8794, 0x2211}, //599 #N-ARY SUMMATION
+ {0x8795, 0x221A}, //600 #SQUARE ROOT
+ {0x8796, 0x22A5}, //601 #UP TACK
+ {0x8797, 0x2220}, //602 #ANGLE
+ {0x8798, 0x221F}, //603 #RIGHT ANGLE
+ {0x8799, 0x22BF}, //604 #RIGHT TRIANGLE
+ {0x879A, 0x2235}, //605 #BECAUSE
+ {0x879B, 0x2229}, //606 #INTERSECTION
+ {0x879C, 0x222A}, //607 #UNION
+ {0x889F, 0x4E9C}, //608 #CJK UNIFIED IDEOGRAPH
+ {0x88A0, 0x5516}, //609 #CJK UNIFIED IDEOGRAPH
+ {0x88A1, 0x5A03}, //610 #CJK UNIFIED IDEOGRAPH
+ {0x88A2, 0x963F}, //611 #CJK UNIFIED IDEOGRAPH
+ {0x88A3, 0x54C0}, //612 #CJK UNIFIED IDEOGRAPH
+ {0x88A4, 0x611B}, //613 #CJK UNIFIED IDEOGRAPH
+ {0x88A5, 0x6328}, //614 #CJK UNIFIED IDEOGRAPH
+ {0x88A6, 0x59F6}, //615 #CJK UNIFIED IDEOGRAPH
+ {0x88A7, 0x9022}, //616 #CJK UNIFIED IDEOGRAPH
+ {0x88A8, 0x8475}, //617 #CJK UNIFIED IDEOGRAPH
+ {0x88A9, 0x831C}, //618 #CJK UNIFIED IDEOGRAPH
+ {0x88AA, 0x7A50}, //619 #CJK UNIFIED IDEOGRAPH
+ {0x88AB, 0x60AA}, //620 #CJK UNIFIED IDEOGRAPH
+ {0x88AC, 0x63E1}, //621 #CJK UNIFIED IDEOGRAPH
+ {0x88AD, 0x6E25}, //622 #CJK UNIFIED IDEOGRAPH
+ {0x88AE, 0x65ED}, //623 #CJK UNIFIED IDEOGRAPH
+ {0x88AF, 0x8466}, //624 #CJK UNIFIED IDEOGRAPH
+ {0x88B0, 0x82A6}, //625 #CJK UNIFIED IDEOGRAPH
+ {0x88B1, 0x9BF5}, //626 #CJK UNIFIED IDEOGRAPH
+ {0x88B2, 0x6893}, //627 #CJK UNIFIED IDEOGRAPH
+ {0x88B3, 0x5727}, //628 #CJK UNIFIED IDEOGRAPH
+ {0x88B4, 0x65A1}, //629 #CJK UNIFIED IDEOGRAPH
+ {0x88B5, 0x6271}, //630 #CJK UNIFIED IDEOGRAPH
+ {0x88B6, 0x5B9B}, //631 #CJK UNIFIED IDEOGRAPH
+ {0x88B7, 0x59D0}, //632 #CJK UNIFIED IDEOGRAPH
+ {0x88B8, 0x867B}, //633 #CJK UNIFIED IDEOGRAPH
+ {0x88B9, 0x98F4}, //634 #CJK UNIFIED IDEOGRAPH
+ {0x88BA, 0x7D62}, //635 #CJK UNIFIED IDEOGRAPH
+ {0x88BB, 0x7DBE}, //636 #CJK UNIFIED IDEOGRAPH
+ {0x88BC, 0x9B8E}, //637 #CJK UNIFIED IDEOGRAPH
+ {0x88BD, 0x6216}, //638 #CJK UNIFIED IDEOGRAPH
+ {0x88BE, 0x7C9F}, //639 #CJK UNIFIED IDEOGRAPH
+ {0x88BF, 0x88B7}, //640 #CJK UNIFIED IDEOGRAPH
+ {0x88C0, 0x5B89}, //641 #CJK UNIFIED IDEOGRAPH
+ {0x88C1, 0x5EB5}, //642 #CJK UNIFIED IDEOGRAPH
+ {0x88C2, 0x6309}, //643 #CJK UNIFIED IDEOGRAPH
+ {0x88C3, 0x6697}, //644 #CJK UNIFIED IDEOGRAPH
+ {0x88C4, 0x6848}, //645 #CJK UNIFIED IDEOGRAPH
+ {0x88C5, 0x95C7}, //646 #CJK UNIFIED IDEOGRAPH
+ {0x88C6, 0x978D}, //647 #CJK UNIFIED IDEOGRAPH
+ {0x88C7, 0x674F}, //648 #CJK UNIFIED IDEOGRAPH
+ {0x88C8, 0x4EE5}, //649 #CJK UNIFIED IDEOGRAPH
+ {0x88C9, 0x4F0A}, //650 #CJK UNIFIED IDEOGRAPH
+ {0x88CA, 0x4F4D}, //651 #CJK UNIFIED IDEOGRAPH
+ {0x88CB, 0x4F9D}, //652 #CJK UNIFIED IDEOGRAPH
+ {0x88CC, 0x5049}, //653 #CJK UNIFIED IDEOGRAPH
+ {0x88CD, 0x56F2}, //654 #CJK UNIFIED IDEOGRAPH
+ {0x88CE, 0x5937}, //655 #CJK UNIFIED IDEOGRAPH
+ {0x88CF, 0x59D4}, //656 #CJK UNIFIED IDEOGRAPH
+ {0x88D0, 0x5A01}, //657 #CJK UNIFIED IDEOGRAPH
+ {0x88D1, 0x5C09}, //658 #CJK UNIFIED IDEOGRAPH
+ {0x88D2, 0x60DF}, //659 #CJK UNIFIED IDEOGRAPH
+ {0x88D3, 0x610F}, //660 #CJK UNIFIED IDEOGRAPH
+ {0x88D4, 0x6170}, //661 #CJK UNIFIED IDEOGRAPH
+ {0x88D5, 0x6613}, //662 #CJK UNIFIED IDEOGRAPH
+ {0x88D6, 0x6905}, //663 #CJK UNIFIED IDEOGRAPH
+ {0x88D7, 0x70BA}, //664 #CJK UNIFIED IDEOGRAPH
+ {0x88D8, 0x754F}, //665 #CJK UNIFIED IDEOGRAPH
+ {0x88D9, 0x7570}, //666 #CJK UNIFIED IDEOGRAPH
+ {0x88DA, 0x79FB}, //667 #CJK UNIFIED IDEOGRAPH
+ {0x88DB, 0x7DAD}, //668 #CJK UNIFIED IDEOGRAPH
+ {0x88DC, 0x7DEF}, //669 #CJK UNIFIED IDEOGRAPH
+ {0x88DD, 0x80C3}, //670 #CJK UNIFIED IDEOGRAPH
+ {0x88DE, 0x840E}, //671 #CJK UNIFIED IDEOGRAPH
+ {0x88DF, 0x8863}, //672 #CJK UNIFIED IDEOGRAPH
+ {0x88E0, 0x8B02}, //673 #CJK UNIFIED IDEOGRAPH
+ {0x88E1, 0x9055}, //674 #CJK UNIFIED IDEOGRAPH
+ {0x88E2, 0x907A}, //675 #CJK UNIFIED IDEOGRAPH
+ {0x88E3, 0x533B}, //676 #CJK UNIFIED IDEOGRAPH
+ {0x88E4, 0x4E95}, //677 #CJK UNIFIED IDEOGRAPH
+ {0x88E5, 0x4EA5}, //678 #CJK UNIFIED IDEOGRAPH
+ {0x88E6, 0x57DF}, //679 #CJK UNIFIED IDEOGRAPH
+ {0x88E7, 0x80B2}, //680 #CJK UNIFIED IDEOGRAPH
+ {0x88E8, 0x90C1}, //681 #CJK UNIFIED IDEOGRAPH
+ {0x88E9, 0x78EF}, //682 #CJK UNIFIED IDEOGRAPH
+ {0x88EA, 0x4E00}, //683 #CJK UNIFIED IDEOGRAPH
+ {0x88EB, 0x58F1}, //684 #CJK UNIFIED IDEOGRAPH
+ {0x88EC, 0x6EA2}, //685 #CJK UNIFIED IDEOGRAPH
+ {0x88ED, 0x9038}, //686 #CJK UNIFIED IDEOGRAPH
+ {0x88EE, 0x7A32}, //687 #CJK UNIFIED IDEOGRAPH
+ {0x88EF, 0x8328}, //688 #CJK UNIFIED IDEOGRAPH
+ {0x88F0, 0x828B}, //689 #CJK UNIFIED IDEOGRAPH
+ {0x88F1, 0x9C2F}, //690 #CJK UNIFIED IDEOGRAPH
+ {0x88F2, 0x5141}, //691 #CJK UNIFIED IDEOGRAPH
+ {0x88F3, 0x5370}, //692 #CJK UNIFIED IDEOGRAPH
+ {0x88F4, 0x54BD}, //693 #CJK UNIFIED IDEOGRAPH
+ {0x88F5, 0x54E1}, //694 #CJK UNIFIED IDEOGRAPH
+ {0x88F6, 0x56E0}, //695 #CJK UNIFIED IDEOGRAPH
+ {0x88F7, 0x59FB}, //696 #CJK UNIFIED IDEOGRAPH
+ {0x88F8, 0x5F15}, //697 #CJK UNIFIED IDEOGRAPH
+ {0x88F9, 0x98F2}, //698 #CJK UNIFIED IDEOGRAPH
+ {0x88FA, 0x6DEB}, //699 #CJK UNIFIED IDEOGRAPH
+ {0x88FB, 0x80E4}, //700 #CJK UNIFIED IDEOGRAPH
+ {0x88FC, 0x852D}, //701 #CJK UNIFIED IDEOGRAPH
+ {0x8940, 0x9662}, //702 #CJK UNIFIED IDEOGRAPH
+ {0x8941, 0x9670}, //703 #CJK UNIFIED IDEOGRAPH
+ {0x8942, 0x96A0}, //704 #CJK UNIFIED IDEOGRAPH
+ {0x8943, 0x97FB}, //705 #CJK UNIFIED IDEOGRAPH
+ {0x8944, 0x540B}, //706 #CJK UNIFIED IDEOGRAPH
+ {0x8945, 0x53F3}, //707 #CJK UNIFIED IDEOGRAPH
+ {0x8946, 0x5B87}, //708 #CJK UNIFIED IDEOGRAPH
+ {0x8947, 0x70CF}, //709 #CJK UNIFIED IDEOGRAPH
+ {0x8948, 0x7FBD}, //710 #CJK UNIFIED IDEOGRAPH
+ {0x8949, 0x8FC2}, //711 #CJK UNIFIED IDEOGRAPH
+ {0x894A, 0x96E8}, //712 #CJK UNIFIED IDEOGRAPH
+ {0x894B, 0x536F}, //713 #CJK UNIFIED IDEOGRAPH
+ {0x894C, 0x9D5C}, //714 #CJK UNIFIED IDEOGRAPH
+ {0x894D, 0x7ABA}, //715 #CJK UNIFIED IDEOGRAPH
+ {0x894E, 0x4E11}, //716 #CJK UNIFIED IDEOGRAPH
+ {0x894F, 0x7893}, //717 #CJK UNIFIED IDEOGRAPH
+ {0x8950, 0x81FC}, //718 #CJK UNIFIED IDEOGRAPH
+ {0x8951, 0x6E26}, //719 #CJK UNIFIED IDEOGRAPH
+ {0x8952, 0x5618}, //720 #CJK UNIFIED IDEOGRAPH
+ {0x8953, 0x5504}, //721 #CJK UNIFIED IDEOGRAPH
+ {0x8954, 0x6B1D}, //722 #CJK UNIFIED IDEOGRAPH
+ {0x8955, 0x851A}, //723 #CJK UNIFIED IDEOGRAPH
+ {0x8956, 0x9C3B}, //724 #CJK UNIFIED IDEOGRAPH
+ {0x8957, 0x59E5}, //725 #CJK UNIFIED IDEOGRAPH
+ {0x8958, 0x53A9}, //726 #CJK UNIFIED IDEOGRAPH
+ {0x8959, 0x6D66}, //727 #CJK UNIFIED IDEOGRAPH
+ {0x895A, 0x74DC}, //728 #CJK UNIFIED IDEOGRAPH
+ {0x895B, 0x958F}, //729 #CJK UNIFIED IDEOGRAPH
+ {0x895C, 0x5642}, //730 #CJK UNIFIED IDEOGRAPH
+ {0x895D, 0x4E91}, //731 #CJK UNIFIED IDEOGRAPH
+ {0x895E, 0x904B}, //732 #CJK UNIFIED IDEOGRAPH
+ {0x895F, 0x96F2}, //733 #CJK UNIFIED IDEOGRAPH
+ {0x8960, 0x834F}, //734 #CJK UNIFIED IDEOGRAPH
+ {0x8961, 0x990C}, //735 #CJK UNIFIED IDEOGRAPH
+ {0x8962, 0x53E1}, //736 #CJK UNIFIED IDEOGRAPH
+ {0x8963, 0x55B6}, //737 #CJK UNIFIED IDEOGRAPH
+ {0x8964, 0x5B30}, //738 #CJK UNIFIED IDEOGRAPH
+ {0x8965, 0x5F71}, //739 #CJK UNIFIED IDEOGRAPH
+ {0x8966, 0x6620}, //740 #CJK UNIFIED IDEOGRAPH
+ {0x8967, 0x66F3}, //741 #CJK UNIFIED IDEOGRAPH
+ {0x8968, 0x6804}, //742 #CJK UNIFIED IDEOGRAPH
+ {0x8969, 0x6C38}, //743 #CJK UNIFIED IDEOGRAPH
+ {0x896A, 0x6CF3}, //744 #CJK UNIFIED IDEOGRAPH
+ {0x896B, 0x6D29}, //745 #CJK UNIFIED IDEOGRAPH
+ {0x896C, 0x745B}, //746 #CJK UNIFIED IDEOGRAPH
+ {0x896D, 0x76C8}, //747 #CJK UNIFIED IDEOGRAPH
+ {0x896E, 0x7A4E}, //748 #CJK UNIFIED IDEOGRAPH
+ {0x896F, 0x9834}, //749 #CJK UNIFIED IDEOGRAPH
+ {0x8970, 0x82F1}, //750 #CJK UNIFIED IDEOGRAPH
+ {0x8971, 0x885B}, //751 #CJK UNIFIED IDEOGRAPH
+ {0x8972, 0x8A60}, //752 #CJK UNIFIED IDEOGRAPH
+ {0x8973, 0x92ED}, //753 #CJK UNIFIED IDEOGRAPH
+ {0x8974, 0x6DB2}, //754 #CJK UNIFIED IDEOGRAPH
+ {0x8975, 0x75AB}, //755 #CJK UNIFIED IDEOGRAPH
+ {0x8976, 0x76CA}, //756 #CJK UNIFIED IDEOGRAPH
+ {0x8977, 0x99C5}, //757 #CJK UNIFIED IDEOGRAPH
+ {0x8978, 0x60A6}, //758 #CJK UNIFIED IDEOGRAPH
+ {0x8979, 0x8B01}, //759 #CJK UNIFIED IDEOGRAPH
+ {0x897A, 0x8D8A}, //760 #CJK UNIFIED IDEOGRAPH
+ {0x897B, 0x95B2}, //761 #CJK UNIFIED IDEOGRAPH
+ {0x897C, 0x698E}, //762 #CJK UNIFIED IDEOGRAPH
+ {0x897D, 0x53AD}, //763 #CJK UNIFIED IDEOGRAPH
+ {0x897E, 0x5186}, //764 #CJK UNIFIED IDEOGRAPH
+ {0x8980, 0x5712}, //765 #CJK UNIFIED IDEOGRAPH
+ {0x8981, 0x5830}, //766 #CJK UNIFIED IDEOGRAPH
+ {0x8982, 0x5944}, //767 #CJK UNIFIED IDEOGRAPH
+ {0x8983, 0x5BB4}, //768 #CJK UNIFIED IDEOGRAPH
+ {0x8984, 0x5EF6}, //769 #CJK UNIFIED IDEOGRAPH
+ {0x8985, 0x6028}, //770 #CJK UNIFIED IDEOGRAPH
+ {0x8986, 0x63A9}, //771 #CJK UNIFIED IDEOGRAPH
+ {0x8987, 0x63F4}, //772 #CJK UNIFIED IDEOGRAPH
+ {0x8988, 0x6CBF}, //773 #CJK UNIFIED IDEOGRAPH
+ {0x8989, 0x6F14}, //774 #CJK UNIFIED IDEOGRAPH
+ {0x898A, 0x708E}, //775 #CJK UNIFIED IDEOGRAPH
+ {0x898B, 0x7114}, //776 #CJK UNIFIED IDEOGRAPH
+ {0x898C, 0x7159}, //777 #CJK UNIFIED IDEOGRAPH
+ {0x898D, 0x71D5}, //778 #CJK UNIFIED IDEOGRAPH
+ {0x898E, 0x733F}, //779 #CJK UNIFIED IDEOGRAPH
+ {0x898F, 0x7E01}, //780 #CJK UNIFIED IDEOGRAPH
+ {0x8990, 0x8276}, //781 #CJK UNIFIED IDEOGRAPH
+ {0x8991, 0x82D1}, //782 #CJK UNIFIED IDEOGRAPH
+ {0x8992, 0x8597}, //783 #CJK UNIFIED IDEOGRAPH
+ {0x8993, 0x9060}, //784 #CJK UNIFIED IDEOGRAPH
+ {0x8994, 0x925B}, //785 #CJK UNIFIED IDEOGRAPH
+ {0x8995, 0x9D1B}, //786 #CJK UNIFIED IDEOGRAPH
+ {0x8996, 0x5869}, //787 #CJK UNIFIED IDEOGRAPH
+ {0x8997, 0x65BC}, //788 #CJK UNIFIED IDEOGRAPH
+ {0x8998, 0x6C5A}, //789 #CJK UNIFIED IDEOGRAPH
+ {0x8999, 0x7525}, //790 #CJK UNIFIED IDEOGRAPH
+ {0x899A, 0x51F9}, //791 #CJK UNIFIED IDEOGRAPH
+ {0x899B, 0x592E}, //792 #CJK UNIFIED IDEOGRAPH
+ {0x899C, 0x5965}, //793 #CJK UNIFIED IDEOGRAPH
+ {0x899D, 0x5F80}, //794 #CJK UNIFIED IDEOGRAPH
+ {0x899E, 0x5FDC}, //795 #CJK UNIFIED IDEOGRAPH
+ {0x899F, 0x62BC}, //796 #CJK UNIFIED IDEOGRAPH
+ {0x89A0, 0x65FA}, //797 #CJK UNIFIED IDEOGRAPH
+ {0x89A1, 0x6A2A}, //798 #CJK UNIFIED IDEOGRAPH
+ {0x89A2, 0x6B27}, //799 #CJK UNIFIED IDEOGRAPH
+ {0x89A3, 0x6BB4}, //800 #CJK UNIFIED IDEOGRAPH
+ {0x89A4, 0x738B}, //801 #CJK UNIFIED IDEOGRAPH
+ {0x89A5, 0x7FC1}, //802 #CJK UNIFIED IDEOGRAPH
+ {0x89A6, 0x8956}, //803 #CJK UNIFIED IDEOGRAPH
+ {0x89A7, 0x9D2C}, //804 #CJK UNIFIED IDEOGRAPH
+ {0x89A8, 0x9D0E}, //805 #CJK UNIFIED IDEOGRAPH
+ {0x89A9, 0x9EC4}, //806 #CJK UNIFIED IDEOGRAPH
+ {0x89AA, 0x5CA1}, //807 #CJK UNIFIED IDEOGRAPH
+ {0x89AB, 0x6C96}, //808 #CJK UNIFIED IDEOGRAPH
+ {0x89AC, 0x837B}, //809 #CJK UNIFIED IDEOGRAPH
+ {0x89AD, 0x5104}, //810 #CJK UNIFIED IDEOGRAPH
+ {0x89AE, 0x5C4B}, //811 #CJK UNIFIED IDEOGRAPH
+ {0x89AF, 0x61B6}, //812 #CJK UNIFIED IDEOGRAPH
+ {0x89B0, 0x81C6}, //813 #CJK UNIFIED IDEOGRAPH
+ {0x89B1, 0x6876}, //814 #CJK UNIFIED IDEOGRAPH
+ {0x89B2, 0x7261}, //815 #CJK UNIFIED IDEOGRAPH
+ {0x89B3, 0x4E59}, //816 #CJK UNIFIED IDEOGRAPH
+ {0x89B4, 0x4FFA}, //817 #CJK UNIFIED IDEOGRAPH
+ {0x89B5, 0x5378}, //818 #CJK UNIFIED IDEOGRAPH
+ {0x89B6, 0x6069}, //819 #CJK UNIFIED IDEOGRAPH
+ {0x89B7, 0x6E29}, //820 #CJK UNIFIED IDEOGRAPH
+ {0x89B8, 0x7A4F}, //821 #CJK UNIFIED IDEOGRAPH
+ {0x89B9, 0x97F3}, //822 #CJK UNIFIED IDEOGRAPH
+ {0x89BA, 0x4E0B}, //823 #CJK UNIFIED IDEOGRAPH
+ {0x89BB, 0x5316}, //824 #CJK UNIFIED IDEOGRAPH
+ {0x89BC, 0x4EEE}, //825 #CJK UNIFIED IDEOGRAPH
+ {0x89BD, 0x4F55}, //826 #CJK UNIFIED IDEOGRAPH
+ {0x89BE, 0x4F3D}, //827 #CJK UNIFIED IDEOGRAPH
+ {0x89BF, 0x4FA1}, //828 #CJK UNIFIED IDEOGRAPH
+ {0x89C0, 0x4F73}, //829 #CJK UNIFIED IDEOGRAPH
+ {0x89C1, 0x52A0}, //830 #CJK UNIFIED IDEOGRAPH
+ {0x89C2, 0x53EF}, //831 #CJK UNIFIED IDEOGRAPH
+ {0x89C3, 0x5609}, //832 #CJK UNIFIED IDEOGRAPH
+ {0x89C4, 0x590F}, //833 #CJK UNIFIED IDEOGRAPH
+ {0x89C5, 0x5AC1}, //834 #CJK UNIFIED IDEOGRAPH
+ {0x89C6, 0x5BB6}, //835 #CJK UNIFIED IDEOGRAPH
+ {0x89C7, 0x5BE1}, //836 #CJK UNIFIED IDEOGRAPH
+ {0x89C8, 0x79D1}, //837 #CJK UNIFIED IDEOGRAPH
+ {0x89C9, 0x6687}, //838 #CJK UNIFIED IDEOGRAPH
+ {0x89CA, 0x679C}, //839 #CJK UNIFIED IDEOGRAPH
+ {0x89CB, 0x67B6}, //840 #CJK UNIFIED IDEOGRAPH
+ {0x89CC, 0x6B4C}, //841 #CJK UNIFIED IDEOGRAPH
+ {0x89CD, 0x6CB3}, //842 #CJK UNIFIED IDEOGRAPH
+ {0x89CE, 0x706B}, //843 #CJK UNIFIED IDEOGRAPH
+ {0x89CF, 0x73C2}, //844 #CJK UNIFIED IDEOGRAPH
+ {0x89D0, 0x798D}, //845 #CJK UNIFIED IDEOGRAPH
+ {0x89D1, 0x79BE}, //846 #CJK UNIFIED IDEOGRAPH
+ {0x89D2, 0x7A3C}, //847 #CJK UNIFIED IDEOGRAPH
+ {0x89D3, 0x7B87}, //848 #CJK UNIFIED IDEOGRAPH
+ {0x89D4, 0x82B1}, //849 #CJK UNIFIED IDEOGRAPH
+ {0x89D5, 0x82DB}, //850 #CJK UNIFIED IDEOGRAPH
+ {0x89D6, 0x8304}, //851 #CJK UNIFIED IDEOGRAPH
+ {0x89D7, 0x8377}, //852 #CJK UNIFIED IDEOGRAPH
+ {0x89D8, 0x83EF}, //853 #CJK UNIFIED IDEOGRAPH
+ {0x89D9, 0x83D3}, //854 #CJK UNIFIED IDEOGRAPH
+ {0x89DA, 0x8766}, //855 #CJK UNIFIED IDEOGRAPH
+ {0x89DB, 0x8AB2}, //856 #CJK UNIFIED IDEOGRAPH
+ {0x89DC, 0x5629}, //857 #CJK UNIFIED IDEOGRAPH
+ {0x89DD, 0x8CA8}, //858 #CJK UNIFIED IDEOGRAPH
+ {0x89DE, 0x8FE6}, //859 #CJK UNIFIED IDEOGRAPH
+ {0x89DF, 0x904E}, //860 #CJK UNIFIED IDEOGRAPH
+ {0x89E0, 0x971E}, //861 #CJK UNIFIED IDEOGRAPH
+ {0x89E1, 0x868A}, //862 #CJK UNIFIED IDEOGRAPH
+ {0x89E2, 0x4FC4}, //863 #CJK UNIFIED IDEOGRAPH
+ {0x89E3, 0x5CE8}, //864 #CJK UNIFIED IDEOGRAPH
+ {0x89E4, 0x6211}, //865 #CJK UNIFIED IDEOGRAPH
+ {0x89E5, 0x7259}, //866 #CJK UNIFIED IDEOGRAPH
+ {0x89E6, 0x753B}, //867 #CJK UNIFIED IDEOGRAPH
+ {0x89E7, 0x81E5}, //868 #CJK UNIFIED IDEOGRAPH
+ {0x89E8, 0x82BD}, //869 #CJK UNIFIED IDEOGRAPH
+ {0x89E9, 0x86FE}, //870 #CJK UNIFIED IDEOGRAPH
+ {0x89EA, 0x8CC0}, //871 #CJK UNIFIED IDEOGRAPH
+ {0x89EB, 0x96C5}, //872 #CJK UNIFIED IDEOGRAPH
+ {0x89EC, 0x9913}, //873 #CJK UNIFIED IDEOGRAPH
+ {0x89ED, 0x99D5}, //874 #CJK UNIFIED IDEOGRAPH
+ {0x89EE, 0x4ECB}, //875 #CJK UNIFIED IDEOGRAPH
+ {0x89EF, 0x4F1A}, //876 #CJK UNIFIED IDEOGRAPH
+ {0x89F0, 0x89E3}, //877 #CJK UNIFIED IDEOGRAPH
+ {0x89F1, 0x56DE}, //878 #CJK UNIFIED IDEOGRAPH
+ {0x89F2, 0x584A}, //879 #CJK UNIFIED IDEOGRAPH
+ {0x89F3, 0x58CA}, //880 #CJK UNIFIED IDEOGRAPH
+ {0x89F4, 0x5EFB}, //881 #CJK UNIFIED IDEOGRAPH
+ {0x89F5, 0x5FEB}, //882 #CJK UNIFIED IDEOGRAPH
+ {0x89F6, 0x602A}, //883 #CJK UNIFIED IDEOGRAPH
+ {0x89F7, 0x6094}, //884 #CJK UNIFIED IDEOGRAPH
+ {0x89F8, 0x6062}, //885 #CJK UNIFIED IDEOGRAPH
+ {0x89F9, 0x61D0}, //886 #CJK UNIFIED IDEOGRAPH
+ {0x89FA, 0x6212}, //887 #CJK UNIFIED IDEOGRAPH
+ {0x89FB, 0x62D0}, //888 #CJK UNIFIED IDEOGRAPH
+ {0x89FC, 0x6539}, //889 #CJK UNIFIED IDEOGRAPH
+ {0x8A40, 0x9B41}, //890 #CJK UNIFIED IDEOGRAPH
+ {0x8A41, 0x6666}, //891 #CJK UNIFIED IDEOGRAPH
+ {0x8A42, 0x68B0}, //892 #CJK UNIFIED IDEOGRAPH
+ {0x8A43, 0x6D77}, //893 #CJK UNIFIED IDEOGRAPH
+ {0x8A44, 0x7070}, //894 #CJK UNIFIED IDEOGRAPH
+ {0x8A45, 0x754C}, //895 #CJK UNIFIED IDEOGRAPH
+ {0x8A46, 0x7686}, //896 #CJK UNIFIED IDEOGRAPH
+ {0x8A47, 0x7D75}, //897 #CJK UNIFIED IDEOGRAPH
+ {0x8A48, 0x82A5}, //898 #CJK UNIFIED IDEOGRAPH
+ {0x8A49, 0x87F9}, //899 #CJK UNIFIED IDEOGRAPH
+ {0x8A4A, 0x958B}, //900 #CJK UNIFIED IDEOGRAPH
+ {0x8A4B, 0x968E}, //901 #CJK UNIFIED IDEOGRAPH
+ {0x8A4C, 0x8C9D}, //902 #CJK UNIFIED IDEOGRAPH
+ {0x8A4D, 0x51F1}, //903 #CJK UNIFIED IDEOGRAPH
+ {0x8A4E, 0x52BE}, //904 #CJK UNIFIED IDEOGRAPH
+ {0x8A4F, 0x5916}, //905 #CJK UNIFIED IDEOGRAPH
+ {0x8A50, 0x54B3}, //906 #CJK UNIFIED IDEOGRAPH
+ {0x8A51, 0x5BB3}, //907 #CJK UNIFIED IDEOGRAPH
+ {0x8A52, 0x5D16}, //908 #CJK UNIFIED IDEOGRAPH
+ {0x8A53, 0x6168}, //909 #CJK UNIFIED IDEOGRAPH
+ {0x8A54, 0x6982}, //910 #CJK UNIFIED IDEOGRAPH
+ {0x8A55, 0x6DAF}, //911 #CJK UNIFIED IDEOGRAPH
+ {0x8A56, 0x788D}, //912 #CJK UNIFIED IDEOGRAPH
+ {0x8A57, 0x84CB}, //913 #CJK UNIFIED IDEOGRAPH
+ {0x8A58, 0x8857}, //914 #CJK UNIFIED IDEOGRAPH
+ {0x8A59, 0x8A72}, //915 #CJK UNIFIED IDEOGRAPH
+ {0x8A5A, 0x93A7}, //916 #CJK UNIFIED IDEOGRAPH
+ {0x8A5B, 0x9AB8}, //917 #CJK UNIFIED IDEOGRAPH
+ {0x8A5C, 0x6D6C}, //918 #CJK UNIFIED IDEOGRAPH
+ {0x8A5D, 0x99A8}, //919 #CJK UNIFIED IDEOGRAPH
+ {0x8A5E, 0x86D9}, //920 #CJK UNIFIED IDEOGRAPH
+ {0x8A5F, 0x57A3}, //921 #CJK UNIFIED IDEOGRAPH
+ {0x8A60, 0x67FF}, //922 #CJK UNIFIED IDEOGRAPH
+ {0x8A61, 0x86CE}, //923 #CJK UNIFIED IDEOGRAPH
+ {0x8A62, 0x920E}, //924 #CJK UNIFIED IDEOGRAPH
+ {0x8A63, 0x5283}, //925 #CJK UNIFIED IDEOGRAPH
+ {0x8A64, 0x5687}, //926 #CJK UNIFIED IDEOGRAPH
+ {0x8A65, 0x5404}, //927 #CJK UNIFIED IDEOGRAPH
+ {0x8A66, 0x5ED3}, //928 #CJK UNIFIED IDEOGRAPH
+ {0x8A67, 0x62E1}, //929 #CJK UNIFIED IDEOGRAPH
+ {0x8A68, 0x64B9}, //930 #CJK UNIFIED IDEOGRAPH
+ {0x8A69, 0x683C}, //931 #CJK UNIFIED IDEOGRAPH
+ {0x8A6A, 0x6838}, //932 #CJK UNIFIED IDEOGRAPH
+ {0x8A6B, 0x6BBB}, //933 #CJK UNIFIED IDEOGRAPH
+ {0x8A6C, 0x7372}, //934 #CJK UNIFIED IDEOGRAPH
+ {0x8A6D, 0x78BA}, //935 #CJK UNIFIED IDEOGRAPH
+ {0x8A6E, 0x7A6B}, //936 #CJK UNIFIED IDEOGRAPH
+ {0x8A6F, 0x899A}, //937 #CJK UNIFIED IDEOGRAPH
+ {0x8A70, 0x89D2}, //938 #CJK UNIFIED IDEOGRAPH
+ {0x8A71, 0x8D6B}, //939 #CJK UNIFIED IDEOGRAPH
+ {0x8A72, 0x8F03}, //940 #CJK UNIFIED IDEOGRAPH
+ {0x8A73, 0x90ED}, //941 #CJK UNIFIED IDEOGRAPH
+ {0x8A74, 0x95A3}, //942 #CJK UNIFIED IDEOGRAPH
+ {0x8A75, 0x9694}, //943 #CJK UNIFIED IDEOGRAPH
+ {0x8A76, 0x9769}, //944 #CJK UNIFIED IDEOGRAPH
+ {0x8A77, 0x5B66}, //945 #CJK UNIFIED IDEOGRAPH
+ {0x8A78, 0x5CB3}, //946 #CJK UNIFIED IDEOGRAPH
+ {0x8A79, 0x697D}, //947 #CJK UNIFIED IDEOGRAPH
+ {0x8A7A, 0x984D}, //948 #CJK UNIFIED IDEOGRAPH
+ {0x8A7B, 0x984E}, //949 #CJK UNIFIED IDEOGRAPH
+ {0x8A7C, 0x639B}, //950 #CJK UNIFIED IDEOGRAPH
+ {0x8A7D, 0x7B20}, //951 #CJK UNIFIED IDEOGRAPH
+ {0x8A7E, 0x6A2B}, //952 #CJK UNIFIED IDEOGRAPH
+ {0x8A80, 0x6A7F}, //953 #CJK UNIFIED IDEOGRAPH
+ {0x8A81, 0x68B6}, //954 #CJK UNIFIED IDEOGRAPH
+ {0x8A82, 0x9C0D}, //955 #CJK UNIFIED IDEOGRAPH
+ {0x8A83, 0x6F5F}, //956 #CJK UNIFIED IDEOGRAPH
+ {0x8A84, 0x5272}, //957 #CJK UNIFIED IDEOGRAPH
+ {0x8A85, 0x559D}, //958 #CJK UNIFIED IDEOGRAPH
+ {0x8A86, 0x6070}, //959 #CJK UNIFIED IDEOGRAPH
+ {0x8A87, 0x62EC}, //960 #CJK UNIFIED IDEOGRAPH
+ {0x8A88, 0x6D3B}, //961 #CJK UNIFIED IDEOGRAPH
+ {0x8A89, 0x6E07}, //962 #CJK UNIFIED IDEOGRAPH
+ {0x8A8A, 0x6ED1}, //963 #CJK UNIFIED IDEOGRAPH
+ {0x8A8B, 0x845B}, //964 #CJK UNIFIED IDEOGRAPH
+ {0x8A8C, 0x8910}, //965 #CJK UNIFIED IDEOGRAPH
+ {0x8A8D, 0x8F44}, //966 #CJK UNIFIED IDEOGRAPH
+ {0x8A8E, 0x4E14}, //967 #CJK UNIFIED IDEOGRAPH
+ {0x8A8F, 0x9C39}, //968 #CJK UNIFIED IDEOGRAPH
+ {0x8A90, 0x53F6}, //969 #CJK UNIFIED IDEOGRAPH
+ {0x8A91, 0x691B}, //970 #CJK UNIFIED IDEOGRAPH
+ {0x8A92, 0x6A3A}, //971 #CJK UNIFIED IDEOGRAPH
+ {0x8A93, 0x9784}, //972 #CJK UNIFIED IDEOGRAPH
+ {0x8A94, 0x682A}, //973 #CJK UNIFIED IDEOGRAPH
+ {0x8A95, 0x515C}, //974 #CJK UNIFIED IDEOGRAPH
+ {0x8A96, 0x7AC3}, //975 #CJK UNIFIED IDEOGRAPH
+ {0x8A97, 0x84B2}, //976 #CJK UNIFIED IDEOGRAPH
+ {0x8A98, 0x91DC}, //977 #CJK UNIFIED IDEOGRAPH
+ {0x8A99, 0x938C}, //978 #CJK UNIFIED IDEOGRAPH
+ {0x8A9A, 0x565B}, //979 #CJK UNIFIED IDEOGRAPH
+ {0x8A9B, 0x9D28}, //980 #CJK UNIFIED IDEOGRAPH
+ {0x8A9C, 0x6822}, //981 #CJK UNIFIED IDEOGRAPH
+ {0x8A9D, 0x8305}, //982 #CJK UNIFIED IDEOGRAPH
+ {0x8A9E, 0x8431}, //983 #CJK UNIFIED IDEOGRAPH
+ {0x8A9F, 0x7CA5}, //984 #CJK UNIFIED IDEOGRAPH
+ {0x8AA0, 0x5208}, //985 #CJK UNIFIED IDEOGRAPH
+ {0x8AA1, 0x82C5}, //986 #CJK UNIFIED IDEOGRAPH
+ {0x8AA2, 0x74E6}, //987 #CJK UNIFIED IDEOGRAPH
+ {0x8AA3, 0x4E7E}, //988 #CJK UNIFIED IDEOGRAPH
+ {0x8AA4, 0x4F83}, //989 #CJK UNIFIED IDEOGRAPH
+ {0x8AA5, 0x51A0}, //990 #CJK UNIFIED IDEOGRAPH
+ {0x8AA6, 0x5BD2}, //991 #CJK UNIFIED IDEOGRAPH
+ {0x8AA7, 0x520A}, //992 #CJK UNIFIED IDEOGRAPH
+ {0x8AA8, 0x52D8}, //993 #CJK UNIFIED IDEOGRAPH
+ {0x8AA9, 0x52E7}, //994 #CJK UNIFIED IDEOGRAPH
+ {0x8AAA, 0x5DFB}, //995 #CJK UNIFIED IDEOGRAPH
+ {0x8AAB, 0x559A}, //996 #CJK UNIFIED IDEOGRAPH
+ {0x8AAC, 0x582A}, //997 #CJK UNIFIED IDEOGRAPH
+ {0x8AAD, 0x59E6}, //998 #CJK UNIFIED IDEOGRAPH
+ {0x8AAE, 0x5B8C}, //999 #CJK UNIFIED IDEOGRAPH
+ {0x8AAF, 0x5B98}, //1000 #CJK UNIFIED IDEOGRAPH
+ {0x8AB0, 0x5BDB}, //1001 #CJK UNIFIED IDEOGRAPH
+ {0x8AB1, 0x5E72}, //1002 #CJK UNIFIED IDEOGRAPH
+ {0x8AB2, 0x5E79}, //1003 #CJK UNIFIED IDEOGRAPH
+ {0x8AB3, 0x60A3}, //1004 #CJK UNIFIED IDEOGRAPH
+ {0x8AB4, 0x611F}, //1005 #CJK UNIFIED IDEOGRAPH
+ {0x8AB5, 0x6163}, //1006 #CJK UNIFIED IDEOGRAPH
+ {0x8AB6, 0x61BE}, //1007 #CJK UNIFIED IDEOGRAPH
+ {0x8AB7, 0x63DB}, //1008 #CJK UNIFIED IDEOGRAPH
+ {0x8AB8, 0x6562}, //1009 #CJK UNIFIED IDEOGRAPH
+ {0x8AB9, 0x67D1}, //1010 #CJK UNIFIED IDEOGRAPH
+ {0x8ABA, 0x6853}, //1011 #CJK UNIFIED IDEOGRAPH
+ {0x8ABB, 0x68FA}, //1012 #CJK UNIFIED IDEOGRAPH
+ {0x8ABC, 0x6B3E}, //1013 #CJK UNIFIED IDEOGRAPH
+ {0x8ABD, 0x6B53}, //1014 #CJK UNIFIED IDEOGRAPH
+ {0x8ABE, 0x6C57}, //1015 #CJK UNIFIED IDEOGRAPH
+ {0x8ABF, 0x6F22}, //1016 #CJK UNIFIED IDEOGRAPH
+ {0x8AC0, 0x6F97}, //1017 #CJK UNIFIED IDEOGRAPH
+ {0x8AC1, 0x6F45}, //1018 #CJK UNIFIED IDEOGRAPH
+ {0x8AC2, 0x74B0}, //1019 #CJK UNIFIED IDEOGRAPH
+ {0x8AC3, 0x7518}, //1020 #CJK UNIFIED IDEOGRAPH
+ {0x8AC4, 0x76E3}, //1021 #CJK UNIFIED IDEOGRAPH
+ {0x8AC5, 0x770B}, //1022 #CJK UNIFIED IDEOGRAPH
+ {0x8AC6, 0x7AFF}, //1023 #CJK UNIFIED IDEOGRAPH
+ {0x8AC7, 0x7BA1}, //1024 #CJK UNIFIED IDEOGRAPH
+ {0x8AC8, 0x7C21}, //1025 #CJK UNIFIED IDEOGRAPH
+ {0x8AC9, 0x7DE9}, //1026 #CJK UNIFIED IDEOGRAPH
+ {0x8ACA, 0x7F36}, //1027 #CJK UNIFIED IDEOGRAPH
+ {0x8ACB, 0x7FF0}, //1028 #CJK UNIFIED IDEOGRAPH
+ {0x8ACC, 0x809D}, //1029 #CJK UNIFIED IDEOGRAPH
+ {0x8ACD, 0x8266}, //1030 #CJK UNIFIED IDEOGRAPH
+ {0x8ACE, 0x839E}, //1031 #CJK UNIFIED IDEOGRAPH
+ {0x8ACF, 0x89B3}, //1032 #CJK UNIFIED IDEOGRAPH
+ {0x8AD0, 0x8ACC}, //1033 #CJK UNIFIED IDEOGRAPH
+ {0x8AD1, 0x8CAB}, //1034 #CJK UNIFIED IDEOGRAPH
+ {0x8AD2, 0x9084}, //1035 #CJK UNIFIED IDEOGRAPH
+ {0x8AD3, 0x9451}, //1036 #CJK UNIFIED IDEOGRAPH
+ {0x8AD4, 0x9593}, //1037 #CJK UNIFIED IDEOGRAPH
+ {0x8AD5, 0x9591}, //1038 #CJK UNIFIED IDEOGRAPH
+ {0x8AD6, 0x95A2}, //1039 #CJK UNIFIED IDEOGRAPH
+ {0x8AD7, 0x9665}, //1040 #CJK UNIFIED IDEOGRAPH
+ {0x8AD8, 0x97D3}, //1041 #CJK UNIFIED IDEOGRAPH
+ {0x8AD9, 0x9928}, //1042 #CJK UNIFIED IDEOGRAPH
+ {0x8ADA, 0x8218}, //1043 #CJK UNIFIED IDEOGRAPH
+ {0x8ADB, 0x4E38}, //1044 #CJK UNIFIED IDEOGRAPH
+ {0x8ADC, 0x542B}, //1045 #CJK UNIFIED IDEOGRAPH
+ {0x8ADD, 0x5CB8}, //1046 #CJK UNIFIED IDEOGRAPH
+ {0x8ADE, 0x5DCC}, //1047 #CJK UNIFIED IDEOGRAPH
+ {0x8ADF, 0x73A9}, //1048 #CJK UNIFIED IDEOGRAPH
+ {0x8AE0, 0x764C}, //1049 #CJK UNIFIED IDEOGRAPH
+ {0x8AE1, 0x773C}, //1050 #CJK UNIFIED IDEOGRAPH
+ {0x8AE2, 0x5CA9}, //1051 #CJK UNIFIED IDEOGRAPH
+ {0x8AE3, 0x7FEB}, //1052 #CJK UNIFIED IDEOGRAPH
+ {0x8AE4, 0x8D0B}, //1053 #CJK UNIFIED IDEOGRAPH
+ {0x8AE5, 0x96C1}, //1054 #CJK UNIFIED IDEOGRAPH
+ {0x8AE6, 0x9811}, //1055 #CJK UNIFIED IDEOGRAPH
+ {0x8AE7, 0x9854}, //1056 #CJK UNIFIED IDEOGRAPH
+ {0x8AE8, 0x9858}, //1057 #CJK UNIFIED IDEOGRAPH
+ {0x8AE9, 0x4F01}, //1058 #CJK UNIFIED IDEOGRAPH
+ {0x8AEA, 0x4F0E}, //1059 #CJK UNIFIED IDEOGRAPH
+ {0x8AEB, 0x5371}, //1060 #CJK UNIFIED IDEOGRAPH
+ {0x8AEC, 0x559C}, //1061 #CJK UNIFIED IDEOGRAPH
+ {0x8AED, 0x5668}, //1062 #CJK UNIFIED IDEOGRAPH
+ {0x8AEE, 0x57FA}, //1063 #CJK UNIFIED IDEOGRAPH
+ {0x8AEF, 0x5947}, //1064 #CJK UNIFIED IDEOGRAPH
+ {0x8AF0, 0x5B09}, //1065 #CJK UNIFIED IDEOGRAPH
+ {0x8AF1, 0x5BC4}, //1066 #CJK UNIFIED IDEOGRAPH
+ {0x8AF2, 0x5C90}, //1067 #CJK UNIFIED IDEOGRAPH
+ {0x8AF3, 0x5E0C}, //1068 #CJK UNIFIED IDEOGRAPH
+ {0x8AF4, 0x5E7E}, //1069 #CJK UNIFIED IDEOGRAPH
+ {0x8AF5, 0x5FCC}, //1070 #CJK UNIFIED IDEOGRAPH
+ {0x8AF6, 0x63EE}, //1071 #CJK UNIFIED IDEOGRAPH
+ {0x8AF7, 0x673A}, //1072 #CJK UNIFIED IDEOGRAPH
+ {0x8AF8, 0x65D7}, //1073 #CJK UNIFIED IDEOGRAPH
+ {0x8AF9, 0x65E2}, //1074 #CJK UNIFIED IDEOGRAPH
+ {0x8AFA, 0x671F}, //1075 #CJK UNIFIED IDEOGRAPH
+ {0x8AFB, 0x68CB}, //1076 #CJK UNIFIED IDEOGRAPH
+ {0x8AFC, 0x68C4}, //1077 #CJK UNIFIED IDEOGRAPH
+ {0x8B40, 0x6A5F}, //1078 #CJK UNIFIED IDEOGRAPH
+ {0x8B41, 0x5E30}, //1079 #CJK UNIFIED IDEOGRAPH
+ {0x8B42, 0x6BC5}, //1080 #CJK UNIFIED IDEOGRAPH
+ {0x8B43, 0x6C17}, //1081 #CJK UNIFIED IDEOGRAPH
+ {0x8B44, 0x6C7D}, //1082 #CJK UNIFIED IDEOGRAPH
+ {0x8B45, 0x757F}, //1083 #CJK UNIFIED IDEOGRAPH
+ {0x8B46, 0x7948}, //1084 #CJK UNIFIED IDEOGRAPH
+ {0x8B47, 0x5B63}, //1085 #CJK UNIFIED IDEOGRAPH
+ {0x8B48, 0x7A00}, //1086 #CJK UNIFIED IDEOGRAPH
+ {0x8B49, 0x7D00}, //1087 #CJK UNIFIED IDEOGRAPH
+ {0x8B4A, 0x5FBD}, //1088 #CJK UNIFIED IDEOGRAPH
+ {0x8B4B, 0x898F}, //1089 #CJK UNIFIED IDEOGRAPH
+ {0x8B4C, 0x8A18}, //1090 #CJK UNIFIED IDEOGRAPH
+ {0x8B4D, 0x8CB4}, //1091 #CJK UNIFIED IDEOGRAPH
+ {0x8B4E, 0x8D77}, //1092 #CJK UNIFIED IDEOGRAPH
+ {0x8B4F, 0x8ECC}, //1093 #CJK UNIFIED IDEOGRAPH
+ {0x8B50, 0x8F1D}, //1094 #CJK UNIFIED IDEOGRAPH
+ {0x8B51, 0x98E2}, //1095 #CJK UNIFIED IDEOGRAPH
+ {0x8B52, 0x9A0E}, //1096 #CJK UNIFIED IDEOGRAPH
+ {0x8B53, 0x9B3C}, //1097 #CJK UNIFIED IDEOGRAPH
+ {0x8B54, 0x4E80}, //1098 #CJK UNIFIED IDEOGRAPH
+ {0x8B55, 0x507D}, //1099 #CJK UNIFIED IDEOGRAPH
+ {0x8B56, 0x5100}, //1100 #CJK UNIFIED IDEOGRAPH
+ {0x8B57, 0x5993}, //1101 #CJK UNIFIED IDEOGRAPH
+ {0x8B58, 0x5B9C}, //1102 #CJK UNIFIED IDEOGRAPH
+ {0x8B59, 0x622F}, //1103 #CJK UNIFIED IDEOGRAPH
+ {0x8B5A, 0x6280}, //1104 #CJK UNIFIED IDEOGRAPH
+ {0x8B5B, 0x64EC}, //1105 #CJK UNIFIED IDEOGRAPH
+ {0x8B5C, 0x6B3A}, //1106 #CJK UNIFIED IDEOGRAPH
+ {0x8B5D, 0x72A0}, //1107 #CJK UNIFIED IDEOGRAPH
+ {0x8B5E, 0x7591}, //1108 #CJK UNIFIED IDEOGRAPH
+ {0x8B5F, 0x7947}, //1109 #CJK UNIFIED IDEOGRAPH
+ {0x8B60, 0x7FA9}, //1110 #CJK UNIFIED IDEOGRAPH
+ {0x8B61, 0x87FB}, //1111 #CJK UNIFIED IDEOGRAPH
+ {0x8B62, 0x8ABC}, //1112 #CJK UNIFIED IDEOGRAPH
+ {0x8B63, 0x8B70}, //1113 #CJK UNIFIED IDEOGRAPH
+ {0x8B64, 0x63AC}, //1114 #CJK UNIFIED IDEOGRAPH
+ {0x8B65, 0x83CA}, //1115 #CJK UNIFIED IDEOGRAPH
+ {0x8B66, 0x97A0}, //1116 #CJK UNIFIED IDEOGRAPH
+ {0x8B67, 0x5409}, //1117 #CJK UNIFIED IDEOGRAPH
+ {0x8B68, 0x5403}, //1118 #CJK UNIFIED IDEOGRAPH
+ {0x8B69, 0x55AB}, //1119 #CJK UNIFIED IDEOGRAPH
+ {0x8B6A, 0x6854}, //1120 #CJK UNIFIED IDEOGRAPH
+ {0x8B6B, 0x6A58}, //1121 #CJK UNIFIED IDEOGRAPH
+ {0x8B6C, 0x8A70}, //1122 #CJK UNIFIED IDEOGRAPH
+ {0x8B6D, 0x7827}, //1123 #CJK UNIFIED IDEOGRAPH
+ {0x8B6E, 0x6775}, //1124 #CJK UNIFIED IDEOGRAPH
+ {0x8B6F, 0x9ECD}, //1125 #CJK UNIFIED IDEOGRAPH
+ {0x8B70, 0x5374}, //1126 #CJK UNIFIED IDEOGRAPH
+ {0x8B71, 0x5BA2}, //1127 #CJK UNIFIED IDEOGRAPH
+ {0x8B72, 0x811A}, //1128 #CJK UNIFIED IDEOGRAPH
+ {0x8B73, 0x8650}, //1129 #CJK UNIFIED IDEOGRAPH
+ {0x8B74, 0x9006}, //1130 #CJK UNIFIED IDEOGRAPH
+ {0x8B75, 0x4E18}, //1131 #CJK UNIFIED IDEOGRAPH
+ {0x8B76, 0x4E45}, //1132 #CJK UNIFIED IDEOGRAPH
+ {0x8B77, 0x4EC7}, //1133 #CJK UNIFIED IDEOGRAPH
+ {0x8B78, 0x4F11}, //1134 #CJK UNIFIED IDEOGRAPH
+ {0x8B79, 0x53CA}, //1135 #CJK UNIFIED IDEOGRAPH
+ {0x8B7A, 0x5438}, //1136 #CJK UNIFIED IDEOGRAPH
+ {0x8B7B, 0x5BAE}, //1137 #CJK UNIFIED IDEOGRAPH
+ {0x8B7C, 0x5F13}, //1138 #CJK UNIFIED IDEOGRAPH
+ {0x8B7D, 0x6025}, //1139 #CJK UNIFIED IDEOGRAPH
+ {0x8B7E, 0x6551}, //1140 #CJK UNIFIED IDEOGRAPH
+ {0x8B80, 0x673D}, //1141 #CJK UNIFIED IDEOGRAPH
+ {0x8B81, 0x6C42}, //1142 #CJK UNIFIED IDEOGRAPH
+ {0x8B82, 0x6C72}, //1143 #CJK UNIFIED IDEOGRAPH
+ {0x8B83, 0x6CE3}, //1144 #CJK UNIFIED IDEOGRAPH
+ {0x8B84, 0x7078}, //1145 #CJK UNIFIED IDEOGRAPH
+ {0x8B85, 0x7403}, //1146 #CJK UNIFIED IDEOGRAPH
+ {0x8B86, 0x7A76}, //1147 #CJK UNIFIED IDEOGRAPH
+ {0x8B87, 0x7AAE}, //1148 #CJK UNIFIED IDEOGRAPH
+ {0x8B88, 0x7B08}, //1149 #CJK UNIFIED IDEOGRAPH
+ {0x8B89, 0x7D1A}, //1150 #CJK UNIFIED IDEOGRAPH
+ {0x8B8A, 0x7CFE}, //1151 #CJK UNIFIED IDEOGRAPH
+ {0x8B8B, 0x7D66}, //1152 #CJK UNIFIED IDEOGRAPH
+ {0x8B8C, 0x65E7}, //1153 #CJK UNIFIED IDEOGRAPH
+ {0x8B8D, 0x725B}, //1154 #CJK UNIFIED IDEOGRAPH
+ {0x8B8E, 0x53BB}, //1155 #CJK UNIFIED IDEOGRAPH
+ {0x8B8F, 0x5C45}, //1156 #CJK UNIFIED IDEOGRAPH
+ {0x8B90, 0x5DE8}, //1157 #CJK UNIFIED IDEOGRAPH
+ {0x8B91, 0x62D2}, //1158 #CJK UNIFIED IDEOGRAPH
+ {0x8B92, 0x62E0}, //1159 #CJK UNIFIED IDEOGRAPH
+ {0x8B93, 0x6319}, //1160 #CJK UNIFIED IDEOGRAPH
+ {0x8B94, 0x6E20}, //1161 #CJK UNIFIED IDEOGRAPH
+ {0x8B95, 0x865A}, //1162 #CJK UNIFIED IDEOGRAPH
+ {0x8B96, 0x8A31}, //1163 #CJK UNIFIED IDEOGRAPH
+ {0x8B97, 0x8DDD}, //1164 #CJK UNIFIED IDEOGRAPH
+ {0x8B98, 0x92F8}, //1165 #CJK UNIFIED IDEOGRAPH
+ {0x8B99, 0x6F01}, //1166 #CJK UNIFIED IDEOGRAPH
+ {0x8B9A, 0x79A6}, //1167 #CJK UNIFIED IDEOGRAPH
+ {0x8B9B, 0x9B5A}, //1168 #CJK UNIFIED IDEOGRAPH
+ {0x8B9C, 0x4EA8}, //1169 #CJK UNIFIED IDEOGRAPH
+ {0x8B9D, 0x4EAB}, //1170 #CJK UNIFIED IDEOGRAPH
+ {0x8B9E, 0x4EAC}, //1171 #CJK UNIFIED IDEOGRAPH
+ {0x8B9F, 0x4F9B}, //1172 #CJK UNIFIED IDEOGRAPH
+ {0x8BA0, 0x4FA0}, //1173 #CJK UNIFIED IDEOGRAPH
+ {0x8BA1, 0x50D1}, //1174 #CJK UNIFIED IDEOGRAPH
+ {0x8BA2, 0x5147}, //1175 #CJK UNIFIED IDEOGRAPH
+ {0x8BA3, 0x7AF6}, //1176 #CJK UNIFIED IDEOGRAPH
+ {0x8BA4, 0x5171}, //1177 #CJK UNIFIED IDEOGRAPH
+ {0x8BA5, 0x51F6}, //1178 #CJK UNIFIED IDEOGRAPH
+ {0x8BA6, 0x5354}, //1179 #CJK UNIFIED IDEOGRAPH
+ {0x8BA7, 0x5321}, //1180 #CJK UNIFIED IDEOGRAPH
+ {0x8BA8, 0x537F}, //1181 #CJK UNIFIED IDEOGRAPH
+ {0x8BA9, 0x53EB}, //1182 #CJK UNIFIED IDEOGRAPH
+ {0x8BAA, 0x55AC}, //1183 #CJK UNIFIED IDEOGRAPH
+ {0x8BAB, 0x5883}, //1184 #CJK UNIFIED IDEOGRAPH
+ {0x8BAC, 0x5CE1}, //1185 #CJK UNIFIED IDEOGRAPH
+ {0x8BAD, 0x5F37}, //1186 #CJK UNIFIED IDEOGRAPH
+ {0x8BAE, 0x5F4A}, //1187 #CJK UNIFIED IDEOGRAPH
+ {0x8BAF, 0x602F}, //1188 #CJK UNIFIED IDEOGRAPH
+ {0x8BB0, 0x6050}, //1189 #CJK UNIFIED IDEOGRAPH
+ {0x8BB1, 0x606D}, //1190 #CJK UNIFIED IDEOGRAPH
+ {0x8BB2, 0x631F}, //1191 #CJK UNIFIED IDEOGRAPH
+ {0x8BB3, 0x6559}, //1192 #CJK UNIFIED IDEOGRAPH
+ {0x8BB4, 0x6A4B}, //1193 #CJK UNIFIED IDEOGRAPH
+ {0x8BB5, 0x6CC1}, //1194 #CJK UNIFIED IDEOGRAPH
+ {0x8BB6, 0x72C2}, //1195 #CJK UNIFIED IDEOGRAPH
+ {0x8BB7, 0x72ED}, //1196 #CJK UNIFIED IDEOGRAPH
+ {0x8BB8, 0x77EF}, //1197 #CJK UNIFIED IDEOGRAPH
+ {0x8BB9, 0x80F8}, //1198 #CJK UNIFIED IDEOGRAPH
+ {0x8BBA, 0x8105}, //1199 #CJK UNIFIED IDEOGRAPH
+ {0x8BBB, 0x8208}, //1200 #CJK UNIFIED IDEOGRAPH
+ {0x8BBC, 0x854E}, //1201 #CJK UNIFIED IDEOGRAPH
+ {0x8BBD, 0x90F7}, //1202 #CJK UNIFIED IDEOGRAPH
+ {0x8BBE, 0x93E1}, //1203 #CJK UNIFIED IDEOGRAPH
+ {0x8BBF, 0x97FF}, //1204 #CJK UNIFIED IDEOGRAPH
+ {0x8BC0, 0x9957}, //1205 #CJK UNIFIED IDEOGRAPH
+ {0x8BC1, 0x9A5A}, //1206 #CJK UNIFIED IDEOGRAPH
+ {0x8BC2, 0x4EF0}, //1207 #CJK UNIFIED IDEOGRAPH
+ {0x8BC3, 0x51DD}, //1208 #CJK UNIFIED IDEOGRAPH
+ {0x8BC4, 0x5C2D}, //1209 #CJK UNIFIED IDEOGRAPH
+ {0x8BC5, 0x6681}, //1210 #CJK UNIFIED IDEOGRAPH
+ {0x8BC6, 0x696D}, //1211 #CJK UNIFIED IDEOGRAPH
+ {0x8BC7, 0x5C40}, //1212 #CJK UNIFIED IDEOGRAPH
+ {0x8BC8, 0x66F2}, //1213 #CJK UNIFIED IDEOGRAPH
+ {0x8BC9, 0x6975}, //1214 #CJK UNIFIED IDEOGRAPH
+ {0x8BCA, 0x7389}, //1215 #CJK UNIFIED IDEOGRAPH
+ {0x8BCB, 0x6850}, //1216 #CJK UNIFIED IDEOGRAPH
+ {0x8BCC, 0x7C81}, //1217 #CJK UNIFIED IDEOGRAPH
+ {0x8BCD, 0x50C5}, //1218 #CJK UNIFIED IDEOGRAPH
+ {0x8BCE, 0x52E4}, //1219 #CJK UNIFIED IDEOGRAPH
+ {0x8BCF, 0x5747}, //1220 #CJK UNIFIED IDEOGRAPH
+ {0x8BD0, 0x5DFE}, //1221 #CJK UNIFIED IDEOGRAPH
+ {0x8BD1, 0x9326}, //1222 #CJK UNIFIED IDEOGRAPH
+ {0x8BD2, 0x65A4}, //1223 #CJK UNIFIED IDEOGRAPH
+ {0x8BD3, 0x6B23}, //1224 #CJK UNIFIED IDEOGRAPH
+ {0x8BD4, 0x6B3D}, //1225 #CJK UNIFIED IDEOGRAPH
+ {0x8BD5, 0x7434}, //1226 #CJK UNIFIED IDEOGRAPH
+ {0x8BD6, 0x7981}, //1227 #CJK UNIFIED IDEOGRAPH
+ {0x8BD7, 0x79BD}, //1228 #CJK UNIFIED IDEOGRAPH
+ {0x8BD8, 0x7B4B}, //1229 #CJK UNIFIED IDEOGRAPH
+ {0x8BD9, 0x7DCA}, //1230 #CJK UNIFIED IDEOGRAPH
+ {0x8BDA, 0x82B9}, //1231 #CJK UNIFIED IDEOGRAPH
+ {0x8BDB, 0x83CC}, //1232 #CJK UNIFIED IDEOGRAPH
+ {0x8BDC, 0x887F}, //1233 #CJK UNIFIED IDEOGRAPH
+ {0x8BDD, 0x895F}, //1234 #CJK UNIFIED IDEOGRAPH
+ {0x8BDE, 0x8B39}, //1235 #CJK UNIFIED IDEOGRAPH
+ {0x8BDF, 0x8FD1}, //1236 #CJK UNIFIED IDEOGRAPH
+ {0x8BE0, 0x91D1}, //1237 #CJK UNIFIED IDEOGRAPH
+ {0x8BE1, 0x541F}, //1238 #CJK UNIFIED IDEOGRAPH
+ {0x8BE2, 0x9280}, //1239 #CJK UNIFIED IDEOGRAPH
+ {0x8BE3, 0x4E5D}, //1240 #CJK UNIFIED IDEOGRAPH
+ {0x8BE4, 0x5036}, //1241 #CJK UNIFIED IDEOGRAPH
+ {0x8BE5, 0x53E5}, //1242 #CJK UNIFIED IDEOGRAPH
+ {0x8BE6, 0x533A}, //1243 #CJK UNIFIED IDEOGRAPH
+ {0x8BE7, 0x72D7}, //1244 #CJK UNIFIED IDEOGRAPH
+ {0x8BE8, 0x7396}, //1245 #CJK UNIFIED IDEOGRAPH
+ {0x8BE9, 0x77E9}, //1246 #CJK UNIFIED IDEOGRAPH
+ {0x8BEA, 0x82E6}, //1247 #CJK UNIFIED IDEOGRAPH
+ {0x8BEB, 0x8EAF}, //1248 #CJK UNIFIED IDEOGRAPH
+ {0x8BEC, 0x99C6}, //1249 #CJK UNIFIED IDEOGRAPH
+ {0x8BED, 0x99C8}, //1250 #CJK UNIFIED IDEOGRAPH
+ {0x8BEE, 0x99D2}, //1251 #CJK UNIFIED IDEOGRAPH
+ {0x8BEF, 0x5177}, //1252 #CJK UNIFIED IDEOGRAPH
+ {0x8BF0, 0x611A}, //1253 #CJK UNIFIED IDEOGRAPH
+ {0x8BF1, 0x865E}, //1254 #CJK UNIFIED IDEOGRAPH
+ {0x8BF2, 0x55B0}, //1255 #CJK UNIFIED IDEOGRAPH
+ {0x8BF3, 0x7A7A}, //1256 #CJK UNIFIED IDEOGRAPH
+ {0x8BF4, 0x5076}, //1257 #CJK UNIFIED IDEOGRAPH
+ {0x8BF5, 0x5BD3}, //1258 #CJK UNIFIED IDEOGRAPH
+ {0x8BF6, 0x9047}, //1259 #CJK UNIFIED IDEOGRAPH
+ {0x8BF7, 0x9685}, //1260 #CJK UNIFIED IDEOGRAPH
+ {0x8BF8, 0x4E32}, //1261 #CJK UNIFIED IDEOGRAPH
+ {0x8BF9, 0x6ADB}, //1262 #CJK UNIFIED IDEOGRAPH
+ {0x8BFA, 0x91E7}, //1263 #CJK UNIFIED IDEOGRAPH
+ {0x8BFB, 0x5C51}, //1264 #CJK UNIFIED IDEOGRAPH
+ {0x8BFC, 0x5C48}, //1265 #CJK UNIFIED IDEOGRAPH
+ {0x8C40, 0x6398}, //1266 #CJK UNIFIED IDEOGRAPH
+ {0x8C41, 0x7A9F}, //1267 #CJK UNIFIED IDEOGRAPH
+ {0x8C42, 0x6C93}, //1268 #CJK UNIFIED IDEOGRAPH
+ {0x8C43, 0x9774}, //1269 #CJK UNIFIED IDEOGRAPH
+ {0x8C44, 0x8F61}, //1270 #CJK UNIFIED IDEOGRAPH
+ {0x8C45, 0x7AAA}, //1271 #CJK UNIFIED IDEOGRAPH
+ {0x8C46, 0x718A}, //1272 #CJK UNIFIED IDEOGRAPH
+ {0x8C47, 0x9688}, //1273 #CJK UNIFIED IDEOGRAPH
+ {0x8C48, 0x7C82}, //1274 #CJK UNIFIED IDEOGRAPH
+ {0x8C49, 0x6817}, //1275 #CJK UNIFIED IDEOGRAPH
+ {0x8C4A, 0x7E70}, //1276 #CJK UNIFIED IDEOGRAPH
+ {0x8C4B, 0x6851}, //1277 #CJK UNIFIED IDEOGRAPH
+ {0x8C4C, 0x936C}, //1278 #CJK UNIFIED IDEOGRAPH
+ {0x8C4D, 0x52F2}, //1279 #CJK UNIFIED IDEOGRAPH
+ {0x8C4E, 0x541B}, //1280 #CJK UNIFIED IDEOGRAPH
+ {0x8C4F, 0x85AB}, //1281 #CJK UNIFIED IDEOGRAPH
+ {0x8C50, 0x8A13}, //1282 #CJK UNIFIED IDEOGRAPH
+ {0x8C51, 0x7FA4}, //1283 #CJK UNIFIED IDEOGRAPH
+ {0x8C52, 0x8ECD}, //1284 #CJK UNIFIED IDEOGRAPH
+ {0x8C53, 0x90E1}, //1285 #CJK UNIFIED IDEOGRAPH
+ {0x8C54, 0x5366}, //1286 #CJK UNIFIED IDEOGRAPH
+ {0x8C55, 0x8888}, //1287 #CJK UNIFIED IDEOGRAPH
+ {0x8C56, 0x7941}, //1288 #CJK UNIFIED IDEOGRAPH
+ {0x8C57, 0x4FC2}, //1289 #CJK UNIFIED IDEOGRAPH
+ {0x8C58, 0x50BE}, //1290 #CJK UNIFIED IDEOGRAPH
+ {0x8C59, 0x5211}, //1291 #CJK UNIFIED IDEOGRAPH
+ {0x8C5A, 0x5144}, //1292 #CJK UNIFIED IDEOGRAPH
+ {0x8C5B, 0x5553}, //1293 #CJK UNIFIED IDEOGRAPH
+ {0x8C5C, 0x572D}, //1294 #CJK UNIFIED IDEOGRAPH
+ {0x8C5D, 0x73EA}, //1295 #CJK UNIFIED IDEOGRAPH
+ {0x8C5E, 0x578B}, //1296 #CJK UNIFIED IDEOGRAPH
+ {0x8C5F, 0x5951}, //1297 #CJK UNIFIED IDEOGRAPH
+ {0x8C60, 0x5F62}, //1298 #CJK UNIFIED IDEOGRAPH
+ {0x8C61, 0x5F84}, //1299 #CJK UNIFIED IDEOGRAPH
+ {0x8C62, 0x6075}, //1300 #CJK UNIFIED IDEOGRAPH
+ {0x8C63, 0x6176}, //1301 #CJK UNIFIED IDEOGRAPH
+ {0x8C64, 0x6167}, //1302 #CJK UNIFIED IDEOGRAPH
+ {0x8C65, 0x61A9}, //1303 #CJK UNIFIED IDEOGRAPH
+ {0x8C66, 0x63B2}, //1304 #CJK UNIFIED IDEOGRAPH
+ {0x8C67, 0x643A}, //1305 #CJK UNIFIED IDEOGRAPH
+ {0x8C68, 0x656C}, //1306 #CJK UNIFIED IDEOGRAPH
+ {0x8C69, 0x666F}, //1307 #CJK UNIFIED IDEOGRAPH
+ {0x8C6A, 0x6842}, //1308 #CJK UNIFIED IDEOGRAPH
+ {0x8C6B, 0x6E13}, //1309 #CJK UNIFIED IDEOGRAPH
+ {0x8C6C, 0x7566}, //1310 #CJK UNIFIED IDEOGRAPH
+ {0x8C6D, 0x7A3D}, //1311 #CJK UNIFIED IDEOGRAPH
+ {0x8C6E, 0x7CFB}, //1312 #CJK UNIFIED IDEOGRAPH
+ {0x8C6F, 0x7D4C}, //1313 #CJK UNIFIED IDEOGRAPH
+ {0x8C70, 0x7D99}, //1314 #CJK UNIFIED IDEOGRAPH
+ {0x8C71, 0x7E4B}, //1315 #CJK UNIFIED IDEOGRAPH
+ {0x8C72, 0x7F6B}, //1316 #CJK UNIFIED IDEOGRAPH
+ {0x8C73, 0x830E}, //1317 #CJK UNIFIED IDEOGRAPH
+ {0x8C74, 0x834A}, //1318 #CJK UNIFIED IDEOGRAPH
+ {0x8C75, 0x86CD}, //1319 #CJK UNIFIED IDEOGRAPH
+ {0x8C76, 0x8A08}, //1320 #CJK UNIFIED IDEOGRAPH
+ {0x8C77, 0x8A63}, //1321 #CJK UNIFIED IDEOGRAPH
+ {0x8C78, 0x8B66}, //1322 #CJK UNIFIED IDEOGRAPH
+ {0x8C79, 0x8EFD}, //1323 #CJK UNIFIED IDEOGRAPH
+ {0x8C7A, 0x981A}, //1324 #CJK UNIFIED IDEOGRAPH
+ {0x8C7B, 0x9D8F}, //1325 #CJK UNIFIED IDEOGRAPH
+ {0x8C7C, 0x82B8}, //1326 #CJK UNIFIED IDEOGRAPH
+ {0x8C7D, 0x8FCE}, //1327 #CJK UNIFIED IDEOGRAPH
+ {0x8C7E, 0x9BE8}, //1328 #CJK UNIFIED IDEOGRAPH
+ {0x8C80, 0x5287}, //1329 #CJK UNIFIED IDEOGRAPH
+ {0x8C81, 0x621F}, //1330 #CJK UNIFIED IDEOGRAPH
+ {0x8C82, 0x6483}, //1331 #CJK UNIFIED IDEOGRAPH
+ {0x8C83, 0x6FC0}, //1332 #CJK UNIFIED IDEOGRAPH
+ {0x8C84, 0x9699}, //1333 #CJK UNIFIED IDEOGRAPH
+ {0x8C85, 0x6841}, //1334 #CJK UNIFIED IDEOGRAPH
+ {0x8C86, 0x5091}, //1335 #CJK UNIFIED IDEOGRAPH
+ {0x8C87, 0x6B20}, //1336 #CJK UNIFIED IDEOGRAPH
+ {0x8C88, 0x6C7A}, //1337 #CJK UNIFIED IDEOGRAPH
+ {0x8C89, 0x6F54}, //1338 #CJK UNIFIED IDEOGRAPH
+ {0x8C8A, 0x7A74}, //1339 #CJK UNIFIED IDEOGRAPH
+ {0x8C8B, 0x7D50}, //1340 #CJK UNIFIED IDEOGRAPH
+ {0x8C8C, 0x8840}, //1341 #CJK UNIFIED IDEOGRAPH
+ {0x8C8D, 0x8A23}, //1342 #CJK UNIFIED IDEOGRAPH
+ {0x8C8E, 0x6708}, //1343 #CJK UNIFIED IDEOGRAPH
+ {0x8C8F, 0x4EF6}, //1344 #CJK UNIFIED IDEOGRAPH
+ {0x8C90, 0x5039}, //1345 #CJK UNIFIED IDEOGRAPH
+ {0x8C91, 0x5026}, //1346 #CJK UNIFIED IDEOGRAPH
+ {0x8C92, 0x5065}, //1347 #CJK UNIFIED IDEOGRAPH
+ {0x8C93, 0x517C}, //1348 #CJK UNIFIED IDEOGRAPH
+ {0x8C94, 0x5238}, //1349 #CJK UNIFIED IDEOGRAPH
+ {0x8C95, 0x5263}, //1350 #CJK UNIFIED IDEOGRAPH
+ {0x8C96, 0x55A7}, //1351 #CJK UNIFIED IDEOGRAPH
+ {0x8C97, 0x570F}, //1352 #CJK UNIFIED IDEOGRAPH
+ {0x8C98, 0x5805}, //1353 #CJK UNIFIED IDEOGRAPH
+ {0x8C99, 0x5ACC}, //1354 #CJK UNIFIED IDEOGRAPH
+ {0x8C9A, 0x5EFA}, //1355 #CJK UNIFIED IDEOGRAPH
+ {0x8C9B, 0x61B2}, //1356 #CJK UNIFIED IDEOGRAPH
+ {0x8C9C, 0x61F8}, //1357 #CJK UNIFIED IDEOGRAPH
+ {0x8C9D, 0x62F3}, //1358 #CJK UNIFIED IDEOGRAPH
+ {0x8C9E, 0x6372}, //1359 #CJK UNIFIED IDEOGRAPH
+ {0x8C9F, 0x691C}, //1360 #CJK UNIFIED IDEOGRAPH
+ {0x8CA0, 0x6A29}, //1361 #CJK UNIFIED IDEOGRAPH
+ {0x8CA1, 0x727D}, //1362 #CJK UNIFIED IDEOGRAPH
+ {0x8CA2, 0x72AC}, //1363 #CJK UNIFIED IDEOGRAPH
+ {0x8CA3, 0x732E}, //1364 #CJK UNIFIED IDEOGRAPH
+ {0x8CA4, 0x7814}, //1365 #CJK UNIFIED IDEOGRAPH
+ {0x8CA5, 0x786F}, //1366 #CJK UNIFIED IDEOGRAPH
+ {0x8CA6, 0x7D79}, //1367 #CJK UNIFIED IDEOGRAPH
+ {0x8CA7, 0x770C}, //1368 #CJK UNIFIED IDEOGRAPH
+ {0x8CA8, 0x80A9}, //1369 #CJK UNIFIED IDEOGRAPH
+ {0x8CA9, 0x898B}, //1370 #CJK UNIFIED IDEOGRAPH
+ {0x8CAA, 0x8B19}, //1371 #CJK UNIFIED IDEOGRAPH
+ {0x8CAB, 0x8CE2}, //1372 #CJK UNIFIED IDEOGRAPH
+ {0x8CAC, 0x8ED2}, //1373 #CJK UNIFIED IDEOGRAPH
+ {0x8CAD, 0x9063}, //1374 #CJK UNIFIED IDEOGRAPH
+ {0x8CAE, 0x9375}, //1375 #CJK UNIFIED IDEOGRAPH
+ {0x8CAF, 0x967A}, //1376 #CJK UNIFIED IDEOGRAPH
+ {0x8CB0, 0x9855}, //1377 #CJK UNIFIED IDEOGRAPH
+ {0x8CB1, 0x9A13}, //1378 #CJK UNIFIED IDEOGRAPH
+ {0x8CB2, 0x9E78}, //1379 #CJK UNIFIED IDEOGRAPH
+ {0x8CB3, 0x5143}, //1380 #CJK UNIFIED IDEOGRAPH
+ {0x8CB4, 0x539F}, //1381 #CJK UNIFIED IDEOGRAPH
+ {0x8CB5, 0x53B3}, //1382 #CJK UNIFIED IDEOGRAPH
+ {0x8CB6, 0x5E7B}, //1383 #CJK UNIFIED IDEOGRAPH
+ {0x8CB7, 0x5F26}, //1384 #CJK UNIFIED IDEOGRAPH
+ {0x8CB8, 0x6E1B}, //1385 #CJK UNIFIED IDEOGRAPH
+ {0x8CB9, 0x6E90}, //1386 #CJK UNIFIED IDEOGRAPH
+ {0x8CBA, 0x7384}, //1387 #CJK UNIFIED IDEOGRAPH
+ {0x8CBB, 0x73FE}, //1388 #CJK UNIFIED IDEOGRAPH
+ {0x8CBC, 0x7D43}, //1389 #CJK UNIFIED IDEOGRAPH
+ {0x8CBD, 0x8237}, //1390 #CJK UNIFIED IDEOGRAPH
+ {0x8CBE, 0x8A00}, //1391 #CJK UNIFIED IDEOGRAPH
+ {0x8CBF, 0x8AFA}, //1392 #CJK UNIFIED IDEOGRAPH
+ {0x8CC0, 0x9650}, //1393 #CJK UNIFIED IDEOGRAPH
+ {0x8CC1, 0x4E4E}, //1394 #CJK UNIFIED IDEOGRAPH
+ {0x8CC2, 0x500B}, //1395 #CJK UNIFIED IDEOGRAPH
+ {0x8CC3, 0x53E4}, //1396 #CJK UNIFIED IDEOGRAPH
+ {0x8CC4, 0x547C}, //1397 #CJK UNIFIED IDEOGRAPH
+ {0x8CC5, 0x56FA}, //1398 #CJK UNIFIED IDEOGRAPH
+ {0x8CC6, 0x59D1}, //1399 #CJK UNIFIED IDEOGRAPH
+ {0x8CC7, 0x5B64}, //1400 #CJK UNIFIED IDEOGRAPH
+ {0x8CC8, 0x5DF1}, //1401 #CJK UNIFIED IDEOGRAPH
+ {0x8CC9, 0x5EAB}, //1402 #CJK UNIFIED IDEOGRAPH
+ {0x8CCA, 0x5F27}, //1403 #CJK UNIFIED IDEOGRAPH
+ {0x8CCB, 0x6238}, //1404 #CJK UNIFIED IDEOGRAPH
+ {0x8CCC, 0x6545}, //1405 #CJK UNIFIED IDEOGRAPH
+ {0x8CCD, 0x67AF}, //1406 #CJK UNIFIED IDEOGRAPH
+ {0x8CCE, 0x6E56}, //1407 #CJK UNIFIED IDEOGRAPH
+ {0x8CCF, 0x72D0}, //1408 #CJK UNIFIED IDEOGRAPH
+ {0x8CD0, 0x7CCA}, //1409 #CJK UNIFIED IDEOGRAPH
+ {0x8CD1, 0x88B4}, //1410 #CJK UNIFIED IDEOGRAPH
+ {0x8CD2, 0x80A1}, //1411 #CJK UNIFIED IDEOGRAPH
+ {0x8CD3, 0x80E1}, //1412 #CJK UNIFIED IDEOGRAPH
+ {0x8CD4, 0x83F0}, //1413 #CJK UNIFIED IDEOGRAPH
+ {0x8CD5, 0x864E}, //1414 #CJK UNIFIED IDEOGRAPH
+ {0x8CD6, 0x8A87}, //1415 #CJK UNIFIED IDEOGRAPH
+ {0x8CD7, 0x8DE8}, //1416 #CJK UNIFIED IDEOGRAPH
+ {0x8CD8, 0x9237}, //1417 #CJK UNIFIED IDEOGRAPH
+ {0x8CD9, 0x96C7}, //1418 #CJK UNIFIED IDEOGRAPH
+ {0x8CDA, 0x9867}, //1419 #CJK UNIFIED IDEOGRAPH
+ {0x8CDB, 0x9F13}, //1420 #CJK UNIFIED IDEOGRAPH
+ {0x8CDC, 0x4E94}, //1421 #CJK UNIFIED IDEOGRAPH
+ {0x8CDD, 0x4E92}, //1422 #CJK UNIFIED IDEOGRAPH
+ {0x8CDE, 0x4F0D}, //1423 #CJK UNIFIED IDEOGRAPH
+ {0x8CDF, 0x5348}, //1424 #CJK UNIFIED IDEOGRAPH
+ {0x8CE0, 0x5449}, //1425 #CJK UNIFIED IDEOGRAPH
+ {0x8CE1, 0x543E}, //1426 #CJK UNIFIED IDEOGRAPH
+ {0x8CE2, 0x5A2F}, //1427 #CJK UNIFIED IDEOGRAPH
+ {0x8CE3, 0x5F8C}, //1428 #CJK UNIFIED IDEOGRAPH
+ {0x8CE4, 0x5FA1}, //1429 #CJK UNIFIED IDEOGRAPH
+ {0x8CE5, 0x609F}, //1430 #CJK UNIFIED IDEOGRAPH
+ {0x8CE6, 0x68A7}, //1431 #CJK UNIFIED IDEOGRAPH
+ {0x8CE7, 0x6A8E}, //1432 #CJK UNIFIED IDEOGRAPH
+ {0x8CE8, 0x745A}, //1433 #CJK UNIFIED IDEOGRAPH
+ {0x8CE9, 0x7881}, //1434 #CJK UNIFIED IDEOGRAPH
+ {0x8CEA, 0x8A9E}, //1435 #CJK UNIFIED IDEOGRAPH
+ {0x8CEB, 0x8AA4}, //1436 #CJK UNIFIED IDEOGRAPH
+ {0x8CEC, 0x8B77}, //1437 #CJK UNIFIED IDEOGRAPH
+ {0x8CED, 0x9190}, //1438 #CJK UNIFIED IDEOGRAPH
+ {0x8CEE, 0x4E5E}, //1439 #CJK UNIFIED IDEOGRAPH
+ {0x8CEF, 0x9BC9}, //1440 #CJK UNIFIED IDEOGRAPH
+ {0x8CF0, 0x4EA4}, //1441 #CJK UNIFIED IDEOGRAPH
+ {0x8CF1, 0x4F7C}, //1442 #CJK UNIFIED IDEOGRAPH
+ {0x8CF2, 0x4FAF}, //1443 #CJK UNIFIED IDEOGRAPH
+ {0x8CF3, 0x5019}, //1444 #CJK UNIFIED IDEOGRAPH
+ {0x8CF4, 0x5016}, //1445 #CJK UNIFIED IDEOGRAPH
+ {0x8CF5, 0x5149}, //1446 #CJK UNIFIED IDEOGRAPH
+ {0x8CF6, 0x516C}, //1447 #CJK UNIFIED IDEOGRAPH
+ {0x8CF7, 0x529F}, //1448 #CJK UNIFIED IDEOGRAPH
+ {0x8CF8, 0x52B9}, //1449 #CJK UNIFIED IDEOGRAPH
+ {0x8CF9, 0x52FE}, //1450 #CJK UNIFIED IDEOGRAPH
+ {0x8CFA, 0x539A}, //1451 #CJK UNIFIED IDEOGRAPH
+ {0x8CFB, 0x53E3}, //1452 #CJK UNIFIED IDEOGRAPH
+ {0x8CFC, 0x5411}, //1453 #CJK UNIFIED IDEOGRAPH
+ {0x8D40, 0x540E}, //1454 #CJK UNIFIED IDEOGRAPH
+ {0x8D41, 0x5589}, //1455 #CJK UNIFIED IDEOGRAPH
+ {0x8D42, 0x5751}, //1456 #CJK UNIFIED IDEOGRAPH
+ {0x8D43, 0x57A2}, //1457 #CJK UNIFIED IDEOGRAPH
+ {0x8D44, 0x597D}, //1458 #CJK UNIFIED IDEOGRAPH
+ {0x8D45, 0x5B54}, //1459 #CJK UNIFIED IDEOGRAPH
+ {0x8D46, 0x5B5D}, //1460 #CJK UNIFIED IDEOGRAPH
+ {0x8D47, 0x5B8F}, //1461 #CJK UNIFIED IDEOGRAPH
+ {0x8D48, 0x5DE5}, //1462 #CJK UNIFIED IDEOGRAPH
+ {0x8D49, 0x5DE7}, //1463 #CJK UNIFIED IDEOGRAPH
+ {0x8D4A, 0x5DF7}, //1464 #CJK UNIFIED IDEOGRAPH
+ {0x8D4B, 0x5E78}, //1465 #CJK UNIFIED IDEOGRAPH
+ {0x8D4C, 0x5E83}, //1466 #CJK UNIFIED IDEOGRAPH
+ {0x8D4D, 0x5E9A}, //1467 #CJK UNIFIED IDEOGRAPH
+ {0x8D4E, 0x5EB7}, //1468 #CJK UNIFIED IDEOGRAPH
+ {0x8D4F, 0x5F18}, //1469 #CJK UNIFIED IDEOGRAPH
+ {0x8D50, 0x6052}, //1470 #CJK UNIFIED IDEOGRAPH
+ {0x8D51, 0x614C}, //1471 #CJK UNIFIED IDEOGRAPH
+ {0x8D52, 0x6297}, //1472 #CJK UNIFIED IDEOGRAPH
+ {0x8D53, 0x62D8}, //1473 #CJK UNIFIED IDEOGRAPH
+ {0x8D54, 0x63A7}, //1474 #CJK UNIFIED IDEOGRAPH
+ {0x8D55, 0x653B}, //1475 #CJK UNIFIED IDEOGRAPH
+ {0x8D56, 0x6602}, //1476 #CJK UNIFIED IDEOGRAPH
+ {0x8D57, 0x6643}, //1477 #CJK UNIFIED IDEOGRAPH
+ {0x8D58, 0x66F4}, //1478 #CJK UNIFIED IDEOGRAPH
+ {0x8D59, 0x676D}, //1479 #CJK UNIFIED IDEOGRAPH
+ {0x8D5A, 0x6821}, //1480 #CJK UNIFIED IDEOGRAPH
+ {0x8D5B, 0x6897}, //1481 #CJK UNIFIED IDEOGRAPH
+ {0x8D5C, 0x69CB}, //1482 #CJK UNIFIED IDEOGRAPH
+ {0x8D5D, 0x6C5F}, //1483 #CJK UNIFIED IDEOGRAPH
+ {0x8D5E, 0x6D2A}, //1484 #CJK UNIFIED IDEOGRAPH
+ {0x8D5F, 0x6D69}, //1485 #CJK UNIFIED IDEOGRAPH
+ {0x8D60, 0x6E2F}, //1486 #CJK UNIFIED IDEOGRAPH
+ {0x8D61, 0x6E9D}, //1487 #CJK UNIFIED IDEOGRAPH
+ {0x8D62, 0x7532}, //1488 #CJK UNIFIED IDEOGRAPH
+ {0x8D63, 0x7687}, //1489 #CJK UNIFIED IDEOGRAPH
+ {0x8D64, 0x786C}, //1490 #CJK UNIFIED IDEOGRAPH
+ {0x8D65, 0x7A3F}, //1491 #CJK UNIFIED IDEOGRAPH
+ {0x8D66, 0x7CE0}, //1492 #CJK UNIFIED IDEOGRAPH
+ {0x8D67, 0x7D05}, //1493 #CJK UNIFIED IDEOGRAPH
+ {0x8D68, 0x7D18}, //1494 #CJK UNIFIED IDEOGRAPH
+ {0x8D69, 0x7D5E}, //1495 #CJK UNIFIED IDEOGRAPH
+ {0x8D6A, 0x7DB1}, //1496 #CJK UNIFIED IDEOGRAPH
+ {0x8D6B, 0x8015}, //1497 #CJK UNIFIED IDEOGRAPH
+ {0x8D6C, 0x8003}, //1498 #CJK UNIFIED IDEOGRAPH
+ {0x8D6D, 0x80AF}, //1499 #CJK UNIFIED IDEOGRAPH
+ {0x8D6E, 0x80B1}, //1500 #CJK UNIFIED IDEOGRAPH
+ {0x8D6F, 0x8154}, //1501 #CJK UNIFIED IDEOGRAPH
+ {0x8D70, 0x818F}, //1502 #CJK UNIFIED IDEOGRAPH
+ {0x8D71, 0x822A}, //1503 #CJK UNIFIED IDEOGRAPH
+ {0x8D72, 0x8352}, //1504 #CJK UNIFIED IDEOGRAPH
+ {0x8D73, 0x884C}, //1505 #CJK UNIFIED IDEOGRAPH
+ {0x8D74, 0x8861}, //1506 #CJK UNIFIED IDEOGRAPH
+ {0x8D75, 0x8B1B}, //1507 #CJK UNIFIED IDEOGRAPH
+ {0x8D76, 0x8CA2}, //1508 #CJK UNIFIED IDEOGRAPH
+ {0x8D77, 0x8CFC}, //1509 #CJK UNIFIED IDEOGRAPH
+ {0x8D78, 0x90CA}, //1510 #CJK UNIFIED IDEOGRAPH
+ {0x8D79, 0x9175}, //1511 #CJK UNIFIED IDEOGRAPH
+ {0x8D7A, 0x9271}, //1512 #CJK UNIFIED IDEOGRAPH
+ {0x8D7B, 0x783F}, //1513 #CJK UNIFIED IDEOGRAPH
+ {0x8D7C, 0x92FC}, //1514 #CJK UNIFIED IDEOGRAPH
+ {0x8D7D, 0x95A4}, //1515 #CJK UNIFIED IDEOGRAPH
+ {0x8D7E, 0x964D}, //1516 #CJK UNIFIED IDEOGRAPH
+ {0x8D80, 0x9805}, //1517 #CJK UNIFIED IDEOGRAPH
+ {0x8D81, 0x9999}, //1518 #CJK UNIFIED IDEOGRAPH
+ {0x8D82, 0x9AD8}, //1519 #CJK UNIFIED IDEOGRAPH
+ {0x8D83, 0x9D3B}, //1520 #CJK UNIFIED IDEOGRAPH
+ {0x8D84, 0x525B}, //1521 #CJK UNIFIED IDEOGRAPH
+ {0x8D85, 0x52AB}, //1522 #CJK UNIFIED IDEOGRAPH
+ {0x8D86, 0x53F7}, //1523 #CJK UNIFIED IDEOGRAPH
+ {0x8D87, 0x5408}, //1524 #CJK UNIFIED IDEOGRAPH
+ {0x8D88, 0x58D5}, //1525 #CJK UNIFIED IDEOGRAPH
+ {0x8D89, 0x62F7}, //1526 #CJK UNIFIED IDEOGRAPH
+ {0x8D8A, 0x6FE0}, //1527 #CJK UNIFIED IDEOGRAPH
+ {0x8D8B, 0x8C6A}, //1528 #CJK UNIFIED IDEOGRAPH
+ {0x8D8C, 0x8F5F}, //1529 #CJK UNIFIED IDEOGRAPH
+ {0x8D8D, 0x9EB9}, //1530 #CJK UNIFIED IDEOGRAPH
+ {0x8D8E, 0x514B}, //1531 #CJK UNIFIED IDEOGRAPH
+ {0x8D8F, 0x523B}, //1532 #CJK UNIFIED IDEOGRAPH
+ {0x8D90, 0x544A}, //1533 #CJK UNIFIED IDEOGRAPH
+ {0x8D91, 0x56FD}, //1534 #CJK UNIFIED IDEOGRAPH
+ {0x8D92, 0x7A40}, //1535 #CJK UNIFIED IDEOGRAPH
+ {0x8D93, 0x9177}, //1536 #CJK UNIFIED IDEOGRAPH
+ {0x8D94, 0x9D60}, //1537 #CJK UNIFIED IDEOGRAPH
+ {0x8D95, 0x9ED2}, //1538 #CJK UNIFIED IDEOGRAPH
+ {0x8D96, 0x7344}, //1539 #CJK UNIFIED IDEOGRAPH
+ {0x8D97, 0x6F09}, //1540 #CJK UNIFIED IDEOGRAPH
+ {0x8D98, 0x8170}, //1541 #CJK UNIFIED IDEOGRAPH
+ {0x8D99, 0x7511}, //1542 #CJK UNIFIED IDEOGRAPH
+ {0x8D9A, 0x5FFD}, //1543 #CJK UNIFIED IDEOGRAPH
+ {0x8D9B, 0x60DA}, //1544 #CJK UNIFIED IDEOGRAPH
+ {0x8D9C, 0x9AA8}, //1545 #CJK UNIFIED IDEOGRAPH
+ {0x8D9D, 0x72DB}, //1546 #CJK UNIFIED IDEOGRAPH
+ {0x8D9E, 0x8FBC}, //1547 #CJK UNIFIED IDEOGRAPH
+ {0x8D9F, 0x6B64}, //1548 #CJK UNIFIED IDEOGRAPH
+ {0x8DA0, 0x9803}, //1549 #CJK UNIFIED IDEOGRAPH
+ {0x8DA1, 0x4ECA}, //1550 #CJK UNIFIED IDEOGRAPH
+ {0x8DA2, 0x56F0}, //1551 #CJK UNIFIED IDEOGRAPH
+ {0x8DA3, 0x5764}, //1552 #CJK UNIFIED IDEOGRAPH
+ {0x8DA4, 0x58BE}, //1553 #CJK UNIFIED IDEOGRAPH
+ {0x8DA5, 0x5A5A}, //1554 #CJK UNIFIED IDEOGRAPH
+ {0x8DA6, 0x6068}, //1555 #CJK UNIFIED IDEOGRAPH
+ {0x8DA7, 0x61C7}, //1556 #CJK UNIFIED IDEOGRAPH
+ {0x8DA8, 0x660F}, //1557 #CJK UNIFIED IDEOGRAPH
+ {0x8DA9, 0x6606}, //1558 #CJK UNIFIED IDEOGRAPH
+ {0x8DAA, 0x6839}, //1559 #CJK UNIFIED IDEOGRAPH
+ {0x8DAB, 0x68B1}, //1560 #CJK UNIFIED IDEOGRAPH
+ {0x8DAC, 0x6DF7}, //1561 #CJK UNIFIED IDEOGRAPH
+ {0x8DAD, 0x75D5}, //1562 #CJK UNIFIED IDEOGRAPH
+ {0x8DAE, 0x7D3A}, //1563 #CJK UNIFIED IDEOGRAPH
+ {0x8DAF, 0x826E}, //1564 #CJK UNIFIED IDEOGRAPH
+ {0x8DB0, 0x9B42}, //1565 #CJK UNIFIED IDEOGRAPH
+ {0x8DB1, 0x4E9B}, //1566 #CJK UNIFIED IDEOGRAPH
+ {0x8DB2, 0x4F50}, //1567 #CJK UNIFIED IDEOGRAPH
+ {0x8DB3, 0x53C9}, //1568 #CJK UNIFIED IDEOGRAPH
+ {0x8DB4, 0x5506}, //1569 #CJK UNIFIED IDEOGRAPH
+ {0x8DB5, 0x5D6F}, //1570 #CJK UNIFIED IDEOGRAPH
+ {0x8DB6, 0x5DE6}, //1571 #CJK UNIFIED IDEOGRAPH
+ {0x8DB7, 0x5DEE}, //1572 #CJK UNIFIED IDEOGRAPH
+ {0x8DB8, 0x67FB}, //1573 #CJK UNIFIED IDEOGRAPH
+ {0x8DB9, 0x6C99}, //1574 #CJK UNIFIED IDEOGRAPH
+ {0x8DBA, 0x7473}, //1575 #CJK UNIFIED IDEOGRAPH
+ {0x8DBB, 0x7802}, //1576 #CJK UNIFIED IDEOGRAPH
+ {0x8DBC, 0x8A50}, //1577 #CJK UNIFIED IDEOGRAPH
+ {0x8DBD, 0x9396}, //1578 #CJK UNIFIED IDEOGRAPH
+ {0x8DBE, 0x88DF}, //1579 #CJK UNIFIED IDEOGRAPH
+ {0x8DBF, 0x5750}, //1580 #CJK UNIFIED IDEOGRAPH
+ {0x8DC0, 0x5EA7}, //1581 #CJK UNIFIED IDEOGRAPH
+ {0x8DC1, 0x632B}, //1582 #CJK UNIFIED IDEOGRAPH
+ {0x8DC2, 0x50B5}, //1583 #CJK UNIFIED IDEOGRAPH
+ {0x8DC3, 0x50AC}, //1584 #CJK UNIFIED IDEOGRAPH
+ {0x8DC4, 0x518D}, //1585 #CJK UNIFIED IDEOGRAPH
+ {0x8DC5, 0x6700}, //1586 #CJK UNIFIED IDEOGRAPH
+ {0x8DC6, 0x54C9}, //1587 #CJK UNIFIED IDEOGRAPH
+ {0x8DC7, 0x585E}, //1588 #CJK UNIFIED IDEOGRAPH
+ {0x8DC8, 0x59BB}, //1589 #CJK UNIFIED IDEOGRAPH
+ {0x8DC9, 0x5BB0}, //1590 #CJK UNIFIED IDEOGRAPH
+ {0x8DCA, 0x5F69}, //1591 #CJK UNIFIED IDEOGRAPH
+ {0x8DCB, 0x624D}, //1592 #CJK UNIFIED IDEOGRAPH
+ {0x8DCC, 0x63A1}, //1593 #CJK UNIFIED IDEOGRAPH
+ {0x8DCD, 0x683D}, //1594 #CJK UNIFIED IDEOGRAPH
+ {0x8DCE, 0x6B73}, //1595 #CJK UNIFIED IDEOGRAPH
+ {0x8DCF, 0x6E08}, //1596 #CJK UNIFIED IDEOGRAPH
+ {0x8DD0, 0x707D}, //1597 #CJK UNIFIED IDEOGRAPH
+ {0x8DD1, 0x91C7}, //1598 #CJK UNIFIED IDEOGRAPH
+ {0x8DD2, 0x7280}, //1599 #CJK UNIFIED IDEOGRAPH
+ {0x8DD3, 0x7815}, //1600 #CJK UNIFIED IDEOGRAPH
+ {0x8DD4, 0x7826}, //1601 #CJK UNIFIED IDEOGRAPH
+ {0x8DD5, 0x796D}, //1602 #CJK UNIFIED IDEOGRAPH
+ {0x8DD6, 0x658E}, //1603 #CJK UNIFIED IDEOGRAPH
+ {0x8DD7, 0x7D30}, //1604 #CJK UNIFIED IDEOGRAPH
+ {0x8DD8, 0x83DC}, //1605 #CJK UNIFIED IDEOGRAPH
+ {0x8DD9, 0x88C1}, //1606 #CJK UNIFIED IDEOGRAPH
+ {0x8DDA, 0x8F09}, //1607 #CJK UNIFIED IDEOGRAPH
+ {0x8DDB, 0x969B}, //1608 #CJK UNIFIED IDEOGRAPH
+ {0x8DDC, 0x5264}, //1609 #CJK UNIFIED IDEOGRAPH
+ {0x8DDD, 0x5728}, //1610 #CJK UNIFIED IDEOGRAPH
+ {0x8DDE, 0x6750}, //1611 #CJK UNIFIED IDEOGRAPH
+ {0x8DDF, 0x7F6A}, //1612 #CJK UNIFIED IDEOGRAPH
+ {0x8DE0, 0x8CA1}, //1613 #CJK UNIFIED IDEOGRAPH
+ {0x8DE1, 0x51B4}, //1614 #CJK UNIFIED IDEOGRAPH
+ {0x8DE2, 0x5742}, //1615 #CJK UNIFIED IDEOGRAPH
+ {0x8DE3, 0x962A}, //1616 #CJK UNIFIED IDEOGRAPH
+ {0x8DE4, 0x583A}, //1617 #CJK UNIFIED IDEOGRAPH
+ {0x8DE5, 0x698A}, //1618 #CJK UNIFIED IDEOGRAPH
+ {0x8DE6, 0x80B4}, //1619 #CJK UNIFIED IDEOGRAPH
+ {0x8DE7, 0x54B2}, //1620 #CJK UNIFIED IDEOGRAPH
+ {0x8DE8, 0x5D0E}, //1621 #CJK UNIFIED IDEOGRAPH
+ {0x8DE9, 0x57FC}, //1622 #CJK UNIFIED IDEOGRAPH
+ {0x8DEA, 0x7895}, //1623 #CJK UNIFIED IDEOGRAPH
+ {0x8DEB, 0x9DFA}, //1624 #CJK UNIFIED IDEOGRAPH
+ {0x8DEC, 0x4F5C}, //1625 #CJK UNIFIED IDEOGRAPH
+ {0x8DED, 0x524A}, //1626 #CJK UNIFIED IDEOGRAPH
+ {0x8DEE, 0x548B}, //1627 #CJK UNIFIED IDEOGRAPH
+ {0x8DEF, 0x643E}, //1628 #CJK UNIFIED IDEOGRAPH
+ {0x8DF0, 0x6628}, //1629 #CJK UNIFIED IDEOGRAPH
+ {0x8DF1, 0x6714}, //1630 #CJK UNIFIED IDEOGRAPH
+ {0x8DF2, 0x67F5}, //1631 #CJK UNIFIED IDEOGRAPH
+ {0x8DF3, 0x7A84}, //1632 #CJK UNIFIED IDEOGRAPH
+ {0x8DF4, 0x7B56}, //1633 #CJK UNIFIED IDEOGRAPH
+ {0x8DF5, 0x7D22}, //1634 #CJK UNIFIED IDEOGRAPH
+ {0x8DF6, 0x932F}, //1635 #CJK UNIFIED IDEOGRAPH
+ {0x8DF7, 0x685C}, //1636 #CJK UNIFIED IDEOGRAPH
+ {0x8DF8, 0x9BAD}, //1637 #CJK UNIFIED IDEOGRAPH
+ {0x8DF9, 0x7B39}, //1638 #CJK UNIFIED IDEOGRAPH
+ {0x8DFA, 0x5319}, //1639 #CJK UNIFIED IDEOGRAPH
+ {0x8DFB, 0x518A}, //1640 #CJK UNIFIED IDEOGRAPH
+ {0x8DFC, 0x5237}, //1641 #CJK UNIFIED IDEOGRAPH
+ {0x8E40, 0x5BDF}, //1642 #CJK UNIFIED IDEOGRAPH
+ {0x8E41, 0x62F6}, //1643 #CJK UNIFIED IDEOGRAPH
+ {0x8E42, 0x64AE}, //1644 #CJK UNIFIED IDEOGRAPH
+ {0x8E43, 0x64E6}, //1645 #CJK UNIFIED IDEOGRAPH
+ {0x8E44, 0x672D}, //1646 #CJK UNIFIED IDEOGRAPH
+ {0x8E45, 0x6BBA}, //1647 #CJK UNIFIED IDEOGRAPH
+ {0x8E46, 0x85A9}, //1648 #CJK UNIFIED IDEOGRAPH
+ {0x8E47, 0x96D1}, //1649 #CJK UNIFIED IDEOGRAPH
+ {0x8E48, 0x7690}, //1650 #CJK UNIFIED IDEOGRAPH
+ {0x8E49, 0x9BD6}, //1651 #CJK UNIFIED IDEOGRAPH
+ {0x8E4A, 0x634C}, //1652 #CJK UNIFIED IDEOGRAPH
+ {0x8E4B, 0x9306}, //1653 #CJK UNIFIED IDEOGRAPH
+ {0x8E4C, 0x9BAB}, //1654 #CJK UNIFIED IDEOGRAPH
+ {0x8E4D, 0x76BF}, //1655 #CJK UNIFIED IDEOGRAPH
+ {0x8E4E, 0x6652}, //1656 #CJK UNIFIED IDEOGRAPH
+ {0x8E4F, 0x4E09}, //1657 #CJK UNIFIED IDEOGRAPH
+ {0x8E50, 0x5098}, //1658 #CJK UNIFIED IDEOGRAPH
+ {0x8E51, 0x53C2}, //1659 #CJK UNIFIED IDEOGRAPH
+ {0x8E52, 0x5C71}, //1660 #CJK UNIFIED IDEOGRAPH
+ {0x8E53, 0x60E8}, //1661 #CJK UNIFIED IDEOGRAPH
+ {0x8E54, 0x6492}, //1662 #CJK UNIFIED IDEOGRAPH
+ {0x8E55, 0x6563}, //1663 #CJK UNIFIED IDEOGRAPH
+ {0x8E56, 0x685F}, //1664 #CJK UNIFIED IDEOGRAPH
+ {0x8E57, 0x71E6}, //1665 #CJK UNIFIED IDEOGRAPH
+ {0x8E58, 0x73CA}, //1666 #CJK UNIFIED IDEOGRAPH
+ {0x8E59, 0x7523}, //1667 #CJK UNIFIED IDEOGRAPH
+ {0x8E5A, 0x7B97}, //1668 #CJK UNIFIED IDEOGRAPH
+ {0x8E5B, 0x7E82}, //1669 #CJK UNIFIED IDEOGRAPH
+ {0x8E5C, 0x8695}, //1670 #CJK UNIFIED IDEOGRAPH
+ {0x8E5D, 0x8B83}, //1671 #CJK UNIFIED IDEOGRAPH
+ {0x8E5E, 0x8CDB}, //1672 #CJK UNIFIED IDEOGRAPH
+ {0x8E5F, 0x9178}, //1673 #CJK UNIFIED IDEOGRAPH
+ {0x8E60, 0x9910}, //1674 #CJK UNIFIED IDEOGRAPH
+ {0x8E61, 0x65AC}, //1675 #CJK UNIFIED IDEOGRAPH
+ {0x8E62, 0x66AB}, //1676 #CJK UNIFIED IDEOGRAPH
+ {0x8E63, 0x6B8B}, //1677 #CJK UNIFIED IDEOGRAPH
+ {0x8E64, 0x4ED5}, //1678 #CJK UNIFIED IDEOGRAPH
+ {0x8E65, 0x4ED4}, //1679 #CJK UNIFIED IDEOGRAPH
+ {0x8E66, 0x4F3A}, //1680 #CJK UNIFIED IDEOGRAPH
+ {0x8E67, 0x4F7F}, //1681 #CJK UNIFIED IDEOGRAPH
+ {0x8E68, 0x523A}, //1682 #CJK UNIFIED IDEOGRAPH
+ {0x8E69, 0x53F8}, //1683 #CJK UNIFIED IDEOGRAPH
+ {0x8E6A, 0x53F2}, //1684 #CJK UNIFIED IDEOGRAPH
+ {0x8E6B, 0x55E3}, //1685 #CJK UNIFIED IDEOGRAPH
+ {0x8E6C, 0x56DB}, //1686 #CJK UNIFIED IDEOGRAPH
+ {0x8E6D, 0x58EB}, //1687 #CJK UNIFIED IDEOGRAPH
+ {0x8E6E, 0x59CB}, //1688 #CJK UNIFIED IDEOGRAPH
+ {0x8E6F, 0x59C9}, //1689 #CJK UNIFIED IDEOGRAPH
+ {0x8E70, 0x59FF}, //1690 #CJK UNIFIED IDEOGRAPH
+ {0x8E71, 0x5B50}, //1691 #CJK UNIFIED IDEOGRAPH
+ {0x8E72, 0x5C4D}, //1692 #CJK UNIFIED IDEOGRAPH
+ {0x8E73, 0x5E02}, //1693 #CJK UNIFIED IDEOGRAPH
+ {0x8E74, 0x5E2B}, //1694 #CJK UNIFIED IDEOGRAPH
+ {0x8E75, 0x5FD7}, //1695 #CJK UNIFIED IDEOGRAPH
+ {0x8E76, 0x601D}, //1696 #CJK UNIFIED IDEOGRAPH
+ {0x8E77, 0x6307}, //1697 #CJK UNIFIED IDEOGRAPH
+ {0x8E78, 0x652F}, //1698 #CJK UNIFIED IDEOGRAPH
+ {0x8E79, 0x5B5C}, //1699 #CJK UNIFIED IDEOGRAPH
+ {0x8E7A, 0x65AF}, //1700 #CJK UNIFIED IDEOGRAPH
+ {0x8E7B, 0x65BD}, //1701 #CJK UNIFIED IDEOGRAPH
+ {0x8E7C, 0x65E8}, //1702 #CJK UNIFIED IDEOGRAPH
+ {0x8E7D, 0x679D}, //1703 #CJK UNIFIED IDEOGRAPH
+ {0x8E7E, 0x6B62}, //1704 #CJK UNIFIED IDEOGRAPH
+ {0x8E80, 0x6B7B}, //1705 #CJK UNIFIED IDEOGRAPH
+ {0x8E81, 0x6C0F}, //1706 #CJK UNIFIED IDEOGRAPH
+ {0x8E82, 0x7345}, //1707 #CJK UNIFIED IDEOGRAPH
+ {0x8E83, 0x7949}, //1708 #CJK UNIFIED IDEOGRAPH
+ {0x8E84, 0x79C1}, //1709 #CJK UNIFIED IDEOGRAPH
+ {0x8E85, 0x7CF8}, //1710 #CJK UNIFIED IDEOGRAPH
+ {0x8E86, 0x7D19}, //1711 #CJK UNIFIED IDEOGRAPH
+ {0x8E87, 0x7D2B}, //1712 #CJK UNIFIED IDEOGRAPH
+ {0x8E88, 0x80A2}, //1713 #CJK UNIFIED IDEOGRAPH
+ {0x8E89, 0x8102}, //1714 #CJK UNIFIED IDEOGRAPH
+ {0x8E8A, 0x81F3}, //1715 #CJK UNIFIED IDEOGRAPH
+ {0x8E8B, 0x8996}, //1716 #CJK UNIFIED IDEOGRAPH
+ {0x8E8C, 0x8A5E}, //1717 #CJK UNIFIED IDEOGRAPH
+ {0x8E8D, 0x8A69}, //1718 #CJK UNIFIED IDEOGRAPH
+ {0x8E8E, 0x8A66}, //1719 #CJK UNIFIED IDEOGRAPH
+ {0x8E8F, 0x8A8C}, //1720 #CJK UNIFIED IDEOGRAPH
+ {0x8E90, 0x8AEE}, //1721 #CJK UNIFIED IDEOGRAPH
+ {0x8E91, 0x8CC7}, //1722 #CJK UNIFIED IDEOGRAPH
+ {0x8E92, 0x8CDC}, //1723 #CJK UNIFIED IDEOGRAPH
+ {0x8E93, 0x96CC}, //1724 #CJK UNIFIED IDEOGRAPH
+ {0x8E94, 0x98FC}, //1725 #CJK UNIFIED IDEOGRAPH
+ {0x8E95, 0x6B6F}, //1726 #CJK UNIFIED IDEOGRAPH
+ {0x8E96, 0x4E8B}, //1727 #CJK UNIFIED IDEOGRAPH
+ {0x8E97, 0x4F3C}, //1728 #CJK UNIFIED IDEOGRAPH
+ {0x8E98, 0x4F8D}, //1729 #CJK UNIFIED IDEOGRAPH
+ {0x8E99, 0x5150}, //1730 #CJK UNIFIED IDEOGRAPH
+ {0x8E9A, 0x5B57}, //1731 #CJK UNIFIED IDEOGRAPH
+ {0x8E9B, 0x5BFA}, //1732 #CJK UNIFIED IDEOGRAPH
+ {0x8E9C, 0x6148}, //1733 #CJK UNIFIED IDEOGRAPH
+ {0x8E9D, 0x6301}, //1734 #CJK UNIFIED IDEOGRAPH
+ {0x8E9E, 0x6642}, //1735 #CJK UNIFIED IDEOGRAPH
+ {0x8E9F, 0x6B21}, //1736 #CJK UNIFIED IDEOGRAPH
+ {0x8EA0, 0x6ECB}, //1737 #CJK UNIFIED IDEOGRAPH
+ {0x8EA1, 0x6CBB}, //1738 #CJK UNIFIED IDEOGRAPH
+ {0x8EA2, 0x723E}, //1739 #CJK UNIFIED IDEOGRAPH
+ {0x8EA3, 0x74BD}, //1740 #CJK UNIFIED IDEOGRAPH
+ {0x8EA4, 0x75D4}, //1741 #CJK UNIFIED IDEOGRAPH
+ {0x8EA5, 0x78C1}, //1742 #CJK UNIFIED IDEOGRAPH
+ {0x8EA6, 0x793A}, //1743 #CJK UNIFIED IDEOGRAPH
+ {0x8EA7, 0x800C}, //1744 #CJK UNIFIED IDEOGRAPH
+ {0x8EA8, 0x8033}, //1745 #CJK UNIFIED IDEOGRAPH
+ {0x8EA9, 0x81EA}, //1746 #CJK UNIFIED IDEOGRAPH
+ {0x8EAA, 0x8494}, //1747 #CJK UNIFIED IDEOGRAPH
+ {0x8EAB, 0x8F9E}, //1748 #CJK UNIFIED IDEOGRAPH
+ {0x8EAC, 0x6C50}, //1749 #CJK UNIFIED IDEOGRAPH
+ {0x8EAD, 0x9E7F}, //1750 #CJK UNIFIED IDEOGRAPH
+ {0x8EAE, 0x5F0F}, //1751 #CJK UNIFIED IDEOGRAPH
+ {0x8EAF, 0x8B58}, //1752 #CJK UNIFIED IDEOGRAPH
+ {0x8EB0, 0x9D2B}, //1753 #CJK UNIFIED IDEOGRAPH
+ {0x8EB1, 0x7AFA}, //1754 #CJK UNIFIED IDEOGRAPH
+ {0x8EB2, 0x8EF8}, //1755 #CJK UNIFIED IDEOGRAPH
+ {0x8EB3, 0x5B8D}, //1756 #CJK UNIFIED IDEOGRAPH
+ {0x8EB4, 0x96EB}, //1757 #CJK UNIFIED IDEOGRAPH
+ {0x8EB5, 0x4E03}, //1758 #CJK UNIFIED IDEOGRAPH
+ {0x8EB6, 0x53F1}, //1759 #CJK UNIFIED IDEOGRAPH
+ {0x8EB7, 0x57F7}, //1760 #CJK UNIFIED IDEOGRAPH
+ {0x8EB8, 0x5931}, //1761 #CJK UNIFIED IDEOGRAPH
+ {0x8EB9, 0x5AC9}, //1762 #CJK UNIFIED IDEOGRAPH
+ {0x8EBA, 0x5BA4}, //1763 #CJK UNIFIED IDEOGRAPH
+ {0x8EBB, 0x6089}, //1764 #CJK UNIFIED IDEOGRAPH
+ {0x8EBC, 0x6E7F}, //1765 #CJK UNIFIED IDEOGRAPH
+ {0x8EBD, 0x6F06}, //1766 #CJK UNIFIED IDEOGRAPH
+ {0x8EBE, 0x75BE}, //1767 #CJK UNIFIED IDEOGRAPH
+ {0x8EBF, 0x8CEA}, //1768 #CJK UNIFIED IDEOGRAPH
+ {0x8EC0, 0x5B9F}, //1769 #CJK UNIFIED IDEOGRAPH
+ {0x8EC1, 0x8500}, //1770 #CJK UNIFIED IDEOGRAPH
+ {0x8EC2, 0x7BE0}, //1771 #CJK UNIFIED IDEOGRAPH
+ {0x8EC3, 0x5072}, //1772 #CJK UNIFIED IDEOGRAPH
+ {0x8EC4, 0x67F4}, //1773 #CJK UNIFIED IDEOGRAPH
+ {0x8EC5, 0x829D}, //1774 #CJK UNIFIED IDEOGRAPH
+ {0x8EC6, 0x5C61}, //1775 #CJK UNIFIED IDEOGRAPH
+ {0x8EC7, 0x854A}, //1776 #CJK UNIFIED IDEOGRAPH
+ {0x8EC8, 0x7E1E}, //1777 #CJK UNIFIED IDEOGRAPH
+ {0x8EC9, 0x820E}, //1778 #CJK UNIFIED IDEOGRAPH
+ {0x8ECA, 0x5199}, //1779 #CJK UNIFIED IDEOGRAPH
+ {0x8ECB, 0x5C04}, //1780 #CJK UNIFIED IDEOGRAPH
+ {0x8ECC, 0x6368}, //1781 #CJK UNIFIED IDEOGRAPH
+ {0x8ECD, 0x8D66}, //1782 #CJK UNIFIED IDEOGRAPH
+ {0x8ECE, 0x659C}, //1783 #CJK UNIFIED IDEOGRAPH
+ {0x8ECF, 0x716E}, //1784 #CJK UNIFIED IDEOGRAPH
+ {0x8ED0, 0x793E}, //1785 #CJK UNIFIED IDEOGRAPH
+ {0x8ED1, 0x7D17}, //1786 #CJK UNIFIED IDEOGRAPH
+ {0x8ED2, 0x8005}, //1787 #CJK UNIFIED IDEOGRAPH
+ {0x8ED3, 0x8B1D}, //1788 #CJK UNIFIED IDEOGRAPH
+ {0x8ED4, 0x8ECA}, //1789 #CJK UNIFIED IDEOGRAPH
+ {0x8ED5, 0x906E}, //1790 #CJK UNIFIED IDEOGRAPH
+ {0x8ED6, 0x86C7}, //1791 #CJK UNIFIED IDEOGRAPH
+ {0x8ED7, 0x90AA}, //1792 #CJK UNIFIED IDEOGRAPH
+ {0x8ED8, 0x501F}, //1793 #CJK UNIFIED IDEOGRAPH
+ {0x8ED9, 0x52FA}, //1794 #CJK UNIFIED IDEOGRAPH
+ {0x8EDA, 0x5C3A}, //1795 #CJK UNIFIED IDEOGRAPH
+ {0x8EDB, 0x6753}, //1796 #CJK UNIFIED IDEOGRAPH
+ {0x8EDC, 0x707C}, //1797 #CJK UNIFIED IDEOGRAPH
+ {0x8EDD, 0x7235}, //1798 #CJK UNIFIED IDEOGRAPH
+ {0x8EDE, 0x914C}, //1799 #CJK UNIFIED IDEOGRAPH
+ {0x8EDF, 0x91C8}, //1800 #CJK UNIFIED IDEOGRAPH
+ {0x8EE0, 0x932B}, //1801 #CJK UNIFIED IDEOGRAPH
+ {0x8EE1, 0x82E5}, //1802 #CJK UNIFIED IDEOGRAPH
+ {0x8EE2, 0x5BC2}, //1803 #CJK UNIFIED IDEOGRAPH
+ {0x8EE3, 0x5F31}, //1804 #CJK UNIFIED IDEOGRAPH
+ {0x8EE4, 0x60F9}, //1805 #CJK UNIFIED IDEOGRAPH
+ {0x8EE5, 0x4E3B}, //1806 #CJK UNIFIED IDEOGRAPH
+ {0x8EE6, 0x53D6}, //1807 #CJK UNIFIED IDEOGRAPH
+ {0x8EE7, 0x5B88}, //1808 #CJK UNIFIED IDEOGRAPH
+ {0x8EE8, 0x624B}, //1809 #CJK UNIFIED IDEOGRAPH
+ {0x8EE9, 0x6731}, //1810 #CJK UNIFIED IDEOGRAPH
+ {0x8EEA, 0x6B8A}, //1811 #CJK UNIFIED IDEOGRAPH
+ {0x8EEB, 0x72E9}, //1812 #CJK UNIFIED IDEOGRAPH
+ {0x8EEC, 0x73E0}, //1813 #CJK UNIFIED IDEOGRAPH
+ {0x8EED, 0x7A2E}, //1814 #CJK UNIFIED IDEOGRAPH
+ {0x8EEE, 0x816B}, //1815 #CJK UNIFIED IDEOGRAPH
+ {0x8EEF, 0x8DA3}, //1816 #CJK UNIFIED IDEOGRAPH
+ {0x8EF0, 0x9152}, //1817 #CJK UNIFIED IDEOGRAPH
+ {0x8EF1, 0x9996}, //1818 #CJK UNIFIED IDEOGRAPH
+ {0x8EF2, 0x5112}, //1819 #CJK UNIFIED IDEOGRAPH
+ {0x8EF3, 0x53D7}, //1820 #CJK UNIFIED IDEOGRAPH
+ {0x8EF4, 0x546A}, //1821 #CJK UNIFIED IDEOGRAPH
+ {0x8EF5, 0x5BFF}, //1822 #CJK UNIFIED IDEOGRAPH
+ {0x8EF6, 0x6388}, //1823 #CJK UNIFIED IDEOGRAPH
+ {0x8EF7, 0x6A39}, //1824 #CJK UNIFIED IDEOGRAPH
+ {0x8EF8, 0x7DAC}, //1825 #CJK UNIFIED IDEOGRAPH
+ {0x8EF9, 0x9700}, //1826 #CJK UNIFIED IDEOGRAPH
+ {0x8EFA, 0x56DA}, //1827 #CJK UNIFIED IDEOGRAPH
+ {0x8EFB, 0x53CE}, //1828 #CJK UNIFIED IDEOGRAPH
+ {0x8EFC, 0x5468}, //1829 #CJK UNIFIED IDEOGRAPH
+ {0x8F40, 0x5B97}, //1830 #CJK UNIFIED IDEOGRAPH
+ {0x8F41, 0x5C31}, //1831 #CJK UNIFIED IDEOGRAPH
+ {0x8F42, 0x5DDE}, //1832 #CJK UNIFIED IDEOGRAPH
+ {0x8F43, 0x4FEE}, //1833 #CJK UNIFIED IDEOGRAPH
+ {0x8F44, 0x6101}, //1834 #CJK UNIFIED IDEOGRAPH
+ {0x8F45, 0x62FE}, //1835 #CJK UNIFIED IDEOGRAPH
+ {0x8F46, 0x6D32}, //1836 #CJK UNIFIED IDEOGRAPH
+ {0x8F47, 0x79C0}, //1837 #CJK UNIFIED IDEOGRAPH
+ {0x8F48, 0x79CB}, //1838 #CJK UNIFIED IDEOGRAPH
+ {0x8F49, 0x7D42}, //1839 #CJK UNIFIED IDEOGRAPH
+ {0x8F4A, 0x7E4D}, //1840 #CJK UNIFIED IDEOGRAPH
+ {0x8F4B, 0x7FD2}, //1841 #CJK UNIFIED IDEOGRAPH
+ {0x8F4C, 0x81ED}, //1842 #CJK UNIFIED IDEOGRAPH
+ {0x8F4D, 0x821F}, //1843 #CJK UNIFIED IDEOGRAPH
+ {0x8F4E, 0x8490}, //1844 #CJK UNIFIED IDEOGRAPH
+ {0x8F4F, 0x8846}, //1845 #CJK UNIFIED IDEOGRAPH
+ {0x8F50, 0x8972}, //1846 #CJK UNIFIED IDEOGRAPH
+ {0x8F51, 0x8B90}, //1847 #CJK UNIFIED IDEOGRAPH
+ {0x8F52, 0x8E74}, //1848 #CJK UNIFIED IDEOGRAPH
+ {0x8F53, 0x8F2F}, //1849 #CJK UNIFIED IDEOGRAPH
+ {0x8F54, 0x9031}, //1850 #CJK UNIFIED IDEOGRAPH
+ {0x8F55, 0x914B}, //1851 #CJK UNIFIED IDEOGRAPH
+ {0x8F56, 0x916C}, //1852 #CJK UNIFIED IDEOGRAPH
+ {0x8F57, 0x96C6}, //1853 #CJK UNIFIED IDEOGRAPH
+ {0x8F58, 0x919C}, //1854 #CJK UNIFIED IDEOGRAPH
+ {0x8F59, 0x4EC0}, //1855 #CJK UNIFIED IDEOGRAPH
+ {0x8F5A, 0x4F4F}, //1856 #CJK UNIFIED IDEOGRAPH
+ {0x8F5B, 0x5145}, //1857 #CJK UNIFIED IDEOGRAPH
+ {0x8F5C, 0x5341}, //1858 #CJK UNIFIED IDEOGRAPH
+ {0x8F5D, 0x5F93}, //1859 #CJK UNIFIED IDEOGRAPH
+ {0x8F5E, 0x620E}, //1860 #CJK UNIFIED IDEOGRAPH
+ {0x8F5F, 0x67D4}, //1861 #CJK UNIFIED IDEOGRAPH
+ {0x8F60, 0x6C41}, //1862 #CJK UNIFIED IDEOGRAPH
+ {0x8F61, 0x6E0B}, //1863 #CJK UNIFIED IDEOGRAPH
+ {0x8F62, 0x7363}, //1864 #CJK UNIFIED IDEOGRAPH
+ {0x8F63, 0x7E26}, //1865 #CJK UNIFIED IDEOGRAPH
+ {0x8F64, 0x91CD}, //1866 #CJK UNIFIED IDEOGRAPH
+ {0x8F65, 0x9283}, //1867 #CJK UNIFIED IDEOGRAPH
+ {0x8F66, 0x53D4}, //1868 #CJK UNIFIED IDEOGRAPH
+ {0x8F67, 0x5919}, //1869 #CJK UNIFIED IDEOGRAPH
+ {0x8F68, 0x5BBF}, //1870 #CJK UNIFIED IDEOGRAPH
+ {0x8F69, 0x6DD1}, //1871 #CJK UNIFIED IDEOGRAPH
+ {0x8F6A, 0x795D}, //1872 #CJK UNIFIED IDEOGRAPH
+ {0x8F6B, 0x7E2E}, //1873 #CJK UNIFIED IDEOGRAPH
+ {0x8F6C, 0x7C9B}, //1874 #CJK UNIFIED IDEOGRAPH
+ {0x8F6D, 0x587E}, //1875 #CJK UNIFIED IDEOGRAPH
+ {0x8F6E, 0x719F}, //1876 #CJK UNIFIED IDEOGRAPH
+ {0x8F6F, 0x51FA}, //1877 #CJK UNIFIED IDEOGRAPH
+ {0x8F70, 0x8853}, //1878 #CJK UNIFIED IDEOGRAPH
+ {0x8F71, 0x8FF0}, //1879 #CJK UNIFIED IDEOGRAPH
+ {0x8F72, 0x4FCA}, //1880 #CJK UNIFIED IDEOGRAPH
+ {0x8F73, 0x5CFB}, //1881 #CJK UNIFIED IDEOGRAPH
+ {0x8F74, 0x6625}, //1882 #CJK UNIFIED IDEOGRAPH
+ {0x8F75, 0x77AC}, //1883 #CJK UNIFIED IDEOGRAPH
+ {0x8F76, 0x7AE3}, //1884 #CJK UNIFIED IDEOGRAPH
+ {0x8F77, 0x821C}, //1885 #CJK UNIFIED IDEOGRAPH
+ {0x8F78, 0x99FF}, //1886 #CJK UNIFIED IDEOGRAPH
+ {0x8F79, 0x51C6}, //1887 #CJK UNIFIED IDEOGRAPH
+ {0x8F7A, 0x5FAA}, //1888 #CJK UNIFIED IDEOGRAPH
+ {0x8F7B, 0x65EC}, //1889 #CJK UNIFIED IDEOGRAPH
+ {0x8F7C, 0x696F}, //1890 #CJK UNIFIED IDEOGRAPH
+ {0x8F7D, 0x6B89}, //1891 #CJK UNIFIED IDEOGRAPH
+ {0x8F7E, 0x6DF3}, //1892 #CJK UNIFIED IDEOGRAPH
+ {0x8F80, 0x6E96}, //1893 #CJK UNIFIED IDEOGRAPH
+ {0x8F81, 0x6F64}, //1894 #CJK UNIFIED IDEOGRAPH
+ {0x8F82, 0x76FE}, //1895 #CJK UNIFIED IDEOGRAPH
+ {0x8F83, 0x7D14}, //1896 #CJK UNIFIED IDEOGRAPH
+ {0x8F84, 0x5DE1}, //1897 #CJK UNIFIED IDEOGRAPH
+ {0x8F85, 0x9075}, //1898 #CJK UNIFIED IDEOGRAPH
+ {0x8F86, 0x9187}, //1899 #CJK UNIFIED IDEOGRAPH
+ {0x8F87, 0x9806}, //1900 #CJK UNIFIED IDEOGRAPH
+ {0x8F88, 0x51E6}, //1901 #CJK UNIFIED IDEOGRAPH
+ {0x8F89, 0x521D}, //1902 #CJK UNIFIED IDEOGRAPH
+ {0x8F8A, 0x6240}, //1903 #CJK UNIFIED IDEOGRAPH
+ {0x8F8B, 0x6691}, //1904 #CJK UNIFIED IDEOGRAPH
+ {0x8F8C, 0x66D9}, //1905 #CJK UNIFIED IDEOGRAPH
+ {0x8F8D, 0x6E1A}, //1906 #CJK UNIFIED IDEOGRAPH
+ {0x8F8E, 0x5EB6}, //1907 #CJK UNIFIED IDEOGRAPH
+ {0x8F8F, 0x7DD2}, //1908 #CJK UNIFIED IDEOGRAPH
+ {0x8F90, 0x7F72}, //1909 #CJK UNIFIED IDEOGRAPH
+ {0x8F91, 0x66F8}, //1910 #CJK UNIFIED IDEOGRAPH
+ {0x8F92, 0x85AF}, //1911 #CJK UNIFIED IDEOGRAPH
+ {0x8F93, 0x85F7}, //1912 #CJK UNIFIED IDEOGRAPH
+ {0x8F94, 0x8AF8}, //1913 #CJK UNIFIED IDEOGRAPH
+ {0x8F95, 0x52A9}, //1914 #CJK UNIFIED IDEOGRAPH
+ {0x8F96, 0x53D9}, //1915 #CJK UNIFIED IDEOGRAPH
+ {0x8F97, 0x5973}, //1916 #CJK UNIFIED IDEOGRAPH
+ {0x8F98, 0x5E8F}, //1917 #CJK UNIFIED IDEOGRAPH
+ {0x8F99, 0x5F90}, //1918 #CJK UNIFIED IDEOGRAPH
+ {0x8F9A, 0x6055}, //1919 #CJK UNIFIED IDEOGRAPH
+ {0x8F9B, 0x92E4}, //1920 #CJK UNIFIED IDEOGRAPH
+ {0x8F9C, 0x9664}, //1921 #CJK UNIFIED IDEOGRAPH
+ {0x8F9D, 0x50B7}, //1922 #CJK UNIFIED IDEOGRAPH
+ {0x8F9E, 0x511F}, //1923 #CJK UNIFIED IDEOGRAPH
+ {0x8F9F, 0x52DD}, //1924 #CJK UNIFIED IDEOGRAPH
+ {0x8FA0, 0x5320}, //1925 #CJK UNIFIED IDEOGRAPH
+ {0x8FA1, 0x5347}, //1926 #CJK UNIFIED IDEOGRAPH
+ {0x8FA2, 0x53EC}, //1927 #CJK UNIFIED IDEOGRAPH
+ {0x8FA3, 0x54E8}, //1928 #CJK UNIFIED IDEOGRAPH
+ {0x8FA4, 0x5546}, //1929 #CJK UNIFIED IDEOGRAPH
+ {0x8FA5, 0x5531}, //1930 #CJK UNIFIED IDEOGRAPH
+ {0x8FA6, 0x5617}, //1931 #CJK UNIFIED IDEOGRAPH
+ {0x8FA7, 0x5968}, //1932 #CJK UNIFIED IDEOGRAPH
+ {0x8FA8, 0x59BE}, //1933 #CJK UNIFIED IDEOGRAPH
+ {0x8FA9, 0x5A3C}, //1934 #CJK UNIFIED IDEOGRAPH
+ {0x8FAA, 0x5BB5}, //1935 #CJK UNIFIED IDEOGRAPH
+ {0x8FAB, 0x5C06}, //1936 #CJK UNIFIED IDEOGRAPH
+ {0x8FAC, 0x5C0F}, //1937 #CJK UNIFIED IDEOGRAPH
+ {0x8FAD, 0x5C11}, //1938 #CJK UNIFIED IDEOGRAPH
+ {0x8FAE, 0x5C1A}, //1939 #CJK UNIFIED IDEOGRAPH
+ {0x8FAF, 0x5E84}, //1940 #CJK UNIFIED IDEOGRAPH
+ {0x8FB0, 0x5E8A}, //1941 #CJK UNIFIED IDEOGRAPH
+ {0x8FB1, 0x5EE0}, //1942 #CJK UNIFIED IDEOGRAPH
+ {0x8FB2, 0x5F70}, //1943 #CJK UNIFIED IDEOGRAPH
+ {0x8FB3, 0x627F}, //1944 #CJK UNIFIED IDEOGRAPH
+ {0x8FB4, 0x6284}, //1945 #CJK UNIFIED IDEOGRAPH
+ {0x8FB5, 0x62DB}, //1946 #CJK UNIFIED IDEOGRAPH
+ {0x8FB6, 0x638C}, //1947 #CJK UNIFIED IDEOGRAPH
+ {0x8FB7, 0x6377}, //1948 #CJK UNIFIED IDEOGRAPH
+ {0x8FB8, 0x6607}, //1949 #CJK UNIFIED IDEOGRAPH
+ {0x8FB9, 0x660C}, //1950 #CJK UNIFIED IDEOGRAPH
+ {0x8FBA, 0x662D}, //1951 #CJK UNIFIED IDEOGRAPH
+ {0x8FBB, 0x6676}, //1952 #CJK UNIFIED IDEOGRAPH
+ {0x8FBC, 0x677E}, //1953 #CJK UNIFIED IDEOGRAPH
+ {0x8FBD, 0x68A2}, //1954 #CJK UNIFIED IDEOGRAPH
+ {0x8FBE, 0x6A1F}, //1955 #CJK UNIFIED IDEOGRAPH
+ {0x8FBF, 0x6A35}, //1956 #CJK UNIFIED IDEOGRAPH
+ {0x8FC0, 0x6CBC}, //1957 #CJK UNIFIED IDEOGRAPH
+ {0x8FC1, 0x6D88}, //1958 #CJK UNIFIED IDEOGRAPH
+ {0x8FC2, 0x6E09}, //1959 #CJK UNIFIED IDEOGRAPH
+ {0x8FC3, 0x6E58}, //1960 #CJK UNIFIED IDEOGRAPH
+ {0x8FC4, 0x713C}, //1961 #CJK UNIFIED IDEOGRAPH
+ {0x8FC5, 0x7126}, //1962 #CJK UNIFIED IDEOGRAPH
+ {0x8FC6, 0x7167}, //1963 #CJK UNIFIED IDEOGRAPH
+ {0x8FC7, 0x75C7}, //1964 #CJK UNIFIED IDEOGRAPH
+ {0x8FC8, 0x7701}, //1965 #CJK UNIFIED IDEOGRAPH
+ {0x8FC9, 0x785D}, //1966 #CJK UNIFIED IDEOGRAPH
+ {0x8FCA, 0x7901}, //1967 #CJK UNIFIED IDEOGRAPH
+ {0x8FCB, 0x7965}, //1968 #CJK UNIFIED IDEOGRAPH
+ {0x8FCC, 0x79F0}, //1969 #CJK UNIFIED IDEOGRAPH
+ {0x8FCD, 0x7AE0}, //1970 #CJK UNIFIED IDEOGRAPH
+ {0x8FCE, 0x7B11}, //1971 #CJK UNIFIED IDEOGRAPH
+ {0x8FCF, 0x7CA7}, //1972 #CJK UNIFIED IDEOGRAPH
+ {0x8FD0, 0x7D39}, //1973 #CJK UNIFIED IDEOGRAPH
+ {0x8FD1, 0x8096}, //1974 #CJK UNIFIED IDEOGRAPH
+ {0x8FD2, 0x83D6}, //1975 #CJK UNIFIED IDEOGRAPH
+ {0x8FD3, 0x848B}, //1976 #CJK UNIFIED IDEOGRAPH
+ {0x8FD4, 0x8549}, //1977 #CJK UNIFIED IDEOGRAPH
+ {0x8FD5, 0x885D}, //1978 #CJK UNIFIED IDEOGRAPH
+ {0x8FD6, 0x88F3}, //1979 #CJK UNIFIED IDEOGRAPH
+ {0x8FD7, 0x8A1F}, //1980 #CJK UNIFIED IDEOGRAPH
+ {0x8FD8, 0x8A3C}, //1981 #CJK UNIFIED IDEOGRAPH
+ {0x8FD9, 0x8A54}, //1982 #CJK UNIFIED IDEOGRAPH
+ {0x8FDA, 0x8A73}, //1983 #CJK UNIFIED IDEOGRAPH
+ {0x8FDB, 0x8C61}, //1984 #CJK UNIFIED IDEOGRAPH
+ {0x8FDC, 0x8CDE}, //1985 #CJK UNIFIED IDEOGRAPH
+ {0x8FDD, 0x91A4}, //1986 #CJK UNIFIED IDEOGRAPH
+ {0x8FDE, 0x9266}, //1987 #CJK UNIFIED IDEOGRAPH
+ {0x8FDF, 0x937E}, //1988 #CJK UNIFIED IDEOGRAPH
+ {0x8FE0, 0x9418}, //1989 #CJK UNIFIED IDEOGRAPH
+ {0x8FE1, 0x969C}, //1990 #CJK UNIFIED IDEOGRAPH
+ {0x8FE2, 0x9798}, //1991 #CJK UNIFIED IDEOGRAPH
+ {0x8FE3, 0x4E0A}, //1992 #CJK UNIFIED IDEOGRAPH
+ {0x8FE4, 0x4E08}, //1993 #CJK UNIFIED IDEOGRAPH
+ {0x8FE5, 0x4E1E}, //1994 #CJK UNIFIED IDEOGRAPH
+ {0x8FE6, 0x4E57}, //1995 #CJK UNIFIED IDEOGRAPH
+ {0x8FE7, 0x5197}, //1996 #CJK UNIFIED IDEOGRAPH
+ {0x8FE8, 0x5270}, //1997 #CJK UNIFIED IDEOGRAPH
+ {0x8FE9, 0x57CE}, //1998 #CJK UNIFIED IDEOGRAPH
+ {0x8FEA, 0x5834}, //1999 #CJK UNIFIED IDEOGRAPH
+ {0x8FEB, 0x58CC}, //2000 #CJK UNIFIED IDEOGRAPH
+ {0x8FEC, 0x5B22}, //2001 #CJK UNIFIED IDEOGRAPH
+ {0x8FED, 0x5E38}, //2002 #CJK UNIFIED IDEOGRAPH
+ {0x8FEE, 0x60C5}, //2003 #CJK UNIFIED IDEOGRAPH
+ {0x8FEF, 0x64FE}, //2004 #CJK UNIFIED IDEOGRAPH
+ {0x8FF0, 0x6761}, //2005 #CJK UNIFIED IDEOGRAPH
+ {0x8FF1, 0x6756}, //2006 #CJK UNIFIED IDEOGRAPH
+ {0x8FF2, 0x6D44}, //2007 #CJK UNIFIED IDEOGRAPH
+ {0x8FF3, 0x72B6}, //2008 #CJK UNIFIED IDEOGRAPH
+ {0x8FF4, 0x7573}, //2009 #CJK UNIFIED IDEOGRAPH
+ {0x8FF5, 0x7A63}, //2010 #CJK UNIFIED IDEOGRAPH
+ {0x8FF6, 0x84B8}, //2011 #CJK UNIFIED IDEOGRAPH
+ {0x8FF7, 0x8B72}, //2012 #CJK UNIFIED IDEOGRAPH
+ {0x8FF8, 0x91B8}, //2013 #CJK UNIFIED IDEOGRAPH
+ {0x8FF9, 0x9320}, //2014 #CJK UNIFIED IDEOGRAPH
+ {0x8FFA, 0x5631}, //2015 #CJK UNIFIED IDEOGRAPH
+ {0x8FFB, 0x57F4}, //2016 #CJK UNIFIED IDEOGRAPH
+ {0x8FFC, 0x98FE}, //2017 #CJK UNIFIED IDEOGRAPH
+ {0x9040, 0x62ED}, //2018 #CJK UNIFIED IDEOGRAPH
+ {0x9041, 0x690D}, //2019 #CJK UNIFIED IDEOGRAPH
+ {0x9042, 0x6B96}, //2020 #CJK UNIFIED IDEOGRAPH
+ {0x9043, 0x71ED}, //2021 #CJK UNIFIED IDEOGRAPH
+ {0x9044, 0x7E54}, //2022 #CJK UNIFIED IDEOGRAPH
+ {0x9045, 0x8077}, //2023 #CJK UNIFIED IDEOGRAPH
+ {0x9046, 0x8272}, //2024 #CJK UNIFIED IDEOGRAPH
+ {0x9047, 0x89E6}, //2025 #CJK UNIFIED IDEOGRAPH
+ {0x9048, 0x98DF}, //2026 #CJK UNIFIED IDEOGRAPH
+ {0x9049, 0x8755}, //2027 #CJK UNIFIED IDEOGRAPH
+ {0x904A, 0x8FB1}, //2028 #CJK UNIFIED IDEOGRAPH
+ {0x904B, 0x5C3B}, //2029 #CJK UNIFIED IDEOGRAPH
+ {0x904C, 0x4F38}, //2030 #CJK UNIFIED IDEOGRAPH
+ {0x904D, 0x4FE1}, //2031 #CJK UNIFIED IDEOGRAPH
+ {0x904E, 0x4FB5}, //2032 #CJK UNIFIED IDEOGRAPH
+ {0x904F, 0x5507}, //2033 #CJK UNIFIED IDEOGRAPH
+ {0x9050, 0x5A20}, //2034 #CJK UNIFIED IDEOGRAPH
+ {0x9051, 0x5BDD}, //2035 #CJK UNIFIED IDEOGRAPH
+ {0x9052, 0x5BE9}, //2036 #CJK UNIFIED IDEOGRAPH
+ {0x9053, 0x5FC3}, //2037 #CJK UNIFIED IDEOGRAPH
+ {0x9054, 0x614E}, //2038 #CJK UNIFIED IDEOGRAPH
+ {0x9055, 0x632F}, //2039 #CJK UNIFIED IDEOGRAPH
+ {0x9056, 0x65B0}, //2040 #CJK UNIFIED IDEOGRAPH
+ {0x9057, 0x664B}, //2041 #CJK UNIFIED IDEOGRAPH
+ {0x9058, 0x68EE}, //2042 #CJK UNIFIED IDEOGRAPH
+ {0x9059, 0x699B}, //2043 #CJK UNIFIED IDEOGRAPH
+ {0x905A, 0x6D78}, //2044 #CJK UNIFIED IDEOGRAPH
+ {0x905B, 0x6DF1}, //2045 #CJK UNIFIED IDEOGRAPH
+ {0x905C, 0x7533}, //2046 #CJK UNIFIED IDEOGRAPH
+ {0x905D, 0x75B9}, //2047 #CJK UNIFIED IDEOGRAPH
+ {0x905E, 0x771F}, //2048 #CJK UNIFIED IDEOGRAPH
+ {0x905F, 0x795E}, //2049 #CJK UNIFIED IDEOGRAPH
+ {0x9060, 0x79E6}, //2050 #CJK UNIFIED IDEOGRAPH
+ {0x9061, 0x7D33}, //2051 #CJK UNIFIED IDEOGRAPH
+ {0x9062, 0x81E3}, //2052 #CJK UNIFIED IDEOGRAPH
+ {0x9063, 0x82AF}, //2053 #CJK UNIFIED IDEOGRAPH
+ {0x9064, 0x85AA}, //2054 #CJK UNIFIED IDEOGRAPH
+ {0x9065, 0x89AA}, //2055 #CJK UNIFIED IDEOGRAPH
+ {0x9066, 0x8A3A}, //2056 #CJK UNIFIED IDEOGRAPH
+ {0x9067, 0x8EAB}, //2057 #CJK UNIFIED IDEOGRAPH
+ {0x9068, 0x8F9B}, //2058 #CJK UNIFIED IDEOGRAPH
+ {0x9069, 0x9032}, //2059 #CJK UNIFIED IDEOGRAPH
+ {0x906A, 0x91DD}, //2060 #CJK UNIFIED IDEOGRAPH
+ {0x906B, 0x9707}, //2061 #CJK UNIFIED IDEOGRAPH
+ {0x906C, 0x4EBA}, //2062 #CJK UNIFIED IDEOGRAPH
+ {0x906D, 0x4EC1}, //2063 #CJK UNIFIED IDEOGRAPH
+ {0x906E, 0x5203}, //2064 #CJK UNIFIED IDEOGRAPH
+ {0x906F, 0x5875}, //2065 #CJK UNIFIED IDEOGRAPH
+ {0x9070, 0x58EC}, //2066 #CJK UNIFIED IDEOGRAPH
+ {0x9071, 0x5C0B}, //2067 #CJK UNIFIED IDEOGRAPH
+ {0x9072, 0x751A}, //2068 #CJK UNIFIED IDEOGRAPH
+ {0x9073, 0x5C3D}, //2069 #CJK UNIFIED IDEOGRAPH
+ {0x9074, 0x814E}, //2070 #CJK UNIFIED IDEOGRAPH
+ {0x9075, 0x8A0A}, //2071 #CJK UNIFIED IDEOGRAPH
+ {0x9076, 0x8FC5}, //2072 #CJK UNIFIED IDEOGRAPH
+ {0x9077, 0x9663}, //2073 #CJK UNIFIED IDEOGRAPH
+ {0x9078, 0x976D}, //2074 #CJK UNIFIED IDEOGRAPH
+ {0x9079, 0x7B25}, //2075 #CJK UNIFIED IDEOGRAPH
+ {0x907A, 0x8ACF}, //2076 #CJK UNIFIED IDEOGRAPH
+ {0x907B, 0x9808}, //2077 #CJK UNIFIED IDEOGRAPH
+ {0x907C, 0x9162}, //2078 #CJK UNIFIED IDEOGRAPH
+ {0x907D, 0x56F3}, //2079 #CJK UNIFIED IDEOGRAPH
+ {0x907E, 0x53A8}, //2080 #CJK UNIFIED IDEOGRAPH
+ {0x9080, 0x9017}, //2081 #CJK UNIFIED IDEOGRAPH
+ {0x9081, 0x5439}, //2082 #CJK UNIFIED IDEOGRAPH
+ {0x9082, 0x5782}, //2083 #CJK UNIFIED IDEOGRAPH
+ {0x9083, 0x5E25}, //2084 #CJK UNIFIED IDEOGRAPH
+ {0x9084, 0x63A8}, //2085 #CJK UNIFIED IDEOGRAPH
+ {0x9085, 0x6C34}, //2086 #CJK UNIFIED IDEOGRAPH
+ {0x9086, 0x708A}, //2087 #CJK UNIFIED IDEOGRAPH
+ {0x9087, 0x7761}, //2088 #CJK UNIFIED IDEOGRAPH
+ {0x9088, 0x7C8B}, //2089 #CJK UNIFIED IDEOGRAPH
+ {0x9089, 0x7FE0}, //2090 #CJK UNIFIED IDEOGRAPH
+ {0x908A, 0x8870}, //2091 #CJK UNIFIED IDEOGRAPH
+ {0x908B, 0x9042}, //2092 #CJK UNIFIED IDEOGRAPH
+ {0x908C, 0x9154}, //2093 #CJK UNIFIED IDEOGRAPH
+ {0x908D, 0x9310}, //2094 #CJK UNIFIED IDEOGRAPH
+ {0x908E, 0x9318}, //2095 #CJK UNIFIED IDEOGRAPH
+ {0x908F, 0x968F}, //2096 #CJK UNIFIED IDEOGRAPH
+ {0x9090, 0x745E}, //2097 #CJK UNIFIED IDEOGRAPH
+ {0x9091, 0x9AC4}, //2098 #CJK UNIFIED IDEOGRAPH
+ {0x9092, 0x5D07}, //2099 #CJK UNIFIED IDEOGRAPH
+ {0x9093, 0x5D69}, //2100 #CJK UNIFIED IDEOGRAPH
+ {0x9094, 0x6570}, //2101 #CJK UNIFIED IDEOGRAPH
+ {0x9095, 0x67A2}, //2102 #CJK UNIFIED IDEOGRAPH
+ {0x9096, 0x8DA8}, //2103 #CJK UNIFIED IDEOGRAPH
+ {0x9097, 0x96DB}, //2104 #CJK UNIFIED IDEOGRAPH
+ {0x9098, 0x636E}, //2105 #CJK UNIFIED IDEOGRAPH
+ {0x9099, 0x6749}, //2106 #CJK UNIFIED IDEOGRAPH
+ {0x909A, 0x6919}, //2107 #CJK UNIFIED IDEOGRAPH
+ {0x909B, 0x83C5}, //2108 #CJK UNIFIED IDEOGRAPH
+ {0x909C, 0x9817}, //2109 #CJK UNIFIED IDEOGRAPH
+ {0x909D, 0x96C0}, //2110 #CJK UNIFIED IDEOGRAPH
+ {0x909E, 0x88FE}, //2111 #CJK UNIFIED IDEOGRAPH
+ {0x909F, 0x6F84}, //2112 #CJK UNIFIED IDEOGRAPH
+ {0x90A0, 0x647A}, //2113 #CJK UNIFIED IDEOGRAPH
+ {0x90A1, 0x5BF8}, //2114 #CJK UNIFIED IDEOGRAPH
+ {0x90A2, 0x4E16}, //2115 #CJK UNIFIED IDEOGRAPH
+ {0x90A3, 0x702C}, //2116 #CJK UNIFIED IDEOGRAPH
+ {0x90A4, 0x755D}, //2117 #CJK UNIFIED IDEOGRAPH
+ {0x90A5, 0x662F}, //2118 #CJK UNIFIED IDEOGRAPH
+ {0x90A6, 0x51C4}, //2119 #CJK UNIFIED IDEOGRAPH
+ {0x90A7, 0x5236}, //2120 #CJK UNIFIED IDEOGRAPH
+ {0x90A8, 0x52E2}, //2121 #CJK UNIFIED IDEOGRAPH
+ {0x90A9, 0x59D3}, //2122 #CJK UNIFIED IDEOGRAPH
+ {0x90AA, 0x5F81}, //2123 #CJK UNIFIED IDEOGRAPH
+ {0x90AB, 0x6027}, //2124 #CJK UNIFIED IDEOGRAPH
+ {0x90AC, 0x6210}, //2125 #CJK UNIFIED IDEOGRAPH
+ {0x90AD, 0x653F}, //2126 #CJK UNIFIED IDEOGRAPH
+ {0x90AE, 0x6574}, //2127 #CJK UNIFIED IDEOGRAPH
+ {0x90AF, 0x661F}, //2128 #CJK UNIFIED IDEOGRAPH
+ {0x90B0, 0x6674}, //2129 #CJK UNIFIED IDEOGRAPH
+ {0x90B1, 0x68F2}, //2130 #CJK UNIFIED IDEOGRAPH
+ {0x90B2, 0x6816}, //2131 #CJK UNIFIED IDEOGRAPH
+ {0x90B3, 0x6B63}, //2132 #CJK UNIFIED IDEOGRAPH
+ {0x90B4, 0x6E05}, //2133 #CJK UNIFIED IDEOGRAPH
+ {0x90B5, 0x7272}, //2134 #CJK UNIFIED IDEOGRAPH
+ {0x90B6, 0x751F}, //2135 #CJK UNIFIED IDEOGRAPH
+ {0x90B7, 0x76DB}, //2136 #CJK UNIFIED IDEOGRAPH
+ {0x90B8, 0x7CBE}, //2137 #CJK UNIFIED IDEOGRAPH
+ {0x90B9, 0x8056}, //2138 #CJK UNIFIED IDEOGRAPH
+ {0x90BA, 0x58F0}, //2139 #CJK UNIFIED IDEOGRAPH
+ {0x90BB, 0x88FD}, //2140 #CJK UNIFIED IDEOGRAPH
+ {0x90BC, 0x897F}, //2141 #CJK UNIFIED IDEOGRAPH
+ {0x90BD, 0x8AA0}, //2142 #CJK UNIFIED IDEOGRAPH
+ {0x90BE, 0x8A93}, //2143 #CJK UNIFIED IDEOGRAPH
+ {0x90BF, 0x8ACB}, //2144 #CJK UNIFIED IDEOGRAPH
+ {0x90C0, 0x901D}, //2145 #CJK UNIFIED IDEOGRAPH
+ {0x90C1, 0x9192}, //2146 #CJK UNIFIED IDEOGRAPH
+ {0x90C2, 0x9752}, //2147 #CJK UNIFIED IDEOGRAPH
+ {0x90C3, 0x9759}, //2148 #CJK UNIFIED IDEOGRAPH
+ {0x90C4, 0x6589}, //2149 #CJK UNIFIED IDEOGRAPH
+ {0x90C5, 0x7A0E}, //2150 #CJK UNIFIED IDEOGRAPH
+ {0x90C6, 0x8106}, //2151 #CJK UNIFIED IDEOGRAPH
+ {0x90C7, 0x96BB}, //2152 #CJK UNIFIED IDEOGRAPH
+ {0x90C8, 0x5E2D}, //2153 #CJK UNIFIED IDEOGRAPH
+ {0x90C9, 0x60DC}, //2154 #CJK UNIFIED IDEOGRAPH
+ {0x90CA, 0x621A}, //2155 #CJK UNIFIED IDEOGRAPH
+ {0x90CB, 0x65A5}, //2156 #CJK UNIFIED IDEOGRAPH
+ {0x90CC, 0x6614}, //2157 #CJK UNIFIED IDEOGRAPH
+ {0x90CD, 0x6790}, //2158 #CJK UNIFIED IDEOGRAPH
+ {0x90CE, 0x77F3}, //2159 #CJK UNIFIED IDEOGRAPH
+ {0x90CF, 0x7A4D}, //2160 #CJK UNIFIED IDEOGRAPH
+ {0x90D0, 0x7C4D}, //2161 #CJK UNIFIED IDEOGRAPH
+ {0x90D1, 0x7E3E}, //2162 #CJK UNIFIED IDEOGRAPH
+ {0x90D2, 0x810A}, //2163 #CJK UNIFIED IDEOGRAPH
+ {0x90D3, 0x8CAC}, //2164 #CJK UNIFIED IDEOGRAPH
+ {0x90D4, 0x8D64}, //2165 #CJK UNIFIED IDEOGRAPH
+ {0x90D5, 0x8DE1}, //2166 #CJK UNIFIED IDEOGRAPH
+ {0x90D6, 0x8E5F}, //2167 #CJK UNIFIED IDEOGRAPH
+ {0x90D7, 0x78A9}, //2168 #CJK UNIFIED IDEOGRAPH
+ {0x90D8, 0x5207}, //2169 #CJK UNIFIED IDEOGRAPH
+ {0x90D9, 0x62D9}, //2170 #CJK UNIFIED IDEOGRAPH
+ {0x90DA, 0x63A5}, //2171 #CJK UNIFIED IDEOGRAPH
+ {0x90DB, 0x6442}, //2172 #CJK UNIFIED IDEOGRAPH
+ {0x90DC, 0x6298}, //2173 #CJK UNIFIED IDEOGRAPH
+ {0x90DD, 0x8A2D}, //2174 #CJK UNIFIED IDEOGRAPH
+ {0x90DE, 0x7A83}, //2175 #CJK UNIFIED IDEOGRAPH
+ {0x90DF, 0x7BC0}, //2176 #CJK UNIFIED IDEOGRAPH
+ {0x90E0, 0x8AAC}, //2177 #CJK UNIFIED IDEOGRAPH
+ {0x90E1, 0x96EA}, //2178 #CJK UNIFIED IDEOGRAPH
+ {0x90E2, 0x7D76}, //2179 #CJK UNIFIED IDEOGRAPH
+ {0x90E3, 0x820C}, //2180 #CJK UNIFIED IDEOGRAPH
+ {0x90E4, 0x8749}, //2181 #CJK UNIFIED IDEOGRAPH
+ {0x90E5, 0x4ED9}, //2182 #CJK UNIFIED IDEOGRAPH
+ {0x90E6, 0x5148}, //2183 #CJK UNIFIED IDEOGRAPH
+ {0x90E7, 0x5343}, //2184 #CJK UNIFIED IDEOGRAPH
+ {0x90E8, 0x5360}, //2185 #CJK UNIFIED IDEOGRAPH
+ {0x90E9, 0x5BA3}, //2186 #CJK UNIFIED IDEOGRAPH
+ {0x90EA, 0x5C02}, //2187 #CJK UNIFIED IDEOGRAPH
+ {0x90EB, 0x5C16}, //2188 #CJK UNIFIED IDEOGRAPH
+ {0x90EC, 0x5DDD}, //2189 #CJK UNIFIED IDEOGRAPH
+ {0x90ED, 0x6226}, //2190 #CJK UNIFIED IDEOGRAPH
+ {0x90EE, 0x6247}, //2191 #CJK UNIFIED IDEOGRAPH
+ {0x90EF, 0x64B0}, //2192 #CJK UNIFIED IDEOGRAPH
+ {0x90F0, 0x6813}, //2193 #CJK UNIFIED IDEOGRAPH
+ {0x90F1, 0x6834}, //2194 #CJK UNIFIED IDEOGRAPH
+ {0x90F2, 0x6CC9}, //2195 #CJK UNIFIED IDEOGRAPH
+ {0x90F3, 0x6D45}, //2196 #CJK UNIFIED IDEOGRAPH
+ {0x90F4, 0x6D17}, //2197 #CJK UNIFIED IDEOGRAPH
+ {0x90F5, 0x67D3}, //2198 #CJK UNIFIED IDEOGRAPH
+ {0x90F6, 0x6F5C}, //2199 #CJK UNIFIED IDEOGRAPH
+ {0x90F7, 0x714E}, //2200 #CJK UNIFIED IDEOGRAPH
+ {0x90F8, 0x717D}, //2201 #CJK UNIFIED IDEOGRAPH
+ {0x90F9, 0x65CB}, //2202 #CJK UNIFIED IDEOGRAPH
+ {0x90FA, 0x7A7F}, //2203 #CJK UNIFIED IDEOGRAPH
+ {0x90FB, 0x7BAD}, //2204 #CJK UNIFIED IDEOGRAPH
+ {0x90FC, 0x7DDA}, //2205 #CJK UNIFIED IDEOGRAPH
+ {0x9140, 0x7E4A}, //2206 #CJK UNIFIED IDEOGRAPH
+ {0x9141, 0x7FA8}, //2207 #CJK UNIFIED IDEOGRAPH
+ {0x9142, 0x817A}, //2208 #CJK UNIFIED IDEOGRAPH
+ {0x9143, 0x821B}, //2209 #CJK UNIFIED IDEOGRAPH
+ {0x9144, 0x8239}, //2210 #CJK UNIFIED IDEOGRAPH
+ {0x9145, 0x85A6}, //2211 #CJK UNIFIED IDEOGRAPH
+ {0x9146, 0x8A6E}, //2212 #CJK UNIFIED IDEOGRAPH
+ {0x9147, 0x8CCE}, //2213 #CJK UNIFIED IDEOGRAPH
+ {0x9148, 0x8DF5}, //2214 #CJK UNIFIED IDEOGRAPH
+ {0x9149, 0x9078}, //2215 #CJK UNIFIED IDEOGRAPH
+ {0x914A, 0x9077}, //2216 #CJK UNIFIED IDEOGRAPH
+ {0x914B, 0x92AD}, //2217 #CJK UNIFIED IDEOGRAPH
+ {0x914C, 0x9291}, //2218 #CJK UNIFIED IDEOGRAPH
+ {0x914D, 0x9583}, //2219 #CJK UNIFIED IDEOGRAPH
+ {0x914E, 0x9BAE}, //2220 #CJK UNIFIED IDEOGRAPH
+ {0x914F, 0x524D}, //2221 #CJK UNIFIED IDEOGRAPH
+ {0x9150, 0x5584}, //2222 #CJK UNIFIED IDEOGRAPH
+ {0x9151, 0x6F38}, //2223 #CJK UNIFIED IDEOGRAPH
+ {0x9152, 0x7136}, //2224 #CJK UNIFIED IDEOGRAPH
+ {0x9153, 0x5168}, //2225 #CJK UNIFIED IDEOGRAPH
+ {0x9154, 0x7985}, //2226 #CJK UNIFIED IDEOGRAPH
+ {0x9155, 0x7E55}, //2227 #CJK UNIFIED IDEOGRAPH
+ {0x9156, 0x81B3}, //2228 #CJK UNIFIED IDEOGRAPH
+ {0x9157, 0x7CCE}, //2229 #CJK UNIFIED IDEOGRAPH
+ {0x9158, 0x564C}, //2230 #CJK UNIFIED IDEOGRAPH
+ {0x9159, 0x5851}, //2231 #CJK UNIFIED IDEOGRAPH
+ {0x915A, 0x5CA8}, //2232 #CJK UNIFIED IDEOGRAPH
+ {0x915B, 0x63AA}, //2233 #CJK UNIFIED IDEOGRAPH
+ {0x915C, 0x66FE}, //2234 #CJK UNIFIED IDEOGRAPH
+ {0x915D, 0x66FD}, //2235 #CJK UNIFIED IDEOGRAPH
+ {0x915E, 0x695A}, //2236 #CJK UNIFIED IDEOGRAPH
+ {0x915F, 0x72D9}, //2237 #CJK UNIFIED IDEOGRAPH
+ {0x9160, 0x758F}, //2238 #CJK UNIFIED IDEOGRAPH
+ {0x9161, 0x758E}, //2239 #CJK UNIFIED IDEOGRAPH
+ {0x9162, 0x790E}, //2240 #CJK UNIFIED IDEOGRAPH
+ {0x9163, 0x7956}, //2241 #CJK UNIFIED IDEOGRAPH
+ {0x9164, 0x79DF}, //2242 #CJK UNIFIED IDEOGRAPH
+ {0x9165, 0x7C97}, //2243 #CJK UNIFIED IDEOGRAPH
+ {0x9166, 0x7D20}, //2244 #CJK UNIFIED IDEOGRAPH
+ {0x9167, 0x7D44}, //2245 #CJK UNIFIED IDEOGRAPH
+ {0x9168, 0x8607}, //2246 #CJK UNIFIED IDEOGRAPH
+ {0x9169, 0x8A34}, //2247 #CJK UNIFIED IDEOGRAPH
+ {0x916A, 0x963B}, //2248 #CJK UNIFIED IDEOGRAPH
+ {0x916B, 0x9061}, //2249 #CJK UNIFIED IDEOGRAPH
+ {0x916C, 0x9F20}, //2250 #CJK UNIFIED IDEOGRAPH
+ {0x916D, 0x50E7}, //2251 #CJK UNIFIED IDEOGRAPH
+ {0x916E, 0x5275}, //2252 #CJK UNIFIED IDEOGRAPH
+ {0x916F, 0x53CC}, //2253 #CJK UNIFIED IDEOGRAPH
+ {0x9170, 0x53E2}, //2254 #CJK UNIFIED IDEOGRAPH
+ {0x9171, 0x5009}, //2255 #CJK UNIFIED IDEOGRAPH
+ {0x9172, 0x55AA}, //2256 #CJK UNIFIED IDEOGRAPH
+ {0x9173, 0x58EE}, //2257 #CJK UNIFIED IDEOGRAPH
+ {0x9174, 0x594F}, //2258 #CJK UNIFIED IDEOGRAPH
+ {0x9175, 0x723D}, //2259 #CJK UNIFIED IDEOGRAPH
+ {0x9176, 0x5B8B}, //2260 #CJK UNIFIED IDEOGRAPH
+ {0x9177, 0x5C64}, //2261 #CJK UNIFIED IDEOGRAPH
+ {0x9178, 0x531D}, //2262 #CJK UNIFIED IDEOGRAPH
+ {0x9179, 0x60E3}, //2263 #CJK UNIFIED IDEOGRAPH
+ {0x917A, 0x60F3}, //2264 #CJK UNIFIED IDEOGRAPH
+ {0x917B, 0x635C}, //2265 #CJK UNIFIED IDEOGRAPH
+ {0x917C, 0x6383}, //2266 #CJK UNIFIED IDEOGRAPH
+ {0x917D, 0x633F}, //2267 #CJK UNIFIED IDEOGRAPH
+ {0x917E, 0x63BB}, //2268 #CJK UNIFIED IDEOGRAPH
+ {0x9180, 0x64CD}, //2269 #CJK UNIFIED IDEOGRAPH
+ {0x9181, 0x65E9}, //2270 #CJK UNIFIED IDEOGRAPH
+ {0x9182, 0x66F9}, //2271 #CJK UNIFIED IDEOGRAPH
+ {0x9183, 0x5DE3}, //2272 #CJK UNIFIED IDEOGRAPH
+ {0x9184, 0x69CD}, //2273 #CJK UNIFIED IDEOGRAPH
+ {0x9185, 0x69FD}, //2274 #CJK UNIFIED IDEOGRAPH
+ {0x9186, 0x6F15}, //2275 #CJK UNIFIED IDEOGRAPH
+ {0x9187, 0x71E5}, //2276 #CJK UNIFIED IDEOGRAPH
+ {0x9188, 0x4E89}, //2277 #CJK UNIFIED IDEOGRAPH
+ {0x9189, 0x75E9}, //2278 #CJK UNIFIED IDEOGRAPH
+ {0x918A, 0x76F8}, //2279 #CJK UNIFIED IDEOGRAPH
+ {0x918B, 0x7A93}, //2280 #CJK UNIFIED IDEOGRAPH
+ {0x918C, 0x7CDF}, //2281 #CJK UNIFIED IDEOGRAPH
+ {0x918D, 0x7DCF}, //2282 #CJK UNIFIED IDEOGRAPH
+ {0x918E, 0x7D9C}, //2283 #CJK UNIFIED IDEOGRAPH
+ {0x918F, 0x8061}, //2284 #CJK UNIFIED IDEOGRAPH
+ {0x9190, 0x8349}, //2285 #CJK UNIFIED IDEOGRAPH
+ {0x9191, 0x8358}, //2286 #CJK UNIFIED IDEOGRAPH
+ {0x9192, 0x846C}, //2287 #CJK UNIFIED IDEOGRAPH
+ {0x9193, 0x84BC}, //2288 #CJK UNIFIED IDEOGRAPH
+ {0x9194, 0x85FB}, //2289 #CJK UNIFIED IDEOGRAPH
+ {0x9195, 0x88C5}, //2290 #CJK UNIFIED IDEOGRAPH
+ {0x9196, 0x8D70}, //2291 #CJK UNIFIED IDEOGRAPH
+ {0x9197, 0x9001}, //2292 #CJK UNIFIED IDEOGRAPH
+ {0x9198, 0x906D}, //2293 #CJK UNIFIED IDEOGRAPH
+ {0x9199, 0x9397}, //2294 #CJK UNIFIED IDEOGRAPH
+ {0x919A, 0x971C}, //2295 #CJK UNIFIED IDEOGRAPH
+ {0x919B, 0x9A12}, //2296 #CJK UNIFIED IDEOGRAPH
+ {0x919C, 0x50CF}, //2297 #CJK UNIFIED IDEOGRAPH
+ {0x919D, 0x5897}, //2298 #CJK UNIFIED IDEOGRAPH
+ {0x919E, 0x618E}, //2299 #CJK UNIFIED IDEOGRAPH
+ {0x919F, 0x81D3}, //2300 #CJK UNIFIED IDEOGRAPH
+ {0x91A0, 0x8535}, //2301 #CJK UNIFIED IDEOGRAPH
+ {0x91A1, 0x8D08}, //2302 #CJK UNIFIED IDEOGRAPH
+ {0x91A2, 0x9020}, //2303 #CJK UNIFIED IDEOGRAPH
+ {0x91A3, 0x4FC3}, //2304 #CJK UNIFIED IDEOGRAPH
+ {0x91A4, 0x5074}, //2305 #CJK UNIFIED IDEOGRAPH
+ {0x91A5, 0x5247}, //2306 #CJK UNIFIED IDEOGRAPH
+ {0x91A6, 0x5373}, //2307 #CJK UNIFIED IDEOGRAPH
+ {0x91A7, 0x606F}, //2308 #CJK UNIFIED IDEOGRAPH
+ {0x91A8, 0x6349}, //2309 #CJK UNIFIED IDEOGRAPH
+ {0x91A9, 0x675F}, //2310 #CJK UNIFIED IDEOGRAPH
+ {0x91AA, 0x6E2C}, //2311 #CJK UNIFIED IDEOGRAPH
+ {0x91AB, 0x8DB3}, //2312 #CJK UNIFIED IDEOGRAPH
+ {0x91AC, 0x901F}, //2313 #CJK UNIFIED IDEOGRAPH
+ {0x91AD, 0x4FD7}, //2314 #CJK UNIFIED IDEOGRAPH
+ {0x91AE, 0x5C5E}, //2315 #CJK UNIFIED IDEOGRAPH
+ {0x91AF, 0x8CCA}, //2316 #CJK UNIFIED IDEOGRAPH
+ {0x91B0, 0x65CF}, //2317 #CJK UNIFIED IDEOGRAPH
+ {0x91B1, 0x7D9A}, //2318 #CJK UNIFIED IDEOGRAPH
+ {0x91B2, 0x5352}, //2319 #CJK UNIFIED IDEOGRAPH
+ {0x91B3, 0x8896}, //2320 #CJK UNIFIED IDEOGRAPH
+ {0x91B4, 0x5176}, //2321 #CJK UNIFIED IDEOGRAPH
+ {0x91B5, 0x63C3}, //2322 #CJK UNIFIED IDEOGRAPH
+ {0x91B6, 0x5B58}, //2323 #CJK UNIFIED IDEOGRAPH
+ {0x91B7, 0x5B6B}, //2324 #CJK UNIFIED IDEOGRAPH
+ {0x91B8, 0x5C0A}, //2325 #CJK UNIFIED IDEOGRAPH
+ {0x91B9, 0x640D}, //2326 #CJK UNIFIED IDEOGRAPH
+ {0x91BA, 0x6751}, //2327 #CJK UNIFIED IDEOGRAPH
+ {0x91BB, 0x905C}, //2328 #CJK UNIFIED IDEOGRAPH
+ {0x91BC, 0x4ED6}, //2329 #CJK UNIFIED IDEOGRAPH
+ {0x91BD, 0x591A}, //2330 #CJK UNIFIED IDEOGRAPH
+ {0x91BE, 0x592A}, //2331 #CJK UNIFIED IDEOGRAPH
+ {0x91BF, 0x6C70}, //2332 #CJK UNIFIED IDEOGRAPH
+ {0x91C0, 0x8A51}, //2333 #CJK UNIFIED IDEOGRAPH
+ {0x91C1, 0x553E}, //2334 #CJK UNIFIED IDEOGRAPH
+ {0x91C2, 0x5815}, //2335 #CJK UNIFIED IDEOGRAPH
+ {0x91C3, 0x59A5}, //2336 #CJK UNIFIED IDEOGRAPH
+ {0x91C4, 0x60F0}, //2337 #CJK UNIFIED IDEOGRAPH
+ {0x91C5, 0x6253}, //2338 #CJK UNIFIED IDEOGRAPH
+ {0x91C6, 0x67C1}, //2339 #CJK UNIFIED IDEOGRAPH
+ {0x91C7, 0x8235}, //2340 #CJK UNIFIED IDEOGRAPH
+ {0x91C8, 0x6955}, //2341 #CJK UNIFIED IDEOGRAPH
+ {0x91C9, 0x9640}, //2342 #CJK UNIFIED IDEOGRAPH
+ {0x91CA, 0x99C4}, //2343 #CJK UNIFIED IDEOGRAPH
+ {0x91CB, 0x9A28}, //2344 #CJK UNIFIED IDEOGRAPH
+ {0x91CC, 0x4F53}, //2345 #CJK UNIFIED IDEOGRAPH
+ {0x91CD, 0x5806}, //2346 #CJK UNIFIED IDEOGRAPH
+ {0x91CE, 0x5BFE}, //2347 #CJK UNIFIED IDEOGRAPH
+ {0x91CF, 0x8010}, //2348 #CJK UNIFIED IDEOGRAPH
+ {0x91D0, 0x5CB1}, //2349 #CJK UNIFIED IDEOGRAPH
+ {0x91D1, 0x5E2F}, //2350 #CJK UNIFIED IDEOGRAPH
+ {0x91D2, 0x5F85}, //2351 #CJK UNIFIED IDEOGRAPH
+ {0x91D3, 0x6020}, //2352 #CJK UNIFIED IDEOGRAPH
+ {0x91D4, 0x614B}, //2353 #CJK UNIFIED IDEOGRAPH
+ {0x91D5, 0x6234}, //2354 #CJK UNIFIED IDEOGRAPH
+ {0x91D6, 0x66FF}, //2355 #CJK UNIFIED IDEOGRAPH
+ {0x91D7, 0x6CF0}, //2356 #CJK UNIFIED IDEOGRAPH
+ {0x91D8, 0x6EDE}, //2357 #CJK UNIFIED IDEOGRAPH
+ {0x91D9, 0x80CE}, //2358 #CJK UNIFIED IDEOGRAPH
+ {0x91DA, 0x817F}, //2359 #CJK UNIFIED IDEOGRAPH
+ {0x91DB, 0x82D4}, //2360 #CJK UNIFIED IDEOGRAPH
+ {0x91DC, 0x888B}, //2361 #CJK UNIFIED IDEOGRAPH
+ {0x91DD, 0x8CB8}, //2362 #CJK UNIFIED IDEOGRAPH
+ {0x91DE, 0x9000}, //2363 #CJK UNIFIED IDEOGRAPH
+ {0x91DF, 0x902E}, //2364 #CJK UNIFIED IDEOGRAPH
+ {0x91E0, 0x968A}, //2365 #CJK UNIFIED IDEOGRAPH
+ {0x91E1, 0x9EDB}, //2366 #CJK UNIFIED IDEOGRAPH
+ {0x91E2, 0x9BDB}, //2367 #CJK UNIFIED IDEOGRAPH
+ {0x91E3, 0x4EE3}, //2368 #CJK UNIFIED IDEOGRAPH
+ {0x91E4, 0x53F0}, //2369 #CJK UNIFIED IDEOGRAPH
+ {0x91E5, 0x5927}, //2370 #CJK UNIFIED IDEOGRAPH
+ {0x91E6, 0x7B2C}, //2371 #CJK UNIFIED IDEOGRAPH
+ {0x91E7, 0x918D}, //2372 #CJK UNIFIED IDEOGRAPH
+ {0x91E8, 0x984C}, //2373 #CJK UNIFIED IDEOGRAPH
+ {0x91E9, 0x9DF9}, //2374 #CJK UNIFIED IDEOGRAPH
+ {0x91EA, 0x6EDD}, //2375 #CJK UNIFIED IDEOGRAPH
+ {0x91EB, 0x7027}, //2376 #CJK UNIFIED IDEOGRAPH
+ {0x91EC, 0x5353}, //2377 #CJK UNIFIED IDEOGRAPH
+ {0x91ED, 0x5544}, //2378 #CJK UNIFIED IDEOGRAPH
+ {0x91EE, 0x5B85}, //2379 #CJK UNIFIED IDEOGRAPH
+ {0x91EF, 0x6258}, //2380 #CJK UNIFIED IDEOGRAPH
+ {0x91F0, 0x629E}, //2381 #CJK UNIFIED IDEOGRAPH
+ {0x91F1, 0x62D3}, //2382 #CJK UNIFIED IDEOGRAPH
+ {0x91F2, 0x6CA2}, //2383 #CJK UNIFIED IDEOGRAPH
+ {0x91F3, 0x6FEF}, //2384 #CJK UNIFIED IDEOGRAPH
+ {0x91F4, 0x7422}, //2385 #CJK UNIFIED IDEOGRAPH
+ {0x91F5, 0x8A17}, //2386 #CJK UNIFIED IDEOGRAPH
+ {0x91F6, 0x9438}, //2387 #CJK UNIFIED IDEOGRAPH
+ {0x91F7, 0x6FC1}, //2388 #CJK UNIFIED IDEOGRAPH
+ {0x91F8, 0x8AFE}, //2389 #CJK UNIFIED IDEOGRAPH
+ {0x91F9, 0x8338}, //2390 #CJK UNIFIED IDEOGRAPH
+ {0x91FA, 0x51E7}, //2391 #CJK UNIFIED IDEOGRAPH
+ {0x91FB, 0x86F8}, //2392 #CJK UNIFIED IDEOGRAPH
+ {0x91FC, 0x53EA}, //2393 #CJK UNIFIED IDEOGRAPH
+ {0x9240, 0x53E9}, //2394 #CJK UNIFIED IDEOGRAPH
+ {0x9241, 0x4F46}, //2395 #CJK UNIFIED IDEOGRAPH
+ {0x9242, 0x9054}, //2396 #CJK UNIFIED IDEOGRAPH
+ {0x9243, 0x8FB0}, //2397 #CJK UNIFIED IDEOGRAPH
+ {0x9244, 0x596A}, //2398 #CJK UNIFIED IDEOGRAPH
+ {0x9245, 0x8131}, //2399 #CJK UNIFIED IDEOGRAPH
+ {0x9246, 0x5DFD}, //2400 #CJK UNIFIED IDEOGRAPH
+ {0x9247, 0x7AEA}, //2401 #CJK UNIFIED IDEOGRAPH
+ {0x9248, 0x8FBF}, //2402 #CJK UNIFIED IDEOGRAPH
+ {0x9249, 0x68DA}, //2403 #CJK UNIFIED IDEOGRAPH
+ {0x924A, 0x8C37}, //2404 #CJK UNIFIED IDEOGRAPH
+ {0x924B, 0x72F8}, //2405 #CJK UNIFIED IDEOGRAPH
+ {0x924C, 0x9C48}, //2406 #CJK UNIFIED IDEOGRAPH
+ {0x924D, 0x6A3D}, //2407 #CJK UNIFIED IDEOGRAPH
+ {0x924E, 0x8AB0}, //2408 #CJK UNIFIED IDEOGRAPH
+ {0x924F, 0x4E39}, //2409 #CJK UNIFIED IDEOGRAPH
+ {0x9250, 0x5358}, //2410 #CJK UNIFIED IDEOGRAPH
+ {0x9251, 0x5606}, //2411 #CJK UNIFIED IDEOGRAPH
+ {0x9252, 0x5766}, //2412 #CJK UNIFIED IDEOGRAPH
+ {0x9253, 0x62C5}, //2413 #CJK UNIFIED IDEOGRAPH
+ {0x9254, 0x63A2}, //2414 #CJK UNIFIED IDEOGRAPH
+ {0x9255, 0x65E6}, //2415 #CJK UNIFIED IDEOGRAPH
+ {0x9256, 0x6B4E}, //2416 #CJK UNIFIED IDEOGRAPH
+ {0x9257, 0x6DE1}, //2417 #CJK UNIFIED IDEOGRAPH
+ {0x9258, 0x6E5B}, //2418 #CJK UNIFIED IDEOGRAPH
+ {0x9259, 0x70AD}, //2419 #CJK UNIFIED IDEOGRAPH
+ {0x925A, 0x77ED}, //2420 #CJK UNIFIED IDEOGRAPH
+ {0x925B, 0x7AEF}, //2421 #CJK UNIFIED IDEOGRAPH
+ {0x925C, 0x7BAA}, //2422 #CJK UNIFIED IDEOGRAPH
+ {0x925D, 0x7DBB}, //2423 #CJK UNIFIED IDEOGRAPH
+ {0x925E, 0x803D}, //2424 #CJK UNIFIED IDEOGRAPH
+ {0x925F, 0x80C6}, //2425 #CJK UNIFIED IDEOGRAPH
+ {0x9260, 0x86CB}, //2426 #CJK UNIFIED IDEOGRAPH
+ {0x9261, 0x8A95}, //2427 #CJK UNIFIED IDEOGRAPH
+ {0x9262, 0x935B}, //2428 #CJK UNIFIED IDEOGRAPH
+ {0x9263, 0x56E3}, //2429 #CJK UNIFIED IDEOGRAPH
+ {0x9264, 0x58C7}, //2430 #CJK UNIFIED IDEOGRAPH
+ {0x9265, 0x5F3E}, //2431 #CJK UNIFIED IDEOGRAPH
+ {0x9266, 0x65AD}, //2432 #CJK UNIFIED IDEOGRAPH
+ {0x9267, 0x6696}, //2433 #CJK UNIFIED IDEOGRAPH
+ {0x9268, 0x6A80}, //2434 #CJK UNIFIED IDEOGRAPH
+ {0x9269, 0x6BB5}, //2435 #CJK UNIFIED IDEOGRAPH
+ {0x926A, 0x7537}, //2436 #CJK UNIFIED IDEOGRAPH
+ {0x926B, 0x8AC7}, //2437 #CJK UNIFIED IDEOGRAPH
+ {0x926C, 0x5024}, //2438 #CJK UNIFIED IDEOGRAPH
+ {0x926D, 0x77E5}, //2439 #CJK UNIFIED IDEOGRAPH
+ {0x926E, 0x5730}, //2440 #CJK UNIFIED IDEOGRAPH
+ {0x926F, 0x5F1B}, //2441 #CJK UNIFIED IDEOGRAPH
+ {0x9270, 0x6065}, //2442 #CJK UNIFIED IDEOGRAPH
+ {0x9271, 0x667A}, //2443 #CJK UNIFIED IDEOGRAPH
+ {0x9272, 0x6C60}, //2444 #CJK UNIFIED IDEOGRAPH
+ {0x9273, 0x75F4}, //2445 #CJK UNIFIED IDEOGRAPH
+ {0x9274, 0x7A1A}, //2446 #CJK UNIFIED IDEOGRAPH
+ {0x9275, 0x7F6E}, //2447 #CJK UNIFIED IDEOGRAPH
+ {0x9276, 0x81F4}, //2448 #CJK UNIFIED IDEOGRAPH
+ {0x9277, 0x8718}, //2449 #CJK UNIFIED IDEOGRAPH
+ {0x9278, 0x9045}, //2450 #CJK UNIFIED IDEOGRAPH
+ {0x9279, 0x99B3}, //2451 #CJK UNIFIED IDEOGRAPH
+ {0x927A, 0x7BC9}, //2452 #CJK UNIFIED IDEOGRAPH
+ {0x927B, 0x755C}, //2453 #CJK UNIFIED IDEOGRAPH
+ {0x927C, 0x7AF9}, //2454 #CJK UNIFIED IDEOGRAPH
+ {0x927D, 0x7B51}, //2455 #CJK UNIFIED IDEOGRAPH
+ {0x927E, 0x84C4}, //2456 #CJK UNIFIED IDEOGRAPH
+ {0x9280, 0x9010}, //2457 #CJK UNIFIED IDEOGRAPH
+ {0x9281, 0x79E9}, //2458 #CJK UNIFIED IDEOGRAPH
+ {0x9282, 0x7A92}, //2459 #CJK UNIFIED IDEOGRAPH
+ {0x9283, 0x8336}, //2460 #CJK UNIFIED IDEOGRAPH
+ {0x9284, 0x5AE1}, //2461 #CJK UNIFIED IDEOGRAPH
+ {0x9285, 0x7740}, //2462 #CJK UNIFIED IDEOGRAPH
+ {0x9286, 0x4E2D}, //2463 #CJK UNIFIED IDEOGRAPH
+ {0x9287, 0x4EF2}, //2464 #CJK UNIFIED IDEOGRAPH
+ {0x9288, 0x5B99}, //2465 #CJK UNIFIED IDEOGRAPH
+ {0x9289, 0x5FE0}, //2466 #CJK UNIFIED IDEOGRAPH
+ {0x928A, 0x62BD}, //2467 #CJK UNIFIED IDEOGRAPH
+ {0x928B, 0x663C}, //2468 #CJK UNIFIED IDEOGRAPH
+ {0x928C, 0x67F1}, //2469 #CJK UNIFIED IDEOGRAPH
+ {0x928D, 0x6CE8}, //2470 #CJK UNIFIED IDEOGRAPH
+ {0x928E, 0x866B}, //2471 #CJK UNIFIED IDEOGRAPH
+ {0x928F, 0x8877}, //2472 #CJK UNIFIED IDEOGRAPH
+ {0x9290, 0x8A3B}, //2473 #CJK UNIFIED IDEOGRAPH
+ {0x9291, 0x914E}, //2474 #CJK UNIFIED IDEOGRAPH
+ {0x9292, 0x92F3}, //2475 #CJK UNIFIED IDEOGRAPH
+ {0x9293, 0x99D0}, //2476 #CJK UNIFIED IDEOGRAPH
+ {0x9294, 0x6A17}, //2477 #CJK UNIFIED IDEOGRAPH
+ {0x9295, 0x7026}, //2478 #CJK UNIFIED IDEOGRAPH
+ {0x9296, 0x732A}, //2479 #CJK UNIFIED IDEOGRAPH
+ {0x9297, 0x82E7}, //2480 #CJK UNIFIED IDEOGRAPH
+ {0x9298, 0x8457}, //2481 #CJK UNIFIED IDEOGRAPH
+ {0x9299, 0x8CAF}, //2482 #CJK UNIFIED IDEOGRAPH
+ {0x929A, 0x4E01}, //2483 #CJK UNIFIED IDEOGRAPH
+ {0x929B, 0x5146}, //2484 #CJK UNIFIED IDEOGRAPH
+ {0x929C, 0x51CB}, //2485 #CJK UNIFIED IDEOGRAPH
+ {0x929D, 0x558B}, //2486 #CJK UNIFIED IDEOGRAPH
+ {0x929E, 0x5BF5}, //2487 #CJK UNIFIED IDEOGRAPH
+ {0x929F, 0x5E16}, //2488 #CJK UNIFIED IDEOGRAPH
+ {0x92A0, 0x5E33}, //2489 #CJK UNIFIED IDEOGRAPH
+ {0x92A1, 0x5E81}, //2490 #CJK UNIFIED IDEOGRAPH
+ {0x92A2, 0x5F14}, //2491 #CJK UNIFIED IDEOGRAPH
+ {0x92A3, 0x5F35}, //2492 #CJK UNIFIED IDEOGRAPH
+ {0x92A4, 0x5F6B}, //2493 #CJK UNIFIED IDEOGRAPH
+ {0x92A5, 0x5FB4}, //2494 #CJK UNIFIED IDEOGRAPH
+ {0x92A6, 0x61F2}, //2495 #CJK UNIFIED IDEOGRAPH
+ {0x92A7, 0x6311}, //2496 #CJK UNIFIED IDEOGRAPH
+ {0x92A8, 0x66A2}, //2497 #CJK UNIFIED IDEOGRAPH
+ {0x92A9, 0x671D}, //2498 #CJK UNIFIED IDEOGRAPH
+ {0x92AA, 0x6F6E}, //2499 #CJK UNIFIED IDEOGRAPH
+ {0x92AB, 0x7252}, //2500 #CJK UNIFIED IDEOGRAPH
+ {0x92AC, 0x753A}, //2501 #CJK UNIFIED IDEOGRAPH
+ {0x92AD, 0x773A}, //2502 #CJK UNIFIED IDEOGRAPH
+ {0x92AE, 0x8074}, //2503 #CJK UNIFIED IDEOGRAPH
+ {0x92AF, 0x8139}, //2504 #CJK UNIFIED IDEOGRAPH
+ {0x92B0, 0x8178}, //2505 #CJK UNIFIED IDEOGRAPH
+ {0x92B1, 0x8776}, //2506 #CJK UNIFIED IDEOGRAPH
+ {0x92B2, 0x8ABF}, //2507 #CJK UNIFIED IDEOGRAPH
+ {0x92B3, 0x8ADC}, //2508 #CJK UNIFIED IDEOGRAPH
+ {0x92B4, 0x8D85}, //2509 #CJK UNIFIED IDEOGRAPH
+ {0x92B5, 0x8DF3}, //2510 #CJK UNIFIED IDEOGRAPH
+ {0x92B6, 0x929A}, //2511 #CJK UNIFIED IDEOGRAPH
+ {0x92B7, 0x9577}, //2512 #CJK UNIFIED IDEOGRAPH
+ {0x92B8, 0x9802}, //2513 #CJK UNIFIED IDEOGRAPH
+ {0x92B9, 0x9CE5}, //2514 #CJK UNIFIED IDEOGRAPH
+ {0x92BA, 0x52C5}, //2515 #CJK UNIFIED IDEOGRAPH
+ {0x92BB, 0x6357}, //2516 #CJK UNIFIED IDEOGRAPH
+ {0x92BC, 0x76F4}, //2517 #CJK UNIFIED IDEOGRAPH
+ {0x92BD, 0x6715}, //2518 #CJK UNIFIED IDEOGRAPH
+ {0x92BE, 0x6C88}, //2519 #CJK UNIFIED IDEOGRAPH
+ {0x92BF, 0x73CD}, //2520 #CJK UNIFIED IDEOGRAPH
+ {0x92C0, 0x8CC3}, //2521 #CJK UNIFIED IDEOGRAPH
+ {0x92C1, 0x93AE}, //2522 #CJK UNIFIED IDEOGRAPH
+ {0x92C2, 0x9673}, //2523 #CJK UNIFIED IDEOGRAPH
+ {0x92C3, 0x6D25}, //2524 #CJK UNIFIED IDEOGRAPH
+ {0x92C4, 0x589C}, //2525 #CJK UNIFIED IDEOGRAPH
+ {0x92C5, 0x690E}, //2526 #CJK UNIFIED IDEOGRAPH
+ {0x92C6, 0x69CC}, //2527 #CJK UNIFIED IDEOGRAPH
+ {0x92C7, 0x8FFD}, //2528 #CJK UNIFIED IDEOGRAPH
+ {0x92C8, 0x939A}, //2529 #CJK UNIFIED IDEOGRAPH
+ {0x92C9, 0x75DB}, //2530 #CJK UNIFIED IDEOGRAPH
+ {0x92CA, 0x901A}, //2531 #CJK UNIFIED IDEOGRAPH
+ {0x92CB, 0x585A}, //2532 #CJK UNIFIED IDEOGRAPH
+ {0x92CC, 0x6802}, //2533 #CJK UNIFIED IDEOGRAPH
+ {0x92CD, 0x63B4}, //2534 #CJK UNIFIED IDEOGRAPH
+ {0x92CE, 0x69FB}, //2535 #CJK UNIFIED IDEOGRAPH
+ {0x92CF, 0x4F43}, //2536 #CJK UNIFIED IDEOGRAPH
+ {0x92D0, 0x6F2C}, //2537 #CJK UNIFIED IDEOGRAPH
+ {0x92D1, 0x67D8}, //2538 #CJK UNIFIED IDEOGRAPH
+ {0x92D2, 0x8FBB}, //2539 #CJK UNIFIED IDEOGRAPH
+ {0x92D3, 0x8526}, //2540 #CJK UNIFIED IDEOGRAPH
+ {0x92D4, 0x7DB4}, //2541 #CJK UNIFIED IDEOGRAPH
+ {0x92D5, 0x9354}, //2542 #CJK UNIFIED IDEOGRAPH
+ {0x92D6, 0x693F}, //2543 #CJK UNIFIED IDEOGRAPH
+ {0x92D7, 0x6F70}, //2544 #CJK UNIFIED IDEOGRAPH
+ {0x92D8, 0x576A}, //2545 #CJK UNIFIED IDEOGRAPH
+ {0x92D9, 0x58F7}, //2546 #CJK UNIFIED IDEOGRAPH
+ {0x92DA, 0x5B2C}, //2547 #CJK UNIFIED IDEOGRAPH
+ {0x92DB, 0x7D2C}, //2548 #CJK UNIFIED IDEOGRAPH
+ {0x92DC, 0x722A}, //2549 #CJK UNIFIED IDEOGRAPH
+ {0x92DD, 0x540A}, //2550 #CJK UNIFIED IDEOGRAPH
+ {0x92DE, 0x91E3}, //2551 #CJK UNIFIED IDEOGRAPH
+ {0x92DF, 0x9DB4}, //2552 #CJK UNIFIED IDEOGRAPH
+ {0x92E0, 0x4EAD}, //2553 #CJK UNIFIED IDEOGRAPH
+ {0x92E1, 0x4F4E}, //2554 #CJK UNIFIED IDEOGRAPH
+ {0x92E2, 0x505C}, //2555 #CJK UNIFIED IDEOGRAPH
+ {0x92E3, 0x5075}, //2556 #CJK UNIFIED IDEOGRAPH
+ {0x92E4, 0x5243}, //2557 #CJK UNIFIED IDEOGRAPH
+ {0x92E5, 0x8C9E}, //2558 #CJK UNIFIED IDEOGRAPH
+ {0x92E6, 0x5448}, //2559 #CJK UNIFIED IDEOGRAPH
+ {0x92E7, 0x5824}, //2560 #CJK UNIFIED IDEOGRAPH
+ {0x92E8, 0x5B9A}, //2561 #CJK UNIFIED IDEOGRAPH
+ {0x92E9, 0x5E1D}, //2562 #CJK UNIFIED IDEOGRAPH
+ {0x92EA, 0x5E95}, //2563 #CJK UNIFIED IDEOGRAPH
+ {0x92EB, 0x5EAD}, //2564 #CJK UNIFIED IDEOGRAPH
+ {0x92EC, 0x5EF7}, //2565 #CJK UNIFIED IDEOGRAPH
+ {0x92ED, 0x5F1F}, //2566 #CJK UNIFIED IDEOGRAPH
+ {0x92EE, 0x608C}, //2567 #CJK UNIFIED IDEOGRAPH
+ {0x92EF, 0x62B5}, //2568 #CJK UNIFIED IDEOGRAPH
+ {0x92F0, 0x633A}, //2569 #CJK UNIFIED IDEOGRAPH
+ {0x92F1, 0x63D0}, //2570 #CJK UNIFIED IDEOGRAPH
+ {0x92F2, 0x68AF}, //2571 #CJK UNIFIED IDEOGRAPH
+ {0x92F3, 0x6C40}, //2572 #CJK UNIFIED IDEOGRAPH
+ {0x92F4, 0x7887}, //2573 #CJK UNIFIED IDEOGRAPH
+ {0x92F5, 0x798E}, //2574 #CJK UNIFIED IDEOGRAPH
+ {0x92F6, 0x7A0B}, //2575 #CJK UNIFIED IDEOGRAPH
+ {0x92F7, 0x7DE0}, //2576 #CJK UNIFIED IDEOGRAPH
+ {0x92F8, 0x8247}, //2577 #CJK UNIFIED IDEOGRAPH
+ {0x92F9, 0x8A02}, //2578 #CJK UNIFIED IDEOGRAPH
+ {0x92FA, 0x8AE6}, //2579 #CJK UNIFIED IDEOGRAPH
+ {0x92FB, 0x8E44}, //2580 #CJK UNIFIED IDEOGRAPH
+ {0x92FC, 0x9013}, //2581 #CJK UNIFIED IDEOGRAPH
+ {0x9340, 0x90B8}, //2582 #CJK UNIFIED IDEOGRAPH
+ {0x9341, 0x912D}, //2583 #CJK UNIFIED IDEOGRAPH
+ {0x9342, 0x91D8}, //2584 #CJK UNIFIED IDEOGRAPH
+ {0x9343, 0x9F0E}, //2585 #CJK UNIFIED IDEOGRAPH
+ {0x9344, 0x6CE5}, //2586 #CJK UNIFIED IDEOGRAPH
+ {0x9345, 0x6458}, //2587 #CJK UNIFIED IDEOGRAPH
+ {0x9346, 0x64E2}, //2588 #CJK UNIFIED IDEOGRAPH
+ {0x9347, 0x6575}, //2589 #CJK UNIFIED IDEOGRAPH
+ {0x9348, 0x6EF4}, //2590 #CJK UNIFIED IDEOGRAPH
+ {0x9349, 0x7684}, //2591 #CJK UNIFIED IDEOGRAPH
+ {0x934A, 0x7B1B}, //2592 #CJK UNIFIED IDEOGRAPH
+ {0x934B, 0x9069}, //2593 #CJK UNIFIED IDEOGRAPH
+ {0x934C, 0x93D1}, //2594 #CJK UNIFIED IDEOGRAPH
+ {0x934D, 0x6EBA}, //2595 #CJK UNIFIED IDEOGRAPH
+ {0x934E, 0x54F2}, //2596 #CJK UNIFIED IDEOGRAPH
+ {0x934F, 0x5FB9}, //2597 #CJK UNIFIED IDEOGRAPH
+ {0x9350, 0x64A4}, //2598 #CJK UNIFIED IDEOGRAPH
+ {0x9351, 0x8F4D}, //2599 #CJK UNIFIED IDEOGRAPH
+ {0x9352, 0x8FED}, //2600 #CJK UNIFIED IDEOGRAPH
+ {0x9353, 0x9244}, //2601 #CJK UNIFIED IDEOGRAPH
+ {0x9354, 0x5178}, //2602 #CJK UNIFIED IDEOGRAPH
+ {0x9355, 0x586B}, //2603 #CJK UNIFIED IDEOGRAPH
+ {0x9356, 0x5929}, //2604 #CJK UNIFIED IDEOGRAPH
+ {0x9357, 0x5C55}, //2605 #CJK UNIFIED IDEOGRAPH
+ {0x9358, 0x5E97}, //2606 #CJK UNIFIED IDEOGRAPH
+ {0x9359, 0x6DFB}, //2607 #CJK UNIFIED IDEOGRAPH
+ {0x935A, 0x7E8F}, //2608 #CJK UNIFIED IDEOGRAPH
+ {0x935B, 0x751C}, //2609 #CJK UNIFIED IDEOGRAPH
+ {0x935C, 0x8CBC}, //2610 #CJK UNIFIED IDEOGRAPH
+ {0x935D, 0x8EE2}, //2611 #CJK UNIFIED IDEOGRAPH
+ {0x935E, 0x985B}, //2612 #CJK UNIFIED IDEOGRAPH
+ {0x935F, 0x70B9}, //2613 #CJK UNIFIED IDEOGRAPH
+ {0x9360, 0x4F1D}, //2614 #CJK UNIFIED IDEOGRAPH
+ {0x9361, 0x6BBF}, //2615 #CJK UNIFIED IDEOGRAPH
+ {0x9362, 0x6FB1}, //2616 #CJK UNIFIED IDEOGRAPH
+ {0x9363, 0x7530}, //2617 #CJK UNIFIED IDEOGRAPH
+ {0x9364, 0x96FB}, //2618 #CJK UNIFIED IDEOGRAPH
+ {0x9365, 0x514E}, //2619 #CJK UNIFIED IDEOGRAPH
+ {0x9366, 0x5410}, //2620 #CJK UNIFIED IDEOGRAPH
+ {0x9367, 0x5835}, //2621 #CJK UNIFIED IDEOGRAPH
+ {0x9368, 0x5857}, //2622 #CJK UNIFIED IDEOGRAPH
+ {0x9369, 0x59AC}, //2623 #CJK UNIFIED IDEOGRAPH
+ {0x936A, 0x5C60}, //2624 #CJK UNIFIED IDEOGRAPH
+ {0x936B, 0x5F92}, //2625 #CJK UNIFIED IDEOGRAPH
+ {0x936C, 0x6597}, //2626 #CJK UNIFIED IDEOGRAPH
+ {0x936D, 0x675C}, //2627 #CJK UNIFIED IDEOGRAPH
+ {0x936E, 0x6E21}, //2628 #CJK UNIFIED IDEOGRAPH
+ {0x936F, 0x767B}, //2629 #CJK UNIFIED IDEOGRAPH
+ {0x9370, 0x83DF}, //2630 #CJK UNIFIED IDEOGRAPH
+ {0x9371, 0x8CED}, //2631 #CJK UNIFIED IDEOGRAPH
+ {0x9372, 0x9014}, //2632 #CJK UNIFIED IDEOGRAPH
+ {0x9373, 0x90FD}, //2633 #CJK UNIFIED IDEOGRAPH
+ {0x9374, 0x934D}, //2634 #CJK UNIFIED IDEOGRAPH
+ {0x9375, 0x7825}, //2635 #CJK UNIFIED IDEOGRAPH
+ {0x9376, 0x783A}, //2636 #CJK UNIFIED IDEOGRAPH
+ {0x9377, 0x52AA}, //2637 #CJK UNIFIED IDEOGRAPH
+ {0x9378, 0x5EA6}, //2638 #CJK UNIFIED IDEOGRAPH
+ {0x9379, 0x571F}, //2639 #CJK UNIFIED IDEOGRAPH
+ {0x937A, 0x5974}, //2640 #CJK UNIFIED IDEOGRAPH
+ {0x937B, 0x6012}, //2641 #CJK UNIFIED IDEOGRAPH
+ {0x937C, 0x5012}, //2642 #CJK UNIFIED IDEOGRAPH
+ {0x937D, 0x515A}, //2643 #CJK UNIFIED IDEOGRAPH
+ {0x937E, 0x51AC}, //2644 #CJK UNIFIED IDEOGRAPH
+ {0x9380, 0x51CD}, //2645 #CJK UNIFIED IDEOGRAPH
+ {0x9381, 0x5200}, //2646 #CJK UNIFIED IDEOGRAPH
+ {0x9382, 0x5510}, //2647 #CJK UNIFIED IDEOGRAPH
+ {0x9383, 0x5854}, //2648 #CJK UNIFIED IDEOGRAPH
+ {0x9384, 0x5858}, //2649 #CJK UNIFIED IDEOGRAPH
+ {0x9385, 0x5957}, //2650 #CJK UNIFIED IDEOGRAPH
+ {0x9386, 0x5B95}, //2651 #CJK UNIFIED IDEOGRAPH
+ {0x9387, 0x5CF6}, //2652 #CJK UNIFIED IDEOGRAPH
+ {0x9388, 0x5D8B}, //2653 #CJK UNIFIED IDEOGRAPH
+ {0x9389, 0x60BC}, //2654 #CJK UNIFIED IDEOGRAPH
+ {0x938A, 0x6295}, //2655 #CJK UNIFIED IDEOGRAPH
+ {0x938B, 0x642D}, //2656 #CJK UNIFIED IDEOGRAPH
+ {0x938C, 0x6771}, //2657 #CJK UNIFIED IDEOGRAPH
+ {0x938D, 0x6843}, //2658 #CJK UNIFIED IDEOGRAPH
+ {0x938E, 0x68BC}, //2659 #CJK UNIFIED IDEOGRAPH
+ {0x938F, 0x68DF}, //2660 #CJK UNIFIED IDEOGRAPH
+ {0x9390, 0x76D7}, //2661 #CJK UNIFIED IDEOGRAPH
+ {0x9391, 0x6DD8}, //2662 #CJK UNIFIED IDEOGRAPH
+ {0x9392, 0x6E6F}, //2663 #CJK UNIFIED IDEOGRAPH
+ {0x9393, 0x6D9B}, //2664 #CJK UNIFIED IDEOGRAPH
+ {0x9394, 0x706F}, //2665 #CJK UNIFIED IDEOGRAPH
+ {0x9395, 0x71C8}, //2666 #CJK UNIFIED IDEOGRAPH
+ {0x9396, 0x5F53}, //2667 #CJK UNIFIED IDEOGRAPH
+ {0x9397, 0x75D8}, //2668 #CJK UNIFIED IDEOGRAPH
+ {0x9398, 0x7977}, //2669 #CJK UNIFIED IDEOGRAPH
+ {0x9399, 0x7B49}, //2670 #CJK UNIFIED IDEOGRAPH
+ {0x939A, 0x7B54}, //2671 #CJK UNIFIED IDEOGRAPH
+ {0x939B, 0x7B52}, //2672 #CJK UNIFIED IDEOGRAPH
+ {0x939C, 0x7CD6}, //2673 #CJK UNIFIED IDEOGRAPH
+ {0x939D, 0x7D71}, //2674 #CJK UNIFIED IDEOGRAPH
+ {0x939E, 0x5230}, //2675 #CJK UNIFIED IDEOGRAPH
+ {0x939F, 0x8463}, //2676 #CJK UNIFIED IDEOGRAPH
+ {0x93A0, 0x8569}, //2677 #CJK UNIFIED IDEOGRAPH
+ {0x93A1, 0x85E4}, //2678 #CJK UNIFIED IDEOGRAPH
+ {0x93A2, 0x8A0E}, //2679 #CJK UNIFIED IDEOGRAPH
+ {0x93A3, 0x8B04}, //2680 #CJK UNIFIED IDEOGRAPH
+ {0x93A4, 0x8C46}, //2681 #CJK UNIFIED IDEOGRAPH
+ {0x93A5, 0x8E0F}, //2682 #CJK UNIFIED IDEOGRAPH
+ {0x93A6, 0x9003}, //2683 #CJK UNIFIED IDEOGRAPH
+ {0x93A7, 0x900F}, //2684 #CJK UNIFIED IDEOGRAPH
+ {0x93A8, 0x9419}, //2685 #CJK UNIFIED IDEOGRAPH
+ {0x93A9, 0x9676}, //2686 #CJK UNIFIED IDEOGRAPH
+ {0x93AA, 0x982D}, //2687 #CJK UNIFIED IDEOGRAPH
+ {0x93AB, 0x9A30}, //2688 #CJK UNIFIED IDEOGRAPH
+ {0x93AC, 0x95D8}, //2689 #CJK UNIFIED IDEOGRAPH
+ {0x93AD, 0x50CD}, //2690 #CJK UNIFIED IDEOGRAPH
+ {0x93AE, 0x52D5}, //2691 #CJK UNIFIED IDEOGRAPH
+ {0x93AF, 0x540C}, //2692 #CJK UNIFIED IDEOGRAPH
+ {0x93B0, 0x5802}, //2693 #CJK UNIFIED IDEOGRAPH
+ {0x93B1, 0x5C0E}, //2694 #CJK UNIFIED IDEOGRAPH
+ {0x93B2, 0x61A7}, //2695 #CJK UNIFIED IDEOGRAPH
+ {0x93B3, 0x649E}, //2696 #CJK UNIFIED IDEOGRAPH
+ {0x93B4, 0x6D1E}, //2697 #CJK UNIFIED IDEOGRAPH
+ {0x93B5, 0x77B3}, //2698 #CJK UNIFIED IDEOGRAPH
+ {0x93B6, 0x7AE5}, //2699 #CJK UNIFIED IDEOGRAPH
+ {0x93B7, 0x80F4}, //2700 #CJK UNIFIED IDEOGRAPH
+ {0x93B8, 0x8404}, //2701 #CJK UNIFIED IDEOGRAPH
+ {0x93B9, 0x9053}, //2702 #CJK UNIFIED IDEOGRAPH
+ {0x93BA, 0x9285}, //2703 #CJK UNIFIED IDEOGRAPH
+ {0x93BB, 0x5CE0}, //2704 #CJK UNIFIED IDEOGRAPH
+ {0x93BC, 0x9D07}, //2705 #CJK UNIFIED IDEOGRAPH
+ {0x93BD, 0x533F}, //2706 #CJK UNIFIED IDEOGRAPH
+ {0x93BE, 0x5F97}, //2707 #CJK UNIFIED IDEOGRAPH
+ {0x93BF, 0x5FB3}, //2708 #CJK UNIFIED IDEOGRAPH
+ {0x93C0, 0x6D9C}, //2709 #CJK UNIFIED IDEOGRAPH
+ {0x93C1, 0x7279}, //2710 #CJK UNIFIED IDEOGRAPH
+ {0x93C2, 0x7763}, //2711 #CJK UNIFIED IDEOGRAPH
+ {0x93C3, 0x79BF}, //2712 #CJK UNIFIED IDEOGRAPH
+ {0x93C4, 0x7BE4}, //2713 #CJK UNIFIED IDEOGRAPH
+ {0x93C5, 0x6BD2}, //2714 #CJK UNIFIED IDEOGRAPH
+ {0x93C6, 0x72EC}, //2715 #CJK UNIFIED IDEOGRAPH
+ {0x93C7, 0x8AAD}, //2716 #CJK UNIFIED IDEOGRAPH
+ {0x93C8, 0x6803}, //2717 #CJK UNIFIED IDEOGRAPH
+ {0x93C9, 0x6A61}, //2718 #CJK UNIFIED IDEOGRAPH
+ {0x93CA, 0x51F8}, //2719 #CJK UNIFIED IDEOGRAPH
+ {0x93CB, 0x7A81}, //2720 #CJK UNIFIED IDEOGRAPH
+ {0x93CC, 0x6934}, //2721 #CJK UNIFIED IDEOGRAPH
+ {0x93CD, 0x5C4A}, //2722 #CJK UNIFIED IDEOGRAPH
+ {0x93CE, 0x9CF6}, //2723 #CJK UNIFIED IDEOGRAPH
+ {0x93CF, 0x82EB}, //2724 #CJK UNIFIED IDEOGRAPH
+ {0x93D0, 0x5BC5}, //2725 #CJK UNIFIED IDEOGRAPH
+ {0x93D1, 0x9149}, //2726 #CJK UNIFIED IDEOGRAPH
+ {0x93D2, 0x701E}, //2727 #CJK UNIFIED IDEOGRAPH
+ {0x93D3, 0x5678}, //2728 #CJK UNIFIED IDEOGRAPH
+ {0x93D4, 0x5C6F}, //2729 #CJK UNIFIED IDEOGRAPH
+ {0x93D5, 0x60C7}, //2730 #CJK UNIFIED IDEOGRAPH
+ {0x93D6, 0x6566}, //2731 #CJK UNIFIED IDEOGRAPH
+ {0x93D7, 0x6C8C}, //2732 #CJK UNIFIED IDEOGRAPH
+ {0x93D8, 0x8C5A}, //2733 #CJK UNIFIED IDEOGRAPH
+ {0x93D9, 0x9041}, //2734 #CJK UNIFIED IDEOGRAPH
+ {0x93DA, 0x9813}, //2735 #CJK UNIFIED IDEOGRAPH
+ {0x93DB, 0x5451}, //2736 #CJK UNIFIED IDEOGRAPH
+ {0x93DC, 0x66C7}, //2737 #CJK UNIFIED IDEOGRAPH
+ {0x93DD, 0x920D}, //2738 #CJK UNIFIED IDEOGRAPH
+ {0x93DE, 0x5948}, //2739 #CJK UNIFIED IDEOGRAPH
+ {0x93DF, 0x90A3}, //2740 #CJK UNIFIED IDEOGRAPH
+ {0x93E0, 0x5185}, //2741 #CJK UNIFIED IDEOGRAPH
+ {0x93E1, 0x4E4D}, //2742 #CJK UNIFIED IDEOGRAPH
+ {0x93E2, 0x51EA}, //2743 #CJK UNIFIED IDEOGRAPH
+ {0x93E3, 0x8599}, //2744 #CJK UNIFIED IDEOGRAPH
+ {0x93E4, 0x8B0E}, //2745 #CJK UNIFIED IDEOGRAPH
+ {0x93E5, 0x7058}, //2746 #CJK UNIFIED IDEOGRAPH
+ {0x93E6, 0x637A}, //2747 #CJK UNIFIED IDEOGRAPH
+ {0x93E7, 0x934B}, //2748 #CJK UNIFIED IDEOGRAPH
+ {0x93E8, 0x6962}, //2749 #CJK UNIFIED IDEOGRAPH
+ {0x93E9, 0x99B4}, //2750 #CJK UNIFIED IDEOGRAPH
+ {0x93EA, 0x7E04}, //2751 #CJK UNIFIED IDEOGRAPH
+ {0x93EB, 0x7577}, //2752 #CJK UNIFIED IDEOGRAPH
+ {0x93EC, 0x5357}, //2753 #CJK UNIFIED IDEOGRAPH
+ {0x93ED, 0x6960}, //2754 #CJK UNIFIED IDEOGRAPH
+ {0x93EE, 0x8EDF}, //2755 #CJK UNIFIED IDEOGRAPH
+ {0x93EF, 0x96E3}, //2756 #CJK UNIFIED IDEOGRAPH
+ {0x93F0, 0x6C5D}, //2757 #CJK UNIFIED IDEOGRAPH
+ {0x93F1, 0x4E8C}, //2758 #CJK UNIFIED IDEOGRAPH
+ {0x93F2, 0x5C3C}, //2759 #CJK UNIFIED IDEOGRAPH
+ {0x93F3, 0x5F10}, //2760 #CJK UNIFIED IDEOGRAPH
+ {0x93F4, 0x8FE9}, //2761 #CJK UNIFIED IDEOGRAPH
+ {0x93F5, 0x5302}, //2762 #CJK UNIFIED IDEOGRAPH
+ {0x93F6, 0x8CD1}, //2763 #CJK UNIFIED IDEOGRAPH
+ {0x93F7, 0x8089}, //2764 #CJK UNIFIED IDEOGRAPH
+ {0x93F8, 0x8679}, //2765 #CJK UNIFIED IDEOGRAPH
+ {0x93F9, 0x5EFF}, //2766 #CJK UNIFIED IDEOGRAPH
+ {0x93FA, 0x65E5}, //2767 #CJK UNIFIED IDEOGRAPH
+ {0x93FB, 0x4E73}, //2768 #CJK UNIFIED IDEOGRAPH
+ {0x93FC, 0x5165}, //2769 #CJK UNIFIED IDEOGRAPH
+ {0x9440, 0x5982}, //2770 #CJK UNIFIED IDEOGRAPH
+ {0x9441, 0x5C3F}, //2771 #CJK UNIFIED IDEOGRAPH
+ {0x9442, 0x97EE}, //2772 #CJK UNIFIED IDEOGRAPH
+ {0x9443, 0x4EFB}, //2773 #CJK UNIFIED IDEOGRAPH
+ {0x9444, 0x598A}, //2774 #CJK UNIFIED IDEOGRAPH
+ {0x9445, 0x5FCD}, //2775 #CJK UNIFIED IDEOGRAPH
+ {0x9446, 0x8A8D}, //2776 #CJK UNIFIED IDEOGRAPH
+ {0x9447, 0x6FE1}, //2777 #CJK UNIFIED IDEOGRAPH
+ {0x9448, 0x79B0}, //2778 #CJK UNIFIED IDEOGRAPH
+ {0x9449, 0x7962}, //2779 #CJK UNIFIED IDEOGRAPH
+ {0x944A, 0x5BE7}, //2780 #CJK UNIFIED IDEOGRAPH
+ {0x944B, 0x8471}, //2781 #CJK UNIFIED IDEOGRAPH
+ {0x944C, 0x732B}, //2782 #CJK UNIFIED IDEOGRAPH
+ {0x944D, 0x71B1}, //2783 #CJK UNIFIED IDEOGRAPH
+ {0x944E, 0x5E74}, //2784 #CJK UNIFIED IDEOGRAPH
+ {0x944F, 0x5FF5}, //2785 #CJK UNIFIED IDEOGRAPH
+ {0x9450, 0x637B}, //2786 #CJK UNIFIED IDEOGRAPH
+ {0x9451, 0x649A}, //2787 #CJK UNIFIED IDEOGRAPH
+ {0x9452, 0x71C3}, //2788 #CJK UNIFIED IDEOGRAPH
+ {0x9453, 0x7C98}, //2789 #CJK UNIFIED IDEOGRAPH
+ {0x9454, 0x4E43}, //2790 #CJK UNIFIED IDEOGRAPH
+ {0x9455, 0x5EFC}, //2791 #CJK UNIFIED IDEOGRAPH
+ {0x9456, 0x4E4B}, //2792 #CJK UNIFIED IDEOGRAPH
+ {0x9457, 0x57DC}, //2793 #CJK UNIFIED IDEOGRAPH
+ {0x9458, 0x56A2}, //2794 #CJK UNIFIED IDEOGRAPH
+ {0x9459, 0x60A9}, //2795 #CJK UNIFIED IDEOGRAPH
+ {0x945A, 0x6FC3}, //2796 #CJK UNIFIED IDEOGRAPH
+ {0x945B, 0x7D0D}, //2797 #CJK UNIFIED IDEOGRAPH
+ {0x945C, 0x80FD}, //2798 #CJK UNIFIED IDEOGRAPH
+ {0x945D, 0x8133}, //2799 #CJK UNIFIED IDEOGRAPH
+ {0x945E, 0x81BF}, //2800 #CJK UNIFIED IDEOGRAPH
+ {0x945F, 0x8FB2}, //2801 #CJK UNIFIED IDEOGRAPH
+ {0x9460, 0x8997}, //2802 #CJK UNIFIED IDEOGRAPH
+ {0x9461, 0x86A4}, //2803 #CJK UNIFIED IDEOGRAPH
+ {0x9462, 0x5DF4}, //2804 #CJK UNIFIED IDEOGRAPH
+ {0x9463, 0x628A}, //2805 #CJK UNIFIED IDEOGRAPH
+ {0x9464, 0x64AD}, //2806 #CJK UNIFIED IDEOGRAPH
+ {0x9465, 0x8987}, //2807 #CJK UNIFIED IDEOGRAPH
+ {0x9466, 0x6777}, //2808 #CJK UNIFIED IDEOGRAPH
+ {0x9467, 0x6CE2}, //2809 #CJK UNIFIED IDEOGRAPH
+ {0x9468, 0x6D3E}, //2810 #CJK UNIFIED IDEOGRAPH
+ {0x9469, 0x7436}, //2811 #CJK UNIFIED IDEOGRAPH
+ {0x946A, 0x7834}, //2812 #CJK UNIFIED IDEOGRAPH
+ {0x946B, 0x5A46}, //2813 #CJK UNIFIED IDEOGRAPH
+ {0x946C, 0x7F75}, //2814 #CJK UNIFIED IDEOGRAPH
+ {0x946D, 0x82AD}, //2815 #CJK UNIFIED IDEOGRAPH
+ {0x946E, 0x99AC}, //2816 #CJK UNIFIED IDEOGRAPH
+ {0x946F, 0x4FF3}, //2817 #CJK UNIFIED IDEOGRAPH
+ {0x9470, 0x5EC3}, //2818 #CJK UNIFIED IDEOGRAPH
+ {0x9471, 0x62DD}, //2819 #CJK UNIFIED IDEOGRAPH
+ {0x9472, 0x6392}, //2820 #CJK UNIFIED IDEOGRAPH
+ {0x9473, 0x6557}, //2821 #CJK UNIFIED IDEOGRAPH
+ {0x9474, 0x676F}, //2822 #CJK UNIFIED IDEOGRAPH
+ {0x9475, 0x76C3}, //2823 #CJK UNIFIED IDEOGRAPH
+ {0x9476, 0x724C}, //2824 #CJK UNIFIED IDEOGRAPH
+ {0x9477, 0x80CC}, //2825 #CJK UNIFIED IDEOGRAPH
+ {0x9478, 0x80BA}, //2826 #CJK UNIFIED IDEOGRAPH
+ {0x9479, 0x8F29}, //2827 #CJK UNIFIED IDEOGRAPH
+ {0x947A, 0x914D}, //2828 #CJK UNIFIED IDEOGRAPH
+ {0x947B, 0x500D}, //2829 #CJK UNIFIED IDEOGRAPH
+ {0x947C, 0x57F9}, //2830 #CJK UNIFIED IDEOGRAPH
+ {0x947D, 0x5A92}, //2831 #CJK UNIFIED IDEOGRAPH
+ {0x947E, 0x6885}, //2832 #CJK UNIFIED IDEOGRAPH
+ {0x9480, 0x6973}, //2833 #CJK UNIFIED IDEOGRAPH
+ {0x9481, 0x7164}, //2834 #CJK UNIFIED IDEOGRAPH
+ {0x9482, 0x72FD}, //2835 #CJK UNIFIED IDEOGRAPH
+ {0x9483, 0x8CB7}, //2836 #CJK UNIFIED IDEOGRAPH
+ {0x9484, 0x58F2}, //2837 #CJK UNIFIED IDEOGRAPH
+ {0x9485, 0x8CE0}, //2838 #CJK UNIFIED IDEOGRAPH
+ {0x9486, 0x966A}, //2839 #CJK UNIFIED IDEOGRAPH
+ {0x9487, 0x9019}, //2840 #CJK UNIFIED IDEOGRAPH
+ {0x9488, 0x877F}, //2841 #CJK UNIFIED IDEOGRAPH
+ {0x9489, 0x79E4}, //2842 #CJK UNIFIED IDEOGRAPH
+ {0x948A, 0x77E7}, //2843 #CJK UNIFIED IDEOGRAPH
+ {0x948B, 0x8429}, //2844 #CJK UNIFIED IDEOGRAPH
+ {0x948C, 0x4F2F}, //2845 #CJK UNIFIED IDEOGRAPH
+ {0x948D, 0x5265}, //2846 #CJK UNIFIED IDEOGRAPH
+ {0x948E, 0x535A}, //2847 #CJK UNIFIED IDEOGRAPH
+ {0x948F, 0x62CD}, //2848 #CJK UNIFIED IDEOGRAPH
+ {0x9490, 0x67CF}, //2849 #CJK UNIFIED IDEOGRAPH
+ {0x9491, 0x6CCA}, //2850 #CJK UNIFIED IDEOGRAPH
+ {0x9492, 0x767D}, //2851 #CJK UNIFIED IDEOGRAPH
+ {0x9493, 0x7B94}, //2852 #CJK UNIFIED IDEOGRAPH
+ {0x9494, 0x7C95}, //2853 #CJK UNIFIED IDEOGRAPH
+ {0x9495, 0x8236}, //2854 #CJK UNIFIED IDEOGRAPH
+ {0x9496, 0x8584}, //2855 #CJK UNIFIED IDEOGRAPH
+ {0x9497, 0x8FEB}, //2856 #CJK UNIFIED IDEOGRAPH
+ {0x9498, 0x66DD}, //2857 #CJK UNIFIED IDEOGRAPH
+ {0x9499, 0x6F20}, //2858 #CJK UNIFIED IDEOGRAPH
+ {0x949A, 0x7206}, //2859 #CJK UNIFIED IDEOGRAPH
+ {0x949B, 0x7E1B}, //2860 #CJK UNIFIED IDEOGRAPH
+ {0x949C, 0x83AB}, //2861 #CJK UNIFIED IDEOGRAPH
+ {0x949D, 0x99C1}, //2862 #CJK UNIFIED IDEOGRAPH
+ {0x949E, 0x9EA6}, //2863 #CJK UNIFIED IDEOGRAPH
+ {0x949F, 0x51FD}, //2864 #CJK UNIFIED IDEOGRAPH
+ {0x94A0, 0x7BB1}, //2865 #CJK UNIFIED IDEOGRAPH
+ {0x94A1, 0x7872}, //2866 #CJK UNIFIED IDEOGRAPH
+ {0x94A2, 0x7BB8}, //2867 #CJK UNIFIED IDEOGRAPH
+ {0x94A3, 0x8087}, //2868 #CJK UNIFIED IDEOGRAPH
+ {0x94A4, 0x7B48}, //2869 #CJK UNIFIED IDEOGRAPH
+ {0x94A5, 0x6AE8}, //2870 #CJK UNIFIED IDEOGRAPH
+ {0x94A6, 0x5E61}, //2871 #CJK UNIFIED IDEOGRAPH
+ {0x94A7, 0x808C}, //2872 #CJK UNIFIED IDEOGRAPH
+ {0x94A8, 0x7551}, //2873 #CJK UNIFIED IDEOGRAPH
+ {0x94A9, 0x7560}, //2874 #CJK UNIFIED IDEOGRAPH
+ {0x94AA, 0x516B}, //2875 #CJK UNIFIED IDEOGRAPH
+ {0x94AB, 0x9262}, //2876 #CJK UNIFIED IDEOGRAPH
+ {0x94AC, 0x6E8C}, //2877 #CJK UNIFIED IDEOGRAPH
+ {0x94AD, 0x767A}, //2878 #CJK UNIFIED IDEOGRAPH
+ {0x94AE, 0x9197}, //2879 #CJK UNIFIED IDEOGRAPH
+ {0x94AF, 0x9AEA}, //2880 #CJK UNIFIED IDEOGRAPH
+ {0x94B0, 0x4F10}, //2881 #CJK UNIFIED IDEOGRAPH
+ {0x94B1, 0x7F70}, //2882 #CJK UNIFIED IDEOGRAPH
+ {0x94B2, 0x629C}, //2883 #CJK UNIFIED IDEOGRAPH
+ {0x94B3, 0x7B4F}, //2884 #CJK UNIFIED IDEOGRAPH
+ {0x94B4, 0x95A5}, //2885 #CJK UNIFIED IDEOGRAPH
+ {0x94B5, 0x9CE9}, //2886 #CJK UNIFIED IDEOGRAPH
+ {0x94B6, 0x567A}, //2887 #CJK UNIFIED IDEOGRAPH
+ {0x94B7, 0x5859}, //2888 #CJK UNIFIED IDEOGRAPH
+ {0x94B8, 0x86E4}, //2889 #CJK UNIFIED IDEOGRAPH
+ {0x94B9, 0x96BC}, //2890 #CJK UNIFIED IDEOGRAPH
+ {0x94BA, 0x4F34}, //2891 #CJK UNIFIED IDEOGRAPH
+ {0x94BB, 0x5224}, //2892 #CJK UNIFIED IDEOGRAPH
+ {0x94BC, 0x534A}, //2893 #CJK UNIFIED IDEOGRAPH
+ {0x94BD, 0x53CD}, //2894 #CJK UNIFIED IDEOGRAPH
+ {0x94BE, 0x53DB}, //2895 #CJK UNIFIED IDEOGRAPH
+ {0x94BF, 0x5E06}, //2896 #CJK UNIFIED IDEOGRAPH
+ {0x94C0, 0x642C}, //2897 #CJK UNIFIED IDEOGRAPH
+ {0x94C1, 0x6591}, //2898 #CJK UNIFIED IDEOGRAPH
+ {0x94C2, 0x677F}, //2899 #CJK UNIFIED IDEOGRAPH
+ {0x94C3, 0x6C3E}, //2900 #CJK UNIFIED IDEOGRAPH
+ {0x94C4, 0x6C4E}, //2901 #CJK UNIFIED IDEOGRAPH
+ {0x94C5, 0x7248}, //2902 #CJK UNIFIED IDEOGRAPH
+ {0x94C6, 0x72AF}, //2903 #CJK UNIFIED IDEOGRAPH
+ {0x94C7, 0x73ED}, //2904 #CJK UNIFIED IDEOGRAPH
+ {0x94C8, 0x7554}, //2905 #CJK UNIFIED IDEOGRAPH
+ {0x94C9, 0x7E41}, //2906 #CJK UNIFIED IDEOGRAPH
+ {0x94CA, 0x822C}, //2907 #CJK UNIFIED IDEOGRAPH
+ {0x94CB, 0x85E9}, //2908 #CJK UNIFIED IDEOGRAPH
+ {0x94CC, 0x8CA9}, //2909 #CJK UNIFIED IDEOGRAPH
+ {0x94CD, 0x7BC4}, //2910 #CJK UNIFIED IDEOGRAPH
+ {0x94CE, 0x91C6}, //2911 #CJK UNIFIED IDEOGRAPH
+ {0x94CF, 0x7169}, //2912 #CJK UNIFIED IDEOGRAPH
+ {0x94D0, 0x9812}, //2913 #CJK UNIFIED IDEOGRAPH
+ {0x94D1, 0x98EF}, //2914 #CJK UNIFIED IDEOGRAPH
+ {0x94D2, 0x633D}, //2915 #CJK UNIFIED IDEOGRAPH
+ {0x94D3, 0x6669}, //2916 #CJK UNIFIED IDEOGRAPH
+ {0x94D4, 0x756A}, //2917 #CJK UNIFIED IDEOGRAPH
+ {0x94D5, 0x76E4}, //2918 #CJK UNIFIED IDEOGRAPH
+ {0x94D6, 0x78D0}, //2919 #CJK UNIFIED IDEOGRAPH
+ {0x94D7, 0x8543}, //2920 #CJK UNIFIED IDEOGRAPH
+ {0x94D8, 0x86EE}, //2921 #CJK UNIFIED IDEOGRAPH
+ {0x94D9, 0x532A}, //2922 #CJK UNIFIED IDEOGRAPH
+ {0x94DA, 0x5351}, //2923 #CJK UNIFIED IDEOGRAPH
+ {0x94DB, 0x5426}, //2924 #CJK UNIFIED IDEOGRAPH
+ {0x94DC, 0x5983}, //2925 #CJK UNIFIED IDEOGRAPH
+ {0x94DD, 0x5E87}, //2926 #CJK UNIFIED IDEOGRAPH
+ {0x94DE, 0x5F7C}, //2927 #CJK UNIFIED IDEOGRAPH
+ {0x94DF, 0x60B2}, //2928 #CJK UNIFIED IDEOGRAPH
+ {0x94E0, 0x6249}, //2929 #CJK UNIFIED IDEOGRAPH
+ {0x94E1, 0x6279}, //2930 #CJK UNIFIED IDEOGRAPH
+ {0x94E2, 0x62AB}, //2931 #CJK UNIFIED IDEOGRAPH
+ {0x94E3, 0x6590}, //2932 #CJK UNIFIED IDEOGRAPH
+ {0x94E4, 0x6BD4}, //2933 #CJK UNIFIED IDEOGRAPH
+ {0x94E5, 0x6CCC}, //2934 #CJK UNIFIED IDEOGRAPH
+ {0x94E6, 0x75B2}, //2935 #CJK UNIFIED IDEOGRAPH
+ {0x94E7, 0x76AE}, //2936 #CJK UNIFIED IDEOGRAPH
+ {0x94E8, 0x7891}, //2937 #CJK UNIFIED IDEOGRAPH
+ {0x94E9, 0x79D8}, //2938 #CJK UNIFIED IDEOGRAPH
+ {0x94EA, 0x7DCB}, //2939 #CJK UNIFIED IDEOGRAPH
+ {0x94EB, 0x7F77}, //2940 #CJK UNIFIED IDEOGRAPH
+ {0x94EC, 0x80A5}, //2941 #CJK UNIFIED IDEOGRAPH
+ {0x94ED, 0x88AB}, //2942 #CJK UNIFIED IDEOGRAPH
+ {0x94EE, 0x8AB9}, //2943 #CJK UNIFIED IDEOGRAPH
+ {0x94EF, 0x8CBB}, //2944 #CJK UNIFIED IDEOGRAPH
+ {0x94F0, 0x907F}, //2945 #CJK UNIFIED IDEOGRAPH
+ {0x94F1, 0x975E}, //2946 #CJK UNIFIED IDEOGRAPH
+ {0x94F2, 0x98DB}, //2947 #CJK UNIFIED IDEOGRAPH
+ {0x94F3, 0x6A0B}, //2948 #CJK UNIFIED IDEOGRAPH
+ {0x94F4, 0x7C38}, //2949 #CJK UNIFIED IDEOGRAPH
+ {0x94F5, 0x5099}, //2950 #CJK UNIFIED IDEOGRAPH
+ {0x94F6, 0x5C3E}, //2951 #CJK UNIFIED IDEOGRAPH
+ {0x94F7, 0x5FAE}, //2952 #CJK UNIFIED IDEOGRAPH
+ {0x94F8, 0x6787}, //2953 #CJK UNIFIED IDEOGRAPH
+ {0x94F9, 0x6BD8}, //2954 #CJK UNIFIED IDEOGRAPH
+ {0x94FA, 0x7435}, //2955 #CJK UNIFIED IDEOGRAPH
+ {0x94FB, 0x7709}, //2956 #CJK UNIFIED IDEOGRAPH
+ {0x94FC, 0x7F8E}, //2957 #CJK UNIFIED IDEOGRAPH
+ {0x9540, 0x9F3B}, //2958 #CJK UNIFIED IDEOGRAPH
+ {0x9541, 0x67CA}, //2959 #CJK UNIFIED IDEOGRAPH
+ {0x9542, 0x7A17}, //2960 #CJK UNIFIED IDEOGRAPH
+ {0x9543, 0x5339}, //2961 #CJK UNIFIED IDEOGRAPH
+ {0x9544, 0x758B}, //2962 #CJK UNIFIED IDEOGRAPH
+ {0x9545, 0x9AED}, //2963 #CJK UNIFIED IDEOGRAPH
+ {0x9546, 0x5F66}, //2964 #CJK UNIFIED IDEOGRAPH
+ {0x9547, 0x819D}, //2965 #CJK UNIFIED IDEOGRAPH
+ {0x9548, 0x83F1}, //2966 #CJK UNIFIED IDEOGRAPH
+ {0x9549, 0x8098}, //2967 #CJK UNIFIED IDEOGRAPH
+ {0x954A, 0x5F3C}, //2968 #CJK UNIFIED IDEOGRAPH
+ {0x954B, 0x5FC5}, //2969 #CJK UNIFIED IDEOGRAPH
+ {0x954C, 0x7562}, //2970 #CJK UNIFIED IDEOGRAPH
+ {0x954D, 0x7B46}, //2971 #CJK UNIFIED IDEOGRAPH
+ {0x954E, 0x903C}, //2972 #CJK UNIFIED IDEOGRAPH
+ {0x954F, 0x6867}, //2973 #CJK UNIFIED IDEOGRAPH
+ {0x9550, 0x59EB}, //2974 #CJK UNIFIED IDEOGRAPH
+ {0x9551, 0x5A9B}, //2975 #CJK UNIFIED IDEOGRAPH
+ {0x9552, 0x7D10}, //2976 #CJK UNIFIED IDEOGRAPH
+ {0x9553, 0x767E}, //2977 #CJK UNIFIED IDEOGRAPH
+ {0x9554, 0x8B2C}, //2978 #CJK UNIFIED IDEOGRAPH
+ {0x9555, 0x4FF5}, //2979 #CJK UNIFIED IDEOGRAPH
+ {0x9556, 0x5F6A}, //2980 #CJK UNIFIED IDEOGRAPH
+ {0x9557, 0x6A19}, //2981 #CJK UNIFIED IDEOGRAPH
+ {0x9558, 0x6C37}, //2982 #CJK UNIFIED IDEOGRAPH
+ {0x9559, 0x6F02}, //2983 #CJK UNIFIED IDEOGRAPH
+ {0x955A, 0x74E2}, //2984 #CJK UNIFIED IDEOGRAPH
+ {0x955B, 0x7968}, //2985 #CJK UNIFIED IDEOGRAPH
+ {0x955C, 0x8868}, //2986 #CJK UNIFIED IDEOGRAPH
+ {0x955D, 0x8A55}, //2987 #CJK UNIFIED IDEOGRAPH
+ {0x955E, 0x8C79}, //2988 #CJK UNIFIED IDEOGRAPH
+ {0x955F, 0x5EDF}, //2989 #CJK UNIFIED IDEOGRAPH
+ {0x9560, 0x63CF}, //2990 #CJK UNIFIED IDEOGRAPH
+ {0x9561, 0x75C5}, //2991 #CJK UNIFIED IDEOGRAPH
+ {0x9562, 0x79D2}, //2992 #CJK UNIFIED IDEOGRAPH
+ {0x9563, 0x82D7}, //2993 #CJK UNIFIED IDEOGRAPH
+ {0x9564, 0x9328}, //2994 #CJK UNIFIED IDEOGRAPH
+ {0x9565, 0x92F2}, //2995 #CJK UNIFIED IDEOGRAPH
+ {0x9566, 0x849C}, //2996 #CJK UNIFIED IDEOGRAPH
+ {0x9567, 0x86ED}, //2997 #CJK UNIFIED IDEOGRAPH
+ {0x9568, 0x9C2D}, //2998 #CJK UNIFIED IDEOGRAPH
+ {0x9569, 0x54C1}, //2999 #CJK UNIFIED IDEOGRAPH
+ {0x956A, 0x5F6C}, //3000 #CJK UNIFIED IDEOGRAPH
+ {0x956B, 0x658C}, //3001 #CJK UNIFIED IDEOGRAPH
+ {0x956C, 0x6D5C}, //3002 #CJK UNIFIED IDEOGRAPH
+ {0x956D, 0x7015}, //3003 #CJK UNIFIED IDEOGRAPH
+ {0x956E, 0x8CA7}, //3004 #CJK UNIFIED IDEOGRAPH
+ {0x956F, 0x8CD3}, //3005 #CJK UNIFIED IDEOGRAPH
+ {0x9570, 0x983B}, //3006 #CJK UNIFIED IDEOGRAPH
+ {0x9571, 0x654F}, //3007 #CJK UNIFIED IDEOGRAPH
+ {0x9572, 0x74F6}, //3008 #CJK UNIFIED IDEOGRAPH
+ {0x9573, 0x4E0D}, //3009 #CJK UNIFIED IDEOGRAPH
+ {0x9574, 0x4ED8}, //3010 #CJK UNIFIED IDEOGRAPH
+ {0x9575, 0x57E0}, //3011 #CJK UNIFIED IDEOGRAPH
+ {0x9576, 0x592B}, //3012 #CJK UNIFIED IDEOGRAPH
+ {0x9577, 0x5A66}, //3013 #CJK UNIFIED IDEOGRAPH
+ {0x9578, 0x5BCC}, //3014 #CJK UNIFIED IDEOGRAPH
+ {0x9579, 0x51A8}, //3015 #CJK UNIFIED IDEOGRAPH
+ {0x957A, 0x5E03}, //3016 #CJK UNIFIED IDEOGRAPH
+ {0x957B, 0x5E9C}, //3017 #CJK UNIFIED IDEOGRAPH
+ {0x957C, 0x6016}, //3018 #CJK UNIFIED IDEOGRAPH
+ {0x957D, 0x6276}, //3019 #CJK UNIFIED IDEOGRAPH
+ {0x957E, 0x6577}, //3020 #CJK UNIFIED IDEOGRAPH
+ {0x9580, 0x65A7}, //3021 #CJK UNIFIED IDEOGRAPH
+ {0x9581, 0x666E}, //3022 #CJK UNIFIED IDEOGRAPH
+ {0x9582, 0x6D6E}, //3023 #CJK UNIFIED IDEOGRAPH
+ {0x9583, 0x7236}, //3024 #CJK UNIFIED IDEOGRAPH
+ {0x9584, 0x7B26}, //3025 #CJK UNIFIED IDEOGRAPH
+ {0x9585, 0x8150}, //3026 #CJK UNIFIED IDEOGRAPH
+ {0x9586, 0x819A}, //3027 #CJK UNIFIED IDEOGRAPH
+ {0x9587, 0x8299}, //3028 #CJK UNIFIED IDEOGRAPH
+ {0x9588, 0x8B5C}, //3029 #CJK UNIFIED IDEOGRAPH
+ {0x9589, 0x8CA0}, //3030 #CJK UNIFIED IDEOGRAPH
+ {0x958A, 0x8CE6}, //3031 #CJK UNIFIED IDEOGRAPH
+ {0x958B, 0x8D74}, //3032 #CJK UNIFIED IDEOGRAPH
+ {0x958C, 0x961C}, //3033 #CJK UNIFIED IDEOGRAPH
+ {0x958D, 0x9644}, //3034 #CJK UNIFIED IDEOGRAPH
+ {0x958E, 0x4FAE}, //3035 #CJK UNIFIED IDEOGRAPH
+ {0x958F, 0x64AB}, //3036 #CJK UNIFIED IDEOGRAPH
+ {0x9590, 0x6B66}, //3037 #CJK UNIFIED IDEOGRAPH
+ {0x9591, 0x821E}, //3038 #CJK UNIFIED IDEOGRAPH
+ {0x9592, 0x8461}, //3039 #CJK UNIFIED IDEOGRAPH
+ {0x9593, 0x856A}, //3040 #CJK UNIFIED IDEOGRAPH
+ {0x9594, 0x90E8}, //3041 #CJK UNIFIED IDEOGRAPH
+ {0x9595, 0x5C01}, //3042 #CJK UNIFIED IDEOGRAPH
+ {0x9596, 0x6953}, //3043 #CJK UNIFIED IDEOGRAPH
+ {0x9597, 0x98A8}, //3044 #CJK UNIFIED IDEOGRAPH
+ {0x9598, 0x847A}, //3045 #CJK UNIFIED IDEOGRAPH
+ {0x9599, 0x8557}, //3046 #CJK UNIFIED IDEOGRAPH
+ {0x959A, 0x4F0F}, //3047 #CJK UNIFIED IDEOGRAPH
+ {0x959B, 0x526F}, //3048 #CJK UNIFIED IDEOGRAPH
+ {0x959C, 0x5FA9}, //3049 #CJK UNIFIED IDEOGRAPH
+ {0x959D, 0x5E45}, //3050 #CJK UNIFIED IDEOGRAPH
+ {0x959E, 0x670D}, //3051 #CJK UNIFIED IDEOGRAPH
+ {0x959F, 0x798F}, //3052 #CJK UNIFIED IDEOGRAPH
+ {0x95A0, 0x8179}, //3053 #CJK UNIFIED IDEOGRAPH
+ {0x95A1, 0x8907}, //3054 #CJK UNIFIED IDEOGRAPH
+ {0x95A2, 0x8986}, //3055 #CJK UNIFIED IDEOGRAPH
+ {0x95A3, 0x6DF5}, //3056 #CJK UNIFIED IDEOGRAPH
+ {0x95A4, 0x5F17}, //3057 #CJK UNIFIED IDEOGRAPH
+ {0x95A5, 0x6255}, //3058 #CJK UNIFIED IDEOGRAPH
+ {0x95A6, 0x6CB8}, //3059 #CJK UNIFIED IDEOGRAPH
+ {0x95A7, 0x4ECF}, //3060 #CJK UNIFIED IDEOGRAPH
+ {0x95A8, 0x7269}, //3061 #CJK UNIFIED IDEOGRAPH
+ {0x95A9, 0x9B92}, //3062 #CJK UNIFIED IDEOGRAPH
+ {0x95AA, 0x5206}, //3063 #CJK UNIFIED IDEOGRAPH
+ {0x95AB, 0x543B}, //3064 #CJK UNIFIED IDEOGRAPH
+ {0x95AC, 0x5674}, //3065 #CJK UNIFIED IDEOGRAPH
+ {0x95AD, 0x58B3}, //3066 #CJK UNIFIED IDEOGRAPH
+ {0x95AE, 0x61A4}, //3067 #CJK UNIFIED IDEOGRAPH
+ {0x95AF, 0x626E}, //3068 #CJK UNIFIED IDEOGRAPH
+ {0x95B0, 0x711A}, //3069 #CJK UNIFIED IDEOGRAPH
+ {0x95B1, 0x596E}, //3070 #CJK UNIFIED IDEOGRAPH
+ {0x95B2, 0x7C89}, //3071 #CJK UNIFIED IDEOGRAPH
+ {0x95B3, 0x7CDE}, //3072 #CJK UNIFIED IDEOGRAPH
+ {0x95B4, 0x7D1B}, //3073 #CJK UNIFIED IDEOGRAPH
+ {0x95B5, 0x96F0}, //3074 #CJK UNIFIED IDEOGRAPH
+ {0x95B6, 0x6587}, //3075 #CJK UNIFIED IDEOGRAPH
+ {0x95B7, 0x805E}, //3076 #CJK UNIFIED IDEOGRAPH
+ {0x95B8, 0x4E19}, //3077 #CJK UNIFIED IDEOGRAPH
+ {0x95B9, 0x4F75}, //3078 #CJK UNIFIED IDEOGRAPH
+ {0x95BA, 0x5175}, //3079 #CJK UNIFIED IDEOGRAPH
+ {0x95BB, 0x5840}, //3080 #CJK UNIFIED IDEOGRAPH
+ {0x95BC, 0x5E63}, //3081 #CJK UNIFIED IDEOGRAPH
+ {0x95BD, 0x5E73}, //3082 #CJK UNIFIED IDEOGRAPH
+ {0x95BE, 0x5F0A}, //3083 #CJK UNIFIED IDEOGRAPH
+ {0x95BF, 0x67C4}, //3084 #CJK UNIFIED IDEOGRAPH
+ {0x95C0, 0x4E26}, //3085 #CJK UNIFIED IDEOGRAPH
+ {0x95C1, 0x853D}, //3086 #CJK UNIFIED IDEOGRAPH
+ {0x95C2, 0x9589}, //3087 #CJK UNIFIED IDEOGRAPH
+ {0x95C3, 0x965B}, //3088 #CJK UNIFIED IDEOGRAPH
+ {0x95C4, 0x7C73}, //3089 #CJK UNIFIED IDEOGRAPH
+ {0x95C5, 0x9801}, //3090 #CJK UNIFIED IDEOGRAPH
+ {0x95C6, 0x50FB}, //3091 #CJK UNIFIED IDEOGRAPH
+ {0x95C7, 0x58C1}, //3092 #CJK UNIFIED IDEOGRAPH
+ {0x95C8, 0x7656}, //3093 #CJK UNIFIED IDEOGRAPH
+ {0x95C9, 0x78A7}, //3094 #CJK UNIFIED IDEOGRAPH
+ {0x95CA, 0x5225}, //3095 #CJK UNIFIED IDEOGRAPH
+ {0x95CB, 0x77A5}, //3096 #CJK UNIFIED IDEOGRAPH
+ {0x95CC, 0x8511}, //3097 #CJK UNIFIED IDEOGRAPH
+ {0x95CD, 0x7B86}, //3098 #CJK UNIFIED IDEOGRAPH
+ {0x95CE, 0x504F}, //3099 #CJK UNIFIED IDEOGRAPH
+ {0x95CF, 0x5909}, //3100 #CJK UNIFIED IDEOGRAPH
+ {0x95D0, 0x7247}, //3101 #CJK UNIFIED IDEOGRAPH
+ {0x95D1, 0x7BC7}, //3102 #CJK UNIFIED IDEOGRAPH
+ {0x95D2, 0x7DE8}, //3103 #CJK UNIFIED IDEOGRAPH
+ {0x95D3, 0x8FBA}, //3104 #CJK UNIFIED IDEOGRAPH
+ {0x95D4, 0x8FD4}, //3105 #CJK UNIFIED IDEOGRAPH
+ {0x95D5, 0x904D}, //3106 #CJK UNIFIED IDEOGRAPH
+ {0x95D6, 0x4FBF}, //3107 #CJK UNIFIED IDEOGRAPH
+ {0x95D7, 0x52C9}, //3108 #CJK UNIFIED IDEOGRAPH
+ {0x95D8, 0x5A29}, //3109 #CJK UNIFIED IDEOGRAPH
+ {0x95D9, 0x5F01}, //3110 #CJK UNIFIED IDEOGRAPH
+ {0x95DA, 0x97AD}, //3111 #CJK UNIFIED IDEOGRAPH
+ {0x95DB, 0x4FDD}, //3112 #CJK UNIFIED IDEOGRAPH
+ {0x95DC, 0x8217}, //3113 #CJK UNIFIED IDEOGRAPH
+ {0x95DD, 0x92EA}, //3114 #CJK UNIFIED IDEOGRAPH
+ {0x95DE, 0x5703}, //3115 #CJK UNIFIED IDEOGRAPH
+ {0x95DF, 0x6355}, //3116 #CJK UNIFIED IDEOGRAPH
+ {0x95E0, 0x6B69}, //3117 #CJK UNIFIED IDEOGRAPH
+ {0x95E1, 0x752B}, //3118 #CJK UNIFIED IDEOGRAPH
+ {0x95E2, 0x88DC}, //3119 #CJK UNIFIED IDEOGRAPH
+ {0x95E3, 0x8F14}, //3120 #CJK UNIFIED IDEOGRAPH
+ {0x95E4, 0x7A42}, //3121 #CJK UNIFIED IDEOGRAPH
+ {0x95E5, 0x52DF}, //3122 #CJK UNIFIED IDEOGRAPH
+ {0x95E6, 0x5893}, //3123 #CJK UNIFIED IDEOGRAPH
+ {0x95E7, 0x6155}, //3124 #CJK UNIFIED IDEOGRAPH
+ {0x95E8, 0x620A}, //3125 #CJK UNIFIED IDEOGRAPH
+ {0x95E9, 0x66AE}, //3126 #CJK UNIFIED IDEOGRAPH
+ {0x95EA, 0x6BCD}, //3127 #CJK UNIFIED IDEOGRAPH
+ {0x95EB, 0x7C3F}, //3128 #CJK UNIFIED IDEOGRAPH
+ {0x95EC, 0x83E9}, //3129 #CJK UNIFIED IDEOGRAPH
+ {0x95ED, 0x5023}, //3130 #CJK UNIFIED IDEOGRAPH
+ {0x95EE, 0x4FF8}, //3131 #CJK UNIFIED IDEOGRAPH
+ {0x95EF, 0x5305}, //3132 #CJK UNIFIED IDEOGRAPH
+ {0x95F0, 0x5446}, //3133 #CJK UNIFIED IDEOGRAPH
+ {0x95F1, 0x5831}, //3134 #CJK UNIFIED IDEOGRAPH
+ {0x95F2, 0x5949}, //3135 #CJK UNIFIED IDEOGRAPH
+ {0x95F3, 0x5B9D}, //3136 #CJK UNIFIED IDEOGRAPH
+ {0x95F4, 0x5CF0}, //3137 #CJK UNIFIED IDEOGRAPH
+ {0x95F5, 0x5CEF}, //3138 #CJK UNIFIED IDEOGRAPH
+ {0x95F6, 0x5D29}, //3139 #CJK UNIFIED IDEOGRAPH
+ {0x95F7, 0x5E96}, //3140 #CJK UNIFIED IDEOGRAPH
+ {0x95F8, 0x62B1}, //3141 #CJK UNIFIED IDEOGRAPH
+ {0x95F9, 0x6367}, //3142 #CJK UNIFIED IDEOGRAPH
+ {0x95FA, 0x653E}, //3143 #CJK UNIFIED IDEOGRAPH
+ {0x95FB, 0x65B9}, //3144 #CJK UNIFIED IDEOGRAPH
+ {0x95FC, 0x670B}, //3145 #CJK UNIFIED IDEOGRAPH
+ {0x9640, 0x6CD5}, //3146 #CJK UNIFIED IDEOGRAPH
+ {0x9641, 0x6CE1}, //3147 #CJK UNIFIED IDEOGRAPH
+ {0x9642, 0x70F9}, //3148 #CJK UNIFIED IDEOGRAPH
+ {0x9643, 0x7832}, //3149 #CJK UNIFIED IDEOGRAPH
+ {0x9644, 0x7E2B}, //3150 #CJK UNIFIED IDEOGRAPH
+ {0x9645, 0x80DE}, //3151 #CJK UNIFIED IDEOGRAPH
+ {0x9646, 0x82B3}, //3152 #CJK UNIFIED IDEOGRAPH
+ {0x9647, 0x840C}, //3153 #CJK UNIFIED IDEOGRAPH
+ {0x9648, 0x84EC}, //3154 #CJK UNIFIED IDEOGRAPH
+ {0x9649, 0x8702}, //3155 #CJK UNIFIED IDEOGRAPH
+ {0x964A, 0x8912}, //3156 #CJK UNIFIED IDEOGRAPH
+ {0x964B, 0x8A2A}, //3157 #CJK UNIFIED IDEOGRAPH
+ {0x964C, 0x8C4A}, //3158 #CJK UNIFIED IDEOGRAPH
+ {0x964D, 0x90A6}, //3159 #CJK UNIFIED IDEOGRAPH
+ {0x964E, 0x92D2}, //3160 #CJK UNIFIED IDEOGRAPH
+ {0x964F, 0x98FD}, //3161 #CJK UNIFIED IDEOGRAPH
+ {0x9650, 0x9CF3}, //3162 #CJK UNIFIED IDEOGRAPH
+ {0x9651, 0x9D6C}, //3163 #CJK UNIFIED IDEOGRAPH
+ {0x9652, 0x4E4F}, //3164 #CJK UNIFIED IDEOGRAPH
+ {0x9653, 0x4EA1}, //3165 #CJK UNIFIED IDEOGRAPH
+ {0x9654, 0x508D}, //3166 #CJK UNIFIED IDEOGRAPH
+ {0x9655, 0x5256}, //3167 #CJK UNIFIED IDEOGRAPH
+ {0x9656, 0x574A}, //3168 #CJK UNIFIED IDEOGRAPH
+ {0x9657, 0x59A8}, //3169 #CJK UNIFIED IDEOGRAPH
+ {0x9658, 0x5E3D}, //3170 #CJK UNIFIED IDEOGRAPH
+ {0x9659, 0x5FD8}, //3171 #CJK UNIFIED IDEOGRAPH
+ {0x965A, 0x5FD9}, //3172 #CJK UNIFIED IDEOGRAPH
+ {0x965B, 0x623F}, //3173 #CJK UNIFIED IDEOGRAPH
+ {0x965C, 0x66B4}, //3174 #CJK UNIFIED IDEOGRAPH
+ {0x965D, 0x671B}, //3175 #CJK UNIFIED IDEOGRAPH
+ {0x965E, 0x67D0}, //3176 #CJK UNIFIED IDEOGRAPH
+ {0x965F, 0x68D2}, //3177 #CJK UNIFIED IDEOGRAPH
+ {0x9660, 0x5192}, //3178 #CJK UNIFIED IDEOGRAPH
+ {0x9661, 0x7D21}, //3179 #CJK UNIFIED IDEOGRAPH
+ {0x9662, 0x80AA}, //3180 #CJK UNIFIED IDEOGRAPH
+ {0x9663, 0x81A8}, //3181 #CJK UNIFIED IDEOGRAPH
+ {0x9664, 0x8B00}, //3182 #CJK UNIFIED IDEOGRAPH
+ {0x9665, 0x8C8C}, //3183 #CJK UNIFIED IDEOGRAPH
+ {0x9666, 0x8CBF}, //3184 #CJK UNIFIED IDEOGRAPH
+ {0x9667, 0x927E}, //3185 #CJK UNIFIED IDEOGRAPH
+ {0x9668, 0x9632}, //3186 #CJK UNIFIED IDEOGRAPH
+ {0x9669, 0x5420}, //3187 #CJK UNIFIED IDEOGRAPH
+ {0x966A, 0x982C}, //3188 #CJK UNIFIED IDEOGRAPH
+ {0x966B, 0x5317}, //3189 #CJK UNIFIED IDEOGRAPH
+ {0x966C, 0x50D5}, //3190 #CJK UNIFIED IDEOGRAPH
+ {0x966D, 0x535C}, //3191 #CJK UNIFIED IDEOGRAPH
+ {0x966E, 0x58A8}, //3192 #CJK UNIFIED IDEOGRAPH
+ {0x966F, 0x64B2}, //3193 #CJK UNIFIED IDEOGRAPH
+ {0x9670, 0x6734}, //3194 #CJK UNIFIED IDEOGRAPH
+ {0x9671, 0x7267}, //3195 #CJK UNIFIED IDEOGRAPH
+ {0x9672, 0x7766}, //3196 #CJK UNIFIED IDEOGRAPH
+ {0x9673, 0x7A46}, //3197 #CJK UNIFIED IDEOGRAPH
+ {0x9674, 0x91E6}, //3198 #CJK UNIFIED IDEOGRAPH
+ {0x9675, 0x52C3}, //3199 #CJK UNIFIED IDEOGRAPH
+ {0x9676, 0x6CA1}, //3200 #CJK UNIFIED IDEOGRAPH
+ {0x9677, 0x6B86}, //3201 #CJK UNIFIED IDEOGRAPH
+ {0x9678, 0x5800}, //3202 #CJK UNIFIED IDEOGRAPH
+ {0x9679, 0x5E4C}, //3203 #CJK UNIFIED IDEOGRAPH
+ {0x967A, 0x5954}, //3204 #CJK UNIFIED IDEOGRAPH
+ {0x967B, 0x672C}, //3205 #CJK UNIFIED IDEOGRAPH
+ {0x967C, 0x7FFB}, //3206 #CJK UNIFIED IDEOGRAPH
+ {0x967D, 0x51E1}, //3207 #CJK UNIFIED IDEOGRAPH
+ {0x967E, 0x76C6}, //3208 #CJK UNIFIED IDEOGRAPH
+ {0x9680, 0x6469}, //3209 #CJK UNIFIED IDEOGRAPH
+ {0x9681, 0x78E8}, //3210 #CJK UNIFIED IDEOGRAPH
+ {0x9682, 0x9B54}, //3211 #CJK UNIFIED IDEOGRAPH
+ {0x9683, 0x9EBB}, //3212 #CJK UNIFIED IDEOGRAPH
+ {0x9684, 0x57CB}, //3213 #CJK UNIFIED IDEOGRAPH
+ {0x9685, 0x59B9}, //3214 #CJK UNIFIED IDEOGRAPH
+ {0x9686, 0x6627}, //3215 #CJK UNIFIED IDEOGRAPH
+ {0x9687, 0x679A}, //3216 #CJK UNIFIED IDEOGRAPH
+ {0x9688, 0x6BCE}, //3217 #CJK UNIFIED IDEOGRAPH
+ {0x9689, 0x54E9}, //3218 #CJK UNIFIED IDEOGRAPH
+ {0x968A, 0x69D9}, //3219 #CJK UNIFIED IDEOGRAPH
+ {0x968B, 0x5E55}, //3220 #CJK UNIFIED IDEOGRAPH
+ {0x968C, 0x819C}, //3221 #CJK UNIFIED IDEOGRAPH
+ {0x968D, 0x6795}, //3222 #CJK UNIFIED IDEOGRAPH
+ {0x968E, 0x9BAA}, //3223 #CJK UNIFIED IDEOGRAPH
+ {0x968F, 0x67FE}, //3224 #CJK UNIFIED IDEOGRAPH
+ {0x9690, 0x9C52}, //3225 #CJK UNIFIED IDEOGRAPH
+ {0x9691, 0x685D}, //3226 #CJK UNIFIED IDEOGRAPH
+ {0x9692, 0x4EA6}, //3227 #CJK UNIFIED IDEOGRAPH
+ {0x9693, 0x4FE3}, //3228 #CJK UNIFIED IDEOGRAPH
+ {0x9694, 0x53C8}, //3229 #CJK UNIFIED IDEOGRAPH
+ {0x9695, 0x62B9}, //3230 #CJK UNIFIED IDEOGRAPH
+ {0x9696, 0x672B}, //3231 #CJK UNIFIED IDEOGRAPH
+ {0x9697, 0x6CAB}, //3232 #CJK UNIFIED IDEOGRAPH
+ {0x9698, 0x8FC4}, //3233 #CJK UNIFIED IDEOGRAPH
+ {0x9699, 0x4FAD}, //3234 #CJK UNIFIED IDEOGRAPH
+ {0x969A, 0x7E6D}, //3235 #CJK UNIFIED IDEOGRAPH
+ {0x969B, 0x9EBF}, //3236 #CJK UNIFIED IDEOGRAPH
+ {0x969C, 0x4E07}, //3237 #CJK UNIFIED IDEOGRAPH
+ {0x969D, 0x6162}, //3238 #CJK UNIFIED IDEOGRAPH
+ {0x969E, 0x6E80}, //3239 #CJK UNIFIED IDEOGRAPH
+ {0x969F, 0x6F2B}, //3240 #CJK UNIFIED IDEOGRAPH
+ {0x96A0, 0x8513}, //3241 #CJK UNIFIED IDEOGRAPH
+ {0x96A1, 0x5473}, //3242 #CJK UNIFIED IDEOGRAPH
+ {0x96A2, 0x672A}, //3243 #CJK UNIFIED IDEOGRAPH
+ {0x96A3, 0x9B45}, //3244 #CJK UNIFIED IDEOGRAPH
+ {0x96A4, 0x5DF3}, //3245 #CJK UNIFIED IDEOGRAPH
+ {0x96A5, 0x7B95}, //3246 #CJK UNIFIED IDEOGRAPH
+ {0x96A6, 0x5CAC}, //3247 #CJK UNIFIED IDEOGRAPH
+ {0x96A7, 0x5BC6}, //3248 #CJK UNIFIED IDEOGRAPH
+ {0x96A8, 0x871C}, //3249 #CJK UNIFIED IDEOGRAPH
+ {0x96A9, 0x6E4A}, //3250 #CJK UNIFIED IDEOGRAPH
+ {0x96AA, 0x84D1}, //3251 #CJK UNIFIED IDEOGRAPH
+ {0x96AB, 0x7A14}, //3252 #CJK UNIFIED IDEOGRAPH
+ {0x96AC, 0x8108}, //3253 #CJK UNIFIED IDEOGRAPH
+ {0x96AD, 0x5999}, //3254 #CJK UNIFIED IDEOGRAPH
+ {0x96AE, 0x7C8D}, //3255 #CJK UNIFIED IDEOGRAPH
+ {0x96AF, 0x6C11}, //3256 #CJK UNIFIED IDEOGRAPH
+ {0x96B0, 0x7720}, //3257 #CJK UNIFIED IDEOGRAPH
+ {0x96B1, 0x52D9}, //3258 #CJK UNIFIED IDEOGRAPH
+ {0x96B2, 0x5922}, //3259 #CJK UNIFIED IDEOGRAPH
+ {0x96B3, 0x7121}, //3260 #CJK UNIFIED IDEOGRAPH
+ {0x96B4, 0x725F}, //3261 #CJK UNIFIED IDEOGRAPH
+ {0x96B5, 0x77DB}, //3262 #CJK UNIFIED IDEOGRAPH
+ {0x96B6, 0x9727}, //3263 #CJK UNIFIED IDEOGRAPH
+ {0x96B7, 0x9D61}, //3264 #CJK UNIFIED IDEOGRAPH
+ {0x96B8, 0x690B}, //3265 #CJK UNIFIED IDEOGRAPH
+ {0x96B9, 0x5A7F}, //3266 #CJK UNIFIED IDEOGRAPH
+ {0x96BA, 0x5A18}, //3267 #CJK UNIFIED IDEOGRAPH
+ {0x96BB, 0x51A5}, //3268 #CJK UNIFIED IDEOGRAPH
+ {0x96BC, 0x540D}, //3269 #CJK UNIFIED IDEOGRAPH
+ {0x96BD, 0x547D}, //3270 #CJK UNIFIED IDEOGRAPH
+ {0x96BE, 0x660E}, //3271 #CJK UNIFIED IDEOGRAPH
+ {0x96BF, 0x76DF}, //3272 #CJK UNIFIED IDEOGRAPH
+ {0x96C0, 0x8FF7}, //3273 #CJK UNIFIED IDEOGRAPH
+ {0x96C1, 0x9298}, //3274 #CJK UNIFIED IDEOGRAPH
+ {0x96C2, 0x9CF4}, //3275 #CJK UNIFIED IDEOGRAPH
+ {0x96C3, 0x59EA}, //3276 #CJK UNIFIED IDEOGRAPH
+ {0x96C4, 0x725D}, //3277 #CJK UNIFIED IDEOGRAPH
+ {0x96C5, 0x6EC5}, //3278 #CJK UNIFIED IDEOGRAPH
+ {0x96C6, 0x514D}, //3279 #CJK UNIFIED IDEOGRAPH
+ {0x96C7, 0x68C9}, //3280 #CJK UNIFIED IDEOGRAPH
+ {0x96C8, 0x7DBF}, //3281 #CJK UNIFIED IDEOGRAPH
+ {0x96C9, 0x7DEC}, //3282 #CJK UNIFIED IDEOGRAPH
+ {0x96CA, 0x9762}, //3283 #CJK UNIFIED IDEOGRAPH
+ {0x96CB, 0x9EBA}, //3284 #CJK UNIFIED IDEOGRAPH
+ {0x96CC, 0x6478}, //3285 #CJK UNIFIED IDEOGRAPH
+ {0x96CD, 0x6A21}, //3286 #CJK UNIFIED IDEOGRAPH
+ {0x96CE, 0x8302}, //3287 #CJK UNIFIED IDEOGRAPH
+ {0x96CF, 0x5984}, //3288 #CJK UNIFIED IDEOGRAPH
+ {0x96D0, 0x5B5F}, //3289 #CJK UNIFIED IDEOGRAPH
+ {0x96D1, 0x6BDB}, //3290 #CJK UNIFIED IDEOGRAPH
+ {0x96D2, 0x731B}, //3291 #CJK UNIFIED IDEOGRAPH
+ {0x96D3, 0x76F2}, //3292 #CJK UNIFIED IDEOGRAPH
+ {0x96D4, 0x7DB2}, //3293 #CJK UNIFIED IDEOGRAPH
+ {0x96D5, 0x8017}, //3294 #CJK UNIFIED IDEOGRAPH
+ {0x96D6, 0x8499}, //3295 #CJK UNIFIED IDEOGRAPH
+ {0x96D7, 0x5132}, //3296 #CJK UNIFIED IDEOGRAPH
+ {0x96D8, 0x6728}, //3297 #CJK UNIFIED IDEOGRAPH
+ {0x96D9, 0x9ED9}, //3298 #CJK UNIFIED IDEOGRAPH
+ {0x96DA, 0x76EE}, //3299 #CJK UNIFIED IDEOGRAPH
+ {0x96DB, 0x6762}, //3300 #CJK UNIFIED IDEOGRAPH
+ {0x96DC, 0x52FF}, //3301 #CJK UNIFIED IDEOGRAPH
+ {0x96DD, 0x9905}, //3302 #CJK UNIFIED IDEOGRAPH
+ {0x96DE, 0x5C24}, //3303 #CJK UNIFIED IDEOGRAPH
+ {0x96DF, 0x623B}, //3304 #CJK UNIFIED IDEOGRAPH
+ {0x96E0, 0x7C7E}, //3305 #CJK UNIFIED IDEOGRAPH
+ {0x96E1, 0x8CB0}, //3306 #CJK UNIFIED IDEOGRAPH
+ {0x96E2, 0x554F}, //3307 #CJK UNIFIED IDEOGRAPH
+ {0x96E3, 0x60B6}, //3308 #CJK UNIFIED IDEOGRAPH
+ {0x96E4, 0x7D0B}, //3309 #CJK UNIFIED IDEOGRAPH
+ {0x96E5, 0x9580}, //3310 #CJK UNIFIED IDEOGRAPH
+ {0x96E6, 0x5301}, //3311 #CJK UNIFIED IDEOGRAPH
+ {0x96E7, 0x4E5F}, //3312 #CJK UNIFIED IDEOGRAPH
+ {0x96E8, 0x51B6}, //3313 #CJK UNIFIED IDEOGRAPH
+ {0x96E9, 0x591C}, //3314 #CJK UNIFIED IDEOGRAPH
+ {0x96EA, 0x723A}, //3315 #CJK UNIFIED IDEOGRAPH
+ {0x96EB, 0x8036}, //3316 #CJK UNIFIED IDEOGRAPH
+ {0x96EC, 0x91CE}, //3317 #CJK UNIFIED IDEOGRAPH
+ {0x96ED, 0x5F25}, //3318 #CJK UNIFIED IDEOGRAPH
+ {0x96EE, 0x77E2}, //3319 #CJK UNIFIED IDEOGRAPH
+ {0x96EF, 0x5384}, //3320 #CJK UNIFIED IDEOGRAPH
+ {0x96F0, 0x5F79}, //3321 #CJK UNIFIED IDEOGRAPH
+ {0x96F1, 0x7D04}, //3322 #CJK UNIFIED IDEOGRAPH
+ {0x96F2, 0x85AC}, //3323 #CJK UNIFIED IDEOGRAPH
+ {0x96F3, 0x8A33}, //3324 #CJK UNIFIED IDEOGRAPH
+ {0x96F4, 0x8E8D}, //3325 #CJK UNIFIED IDEOGRAPH
+ {0x96F5, 0x9756}, //3326 #CJK UNIFIED IDEOGRAPH
+ {0x96F6, 0x67F3}, //3327 #CJK UNIFIED IDEOGRAPH
+ {0x96F7, 0x85AE}, //3328 #CJK UNIFIED IDEOGRAPH
+ {0x96F8, 0x9453}, //3329 #CJK UNIFIED IDEOGRAPH
+ {0x96F9, 0x6109}, //3330 #CJK UNIFIED IDEOGRAPH
+ {0x96FA, 0x6108}, //3331 #CJK UNIFIED IDEOGRAPH
+ {0x96FB, 0x6CB9}, //3332 #CJK UNIFIED IDEOGRAPH
+ {0x96FC, 0x7652}, //3333 #CJK UNIFIED IDEOGRAPH
+ {0x9740, 0x8AED}, //3334 #CJK UNIFIED IDEOGRAPH
+ {0x9741, 0x8F38}, //3335 #CJK UNIFIED IDEOGRAPH
+ {0x9742, 0x552F}, //3336 #CJK UNIFIED IDEOGRAPH
+ {0x9743, 0x4F51}, //3337 #CJK UNIFIED IDEOGRAPH
+ {0x9744, 0x512A}, //3338 #CJK UNIFIED IDEOGRAPH
+ {0x9745, 0x52C7}, //3339 #CJK UNIFIED IDEOGRAPH
+ {0x9746, 0x53CB}, //3340 #CJK UNIFIED IDEOGRAPH
+ {0x9747, 0x5BA5}, //3341 #CJK UNIFIED IDEOGRAPH
+ {0x9748, 0x5E7D}, //3342 #CJK UNIFIED IDEOGRAPH
+ {0x9749, 0x60A0}, //3343 #CJK UNIFIED IDEOGRAPH
+ {0x974A, 0x6182}, //3344 #CJK UNIFIED IDEOGRAPH
+ {0x974B, 0x63D6}, //3345 #CJK UNIFIED IDEOGRAPH
+ {0x974C, 0x6709}, //3346 #CJK UNIFIED IDEOGRAPH
+ {0x974D, 0x67DA}, //3347 #CJK UNIFIED IDEOGRAPH
+ {0x974E, 0x6E67}, //3348 #CJK UNIFIED IDEOGRAPH
+ {0x974F, 0x6D8C}, //3349 #CJK UNIFIED IDEOGRAPH
+ {0x9750, 0x7336}, //3350 #CJK UNIFIED IDEOGRAPH
+ {0x9751, 0x7337}, //3351 #CJK UNIFIED IDEOGRAPH
+ {0x9752, 0x7531}, //3352 #CJK UNIFIED IDEOGRAPH
+ {0x9753, 0x7950}, //3353 #CJK UNIFIED IDEOGRAPH
+ {0x9754, 0x88D5}, //3354 #CJK UNIFIED IDEOGRAPH
+ {0x9755, 0x8A98}, //3355 #CJK UNIFIED IDEOGRAPH
+ {0x9756, 0x904A}, //3356 #CJK UNIFIED IDEOGRAPH
+ {0x9757, 0x9091}, //3357 #CJK UNIFIED IDEOGRAPH
+ {0x9758, 0x90F5}, //3358 #CJK UNIFIED IDEOGRAPH
+ {0x9759, 0x96C4}, //3359 #CJK UNIFIED IDEOGRAPH
+ {0x975A, 0x878D}, //3360 #CJK UNIFIED IDEOGRAPH
+ {0x975B, 0x5915}, //3361 #CJK UNIFIED IDEOGRAPH
+ {0x975C, 0x4E88}, //3362 #CJK UNIFIED IDEOGRAPH
+ {0x975D, 0x4F59}, //3363 #CJK UNIFIED IDEOGRAPH
+ {0x975E, 0x4E0E}, //3364 #CJK UNIFIED IDEOGRAPH
+ {0x975F, 0x8A89}, //3365 #CJK UNIFIED IDEOGRAPH
+ {0x9760, 0x8F3F}, //3366 #CJK UNIFIED IDEOGRAPH
+ {0x9761, 0x9810}, //3367 #CJK UNIFIED IDEOGRAPH
+ {0x9762, 0x50AD}, //3368 #CJK UNIFIED IDEOGRAPH
+ {0x9763, 0x5E7C}, //3369 #CJK UNIFIED IDEOGRAPH
+ {0x9764, 0x5996}, //3370 #CJK UNIFIED IDEOGRAPH
+ {0x9765, 0x5BB9}, //3371 #CJK UNIFIED IDEOGRAPH
+ {0x9766, 0x5EB8}, //3372 #CJK UNIFIED IDEOGRAPH
+ {0x9767, 0x63DA}, //3373 #CJK UNIFIED IDEOGRAPH
+ {0x9768, 0x63FA}, //3374 #CJK UNIFIED IDEOGRAPH
+ {0x9769, 0x64C1}, //3375 #CJK UNIFIED IDEOGRAPH
+ {0x976A, 0x66DC}, //3376 #CJK UNIFIED IDEOGRAPH
+ {0x976B, 0x694A}, //3377 #CJK UNIFIED IDEOGRAPH
+ {0x976C, 0x69D8}, //3378 #CJK UNIFIED IDEOGRAPH
+ {0x976D, 0x6D0B}, //3379 #CJK UNIFIED IDEOGRAPH
+ {0x976E, 0x6EB6}, //3380 #CJK UNIFIED IDEOGRAPH
+ {0x976F, 0x7194}, //3381 #CJK UNIFIED IDEOGRAPH
+ {0x9770, 0x7528}, //3382 #CJK UNIFIED IDEOGRAPH
+ {0x9771, 0x7AAF}, //3383 #CJK UNIFIED IDEOGRAPH
+ {0x9772, 0x7F8A}, //3384 #CJK UNIFIED IDEOGRAPH
+ {0x9773, 0x8000}, //3385 #CJK UNIFIED IDEOGRAPH
+ {0x9774, 0x8449}, //3386 #CJK UNIFIED IDEOGRAPH
+ {0x9775, 0x84C9}, //3387 #CJK UNIFIED IDEOGRAPH
+ {0x9776, 0x8981}, //3388 #CJK UNIFIED IDEOGRAPH
+ {0x9777, 0x8B21}, //3389 #CJK UNIFIED IDEOGRAPH
+ {0x9778, 0x8E0A}, //3390 #CJK UNIFIED IDEOGRAPH
+ {0x9779, 0x9065}, //3391 #CJK UNIFIED IDEOGRAPH
+ {0x977A, 0x967D}, //3392 #CJK UNIFIED IDEOGRAPH
+ {0x977B, 0x990A}, //3393 #CJK UNIFIED IDEOGRAPH
+ {0x977C, 0x617E}, //3394 #CJK UNIFIED IDEOGRAPH
+ {0x977D, 0x6291}, //3395 #CJK UNIFIED IDEOGRAPH
+ {0x977E, 0x6B32}, //3396 #CJK UNIFIED IDEOGRAPH
+ {0x9780, 0x6C83}, //3397 #CJK UNIFIED IDEOGRAPH
+ {0x9781, 0x6D74}, //3398 #CJK UNIFIED IDEOGRAPH
+ {0x9782, 0x7FCC}, //3399 #CJK UNIFIED IDEOGRAPH
+ {0x9783, 0x7FFC}, //3400 #CJK UNIFIED IDEOGRAPH
+ {0x9784, 0x6DC0}, //3401 #CJK UNIFIED IDEOGRAPH
+ {0x9785, 0x7F85}, //3402 #CJK UNIFIED IDEOGRAPH
+ {0x9786, 0x87BA}, //3403 #CJK UNIFIED IDEOGRAPH
+ {0x9787, 0x88F8}, //3404 #CJK UNIFIED IDEOGRAPH
+ {0x9788, 0x6765}, //3405 #CJK UNIFIED IDEOGRAPH
+ {0x9789, 0x83B1}, //3406 #CJK UNIFIED IDEOGRAPH
+ {0x978A, 0x983C}, //3407 #CJK UNIFIED IDEOGRAPH
+ {0x978B, 0x96F7}, //3408 #CJK UNIFIED IDEOGRAPH
+ {0x978C, 0x6D1B}, //3409 #CJK UNIFIED IDEOGRAPH
+ {0x978D, 0x7D61}, //3410 #CJK UNIFIED IDEOGRAPH
+ {0x978E, 0x843D}, //3411 #CJK UNIFIED IDEOGRAPH
+ {0x978F, 0x916A}, //3412 #CJK UNIFIED IDEOGRAPH
+ {0x9790, 0x4E71}, //3413 #CJK UNIFIED IDEOGRAPH
+ {0x9791, 0x5375}, //3414 #CJK UNIFIED IDEOGRAPH
+ {0x9792, 0x5D50}, //3415 #CJK UNIFIED IDEOGRAPH
+ {0x9793, 0x6B04}, //3416 #CJK UNIFIED IDEOGRAPH
+ {0x9794, 0x6FEB}, //3417 #CJK UNIFIED IDEOGRAPH
+ {0x9795, 0x85CD}, //3418 #CJK UNIFIED IDEOGRAPH
+ {0x9796, 0x862D}, //3419 #CJK UNIFIED IDEOGRAPH
+ {0x9797, 0x89A7}, //3420 #CJK UNIFIED IDEOGRAPH
+ {0x9798, 0x5229}, //3421 #CJK UNIFIED IDEOGRAPH
+ {0x9799, 0x540F}, //3422 #CJK UNIFIED IDEOGRAPH
+ {0x979A, 0x5C65}, //3423 #CJK UNIFIED IDEOGRAPH
+ {0x979B, 0x674E}, //3424 #CJK UNIFIED IDEOGRAPH
+ {0x979C, 0x68A8}, //3425 #CJK UNIFIED IDEOGRAPH
+ {0x979D, 0x7406}, //3426 #CJK UNIFIED IDEOGRAPH
+ {0x979E, 0x7483}, //3427 #CJK UNIFIED IDEOGRAPH
+ {0x979F, 0x75E2}, //3428 #CJK UNIFIED IDEOGRAPH
+ {0x97A0, 0x88CF}, //3429 #CJK UNIFIED IDEOGRAPH
+ {0x97A1, 0x88E1}, //3430 #CJK UNIFIED IDEOGRAPH
+ {0x97A2, 0x91CC}, //3431 #CJK UNIFIED IDEOGRAPH
+ {0x97A3, 0x96E2}, //3432 #CJK UNIFIED IDEOGRAPH
+ {0x97A4, 0x9678}, //3433 #CJK UNIFIED IDEOGRAPH
+ {0x97A5, 0x5F8B}, //3434 #CJK UNIFIED IDEOGRAPH
+ {0x97A6, 0x7387}, //3435 #CJK UNIFIED IDEOGRAPH
+ {0x97A7, 0x7ACB}, //3436 #CJK UNIFIED IDEOGRAPH
+ {0x97A8, 0x844E}, //3437 #CJK UNIFIED IDEOGRAPH
+ {0x97A9, 0x63A0}, //3438 #CJK UNIFIED IDEOGRAPH
+ {0x97AA, 0x7565}, //3439 #CJK UNIFIED IDEOGRAPH
+ {0x97AB, 0x5289}, //3440 #CJK UNIFIED IDEOGRAPH
+ {0x97AC, 0x6D41}, //3441 #CJK UNIFIED IDEOGRAPH
+ {0x97AD, 0x6E9C}, //3442 #CJK UNIFIED IDEOGRAPH
+ {0x97AE, 0x7409}, //3443 #CJK UNIFIED IDEOGRAPH
+ {0x97AF, 0x7559}, //3444 #CJK UNIFIED IDEOGRAPH
+ {0x97B0, 0x786B}, //3445 #CJK UNIFIED IDEOGRAPH
+ {0x97B1, 0x7C92}, //3446 #CJK UNIFIED IDEOGRAPH
+ {0x97B2, 0x9686}, //3447 #CJK UNIFIED IDEOGRAPH
+ {0x97B3, 0x7ADC}, //3448 #CJK UNIFIED IDEOGRAPH
+ {0x97B4, 0x9F8D}, //3449 #CJK UNIFIED IDEOGRAPH
+ {0x97B5, 0x4FB6}, //3450 #CJK UNIFIED IDEOGRAPH
+ {0x97B6, 0x616E}, //3451 #CJK UNIFIED IDEOGRAPH
+ {0x97B7, 0x65C5}, //3452 #CJK UNIFIED IDEOGRAPH
+ {0x97B8, 0x865C}, //3453 #CJK UNIFIED IDEOGRAPH
+ {0x97B9, 0x4E86}, //3454 #CJK UNIFIED IDEOGRAPH
+ {0x97BA, 0x4EAE}, //3455 #CJK UNIFIED IDEOGRAPH
+ {0x97BB, 0x50DA}, //3456 #CJK UNIFIED IDEOGRAPH
+ {0x97BC, 0x4E21}, //3457 #CJK UNIFIED IDEOGRAPH
+ {0x97BD, 0x51CC}, //3458 #CJK UNIFIED IDEOGRAPH
+ {0x97BE, 0x5BEE}, //3459 #CJK UNIFIED IDEOGRAPH
+ {0x97BF, 0x6599}, //3460 #CJK UNIFIED IDEOGRAPH
+ {0x97C0, 0x6881}, //3461 #CJK UNIFIED IDEOGRAPH
+ {0x97C1, 0x6DBC}, //3462 #CJK UNIFIED IDEOGRAPH
+ {0x97C2, 0x731F}, //3463 #CJK UNIFIED IDEOGRAPH
+ {0x97C3, 0x7642}, //3464 #CJK UNIFIED IDEOGRAPH
+ {0x97C4, 0x77AD}, //3465 #CJK UNIFIED IDEOGRAPH
+ {0x97C5, 0x7A1C}, //3466 #CJK UNIFIED IDEOGRAPH
+ {0x97C6, 0x7CE7}, //3467 #CJK UNIFIED IDEOGRAPH
+ {0x97C7, 0x826F}, //3468 #CJK UNIFIED IDEOGRAPH
+ {0x97C8, 0x8AD2}, //3469 #CJK UNIFIED IDEOGRAPH
+ {0x97C9, 0x907C}, //3470 #CJK UNIFIED IDEOGRAPH
+ {0x97CA, 0x91CF}, //3471 #CJK UNIFIED IDEOGRAPH
+ {0x97CB, 0x9675}, //3472 #CJK UNIFIED IDEOGRAPH
+ {0x97CC, 0x9818}, //3473 #CJK UNIFIED IDEOGRAPH
+ {0x97CD, 0x529B}, //3474 #CJK UNIFIED IDEOGRAPH
+ {0x97CE, 0x7DD1}, //3475 #CJK UNIFIED IDEOGRAPH
+ {0x97CF, 0x502B}, //3476 #CJK UNIFIED IDEOGRAPH
+ {0x97D0, 0x5398}, //3477 #CJK UNIFIED IDEOGRAPH
+ {0x97D1, 0x6797}, //3478 #CJK UNIFIED IDEOGRAPH
+ {0x97D2, 0x6DCB}, //3479 #CJK UNIFIED IDEOGRAPH
+ {0x97D3, 0x71D0}, //3480 #CJK UNIFIED IDEOGRAPH
+ {0x97D4, 0x7433}, //3481 #CJK UNIFIED IDEOGRAPH
+ {0x97D5, 0x81E8}, //3482 #CJK UNIFIED IDEOGRAPH
+ {0x97D6, 0x8F2A}, //3483 #CJK UNIFIED IDEOGRAPH
+ {0x97D7, 0x96A3}, //3484 #CJK UNIFIED IDEOGRAPH
+ {0x97D8, 0x9C57}, //3485 #CJK UNIFIED IDEOGRAPH
+ {0x97D9, 0x9E9F}, //3486 #CJK UNIFIED IDEOGRAPH
+ {0x97DA, 0x7460}, //3487 #CJK UNIFIED IDEOGRAPH
+ {0x97DB, 0x5841}, //3488 #CJK UNIFIED IDEOGRAPH
+ {0x97DC, 0x6D99}, //3489 #CJK UNIFIED IDEOGRAPH
+ {0x97DD, 0x7D2F}, //3490 #CJK UNIFIED IDEOGRAPH
+ {0x97DE, 0x985E}, //3491 #CJK UNIFIED IDEOGRAPH
+ {0x97DF, 0x4EE4}, //3492 #CJK UNIFIED IDEOGRAPH
+ {0x97E0, 0x4F36}, //3493 #CJK UNIFIED IDEOGRAPH
+ {0x97E1, 0x4F8B}, //3494 #CJK UNIFIED IDEOGRAPH
+ {0x97E2, 0x51B7}, //3495 #CJK UNIFIED IDEOGRAPH
+ {0x97E3, 0x52B1}, //3496 #CJK UNIFIED IDEOGRAPH
+ {0x97E4, 0x5DBA}, //3497 #CJK UNIFIED IDEOGRAPH
+ {0x97E5, 0x601C}, //3498 #CJK UNIFIED IDEOGRAPH
+ {0x97E6, 0x73B2}, //3499 #CJK UNIFIED IDEOGRAPH
+ {0x97E7, 0x793C}, //3500 #CJK UNIFIED IDEOGRAPH
+ {0x97E8, 0x82D3}, //3501 #CJK UNIFIED IDEOGRAPH
+ {0x97E9, 0x9234}, //3502 #CJK UNIFIED IDEOGRAPH
+ {0x97EA, 0x96B7}, //3503 #CJK UNIFIED IDEOGRAPH
+ {0x97EB, 0x96F6}, //3504 #CJK UNIFIED IDEOGRAPH
+ {0x97EC, 0x970A}, //3505 #CJK UNIFIED IDEOGRAPH
+ {0x97ED, 0x9E97}, //3506 #CJK UNIFIED IDEOGRAPH
+ {0x97EE, 0x9F62}, //3507 #CJK UNIFIED IDEOGRAPH
+ {0x97EF, 0x66A6}, //3508 #CJK UNIFIED IDEOGRAPH
+ {0x97F0, 0x6B74}, //3509 #CJK UNIFIED IDEOGRAPH
+ {0x97F1, 0x5217}, //3510 #CJK UNIFIED IDEOGRAPH
+ {0x97F2, 0x52A3}, //3511 #CJK UNIFIED IDEOGRAPH
+ {0x97F3, 0x70C8}, //3512 #CJK UNIFIED IDEOGRAPH
+ {0x97F4, 0x88C2}, //3513 #CJK UNIFIED IDEOGRAPH
+ {0x97F5, 0x5EC9}, //3514 #CJK UNIFIED IDEOGRAPH
+ {0x97F6, 0x604B}, //3515 #CJK UNIFIED IDEOGRAPH
+ {0x97F7, 0x6190}, //3516 #CJK UNIFIED IDEOGRAPH
+ {0x97F8, 0x6F23}, //3517 #CJK UNIFIED IDEOGRAPH
+ {0x97F9, 0x7149}, //3518 #CJK UNIFIED IDEOGRAPH
+ {0x97FA, 0x7C3E}, //3519 #CJK UNIFIED IDEOGRAPH
+ {0x97FB, 0x7DF4}, //3520 #CJK UNIFIED IDEOGRAPH
+ {0x97FC, 0x806F}, //3521 #CJK UNIFIED IDEOGRAPH
+ {0x9840, 0x84EE}, //3522 #CJK UNIFIED IDEOGRAPH
+ {0x9841, 0x9023}, //3523 #CJK UNIFIED IDEOGRAPH
+ {0x9842, 0x932C}, //3524 #CJK UNIFIED IDEOGRAPH
+ {0x9843, 0x5442}, //3525 #CJK UNIFIED IDEOGRAPH
+ {0x9844, 0x9B6F}, //3526 #CJK UNIFIED IDEOGRAPH
+ {0x9845, 0x6AD3}, //3527 #CJK UNIFIED IDEOGRAPH
+ {0x9846, 0x7089}, //3528 #CJK UNIFIED IDEOGRAPH
+ {0x9847, 0x8CC2}, //3529 #CJK UNIFIED IDEOGRAPH
+ {0x9848, 0x8DEF}, //3530 #CJK UNIFIED IDEOGRAPH
+ {0x9849, 0x9732}, //3531 #CJK UNIFIED IDEOGRAPH
+ {0x984A, 0x52B4}, //3532 #CJK UNIFIED IDEOGRAPH
+ {0x984B, 0x5A41}, //3533 #CJK UNIFIED IDEOGRAPH
+ {0x984C, 0x5ECA}, //3534 #CJK UNIFIED IDEOGRAPH
+ {0x984D, 0x5F04}, //3535 #CJK UNIFIED IDEOGRAPH
+ {0x984E, 0x6717}, //3536 #CJK UNIFIED IDEOGRAPH
+ {0x984F, 0x697C}, //3537 #CJK UNIFIED IDEOGRAPH
+ {0x9850, 0x6994}, //3538 #CJK UNIFIED IDEOGRAPH
+ {0x9851, 0x6D6A}, //3539 #CJK UNIFIED IDEOGRAPH
+ {0x9852, 0x6F0F}, //3540 #CJK UNIFIED IDEOGRAPH
+ {0x9853, 0x7262}, //3541 #CJK UNIFIED IDEOGRAPH
+ {0x9854, 0x72FC}, //3542 #CJK UNIFIED IDEOGRAPH
+ {0x9855, 0x7BED}, //3543 #CJK UNIFIED IDEOGRAPH
+ {0x9856, 0x8001}, //3544 #CJK UNIFIED IDEOGRAPH
+ {0x9857, 0x807E}, //3545 #CJK UNIFIED IDEOGRAPH
+ {0x9858, 0x874B}, //3546 #CJK UNIFIED IDEOGRAPH
+ {0x9859, 0x90CE}, //3547 #CJK UNIFIED IDEOGRAPH
+ {0x985A, 0x516D}, //3548 #CJK UNIFIED IDEOGRAPH
+ {0x985B, 0x9E93}, //3549 #CJK UNIFIED IDEOGRAPH
+ {0x985C, 0x7984}, //3550 #CJK UNIFIED IDEOGRAPH
+ {0x985D, 0x808B}, //3551 #CJK UNIFIED IDEOGRAPH
+ {0x985E, 0x9332}, //3552 #CJK UNIFIED IDEOGRAPH
+ {0x985F, 0x8AD6}, //3553 #CJK UNIFIED IDEOGRAPH
+ {0x9860, 0x502D}, //3554 #CJK UNIFIED IDEOGRAPH
+ {0x9861, 0x548C}, //3555 #CJK UNIFIED IDEOGRAPH
+ {0x9862, 0x8A71}, //3556 #CJK UNIFIED IDEOGRAPH
+ {0x9863, 0x6B6A}, //3557 #CJK UNIFIED IDEOGRAPH
+ {0x9864, 0x8CC4}, //3558 #CJK UNIFIED IDEOGRAPH
+ {0x9865, 0x8107}, //3559 #CJK UNIFIED IDEOGRAPH
+ {0x9866, 0x60D1}, //3560 #CJK UNIFIED IDEOGRAPH
+ {0x9867, 0x67A0}, //3561 #CJK UNIFIED IDEOGRAPH
+ {0x9868, 0x9DF2}, //3562 #CJK UNIFIED IDEOGRAPH
+ {0x9869, 0x4E99}, //3563 #CJK UNIFIED IDEOGRAPH
+ {0x986A, 0x4E98}, //3564 #CJK UNIFIED IDEOGRAPH
+ {0x986B, 0x9C10}, //3565 #CJK UNIFIED IDEOGRAPH
+ {0x986C, 0x8A6B}, //3566 #CJK UNIFIED IDEOGRAPH
+ {0x986D, 0x85C1}, //3567 #CJK UNIFIED IDEOGRAPH
+ {0x986E, 0x8568}, //3568 #CJK UNIFIED IDEOGRAPH
+ {0x986F, 0x6900}, //3569 #CJK UNIFIED IDEOGRAPH
+ {0x9870, 0x6E7E}, //3570 #CJK UNIFIED IDEOGRAPH
+ {0x9871, 0x7897}, //3571 #CJK UNIFIED IDEOGRAPH
+ {0x9872, 0x8155}, //3572 #CJK UNIFIED IDEOGRAPH
+ {0x989F, 0x5F0C}, //3573 #CJK UNIFIED IDEOGRAPH
+ {0x98A0, 0x4E10}, //3574 #CJK UNIFIED IDEOGRAPH
+ {0x98A1, 0x4E15}, //3575 #CJK UNIFIED IDEOGRAPH
+ {0x98A2, 0x4E2A}, //3576 #CJK UNIFIED IDEOGRAPH
+ {0x98A3, 0x4E31}, //3577 #CJK UNIFIED IDEOGRAPH
+ {0x98A4, 0x4E36}, //3578 #CJK UNIFIED IDEOGRAPH
+ {0x98A5, 0x4E3C}, //3579 #CJK UNIFIED IDEOGRAPH
+ {0x98A6, 0x4E3F}, //3580 #CJK UNIFIED IDEOGRAPH
+ {0x98A7, 0x4E42}, //3581 #CJK UNIFIED IDEOGRAPH
+ {0x98A8, 0x4E56}, //3582 #CJK UNIFIED IDEOGRAPH
+ {0x98A9, 0x4E58}, //3583 #CJK UNIFIED IDEOGRAPH
+ {0x98AA, 0x4E82}, //3584 #CJK UNIFIED IDEOGRAPH
+ {0x98AB, 0x4E85}, //3585 #CJK UNIFIED IDEOGRAPH
+ {0x98AC, 0x8C6B}, //3586 #CJK UNIFIED IDEOGRAPH
+ {0x98AD, 0x4E8A}, //3587 #CJK UNIFIED IDEOGRAPH
+ {0x98AE, 0x8212}, //3588 #CJK UNIFIED IDEOGRAPH
+ {0x98AF, 0x5F0D}, //3589 #CJK UNIFIED IDEOGRAPH
+ {0x98B0, 0x4E8E}, //3590 #CJK UNIFIED IDEOGRAPH
+ {0x98B1, 0x4E9E}, //3591 #CJK UNIFIED IDEOGRAPH
+ {0x98B2, 0x4E9F}, //3592 #CJK UNIFIED IDEOGRAPH
+ {0x98B3, 0x4EA0}, //3593 #CJK UNIFIED IDEOGRAPH
+ {0x98B4, 0x4EA2}, //3594 #CJK UNIFIED IDEOGRAPH
+ {0x98B5, 0x4EB0}, //3595 #CJK UNIFIED IDEOGRAPH
+ {0x98B6, 0x4EB3}, //3596 #CJK UNIFIED IDEOGRAPH
+ {0x98B7, 0x4EB6}, //3597 #CJK UNIFIED IDEOGRAPH
+ {0x98B8, 0x4ECE}, //3598 #CJK UNIFIED IDEOGRAPH
+ {0x98B9, 0x4ECD}, //3599 #CJK UNIFIED IDEOGRAPH
+ {0x98BA, 0x4EC4}, //3600 #CJK UNIFIED IDEOGRAPH
+ {0x98BB, 0x4EC6}, //3601 #CJK UNIFIED IDEOGRAPH
+ {0x98BC, 0x4EC2}, //3602 #CJK UNIFIED IDEOGRAPH
+ {0x98BD, 0x4ED7}, //3603 #CJK UNIFIED IDEOGRAPH
+ {0x98BE, 0x4EDE}, //3604 #CJK UNIFIED IDEOGRAPH
+ {0x98BF, 0x4EED}, //3605 #CJK UNIFIED IDEOGRAPH
+ {0x98C0, 0x4EDF}, //3606 #CJK UNIFIED IDEOGRAPH
+ {0x98C1, 0x4EF7}, //3607 #CJK UNIFIED IDEOGRAPH
+ {0x98C2, 0x4F09}, //3608 #CJK UNIFIED IDEOGRAPH
+ {0x98C3, 0x4F5A}, //3609 #CJK UNIFIED IDEOGRAPH
+ {0x98C4, 0x4F30}, //3610 #CJK UNIFIED IDEOGRAPH
+ {0x98C5, 0x4F5B}, //3611 #CJK UNIFIED IDEOGRAPH
+ {0x98C6, 0x4F5D}, //3612 #CJK UNIFIED IDEOGRAPH
+ {0x98C7, 0x4F57}, //3613 #CJK UNIFIED IDEOGRAPH
+ {0x98C8, 0x4F47}, //3614 #CJK UNIFIED IDEOGRAPH
+ {0x98C9, 0x4F76}, //3615 #CJK UNIFIED IDEOGRAPH
+ {0x98CA, 0x4F88}, //3616 #CJK UNIFIED IDEOGRAPH
+ {0x98CB, 0x4F8F}, //3617 #CJK UNIFIED IDEOGRAPH
+ {0x98CC, 0x4F98}, //3618 #CJK UNIFIED IDEOGRAPH
+ {0x98CD, 0x4F7B}, //3619 #CJK UNIFIED IDEOGRAPH
+ {0x98CE, 0x4F69}, //3620 #CJK UNIFIED IDEOGRAPH
+ {0x98CF, 0x4F70}, //3621 #CJK UNIFIED IDEOGRAPH
+ {0x98D0, 0x4F91}, //3622 #CJK UNIFIED IDEOGRAPH
+ {0x98D1, 0x4F6F}, //3623 #CJK UNIFIED IDEOGRAPH
+ {0x98D2, 0x4F86}, //3624 #CJK UNIFIED IDEOGRAPH
+ {0x98D3, 0x4F96}, //3625 #CJK UNIFIED IDEOGRAPH
+ {0x98D4, 0x5118}, //3626 #CJK UNIFIED IDEOGRAPH
+ {0x98D5, 0x4FD4}, //3627 #CJK UNIFIED IDEOGRAPH
+ {0x98D6, 0x4FDF}, //3628 #CJK UNIFIED IDEOGRAPH
+ {0x98D7, 0x4FCE}, //3629 #CJK UNIFIED IDEOGRAPH
+ {0x98D8, 0x4FD8}, //3630 #CJK UNIFIED IDEOGRAPH
+ {0x98D9, 0x4FDB}, //3631 #CJK UNIFIED IDEOGRAPH
+ {0x98DA, 0x4FD1}, //3632 #CJK UNIFIED IDEOGRAPH
+ {0x98DB, 0x4FDA}, //3633 #CJK UNIFIED IDEOGRAPH
+ {0x98DC, 0x4FD0}, //3634 #CJK UNIFIED IDEOGRAPH
+ {0x98DD, 0x4FE4}, //3635 #CJK UNIFIED IDEOGRAPH
+ {0x98DE, 0x4FE5}, //3636 #CJK UNIFIED IDEOGRAPH
+ {0x98DF, 0x501A}, //3637 #CJK UNIFIED IDEOGRAPH
+ {0x98E0, 0x5028}, //3638 #CJK UNIFIED IDEOGRAPH
+ {0x98E1, 0x5014}, //3639 #CJK UNIFIED IDEOGRAPH
+ {0x98E2, 0x502A}, //3640 #CJK UNIFIED IDEOGRAPH
+ {0x98E3, 0x5025}, //3641 #CJK UNIFIED IDEOGRAPH
+ {0x98E4, 0x5005}, //3642 #CJK UNIFIED IDEOGRAPH
+ {0x98E5, 0x4F1C}, //3643 #CJK UNIFIED IDEOGRAPH
+ {0x98E6, 0x4FF6}, //3644 #CJK UNIFIED IDEOGRAPH
+ {0x98E7, 0x5021}, //3645 #CJK UNIFIED IDEOGRAPH
+ {0x98E8, 0x5029}, //3646 #CJK UNIFIED IDEOGRAPH
+ {0x98E9, 0x502C}, //3647 #CJK UNIFIED IDEOGRAPH
+ {0x98EA, 0x4FFE}, //3648 #CJK UNIFIED IDEOGRAPH
+ {0x98EB, 0x4FEF}, //3649 #CJK UNIFIED IDEOGRAPH
+ {0x98EC, 0x5011}, //3650 #CJK UNIFIED IDEOGRAPH
+ {0x98ED, 0x5006}, //3651 #CJK UNIFIED IDEOGRAPH
+ {0x98EE, 0x5043}, //3652 #CJK UNIFIED IDEOGRAPH
+ {0x98EF, 0x5047}, //3653 #CJK UNIFIED IDEOGRAPH
+ {0x98F0, 0x6703}, //3654 #CJK UNIFIED IDEOGRAPH
+ {0x98F1, 0x5055}, //3655 #CJK UNIFIED IDEOGRAPH
+ {0x98F2, 0x5050}, //3656 #CJK UNIFIED IDEOGRAPH
+ {0x98F3, 0x5048}, //3657 #CJK UNIFIED IDEOGRAPH
+ {0x98F4, 0x505A}, //3658 #CJK UNIFIED IDEOGRAPH
+ {0x98F5, 0x5056}, //3659 #CJK UNIFIED IDEOGRAPH
+ {0x98F6, 0x506C}, //3660 #CJK UNIFIED IDEOGRAPH
+ {0x98F7, 0x5078}, //3661 #CJK UNIFIED IDEOGRAPH
+ {0x98F8, 0x5080}, //3662 #CJK UNIFIED IDEOGRAPH
+ {0x98F9, 0x509A}, //3663 #CJK UNIFIED IDEOGRAPH
+ {0x98FA, 0x5085}, //3664 #CJK UNIFIED IDEOGRAPH
+ {0x98FB, 0x50B4}, //3665 #CJK UNIFIED IDEOGRAPH
+ {0x98FC, 0x50B2}, //3666 #CJK UNIFIED IDEOGRAPH
+ {0x9940, 0x50C9}, //3667 #CJK UNIFIED IDEOGRAPH
+ {0x9941, 0x50CA}, //3668 #CJK UNIFIED IDEOGRAPH
+ {0x9942, 0x50B3}, //3669 #CJK UNIFIED IDEOGRAPH
+ {0x9943, 0x50C2}, //3670 #CJK UNIFIED IDEOGRAPH
+ {0x9944, 0x50D6}, //3671 #CJK UNIFIED IDEOGRAPH
+ {0x9945, 0x50DE}, //3672 #CJK UNIFIED IDEOGRAPH
+ {0x9946, 0x50E5}, //3673 #CJK UNIFIED IDEOGRAPH
+ {0x9947, 0x50ED}, //3674 #CJK UNIFIED IDEOGRAPH
+ {0x9948, 0x50E3}, //3675 #CJK UNIFIED IDEOGRAPH
+ {0x9949, 0x50EE}, //3676 #CJK UNIFIED IDEOGRAPH
+ {0x994A, 0x50F9}, //3677 #CJK UNIFIED IDEOGRAPH
+ {0x994B, 0x50F5}, //3678 #CJK UNIFIED IDEOGRAPH
+ {0x994C, 0x5109}, //3679 #CJK UNIFIED IDEOGRAPH
+ {0x994D, 0x5101}, //3680 #CJK UNIFIED IDEOGRAPH
+ {0x994E, 0x5102}, //3681 #CJK UNIFIED IDEOGRAPH
+ {0x994F, 0x5116}, //3682 #CJK UNIFIED IDEOGRAPH
+ {0x9950, 0x5115}, //3683 #CJK UNIFIED IDEOGRAPH
+ {0x9951, 0x5114}, //3684 #CJK UNIFIED IDEOGRAPH
+ {0x9952, 0x511A}, //3685 #CJK UNIFIED IDEOGRAPH
+ {0x9953, 0x5121}, //3686 #CJK UNIFIED IDEOGRAPH
+ {0x9954, 0x513A}, //3687 #CJK UNIFIED IDEOGRAPH
+ {0x9955, 0x5137}, //3688 #CJK UNIFIED IDEOGRAPH
+ {0x9956, 0x513C}, //3689 #CJK UNIFIED IDEOGRAPH
+ {0x9957, 0x513B}, //3690 #CJK UNIFIED IDEOGRAPH
+ {0x9958, 0x513F}, //3691 #CJK UNIFIED IDEOGRAPH
+ {0x9959, 0x5140}, //3692 #CJK UNIFIED IDEOGRAPH
+ {0x995A, 0x5152}, //3693 #CJK UNIFIED IDEOGRAPH
+ {0x995B, 0x514C}, //3694 #CJK UNIFIED IDEOGRAPH
+ {0x995C, 0x5154}, //3695 #CJK UNIFIED IDEOGRAPH
+ {0x995D, 0x5162}, //3696 #CJK UNIFIED IDEOGRAPH
+ {0x995E, 0x7AF8}, //3697 #CJK UNIFIED IDEOGRAPH
+ {0x995F, 0x5169}, //3698 #CJK UNIFIED IDEOGRAPH
+ {0x9960, 0x516A}, //3699 #CJK UNIFIED IDEOGRAPH
+ {0x9961, 0x516E}, //3700 #CJK UNIFIED IDEOGRAPH
+ {0x9962, 0x5180}, //3701 #CJK UNIFIED IDEOGRAPH
+ {0x9963, 0x5182}, //3702 #CJK UNIFIED IDEOGRAPH
+ {0x9964, 0x56D8}, //3703 #CJK UNIFIED IDEOGRAPH
+ {0x9965, 0x518C}, //3704 #CJK UNIFIED IDEOGRAPH
+ {0x9966, 0x5189}, //3705 #CJK UNIFIED IDEOGRAPH
+ {0x9967, 0x518F}, //3706 #CJK UNIFIED IDEOGRAPH
+ {0x9968, 0x5191}, //3707 #CJK UNIFIED IDEOGRAPH
+ {0x9969, 0x5193}, //3708 #CJK UNIFIED IDEOGRAPH
+ {0x996A, 0x5195}, //3709 #CJK UNIFIED IDEOGRAPH
+ {0x996B, 0x5196}, //3710 #CJK UNIFIED IDEOGRAPH
+ {0x996C, 0x51A4}, //3711 #CJK UNIFIED IDEOGRAPH
+ {0x996D, 0x51A6}, //3712 #CJK UNIFIED IDEOGRAPH
+ {0x996E, 0x51A2}, //3713 #CJK UNIFIED IDEOGRAPH
+ {0x996F, 0x51A9}, //3714 #CJK UNIFIED IDEOGRAPH
+ {0x9970, 0x51AA}, //3715 #CJK UNIFIED IDEOGRAPH
+ {0x9971, 0x51AB}, //3716 #CJK UNIFIED IDEOGRAPH
+ {0x9972, 0x51B3}, //3717 #CJK UNIFIED IDEOGRAPH
+ {0x9973, 0x51B1}, //3718 #CJK UNIFIED IDEOGRAPH
+ {0x9974, 0x51B2}, //3719 #CJK UNIFIED IDEOGRAPH
+ {0x9975, 0x51B0}, //3720 #CJK UNIFIED IDEOGRAPH
+ {0x9976, 0x51B5}, //3721 #CJK UNIFIED IDEOGRAPH
+ {0x9977, 0x51BD}, //3722 #CJK UNIFIED IDEOGRAPH
+ {0x9978, 0x51C5}, //3723 #CJK UNIFIED IDEOGRAPH
+ {0x9979, 0x51C9}, //3724 #CJK UNIFIED IDEOGRAPH
+ {0x997A, 0x51DB}, //3725 #CJK UNIFIED IDEOGRAPH
+ {0x997B, 0x51E0}, //3726 #CJK UNIFIED IDEOGRAPH
+ {0x997C, 0x8655}, //3727 #CJK UNIFIED IDEOGRAPH
+ {0x997D, 0x51E9}, //3728 #CJK UNIFIED IDEOGRAPH
+ {0x997E, 0x51ED}, //3729 #CJK UNIFIED IDEOGRAPH
+ {0x9980, 0x51F0}, //3730 #CJK UNIFIED IDEOGRAPH
+ {0x9981, 0x51F5}, //3731 #CJK UNIFIED IDEOGRAPH
+ {0x9982, 0x51FE}, //3732 #CJK UNIFIED IDEOGRAPH
+ {0x9983, 0x5204}, //3733 #CJK UNIFIED IDEOGRAPH
+ {0x9984, 0x520B}, //3734 #CJK UNIFIED IDEOGRAPH
+ {0x9985, 0x5214}, //3735 #CJK UNIFIED IDEOGRAPH
+ {0x9986, 0x520E}, //3736 #CJK UNIFIED IDEOGRAPH
+ {0x9987, 0x5227}, //3737 #CJK UNIFIED IDEOGRAPH
+ {0x9988, 0x522A}, //3738 #CJK UNIFIED IDEOGRAPH
+ {0x9989, 0x522E}, //3739 #CJK UNIFIED IDEOGRAPH
+ {0x998A, 0x5233}, //3740 #CJK UNIFIED IDEOGRAPH
+ {0x998B, 0x5239}, //3741 #CJK UNIFIED IDEOGRAPH
+ {0x998C, 0x524F}, //3742 #CJK UNIFIED IDEOGRAPH
+ {0x998D, 0x5244}, //3743 #CJK UNIFIED IDEOGRAPH
+ {0x998E, 0x524B}, //3744 #CJK UNIFIED IDEOGRAPH
+ {0x998F, 0x524C}, //3745 #CJK UNIFIED IDEOGRAPH
+ {0x9990, 0x525E}, //3746 #CJK UNIFIED IDEOGRAPH
+ {0x9991, 0x5254}, //3747 #CJK UNIFIED IDEOGRAPH
+ {0x9992, 0x526A}, //3748 #CJK UNIFIED IDEOGRAPH
+ {0x9993, 0x5274}, //3749 #CJK UNIFIED IDEOGRAPH
+ {0x9994, 0x5269}, //3750 #CJK UNIFIED IDEOGRAPH
+ {0x9995, 0x5273}, //3751 #CJK UNIFIED IDEOGRAPH
+ {0x9996, 0x527F}, //3752 #CJK UNIFIED IDEOGRAPH
+ {0x9997, 0x527D}, //3753 #CJK UNIFIED IDEOGRAPH
+ {0x9998, 0x528D}, //3754 #CJK UNIFIED IDEOGRAPH
+ {0x9999, 0x5294}, //3755 #CJK UNIFIED IDEOGRAPH
+ {0x999A, 0x5292}, //3756 #CJK UNIFIED IDEOGRAPH
+ {0x999B, 0x5271}, //3757 #CJK UNIFIED IDEOGRAPH
+ {0x999C, 0x5288}, //3758 #CJK UNIFIED IDEOGRAPH
+ {0x999D, 0x5291}, //3759 #CJK UNIFIED IDEOGRAPH
+ {0x999E, 0x8FA8}, //3760 #CJK UNIFIED IDEOGRAPH
+ {0x999F, 0x8FA7}, //3761 #CJK UNIFIED IDEOGRAPH
+ {0x99A0, 0x52AC}, //3762 #CJK UNIFIED IDEOGRAPH
+ {0x99A1, 0x52AD}, //3763 #CJK UNIFIED IDEOGRAPH
+ {0x99A2, 0x52BC}, //3764 #CJK UNIFIED IDEOGRAPH
+ {0x99A3, 0x52B5}, //3765 #CJK UNIFIED IDEOGRAPH
+ {0x99A4, 0x52C1}, //3766 #CJK UNIFIED IDEOGRAPH
+ {0x99A5, 0x52CD}, //3767 #CJK UNIFIED IDEOGRAPH
+ {0x99A6, 0x52D7}, //3768 #CJK UNIFIED IDEOGRAPH
+ {0x99A7, 0x52DE}, //3769 #CJK UNIFIED IDEOGRAPH
+ {0x99A8, 0x52E3}, //3770 #CJK UNIFIED IDEOGRAPH
+ {0x99A9, 0x52E6}, //3771 #CJK UNIFIED IDEOGRAPH
+ {0x99AA, 0x98ED}, //3772 #CJK UNIFIED IDEOGRAPH
+ {0x99AB, 0x52E0}, //3773 #CJK UNIFIED IDEOGRAPH
+ {0x99AC, 0x52F3}, //3774 #CJK UNIFIED IDEOGRAPH
+ {0x99AD, 0x52F5}, //3775 #CJK UNIFIED IDEOGRAPH
+ {0x99AE, 0x52F8}, //3776 #CJK UNIFIED IDEOGRAPH
+ {0x99AF, 0x52F9}, //3777 #CJK UNIFIED IDEOGRAPH
+ {0x99B0, 0x5306}, //3778 #CJK UNIFIED IDEOGRAPH
+ {0x99B1, 0x5308}, //3779 #CJK UNIFIED IDEOGRAPH
+ {0x99B2, 0x7538}, //3780 #CJK UNIFIED IDEOGRAPH
+ {0x99B3, 0x530D}, //3781 #CJK UNIFIED IDEOGRAPH
+ {0x99B4, 0x5310}, //3782 #CJK UNIFIED IDEOGRAPH
+ {0x99B5, 0x530F}, //3783 #CJK UNIFIED IDEOGRAPH
+ {0x99B6, 0x5315}, //3784 #CJK UNIFIED IDEOGRAPH
+ {0x99B7, 0x531A}, //3785 #CJK UNIFIED IDEOGRAPH
+ {0x99B8, 0x5323}, //3786 #CJK UNIFIED IDEOGRAPH
+ {0x99B9, 0x532F}, //3787 #CJK UNIFIED IDEOGRAPH
+ {0x99BA, 0x5331}, //3788 #CJK UNIFIED IDEOGRAPH
+ {0x99BB, 0x5333}, //3789 #CJK UNIFIED IDEOGRAPH
+ {0x99BC, 0x5338}, //3790 #CJK UNIFIED IDEOGRAPH
+ {0x99BD, 0x5340}, //3791 #CJK UNIFIED IDEOGRAPH
+ {0x99BE, 0x5346}, //3792 #CJK UNIFIED IDEOGRAPH
+ {0x99BF, 0x5345}, //3793 #CJK UNIFIED IDEOGRAPH
+ {0x99C0, 0x4E17}, //3794 #CJK UNIFIED IDEOGRAPH
+ {0x99C1, 0x5349}, //3795 #CJK UNIFIED IDEOGRAPH
+ {0x99C2, 0x534D}, //3796 #CJK UNIFIED IDEOGRAPH
+ {0x99C3, 0x51D6}, //3797 #CJK UNIFIED IDEOGRAPH
+ {0x99C4, 0x535E}, //3798 #CJK UNIFIED IDEOGRAPH
+ {0x99C5, 0x5369}, //3799 #CJK UNIFIED IDEOGRAPH
+ {0x99C6, 0x536E}, //3800 #CJK UNIFIED IDEOGRAPH
+ {0x99C7, 0x5918}, //3801 #CJK UNIFIED IDEOGRAPH
+ {0x99C8, 0x537B}, //3802 #CJK UNIFIED IDEOGRAPH
+ {0x99C9, 0x5377}, //3803 #CJK UNIFIED IDEOGRAPH
+ {0x99CA, 0x5382}, //3804 #CJK UNIFIED IDEOGRAPH
+ {0x99CB, 0x5396}, //3805 #CJK UNIFIED IDEOGRAPH
+ {0x99CC, 0x53A0}, //3806 #CJK UNIFIED IDEOGRAPH
+ {0x99CD, 0x53A6}, //3807 #CJK UNIFIED IDEOGRAPH
+ {0x99CE, 0x53A5}, //3808 #CJK UNIFIED IDEOGRAPH
+ {0x99CF, 0x53AE}, //3809 #CJK UNIFIED IDEOGRAPH
+ {0x99D0, 0x53B0}, //3810 #CJK UNIFIED IDEOGRAPH
+ {0x99D1, 0x53B6}, //3811 #CJK UNIFIED IDEOGRAPH
+ {0x99D2, 0x53C3}, //3812 #CJK UNIFIED IDEOGRAPH
+ {0x99D3, 0x7C12}, //3813 #CJK UNIFIED IDEOGRAPH
+ {0x99D4, 0x96D9}, //3814 #CJK UNIFIED IDEOGRAPH
+ {0x99D5, 0x53DF}, //3815 #CJK UNIFIED IDEOGRAPH
+ {0x99D6, 0x66FC}, //3816 #CJK UNIFIED IDEOGRAPH
+ {0x99D7, 0x71EE}, //3817 #CJK UNIFIED IDEOGRAPH
+ {0x99D8, 0x53EE}, //3818 #CJK UNIFIED IDEOGRAPH
+ {0x99D9, 0x53E8}, //3819 #CJK UNIFIED IDEOGRAPH
+ {0x99DA, 0x53ED}, //3820 #CJK UNIFIED IDEOGRAPH
+ {0x99DB, 0x53FA}, //3821 #CJK UNIFIED IDEOGRAPH
+ {0x99DC, 0x5401}, //3822 #CJK UNIFIED IDEOGRAPH
+ {0x99DD, 0x543D}, //3823 #CJK UNIFIED IDEOGRAPH
+ {0x99DE, 0x5440}, //3824 #CJK UNIFIED IDEOGRAPH
+ {0x99DF, 0x542C}, //3825 #CJK UNIFIED IDEOGRAPH
+ {0x99E0, 0x542D}, //3826 #CJK UNIFIED IDEOGRAPH
+ {0x99E1, 0x543C}, //3827 #CJK UNIFIED IDEOGRAPH
+ {0x99E2, 0x542E}, //3828 #CJK UNIFIED IDEOGRAPH
+ {0x99E3, 0x5436}, //3829 #CJK UNIFIED IDEOGRAPH
+ {0x99E4, 0x5429}, //3830 #CJK UNIFIED IDEOGRAPH
+ {0x99E5, 0x541D}, //3831 #CJK UNIFIED IDEOGRAPH
+ {0x99E6, 0x544E}, //3832 #CJK UNIFIED IDEOGRAPH
+ {0x99E7, 0x548F}, //3833 #CJK UNIFIED IDEOGRAPH
+ {0x99E8, 0x5475}, //3834 #CJK UNIFIED IDEOGRAPH
+ {0x99E9, 0x548E}, //3835 #CJK UNIFIED IDEOGRAPH
+ {0x99EA, 0x545F}, //3836 #CJK UNIFIED IDEOGRAPH
+ {0x99EB, 0x5471}, //3837 #CJK UNIFIED IDEOGRAPH
+ {0x99EC, 0x5477}, //3838 #CJK UNIFIED IDEOGRAPH
+ {0x99ED, 0x5470}, //3839 #CJK UNIFIED IDEOGRAPH
+ {0x99EE, 0x5492}, //3840 #CJK UNIFIED IDEOGRAPH
+ {0x99EF, 0x547B}, //3841 #CJK UNIFIED IDEOGRAPH
+ {0x99F0, 0x5480}, //3842 #CJK UNIFIED IDEOGRAPH
+ {0x99F1, 0x5476}, //3843 #CJK UNIFIED IDEOGRAPH
+ {0x99F2, 0x5484}, //3844 #CJK UNIFIED IDEOGRAPH
+ {0x99F3, 0x5490}, //3845 #CJK UNIFIED IDEOGRAPH
+ {0x99F4, 0x5486}, //3846 #CJK UNIFIED IDEOGRAPH
+ {0x99F5, 0x54C7}, //3847 #CJK UNIFIED IDEOGRAPH
+ {0x99F6, 0x54A2}, //3848 #CJK UNIFIED IDEOGRAPH
+ {0x99F7, 0x54B8}, //3849 #CJK UNIFIED IDEOGRAPH
+ {0x99F8, 0x54A5}, //3850 #CJK UNIFIED IDEOGRAPH
+ {0x99F9, 0x54AC}, //3851 #CJK UNIFIED IDEOGRAPH
+ {0x99FA, 0x54C4}, //3852 #CJK UNIFIED IDEOGRAPH
+ {0x99FB, 0x54C8}, //3853 #CJK UNIFIED IDEOGRAPH
+ {0x99FC, 0x54A8}, //3854 #CJK UNIFIED IDEOGRAPH
+ {0x9A40, 0x54AB}, //3855 #CJK UNIFIED IDEOGRAPH
+ {0x9A41, 0x54C2}, //3856 #CJK UNIFIED IDEOGRAPH
+ {0x9A42, 0x54A4}, //3857 #CJK UNIFIED IDEOGRAPH
+ {0x9A43, 0x54BE}, //3858 #CJK UNIFIED IDEOGRAPH
+ {0x9A44, 0x54BC}, //3859 #CJK UNIFIED IDEOGRAPH
+ {0x9A45, 0x54D8}, //3860 #CJK UNIFIED IDEOGRAPH
+ {0x9A46, 0x54E5}, //3861 #CJK UNIFIED IDEOGRAPH
+ {0x9A47, 0x54E6}, //3862 #CJK UNIFIED IDEOGRAPH
+ {0x9A48, 0x550F}, //3863 #CJK UNIFIED IDEOGRAPH
+ {0x9A49, 0x5514}, //3864 #CJK UNIFIED IDEOGRAPH
+ {0x9A4A, 0x54FD}, //3865 #CJK UNIFIED IDEOGRAPH
+ {0x9A4B, 0x54EE}, //3866 #CJK UNIFIED IDEOGRAPH
+ {0x9A4C, 0x54ED}, //3867 #CJK UNIFIED IDEOGRAPH
+ {0x9A4D, 0x54FA}, //3868 #CJK UNIFIED IDEOGRAPH
+ {0x9A4E, 0x54E2}, //3869 #CJK UNIFIED IDEOGRAPH
+ {0x9A4F, 0x5539}, //3870 #CJK UNIFIED IDEOGRAPH
+ {0x9A50, 0x5540}, //3871 #CJK UNIFIED IDEOGRAPH
+ {0x9A51, 0x5563}, //3872 #CJK UNIFIED IDEOGRAPH
+ {0x9A52, 0x554C}, //3873 #CJK UNIFIED IDEOGRAPH
+ {0x9A53, 0x552E}, //3874 #CJK UNIFIED IDEOGRAPH
+ {0x9A54, 0x555C}, //3875 #CJK UNIFIED IDEOGRAPH
+ {0x9A55, 0x5545}, //3876 #CJK UNIFIED IDEOGRAPH
+ {0x9A56, 0x5556}, //3877 #CJK UNIFIED IDEOGRAPH
+ {0x9A57, 0x5557}, //3878 #CJK UNIFIED IDEOGRAPH
+ {0x9A58, 0x5538}, //3879 #CJK UNIFIED IDEOGRAPH
+ {0x9A59, 0x5533}, //3880 #CJK UNIFIED IDEOGRAPH
+ {0x9A5A, 0x555D}, //3881 #CJK UNIFIED IDEOGRAPH
+ {0x9A5B, 0x5599}, //3882 #CJK UNIFIED IDEOGRAPH
+ {0x9A5C, 0x5580}, //3883 #CJK UNIFIED IDEOGRAPH
+ {0x9A5D, 0x54AF}, //3884 #CJK UNIFIED IDEOGRAPH
+ {0x9A5E, 0x558A}, //3885 #CJK UNIFIED IDEOGRAPH
+ {0x9A5F, 0x559F}, //3886 #CJK UNIFIED IDEOGRAPH
+ {0x9A60, 0x557B}, //3887 #CJK UNIFIED IDEOGRAPH
+ {0x9A61, 0x557E}, //3888 #CJK UNIFIED IDEOGRAPH
+ {0x9A62, 0x5598}, //3889 #CJK UNIFIED IDEOGRAPH
+ {0x9A63, 0x559E}, //3890 #CJK UNIFIED IDEOGRAPH
+ {0x9A64, 0x55AE}, //3891 #CJK UNIFIED IDEOGRAPH
+ {0x9A65, 0x557C}, //3892 #CJK UNIFIED IDEOGRAPH
+ {0x9A66, 0x5583}, //3893 #CJK UNIFIED IDEOGRAPH
+ {0x9A67, 0x55A9}, //3894 #CJK UNIFIED IDEOGRAPH
+ {0x9A68, 0x5587}, //3895 #CJK UNIFIED IDEOGRAPH
+ {0x9A69, 0x55A8}, //3896 #CJK UNIFIED IDEOGRAPH
+ {0x9A6A, 0x55DA}, //3897 #CJK UNIFIED IDEOGRAPH
+ {0x9A6B, 0x55C5}, //3898 #CJK UNIFIED IDEOGRAPH
+ {0x9A6C, 0x55DF}, //3899 #CJK UNIFIED IDEOGRAPH
+ {0x9A6D, 0x55C4}, //3900 #CJK UNIFIED IDEOGRAPH
+ {0x9A6E, 0x55DC}, //3901 #CJK UNIFIED IDEOGRAPH
+ {0x9A6F, 0x55E4}, //3902 #CJK UNIFIED IDEOGRAPH
+ {0x9A70, 0x55D4}, //3903 #CJK UNIFIED IDEOGRAPH
+ {0x9A71, 0x5614}, //3904 #CJK UNIFIED IDEOGRAPH
+ {0x9A72, 0x55F7}, //3905 #CJK UNIFIED IDEOGRAPH
+ {0x9A73, 0x5616}, //3906 #CJK UNIFIED IDEOGRAPH
+ {0x9A74, 0x55FE}, //3907 #CJK UNIFIED IDEOGRAPH
+ {0x9A75, 0x55FD}, //3908 #CJK UNIFIED IDEOGRAPH
+ {0x9A76, 0x561B}, //3909 #CJK UNIFIED IDEOGRAPH
+ {0x9A77, 0x55F9}, //3910 #CJK UNIFIED IDEOGRAPH
+ {0x9A78, 0x564E}, //3911 #CJK UNIFIED IDEOGRAPH
+ {0x9A79, 0x5650}, //3912 #CJK UNIFIED IDEOGRAPH
+ {0x9A7A, 0x71DF}, //3913 #CJK UNIFIED IDEOGRAPH
+ {0x9A7B, 0x5634}, //3914 #CJK UNIFIED IDEOGRAPH
+ {0x9A7C, 0x5636}, //3915 #CJK UNIFIED IDEOGRAPH
+ {0x9A7D, 0x5632}, //3916 #CJK UNIFIED IDEOGRAPH
+ {0x9A7E, 0x5638}, //3917 #CJK UNIFIED IDEOGRAPH
+ {0x9A80, 0x566B}, //3918 #CJK UNIFIED IDEOGRAPH
+ {0x9A81, 0x5664}, //3919 #CJK UNIFIED IDEOGRAPH
+ {0x9A82, 0x562F}, //3920 #CJK UNIFIED IDEOGRAPH
+ {0x9A83, 0x566C}, //3921 #CJK UNIFIED IDEOGRAPH
+ {0x9A84, 0x566A}, //3922 #CJK UNIFIED IDEOGRAPH
+ {0x9A85, 0x5686}, //3923 #CJK UNIFIED IDEOGRAPH
+ {0x9A86, 0x5680}, //3924 #CJK UNIFIED IDEOGRAPH
+ {0x9A87, 0x568A}, //3925 #CJK UNIFIED IDEOGRAPH
+ {0x9A88, 0x56A0}, //3926 #CJK UNIFIED IDEOGRAPH
+ {0x9A89, 0x5694}, //3927 #CJK UNIFIED IDEOGRAPH
+ {0x9A8A, 0x568F}, //3928 #CJK UNIFIED IDEOGRAPH
+ {0x9A8B, 0x56A5}, //3929 #CJK UNIFIED IDEOGRAPH
+ {0x9A8C, 0x56AE}, //3930 #CJK UNIFIED IDEOGRAPH
+ {0x9A8D, 0x56B6}, //3931 #CJK UNIFIED IDEOGRAPH
+ {0x9A8E, 0x56B4}, //3932 #CJK UNIFIED IDEOGRAPH
+ {0x9A8F, 0x56C2}, //3933 #CJK UNIFIED IDEOGRAPH
+ {0x9A90, 0x56BC}, //3934 #CJK UNIFIED IDEOGRAPH
+ {0x9A91, 0x56C1}, //3935 #CJK UNIFIED IDEOGRAPH
+ {0x9A92, 0x56C3}, //3936 #CJK UNIFIED IDEOGRAPH
+ {0x9A93, 0x56C0}, //3937 #CJK UNIFIED IDEOGRAPH
+ {0x9A94, 0x56C8}, //3938 #CJK UNIFIED IDEOGRAPH
+ {0x9A95, 0x56CE}, //3939 #CJK UNIFIED IDEOGRAPH
+ {0x9A96, 0x56D1}, //3940 #CJK UNIFIED IDEOGRAPH
+ {0x9A97, 0x56D3}, //3941 #CJK UNIFIED IDEOGRAPH
+ {0x9A98, 0x56D7}, //3942 #CJK UNIFIED IDEOGRAPH
+ {0x9A99, 0x56EE}, //3943 #CJK UNIFIED IDEOGRAPH
+ {0x9A9A, 0x56F9}, //3944 #CJK UNIFIED IDEOGRAPH
+ {0x9A9B, 0x5700}, //3945 #CJK UNIFIED IDEOGRAPH
+ {0x9A9C, 0x56FF}, //3946 #CJK UNIFIED IDEOGRAPH
+ {0x9A9D, 0x5704}, //3947 #CJK UNIFIED IDEOGRAPH
+ {0x9A9E, 0x5709}, //3948 #CJK UNIFIED IDEOGRAPH
+ {0x9A9F, 0x5708}, //3949 #CJK UNIFIED IDEOGRAPH
+ {0x9AA0, 0x570B}, //3950 #CJK UNIFIED IDEOGRAPH
+ {0x9AA1, 0x570D}, //3951 #CJK UNIFIED IDEOGRAPH
+ {0x9AA2, 0x5713}, //3952 #CJK UNIFIED IDEOGRAPH
+ {0x9AA3, 0x5718}, //3953 #CJK UNIFIED IDEOGRAPH
+ {0x9AA4, 0x5716}, //3954 #CJK UNIFIED IDEOGRAPH
+ {0x9AA5, 0x55C7}, //3955 #CJK UNIFIED IDEOGRAPH
+ {0x9AA6, 0x571C}, //3956 #CJK UNIFIED IDEOGRAPH
+ {0x9AA7, 0x5726}, //3957 #CJK UNIFIED IDEOGRAPH
+ {0x9AA8, 0x5737}, //3958 #CJK UNIFIED IDEOGRAPH
+ {0x9AA9, 0x5738}, //3959 #CJK UNIFIED IDEOGRAPH
+ {0x9AAA, 0x574E}, //3960 #CJK UNIFIED IDEOGRAPH
+ {0x9AAB, 0x573B}, //3961 #CJK UNIFIED IDEOGRAPH
+ {0x9AAC, 0x5740}, //3962 #CJK UNIFIED IDEOGRAPH
+ {0x9AAD, 0x574F}, //3963 #CJK UNIFIED IDEOGRAPH
+ {0x9AAE, 0x5769}, //3964 #CJK UNIFIED IDEOGRAPH
+ {0x9AAF, 0x57C0}, //3965 #CJK UNIFIED IDEOGRAPH
+ {0x9AB0, 0x5788}, //3966 #CJK UNIFIED IDEOGRAPH
+ {0x9AB1, 0x5761}, //3967 #CJK UNIFIED IDEOGRAPH
+ {0x9AB2, 0x577F}, //3968 #CJK UNIFIED IDEOGRAPH
+ {0x9AB3, 0x5789}, //3969 #CJK UNIFIED IDEOGRAPH
+ {0x9AB4, 0x5793}, //3970 #CJK UNIFIED IDEOGRAPH
+ {0x9AB5, 0x57A0}, //3971 #CJK UNIFIED IDEOGRAPH
+ {0x9AB6, 0x57B3}, //3972 #CJK UNIFIED IDEOGRAPH
+ {0x9AB7, 0x57A4}, //3973 #CJK UNIFIED IDEOGRAPH
+ {0x9AB8, 0x57AA}, //3974 #CJK UNIFIED IDEOGRAPH
+ {0x9AB9, 0x57B0}, //3975 #CJK UNIFIED IDEOGRAPH
+ {0x9ABA, 0x57C3}, //3976 #CJK UNIFIED IDEOGRAPH
+ {0x9ABB, 0x57C6}, //3977 #CJK UNIFIED IDEOGRAPH
+ {0x9ABC, 0x57D4}, //3978 #CJK UNIFIED IDEOGRAPH
+ {0x9ABD, 0x57D2}, //3979 #CJK UNIFIED IDEOGRAPH
+ {0x9ABE, 0x57D3}, //3980 #CJK UNIFIED IDEOGRAPH
+ {0x9ABF, 0x580A}, //3981 #CJK UNIFIED IDEOGRAPH
+ {0x9AC0, 0x57D6}, //3982 #CJK UNIFIED IDEOGRAPH
+ {0x9AC1, 0x57E3}, //3983 #CJK UNIFIED IDEOGRAPH
+ {0x9AC2, 0x580B}, //3984 #CJK UNIFIED IDEOGRAPH
+ {0x9AC3, 0x5819}, //3985 #CJK UNIFIED IDEOGRAPH
+ {0x9AC4, 0x581D}, //3986 #CJK UNIFIED IDEOGRAPH
+ {0x9AC5, 0x5872}, //3987 #CJK UNIFIED IDEOGRAPH
+ {0x9AC6, 0x5821}, //3988 #CJK UNIFIED IDEOGRAPH
+ {0x9AC7, 0x5862}, //3989 #CJK UNIFIED IDEOGRAPH
+ {0x9AC8, 0x584B}, //3990 #CJK UNIFIED IDEOGRAPH
+ {0x9AC9, 0x5870}, //3991 #CJK UNIFIED IDEOGRAPH
+ {0x9ACA, 0x6BC0}, //3992 #CJK UNIFIED IDEOGRAPH
+ {0x9ACB, 0x5852}, //3993 #CJK UNIFIED IDEOGRAPH
+ {0x9ACC, 0x583D}, //3994 #CJK UNIFIED IDEOGRAPH
+ {0x9ACD, 0x5879}, //3995 #CJK UNIFIED IDEOGRAPH
+ {0x9ACE, 0x5885}, //3996 #CJK UNIFIED IDEOGRAPH
+ {0x9ACF, 0x58B9}, //3997 #CJK UNIFIED IDEOGRAPH
+ {0x9AD0, 0x589F}, //3998 #CJK UNIFIED IDEOGRAPH
+ {0x9AD1, 0x58AB}, //3999 #CJK UNIFIED IDEOGRAPH
+ {0x9AD2, 0x58BA}, //4000 #CJK UNIFIED IDEOGRAPH
+ {0x9AD3, 0x58DE}, //4001 #CJK UNIFIED IDEOGRAPH
+ {0x9AD4, 0x58BB}, //4002 #CJK UNIFIED IDEOGRAPH
+ {0x9AD5, 0x58B8}, //4003 #CJK UNIFIED IDEOGRAPH
+ {0x9AD6, 0x58AE}, //4004 #CJK UNIFIED IDEOGRAPH
+ {0x9AD7, 0x58C5}, //4005 #CJK UNIFIED IDEOGRAPH
+ {0x9AD8, 0x58D3}, //4006 #CJK UNIFIED IDEOGRAPH
+ {0x9AD9, 0x58D1}, //4007 #CJK UNIFIED IDEOGRAPH
+ {0x9ADA, 0x58D7}, //4008 #CJK UNIFIED IDEOGRAPH
+ {0x9ADB, 0x58D9}, //4009 #CJK UNIFIED IDEOGRAPH
+ {0x9ADC, 0x58D8}, //4010 #CJK UNIFIED IDEOGRAPH
+ {0x9ADD, 0x58E5}, //4011 #CJK UNIFIED IDEOGRAPH
+ {0x9ADE, 0x58DC}, //4012 #CJK UNIFIED IDEOGRAPH
+ {0x9ADF, 0x58E4}, //4013 #CJK UNIFIED IDEOGRAPH
+ {0x9AE0, 0x58DF}, //4014 #CJK UNIFIED IDEOGRAPH
+ {0x9AE1, 0x58EF}, //4015 #CJK UNIFIED IDEOGRAPH
+ {0x9AE2, 0x58FA}, //4016 #CJK UNIFIED IDEOGRAPH
+ {0x9AE3, 0x58F9}, //4017 #CJK UNIFIED IDEOGRAPH
+ {0x9AE4, 0x58FB}, //4018 #CJK UNIFIED IDEOGRAPH
+ {0x9AE5, 0x58FC}, //4019 #CJK UNIFIED IDEOGRAPH
+ {0x9AE6, 0x58FD}, //4020 #CJK UNIFIED IDEOGRAPH
+ {0x9AE7, 0x5902}, //4021 #CJK UNIFIED IDEOGRAPH
+ {0x9AE8, 0x590A}, //4022 #CJK UNIFIED IDEOGRAPH
+ {0x9AE9, 0x5910}, //4023 #CJK UNIFIED IDEOGRAPH
+ {0x9AEA, 0x591B}, //4024 #CJK UNIFIED IDEOGRAPH
+ {0x9AEB, 0x68A6}, //4025 #CJK UNIFIED IDEOGRAPH
+ {0x9AEC, 0x5925}, //4026 #CJK UNIFIED IDEOGRAPH
+ {0x9AED, 0x592C}, //4027 #CJK UNIFIED IDEOGRAPH
+ {0x9AEE, 0x592D}, //4028 #CJK UNIFIED IDEOGRAPH
+ {0x9AEF, 0x5932}, //4029 #CJK UNIFIED IDEOGRAPH
+ {0x9AF0, 0x5938}, //4030 #CJK UNIFIED IDEOGRAPH
+ {0x9AF1, 0x593E}, //4031 #CJK UNIFIED IDEOGRAPH
+ {0x9AF2, 0x7AD2}, //4032 #CJK UNIFIED IDEOGRAPH
+ {0x9AF3, 0x5955}, //4033 #CJK UNIFIED IDEOGRAPH
+ {0x9AF4, 0x5950}, //4034 #CJK UNIFIED IDEOGRAPH
+ {0x9AF5, 0x594E}, //4035 #CJK UNIFIED IDEOGRAPH
+ {0x9AF6, 0x595A}, //4036 #CJK UNIFIED IDEOGRAPH
+ {0x9AF7, 0x5958}, //4037 #CJK UNIFIED IDEOGRAPH
+ {0x9AF8, 0x5962}, //4038 #CJK UNIFIED IDEOGRAPH
+ {0x9AF9, 0x5960}, //4039 #CJK UNIFIED IDEOGRAPH
+ {0x9AFA, 0x5967}, //4040 #CJK UNIFIED IDEOGRAPH
+ {0x9AFB, 0x596C}, //4041 #CJK UNIFIED IDEOGRAPH
+ {0x9AFC, 0x5969}, //4042 #CJK UNIFIED IDEOGRAPH
+ {0x9B40, 0x5978}, //4043 #CJK UNIFIED IDEOGRAPH
+ {0x9B41, 0x5981}, //4044 #CJK UNIFIED IDEOGRAPH
+ {0x9B42, 0x599D}, //4045 #CJK UNIFIED IDEOGRAPH
+ {0x9B43, 0x4F5E}, //4046 #CJK UNIFIED IDEOGRAPH
+ {0x9B44, 0x4FAB}, //4047 #CJK UNIFIED IDEOGRAPH
+ {0x9B45, 0x59A3}, //4048 #CJK UNIFIED IDEOGRAPH
+ {0x9B46, 0x59B2}, //4049 #CJK UNIFIED IDEOGRAPH
+ {0x9B47, 0x59C6}, //4050 #CJK UNIFIED IDEOGRAPH
+ {0x9B48, 0x59E8}, //4051 #CJK UNIFIED IDEOGRAPH
+ {0x9B49, 0x59DC}, //4052 #CJK UNIFIED IDEOGRAPH
+ {0x9B4A, 0x598D}, //4053 #CJK UNIFIED IDEOGRAPH
+ {0x9B4B, 0x59D9}, //4054 #CJK UNIFIED IDEOGRAPH
+ {0x9B4C, 0x59DA}, //4055 #CJK UNIFIED IDEOGRAPH
+ {0x9B4D, 0x5A25}, //4056 #CJK UNIFIED IDEOGRAPH
+ {0x9B4E, 0x5A1F}, //4057 #CJK UNIFIED IDEOGRAPH
+ {0x9B4F, 0x5A11}, //4058 #CJK UNIFIED IDEOGRAPH
+ {0x9B50, 0x5A1C}, //4059 #CJK UNIFIED IDEOGRAPH
+ {0x9B51, 0x5A09}, //4060 #CJK UNIFIED IDEOGRAPH
+ {0x9B52, 0x5A1A}, //4061 #CJK UNIFIED IDEOGRAPH
+ {0x9B53, 0x5A40}, //4062 #CJK UNIFIED IDEOGRAPH
+ {0x9B54, 0x5A6C}, //4063 #CJK UNIFIED IDEOGRAPH
+ {0x9B55, 0x5A49}, //4064 #CJK UNIFIED IDEOGRAPH
+ {0x9B56, 0x5A35}, //4065 #CJK UNIFIED IDEOGRAPH
+ {0x9B57, 0x5A36}, //4066 #CJK UNIFIED IDEOGRAPH
+ {0x9B58, 0x5A62}, //4067 #CJK UNIFIED IDEOGRAPH
+ {0x9B59, 0x5A6A}, //4068 #CJK UNIFIED IDEOGRAPH
+ {0x9B5A, 0x5A9A}, //4069 #CJK UNIFIED IDEOGRAPH
+ {0x9B5B, 0x5ABC}, //4070 #CJK UNIFIED IDEOGRAPH
+ {0x9B5C, 0x5ABE}, //4071 #CJK UNIFIED IDEOGRAPH
+ {0x9B5D, 0x5ACB}, //4072 #CJK UNIFIED IDEOGRAPH
+ {0x9B5E, 0x5AC2}, //4073 #CJK UNIFIED IDEOGRAPH
+ {0x9B5F, 0x5ABD}, //4074 #CJK UNIFIED IDEOGRAPH
+ {0x9B60, 0x5AE3}, //4075 #CJK UNIFIED IDEOGRAPH
+ {0x9B61, 0x5AD7}, //4076 #CJK UNIFIED IDEOGRAPH
+ {0x9B62, 0x5AE6}, //4077 #CJK UNIFIED IDEOGRAPH
+ {0x9B63, 0x5AE9}, //4078 #CJK UNIFIED IDEOGRAPH
+ {0x9B64, 0x5AD6}, //4079 #CJK UNIFIED IDEOGRAPH
+ {0x9B65, 0x5AFA}, //4080 #CJK UNIFIED IDEOGRAPH
+ {0x9B66, 0x5AFB}, //4081 #CJK UNIFIED IDEOGRAPH
+ {0x9B67, 0x5B0C}, //4082 #CJK UNIFIED IDEOGRAPH
+ {0x9B68, 0x5B0B}, //4083 #CJK UNIFIED IDEOGRAPH
+ {0x9B69, 0x5B16}, //4084 #CJK UNIFIED IDEOGRAPH
+ {0x9B6A, 0x5B32}, //4085 #CJK UNIFIED IDEOGRAPH
+ {0x9B6B, 0x5AD0}, //4086 #CJK UNIFIED IDEOGRAPH
+ {0x9B6C, 0x5B2A}, //4087 #CJK UNIFIED IDEOGRAPH
+ {0x9B6D, 0x5B36}, //4088 #CJK UNIFIED IDEOGRAPH
+ {0x9B6E, 0x5B3E}, //4089 #CJK UNIFIED IDEOGRAPH
+ {0x9B6F, 0x5B43}, //4090 #CJK UNIFIED IDEOGRAPH
+ {0x9B70, 0x5B45}, //4091 #CJK UNIFIED IDEOGRAPH
+ {0x9B71, 0x5B40}, //4092 #CJK UNIFIED IDEOGRAPH
+ {0x9B72, 0x5B51}, //4093 #CJK UNIFIED IDEOGRAPH
+ {0x9B73, 0x5B55}, //4094 #CJK UNIFIED IDEOGRAPH
+ {0x9B74, 0x5B5A}, //4095 #CJK UNIFIED IDEOGRAPH
+ {0x9B75, 0x5B5B}, //4096 #CJK UNIFIED IDEOGRAPH
+ {0x9B76, 0x5B65}, //4097 #CJK UNIFIED IDEOGRAPH
+ {0x9B77, 0x5B69}, //4098 #CJK UNIFIED IDEOGRAPH
+ {0x9B78, 0x5B70}, //4099 #CJK UNIFIED IDEOGRAPH
+ {0x9B79, 0x5B73}, //4100 #CJK UNIFIED IDEOGRAPH
+ {0x9B7A, 0x5B75}, //4101 #CJK UNIFIED IDEOGRAPH
+ {0x9B7B, 0x5B78}, //4102 #CJK UNIFIED IDEOGRAPH
+ {0x9B7C, 0x6588}, //4103 #CJK UNIFIED IDEOGRAPH
+ {0x9B7D, 0x5B7A}, //4104 #CJK UNIFIED IDEOGRAPH
+ {0x9B7E, 0x5B80}, //4105 #CJK UNIFIED IDEOGRAPH
+ {0x9B80, 0x5B83}, //4106 #CJK UNIFIED IDEOGRAPH
+ {0x9B81, 0x5BA6}, //4107 #CJK UNIFIED IDEOGRAPH
+ {0x9B82, 0x5BB8}, //4108 #CJK UNIFIED IDEOGRAPH
+ {0x9B83, 0x5BC3}, //4109 #CJK UNIFIED IDEOGRAPH
+ {0x9B84, 0x5BC7}, //4110 #CJK UNIFIED IDEOGRAPH
+ {0x9B85, 0x5BC9}, //4111 #CJK UNIFIED IDEOGRAPH
+ {0x9B86, 0x5BD4}, //4112 #CJK UNIFIED IDEOGRAPH
+ {0x9B87, 0x5BD0}, //4113 #CJK UNIFIED IDEOGRAPH
+ {0x9B88, 0x5BE4}, //4114 #CJK UNIFIED IDEOGRAPH
+ {0x9B89, 0x5BE6}, //4115 #CJK UNIFIED IDEOGRAPH
+ {0x9B8A, 0x5BE2}, //4116 #CJK UNIFIED IDEOGRAPH
+ {0x9B8B, 0x5BDE}, //4117 #CJK UNIFIED IDEOGRAPH
+ {0x9B8C, 0x5BE5}, //4118 #CJK UNIFIED IDEOGRAPH
+ {0x9B8D, 0x5BEB}, //4119 #CJK UNIFIED IDEOGRAPH
+ {0x9B8E, 0x5BF0}, //4120 #CJK UNIFIED IDEOGRAPH
+ {0x9B8F, 0x5BF6}, //4121 #CJK UNIFIED IDEOGRAPH
+ {0x9B90, 0x5BF3}, //4122 #CJK UNIFIED IDEOGRAPH
+ {0x9B91, 0x5C05}, //4123 #CJK UNIFIED IDEOGRAPH
+ {0x9B92, 0x5C07}, //4124 #CJK UNIFIED IDEOGRAPH
+ {0x9B93, 0x5C08}, //4125 #CJK UNIFIED IDEOGRAPH
+ {0x9B94, 0x5C0D}, //4126 #CJK UNIFIED IDEOGRAPH
+ {0x9B95, 0x5C13}, //4127 #CJK UNIFIED IDEOGRAPH
+ {0x9B96, 0x5C20}, //4128 #CJK UNIFIED IDEOGRAPH
+ {0x9B97, 0x5C22}, //4129 #CJK UNIFIED IDEOGRAPH
+ {0x9B98, 0x5C28}, //4130 #CJK UNIFIED IDEOGRAPH
+ {0x9B99, 0x5C38}, //4131 #CJK UNIFIED IDEOGRAPH
+ {0x9B9A, 0x5C39}, //4132 #CJK UNIFIED IDEOGRAPH
+ {0x9B9B, 0x5C41}, //4133 #CJK UNIFIED IDEOGRAPH
+ {0x9B9C, 0x5C46}, //4134 #CJK UNIFIED IDEOGRAPH
+ {0x9B9D, 0x5C4E}, //4135 #CJK UNIFIED IDEOGRAPH
+ {0x9B9E, 0x5C53}, //4136 #CJK UNIFIED IDEOGRAPH
+ {0x9B9F, 0x5C50}, //4137 #CJK UNIFIED IDEOGRAPH
+ {0x9BA0, 0x5C4F}, //4138 #CJK UNIFIED IDEOGRAPH
+ {0x9BA1, 0x5B71}, //4139 #CJK UNIFIED IDEOGRAPH
+ {0x9BA2, 0x5C6C}, //4140 #CJK UNIFIED IDEOGRAPH
+ {0x9BA3, 0x5C6E}, //4141 #CJK UNIFIED IDEOGRAPH
+ {0x9BA4, 0x4E62}, //4142 #CJK UNIFIED IDEOGRAPH
+ {0x9BA5, 0x5C76}, //4143 #CJK UNIFIED IDEOGRAPH
+ {0x9BA6, 0x5C79}, //4144 #CJK UNIFIED IDEOGRAPH
+ {0x9BA7, 0x5C8C}, //4145 #CJK UNIFIED IDEOGRAPH
+ {0x9BA8, 0x5C91}, //4146 #CJK UNIFIED IDEOGRAPH
+ {0x9BA9, 0x5C94}, //4147 #CJK UNIFIED IDEOGRAPH
+ {0x9BAA, 0x599B}, //4148 #CJK UNIFIED IDEOGRAPH
+ {0x9BAB, 0x5CAB}, //4149 #CJK UNIFIED IDEOGRAPH
+ {0x9BAC, 0x5CBB}, //4150 #CJK UNIFIED IDEOGRAPH
+ {0x9BAD, 0x5CB6}, //4151 #CJK UNIFIED IDEOGRAPH
+ {0x9BAE, 0x5CBC}, //4152 #CJK UNIFIED IDEOGRAPH
+ {0x9BAF, 0x5CB7}, //4153 #CJK UNIFIED IDEOGRAPH
+ {0x9BB0, 0x5CC5}, //4154 #CJK UNIFIED IDEOGRAPH
+ {0x9BB1, 0x5CBE}, //4155 #CJK UNIFIED IDEOGRAPH
+ {0x9BB2, 0x5CC7}, //4156 #CJK UNIFIED IDEOGRAPH
+ {0x9BB3, 0x5CD9}, //4157 #CJK UNIFIED IDEOGRAPH
+ {0x9BB4, 0x5CE9}, //4158 #CJK UNIFIED IDEOGRAPH
+ {0x9BB5, 0x5CFD}, //4159 #CJK UNIFIED IDEOGRAPH
+ {0x9BB6, 0x5CFA}, //4160 #CJK UNIFIED IDEOGRAPH
+ {0x9BB7, 0x5CED}, //4161 #CJK UNIFIED IDEOGRAPH
+ {0x9BB8, 0x5D8C}, //4162 #CJK UNIFIED IDEOGRAPH
+ {0x9BB9, 0x5CEA}, //4163 #CJK UNIFIED IDEOGRAPH
+ {0x9BBA, 0x5D0B}, //4164 #CJK UNIFIED IDEOGRAPH
+ {0x9BBB, 0x5D15}, //4165 #CJK UNIFIED IDEOGRAPH
+ {0x9BBC, 0x5D17}, //4166 #CJK UNIFIED IDEOGRAPH
+ {0x9BBD, 0x5D5C}, //4167 #CJK UNIFIED IDEOGRAPH
+ {0x9BBE, 0x5D1F}, //4168 #CJK UNIFIED IDEOGRAPH
+ {0x9BBF, 0x5D1B}, //4169 #CJK UNIFIED IDEOGRAPH
+ {0x9BC0, 0x5D11}, //4170 #CJK UNIFIED IDEOGRAPH
+ {0x9BC1, 0x5D14}, //4171 #CJK UNIFIED IDEOGRAPH
+ {0x9BC2, 0x5D22}, //4172 #CJK UNIFIED IDEOGRAPH
+ {0x9BC3, 0x5D1A}, //4173 #CJK UNIFIED IDEOGRAPH
+ {0x9BC4, 0x5D19}, //4174 #CJK UNIFIED IDEOGRAPH
+ {0x9BC5, 0x5D18}, //4175 #CJK UNIFIED IDEOGRAPH
+ {0x9BC6, 0x5D4C}, //4176 #CJK UNIFIED IDEOGRAPH
+ {0x9BC7, 0x5D52}, //4177 #CJK UNIFIED IDEOGRAPH
+ {0x9BC8, 0x5D4E}, //4178 #CJK UNIFIED IDEOGRAPH
+ {0x9BC9, 0x5D4B}, //4179 #CJK UNIFIED IDEOGRAPH
+ {0x9BCA, 0x5D6C}, //4180 #CJK UNIFIED IDEOGRAPH
+ {0x9BCB, 0x5D73}, //4181 #CJK UNIFIED IDEOGRAPH
+ {0x9BCC, 0x5D76}, //4182 #CJK UNIFIED IDEOGRAPH
+ {0x9BCD, 0x5D87}, //4183 #CJK UNIFIED IDEOGRAPH
+ {0x9BCE, 0x5D84}, //4184 #CJK UNIFIED IDEOGRAPH
+ {0x9BCF, 0x5D82}, //4185 #CJK UNIFIED IDEOGRAPH
+ {0x9BD0, 0x5DA2}, //4186 #CJK UNIFIED IDEOGRAPH
+ {0x9BD1, 0x5D9D}, //4187 #CJK UNIFIED IDEOGRAPH
+ {0x9BD2, 0x5DAC}, //4188 #CJK UNIFIED IDEOGRAPH
+ {0x9BD3, 0x5DAE}, //4189 #CJK UNIFIED IDEOGRAPH
+ {0x9BD4, 0x5DBD}, //4190 #CJK UNIFIED IDEOGRAPH
+ {0x9BD5, 0x5D90}, //4191 #CJK UNIFIED IDEOGRAPH
+ {0x9BD6, 0x5DB7}, //4192 #CJK UNIFIED IDEOGRAPH
+ {0x9BD7, 0x5DBC}, //4193 #CJK UNIFIED IDEOGRAPH
+ {0x9BD8, 0x5DC9}, //4194 #CJK UNIFIED IDEOGRAPH
+ {0x9BD9, 0x5DCD}, //4195 #CJK UNIFIED IDEOGRAPH
+ {0x9BDA, 0x5DD3}, //4196 #CJK UNIFIED IDEOGRAPH
+ {0x9BDB, 0x5DD2}, //4197 #CJK UNIFIED IDEOGRAPH
+ {0x9BDC, 0x5DD6}, //4198 #CJK UNIFIED IDEOGRAPH
+ {0x9BDD, 0x5DDB}, //4199 #CJK UNIFIED IDEOGRAPH
+ {0x9BDE, 0x5DEB}, //4200 #CJK UNIFIED IDEOGRAPH
+ {0x9BDF, 0x5DF2}, //4201 #CJK UNIFIED IDEOGRAPH
+ {0x9BE0, 0x5DF5}, //4202 #CJK UNIFIED IDEOGRAPH
+ {0x9BE1, 0x5E0B}, //4203 #CJK UNIFIED IDEOGRAPH
+ {0x9BE2, 0x5E1A}, //4204 #CJK UNIFIED IDEOGRAPH
+ {0x9BE3, 0x5E19}, //4205 #CJK UNIFIED IDEOGRAPH
+ {0x9BE4, 0x5E11}, //4206 #CJK UNIFIED IDEOGRAPH
+ {0x9BE5, 0x5E1B}, //4207 #CJK UNIFIED IDEOGRAPH
+ {0x9BE6, 0x5E36}, //4208 #CJK UNIFIED IDEOGRAPH
+ {0x9BE7, 0x5E37}, //4209 #CJK UNIFIED IDEOGRAPH
+ {0x9BE8, 0x5E44}, //4210 #CJK UNIFIED IDEOGRAPH
+ {0x9BE9, 0x5E43}, //4211 #CJK UNIFIED IDEOGRAPH
+ {0x9BEA, 0x5E40}, //4212 #CJK UNIFIED IDEOGRAPH
+ {0x9BEB, 0x5E4E}, //4213 #CJK UNIFIED IDEOGRAPH
+ {0x9BEC, 0x5E57}, //4214 #CJK UNIFIED IDEOGRAPH
+ {0x9BED, 0x5E54}, //4215 #CJK UNIFIED IDEOGRAPH
+ {0x9BEE, 0x5E5F}, //4216 #CJK UNIFIED IDEOGRAPH
+ {0x9BEF, 0x5E62}, //4217 #CJK UNIFIED IDEOGRAPH
+ {0x9BF0, 0x5E64}, //4218 #CJK UNIFIED IDEOGRAPH
+ {0x9BF1, 0x5E47}, //4219 #CJK UNIFIED IDEOGRAPH
+ {0x9BF2, 0x5E75}, //4220 #CJK UNIFIED IDEOGRAPH
+ {0x9BF3, 0x5E76}, //4221 #CJK UNIFIED IDEOGRAPH
+ {0x9BF4, 0x5E7A}, //4222 #CJK UNIFIED IDEOGRAPH
+ {0x9BF5, 0x9EBC}, //4223 #CJK UNIFIED IDEOGRAPH
+ {0x9BF6, 0x5E7F}, //4224 #CJK UNIFIED IDEOGRAPH
+ {0x9BF7, 0x5EA0}, //4225 #CJK UNIFIED IDEOGRAPH
+ {0x9BF8, 0x5EC1}, //4226 #CJK UNIFIED IDEOGRAPH
+ {0x9BF9, 0x5EC2}, //4227 #CJK UNIFIED IDEOGRAPH
+ {0x9BFA, 0x5EC8}, //4228 #CJK UNIFIED IDEOGRAPH
+ {0x9BFB, 0x5ED0}, //4229 #CJK UNIFIED IDEOGRAPH
+ {0x9BFC, 0x5ECF}, //4230 #CJK UNIFIED IDEOGRAPH
+ {0x9C40, 0x5ED6}, //4231 #CJK UNIFIED IDEOGRAPH
+ {0x9C41, 0x5EE3}, //4232 #CJK UNIFIED IDEOGRAPH
+ {0x9C42, 0x5EDD}, //4233 #CJK UNIFIED IDEOGRAPH
+ {0x9C43, 0x5EDA}, //4234 #CJK UNIFIED IDEOGRAPH
+ {0x9C44, 0x5EDB}, //4235 #CJK UNIFIED IDEOGRAPH
+ {0x9C45, 0x5EE2}, //4236 #CJK UNIFIED IDEOGRAPH
+ {0x9C46, 0x5EE1}, //4237 #CJK UNIFIED IDEOGRAPH
+ {0x9C47, 0x5EE8}, //4238 #CJK UNIFIED IDEOGRAPH
+ {0x9C48, 0x5EE9}, //4239 #CJK UNIFIED IDEOGRAPH
+ {0x9C49, 0x5EEC}, //4240 #CJK UNIFIED IDEOGRAPH
+ {0x9C4A, 0x5EF1}, //4241 #CJK UNIFIED IDEOGRAPH
+ {0x9C4B, 0x5EF3}, //4242 #CJK UNIFIED IDEOGRAPH
+ {0x9C4C, 0x5EF0}, //4243 #CJK UNIFIED IDEOGRAPH
+ {0x9C4D, 0x5EF4}, //4244 #CJK UNIFIED IDEOGRAPH
+ {0x9C4E, 0x5EF8}, //4245 #CJK UNIFIED IDEOGRAPH
+ {0x9C4F, 0x5EFE}, //4246 #CJK UNIFIED IDEOGRAPH
+ {0x9C50, 0x5F03}, //4247 #CJK UNIFIED IDEOGRAPH
+ {0x9C51, 0x5F09}, //4248 #CJK UNIFIED IDEOGRAPH
+ {0x9C52, 0x5F5D}, //4249 #CJK UNIFIED IDEOGRAPH
+ {0x9C53, 0x5F5C}, //4250 #CJK UNIFIED IDEOGRAPH
+ {0x9C54, 0x5F0B}, //4251 #CJK UNIFIED IDEOGRAPH
+ {0x9C55, 0x5F11}, //4252 #CJK UNIFIED IDEOGRAPH
+ {0x9C56, 0x5F16}, //4253 #CJK UNIFIED IDEOGRAPH
+ {0x9C57, 0x5F29}, //4254 #CJK UNIFIED IDEOGRAPH
+ {0x9C58, 0x5F2D}, //4255 #CJK UNIFIED IDEOGRAPH
+ {0x9C59, 0x5F38}, //4256 #CJK UNIFIED IDEOGRAPH
+ {0x9C5A, 0x5F41}, //4257 #CJK UNIFIED IDEOGRAPH
+ {0x9C5B, 0x5F48}, //4258 #CJK UNIFIED IDEOGRAPH
+ {0x9C5C, 0x5F4C}, //4259 #CJK UNIFIED IDEOGRAPH
+ {0x9C5D, 0x5F4E}, //4260 #CJK UNIFIED IDEOGRAPH
+ {0x9C5E, 0x5F2F}, //4261 #CJK UNIFIED IDEOGRAPH
+ {0x9C5F, 0x5F51}, //4262 #CJK UNIFIED IDEOGRAPH
+ {0x9C60, 0x5F56}, //4263 #CJK UNIFIED IDEOGRAPH
+ {0x9C61, 0x5F57}, //4264 #CJK UNIFIED IDEOGRAPH
+ {0x9C62, 0x5F59}, //4265 #CJK UNIFIED IDEOGRAPH
+ {0x9C63, 0x5F61}, //4266 #CJK UNIFIED IDEOGRAPH
+ {0x9C64, 0x5F6D}, //4267 #CJK UNIFIED IDEOGRAPH
+ {0x9C65, 0x5F73}, //4268 #CJK UNIFIED IDEOGRAPH
+ {0x9C66, 0x5F77}, //4269 #CJK UNIFIED IDEOGRAPH
+ {0x9C67, 0x5F83}, //4270 #CJK UNIFIED IDEOGRAPH
+ {0x9C68, 0x5F82}, //4271 #CJK UNIFIED IDEOGRAPH
+ {0x9C69, 0x5F7F}, //4272 #CJK UNIFIED IDEOGRAPH
+ {0x9C6A, 0x5F8A}, //4273 #CJK UNIFIED IDEOGRAPH
+ {0x9C6B, 0x5F88}, //4274 #CJK UNIFIED IDEOGRAPH
+ {0x9C6C, 0x5F91}, //4275 #CJK UNIFIED IDEOGRAPH
+ {0x9C6D, 0x5F87}, //4276 #CJK UNIFIED IDEOGRAPH
+ {0x9C6E, 0x5F9E}, //4277 #CJK UNIFIED IDEOGRAPH
+ {0x9C6F, 0x5F99}, //4278 #CJK UNIFIED IDEOGRAPH
+ {0x9C70, 0x5F98}, //4279 #CJK UNIFIED IDEOGRAPH
+ {0x9C71, 0x5FA0}, //4280 #CJK UNIFIED IDEOGRAPH
+ {0x9C72, 0x5FA8}, //4281 #CJK UNIFIED IDEOGRAPH
+ {0x9C73, 0x5FAD}, //4282 #CJK UNIFIED IDEOGRAPH
+ {0x9C74, 0x5FBC}, //4283 #CJK UNIFIED IDEOGRAPH
+ {0x9C75, 0x5FD6}, //4284 #CJK UNIFIED IDEOGRAPH
+ {0x9C76, 0x5FFB}, //4285 #CJK UNIFIED IDEOGRAPH
+ {0x9C77, 0x5FE4}, //4286 #CJK UNIFIED IDEOGRAPH
+ {0x9C78, 0x5FF8}, //4287 #CJK UNIFIED IDEOGRAPH
+ {0x9C79, 0x5FF1}, //4288 #CJK UNIFIED IDEOGRAPH
+ {0x9C7A, 0x5FDD}, //4289 #CJK UNIFIED IDEOGRAPH
+ {0x9C7B, 0x60B3}, //4290 #CJK UNIFIED IDEOGRAPH
+ {0x9C7C, 0x5FFF}, //4291 #CJK UNIFIED IDEOGRAPH
+ {0x9C7D, 0x6021}, //4292 #CJK UNIFIED IDEOGRAPH
+ {0x9C7E, 0x6060}, //4293 #CJK UNIFIED IDEOGRAPH
+ {0x9C80, 0x6019}, //4294 #CJK UNIFIED IDEOGRAPH
+ {0x9C81, 0x6010}, //4295 #CJK UNIFIED IDEOGRAPH
+ {0x9C82, 0x6029}, //4296 #CJK UNIFIED IDEOGRAPH
+ {0x9C83, 0x600E}, //4297 #CJK UNIFIED IDEOGRAPH
+ {0x9C84, 0x6031}, //4298 #CJK UNIFIED IDEOGRAPH
+ {0x9C85, 0x601B}, //4299 #CJK UNIFIED IDEOGRAPH
+ {0x9C86, 0x6015}, //4300 #CJK UNIFIED IDEOGRAPH
+ {0x9C87, 0x602B}, //4301 #CJK UNIFIED IDEOGRAPH
+ {0x9C88, 0x6026}, //4302 #CJK UNIFIED IDEOGRAPH
+ {0x9C89, 0x600F}, //4303 #CJK UNIFIED IDEOGRAPH
+ {0x9C8A, 0x603A}, //4304 #CJK UNIFIED IDEOGRAPH
+ {0x9C8B, 0x605A}, //4305 #CJK UNIFIED IDEOGRAPH
+ {0x9C8C, 0x6041}, //4306 #CJK UNIFIED IDEOGRAPH
+ {0x9C8D, 0x606A}, //4307 #CJK UNIFIED IDEOGRAPH
+ {0x9C8E, 0x6077}, //4308 #CJK UNIFIED IDEOGRAPH
+ {0x9C8F, 0x605F}, //4309 #CJK UNIFIED IDEOGRAPH
+ {0x9C90, 0x604A}, //4310 #CJK UNIFIED IDEOGRAPH
+ {0x9C91, 0x6046}, //4311 #CJK UNIFIED IDEOGRAPH
+ {0x9C92, 0x604D}, //4312 #CJK UNIFIED IDEOGRAPH
+ {0x9C93, 0x6063}, //4313 #CJK UNIFIED IDEOGRAPH
+ {0x9C94, 0x6043}, //4314 #CJK UNIFIED IDEOGRAPH
+ {0x9C95, 0x6064}, //4315 #CJK UNIFIED IDEOGRAPH
+ {0x9C96, 0x6042}, //4316 #CJK UNIFIED IDEOGRAPH
+ {0x9C97, 0x606C}, //4317 #CJK UNIFIED IDEOGRAPH
+ {0x9C98, 0x606B}, //4318 #CJK UNIFIED IDEOGRAPH
+ {0x9C99, 0x6059}, //4319 #CJK UNIFIED IDEOGRAPH
+ {0x9C9A, 0x6081}, //4320 #CJK UNIFIED IDEOGRAPH
+ {0x9C9B, 0x608D}, //4321 #CJK UNIFIED IDEOGRAPH
+ {0x9C9C, 0x60E7}, //4322 #CJK UNIFIED IDEOGRAPH
+ {0x9C9D, 0x6083}, //4323 #CJK UNIFIED IDEOGRAPH
+ {0x9C9E, 0x609A}, //4324 #CJK UNIFIED IDEOGRAPH
+ {0x9C9F, 0x6084}, //4325 #CJK UNIFIED IDEOGRAPH
+ {0x9CA0, 0x609B}, //4326 #CJK UNIFIED IDEOGRAPH
+ {0x9CA1, 0x6096}, //4327 #CJK UNIFIED IDEOGRAPH
+ {0x9CA2, 0x6097}, //4328 #CJK UNIFIED IDEOGRAPH
+ {0x9CA3, 0x6092}, //4329 #CJK UNIFIED IDEOGRAPH
+ {0x9CA4, 0x60A7}, //4330 #CJK UNIFIED IDEOGRAPH
+ {0x9CA5, 0x608B}, //4331 #CJK UNIFIED IDEOGRAPH
+ {0x9CA6, 0x60E1}, //4332 #CJK UNIFIED IDEOGRAPH
+ {0x9CA7, 0x60B8}, //4333 #CJK UNIFIED IDEOGRAPH
+ {0x9CA8, 0x60E0}, //4334 #CJK UNIFIED IDEOGRAPH
+ {0x9CA9, 0x60D3}, //4335 #CJK UNIFIED IDEOGRAPH
+ {0x9CAA, 0x60B4}, //4336 #CJK UNIFIED IDEOGRAPH
+ {0x9CAB, 0x5FF0}, //4337 #CJK UNIFIED IDEOGRAPH
+ {0x9CAC, 0x60BD}, //4338 #CJK UNIFIED IDEOGRAPH
+ {0x9CAD, 0x60C6}, //4339 #CJK UNIFIED IDEOGRAPH
+ {0x9CAE, 0x60B5}, //4340 #CJK UNIFIED IDEOGRAPH
+ {0x9CAF, 0x60D8}, //4341 #CJK UNIFIED IDEOGRAPH
+ {0x9CB0, 0x614D}, //4342 #CJK UNIFIED IDEOGRAPH
+ {0x9CB1, 0x6115}, //4343 #CJK UNIFIED IDEOGRAPH
+ {0x9CB2, 0x6106}, //4344 #CJK UNIFIED IDEOGRAPH
+ {0x9CB3, 0x60F6}, //4345 #CJK UNIFIED IDEOGRAPH
+ {0x9CB4, 0x60F7}, //4346 #CJK UNIFIED IDEOGRAPH
+ {0x9CB5, 0x6100}, //4347 #CJK UNIFIED IDEOGRAPH
+ {0x9CB6, 0x60F4}, //4348 #CJK UNIFIED IDEOGRAPH
+ {0x9CB7, 0x60FA}, //4349 #CJK UNIFIED IDEOGRAPH
+ {0x9CB8, 0x6103}, //4350 #CJK UNIFIED IDEOGRAPH
+ {0x9CB9, 0x6121}, //4351 #CJK UNIFIED IDEOGRAPH
+ {0x9CBA, 0x60FB}, //4352 #CJK UNIFIED IDEOGRAPH
+ {0x9CBB, 0x60F1}, //4353 #CJK UNIFIED IDEOGRAPH
+ {0x9CBC, 0x610D}, //4354 #CJK UNIFIED IDEOGRAPH
+ {0x9CBD, 0x610E}, //4355 #CJK UNIFIED IDEOGRAPH
+ {0x9CBE, 0x6147}, //4356 #CJK UNIFIED IDEOGRAPH
+ {0x9CBF, 0x613E}, //4357 #CJK UNIFIED IDEOGRAPH
+ {0x9CC0, 0x6128}, //4358 #CJK UNIFIED IDEOGRAPH
+ {0x9CC1, 0x6127}, //4359 #CJK UNIFIED IDEOGRAPH
+ {0x9CC2, 0x614A}, //4360 #CJK UNIFIED IDEOGRAPH
+ {0x9CC3, 0x613F}, //4361 #CJK UNIFIED IDEOGRAPH
+ {0x9CC4, 0x613C}, //4362 #CJK UNIFIED IDEOGRAPH
+ {0x9CC5, 0x612C}, //4363 #CJK UNIFIED IDEOGRAPH
+ {0x9CC6, 0x6134}, //4364 #CJK UNIFIED IDEOGRAPH
+ {0x9CC7, 0x613D}, //4365 #CJK UNIFIED IDEOGRAPH
+ {0x9CC8, 0x6142}, //4366 #CJK UNIFIED IDEOGRAPH
+ {0x9CC9, 0x6144}, //4367 #CJK UNIFIED IDEOGRAPH
+ {0x9CCA, 0x6173}, //4368 #CJK UNIFIED IDEOGRAPH
+ {0x9CCB, 0x6177}, //4369 #CJK UNIFIED IDEOGRAPH
+ {0x9CCC, 0x6158}, //4370 #CJK UNIFIED IDEOGRAPH
+ {0x9CCD, 0x6159}, //4371 #CJK UNIFIED IDEOGRAPH
+ {0x9CCE, 0x615A}, //4372 #CJK UNIFIED IDEOGRAPH
+ {0x9CCF, 0x616B}, //4373 #CJK UNIFIED IDEOGRAPH
+ {0x9CD0, 0x6174}, //4374 #CJK UNIFIED IDEOGRAPH
+ {0x9CD1, 0x616F}, //4375 #CJK UNIFIED IDEOGRAPH
+ {0x9CD2, 0x6165}, //4376 #CJK UNIFIED IDEOGRAPH
+ {0x9CD3, 0x6171}, //4377 #CJK UNIFIED IDEOGRAPH
+ {0x9CD4, 0x615F}, //4378 #CJK UNIFIED IDEOGRAPH
+ {0x9CD5, 0x615D}, //4379 #CJK UNIFIED IDEOGRAPH
+ {0x9CD6, 0x6153}, //4380 #CJK UNIFIED IDEOGRAPH
+ {0x9CD7, 0x6175}, //4381 #CJK UNIFIED IDEOGRAPH
+ {0x9CD8, 0x6199}, //4382 #CJK UNIFIED IDEOGRAPH
+ {0x9CD9, 0x6196}, //4383 #CJK UNIFIED IDEOGRAPH
+ {0x9CDA, 0x6187}, //4384 #CJK UNIFIED IDEOGRAPH
+ {0x9CDB, 0x61AC}, //4385 #CJK UNIFIED IDEOGRAPH
+ {0x9CDC, 0x6194}, //4386 #CJK UNIFIED IDEOGRAPH
+ {0x9CDD, 0x619A}, //4387 #CJK UNIFIED IDEOGRAPH
+ {0x9CDE, 0x618A}, //4388 #CJK UNIFIED IDEOGRAPH
+ {0x9CDF, 0x6191}, //4389 #CJK UNIFIED IDEOGRAPH
+ {0x9CE0, 0x61AB}, //4390 #CJK UNIFIED IDEOGRAPH
+ {0x9CE1, 0x61AE}, //4391 #CJK UNIFIED IDEOGRAPH
+ {0x9CE2, 0x61CC}, //4392 #CJK UNIFIED IDEOGRAPH
+ {0x9CE3, 0x61CA}, //4393 #CJK UNIFIED IDEOGRAPH
+ {0x9CE4, 0x61C9}, //4394 #CJK UNIFIED IDEOGRAPH
+ {0x9CE5, 0x61F7}, //4395 #CJK UNIFIED IDEOGRAPH
+ {0x9CE6, 0x61C8}, //4396 #CJK UNIFIED IDEOGRAPH
+ {0x9CE7, 0x61C3}, //4397 #CJK UNIFIED IDEOGRAPH
+ {0x9CE8, 0x61C6}, //4398 #CJK UNIFIED IDEOGRAPH
+ {0x9CE9, 0x61BA}, //4399 #CJK UNIFIED IDEOGRAPH
+ {0x9CEA, 0x61CB}, //4400 #CJK UNIFIED IDEOGRAPH
+ {0x9CEB, 0x7F79}, //4401 #CJK UNIFIED IDEOGRAPH
+ {0x9CEC, 0x61CD}, //4402 #CJK UNIFIED IDEOGRAPH
+ {0x9CED, 0x61E6}, //4403 #CJK UNIFIED IDEOGRAPH
+ {0x9CEE, 0x61E3}, //4404 #CJK UNIFIED IDEOGRAPH
+ {0x9CEF, 0x61F6}, //4405 #CJK UNIFIED IDEOGRAPH
+ {0x9CF0, 0x61FA}, //4406 #CJK UNIFIED IDEOGRAPH
+ {0x9CF1, 0x61F4}, //4407 #CJK UNIFIED IDEOGRAPH
+ {0x9CF2, 0x61FF}, //4408 #CJK UNIFIED IDEOGRAPH
+ {0x9CF3, 0x61FD}, //4409 #CJK UNIFIED IDEOGRAPH
+ {0x9CF4, 0x61FC}, //4410 #CJK UNIFIED IDEOGRAPH
+ {0x9CF5, 0x61FE}, //4411 #CJK UNIFIED IDEOGRAPH
+ {0x9CF6, 0x6200}, //4412 #CJK UNIFIED IDEOGRAPH
+ {0x9CF7, 0x6208}, //4413 #CJK UNIFIED IDEOGRAPH
+ {0x9CF8, 0x6209}, //4414 #CJK UNIFIED IDEOGRAPH
+ {0x9CF9, 0x620D}, //4415 #CJK UNIFIED IDEOGRAPH
+ {0x9CFA, 0x620C}, //4416 #CJK UNIFIED IDEOGRAPH
+ {0x9CFB, 0x6214}, //4417 #CJK UNIFIED IDEOGRAPH
+ {0x9CFC, 0x621B}, //4418 #CJK UNIFIED IDEOGRAPH
+ {0x9D40, 0x621E}, //4419 #CJK UNIFIED IDEOGRAPH
+ {0x9D41, 0x6221}, //4420 #CJK UNIFIED IDEOGRAPH
+ {0x9D42, 0x622A}, //4421 #CJK UNIFIED IDEOGRAPH
+ {0x9D43, 0x622E}, //4422 #CJK UNIFIED IDEOGRAPH
+ {0x9D44, 0x6230}, //4423 #CJK UNIFIED IDEOGRAPH
+ {0x9D45, 0x6232}, //4424 #CJK UNIFIED IDEOGRAPH
+ {0x9D46, 0x6233}, //4425 #CJK UNIFIED IDEOGRAPH
+ {0x9D47, 0x6241}, //4426 #CJK UNIFIED IDEOGRAPH
+ {0x9D48, 0x624E}, //4427 #CJK UNIFIED IDEOGRAPH
+ {0x9D49, 0x625E}, //4428 #CJK UNIFIED IDEOGRAPH
+ {0x9D4A, 0x6263}, //4429 #CJK UNIFIED IDEOGRAPH
+ {0x9D4B, 0x625B}, //4430 #CJK UNIFIED IDEOGRAPH
+ {0x9D4C, 0x6260}, //4431 #CJK UNIFIED IDEOGRAPH
+ {0x9D4D, 0x6268}, //4432 #CJK UNIFIED IDEOGRAPH
+ {0x9D4E, 0x627C}, //4433 #CJK UNIFIED IDEOGRAPH
+ {0x9D4F, 0x6282}, //4434 #CJK UNIFIED IDEOGRAPH
+ {0x9D50, 0x6289}, //4435 #CJK UNIFIED IDEOGRAPH
+ {0x9D51, 0x627E}, //4436 #CJK UNIFIED IDEOGRAPH
+ {0x9D52, 0x6292}, //4437 #CJK UNIFIED IDEOGRAPH
+ {0x9D53, 0x6293}, //4438 #CJK UNIFIED IDEOGRAPH
+ {0x9D54, 0x6296}, //4439 #CJK UNIFIED IDEOGRAPH
+ {0x9D55, 0x62D4}, //4440 #CJK UNIFIED IDEOGRAPH
+ {0x9D56, 0x6283}, //4441 #CJK UNIFIED IDEOGRAPH
+ {0x9D57, 0x6294}, //4442 #CJK UNIFIED IDEOGRAPH
+ {0x9D58, 0x62D7}, //4443 #CJK UNIFIED IDEOGRAPH
+ {0x9D59, 0x62D1}, //4444 #CJK UNIFIED IDEOGRAPH
+ {0x9D5A, 0x62BB}, //4445 #CJK UNIFIED IDEOGRAPH
+ {0x9D5B, 0x62CF}, //4446 #CJK UNIFIED IDEOGRAPH
+ {0x9D5C, 0x62FF}, //4447 #CJK UNIFIED IDEOGRAPH
+ {0x9D5D, 0x62C6}, //4448 #CJK UNIFIED IDEOGRAPH
+ {0x9D5E, 0x64D4}, //4449 #CJK UNIFIED IDEOGRAPH
+ {0x9D5F, 0x62C8}, //4450 #CJK UNIFIED IDEOGRAPH
+ {0x9D60, 0x62DC}, //4451 #CJK UNIFIED IDEOGRAPH
+ {0x9D61, 0x62CC}, //4452 #CJK UNIFIED IDEOGRAPH
+ {0x9D62, 0x62CA}, //4453 #CJK UNIFIED IDEOGRAPH
+ {0x9D63, 0x62C2}, //4454 #CJK UNIFIED IDEOGRAPH
+ {0x9D64, 0x62C7}, //4455 #CJK UNIFIED IDEOGRAPH
+ {0x9D65, 0x629B}, //4456 #CJK UNIFIED IDEOGRAPH
+ {0x9D66, 0x62C9}, //4457 #CJK UNIFIED IDEOGRAPH
+ {0x9D67, 0x630C}, //4458 #CJK UNIFIED IDEOGRAPH
+ {0x9D68, 0x62EE}, //4459 #CJK UNIFIED IDEOGRAPH
+ {0x9D69, 0x62F1}, //4460 #CJK UNIFIED IDEOGRAPH
+ {0x9D6A, 0x6327}, //4461 #CJK UNIFIED IDEOGRAPH
+ {0x9D6B, 0x6302}, //4462 #CJK UNIFIED IDEOGRAPH
+ {0x9D6C, 0x6308}, //4463 #CJK UNIFIED IDEOGRAPH
+ {0x9D6D, 0x62EF}, //4464 #CJK UNIFIED IDEOGRAPH
+ {0x9D6E, 0x62F5}, //4465 #CJK UNIFIED IDEOGRAPH
+ {0x9D6F, 0x6350}, //4466 #CJK UNIFIED IDEOGRAPH
+ {0x9D70, 0x633E}, //4467 #CJK UNIFIED IDEOGRAPH
+ {0x9D71, 0x634D}, //4468 #CJK UNIFIED IDEOGRAPH
+ {0x9D72, 0x641C}, //4469 #CJK UNIFIED IDEOGRAPH
+ {0x9D73, 0x634F}, //4470 #CJK UNIFIED IDEOGRAPH
+ {0x9D74, 0x6396}, //4471 #CJK UNIFIED IDEOGRAPH
+ {0x9D75, 0x638E}, //4472 #CJK UNIFIED IDEOGRAPH
+ {0x9D76, 0x6380}, //4473 #CJK UNIFIED IDEOGRAPH
+ {0x9D77, 0x63AB}, //4474 #CJK UNIFIED IDEOGRAPH
+ {0x9D78, 0x6376}, //4475 #CJK UNIFIED IDEOGRAPH
+ {0x9D79, 0x63A3}, //4476 #CJK UNIFIED IDEOGRAPH
+ {0x9D7A, 0x638F}, //4477 #CJK UNIFIED IDEOGRAPH
+ {0x9D7B, 0x6389}, //4478 #CJK UNIFIED IDEOGRAPH
+ {0x9D7C, 0x639F}, //4479 #CJK UNIFIED IDEOGRAPH
+ {0x9D7D, 0x63B5}, //4480 #CJK UNIFIED IDEOGRAPH
+ {0x9D7E, 0x636B}, //4481 #CJK UNIFIED IDEOGRAPH
+ {0x9D80, 0x6369}, //4482 #CJK UNIFIED IDEOGRAPH
+ {0x9D81, 0x63BE}, //4483 #CJK UNIFIED IDEOGRAPH
+ {0x9D82, 0x63E9}, //4484 #CJK UNIFIED IDEOGRAPH
+ {0x9D83, 0x63C0}, //4485 #CJK UNIFIED IDEOGRAPH
+ {0x9D84, 0x63C6}, //4486 #CJK UNIFIED IDEOGRAPH
+ {0x9D85, 0x63E3}, //4487 #CJK UNIFIED IDEOGRAPH
+ {0x9D86, 0x63C9}, //4488 #CJK UNIFIED IDEOGRAPH
+ {0x9D87, 0x63D2}, //4489 #CJK UNIFIED IDEOGRAPH
+ {0x9D88, 0x63F6}, //4490 #CJK UNIFIED IDEOGRAPH
+ {0x9D89, 0x63C4}, //4491 #CJK UNIFIED IDEOGRAPH
+ {0x9D8A, 0x6416}, //4492 #CJK UNIFIED IDEOGRAPH
+ {0x9D8B, 0x6434}, //4493 #CJK UNIFIED IDEOGRAPH
+ {0x9D8C, 0x6406}, //4494 #CJK UNIFIED IDEOGRAPH
+ {0x9D8D, 0x6413}, //4495 #CJK UNIFIED IDEOGRAPH
+ {0x9D8E, 0x6426}, //4496 #CJK UNIFIED IDEOGRAPH
+ {0x9D8F, 0x6436}, //4497 #CJK UNIFIED IDEOGRAPH
+ {0x9D90, 0x651D}, //4498 #CJK UNIFIED IDEOGRAPH
+ {0x9D91, 0x6417}, //4499 #CJK UNIFIED IDEOGRAPH
+ {0x9D92, 0x6428}, //4500 #CJK UNIFIED IDEOGRAPH
+ {0x9D93, 0x640F}, //4501 #CJK UNIFIED IDEOGRAPH
+ {0x9D94, 0x6467}, //4502 #CJK UNIFIED IDEOGRAPH
+ {0x9D95, 0x646F}, //4503 #CJK UNIFIED IDEOGRAPH
+ {0x9D96, 0x6476}, //4504 #CJK UNIFIED IDEOGRAPH
+ {0x9D97, 0x644E}, //4505 #CJK UNIFIED IDEOGRAPH
+ {0x9D98, 0x652A}, //4506 #CJK UNIFIED IDEOGRAPH
+ {0x9D99, 0x6495}, //4507 #CJK UNIFIED IDEOGRAPH
+ {0x9D9A, 0x6493}, //4508 #CJK UNIFIED IDEOGRAPH
+ {0x9D9B, 0x64A5}, //4509 #CJK UNIFIED IDEOGRAPH
+ {0x9D9C, 0x64A9}, //4510 #CJK UNIFIED IDEOGRAPH
+ {0x9D9D, 0x6488}, //4511 #CJK UNIFIED IDEOGRAPH
+ {0x9D9E, 0x64BC}, //4512 #CJK UNIFIED IDEOGRAPH
+ {0x9D9F, 0x64DA}, //4513 #CJK UNIFIED IDEOGRAPH
+ {0x9DA0, 0x64D2}, //4514 #CJK UNIFIED IDEOGRAPH
+ {0x9DA1, 0x64C5}, //4515 #CJK UNIFIED IDEOGRAPH
+ {0x9DA2, 0x64C7}, //4516 #CJK UNIFIED IDEOGRAPH
+ {0x9DA3, 0x64BB}, //4517 #CJK UNIFIED IDEOGRAPH
+ {0x9DA4, 0x64D8}, //4518 #CJK UNIFIED IDEOGRAPH
+ {0x9DA5, 0x64C2}, //4519 #CJK UNIFIED IDEOGRAPH
+ {0x9DA6, 0x64F1}, //4520 #CJK UNIFIED IDEOGRAPH
+ {0x9DA7, 0x64E7}, //4521 #CJK UNIFIED IDEOGRAPH
+ {0x9DA8, 0x8209}, //4522 #CJK UNIFIED IDEOGRAPH
+ {0x9DA9, 0x64E0}, //4523 #CJK UNIFIED IDEOGRAPH
+ {0x9DAA, 0x64E1}, //4524 #CJK UNIFIED IDEOGRAPH
+ {0x9DAB, 0x62AC}, //4525 #CJK UNIFIED IDEOGRAPH
+ {0x9DAC, 0x64E3}, //4526 #CJK UNIFIED IDEOGRAPH
+ {0x9DAD, 0x64EF}, //4527 #CJK UNIFIED IDEOGRAPH
+ {0x9DAE, 0x652C}, //4528 #CJK UNIFIED IDEOGRAPH
+ {0x9DAF, 0x64F6}, //4529 #CJK UNIFIED IDEOGRAPH
+ {0x9DB0, 0x64F4}, //4530 #CJK UNIFIED IDEOGRAPH
+ {0x9DB1, 0x64F2}, //4531 #CJK UNIFIED IDEOGRAPH
+ {0x9DB2, 0x64FA}, //4532 #CJK UNIFIED IDEOGRAPH
+ {0x9DB3, 0x6500}, //4533 #CJK UNIFIED IDEOGRAPH
+ {0x9DB4, 0x64FD}, //4534 #CJK UNIFIED IDEOGRAPH
+ {0x9DB5, 0x6518}, //4535 #CJK UNIFIED IDEOGRAPH
+ {0x9DB6, 0x651C}, //4536 #CJK UNIFIED IDEOGRAPH
+ {0x9DB7, 0x6505}, //4537 #CJK UNIFIED IDEOGRAPH
+ {0x9DB8, 0x6524}, //4538 #CJK UNIFIED IDEOGRAPH
+ {0x9DB9, 0x6523}, //4539 #CJK UNIFIED IDEOGRAPH
+ {0x9DBA, 0x652B}, //4540 #CJK UNIFIED IDEOGRAPH
+ {0x9DBB, 0x6534}, //4541 #CJK UNIFIED IDEOGRAPH
+ {0x9DBC, 0x6535}, //4542 #CJK UNIFIED IDEOGRAPH
+ {0x9DBD, 0x6537}, //4543 #CJK UNIFIED IDEOGRAPH
+ {0x9DBE, 0x6536}, //4544 #CJK UNIFIED IDEOGRAPH
+ {0x9DBF, 0x6538}, //4545 #CJK UNIFIED IDEOGRAPH
+ {0x9DC0, 0x754B}, //4546 #CJK UNIFIED IDEOGRAPH
+ {0x9DC1, 0x6548}, //4547 #CJK UNIFIED IDEOGRAPH
+ {0x9DC2, 0x6556}, //4548 #CJK UNIFIED IDEOGRAPH
+ {0x9DC3, 0x6555}, //4549 #CJK UNIFIED IDEOGRAPH
+ {0x9DC4, 0x654D}, //4550 #CJK UNIFIED IDEOGRAPH
+ {0x9DC5, 0x6558}, //4551 #CJK UNIFIED IDEOGRAPH
+ {0x9DC6, 0x655E}, //4552 #CJK UNIFIED IDEOGRAPH
+ {0x9DC7, 0x655D}, //4553 #CJK UNIFIED IDEOGRAPH
+ {0x9DC8, 0x6572}, //4554 #CJK UNIFIED IDEOGRAPH
+ {0x9DC9, 0x6578}, //4555 #CJK UNIFIED IDEOGRAPH
+ {0x9DCA, 0x6582}, //4556 #CJK UNIFIED IDEOGRAPH
+ {0x9DCB, 0x6583}, //4557 #CJK UNIFIED IDEOGRAPH
+ {0x9DCC, 0x8B8A}, //4558 #CJK UNIFIED IDEOGRAPH
+ {0x9DCD, 0x659B}, //4559 #CJK UNIFIED IDEOGRAPH
+ {0x9DCE, 0x659F}, //4560 #CJK UNIFIED IDEOGRAPH
+ {0x9DCF, 0x65AB}, //4561 #CJK UNIFIED IDEOGRAPH
+ {0x9DD0, 0x65B7}, //4562 #CJK UNIFIED IDEOGRAPH
+ {0x9DD1, 0x65C3}, //4563 #CJK UNIFIED IDEOGRAPH
+ {0x9DD2, 0x65C6}, //4564 #CJK UNIFIED IDEOGRAPH
+ {0x9DD3, 0x65C1}, //4565 #CJK UNIFIED IDEOGRAPH
+ {0x9DD4, 0x65C4}, //4566 #CJK UNIFIED IDEOGRAPH
+ {0x9DD5, 0x65CC}, //4567 #CJK UNIFIED IDEOGRAPH
+ {0x9DD6, 0x65D2}, //4568 #CJK UNIFIED IDEOGRAPH
+ {0x9DD7, 0x65DB}, //4569 #CJK UNIFIED IDEOGRAPH
+ {0x9DD8, 0x65D9}, //4570 #CJK UNIFIED IDEOGRAPH
+ {0x9DD9, 0x65E0}, //4571 #CJK UNIFIED IDEOGRAPH
+ {0x9DDA, 0x65E1}, //4572 #CJK UNIFIED IDEOGRAPH
+ {0x9DDB, 0x65F1}, //4573 #CJK UNIFIED IDEOGRAPH
+ {0x9DDC, 0x6772}, //4574 #CJK UNIFIED IDEOGRAPH
+ {0x9DDD, 0x660A}, //4575 #CJK UNIFIED IDEOGRAPH
+ {0x9DDE, 0x6603}, //4576 #CJK UNIFIED IDEOGRAPH
+ {0x9DDF, 0x65FB}, //4577 #CJK UNIFIED IDEOGRAPH
+ {0x9DE0, 0x6773}, //4578 #CJK UNIFIED IDEOGRAPH
+ {0x9DE1, 0x6635}, //4579 #CJK UNIFIED IDEOGRAPH
+ {0x9DE2, 0x6636}, //4580 #CJK UNIFIED IDEOGRAPH
+ {0x9DE3, 0x6634}, //4581 #CJK UNIFIED IDEOGRAPH
+ {0x9DE4, 0x661C}, //4582 #CJK UNIFIED IDEOGRAPH
+ {0x9DE5, 0x664F}, //4583 #CJK UNIFIED IDEOGRAPH
+ {0x9DE6, 0x6644}, //4584 #CJK UNIFIED IDEOGRAPH
+ {0x9DE7, 0x6649}, //4585 #CJK UNIFIED IDEOGRAPH
+ {0x9DE8, 0x6641}, //4586 #CJK UNIFIED IDEOGRAPH
+ {0x9DE9, 0x665E}, //4587 #CJK UNIFIED IDEOGRAPH
+ {0x9DEA, 0x665D}, //4588 #CJK UNIFIED IDEOGRAPH
+ {0x9DEB, 0x6664}, //4589 #CJK UNIFIED IDEOGRAPH
+ {0x9DEC, 0x6667}, //4590 #CJK UNIFIED IDEOGRAPH
+ {0x9DED, 0x6668}, //4591 #CJK UNIFIED IDEOGRAPH
+ {0x9DEE, 0x665F}, //4592 #CJK UNIFIED IDEOGRAPH
+ {0x9DEF, 0x6662}, //4593 #CJK UNIFIED IDEOGRAPH
+ {0x9DF0, 0x6670}, //4594 #CJK UNIFIED IDEOGRAPH
+ {0x9DF1, 0x6683}, //4595 #CJK UNIFIED IDEOGRAPH
+ {0x9DF2, 0x6688}, //4596 #CJK UNIFIED IDEOGRAPH
+ {0x9DF3, 0x668E}, //4597 #CJK UNIFIED IDEOGRAPH
+ {0x9DF4, 0x6689}, //4598 #CJK UNIFIED IDEOGRAPH
+ {0x9DF5, 0x6684}, //4599 #CJK UNIFIED IDEOGRAPH
+ {0x9DF6, 0x6698}, //4600 #CJK UNIFIED IDEOGRAPH
+ {0x9DF7, 0x669D}, //4601 #CJK UNIFIED IDEOGRAPH
+ {0x9DF8, 0x66C1}, //4602 #CJK UNIFIED IDEOGRAPH
+ {0x9DF9, 0x66B9}, //4603 #CJK UNIFIED IDEOGRAPH
+ {0x9DFA, 0x66C9}, //4604 #CJK UNIFIED IDEOGRAPH
+ {0x9DFB, 0x66BE}, //4605 #CJK UNIFIED IDEOGRAPH
+ {0x9DFC, 0x66BC}, //4606 #CJK UNIFIED IDEOGRAPH
+ {0x9E40, 0x66C4}, //4607 #CJK UNIFIED IDEOGRAPH
+ {0x9E41, 0x66B8}, //4608 #CJK UNIFIED IDEOGRAPH
+ {0x9E42, 0x66D6}, //4609 #CJK UNIFIED IDEOGRAPH
+ {0x9E43, 0x66DA}, //4610 #CJK UNIFIED IDEOGRAPH
+ {0x9E44, 0x66E0}, //4611 #CJK UNIFIED IDEOGRAPH
+ {0x9E45, 0x663F}, //4612 #CJK UNIFIED IDEOGRAPH
+ {0x9E46, 0x66E6}, //4613 #CJK UNIFIED IDEOGRAPH
+ {0x9E47, 0x66E9}, //4614 #CJK UNIFIED IDEOGRAPH
+ {0x9E48, 0x66F0}, //4615 #CJK UNIFIED IDEOGRAPH
+ {0x9E49, 0x66F5}, //4616 #CJK UNIFIED IDEOGRAPH
+ {0x9E4A, 0x66F7}, //4617 #CJK UNIFIED IDEOGRAPH
+ {0x9E4B, 0x670F}, //4618 #CJK UNIFIED IDEOGRAPH
+ {0x9E4C, 0x6716}, //4619 #CJK UNIFIED IDEOGRAPH
+ {0x9E4D, 0x671E}, //4620 #CJK UNIFIED IDEOGRAPH
+ {0x9E4E, 0x6726}, //4621 #CJK UNIFIED IDEOGRAPH
+ {0x9E4F, 0x6727}, //4622 #CJK UNIFIED IDEOGRAPH
+ {0x9E50, 0x9738}, //4623 #CJK UNIFIED IDEOGRAPH
+ {0x9E51, 0x672E}, //4624 #CJK UNIFIED IDEOGRAPH
+ {0x9E52, 0x673F}, //4625 #CJK UNIFIED IDEOGRAPH
+ {0x9E53, 0x6736}, //4626 #CJK UNIFIED IDEOGRAPH
+ {0x9E54, 0x6741}, //4627 #CJK UNIFIED IDEOGRAPH
+ {0x9E55, 0x6738}, //4628 #CJK UNIFIED IDEOGRAPH
+ {0x9E56, 0x6737}, //4629 #CJK UNIFIED IDEOGRAPH
+ {0x9E57, 0x6746}, //4630 #CJK UNIFIED IDEOGRAPH
+ {0x9E58, 0x675E}, //4631 #CJK UNIFIED IDEOGRAPH
+ {0x9E59, 0x6760}, //4632 #CJK UNIFIED IDEOGRAPH
+ {0x9E5A, 0x6759}, //4633 #CJK UNIFIED IDEOGRAPH
+ {0x9E5B, 0x6763}, //4634 #CJK UNIFIED IDEOGRAPH
+ {0x9E5C, 0x6764}, //4635 #CJK UNIFIED IDEOGRAPH
+ {0x9E5D, 0x6789}, //4636 #CJK UNIFIED IDEOGRAPH
+ {0x9E5E, 0x6770}, //4637 #CJK UNIFIED IDEOGRAPH
+ {0x9E5F, 0x67A9}, //4638 #CJK UNIFIED IDEOGRAPH
+ {0x9E60, 0x677C}, //4639 #CJK UNIFIED IDEOGRAPH
+ {0x9E61, 0x676A}, //4640 #CJK UNIFIED IDEOGRAPH
+ {0x9E62, 0x678C}, //4641 #CJK UNIFIED IDEOGRAPH
+ {0x9E63, 0x678B}, //4642 #CJK UNIFIED IDEOGRAPH
+ {0x9E64, 0x67A6}, //4643 #CJK UNIFIED IDEOGRAPH
+ {0x9E65, 0x67A1}, //4644 #CJK UNIFIED IDEOGRAPH
+ {0x9E66, 0x6785}, //4645 #CJK UNIFIED IDEOGRAPH
+ {0x9E67, 0x67B7}, //4646 #CJK UNIFIED IDEOGRAPH
+ {0x9E68, 0x67EF}, //4647 #CJK UNIFIED IDEOGRAPH
+ {0x9E69, 0x67B4}, //4648 #CJK UNIFIED IDEOGRAPH
+ {0x9E6A, 0x67EC}, //4649 #CJK UNIFIED IDEOGRAPH
+ {0x9E6B, 0x67B3}, //4650 #CJK UNIFIED IDEOGRAPH
+ {0x9E6C, 0x67E9}, //4651 #CJK UNIFIED IDEOGRAPH
+ {0x9E6D, 0x67B8}, //4652 #CJK UNIFIED IDEOGRAPH
+ {0x9E6E, 0x67E4}, //4653 #CJK UNIFIED IDEOGRAPH
+ {0x9E6F, 0x67DE}, //4654 #CJK UNIFIED IDEOGRAPH
+ {0x9E70, 0x67DD}, //4655 #CJK UNIFIED IDEOGRAPH
+ {0x9E71, 0x67E2}, //4656 #CJK UNIFIED IDEOGRAPH
+ {0x9E72, 0x67EE}, //4657 #CJK UNIFIED IDEOGRAPH
+ {0x9E73, 0x67B9}, //4658 #CJK UNIFIED IDEOGRAPH
+ {0x9E74, 0x67CE}, //4659 #CJK UNIFIED IDEOGRAPH
+ {0x9E75, 0x67C6}, //4660 #CJK UNIFIED IDEOGRAPH
+ {0x9E76, 0x67E7}, //4661 #CJK UNIFIED IDEOGRAPH
+ {0x9E77, 0x6A9C}, //4662 #CJK UNIFIED IDEOGRAPH
+ {0x9E78, 0x681E}, //4663 #CJK UNIFIED IDEOGRAPH
+ {0x9E79, 0x6846}, //4664 #CJK UNIFIED IDEOGRAPH
+ {0x9E7A, 0x6829}, //4665 #CJK UNIFIED IDEOGRAPH
+ {0x9E7B, 0x6840}, //4666 #CJK UNIFIED IDEOGRAPH
+ {0x9E7C, 0x684D}, //4667 #CJK UNIFIED IDEOGRAPH
+ {0x9E7D, 0x6832}, //4668 #CJK UNIFIED IDEOGRAPH
+ {0x9E7E, 0x684E}, //4669 #CJK UNIFIED IDEOGRAPH
+ {0x9E80, 0x68B3}, //4670 #CJK UNIFIED IDEOGRAPH
+ {0x9E81, 0x682B}, //4671 #CJK UNIFIED IDEOGRAPH
+ {0x9E82, 0x6859}, //4672 #CJK UNIFIED IDEOGRAPH
+ {0x9E83, 0x6863}, //4673 #CJK UNIFIED IDEOGRAPH
+ {0x9E84, 0x6877}, //4674 #CJK UNIFIED IDEOGRAPH
+ {0x9E85, 0x687F}, //4675 #CJK UNIFIED IDEOGRAPH
+ {0x9E86, 0x689F}, //4676 #CJK UNIFIED IDEOGRAPH
+ {0x9E87, 0x688F}, //4677 #CJK UNIFIED IDEOGRAPH
+ {0x9E88, 0x68AD}, //4678 #CJK UNIFIED IDEOGRAPH
+ {0x9E89, 0x6894}, //4679 #CJK UNIFIED IDEOGRAPH
+ {0x9E8A, 0x689D}, //4680 #CJK UNIFIED IDEOGRAPH
+ {0x9E8B, 0x689B}, //4681 #CJK UNIFIED IDEOGRAPH
+ {0x9E8C, 0x6883}, //4682 #CJK UNIFIED IDEOGRAPH
+ {0x9E8D, 0x6AAE}, //4683 #CJK UNIFIED IDEOGRAPH
+ {0x9E8E, 0x68B9}, //4684 #CJK UNIFIED IDEOGRAPH
+ {0x9E8F, 0x6874}, //4685 #CJK UNIFIED IDEOGRAPH
+ {0x9E90, 0x68B5}, //4686 #CJK UNIFIED IDEOGRAPH
+ {0x9E91, 0x68A0}, //4687 #CJK UNIFIED IDEOGRAPH
+ {0x9E92, 0x68BA}, //4688 #CJK UNIFIED IDEOGRAPH
+ {0x9E93, 0x690F}, //4689 #CJK UNIFIED IDEOGRAPH
+ {0x9E94, 0x688D}, //4690 #CJK UNIFIED IDEOGRAPH
+ {0x9E95, 0x687E}, //4691 #CJK UNIFIED IDEOGRAPH
+ {0x9E96, 0x6901}, //4692 #CJK UNIFIED IDEOGRAPH
+ {0x9E97, 0x68CA}, //4693 #CJK UNIFIED IDEOGRAPH
+ {0x9E98, 0x6908}, //4694 #CJK UNIFIED IDEOGRAPH
+ {0x9E99, 0x68D8}, //4695 #CJK UNIFIED IDEOGRAPH
+ {0x9E9A, 0x6922}, //4696 #CJK UNIFIED IDEOGRAPH
+ {0x9E9B, 0x6926}, //4697 #CJK UNIFIED IDEOGRAPH
+ {0x9E9C, 0x68E1}, //4698 #CJK UNIFIED IDEOGRAPH
+ {0x9E9D, 0x690C}, //4699 #CJK UNIFIED IDEOGRAPH
+ {0x9E9E, 0x68CD}, //4700 #CJK UNIFIED IDEOGRAPH
+ {0x9E9F, 0x68D4}, //4701 #CJK UNIFIED IDEOGRAPH
+ {0x9EA0, 0x68E7}, //4702 #CJK UNIFIED IDEOGRAPH
+ {0x9EA1, 0x68D5}, //4703 #CJK UNIFIED IDEOGRAPH
+ {0x9EA2, 0x6936}, //4704 #CJK UNIFIED IDEOGRAPH
+ {0x9EA3, 0x6912}, //4705 #CJK UNIFIED IDEOGRAPH
+ {0x9EA4, 0x6904}, //4706 #CJK UNIFIED IDEOGRAPH
+ {0x9EA5, 0x68D7}, //4707 #CJK UNIFIED IDEOGRAPH
+ {0x9EA6, 0x68E3}, //4708 #CJK UNIFIED IDEOGRAPH
+ {0x9EA7, 0x6925}, //4709 #CJK UNIFIED IDEOGRAPH
+ {0x9EA8, 0x68F9}, //4710 #CJK UNIFIED IDEOGRAPH
+ {0x9EA9, 0x68E0}, //4711 #CJK UNIFIED IDEOGRAPH
+ {0x9EAA, 0x68EF}, //4712 #CJK UNIFIED IDEOGRAPH
+ {0x9EAB, 0x6928}, //4713 #CJK UNIFIED IDEOGRAPH
+ {0x9EAC, 0x692A}, //4714 #CJK UNIFIED IDEOGRAPH
+ {0x9EAD, 0x691A}, //4715 #CJK UNIFIED IDEOGRAPH
+ {0x9EAE, 0x6923}, //4716 #CJK UNIFIED IDEOGRAPH
+ {0x9EAF, 0x6921}, //4717 #CJK UNIFIED IDEOGRAPH
+ {0x9EB0, 0x68C6}, //4718 #CJK UNIFIED IDEOGRAPH
+ {0x9EB1, 0x6979}, //4719 #CJK UNIFIED IDEOGRAPH
+ {0x9EB2, 0x6977}, //4720 #CJK UNIFIED IDEOGRAPH
+ {0x9EB3, 0x695C}, //4721 #CJK UNIFIED IDEOGRAPH
+ {0x9EB4, 0x6978}, //4722 #CJK UNIFIED IDEOGRAPH
+ {0x9EB5, 0x696B}, //4723 #CJK UNIFIED IDEOGRAPH
+ {0x9EB6, 0x6954}, //4724 #CJK UNIFIED IDEOGRAPH
+ {0x9EB7, 0x697E}, //4725 #CJK UNIFIED IDEOGRAPH
+ {0x9EB8, 0x696E}, //4726 #CJK UNIFIED IDEOGRAPH
+ {0x9EB9, 0x6939}, //4727 #CJK UNIFIED IDEOGRAPH
+ {0x9EBA, 0x6974}, //4728 #CJK UNIFIED IDEOGRAPH
+ {0x9EBB, 0x693D}, //4729 #CJK UNIFIED IDEOGRAPH
+ {0x9EBC, 0x6959}, //4730 #CJK UNIFIED IDEOGRAPH
+ {0x9EBD, 0x6930}, //4731 #CJK UNIFIED IDEOGRAPH
+ {0x9EBE, 0x6961}, //4732 #CJK UNIFIED IDEOGRAPH
+ {0x9EBF, 0x695E}, //4733 #CJK UNIFIED IDEOGRAPH
+ {0x9EC0, 0x695D}, //4734 #CJK UNIFIED IDEOGRAPH
+ {0x9EC1, 0x6981}, //4735 #CJK UNIFIED IDEOGRAPH
+ {0x9EC2, 0x696A}, //4736 #CJK UNIFIED IDEOGRAPH
+ {0x9EC3, 0x69B2}, //4737 #CJK UNIFIED IDEOGRAPH
+ {0x9EC4, 0x69AE}, //4738 #CJK UNIFIED IDEOGRAPH
+ {0x9EC5, 0x69D0}, //4739 #CJK UNIFIED IDEOGRAPH
+ {0x9EC6, 0x69BF}, //4740 #CJK UNIFIED IDEOGRAPH
+ {0x9EC7, 0x69C1}, //4741 #CJK UNIFIED IDEOGRAPH
+ {0x9EC8, 0x69D3}, //4742 #CJK UNIFIED IDEOGRAPH
+ {0x9EC9, 0x69BE}, //4743 #CJK UNIFIED IDEOGRAPH
+ {0x9ECA, 0x69CE}, //4744 #CJK UNIFIED IDEOGRAPH
+ {0x9ECB, 0x5BE8}, //4745 #CJK UNIFIED IDEOGRAPH
+ {0x9ECC, 0x69CA}, //4746 #CJK UNIFIED IDEOGRAPH
+ {0x9ECD, 0x69DD}, //4747 #CJK UNIFIED IDEOGRAPH
+ {0x9ECE, 0x69BB}, //4748 #CJK UNIFIED IDEOGRAPH
+ {0x9ECF, 0x69C3}, //4749 #CJK UNIFIED IDEOGRAPH
+ {0x9ED0, 0x69A7}, //4750 #CJK UNIFIED IDEOGRAPH
+ {0x9ED1, 0x6A2E}, //4751 #CJK UNIFIED IDEOGRAPH
+ {0x9ED2, 0x6991}, //4752 #CJK UNIFIED IDEOGRAPH
+ {0x9ED3, 0x69A0}, //4753 #CJK UNIFIED IDEOGRAPH
+ {0x9ED4, 0x699C}, //4754 #CJK UNIFIED IDEOGRAPH
+ {0x9ED5, 0x6995}, //4755 #CJK UNIFIED IDEOGRAPH
+ {0x9ED6, 0x69B4}, //4756 #CJK UNIFIED IDEOGRAPH
+ {0x9ED7, 0x69DE}, //4757 #CJK UNIFIED IDEOGRAPH
+ {0x9ED8, 0x69E8}, //4758 #CJK UNIFIED IDEOGRAPH
+ {0x9ED9, 0x6A02}, //4759 #CJK UNIFIED IDEOGRAPH
+ {0x9EDA, 0x6A1B}, //4760 #CJK UNIFIED IDEOGRAPH
+ {0x9EDB, 0x69FF}, //4761 #CJK UNIFIED IDEOGRAPH
+ {0x9EDC, 0x6B0A}, //4762 #CJK UNIFIED IDEOGRAPH
+ {0x9EDD, 0x69F9}, //4763 #CJK UNIFIED IDEOGRAPH
+ {0x9EDE, 0x69F2}, //4764 #CJK UNIFIED IDEOGRAPH
+ {0x9EDF, 0x69E7}, //4765 #CJK UNIFIED IDEOGRAPH
+ {0x9EE0, 0x6A05}, //4766 #CJK UNIFIED IDEOGRAPH
+ {0x9EE1, 0x69B1}, //4767 #CJK UNIFIED IDEOGRAPH
+ {0x9EE2, 0x6A1E}, //4768 #CJK UNIFIED IDEOGRAPH
+ {0x9EE3, 0x69ED}, //4769 #CJK UNIFIED IDEOGRAPH
+ {0x9EE4, 0x6A14}, //4770 #CJK UNIFIED IDEOGRAPH
+ {0x9EE5, 0x69EB}, //4771 #CJK UNIFIED IDEOGRAPH
+ {0x9EE6, 0x6A0A}, //4772 #CJK UNIFIED IDEOGRAPH
+ {0x9EE7, 0x6A12}, //4773 #CJK UNIFIED IDEOGRAPH
+ {0x9EE8, 0x6AC1}, //4774 #CJK UNIFIED IDEOGRAPH
+ {0x9EE9, 0x6A23}, //4775 #CJK UNIFIED IDEOGRAPH
+ {0x9EEA, 0x6A13}, //4776 #CJK UNIFIED IDEOGRAPH
+ {0x9EEB, 0x6A44}, //4777 #CJK UNIFIED IDEOGRAPH
+ {0x9EEC, 0x6A0C}, //4778 #CJK UNIFIED IDEOGRAPH
+ {0x9EED, 0x6A72}, //4779 #CJK UNIFIED IDEOGRAPH
+ {0x9EEE, 0x6A36}, //4780 #CJK UNIFIED IDEOGRAPH
+ {0x9EEF, 0x6A78}, //4781 #CJK UNIFIED IDEOGRAPH
+ {0x9EF0, 0x6A47}, //4782 #CJK UNIFIED IDEOGRAPH
+ {0x9EF1, 0x6A62}, //4783 #CJK UNIFIED IDEOGRAPH
+ {0x9EF2, 0x6A59}, //4784 #CJK UNIFIED IDEOGRAPH
+ {0x9EF3, 0x6A66}, //4785 #CJK UNIFIED IDEOGRAPH
+ {0x9EF4, 0x6A48}, //4786 #CJK UNIFIED IDEOGRAPH
+ {0x9EF5, 0x6A38}, //4787 #CJK UNIFIED IDEOGRAPH
+ {0x9EF6, 0x6A22}, //4788 #CJK UNIFIED IDEOGRAPH
+ {0x9EF7, 0x6A90}, //4789 #CJK UNIFIED IDEOGRAPH
+ {0x9EF8, 0x6A8D}, //4790 #CJK UNIFIED IDEOGRAPH
+ {0x9EF9, 0x6AA0}, //4791 #CJK UNIFIED IDEOGRAPH
+ {0x9EFA, 0x6A84}, //4792 #CJK UNIFIED IDEOGRAPH
+ {0x9EFB, 0x6AA2}, //4793 #CJK UNIFIED IDEOGRAPH
+ {0x9EFC, 0x6AA3}, //4794 #CJK UNIFIED IDEOGRAPH
+ {0x9F40, 0x6A97}, //4795 #CJK UNIFIED IDEOGRAPH
+ {0x9F41, 0x8617}, //4796 #CJK UNIFIED IDEOGRAPH
+ {0x9F42, 0x6ABB}, //4797 #CJK UNIFIED IDEOGRAPH
+ {0x9F43, 0x6AC3}, //4798 #CJK UNIFIED IDEOGRAPH
+ {0x9F44, 0x6AC2}, //4799 #CJK UNIFIED IDEOGRAPH
+ {0x9F45, 0x6AB8}, //4800 #CJK UNIFIED IDEOGRAPH
+ {0x9F46, 0x6AB3}, //4801 #CJK UNIFIED IDEOGRAPH
+ {0x9F47, 0x6AAC}, //4802 #CJK UNIFIED IDEOGRAPH
+ {0x9F48, 0x6ADE}, //4803 #CJK UNIFIED IDEOGRAPH
+ {0x9F49, 0x6AD1}, //4804 #CJK UNIFIED IDEOGRAPH
+ {0x9F4A, 0x6ADF}, //4805 #CJK UNIFIED IDEOGRAPH
+ {0x9F4B, 0x6AAA}, //4806 #CJK UNIFIED IDEOGRAPH
+ {0x9F4C, 0x6ADA}, //4807 #CJK UNIFIED IDEOGRAPH
+ {0x9F4D, 0x6AEA}, //4808 #CJK UNIFIED IDEOGRAPH
+ {0x9F4E, 0x6AFB}, //4809 #CJK UNIFIED IDEOGRAPH
+ {0x9F4F, 0x6B05}, //4810 #CJK UNIFIED IDEOGRAPH
+ {0x9F50, 0x8616}, //4811 #CJK UNIFIED IDEOGRAPH
+ {0x9F51, 0x6AFA}, //4812 #CJK UNIFIED IDEOGRAPH
+ {0x9F52, 0x6B12}, //4813 #CJK UNIFIED IDEOGRAPH
+ {0x9F53, 0x6B16}, //4814 #CJK UNIFIED IDEOGRAPH
+ {0x9F54, 0x9B31}, //4815 #CJK UNIFIED IDEOGRAPH
+ {0x9F55, 0x6B1F}, //4816 #CJK UNIFIED IDEOGRAPH
+ {0x9F56, 0x6B38}, //4817 #CJK UNIFIED IDEOGRAPH
+ {0x9F57, 0x6B37}, //4818 #CJK UNIFIED IDEOGRAPH
+ {0x9F58, 0x76DC}, //4819 #CJK UNIFIED IDEOGRAPH
+ {0x9F59, 0x6B39}, //4820 #CJK UNIFIED IDEOGRAPH
+ {0x9F5A, 0x98EE}, //4821 #CJK UNIFIED IDEOGRAPH
+ {0x9F5B, 0x6B47}, //4822 #CJK UNIFIED IDEOGRAPH
+ {0x9F5C, 0x6B43}, //4823 #CJK UNIFIED IDEOGRAPH
+ {0x9F5D, 0x6B49}, //4824 #CJK UNIFIED IDEOGRAPH
+ {0x9F5E, 0x6B50}, //4825 #CJK UNIFIED IDEOGRAPH
+ {0x9F5F, 0x6B59}, //4826 #CJK UNIFIED IDEOGRAPH
+ {0x9F60, 0x6B54}, //4827 #CJK UNIFIED IDEOGRAPH
+ {0x9F61, 0x6B5B}, //4828 #CJK UNIFIED IDEOGRAPH
+ {0x9F62, 0x6B5F}, //4829 #CJK UNIFIED IDEOGRAPH
+ {0x9F63, 0x6B61}, //4830 #CJK UNIFIED IDEOGRAPH
+ {0x9F64, 0x6B78}, //4831 #CJK UNIFIED IDEOGRAPH
+ {0x9F65, 0x6B79}, //4832 #CJK UNIFIED IDEOGRAPH
+ {0x9F66, 0x6B7F}, //4833 #CJK UNIFIED IDEOGRAPH
+ {0x9F67, 0x6B80}, //4834 #CJK UNIFIED IDEOGRAPH
+ {0x9F68, 0x6B84}, //4835 #CJK UNIFIED IDEOGRAPH
+ {0x9F69, 0x6B83}, //4836 #CJK UNIFIED IDEOGRAPH
+ {0x9F6A, 0x6B8D}, //4837 #CJK UNIFIED IDEOGRAPH
+ {0x9F6B, 0x6B98}, //4838 #CJK UNIFIED IDEOGRAPH
+ {0x9F6C, 0x6B95}, //4839 #CJK UNIFIED IDEOGRAPH
+ {0x9F6D, 0x6B9E}, //4840 #CJK UNIFIED IDEOGRAPH
+ {0x9F6E, 0x6BA4}, //4841 #CJK UNIFIED IDEOGRAPH
+ {0x9F6F, 0x6BAA}, //4842 #CJK UNIFIED IDEOGRAPH
+ {0x9F70, 0x6BAB}, //4843 #CJK UNIFIED IDEOGRAPH
+ {0x9F71, 0x6BAF}, //4844 #CJK UNIFIED IDEOGRAPH
+ {0x9F72, 0x6BB2}, //4845 #CJK UNIFIED IDEOGRAPH
+ {0x9F73, 0x6BB1}, //4846 #CJK UNIFIED IDEOGRAPH
+ {0x9F74, 0x6BB3}, //4847 #CJK UNIFIED IDEOGRAPH
+ {0x9F75, 0x6BB7}, //4848 #CJK UNIFIED IDEOGRAPH
+ {0x9F76, 0x6BBC}, //4849 #CJK UNIFIED IDEOGRAPH
+ {0x9F77, 0x6BC6}, //4850 #CJK UNIFIED IDEOGRAPH
+ {0x9F78, 0x6BCB}, //4851 #CJK UNIFIED IDEOGRAPH
+ {0x9F79, 0x6BD3}, //4852 #CJK UNIFIED IDEOGRAPH
+ {0x9F7A, 0x6BDF}, //4853 #CJK UNIFIED IDEOGRAPH
+ {0x9F7B, 0x6BEC}, //4854 #CJK UNIFIED IDEOGRAPH
+ {0x9F7C, 0x6BEB}, //4855 #CJK UNIFIED IDEOGRAPH
+ {0x9F7D, 0x6BF3}, //4856 #CJK UNIFIED IDEOGRAPH
+ {0x9F7E, 0x6BEF}, //4857 #CJK UNIFIED IDEOGRAPH
+ {0x9F80, 0x9EBE}, //4858 #CJK UNIFIED IDEOGRAPH
+ {0x9F81, 0x6C08}, //4859 #CJK UNIFIED IDEOGRAPH
+ {0x9F82, 0x6C13}, //4860 #CJK UNIFIED IDEOGRAPH
+ {0x9F83, 0x6C14}, //4861 #CJK UNIFIED IDEOGRAPH
+ {0x9F84, 0x6C1B}, //4862 #CJK UNIFIED IDEOGRAPH
+ {0x9F85, 0x6C24}, //4863 #CJK UNIFIED IDEOGRAPH
+ {0x9F86, 0x6C23}, //4864 #CJK UNIFIED IDEOGRAPH
+ {0x9F87, 0x6C5E}, //4865 #CJK UNIFIED IDEOGRAPH
+ {0x9F88, 0x6C55}, //4866 #CJK UNIFIED IDEOGRAPH
+ {0x9F89, 0x6C62}, //4867 #CJK UNIFIED IDEOGRAPH
+ {0x9F8A, 0x6C6A}, //4868 #CJK UNIFIED IDEOGRAPH
+ {0x9F8B, 0x6C82}, //4869 #CJK UNIFIED IDEOGRAPH
+ {0x9F8C, 0x6C8D}, //4870 #CJK UNIFIED IDEOGRAPH
+ {0x9F8D, 0x6C9A}, //4871 #CJK UNIFIED IDEOGRAPH
+ {0x9F8E, 0x6C81}, //4872 #CJK UNIFIED IDEOGRAPH
+ {0x9F8F, 0x6C9B}, //4873 #CJK UNIFIED IDEOGRAPH
+ {0x9F90, 0x6C7E}, //4874 #CJK UNIFIED IDEOGRAPH
+ {0x9F91, 0x6C68}, //4875 #CJK UNIFIED IDEOGRAPH
+ {0x9F92, 0x6C73}, //4876 #CJK UNIFIED IDEOGRAPH
+ {0x9F93, 0x6C92}, //4877 #CJK UNIFIED IDEOGRAPH
+ {0x9F94, 0x6C90}, //4878 #CJK UNIFIED IDEOGRAPH
+ {0x9F95, 0x6CC4}, //4879 #CJK UNIFIED IDEOGRAPH
+ {0x9F96, 0x6CF1}, //4880 #CJK UNIFIED IDEOGRAPH
+ {0x9F97, 0x6CD3}, //4881 #CJK UNIFIED IDEOGRAPH
+ {0x9F98, 0x6CBD}, //4882 #CJK UNIFIED IDEOGRAPH
+ {0x9F99, 0x6CD7}, //4883 #CJK UNIFIED IDEOGRAPH
+ {0x9F9A, 0x6CC5}, //4884 #CJK UNIFIED IDEOGRAPH
+ {0x9F9B, 0x6CDD}, //4885 #CJK UNIFIED IDEOGRAPH
+ {0x9F9C, 0x6CAE}, //4886 #CJK UNIFIED IDEOGRAPH
+ {0x9F9D, 0x6CB1}, //4887 #CJK UNIFIED IDEOGRAPH
+ {0x9F9E, 0x6CBE}, //4888 #CJK UNIFIED IDEOGRAPH
+ {0x9F9F, 0x6CBA}, //4889 #CJK UNIFIED IDEOGRAPH
+ {0x9FA0, 0x6CDB}, //4890 #CJK UNIFIED IDEOGRAPH
+ {0x9FA1, 0x6CEF}, //4891 #CJK UNIFIED IDEOGRAPH
+ {0x9FA2, 0x6CD9}, //4892 #CJK UNIFIED IDEOGRAPH
+ {0x9FA3, 0x6CEA}, //4893 #CJK UNIFIED IDEOGRAPH
+ {0x9FA4, 0x6D1F}, //4894 #CJK UNIFIED IDEOGRAPH
+ {0x9FA5, 0x884D}, //4895 #CJK UNIFIED IDEOGRAPH
+ {0x9FA6, 0x6D36}, //4896 #CJK UNIFIED IDEOGRAPH
+ {0x9FA7, 0x6D2B}, //4897 #CJK UNIFIED IDEOGRAPH
+ {0x9FA8, 0x6D3D}, //4898 #CJK UNIFIED IDEOGRAPH
+ {0x9FA9, 0x6D38}, //4899 #CJK UNIFIED IDEOGRAPH
+ {0x9FAA, 0x6D19}, //4900 #CJK UNIFIED IDEOGRAPH
+ {0x9FAB, 0x6D35}, //4901 #CJK UNIFIED IDEOGRAPH
+ {0x9FAC, 0x6D33}, //4902 #CJK UNIFIED IDEOGRAPH
+ {0x9FAD, 0x6D12}, //4903 #CJK UNIFIED IDEOGRAPH
+ {0x9FAE, 0x6D0C}, //4904 #CJK UNIFIED IDEOGRAPH
+ {0x9FAF, 0x6D63}, //4905 #CJK UNIFIED IDEOGRAPH
+ {0x9FB0, 0x6D93}, //4906 #CJK UNIFIED IDEOGRAPH
+ {0x9FB1, 0x6D64}, //4907 #CJK UNIFIED IDEOGRAPH
+ {0x9FB2, 0x6D5A}, //4908 #CJK UNIFIED IDEOGRAPH
+ {0x9FB3, 0x6D79}, //4909 #CJK UNIFIED IDEOGRAPH
+ {0x9FB4, 0x6D59}, //4910 #CJK UNIFIED IDEOGRAPH
+ {0x9FB5, 0x6D8E}, //4911 #CJK UNIFIED IDEOGRAPH
+ {0x9FB6, 0x6D95}, //4912 #CJK UNIFIED IDEOGRAPH
+ {0x9FB7, 0x6FE4}, //4913 #CJK UNIFIED IDEOGRAPH
+ {0x9FB8, 0x6D85}, //4914 #CJK UNIFIED IDEOGRAPH
+ {0x9FB9, 0x6DF9}, //4915 #CJK UNIFIED IDEOGRAPH
+ {0x9FBA, 0x6E15}, //4916 #CJK UNIFIED IDEOGRAPH
+ {0x9FBB, 0x6E0A}, //4917 #CJK UNIFIED IDEOGRAPH
+ {0x9FBC, 0x6DB5}, //4918 #CJK UNIFIED IDEOGRAPH
+ {0x9FBD, 0x6DC7}, //4919 #CJK UNIFIED IDEOGRAPH
+ {0x9FBE, 0x6DE6}, //4920 #CJK UNIFIED IDEOGRAPH
+ {0x9FBF, 0x6DB8}, //4921 #CJK UNIFIED IDEOGRAPH
+ {0x9FC0, 0x6DC6}, //4922 #CJK UNIFIED IDEOGRAPH
+ {0x9FC1, 0x6DEC}, //4923 #CJK UNIFIED IDEOGRAPH
+ {0x9FC2, 0x6DDE}, //4924 #CJK UNIFIED IDEOGRAPH
+ {0x9FC3, 0x6DCC}, //4925 #CJK UNIFIED IDEOGRAPH
+ {0x9FC4, 0x6DE8}, //4926 #CJK UNIFIED IDEOGRAPH
+ {0x9FC5, 0x6DD2}, //4927 #CJK UNIFIED IDEOGRAPH
+ {0x9FC6, 0x6DC5}, //4928 #CJK UNIFIED IDEOGRAPH
+ {0x9FC7, 0x6DFA}, //4929 #CJK UNIFIED IDEOGRAPH
+ {0x9FC8, 0x6DD9}, //4930 #CJK UNIFIED IDEOGRAPH
+ {0x9FC9, 0x6DE4}, //4931 #CJK UNIFIED IDEOGRAPH
+ {0x9FCA, 0x6DD5}, //4932 #CJK UNIFIED IDEOGRAPH
+ {0x9FCB, 0x6DEA}, //4933 #CJK UNIFIED IDEOGRAPH
+ {0x9FCC, 0x6DEE}, //4934 #CJK UNIFIED IDEOGRAPH
+ {0x9FCD, 0x6E2D}, //4935 #CJK UNIFIED IDEOGRAPH
+ {0x9FCE, 0x6E6E}, //4936 #CJK UNIFIED IDEOGRAPH
+ {0x9FCF, 0x6E2E}, //4937 #CJK UNIFIED IDEOGRAPH
+ {0x9FD0, 0x6E19}, //4938 #CJK UNIFIED IDEOGRAPH
+ {0x9FD1, 0x6E72}, //4939 #CJK UNIFIED IDEOGRAPH
+ {0x9FD2, 0x6E5F}, //4940 #CJK UNIFIED IDEOGRAPH
+ {0x9FD3, 0x6E3E}, //4941 #CJK UNIFIED IDEOGRAPH
+ {0x9FD4, 0x6E23}, //4942 #CJK UNIFIED IDEOGRAPH
+ {0x9FD5, 0x6E6B}, //4943 #CJK UNIFIED IDEOGRAPH
+ {0x9FD6, 0x6E2B}, //4944 #CJK UNIFIED IDEOGRAPH
+ {0x9FD7, 0x6E76}, //4945 #CJK UNIFIED IDEOGRAPH
+ {0x9FD8, 0x6E4D}, //4946 #CJK UNIFIED IDEOGRAPH
+ {0x9FD9, 0x6E1F}, //4947 #CJK UNIFIED IDEOGRAPH
+ {0x9FDA, 0x6E43}, //4948 #CJK UNIFIED IDEOGRAPH
+ {0x9FDB, 0x6E3A}, //4949 #CJK UNIFIED IDEOGRAPH
+ {0x9FDC, 0x6E4E}, //4950 #CJK UNIFIED IDEOGRAPH
+ {0x9FDD, 0x6E24}, //4951 #CJK UNIFIED IDEOGRAPH
+ {0x9FDE, 0x6EFF}, //4952 #CJK UNIFIED IDEOGRAPH
+ {0x9FDF, 0x6E1D}, //4953 #CJK UNIFIED IDEOGRAPH
+ {0x9FE0, 0x6E38}, //4954 #CJK UNIFIED IDEOGRAPH
+ {0x9FE1, 0x6E82}, //4955 #CJK UNIFIED IDEOGRAPH
+ {0x9FE2, 0x6EAA}, //4956 #CJK UNIFIED IDEOGRAPH
+ {0x9FE3, 0x6E98}, //4957 #CJK UNIFIED IDEOGRAPH
+ {0x9FE4, 0x6EC9}, //4958 #CJK UNIFIED IDEOGRAPH
+ {0x9FE5, 0x6EB7}, //4959 #CJK UNIFIED IDEOGRAPH
+ {0x9FE6, 0x6ED3}, //4960 #CJK UNIFIED IDEOGRAPH
+ {0x9FE7, 0x6EBD}, //4961 #CJK UNIFIED IDEOGRAPH
+ {0x9FE8, 0x6EAF}, //4962 #CJK UNIFIED IDEOGRAPH
+ {0x9FE9, 0x6EC4}, //4963 #CJK UNIFIED IDEOGRAPH
+ {0x9FEA, 0x6EB2}, //4964 #CJK UNIFIED IDEOGRAPH
+ {0x9FEB, 0x6ED4}, //4965 #CJK UNIFIED IDEOGRAPH
+ {0x9FEC, 0x6ED5}, //4966 #CJK UNIFIED IDEOGRAPH
+ {0x9FED, 0x6E8F}, //4967 #CJK UNIFIED IDEOGRAPH
+ {0x9FEE, 0x6EA5}, //4968 #CJK UNIFIED IDEOGRAPH
+ {0x9FEF, 0x6EC2}, //4969 #CJK UNIFIED IDEOGRAPH
+ {0x9FF0, 0x6E9F}, //4970 #CJK UNIFIED IDEOGRAPH
+ {0x9FF1, 0x6F41}, //4971 #CJK UNIFIED IDEOGRAPH
+ {0x9FF2, 0x6F11}, //4972 #CJK UNIFIED IDEOGRAPH
+ {0x9FF3, 0x704C}, //4973 #CJK UNIFIED IDEOGRAPH
+ {0x9FF4, 0x6EEC}, //4974 #CJK UNIFIED IDEOGRAPH
+ {0x9FF5, 0x6EF8}, //4975 #CJK UNIFIED IDEOGRAPH
+ {0x9FF6, 0x6EFE}, //4976 #CJK UNIFIED IDEOGRAPH
+ {0x9FF7, 0x6F3F}, //4977 #CJK UNIFIED IDEOGRAPH
+ {0x9FF8, 0x6EF2}, //4978 #CJK UNIFIED IDEOGRAPH
+ {0x9FF9, 0x6F31}, //4979 #CJK UNIFIED IDEOGRAPH
+ {0x9FFA, 0x6EEF}, //4980 #CJK UNIFIED IDEOGRAPH
+ {0x9FFB, 0x6F32}, //4981 #CJK UNIFIED IDEOGRAPH
+ {0x9FFC, 0x6ECC}, //4982 #CJK UNIFIED IDEOGRAPH
+ {0xE040, 0x6F3E}, //4983 #CJK UNIFIED IDEOGRAPH
+ {0xE041, 0x6F13}, //4984 #CJK UNIFIED IDEOGRAPH
+ {0xE042, 0x6EF7}, //4985 #CJK UNIFIED IDEOGRAPH
+ {0xE043, 0x6F86}, //4986 #CJK UNIFIED IDEOGRAPH
+ {0xE044, 0x6F7A}, //4987 #CJK UNIFIED IDEOGRAPH
+ {0xE045, 0x6F78}, //4988 #CJK UNIFIED IDEOGRAPH
+ {0xE046, 0x6F81}, //4989 #CJK UNIFIED IDEOGRAPH
+ {0xE047, 0x6F80}, //4990 #CJK UNIFIED IDEOGRAPH
+ {0xE048, 0x6F6F}, //4991 #CJK UNIFIED IDEOGRAPH
+ {0xE049, 0x6F5B}, //4992 #CJK UNIFIED IDEOGRAPH
+ {0xE04A, 0x6FF3}, //4993 #CJK UNIFIED IDEOGRAPH
+ {0xE04B, 0x6F6D}, //4994 #CJK UNIFIED IDEOGRAPH
+ {0xE04C, 0x6F82}, //4995 #CJK UNIFIED IDEOGRAPH
+ {0xE04D, 0x6F7C}, //4996 #CJK UNIFIED IDEOGRAPH
+ {0xE04E, 0x6F58}, //4997 #CJK UNIFIED IDEOGRAPH
+ {0xE04F, 0x6F8E}, //4998 #CJK UNIFIED IDEOGRAPH
+ {0xE050, 0x6F91}, //4999 #CJK UNIFIED IDEOGRAPH
+ {0xE051, 0x6FC2}, //5000 #CJK UNIFIED IDEOGRAPH
+ {0xE052, 0x6F66}, //5001 #CJK UNIFIED IDEOGRAPH
+ {0xE053, 0x6FB3}, //5002 #CJK UNIFIED IDEOGRAPH
+ {0xE054, 0x6FA3}, //5003 #CJK UNIFIED IDEOGRAPH
+ {0xE055, 0x6FA1}, //5004 #CJK UNIFIED IDEOGRAPH
+ {0xE056, 0x6FA4}, //5005 #CJK UNIFIED IDEOGRAPH
+ {0xE057, 0x6FB9}, //5006 #CJK UNIFIED IDEOGRAPH
+ {0xE058, 0x6FC6}, //5007 #CJK UNIFIED IDEOGRAPH
+ {0xE059, 0x6FAA}, //5008 #CJK UNIFIED IDEOGRAPH
+ {0xE05A, 0x6FDF}, //5009 #CJK UNIFIED IDEOGRAPH
+ {0xE05B, 0x6FD5}, //5010 #CJK UNIFIED IDEOGRAPH
+ {0xE05C, 0x6FEC}, //5011 #CJK UNIFIED IDEOGRAPH
+ {0xE05D, 0x6FD4}, //5012 #CJK UNIFIED IDEOGRAPH
+ {0xE05E, 0x6FD8}, //5013 #CJK UNIFIED IDEOGRAPH
+ {0xE05F, 0x6FF1}, //5014 #CJK UNIFIED IDEOGRAPH
+ {0xE060, 0x6FEE}, //5015 #CJK UNIFIED IDEOGRAPH
+ {0xE061, 0x6FDB}, //5016 #CJK UNIFIED IDEOGRAPH
+ {0xE062, 0x7009}, //5017 #CJK UNIFIED IDEOGRAPH
+ {0xE063, 0x700B}, //5018 #CJK UNIFIED IDEOGRAPH
+ {0xE064, 0x6FFA}, //5019 #CJK UNIFIED IDEOGRAPH
+ {0xE065, 0x7011}, //5020 #CJK UNIFIED IDEOGRAPH
+ {0xE066, 0x7001}, //5021 #CJK UNIFIED IDEOGRAPH
+ {0xE067, 0x700F}, //5022 #CJK UNIFIED IDEOGRAPH
+ {0xE068, 0x6FFE}, //5023 #CJK UNIFIED IDEOGRAPH
+ {0xE069, 0x701B}, //5024 #CJK UNIFIED IDEOGRAPH
+ {0xE06A, 0x701A}, //5025 #CJK UNIFIED IDEOGRAPH
+ {0xE06B, 0x6F74}, //5026 #CJK UNIFIED IDEOGRAPH
+ {0xE06C, 0x701D}, //5027 #CJK UNIFIED IDEOGRAPH
+ {0xE06D, 0x7018}, //5028 #CJK UNIFIED IDEOGRAPH
+ {0xE06E, 0x701F}, //5029 #CJK UNIFIED IDEOGRAPH
+ {0xE06F, 0x7030}, //5030 #CJK UNIFIED IDEOGRAPH
+ {0xE070, 0x703E}, //5031 #CJK UNIFIED IDEOGRAPH
+ {0xE071, 0x7032}, //5032 #CJK UNIFIED IDEOGRAPH
+ {0xE072, 0x7051}, //5033 #CJK UNIFIED IDEOGRAPH
+ {0xE073, 0x7063}, //5034 #CJK UNIFIED IDEOGRAPH
+ {0xE074, 0x7099}, //5035 #CJK UNIFIED IDEOGRAPH
+ {0xE075, 0x7092}, //5036 #CJK UNIFIED IDEOGRAPH
+ {0xE076, 0x70AF}, //5037 #CJK UNIFIED IDEOGRAPH
+ {0xE077, 0x70F1}, //5038 #CJK UNIFIED IDEOGRAPH
+ {0xE078, 0x70AC}, //5039 #CJK UNIFIED IDEOGRAPH
+ {0xE079, 0x70B8}, //5040 #CJK UNIFIED IDEOGRAPH
+ {0xE07A, 0x70B3}, //5041 #CJK UNIFIED IDEOGRAPH
+ {0xE07B, 0x70AE}, //5042 #CJK UNIFIED IDEOGRAPH
+ {0xE07C, 0x70DF}, //5043 #CJK UNIFIED IDEOGRAPH
+ {0xE07D, 0x70CB}, //5044 #CJK UNIFIED IDEOGRAPH
+ {0xE07E, 0x70DD}, //5045 #CJK UNIFIED IDEOGRAPH
+ {0xE080, 0x70D9}, //5046 #CJK UNIFIED IDEOGRAPH
+ {0xE081, 0x7109}, //5047 #CJK UNIFIED IDEOGRAPH
+ {0xE082, 0x70FD}, //5048 #CJK UNIFIED IDEOGRAPH
+ {0xE083, 0x711C}, //5049 #CJK UNIFIED IDEOGRAPH
+ {0xE084, 0x7119}, //5050 #CJK UNIFIED IDEOGRAPH
+ {0xE085, 0x7165}, //5051 #CJK UNIFIED IDEOGRAPH
+ {0xE086, 0x7155}, //5052 #CJK UNIFIED IDEOGRAPH
+ {0xE087, 0x7188}, //5053 #CJK UNIFIED IDEOGRAPH
+ {0xE088, 0x7166}, //5054 #CJK UNIFIED IDEOGRAPH
+ {0xE089, 0x7162}, //5055 #CJK UNIFIED IDEOGRAPH
+ {0xE08A, 0x714C}, //5056 #CJK UNIFIED IDEOGRAPH
+ {0xE08B, 0x7156}, //5057 #CJK UNIFIED IDEOGRAPH
+ {0xE08C, 0x716C}, //5058 #CJK UNIFIED IDEOGRAPH
+ {0xE08D, 0x718F}, //5059 #CJK UNIFIED IDEOGRAPH
+ {0xE08E, 0x71FB}, //5060 #CJK UNIFIED IDEOGRAPH
+ {0xE08F, 0x7184}, //5061 #CJK UNIFIED IDEOGRAPH
+ {0xE090, 0x7195}, //5062 #CJK UNIFIED IDEOGRAPH
+ {0xE091, 0x71A8}, //5063 #CJK UNIFIED IDEOGRAPH
+ {0xE092, 0x71AC}, //5064 #CJK UNIFIED IDEOGRAPH
+ {0xE093, 0x71D7}, //5065 #CJK UNIFIED IDEOGRAPH
+ {0xE094, 0x71B9}, //5066 #CJK UNIFIED IDEOGRAPH
+ {0xE095, 0x71BE}, //5067 #CJK UNIFIED IDEOGRAPH
+ {0xE096, 0x71D2}, //5068 #CJK UNIFIED IDEOGRAPH
+ {0xE097, 0x71C9}, //5069 #CJK UNIFIED IDEOGRAPH
+ {0xE098, 0x71D4}, //5070 #CJK UNIFIED IDEOGRAPH
+ {0xE099, 0x71CE}, //5071 #CJK UNIFIED IDEOGRAPH
+ {0xE09A, 0x71E0}, //5072 #CJK UNIFIED IDEOGRAPH
+ {0xE09B, 0x71EC}, //5073 #CJK UNIFIED IDEOGRAPH
+ {0xE09C, 0x71E7}, //5074 #CJK UNIFIED IDEOGRAPH
+ {0xE09D, 0x71F5}, //5075 #CJK UNIFIED IDEOGRAPH
+ {0xE09E, 0x71FC}, //5076 #CJK UNIFIED IDEOGRAPH
+ {0xE09F, 0x71F9}, //5077 #CJK UNIFIED IDEOGRAPH
+ {0xE0A0, 0x71FF}, //5078 #CJK UNIFIED IDEOGRAPH
+ {0xE0A1, 0x720D}, //5079 #CJK UNIFIED IDEOGRAPH
+ {0xE0A2, 0x7210}, //5080 #CJK UNIFIED IDEOGRAPH
+ {0xE0A3, 0x721B}, //5081 #CJK UNIFIED IDEOGRAPH
+ {0xE0A4, 0x7228}, //5082 #CJK UNIFIED IDEOGRAPH
+ {0xE0A5, 0x722D}, //5083 #CJK UNIFIED IDEOGRAPH
+ {0xE0A6, 0x722C}, //5084 #CJK UNIFIED IDEOGRAPH
+ {0xE0A7, 0x7230}, //5085 #CJK UNIFIED IDEOGRAPH
+ {0xE0A8, 0x7232}, //5086 #CJK UNIFIED IDEOGRAPH
+ {0xE0A9, 0x723B}, //5087 #CJK UNIFIED IDEOGRAPH
+ {0xE0AA, 0x723C}, //5088 #CJK UNIFIED IDEOGRAPH
+ {0xE0AB, 0x723F}, //5089 #CJK UNIFIED IDEOGRAPH
+ {0xE0AC, 0x7240}, //5090 #CJK UNIFIED IDEOGRAPH
+ {0xE0AD, 0x7246}, //5091 #CJK UNIFIED IDEOGRAPH
+ {0xE0AE, 0x724B}, //5092 #CJK UNIFIED IDEOGRAPH
+ {0xE0AF, 0x7258}, //5093 #CJK UNIFIED IDEOGRAPH
+ {0xE0B0, 0x7274}, //5094 #CJK UNIFIED IDEOGRAPH
+ {0xE0B1, 0x727E}, //5095 #CJK UNIFIED IDEOGRAPH
+ {0xE0B2, 0x7282}, //5096 #CJK UNIFIED IDEOGRAPH
+ {0xE0B3, 0x7281}, //5097 #CJK UNIFIED IDEOGRAPH
+ {0xE0B4, 0x7287}, //5098 #CJK UNIFIED IDEOGRAPH
+ {0xE0B5, 0x7292}, //5099 #CJK UNIFIED IDEOGRAPH
+ {0xE0B6, 0x7296}, //5100 #CJK UNIFIED IDEOGRAPH
+ {0xE0B7, 0x72A2}, //5101 #CJK UNIFIED IDEOGRAPH
+ {0xE0B8, 0x72A7}, //5102 #CJK UNIFIED IDEOGRAPH
+ {0xE0B9, 0x72B9}, //5103 #CJK UNIFIED IDEOGRAPH
+ {0xE0BA, 0x72B2}, //5104 #CJK UNIFIED IDEOGRAPH
+ {0xE0BB, 0x72C3}, //5105 #CJK UNIFIED IDEOGRAPH
+ {0xE0BC, 0x72C6}, //5106 #CJK UNIFIED IDEOGRAPH
+ {0xE0BD, 0x72C4}, //5107 #CJK UNIFIED IDEOGRAPH
+ {0xE0BE, 0x72CE}, //5108 #CJK UNIFIED IDEOGRAPH
+ {0xE0BF, 0x72D2}, //5109 #CJK UNIFIED IDEOGRAPH
+ {0xE0C0, 0x72E2}, //5110 #CJK UNIFIED IDEOGRAPH
+ {0xE0C1, 0x72E0}, //5111 #CJK UNIFIED IDEOGRAPH
+ {0xE0C2, 0x72E1}, //5112 #CJK UNIFIED IDEOGRAPH
+ {0xE0C3, 0x72F9}, //5113 #CJK UNIFIED IDEOGRAPH
+ {0xE0C4, 0x72F7}, //5114 #CJK UNIFIED IDEOGRAPH
+ {0xE0C5, 0x500F}, //5115 #CJK UNIFIED IDEOGRAPH
+ {0xE0C6, 0x7317}, //5116 #CJK UNIFIED IDEOGRAPH
+ {0xE0C7, 0x730A}, //5117 #CJK UNIFIED IDEOGRAPH
+ {0xE0C8, 0x731C}, //5118 #CJK UNIFIED IDEOGRAPH
+ {0xE0C9, 0x7316}, //5119 #CJK UNIFIED IDEOGRAPH
+ {0xE0CA, 0x731D}, //5120 #CJK UNIFIED IDEOGRAPH
+ {0xE0CB, 0x7334}, //5121 #CJK UNIFIED IDEOGRAPH
+ {0xE0CC, 0x732F}, //5122 #CJK UNIFIED IDEOGRAPH
+ {0xE0CD, 0x7329}, //5123 #CJK UNIFIED IDEOGRAPH
+ {0xE0CE, 0x7325}, //5124 #CJK UNIFIED IDEOGRAPH
+ {0xE0CF, 0x733E}, //5125 #CJK UNIFIED IDEOGRAPH
+ {0xE0D0, 0x734E}, //5126 #CJK UNIFIED IDEOGRAPH
+ {0xE0D1, 0x734F}, //5127 #CJK UNIFIED IDEOGRAPH
+ {0xE0D2, 0x9ED8}, //5128 #CJK UNIFIED IDEOGRAPH
+ {0xE0D3, 0x7357}, //5129 #CJK UNIFIED IDEOGRAPH
+ {0xE0D4, 0x736A}, //5130 #CJK UNIFIED IDEOGRAPH
+ {0xE0D5, 0x7368}, //5131 #CJK UNIFIED IDEOGRAPH
+ {0xE0D6, 0x7370}, //5132 #CJK UNIFIED IDEOGRAPH
+ {0xE0D7, 0x7378}, //5133 #CJK UNIFIED IDEOGRAPH
+ {0xE0D8, 0x7375}, //5134 #CJK UNIFIED IDEOGRAPH
+ {0xE0D9, 0x737B}, //5135 #CJK UNIFIED IDEOGRAPH
+ {0xE0DA, 0x737A}, //5136 #CJK UNIFIED IDEOGRAPH
+ {0xE0DB, 0x73C8}, //5137 #CJK UNIFIED IDEOGRAPH
+ {0xE0DC, 0x73B3}, //5138 #CJK UNIFIED IDEOGRAPH
+ {0xE0DD, 0x73CE}, //5139 #CJK UNIFIED IDEOGRAPH
+ {0xE0DE, 0x73BB}, //5140 #CJK UNIFIED IDEOGRAPH
+ {0xE0DF, 0x73C0}, //5141 #CJK UNIFIED IDEOGRAPH
+ {0xE0E0, 0x73E5}, //5142 #CJK UNIFIED IDEOGRAPH
+ {0xE0E1, 0x73EE}, //5143 #CJK UNIFIED IDEOGRAPH
+ {0xE0E2, 0x73DE}, //5144 #CJK UNIFIED IDEOGRAPH
+ {0xE0E3, 0x74A2}, //5145 #CJK UNIFIED IDEOGRAPH
+ {0xE0E4, 0x7405}, //5146 #CJK UNIFIED IDEOGRAPH
+ {0xE0E5, 0x746F}, //5147 #CJK UNIFIED IDEOGRAPH
+ {0xE0E6, 0x7425}, //5148 #CJK UNIFIED IDEOGRAPH
+ {0xE0E7, 0x73F8}, //5149 #CJK UNIFIED IDEOGRAPH
+ {0xE0E8, 0x7432}, //5150 #CJK UNIFIED IDEOGRAPH
+ {0xE0E9, 0x743A}, //5151 #CJK UNIFIED IDEOGRAPH
+ {0xE0EA, 0x7455}, //5152 #CJK UNIFIED IDEOGRAPH
+ {0xE0EB, 0x743F}, //5153 #CJK UNIFIED IDEOGRAPH
+ {0xE0EC, 0x745F}, //5154 #CJK UNIFIED IDEOGRAPH
+ {0xE0ED, 0x7459}, //5155 #CJK UNIFIED IDEOGRAPH
+ {0xE0EE, 0x7441}, //5156 #CJK UNIFIED IDEOGRAPH
+ {0xE0EF, 0x745C}, //5157 #CJK UNIFIED IDEOGRAPH
+ {0xE0F0, 0x7469}, //5158 #CJK UNIFIED IDEOGRAPH
+ {0xE0F1, 0x7470}, //5159 #CJK UNIFIED IDEOGRAPH
+ {0xE0F2, 0x7463}, //5160 #CJK UNIFIED IDEOGRAPH
+ {0xE0F3, 0x746A}, //5161 #CJK UNIFIED IDEOGRAPH
+ {0xE0F4, 0x7476}, //5162 #CJK UNIFIED IDEOGRAPH
+ {0xE0F5, 0x747E}, //5163 #CJK UNIFIED IDEOGRAPH
+ {0xE0F6, 0x748B}, //5164 #CJK UNIFIED IDEOGRAPH
+ {0xE0F7, 0x749E}, //5165 #CJK UNIFIED IDEOGRAPH
+ {0xE0F8, 0x74A7}, //5166 #CJK UNIFIED IDEOGRAPH
+ {0xE0F9, 0x74CA}, //5167 #CJK UNIFIED IDEOGRAPH
+ {0xE0FA, 0x74CF}, //5168 #CJK UNIFIED IDEOGRAPH
+ {0xE0FB, 0x74D4}, //5169 #CJK UNIFIED IDEOGRAPH
+ {0xE0FC, 0x73F1}, //5170 #CJK UNIFIED IDEOGRAPH
+ {0xE140, 0x74E0}, //5171 #CJK UNIFIED IDEOGRAPH
+ {0xE141, 0x74E3}, //5172 #CJK UNIFIED IDEOGRAPH
+ {0xE142, 0x74E7}, //5173 #CJK UNIFIED IDEOGRAPH
+ {0xE143, 0x74E9}, //5174 #CJK UNIFIED IDEOGRAPH
+ {0xE144, 0x74EE}, //5175 #CJK UNIFIED IDEOGRAPH
+ {0xE145, 0x74F2}, //5176 #CJK UNIFIED IDEOGRAPH
+ {0xE146, 0x74F0}, //5177 #CJK UNIFIED IDEOGRAPH
+ {0xE147, 0x74F1}, //5178 #CJK UNIFIED IDEOGRAPH
+ {0xE148, 0x74F8}, //5179 #CJK UNIFIED IDEOGRAPH
+ {0xE149, 0x74F7}, //5180 #CJK UNIFIED IDEOGRAPH
+ {0xE14A, 0x7504}, //5181 #CJK UNIFIED IDEOGRAPH
+ {0xE14B, 0x7503}, //5182 #CJK UNIFIED IDEOGRAPH
+ {0xE14C, 0x7505}, //5183 #CJK UNIFIED IDEOGRAPH
+ {0xE14D, 0x750C}, //5184 #CJK UNIFIED IDEOGRAPH
+ {0xE14E, 0x750E}, //5185 #CJK UNIFIED IDEOGRAPH
+ {0xE14F, 0x750D}, //5186 #CJK UNIFIED IDEOGRAPH
+ {0xE150, 0x7515}, //5187 #CJK UNIFIED IDEOGRAPH
+ {0xE151, 0x7513}, //5188 #CJK UNIFIED IDEOGRAPH
+ {0xE152, 0x751E}, //5189 #CJK UNIFIED IDEOGRAPH
+ {0xE153, 0x7526}, //5190 #CJK UNIFIED IDEOGRAPH
+ {0xE154, 0x752C}, //5191 #CJK UNIFIED IDEOGRAPH
+ {0xE155, 0x753C}, //5192 #CJK UNIFIED IDEOGRAPH
+ {0xE156, 0x7544}, //5193 #CJK UNIFIED IDEOGRAPH
+ {0xE157, 0x754D}, //5194 #CJK UNIFIED IDEOGRAPH
+ {0xE158, 0x754A}, //5195 #CJK UNIFIED IDEOGRAPH
+ {0xE159, 0x7549}, //5196 #CJK UNIFIED IDEOGRAPH
+ {0xE15A, 0x755B}, //5197 #CJK UNIFIED IDEOGRAPH
+ {0xE15B, 0x7546}, //5198 #CJK UNIFIED IDEOGRAPH
+ {0xE15C, 0x755A}, //5199 #CJK UNIFIED IDEOGRAPH
+ {0xE15D, 0x7569}, //5200 #CJK UNIFIED IDEOGRAPH
+ {0xE15E, 0x7564}, //5201 #CJK UNIFIED IDEOGRAPH
+ {0xE15F, 0x7567}, //5202 #CJK UNIFIED IDEOGRAPH
+ {0xE160, 0x756B}, //5203 #CJK UNIFIED IDEOGRAPH
+ {0xE161, 0x756D}, //5204 #CJK UNIFIED IDEOGRAPH
+ {0xE162, 0x7578}, //5205 #CJK UNIFIED IDEOGRAPH
+ {0xE163, 0x7576}, //5206 #CJK UNIFIED IDEOGRAPH
+ {0xE164, 0x7586}, //5207 #CJK UNIFIED IDEOGRAPH
+ {0xE165, 0x7587}, //5208 #CJK UNIFIED IDEOGRAPH
+ {0xE166, 0x7574}, //5209 #CJK UNIFIED IDEOGRAPH
+ {0xE167, 0x758A}, //5210 #CJK UNIFIED IDEOGRAPH
+ {0xE168, 0x7589}, //5211 #CJK UNIFIED IDEOGRAPH
+ {0xE169, 0x7582}, //5212 #CJK UNIFIED IDEOGRAPH
+ {0xE16A, 0x7594}, //5213 #CJK UNIFIED IDEOGRAPH
+ {0xE16B, 0x759A}, //5214 #CJK UNIFIED IDEOGRAPH
+ {0xE16C, 0x759D}, //5215 #CJK UNIFIED IDEOGRAPH
+ {0xE16D, 0x75A5}, //5216 #CJK UNIFIED IDEOGRAPH
+ {0xE16E, 0x75A3}, //5217 #CJK UNIFIED IDEOGRAPH
+ {0xE16F, 0x75C2}, //5218 #CJK UNIFIED IDEOGRAPH
+ {0xE170, 0x75B3}, //5219 #CJK UNIFIED IDEOGRAPH
+ {0xE171, 0x75C3}, //5220 #CJK UNIFIED IDEOGRAPH
+ {0xE172, 0x75B5}, //5221 #CJK UNIFIED IDEOGRAPH
+ {0xE173, 0x75BD}, //5222 #CJK UNIFIED IDEOGRAPH
+ {0xE174, 0x75B8}, //5223 #CJK UNIFIED IDEOGRAPH
+ {0xE175, 0x75BC}, //5224 #CJK UNIFIED IDEOGRAPH
+ {0xE176, 0x75B1}, //5225 #CJK UNIFIED IDEOGRAPH
+ {0xE177, 0x75CD}, //5226 #CJK UNIFIED IDEOGRAPH
+ {0xE178, 0x75CA}, //5227 #CJK UNIFIED IDEOGRAPH
+ {0xE179, 0x75D2}, //5228 #CJK UNIFIED IDEOGRAPH
+ {0xE17A, 0x75D9}, //5229 #CJK UNIFIED IDEOGRAPH
+ {0xE17B, 0x75E3}, //5230 #CJK UNIFIED IDEOGRAPH
+ {0xE17C, 0x75DE}, //5231 #CJK UNIFIED IDEOGRAPH
+ {0xE17D, 0x75FE}, //5232 #CJK UNIFIED IDEOGRAPH
+ {0xE17E, 0x75FF}, //5233 #CJK UNIFIED IDEOGRAPH
+ {0xE180, 0x75FC}, //5234 #CJK UNIFIED IDEOGRAPH
+ {0xE181, 0x7601}, //5235 #CJK UNIFIED IDEOGRAPH
+ {0xE182, 0x75F0}, //5236 #CJK UNIFIED IDEOGRAPH
+ {0xE183, 0x75FA}, //5237 #CJK UNIFIED IDEOGRAPH
+ {0xE184, 0x75F2}, //5238 #CJK UNIFIED IDEOGRAPH
+ {0xE185, 0x75F3}, //5239 #CJK UNIFIED IDEOGRAPH
+ {0xE186, 0x760B}, //5240 #CJK UNIFIED IDEOGRAPH
+ {0xE187, 0x760D}, //5241 #CJK UNIFIED IDEOGRAPH
+ {0xE188, 0x7609}, //5242 #CJK UNIFIED IDEOGRAPH
+ {0xE189, 0x761F}, //5243 #CJK UNIFIED IDEOGRAPH
+ {0xE18A, 0x7627}, //5244 #CJK UNIFIED IDEOGRAPH
+ {0xE18B, 0x7620}, //5245 #CJK UNIFIED IDEOGRAPH
+ {0xE18C, 0x7621}, //5246 #CJK UNIFIED IDEOGRAPH
+ {0xE18D, 0x7622}, //5247 #CJK UNIFIED IDEOGRAPH
+ {0xE18E, 0x7624}, //5248 #CJK UNIFIED IDEOGRAPH
+ {0xE18F, 0x7634}, //5249 #CJK UNIFIED IDEOGRAPH
+ {0xE190, 0x7630}, //5250 #CJK UNIFIED IDEOGRAPH
+ {0xE191, 0x763B}, //5251 #CJK UNIFIED IDEOGRAPH
+ {0xE192, 0x7647}, //5252 #CJK UNIFIED IDEOGRAPH
+ {0xE193, 0x7648}, //5253 #CJK UNIFIED IDEOGRAPH
+ {0xE194, 0x7646}, //5254 #CJK UNIFIED IDEOGRAPH
+ {0xE195, 0x765C}, //5255 #CJK UNIFIED IDEOGRAPH
+ {0xE196, 0x7658}, //5256 #CJK UNIFIED IDEOGRAPH
+ {0xE197, 0x7661}, //5257 #CJK UNIFIED IDEOGRAPH
+ {0xE198, 0x7662}, //5258 #CJK UNIFIED IDEOGRAPH
+ {0xE199, 0x7668}, //5259 #CJK UNIFIED IDEOGRAPH
+ {0xE19A, 0x7669}, //5260 #CJK UNIFIED IDEOGRAPH
+ {0xE19B, 0x766A}, //5261 #CJK UNIFIED IDEOGRAPH
+ {0xE19C, 0x7667}, //5262 #CJK UNIFIED IDEOGRAPH
+ {0xE19D, 0x766C}, //5263 #CJK UNIFIED IDEOGRAPH
+ {0xE19E, 0x7670}, //5264 #CJK UNIFIED IDEOGRAPH
+ {0xE19F, 0x7672}, //5265 #CJK UNIFIED IDEOGRAPH
+ {0xE1A0, 0x7676}, //5266 #CJK UNIFIED IDEOGRAPH
+ {0xE1A1, 0x7678}, //5267 #CJK UNIFIED IDEOGRAPH
+ {0xE1A2, 0x767C}, //5268 #CJK UNIFIED IDEOGRAPH
+ {0xE1A3, 0x7680}, //5269 #CJK UNIFIED IDEOGRAPH
+ {0xE1A4, 0x7683}, //5270 #CJK UNIFIED IDEOGRAPH
+ {0xE1A5, 0x7688}, //5271 #CJK UNIFIED IDEOGRAPH
+ {0xE1A6, 0x768B}, //5272 #CJK UNIFIED IDEOGRAPH
+ {0xE1A7, 0x768E}, //5273 #CJK UNIFIED IDEOGRAPH
+ {0xE1A8, 0x7696}, //5274 #CJK UNIFIED IDEOGRAPH
+ {0xE1A9, 0x7693}, //5275 #CJK UNIFIED IDEOGRAPH
+ {0xE1AA, 0x7699}, //5276 #CJK UNIFIED IDEOGRAPH
+ {0xE1AB, 0x769A}, //5277 #CJK UNIFIED IDEOGRAPH
+ {0xE1AC, 0x76B0}, //5278 #CJK UNIFIED IDEOGRAPH
+ {0xE1AD, 0x76B4}, //5279 #CJK UNIFIED IDEOGRAPH
+ {0xE1AE, 0x76B8}, //5280 #CJK UNIFIED IDEOGRAPH
+ {0xE1AF, 0x76B9}, //5281 #CJK UNIFIED IDEOGRAPH
+ {0xE1B0, 0x76BA}, //5282 #CJK UNIFIED IDEOGRAPH
+ {0xE1B1, 0x76C2}, //5283 #CJK UNIFIED IDEOGRAPH
+ {0xE1B2, 0x76CD}, //5284 #CJK UNIFIED IDEOGRAPH
+ {0xE1B3, 0x76D6}, //5285 #CJK UNIFIED IDEOGRAPH
+ {0xE1B4, 0x76D2}, //5286 #CJK UNIFIED IDEOGRAPH
+ {0xE1B5, 0x76DE}, //5287 #CJK UNIFIED IDEOGRAPH
+ {0xE1B6, 0x76E1}, //5288 #CJK UNIFIED IDEOGRAPH
+ {0xE1B7, 0x76E5}, //5289 #CJK UNIFIED IDEOGRAPH
+ {0xE1B8, 0x76E7}, //5290 #CJK UNIFIED IDEOGRAPH
+ {0xE1B9, 0x76EA}, //5291 #CJK UNIFIED IDEOGRAPH
+ {0xE1BA, 0x862F}, //5292 #CJK UNIFIED IDEOGRAPH
+ {0xE1BB, 0x76FB}, //5293 #CJK UNIFIED IDEOGRAPH
+ {0xE1BC, 0x7708}, //5294 #CJK UNIFIED IDEOGRAPH
+ {0xE1BD, 0x7707}, //5295 #CJK UNIFIED IDEOGRAPH
+ {0xE1BE, 0x7704}, //5296 #CJK UNIFIED IDEOGRAPH
+ {0xE1BF, 0x7729}, //5297 #CJK UNIFIED IDEOGRAPH
+ {0xE1C0, 0x7724}, //5298 #CJK UNIFIED IDEOGRAPH
+ {0xE1C1, 0x771E}, //5299 #CJK UNIFIED IDEOGRAPH
+ {0xE1C2, 0x7725}, //5300 #CJK UNIFIED IDEOGRAPH
+ {0xE1C3, 0x7726}, //5301 #CJK UNIFIED IDEOGRAPH
+ {0xE1C4, 0x771B}, //5302 #CJK UNIFIED IDEOGRAPH
+ {0xE1C5, 0x7737}, //5303 #CJK UNIFIED IDEOGRAPH
+ {0xE1C6, 0x7738}, //5304 #CJK UNIFIED IDEOGRAPH
+ {0xE1C7, 0x7747}, //5305 #CJK UNIFIED IDEOGRAPH
+ {0xE1C8, 0x775A}, //5306 #CJK UNIFIED IDEOGRAPH
+ {0xE1C9, 0x7768}, //5307 #CJK UNIFIED IDEOGRAPH
+ {0xE1CA, 0x776B}, //5308 #CJK UNIFIED IDEOGRAPH
+ {0xE1CB, 0x775B}, //5309 #CJK UNIFIED IDEOGRAPH
+ {0xE1CC, 0x7765}, //5310 #CJK UNIFIED IDEOGRAPH
+ {0xE1CD, 0x777F}, //5311 #CJK UNIFIED IDEOGRAPH
+ {0xE1CE, 0x777E}, //5312 #CJK UNIFIED IDEOGRAPH
+ {0xE1CF, 0x7779}, //5313 #CJK UNIFIED IDEOGRAPH
+ {0xE1D0, 0x778E}, //5314 #CJK UNIFIED IDEOGRAPH
+ {0xE1D1, 0x778B}, //5315 #CJK UNIFIED IDEOGRAPH
+ {0xE1D2, 0x7791}, //5316 #CJK UNIFIED IDEOGRAPH
+ {0xE1D3, 0x77A0}, //5317 #CJK UNIFIED IDEOGRAPH
+ {0xE1D4, 0x779E}, //5318 #CJK UNIFIED IDEOGRAPH
+ {0xE1D5, 0x77B0}, //5319 #CJK UNIFIED IDEOGRAPH
+ {0xE1D6, 0x77B6}, //5320 #CJK UNIFIED IDEOGRAPH
+ {0xE1D7, 0x77B9}, //5321 #CJK UNIFIED IDEOGRAPH
+ {0xE1D8, 0x77BF}, //5322 #CJK UNIFIED IDEOGRAPH
+ {0xE1D9, 0x77BC}, //5323 #CJK UNIFIED IDEOGRAPH
+ {0xE1DA, 0x77BD}, //5324 #CJK UNIFIED IDEOGRAPH
+ {0xE1DB, 0x77BB}, //5325 #CJK UNIFIED IDEOGRAPH
+ {0xE1DC, 0x77C7}, //5326 #CJK UNIFIED IDEOGRAPH
+ {0xE1DD, 0x77CD}, //5327 #CJK UNIFIED IDEOGRAPH
+ {0xE1DE, 0x77D7}, //5328 #CJK UNIFIED IDEOGRAPH
+ {0xE1DF, 0x77DA}, //5329 #CJK UNIFIED IDEOGRAPH
+ {0xE1E0, 0x77DC}, //5330 #CJK UNIFIED IDEOGRAPH
+ {0xE1E1, 0x77E3}, //5331 #CJK UNIFIED IDEOGRAPH
+ {0xE1E2, 0x77EE}, //5332 #CJK UNIFIED IDEOGRAPH
+ {0xE1E3, 0x77FC}, //5333 #CJK UNIFIED IDEOGRAPH
+ {0xE1E4, 0x780C}, //5334 #CJK UNIFIED IDEOGRAPH
+ {0xE1E5, 0x7812}, //5335 #CJK UNIFIED IDEOGRAPH
+ {0xE1E6, 0x7926}, //5336 #CJK UNIFIED IDEOGRAPH
+ {0xE1E7, 0x7820}, //5337 #CJK UNIFIED IDEOGRAPH
+ {0xE1E8, 0x792A}, //5338 #CJK UNIFIED IDEOGRAPH
+ {0xE1E9, 0x7845}, //5339 #CJK UNIFIED IDEOGRAPH
+ {0xE1EA, 0x788E}, //5340 #CJK UNIFIED IDEOGRAPH
+ {0xE1EB, 0x7874}, //5341 #CJK UNIFIED IDEOGRAPH
+ {0xE1EC, 0x7886}, //5342 #CJK UNIFIED IDEOGRAPH
+ {0xE1ED, 0x787C}, //5343 #CJK UNIFIED IDEOGRAPH
+ {0xE1EE, 0x789A}, //5344 #CJK UNIFIED IDEOGRAPH
+ {0xE1EF, 0x788C}, //5345 #CJK UNIFIED IDEOGRAPH
+ {0xE1F0, 0x78A3}, //5346 #CJK UNIFIED IDEOGRAPH
+ {0xE1F1, 0x78B5}, //5347 #CJK UNIFIED IDEOGRAPH
+ {0xE1F2, 0x78AA}, //5348 #CJK UNIFIED IDEOGRAPH
+ {0xE1F3, 0x78AF}, //5349 #CJK UNIFIED IDEOGRAPH
+ {0xE1F4, 0x78D1}, //5350 #CJK UNIFIED IDEOGRAPH
+ {0xE1F5, 0x78C6}, //5351 #CJK UNIFIED IDEOGRAPH
+ {0xE1F6, 0x78CB}, //5352 #CJK UNIFIED IDEOGRAPH
+ {0xE1F7, 0x78D4}, //5353 #CJK UNIFIED IDEOGRAPH
+ {0xE1F8, 0x78BE}, //5354 #CJK UNIFIED IDEOGRAPH
+ {0xE1F9, 0x78BC}, //5355 #CJK UNIFIED IDEOGRAPH
+ {0xE1FA, 0x78C5}, //5356 #CJK UNIFIED IDEOGRAPH
+ {0xE1FB, 0x78CA}, //5357 #CJK UNIFIED IDEOGRAPH
+ {0xE1FC, 0x78EC}, //5358 #CJK UNIFIED IDEOGRAPH
+ {0xE240, 0x78E7}, //5359 #CJK UNIFIED IDEOGRAPH
+ {0xE241, 0x78DA}, //5360 #CJK UNIFIED IDEOGRAPH
+ {0xE242, 0x78FD}, //5361 #CJK UNIFIED IDEOGRAPH
+ {0xE243, 0x78F4}, //5362 #CJK UNIFIED IDEOGRAPH
+ {0xE244, 0x7907}, //5363 #CJK UNIFIED IDEOGRAPH
+ {0xE245, 0x7912}, //5364 #CJK UNIFIED IDEOGRAPH
+ {0xE246, 0x7911}, //5365 #CJK UNIFIED IDEOGRAPH
+ {0xE247, 0x7919}, //5366 #CJK UNIFIED IDEOGRAPH
+ {0xE248, 0x792C}, //5367 #CJK UNIFIED IDEOGRAPH
+ {0xE249, 0x792B}, //5368 #CJK UNIFIED IDEOGRAPH
+ {0xE24A, 0x7940}, //5369 #CJK UNIFIED IDEOGRAPH
+ {0xE24B, 0x7960}, //5370 #CJK UNIFIED IDEOGRAPH
+ {0xE24C, 0x7957}, //5371 #CJK UNIFIED IDEOGRAPH
+ {0xE24D, 0x795F}, //5372 #CJK UNIFIED IDEOGRAPH
+ {0xE24E, 0x795A}, //5373 #CJK UNIFIED IDEOGRAPH
+ {0xE24F, 0x7955}, //5374 #CJK UNIFIED IDEOGRAPH
+ {0xE250, 0x7953}, //5375 #CJK UNIFIED IDEOGRAPH
+ {0xE251, 0x797A}, //5376 #CJK UNIFIED IDEOGRAPH
+ {0xE252, 0x797F}, //5377 #CJK UNIFIED IDEOGRAPH
+ {0xE253, 0x798A}, //5378 #CJK UNIFIED IDEOGRAPH
+ {0xE254, 0x799D}, //5379 #CJK UNIFIED IDEOGRAPH
+ {0xE255, 0x79A7}, //5380 #CJK UNIFIED IDEOGRAPH
+ {0xE256, 0x9F4B}, //5381 #CJK UNIFIED IDEOGRAPH
+ {0xE257, 0x79AA}, //5382 #CJK UNIFIED IDEOGRAPH
+ {0xE258, 0x79AE}, //5383 #CJK UNIFIED IDEOGRAPH
+ {0xE259, 0x79B3}, //5384 #CJK UNIFIED IDEOGRAPH
+ {0xE25A, 0x79B9}, //5385 #CJK UNIFIED IDEOGRAPH
+ {0xE25B, 0x79BA}, //5386 #CJK UNIFIED IDEOGRAPH
+ {0xE25C, 0x79C9}, //5387 #CJK UNIFIED IDEOGRAPH
+ {0xE25D, 0x79D5}, //5388 #CJK UNIFIED IDEOGRAPH
+ {0xE25E, 0x79E7}, //5389 #CJK UNIFIED IDEOGRAPH
+ {0xE25F, 0x79EC}, //5390 #CJK UNIFIED IDEOGRAPH
+ {0xE260, 0x79E1}, //5391 #CJK UNIFIED IDEOGRAPH
+ {0xE261, 0x79E3}, //5392 #CJK UNIFIED IDEOGRAPH
+ {0xE262, 0x7A08}, //5393 #CJK UNIFIED IDEOGRAPH
+ {0xE263, 0x7A0D}, //5394 #CJK UNIFIED IDEOGRAPH
+ {0xE264, 0x7A18}, //5395 #CJK UNIFIED IDEOGRAPH
+ {0xE265, 0x7A19}, //5396 #CJK UNIFIED IDEOGRAPH
+ {0xE266, 0x7A20}, //5397 #CJK UNIFIED IDEOGRAPH
+ {0xE267, 0x7A1F}, //5398 #CJK UNIFIED IDEOGRAPH
+ {0xE268, 0x7980}, //5399 #CJK UNIFIED IDEOGRAPH
+ {0xE269, 0x7A31}, //5400 #CJK UNIFIED IDEOGRAPH
+ {0xE26A, 0x7A3B}, //5401 #CJK UNIFIED IDEOGRAPH
+ {0xE26B, 0x7A3E}, //5402 #CJK UNIFIED IDEOGRAPH
+ {0xE26C, 0x7A37}, //5403 #CJK UNIFIED IDEOGRAPH
+ {0xE26D, 0x7A43}, //5404 #CJK UNIFIED IDEOGRAPH
+ {0xE26E, 0x7A57}, //5405 #CJK UNIFIED IDEOGRAPH
+ {0xE26F, 0x7A49}, //5406 #CJK UNIFIED IDEOGRAPH
+ {0xE270, 0x7A61}, //5407 #CJK UNIFIED IDEOGRAPH
+ {0xE271, 0x7A62}, //5408 #CJK UNIFIED IDEOGRAPH
+ {0xE272, 0x7A69}, //5409 #CJK UNIFIED IDEOGRAPH
+ {0xE273, 0x9F9D}, //5410 #CJK UNIFIED IDEOGRAPH
+ {0xE274, 0x7A70}, //5411 #CJK UNIFIED IDEOGRAPH
+ {0xE275, 0x7A79}, //5412 #CJK UNIFIED IDEOGRAPH
+ {0xE276, 0x7A7D}, //5413 #CJK UNIFIED IDEOGRAPH
+ {0xE277, 0x7A88}, //5414 #CJK UNIFIED IDEOGRAPH
+ {0xE278, 0x7A97}, //5415 #CJK UNIFIED IDEOGRAPH
+ {0xE279, 0x7A95}, //5416 #CJK UNIFIED IDEOGRAPH
+ {0xE27A, 0x7A98}, //5417 #CJK UNIFIED IDEOGRAPH
+ {0xE27B, 0x7A96}, //5418 #CJK UNIFIED IDEOGRAPH
+ {0xE27C, 0x7AA9}, //5419 #CJK UNIFIED IDEOGRAPH
+ {0xE27D, 0x7AC8}, //5420 #CJK UNIFIED IDEOGRAPH
+ {0xE27E, 0x7AB0}, //5421 #CJK UNIFIED IDEOGRAPH
+ {0xE280, 0x7AB6}, //5422 #CJK UNIFIED IDEOGRAPH
+ {0xE281, 0x7AC5}, //5423 #CJK UNIFIED IDEOGRAPH
+ {0xE282, 0x7AC4}, //5424 #CJK UNIFIED IDEOGRAPH
+ {0xE283, 0x7ABF}, //5425 #CJK UNIFIED IDEOGRAPH
+ {0xE284, 0x9083}, //5426 #CJK UNIFIED IDEOGRAPH
+ {0xE285, 0x7AC7}, //5427 #CJK UNIFIED IDEOGRAPH
+ {0xE286, 0x7ACA}, //5428 #CJK UNIFIED IDEOGRAPH
+ {0xE287, 0x7ACD}, //5429 #CJK UNIFIED IDEOGRAPH
+ {0xE288, 0x7ACF}, //5430 #CJK UNIFIED IDEOGRAPH
+ {0xE289, 0x7AD5}, //5431 #CJK UNIFIED IDEOGRAPH
+ {0xE28A, 0x7AD3}, //5432 #CJK UNIFIED IDEOGRAPH
+ {0xE28B, 0x7AD9}, //5433 #CJK UNIFIED IDEOGRAPH
+ {0xE28C, 0x7ADA}, //5434 #CJK UNIFIED IDEOGRAPH
+ {0xE28D, 0x7ADD}, //5435 #CJK UNIFIED IDEOGRAPH
+ {0xE28E, 0x7AE1}, //5436 #CJK UNIFIED IDEOGRAPH
+ {0xE28F, 0x7AE2}, //5437 #CJK UNIFIED IDEOGRAPH
+ {0xE290, 0x7AE6}, //5438 #CJK UNIFIED IDEOGRAPH
+ {0xE291, 0x7AED}, //5439 #CJK UNIFIED IDEOGRAPH
+ {0xE292, 0x7AF0}, //5440 #CJK UNIFIED IDEOGRAPH
+ {0xE293, 0x7B02}, //5441 #CJK UNIFIED IDEOGRAPH
+ {0xE294, 0x7B0F}, //5442 #CJK UNIFIED IDEOGRAPH
+ {0xE295, 0x7B0A}, //5443 #CJK UNIFIED IDEOGRAPH
+ {0xE296, 0x7B06}, //5444 #CJK UNIFIED IDEOGRAPH
+ {0xE297, 0x7B33}, //5445 #CJK UNIFIED IDEOGRAPH
+ {0xE298, 0x7B18}, //5446 #CJK UNIFIED IDEOGRAPH
+ {0xE299, 0x7B19}, //5447 #CJK UNIFIED IDEOGRAPH
+ {0xE29A, 0x7B1E}, //5448 #CJK UNIFIED IDEOGRAPH
+ {0xE29B, 0x7B35}, //5449 #CJK UNIFIED IDEOGRAPH
+ {0xE29C, 0x7B28}, //5450 #CJK UNIFIED IDEOGRAPH
+ {0xE29D, 0x7B36}, //5451 #CJK UNIFIED IDEOGRAPH
+ {0xE29E, 0x7B50}, //5452 #CJK UNIFIED IDEOGRAPH
+ {0xE29F, 0x7B7A}, //5453 #CJK UNIFIED IDEOGRAPH
+ {0xE2A0, 0x7B04}, //5454 #CJK UNIFIED IDEOGRAPH
+ {0xE2A1, 0x7B4D}, //5455 #CJK UNIFIED IDEOGRAPH
+ {0xE2A2, 0x7B0B}, //5456 #CJK UNIFIED IDEOGRAPH
+ {0xE2A3, 0x7B4C}, //5457 #CJK UNIFIED IDEOGRAPH
+ {0xE2A4, 0x7B45}, //5458 #CJK UNIFIED IDEOGRAPH
+ {0xE2A5, 0x7B75}, //5459 #CJK UNIFIED IDEOGRAPH
+ {0xE2A6, 0x7B65}, //5460 #CJK UNIFIED IDEOGRAPH
+ {0xE2A7, 0x7B74}, //5461 #CJK UNIFIED IDEOGRAPH
+ {0xE2A8, 0x7B67}, //5462 #CJK UNIFIED IDEOGRAPH
+ {0xE2A9, 0x7B70}, //5463 #CJK UNIFIED IDEOGRAPH
+ {0xE2AA, 0x7B71}, //5464 #CJK UNIFIED IDEOGRAPH
+ {0xE2AB, 0x7B6C}, //5465 #CJK UNIFIED IDEOGRAPH
+ {0xE2AC, 0x7B6E}, //5466 #CJK UNIFIED IDEOGRAPH
+ {0xE2AD, 0x7B9D}, //5467 #CJK UNIFIED IDEOGRAPH
+ {0xE2AE, 0x7B98}, //5468 #CJK UNIFIED IDEOGRAPH
+ {0xE2AF, 0x7B9F}, //5469 #CJK UNIFIED IDEOGRAPH
+ {0xE2B0, 0x7B8D}, //5470 #CJK UNIFIED IDEOGRAPH
+ {0xE2B1, 0x7B9C}, //5471 #CJK UNIFIED IDEOGRAPH
+ {0xE2B2, 0x7B9A}, //5472 #CJK UNIFIED IDEOGRAPH
+ {0xE2B3, 0x7B8B}, //5473 #CJK UNIFIED IDEOGRAPH
+ {0xE2B4, 0x7B92}, //5474 #CJK UNIFIED IDEOGRAPH
+ {0xE2B5, 0x7B8F}, //5475 #CJK UNIFIED IDEOGRAPH
+ {0xE2B6, 0x7B5D}, //5476 #CJK UNIFIED IDEOGRAPH
+ {0xE2B7, 0x7B99}, //5477 #CJK UNIFIED IDEOGRAPH
+ {0xE2B8, 0x7BCB}, //5478 #CJK UNIFIED IDEOGRAPH
+ {0xE2B9, 0x7BC1}, //5479 #CJK UNIFIED IDEOGRAPH
+ {0xE2BA, 0x7BCC}, //5480 #CJK UNIFIED IDEOGRAPH
+ {0xE2BB, 0x7BCF}, //5481 #CJK UNIFIED IDEOGRAPH
+ {0xE2BC, 0x7BB4}, //5482 #CJK UNIFIED IDEOGRAPH
+ {0xE2BD, 0x7BC6}, //5483 #CJK UNIFIED IDEOGRAPH
+ {0xE2BE, 0x7BDD}, //5484 #CJK UNIFIED IDEOGRAPH
+ {0xE2BF, 0x7BE9}, //5485 #CJK UNIFIED IDEOGRAPH
+ {0xE2C0, 0x7C11}, //5486 #CJK UNIFIED IDEOGRAPH
+ {0xE2C1, 0x7C14}, //5487 #CJK UNIFIED IDEOGRAPH
+ {0xE2C2, 0x7BE6}, //5488 #CJK UNIFIED IDEOGRAPH
+ {0xE2C3, 0x7BE5}, //5489 #CJK UNIFIED IDEOGRAPH
+ {0xE2C4, 0x7C60}, //5490 #CJK UNIFIED IDEOGRAPH
+ {0xE2C5, 0x7C00}, //5491 #CJK UNIFIED IDEOGRAPH
+ {0xE2C6, 0x7C07}, //5492 #CJK UNIFIED IDEOGRAPH
+ {0xE2C7, 0x7C13}, //5493 #CJK UNIFIED IDEOGRAPH
+ {0xE2C8, 0x7BF3}, //5494 #CJK UNIFIED IDEOGRAPH
+ {0xE2C9, 0x7BF7}, //5495 #CJK UNIFIED IDEOGRAPH
+ {0xE2CA, 0x7C17}, //5496 #CJK UNIFIED IDEOGRAPH
+ {0xE2CB, 0x7C0D}, //5497 #CJK UNIFIED IDEOGRAPH
+ {0xE2CC, 0x7BF6}, //5498 #CJK UNIFIED IDEOGRAPH
+ {0xE2CD, 0x7C23}, //5499 #CJK UNIFIED IDEOGRAPH
+ {0xE2CE, 0x7C27}, //5500 #CJK UNIFIED IDEOGRAPH
+ {0xE2CF, 0x7C2A}, //5501 #CJK UNIFIED IDEOGRAPH
+ {0xE2D0, 0x7C1F}, //5502 #CJK UNIFIED IDEOGRAPH
+ {0xE2D1, 0x7C37}, //5503 #CJK UNIFIED IDEOGRAPH
+ {0xE2D2, 0x7C2B}, //5504 #CJK UNIFIED IDEOGRAPH
+ {0xE2D3, 0x7C3D}, //5505 #CJK UNIFIED IDEOGRAPH
+ {0xE2D4, 0x7C4C}, //5506 #CJK UNIFIED IDEOGRAPH
+ {0xE2D5, 0x7C43}, //5507 #CJK UNIFIED IDEOGRAPH
+ {0xE2D6, 0x7C54}, //5508 #CJK UNIFIED IDEOGRAPH
+ {0xE2D7, 0x7C4F}, //5509 #CJK UNIFIED IDEOGRAPH
+ {0xE2D8, 0x7C40}, //5510 #CJK UNIFIED IDEOGRAPH
+ {0xE2D9, 0x7C50}, //5511 #CJK UNIFIED IDEOGRAPH
+ {0xE2DA, 0x7C58}, //5512 #CJK UNIFIED IDEOGRAPH
+ {0xE2DB, 0x7C5F}, //5513 #CJK UNIFIED IDEOGRAPH
+ {0xE2DC, 0x7C64}, //5514 #CJK UNIFIED IDEOGRAPH
+ {0xE2DD, 0x7C56}, //5515 #CJK UNIFIED IDEOGRAPH
+ {0xE2DE, 0x7C65}, //5516 #CJK UNIFIED IDEOGRAPH
+ {0xE2DF, 0x7C6C}, //5517 #CJK UNIFIED IDEOGRAPH
+ {0xE2E0, 0x7C75}, //5518 #CJK UNIFIED IDEOGRAPH
+ {0xE2E1, 0x7C83}, //5519 #CJK UNIFIED IDEOGRAPH
+ {0xE2E2, 0x7C90}, //5520 #CJK UNIFIED IDEOGRAPH
+ {0xE2E3, 0x7CA4}, //5521 #CJK UNIFIED IDEOGRAPH
+ {0xE2E4, 0x7CAD}, //5522 #CJK UNIFIED IDEOGRAPH
+ {0xE2E5, 0x7CA2}, //5523 #CJK UNIFIED IDEOGRAPH
+ {0xE2E6, 0x7CAB}, //5524 #CJK UNIFIED IDEOGRAPH
+ {0xE2E7, 0x7CA1}, //5525 #CJK UNIFIED IDEOGRAPH
+ {0xE2E8, 0x7CA8}, //5526 #CJK UNIFIED IDEOGRAPH
+ {0xE2E9, 0x7CB3}, //5527 #CJK UNIFIED IDEOGRAPH
+ {0xE2EA, 0x7CB2}, //5528 #CJK UNIFIED IDEOGRAPH
+ {0xE2EB, 0x7CB1}, //5529 #CJK UNIFIED IDEOGRAPH
+ {0xE2EC, 0x7CAE}, //5530 #CJK UNIFIED IDEOGRAPH
+ {0xE2ED, 0x7CB9}, //5531 #CJK UNIFIED IDEOGRAPH
+ {0xE2EE, 0x7CBD}, //5532 #CJK UNIFIED IDEOGRAPH
+ {0xE2EF, 0x7CC0}, //5533 #CJK UNIFIED IDEOGRAPH
+ {0xE2F0, 0x7CC5}, //5534 #CJK UNIFIED IDEOGRAPH
+ {0xE2F1, 0x7CC2}, //5535 #CJK UNIFIED IDEOGRAPH
+ {0xE2F2, 0x7CD8}, //5536 #CJK UNIFIED IDEOGRAPH
+ {0xE2F3, 0x7CD2}, //5537 #CJK UNIFIED IDEOGRAPH
+ {0xE2F4, 0x7CDC}, //5538 #CJK UNIFIED IDEOGRAPH
+ {0xE2F5, 0x7CE2}, //5539 #CJK UNIFIED IDEOGRAPH
+ {0xE2F6, 0x9B3B}, //5540 #CJK UNIFIED IDEOGRAPH
+ {0xE2F7, 0x7CEF}, //5541 #CJK UNIFIED IDEOGRAPH
+ {0xE2F8, 0x7CF2}, //5542 #CJK UNIFIED IDEOGRAPH
+ {0xE2F9, 0x7CF4}, //5543 #CJK UNIFIED IDEOGRAPH
+ {0xE2FA, 0x7CF6}, //5544 #CJK UNIFIED IDEOGRAPH
+ {0xE2FB, 0x7CFA}, //5545 #CJK UNIFIED IDEOGRAPH
+ {0xE2FC, 0x7D06}, //5546 #CJK UNIFIED IDEOGRAPH
+ {0xE340, 0x7D02}, //5547 #CJK UNIFIED IDEOGRAPH
+ {0xE341, 0x7D1C}, //5548 #CJK UNIFIED IDEOGRAPH
+ {0xE342, 0x7D15}, //5549 #CJK UNIFIED IDEOGRAPH
+ {0xE343, 0x7D0A}, //5550 #CJK UNIFIED IDEOGRAPH
+ {0xE344, 0x7D45}, //5551 #CJK UNIFIED IDEOGRAPH
+ {0xE345, 0x7D4B}, //5552 #CJK UNIFIED IDEOGRAPH
+ {0xE346, 0x7D2E}, //5553 #CJK UNIFIED IDEOGRAPH
+ {0xE347, 0x7D32}, //5554 #CJK UNIFIED IDEOGRAPH
+ {0xE348, 0x7D3F}, //5555 #CJK UNIFIED IDEOGRAPH
+ {0xE349, 0x7D35}, //5556 #CJK UNIFIED IDEOGRAPH
+ {0xE34A, 0x7D46}, //5557 #CJK UNIFIED IDEOGRAPH
+ {0xE34B, 0x7D73}, //5558 #CJK UNIFIED IDEOGRAPH
+ {0xE34C, 0x7D56}, //5559 #CJK UNIFIED IDEOGRAPH
+ {0xE34D, 0x7D4E}, //5560 #CJK UNIFIED IDEOGRAPH
+ {0xE34E, 0x7D72}, //5561 #CJK UNIFIED IDEOGRAPH
+ {0xE34F, 0x7D68}, //5562 #CJK UNIFIED IDEOGRAPH
+ {0xE350, 0x7D6E}, //5563 #CJK UNIFIED IDEOGRAPH
+ {0xE351, 0x7D4F}, //5564 #CJK UNIFIED IDEOGRAPH
+ {0xE352, 0x7D63}, //5565 #CJK UNIFIED IDEOGRAPH
+ {0xE353, 0x7D93}, //5566 #CJK UNIFIED IDEOGRAPH
+ {0xE354, 0x7D89}, //5567 #CJK UNIFIED IDEOGRAPH
+ {0xE355, 0x7D5B}, //5568 #CJK UNIFIED IDEOGRAPH
+ {0xE356, 0x7D8F}, //5569 #CJK UNIFIED IDEOGRAPH
+ {0xE357, 0x7D7D}, //5570 #CJK UNIFIED IDEOGRAPH
+ {0xE358, 0x7D9B}, //5571 #CJK UNIFIED IDEOGRAPH
+ {0xE359, 0x7DBA}, //5572 #CJK UNIFIED IDEOGRAPH
+ {0xE35A, 0x7DAE}, //5573 #CJK UNIFIED IDEOGRAPH
+ {0xE35B, 0x7DA3}, //5574 #CJK UNIFIED IDEOGRAPH
+ {0xE35C, 0x7DB5}, //5575 #CJK UNIFIED IDEOGRAPH
+ {0xE35D, 0x7DC7}, //5576 #CJK UNIFIED IDEOGRAPH
+ {0xE35E, 0x7DBD}, //5577 #CJK UNIFIED IDEOGRAPH
+ {0xE35F, 0x7DAB}, //5578 #CJK UNIFIED IDEOGRAPH
+ {0xE360, 0x7E3D}, //5579 #CJK UNIFIED IDEOGRAPH
+ {0xE361, 0x7DA2}, //5580 #CJK UNIFIED IDEOGRAPH
+ {0xE362, 0x7DAF}, //5581 #CJK UNIFIED IDEOGRAPH
+ {0xE363, 0x7DDC}, //5582 #CJK UNIFIED IDEOGRAPH
+ {0xE364, 0x7DB8}, //5583 #CJK UNIFIED IDEOGRAPH
+ {0xE365, 0x7D9F}, //5584 #CJK UNIFIED IDEOGRAPH
+ {0xE366, 0x7DB0}, //5585 #CJK UNIFIED IDEOGRAPH
+ {0xE367, 0x7DD8}, //5586 #CJK UNIFIED IDEOGRAPH
+ {0xE368, 0x7DDD}, //5587 #CJK UNIFIED IDEOGRAPH
+ {0xE369, 0x7DE4}, //5588 #CJK UNIFIED IDEOGRAPH
+ {0xE36A, 0x7DDE}, //5589 #CJK UNIFIED IDEOGRAPH
+ {0xE36B, 0x7DFB}, //5590 #CJK UNIFIED IDEOGRAPH
+ {0xE36C, 0x7DF2}, //5591 #CJK UNIFIED IDEOGRAPH
+ {0xE36D, 0x7DE1}, //5592 #CJK UNIFIED IDEOGRAPH
+ {0xE36E, 0x7E05}, //5593 #CJK UNIFIED IDEOGRAPH
+ {0xE36F, 0x7E0A}, //5594 #CJK UNIFIED IDEOGRAPH
+ {0xE370, 0x7E23}, //5595 #CJK UNIFIED IDEOGRAPH
+ {0xE371, 0x7E21}, //5596 #CJK UNIFIED IDEOGRAPH
+ {0xE372, 0x7E12}, //5597 #CJK UNIFIED IDEOGRAPH
+ {0xE373, 0x7E31}, //5598 #CJK UNIFIED IDEOGRAPH
+ {0xE374, 0x7E1F}, //5599 #CJK UNIFIED IDEOGRAPH
+ {0xE375, 0x7E09}, //5600 #CJK UNIFIED IDEOGRAPH
+ {0xE376, 0x7E0B}, //5601 #CJK UNIFIED IDEOGRAPH
+ {0xE377, 0x7E22}, //5602 #CJK UNIFIED IDEOGRAPH
+ {0xE378, 0x7E46}, //5603 #CJK UNIFIED IDEOGRAPH
+ {0xE379, 0x7E66}, //5604 #CJK UNIFIED IDEOGRAPH
+ {0xE37A, 0x7E3B}, //5605 #CJK UNIFIED IDEOGRAPH
+ {0xE37B, 0x7E35}, //5606 #CJK UNIFIED IDEOGRAPH
+ {0xE37C, 0x7E39}, //5607 #CJK UNIFIED IDEOGRAPH
+ {0xE37D, 0x7E43}, //5608 #CJK UNIFIED IDEOGRAPH
+ {0xE37E, 0x7E37}, //5609 #CJK UNIFIED IDEOGRAPH
+ {0xE380, 0x7E32}, //5610 #CJK UNIFIED IDEOGRAPH
+ {0xE381, 0x7E3A}, //5611 #CJK UNIFIED IDEOGRAPH
+ {0xE382, 0x7E67}, //5612 #CJK UNIFIED IDEOGRAPH
+ {0xE383, 0x7E5D}, //5613 #CJK UNIFIED IDEOGRAPH
+ {0xE384, 0x7E56}, //5614 #CJK UNIFIED IDEOGRAPH
+ {0xE385, 0x7E5E}, //5615 #CJK UNIFIED IDEOGRAPH
+ {0xE386, 0x7E59}, //5616 #CJK UNIFIED IDEOGRAPH
+ {0xE387, 0x7E5A}, //5617 #CJK UNIFIED IDEOGRAPH
+ {0xE388, 0x7E79}, //5618 #CJK UNIFIED IDEOGRAPH
+ {0xE389, 0x7E6A}, //5619 #CJK UNIFIED IDEOGRAPH
+ {0xE38A, 0x7E69}, //5620 #CJK UNIFIED IDEOGRAPH
+ {0xE38B, 0x7E7C}, //5621 #CJK UNIFIED IDEOGRAPH
+ {0xE38C, 0x7E7B}, //5622 #CJK UNIFIED IDEOGRAPH
+ {0xE38D, 0x7E83}, //5623 #CJK UNIFIED IDEOGRAPH
+ {0xE38E, 0x7DD5}, //5624 #CJK UNIFIED IDEOGRAPH
+ {0xE38F, 0x7E7D}, //5625 #CJK UNIFIED IDEOGRAPH
+ {0xE390, 0x8FAE}, //5626 #CJK UNIFIED IDEOGRAPH
+ {0xE391, 0x7E7F}, //5627 #CJK UNIFIED IDEOGRAPH
+ {0xE392, 0x7E88}, //5628 #CJK UNIFIED IDEOGRAPH
+ {0xE393, 0x7E89}, //5629 #CJK UNIFIED IDEOGRAPH
+ {0xE394, 0x7E8C}, //5630 #CJK UNIFIED IDEOGRAPH
+ {0xE395, 0x7E92}, //5631 #CJK UNIFIED IDEOGRAPH
+ {0xE396, 0x7E90}, //5632 #CJK UNIFIED IDEOGRAPH
+ {0xE397, 0x7E93}, //5633 #CJK UNIFIED IDEOGRAPH
+ {0xE398, 0x7E94}, //5634 #CJK UNIFIED IDEOGRAPH
+ {0xE399, 0x7E96}, //5635 #CJK UNIFIED IDEOGRAPH
+ {0xE39A, 0x7E8E}, //5636 #CJK UNIFIED IDEOGRAPH
+ {0xE39B, 0x7E9B}, //5637 #CJK UNIFIED IDEOGRAPH
+ {0xE39C, 0x7E9C}, //5638 #CJK UNIFIED IDEOGRAPH
+ {0xE39D, 0x7F38}, //5639 #CJK UNIFIED IDEOGRAPH
+ {0xE39E, 0x7F3A}, //5640 #CJK UNIFIED IDEOGRAPH
+ {0xE39F, 0x7F45}, //5641 #CJK UNIFIED IDEOGRAPH
+ {0xE3A0, 0x7F4C}, //5642 #CJK UNIFIED IDEOGRAPH
+ {0xE3A1, 0x7F4D}, //5643 #CJK UNIFIED IDEOGRAPH
+ {0xE3A2, 0x7F4E}, //5644 #CJK UNIFIED IDEOGRAPH
+ {0xE3A3, 0x7F50}, //5645 #CJK UNIFIED IDEOGRAPH
+ {0xE3A4, 0x7F51}, //5646 #CJK UNIFIED IDEOGRAPH
+ {0xE3A5, 0x7F55}, //5647 #CJK UNIFIED IDEOGRAPH
+ {0xE3A6, 0x7F54}, //5648 #CJK UNIFIED IDEOGRAPH
+ {0xE3A7, 0x7F58}, //5649 #CJK UNIFIED IDEOGRAPH
+ {0xE3A8, 0x7F5F}, //5650 #CJK UNIFIED IDEOGRAPH
+ {0xE3A9, 0x7F60}, //5651 #CJK UNIFIED IDEOGRAPH
+ {0xE3AA, 0x7F68}, //5652 #CJK UNIFIED IDEOGRAPH
+ {0xE3AB, 0x7F69}, //5653 #CJK UNIFIED IDEOGRAPH
+ {0xE3AC, 0x7F67}, //5654 #CJK UNIFIED IDEOGRAPH
+ {0xE3AD, 0x7F78}, //5655 #CJK UNIFIED IDEOGRAPH
+ {0xE3AE, 0x7F82}, //5656 #CJK UNIFIED IDEOGRAPH
+ {0xE3AF, 0x7F86}, //5657 #CJK UNIFIED IDEOGRAPH
+ {0xE3B0, 0x7F83}, //5658 #CJK UNIFIED IDEOGRAPH
+ {0xE3B1, 0x7F88}, //5659 #CJK UNIFIED IDEOGRAPH
+ {0xE3B2, 0x7F87}, //5660 #CJK UNIFIED IDEOGRAPH
+ {0xE3B3, 0x7F8C}, //5661 #CJK UNIFIED IDEOGRAPH
+ {0xE3B4, 0x7F94}, //5662 #CJK UNIFIED IDEOGRAPH
+ {0xE3B5, 0x7F9E}, //5663 #CJK UNIFIED IDEOGRAPH
+ {0xE3B6, 0x7F9D}, //5664 #CJK UNIFIED IDEOGRAPH
+ {0xE3B7, 0x7F9A}, //5665 #CJK UNIFIED IDEOGRAPH
+ {0xE3B8, 0x7FA3}, //5666 #CJK UNIFIED IDEOGRAPH
+ {0xE3B9, 0x7FAF}, //5667 #CJK UNIFIED IDEOGRAPH
+ {0xE3BA, 0x7FB2}, //5668 #CJK UNIFIED IDEOGRAPH
+ {0xE3BB, 0x7FB9}, //5669 #CJK UNIFIED IDEOGRAPH
+ {0xE3BC, 0x7FAE}, //5670 #CJK UNIFIED IDEOGRAPH
+ {0xE3BD, 0x7FB6}, //5671 #CJK UNIFIED IDEOGRAPH
+ {0xE3BE, 0x7FB8}, //5672 #CJK UNIFIED IDEOGRAPH
+ {0xE3BF, 0x8B71}, //5673 #CJK UNIFIED IDEOGRAPH
+ {0xE3C0, 0x7FC5}, //5674 #CJK UNIFIED IDEOGRAPH
+ {0xE3C1, 0x7FC6}, //5675 #CJK UNIFIED IDEOGRAPH
+ {0xE3C2, 0x7FCA}, //5676 #CJK UNIFIED IDEOGRAPH
+ {0xE3C3, 0x7FD5}, //5677 #CJK UNIFIED IDEOGRAPH
+ {0xE3C4, 0x7FD4}, //5678 #CJK UNIFIED IDEOGRAPH
+ {0xE3C5, 0x7FE1}, //5679 #CJK UNIFIED IDEOGRAPH
+ {0xE3C6, 0x7FE6}, //5680 #CJK UNIFIED IDEOGRAPH
+ {0xE3C7, 0x7FE9}, //5681 #CJK UNIFIED IDEOGRAPH
+ {0xE3C8, 0x7FF3}, //5682 #CJK UNIFIED IDEOGRAPH
+ {0xE3C9, 0x7FF9}, //5683 #CJK UNIFIED IDEOGRAPH
+ {0xE3CA, 0x98DC}, //5684 #CJK UNIFIED IDEOGRAPH
+ {0xE3CB, 0x8006}, //5685 #CJK UNIFIED IDEOGRAPH
+ {0xE3CC, 0x8004}, //5686 #CJK UNIFIED IDEOGRAPH
+ {0xE3CD, 0x800B}, //5687 #CJK UNIFIED IDEOGRAPH
+ {0xE3CE, 0x8012}, //5688 #CJK UNIFIED IDEOGRAPH
+ {0xE3CF, 0x8018}, //5689 #CJK UNIFIED IDEOGRAPH
+ {0xE3D0, 0x8019}, //5690 #CJK UNIFIED IDEOGRAPH
+ {0xE3D1, 0x801C}, //5691 #CJK UNIFIED IDEOGRAPH
+ {0xE3D2, 0x8021}, //5692 #CJK UNIFIED IDEOGRAPH
+ {0xE3D3, 0x8028}, //5693 #CJK UNIFIED IDEOGRAPH
+ {0xE3D4, 0x803F}, //5694 #CJK UNIFIED IDEOGRAPH
+ {0xE3D5, 0x803B}, //5695 #CJK UNIFIED IDEOGRAPH
+ {0xE3D6, 0x804A}, //5696 #CJK UNIFIED IDEOGRAPH
+ {0xE3D7, 0x8046}, //5697 #CJK UNIFIED IDEOGRAPH
+ {0xE3D8, 0x8052}, //5698 #CJK UNIFIED IDEOGRAPH
+ {0xE3D9, 0x8058}, //5699 #CJK UNIFIED IDEOGRAPH
+ {0xE3DA, 0x805A}, //5700 #CJK UNIFIED IDEOGRAPH
+ {0xE3DB, 0x805F}, //5701 #CJK UNIFIED IDEOGRAPH
+ {0xE3DC, 0x8062}, //5702 #CJK UNIFIED IDEOGRAPH
+ {0xE3DD, 0x8068}, //5703 #CJK UNIFIED IDEOGRAPH
+ {0xE3DE, 0x8073}, //5704 #CJK UNIFIED IDEOGRAPH
+ {0xE3DF, 0x8072}, //5705 #CJK UNIFIED IDEOGRAPH
+ {0xE3E0, 0x8070}, //5706 #CJK UNIFIED IDEOGRAPH
+ {0xE3E1, 0x8076}, //5707 #CJK UNIFIED IDEOGRAPH
+ {0xE3E2, 0x8079}, //5708 #CJK UNIFIED IDEOGRAPH
+ {0xE3E3, 0x807D}, //5709 #CJK UNIFIED IDEOGRAPH
+ {0xE3E4, 0x807F}, //5710 #CJK UNIFIED IDEOGRAPH
+ {0xE3E5, 0x8084}, //5711 #CJK UNIFIED IDEOGRAPH
+ {0xE3E6, 0x8086}, //5712 #CJK UNIFIED IDEOGRAPH
+ {0xE3E7, 0x8085}, //5713 #CJK UNIFIED IDEOGRAPH
+ {0xE3E8, 0x809B}, //5714 #CJK UNIFIED IDEOGRAPH
+ {0xE3E9, 0x8093}, //5715 #CJK UNIFIED IDEOGRAPH
+ {0xE3EA, 0x809A}, //5716 #CJK UNIFIED IDEOGRAPH
+ {0xE3EB, 0x80AD}, //5717 #CJK UNIFIED IDEOGRAPH
+ {0xE3EC, 0x5190}, //5718 #CJK UNIFIED IDEOGRAPH
+ {0xE3ED, 0x80AC}, //5719 #CJK UNIFIED IDEOGRAPH
+ {0xE3EE, 0x80DB}, //5720 #CJK UNIFIED IDEOGRAPH
+ {0xE3EF, 0x80E5}, //5721 #CJK UNIFIED IDEOGRAPH
+ {0xE3F0, 0x80D9}, //5722 #CJK UNIFIED IDEOGRAPH
+ {0xE3F1, 0x80DD}, //5723 #CJK UNIFIED IDEOGRAPH
+ {0xE3F2, 0x80C4}, //5724 #CJK UNIFIED IDEOGRAPH
+ {0xE3F3, 0x80DA}, //5725 #CJK UNIFIED IDEOGRAPH
+ {0xE3F4, 0x80D6}, //5726 #CJK UNIFIED IDEOGRAPH
+ {0xE3F5, 0x8109}, //5727 #CJK UNIFIED IDEOGRAPH
+ {0xE3F6, 0x80EF}, //5728 #CJK UNIFIED IDEOGRAPH
+ {0xE3F7, 0x80F1}, //5729 #CJK UNIFIED IDEOGRAPH
+ {0xE3F8, 0x811B}, //5730 #CJK UNIFIED IDEOGRAPH
+ {0xE3F9, 0x8129}, //5731 #CJK UNIFIED IDEOGRAPH
+ {0xE3FA, 0x8123}, //5732 #CJK UNIFIED IDEOGRAPH
+ {0xE3FB, 0x812F}, //5733 #CJK UNIFIED IDEOGRAPH
+ {0xE3FC, 0x814B}, //5734 #CJK UNIFIED IDEOGRAPH
+ {0xE440, 0x968B}, //5735 #CJK UNIFIED IDEOGRAPH
+ {0xE441, 0x8146}, //5736 #CJK UNIFIED IDEOGRAPH
+ {0xE442, 0x813E}, //5737 #CJK UNIFIED IDEOGRAPH
+ {0xE443, 0x8153}, //5738 #CJK UNIFIED IDEOGRAPH
+ {0xE444, 0x8151}, //5739 #CJK UNIFIED IDEOGRAPH
+ {0xE445, 0x80FC}, //5740 #CJK UNIFIED IDEOGRAPH
+ {0xE446, 0x8171}, //5741 #CJK UNIFIED IDEOGRAPH
+ {0xE447, 0x816E}, //5742 #CJK UNIFIED IDEOGRAPH
+ {0xE448, 0x8165}, //5743 #CJK UNIFIED IDEOGRAPH
+ {0xE449, 0x8166}, //5744 #CJK UNIFIED IDEOGRAPH
+ {0xE44A, 0x8174}, //5745 #CJK UNIFIED IDEOGRAPH
+ {0xE44B, 0x8183}, //5746 #CJK UNIFIED IDEOGRAPH
+ {0xE44C, 0x8188}, //5747 #CJK UNIFIED IDEOGRAPH
+ {0xE44D, 0x818A}, //5748 #CJK UNIFIED IDEOGRAPH
+ {0xE44E, 0x8180}, //5749 #CJK UNIFIED IDEOGRAPH
+ {0xE44F, 0x8182}, //5750 #CJK UNIFIED IDEOGRAPH
+ {0xE450, 0x81A0}, //5751 #CJK UNIFIED IDEOGRAPH
+ {0xE451, 0x8195}, //5752 #CJK UNIFIED IDEOGRAPH
+ {0xE452, 0x81A4}, //5753 #CJK UNIFIED IDEOGRAPH
+ {0xE453, 0x81A3}, //5754 #CJK UNIFIED IDEOGRAPH
+ {0xE454, 0x815F}, //5755 #CJK UNIFIED IDEOGRAPH
+ {0xE455, 0x8193}, //5756 #CJK UNIFIED IDEOGRAPH
+ {0xE456, 0x81A9}, //5757 #CJK UNIFIED IDEOGRAPH
+ {0xE457, 0x81B0}, //5758 #CJK UNIFIED IDEOGRAPH
+ {0xE458, 0x81B5}, //5759 #CJK UNIFIED IDEOGRAPH
+ {0xE459, 0x81BE}, //5760 #CJK UNIFIED IDEOGRAPH
+ {0xE45A, 0x81B8}, //5761 #CJK UNIFIED IDEOGRAPH
+ {0xE45B, 0x81BD}, //5762 #CJK UNIFIED IDEOGRAPH
+ {0xE45C, 0x81C0}, //5763 #CJK UNIFIED IDEOGRAPH
+ {0xE45D, 0x81C2}, //5764 #CJK UNIFIED IDEOGRAPH
+ {0xE45E, 0x81BA}, //5765 #CJK UNIFIED IDEOGRAPH
+ {0xE45F, 0x81C9}, //5766 #CJK UNIFIED IDEOGRAPH
+ {0xE460, 0x81CD}, //5767 #CJK UNIFIED IDEOGRAPH
+ {0xE461, 0x81D1}, //5768 #CJK UNIFIED IDEOGRAPH
+ {0xE462, 0x81D9}, //5769 #CJK UNIFIED IDEOGRAPH
+ {0xE463, 0x81D8}, //5770 #CJK UNIFIED IDEOGRAPH
+ {0xE464, 0x81C8}, //5771 #CJK UNIFIED IDEOGRAPH
+ {0xE465, 0x81DA}, //5772 #CJK UNIFIED IDEOGRAPH
+ {0xE466, 0x81DF}, //5773 #CJK UNIFIED IDEOGRAPH
+ {0xE467, 0x81E0}, //5774 #CJK UNIFIED IDEOGRAPH
+ {0xE468, 0x81E7}, //5775 #CJK UNIFIED IDEOGRAPH
+ {0xE469, 0x81FA}, //5776 #CJK UNIFIED IDEOGRAPH
+ {0xE46A, 0x81FB}, //5777 #CJK UNIFIED IDEOGRAPH
+ {0xE46B, 0x81FE}, //5778 #CJK UNIFIED IDEOGRAPH
+ {0xE46C, 0x8201}, //5779 #CJK UNIFIED IDEOGRAPH
+ {0xE46D, 0x8202}, //5780 #CJK UNIFIED IDEOGRAPH
+ {0xE46E, 0x8205}, //5781 #CJK UNIFIED IDEOGRAPH
+ {0xE46F, 0x8207}, //5782 #CJK UNIFIED IDEOGRAPH
+ {0xE470, 0x820A}, //5783 #CJK UNIFIED IDEOGRAPH
+ {0xE471, 0x820D}, //5784 #CJK UNIFIED IDEOGRAPH
+ {0xE472, 0x8210}, //5785 #CJK UNIFIED IDEOGRAPH
+ {0xE473, 0x8216}, //5786 #CJK UNIFIED IDEOGRAPH
+ {0xE474, 0x8229}, //5787 #CJK UNIFIED IDEOGRAPH
+ {0xE475, 0x822B}, //5788 #CJK UNIFIED IDEOGRAPH
+ {0xE476, 0x8238}, //5789 #CJK UNIFIED IDEOGRAPH
+ {0xE477, 0x8233}, //5790 #CJK UNIFIED IDEOGRAPH
+ {0xE478, 0x8240}, //5791 #CJK UNIFIED IDEOGRAPH
+ {0xE479, 0x8259}, //5792 #CJK UNIFIED IDEOGRAPH
+ {0xE47A, 0x8258}, //5793 #CJK UNIFIED IDEOGRAPH
+ {0xE47B, 0x825D}, //5794 #CJK UNIFIED IDEOGRAPH
+ {0xE47C, 0x825A}, //5795 #CJK UNIFIED IDEOGRAPH
+ {0xE47D, 0x825F}, //5796 #CJK UNIFIED IDEOGRAPH
+ {0xE47E, 0x8264}, //5797 #CJK UNIFIED IDEOGRAPH
+ {0xE480, 0x8262}, //5798 #CJK UNIFIED IDEOGRAPH
+ {0xE481, 0x8268}, //5799 #CJK UNIFIED IDEOGRAPH
+ {0xE482, 0x826A}, //5800 #CJK UNIFIED IDEOGRAPH
+ {0xE483, 0x826B}, //5801 #CJK UNIFIED IDEOGRAPH
+ {0xE484, 0x822E}, //5802 #CJK UNIFIED IDEOGRAPH
+ {0xE485, 0x8271}, //5803 #CJK UNIFIED IDEOGRAPH
+ {0xE486, 0x8277}, //5804 #CJK UNIFIED IDEOGRAPH
+ {0xE487, 0x8278}, //5805 #CJK UNIFIED IDEOGRAPH
+ {0xE488, 0x827E}, //5806 #CJK UNIFIED IDEOGRAPH
+ {0xE489, 0x828D}, //5807 #CJK UNIFIED IDEOGRAPH
+ {0xE48A, 0x8292}, //5808 #CJK UNIFIED IDEOGRAPH
+ {0xE48B, 0x82AB}, //5809 #CJK UNIFIED IDEOGRAPH
+ {0xE48C, 0x829F}, //5810 #CJK UNIFIED IDEOGRAPH
+ {0xE48D, 0x82BB}, //5811 #CJK UNIFIED IDEOGRAPH
+ {0xE48E, 0x82AC}, //5812 #CJK UNIFIED IDEOGRAPH
+ {0xE48F, 0x82E1}, //5813 #CJK UNIFIED IDEOGRAPH
+ {0xE490, 0x82E3}, //5814 #CJK UNIFIED IDEOGRAPH
+ {0xE491, 0x82DF}, //5815 #CJK UNIFIED IDEOGRAPH
+ {0xE492, 0x82D2}, //5816 #CJK UNIFIED IDEOGRAPH
+ {0xE493, 0x82F4}, //5817 #CJK UNIFIED IDEOGRAPH
+ {0xE494, 0x82F3}, //5818 #CJK UNIFIED IDEOGRAPH
+ {0xE495, 0x82FA}, //5819 #CJK UNIFIED IDEOGRAPH
+ {0xE496, 0x8393}, //5820 #CJK UNIFIED IDEOGRAPH
+ {0xE497, 0x8303}, //5821 #CJK UNIFIED IDEOGRAPH
+ {0xE498, 0x82FB}, //5822 #CJK UNIFIED IDEOGRAPH
+ {0xE499, 0x82F9}, //5823 #CJK UNIFIED IDEOGRAPH
+ {0xE49A, 0x82DE}, //5824 #CJK UNIFIED IDEOGRAPH
+ {0xE49B, 0x8306}, //5825 #CJK UNIFIED IDEOGRAPH
+ {0xE49C, 0x82DC}, //5826 #CJK UNIFIED IDEOGRAPH
+ {0xE49D, 0x8309}, //5827 #CJK UNIFIED IDEOGRAPH
+ {0xE49E, 0x82D9}, //5828 #CJK UNIFIED IDEOGRAPH
+ {0xE49F, 0x8335}, //5829 #CJK UNIFIED IDEOGRAPH
+ {0xE4A0, 0x8334}, //5830 #CJK UNIFIED IDEOGRAPH
+ {0xE4A1, 0x8316}, //5831 #CJK UNIFIED IDEOGRAPH
+ {0xE4A2, 0x8332}, //5832 #CJK UNIFIED IDEOGRAPH
+ {0xE4A3, 0x8331}, //5833 #CJK UNIFIED IDEOGRAPH
+ {0xE4A4, 0x8340}, //5834 #CJK UNIFIED IDEOGRAPH
+ {0xE4A5, 0x8339}, //5835 #CJK UNIFIED IDEOGRAPH
+ {0xE4A6, 0x8350}, //5836 #CJK UNIFIED IDEOGRAPH
+ {0xE4A7, 0x8345}, //5837 #CJK UNIFIED IDEOGRAPH
+ {0xE4A8, 0x832F}, //5838 #CJK UNIFIED IDEOGRAPH
+ {0xE4A9, 0x832B}, //5839 #CJK UNIFIED IDEOGRAPH
+ {0xE4AA, 0x8317}, //5840 #CJK UNIFIED IDEOGRAPH
+ {0xE4AB, 0x8318}, //5841 #CJK UNIFIED IDEOGRAPH
+ {0xE4AC, 0x8385}, //5842 #CJK UNIFIED IDEOGRAPH
+ {0xE4AD, 0x839A}, //5843 #CJK UNIFIED IDEOGRAPH
+ {0xE4AE, 0x83AA}, //5844 #CJK UNIFIED IDEOGRAPH
+ {0xE4AF, 0x839F}, //5845 #CJK UNIFIED IDEOGRAPH
+ {0xE4B0, 0x83A2}, //5846 #CJK UNIFIED IDEOGRAPH
+ {0xE4B1, 0x8396}, //5847 #CJK UNIFIED IDEOGRAPH
+ {0xE4B2, 0x8323}, //5848 #CJK UNIFIED IDEOGRAPH
+ {0xE4B3, 0x838E}, //5849 #CJK UNIFIED IDEOGRAPH
+ {0xE4B4, 0x8387}, //5850 #CJK UNIFIED IDEOGRAPH
+ {0xE4B5, 0x838A}, //5851 #CJK UNIFIED IDEOGRAPH
+ {0xE4B6, 0x837C}, //5852 #CJK UNIFIED IDEOGRAPH
+ {0xE4B7, 0x83B5}, //5853 #CJK UNIFIED IDEOGRAPH
+ {0xE4B8, 0x8373}, //5854 #CJK UNIFIED IDEOGRAPH
+ {0xE4B9, 0x8375}, //5855 #CJK UNIFIED IDEOGRAPH
+ {0xE4BA, 0x83A0}, //5856 #CJK UNIFIED IDEOGRAPH
+ {0xE4BB, 0x8389}, //5857 #CJK UNIFIED IDEOGRAPH
+ {0xE4BC, 0x83A8}, //5858 #CJK UNIFIED IDEOGRAPH
+ {0xE4BD, 0x83F4}, //5859 #CJK UNIFIED IDEOGRAPH
+ {0xE4BE, 0x8413}, //5860 #CJK UNIFIED IDEOGRAPH
+ {0xE4BF, 0x83EB}, //5861 #CJK UNIFIED IDEOGRAPH
+ {0xE4C0, 0x83CE}, //5862 #CJK UNIFIED IDEOGRAPH
+ {0xE4C1, 0x83FD}, //5863 #CJK UNIFIED IDEOGRAPH
+ {0xE4C2, 0x8403}, //5864 #CJK UNIFIED IDEOGRAPH
+ {0xE4C3, 0x83D8}, //5865 #CJK UNIFIED IDEOGRAPH
+ {0xE4C4, 0x840B}, //5866 #CJK UNIFIED IDEOGRAPH
+ {0xE4C5, 0x83C1}, //5867 #CJK UNIFIED IDEOGRAPH
+ {0xE4C6, 0x83F7}, //5868 #CJK UNIFIED IDEOGRAPH
+ {0xE4C7, 0x8407}, //5869 #CJK UNIFIED IDEOGRAPH
+ {0xE4C8, 0x83E0}, //5870 #CJK UNIFIED IDEOGRAPH
+ {0xE4C9, 0x83F2}, //5871 #CJK UNIFIED IDEOGRAPH
+ {0xE4CA, 0x840D}, //5872 #CJK UNIFIED IDEOGRAPH
+ {0xE4CB, 0x8422}, //5873 #CJK UNIFIED IDEOGRAPH
+ {0xE4CC, 0x8420}, //5874 #CJK UNIFIED IDEOGRAPH
+ {0xE4CD, 0x83BD}, //5875 #CJK UNIFIED IDEOGRAPH
+ {0xE4CE, 0x8438}, //5876 #CJK UNIFIED IDEOGRAPH
+ {0xE4CF, 0x8506}, //5877 #CJK UNIFIED IDEOGRAPH
+ {0xE4D0, 0x83FB}, //5878 #CJK UNIFIED IDEOGRAPH
+ {0xE4D1, 0x846D}, //5879 #CJK UNIFIED IDEOGRAPH
+ {0xE4D2, 0x842A}, //5880 #CJK UNIFIED IDEOGRAPH
+ {0xE4D3, 0x843C}, //5881 #CJK UNIFIED IDEOGRAPH
+ {0xE4D4, 0x855A}, //5882 #CJK UNIFIED IDEOGRAPH
+ {0xE4D5, 0x8484}, //5883 #CJK UNIFIED IDEOGRAPH
+ {0xE4D6, 0x8477}, //5884 #CJK UNIFIED IDEOGRAPH
+ {0xE4D7, 0x846B}, //5885 #CJK UNIFIED IDEOGRAPH
+ {0xE4D8, 0x84AD}, //5886 #CJK UNIFIED IDEOGRAPH
+ {0xE4D9, 0x846E}, //5887 #CJK UNIFIED IDEOGRAPH
+ {0xE4DA, 0x8482}, //5888 #CJK UNIFIED IDEOGRAPH
+ {0xE4DB, 0x8469}, //5889 #CJK UNIFIED IDEOGRAPH
+ {0xE4DC, 0x8446}, //5890 #CJK UNIFIED IDEOGRAPH
+ {0xE4DD, 0x842C}, //5891 #CJK UNIFIED IDEOGRAPH
+ {0xE4DE, 0x846F}, //5892 #CJK UNIFIED IDEOGRAPH
+ {0xE4DF, 0x8479}, //5893 #CJK UNIFIED IDEOGRAPH
+ {0xE4E0, 0x8435}, //5894 #CJK UNIFIED IDEOGRAPH
+ {0xE4E1, 0x84CA}, //5895 #CJK UNIFIED IDEOGRAPH
+ {0xE4E2, 0x8462}, //5896 #CJK UNIFIED IDEOGRAPH
+ {0xE4E3, 0x84B9}, //5897 #CJK UNIFIED IDEOGRAPH
+ {0xE4E4, 0x84BF}, //5898 #CJK UNIFIED IDEOGRAPH
+ {0xE4E5, 0x849F}, //5899 #CJK UNIFIED IDEOGRAPH
+ {0xE4E6, 0x84D9}, //5900 #CJK UNIFIED IDEOGRAPH
+ {0xE4E7, 0x84CD}, //5901 #CJK UNIFIED IDEOGRAPH
+ {0xE4E8, 0x84BB}, //5902 #CJK UNIFIED IDEOGRAPH
+ {0xE4E9, 0x84DA}, //5903 #CJK UNIFIED IDEOGRAPH
+ {0xE4EA, 0x84D0}, //5904 #CJK UNIFIED IDEOGRAPH
+ {0xE4EB, 0x84C1}, //5905 #CJK UNIFIED IDEOGRAPH
+ {0xE4EC, 0x84C6}, //5906 #CJK UNIFIED IDEOGRAPH
+ {0xE4ED, 0x84D6}, //5907 #CJK UNIFIED IDEOGRAPH
+ {0xE4EE, 0x84A1}, //5908 #CJK UNIFIED IDEOGRAPH
+ {0xE4EF, 0x8521}, //5909 #CJK UNIFIED IDEOGRAPH
+ {0xE4F0, 0x84FF}, //5910 #CJK UNIFIED IDEOGRAPH
+ {0xE4F1, 0x84F4}, //5911 #CJK UNIFIED IDEOGRAPH
+ {0xE4F2, 0x8517}, //5912 #CJK UNIFIED IDEOGRAPH
+ {0xE4F3, 0x8518}, //5913 #CJK UNIFIED IDEOGRAPH
+ {0xE4F4, 0x852C}, //5914 #CJK UNIFIED IDEOGRAPH
+ {0xE4F5, 0x851F}, //5915 #CJK UNIFIED IDEOGRAPH
+ {0xE4F6, 0x8515}, //5916 #CJK UNIFIED IDEOGRAPH
+ {0xE4F7, 0x8514}, //5917 #CJK UNIFIED IDEOGRAPH
+ {0xE4F8, 0x84FC}, //5918 #CJK UNIFIED IDEOGRAPH
+ {0xE4F9, 0x8540}, //5919 #CJK UNIFIED IDEOGRAPH
+ {0xE4FA, 0x8563}, //5920 #CJK UNIFIED IDEOGRAPH
+ {0xE4FB, 0x8558}, //5921 #CJK UNIFIED IDEOGRAPH
+ {0xE4FC, 0x8548}, //5922 #CJK UNIFIED IDEOGRAPH
+ {0xE540, 0x8541}, //5923 #CJK UNIFIED IDEOGRAPH
+ {0xE541, 0x8602}, //5924 #CJK UNIFIED IDEOGRAPH
+ {0xE542, 0x854B}, //5925 #CJK UNIFIED IDEOGRAPH
+ {0xE543, 0x8555}, //5926 #CJK UNIFIED IDEOGRAPH
+ {0xE544, 0x8580}, //5927 #CJK UNIFIED IDEOGRAPH
+ {0xE545, 0x85A4}, //5928 #CJK UNIFIED IDEOGRAPH
+ {0xE546, 0x8588}, //5929 #CJK UNIFIED IDEOGRAPH
+ {0xE547, 0x8591}, //5930 #CJK UNIFIED IDEOGRAPH
+ {0xE548, 0x858A}, //5931 #CJK UNIFIED IDEOGRAPH
+ {0xE549, 0x85A8}, //5932 #CJK UNIFIED IDEOGRAPH
+ {0xE54A, 0x856D}, //5933 #CJK UNIFIED IDEOGRAPH
+ {0xE54B, 0x8594}, //5934 #CJK UNIFIED IDEOGRAPH
+ {0xE54C, 0x859B}, //5935 #CJK UNIFIED IDEOGRAPH
+ {0xE54D, 0x85EA}, //5936 #CJK UNIFIED IDEOGRAPH
+ {0xE54E, 0x8587}, //5937 #CJK UNIFIED IDEOGRAPH
+ {0xE54F, 0x859C}, //5938 #CJK UNIFIED IDEOGRAPH
+ {0xE550, 0x8577}, //5939 #CJK UNIFIED IDEOGRAPH
+ {0xE551, 0x857E}, //5940 #CJK UNIFIED IDEOGRAPH
+ {0xE552, 0x8590}, //5941 #CJK UNIFIED IDEOGRAPH
+ {0xE553, 0x85C9}, //5942 #CJK UNIFIED IDEOGRAPH
+ {0xE554, 0x85BA}, //5943 #CJK UNIFIED IDEOGRAPH
+ {0xE555, 0x85CF}, //5944 #CJK UNIFIED IDEOGRAPH
+ {0xE556, 0x85B9}, //5945 #CJK UNIFIED IDEOGRAPH
+ {0xE557, 0x85D0}, //5946 #CJK UNIFIED IDEOGRAPH
+ {0xE558, 0x85D5}, //5947 #CJK UNIFIED IDEOGRAPH
+ {0xE559, 0x85DD}, //5948 #CJK UNIFIED IDEOGRAPH
+ {0xE55A, 0x85E5}, //5949 #CJK UNIFIED IDEOGRAPH
+ {0xE55B, 0x85DC}, //5950 #CJK UNIFIED IDEOGRAPH
+ {0xE55C, 0x85F9}, //5951 #CJK UNIFIED IDEOGRAPH
+ {0xE55D, 0x860A}, //5952 #CJK UNIFIED IDEOGRAPH
+ {0xE55E, 0x8613}, //5953 #CJK UNIFIED IDEOGRAPH
+ {0xE55F, 0x860B}, //5954 #CJK UNIFIED IDEOGRAPH
+ {0xE560, 0x85FE}, //5955 #CJK UNIFIED IDEOGRAPH
+ {0xE561, 0x85FA}, //5956 #CJK UNIFIED IDEOGRAPH
+ {0xE562, 0x8606}, //5957 #CJK UNIFIED IDEOGRAPH
+ {0xE563, 0x8622}, //5958 #CJK UNIFIED IDEOGRAPH
+ {0xE564, 0x861A}, //5959 #CJK UNIFIED IDEOGRAPH
+ {0xE565, 0x8630}, //5960 #CJK UNIFIED IDEOGRAPH
+ {0xE566, 0x863F}, //5961 #CJK UNIFIED IDEOGRAPH
+ {0xE567, 0x864D}, //5962 #CJK UNIFIED IDEOGRAPH
+ {0xE568, 0x4E55}, //5963 #CJK UNIFIED IDEOGRAPH
+ {0xE569, 0x8654}, //5964 #CJK UNIFIED IDEOGRAPH
+ {0xE56A, 0x865F}, //5965 #CJK UNIFIED IDEOGRAPH
+ {0xE56B, 0x8667}, //5966 #CJK UNIFIED IDEOGRAPH
+ {0xE56C, 0x8671}, //5967 #CJK UNIFIED IDEOGRAPH
+ {0xE56D, 0x8693}, //5968 #CJK UNIFIED IDEOGRAPH
+ {0xE56E, 0x86A3}, //5969 #CJK UNIFIED IDEOGRAPH
+ {0xE56F, 0x86A9}, //5970 #CJK UNIFIED IDEOGRAPH
+ {0xE570, 0x86AA}, //5971 #CJK UNIFIED IDEOGRAPH
+ {0xE571, 0x868B}, //5972 #CJK UNIFIED IDEOGRAPH
+ {0xE572, 0x868C}, //5973 #CJK UNIFIED IDEOGRAPH
+ {0xE573, 0x86B6}, //5974 #CJK UNIFIED IDEOGRAPH
+ {0xE574, 0x86AF}, //5975 #CJK UNIFIED IDEOGRAPH
+ {0xE575, 0x86C4}, //5976 #CJK UNIFIED IDEOGRAPH
+ {0xE576, 0x86C6}, //5977 #CJK UNIFIED IDEOGRAPH
+ {0xE577, 0x86B0}, //5978 #CJK UNIFIED IDEOGRAPH
+ {0xE578, 0x86C9}, //5979 #CJK UNIFIED IDEOGRAPH
+ {0xE579, 0x8823}, //5980 #CJK UNIFIED IDEOGRAPH
+ {0xE57A, 0x86AB}, //5981 #CJK UNIFIED IDEOGRAPH
+ {0xE57B, 0x86D4}, //5982 #CJK UNIFIED IDEOGRAPH
+ {0xE57C, 0x86DE}, //5983 #CJK UNIFIED IDEOGRAPH
+ {0xE57D, 0x86E9}, //5984 #CJK UNIFIED IDEOGRAPH
+ {0xE57E, 0x86EC}, //5985 #CJK UNIFIED IDEOGRAPH
+ {0xE580, 0x86DF}, //5986 #CJK UNIFIED IDEOGRAPH
+ {0xE581, 0x86DB}, //5987 #CJK UNIFIED IDEOGRAPH
+ {0xE582, 0x86EF}, //5988 #CJK UNIFIED IDEOGRAPH
+ {0xE583, 0x8712}, //5989 #CJK UNIFIED IDEOGRAPH
+ {0xE584, 0x8706}, //5990 #CJK UNIFIED IDEOGRAPH
+ {0xE585, 0x8708}, //5991 #CJK UNIFIED IDEOGRAPH
+ {0xE586, 0x8700}, //5992 #CJK UNIFIED IDEOGRAPH
+ {0xE587, 0x8703}, //5993 #CJK UNIFIED IDEOGRAPH
+ {0xE588, 0x86FB}, //5994 #CJK UNIFIED IDEOGRAPH
+ {0xE589, 0x8711}, //5995 #CJK UNIFIED IDEOGRAPH
+ {0xE58A, 0x8709}, //5996 #CJK UNIFIED IDEOGRAPH
+ {0xE58B, 0x870D}, //5997 #CJK UNIFIED IDEOGRAPH
+ {0xE58C, 0x86F9}, //5998 #CJK UNIFIED IDEOGRAPH
+ {0xE58D, 0x870A}, //5999 #CJK UNIFIED IDEOGRAPH
+ {0xE58E, 0x8734}, //6000 #CJK UNIFIED IDEOGRAPH
+ {0xE58F, 0x873F}, //6001 #CJK UNIFIED IDEOGRAPH
+ {0xE590, 0x8737}, //6002 #CJK UNIFIED IDEOGRAPH
+ {0xE591, 0x873B}, //6003 #CJK UNIFIED IDEOGRAPH
+ {0xE592, 0x8725}, //6004 #CJK UNIFIED IDEOGRAPH
+ {0xE593, 0x8729}, //6005 #CJK UNIFIED IDEOGRAPH
+ {0xE594, 0x871A}, //6006 #CJK UNIFIED IDEOGRAPH
+ {0xE595, 0x8760}, //6007 #CJK UNIFIED IDEOGRAPH
+ {0xE596, 0x875F}, //6008 #CJK UNIFIED IDEOGRAPH
+ {0xE597, 0x8778}, //6009 #CJK UNIFIED IDEOGRAPH
+ {0xE598, 0x874C}, //6010 #CJK UNIFIED IDEOGRAPH
+ {0xE599, 0x874E}, //6011 #CJK UNIFIED IDEOGRAPH
+ {0xE59A, 0x8774}, //6012 #CJK UNIFIED IDEOGRAPH
+ {0xE59B, 0x8757}, //6013 #CJK UNIFIED IDEOGRAPH
+ {0xE59C, 0x8768}, //6014 #CJK UNIFIED IDEOGRAPH
+ {0xE59D, 0x876E}, //6015 #CJK UNIFIED IDEOGRAPH
+ {0xE59E, 0x8759}, //6016 #CJK UNIFIED IDEOGRAPH
+ {0xE59F, 0x8753}, //6017 #CJK UNIFIED IDEOGRAPH
+ {0xE5A0, 0x8763}, //6018 #CJK UNIFIED IDEOGRAPH
+ {0xE5A1, 0x876A}, //6019 #CJK UNIFIED IDEOGRAPH
+ {0xE5A2, 0x8805}, //6020 #CJK UNIFIED IDEOGRAPH
+ {0xE5A3, 0x87A2}, //6021 #CJK UNIFIED IDEOGRAPH
+ {0xE5A4, 0x879F}, //6022 #CJK UNIFIED IDEOGRAPH
+ {0xE5A5, 0x8782}, //6023 #CJK UNIFIED IDEOGRAPH
+ {0xE5A6, 0x87AF}, //6024 #CJK UNIFIED IDEOGRAPH
+ {0xE5A7, 0x87CB}, //6025 #CJK UNIFIED IDEOGRAPH
+ {0xE5A8, 0x87BD}, //6026 #CJK UNIFIED IDEOGRAPH
+ {0xE5A9, 0x87C0}, //6027 #CJK UNIFIED IDEOGRAPH
+ {0xE5AA, 0x87D0}, //6028 #CJK UNIFIED IDEOGRAPH
+ {0xE5AB, 0x96D6}, //6029 #CJK UNIFIED IDEOGRAPH
+ {0xE5AC, 0x87AB}, //6030 #CJK UNIFIED IDEOGRAPH
+ {0xE5AD, 0x87C4}, //6031 #CJK UNIFIED IDEOGRAPH
+ {0xE5AE, 0x87B3}, //6032 #CJK UNIFIED IDEOGRAPH
+ {0xE5AF, 0x87C7}, //6033 #CJK UNIFIED IDEOGRAPH
+ {0xE5B0, 0x87C6}, //6034 #CJK UNIFIED IDEOGRAPH
+ {0xE5B1, 0x87BB}, //6035 #CJK UNIFIED IDEOGRAPH
+ {0xE5B2, 0x87EF}, //6036 #CJK UNIFIED IDEOGRAPH
+ {0xE5B3, 0x87F2}, //6037 #CJK UNIFIED IDEOGRAPH
+ {0xE5B4, 0x87E0}, //6038 #CJK UNIFIED IDEOGRAPH
+ {0xE5B5, 0x880F}, //6039 #CJK UNIFIED IDEOGRAPH
+ {0xE5B6, 0x880D}, //6040 #CJK UNIFIED IDEOGRAPH
+ {0xE5B7, 0x87FE}, //6041 #CJK UNIFIED IDEOGRAPH
+ {0xE5B8, 0x87F6}, //6042 #CJK UNIFIED IDEOGRAPH
+ {0xE5B9, 0x87F7}, //6043 #CJK UNIFIED IDEOGRAPH
+ {0xE5BA, 0x880E}, //6044 #CJK UNIFIED IDEOGRAPH
+ {0xE5BB, 0x87D2}, //6045 #CJK UNIFIED IDEOGRAPH
+ {0xE5BC, 0x8811}, //6046 #CJK UNIFIED IDEOGRAPH
+ {0xE5BD, 0x8816}, //6047 #CJK UNIFIED IDEOGRAPH
+ {0xE5BE, 0x8815}, //6048 #CJK UNIFIED IDEOGRAPH
+ {0xE5BF, 0x8822}, //6049 #CJK UNIFIED IDEOGRAPH
+ {0xE5C0, 0x8821}, //6050 #CJK UNIFIED IDEOGRAPH
+ {0xE5C1, 0x8831}, //6051 #CJK UNIFIED IDEOGRAPH
+ {0xE5C2, 0x8836}, //6052 #CJK UNIFIED IDEOGRAPH
+ {0xE5C3, 0x8839}, //6053 #CJK UNIFIED IDEOGRAPH
+ {0xE5C4, 0x8827}, //6054 #CJK UNIFIED IDEOGRAPH
+ {0xE5C5, 0x883B}, //6055 #CJK UNIFIED IDEOGRAPH
+ {0xE5C6, 0x8844}, //6056 #CJK UNIFIED IDEOGRAPH
+ {0xE5C7, 0x8842}, //6057 #CJK UNIFIED IDEOGRAPH
+ {0xE5C8, 0x8852}, //6058 #CJK UNIFIED IDEOGRAPH
+ {0xE5C9, 0x8859}, //6059 #CJK UNIFIED IDEOGRAPH
+ {0xE5CA, 0x885E}, //6060 #CJK UNIFIED IDEOGRAPH
+ {0xE5CB, 0x8862}, //6061 #CJK UNIFIED IDEOGRAPH
+ {0xE5CC, 0x886B}, //6062 #CJK UNIFIED IDEOGRAPH
+ {0xE5CD, 0x8881}, //6063 #CJK UNIFIED IDEOGRAPH
+ {0xE5CE, 0x887E}, //6064 #CJK UNIFIED IDEOGRAPH
+ {0xE5CF, 0x889E}, //6065 #CJK UNIFIED IDEOGRAPH
+ {0xE5D0, 0x8875}, //6066 #CJK UNIFIED IDEOGRAPH
+ {0xE5D1, 0x887D}, //6067 #CJK UNIFIED IDEOGRAPH
+ {0xE5D2, 0x88B5}, //6068 #CJK UNIFIED IDEOGRAPH
+ {0xE5D3, 0x8872}, //6069 #CJK UNIFIED IDEOGRAPH
+ {0xE5D4, 0x8882}, //6070 #CJK UNIFIED IDEOGRAPH
+ {0xE5D5, 0x8897}, //6071 #CJK UNIFIED IDEOGRAPH
+ {0xE5D6, 0x8892}, //6072 #CJK UNIFIED IDEOGRAPH
+ {0xE5D7, 0x88AE}, //6073 #CJK UNIFIED IDEOGRAPH
+ {0xE5D8, 0x8899}, //6074 #CJK UNIFIED IDEOGRAPH
+ {0xE5D9, 0x88A2}, //6075 #CJK UNIFIED IDEOGRAPH
+ {0xE5DA, 0x888D}, //6076 #CJK UNIFIED IDEOGRAPH
+ {0xE5DB, 0x88A4}, //6077 #CJK UNIFIED IDEOGRAPH
+ {0xE5DC, 0x88B0}, //6078 #CJK UNIFIED IDEOGRAPH
+ {0xE5DD, 0x88BF}, //6079 #CJK UNIFIED IDEOGRAPH
+ {0xE5DE, 0x88B1}, //6080 #CJK UNIFIED IDEOGRAPH
+ {0xE5DF, 0x88C3}, //6081 #CJK UNIFIED IDEOGRAPH
+ {0xE5E0, 0x88C4}, //6082 #CJK UNIFIED IDEOGRAPH
+ {0xE5E1, 0x88D4}, //6083 #CJK UNIFIED IDEOGRAPH
+ {0xE5E2, 0x88D8}, //6084 #CJK UNIFIED IDEOGRAPH
+ {0xE5E3, 0x88D9}, //6085 #CJK UNIFIED IDEOGRAPH
+ {0xE5E4, 0x88DD}, //6086 #CJK UNIFIED IDEOGRAPH
+ {0xE5E5, 0x88F9}, //6087 #CJK UNIFIED IDEOGRAPH
+ {0xE5E6, 0x8902}, //6088 #CJK UNIFIED IDEOGRAPH
+ {0xE5E7, 0x88FC}, //6089 #CJK UNIFIED IDEOGRAPH
+ {0xE5E8, 0x88F4}, //6090 #CJK UNIFIED IDEOGRAPH
+ {0xE5E9, 0x88E8}, //6091 #CJK UNIFIED IDEOGRAPH
+ {0xE5EA, 0x88F2}, //6092 #CJK UNIFIED IDEOGRAPH
+ {0xE5EB, 0x8904}, //6093 #CJK UNIFIED IDEOGRAPH
+ {0xE5EC, 0x890C}, //6094 #CJK UNIFIED IDEOGRAPH
+ {0xE5ED, 0x890A}, //6095 #CJK UNIFIED IDEOGRAPH
+ {0xE5EE, 0x8913}, //6096 #CJK UNIFIED IDEOGRAPH
+ {0xE5EF, 0x8943}, //6097 #CJK UNIFIED IDEOGRAPH
+ {0xE5F0, 0x891E}, //6098 #CJK UNIFIED IDEOGRAPH
+ {0xE5F1, 0x8925}, //6099 #CJK UNIFIED IDEOGRAPH
+ {0xE5F2, 0x892A}, //6100 #CJK UNIFIED IDEOGRAPH
+ {0xE5F3, 0x892B}, //6101 #CJK UNIFIED IDEOGRAPH
+ {0xE5F4, 0x8941}, //6102 #CJK UNIFIED IDEOGRAPH
+ {0xE5F5, 0x8944}, //6103 #CJK UNIFIED IDEOGRAPH
+ {0xE5F6, 0x893B}, //6104 #CJK UNIFIED IDEOGRAPH
+ {0xE5F7, 0x8936}, //6105 #CJK UNIFIED IDEOGRAPH
+ {0xE5F8, 0x8938}, //6106 #CJK UNIFIED IDEOGRAPH
+ {0xE5F9, 0x894C}, //6107 #CJK UNIFIED IDEOGRAPH
+ {0xE5FA, 0x891D}, //6108 #CJK UNIFIED IDEOGRAPH
+ {0xE5FB, 0x8960}, //6109 #CJK UNIFIED IDEOGRAPH
+ {0xE5FC, 0x895E}, //6110 #CJK UNIFIED IDEOGRAPH
+ {0xE640, 0x8966}, //6111 #CJK UNIFIED IDEOGRAPH
+ {0xE641, 0x8964}, //6112 #CJK UNIFIED IDEOGRAPH
+ {0xE642, 0x896D}, //6113 #CJK UNIFIED IDEOGRAPH
+ {0xE643, 0x896A}, //6114 #CJK UNIFIED IDEOGRAPH
+ {0xE644, 0x896F}, //6115 #CJK UNIFIED IDEOGRAPH
+ {0xE645, 0x8974}, //6116 #CJK UNIFIED IDEOGRAPH
+ {0xE646, 0x8977}, //6117 #CJK UNIFIED IDEOGRAPH
+ {0xE647, 0x897E}, //6118 #CJK UNIFIED IDEOGRAPH
+ {0xE648, 0x8983}, //6119 #CJK UNIFIED IDEOGRAPH
+ {0xE649, 0x8988}, //6120 #CJK UNIFIED IDEOGRAPH
+ {0xE64A, 0x898A}, //6121 #CJK UNIFIED IDEOGRAPH
+ {0xE64B, 0x8993}, //6122 #CJK UNIFIED IDEOGRAPH
+ {0xE64C, 0x8998}, //6123 #CJK UNIFIED IDEOGRAPH
+ {0xE64D, 0x89A1}, //6124 #CJK UNIFIED IDEOGRAPH
+ {0xE64E, 0x89A9}, //6125 #CJK UNIFIED IDEOGRAPH
+ {0xE64F, 0x89A6}, //6126 #CJK UNIFIED IDEOGRAPH
+ {0xE650, 0x89AC}, //6127 #CJK UNIFIED IDEOGRAPH
+ {0xE651, 0x89AF}, //6128 #CJK UNIFIED IDEOGRAPH
+ {0xE652, 0x89B2}, //6129 #CJK UNIFIED IDEOGRAPH
+ {0xE653, 0x89BA}, //6130 #CJK UNIFIED IDEOGRAPH
+ {0xE654, 0x89BD}, //6131 #CJK UNIFIED IDEOGRAPH
+ {0xE655, 0x89BF}, //6132 #CJK UNIFIED IDEOGRAPH
+ {0xE656, 0x89C0}, //6133 #CJK UNIFIED IDEOGRAPH
+ {0xE657, 0x89DA}, //6134 #CJK UNIFIED IDEOGRAPH
+ {0xE658, 0x89DC}, //6135 #CJK UNIFIED IDEOGRAPH
+ {0xE659, 0x89DD}, //6136 #CJK UNIFIED IDEOGRAPH
+ {0xE65A, 0x89E7}, //6137 #CJK UNIFIED IDEOGRAPH
+ {0xE65B, 0x89F4}, //6138 #CJK UNIFIED IDEOGRAPH
+ {0xE65C, 0x89F8}, //6139 #CJK UNIFIED IDEOGRAPH
+ {0xE65D, 0x8A03}, //6140 #CJK UNIFIED IDEOGRAPH
+ {0xE65E, 0x8A16}, //6141 #CJK UNIFIED IDEOGRAPH
+ {0xE65F, 0x8A10}, //6142 #CJK UNIFIED IDEOGRAPH
+ {0xE660, 0x8A0C}, //6143 #CJK UNIFIED IDEOGRAPH
+ {0xE661, 0x8A1B}, //6144 #CJK UNIFIED IDEOGRAPH
+ {0xE662, 0x8A1D}, //6145 #CJK UNIFIED IDEOGRAPH
+ {0xE663, 0x8A25}, //6146 #CJK UNIFIED IDEOGRAPH
+ {0xE664, 0x8A36}, //6147 #CJK UNIFIED IDEOGRAPH
+ {0xE665, 0x8A41}, //6148 #CJK UNIFIED IDEOGRAPH
+ {0xE666, 0x8A5B}, //6149 #CJK UNIFIED IDEOGRAPH
+ {0xE667, 0x8A52}, //6150 #CJK UNIFIED IDEOGRAPH
+ {0xE668, 0x8A46}, //6151 #CJK UNIFIED IDEOGRAPH
+ {0xE669, 0x8A48}, //6152 #CJK UNIFIED IDEOGRAPH
+ {0xE66A, 0x8A7C}, //6153 #CJK UNIFIED IDEOGRAPH
+ {0xE66B, 0x8A6D}, //6154 #CJK UNIFIED IDEOGRAPH
+ {0xE66C, 0x8A6C}, //6155 #CJK UNIFIED IDEOGRAPH
+ {0xE66D, 0x8A62}, //6156 #CJK UNIFIED IDEOGRAPH
+ {0xE66E, 0x8A85}, //6157 #CJK UNIFIED IDEOGRAPH
+ {0xE66F, 0x8A82}, //6158 #CJK UNIFIED IDEOGRAPH
+ {0xE670, 0x8A84}, //6159 #CJK UNIFIED IDEOGRAPH
+ {0xE671, 0x8AA8}, //6160 #CJK UNIFIED IDEOGRAPH
+ {0xE672, 0x8AA1}, //6161 #CJK UNIFIED IDEOGRAPH
+ {0xE673, 0x8A91}, //6162 #CJK UNIFIED IDEOGRAPH
+ {0xE674, 0x8AA5}, //6163 #CJK UNIFIED IDEOGRAPH
+ {0xE675, 0x8AA6}, //6164 #CJK UNIFIED IDEOGRAPH
+ {0xE676, 0x8A9A}, //6165 #CJK UNIFIED IDEOGRAPH
+ {0xE677, 0x8AA3}, //6166 #CJK UNIFIED IDEOGRAPH
+ {0xE678, 0x8AC4}, //6167 #CJK UNIFIED IDEOGRAPH
+ {0xE679, 0x8ACD}, //6168 #CJK UNIFIED IDEOGRAPH
+ {0xE67A, 0x8AC2}, //6169 #CJK UNIFIED IDEOGRAPH
+ {0xE67B, 0x8ADA}, //6170 #CJK UNIFIED IDEOGRAPH
+ {0xE67C, 0x8AEB}, //6171 #CJK UNIFIED IDEOGRAPH
+ {0xE67D, 0x8AF3}, //6172 #CJK UNIFIED IDEOGRAPH
+ {0xE67E, 0x8AE7}, //6173 #CJK UNIFIED IDEOGRAPH
+ {0xE680, 0x8AE4}, //6174 #CJK UNIFIED IDEOGRAPH
+ {0xE681, 0x8AF1}, //6175 #CJK UNIFIED IDEOGRAPH
+ {0xE682, 0x8B14}, //6176 #CJK UNIFIED IDEOGRAPH
+ {0xE683, 0x8AE0}, //6177 #CJK UNIFIED IDEOGRAPH
+ {0xE684, 0x8AE2}, //6178 #CJK UNIFIED IDEOGRAPH
+ {0xE685, 0x8AF7}, //6179 #CJK UNIFIED IDEOGRAPH
+ {0xE686, 0x8ADE}, //6180 #CJK UNIFIED IDEOGRAPH
+ {0xE687, 0x8ADB}, //6181 #CJK UNIFIED IDEOGRAPH
+ {0xE688, 0x8B0C}, //6182 #CJK UNIFIED IDEOGRAPH
+ {0xE689, 0x8B07}, //6183 #CJK UNIFIED IDEOGRAPH
+ {0xE68A, 0x8B1A}, //6184 #CJK UNIFIED IDEOGRAPH
+ {0xE68B, 0x8AE1}, //6185 #CJK UNIFIED IDEOGRAPH
+ {0xE68C, 0x8B16}, //6186 #CJK UNIFIED IDEOGRAPH
+ {0xE68D, 0x8B10}, //6187 #CJK UNIFIED IDEOGRAPH
+ {0xE68E, 0x8B17}, //6188 #CJK UNIFIED IDEOGRAPH
+ {0xE68F, 0x8B20}, //6189 #CJK UNIFIED IDEOGRAPH
+ {0xE690, 0x8B33}, //6190 #CJK UNIFIED IDEOGRAPH
+ {0xE691, 0x97AB}, //6191 #CJK UNIFIED IDEOGRAPH
+ {0xE692, 0x8B26}, //6192 #CJK UNIFIED IDEOGRAPH
+ {0xE693, 0x8B2B}, //6193 #CJK UNIFIED IDEOGRAPH
+ {0xE694, 0x8B3E}, //6194 #CJK UNIFIED IDEOGRAPH
+ {0xE695, 0x8B28}, //6195 #CJK UNIFIED IDEOGRAPH
+ {0xE696, 0x8B41}, //6196 #CJK UNIFIED IDEOGRAPH
+ {0xE697, 0x8B4C}, //6197 #CJK UNIFIED IDEOGRAPH
+ {0xE698, 0x8B4F}, //6198 #CJK UNIFIED IDEOGRAPH
+ {0xE699, 0x8B4E}, //6199 #CJK UNIFIED IDEOGRAPH
+ {0xE69A, 0x8B49}, //6200 #CJK UNIFIED IDEOGRAPH
+ {0xE69B, 0x8B56}, //6201 #CJK UNIFIED IDEOGRAPH
+ {0xE69C, 0x8B5B}, //6202 #CJK UNIFIED IDEOGRAPH
+ {0xE69D, 0x8B5A}, //6203 #CJK UNIFIED IDEOGRAPH
+ {0xE69E, 0x8B6B}, //6204 #CJK UNIFIED IDEOGRAPH
+ {0xE69F, 0x8B5F}, //6205 #CJK UNIFIED IDEOGRAPH
+ {0xE6A0, 0x8B6C}, //6206 #CJK UNIFIED IDEOGRAPH
+ {0xE6A1, 0x8B6F}, //6207 #CJK UNIFIED IDEOGRAPH
+ {0xE6A2, 0x8B74}, //6208 #CJK UNIFIED IDEOGRAPH
+ {0xE6A3, 0x8B7D}, //6209 #CJK UNIFIED IDEOGRAPH
+ {0xE6A4, 0x8B80}, //6210 #CJK UNIFIED IDEOGRAPH
+ {0xE6A5, 0x8B8C}, //6211 #CJK UNIFIED IDEOGRAPH
+ {0xE6A6, 0x8B8E}, //6212 #CJK UNIFIED IDEOGRAPH
+ {0xE6A7, 0x8B92}, //6213 #CJK UNIFIED IDEOGRAPH
+ {0xE6A8, 0x8B93}, //6214 #CJK UNIFIED IDEOGRAPH
+ {0xE6A9, 0x8B96}, //6215 #CJK UNIFIED IDEOGRAPH
+ {0xE6AA, 0x8B99}, //6216 #CJK UNIFIED IDEOGRAPH
+ {0xE6AB, 0x8B9A}, //6217 #CJK UNIFIED IDEOGRAPH
+ {0xE6AC, 0x8C3A}, //6218 #CJK UNIFIED IDEOGRAPH
+ {0xE6AD, 0x8C41}, //6219 #CJK UNIFIED IDEOGRAPH
+ {0xE6AE, 0x8C3F}, //6220 #CJK UNIFIED IDEOGRAPH
+ {0xE6AF, 0x8C48}, //6221 #CJK UNIFIED IDEOGRAPH
+ {0xE6B0, 0x8C4C}, //6222 #CJK UNIFIED IDEOGRAPH
+ {0xE6B1, 0x8C4E}, //6223 #CJK UNIFIED IDEOGRAPH
+ {0xE6B2, 0x8C50}, //6224 #CJK UNIFIED IDEOGRAPH
+ {0xE6B3, 0x8C55}, //6225 #CJK UNIFIED IDEOGRAPH
+ {0xE6B4, 0x8C62}, //6226 #CJK UNIFIED IDEOGRAPH
+ {0xE6B5, 0x8C6C}, //6227 #CJK UNIFIED IDEOGRAPH
+ {0xE6B6, 0x8C78}, //6228 #CJK UNIFIED IDEOGRAPH
+ {0xE6B7, 0x8C7A}, //6229 #CJK UNIFIED IDEOGRAPH
+ {0xE6B8, 0x8C82}, //6230 #CJK UNIFIED IDEOGRAPH
+ {0xE6B9, 0x8C89}, //6231 #CJK UNIFIED IDEOGRAPH
+ {0xE6BA, 0x8C85}, //6232 #CJK UNIFIED IDEOGRAPH
+ {0xE6BB, 0x8C8A}, //6233 #CJK UNIFIED IDEOGRAPH
+ {0xE6BC, 0x8C8D}, //6234 #CJK UNIFIED IDEOGRAPH
+ {0xE6BD, 0x8C8E}, //6235 #CJK UNIFIED IDEOGRAPH
+ {0xE6BE, 0x8C94}, //6236 #CJK UNIFIED IDEOGRAPH
+ {0xE6BF, 0x8C7C}, //6237 #CJK UNIFIED IDEOGRAPH
+ {0xE6C0, 0x8C98}, //6238 #CJK UNIFIED IDEOGRAPH
+ {0xE6C1, 0x621D}, //6239 #CJK UNIFIED IDEOGRAPH
+ {0xE6C2, 0x8CAD}, //6240 #CJK UNIFIED IDEOGRAPH
+ {0xE6C3, 0x8CAA}, //6241 #CJK UNIFIED IDEOGRAPH
+ {0xE6C4, 0x8CBD}, //6242 #CJK UNIFIED IDEOGRAPH
+ {0xE6C5, 0x8CB2}, //6243 #CJK UNIFIED IDEOGRAPH
+ {0xE6C6, 0x8CB3}, //6244 #CJK UNIFIED IDEOGRAPH
+ {0xE6C7, 0x8CAE}, //6245 #CJK UNIFIED IDEOGRAPH
+ {0xE6C8, 0x8CB6}, //6246 #CJK UNIFIED IDEOGRAPH
+ {0xE6C9, 0x8CC8}, //6247 #CJK UNIFIED IDEOGRAPH
+ {0xE6CA, 0x8CC1}, //6248 #CJK UNIFIED IDEOGRAPH
+ {0xE6CB, 0x8CE4}, //6249 #CJK UNIFIED IDEOGRAPH
+ {0xE6CC, 0x8CE3}, //6250 #CJK UNIFIED IDEOGRAPH
+ {0xE6CD, 0x8CDA}, //6251 #CJK UNIFIED IDEOGRAPH
+ {0xE6CE, 0x8CFD}, //6252 #CJK UNIFIED IDEOGRAPH
+ {0xE6CF, 0x8CFA}, //6253 #CJK UNIFIED IDEOGRAPH
+ {0xE6D0, 0x8CFB}, //6254 #CJK UNIFIED IDEOGRAPH
+ {0xE6D1, 0x8D04}, //6255 #CJK UNIFIED IDEOGRAPH
+ {0xE6D2, 0x8D05}, //6256 #CJK UNIFIED IDEOGRAPH
+ {0xE6D3, 0x8D0A}, //6257 #CJK UNIFIED IDEOGRAPH
+ {0xE6D4, 0x8D07}, //6258 #CJK UNIFIED IDEOGRAPH
+ {0xE6D5, 0x8D0F}, //6259 #CJK UNIFIED IDEOGRAPH
+ {0xE6D6, 0x8D0D}, //6260 #CJK UNIFIED IDEOGRAPH
+ {0xE6D7, 0x8D10}, //6261 #CJK UNIFIED IDEOGRAPH
+ {0xE6D8, 0x9F4E}, //6262 #CJK UNIFIED IDEOGRAPH
+ {0xE6D9, 0x8D13}, //6263 #CJK UNIFIED IDEOGRAPH
+ {0xE6DA, 0x8CCD}, //6264 #CJK UNIFIED IDEOGRAPH
+ {0xE6DB, 0x8D14}, //6265 #CJK UNIFIED IDEOGRAPH
+ {0xE6DC, 0x8D16}, //6266 #CJK UNIFIED IDEOGRAPH
+ {0xE6DD, 0x8D67}, //6267 #CJK UNIFIED IDEOGRAPH
+ {0xE6DE, 0x8D6D}, //6268 #CJK UNIFIED IDEOGRAPH
+ {0xE6DF, 0x8D71}, //6269 #CJK UNIFIED IDEOGRAPH
+ {0xE6E0, 0x8D73}, //6270 #CJK UNIFIED IDEOGRAPH
+ {0xE6E1, 0x8D81}, //6271 #CJK UNIFIED IDEOGRAPH
+ {0xE6E2, 0x8D99}, //6272 #CJK UNIFIED IDEOGRAPH
+ {0xE6E3, 0x8DC2}, //6273 #CJK UNIFIED IDEOGRAPH
+ {0xE6E4, 0x8DBE}, //6274 #CJK UNIFIED IDEOGRAPH
+ {0xE6E5, 0x8DBA}, //6275 #CJK UNIFIED IDEOGRAPH
+ {0xE6E6, 0x8DCF}, //6276 #CJK UNIFIED IDEOGRAPH
+ {0xE6E7, 0x8DDA}, //6277 #CJK UNIFIED IDEOGRAPH
+ {0xE6E8, 0x8DD6}, //6278 #CJK UNIFIED IDEOGRAPH
+ {0xE6E9, 0x8DCC}, //6279 #CJK UNIFIED IDEOGRAPH
+ {0xE6EA, 0x8DDB}, //6280 #CJK UNIFIED IDEOGRAPH
+ {0xE6EB, 0x8DCB}, //6281 #CJK UNIFIED IDEOGRAPH
+ {0xE6EC, 0x8DEA}, //6282 #CJK UNIFIED IDEOGRAPH
+ {0xE6ED, 0x8DEB}, //6283 #CJK UNIFIED IDEOGRAPH
+ {0xE6EE, 0x8DDF}, //6284 #CJK UNIFIED IDEOGRAPH
+ {0xE6EF, 0x8DE3}, //6285 #CJK UNIFIED IDEOGRAPH
+ {0xE6F0, 0x8DFC}, //6286 #CJK UNIFIED IDEOGRAPH
+ {0xE6F1, 0x8E08}, //6287 #CJK UNIFIED IDEOGRAPH
+ {0xE6F2, 0x8E09}, //6288 #CJK UNIFIED IDEOGRAPH
+ {0xE6F3, 0x8DFF}, //6289 #CJK UNIFIED IDEOGRAPH
+ {0xE6F4, 0x8E1D}, //6290 #CJK UNIFIED IDEOGRAPH
+ {0xE6F5, 0x8E1E}, //6291 #CJK UNIFIED IDEOGRAPH
+ {0xE6F6, 0x8E10}, //6292 #CJK UNIFIED IDEOGRAPH
+ {0xE6F7, 0x8E1F}, //6293 #CJK UNIFIED IDEOGRAPH
+ {0xE6F8, 0x8E42}, //6294 #CJK UNIFIED IDEOGRAPH
+ {0xE6F9, 0x8E35}, //6295 #CJK UNIFIED IDEOGRAPH
+ {0xE6FA, 0x8E30}, //6296 #CJK UNIFIED IDEOGRAPH
+ {0xE6FB, 0x8E34}, //6297 #CJK UNIFIED IDEOGRAPH
+ {0xE6FC, 0x8E4A}, //6298 #CJK UNIFIED IDEOGRAPH
+ {0xE740, 0x8E47}, //6299 #CJK UNIFIED IDEOGRAPH
+ {0xE741, 0x8E49}, //6300 #CJK UNIFIED IDEOGRAPH
+ {0xE742, 0x8E4C}, //6301 #CJK UNIFIED IDEOGRAPH
+ {0xE743, 0x8E50}, //6302 #CJK UNIFIED IDEOGRAPH
+ {0xE744, 0x8E48}, //6303 #CJK UNIFIED IDEOGRAPH
+ {0xE745, 0x8E59}, //6304 #CJK UNIFIED IDEOGRAPH
+ {0xE746, 0x8E64}, //6305 #CJK UNIFIED IDEOGRAPH
+ {0xE747, 0x8E60}, //6306 #CJK UNIFIED IDEOGRAPH
+ {0xE748, 0x8E2A}, //6307 #CJK UNIFIED IDEOGRAPH
+ {0xE749, 0x8E63}, //6308 #CJK UNIFIED IDEOGRAPH
+ {0xE74A, 0x8E55}, //6309 #CJK UNIFIED IDEOGRAPH
+ {0xE74B, 0x8E76}, //6310 #CJK UNIFIED IDEOGRAPH
+ {0xE74C, 0x8E72}, //6311 #CJK UNIFIED IDEOGRAPH
+ {0xE74D, 0x8E7C}, //6312 #CJK UNIFIED IDEOGRAPH
+ {0xE74E, 0x8E81}, //6313 #CJK UNIFIED IDEOGRAPH
+ {0xE74F, 0x8E87}, //6314 #CJK UNIFIED IDEOGRAPH
+ {0xE750, 0x8E85}, //6315 #CJK UNIFIED IDEOGRAPH
+ {0xE751, 0x8E84}, //6316 #CJK UNIFIED IDEOGRAPH
+ {0xE752, 0x8E8B}, //6317 #CJK UNIFIED IDEOGRAPH
+ {0xE753, 0x8E8A}, //6318 #CJK UNIFIED IDEOGRAPH
+ {0xE754, 0x8E93}, //6319 #CJK UNIFIED IDEOGRAPH
+ {0xE755, 0x8E91}, //6320 #CJK UNIFIED IDEOGRAPH
+ {0xE756, 0x8E94}, //6321 #CJK UNIFIED IDEOGRAPH
+ {0xE757, 0x8E99}, //6322 #CJK UNIFIED IDEOGRAPH
+ {0xE758, 0x8EAA}, //6323 #CJK UNIFIED IDEOGRAPH
+ {0xE759, 0x8EA1}, //6324 #CJK UNIFIED IDEOGRAPH
+ {0xE75A, 0x8EAC}, //6325 #CJK UNIFIED IDEOGRAPH
+ {0xE75B, 0x8EB0}, //6326 #CJK UNIFIED IDEOGRAPH
+ {0xE75C, 0x8EC6}, //6327 #CJK UNIFIED IDEOGRAPH
+ {0xE75D, 0x8EB1}, //6328 #CJK UNIFIED IDEOGRAPH
+ {0xE75E, 0x8EBE}, //6329 #CJK UNIFIED IDEOGRAPH
+ {0xE75F, 0x8EC5}, //6330 #CJK UNIFIED IDEOGRAPH
+ {0xE760, 0x8EC8}, //6331 #CJK UNIFIED IDEOGRAPH
+ {0xE761, 0x8ECB}, //6332 #CJK UNIFIED IDEOGRAPH
+ {0xE762, 0x8EDB}, //6333 #CJK UNIFIED IDEOGRAPH
+ {0xE763, 0x8EE3}, //6334 #CJK UNIFIED IDEOGRAPH
+ {0xE764, 0x8EFC}, //6335 #CJK UNIFIED IDEOGRAPH
+ {0xE765, 0x8EFB}, //6336 #CJK UNIFIED IDEOGRAPH
+ {0xE766, 0x8EEB}, //6337 #CJK UNIFIED IDEOGRAPH
+ {0xE767, 0x8EFE}, //6338 #CJK UNIFIED IDEOGRAPH
+ {0xE768, 0x8F0A}, //6339 #CJK UNIFIED IDEOGRAPH
+ {0xE769, 0x8F05}, //6340 #CJK UNIFIED IDEOGRAPH
+ {0xE76A, 0x8F15}, //6341 #CJK UNIFIED IDEOGRAPH
+ {0xE76B, 0x8F12}, //6342 #CJK UNIFIED IDEOGRAPH
+ {0xE76C, 0x8F19}, //6343 #CJK UNIFIED IDEOGRAPH
+ {0xE76D, 0x8F13}, //6344 #CJK UNIFIED IDEOGRAPH
+ {0xE76E, 0x8F1C}, //6345 #CJK UNIFIED IDEOGRAPH
+ {0xE76F, 0x8F1F}, //6346 #CJK UNIFIED IDEOGRAPH
+ {0xE770, 0x8F1B}, //6347 #CJK UNIFIED IDEOGRAPH
+ {0xE771, 0x8F0C}, //6348 #CJK UNIFIED IDEOGRAPH
+ {0xE772, 0x8F26}, //6349 #CJK UNIFIED IDEOGRAPH
+ {0xE773, 0x8F33}, //6350 #CJK UNIFIED IDEOGRAPH
+ {0xE774, 0x8F3B}, //6351 #CJK UNIFIED IDEOGRAPH
+ {0xE775, 0x8F39}, //6352 #CJK UNIFIED IDEOGRAPH
+ {0xE776, 0x8F45}, //6353 #CJK UNIFIED IDEOGRAPH
+ {0xE777, 0x8F42}, //6354 #CJK UNIFIED IDEOGRAPH
+ {0xE778, 0x8F3E}, //6355 #CJK UNIFIED IDEOGRAPH
+ {0xE779, 0x8F4C}, //6356 #CJK UNIFIED IDEOGRAPH
+ {0xE77A, 0x8F49}, //6357 #CJK UNIFIED IDEOGRAPH
+ {0xE77B, 0x8F46}, //6358 #CJK UNIFIED IDEOGRAPH
+ {0xE77C, 0x8F4E}, //6359 #CJK UNIFIED IDEOGRAPH
+ {0xE77D, 0x8F57}, //6360 #CJK UNIFIED IDEOGRAPH
+ {0xE77E, 0x8F5C}, //6361 #CJK UNIFIED IDEOGRAPH
+ {0xE780, 0x8F62}, //6362 #CJK UNIFIED IDEOGRAPH
+ {0xE781, 0x8F63}, //6363 #CJK UNIFIED IDEOGRAPH
+ {0xE782, 0x8F64}, //6364 #CJK UNIFIED IDEOGRAPH
+ {0xE783, 0x8F9C}, //6365 #CJK UNIFIED IDEOGRAPH
+ {0xE784, 0x8F9F}, //6366 #CJK UNIFIED IDEOGRAPH
+ {0xE785, 0x8FA3}, //6367 #CJK UNIFIED IDEOGRAPH
+ {0xE786, 0x8FAD}, //6368 #CJK UNIFIED IDEOGRAPH
+ {0xE787, 0x8FAF}, //6369 #CJK UNIFIED IDEOGRAPH
+ {0xE788, 0x8FB7}, //6370 #CJK UNIFIED IDEOGRAPH
+ {0xE789, 0x8FDA}, //6371 #CJK UNIFIED IDEOGRAPH
+ {0xE78A, 0x8FE5}, //6372 #CJK UNIFIED IDEOGRAPH
+ {0xE78B, 0x8FE2}, //6373 #CJK UNIFIED IDEOGRAPH
+ {0xE78C, 0x8FEA}, //6374 #CJK UNIFIED IDEOGRAPH
+ {0xE78D, 0x8FEF}, //6375 #CJK UNIFIED IDEOGRAPH
+ {0xE78E, 0x9087}, //6376 #CJK UNIFIED IDEOGRAPH
+ {0xE78F, 0x8FF4}, //6377 #CJK UNIFIED IDEOGRAPH
+ {0xE790, 0x9005}, //6378 #CJK UNIFIED IDEOGRAPH
+ {0xE791, 0x8FF9}, //6379 #CJK UNIFIED IDEOGRAPH
+ {0xE792, 0x8FFA}, //6380 #CJK UNIFIED IDEOGRAPH
+ {0xE793, 0x9011}, //6381 #CJK UNIFIED IDEOGRAPH
+ {0xE794, 0x9015}, //6382 #CJK UNIFIED IDEOGRAPH
+ {0xE795, 0x9021}, //6383 #CJK UNIFIED IDEOGRAPH
+ {0xE796, 0x900D}, //6384 #CJK UNIFIED IDEOGRAPH
+ {0xE797, 0x901E}, //6385 #CJK UNIFIED IDEOGRAPH
+ {0xE798, 0x9016}, //6386 #CJK UNIFIED IDEOGRAPH
+ {0xE799, 0x900B}, //6387 #CJK UNIFIED IDEOGRAPH
+ {0xE79A, 0x9027}, //6388 #CJK UNIFIED IDEOGRAPH
+ {0xE79B, 0x9036}, //6389 #CJK UNIFIED IDEOGRAPH
+ {0xE79C, 0x9035}, //6390 #CJK UNIFIED IDEOGRAPH
+ {0xE79D, 0x9039}, //6391 #CJK UNIFIED IDEOGRAPH
+ {0xE79E, 0x8FF8}, //6392 #CJK UNIFIED IDEOGRAPH
+ {0xE79F, 0x904F}, //6393 #CJK UNIFIED IDEOGRAPH
+ {0xE7A0, 0x9050}, //6394 #CJK UNIFIED IDEOGRAPH
+ {0xE7A1, 0x9051}, //6395 #CJK UNIFIED IDEOGRAPH
+ {0xE7A2, 0x9052}, //6396 #CJK UNIFIED IDEOGRAPH
+ {0xE7A3, 0x900E}, //6397 #CJK UNIFIED IDEOGRAPH
+ {0xE7A4, 0x9049}, //6398 #CJK UNIFIED IDEOGRAPH
+ {0xE7A5, 0x903E}, //6399 #CJK UNIFIED IDEOGRAPH
+ {0xE7A6, 0x9056}, //6400 #CJK UNIFIED IDEOGRAPH
+ {0xE7A7, 0x9058}, //6401 #CJK UNIFIED IDEOGRAPH
+ {0xE7A8, 0x905E}, //6402 #CJK UNIFIED IDEOGRAPH
+ {0xE7A9, 0x9068}, //6403 #CJK UNIFIED IDEOGRAPH
+ {0xE7AA, 0x906F}, //6404 #CJK UNIFIED IDEOGRAPH
+ {0xE7AB, 0x9076}, //6405 #CJK UNIFIED IDEOGRAPH
+ {0xE7AC, 0x96A8}, //6406 #CJK UNIFIED IDEOGRAPH
+ {0xE7AD, 0x9072}, //6407 #CJK UNIFIED IDEOGRAPH
+ {0xE7AE, 0x9082}, //6408 #CJK UNIFIED IDEOGRAPH
+ {0xE7AF, 0x907D}, //6409 #CJK UNIFIED IDEOGRAPH
+ {0xE7B0, 0x9081}, //6410 #CJK UNIFIED IDEOGRAPH
+ {0xE7B1, 0x9080}, //6411 #CJK UNIFIED IDEOGRAPH
+ {0xE7B2, 0x908A}, //6412 #CJK UNIFIED IDEOGRAPH
+ {0xE7B3, 0x9089}, //6413 #CJK UNIFIED IDEOGRAPH
+ {0xE7B4, 0x908F}, //6414 #CJK UNIFIED IDEOGRAPH
+ {0xE7B5, 0x90A8}, //6415 #CJK UNIFIED IDEOGRAPH
+ {0xE7B6, 0x90AF}, //6416 #CJK UNIFIED IDEOGRAPH
+ {0xE7B7, 0x90B1}, //6417 #CJK UNIFIED IDEOGRAPH
+ {0xE7B8, 0x90B5}, //6418 #CJK UNIFIED IDEOGRAPH
+ {0xE7B9, 0x90E2}, //6419 #CJK UNIFIED IDEOGRAPH
+ {0xE7BA, 0x90E4}, //6420 #CJK UNIFIED IDEOGRAPH
+ {0xE7BB, 0x6248}, //6421 #CJK UNIFIED IDEOGRAPH
+ {0xE7BC, 0x90DB}, //6422 #CJK UNIFIED IDEOGRAPH
+ {0xE7BD, 0x9102}, //6423 #CJK UNIFIED IDEOGRAPH
+ {0xE7BE, 0x9112}, //6424 #CJK UNIFIED IDEOGRAPH
+ {0xE7BF, 0x9119}, //6425 #CJK UNIFIED IDEOGRAPH
+ {0xE7C0, 0x9132}, //6426 #CJK UNIFIED IDEOGRAPH
+ {0xE7C1, 0x9130}, //6427 #CJK UNIFIED IDEOGRAPH
+ {0xE7C2, 0x914A}, //6428 #CJK UNIFIED IDEOGRAPH
+ {0xE7C3, 0x9156}, //6429 #CJK UNIFIED IDEOGRAPH
+ {0xE7C4, 0x9158}, //6430 #CJK UNIFIED IDEOGRAPH
+ {0xE7C5, 0x9163}, //6431 #CJK UNIFIED IDEOGRAPH
+ {0xE7C6, 0x9165}, //6432 #CJK UNIFIED IDEOGRAPH
+ {0xE7C7, 0x9169}, //6433 #CJK UNIFIED IDEOGRAPH
+ {0xE7C8, 0x9173}, //6434 #CJK UNIFIED IDEOGRAPH
+ {0xE7C9, 0x9172}, //6435 #CJK UNIFIED IDEOGRAPH
+ {0xE7CA, 0x918B}, //6436 #CJK UNIFIED IDEOGRAPH
+ {0xE7CB, 0x9189}, //6437 #CJK UNIFIED IDEOGRAPH
+ {0xE7CC, 0x9182}, //6438 #CJK UNIFIED IDEOGRAPH
+ {0xE7CD, 0x91A2}, //6439 #CJK UNIFIED IDEOGRAPH
+ {0xE7CE, 0x91AB}, //6440 #CJK UNIFIED IDEOGRAPH
+ {0xE7CF, 0x91AF}, //6441 #CJK UNIFIED IDEOGRAPH
+ {0xE7D0, 0x91AA}, //6442 #CJK UNIFIED IDEOGRAPH
+ {0xE7D1, 0x91B5}, //6443 #CJK UNIFIED IDEOGRAPH
+ {0xE7D2, 0x91B4}, //6444 #CJK UNIFIED IDEOGRAPH
+ {0xE7D3, 0x91BA}, //6445 #CJK UNIFIED IDEOGRAPH
+ {0xE7D4, 0x91C0}, //6446 #CJK UNIFIED IDEOGRAPH
+ {0xE7D5, 0x91C1}, //6447 #CJK UNIFIED IDEOGRAPH
+ {0xE7D6, 0x91C9}, //6448 #CJK UNIFIED IDEOGRAPH
+ {0xE7D7, 0x91CB}, //6449 #CJK UNIFIED IDEOGRAPH
+ {0xE7D8, 0x91D0}, //6450 #CJK UNIFIED IDEOGRAPH
+ {0xE7D9, 0x91D6}, //6451 #CJK UNIFIED IDEOGRAPH
+ {0xE7DA, 0x91DF}, //6452 #CJK UNIFIED IDEOGRAPH
+ {0xE7DB, 0x91E1}, //6453 #CJK UNIFIED IDEOGRAPH
+ {0xE7DC, 0x91DB}, //6454 #CJK UNIFIED IDEOGRAPH
+ {0xE7DD, 0x91FC}, //6455 #CJK UNIFIED IDEOGRAPH
+ {0xE7DE, 0x91F5}, //6456 #CJK UNIFIED IDEOGRAPH
+ {0xE7DF, 0x91F6}, //6457 #CJK UNIFIED IDEOGRAPH
+ {0xE7E0, 0x921E}, //6458 #CJK UNIFIED IDEOGRAPH
+ {0xE7E1, 0x91FF}, //6459 #CJK UNIFIED IDEOGRAPH
+ {0xE7E2, 0x9214}, //6460 #CJK UNIFIED IDEOGRAPH
+ {0xE7E3, 0x922C}, //6461 #CJK UNIFIED IDEOGRAPH
+ {0xE7E4, 0x9215}, //6462 #CJK UNIFIED IDEOGRAPH
+ {0xE7E5, 0x9211}, //6463 #CJK UNIFIED IDEOGRAPH
+ {0xE7E6, 0x925E}, //6464 #CJK UNIFIED IDEOGRAPH
+ {0xE7E7, 0x9257}, //6465 #CJK UNIFIED IDEOGRAPH
+ {0xE7E8, 0x9245}, //6466 #CJK UNIFIED IDEOGRAPH
+ {0xE7E9, 0x9249}, //6467 #CJK UNIFIED IDEOGRAPH
+ {0xE7EA, 0x9264}, //6468 #CJK UNIFIED IDEOGRAPH
+ {0xE7EB, 0x9248}, //6469 #CJK UNIFIED IDEOGRAPH
+ {0xE7EC, 0x9295}, //6470 #CJK UNIFIED IDEOGRAPH
+ {0xE7ED, 0x923F}, //6471 #CJK UNIFIED IDEOGRAPH
+ {0xE7EE, 0x924B}, //6472 #CJK UNIFIED IDEOGRAPH
+ {0xE7EF, 0x9250}, //6473 #CJK UNIFIED IDEOGRAPH
+ {0xE7F0, 0x929C}, //6474 #CJK UNIFIED IDEOGRAPH
+ {0xE7F1, 0x9296}, //6475 #CJK UNIFIED IDEOGRAPH
+ {0xE7F2, 0x9293}, //6476 #CJK UNIFIED IDEOGRAPH
+ {0xE7F3, 0x929B}, //6477 #CJK UNIFIED IDEOGRAPH
+ {0xE7F4, 0x925A}, //6478 #CJK UNIFIED IDEOGRAPH
+ {0xE7F5, 0x92CF}, //6479 #CJK UNIFIED IDEOGRAPH
+ {0xE7F6, 0x92B9}, //6480 #CJK UNIFIED IDEOGRAPH
+ {0xE7F7, 0x92B7}, //6481 #CJK UNIFIED IDEOGRAPH
+ {0xE7F8, 0x92E9}, //6482 #CJK UNIFIED IDEOGRAPH
+ {0xE7F9, 0x930F}, //6483 #CJK UNIFIED IDEOGRAPH
+ {0xE7FA, 0x92FA}, //6484 #CJK UNIFIED IDEOGRAPH
+ {0xE7FB, 0x9344}, //6485 #CJK UNIFIED IDEOGRAPH
+ {0xE7FC, 0x932E}, //6486 #CJK UNIFIED IDEOGRAPH
+ {0xE840, 0x9319}, //6487 #CJK UNIFIED IDEOGRAPH
+ {0xE841, 0x9322}, //6488 #CJK UNIFIED IDEOGRAPH
+ {0xE842, 0x931A}, //6489 #CJK UNIFIED IDEOGRAPH
+ {0xE843, 0x9323}, //6490 #CJK UNIFIED IDEOGRAPH
+ {0xE844, 0x933A}, //6491 #CJK UNIFIED IDEOGRAPH
+ {0xE845, 0x9335}, //6492 #CJK UNIFIED IDEOGRAPH
+ {0xE846, 0x933B}, //6493 #CJK UNIFIED IDEOGRAPH
+ {0xE847, 0x935C}, //6494 #CJK UNIFIED IDEOGRAPH
+ {0xE848, 0x9360}, //6495 #CJK UNIFIED IDEOGRAPH
+ {0xE849, 0x937C}, //6496 #CJK UNIFIED IDEOGRAPH
+ {0xE84A, 0x936E}, //6497 #CJK UNIFIED IDEOGRAPH
+ {0xE84B, 0x9356}, //6498 #CJK UNIFIED IDEOGRAPH
+ {0xE84C, 0x93B0}, //6499 #CJK UNIFIED IDEOGRAPH
+ {0xE84D, 0x93AC}, //6500 #CJK UNIFIED IDEOGRAPH
+ {0xE84E, 0x93AD}, //6501 #CJK UNIFIED IDEOGRAPH
+ {0xE84F, 0x9394}, //6502 #CJK UNIFIED IDEOGRAPH
+ {0xE850, 0x93B9}, //6503 #CJK UNIFIED IDEOGRAPH
+ {0xE851, 0x93D6}, //6504 #CJK UNIFIED IDEOGRAPH
+ {0xE852, 0x93D7}, //6505 #CJK UNIFIED IDEOGRAPH
+ {0xE853, 0x93E8}, //6506 #CJK UNIFIED IDEOGRAPH
+ {0xE854, 0x93E5}, //6507 #CJK UNIFIED IDEOGRAPH
+ {0xE855, 0x93D8}, //6508 #CJK UNIFIED IDEOGRAPH
+ {0xE856, 0x93C3}, //6509 #CJK UNIFIED IDEOGRAPH
+ {0xE857, 0x93DD}, //6510 #CJK UNIFIED IDEOGRAPH
+ {0xE858, 0x93D0}, //6511 #CJK UNIFIED IDEOGRAPH
+ {0xE859, 0x93C8}, //6512 #CJK UNIFIED IDEOGRAPH
+ {0xE85A, 0x93E4}, //6513 #CJK UNIFIED IDEOGRAPH
+ {0xE85B, 0x941A}, //6514 #CJK UNIFIED IDEOGRAPH
+ {0xE85C, 0x9414}, //6515 #CJK UNIFIED IDEOGRAPH
+ {0xE85D, 0x9413}, //6516 #CJK UNIFIED IDEOGRAPH
+ {0xE85E, 0x9403}, //6517 #CJK UNIFIED IDEOGRAPH
+ {0xE85F, 0x9407}, //6518 #CJK UNIFIED IDEOGRAPH
+ {0xE860, 0x9410}, //6519 #CJK UNIFIED IDEOGRAPH
+ {0xE861, 0x9436}, //6520 #CJK UNIFIED IDEOGRAPH
+ {0xE862, 0x942B}, //6521 #CJK UNIFIED IDEOGRAPH
+ {0xE863, 0x9435}, //6522 #CJK UNIFIED IDEOGRAPH
+ {0xE864, 0x9421}, //6523 #CJK UNIFIED IDEOGRAPH
+ {0xE865, 0x943A}, //6524 #CJK UNIFIED IDEOGRAPH
+ {0xE866, 0x9441}, //6525 #CJK UNIFIED IDEOGRAPH
+ {0xE867, 0x9452}, //6526 #CJK UNIFIED IDEOGRAPH
+ {0xE868, 0x9444}, //6527 #CJK UNIFIED IDEOGRAPH
+ {0xE869, 0x945B}, //6528 #CJK UNIFIED IDEOGRAPH
+ {0xE86A, 0x9460}, //6529 #CJK UNIFIED IDEOGRAPH
+ {0xE86B, 0x9462}, //6530 #CJK UNIFIED IDEOGRAPH
+ {0xE86C, 0x945E}, //6531 #CJK UNIFIED IDEOGRAPH
+ {0xE86D, 0x946A}, //6532 #CJK UNIFIED IDEOGRAPH
+ {0xE86E, 0x9229}, //6533 #CJK UNIFIED IDEOGRAPH
+ {0xE86F, 0x9470}, //6534 #CJK UNIFIED IDEOGRAPH
+ {0xE870, 0x9475}, //6535 #CJK UNIFIED IDEOGRAPH
+ {0xE871, 0x9477}, //6536 #CJK UNIFIED IDEOGRAPH
+ {0xE872, 0x947D}, //6537 #CJK UNIFIED IDEOGRAPH
+ {0xE873, 0x945A}, //6538 #CJK UNIFIED IDEOGRAPH
+ {0xE874, 0x947C}, //6539 #CJK UNIFIED IDEOGRAPH
+ {0xE875, 0x947E}, //6540 #CJK UNIFIED IDEOGRAPH
+ {0xE876, 0x9481}, //6541 #CJK UNIFIED IDEOGRAPH
+ {0xE877, 0x947F}, //6542 #CJK UNIFIED IDEOGRAPH
+ {0xE878, 0x9582}, //6543 #CJK UNIFIED IDEOGRAPH
+ {0xE879, 0x9587}, //6544 #CJK UNIFIED IDEOGRAPH
+ {0xE87A, 0x958A}, //6545 #CJK UNIFIED IDEOGRAPH
+ {0xE87B, 0x9594}, //6546 #CJK UNIFIED IDEOGRAPH
+ {0xE87C, 0x9596}, //6547 #CJK UNIFIED IDEOGRAPH
+ {0xE87D, 0x9598}, //6548 #CJK UNIFIED IDEOGRAPH
+ {0xE87E, 0x9599}, //6549 #CJK UNIFIED IDEOGRAPH
+ {0xE880, 0x95A0}, //6550 #CJK UNIFIED IDEOGRAPH
+ {0xE881, 0x95A8}, //6551 #CJK UNIFIED IDEOGRAPH
+ {0xE882, 0x95A7}, //6552 #CJK UNIFIED IDEOGRAPH
+ {0xE883, 0x95AD}, //6553 #CJK UNIFIED IDEOGRAPH
+ {0xE884, 0x95BC}, //6554 #CJK UNIFIED IDEOGRAPH
+ {0xE885, 0x95BB}, //6555 #CJK UNIFIED IDEOGRAPH
+ {0xE886, 0x95B9}, //6556 #CJK UNIFIED IDEOGRAPH
+ {0xE887, 0x95BE}, //6557 #CJK UNIFIED IDEOGRAPH
+ {0xE888, 0x95CA}, //6558 #CJK UNIFIED IDEOGRAPH
+ {0xE889, 0x6FF6}, //6559 #CJK UNIFIED IDEOGRAPH
+ {0xE88A, 0x95C3}, //6560 #CJK UNIFIED IDEOGRAPH
+ {0xE88B, 0x95CD}, //6561 #CJK UNIFIED IDEOGRAPH
+ {0xE88C, 0x95CC}, //6562 #CJK UNIFIED IDEOGRAPH
+ {0xE88D, 0x95D5}, //6563 #CJK UNIFIED IDEOGRAPH
+ {0xE88E, 0x95D4}, //6564 #CJK UNIFIED IDEOGRAPH
+ {0xE88F, 0x95D6}, //6565 #CJK UNIFIED IDEOGRAPH
+ {0xE890, 0x95DC}, //6566 #CJK UNIFIED IDEOGRAPH
+ {0xE891, 0x95E1}, //6567 #CJK UNIFIED IDEOGRAPH
+ {0xE892, 0x95E5}, //6568 #CJK UNIFIED IDEOGRAPH
+ {0xE893, 0x95E2}, //6569 #CJK UNIFIED IDEOGRAPH
+ {0xE894, 0x9621}, //6570 #CJK UNIFIED IDEOGRAPH
+ {0xE895, 0x9628}, //6571 #CJK UNIFIED IDEOGRAPH
+ {0xE896, 0x962E}, //6572 #CJK UNIFIED IDEOGRAPH
+ {0xE897, 0x962F}, //6573 #CJK UNIFIED IDEOGRAPH
+ {0xE898, 0x9642}, //6574 #CJK UNIFIED IDEOGRAPH
+ {0xE899, 0x964C}, //6575 #CJK UNIFIED IDEOGRAPH
+ {0xE89A, 0x964F}, //6576 #CJK UNIFIED IDEOGRAPH
+ {0xE89B, 0x964B}, //6577 #CJK UNIFIED IDEOGRAPH
+ {0xE89C, 0x9677}, //6578 #CJK UNIFIED IDEOGRAPH
+ {0xE89D, 0x965C}, //6579 #CJK UNIFIED IDEOGRAPH
+ {0xE89E, 0x965E}, //6580 #CJK UNIFIED IDEOGRAPH
+ {0xE89F, 0x965D}, //6581 #CJK UNIFIED IDEOGRAPH
+ {0xE8A0, 0x965F}, //6582 #CJK UNIFIED IDEOGRAPH
+ {0xE8A1, 0x9666}, //6583 #CJK UNIFIED IDEOGRAPH
+ {0xE8A2, 0x9672}, //6584 #CJK UNIFIED IDEOGRAPH
+ {0xE8A3, 0x966C}, //6585 #CJK UNIFIED IDEOGRAPH
+ {0xE8A4, 0x968D}, //6586 #CJK UNIFIED IDEOGRAPH
+ {0xE8A5, 0x9698}, //6587 #CJK UNIFIED IDEOGRAPH
+ {0xE8A6, 0x9695}, //6588 #CJK UNIFIED IDEOGRAPH
+ {0xE8A7, 0x9697}, //6589 #CJK UNIFIED IDEOGRAPH
+ {0xE8A8, 0x96AA}, //6590 #CJK UNIFIED IDEOGRAPH
+ {0xE8A9, 0x96A7}, //6591 #CJK UNIFIED IDEOGRAPH
+ {0xE8AA, 0x96B1}, //6592 #CJK UNIFIED IDEOGRAPH
+ {0xE8AB, 0x96B2}, //6593 #CJK UNIFIED IDEOGRAPH
+ {0xE8AC, 0x96B0}, //6594 #CJK UNIFIED IDEOGRAPH
+ {0xE8AD, 0x96B4}, //6595 #CJK UNIFIED IDEOGRAPH
+ {0xE8AE, 0x96B6}, //6596 #CJK UNIFIED IDEOGRAPH
+ {0xE8AF, 0x96B8}, //6597 #CJK UNIFIED IDEOGRAPH
+ {0xE8B0, 0x96B9}, //6598 #CJK UNIFIED IDEOGRAPH
+ {0xE8B1, 0x96CE}, //6599 #CJK UNIFIED IDEOGRAPH
+ {0xE8B2, 0x96CB}, //6600 #CJK UNIFIED IDEOGRAPH
+ {0xE8B3, 0x96C9}, //6601 #CJK UNIFIED IDEOGRAPH
+ {0xE8B4, 0x96CD}, //6602 #CJK UNIFIED IDEOGRAPH
+ {0xE8B5, 0x894D}, //6603 #CJK UNIFIED IDEOGRAPH
+ {0xE8B6, 0x96DC}, //6604 #CJK UNIFIED IDEOGRAPH
+ {0xE8B7, 0x970D}, //6605 #CJK UNIFIED IDEOGRAPH
+ {0xE8B8, 0x96D5}, //6606 #CJK UNIFIED IDEOGRAPH
+ {0xE8B9, 0x96F9}, //6607 #CJK UNIFIED IDEOGRAPH
+ {0xE8BA, 0x9704}, //6608 #CJK UNIFIED IDEOGRAPH
+ {0xE8BB, 0x9706}, //6609 #CJK UNIFIED IDEOGRAPH
+ {0xE8BC, 0x9708}, //6610 #CJK UNIFIED IDEOGRAPH
+ {0xE8BD, 0x9713}, //6611 #CJK UNIFIED IDEOGRAPH
+ {0xE8BE, 0x970E}, //6612 #CJK UNIFIED IDEOGRAPH
+ {0xE8BF, 0x9711}, //6613 #CJK UNIFIED IDEOGRAPH
+ {0xE8C0, 0x970F}, //6614 #CJK UNIFIED IDEOGRAPH
+ {0xE8C1, 0x9716}, //6615 #CJK UNIFIED IDEOGRAPH
+ {0xE8C2, 0x9719}, //6616 #CJK UNIFIED IDEOGRAPH
+ {0xE8C3, 0x9724}, //6617 #CJK UNIFIED IDEOGRAPH
+ {0xE8C4, 0x972A}, //6618 #CJK UNIFIED IDEOGRAPH
+ {0xE8C5, 0x9730}, //6619 #CJK UNIFIED IDEOGRAPH
+ {0xE8C6, 0x9739}, //6620 #CJK UNIFIED IDEOGRAPH
+ {0xE8C7, 0x973D}, //6621 #CJK UNIFIED IDEOGRAPH
+ {0xE8C8, 0x973E}, //6622 #CJK UNIFIED IDEOGRAPH
+ {0xE8C9, 0x9744}, //6623 #CJK UNIFIED IDEOGRAPH
+ {0xE8CA, 0x9746}, //6624 #CJK UNIFIED IDEOGRAPH
+ {0xE8CB, 0x9748}, //6625 #CJK UNIFIED IDEOGRAPH
+ {0xE8CC, 0x9742}, //6626 #CJK UNIFIED IDEOGRAPH
+ {0xE8CD, 0x9749}, //6627 #CJK UNIFIED IDEOGRAPH
+ {0xE8CE, 0x975C}, //6628 #CJK UNIFIED IDEOGRAPH
+ {0xE8CF, 0x9760}, //6629 #CJK UNIFIED IDEOGRAPH
+ {0xE8D0, 0x9764}, //6630 #CJK UNIFIED IDEOGRAPH
+ {0xE8D1, 0x9766}, //6631 #CJK UNIFIED IDEOGRAPH
+ {0xE8D2, 0x9768}, //6632 #CJK UNIFIED IDEOGRAPH
+ {0xE8D3, 0x52D2}, //6633 #CJK UNIFIED IDEOGRAPH
+ {0xE8D4, 0x976B}, //6634 #CJK UNIFIED IDEOGRAPH
+ {0xE8D5, 0x9771}, //6635 #CJK UNIFIED IDEOGRAPH
+ {0xE8D6, 0x9779}, //6636 #CJK UNIFIED IDEOGRAPH
+ {0xE8D7, 0x9785}, //6637 #CJK UNIFIED IDEOGRAPH
+ {0xE8D8, 0x977C}, //6638 #CJK UNIFIED IDEOGRAPH
+ {0xE8D9, 0x9781}, //6639 #CJK UNIFIED IDEOGRAPH
+ {0xE8DA, 0x977A}, //6640 #CJK UNIFIED IDEOGRAPH
+ {0xE8DB, 0x9786}, //6641 #CJK UNIFIED IDEOGRAPH
+ {0xE8DC, 0x978B}, //6642 #CJK UNIFIED IDEOGRAPH
+ {0xE8DD, 0x978F}, //6643 #CJK UNIFIED IDEOGRAPH
+ {0xE8DE, 0x9790}, //6644 #CJK UNIFIED IDEOGRAPH
+ {0xE8DF, 0x979C}, //6645 #CJK UNIFIED IDEOGRAPH
+ {0xE8E0, 0x97A8}, //6646 #CJK UNIFIED IDEOGRAPH
+ {0xE8E1, 0x97A6}, //6647 #CJK UNIFIED IDEOGRAPH
+ {0xE8E2, 0x97A3}, //6648 #CJK UNIFIED IDEOGRAPH
+ {0xE8E3, 0x97B3}, //6649 #CJK UNIFIED IDEOGRAPH
+ {0xE8E4, 0x97B4}, //6650 #CJK UNIFIED IDEOGRAPH
+ {0xE8E5, 0x97C3}, //6651 #CJK UNIFIED IDEOGRAPH
+ {0xE8E6, 0x97C6}, //6652 #CJK UNIFIED IDEOGRAPH
+ {0xE8E7, 0x97C8}, //6653 #CJK UNIFIED IDEOGRAPH
+ {0xE8E8, 0x97CB}, //6654 #CJK UNIFIED IDEOGRAPH
+ {0xE8E9, 0x97DC}, //6655 #CJK UNIFIED IDEOGRAPH
+ {0xE8EA, 0x97ED}, //6656 #CJK UNIFIED IDEOGRAPH
+ {0xE8EB, 0x9F4F}, //6657 #CJK UNIFIED IDEOGRAPH
+ {0xE8EC, 0x97F2}, //6658 #CJK UNIFIED IDEOGRAPH
+ {0xE8ED, 0x7ADF}, //6659 #CJK UNIFIED IDEOGRAPH
+ {0xE8EE, 0x97F6}, //6660 #CJK UNIFIED IDEOGRAPH
+ {0xE8EF, 0x97F5}, //6661 #CJK UNIFIED IDEOGRAPH
+ {0xE8F0, 0x980F}, //6662 #CJK UNIFIED IDEOGRAPH
+ {0xE8F1, 0x980C}, //6663 #CJK UNIFIED IDEOGRAPH
+ {0xE8F2, 0x9838}, //6664 #CJK UNIFIED IDEOGRAPH
+ {0xE8F3, 0x9824}, //6665 #CJK UNIFIED IDEOGRAPH
+ {0xE8F4, 0x9821}, //6666 #CJK UNIFIED IDEOGRAPH
+ {0xE8F5, 0x9837}, //6667 #CJK UNIFIED IDEOGRAPH
+ {0xE8F6, 0x983D}, //6668 #CJK UNIFIED IDEOGRAPH
+ {0xE8F7, 0x9846}, //6669 #CJK UNIFIED IDEOGRAPH
+ {0xE8F8, 0x984F}, //6670 #CJK UNIFIED IDEOGRAPH
+ {0xE8F9, 0x984B}, //6671 #CJK UNIFIED IDEOGRAPH
+ {0xE8FA, 0x986B}, //6672 #CJK UNIFIED IDEOGRAPH
+ {0xE8FB, 0x986F}, //6673 #CJK UNIFIED IDEOGRAPH
+ {0xE8FC, 0x9870}, //6674 #CJK UNIFIED IDEOGRAPH
+ {0xE940, 0x9871}, //6675 #CJK UNIFIED IDEOGRAPH
+ {0xE941, 0x9874}, //6676 #CJK UNIFIED IDEOGRAPH
+ {0xE942, 0x9873}, //6677 #CJK UNIFIED IDEOGRAPH
+ {0xE943, 0x98AA}, //6678 #CJK UNIFIED IDEOGRAPH
+ {0xE944, 0x98AF}, //6679 #CJK UNIFIED IDEOGRAPH
+ {0xE945, 0x98B1}, //6680 #CJK UNIFIED IDEOGRAPH
+ {0xE946, 0x98B6}, //6681 #CJK UNIFIED IDEOGRAPH
+ {0xE947, 0x98C4}, //6682 #CJK UNIFIED IDEOGRAPH
+ {0xE948, 0x98C3}, //6683 #CJK UNIFIED IDEOGRAPH
+ {0xE949, 0x98C6}, //6684 #CJK UNIFIED IDEOGRAPH
+ {0xE94A, 0x98E9}, //6685 #CJK UNIFIED IDEOGRAPH
+ {0xE94B, 0x98EB}, //6686 #CJK UNIFIED IDEOGRAPH
+ {0xE94C, 0x9903}, //6687 #CJK UNIFIED IDEOGRAPH
+ {0xE94D, 0x9909}, //6688 #CJK UNIFIED IDEOGRAPH
+ {0xE94E, 0x9912}, //6689 #CJK UNIFIED IDEOGRAPH
+ {0xE94F, 0x9914}, //6690 #CJK UNIFIED IDEOGRAPH
+ {0xE950, 0x9918}, //6691 #CJK UNIFIED IDEOGRAPH
+ {0xE951, 0x9921}, //6692 #CJK UNIFIED IDEOGRAPH
+ {0xE952, 0x991D}, //6693 #CJK UNIFIED IDEOGRAPH
+ {0xE953, 0x991E}, //6694 #CJK UNIFIED IDEOGRAPH
+ {0xE954, 0x9924}, //6695 #CJK UNIFIED IDEOGRAPH
+ {0xE955, 0x9920}, //6696 #CJK UNIFIED IDEOGRAPH
+ {0xE956, 0x992C}, //6697 #CJK UNIFIED IDEOGRAPH
+ {0xE957, 0x992E}, //6698 #CJK UNIFIED IDEOGRAPH
+ {0xE958, 0x993D}, //6699 #CJK UNIFIED IDEOGRAPH
+ {0xE959, 0x993E}, //6700 #CJK UNIFIED IDEOGRAPH
+ {0xE95A, 0x9942}, //6701 #CJK UNIFIED IDEOGRAPH
+ {0xE95B, 0x9949}, //6702 #CJK UNIFIED IDEOGRAPH
+ {0xE95C, 0x9945}, //6703 #CJK UNIFIED IDEOGRAPH
+ {0xE95D, 0x9950}, //6704 #CJK UNIFIED IDEOGRAPH
+ {0xE95E, 0x994B}, //6705 #CJK UNIFIED IDEOGRAPH
+ {0xE95F, 0x9951}, //6706 #CJK UNIFIED IDEOGRAPH
+ {0xE960, 0x9952}, //6707 #CJK UNIFIED IDEOGRAPH
+ {0xE961, 0x994C}, //6708 #CJK UNIFIED IDEOGRAPH
+ {0xE962, 0x9955}, //6709 #CJK UNIFIED IDEOGRAPH
+ {0xE963, 0x9997}, //6710 #CJK UNIFIED IDEOGRAPH
+ {0xE964, 0x9998}, //6711 #CJK UNIFIED IDEOGRAPH
+ {0xE965, 0x99A5}, //6712 #CJK UNIFIED IDEOGRAPH
+ {0xE966, 0x99AD}, //6713 #CJK UNIFIED IDEOGRAPH
+ {0xE967, 0x99AE}, //6714 #CJK UNIFIED IDEOGRAPH
+ {0xE968, 0x99BC}, //6715 #CJK UNIFIED IDEOGRAPH
+ {0xE969, 0x99DF}, //6716 #CJK UNIFIED IDEOGRAPH
+ {0xE96A, 0x99DB}, //6717 #CJK UNIFIED IDEOGRAPH
+ {0xE96B, 0x99DD}, //6718 #CJK UNIFIED IDEOGRAPH
+ {0xE96C, 0x99D8}, //6719 #CJK UNIFIED IDEOGRAPH
+ {0xE96D, 0x99D1}, //6720 #CJK UNIFIED IDEOGRAPH
+ {0xE96E, 0x99ED}, //6721 #CJK UNIFIED IDEOGRAPH
+ {0xE96F, 0x99EE}, //6722 #CJK UNIFIED IDEOGRAPH
+ {0xE970, 0x99F1}, //6723 #CJK UNIFIED IDEOGRAPH
+ {0xE971, 0x99F2}, //6724 #CJK UNIFIED IDEOGRAPH
+ {0xE972, 0x99FB}, //6725 #CJK UNIFIED IDEOGRAPH
+ {0xE973, 0x99F8}, //6726 #CJK UNIFIED IDEOGRAPH
+ {0xE974, 0x9A01}, //6727 #CJK UNIFIED IDEOGRAPH
+ {0xE975, 0x9A0F}, //6728 #CJK UNIFIED IDEOGRAPH
+ {0xE976, 0x9A05}, //6729 #CJK UNIFIED IDEOGRAPH
+ {0xE977, 0x99E2}, //6730 #CJK UNIFIED IDEOGRAPH
+ {0xE978, 0x9A19}, //6731 #CJK UNIFIED IDEOGRAPH
+ {0xE979, 0x9A2B}, //6732 #CJK UNIFIED IDEOGRAPH
+ {0xE97A, 0x9A37}, //6733 #CJK UNIFIED IDEOGRAPH
+ {0xE97B, 0x9A45}, //6734 #CJK UNIFIED IDEOGRAPH
+ {0xE97C, 0x9A42}, //6735 #CJK UNIFIED IDEOGRAPH
+ {0xE97D, 0x9A40}, //6736 #CJK UNIFIED IDEOGRAPH
+ {0xE97E, 0x9A43}, //6737 #CJK UNIFIED IDEOGRAPH
+ {0xE980, 0x9A3E}, //6738 #CJK UNIFIED IDEOGRAPH
+ {0xE981, 0x9A55}, //6739 #CJK UNIFIED IDEOGRAPH
+ {0xE982, 0x9A4D}, //6740 #CJK UNIFIED IDEOGRAPH
+ {0xE983, 0x9A5B}, //6741 #CJK UNIFIED IDEOGRAPH
+ {0xE984, 0x9A57}, //6742 #CJK UNIFIED IDEOGRAPH
+ {0xE985, 0x9A5F}, //6743 #CJK UNIFIED IDEOGRAPH
+ {0xE986, 0x9A62}, //6744 #CJK UNIFIED IDEOGRAPH
+ {0xE987, 0x9A65}, //6745 #CJK UNIFIED IDEOGRAPH
+ {0xE988, 0x9A64}, //6746 #CJK UNIFIED IDEOGRAPH
+ {0xE989, 0x9A69}, //6747 #CJK UNIFIED IDEOGRAPH
+ {0xE98A, 0x9A6B}, //6748 #CJK UNIFIED IDEOGRAPH
+ {0xE98B, 0x9A6A}, //6749 #CJK UNIFIED IDEOGRAPH
+ {0xE98C, 0x9AAD}, //6750 #CJK UNIFIED IDEOGRAPH
+ {0xE98D, 0x9AB0}, //6751 #CJK UNIFIED IDEOGRAPH
+ {0xE98E, 0x9ABC}, //6752 #CJK UNIFIED IDEOGRAPH
+ {0xE98F, 0x9AC0}, //6753 #CJK UNIFIED IDEOGRAPH
+ {0xE990, 0x9ACF}, //6754 #CJK UNIFIED IDEOGRAPH
+ {0xE991, 0x9AD1}, //6755 #CJK UNIFIED IDEOGRAPH
+ {0xE992, 0x9AD3}, //6756 #CJK UNIFIED IDEOGRAPH
+ {0xE993, 0x9AD4}, //6757 #CJK UNIFIED IDEOGRAPH
+ {0xE994, 0x9ADE}, //6758 #CJK UNIFIED IDEOGRAPH
+ {0xE995, 0x9ADF}, //6759 #CJK UNIFIED IDEOGRAPH
+ {0xE996, 0x9AE2}, //6760 #CJK UNIFIED IDEOGRAPH
+ {0xE997, 0x9AE3}, //6761 #CJK UNIFIED IDEOGRAPH
+ {0xE998, 0x9AE6}, //6762 #CJK UNIFIED IDEOGRAPH
+ {0xE999, 0x9AEF}, //6763 #CJK UNIFIED IDEOGRAPH
+ {0xE99A, 0x9AEB}, //6764 #CJK UNIFIED IDEOGRAPH
+ {0xE99B, 0x9AEE}, //6765 #CJK UNIFIED IDEOGRAPH
+ {0xE99C, 0x9AF4}, //6766 #CJK UNIFIED IDEOGRAPH
+ {0xE99D, 0x9AF1}, //6767 #CJK UNIFIED IDEOGRAPH
+ {0xE99E, 0x9AF7}, //6768 #CJK UNIFIED IDEOGRAPH
+ {0xE99F, 0x9AFB}, //6769 #CJK UNIFIED IDEOGRAPH
+ {0xE9A0, 0x9B06}, //6770 #CJK UNIFIED IDEOGRAPH
+ {0xE9A1, 0x9B18}, //6771 #CJK UNIFIED IDEOGRAPH
+ {0xE9A2, 0x9B1A}, //6772 #CJK UNIFIED IDEOGRAPH
+ {0xE9A3, 0x9B1F}, //6773 #CJK UNIFIED IDEOGRAPH
+ {0xE9A4, 0x9B22}, //6774 #CJK UNIFIED IDEOGRAPH
+ {0xE9A5, 0x9B23}, //6775 #CJK UNIFIED IDEOGRAPH
+ {0xE9A6, 0x9B25}, //6776 #CJK UNIFIED IDEOGRAPH
+ {0xE9A7, 0x9B27}, //6777 #CJK UNIFIED IDEOGRAPH
+ {0xE9A8, 0x9B28}, //6778 #CJK UNIFIED IDEOGRAPH
+ {0xE9A9, 0x9B29}, //6779 #CJK UNIFIED IDEOGRAPH
+ {0xE9AA, 0x9B2A}, //6780 #CJK UNIFIED IDEOGRAPH
+ {0xE9AB, 0x9B2E}, //6781 #CJK UNIFIED IDEOGRAPH
+ {0xE9AC, 0x9B2F}, //6782 #CJK UNIFIED IDEOGRAPH
+ {0xE9AD, 0x9B32}, //6783 #CJK UNIFIED IDEOGRAPH
+ {0xE9AE, 0x9B44}, //6784 #CJK UNIFIED IDEOGRAPH
+ {0xE9AF, 0x9B43}, //6785 #CJK UNIFIED IDEOGRAPH
+ {0xE9B0, 0x9B4F}, //6786 #CJK UNIFIED IDEOGRAPH
+ {0xE9B1, 0x9B4D}, //6787 #CJK UNIFIED IDEOGRAPH
+ {0xE9B2, 0x9B4E}, //6788 #CJK UNIFIED IDEOGRAPH
+ {0xE9B3, 0x9B51}, //6789 #CJK UNIFIED IDEOGRAPH
+ {0xE9B4, 0x9B58}, //6790 #CJK UNIFIED IDEOGRAPH
+ {0xE9B5, 0x9B74}, //6791 #CJK UNIFIED IDEOGRAPH
+ {0xE9B6, 0x9B93}, //6792 #CJK UNIFIED IDEOGRAPH
+ {0xE9B7, 0x9B83}, //6793 #CJK UNIFIED IDEOGRAPH
+ {0xE9B8, 0x9B91}, //6794 #CJK UNIFIED IDEOGRAPH
+ {0xE9B9, 0x9B96}, //6795 #CJK UNIFIED IDEOGRAPH
+ {0xE9BA, 0x9B97}, //6796 #CJK UNIFIED IDEOGRAPH
+ {0xE9BB, 0x9B9F}, //6797 #CJK UNIFIED IDEOGRAPH
+ {0xE9BC, 0x9BA0}, //6798 #CJK UNIFIED IDEOGRAPH
+ {0xE9BD, 0x9BA8}, //6799 #CJK UNIFIED IDEOGRAPH
+ {0xE9BE, 0x9BB4}, //6800 #CJK UNIFIED IDEOGRAPH
+ {0xE9BF, 0x9BC0}, //6801 #CJK UNIFIED IDEOGRAPH
+ {0xE9C0, 0x9BCA}, //6802 #CJK UNIFIED IDEOGRAPH
+ {0xE9C1, 0x9BB9}, //6803 #CJK UNIFIED IDEOGRAPH
+ {0xE9C2, 0x9BC6}, //6804 #CJK UNIFIED IDEOGRAPH
+ {0xE9C3, 0x9BCF}, //6805 #CJK UNIFIED IDEOGRAPH
+ {0xE9C4, 0x9BD1}, //6806 #CJK UNIFIED IDEOGRAPH
+ {0xE9C5, 0x9BD2}, //6807 #CJK UNIFIED IDEOGRAPH
+ {0xE9C6, 0x9BE3}, //6808 #CJK UNIFIED IDEOGRAPH
+ {0xE9C7, 0x9BE2}, //6809 #CJK UNIFIED IDEOGRAPH
+ {0xE9C8, 0x9BE4}, //6810 #CJK UNIFIED IDEOGRAPH
+ {0xE9C9, 0x9BD4}, //6811 #CJK UNIFIED IDEOGRAPH
+ {0xE9CA, 0x9BE1}, //6812 #CJK UNIFIED IDEOGRAPH
+ {0xE9CB, 0x9C3A}, //6813 #CJK UNIFIED IDEOGRAPH
+ {0xE9CC, 0x9BF2}, //6814 #CJK UNIFIED IDEOGRAPH
+ {0xE9CD, 0x9BF1}, //6815 #CJK UNIFIED IDEOGRAPH
+ {0xE9CE, 0x9BF0}, //6816 #CJK UNIFIED IDEOGRAPH
+ {0xE9CF, 0x9C15}, //6817 #CJK UNIFIED IDEOGRAPH
+ {0xE9D0, 0x9C14}, //6818 #CJK UNIFIED IDEOGRAPH
+ {0xE9D1, 0x9C09}, //6819 #CJK UNIFIED IDEOGRAPH
+ {0xE9D2, 0x9C13}, //6820 #CJK UNIFIED IDEOGRAPH
+ {0xE9D3, 0x9C0C}, //6821 #CJK UNIFIED IDEOGRAPH
+ {0xE9D4, 0x9C06}, //6822 #CJK UNIFIED IDEOGRAPH
+ {0xE9D5, 0x9C08}, //6823 #CJK UNIFIED IDEOGRAPH
+ {0xE9D6, 0x9C12}, //6824 #CJK UNIFIED IDEOGRAPH
+ {0xE9D7, 0x9C0A}, //6825 #CJK UNIFIED IDEOGRAPH
+ {0xE9D8, 0x9C04}, //6826 #CJK UNIFIED IDEOGRAPH
+ {0xE9D9, 0x9C2E}, //6827 #CJK UNIFIED IDEOGRAPH
+ {0xE9DA, 0x9C1B}, //6828 #CJK UNIFIED IDEOGRAPH
+ {0xE9DB, 0x9C25}, //6829 #CJK UNIFIED IDEOGRAPH
+ {0xE9DC, 0x9C24}, //6830 #CJK UNIFIED IDEOGRAPH
+ {0xE9DD, 0x9C21}, //6831 #CJK UNIFIED IDEOGRAPH
+ {0xE9DE, 0x9C30}, //6832 #CJK UNIFIED IDEOGRAPH
+ {0xE9DF, 0x9C47}, //6833 #CJK UNIFIED IDEOGRAPH
+ {0xE9E0, 0x9C32}, //6834 #CJK UNIFIED IDEOGRAPH
+ {0xE9E1, 0x9C46}, //6835 #CJK UNIFIED IDEOGRAPH
+ {0xE9E2, 0x9C3E}, //6836 #CJK UNIFIED IDEOGRAPH
+ {0xE9E3, 0x9C5A}, //6837 #CJK UNIFIED IDEOGRAPH
+ {0xE9E4, 0x9C60}, //6838 #CJK UNIFIED IDEOGRAPH
+ {0xE9E5, 0x9C67}, //6839 #CJK UNIFIED IDEOGRAPH
+ {0xE9E6, 0x9C76}, //6840 #CJK UNIFIED IDEOGRAPH
+ {0xE9E7, 0x9C78}, //6841 #CJK UNIFIED IDEOGRAPH
+ {0xE9E8, 0x9CE7}, //6842 #CJK UNIFIED IDEOGRAPH
+ {0xE9E9, 0x9CEC}, //6843 #CJK UNIFIED IDEOGRAPH
+ {0xE9EA, 0x9CF0}, //6844 #CJK UNIFIED IDEOGRAPH
+ {0xE9EB, 0x9D09}, //6845 #CJK UNIFIED IDEOGRAPH
+ {0xE9EC, 0x9D08}, //6846 #CJK UNIFIED IDEOGRAPH
+ {0xE9ED, 0x9CEB}, //6847 #CJK UNIFIED IDEOGRAPH
+ {0xE9EE, 0x9D03}, //6848 #CJK UNIFIED IDEOGRAPH
+ {0xE9EF, 0x9D06}, //6849 #CJK UNIFIED IDEOGRAPH
+ {0xE9F0, 0x9D2A}, //6850 #CJK UNIFIED IDEOGRAPH
+ {0xE9F1, 0x9D26}, //6851 #CJK UNIFIED IDEOGRAPH
+ {0xE9F2, 0x9DAF}, //6852 #CJK UNIFIED IDEOGRAPH
+ {0xE9F3, 0x9D23}, //6853 #CJK UNIFIED IDEOGRAPH
+ {0xE9F4, 0x9D1F}, //6854 #CJK UNIFIED IDEOGRAPH
+ {0xE9F5, 0x9D44}, //6855 #CJK UNIFIED IDEOGRAPH
+ {0xE9F6, 0x9D15}, //6856 #CJK UNIFIED IDEOGRAPH
+ {0xE9F7, 0x9D12}, //6857 #CJK UNIFIED IDEOGRAPH
+ {0xE9F8, 0x9D41}, //6858 #CJK UNIFIED IDEOGRAPH
+ {0xE9F9, 0x9D3F}, //6859 #CJK UNIFIED IDEOGRAPH
+ {0xE9FA, 0x9D3E}, //6860 #CJK UNIFIED IDEOGRAPH
+ {0xE9FB, 0x9D46}, //6861 #CJK UNIFIED IDEOGRAPH
+ {0xE9FC, 0x9D48}, //6862 #CJK UNIFIED IDEOGRAPH
+ {0xEA40, 0x9D5D}, //6863 #CJK UNIFIED IDEOGRAPH
+ {0xEA41, 0x9D5E}, //6864 #CJK UNIFIED IDEOGRAPH
+ {0xEA42, 0x9D64}, //6865 #CJK UNIFIED IDEOGRAPH
+ {0xEA43, 0x9D51}, //6866 #CJK UNIFIED IDEOGRAPH
+ {0xEA44, 0x9D50}, //6867 #CJK UNIFIED IDEOGRAPH
+ {0xEA45, 0x9D59}, //6868 #CJK UNIFIED IDEOGRAPH
+ {0xEA46, 0x9D72}, //6869 #CJK UNIFIED IDEOGRAPH
+ {0xEA47, 0x9D89}, //6870 #CJK UNIFIED IDEOGRAPH
+ {0xEA48, 0x9D87}, //6871 #CJK UNIFIED IDEOGRAPH
+ {0xEA49, 0x9DAB}, //6872 #CJK UNIFIED IDEOGRAPH
+ {0xEA4A, 0x9D6F}, //6873 #CJK UNIFIED IDEOGRAPH
+ {0xEA4B, 0x9D7A}, //6874 #CJK UNIFIED IDEOGRAPH
+ {0xEA4C, 0x9D9A}, //6875 #CJK UNIFIED IDEOGRAPH
+ {0xEA4D, 0x9DA4}, //6876 #CJK UNIFIED IDEOGRAPH
+ {0xEA4E, 0x9DA9}, //6877 #CJK UNIFIED IDEOGRAPH
+ {0xEA4F, 0x9DB2}, //6878 #CJK UNIFIED IDEOGRAPH
+ {0xEA50, 0x9DC4}, //6879 #CJK UNIFIED IDEOGRAPH
+ {0xEA51, 0x9DC1}, //6880 #CJK UNIFIED IDEOGRAPH
+ {0xEA52, 0x9DBB}, //6881 #CJK UNIFIED IDEOGRAPH
+ {0xEA53, 0x9DB8}, //6882 #CJK UNIFIED IDEOGRAPH
+ {0xEA54, 0x9DBA}, //6883 #CJK UNIFIED IDEOGRAPH
+ {0xEA55, 0x9DC6}, //6884 #CJK UNIFIED IDEOGRAPH
+ {0xEA56, 0x9DCF}, //6885 #CJK UNIFIED IDEOGRAPH
+ {0xEA57, 0x9DC2}, //6886 #CJK UNIFIED IDEOGRAPH
+ {0xEA58, 0x9DD9}, //6887 #CJK UNIFIED IDEOGRAPH
+ {0xEA59, 0x9DD3}, //6888 #CJK UNIFIED IDEOGRAPH
+ {0xEA5A, 0x9DF8}, //6889 #CJK UNIFIED IDEOGRAPH
+ {0xEA5B, 0x9DE6}, //6890 #CJK UNIFIED IDEOGRAPH
+ {0xEA5C, 0x9DED}, //6891 #CJK UNIFIED IDEOGRAPH
+ {0xEA5D, 0x9DEF}, //6892 #CJK UNIFIED IDEOGRAPH
+ {0xEA5E, 0x9DFD}, //6893 #CJK UNIFIED IDEOGRAPH
+ {0xEA5F, 0x9E1A}, //6894 #CJK UNIFIED IDEOGRAPH
+ {0xEA60, 0x9E1B}, //6895 #CJK UNIFIED IDEOGRAPH
+ {0xEA61, 0x9E1E}, //6896 #CJK UNIFIED IDEOGRAPH
+ {0xEA62, 0x9E75}, //6897 #CJK UNIFIED IDEOGRAPH
+ {0xEA63, 0x9E79}, //6898 #CJK UNIFIED IDEOGRAPH
+ {0xEA64, 0x9E7D}, //6899 #CJK UNIFIED IDEOGRAPH
+ {0xEA65, 0x9E81}, //6900 #CJK UNIFIED IDEOGRAPH
+ {0xEA66, 0x9E88}, //6901 #CJK UNIFIED IDEOGRAPH
+ {0xEA67, 0x9E8B}, //6902 #CJK UNIFIED IDEOGRAPH
+ {0xEA68, 0x9E8C}, //6903 #CJK UNIFIED IDEOGRAPH
+ {0xEA69, 0x9E92}, //6904 #CJK UNIFIED IDEOGRAPH
+ {0xEA6A, 0x9E95}, //6905 #CJK UNIFIED IDEOGRAPH
+ {0xEA6B, 0x9E91}, //6906 #CJK UNIFIED IDEOGRAPH
+ {0xEA6C, 0x9E9D}, //6907 #CJK UNIFIED IDEOGRAPH
+ {0xEA6D, 0x9EA5}, //6908 #CJK UNIFIED IDEOGRAPH
+ {0xEA6E, 0x9EA9}, //6909 #CJK UNIFIED IDEOGRAPH
+ {0xEA6F, 0x9EB8}, //6910 #CJK UNIFIED IDEOGRAPH
+ {0xEA70, 0x9EAA}, //6911 #CJK UNIFIED IDEOGRAPH
+ {0xEA71, 0x9EAD}, //6912 #CJK UNIFIED IDEOGRAPH
+ {0xEA72, 0x9761}, //6913 #CJK UNIFIED IDEOGRAPH
+ {0xEA73, 0x9ECC}, //6914 #CJK UNIFIED IDEOGRAPH
+ {0xEA74, 0x9ECE}, //6915 #CJK UNIFIED IDEOGRAPH
+ {0xEA75, 0x9ECF}, //6916 #CJK UNIFIED IDEOGRAPH
+ {0xEA76, 0x9ED0}, //6917 #CJK UNIFIED IDEOGRAPH
+ {0xEA77, 0x9ED4}, //6918 #CJK UNIFIED IDEOGRAPH
+ {0xEA78, 0x9EDC}, //6919 #CJK UNIFIED IDEOGRAPH
+ {0xEA79, 0x9EDE}, //6920 #CJK UNIFIED IDEOGRAPH
+ {0xEA7A, 0x9EDD}, //6921 #CJK UNIFIED IDEOGRAPH
+ {0xEA7B, 0x9EE0}, //6922 #CJK UNIFIED IDEOGRAPH
+ {0xEA7C, 0x9EE5}, //6923 #CJK UNIFIED IDEOGRAPH
+ {0xEA7D, 0x9EE8}, //6924 #CJK UNIFIED IDEOGRAPH
+ {0xEA7E, 0x9EEF}, //6925 #CJK UNIFIED IDEOGRAPH
+ {0xEA80, 0x9EF4}, //6926 #CJK UNIFIED IDEOGRAPH
+ {0xEA81, 0x9EF6}, //6927 #CJK UNIFIED IDEOGRAPH
+ {0xEA82, 0x9EF7}, //6928 #CJK UNIFIED IDEOGRAPH
+ {0xEA83, 0x9EF9}, //6929 #CJK UNIFIED IDEOGRAPH
+ {0xEA84, 0x9EFB}, //6930 #CJK UNIFIED IDEOGRAPH
+ {0xEA85, 0x9EFC}, //6931 #CJK UNIFIED IDEOGRAPH
+ {0xEA86, 0x9EFD}, //6932 #CJK UNIFIED IDEOGRAPH
+ {0xEA87, 0x9F07}, //6933 #CJK UNIFIED IDEOGRAPH
+ {0xEA88, 0x9F08}, //6934 #CJK UNIFIED IDEOGRAPH
+ {0xEA89, 0x76B7}, //6935 #CJK UNIFIED IDEOGRAPH
+ {0xEA8A, 0x9F15}, //6936 #CJK UNIFIED IDEOGRAPH
+ {0xEA8B, 0x9F21}, //6937 #CJK UNIFIED IDEOGRAPH
+ {0xEA8C, 0x9F2C}, //6938 #CJK UNIFIED IDEOGRAPH
+ {0xEA8D, 0x9F3E}, //6939 #CJK UNIFIED IDEOGRAPH
+ {0xEA8E, 0x9F4A}, //6940 #CJK UNIFIED IDEOGRAPH
+ {0xEA8F, 0x9F52}, //6941 #CJK UNIFIED IDEOGRAPH
+ {0xEA90, 0x9F54}, //6942 #CJK UNIFIED IDEOGRAPH
+ {0xEA91, 0x9F63}, //6943 #CJK UNIFIED IDEOGRAPH
+ {0xEA92, 0x9F5F}, //6944 #CJK UNIFIED IDEOGRAPH
+ {0xEA93, 0x9F60}, //6945 #CJK UNIFIED IDEOGRAPH
+ {0xEA94, 0x9F61}, //6946 #CJK UNIFIED IDEOGRAPH
+ {0xEA95, 0x9F66}, //6947 #CJK UNIFIED IDEOGRAPH
+ {0xEA96, 0x9F67}, //6948 #CJK UNIFIED IDEOGRAPH
+ {0xEA97, 0x9F6C}, //6949 #CJK UNIFIED IDEOGRAPH
+ {0xEA98, 0x9F6A}, //6950 #CJK UNIFIED IDEOGRAPH
+ {0xEA99, 0x9F77}, //6951 #CJK UNIFIED IDEOGRAPH
+ {0xEA9A, 0x9F72}, //6952 #CJK UNIFIED IDEOGRAPH
+ {0xEA9B, 0x9F76}, //6953 #CJK UNIFIED IDEOGRAPH
+ {0xEA9C, 0x9F95}, //6954 #CJK UNIFIED IDEOGRAPH
+ {0xEA9D, 0x9F9C}, //6955 #CJK UNIFIED IDEOGRAPH
+ {0xEA9E, 0x9FA0}, //6956 #CJK UNIFIED IDEOGRAPH
+ {0xEA9F, 0x582F}, //6957 #CJK UNIFIED IDEOGRAPH
+ {0xEAA0, 0x69C7}, //6958 #CJK UNIFIED IDEOGRAPH
+ {0xEAA1, 0x9059}, //6959 #CJK UNIFIED IDEOGRAPH
+ {0xEAA2, 0x7464}, //6960 #CJK UNIFIED IDEOGRAPH
+ {0xEAA3, 0x51DC}, //6961 #CJK UNIFIED IDEOGRAPH
+ {0xEAA4, 0x7199}, //6962 #CJK UNIFIED IDEOGRAPH
+ {0xED40, 0x7E8A}, //6963 #CJK UNIFIED IDEOGRAPH
+ {0xED41, 0x891C}, //6964 #CJK UNIFIED IDEOGRAPH
+ {0xED42, 0x9348}, //6965 #CJK UNIFIED IDEOGRAPH
+ {0xED43, 0x9288}, //6966 #CJK UNIFIED IDEOGRAPH
+ {0xED44, 0x84DC}, //6967 #CJK UNIFIED IDEOGRAPH
+ {0xED45, 0x4FC9}, //6968 #CJK UNIFIED IDEOGRAPH
+ {0xED46, 0x70BB}, //6969 #CJK UNIFIED IDEOGRAPH
+ {0xED47, 0x6631}, //6970 #CJK UNIFIED IDEOGRAPH
+ {0xED48, 0x68C8}, //6971 #CJK UNIFIED IDEOGRAPH
+ {0xED49, 0x92F9}, //6972 #CJK UNIFIED IDEOGRAPH
+ {0xED4A, 0x66FB}, //6973 #CJK UNIFIED IDEOGRAPH
+ {0xED4B, 0x5F45}, //6974 #CJK UNIFIED IDEOGRAPH
+ {0xED4C, 0x4E28}, //6975 #CJK UNIFIED IDEOGRAPH
+ {0xED4D, 0x4EE1}, //6976 #CJK UNIFIED IDEOGRAPH
+ {0xED4E, 0x4EFC}, //6977 #CJK UNIFIED IDEOGRAPH
+ {0xED4F, 0x4F00}, //6978 #CJK UNIFIED IDEOGRAPH
+ {0xED50, 0x4F03}, //6979 #CJK UNIFIED IDEOGRAPH
+ {0xED51, 0x4F39}, //6980 #CJK UNIFIED IDEOGRAPH
+ {0xED52, 0x4F56}, //6981 #CJK UNIFIED IDEOGRAPH
+ {0xED53, 0x4F92}, //6982 #CJK UNIFIED IDEOGRAPH
+ {0xED54, 0x4F8A}, //6983 #CJK UNIFIED IDEOGRAPH
+ {0xED55, 0x4F9A}, //6984 #CJK UNIFIED IDEOGRAPH
+ {0xED56, 0x4F94}, //6985 #CJK UNIFIED IDEOGRAPH
+ {0xED57, 0x4FCD}, //6986 #CJK UNIFIED IDEOGRAPH
+ {0xED58, 0x5040}, //6987 #CJK UNIFIED IDEOGRAPH
+ {0xED59, 0x5022}, //6988 #CJK UNIFIED IDEOGRAPH
+ {0xED5A, 0x4FFF}, //6989 #CJK UNIFIED IDEOGRAPH
+ {0xED5B, 0x501E}, //6990 #CJK UNIFIED IDEOGRAPH
+ {0xED5C, 0x5046}, //6991 #CJK UNIFIED IDEOGRAPH
+ {0xED5D, 0x5070}, //6992 #CJK UNIFIED IDEOGRAPH
+ {0xED5E, 0x5042}, //6993 #CJK UNIFIED IDEOGRAPH
+ {0xED5F, 0x5094}, //6994 #CJK UNIFIED IDEOGRAPH
+ {0xED60, 0x50F4}, //6995 #CJK UNIFIED IDEOGRAPH
+ {0xED61, 0x50D8}, //6996 #CJK UNIFIED IDEOGRAPH
+ {0xED62, 0x514A}, //6997 #CJK UNIFIED IDEOGRAPH
+ {0xED63, 0x5164}, //6998 #CJK UNIFIED IDEOGRAPH
+ {0xED64, 0x519D}, //6999 #CJK UNIFIED IDEOGRAPH
+ {0xED65, 0x51BE}, //7000 #CJK UNIFIED IDEOGRAPH
+ {0xED66, 0x51EC}, //7001 #CJK UNIFIED IDEOGRAPH
+ {0xED67, 0x5215}, //7002 #CJK UNIFIED IDEOGRAPH
+ {0xED68, 0x529C}, //7003 #CJK UNIFIED IDEOGRAPH
+ {0xED69, 0x52A6}, //7004 #CJK UNIFIED IDEOGRAPH
+ {0xED6A, 0x52C0}, //7005 #CJK UNIFIED IDEOGRAPH
+ {0xED6B, 0x52DB}, //7006 #CJK UNIFIED IDEOGRAPH
+ {0xED6C, 0x5300}, //7007 #CJK UNIFIED IDEOGRAPH
+ {0xED6D, 0x5307}, //7008 #CJK UNIFIED IDEOGRAPH
+ {0xED6E, 0x5324}, //7009 #CJK UNIFIED IDEOGRAPH
+ {0xED6F, 0x5372}, //7010 #CJK UNIFIED IDEOGRAPH
+ {0xED70, 0x5393}, //7011 #CJK UNIFIED IDEOGRAPH
+ {0xED71, 0x53B2}, //7012 #CJK UNIFIED IDEOGRAPH
+ {0xED72, 0x53DD}, //7013 #CJK UNIFIED IDEOGRAPH
+ {0xED73, 0xFA0E}, //7014 #CJK COMPATIBILITY IDEOGRAPH
+ {0xED74, 0x549C}, //7015 #CJK UNIFIED IDEOGRAPH
+ {0xED75, 0x548A}, //7016 #CJK UNIFIED IDEOGRAPH
+ {0xED76, 0x54A9}, //7017 #CJK UNIFIED IDEOGRAPH
+ {0xED77, 0x54FF}, //7018 #CJK UNIFIED IDEOGRAPH
+ {0xED78, 0x5586}, //7019 #CJK UNIFIED IDEOGRAPH
+ {0xED79, 0x5759}, //7020 #CJK UNIFIED IDEOGRAPH
+ {0xED7A, 0x5765}, //7021 #CJK UNIFIED IDEOGRAPH
+ {0xED7B, 0x57AC}, //7022 #CJK UNIFIED IDEOGRAPH
+ {0xED7C, 0x57C8}, //7023 #CJK UNIFIED IDEOGRAPH
+ {0xED7D, 0x57C7}, //7024 #CJK UNIFIED IDEOGRAPH
+ {0xED7E, 0xFA0F}, //7025 #CJK COMPATIBILITY IDEOGRAPH
+ {0xED80, 0xFA10}, //7026 #CJK COMPATIBILITY IDEOGRAPH
+ {0xED81, 0x589E}, //7027 #CJK UNIFIED IDEOGRAPH
+ {0xED82, 0x58B2}, //7028 #CJK UNIFIED IDEOGRAPH
+ {0xED83, 0x590B}, //7029 #CJK UNIFIED IDEOGRAPH
+ {0xED84, 0x5953}, //7030 #CJK UNIFIED IDEOGRAPH
+ {0xED85, 0x595B}, //7031 #CJK UNIFIED IDEOGRAPH
+ {0xED86, 0x595D}, //7032 #CJK UNIFIED IDEOGRAPH
+ {0xED87, 0x5963}, //7033 #CJK UNIFIED IDEOGRAPH
+ {0xED88, 0x59A4}, //7034 #CJK UNIFIED IDEOGRAPH
+ {0xED89, 0x59BA}, //7035 #CJK UNIFIED IDEOGRAPH
+ {0xED8A, 0x5B56}, //7036 #CJK UNIFIED IDEOGRAPH
+ {0xED8B, 0x5BC0}, //7037 #CJK UNIFIED IDEOGRAPH
+ {0xED8C, 0x752F}, //7038 #CJK UNIFIED IDEOGRAPH
+ {0xED8D, 0x5BD8}, //7039 #CJK UNIFIED IDEOGRAPH
+ {0xED8E, 0x5BEC}, //7040 #CJK UNIFIED IDEOGRAPH
+ {0xED8F, 0x5C1E}, //7041 #CJK UNIFIED IDEOGRAPH
+ {0xED90, 0x5CA6}, //7042 #CJK UNIFIED IDEOGRAPH
+ {0xED91, 0x5CBA}, //7043 #CJK UNIFIED IDEOGRAPH
+ {0xED92, 0x5CF5}, //7044 #CJK UNIFIED IDEOGRAPH
+ {0xED93, 0x5D27}, //7045 #CJK UNIFIED IDEOGRAPH
+ {0xED94, 0x5D53}, //7046 #CJK UNIFIED IDEOGRAPH
+ {0xED95, 0xFA11}, //7047 #CJK COMPATIBILITY IDEOGRAPH
+ {0xED96, 0x5D42}, //7048 #CJK UNIFIED IDEOGRAPH
+ {0xED97, 0x5D6D}, //7049 #CJK UNIFIED IDEOGRAPH
+ {0xED98, 0x5DB8}, //7050 #CJK UNIFIED IDEOGRAPH
+ {0xED99, 0x5DB9}, //7051 #CJK UNIFIED IDEOGRAPH
+ {0xED9A, 0x5DD0}, //7052 #CJK UNIFIED IDEOGRAPH
+ {0xED9B, 0x5F21}, //7053 #CJK UNIFIED IDEOGRAPH
+ {0xED9C, 0x5F34}, //7054 #CJK UNIFIED IDEOGRAPH
+ {0xED9D, 0x5F67}, //7055 #CJK UNIFIED IDEOGRAPH
+ {0xED9E, 0x5FB7}, //7056 #CJK UNIFIED IDEOGRAPH
+ {0xED9F, 0x5FDE}, //7057 #CJK UNIFIED IDEOGRAPH
+ {0xEDA0, 0x605D}, //7058 #CJK UNIFIED IDEOGRAPH
+ {0xEDA1, 0x6085}, //7059 #CJK UNIFIED IDEOGRAPH
+ {0xEDA2, 0x608A}, //7060 #CJK UNIFIED IDEOGRAPH
+ {0xEDA3, 0x60DE}, //7061 #CJK UNIFIED IDEOGRAPH
+ {0xEDA4, 0x60D5}, //7062 #CJK UNIFIED IDEOGRAPH
+ {0xEDA5, 0x6120}, //7063 #CJK UNIFIED IDEOGRAPH
+ {0xEDA6, 0x60F2}, //7064 #CJK UNIFIED IDEOGRAPH
+ {0xEDA7, 0x6111}, //7065 #CJK UNIFIED IDEOGRAPH
+ {0xEDA8, 0x6137}, //7066 #CJK UNIFIED IDEOGRAPH
+ {0xEDA9, 0x6130}, //7067 #CJK UNIFIED IDEOGRAPH
+ {0xEDAA, 0x6198}, //7068 #CJK UNIFIED IDEOGRAPH
+ {0xEDAB, 0x6213}, //7069 #CJK UNIFIED IDEOGRAPH
+ {0xEDAC, 0x62A6}, //7070 #CJK UNIFIED IDEOGRAPH
+ {0xEDAD, 0x63F5}, //7071 #CJK UNIFIED IDEOGRAPH
+ {0xEDAE, 0x6460}, //7072 #CJK UNIFIED IDEOGRAPH
+ {0xEDAF, 0x649D}, //7073 #CJK UNIFIED IDEOGRAPH
+ {0xEDB0, 0x64CE}, //7074 #CJK UNIFIED IDEOGRAPH
+ {0xEDB1, 0x654E}, //7075 #CJK UNIFIED IDEOGRAPH
+ {0xEDB2, 0x6600}, //7076 #CJK UNIFIED IDEOGRAPH
+ {0xEDB3, 0x6615}, //7077 #CJK UNIFIED IDEOGRAPH
+ {0xEDB4, 0x663B}, //7078 #CJK UNIFIED IDEOGRAPH
+ {0xEDB5, 0x6609}, //7079 #CJK UNIFIED IDEOGRAPH
+ {0xEDB6, 0x662E}, //7080 #CJK UNIFIED IDEOGRAPH
+ {0xEDB7, 0x661E}, //7081 #CJK UNIFIED IDEOGRAPH
+ {0xEDB8, 0x6624}, //7082 #CJK UNIFIED IDEOGRAPH
+ {0xEDB9, 0x6665}, //7083 #CJK UNIFIED IDEOGRAPH
+ {0xEDBA, 0x6657}, //7084 #CJK UNIFIED IDEOGRAPH
+ {0xEDBB, 0x6659}, //7085 #CJK UNIFIED IDEOGRAPH
+ {0xEDBC, 0xFA12}, //7086 #CJK COMPATIBILITY IDEOGRAPH
+ {0xEDBD, 0x6673}, //7087 #CJK UNIFIED IDEOGRAPH
+ {0xEDBE, 0x6699}, //7088 #CJK UNIFIED IDEOGRAPH
+ {0xEDBF, 0x66A0}, //7089 #CJK UNIFIED IDEOGRAPH
+ {0xEDC0, 0x66B2}, //7090 #CJK UNIFIED IDEOGRAPH
+ {0xEDC1, 0x66BF}, //7091 #CJK UNIFIED IDEOGRAPH
+ {0xEDC2, 0x66FA}, //7092 #CJK UNIFIED IDEOGRAPH
+ {0xEDC3, 0x670E}, //7093 #CJK UNIFIED IDEOGRAPH
+ {0xEDC4, 0xF929}, //7094 #CJK COMPATIBILITY IDEOGRAPH
+ {0xEDC5, 0x6766}, //7095 #CJK UNIFIED IDEOGRAPH
+ {0xEDC6, 0x67BB}, //7096 #CJK UNIFIED IDEOGRAPH
+ {0xEDC7, 0x6852}, //7097 #CJK UNIFIED IDEOGRAPH
+ {0xEDC8, 0x67C0}, //7098 #CJK UNIFIED IDEOGRAPH
+ {0xEDC9, 0x6801}, //7099 #CJK UNIFIED IDEOGRAPH
+ {0xEDCA, 0x6844}, //7100 #CJK UNIFIED IDEOGRAPH
+ {0xEDCB, 0x68CF}, //7101 #CJK UNIFIED IDEOGRAPH
+ {0xEDCC, 0xFA13}, //7102 #CJK COMPATIBILITY IDEOGRAPH
+ {0xEDCD, 0x6968}, //7103 #CJK UNIFIED IDEOGRAPH
+ {0xEDCE, 0xFA14}, //7104 #CJK COMPATIBILITY IDEOGRAPH
+ {0xEDCF, 0x6998}, //7105 #CJK UNIFIED IDEOGRAPH
+ {0xEDD0, 0x69E2}, //7106 #CJK UNIFIED IDEOGRAPH
+ {0xEDD1, 0x6A30}, //7107 #CJK UNIFIED IDEOGRAPH
+ {0xEDD2, 0x6A6B}, //7108 #CJK UNIFIED IDEOGRAPH
+ {0xEDD3, 0x6A46}, //7109 #CJK UNIFIED IDEOGRAPH
+ {0xEDD4, 0x6A73}, //7110 #CJK UNIFIED IDEOGRAPH
+ {0xEDD5, 0x6A7E}, //7111 #CJK UNIFIED IDEOGRAPH
+ {0xEDD6, 0x6AE2}, //7112 #CJK UNIFIED IDEOGRAPH
+ {0xEDD7, 0x6AE4}, //7113 #CJK UNIFIED IDEOGRAPH
+ {0xEDD8, 0x6BD6}, //7114 #CJK UNIFIED IDEOGRAPH
+ {0xEDD9, 0x6C3F}, //7115 #CJK UNIFIED IDEOGRAPH
+ {0xEDDA, 0x6C5C}, //7116 #CJK UNIFIED IDEOGRAPH
+ {0xEDDB, 0x6C86}, //7117 #CJK UNIFIED IDEOGRAPH
+ {0xEDDC, 0x6C6F}, //7118 #CJK UNIFIED IDEOGRAPH
+ {0xEDDD, 0x6CDA}, //7119 #CJK UNIFIED IDEOGRAPH
+ {0xEDDE, 0x6D04}, //7120 #CJK UNIFIED IDEOGRAPH
+ {0xEDDF, 0x6D87}, //7121 #CJK UNIFIED IDEOGRAPH
+ {0xEDE0, 0x6D6F}, //7122 #CJK UNIFIED IDEOGRAPH
+ {0xEDE1, 0x6D96}, //7123 #CJK UNIFIED IDEOGRAPH
+ {0xEDE2, 0x6DAC}, //7124 #CJK UNIFIED IDEOGRAPH
+ {0xEDE3, 0x6DCF}, //7125 #CJK UNIFIED IDEOGRAPH
+ {0xEDE4, 0x6DF8}, //7126 #CJK UNIFIED IDEOGRAPH
+ {0xEDE5, 0x6DF2}, //7127 #CJK UNIFIED IDEOGRAPH
+ {0xEDE6, 0x6DFC}, //7128 #CJK UNIFIED IDEOGRAPH
+ {0xEDE7, 0x6E39}, //7129 #CJK UNIFIED IDEOGRAPH
+ {0xEDE8, 0x6E5C}, //7130 #CJK UNIFIED IDEOGRAPH
+ {0xEDE9, 0x6E27}, //7131 #CJK UNIFIED IDEOGRAPH
+ {0xEDEA, 0x6E3C}, //7132 #CJK UNIFIED IDEOGRAPH
+ {0xEDEB, 0x6EBF}, //7133 #CJK UNIFIED IDEOGRAPH
+ {0xEDEC, 0x6F88}, //7134 #CJK UNIFIED IDEOGRAPH
+ {0xEDED, 0x6FB5}, //7135 #CJK UNIFIED IDEOGRAPH
+ {0xEDEE, 0x6FF5}, //7136 #CJK UNIFIED IDEOGRAPH
+ {0xEDEF, 0x7005}, //7137 #CJK UNIFIED IDEOGRAPH
+ {0xEDF0, 0x7007}, //7138 #CJK UNIFIED IDEOGRAPH
+ {0xEDF1, 0x7028}, //7139 #CJK UNIFIED IDEOGRAPH
+ {0xEDF2, 0x7085}, //7140 #CJK UNIFIED IDEOGRAPH
+ {0xEDF3, 0x70AB}, //7141 #CJK UNIFIED IDEOGRAPH
+ {0xEDF4, 0x710F}, //7142 #CJK UNIFIED IDEOGRAPH
+ {0xEDF5, 0x7104}, //7143 #CJK UNIFIED IDEOGRAPH
+ {0xEDF6, 0x715C}, //7144 #CJK UNIFIED IDEOGRAPH
+ {0xEDF7, 0x7146}, //7145 #CJK UNIFIED IDEOGRAPH
+ {0xEDF8, 0x7147}, //7146 #CJK UNIFIED IDEOGRAPH
+ {0xEDF9, 0xFA15}, //7147 #CJK COMPATIBILITY IDEOGRAPH
+ {0xEDFA, 0x71C1}, //7148 #CJK UNIFIED IDEOGRAPH
+ {0xEDFB, 0x71FE}, //7149 #CJK UNIFIED IDEOGRAPH
+ {0xEDFC, 0x72B1}, //7150 #CJK UNIFIED IDEOGRAPH
+ {0xEE40, 0x72BE}, //7151 #CJK UNIFIED IDEOGRAPH
+ {0xEE41, 0x7324}, //7152 #CJK UNIFIED IDEOGRAPH
+ {0xEE42, 0xFA16}, //7153 #CJK COMPATIBILITY IDEOGRAPH
+ {0xEE43, 0x7377}, //7154 #CJK UNIFIED IDEOGRAPH
+ {0xEE44, 0x73BD}, //7155 #CJK UNIFIED IDEOGRAPH
+ {0xEE45, 0x73C9}, //7156 #CJK UNIFIED IDEOGRAPH
+ {0xEE46, 0x73D6}, //7157 #CJK UNIFIED IDEOGRAPH
+ {0xEE47, 0x73E3}, //7158 #CJK UNIFIED IDEOGRAPH
+ {0xEE48, 0x73D2}, //7159 #CJK UNIFIED IDEOGRAPH
+ {0xEE49, 0x7407}, //7160 #CJK UNIFIED IDEOGRAPH
+ {0xEE4A, 0x73F5}, //7161 #CJK UNIFIED IDEOGRAPH
+ {0xEE4B, 0x7426}, //7162 #CJK UNIFIED IDEOGRAPH
+ {0xEE4C, 0x742A}, //7163 #CJK UNIFIED IDEOGRAPH
+ {0xEE4D, 0x7429}, //7164 #CJK UNIFIED IDEOGRAPH
+ {0xEE4E, 0x742E}, //7165 #CJK UNIFIED IDEOGRAPH
+ {0xEE4F, 0x7462}, //7166 #CJK UNIFIED IDEOGRAPH
+ {0xEE50, 0x7489}, //7167 #CJK UNIFIED IDEOGRAPH
+ {0xEE51, 0x749F}, //7168 #CJK UNIFIED IDEOGRAPH
+ {0xEE52, 0x7501}, //7169 #CJK UNIFIED IDEOGRAPH
+ {0xEE53, 0x756F}, //7170 #CJK UNIFIED IDEOGRAPH
+ {0xEE54, 0x7682}, //7171 #CJK UNIFIED IDEOGRAPH
+ {0xEE55, 0x769C}, //7172 #CJK UNIFIED IDEOGRAPH
+ {0xEE56, 0x769E}, //7173 #CJK UNIFIED IDEOGRAPH
+ {0xEE57, 0x769B}, //7174 #CJK UNIFIED IDEOGRAPH
+ {0xEE58, 0x76A6}, //7175 #CJK UNIFIED IDEOGRAPH
+ {0xEE59, 0xFA17}, //7176 #CJK COMPATIBILITY IDEOGRAPH
+ {0xEE5A, 0x7746}, //7177 #CJK UNIFIED IDEOGRAPH
+ {0xEE5B, 0x52AF}, //7178 #CJK UNIFIED IDEOGRAPH
+ {0xEE5C, 0x7821}, //7179 #CJK UNIFIED IDEOGRAPH
+ {0xEE5D, 0x784E}, //7180 #CJK UNIFIED IDEOGRAPH
+ {0xEE5E, 0x7864}, //7181 #CJK UNIFIED IDEOGRAPH
+ {0xEE5F, 0x787A}, //7182 #CJK UNIFIED IDEOGRAPH
+ {0xEE60, 0x7930}, //7183 #CJK UNIFIED IDEOGRAPH
+ {0xEE61, 0xFA18}, //7184 #CJK COMPATIBILITY IDEOGRAPH
+ {0xEE62, 0xFA19}, //7185 #CJK COMPATIBILITY IDEOGRAPH
+ {0xEE63, 0xFA1A}, //7186 #CJK COMPATIBILITY IDEOGRAPH
+ {0xEE64, 0x7994}, //7187 #CJK UNIFIED IDEOGRAPH
+ {0xEE65, 0xFA1B}, //7188 #CJK COMPATIBILITY IDEOGRAPH
+ {0xEE66, 0x799B}, //7189 #CJK UNIFIED IDEOGRAPH
+ {0xEE67, 0x7AD1}, //7190 #CJK UNIFIED IDEOGRAPH
+ {0xEE68, 0x7AE7}, //7191 #CJK UNIFIED IDEOGRAPH
+ {0xEE69, 0xFA1C}, //7192 #CJK COMPATIBILITY IDEOGRAPH
+ {0xEE6A, 0x7AEB}, //7193 #CJK UNIFIED IDEOGRAPH
+ {0xEE6B, 0x7B9E}, //7194 #CJK UNIFIED IDEOGRAPH
+ {0xEE6C, 0xFA1D}, //7195 #CJK COMPATIBILITY IDEOGRAPH
+ {0xEE6D, 0x7D48}, //7196 #CJK UNIFIED IDEOGRAPH
+ {0xEE6E, 0x7D5C}, //7197 #CJK UNIFIED IDEOGRAPH
+ {0xEE6F, 0x7DB7}, //7198 #CJK UNIFIED IDEOGRAPH
+ {0xEE70, 0x7DA0}, //7199 #CJK UNIFIED IDEOGRAPH
+ {0xEE71, 0x7DD6}, //7200 #CJK UNIFIED IDEOGRAPH
+ {0xEE72, 0x7E52}, //7201 #CJK UNIFIED IDEOGRAPH
+ {0xEE73, 0x7F47}, //7202 #CJK UNIFIED IDEOGRAPH
+ {0xEE74, 0x7FA1}, //7203 #CJK UNIFIED IDEOGRAPH
+ {0xEE75, 0xFA1E}, //7204 #CJK COMPATIBILITY IDEOGRAPH
+ {0xEE76, 0x8301}, //7205 #CJK UNIFIED IDEOGRAPH
+ {0xEE77, 0x8362}, //7206 #CJK UNIFIED IDEOGRAPH
+ {0xEE78, 0x837F}, //7207 #CJK UNIFIED IDEOGRAPH
+ {0xEE79, 0x83C7}, //7208 #CJK UNIFIED IDEOGRAPH
+ {0xEE7A, 0x83F6}, //7209 #CJK UNIFIED IDEOGRAPH
+ {0xEE7B, 0x8448}, //7210 #CJK UNIFIED IDEOGRAPH
+ {0xEE7C, 0x84B4}, //7211 #CJK UNIFIED IDEOGRAPH
+ {0xEE7D, 0x8553}, //7212 #CJK UNIFIED IDEOGRAPH
+ {0xEE7E, 0x8559}, //7213 #CJK UNIFIED IDEOGRAPH
+ {0xEE80, 0x856B}, //7214 #CJK UNIFIED IDEOGRAPH
+ {0xEE81, 0xFA1F}, //7215 #CJK COMPATIBILITY IDEOGRAPH
+ {0xEE82, 0x85B0}, //7216 #CJK UNIFIED IDEOGRAPH
+ {0xEE83, 0xFA20}, //7217 #CJK COMPATIBILITY IDEOGRAPH
+ {0xEE84, 0xFA21}, //7218 #CJK COMPATIBILITY IDEOGRAPH
+ {0xEE85, 0x8807}, //7219 #CJK UNIFIED IDEOGRAPH
+ {0xEE86, 0x88F5}, //7220 #CJK UNIFIED IDEOGRAPH
+ {0xEE87, 0x8A12}, //7221 #CJK UNIFIED IDEOGRAPH
+ {0xEE88, 0x8A37}, //7222 #CJK UNIFIED IDEOGRAPH
+ {0xEE89, 0x8A79}, //7223 #CJK UNIFIED IDEOGRAPH
+ {0xEE8A, 0x8AA7}, //7224 #CJK UNIFIED IDEOGRAPH
+ {0xEE8B, 0x8ABE}, //7225 #CJK UNIFIED IDEOGRAPH
+ {0xEE8C, 0x8ADF}, //7226 #CJK UNIFIED IDEOGRAPH
+ {0xEE8D, 0xFA22}, //7227 #CJK COMPATIBILITY IDEOGRAPH
+ {0xEE8E, 0x8AF6}, //7228 #CJK UNIFIED IDEOGRAPH
+ {0xEE8F, 0x8B53}, //7229 #CJK UNIFIED IDEOGRAPH
+ {0xEE90, 0x8B7F}, //7230 #CJK UNIFIED IDEOGRAPH
+ {0xEE91, 0x8CF0}, //7231 #CJK UNIFIED IDEOGRAPH
+ {0xEE92, 0x8CF4}, //7232 #CJK UNIFIED IDEOGRAPH
+ {0xEE93, 0x8D12}, //7233 #CJK UNIFIED IDEOGRAPH
+ {0xEE94, 0x8D76}, //7234 #CJK UNIFIED IDEOGRAPH
+ {0xEE95, 0xFA23}, //7235 #CJK COMPATIBILITY IDEOGRAPH
+ {0xEE96, 0x8ECF}, //7236 #CJK UNIFIED IDEOGRAPH
+ {0xEE97, 0xFA24}, //7237 #CJK COMPATIBILITY IDEOGRAPH
+ {0xEE98, 0xFA25}, //7238 #CJK COMPATIBILITY IDEOGRAPH
+ {0xEE99, 0x9067}, //7239 #CJK UNIFIED IDEOGRAPH
+ {0xEE9A, 0x90DE}, //7240 #CJK UNIFIED IDEOGRAPH
+ {0xEE9B, 0xFA26}, //7241 #CJK COMPATIBILITY IDEOGRAPH
+ {0xEE9C, 0x9115}, //7242 #CJK UNIFIED IDEOGRAPH
+ {0xEE9D, 0x9127}, //7243 #CJK UNIFIED IDEOGRAPH
+ {0xEE9E, 0x91DA}, //7244 #CJK UNIFIED IDEOGRAPH
+ {0xEE9F, 0x91D7}, //7245 #CJK UNIFIED IDEOGRAPH
+ {0xEEA0, 0x91DE}, //7246 #CJK UNIFIED IDEOGRAPH
+ {0xEEA1, 0x91ED}, //7247 #CJK UNIFIED IDEOGRAPH
+ {0xEEA2, 0x91EE}, //7248 #CJK UNIFIED IDEOGRAPH
+ {0xEEA3, 0x91E4}, //7249 #CJK UNIFIED IDEOGRAPH
+ {0xEEA4, 0x91E5}, //7250 #CJK UNIFIED IDEOGRAPH
+ {0xEEA5, 0x9206}, //7251 #CJK UNIFIED IDEOGRAPH
+ {0xEEA6, 0x9210}, //7252 #CJK UNIFIED IDEOGRAPH
+ {0xEEA7, 0x920A}, //7253 #CJK UNIFIED IDEOGRAPH
+ {0xEEA8, 0x923A}, //7254 #CJK UNIFIED IDEOGRAPH
+ {0xEEA9, 0x9240}, //7255 #CJK UNIFIED IDEOGRAPH
+ {0xEEAA, 0x923C}, //7256 #CJK UNIFIED IDEOGRAPH
+ {0xEEAB, 0x924E}, //7257 #CJK UNIFIED IDEOGRAPH
+ {0xEEAC, 0x9259}, //7258 #CJK UNIFIED IDEOGRAPH
+ {0xEEAD, 0x9251}, //7259 #CJK UNIFIED IDEOGRAPH
+ {0xEEAE, 0x9239}, //7260 #CJK UNIFIED IDEOGRAPH
+ {0xEEAF, 0x9267}, //7261 #CJK UNIFIED IDEOGRAPH
+ {0xEEB0, 0x92A7}, //7262 #CJK UNIFIED IDEOGRAPH
+ {0xEEB1, 0x9277}, //7263 #CJK UNIFIED IDEOGRAPH
+ {0xEEB2, 0x9278}, //7264 #CJK UNIFIED IDEOGRAPH
+ {0xEEB3, 0x92E7}, //7265 #CJK UNIFIED IDEOGRAPH
+ {0xEEB4, 0x92D7}, //7266 #CJK UNIFIED IDEOGRAPH
+ {0xEEB5, 0x92D9}, //7267 #CJK UNIFIED IDEOGRAPH
+ {0xEEB6, 0x92D0}, //7268 #CJK UNIFIED IDEOGRAPH
+ {0xEEB7, 0xFA27}, //7269 #CJK COMPATIBILITY IDEOGRAPH
+ {0xEEB8, 0x92D5}, //7270 #CJK UNIFIED IDEOGRAPH
+ {0xEEB9, 0x92E0}, //7271 #CJK UNIFIED IDEOGRAPH
+ {0xEEBA, 0x92D3}, //7272 #CJK UNIFIED IDEOGRAPH
+ {0xEEBB, 0x9325}, //7273 #CJK UNIFIED IDEOGRAPH
+ {0xEEBC, 0x9321}, //7274 #CJK UNIFIED IDEOGRAPH
+ {0xEEBD, 0x92FB}, //7275 #CJK UNIFIED IDEOGRAPH
+ {0xEEBE, 0xFA28}, //7276 #CJK COMPATIBILITY IDEOGRAPH
+ {0xEEBF, 0x931E}, //7277 #CJK UNIFIED IDEOGRAPH
+ {0xEEC0, 0x92FF}, //7278 #CJK UNIFIED IDEOGRAPH
+ {0xEEC1, 0x931D}, //7279 #CJK UNIFIED IDEOGRAPH
+ {0xEEC2, 0x9302}, //7280 #CJK UNIFIED IDEOGRAPH
+ {0xEEC3, 0x9370}, //7281 #CJK UNIFIED IDEOGRAPH
+ {0xEEC4, 0x9357}, //7282 #CJK UNIFIED IDEOGRAPH
+ {0xEEC5, 0x93A4}, //7283 #CJK UNIFIED IDEOGRAPH
+ {0xEEC6, 0x93C6}, //7284 #CJK UNIFIED IDEOGRAPH
+ {0xEEC7, 0x93DE}, //7285 #CJK UNIFIED IDEOGRAPH
+ {0xEEC8, 0x93F8}, //7286 #CJK UNIFIED IDEOGRAPH
+ {0xEEC9, 0x9431}, //7287 #CJK UNIFIED IDEOGRAPH
+ {0xEECA, 0x9445}, //7288 #CJK UNIFIED IDEOGRAPH
+ {0xEECB, 0x9448}, //7289 #CJK UNIFIED IDEOGRAPH
+ {0xEECC, 0x9592}, //7290 #CJK UNIFIED IDEOGRAPH
+ {0xEECD, 0xF9DC}, //7291 #CJK COMPATIBILITY IDEOGRAPH
+ {0xEECE, 0xFA29}, //7292 #CJK COMPATIBILITY IDEOGRAPH
+ {0xEECF, 0x969D}, //7293 #CJK UNIFIED IDEOGRAPH
+ {0xEED0, 0x96AF}, //7294 #CJK UNIFIED IDEOGRAPH
+ {0xEED1, 0x9733}, //7295 #CJK UNIFIED IDEOGRAPH
+ {0xEED2, 0x973B}, //7296 #CJK UNIFIED IDEOGRAPH
+ {0xEED3, 0x9743}, //7297 #CJK UNIFIED IDEOGRAPH
+ {0xEED4, 0x974D}, //7298 #CJK UNIFIED IDEOGRAPH
+ {0xEED5, 0x974F}, //7299 #CJK UNIFIED IDEOGRAPH
+ {0xEED6, 0x9751}, //7300 #CJK UNIFIED IDEOGRAPH
+ {0xEED7, 0x9755}, //7301 #CJK UNIFIED IDEOGRAPH
+ {0xEED8, 0x9857}, //7302 #CJK UNIFIED IDEOGRAPH
+ {0xEED9, 0x9865}, //7303 #CJK UNIFIED IDEOGRAPH
+ {0xEEDA, 0xFA2A}, //7304 #CJK COMPATIBILITY IDEOGRAPH
+ {0xEEDB, 0xFA2B}, //7305 #CJK COMPATIBILITY IDEOGRAPH
+ {0xEEDC, 0x9927}, //7306 #CJK UNIFIED IDEOGRAPH
+ {0xEEDD, 0xFA2C}, //7307 #CJK COMPATIBILITY IDEOGRAPH
+ {0xEEDE, 0x999E}, //7308 #CJK UNIFIED IDEOGRAPH
+ {0xEEDF, 0x9A4E}, //7309 #CJK UNIFIED IDEOGRAPH
+ {0xEEE0, 0x9AD9}, //7310 #CJK UNIFIED IDEOGRAPH
+ {0xEEE1, 0x9ADC}, //7311 #CJK UNIFIED IDEOGRAPH
+ {0xEEE2, 0x9B75}, //7312 #CJK UNIFIED IDEOGRAPH
+ {0xEEE3, 0x9B72}, //7313 #CJK UNIFIED IDEOGRAPH
+ {0xEEE4, 0x9B8F}, //7314 #CJK UNIFIED IDEOGRAPH
+ {0xEEE5, 0x9BB1}, //7315 #CJK UNIFIED IDEOGRAPH
+ {0xEEE6, 0x9BBB}, //7316 #CJK UNIFIED IDEOGRAPH
+ {0xEEE7, 0x9C00}, //7317 #CJK UNIFIED IDEOGRAPH
+ {0xEEE8, 0x9D70}, //7318 #CJK UNIFIED IDEOGRAPH
+ {0xEEE9, 0x9D6B}, //7319 #CJK UNIFIED IDEOGRAPH
+ {0xEEEA, 0xFA2D}, //7320 #CJK COMPATIBILITY IDEOGRAPH
+ {0xEEEB, 0x9E19}, //7321 #CJK UNIFIED IDEOGRAPH
+ {0xEEEC, 0x9ED1}, //7322 #CJK UNIFIED IDEOGRAPH
+ {0xEEEF, 0x2170}, //7323 #SMALL ROMAN NUMERAL ONE
+ {0xEEF0, 0x2171}, //7324 #SMALL ROMAN NUMERAL TWO
+ {0xEEF1, 0x2172}, //7325 #SMALL ROMAN NUMERAL THREE
+ {0xEEF2, 0x2173}, //7326 #SMALL ROMAN NUMERAL FOUR
+ {0xEEF3, 0x2174}, //7327 #SMALL ROMAN NUMERAL FIVE
+ {0xEEF4, 0x2175}, //7328 #SMALL ROMAN NUMERAL SIX
+ {0xEEF5, 0x2176}, //7329 #SMALL ROMAN NUMERAL SEVEN
+ {0xEEF6, 0x2177}, //7330 #SMALL ROMAN NUMERAL EIGHT
+ {0xEEF7, 0x2178}, //7331 #SMALL ROMAN NUMERAL NINE
+ {0xEEF8, 0x2179}, //7332 #SMALL ROMAN NUMERAL TEN
+ {0xEEF9, 0xFFE2}, //7333 #FULLWIDTH NOT SIGN
+ {0xEEFA, 0xFFE4}, //7334 #FULLWIDTH BROKEN BAR
+ {0xEEFB, 0xFF07}, //7335 #FULLWIDTH APOSTROPHE
+ {0xEEFC, 0xFF02}, //7336 #FULLWIDTH QUOTATION MARK
+ {0xFA40, 0x2170}, //7337 #SMALL ROMAN NUMERAL ONE
+ {0xFA41, 0x2171}, //7338 #SMALL ROMAN NUMERAL TWO
+ {0xFA42, 0x2172}, //7339 #SMALL ROMAN NUMERAL THREE
+ {0xFA43, 0x2173}, //7340 #SMALL ROMAN NUMERAL FOUR
+ {0xFA44, 0x2174}, //7341 #SMALL ROMAN NUMERAL FIVE
+ {0xFA45, 0x2175}, //7342 #SMALL ROMAN NUMERAL SIX
+ {0xFA46, 0x2176}, //7343 #SMALL ROMAN NUMERAL SEVEN
+ {0xFA47, 0x2177}, //7344 #SMALL ROMAN NUMERAL EIGHT
+ {0xFA48, 0x2178}, //7345 #SMALL ROMAN NUMERAL NINE
+ {0xFA49, 0x2179}, //7346 #SMALL ROMAN NUMERAL TEN
+ {0xFA4A, 0x2160}, //7347 #ROMAN NUMERAL ONE
+ {0xFA4B, 0x2161}, //7348 #ROMAN NUMERAL TWO
+ {0xFA4C, 0x2162}, //7349 #ROMAN NUMERAL THREE
+ {0xFA4D, 0x2163}, //7350 #ROMAN NUMERAL FOUR
+ {0xFA4E, 0x2164}, //7351 #ROMAN NUMERAL FIVE
+ {0xFA4F, 0x2165}, //7352 #ROMAN NUMERAL SIX
+ {0xFA50, 0x2166}, //7353 #ROMAN NUMERAL SEVEN
+ {0xFA51, 0x2167}, //7354 #ROMAN NUMERAL EIGHT
+ {0xFA52, 0x2168}, //7355 #ROMAN NUMERAL NINE
+ {0xFA53, 0x2169}, //7356 #ROMAN NUMERAL TEN
+ {0xFA54, 0xFFE2}, //7357 #FULLWIDTH NOT SIGN
+ {0xFA55, 0xFFE4}, //7358 #FULLWIDTH BROKEN BAR
+ {0xFA56, 0xFF07}, //7359 #FULLWIDTH APOSTROPHE
+ {0xFA57, 0xFF02}, //7360 #FULLWIDTH QUOTATION MARK
+ {0xFA58, 0x3231}, //7361 #PARENTHESIZED IDEOGRAPH STOCK
+ {0xFA59, 0x2116}, //7362 #NUMERO SIGN
+ {0xFA5A, 0x2121}, //7363 #TELEPHONE SIGN
+ {0xFA5B, 0x2235}, //7364 #BECAUSE
+ {0xFA5C, 0x7E8A}, //7365 #CJK UNIFIED IDEOGRAPH
+ {0xFA5D, 0x891C}, //7366 #CJK UNIFIED IDEOGRAPH
+ {0xFA5E, 0x9348}, //7367 #CJK UNIFIED IDEOGRAPH
+ {0xFA5F, 0x9288}, //7368 #CJK UNIFIED IDEOGRAPH
+ {0xFA60, 0x84DC}, //7369 #CJK UNIFIED IDEOGRAPH
+ {0xFA61, 0x4FC9}, //7370 #CJK UNIFIED IDEOGRAPH
+ {0xFA62, 0x70BB}, //7371 #CJK UNIFIED IDEOGRAPH
+ {0xFA63, 0x6631}, //7372 #CJK UNIFIED IDEOGRAPH
+ {0xFA64, 0x68C8}, //7373 #CJK UNIFIED IDEOGRAPH
+ {0xFA65, 0x92F9}, //7374 #CJK UNIFIED IDEOGRAPH
+ {0xFA66, 0x66FB}, //7375 #CJK UNIFIED IDEOGRAPH
+ {0xFA67, 0x5F45}, //7376 #CJK UNIFIED IDEOGRAPH
+ {0xFA68, 0x4E28}, //7377 #CJK UNIFIED IDEOGRAPH
+ {0xFA69, 0x4EE1}, //7378 #CJK UNIFIED IDEOGRAPH
+ {0xFA6A, 0x4EFC}, //7379 #CJK UNIFIED IDEOGRAPH
+ {0xFA6B, 0x4F00}, //7380 #CJK UNIFIED IDEOGRAPH
+ {0xFA6C, 0x4F03}, //7381 #CJK UNIFIED IDEOGRAPH
+ {0xFA6D, 0x4F39}, //7382 #CJK UNIFIED IDEOGRAPH
+ {0xFA6E, 0x4F56}, //7383 #CJK UNIFIED IDEOGRAPH
+ {0xFA6F, 0x4F92}, //7384 #CJK UNIFIED IDEOGRAPH
+ {0xFA70, 0x4F8A}, //7385 #CJK UNIFIED IDEOGRAPH
+ {0xFA71, 0x4F9A}, //7386 #CJK UNIFIED IDEOGRAPH
+ {0xFA72, 0x4F94}, //7387 #CJK UNIFIED IDEOGRAPH
+ {0xFA73, 0x4FCD}, //7388 #CJK UNIFIED IDEOGRAPH
+ {0xFA74, 0x5040}, //7389 #CJK UNIFIED IDEOGRAPH
+ {0xFA75, 0x5022}, //7390 #CJK UNIFIED IDEOGRAPH
+ {0xFA76, 0x4FFF}, //7391 #CJK UNIFIED IDEOGRAPH
+ {0xFA77, 0x501E}, //7392 #CJK UNIFIED IDEOGRAPH
+ {0xFA78, 0x5046}, //7393 #CJK UNIFIED IDEOGRAPH
+ {0xFA79, 0x5070}, //7394 #CJK UNIFIED IDEOGRAPH
+ {0xFA7A, 0x5042}, //7395 #CJK UNIFIED IDEOGRAPH
+ {0xFA7B, 0x5094}, //7396 #CJK UNIFIED IDEOGRAPH
+ {0xFA7C, 0x50F4}, //7397 #CJK UNIFIED IDEOGRAPH
+ {0xFA7D, 0x50D8}, //7398 #CJK UNIFIED IDEOGRAPH
+ {0xFA7E, 0x514A}, //7399 #CJK UNIFIED IDEOGRAPH
+ {0xFA80, 0x5164}, //7400 #CJK UNIFIED IDEOGRAPH
+ {0xFA81, 0x519D}, //7401 #CJK UNIFIED IDEOGRAPH
+ {0xFA82, 0x51BE}, //7402 #CJK UNIFIED IDEOGRAPH
+ {0xFA83, 0x51EC}, //7403 #CJK UNIFIED IDEOGRAPH
+ {0xFA84, 0x5215}, //7404 #CJK UNIFIED IDEOGRAPH
+ {0xFA85, 0x529C}, //7405 #CJK UNIFIED IDEOGRAPH
+ {0xFA86, 0x52A6}, //7406 #CJK UNIFIED IDEOGRAPH
+ {0xFA87, 0x52C0}, //7407 #CJK UNIFIED IDEOGRAPH
+ {0xFA88, 0x52DB}, //7408 #CJK UNIFIED IDEOGRAPH
+ {0xFA89, 0x5300}, //7409 #CJK UNIFIED IDEOGRAPH
+ {0xFA8A, 0x5307}, //7410 #CJK UNIFIED IDEOGRAPH
+ {0xFA8B, 0x5324}, //7411 #CJK UNIFIED IDEOGRAPH
+ {0xFA8C, 0x5372}, //7412 #CJK UNIFIED IDEOGRAPH
+ {0xFA8D, 0x5393}, //7413 #CJK UNIFIED IDEOGRAPH
+ {0xFA8E, 0x53B2}, //7414 #CJK UNIFIED IDEOGRAPH
+ {0xFA8F, 0x53DD}, //7415 #CJK UNIFIED IDEOGRAPH
+ {0xFA90, 0xFA0E}, //7416 #CJK COMPATIBILITY IDEOGRAPH
+ {0xFA91, 0x549C}, //7417 #CJK UNIFIED IDEOGRAPH
+ {0xFA92, 0x548A}, //7418 #CJK UNIFIED IDEOGRAPH
+ {0xFA93, 0x54A9}, //7419 #CJK UNIFIED IDEOGRAPH
+ {0xFA94, 0x54FF}, //7420 #CJK UNIFIED IDEOGRAPH
+ {0xFA95, 0x5586}, //7421 #CJK UNIFIED IDEOGRAPH
+ {0xFA96, 0x5759}, //7422 #CJK UNIFIED IDEOGRAPH
+ {0xFA97, 0x5765}, //7423 #CJK UNIFIED IDEOGRAPH
+ {0xFA98, 0x57AC}, //7424 #CJK UNIFIED IDEOGRAPH
+ {0xFA99, 0x57C8}, //7425 #CJK UNIFIED IDEOGRAPH
+ {0xFA9A, 0x57C7}, //7426 #CJK UNIFIED IDEOGRAPH
+ {0xFA9B, 0xFA0F}, //7427 #CJK COMPATIBILITY IDEOGRAPH
+ {0xFA9C, 0xFA10}, //7428 #CJK COMPATIBILITY IDEOGRAPH
+ {0xFA9D, 0x589E}, //7429 #CJK UNIFIED IDEOGRAPH
+ {0xFA9E, 0x58B2}, //7430 #CJK UNIFIED IDEOGRAPH
+ {0xFA9F, 0x590B}, //7431 #CJK UNIFIED IDEOGRAPH
+ {0xFAA0, 0x5953}, //7432 #CJK UNIFIED IDEOGRAPH
+ {0xFAA1, 0x595B}, //7433 #CJK UNIFIED IDEOGRAPH
+ {0xFAA2, 0x595D}, //7434 #CJK UNIFIED IDEOGRAPH
+ {0xFAA3, 0x5963}, //7435 #CJK UNIFIED IDEOGRAPH
+ {0xFAA4, 0x59A4}, //7436 #CJK UNIFIED IDEOGRAPH
+ {0xFAA5, 0x59BA}, //7437 #CJK UNIFIED IDEOGRAPH
+ {0xFAA6, 0x5B56}, //7438 #CJK UNIFIED IDEOGRAPH
+ {0xFAA7, 0x5BC0}, //7439 #CJK UNIFIED IDEOGRAPH
+ {0xFAA8, 0x752F}, //7440 #CJK UNIFIED IDEOGRAPH
+ {0xFAA9, 0x5BD8}, //7441 #CJK UNIFIED IDEOGRAPH
+ {0xFAAA, 0x5BEC}, //7442 #CJK UNIFIED IDEOGRAPH
+ {0xFAAB, 0x5C1E}, //7443 #CJK UNIFIED IDEOGRAPH
+ {0xFAAC, 0x5CA6}, //7444 #CJK UNIFIED IDEOGRAPH
+ {0xFAAD, 0x5CBA}, //7445 #CJK UNIFIED IDEOGRAPH
+ {0xFAAE, 0x5CF5}, //7446 #CJK UNIFIED IDEOGRAPH
+ {0xFAAF, 0x5D27}, //7447 #CJK UNIFIED IDEOGRAPH
+ {0xFAB0, 0x5D53}, //7448 #CJK UNIFIED IDEOGRAPH
+ {0xFAB1, 0xFA11}, //7449 #CJK COMPATIBILITY IDEOGRAPH
+ {0xFAB2, 0x5D42}, //7450 #CJK UNIFIED IDEOGRAPH
+ {0xFAB3, 0x5D6D}, //7451 #CJK UNIFIED IDEOGRAPH
+ {0xFAB4, 0x5DB8}, //7452 #CJK UNIFIED IDEOGRAPH
+ {0xFAB5, 0x5DB9}, //7453 #CJK UNIFIED IDEOGRAPH
+ {0xFAB6, 0x5DD0}, //7454 #CJK UNIFIED IDEOGRAPH
+ {0xFAB7, 0x5F21}, //7455 #CJK UNIFIED IDEOGRAPH
+ {0xFAB8, 0x5F34}, //7456 #CJK UNIFIED IDEOGRAPH
+ {0xFAB9, 0x5F67}, //7457 #CJK UNIFIED IDEOGRAPH
+ {0xFABA, 0x5FB7}, //7458 #CJK UNIFIED IDEOGRAPH
+ {0xFABB, 0x5FDE}, //7459 #CJK UNIFIED IDEOGRAPH
+ {0xFABC, 0x605D}, //7460 #CJK UNIFIED IDEOGRAPH
+ {0xFABD, 0x6085}, //7461 #CJK UNIFIED IDEOGRAPH
+ {0xFABE, 0x608A}, //7462 #CJK UNIFIED IDEOGRAPH
+ {0xFABF, 0x60DE}, //7463 #CJK UNIFIED IDEOGRAPH
+ {0xFAC0, 0x60D5}, //7464 #CJK UNIFIED IDEOGRAPH
+ {0xFAC1, 0x6120}, //7465 #CJK UNIFIED IDEOGRAPH
+ {0xFAC2, 0x60F2}, //7466 #CJK UNIFIED IDEOGRAPH
+ {0xFAC3, 0x6111}, //7467 #CJK UNIFIED IDEOGRAPH
+ {0xFAC4, 0x6137}, //7468 #CJK UNIFIED IDEOGRAPH
+ {0xFAC5, 0x6130}, //7469 #CJK UNIFIED IDEOGRAPH
+ {0xFAC6, 0x6198}, //7470 #CJK UNIFIED IDEOGRAPH
+ {0xFAC7, 0x6213}, //7471 #CJK UNIFIED IDEOGRAPH
+ {0xFAC8, 0x62A6}, //7472 #CJK UNIFIED IDEOGRAPH
+ {0xFAC9, 0x63F5}, //7473 #CJK UNIFIED IDEOGRAPH
+ {0xFACA, 0x6460}, //7474 #CJK UNIFIED IDEOGRAPH
+ {0xFACB, 0x649D}, //7475 #CJK UNIFIED IDEOGRAPH
+ {0xFACC, 0x64CE}, //7476 #CJK UNIFIED IDEOGRAPH
+ {0xFACD, 0x654E}, //7477 #CJK UNIFIED IDEOGRAPH
+ {0xFACE, 0x6600}, //7478 #CJK UNIFIED IDEOGRAPH
+ {0xFACF, 0x6615}, //7479 #CJK UNIFIED IDEOGRAPH
+ {0xFAD0, 0x663B}, //7480 #CJK UNIFIED IDEOGRAPH
+ {0xFAD1, 0x6609}, //7481 #CJK UNIFIED IDEOGRAPH
+ {0xFAD2, 0x662E}, //7482 #CJK UNIFIED IDEOGRAPH
+ {0xFAD3, 0x661E}, //7483 #CJK UNIFIED IDEOGRAPH
+ {0xFAD4, 0x6624}, //7484 #CJK UNIFIED IDEOGRAPH
+ {0xFAD5, 0x6665}, //7485 #CJK UNIFIED IDEOGRAPH
+ {0xFAD6, 0x6657}, //7486 #CJK UNIFIED IDEOGRAPH
+ {0xFAD7, 0x6659}, //7487 #CJK UNIFIED IDEOGRAPH
+ {0xFAD8, 0xFA12}, //7488 #CJK COMPATIBILITY IDEOGRAPH
+ {0xFAD9, 0x6673}, //7489 #CJK UNIFIED IDEOGRAPH
+ {0xFADA, 0x6699}, //7490 #CJK UNIFIED IDEOGRAPH
+ {0xFADB, 0x66A0}, //7491 #CJK UNIFIED IDEOGRAPH
+ {0xFADC, 0x66B2}, //7492 #CJK UNIFIED IDEOGRAPH
+ {0xFADD, 0x66BF}, //7493 #CJK UNIFIED IDEOGRAPH
+ {0xFADE, 0x66FA}, //7494 #CJK UNIFIED IDEOGRAPH
+ {0xFADF, 0x670E}, //7495 #CJK UNIFIED IDEOGRAPH
+ {0xFAE0, 0xF929}, //7496 #CJK COMPATIBILITY IDEOGRAPH
+ {0xFAE1, 0x6766}, //7497 #CJK UNIFIED IDEOGRAPH
+ {0xFAE2, 0x67BB}, //7498 #CJK UNIFIED IDEOGRAPH
+ {0xFAE3, 0x6852}, //7499 #CJK UNIFIED IDEOGRAPH
+ {0xFAE4, 0x67C0}, //7500 #CJK UNIFIED IDEOGRAPH
+ {0xFAE5, 0x6801}, //7501 #CJK UNIFIED IDEOGRAPH
+ {0xFAE6, 0x6844}, //7502 #CJK UNIFIED IDEOGRAPH
+ {0xFAE7, 0x68CF}, //7503 #CJK UNIFIED IDEOGRAPH
+ {0xFAE8, 0xFA13}, //7504 #CJK COMPATIBILITY IDEOGRAPH
+ {0xFAE9, 0x6968}, //7505 #CJK UNIFIED IDEOGRAPH
+ {0xFAEA, 0xFA14}, //7506 #CJK COMPATIBILITY IDEOGRAPH
+ {0xFAEB, 0x6998}, //7507 #CJK UNIFIED IDEOGRAPH
+ {0xFAEC, 0x69E2}, //7508 #CJK UNIFIED IDEOGRAPH
+ {0xFAED, 0x6A30}, //7509 #CJK UNIFIED IDEOGRAPH
+ {0xFAEE, 0x6A6B}, //7510 #CJK UNIFIED IDEOGRAPH
+ {0xFAEF, 0x6A46}, //7511 #CJK UNIFIED IDEOGRAPH
+ {0xFAF0, 0x6A73}, //7512 #CJK UNIFIED IDEOGRAPH
+ {0xFAF1, 0x6A7E}, //7513 #CJK UNIFIED IDEOGRAPH
+ {0xFAF2, 0x6AE2}, //7514 #CJK UNIFIED IDEOGRAPH
+ {0xFAF3, 0x6AE4}, //7515 #CJK UNIFIED IDEOGRAPH
+ {0xFAF4, 0x6BD6}, //7516 #CJK UNIFIED IDEOGRAPH
+ {0xFAF5, 0x6C3F}, //7517 #CJK UNIFIED IDEOGRAPH
+ {0xFAF6, 0x6C5C}, //7518 #CJK UNIFIED IDEOGRAPH
+ {0xFAF7, 0x6C86}, //7519 #CJK UNIFIED IDEOGRAPH
+ {0xFAF8, 0x6C6F}, //7520 #CJK UNIFIED IDEOGRAPH
+ {0xFAF9, 0x6CDA}, //7521 #CJK UNIFIED IDEOGRAPH
+ {0xFAFA, 0x6D04}, //7522 #CJK UNIFIED IDEOGRAPH
+ {0xFAFB, 0x6D87}, //7523 #CJK UNIFIED IDEOGRAPH
+ {0xFAFC, 0x6D6F}, //7524 #CJK UNIFIED IDEOGRAPH
+ {0xFB40, 0x6D96}, //7525 #CJK UNIFIED IDEOGRAPH
+ {0xFB41, 0x6DAC}, //7526 #CJK UNIFIED IDEOGRAPH
+ {0xFB42, 0x6DCF}, //7527 #CJK UNIFIED IDEOGRAPH
+ {0xFB43, 0x6DF8}, //7528 #CJK UNIFIED IDEOGRAPH
+ {0xFB44, 0x6DF2}, //7529 #CJK UNIFIED IDEOGRAPH
+ {0xFB45, 0x6DFC}, //7530 #CJK UNIFIED IDEOGRAPH
+ {0xFB46, 0x6E39}, //7531 #CJK UNIFIED IDEOGRAPH
+ {0xFB47, 0x6E5C}, //7532 #CJK UNIFIED IDEOGRAPH
+ {0xFB48, 0x6E27}, //7533 #CJK UNIFIED IDEOGRAPH
+ {0xFB49, 0x6E3C}, //7534 #CJK UNIFIED IDEOGRAPH
+ {0xFB4A, 0x6EBF}, //7535 #CJK UNIFIED IDEOGRAPH
+ {0xFB4B, 0x6F88}, //7536 #CJK UNIFIED IDEOGRAPH
+ {0xFB4C, 0x6FB5}, //7537 #CJK UNIFIED IDEOGRAPH
+ {0xFB4D, 0x6FF5}, //7538 #CJK UNIFIED IDEOGRAPH
+ {0xFB4E, 0x7005}, //7539 #CJK UNIFIED IDEOGRAPH
+ {0xFB4F, 0x7007}, //7540 #CJK UNIFIED IDEOGRAPH
+ {0xFB50, 0x7028}, //7541 #CJK UNIFIED IDEOGRAPH
+ {0xFB51, 0x7085}, //7542 #CJK UNIFIED IDEOGRAPH
+ {0xFB52, 0x70AB}, //7543 #CJK UNIFIED IDEOGRAPH
+ {0xFB53, 0x710F}, //7544 #CJK UNIFIED IDEOGRAPH
+ {0xFB54, 0x7104}, //7545 #CJK UNIFIED IDEOGRAPH
+ {0xFB55, 0x715C}, //7546 #CJK UNIFIED IDEOGRAPH
+ {0xFB56, 0x7146}, //7547 #CJK UNIFIED IDEOGRAPH
+ {0xFB57, 0x7147}, //7548 #CJK UNIFIED IDEOGRAPH
+ {0xFB58, 0xFA15}, //7549 #CJK COMPATIBILITY IDEOGRAPH
+ {0xFB59, 0x71C1}, //7550 #CJK UNIFIED IDEOGRAPH
+ {0xFB5A, 0x71FE}, //7551 #CJK UNIFIED IDEOGRAPH
+ {0xFB5B, 0x72B1}, //7552 #CJK UNIFIED IDEOGRAPH
+ {0xFB5C, 0x72BE}, //7553 #CJK UNIFIED IDEOGRAPH
+ {0xFB5D, 0x7324}, //7554 #CJK UNIFIED IDEOGRAPH
+ {0xFB5E, 0xFA16}, //7555 #CJK COMPATIBILITY IDEOGRAPH
+ {0xFB5F, 0x7377}, //7556 #CJK UNIFIED IDEOGRAPH
+ {0xFB60, 0x73BD}, //7557 #CJK UNIFIED IDEOGRAPH
+ {0xFB61, 0x73C9}, //7558 #CJK UNIFIED IDEOGRAPH
+ {0xFB62, 0x73D6}, //7559 #CJK UNIFIED IDEOGRAPH
+ {0xFB63, 0x73E3}, //7560 #CJK UNIFIED IDEOGRAPH
+ {0xFB64, 0x73D2}, //7561 #CJK UNIFIED IDEOGRAPH
+ {0xFB65, 0x7407}, //7562 #CJK UNIFIED IDEOGRAPH
+ {0xFB66, 0x73F5}, //7563 #CJK UNIFIED IDEOGRAPH
+ {0xFB67, 0x7426}, //7564 #CJK UNIFIED IDEOGRAPH
+ {0xFB68, 0x742A}, //7565 #CJK UNIFIED IDEOGRAPH
+ {0xFB69, 0x7429}, //7566 #CJK UNIFIED IDEOGRAPH
+ {0xFB6A, 0x742E}, //7567 #CJK UNIFIED IDEOGRAPH
+ {0xFB6B, 0x7462}, //7568 #CJK UNIFIED IDEOGRAPH
+ {0xFB6C, 0x7489}, //7569 #CJK UNIFIED IDEOGRAPH
+ {0xFB6D, 0x749F}, //7570 #CJK UNIFIED IDEOGRAPH
+ {0xFB6E, 0x7501}, //7571 #CJK UNIFIED IDEOGRAPH
+ {0xFB6F, 0x756F}, //7572 #CJK UNIFIED IDEOGRAPH
+ {0xFB70, 0x7682}, //7573 #CJK UNIFIED IDEOGRAPH
+ {0xFB71, 0x769C}, //7574 #CJK UNIFIED IDEOGRAPH
+ {0xFB72, 0x769E}, //7575 #CJK UNIFIED IDEOGRAPH
+ {0xFB73, 0x769B}, //7576 #CJK UNIFIED IDEOGRAPH
+ {0xFB74, 0x76A6}, //7577 #CJK UNIFIED IDEOGRAPH
+ {0xFB75, 0xFA17}, //7578 #CJK COMPATIBILITY IDEOGRAPH
+ {0xFB76, 0x7746}, //7579 #CJK UNIFIED IDEOGRAPH
+ {0xFB77, 0x52AF}, //7580 #CJK UNIFIED IDEOGRAPH
+ {0xFB78, 0x7821}, //7581 #CJK UNIFIED IDEOGRAPH
+ {0xFB79, 0x784E}, //7582 #CJK UNIFIED IDEOGRAPH
+ {0xFB7A, 0x7864}, //7583 #CJK UNIFIED IDEOGRAPH
+ {0xFB7B, 0x787A}, //7584 #CJK UNIFIED IDEOGRAPH
+ {0xFB7C, 0x7930}, //7585 #CJK UNIFIED IDEOGRAPH
+ {0xFB7D, 0xFA18}, //7586 #CJK COMPATIBILITY IDEOGRAPH
+ {0xFB7E, 0xFA19}, //7587 #CJK COMPATIBILITY IDEOGRAPH
+ {0xFB80, 0xFA1A}, //7588 #CJK COMPATIBILITY IDEOGRAPH
+ {0xFB81, 0x7994}, //7589 #CJK UNIFIED IDEOGRAPH
+ {0xFB82, 0xFA1B}, //7590 #CJK COMPATIBILITY IDEOGRAPH
+ {0xFB83, 0x799B}, //7591 #CJK UNIFIED IDEOGRAPH
+ {0xFB84, 0x7AD1}, //7592 #CJK UNIFIED IDEOGRAPH
+ {0xFB85, 0x7AE7}, //7593 #CJK UNIFIED IDEOGRAPH
+ {0xFB86, 0xFA1C}, //7594 #CJK COMPATIBILITY IDEOGRAPH
+ {0xFB87, 0x7AEB}, //7595 #CJK UNIFIED IDEOGRAPH
+ {0xFB88, 0x7B9E}, //7596 #CJK UNIFIED IDEOGRAPH
+ {0xFB89, 0xFA1D}, //7597 #CJK COMPATIBILITY IDEOGRAPH
+ {0xFB8A, 0x7D48}, //7598 #CJK UNIFIED IDEOGRAPH
+ {0xFB8B, 0x7D5C}, //7599 #CJK UNIFIED IDEOGRAPH
+ {0xFB8C, 0x7DB7}, //7600 #CJK UNIFIED IDEOGRAPH
+ {0xFB8D, 0x7DA0}, //7601 #CJK UNIFIED IDEOGRAPH
+ {0xFB8E, 0x7DD6}, //7602 #CJK UNIFIED IDEOGRAPH
+ {0xFB8F, 0x7E52}, //7603 #CJK UNIFIED IDEOGRAPH
+ {0xFB90, 0x7F47}, //7604 #CJK UNIFIED IDEOGRAPH
+ {0xFB91, 0x7FA1}, //7605 #CJK UNIFIED IDEOGRAPH
+ {0xFB92, 0xFA1E}, //7606 #CJK COMPATIBILITY IDEOGRAPH
+ {0xFB93, 0x8301}, //7607 #CJK UNIFIED IDEOGRAPH
+ {0xFB94, 0x8362}, //7608 #CJK UNIFIED IDEOGRAPH
+ {0xFB95, 0x837F}, //7609 #CJK UNIFIED IDEOGRAPH
+ {0xFB96, 0x83C7}, //7610 #CJK UNIFIED IDEOGRAPH
+ {0xFB97, 0x83F6}, //7611 #CJK UNIFIED IDEOGRAPH
+ {0xFB98, 0x8448}, //7612 #CJK UNIFIED IDEOGRAPH
+ {0xFB99, 0x84B4}, //7613 #CJK UNIFIED IDEOGRAPH
+ {0xFB9A, 0x8553}, //7614 #CJK UNIFIED IDEOGRAPH
+ {0xFB9B, 0x8559}, //7615 #CJK UNIFIED IDEOGRAPH
+ {0xFB9C, 0x856B}, //7616 #CJK UNIFIED IDEOGRAPH
+ {0xFB9D, 0xFA1F}, //7617 #CJK COMPATIBILITY IDEOGRAPH
+ {0xFB9E, 0x85B0}, //7618 #CJK UNIFIED IDEOGRAPH
+ {0xFB9F, 0xFA20}, //7619 #CJK COMPATIBILITY IDEOGRAPH
+ {0xFBA0, 0xFA21}, //7620 #CJK COMPATIBILITY IDEOGRAPH
+ {0xFBA1, 0x8807}, //7621 #CJK UNIFIED IDEOGRAPH
+ {0xFBA2, 0x88F5}, //7622 #CJK UNIFIED IDEOGRAPH
+ {0xFBA3, 0x8A12}, //7623 #CJK UNIFIED IDEOGRAPH
+ {0xFBA4, 0x8A37}, //7624 #CJK UNIFIED IDEOGRAPH
+ {0xFBA5, 0x8A79}, //7625 #CJK UNIFIED IDEOGRAPH
+ {0xFBA6, 0x8AA7}, //7626 #CJK UNIFIED IDEOGRAPH
+ {0xFBA7, 0x8ABE}, //7627 #CJK UNIFIED IDEOGRAPH
+ {0xFBA8, 0x8ADF}, //7628 #CJK UNIFIED IDEOGRAPH
+ {0xFBA9, 0xFA22}, //7629 #CJK COMPATIBILITY IDEOGRAPH
+ {0xFBAA, 0x8AF6}, //7630 #CJK UNIFIED IDEOGRAPH
+ {0xFBAB, 0x8B53}, //7631 #CJK UNIFIED IDEOGRAPH
+ {0xFBAC, 0x8B7F}, //7632 #CJK UNIFIED IDEOGRAPH
+ {0xFBAD, 0x8CF0}, //7633 #CJK UNIFIED IDEOGRAPH
+ {0xFBAE, 0x8CF4}, //7634 #CJK UNIFIED IDEOGRAPH
+ {0xFBAF, 0x8D12}, //7635 #CJK UNIFIED IDEOGRAPH
+ {0xFBB0, 0x8D76}, //7636 #CJK UNIFIED IDEOGRAPH
+ {0xFBB1, 0xFA23}, //7637 #CJK COMPATIBILITY IDEOGRAPH
+ {0xFBB2, 0x8ECF}, //7638 #CJK UNIFIED IDEOGRAPH
+ {0xFBB3, 0xFA24}, //7639 #CJK COMPATIBILITY IDEOGRAPH
+ {0xFBB4, 0xFA25}, //7640 #CJK COMPATIBILITY IDEOGRAPH
+ {0xFBB5, 0x9067}, //7641 #CJK UNIFIED IDEOGRAPH
+ {0xFBB6, 0x90DE}, //7642 #CJK UNIFIED IDEOGRAPH
+ {0xFBB7, 0xFA26}, //7643 #CJK COMPATIBILITY IDEOGRAPH
+ {0xFBB8, 0x9115}, //7644 #CJK UNIFIED IDEOGRAPH
+ {0xFBB9, 0x9127}, //7645 #CJK UNIFIED IDEOGRAPH
+ {0xFBBA, 0x91DA}, //7646 #CJK UNIFIED IDEOGRAPH
+ {0xFBBB, 0x91D7}, //7647 #CJK UNIFIED IDEOGRAPH
+ {0xFBBC, 0x91DE}, //7648 #CJK UNIFIED IDEOGRAPH
+ {0xFBBD, 0x91ED}, //7649 #CJK UNIFIED IDEOGRAPH
+ {0xFBBE, 0x91EE}, //7650 #CJK UNIFIED IDEOGRAPH
+ {0xFBBF, 0x91E4}, //7651 #CJK UNIFIED IDEOGRAPH
+ {0xFBC0, 0x91E5}, //7652 #CJK UNIFIED IDEOGRAPH
+ {0xFBC1, 0x9206}, //7653 #CJK UNIFIED IDEOGRAPH
+ {0xFBC2, 0x9210}, //7654 #CJK UNIFIED IDEOGRAPH
+ {0xFBC3, 0x920A}, //7655 #CJK UNIFIED IDEOGRAPH
+ {0xFBC4, 0x923A}, //7656 #CJK UNIFIED IDEOGRAPH
+ {0xFBC5, 0x9240}, //7657 #CJK UNIFIED IDEOGRAPH
+ {0xFBC6, 0x923C}, //7658 #CJK UNIFIED IDEOGRAPH
+ {0xFBC7, 0x924E}, //7659 #CJK UNIFIED IDEOGRAPH
+ {0xFBC8, 0x9259}, //7660 #CJK UNIFIED IDEOGRAPH
+ {0xFBC9, 0x9251}, //7661 #CJK UNIFIED IDEOGRAPH
+ {0xFBCA, 0x9239}, //7662 #CJK UNIFIED IDEOGRAPH
+ {0xFBCB, 0x9267}, //7663 #CJK UNIFIED IDEOGRAPH
+ {0xFBCC, 0x92A7}, //7664 #CJK UNIFIED IDEOGRAPH
+ {0xFBCD, 0x9277}, //7665 #CJK UNIFIED IDEOGRAPH
+ {0xFBCE, 0x9278}, //7666 #CJK UNIFIED IDEOGRAPH
+ {0xFBCF, 0x92E7}, //7667 #CJK UNIFIED IDEOGRAPH
+ {0xFBD0, 0x92D7}, //7668 #CJK UNIFIED IDEOGRAPH
+ {0xFBD1, 0x92D9}, //7669 #CJK UNIFIED IDEOGRAPH
+ {0xFBD2, 0x92D0}, //7670 #CJK UNIFIED IDEOGRAPH
+ {0xFBD3, 0xFA27}, //7671 #CJK COMPATIBILITY IDEOGRAPH
+ {0xFBD4, 0x92D5}, //7672 #CJK UNIFIED IDEOGRAPH
+ {0xFBD5, 0x92E0}, //7673 #CJK UNIFIED IDEOGRAPH
+ {0xFBD6, 0x92D3}, //7674 #CJK UNIFIED IDEOGRAPH
+ {0xFBD7, 0x9325}, //7675 #CJK UNIFIED IDEOGRAPH
+ {0xFBD8, 0x9321}, //7676 #CJK UNIFIED IDEOGRAPH
+ {0xFBD9, 0x92FB}, //7677 #CJK UNIFIED IDEOGRAPH
+ {0xFBDA, 0xFA28}, //7678 #CJK COMPATIBILITY IDEOGRAPH
+ {0xFBDB, 0x931E}, //7679 #CJK UNIFIED IDEOGRAPH
+ {0xFBDC, 0x92FF}, //7680 #CJK UNIFIED IDEOGRAPH
+ {0xFBDD, 0x931D}, //7681 #CJK UNIFIED IDEOGRAPH
+ {0xFBDE, 0x9302}, //7682 #CJK UNIFIED IDEOGRAPH
+ {0xFBDF, 0x9370}, //7683 #CJK UNIFIED IDEOGRAPH
+ {0xFBE0, 0x9357}, //7684 #CJK UNIFIED IDEOGRAPH
+ {0xFBE1, 0x93A4}, //7685 #CJK UNIFIED IDEOGRAPH
+ {0xFBE2, 0x93C6}, //7686 #CJK UNIFIED IDEOGRAPH
+ {0xFBE3, 0x93DE}, //7687 #CJK UNIFIED IDEOGRAPH
+ {0xFBE4, 0x93F8}, //7688 #CJK UNIFIED IDEOGRAPH
+ {0xFBE5, 0x9431}, //7689 #CJK UNIFIED IDEOGRAPH
+ {0xFBE6, 0x9445}, //7690 #CJK UNIFIED IDEOGRAPH
+ {0xFBE7, 0x9448}, //7691 #CJK UNIFIED IDEOGRAPH
+ {0xFBE8, 0x9592}, //7692 #CJK UNIFIED IDEOGRAPH
+ {0xFBE9, 0xF9DC}, //7693 #CJK COMPATIBILITY IDEOGRAPH
+ {0xFBEA, 0xFA29}, //7694 #CJK COMPATIBILITY IDEOGRAPH
+ {0xFBEB, 0x969D}, //7695 #CJK UNIFIED IDEOGRAPH
+ {0xFBEC, 0x96AF}, //7696 #CJK UNIFIED IDEOGRAPH
+ {0xFBED, 0x9733}, //7697 #CJK UNIFIED IDEOGRAPH
+ {0xFBEE, 0x973B}, //7698 #CJK UNIFIED IDEOGRAPH
+ {0xFBEF, 0x9743}, //7699 #CJK UNIFIED IDEOGRAPH
+ {0xFBF0, 0x974D}, //7700 #CJK UNIFIED IDEOGRAPH
+ {0xFBF1, 0x974F}, //7701 #CJK UNIFIED IDEOGRAPH
+ {0xFBF2, 0x9751}, //7702 #CJK UNIFIED IDEOGRAPH
+ {0xFBF3, 0x9755}, //7703 #CJK UNIFIED IDEOGRAPH
+ {0xFBF4, 0x9857}, //7704 #CJK UNIFIED IDEOGRAPH
+ {0xFBF5, 0x9865}, //7705 #CJK UNIFIED IDEOGRAPH
+ {0xFBF6, 0xFA2A}, //7706 #CJK COMPATIBILITY IDEOGRAPH
+ {0xFBF7, 0xFA2B}, //7707 #CJK COMPATIBILITY IDEOGRAPH
+ {0xFBF8, 0x9927}, //7708 #CJK UNIFIED IDEOGRAPH
+ {0xFBF9, 0xFA2C}, //7709 #CJK COMPATIBILITY IDEOGRAPH
+ {0xFBFA, 0x999E}, //7710 #CJK UNIFIED IDEOGRAPH
+ {0xFBFB, 0x9A4E}, //7711 #CJK UNIFIED IDEOGRAPH
+ {0xFBFC, 0x9AD9}, //7712 #CJK UNIFIED IDEOGRAPH
+ {0xFC40, 0x9ADC}, //7713 #CJK UNIFIED IDEOGRAPH
+ {0xFC41, 0x9B75}, //7714 #CJK UNIFIED IDEOGRAPH
+ {0xFC42, 0x9B72}, //7715 #CJK UNIFIED IDEOGRAPH
+ {0xFC43, 0x9B8F}, //7716 #CJK UNIFIED IDEOGRAPH
+ {0xFC44, 0x9BB1}, //7717 #CJK UNIFIED IDEOGRAPH
+ {0xFC45, 0x9BBB}, //7718 #CJK UNIFIED IDEOGRAPH
+ {0xFC46, 0x9C00}, //7719 #CJK UNIFIED IDEOGRAPH
+ {0xFC47, 0x9D70}, //7720 #CJK UNIFIED IDEOGRAPH
+ {0xFC48, 0x9D6B}, //7721 #CJK UNIFIED IDEOGRAPH
+ {0xFC49, 0xFA2D}, //7722 #CJK COMPATIBILITY IDEOGRAPH
+ {0xFC4A, 0x9E19}, //7723 #CJK UNIFIED IDEOGRAPH
+ {0xFC4B, 0x9ED1} //7724 #CJK UNIFIED IDEOGRAPH
+};
+#endif // DRW_CPTABLE932_H
--- /dev/null
+#ifndef DRW_CPTABLE936_H
+#define DRW_CPTABLE936_H
+
+//Chinese PRC GBK (XGB)
+
+//first entry in this tables are 0x80
+#define CPOFFSET936 0x80
+#define CPLENGHT936 21791
+#define NOTFOUND936 0x003F
+
+//Table 949 one byte
+static const int DRW_Table936[] = {
+ 0x20AC //1 #EURO SIGN 0x80
+// 0xF8F5 //2 #EURO SIGN 0x80
+};
+
+//Table 936
+static const int DRW_LeadTable936[] = {
+ 0, //1#DBCS LEAD BYTE 0x81
+ 190, //2#DBCS LEAD BYTE 0x82
+ 380, //3#DBCS LEAD BYTE 0x83
+ 570, //4#DBCS LEAD BYTE 0x84
+ 760, //5#DBCS LEAD BYTE 0x85
+ 950, //6#DBCS LEAD BYTE 0x86
+ 1140, //7#DBCS LEAD BYTE 0x87
+ 1330, //8#DBCS LEAD BYTE 0x88
+ 1520, //9#DBCS LEAD BYTE 0x89
+ 1710, //10#DBCS LEAD BYTE 0x8A
+ 1900, //11#DBCS LEAD BYTE 0x8B
+ 2090, //12#DBCS LEAD BYTE 0x8C
+ 2280, //13#DBCS LEAD BYTE 0x8D
+ 2470, //14#DBCS LEAD BYTE 0x8E
+ 2660, //15#DBCS LEAD BYTE 0x8F
+ 2850, //16#DBCS LEAD BYTE 0x90
+ 3040, //17#DBCS LEAD BYTE 0x91
+ 3230, //18#DBCS LEAD BYTE 0x92
+ 3420, //19#DBCS LEAD BYTE 0x93
+ 3610, //20#DBCS LEAD BYTE 0x94
+ 3800, //21#DBCS LEAD BYTE 0x95
+ 3990, //22#DBCS LEAD BYTE 0x96
+ 4180, //23#DBCS LEAD BYTE 0x97
+ 4370, //24#DBCS LEAD BYTE 0x98
+ 4560, //25#DBCS LEAD BYTE 0x99
+ 4750, //26#DBCS LEAD BYTE 0x9A
+ 4940, //27#DBCS LEAD BYTE 0x9B
+ 5130, //28#DBCS LEAD BYTE 0x9C
+ 5320, //29#DBCS LEAD BYTE 0x9D
+ 5510, //30#DBCS LEAD BYTE 0x9E
+ 5700, //31#DBCS LEAD BYTE 0x9F
+ 5906, //32#DBCS LEAD BYTE 0xA0
+ 6080, //33#DBCS LEAD BYTE 0xA1
+ 6174, //34#DBCS LEAD BYTE 0xA2
+ 6256, //35#DBCS LEAD BYTE 0xA3
+ 6350, //36#DBCS LEAD BYTE 0xA4
+ 6433, //37#DBCS LEAD BYTE 0xA5
+ 6519, //38#DBCS LEAD BYTE 0xA6
+ 6586, //39#DBCS LEAD BYTE 0xA7
+ 6652, //40#DBCS LEAD BYTE 0xA8
+ 6804, //41#DBCS LEAD BYTE 0xA9
+ 6948, //42#DBCS LEAD BYTE 0xAA
+ 7044, //43#DBCS LEAD BYTE 0xAB
+ 7140, //44#DBCS LEAD BYTE 0xAC
+ 7236, //45#DBCS LEAD BYTE 0xAD
+ 7332, //46#DBCS LEAD BYTE 0xAE
+ 7428, //47#DBCS LEAD BYTE 0xAF
+ 7524, //48#DBCS LEAD BYTE 0xB0
+ 7714, //49#DBCS LEAD BYTE 0xB1
+ 7904, //50#DBCS LEAD BYTE 0xB2
+ 8094, //51#DBCS LEAD BYTE 0xB3
+ 8284, //52#DBCS LEAD BYTE 0xB4
+ 8474, //53#DBCS LEAD BYTE 0xB5
+ 8664, //54#DBCS LEAD BYTE 0xB6
+ 8854, //55#DBCS LEAD BYTE 0xB7
+ 9044, //56#DBCS LEAD BYTE 0xB8
+ 9224, //57#DBCS LEAD BYTE 0xB9
+ 9424, //58#DBCS LEAD BYTE 0xBA
+ 9614, //59#DBCS LEAD BYTE 0xBB
+ 9804, //60#DBCS LEAD BYTE 0xBC
+ 9994, //61#DBCS LEAD BYTE 0xBD
+ 10184, //62#DBCS LEAD BYTE 0xBE
+ 10374, //63#DBCS LEAD BYTE 0xBF
+ 10564, //64#DBCS LEAD BYTE 0xC0
+ 10754, //65#DBCS LEAD BYTE 0xC1
+ 10944, //66#DBCS LEAD BYTE 0xC2
+ 11134, //67#DBCS LEAD BYTE 0xC3
+ 11324, //68#DBCS LEAD BYTE 0xC4
+ 11514, //69#DBCS LEAD BYTE 0xC5
+ 11704, //70#DBCS LEAD BYTE 0xC6
+ 11894, //71#DBCS LEAD BYTE 0xC7
+ 12084, //72#DBCS LEAD BYTE 0xC8
+ 12274, //73#DBCS LEAD BYTE 0xC9
+ 12464, //74#DBCS LEAD BYTE 0xCA
+ 12654, //75#DBCS LEAD BYTE 0xCB
+ 12844, //76#DBCS LEAD BYTE 0xCC
+ 13034, //77#DBCS LEAD BYTE 0xCD
+ 13224, //78#DBCS LEAD BYTE 0xCE
+ 13414, //79#DBCS LEAD BYTE 0xCF
+ 13604, //80#DBCS LEAD BYTE 0xD0
+ 13794, //81#DBCS LEAD BYTE 0xD1
+ 13984, //82#DBCS LEAD BYTE 0xD2
+ 14174, //83#DBCS LEAD BYTE 0xD3
+ 14364, //84#DBCS LEAD BYTE 0xD4
+ 14554, //85#DBCS LEAD BYTE 0xD5
+ 14744, //86#DBCS LEAD BYTE 0xD6
+ 14934, //87#DBCS LEAD BYTE 0xD7
+ 15119, //88#DBCS LEAD BYTE 0xD8
+ 15309, //89#DBCS LEAD BYTE 0xD9
+ 15499, //90#DBCS LEAD BYTE 0xDA
+ 15689, //91#DBCS LEAD BYTE 0xDB
+ 15879, //92#DBCS LEAD BYTE 0xDC
+ 16069, //93#DBCS LEAD BYTE 0xDD
+ 16259, //94#DBCS LEAD BYTE 0xDE
+ 16449, //95#DBCS LEAD BYTE 0xDF
+ 16639, //96#DBCS LEAD BYTE 0xE0
+ 16829, //97#DBCS LEAD BYTE 0xE1
+ 17019, //98#DBCS LEAD BYTE 0xE2
+ 17209, //99#DBCS LEAD BYTE 0xE3
+ 17399, //100#DBCS LEAD BYTE 0xE4
+ 17589, //101#DBCS LEAD BYTE 0xE5
+ 17779, //102#DBCS LEAD BYTE 0xE6
+ 17969, //103#DBCS LEAD BYTE 0xE7
+ 18159, //104#DBCS LEAD BYTE 0xE8
+ 18349, //105#DBCS LEAD BYTE 0xE9
+ 18539, //106#DBCS LEAD BYTE 0xEA
+ 18729, //107#DBCS LEAD BYTE 0xEB
+ 18919, //108#DBCS LEAD BYTE 0xEC
+ 19109, //109#DBCS LEAD BYTE 0xED
+ 19299, //110#DBCS LEAD BYTE 0xEE
+ 19489, //111#DBCS LEAD BYTE 0xEF
+ 19679, //112#DBCS LEAD BYTE 0xF0
+ 19869, //113#DBCS LEAD BYTE 0xF1
+ 20059, //114#DBCS LEAD BYTE 0xF2
+ 20249, //115#DBCS LEAD BYTE 0xF3
+ 20439, //116#DBCS LEAD BYTE 0xF4
+ 20659, //117#DBCS LEAD BYTE 0xF5
+ 20819, //118#DBCS LEAD BYTE 0xF6
+ 21009, //119#DBCS LEAD BYTE 0xF7
+ 21199, //120#DBCS LEAD BYTE 0xF8
+ 21295, //121#DBCS LEAD BYTE 0xF9
+ 21391, //122#DBCS LEAD BYTE 0xFA
+ 21487, //123#DBCS LEAD BYTE 0xFB
+ 21583, //124#DBCS LEAD BYTE 0xFC
+ 21679, //125#DBCS LEAD BYTE 0xFD
+ 21775, //126#DBCS LEAD BYTE 0xFE
+ 21791, //127#UNDEFINED 0xFF, END OF TABLE
+};
+
+//Table 936 tail byte
+static const int DRW_DoubleTable936[][2] = {
+ {0x8140, 0x4E02}, //1 #CJK UNIFIED IDEOGRAPH
+ {0x8141, 0x4E04}, //2 #CJK UNIFIED IDEOGRAPH
+ {0x8142, 0x4E05}, //3 #CJK UNIFIED IDEOGRAPH
+ {0x8143, 0x4E06}, //4 #CJK UNIFIED IDEOGRAPH
+ {0x8144, 0x4E0F}, //5 #CJK UNIFIED IDEOGRAPH
+ {0x8145, 0x4E12}, //6 #CJK UNIFIED IDEOGRAPH
+ {0x8146, 0x4E17}, //7 #CJK UNIFIED IDEOGRAPH
+ {0x8147, 0x4E1F}, //8 #CJK UNIFIED IDEOGRAPH
+ {0x8148, 0x4E20}, //9 #CJK UNIFIED IDEOGRAPH
+ {0x8149, 0x4E21}, //10 #CJK UNIFIED IDEOGRAPH
+ {0x814A, 0x4E23}, //11 #CJK UNIFIED IDEOGRAPH
+ {0x814B, 0x4E26}, //12 #CJK UNIFIED IDEOGRAPH
+ {0x814C, 0x4E29}, //13 #CJK UNIFIED IDEOGRAPH
+ {0x814D, 0x4E2E}, //14 #CJK UNIFIED IDEOGRAPH
+ {0x814E, 0x4E2F}, //15 #CJK UNIFIED IDEOGRAPH
+ {0x814F, 0x4E31}, //16 #CJK UNIFIED IDEOGRAPH
+ {0x8150, 0x4E33}, //17 #CJK UNIFIED IDEOGRAPH
+ {0x8151, 0x4E35}, //18 #CJK UNIFIED IDEOGRAPH
+ {0x8152, 0x4E37}, //19 #CJK UNIFIED IDEOGRAPH
+ {0x8153, 0x4E3C}, //20 #CJK UNIFIED IDEOGRAPH
+ {0x8154, 0x4E40}, //21 #CJK UNIFIED IDEOGRAPH
+ {0x8155, 0x4E41}, //22 #CJK UNIFIED IDEOGRAPH
+ {0x8156, 0x4E42}, //23 #CJK UNIFIED IDEOGRAPH
+ {0x8157, 0x4E44}, //24 #CJK UNIFIED IDEOGRAPH
+ {0x8158, 0x4E46}, //25 #CJK UNIFIED IDEOGRAPH
+ {0x8159, 0x4E4A}, //26 #CJK UNIFIED IDEOGRAPH
+ {0x815A, 0x4E51}, //27 #CJK UNIFIED IDEOGRAPH
+ {0x815B, 0x4E55}, //28 #CJK UNIFIED IDEOGRAPH
+ {0x815C, 0x4E57}, //29 #CJK UNIFIED IDEOGRAPH
+ {0x815D, 0x4E5A}, //30 #CJK UNIFIED IDEOGRAPH
+ {0x815E, 0x4E5B}, //31 #CJK UNIFIED IDEOGRAPH
+ {0x815F, 0x4E62}, //32 #CJK UNIFIED IDEOGRAPH
+ {0x8160, 0x4E63}, //33 #CJK UNIFIED IDEOGRAPH
+ {0x8161, 0x4E64}, //34 #CJK UNIFIED IDEOGRAPH
+ {0x8162, 0x4E65}, //35 #CJK UNIFIED IDEOGRAPH
+ {0x8163, 0x4E67}, //36 #CJK UNIFIED IDEOGRAPH
+ {0x8164, 0x4E68}, //37 #CJK UNIFIED IDEOGRAPH
+ {0x8165, 0x4E6A}, //38 #CJK UNIFIED IDEOGRAPH
+ {0x8166, 0x4E6B}, //39 #CJK UNIFIED IDEOGRAPH
+ {0x8167, 0x4E6C}, //40 #CJK UNIFIED IDEOGRAPH
+ {0x8168, 0x4E6D}, //41 #CJK UNIFIED IDEOGRAPH
+ {0x8169, 0x4E6E}, //42 #CJK UNIFIED IDEOGRAPH
+ {0x816A, 0x4E6F}, //43 #CJK UNIFIED IDEOGRAPH
+ {0x816B, 0x4E72}, //44 #CJK UNIFIED IDEOGRAPH
+ {0x816C, 0x4E74}, //45 #CJK UNIFIED IDEOGRAPH
+ {0x816D, 0x4E75}, //46 #CJK UNIFIED IDEOGRAPH
+ {0x816E, 0x4E76}, //47 #CJK UNIFIED IDEOGRAPH
+ {0x816F, 0x4E77}, //48 #CJK UNIFIED IDEOGRAPH
+ {0x8170, 0x4E78}, //49 #CJK UNIFIED IDEOGRAPH
+ {0x8171, 0x4E79}, //50 #CJK UNIFIED IDEOGRAPH
+ {0x8172, 0x4E7A}, //51 #CJK UNIFIED IDEOGRAPH
+ {0x8173, 0x4E7B}, //52 #CJK UNIFIED IDEOGRAPH
+ {0x8174, 0x4E7C}, //53 #CJK UNIFIED IDEOGRAPH
+ {0x8175, 0x4E7D}, //54 #CJK UNIFIED IDEOGRAPH
+ {0x8176, 0x4E7F}, //55 #CJK UNIFIED IDEOGRAPH
+ {0x8177, 0x4E80}, //56 #CJK UNIFIED IDEOGRAPH
+ {0x8178, 0x4E81}, //57 #CJK UNIFIED IDEOGRAPH
+ {0x8179, 0x4E82}, //58 #CJK UNIFIED IDEOGRAPH
+ {0x817A, 0x4E83}, //59 #CJK UNIFIED IDEOGRAPH
+ {0x817B, 0x4E84}, //60 #CJK UNIFIED IDEOGRAPH
+ {0x817C, 0x4E85}, //61 #CJK UNIFIED IDEOGRAPH
+ {0x817D, 0x4E87}, //62 #CJK UNIFIED IDEOGRAPH
+ {0x817E, 0x4E8A}, //63 #CJK UNIFIED IDEOGRAPH
+ {0x8180, 0x4E90}, //64 #CJK UNIFIED IDEOGRAPH
+ {0x8181, 0x4E96}, //65 #CJK UNIFIED IDEOGRAPH
+ {0x8182, 0x4E97}, //66 #CJK UNIFIED IDEOGRAPH
+ {0x8183, 0x4E99}, //67 #CJK UNIFIED IDEOGRAPH
+ {0x8184, 0x4E9C}, //68 #CJK UNIFIED IDEOGRAPH
+ {0x8185, 0x4E9D}, //69 #CJK UNIFIED IDEOGRAPH
+ {0x8186, 0x4E9E}, //70 #CJK UNIFIED IDEOGRAPH
+ {0x8187, 0x4EA3}, //71 #CJK UNIFIED IDEOGRAPH
+ {0x8188, 0x4EAA}, //72 #CJK UNIFIED IDEOGRAPH
+ {0x8189, 0x4EAF}, //73 #CJK UNIFIED IDEOGRAPH
+ {0x818A, 0x4EB0}, //74 #CJK UNIFIED IDEOGRAPH
+ {0x818B, 0x4EB1}, //75 #CJK UNIFIED IDEOGRAPH
+ {0x818C, 0x4EB4}, //76 #CJK UNIFIED IDEOGRAPH
+ {0x818D, 0x4EB6}, //77 #CJK UNIFIED IDEOGRAPH
+ {0x818E, 0x4EB7}, //78 #CJK UNIFIED IDEOGRAPH
+ {0x818F, 0x4EB8}, //79 #CJK UNIFIED IDEOGRAPH
+ {0x8190, 0x4EB9}, //80 #CJK UNIFIED IDEOGRAPH
+ {0x8191, 0x4EBC}, //81 #CJK UNIFIED IDEOGRAPH
+ {0x8192, 0x4EBD}, //82 #CJK UNIFIED IDEOGRAPH
+ {0x8193, 0x4EBE}, //83 #CJK UNIFIED IDEOGRAPH
+ {0x8194, 0x4EC8}, //84 #CJK UNIFIED IDEOGRAPH
+ {0x8195, 0x4ECC}, //85 #CJK UNIFIED IDEOGRAPH
+ {0x8196, 0x4ECF}, //86 #CJK UNIFIED IDEOGRAPH
+ {0x8197, 0x4ED0}, //87 #CJK UNIFIED IDEOGRAPH
+ {0x8198, 0x4ED2}, //88 #CJK UNIFIED IDEOGRAPH
+ {0x8199, 0x4EDA}, //89 #CJK UNIFIED IDEOGRAPH
+ {0x819A, 0x4EDB}, //90 #CJK UNIFIED IDEOGRAPH
+ {0x819B, 0x4EDC}, //91 #CJK UNIFIED IDEOGRAPH
+ {0x819C, 0x4EE0}, //92 #CJK UNIFIED IDEOGRAPH
+ {0x819D, 0x4EE2}, //93 #CJK UNIFIED IDEOGRAPH
+ {0x819E, 0x4EE6}, //94 #CJK UNIFIED IDEOGRAPH
+ {0x819F, 0x4EE7}, //95 #CJK UNIFIED IDEOGRAPH
+ {0x81A0, 0x4EE9}, //96 #CJK UNIFIED IDEOGRAPH
+ {0x81A1, 0x4EED}, //97 #CJK UNIFIED IDEOGRAPH
+ {0x81A2, 0x4EEE}, //98 #CJK UNIFIED IDEOGRAPH
+ {0x81A3, 0x4EEF}, //99 #CJK UNIFIED IDEOGRAPH
+ {0x81A4, 0x4EF1}, //100 #CJK UNIFIED IDEOGRAPH
+ {0x81A5, 0x4EF4}, //101 #CJK UNIFIED IDEOGRAPH
+ {0x81A6, 0x4EF8}, //102 #CJK UNIFIED IDEOGRAPH
+ {0x81A7, 0x4EF9}, //103 #CJK UNIFIED IDEOGRAPH
+ {0x81A8, 0x4EFA}, //104 #CJK UNIFIED IDEOGRAPH
+ {0x81A9, 0x4EFC}, //105 #CJK UNIFIED IDEOGRAPH
+ {0x81AA, 0x4EFE}, //106 #CJK UNIFIED IDEOGRAPH
+ {0x81AB, 0x4F00}, //107 #CJK UNIFIED IDEOGRAPH
+ {0x81AC, 0x4F02}, //108 #CJK UNIFIED IDEOGRAPH
+ {0x81AD, 0x4F03}, //109 #CJK UNIFIED IDEOGRAPH
+ {0x81AE, 0x4F04}, //110 #CJK UNIFIED IDEOGRAPH
+ {0x81AF, 0x4F05}, //111 #CJK UNIFIED IDEOGRAPH
+ {0x81B0, 0x4F06}, //112 #CJK UNIFIED IDEOGRAPH
+ {0x81B1, 0x4F07}, //113 #CJK UNIFIED IDEOGRAPH
+ {0x81B2, 0x4F08}, //114 #CJK UNIFIED IDEOGRAPH
+ {0x81B3, 0x4F0B}, //115 #CJK UNIFIED IDEOGRAPH
+ {0x81B4, 0x4F0C}, //116 #CJK UNIFIED IDEOGRAPH
+ {0x81B5, 0x4F12}, //117 #CJK UNIFIED IDEOGRAPH
+ {0x81B6, 0x4F13}, //118 #CJK UNIFIED IDEOGRAPH
+ {0x81B7, 0x4F14}, //119 #CJK UNIFIED IDEOGRAPH
+ {0x81B8, 0x4F15}, //120 #CJK UNIFIED IDEOGRAPH
+ {0x81B9, 0x4F16}, //121 #CJK UNIFIED IDEOGRAPH
+ {0x81BA, 0x4F1C}, //122 #CJK UNIFIED IDEOGRAPH
+ {0x81BB, 0x4F1D}, //123 #CJK UNIFIED IDEOGRAPH
+ {0x81BC, 0x4F21}, //124 #CJK UNIFIED IDEOGRAPH
+ {0x81BD, 0x4F23}, //125 #CJK UNIFIED IDEOGRAPH
+ {0x81BE, 0x4F28}, //126 #CJK UNIFIED IDEOGRAPH
+ {0x81BF, 0x4F29}, //127 #CJK UNIFIED IDEOGRAPH
+ {0x81C0, 0x4F2C}, //128 #CJK UNIFIED IDEOGRAPH
+ {0x81C1, 0x4F2D}, //129 #CJK UNIFIED IDEOGRAPH
+ {0x81C2, 0x4F2E}, //130 #CJK UNIFIED IDEOGRAPH
+ {0x81C3, 0x4F31}, //131 #CJK UNIFIED IDEOGRAPH
+ {0x81C4, 0x4F33}, //132 #CJK UNIFIED IDEOGRAPH
+ {0x81C5, 0x4F35}, //133 #CJK UNIFIED IDEOGRAPH
+ {0x81C6, 0x4F37}, //134 #CJK UNIFIED IDEOGRAPH
+ {0x81C7, 0x4F39}, //135 #CJK UNIFIED IDEOGRAPH
+ {0x81C8, 0x4F3B}, //136 #CJK UNIFIED IDEOGRAPH
+ {0x81C9, 0x4F3E}, //137 #CJK UNIFIED IDEOGRAPH
+ {0x81CA, 0x4F3F}, //138 #CJK UNIFIED IDEOGRAPH
+ {0x81CB, 0x4F40}, //139 #CJK UNIFIED IDEOGRAPH
+ {0x81CC, 0x4F41}, //140 #CJK UNIFIED IDEOGRAPH
+ {0x81CD, 0x4F42}, //141 #CJK UNIFIED IDEOGRAPH
+ {0x81CE, 0x4F44}, //142 #CJK UNIFIED IDEOGRAPH
+ {0x81CF, 0x4F45}, //143 #CJK UNIFIED IDEOGRAPH
+ {0x81D0, 0x4F47}, //144 #CJK UNIFIED IDEOGRAPH
+ {0x81D1, 0x4F48}, //145 #CJK UNIFIED IDEOGRAPH
+ {0x81D2, 0x4F49}, //146 #CJK UNIFIED IDEOGRAPH
+ {0x81D3, 0x4F4A}, //147 #CJK UNIFIED IDEOGRAPH
+ {0x81D4, 0x4F4B}, //148 #CJK UNIFIED IDEOGRAPH
+ {0x81D5, 0x4F4C}, //149 #CJK UNIFIED IDEOGRAPH
+ {0x81D6, 0x4F52}, //150 #CJK UNIFIED IDEOGRAPH
+ {0x81D7, 0x4F54}, //151 #CJK UNIFIED IDEOGRAPH
+ {0x81D8, 0x4F56}, //152 #CJK UNIFIED IDEOGRAPH
+ {0x81D9, 0x4F61}, //153 #CJK UNIFIED IDEOGRAPH
+ {0x81DA, 0x4F62}, //154 #CJK UNIFIED IDEOGRAPH
+ {0x81DB, 0x4F66}, //155 #CJK UNIFIED IDEOGRAPH
+ {0x81DC, 0x4F68}, //156 #CJK UNIFIED IDEOGRAPH
+ {0x81DD, 0x4F6A}, //157 #CJK UNIFIED IDEOGRAPH
+ {0x81DE, 0x4F6B}, //158 #CJK UNIFIED IDEOGRAPH
+ {0x81DF, 0x4F6D}, //159 #CJK UNIFIED IDEOGRAPH
+ {0x81E0, 0x4F6E}, //160 #CJK UNIFIED IDEOGRAPH
+ {0x81E1, 0x4F71}, //161 #CJK UNIFIED IDEOGRAPH
+ {0x81E2, 0x4F72}, //162 #CJK UNIFIED IDEOGRAPH
+ {0x81E3, 0x4F75}, //163 #CJK UNIFIED IDEOGRAPH
+ {0x81E4, 0x4F77}, //164 #CJK UNIFIED IDEOGRAPH
+ {0x81E5, 0x4F78}, //165 #CJK UNIFIED IDEOGRAPH
+ {0x81E6, 0x4F79}, //166 #CJK UNIFIED IDEOGRAPH
+ {0x81E7, 0x4F7A}, //167 #CJK UNIFIED IDEOGRAPH
+ {0x81E8, 0x4F7D}, //168 #CJK UNIFIED IDEOGRAPH
+ {0x81E9, 0x4F80}, //169 #CJK UNIFIED IDEOGRAPH
+ {0x81EA, 0x4F81}, //170 #CJK UNIFIED IDEOGRAPH
+ {0x81EB, 0x4F82}, //171 #CJK UNIFIED IDEOGRAPH
+ {0x81EC, 0x4F85}, //172 #CJK UNIFIED IDEOGRAPH
+ {0x81ED, 0x4F86}, //173 #CJK UNIFIED IDEOGRAPH
+ {0x81EE, 0x4F87}, //174 #CJK UNIFIED IDEOGRAPH
+ {0x81EF, 0x4F8A}, //175 #CJK UNIFIED IDEOGRAPH
+ {0x81F0, 0x4F8C}, //176 #CJK UNIFIED IDEOGRAPH
+ {0x81F1, 0x4F8E}, //177 #CJK UNIFIED IDEOGRAPH
+ {0x81F2, 0x4F90}, //178 #CJK UNIFIED IDEOGRAPH
+ {0x81F3, 0x4F92}, //179 #CJK UNIFIED IDEOGRAPH
+ {0x81F4, 0x4F93}, //180 #CJK UNIFIED IDEOGRAPH
+ {0x81F5, 0x4F95}, //181 #CJK UNIFIED IDEOGRAPH
+ {0x81F6, 0x4F96}, //182 #CJK UNIFIED IDEOGRAPH
+ {0x81F7, 0x4F98}, //183 #CJK UNIFIED IDEOGRAPH
+ {0x81F8, 0x4F99}, //184 #CJK UNIFIED IDEOGRAPH
+ {0x81F9, 0x4F9A}, //185 #CJK UNIFIED IDEOGRAPH
+ {0x81FA, 0x4F9C}, //186 #CJK UNIFIED IDEOGRAPH
+ {0x81FB, 0x4F9E}, //187 #CJK UNIFIED IDEOGRAPH
+ {0x81FC, 0x4F9F}, //188 #CJK UNIFIED IDEOGRAPH
+ {0x81FD, 0x4FA1}, //189 #CJK UNIFIED IDEOGRAPH
+ {0x81FE, 0x4FA2}, //190 #CJK UNIFIED IDEOGRAPH
+ {0x8240, 0x4FA4}, //191 #CJK UNIFIED IDEOGRAPH
+ {0x8241, 0x4FAB}, //192 #CJK UNIFIED IDEOGRAPH
+ {0x8242, 0x4FAD}, //193 #CJK UNIFIED IDEOGRAPH
+ {0x8243, 0x4FB0}, //194 #CJK UNIFIED IDEOGRAPH
+ {0x8244, 0x4FB1}, //195 #CJK UNIFIED IDEOGRAPH
+ {0x8245, 0x4FB2}, //196 #CJK UNIFIED IDEOGRAPH
+ {0x8246, 0x4FB3}, //197 #CJK UNIFIED IDEOGRAPH
+ {0x8247, 0x4FB4}, //198 #CJK UNIFIED IDEOGRAPH
+ {0x8248, 0x4FB6}, //199 #CJK UNIFIED IDEOGRAPH
+ {0x8249, 0x4FB7}, //200 #CJK UNIFIED IDEOGRAPH
+ {0x824A, 0x4FB8}, //201 #CJK UNIFIED IDEOGRAPH
+ {0x824B, 0x4FB9}, //202 #CJK UNIFIED IDEOGRAPH
+ {0x824C, 0x4FBA}, //203 #CJK UNIFIED IDEOGRAPH
+ {0x824D, 0x4FBB}, //204 #CJK UNIFIED IDEOGRAPH
+ {0x824E, 0x4FBC}, //205 #CJK UNIFIED IDEOGRAPH
+ {0x824F, 0x4FBD}, //206 #CJK UNIFIED IDEOGRAPH
+ {0x8250, 0x4FBE}, //207 #CJK UNIFIED IDEOGRAPH
+ {0x8251, 0x4FC0}, //208 #CJK UNIFIED IDEOGRAPH
+ {0x8252, 0x4FC1}, //209 #CJK UNIFIED IDEOGRAPH
+ {0x8253, 0x4FC2}, //210 #CJK UNIFIED IDEOGRAPH
+ {0x8254, 0x4FC6}, //211 #CJK UNIFIED IDEOGRAPH
+ {0x8255, 0x4FC7}, //212 #CJK UNIFIED IDEOGRAPH
+ {0x8256, 0x4FC8}, //213 #CJK UNIFIED IDEOGRAPH
+ {0x8257, 0x4FC9}, //214 #CJK UNIFIED IDEOGRAPH
+ {0x8258, 0x4FCB}, //215 #CJK UNIFIED IDEOGRAPH
+ {0x8259, 0x4FCC}, //216 #CJK UNIFIED IDEOGRAPH
+ {0x825A, 0x4FCD}, //217 #CJK UNIFIED IDEOGRAPH
+ {0x825B, 0x4FD2}, //218 #CJK UNIFIED IDEOGRAPH
+ {0x825C, 0x4FD3}, //219 #CJK UNIFIED IDEOGRAPH
+ {0x825D, 0x4FD4}, //220 #CJK UNIFIED IDEOGRAPH
+ {0x825E, 0x4FD5}, //221 #CJK UNIFIED IDEOGRAPH
+ {0x825F, 0x4FD6}, //222 #CJK UNIFIED IDEOGRAPH
+ {0x8260, 0x4FD9}, //223 #CJK UNIFIED IDEOGRAPH
+ {0x8261, 0x4FDB}, //224 #CJK UNIFIED IDEOGRAPH
+ {0x8262, 0x4FE0}, //225 #CJK UNIFIED IDEOGRAPH
+ {0x8263, 0x4FE2}, //226 #CJK UNIFIED IDEOGRAPH
+ {0x8264, 0x4FE4}, //227 #CJK UNIFIED IDEOGRAPH
+ {0x8265, 0x4FE5}, //228 #CJK UNIFIED IDEOGRAPH
+ {0x8266, 0x4FE7}, //229 #CJK UNIFIED IDEOGRAPH
+ {0x8267, 0x4FEB}, //230 #CJK UNIFIED IDEOGRAPH
+ {0x8268, 0x4FEC}, //231 #CJK UNIFIED IDEOGRAPH
+ {0x8269, 0x4FF0}, //232 #CJK UNIFIED IDEOGRAPH
+ {0x826A, 0x4FF2}, //233 #CJK UNIFIED IDEOGRAPH
+ {0x826B, 0x4FF4}, //234 #CJK UNIFIED IDEOGRAPH
+ {0x826C, 0x4FF5}, //235 #CJK UNIFIED IDEOGRAPH
+ {0x826D, 0x4FF6}, //236 #CJK UNIFIED IDEOGRAPH
+ {0x826E, 0x4FF7}, //237 #CJK UNIFIED IDEOGRAPH
+ {0x826F, 0x4FF9}, //238 #CJK UNIFIED IDEOGRAPH
+ {0x8270, 0x4FFB}, //239 #CJK UNIFIED IDEOGRAPH
+ {0x8271, 0x4FFC}, //240 #CJK UNIFIED IDEOGRAPH
+ {0x8272, 0x4FFD}, //241 #CJK UNIFIED IDEOGRAPH
+ {0x8273, 0x4FFF}, //242 #CJK UNIFIED IDEOGRAPH
+ {0x8274, 0x5000}, //243 #CJK UNIFIED IDEOGRAPH
+ {0x8275, 0x5001}, //244 #CJK UNIFIED IDEOGRAPH
+ {0x8276, 0x5002}, //245 #CJK UNIFIED IDEOGRAPH
+ {0x8277, 0x5003}, //246 #CJK UNIFIED IDEOGRAPH
+ {0x8278, 0x5004}, //247 #CJK UNIFIED IDEOGRAPH
+ {0x8279, 0x5005}, //248 #CJK UNIFIED IDEOGRAPH
+ {0x827A, 0x5006}, //249 #CJK UNIFIED IDEOGRAPH
+ {0x827B, 0x5007}, //250 #CJK UNIFIED IDEOGRAPH
+ {0x827C, 0x5008}, //251 #CJK UNIFIED IDEOGRAPH
+ {0x827D, 0x5009}, //252 #CJK UNIFIED IDEOGRAPH
+ {0x827E, 0x500A}, //253 #CJK UNIFIED IDEOGRAPH
+ {0x8280, 0x500B}, //254 #CJK UNIFIED IDEOGRAPH
+ {0x8281, 0x500E}, //255 #CJK UNIFIED IDEOGRAPH
+ {0x8282, 0x5010}, //256 #CJK UNIFIED IDEOGRAPH
+ {0x8283, 0x5011}, //257 #CJK UNIFIED IDEOGRAPH
+ {0x8284, 0x5013}, //258 #CJK UNIFIED IDEOGRAPH
+ {0x8285, 0x5015}, //259 #CJK UNIFIED IDEOGRAPH
+ {0x8286, 0x5016}, //260 #CJK UNIFIED IDEOGRAPH
+ {0x8287, 0x5017}, //261 #CJK UNIFIED IDEOGRAPH
+ {0x8288, 0x501B}, //262 #CJK UNIFIED IDEOGRAPH
+ {0x8289, 0x501D}, //263 #CJK UNIFIED IDEOGRAPH
+ {0x828A, 0x501E}, //264 #CJK UNIFIED IDEOGRAPH
+ {0x828B, 0x5020}, //265 #CJK UNIFIED IDEOGRAPH
+ {0x828C, 0x5022}, //266 #CJK UNIFIED IDEOGRAPH
+ {0x828D, 0x5023}, //267 #CJK UNIFIED IDEOGRAPH
+ {0x828E, 0x5024}, //268 #CJK UNIFIED IDEOGRAPH
+ {0x828F, 0x5027}, //269 #CJK UNIFIED IDEOGRAPH
+ {0x8290, 0x502B}, //270 #CJK UNIFIED IDEOGRAPH
+ {0x8291, 0x502F}, //271 #CJK UNIFIED IDEOGRAPH
+ {0x8292, 0x5030}, //272 #CJK UNIFIED IDEOGRAPH
+ {0x8293, 0x5031}, //273 #CJK UNIFIED IDEOGRAPH
+ {0x8294, 0x5032}, //274 #CJK UNIFIED IDEOGRAPH
+ {0x8295, 0x5033}, //275 #CJK UNIFIED IDEOGRAPH
+ {0x8296, 0x5034}, //276 #CJK UNIFIED IDEOGRAPH
+ {0x8297, 0x5035}, //277 #CJK UNIFIED IDEOGRAPH
+ {0x8298, 0x5036}, //278 #CJK UNIFIED IDEOGRAPH
+ {0x8299, 0x5037}, //279 #CJK UNIFIED IDEOGRAPH
+ {0x829A, 0x5038}, //280 #CJK UNIFIED IDEOGRAPH
+ {0x829B, 0x5039}, //281 #CJK UNIFIED IDEOGRAPH
+ {0x829C, 0x503B}, //282 #CJK UNIFIED IDEOGRAPH
+ {0x829D, 0x503D}, //283 #CJK UNIFIED IDEOGRAPH
+ {0x829E, 0x503F}, //284 #CJK UNIFIED IDEOGRAPH
+ {0x829F, 0x5040}, //285 #CJK UNIFIED IDEOGRAPH
+ {0x82A0, 0x5041}, //286 #CJK UNIFIED IDEOGRAPH
+ {0x82A1, 0x5042}, //287 #CJK UNIFIED IDEOGRAPH
+ {0x82A2, 0x5044}, //288 #CJK UNIFIED IDEOGRAPH
+ {0x82A3, 0x5045}, //289 #CJK UNIFIED IDEOGRAPH
+ {0x82A4, 0x5046}, //290 #CJK UNIFIED IDEOGRAPH
+ {0x82A5, 0x5049}, //291 #CJK UNIFIED IDEOGRAPH
+ {0x82A6, 0x504A}, //292 #CJK UNIFIED IDEOGRAPH
+ {0x82A7, 0x504B}, //293 #CJK UNIFIED IDEOGRAPH
+ {0x82A8, 0x504D}, //294 #CJK UNIFIED IDEOGRAPH
+ {0x82A9, 0x5050}, //295 #CJK UNIFIED IDEOGRAPH
+ {0x82AA, 0x5051}, //296 #CJK UNIFIED IDEOGRAPH
+ {0x82AB, 0x5052}, //297 #CJK UNIFIED IDEOGRAPH
+ {0x82AC, 0x5053}, //298 #CJK UNIFIED IDEOGRAPH
+ {0x82AD, 0x5054}, //299 #CJK UNIFIED IDEOGRAPH
+ {0x82AE, 0x5056}, //300 #CJK UNIFIED IDEOGRAPH
+ {0x82AF, 0x5057}, //301 #CJK UNIFIED IDEOGRAPH
+ {0x82B0, 0x5058}, //302 #CJK UNIFIED IDEOGRAPH
+ {0x82B1, 0x5059}, //303 #CJK UNIFIED IDEOGRAPH
+ {0x82B2, 0x505B}, //304 #CJK UNIFIED IDEOGRAPH
+ {0x82B3, 0x505D}, //305 #CJK UNIFIED IDEOGRAPH
+ {0x82B4, 0x505E}, //306 #CJK UNIFIED IDEOGRAPH
+ {0x82B5, 0x505F}, //307 #CJK UNIFIED IDEOGRAPH
+ {0x82B6, 0x5060}, //308 #CJK UNIFIED IDEOGRAPH
+ {0x82B7, 0x5061}, //309 #CJK UNIFIED IDEOGRAPH
+ {0x82B8, 0x5062}, //310 #CJK UNIFIED IDEOGRAPH
+ {0x82B9, 0x5063}, //311 #CJK UNIFIED IDEOGRAPH
+ {0x82BA, 0x5064}, //312 #CJK UNIFIED IDEOGRAPH
+ {0x82BB, 0x5066}, //313 #CJK UNIFIED IDEOGRAPH
+ {0x82BC, 0x5067}, //314 #CJK UNIFIED IDEOGRAPH
+ {0x82BD, 0x5068}, //315 #CJK UNIFIED IDEOGRAPH
+ {0x82BE, 0x5069}, //316 #CJK UNIFIED IDEOGRAPH
+ {0x82BF, 0x506A}, //317 #CJK UNIFIED IDEOGRAPH
+ {0x82C0, 0x506B}, //318 #CJK UNIFIED IDEOGRAPH
+ {0x82C1, 0x506D}, //319 #CJK UNIFIED IDEOGRAPH
+ {0x82C2, 0x506E}, //320 #CJK UNIFIED IDEOGRAPH
+ {0x82C3, 0x506F}, //321 #CJK UNIFIED IDEOGRAPH
+ {0x82C4, 0x5070}, //322 #CJK UNIFIED IDEOGRAPH
+ {0x82C5, 0x5071}, //323 #CJK UNIFIED IDEOGRAPH
+ {0x82C6, 0x5072}, //324 #CJK UNIFIED IDEOGRAPH
+ {0x82C7, 0x5073}, //325 #CJK UNIFIED IDEOGRAPH
+ {0x82C8, 0x5074}, //326 #CJK UNIFIED IDEOGRAPH
+ {0x82C9, 0x5075}, //327 #CJK UNIFIED IDEOGRAPH
+ {0x82CA, 0x5078}, //328 #CJK UNIFIED IDEOGRAPH
+ {0x82CB, 0x5079}, //329 #CJK UNIFIED IDEOGRAPH
+ {0x82CC, 0x507A}, //330 #CJK UNIFIED IDEOGRAPH
+ {0x82CD, 0x507C}, //331 #CJK UNIFIED IDEOGRAPH
+ {0x82CE, 0x507D}, //332 #CJK UNIFIED IDEOGRAPH
+ {0x82CF, 0x5081}, //333 #CJK UNIFIED IDEOGRAPH
+ {0x82D0, 0x5082}, //334 #CJK UNIFIED IDEOGRAPH
+ {0x82D1, 0x5083}, //335 #CJK UNIFIED IDEOGRAPH
+ {0x82D2, 0x5084}, //336 #CJK UNIFIED IDEOGRAPH
+ {0x82D3, 0x5086}, //337 #CJK UNIFIED IDEOGRAPH
+ {0x82D4, 0x5087}, //338 #CJK UNIFIED IDEOGRAPH
+ {0x82D5, 0x5089}, //339 #CJK UNIFIED IDEOGRAPH
+ {0x82D6, 0x508A}, //340 #CJK UNIFIED IDEOGRAPH
+ {0x82D7, 0x508B}, //341 #CJK UNIFIED IDEOGRAPH
+ {0x82D8, 0x508C}, //342 #CJK UNIFIED IDEOGRAPH
+ {0x82D9, 0x508E}, //343 #CJK UNIFIED IDEOGRAPH
+ {0x82DA, 0x508F}, //344 #CJK UNIFIED IDEOGRAPH
+ {0x82DB, 0x5090}, //345 #CJK UNIFIED IDEOGRAPH
+ {0x82DC, 0x5091}, //346 #CJK UNIFIED IDEOGRAPH
+ {0x82DD, 0x5092}, //347 #CJK UNIFIED IDEOGRAPH
+ {0x82DE, 0x5093}, //348 #CJK UNIFIED IDEOGRAPH
+ {0x82DF, 0x5094}, //349 #CJK UNIFIED IDEOGRAPH
+ {0x82E0, 0x5095}, //350 #CJK UNIFIED IDEOGRAPH
+ {0x82E1, 0x5096}, //351 #CJK UNIFIED IDEOGRAPH
+ {0x82E2, 0x5097}, //352 #CJK UNIFIED IDEOGRAPH
+ {0x82E3, 0x5098}, //353 #CJK UNIFIED IDEOGRAPH
+ {0x82E4, 0x5099}, //354 #CJK UNIFIED IDEOGRAPH
+ {0x82E5, 0x509A}, //355 #CJK UNIFIED IDEOGRAPH
+ {0x82E6, 0x509B}, //356 #CJK UNIFIED IDEOGRAPH
+ {0x82E7, 0x509C}, //357 #CJK UNIFIED IDEOGRAPH
+ {0x82E8, 0x509D}, //358 #CJK UNIFIED IDEOGRAPH
+ {0x82E9, 0x509E}, //359 #CJK UNIFIED IDEOGRAPH
+ {0x82EA, 0x509F}, //360 #CJK UNIFIED IDEOGRAPH
+ {0x82EB, 0x50A0}, //361 #CJK UNIFIED IDEOGRAPH
+ {0x82EC, 0x50A1}, //362 #CJK UNIFIED IDEOGRAPH
+ {0x82ED, 0x50A2}, //363 #CJK UNIFIED IDEOGRAPH
+ {0x82EE, 0x50A4}, //364 #CJK UNIFIED IDEOGRAPH
+ {0x82EF, 0x50A6}, //365 #CJK UNIFIED IDEOGRAPH
+ {0x82F0, 0x50AA}, //366 #CJK UNIFIED IDEOGRAPH
+ {0x82F1, 0x50AB}, //367 #CJK UNIFIED IDEOGRAPH
+ {0x82F2, 0x50AD}, //368 #CJK UNIFIED IDEOGRAPH
+ {0x82F3, 0x50AE}, //369 #CJK UNIFIED IDEOGRAPH
+ {0x82F4, 0x50AF}, //370 #CJK UNIFIED IDEOGRAPH
+ {0x82F5, 0x50B0}, //371 #CJK UNIFIED IDEOGRAPH
+ {0x82F6, 0x50B1}, //372 #CJK UNIFIED IDEOGRAPH
+ {0x82F7, 0x50B3}, //373 #CJK UNIFIED IDEOGRAPH
+ {0x82F8, 0x50B4}, //374 #CJK UNIFIED IDEOGRAPH
+ {0x82F9, 0x50B5}, //375 #CJK UNIFIED IDEOGRAPH
+ {0x82FA, 0x50B6}, //376 #CJK UNIFIED IDEOGRAPH
+ {0x82FB, 0x50B7}, //377 #CJK UNIFIED IDEOGRAPH
+ {0x82FC, 0x50B8}, //378 #CJK UNIFIED IDEOGRAPH
+ {0x82FD, 0x50B9}, //379 #CJK UNIFIED IDEOGRAPH
+ {0x82FE, 0x50BC}, //380 #CJK UNIFIED IDEOGRAPH
+ {0x8340, 0x50BD}, //381 #CJK UNIFIED IDEOGRAPH
+ {0x8341, 0x50BE}, //382 #CJK UNIFIED IDEOGRAPH
+ {0x8342, 0x50BF}, //383 #CJK UNIFIED IDEOGRAPH
+ {0x8343, 0x50C0}, //384 #CJK UNIFIED IDEOGRAPH
+ {0x8344, 0x50C1}, //385 #CJK UNIFIED IDEOGRAPH
+ {0x8345, 0x50C2}, //386 #CJK UNIFIED IDEOGRAPH
+ {0x8346, 0x50C3}, //387 #CJK UNIFIED IDEOGRAPH
+ {0x8347, 0x50C4}, //388 #CJK UNIFIED IDEOGRAPH
+ {0x8348, 0x50C5}, //389 #CJK UNIFIED IDEOGRAPH
+ {0x8349, 0x50C6}, //390 #CJK UNIFIED IDEOGRAPH
+ {0x834A, 0x50C7}, //391 #CJK UNIFIED IDEOGRAPH
+ {0x834B, 0x50C8}, //392 #CJK UNIFIED IDEOGRAPH
+ {0x834C, 0x50C9}, //393 #CJK UNIFIED IDEOGRAPH
+ {0x834D, 0x50CA}, //394 #CJK UNIFIED IDEOGRAPH
+ {0x834E, 0x50CB}, //395 #CJK UNIFIED IDEOGRAPH
+ {0x834F, 0x50CC}, //396 #CJK UNIFIED IDEOGRAPH
+ {0x8350, 0x50CD}, //397 #CJK UNIFIED IDEOGRAPH
+ {0x8351, 0x50CE}, //398 #CJK UNIFIED IDEOGRAPH
+ {0x8352, 0x50D0}, //399 #CJK UNIFIED IDEOGRAPH
+ {0x8353, 0x50D1}, //400 #CJK UNIFIED IDEOGRAPH
+ {0x8354, 0x50D2}, //401 #CJK UNIFIED IDEOGRAPH
+ {0x8355, 0x50D3}, //402 #CJK UNIFIED IDEOGRAPH
+ {0x8356, 0x50D4}, //403 #CJK UNIFIED IDEOGRAPH
+ {0x8357, 0x50D5}, //404 #CJK UNIFIED IDEOGRAPH
+ {0x8358, 0x50D7}, //405 #CJK UNIFIED IDEOGRAPH
+ {0x8359, 0x50D8}, //406 #CJK UNIFIED IDEOGRAPH
+ {0x835A, 0x50D9}, //407 #CJK UNIFIED IDEOGRAPH
+ {0x835B, 0x50DB}, //408 #CJK UNIFIED IDEOGRAPH
+ {0x835C, 0x50DC}, //409 #CJK UNIFIED IDEOGRAPH
+ {0x835D, 0x50DD}, //410 #CJK UNIFIED IDEOGRAPH
+ {0x835E, 0x50DE}, //411 #CJK UNIFIED IDEOGRAPH
+ {0x835F, 0x50DF}, //412 #CJK UNIFIED IDEOGRAPH
+ {0x8360, 0x50E0}, //413 #CJK UNIFIED IDEOGRAPH
+ {0x8361, 0x50E1}, //414 #CJK UNIFIED IDEOGRAPH
+ {0x8362, 0x50E2}, //415 #CJK UNIFIED IDEOGRAPH
+ {0x8363, 0x50E3}, //416 #CJK UNIFIED IDEOGRAPH
+ {0x8364, 0x50E4}, //417 #CJK UNIFIED IDEOGRAPH
+ {0x8365, 0x50E5}, //418 #CJK UNIFIED IDEOGRAPH
+ {0x8366, 0x50E8}, //419 #CJK UNIFIED IDEOGRAPH
+ {0x8367, 0x50E9}, //420 #CJK UNIFIED IDEOGRAPH
+ {0x8368, 0x50EA}, //421 #CJK UNIFIED IDEOGRAPH
+ {0x8369, 0x50EB}, //422 #CJK UNIFIED IDEOGRAPH
+ {0x836A, 0x50EF}, //423 #CJK UNIFIED IDEOGRAPH
+ {0x836B, 0x50F0}, //424 #CJK UNIFIED IDEOGRAPH
+ {0x836C, 0x50F1}, //425 #CJK UNIFIED IDEOGRAPH
+ {0x836D, 0x50F2}, //426 #CJK UNIFIED IDEOGRAPH
+ {0x836E, 0x50F4}, //427 #CJK UNIFIED IDEOGRAPH
+ {0x836F, 0x50F6}, //428 #CJK UNIFIED IDEOGRAPH
+ {0x8370, 0x50F7}, //429 #CJK UNIFIED IDEOGRAPH
+ {0x8371, 0x50F8}, //430 #CJK UNIFIED IDEOGRAPH
+ {0x8372, 0x50F9}, //431 #CJK UNIFIED IDEOGRAPH
+ {0x8373, 0x50FA}, //432 #CJK UNIFIED IDEOGRAPH
+ {0x8374, 0x50FC}, //433 #CJK UNIFIED IDEOGRAPH
+ {0x8375, 0x50FD}, //434 #CJK UNIFIED IDEOGRAPH
+ {0x8376, 0x50FE}, //435 #CJK UNIFIED IDEOGRAPH
+ {0x8377, 0x50FF}, //436 #CJK UNIFIED IDEOGRAPH
+ {0x8378, 0x5100}, //437 #CJK UNIFIED IDEOGRAPH
+ {0x8379, 0x5101}, //438 #CJK UNIFIED IDEOGRAPH
+ {0x837A, 0x5102}, //439 #CJK UNIFIED IDEOGRAPH
+ {0x837B, 0x5103}, //440 #CJK UNIFIED IDEOGRAPH
+ {0x837C, 0x5104}, //441 #CJK UNIFIED IDEOGRAPH
+ {0x837D, 0x5105}, //442 #CJK UNIFIED IDEOGRAPH
+ {0x837E, 0x5108}, //443 #CJK UNIFIED IDEOGRAPH
+ {0x8380, 0x5109}, //444 #CJK UNIFIED IDEOGRAPH
+ {0x8381, 0x510A}, //445 #CJK UNIFIED IDEOGRAPH
+ {0x8382, 0x510C}, //446 #CJK UNIFIED IDEOGRAPH
+ {0x8383, 0x510D}, //447 #CJK UNIFIED IDEOGRAPH
+ {0x8384, 0x510E}, //448 #CJK UNIFIED IDEOGRAPH
+ {0x8385, 0x510F}, //449 #CJK UNIFIED IDEOGRAPH
+ {0x8386, 0x5110}, //450 #CJK UNIFIED IDEOGRAPH
+ {0x8387, 0x5111}, //451 #CJK UNIFIED IDEOGRAPH
+ {0x8388, 0x5113}, //452 #CJK UNIFIED IDEOGRAPH
+ {0x8389, 0x5114}, //453 #CJK UNIFIED IDEOGRAPH
+ {0x838A, 0x5115}, //454 #CJK UNIFIED IDEOGRAPH
+ {0x838B, 0x5116}, //455 #CJK UNIFIED IDEOGRAPH
+ {0x838C, 0x5117}, //456 #CJK UNIFIED IDEOGRAPH
+ {0x838D, 0x5118}, //457 #CJK UNIFIED IDEOGRAPH
+ {0x838E, 0x5119}, //458 #CJK UNIFIED IDEOGRAPH
+ {0x838F, 0x511A}, //459 #CJK UNIFIED IDEOGRAPH
+ {0x8390, 0x511B}, //460 #CJK UNIFIED IDEOGRAPH
+ {0x8391, 0x511C}, //461 #CJK UNIFIED IDEOGRAPH
+ {0x8392, 0x511D}, //462 #CJK UNIFIED IDEOGRAPH
+ {0x8393, 0x511E}, //463 #CJK UNIFIED IDEOGRAPH
+ {0x8394, 0x511F}, //464 #CJK UNIFIED IDEOGRAPH
+ {0x8395, 0x5120}, //465 #CJK UNIFIED IDEOGRAPH
+ {0x8396, 0x5122}, //466 #CJK UNIFIED IDEOGRAPH
+ {0x8397, 0x5123}, //467 #CJK UNIFIED IDEOGRAPH
+ {0x8398, 0x5124}, //468 #CJK UNIFIED IDEOGRAPH
+ {0x8399, 0x5125}, //469 #CJK UNIFIED IDEOGRAPH
+ {0x839A, 0x5126}, //470 #CJK UNIFIED IDEOGRAPH
+ {0x839B, 0x5127}, //471 #CJK UNIFIED IDEOGRAPH
+ {0x839C, 0x5128}, //472 #CJK UNIFIED IDEOGRAPH
+ {0x839D, 0x5129}, //473 #CJK UNIFIED IDEOGRAPH
+ {0x839E, 0x512A}, //474 #CJK UNIFIED IDEOGRAPH
+ {0x839F, 0x512B}, //475 #CJK UNIFIED IDEOGRAPH
+ {0x83A0, 0x512C}, //476 #CJK UNIFIED IDEOGRAPH
+ {0x83A1, 0x512D}, //477 #CJK UNIFIED IDEOGRAPH
+ {0x83A2, 0x512E}, //478 #CJK UNIFIED IDEOGRAPH
+ {0x83A3, 0x512F}, //479 #CJK UNIFIED IDEOGRAPH
+ {0x83A4, 0x5130}, //480 #CJK UNIFIED IDEOGRAPH
+ {0x83A5, 0x5131}, //481 #CJK UNIFIED IDEOGRAPH
+ {0x83A6, 0x5132}, //482 #CJK UNIFIED IDEOGRAPH
+ {0x83A7, 0x5133}, //483 #CJK UNIFIED IDEOGRAPH
+ {0x83A8, 0x5134}, //484 #CJK UNIFIED IDEOGRAPH
+ {0x83A9, 0x5135}, //485 #CJK UNIFIED IDEOGRAPH
+ {0x83AA, 0x5136}, //486 #CJK UNIFIED IDEOGRAPH
+ {0x83AB, 0x5137}, //487 #CJK UNIFIED IDEOGRAPH
+ {0x83AC, 0x5138}, //488 #CJK UNIFIED IDEOGRAPH
+ {0x83AD, 0x5139}, //489 #CJK UNIFIED IDEOGRAPH
+ {0x83AE, 0x513A}, //490 #CJK UNIFIED IDEOGRAPH
+ {0x83AF, 0x513B}, //491 #CJK UNIFIED IDEOGRAPH
+ {0x83B0, 0x513C}, //492 #CJK UNIFIED IDEOGRAPH
+ {0x83B1, 0x513D}, //493 #CJK UNIFIED IDEOGRAPH
+ {0x83B2, 0x513E}, //494 #CJK UNIFIED IDEOGRAPH
+ {0x83B3, 0x5142}, //495 #CJK UNIFIED IDEOGRAPH
+ {0x83B4, 0x5147}, //496 #CJK UNIFIED IDEOGRAPH
+ {0x83B5, 0x514A}, //497 #CJK UNIFIED IDEOGRAPH
+ {0x83B6, 0x514C}, //498 #CJK UNIFIED IDEOGRAPH
+ {0x83B7, 0x514E}, //499 #CJK UNIFIED IDEOGRAPH
+ {0x83B8, 0x514F}, //500 #CJK UNIFIED IDEOGRAPH
+ {0x83B9, 0x5150}, //501 #CJK UNIFIED IDEOGRAPH
+ {0x83BA, 0x5152}, //502 #CJK UNIFIED IDEOGRAPH
+ {0x83BB, 0x5153}, //503 #CJK UNIFIED IDEOGRAPH
+ {0x83BC, 0x5157}, //504 #CJK UNIFIED IDEOGRAPH
+ {0x83BD, 0x5158}, //505 #CJK UNIFIED IDEOGRAPH
+ {0x83BE, 0x5159}, //506 #CJK UNIFIED IDEOGRAPH
+ {0x83BF, 0x515B}, //507 #CJK UNIFIED IDEOGRAPH
+ {0x83C0, 0x515D}, //508 #CJK UNIFIED IDEOGRAPH
+ {0x83C1, 0x515E}, //509 #CJK UNIFIED IDEOGRAPH
+ {0x83C2, 0x515F}, //510 #CJK UNIFIED IDEOGRAPH
+ {0x83C3, 0x5160}, //511 #CJK UNIFIED IDEOGRAPH
+ {0x83C4, 0x5161}, //512 #CJK UNIFIED IDEOGRAPH
+ {0x83C5, 0x5163}, //513 #CJK UNIFIED IDEOGRAPH
+ {0x83C6, 0x5164}, //514 #CJK UNIFIED IDEOGRAPH
+ {0x83C7, 0x5166}, //515 #CJK UNIFIED IDEOGRAPH
+ {0x83C8, 0x5167}, //516 #CJK UNIFIED IDEOGRAPH
+ {0x83C9, 0x5169}, //517 #CJK UNIFIED IDEOGRAPH
+ {0x83CA, 0x516A}, //518 #CJK UNIFIED IDEOGRAPH
+ {0x83CB, 0x516F}, //519 #CJK UNIFIED IDEOGRAPH
+ {0x83CC, 0x5172}, //520 #CJK UNIFIED IDEOGRAPH
+ {0x83CD, 0x517A}, //521 #CJK UNIFIED IDEOGRAPH
+ {0x83CE, 0x517E}, //522 #CJK UNIFIED IDEOGRAPH
+ {0x83CF, 0x517F}, //523 #CJK UNIFIED IDEOGRAPH
+ {0x83D0, 0x5183}, //524 #CJK UNIFIED IDEOGRAPH
+ {0x83D1, 0x5184}, //525 #CJK UNIFIED IDEOGRAPH
+ {0x83D2, 0x5186}, //526 #CJK UNIFIED IDEOGRAPH
+ {0x83D3, 0x5187}, //527 #CJK UNIFIED IDEOGRAPH
+ {0x83D4, 0x518A}, //528 #CJK UNIFIED IDEOGRAPH
+ {0x83D5, 0x518B}, //529 #CJK UNIFIED IDEOGRAPH
+ {0x83D6, 0x518E}, //530 #CJK UNIFIED IDEOGRAPH
+ {0x83D7, 0x518F}, //531 #CJK UNIFIED IDEOGRAPH
+ {0x83D8, 0x5190}, //532 #CJK UNIFIED IDEOGRAPH
+ {0x83D9, 0x5191}, //533 #CJK UNIFIED IDEOGRAPH
+ {0x83DA, 0x5193}, //534 #CJK UNIFIED IDEOGRAPH
+ {0x83DB, 0x5194}, //535 #CJK UNIFIED IDEOGRAPH
+ {0x83DC, 0x5198}, //536 #CJK UNIFIED IDEOGRAPH
+ {0x83DD, 0x519A}, //537 #CJK UNIFIED IDEOGRAPH
+ {0x83DE, 0x519D}, //538 #CJK UNIFIED IDEOGRAPH
+ {0x83DF, 0x519E}, //539 #CJK UNIFIED IDEOGRAPH
+ {0x83E0, 0x519F}, //540 #CJK UNIFIED IDEOGRAPH
+ {0x83E1, 0x51A1}, //541 #CJK UNIFIED IDEOGRAPH
+ {0x83E2, 0x51A3}, //542 #CJK UNIFIED IDEOGRAPH
+ {0x83E3, 0x51A6}, //543 #CJK UNIFIED IDEOGRAPH
+ {0x83E4, 0x51A7}, //544 #CJK UNIFIED IDEOGRAPH
+ {0x83E5, 0x51A8}, //545 #CJK UNIFIED IDEOGRAPH
+ {0x83E6, 0x51A9}, //546 #CJK UNIFIED IDEOGRAPH
+ {0x83E7, 0x51AA}, //547 #CJK UNIFIED IDEOGRAPH
+ {0x83E8, 0x51AD}, //548 #CJK UNIFIED IDEOGRAPH
+ {0x83E9, 0x51AE}, //549 #CJK UNIFIED IDEOGRAPH
+ {0x83EA, 0x51B4}, //550 #CJK UNIFIED IDEOGRAPH
+ {0x83EB, 0x51B8}, //551 #CJK UNIFIED IDEOGRAPH
+ {0x83EC, 0x51B9}, //552 #CJK UNIFIED IDEOGRAPH
+ {0x83ED, 0x51BA}, //553 #CJK UNIFIED IDEOGRAPH
+ {0x83EE, 0x51BE}, //554 #CJK UNIFIED IDEOGRAPH
+ {0x83EF, 0x51BF}, //555 #CJK UNIFIED IDEOGRAPH
+ {0x83F0, 0x51C1}, //556 #CJK UNIFIED IDEOGRAPH
+ {0x83F1, 0x51C2}, //557 #CJK UNIFIED IDEOGRAPH
+ {0x83F2, 0x51C3}, //558 #CJK UNIFIED IDEOGRAPH
+ {0x83F3, 0x51C5}, //559 #CJK UNIFIED IDEOGRAPH
+ {0x83F4, 0x51C8}, //560 #CJK UNIFIED IDEOGRAPH
+ {0x83F5, 0x51CA}, //561 #CJK UNIFIED IDEOGRAPH
+ {0x83F6, 0x51CD}, //562 #CJK UNIFIED IDEOGRAPH
+ {0x83F7, 0x51CE}, //563 #CJK UNIFIED IDEOGRAPH
+ {0x83F8, 0x51D0}, //564 #CJK UNIFIED IDEOGRAPH
+ {0x83F9, 0x51D2}, //565 #CJK UNIFIED IDEOGRAPH
+ {0x83FA, 0x51D3}, //566 #CJK UNIFIED IDEOGRAPH
+ {0x83FB, 0x51D4}, //567 #CJK UNIFIED IDEOGRAPH
+ {0x83FC, 0x51D5}, //568 #CJK UNIFIED IDEOGRAPH
+ {0x83FD, 0x51D6}, //569 #CJK UNIFIED IDEOGRAPH
+ {0x83FE, 0x51D7}, //570 #CJK UNIFIED IDEOGRAPH
+ {0x8440, 0x51D8}, //571 #CJK UNIFIED IDEOGRAPH
+ {0x8441, 0x51D9}, //572 #CJK UNIFIED IDEOGRAPH
+ {0x8442, 0x51DA}, //573 #CJK UNIFIED IDEOGRAPH
+ {0x8443, 0x51DC}, //574 #CJK UNIFIED IDEOGRAPH
+ {0x8444, 0x51DE}, //575 #CJK UNIFIED IDEOGRAPH
+ {0x8445, 0x51DF}, //576 #CJK UNIFIED IDEOGRAPH
+ {0x8446, 0x51E2}, //577 #CJK UNIFIED IDEOGRAPH
+ {0x8447, 0x51E3}, //578 #CJK UNIFIED IDEOGRAPH
+ {0x8448, 0x51E5}, //579 #CJK UNIFIED IDEOGRAPH
+ {0x8449, 0x51E6}, //580 #CJK UNIFIED IDEOGRAPH
+ {0x844A, 0x51E7}, //581 #CJK UNIFIED IDEOGRAPH
+ {0x844B, 0x51E8}, //582 #CJK UNIFIED IDEOGRAPH
+ {0x844C, 0x51E9}, //583 #CJK UNIFIED IDEOGRAPH
+ {0x844D, 0x51EA}, //584 #CJK UNIFIED IDEOGRAPH
+ {0x844E, 0x51EC}, //585 #CJK UNIFIED IDEOGRAPH
+ {0x844F, 0x51EE}, //586 #CJK UNIFIED IDEOGRAPH
+ {0x8450, 0x51F1}, //587 #CJK UNIFIED IDEOGRAPH
+ {0x8451, 0x51F2}, //588 #CJK UNIFIED IDEOGRAPH
+ {0x8452, 0x51F4}, //589 #CJK UNIFIED IDEOGRAPH
+ {0x8453, 0x51F7}, //590 #CJK UNIFIED IDEOGRAPH
+ {0x8454, 0x51FE}, //591 #CJK UNIFIED IDEOGRAPH
+ {0x8455, 0x5204}, //592 #CJK UNIFIED IDEOGRAPH
+ {0x8456, 0x5205}, //593 #CJK UNIFIED IDEOGRAPH
+ {0x8457, 0x5209}, //594 #CJK UNIFIED IDEOGRAPH
+ {0x8458, 0x520B}, //595 #CJK UNIFIED IDEOGRAPH
+ {0x8459, 0x520C}, //596 #CJK UNIFIED IDEOGRAPH
+ {0x845A, 0x520F}, //597 #CJK UNIFIED IDEOGRAPH
+ {0x845B, 0x5210}, //598 #CJK UNIFIED IDEOGRAPH
+ {0x845C, 0x5213}, //599 #CJK UNIFIED IDEOGRAPH
+ {0x845D, 0x5214}, //600 #CJK UNIFIED IDEOGRAPH
+ {0x845E, 0x5215}, //601 #CJK UNIFIED IDEOGRAPH
+ {0x845F, 0x521C}, //602 #CJK UNIFIED IDEOGRAPH
+ {0x8460, 0x521E}, //603 #CJK UNIFIED IDEOGRAPH
+ {0x8461, 0x521F}, //604 #CJK UNIFIED IDEOGRAPH
+ {0x8462, 0x5221}, //605 #CJK UNIFIED IDEOGRAPH
+ {0x8463, 0x5222}, //606 #CJK UNIFIED IDEOGRAPH
+ {0x8464, 0x5223}, //607 #CJK UNIFIED IDEOGRAPH
+ {0x8465, 0x5225}, //608 #CJK UNIFIED IDEOGRAPH
+ {0x8466, 0x5226}, //609 #CJK UNIFIED IDEOGRAPH
+ {0x8467, 0x5227}, //610 #CJK UNIFIED IDEOGRAPH
+ {0x8468, 0x522A}, //611 #CJK UNIFIED IDEOGRAPH
+ {0x8469, 0x522C}, //612 #CJK UNIFIED IDEOGRAPH
+ {0x846A, 0x522F}, //613 #CJK UNIFIED IDEOGRAPH
+ {0x846B, 0x5231}, //614 #CJK UNIFIED IDEOGRAPH
+ {0x846C, 0x5232}, //615 #CJK UNIFIED IDEOGRAPH
+ {0x846D, 0x5234}, //616 #CJK UNIFIED IDEOGRAPH
+ {0x846E, 0x5235}, //617 #CJK UNIFIED IDEOGRAPH
+ {0x846F, 0x523C}, //618 #CJK UNIFIED IDEOGRAPH
+ {0x8470, 0x523E}, //619 #CJK UNIFIED IDEOGRAPH
+ {0x8471, 0x5244}, //620 #CJK UNIFIED IDEOGRAPH
+ {0x8472, 0x5245}, //621 #CJK UNIFIED IDEOGRAPH
+ {0x8473, 0x5246}, //622 #CJK UNIFIED IDEOGRAPH
+ {0x8474, 0x5247}, //623 #CJK UNIFIED IDEOGRAPH
+ {0x8475, 0x5248}, //624 #CJK UNIFIED IDEOGRAPH
+ {0x8476, 0x5249}, //625 #CJK UNIFIED IDEOGRAPH
+ {0x8477, 0x524B}, //626 #CJK UNIFIED IDEOGRAPH
+ {0x8478, 0x524E}, //627 #CJK UNIFIED IDEOGRAPH
+ {0x8479, 0x524F}, //628 #CJK UNIFIED IDEOGRAPH
+ {0x847A, 0x5252}, //629 #CJK UNIFIED IDEOGRAPH
+ {0x847B, 0x5253}, //630 #CJK UNIFIED IDEOGRAPH
+ {0x847C, 0x5255}, //631 #CJK UNIFIED IDEOGRAPH
+ {0x847D, 0x5257}, //632 #CJK UNIFIED IDEOGRAPH
+ {0x847E, 0x5258}, //633 #CJK UNIFIED IDEOGRAPH
+ {0x8480, 0x5259}, //634 #CJK UNIFIED IDEOGRAPH
+ {0x8481, 0x525A}, //635 #CJK UNIFIED IDEOGRAPH
+ {0x8482, 0x525B}, //636 #CJK UNIFIED IDEOGRAPH
+ {0x8483, 0x525D}, //637 #CJK UNIFIED IDEOGRAPH
+ {0x8484, 0x525F}, //638 #CJK UNIFIED IDEOGRAPH
+ {0x8485, 0x5260}, //639 #CJK UNIFIED IDEOGRAPH
+ {0x8486, 0x5262}, //640 #CJK UNIFIED IDEOGRAPH
+ {0x8487, 0x5263}, //641 #CJK UNIFIED IDEOGRAPH
+ {0x8488, 0x5264}, //642 #CJK UNIFIED IDEOGRAPH
+ {0x8489, 0x5266}, //643 #CJK UNIFIED IDEOGRAPH
+ {0x848A, 0x5268}, //644 #CJK UNIFIED IDEOGRAPH
+ {0x848B, 0x526B}, //645 #CJK UNIFIED IDEOGRAPH
+ {0x848C, 0x526C}, //646 #CJK UNIFIED IDEOGRAPH
+ {0x848D, 0x526D}, //647 #CJK UNIFIED IDEOGRAPH
+ {0x848E, 0x526E}, //648 #CJK UNIFIED IDEOGRAPH
+ {0x848F, 0x5270}, //649 #CJK UNIFIED IDEOGRAPH
+ {0x8490, 0x5271}, //650 #CJK UNIFIED IDEOGRAPH
+ {0x8491, 0x5273}, //651 #CJK UNIFIED IDEOGRAPH
+ {0x8492, 0x5274}, //652 #CJK UNIFIED IDEOGRAPH
+ {0x8493, 0x5275}, //653 #CJK UNIFIED IDEOGRAPH
+ {0x8494, 0x5276}, //654 #CJK UNIFIED IDEOGRAPH
+ {0x8495, 0x5277}, //655 #CJK UNIFIED IDEOGRAPH
+ {0x8496, 0x5278}, //656 #CJK UNIFIED IDEOGRAPH
+ {0x8497, 0x5279}, //657 #CJK UNIFIED IDEOGRAPH
+ {0x8498, 0x527A}, //658 #CJK UNIFIED IDEOGRAPH
+ {0x8499, 0x527B}, //659 #CJK UNIFIED IDEOGRAPH
+ {0x849A, 0x527C}, //660 #CJK UNIFIED IDEOGRAPH
+ {0x849B, 0x527E}, //661 #CJK UNIFIED IDEOGRAPH
+ {0x849C, 0x5280}, //662 #CJK UNIFIED IDEOGRAPH
+ {0x849D, 0x5283}, //663 #CJK UNIFIED IDEOGRAPH
+ {0x849E, 0x5284}, //664 #CJK UNIFIED IDEOGRAPH
+ {0x849F, 0x5285}, //665 #CJK UNIFIED IDEOGRAPH
+ {0x84A0, 0x5286}, //666 #CJK UNIFIED IDEOGRAPH
+ {0x84A1, 0x5287}, //667 #CJK UNIFIED IDEOGRAPH
+ {0x84A2, 0x5289}, //668 #CJK UNIFIED IDEOGRAPH
+ {0x84A3, 0x528A}, //669 #CJK UNIFIED IDEOGRAPH
+ {0x84A4, 0x528B}, //670 #CJK UNIFIED IDEOGRAPH
+ {0x84A5, 0x528C}, //671 #CJK UNIFIED IDEOGRAPH
+ {0x84A6, 0x528D}, //672 #CJK UNIFIED IDEOGRAPH
+ {0x84A7, 0x528E}, //673 #CJK UNIFIED IDEOGRAPH
+ {0x84A8, 0x528F}, //674 #CJK UNIFIED IDEOGRAPH
+ {0x84A9, 0x5291}, //675 #CJK UNIFIED IDEOGRAPH
+ {0x84AA, 0x5292}, //676 #CJK UNIFIED IDEOGRAPH
+ {0x84AB, 0x5294}, //677 #CJK UNIFIED IDEOGRAPH
+ {0x84AC, 0x5295}, //678 #CJK UNIFIED IDEOGRAPH
+ {0x84AD, 0x5296}, //679 #CJK UNIFIED IDEOGRAPH
+ {0x84AE, 0x5297}, //680 #CJK UNIFIED IDEOGRAPH
+ {0x84AF, 0x5298}, //681 #CJK UNIFIED IDEOGRAPH
+ {0x84B0, 0x5299}, //682 #CJK UNIFIED IDEOGRAPH
+ {0x84B1, 0x529A}, //683 #CJK UNIFIED IDEOGRAPH
+ {0x84B2, 0x529C}, //684 #CJK UNIFIED IDEOGRAPH
+ {0x84B3, 0x52A4}, //685 #CJK UNIFIED IDEOGRAPH
+ {0x84B4, 0x52A5}, //686 #CJK UNIFIED IDEOGRAPH
+ {0x84B5, 0x52A6}, //687 #CJK UNIFIED IDEOGRAPH
+ {0x84B6, 0x52A7}, //688 #CJK UNIFIED IDEOGRAPH
+ {0x84B7, 0x52AE}, //689 #CJK UNIFIED IDEOGRAPH
+ {0x84B8, 0x52AF}, //690 #CJK UNIFIED IDEOGRAPH
+ {0x84B9, 0x52B0}, //691 #CJK UNIFIED IDEOGRAPH
+ {0x84BA, 0x52B4}, //692 #CJK UNIFIED IDEOGRAPH
+ {0x84BB, 0x52B5}, //693 #CJK UNIFIED IDEOGRAPH
+ {0x84BC, 0x52B6}, //694 #CJK UNIFIED IDEOGRAPH
+ {0x84BD, 0x52B7}, //695 #CJK UNIFIED IDEOGRAPH
+ {0x84BE, 0x52B8}, //696 #CJK UNIFIED IDEOGRAPH
+ {0x84BF, 0x52B9}, //697 #CJK UNIFIED IDEOGRAPH
+ {0x84C0, 0x52BA}, //698 #CJK UNIFIED IDEOGRAPH
+ {0x84C1, 0x52BB}, //699 #CJK UNIFIED IDEOGRAPH
+ {0x84C2, 0x52BC}, //700 #CJK UNIFIED IDEOGRAPH
+ {0x84C3, 0x52BD}, //701 #CJK UNIFIED IDEOGRAPH
+ {0x84C4, 0x52C0}, //702 #CJK UNIFIED IDEOGRAPH
+ {0x84C5, 0x52C1}, //703 #CJK UNIFIED IDEOGRAPH
+ {0x84C6, 0x52C2}, //704 #CJK UNIFIED IDEOGRAPH
+ {0x84C7, 0x52C4}, //705 #CJK UNIFIED IDEOGRAPH
+ {0x84C8, 0x52C5}, //706 #CJK UNIFIED IDEOGRAPH
+ {0x84C9, 0x52C6}, //707 #CJK UNIFIED IDEOGRAPH
+ {0x84CA, 0x52C8}, //708 #CJK UNIFIED IDEOGRAPH
+ {0x84CB, 0x52CA}, //709 #CJK UNIFIED IDEOGRAPH
+ {0x84CC, 0x52CC}, //710 #CJK UNIFIED IDEOGRAPH
+ {0x84CD, 0x52CD}, //711 #CJK UNIFIED IDEOGRAPH
+ {0x84CE, 0x52CE}, //712 #CJK UNIFIED IDEOGRAPH
+ {0x84CF, 0x52CF}, //713 #CJK UNIFIED IDEOGRAPH
+ {0x84D0, 0x52D1}, //714 #CJK UNIFIED IDEOGRAPH
+ {0x84D1, 0x52D3}, //715 #CJK UNIFIED IDEOGRAPH
+ {0x84D2, 0x52D4}, //716 #CJK UNIFIED IDEOGRAPH
+ {0x84D3, 0x52D5}, //717 #CJK UNIFIED IDEOGRAPH
+ {0x84D4, 0x52D7}, //718 #CJK UNIFIED IDEOGRAPH
+ {0x84D5, 0x52D9}, //719 #CJK UNIFIED IDEOGRAPH
+ {0x84D6, 0x52DA}, //720 #CJK UNIFIED IDEOGRAPH
+ {0x84D7, 0x52DB}, //721 #CJK UNIFIED IDEOGRAPH
+ {0x84D8, 0x52DC}, //722 #CJK UNIFIED IDEOGRAPH
+ {0x84D9, 0x52DD}, //723 #CJK UNIFIED IDEOGRAPH
+ {0x84DA, 0x52DE}, //724 #CJK UNIFIED IDEOGRAPH
+ {0x84DB, 0x52E0}, //725 #CJK UNIFIED IDEOGRAPH
+ {0x84DC, 0x52E1}, //726 #CJK UNIFIED IDEOGRAPH
+ {0x84DD, 0x52E2}, //727 #CJK UNIFIED IDEOGRAPH
+ {0x84DE, 0x52E3}, //728 #CJK UNIFIED IDEOGRAPH
+ {0x84DF, 0x52E5}, //729 #CJK UNIFIED IDEOGRAPH
+ {0x84E0, 0x52E6}, //730 #CJK UNIFIED IDEOGRAPH
+ {0x84E1, 0x52E7}, //731 #CJK UNIFIED IDEOGRAPH
+ {0x84E2, 0x52E8}, //732 #CJK UNIFIED IDEOGRAPH
+ {0x84E3, 0x52E9}, //733 #CJK UNIFIED IDEOGRAPH
+ {0x84E4, 0x52EA}, //734 #CJK UNIFIED IDEOGRAPH
+ {0x84E5, 0x52EB}, //735 #CJK UNIFIED IDEOGRAPH
+ {0x84E6, 0x52EC}, //736 #CJK UNIFIED IDEOGRAPH
+ {0x84E7, 0x52ED}, //737 #CJK UNIFIED IDEOGRAPH
+ {0x84E8, 0x52EE}, //738 #CJK UNIFIED IDEOGRAPH
+ {0x84E9, 0x52EF}, //739 #CJK UNIFIED IDEOGRAPH
+ {0x84EA, 0x52F1}, //740 #CJK UNIFIED IDEOGRAPH
+ {0x84EB, 0x52F2}, //741 #CJK UNIFIED IDEOGRAPH
+ {0x84EC, 0x52F3}, //742 #CJK UNIFIED IDEOGRAPH
+ {0x84ED, 0x52F4}, //743 #CJK UNIFIED IDEOGRAPH
+ {0x84EE, 0x52F5}, //744 #CJK UNIFIED IDEOGRAPH
+ {0x84EF, 0x52F6}, //745 #CJK UNIFIED IDEOGRAPH
+ {0x84F0, 0x52F7}, //746 #CJK UNIFIED IDEOGRAPH
+ {0x84F1, 0x52F8}, //747 #CJK UNIFIED IDEOGRAPH
+ {0x84F2, 0x52FB}, //748 #CJK UNIFIED IDEOGRAPH
+ {0x84F3, 0x52FC}, //749 #CJK UNIFIED IDEOGRAPH
+ {0x84F4, 0x52FD}, //750 #CJK UNIFIED IDEOGRAPH
+ {0x84F5, 0x5301}, //751 #CJK UNIFIED IDEOGRAPH
+ {0x84F6, 0x5302}, //752 #CJK UNIFIED IDEOGRAPH
+ {0x84F7, 0x5303}, //753 #CJK UNIFIED IDEOGRAPH
+ {0x84F8, 0x5304}, //754 #CJK UNIFIED IDEOGRAPH
+ {0x84F9, 0x5307}, //755 #CJK UNIFIED IDEOGRAPH
+ {0x84FA, 0x5309}, //756 #CJK UNIFIED IDEOGRAPH
+ {0x84FB, 0x530A}, //757 #CJK UNIFIED IDEOGRAPH
+ {0x84FC, 0x530B}, //758 #CJK UNIFIED IDEOGRAPH
+ {0x84FD, 0x530C}, //759 #CJK UNIFIED IDEOGRAPH
+ {0x84FE, 0x530E}, //760 #CJK UNIFIED IDEOGRAPH
+ {0x8540, 0x5311}, //761 #CJK UNIFIED IDEOGRAPH
+ {0x8541, 0x5312}, //762 #CJK UNIFIED IDEOGRAPH
+ {0x8542, 0x5313}, //763 #CJK UNIFIED IDEOGRAPH
+ {0x8543, 0x5314}, //764 #CJK UNIFIED IDEOGRAPH
+ {0x8544, 0x5318}, //765 #CJK UNIFIED IDEOGRAPH
+ {0x8545, 0x531B}, //766 #CJK UNIFIED IDEOGRAPH
+ {0x8546, 0x531C}, //767 #CJK UNIFIED IDEOGRAPH
+ {0x8547, 0x531E}, //768 #CJK UNIFIED IDEOGRAPH
+ {0x8548, 0x531F}, //769 #CJK UNIFIED IDEOGRAPH
+ {0x8549, 0x5322}, //770 #CJK UNIFIED IDEOGRAPH
+ {0x854A, 0x5324}, //771 #CJK UNIFIED IDEOGRAPH
+ {0x854B, 0x5325}, //772 #CJK UNIFIED IDEOGRAPH
+ {0x854C, 0x5327}, //773 #CJK UNIFIED IDEOGRAPH
+ {0x854D, 0x5328}, //774 #CJK UNIFIED IDEOGRAPH
+ {0x854E, 0x5329}, //775 #CJK UNIFIED IDEOGRAPH
+ {0x854F, 0x532B}, //776 #CJK UNIFIED IDEOGRAPH
+ {0x8550, 0x532C}, //777 #CJK UNIFIED IDEOGRAPH
+ {0x8551, 0x532D}, //778 #CJK UNIFIED IDEOGRAPH
+ {0x8552, 0x532F}, //779 #CJK UNIFIED IDEOGRAPH
+ {0x8553, 0x5330}, //780 #CJK UNIFIED IDEOGRAPH
+ {0x8554, 0x5331}, //781 #CJK UNIFIED IDEOGRAPH
+ {0x8555, 0x5332}, //782 #CJK UNIFIED IDEOGRAPH
+ {0x8556, 0x5333}, //783 #CJK UNIFIED IDEOGRAPH
+ {0x8557, 0x5334}, //784 #CJK UNIFIED IDEOGRAPH
+ {0x8558, 0x5335}, //785 #CJK UNIFIED IDEOGRAPH
+ {0x8559, 0x5336}, //786 #CJK UNIFIED IDEOGRAPH
+ {0x855A, 0x5337}, //787 #CJK UNIFIED IDEOGRAPH
+ {0x855B, 0x5338}, //788 #CJK UNIFIED IDEOGRAPH
+ {0x855C, 0x533C}, //789 #CJK UNIFIED IDEOGRAPH
+ {0x855D, 0x533D}, //790 #CJK UNIFIED IDEOGRAPH
+ {0x855E, 0x5340}, //791 #CJK UNIFIED IDEOGRAPH
+ {0x855F, 0x5342}, //792 #CJK UNIFIED IDEOGRAPH
+ {0x8560, 0x5344}, //793 #CJK UNIFIED IDEOGRAPH
+ {0x8561, 0x5346}, //794 #CJK UNIFIED IDEOGRAPH
+ {0x8562, 0x534B}, //795 #CJK UNIFIED IDEOGRAPH
+ {0x8563, 0x534C}, //796 #CJK UNIFIED IDEOGRAPH
+ {0x8564, 0x534D}, //797 #CJK UNIFIED IDEOGRAPH
+ {0x8565, 0x5350}, //798 #CJK UNIFIED IDEOGRAPH
+ {0x8566, 0x5354}, //799 #CJK UNIFIED IDEOGRAPH
+ {0x8567, 0x5358}, //800 #CJK UNIFIED IDEOGRAPH
+ {0x8568, 0x5359}, //801 #CJK UNIFIED IDEOGRAPH
+ {0x8569, 0x535B}, //802 #CJK UNIFIED IDEOGRAPH
+ {0x856A, 0x535D}, //803 #CJK UNIFIED IDEOGRAPH
+ {0x856B, 0x5365}, //804 #CJK UNIFIED IDEOGRAPH
+ {0x856C, 0x5368}, //805 #CJK UNIFIED IDEOGRAPH
+ {0x856D, 0x536A}, //806 #CJK UNIFIED IDEOGRAPH
+ {0x856E, 0x536C}, //807 #CJK UNIFIED IDEOGRAPH
+ {0x856F, 0x536D}, //808 #CJK UNIFIED IDEOGRAPH
+ {0x8570, 0x5372}, //809 #CJK UNIFIED IDEOGRAPH
+ {0x8571, 0x5376}, //810 #CJK UNIFIED IDEOGRAPH
+ {0x8572, 0x5379}, //811 #CJK UNIFIED IDEOGRAPH
+ {0x8573, 0x537B}, //812 #CJK UNIFIED IDEOGRAPH
+ {0x8574, 0x537C}, //813 #CJK UNIFIED IDEOGRAPH
+ {0x8575, 0x537D}, //814 #CJK UNIFIED IDEOGRAPH
+ {0x8576, 0x537E}, //815 #CJK UNIFIED IDEOGRAPH
+ {0x8577, 0x5380}, //816 #CJK UNIFIED IDEOGRAPH
+ {0x8578, 0x5381}, //817 #CJK UNIFIED IDEOGRAPH
+ {0x8579, 0x5383}, //818 #CJK UNIFIED IDEOGRAPH
+ {0x857A, 0x5387}, //819 #CJK UNIFIED IDEOGRAPH
+ {0x857B, 0x5388}, //820 #CJK UNIFIED IDEOGRAPH
+ {0x857C, 0x538A}, //821 #CJK UNIFIED IDEOGRAPH
+ {0x857D, 0x538E}, //822 #CJK UNIFIED IDEOGRAPH
+ {0x857E, 0x538F}, //823 #CJK UNIFIED IDEOGRAPH
+ {0x8580, 0x5390}, //824 #CJK UNIFIED IDEOGRAPH
+ {0x8581, 0x5391}, //825 #CJK UNIFIED IDEOGRAPH
+ {0x8582, 0x5392}, //826 #CJK UNIFIED IDEOGRAPH
+ {0x8583, 0x5393}, //827 #CJK UNIFIED IDEOGRAPH
+ {0x8584, 0x5394}, //828 #CJK UNIFIED IDEOGRAPH
+ {0x8585, 0x5396}, //829 #CJK UNIFIED IDEOGRAPH
+ {0x8586, 0x5397}, //830 #CJK UNIFIED IDEOGRAPH
+ {0x8587, 0x5399}, //831 #CJK UNIFIED IDEOGRAPH
+ {0x8588, 0x539B}, //832 #CJK UNIFIED IDEOGRAPH
+ {0x8589, 0x539C}, //833 #CJK UNIFIED IDEOGRAPH
+ {0x858A, 0x539E}, //834 #CJK UNIFIED IDEOGRAPH
+ {0x858B, 0x53A0}, //835 #CJK UNIFIED IDEOGRAPH
+ {0x858C, 0x53A1}, //836 #CJK UNIFIED IDEOGRAPH
+ {0x858D, 0x53A4}, //837 #CJK UNIFIED IDEOGRAPH
+ {0x858E, 0x53A7}, //838 #CJK UNIFIED IDEOGRAPH
+ {0x858F, 0x53AA}, //839 #CJK UNIFIED IDEOGRAPH
+ {0x8590, 0x53AB}, //840 #CJK UNIFIED IDEOGRAPH
+ {0x8591, 0x53AC}, //841 #CJK UNIFIED IDEOGRAPH
+ {0x8592, 0x53AD}, //842 #CJK UNIFIED IDEOGRAPH
+ {0x8593, 0x53AF}, //843 #CJK UNIFIED IDEOGRAPH
+ {0x8594, 0x53B0}, //844 #CJK UNIFIED IDEOGRAPH
+ {0x8595, 0x53B1}, //845 #CJK UNIFIED IDEOGRAPH
+ {0x8596, 0x53B2}, //846 #CJK UNIFIED IDEOGRAPH
+ {0x8597, 0x53B3}, //847 #CJK UNIFIED IDEOGRAPH
+ {0x8598, 0x53B4}, //848 #CJK UNIFIED IDEOGRAPH
+ {0x8599, 0x53B5}, //849 #CJK UNIFIED IDEOGRAPH
+ {0x859A, 0x53B7}, //850 #CJK UNIFIED IDEOGRAPH
+ {0x859B, 0x53B8}, //851 #CJK UNIFIED IDEOGRAPH
+ {0x859C, 0x53B9}, //852 #CJK UNIFIED IDEOGRAPH
+ {0x859D, 0x53BA}, //853 #CJK UNIFIED IDEOGRAPH
+ {0x859E, 0x53BC}, //854 #CJK UNIFIED IDEOGRAPH
+ {0x859F, 0x53BD}, //855 #CJK UNIFIED IDEOGRAPH
+ {0x85A0, 0x53BE}, //856 #CJK UNIFIED IDEOGRAPH
+ {0x85A1, 0x53C0}, //857 #CJK UNIFIED IDEOGRAPH
+ {0x85A2, 0x53C3}, //858 #CJK UNIFIED IDEOGRAPH
+ {0x85A3, 0x53C4}, //859 #CJK UNIFIED IDEOGRAPH
+ {0x85A4, 0x53C5}, //860 #CJK UNIFIED IDEOGRAPH
+ {0x85A5, 0x53C6}, //861 #CJK UNIFIED IDEOGRAPH
+ {0x85A6, 0x53C7}, //862 #CJK UNIFIED IDEOGRAPH
+ {0x85A7, 0x53CE}, //863 #CJK UNIFIED IDEOGRAPH
+ {0x85A8, 0x53CF}, //864 #CJK UNIFIED IDEOGRAPH
+ {0x85A9, 0x53D0}, //865 #CJK UNIFIED IDEOGRAPH
+ {0x85AA, 0x53D2}, //866 #CJK UNIFIED IDEOGRAPH
+ {0x85AB, 0x53D3}, //867 #CJK UNIFIED IDEOGRAPH
+ {0x85AC, 0x53D5}, //868 #CJK UNIFIED IDEOGRAPH
+ {0x85AD, 0x53DA}, //869 #CJK UNIFIED IDEOGRAPH
+ {0x85AE, 0x53DC}, //870 #CJK UNIFIED IDEOGRAPH
+ {0x85AF, 0x53DD}, //871 #CJK UNIFIED IDEOGRAPH
+ {0x85B0, 0x53DE}, //872 #CJK UNIFIED IDEOGRAPH
+ {0x85B1, 0x53E1}, //873 #CJK UNIFIED IDEOGRAPH
+ {0x85B2, 0x53E2}, //874 #CJK UNIFIED IDEOGRAPH
+ {0x85B3, 0x53E7}, //875 #CJK UNIFIED IDEOGRAPH
+ {0x85B4, 0x53F4}, //876 #CJK UNIFIED IDEOGRAPH
+ {0x85B5, 0x53FA}, //877 #CJK UNIFIED IDEOGRAPH
+ {0x85B6, 0x53FE}, //878 #CJK UNIFIED IDEOGRAPH
+ {0x85B7, 0x53FF}, //879 #CJK UNIFIED IDEOGRAPH
+ {0x85B8, 0x5400}, //880 #CJK UNIFIED IDEOGRAPH
+ {0x85B9, 0x5402}, //881 #CJK UNIFIED IDEOGRAPH
+ {0x85BA, 0x5405}, //882 #CJK UNIFIED IDEOGRAPH
+ {0x85BB, 0x5407}, //883 #CJK UNIFIED IDEOGRAPH
+ {0x85BC, 0x540B}, //884 #CJK UNIFIED IDEOGRAPH
+ {0x85BD, 0x5414}, //885 #CJK UNIFIED IDEOGRAPH
+ {0x85BE, 0x5418}, //886 #CJK UNIFIED IDEOGRAPH
+ {0x85BF, 0x5419}, //887 #CJK UNIFIED IDEOGRAPH
+ {0x85C0, 0x541A}, //888 #CJK UNIFIED IDEOGRAPH
+ {0x85C1, 0x541C}, //889 #CJK UNIFIED IDEOGRAPH
+ {0x85C2, 0x5422}, //890 #CJK UNIFIED IDEOGRAPH
+ {0x85C3, 0x5424}, //891 #CJK UNIFIED IDEOGRAPH
+ {0x85C4, 0x5425}, //892 #CJK UNIFIED IDEOGRAPH
+ {0x85C5, 0x542A}, //893 #CJK UNIFIED IDEOGRAPH
+ {0x85C6, 0x5430}, //894 #CJK UNIFIED IDEOGRAPH
+ {0x85C7, 0x5433}, //895 #CJK UNIFIED IDEOGRAPH
+ {0x85C8, 0x5436}, //896 #CJK UNIFIED IDEOGRAPH
+ {0x85C9, 0x5437}, //897 #CJK UNIFIED IDEOGRAPH
+ {0x85CA, 0x543A}, //898 #CJK UNIFIED IDEOGRAPH
+ {0x85CB, 0x543D}, //899 #CJK UNIFIED IDEOGRAPH
+ {0x85CC, 0x543F}, //900 #CJK UNIFIED IDEOGRAPH
+ {0x85CD, 0x5441}, //901 #CJK UNIFIED IDEOGRAPH
+ {0x85CE, 0x5442}, //902 #CJK UNIFIED IDEOGRAPH
+ {0x85CF, 0x5444}, //903 #CJK UNIFIED IDEOGRAPH
+ {0x85D0, 0x5445}, //904 #CJK UNIFIED IDEOGRAPH
+ {0x85D1, 0x5447}, //905 #CJK UNIFIED IDEOGRAPH
+ {0x85D2, 0x5449}, //906 #CJK UNIFIED IDEOGRAPH
+ {0x85D3, 0x544C}, //907 #CJK UNIFIED IDEOGRAPH
+ {0x85D4, 0x544D}, //908 #CJK UNIFIED IDEOGRAPH
+ {0x85D5, 0x544E}, //909 #CJK UNIFIED IDEOGRAPH
+ {0x85D6, 0x544F}, //910 #CJK UNIFIED IDEOGRAPH
+ {0x85D7, 0x5451}, //911 #CJK UNIFIED IDEOGRAPH
+ {0x85D8, 0x545A}, //912 #CJK UNIFIED IDEOGRAPH
+ {0x85D9, 0x545D}, //913 #CJK UNIFIED IDEOGRAPH
+ {0x85DA, 0x545E}, //914 #CJK UNIFIED IDEOGRAPH
+ {0x85DB, 0x545F}, //915 #CJK UNIFIED IDEOGRAPH
+ {0x85DC, 0x5460}, //916 #CJK UNIFIED IDEOGRAPH
+ {0x85DD, 0x5461}, //917 #CJK UNIFIED IDEOGRAPH
+ {0x85DE, 0x5463}, //918 #CJK UNIFIED IDEOGRAPH
+ {0x85DF, 0x5465}, //919 #CJK UNIFIED IDEOGRAPH
+ {0x85E0, 0x5467}, //920 #CJK UNIFIED IDEOGRAPH
+ {0x85E1, 0x5469}, //921 #CJK UNIFIED IDEOGRAPH
+ {0x85E2, 0x546A}, //922 #CJK UNIFIED IDEOGRAPH
+ {0x85E3, 0x546B}, //923 #CJK UNIFIED IDEOGRAPH
+ {0x85E4, 0x546C}, //924 #CJK UNIFIED IDEOGRAPH
+ {0x85E5, 0x546D}, //925 #CJK UNIFIED IDEOGRAPH
+ {0x85E6, 0x546E}, //926 #CJK UNIFIED IDEOGRAPH
+ {0x85E7, 0x546F}, //927 #CJK UNIFIED IDEOGRAPH
+ {0x85E8, 0x5470}, //928 #CJK UNIFIED IDEOGRAPH
+ {0x85E9, 0x5474}, //929 #CJK UNIFIED IDEOGRAPH
+ {0x85EA, 0x5479}, //930 #CJK UNIFIED IDEOGRAPH
+ {0x85EB, 0x547A}, //931 #CJK UNIFIED IDEOGRAPH
+ {0x85EC, 0x547E}, //932 #CJK UNIFIED IDEOGRAPH
+ {0x85ED, 0x547F}, //933 #CJK UNIFIED IDEOGRAPH
+ {0x85EE, 0x5481}, //934 #CJK UNIFIED IDEOGRAPH
+ {0x85EF, 0x5483}, //935 #CJK UNIFIED IDEOGRAPH
+ {0x85F0, 0x5485}, //936 #CJK UNIFIED IDEOGRAPH
+ {0x85F1, 0x5487}, //937 #CJK UNIFIED IDEOGRAPH
+ {0x85F2, 0x5488}, //938 #CJK UNIFIED IDEOGRAPH
+ {0x85F3, 0x5489}, //939 #CJK UNIFIED IDEOGRAPH
+ {0x85F4, 0x548A}, //940 #CJK UNIFIED IDEOGRAPH
+ {0x85F5, 0x548D}, //941 #CJK UNIFIED IDEOGRAPH
+ {0x85F6, 0x5491}, //942 #CJK UNIFIED IDEOGRAPH
+ {0x85F7, 0x5493}, //943 #CJK UNIFIED IDEOGRAPH
+ {0x85F8, 0x5497}, //944 #CJK UNIFIED IDEOGRAPH
+ {0x85F9, 0x5498}, //945 #CJK UNIFIED IDEOGRAPH
+ {0x85FA, 0x549C}, //946 #CJK UNIFIED IDEOGRAPH
+ {0x85FB, 0x549E}, //947 #CJK UNIFIED IDEOGRAPH
+ {0x85FC, 0x549F}, //948 #CJK UNIFIED IDEOGRAPH
+ {0x85FD, 0x54A0}, //949 #CJK UNIFIED IDEOGRAPH
+ {0x85FE, 0x54A1}, //950 #CJK UNIFIED IDEOGRAPH
+ {0x8640, 0x54A2}, //951 #CJK UNIFIED IDEOGRAPH
+ {0x8641, 0x54A5}, //952 #CJK UNIFIED IDEOGRAPH
+ {0x8642, 0x54AE}, //953 #CJK UNIFIED IDEOGRAPH
+ {0x8643, 0x54B0}, //954 #CJK UNIFIED IDEOGRAPH
+ {0x8644, 0x54B2}, //955 #CJK UNIFIED IDEOGRAPH
+ {0x8645, 0x54B5}, //956 #CJK UNIFIED IDEOGRAPH
+ {0x8646, 0x54B6}, //957 #CJK UNIFIED IDEOGRAPH
+ {0x8647, 0x54B7}, //958 #CJK UNIFIED IDEOGRAPH
+ {0x8648, 0x54B9}, //959 #CJK UNIFIED IDEOGRAPH
+ {0x8649, 0x54BA}, //960 #CJK UNIFIED IDEOGRAPH
+ {0x864A, 0x54BC}, //961 #CJK UNIFIED IDEOGRAPH
+ {0x864B, 0x54BE}, //962 #CJK UNIFIED IDEOGRAPH
+ {0x864C, 0x54C3}, //963 #CJK UNIFIED IDEOGRAPH
+ {0x864D, 0x54C5}, //964 #CJK UNIFIED IDEOGRAPH
+ {0x864E, 0x54CA}, //965 #CJK UNIFIED IDEOGRAPH
+ {0x864F, 0x54CB}, //966 #CJK UNIFIED IDEOGRAPH
+ {0x8650, 0x54D6}, //967 #CJK UNIFIED IDEOGRAPH
+ {0x8651, 0x54D8}, //968 #CJK UNIFIED IDEOGRAPH
+ {0x8652, 0x54DB}, //969 #CJK UNIFIED IDEOGRAPH
+ {0x8653, 0x54E0}, //970 #CJK UNIFIED IDEOGRAPH
+ {0x8654, 0x54E1}, //971 #CJK UNIFIED IDEOGRAPH
+ {0x8655, 0x54E2}, //972 #CJK UNIFIED IDEOGRAPH
+ {0x8656, 0x54E3}, //973 #CJK UNIFIED IDEOGRAPH
+ {0x8657, 0x54E4}, //974 #CJK UNIFIED IDEOGRAPH
+ {0x8658, 0x54EB}, //975 #CJK UNIFIED IDEOGRAPH
+ {0x8659, 0x54EC}, //976 #CJK UNIFIED IDEOGRAPH
+ {0x865A, 0x54EF}, //977 #CJK UNIFIED IDEOGRAPH
+ {0x865B, 0x54F0}, //978 #CJK UNIFIED IDEOGRAPH
+ {0x865C, 0x54F1}, //979 #CJK UNIFIED IDEOGRAPH
+ {0x865D, 0x54F4}, //980 #CJK UNIFIED IDEOGRAPH
+ {0x865E, 0x54F5}, //981 #CJK UNIFIED IDEOGRAPH
+ {0x865F, 0x54F6}, //982 #CJK UNIFIED IDEOGRAPH
+ {0x8660, 0x54F7}, //983 #CJK UNIFIED IDEOGRAPH
+ {0x8661, 0x54F8}, //984 #CJK UNIFIED IDEOGRAPH
+ {0x8662, 0x54F9}, //985 #CJK UNIFIED IDEOGRAPH
+ {0x8663, 0x54FB}, //986 #CJK UNIFIED IDEOGRAPH
+ {0x8664, 0x54FE}, //987 #CJK UNIFIED IDEOGRAPH
+ {0x8665, 0x5500}, //988 #CJK UNIFIED IDEOGRAPH
+ {0x8666, 0x5502}, //989 #CJK UNIFIED IDEOGRAPH
+ {0x8667, 0x5503}, //990 #CJK UNIFIED IDEOGRAPH
+ {0x8668, 0x5504}, //991 #CJK UNIFIED IDEOGRAPH
+ {0x8669, 0x5505}, //992 #CJK UNIFIED IDEOGRAPH
+ {0x866A, 0x5508}, //993 #CJK UNIFIED IDEOGRAPH
+ {0x866B, 0x550A}, //994 #CJK UNIFIED IDEOGRAPH
+ {0x866C, 0x550B}, //995 #CJK UNIFIED IDEOGRAPH
+ {0x866D, 0x550C}, //996 #CJK UNIFIED IDEOGRAPH
+ {0x866E, 0x550D}, //997 #CJK UNIFIED IDEOGRAPH
+ {0x866F, 0x550E}, //998 #CJK UNIFIED IDEOGRAPH
+ {0x8670, 0x5512}, //999 #CJK UNIFIED IDEOGRAPH
+ {0x8671, 0x5513}, //1000 #CJK UNIFIED IDEOGRAPH
+ {0x8672, 0x5515}, //1001 #CJK UNIFIED IDEOGRAPH
+ {0x8673, 0x5516}, //1002 #CJK UNIFIED IDEOGRAPH
+ {0x8674, 0x5517}, //1003 #CJK UNIFIED IDEOGRAPH
+ {0x8675, 0x5518}, //1004 #CJK UNIFIED IDEOGRAPH
+ {0x8676, 0x5519}, //1005 #CJK UNIFIED IDEOGRAPH
+ {0x8677, 0x551A}, //1006 #CJK UNIFIED IDEOGRAPH
+ {0x8678, 0x551C}, //1007 #CJK UNIFIED IDEOGRAPH
+ {0x8679, 0x551D}, //1008 #CJK UNIFIED IDEOGRAPH
+ {0x867A, 0x551E}, //1009 #CJK UNIFIED IDEOGRAPH
+ {0x867B, 0x551F}, //1010 #CJK UNIFIED IDEOGRAPH
+ {0x867C, 0x5521}, //1011 #CJK UNIFIED IDEOGRAPH
+ {0x867D, 0x5525}, //1012 #CJK UNIFIED IDEOGRAPH
+ {0x867E, 0x5526}, //1013 #CJK UNIFIED IDEOGRAPH
+ {0x8680, 0x5528}, //1014 #CJK UNIFIED IDEOGRAPH
+ {0x8681, 0x5529}, //1015 #CJK UNIFIED IDEOGRAPH
+ {0x8682, 0x552B}, //1016 #CJK UNIFIED IDEOGRAPH
+ {0x8683, 0x552D}, //1017 #CJK UNIFIED IDEOGRAPH
+ {0x8684, 0x5532}, //1018 #CJK UNIFIED IDEOGRAPH
+ {0x8685, 0x5534}, //1019 #CJK UNIFIED IDEOGRAPH
+ {0x8686, 0x5535}, //1020 #CJK UNIFIED IDEOGRAPH
+ {0x8687, 0x5536}, //1021 #CJK UNIFIED IDEOGRAPH
+ {0x8688, 0x5538}, //1022 #CJK UNIFIED IDEOGRAPH
+ {0x8689, 0x5539}, //1023 #CJK UNIFIED IDEOGRAPH
+ {0x868A, 0x553A}, //1024 #CJK UNIFIED IDEOGRAPH
+ {0x868B, 0x553B}, //1025 #CJK UNIFIED IDEOGRAPH
+ {0x868C, 0x553D}, //1026 #CJK UNIFIED IDEOGRAPH
+ {0x868D, 0x5540}, //1027 #CJK UNIFIED IDEOGRAPH
+ {0x868E, 0x5542}, //1028 #CJK UNIFIED IDEOGRAPH
+ {0x868F, 0x5545}, //1029 #CJK UNIFIED IDEOGRAPH
+ {0x8690, 0x5547}, //1030 #CJK UNIFIED IDEOGRAPH
+ {0x8691, 0x5548}, //1031 #CJK UNIFIED IDEOGRAPH
+ {0x8692, 0x554B}, //1032 #CJK UNIFIED IDEOGRAPH
+ {0x8693, 0x554C}, //1033 #CJK UNIFIED IDEOGRAPH
+ {0x8694, 0x554D}, //1034 #CJK UNIFIED IDEOGRAPH
+ {0x8695, 0x554E}, //1035 #CJK UNIFIED IDEOGRAPH
+ {0x8696, 0x554F}, //1036 #CJK UNIFIED IDEOGRAPH
+ {0x8697, 0x5551}, //1037 #CJK UNIFIED IDEOGRAPH
+ {0x8698, 0x5552}, //1038 #CJK UNIFIED IDEOGRAPH
+ {0x8699, 0x5553}, //1039 #CJK UNIFIED IDEOGRAPH
+ {0x869A, 0x5554}, //1040 #CJK UNIFIED IDEOGRAPH
+ {0x869B, 0x5557}, //1041 #CJK UNIFIED IDEOGRAPH
+ {0x869C, 0x5558}, //1042 #CJK UNIFIED IDEOGRAPH
+ {0x869D, 0x5559}, //1043 #CJK UNIFIED IDEOGRAPH
+ {0x869E, 0x555A}, //1044 #CJK UNIFIED IDEOGRAPH
+ {0x869F, 0x555B}, //1045 #CJK UNIFIED IDEOGRAPH
+ {0x86A0, 0x555D}, //1046 #CJK UNIFIED IDEOGRAPH
+ {0x86A1, 0x555E}, //1047 #CJK UNIFIED IDEOGRAPH
+ {0x86A2, 0x555F}, //1048 #CJK UNIFIED IDEOGRAPH
+ {0x86A3, 0x5560}, //1049 #CJK UNIFIED IDEOGRAPH
+ {0x86A4, 0x5562}, //1050 #CJK UNIFIED IDEOGRAPH
+ {0x86A5, 0x5563}, //1051 #CJK UNIFIED IDEOGRAPH
+ {0x86A6, 0x5568}, //1052 #CJK UNIFIED IDEOGRAPH
+ {0x86A7, 0x5569}, //1053 #CJK UNIFIED IDEOGRAPH
+ {0x86A8, 0x556B}, //1054 #CJK UNIFIED IDEOGRAPH
+ {0x86A9, 0x556F}, //1055 #CJK UNIFIED IDEOGRAPH
+ {0x86AA, 0x5570}, //1056 #CJK UNIFIED IDEOGRAPH
+ {0x86AB, 0x5571}, //1057 #CJK UNIFIED IDEOGRAPH
+ {0x86AC, 0x5572}, //1058 #CJK UNIFIED IDEOGRAPH
+ {0x86AD, 0x5573}, //1059 #CJK UNIFIED IDEOGRAPH
+ {0x86AE, 0x5574}, //1060 #CJK UNIFIED IDEOGRAPH
+ {0x86AF, 0x5579}, //1061 #CJK UNIFIED IDEOGRAPH
+ {0x86B0, 0x557A}, //1062 #CJK UNIFIED IDEOGRAPH
+ {0x86B1, 0x557D}, //1063 #CJK UNIFIED IDEOGRAPH
+ {0x86B2, 0x557F}, //1064 #CJK UNIFIED IDEOGRAPH
+ {0x86B3, 0x5585}, //1065 #CJK UNIFIED IDEOGRAPH
+ {0x86B4, 0x5586}, //1066 #CJK UNIFIED IDEOGRAPH
+ {0x86B5, 0x558C}, //1067 #CJK UNIFIED IDEOGRAPH
+ {0x86B6, 0x558D}, //1068 #CJK UNIFIED IDEOGRAPH
+ {0x86B7, 0x558E}, //1069 #CJK UNIFIED IDEOGRAPH
+ {0x86B8, 0x5590}, //1070 #CJK UNIFIED IDEOGRAPH
+ {0x86B9, 0x5592}, //1071 #CJK UNIFIED IDEOGRAPH
+ {0x86BA, 0x5593}, //1072 #CJK UNIFIED IDEOGRAPH
+ {0x86BB, 0x5595}, //1073 #CJK UNIFIED IDEOGRAPH
+ {0x86BC, 0x5596}, //1074 #CJK UNIFIED IDEOGRAPH
+ {0x86BD, 0x5597}, //1075 #CJK UNIFIED IDEOGRAPH
+ {0x86BE, 0x559A}, //1076 #CJK UNIFIED IDEOGRAPH
+ {0x86BF, 0x559B}, //1077 #CJK UNIFIED IDEOGRAPH
+ {0x86C0, 0x559E}, //1078 #CJK UNIFIED IDEOGRAPH
+ {0x86C1, 0x55A0}, //1079 #CJK UNIFIED IDEOGRAPH
+ {0x86C2, 0x55A1}, //1080 #CJK UNIFIED IDEOGRAPH
+ {0x86C3, 0x55A2}, //1081 #CJK UNIFIED IDEOGRAPH
+ {0x86C4, 0x55A3}, //1082 #CJK UNIFIED IDEOGRAPH
+ {0x86C5, 0x55A4}, //1083 #CJK UNIFIED IDEOGRAPH
+ {0x86C6, 0x55A5}, //1084 #CJK UNIFIED IDEOGRAPH
+ {0x86C7, 0x55A6}, //1085 #CJK UNIFIED IDEOGRAPH
+ {0x86C8, 0x55A8}, //1086 #CJK UNIFIED IDEOGRAPH
+ {0x86C9, 0x55A9}, //1087 #CJK UNIFIED IDEOGRAPH
+ {0x86CA, 0x55AA}, //1088 #CJK UNIFIED IDEOGRAPH
+ {0x86CB, 0x55AB}, //1089 #CJK UNIFIED IDEOGRAPH
+ {0x86CC, 0x55AC}, //1090 #CJK UNIFIED IDEOGRAPH
+ {0x86CD, 0x55AD}, //1091 #CJK UNIFIED IDEOGRAPH
+ {0x86CE, 0x55AE}, //1092 #CJK UNIFIED IDEOGRAPH
+ {0x86CF, 0x55AF}, //1093 #CJK UNIFIED IDEOGRAPH
+ {0x86D0, 0x55B0}, //1094 #CJK UNIFIED IDEOGRAPH
+ {0x86D1, 0x55B2}, //1095 #CJK UNIFIED IDEOGRAPH
+ {0x86D2, 0x55B4}, //1096 #CJK UNIFIED IDEOGRAPH
+ {0x86D3, 0x55B6}, //1097 #CJK UNIFIED IDEOGRAPH
+ {0x86D4, 0x55B8}, //1098 #CJK UNIFIED IDEOGRAPH
+ {0x86D5, 0x55BA}, //1099 #CJK UNIFIED IDEOGRAPH
+ {0x86D6, 0x55BC}, //1100 #CJK UNIFIED IDEOGRAPH
+ {0x86D7, 0x55BF}, //1101 #CJK UNIFIED IDEOGRAPH
+ {0x86D8, 0x55C0}, //1102 #CJK UNIFIED IDEOGRAPH
+ {0x86D9, 0x55C1}, //1103 #CJK UNIFIED IDEOGRAPH
+ {0x86DA, 0x55C2}, //1104 #CJK UNIFIED IDEOGRAPH
+ {0x86DB, 0x55C3}, //1105 #CJK UNIFIED IDEOGRAPH
+ {0x86DC, 0x55C6}, //1106 #CJK UNIFIED IDEOGRAPH
+ {0x86DD, 0x55C7}, //1107 #CJK UNIFIED IDEOGRAPH
+ {0x86DE, 0x55C8}, //1108 #CJK UNIFIED IDEOGRAPH
+ {0x86DF, 0x55CA}, //1109 #CJK UNIFIED IDEOGRAPH
+ {0x86E0, 0x55CB}, //1110 #CJK UNIFIED IDEOGRAPH
+ {0x86E1, 0x55CE}, //1111 #CJK UNIFIED IDEOGRAPH
+ {0x86E2, 0x55CF}, //1112 #CJK UNIFIED IDEOGRAPH
+ {0x86E3, 0x55D0}, //1113 #CJK UNIFIED IDEOGRAPH
+ {0x86E4, 0x55D5}, //1114 #CJK UNIFIED IDEOGRAPH
+ {0x86E5, 0x55D7}, //1115 #CJK UNIFIED IDEOGRAPH
+ {0x86E6, 0x55D8}, //1116 #CJK UNIFIED IDEOGRAPH
+ {0x86E7, 0x55D9}, //1117 #CJK UNIFIED IDEOGRAPH
+ {0x86E8, 0x55DA}, //1118 #CJK UNIFIED IDEOGRAPH
+ {0x86E9, 0x55DB}, //1119 #CJK UNIFIED IDEOGRAPH
+ {0x86EA, 0x55DE}, //1120 #CJK UNIFIED IDEOGRAPH
+ {0x86EB, 0x55E0}, //1121 #CJK UNIFIED IDEOGRAPH
+ {0x86EC, 0x55E2}, //1122 #CJK UNIFIED IDEOGRAPH
+ {0x86ED, 0x55E7}, //1123 #CJK UNIFIED IDEOGRAPH
+ {0x86EE, 0x55E9}, //1124 #CJK UNIFIED IDEOGRAPH
+ {0x86EF, 0x55ED}, //1125 #CJK UNIFIED IDEOGRAPH
+ {0x86F0, 0x55EE}, //1126 #CJK UNIFIED IDEOGRAPH
+ {0x86F1, 0x55F0}, //1127 #CJK UNIFIED IDEOGRAPH
+ {0x86F2, 0x55F1}, //1128 #CJK UNIFIED IDEOGRAPH
+ {0x86F3, 0x55F4}, //1129 #CJK UNIFIED IDEOGRAPH
+ {0x86F4, 0x55F6}, //1130 #CJK UNIFIED IDEOGRAPH
+ {0x86F5, 0x55F8}, //1131 #CJK UNIFIED IDEOGRAPH
+ {0x86F6, 0x55F9}, //1132 #CJK UNIFIED IDEOGRAPH
+ {0x86F7, 0x55FA}, //1133 #CJK UNIFIED IDEOGRAPH
+ {0x86F8, 0x55FB}, //1134 #CJK UNIFIED IDEOGRAPH
+ {0x86F9, 0x55FC}, //1135 #CJK UNIFIED IDEOGRAPH
+ {0x86FA, 0x55FF}, //1136 #CJK UNIFIED IDEOGRAPH
+ {0x86FB, 0x5602}, //1137 #CJK UNIFIED IDEOGRAPH
+ {0x86FC, 0x5603}, //1138 #CJK UNIFIED IDEOGRAPH
+ {0x86FD, 0x5604}, //1139 #CJK UNIFIED IDEOGRAPH
+ {0x86FE, 0x5605}, //1140 #CJK UNIFIED IDEOGRAPH
+ {0x8740, 0x5606}, //1141 #CJK UNIFIED IDEOGRAPH
+ {0x8741, 0x5607}, //1142 #CJK UNIFIED IDEOGRAPH
+ {0x8742, 0x560A}, //1143 #CJK UNIFIED IDEOGRAPH
+ {0x8743, 0x560B}, //1144 #CJK UNIFIED IDEOGRAPH
+ {0x8744, 0x560D}, //1145 #CJK UNIFIED IDEOGRAPH
+ {0x8745, 0x5610}, //1146 #CJK UNIFIED IDEOGRAPH
+ {0x8746, 0x5611}, //1147 #CJK UNIFIED IDEOGRAPH
+ {0x8747, 0x5612}, //1148 #CJK UNIFIED IDEOGRAPH
+ {0x8748, 0x5613}, //1149 #CJK UNIFIED IDEOGRAPH
+ {0x8749, 0x5614}, //1150 #CJK UNIFIED IDEOGRAPH
+ {0x874A, 0x5615}, //1151 #CJK UNIFIED IDEOGRAPH
+ {0x874B, 0x5616}, //1152 #CJK UNIFIED IDEOGRAPH
+ {0x874C, 0x5617}, //1153 #CJK UNIFIED IDEOGRAPH
+ {0x874D, 0x5619}, //1154 #CJK UNIFIED IDEOGRAPH
+ {0x874E, 0x561A}, //1155 #CJK UNIFIED IDEOGRAPH
+ {0x874F, 0x561C}, //1156 #CJK UNIFIED IDEOGRAPH
+ {0x8750, 0x561D}, //1157 #CJK UNIFIED IDEOGRAPH
+ {0x8751, 0x5620}, //1158 #CJK UNIFIED IDEOGRAPH
+ {0x8752, 0x5621}, //1159 #CJK UNIFIED IDEOGRAPH
+ {0x8753, 0x5622}, //1160 #CJK UNIFIED IDEOGRAPH
+ {0x8754, 0x5625}, //1161 #CJK UNIFIED IDEOGRAPH
+ {0x8755, 0x5626}, //1162 #CJK UNIFIED IDEOGRAPH
+ {0x8756, 0x5628}, //1163 #CJK UNIFIED IDEOGRAPH
+ {0x8757, 0x5629}, //1164 #CJK UNIFIED IDEOGRAPH
+ {0x8758, 0x562A}, //1165 #CJK UNIFIED IDEOGRAPH
+ {0x8759, 0x562B}, //1166 #CJK UNIFIED IDEOGRAPH
+ {0x875A, 0x562E}, //1167 #CJK UNIFIED IDEOGRAPH
+ {0x875B, 0x562F}, //1168 #CJK UNIFIED IDEOGRAPH
+ {0x875C, 0x5630}, //1169 #CJK UNIFIED IDEOGRAPH
+ {0x875D, 0x5633}, //1170 #CJK UNIFIED IDEOGRAPH
+ {0x875E, 0x5635}, //1171 #CJK UNIFIED IDEOGRAPH
+ {0x875F, 0x5637}, //1172 #CJK UNIFIED IDEOGRAPH
+ {0x8760, 0x5638}, //1173 #CJK UNIFIED IDEOGRAPH
+ {0x8761, 0x563A}, //1174 #CJK UNIFIED IDEOGRAPH
+ {0x8762, 0x563C}, //1175 #CJK UNIFIED IDEOGRAPH
+ {0x8763, 0x563D}, //1176 #CJK UNIFIED IDEOGRAPH
+ {0x8764, 0x563E}, //1177 #CJK UNIFIED IDEOGRAPH
+ {0x8765, 0x5640}, //1178 #CJK UNIFIED IDEOGRAPH
+ {0x8766, 0x5641}, //1179 #CJK UNIFIED IDEOGRAPH
+ {0x8767, 0x5642}, //1180 #CJK UNIFIED IDEOGRAPH
+ {0x8768, 0x5643}, //1181 #CJK UNIFIED IDEOGRAPH
+ {0x8769, 0x5644}, //1182 #CJK UNIFIED IDEOGRAPH
+ {0x876A, 0x5645}, //1183 #CJK UNIFIED IDEOGRAPH
+ {0x876B, 0x5646}, //1184 #CJK UNIFIED IDEOGRAPH
+ {0x876C, 0x5647}, //1185 #CJK UNIFIED IDEOGRAPH
+ {0x876D, 0x5648}, //1186 #CJK UNIFIED IDEOGRAPH
+ {0x876E, 0x5649}, //1187 #CJK UNIFIED IDEOGRAPH
+ {0x876F, 0x564A}, //1188 #CJK UNIFIED IDEOGRAPH
+ {0x8770, 0x564B}, //1189 #CJK UNIFIED IDEOGRAPH
+ {0x8771, 0x564F}, //1190 #CJK UNIFIED IDEOGRAPH
+ {0x8772, 0x5650}, //1191 #CJK UNIFIED IDEOGRAPH
+ {0x8773, 0x5651}, //1192 #CJK UNIFIED IDEOGRAPH
+ {0x8774, 0x5652}, //1193 #CJK UNIFIED IDEOGRAPH
+ {0x8775, 0x5653}, //1194 #CJK UNIFIED IDEOGRAPH
+ {0x8776, 0x5655}, //1195 #CJK UNIFIED IDEOGRAPH
+ {0x8777, 0x5656}, //1196 #CJK UNIFIED IDEOGRAPH
+ {0x8778, 0x565A}, //1197 #CJK UNIFIED IDEOGRAPH
+ {0x8779, 0x565B}, //1198 #CJK UNIFIED IDEOGRAPH
+ {0x877A, 0x565D}, //1199 #CJK UNIFIED IDEOGRAPH
+ {0x877B, 0x565E}, //1200 #CJK UNIFIED IDEOGRAPH
+ {0x877C, 0x565F}, //1201 #CJK UNIFIED IDEOGRAPH
+ {0x877D, 0x5660}, //1202 #CJK UNIFIED IDEOGRAPH
+ {0x877E, 0x5661}, //1203 #CJK UNIFIED IDEOGRAPH
+ {0x8780, 0x5663}, //1204 #CJK UNIFIED IDEOGRAPH
+ {0x8781, 0x5665}, //1205 #CJK UNIFIED IDEOGRAPH
+ {0x8782, 0x5666}, //1206 #CJK UNIFIED IDEOGRAPH
+ {0x8783, 0x5667}, //1207 #CJK UNIFIED IDEOGRAPH
+ {0x8784, 0x566D}, //1208 #CJK UNIFIED IDEOGRAPH
+ {0x8785, 0x566E}, //1209 #CJK UNIFIED IDEOGRAPH
+ {0x8786, 0x566F}, //1210 #CJK UNIFIED IDEOGRAPH
+ {0x8787, 0x5670}, //1211 #CJK UNIFIED IDEOGRAPH
+ {0x8788, 0x5672}, //1212 #CJK UNIFIED IDEOGRAPH
+ {0x8789, 0x5673}, //1213 #CJK UNIFIED IDEOGRAPH
+ {0x878A, 0x5674}, //1214 #CJK UNIFIED IDEOGRAPH
+ {0x878B, 0x5675}, //1215 #CJK UNIFIED IDEOGRAPH
+ {0x878C, 0x5677}, //1216 #CJK UNIFIED IDEOGRAPH
+ {0x878D, 0x5678}, //1217 #CJK UNIFIED IDEOGRAPH
+ {0x878E, 0x5679}, //1218 #CJK UNIFIED IDEOGRAPH
+ {0x878F, 0x567A}, //1219 #CJK UNIFIED IDEOGRAPH
+ {0x8790, 0x567D}, //1220 #CJK UNIFIED IDEOGRAPH
+ {0x8791, 0x567E}, //1221 #CJK UNIFIED IDEOGRAPH
+ {0x8792, 0x567F}, //1222 #CJK UNIFIED IDEOGRAPH
+ {0x8793, 0x5680}, //1223 #CJK UNIFIED IDEOGRAPH
+ {0x8794, 0x5681}, //1224 #CJK UNIFIED IDEOGRAPH
+ {0x8795, 0x5682}, //1225 #CJK UNIFIED IDEOGRAPH
+ {0x8796, 0x5683}, //1226 #CJK UNIFIED IDEOGRAPH
+ {0x8797, 0x5684}, //1227 #CJK UNIFIED IDEOGRAPH
+ {0x8798, 0x5687}, //1228 #CJK UNIFIED IDEOGRAPH
+ {0x8799, 0x5688}, //1229 #CJK UNIFIED IDEOGRAPH
+ {0x879A, 0x5689}, //1230 #CJK UNIFIED IDEOGRAPH
+ {0x879B, 0x568A}, //1231 #CJK UNIFIED IDEOGRAPH
+ {0x879C, 0x568B}, //1232 #CJK UNIFIED IDEOGRAPH
+ {0x879D, 0x568C}, //1233 #CJK UNIFIED IDEOGRAPH
+ {0x879E, 0x568D}, //1234 #CJK UNIFIED IDEOGRAPH
+ {0x879F, 0x5690}, //1235 #CJK UNIFIED IDEOGRAPH
+ {0x87A0, 0x5691}, //1236 #CJK UNIFIED IDEOGRAPH
+ {0x87A1, 0x5692}, //1237 #CJK UNIFIED IDEOGRAPH
+ {0x87A2, 0x5694}, //1238 #CJK UNIFIED IDEOGRAPH
+ {0x87A3, 0x5695}, //1239 #CJK UNIFIED IDEOGRAPH
+ {0x87A4, 0x5696}, //1240 #CJK UNIFIED IDEOGRAPH
+ {0x87A5, 0x5697}, //1241 #CJK UNIFIED IDEOGRAPH
+ {0x87A6, 0x5698}, //1242 #CJK UNIFIED IDEOGRAPH
+ {0x87A7, 0x5699}, //1243 #CJK UNIFIED IDEOGRAPH
+ {0x87A8, 0x569A}, //1244 #CJK UNIFIED IDEOGRAPH
+ {0x87A9, 0x569B}, //1245 #CJK UNIFIED IDEOGRAPH
+ {0x87AA, 0x569C}, //1246 #CJK UNIFIED IDEOGRAPH
+ {0x87AB, 0x569D}, //1247 #CJK UNIFIED IDEOGRAPH
+ {0x87AC, 0x569E}, //1248 #CJK UNIFIED IDEOGRAPH
+ {0x87AD, 0x569F}, //1249 #CJK UNIFIED IDEOGRAPH
+ {0x87AE, 0x56A0}, //1250 #CJK UNIFIED IDEOGRAPH
+ {0x87AF, 0x56A1}, //1251 #CJK UNIFIED IDEOGRAPH
+ {0x87B0, 0x56A2}, //1252 #CJK UNIFIED IDEOGRAPH
+ {0x87B1, 0x56A4}, //1253 #CJK UNIFIED IDEOGRAPH
+ {0x87B2, 0x56A5}, //1254 #CJK UNIFIED IDEOGRAPH
+ {0x87B3, 0x56A6}, //1255 #CJK UNIFIED IDEOGRAPH
+ {0x87B4, 0x56A7}, //1256 #CJK UNIFIED IDEOGRAPH
+ {0x87B5, 0x56A8}, //1257 #CJK UNIFIED IDEOGRAPH
+ {0x87B6, 0x56A9}, //1258 #CJK UNIFIED IDEOGRAPH
+ {0x87B7, 0x56AA}, //1259 #CJK UNIFIED IDEOGRAPH
+ {0x87B8, 0x56AB}, //1260 #CJK UNIFIED IDEOGRAPH
+ {0x87B9, 0x56AC}, //1261 #CJK UNIFIED IDEOGRAPH
+ {0x87BA, 0x56AD}, //1262 #CJK UNIFIED IDEOGRAPH
+ {0x87BB, 0x56AE}, //1263 #CJK UNIFIED IDEOGRAPH
+ {0x87BC, 0x56B0}, //1264 #CJK UNIFIED IDEOGRAPH
+ {0x87BD, 0x56B1}, //1265 #CJK UNIFIED IDEOGRAPH
+ {0x87BE, 0x56B2}, //1266 #CJK UNIFIED IDEOGRAPH
+ {0x87BF, 0x56B3}, //1267 #CJK UNIFIED IDEOGRAPH
+ {0x87C0, 0x56B4}, //1268 #CJK UNIFIED IDEOGRAPH
+ {0x87C1, 0x56B5}, //1269 #CJK UNIFIED IDEOGRAPH
+ {0x87C2, 0x56B6}, //1270 #CJK UNIFIED IDEOGRAPH
+ {0x87C3, 0x56B8}, //1271 #CJK UNIFIED IDEOGRAPH
+ {0x87C4, 0x56B9}, //1272 #CJK UNIFIED IDEOGRAPH
+ {0x87C5, 0x56BA}, //1273 #CJK UNIFIED IDEOGRAPH
+ {0x87C6, 0x56BB}, //1274 #CJK UNIFIED IDEOGRAPH
+ {0x87C7, 0x56BD}, //1275 #CJK UNIFIED IDEOGRAPH
+ {0x87C8, 0x56BE}, //1276 #CJK UNIFIED IDEOGRAPH
+ {0x87C9, 0x56BF}, //1277 #CJK UNIFIED IDEOGRAPH
+ {0x87CA, 0x56C0}, //1278 #CJK UNIFIED IDEOGRAPH
+ {0x87CB, 0x56C1}, //1279 #CJK UNIFIED IDEOGRAPH
+ {0x87CC, 0x56C2}, //1280 #CJK UNIFIED IDEOGRAPH
+ {0x87CD, 0x56C3}, //1281 #CJK UNIFIED IDEOGRAPH
+ {0x87CE, 0x56C4}, //1282 #CJK UNIFIED IDEOGRAPH
+ {0x87CF, 0x56C5}, //1283 #CJK UNIFIED IDEOGRAPH
+ {0x87D0, 0x56C6}, //1284 #CJK UNIFIED IDEOGRAPH
+ {0x87D1, 0x56C7}, //1285 #CJK UNIFIED IDEOGRAPH
+ {0x87D2, 0x56C8}, //1286 #CJK UNIFIED IDEOGRAPH
+ {0x87D3, 0x56C9}, //1287 #CJK UNIFIED IDEOGRAPH
+ {0x87D4, 0x56CB}, //1288 #CJK UNIFIED IDEOGRAPH
+ {0x87D5, 0x56CC}, //1289 #CJK UNIFIED IDEOGRAPH
+ {0x87D6, 0x56CD}, //1290 #CJK UNIFIED IDEOGRAPH
+ {0x87D7, 0x56CE}, //1291 #CJK UNIFIED IDEOGRAPH
+ {0x87D8, 0x56CF}, //1292 #CJK UNIFIED IDEOGRAPH
+ {0x87D9, 0x56D0}, //1293 #CJK UNIFIED IDEOGRAPH
+ {0x87DA, 0x56D1}, //1294 #CJK UNIFIED IDEOGRAPH
+ {0x87DB, 0x56D2}, //1295 #CJK UNIFIED IDEOGRAPH
+ {0x87DC, 0x56D3}, //1296 #CJK UNIFIED IDEOGRAPH
+ {0x87DD, 0x56D5}, //1297 #CJK UNIFIED IDEOGRAPH
+ {0x87DE, 0x56D6}, //1298 #CJK UNIFIED IDEOGRAPH
+ {0x87DF, 0x56D8}, //1299 #CJK UNIFIED IDEOGRAPH
+ {0x87E0, 0x56D9}, //1300 #CJK UNIFIED IDEOGRAPH
+ {0x87E1, 0x56DC}, //1301 #CJK UNIFIED IDEOGRAPH
+ {0x87E2, 0x56E3}, //1302 #CJK UNIFIED IDEOGRAPH
+ {0x87E3, 0x56E5}, //1303 #CJK UNIFIED IDEOGRAPH
+ {0x87E4, 0x56E6}, //1304 #CJK UNIFIED IDEOGRAPH
+ {0x87E5, 0x56E7}, //1305 #CJK UNIFIED IDEOGRAPH
+ {0x87E6, 0x56E8}, //1306 #CJK UNIFIED IDEOGRAPH
+ {0x87E7, 0x56E9}, //1307 #CJK UNIFIED IDEOGRAPH
+ {0x87E8, 0x56EA}, //1308 #CJK UNIFIED IDEOGRAPH
+ {0x87E9, 0x56EC}, //1309 #CJK UNIFIED IDEOGRAPH
+ {0x87EA, 0x56EE}, //1310 #CJK UNIFIED IDEOGRAPH
+ {0x87EB, 0x56EF}, //1311 #CJK UNIFIED IDEOGRAPH
+ {0x87EC, 0x56F2}, //1312 #CJK UNIFIED IDEOGRAPH
+ {0x87ED, 0x56F3}, //1313 #CJK UNIFIED IDEOGRAPH
+ {0x87EE, 0x56F6}, //1314 #CJK UNIFIED IDEOGRAPH
+ {0x87EF, 0x56F7}, //1315 #CJK UNIFIED IDEOGRAPH
+ {0x87F0, 0x56F8}, //1316 #CJK UNIFIED IDEOGRAPH
+ {0x87F1, 0x56FB}, //1317 #CJK UNIFIED IDEOGRAPH
+ {0x87F2, 0x56FC}, //1318 #CJK UNIFIED IDEOGRAPH
+ {0x87F3, 0x5700}, //1319 #CJK UNIFIED IDEOGRAPH
+ {0x87F4, 0x5701}, //1320 #CJK UNIFIED IDEOGRAPH
+ {0x87F5, 0x5702}, //1321 #CJK UNIFIED IDEOGRAPH
+ {0x87F6, 0x5705}, //1322 #CJK UNIFIED IDEOGRAPH
+ {0x87F7, 0x5707}, //1323 #CJK UNIFIED IDEOGRAPH
+ {0x87F8, 0x570B}, //1324 #CJK UNIFIED IDEOGRAPH
+ {0x87F9, 0x570C}, //1325 #CJK UNIFIED IDEOGRAPH
+ {0x87FA, 0x570D}, //1326 #CJK UNIFIED IDEOGRAPH
+ {0x87FB, 0x570E}, //1327 #CJK UNIFIED IDEOGRAPH
+ {0x87FC, 0x570F}, //1328 #CJK UNIFIED IDEOGRAPH
+ {0x87FD, 0x5710}, //1329 #CJK UNIFIED IDEOGRAPH
+ {0x87FE, 0x5711}, //1330 #CJK UNIFIED IDEOGRAPH
+ {0x8840, 0x5712}, //1331 #CJK UNIFIED IDEOGRAPH
+ {0x8841, 0x5713}, //1332 #CJK UNIFIED IDEOGRAPH
+ {0x8842, 0x5714}, //1333 #CJK UNIFIED IDEOGRAPH
+ {0x8843, 0x5715}, //1334 #CJK UNIFIED IDEOGRAPH
+ {0x8844, 0x5716}, //1335 #CJK UNIFIED IDEOGRAPH
+ {0x8845, 0x5717}, //1336 #CJK UNIFIED IDEOGRAPH
+ {0x8846, 0x5718}, //1337 #CJK UNIFIED IDEOGRAPH
+ {0x8847, 0x5719}, //1338 #CJK UNIFIED IDEOGRAPH
+ {0x8848, 0x571A}, //1339 #CJK UNIFIED IDEOGRAPH
+ {0x8849, 0x571B}, //1340 #CJK UNIFIED IDEOGRAPH
+ {0x884A, 0x571D}, //1341 #CJK UNIFIED IDEOGRAPH
+ {0x884B, 0x571E}, //1342 #CJK UNIFIED IDEOGRAPH
+ {0x884C, 0x5720}, //1343 #CJK UNIFIED IDEOGRAPH
+ {0x884D, 0x5721}, //1344 #CJK UNIFIED IDEOGRAPH
+ {0x884E, 0x5722}, //1345 #CJK UNIFIED IDEOGRAPH
+ {0x884F, 0x5724}, //1346 #CJK UNIFIED IDEOGRAPH
+ {0x8850, 0x5725}, //1347 #CJK UNIFIED IDEOGRAPH
+ {0x8851, 0x5726}, //1348 #CJK UNIFIED IDEOGRAPH
+ {0x8852, 0x5727}, //1349 #CJK UNIFIED IDEOGRAPH
+ {0x8853, 0x572B}, //1350 #CJK UNIFIED IDEOGRAPH
+ {0x8854, 0x5731}, //1351 #CJK UNIFIED IDEOGRAPH
+ {0x8855, 0x5732}, //1352 #CJK UNIFIED IDEOGRAPH
+ {0x8856, 0x5734}, //1353 #CJK UNIFIED IDEOGRAPH
+ {0x8857, 0x5735}, //1354 #CJK UNIFIED IDEOGRAPH
+ {0x8858, 0x5736}, //1355 #CJK UNIFIED IDEOGRAPH
+ {0x8859, 0x5737}, //1356 #CJK UNIFIED IDEOGRAPH
+ {0x885A, 0x5738}, //1357 #CJK UNIFIED IDEOGRAPH
+ {0x885B, 0x573C}, //1358 #CJK UNIFIED IDEOGRAPH
+ {0x885C, 0x573D}, //1359 #CJK UNIFIED IDEOGRAPH
+ {0x885D, 0x573F}, //1360 #CJK UNIFIED IDEOGRAPH
+ {0x885E, 0x5741}, //1361 #CJK UNIFIED IDEOGRAPH
+ {0x885F, 0x5743}, //1362 #CJK UNIFIED IDEOGRAPH
+ {0x8860, 0x5744}, //1363 #CJK UNIFIED IDEOGRAPH
+ {0x8861, 0x5745}, //1364 #CJK UNIFIED IDEOGRAPH
+ {0x8862, 0x5746}, //1365 #CJK UNIFIED IDEOGRAPH
+ {0x8863, 0x5748}, //1366 #CJK UNIFIED IDEOGRAPH
+ {0x8864, 0x5749}, //1367 #CJK UNIFIED IDEOGRAPH
+ {0x8865, 0x574B}, //1368 #CJK UNIFIED IDEOGRAPH
+ {0x8866, 0x5752}, //1369 #CJK UNIFIED IDEOGRAPH
+ {0x8867, 0x5753}, //1370 #CJK UNIFIED IDEOGRAPH
+ {0x8868, 0x5754}, //1371 #CJK UNIFIED IDEOGRAPH
+ {0x8869, 0x5755}, //1372 #CJK UNIFIED IDEOGRAPH
+ {0x886A, 0x5756}, //1373 #CJK UNIFIED IDEOGRAPH
+ {0x886B, 0x5758}, //1374 #CJK UNIFIED IDEOGRAPH
+ {0x886C, 0x5759}, //1375 #CJK UNIFIED IDEOGRAPH
+ {0x886D, 0x5762}, //1376 #CJK UNIFIED IDEOGRAPH
+ {0x886E, 0x5763}, //1377 #CJK UNIFIED IDEOGRAPH
+ {0x886F, 0x5765}, //1378 #CJK UNIFIED IDEOGRAPH
+ {0x8870, 0x5767}, //1379 #CJK UNIFIED IDEOGRAPH
+ {0x8871, 0x576C}, //1380 #CJK UNIFIED IDEOGRAPH
+ {0x8872, 0x576E}, //1381 #CJK UNIFIED IDEOGRAPH
+ {0x8873, 0x5770}, //1382 #CJK UNIFIED IDEOGRAPH
+ {0x8874, 0x5771}, //1383 #CJK UNIFIED IDEOGRAPH
+ {0x8875, 0x5772}, //1384 #CJK UNIFIED IDEOGRAPH
+ {0x8876, 0x5774}, //1385 #CJK UNIFIED IDEOGRAPH
+ {0x8877, 0x5775}, //1386 #CJK UNIFIED IDEOGRAPH
+ {0x8878, 0x5778}, //1387 #CJK UNIFIED IDEOGRAPH
+ {0x8879, 0x5779}, //1388 #CJK UNIFIED IDEOGRAPH
+ {0x887A, 0x577A}, //1389 #CJK UNIFIED IDEOGRAPH
+ {0x887B, 0x577D}, //1390 #CJK UNIFIED IDEOGRAPH
+ {0x887C, 0x577E}, //1391 #CJK UNIFIED IDEOGRAPH
+ {0x887D, 0x577F}, //1392 #CJK UNIFIED IDEOGRAPH
+ {0x887E, 0x5780}, //1393 #CJK UNIFIED IDEOGRAPH
+ {0x8880, 0x5781}, //1394 #CJK UNIFIED IDEOGRAPH
+ {0x8881, 0x5787}, //1395 #CJK UNIFIED IDEOGRAPH
+ {0x8882, 0x5788}, //1396 #CJK UNIFIED IDEOGRAPH
+ {0x8883, 0x5789}, //1397 #CJK UNIFIED IDEOGRAPH
+ {0x8884, 0x578A}, //1398 #CJK UNIFIED IDEOGRAPH
+ {0x8885, 0x578D}, //1399 #CJK UNIFIED IDEOGRAPH
+ {0x8886, 0x578E}, //1400 #CJK UNIFIED IDEOGRAPH
+ {0x8887, 0x578F}, //1401 #CJK UNIFIED IDEOGRAPH
+ {0x8888, 0x5790}, //1402 #CJK UNIFIED IDEOGRAPH
+ {0x8889, 0x5791}, //1403 #CJK UNIFIED IDEOGRAPH
+ {0x888A, 0x5794}, //1404 #CJK UNIFIED IDEOGRAPH
+ {0x888B, 0x5795}, //1405 #CJK UNIFIED IDEOGRAPH
+ {0x888C, 0x5796}, //1406 #CJK UNIFIED IDEOGRAPH
+ {0x888D, 0x5797}, //1407 #CJK UNIFIED IDEOGRAPH
+ {0x888E, 0x5798}, //1408 #CJK UNIFIED IDEOGRAPH
+ {0x888F, 0x5799}, //1409 #CJK UNIFIED IDEOGRAPH
+ {0x8890, 0x579A}, //1410 #CJK UNIFIED IDEOGRAPH
+ {0x8891, 0x579C}, //1411 #CJK UNIFIED IDEOGRAPH
+ {0x8892, 0x579D}, //1412 #CJK UNIFIED IDEOGRAPH
+ {0x8893, 0x579E}, //1413 #CJK UNIFIED IDEOGRAPH
+ {0x8894, 0x579F}, //1414 #CJK UNIFIED IDEOGRAPH
+ {0x8895, 0x57A5}, //1415 #CJK UNIFIED IDEOGRAPH
+ {0x8896, 0x57A8}, //1416 #CJK UNIFIED IDEOGRAPH
+ {0x8897, 0x57AA}, //1417 #CJK UNIFIED IDEOGRAPH
+ {0x8898, 0x57AC}, //1418 #CJK UNIFIED IDEOGRAPH
+ {0x8899, 0x57AF}, //1419 #CJK UNIFIED IDEOGRAPH
+ {0x889A, 0x57B0}, //1420 #CJK UNIFIED IDEOGRAPH
+ {0x889B, 0x57B1}, //1421 #CJK UNIFIED IDEOGRAPH
+ {0x889C, 0x57B3}, //1422 #CJK UNIFIED IDEOGRAPH
+ {0x889D, 0x57B5}, //1423 #CJK UNIFIED IDEOGRAPH
+ {0x889E, 0x57B6}, //1424 #CJK UNIFIED IDEOGRAPH
+ {0x889F, 0x57B7}, //1425 #CJK UNIFIED IDEOGRAPH
+ {0x88A0, 0x57B9}, //1426 #CJK UNIFIED IDEOGRAPH
+ {0x88A1, 0x57BA}, //1427 #CJK UNIFIED IDEOGRAPH
+ {0x88A2, 0x57BB}, //1428 #CJK UNIFIED IDEOGRAPH
+ {0x88A3, 0x57BC}, //1429 #CJK UNIFIED IDEOGRAPH
+ {0x88A4, 0x57BD}, //1430 #CJK UNIFIED IDEOGRAPH
+ {0x88A5, 0x57BE}, //1431 #CJK UNIFIED IDEOGRAPH
+ {0x88A6, 0x57BF}, //1432 #CJK UNIFIED IDEOGRAPH
+ {0x88A7, 0x57C0}, //1433 #CJK UNIFIED IDEOGRAPH
+ {0x88A8, 0x57C1}, //1434 #CJK UNIFIED IDEOGRAPH
+ {0x88A9, 0x57C4}, //1435 #CJK UNIFIED IDEOGRAPH
+ {0x88AA, 0x57C5}, //1436 #CJK UNIFIED IDEOGRAPH
+ {0x88AB, 0x57C6}, //1437 #CJK UNIFIED IDEOGRAPH
+ {0x88AC, 0x57C7}, //1438 #CJK UNIFIED IDEOGRAPH
+ {0x88AD, 0x57C8}, //1439 #CJK UNIFIED IDEOGRAPH
+ {0x88AE, 0x57C9}, //1440 #CJK UNIFIED IDEOGRAPH
+ {0x88AF, 0x57CA}, //1441 #CJK UNIFIED IDEOGRAPH
+ {0x88B0, 0x57CC}, //1442 #CJK UNIFIED IDEOGRAPH
+ {0x88B1, 0x57CD}, //1443 #CJK UNIFIED IDEOGRAPH
+ {0x88B2, 0x57D0}, //1444 #CJK UNIFIED IDEOGRAPH
+ {0x88B3, 0x57D1}, //1445 #CJK UNIFIED IDEOGRAPH
+ {0x88B4, 0x57D3}, //1446 #CJK UNIFIED IDEOGRAPH
+ {0x88B5, 0x57D6}, //1447 #CJK UNIFIED IDEOGRAPH
+ {0x88B6, 0x57D7}, //1448 #CJK UNIFIED IDEOGRAPH
+ {0x88B7, 0x57DB}, //1449 #CJK UNIFIED IDEOGRAPH
+ {0x88B8, 0x57DC}, //1450 #CJK UNIFIED IDEOGRAPH
+ {0x88B9, 0x57DE}, //1451 #CJK UNIFIED IDEOGRAPH
+ {0x88BA, 0x57E1}, //1452 #CJK UNIFIED IDEOGRAPH
+ {0x88BB, 0x57E2}, //1453 #CJK UNIFIED IDEOGRAPH
+ {0x88BC, 0x57E3}, //1454 #CJK UNIFIED IDEOGRAPH
+ {0x88BD, 0x57E5}, //1455 #CJK UNIFIED IDEOGRAPH
+ {0x88BE, 0x57E6}, //1456 #CJK UNIFIED IDEOGRAPH
+ {0x88BF, 0x57E7}, //1457 #CJK UNIFIED IDEOGRAPH
+ {0x88C0, 0x57E8}, //1458 #CJK UNIFIED IDEOGRAPH
+ {0x88C1, 0x57E9}, //1459 #CJK UNIFIED IDEOGRAPH
+ {0x88C2, 0x57EA}, //1460 #CJK UNIFIED IDEOGRAPH
+ {0x88C3, 0x57EB}, //1461 #CJK UNIFIED IDEOGRAPH
+ {0x88C4, 0x57EC}, //1462 #CJK UNIFIED IDEOGRAPH
+ {0x88C5, 0x57EE}, //1463 #CJK UNIFIED IDEOGRAPH
+ {0x88C6, 0x57F0}, //1464 #CJK UNIFIED IDEOGRAPH
+ {0x88C7, 0x57F1}, //1465 #CJK UNIFIED IDEOGRAPH
+ {0x88C8, 0x57F2}, //1466 #CJK UNIFIED IDEOGRAPH
+ {0x88C9, 0x57F3}, //1467 #CJK UNIFIED IDEOGRAPH
+ {0x88CA, 0x57F5}, //1468 #CJK UNIFIED IDEOGRAPH
+ {0x88CB, 0x57F6}, //1469 #CJK UNIFIED IDEOGRAPH
+ {0x88CC, 0x57F7}, //1470 #CJK UNIFIED IDEOGRAPH
+ {0x88CD, 0x57FB}, //1471 #CJK UNIFIED IDEOGRAPH
+ {0x88CE, 0x57FC}, //1472 #CJK UNIFIED IDEOGRAPH
+ {0x88CF, 0x57FE}, //1473 #CJK UNIFIED IDEOGRAPH
+ {0x88D0, 0x57FF}, //1474 #CJK UNIFIED IDEOGRAPH
+ {0x88D1, 0x5801}, //1475 #CJK UNIFIED IDEOGRAPH
+ {0x88D2, 0x5803}, //1476 #CJK UNIFIED IDEOGRAPH
+ {0x88D3, 0x5804}, //1477 #CJK UNIFIED IDEOGRAPH
+ {0x88D4, 0x5805}, //1478 #CJK UNIFIED IDEOGRAPH
+ {0x88D5, 0x5808}, //1479 #CJK UNIFIED IDEOGRAPH
+ {0x88D6, 0x5809}, //1480 #CJK UNIFIED IDEOGRAPH
+ {0x88D7, 0x580A}, //1481 #CJK UNIFIED IDEOGRAPH
+ {0x88D8, 0x580C}, //1482 #CJK UNIFIED IDEOGRAPH
+ {0x88D9, 0x580E}, //1483 #CJK UNIFIED IDEOGRAPH
+ {0x88DA, 0x580F}, //1484 #CJK UNIFIED IDEOGRAPH
+ {0x88DB, 0x5810}, //1485 #CJK UNIFIED IDEOGRAPH
+ {0x88DC, 0x5812}, //1486 #CJK UNIFIED IDEOGRAPH
+ {0x88DD, 0x5813}, //1487 #CJK UNIFIED IDEOGRAPH
+ {0x88DE, 0x5814}, //1488 #CJK UNIFIED IDEOGRAPH
+ {0x88DF, 0x5816}, //1489 #CJK UNIFIED IDEOGRAPH
+ {0x88E0, 0x5817}, //1490 #CJK UNIFIED IDEOGRAPH
+ {0x88E1, 0x5818}, //1491 #CJK UNIFIED IDEOGRAPH
+ {0x88E2, 0x581A}, //1492 #CJK UNIFIED IDEOGRAPH
+ {0x88E3, 0x581B}, //1493 #CJK UNIFIED IDEOGRAPH
+ {0x88E4, 0x581C}, //1494 #CJK UNIFIED IDEOGRAPH
+ {0x88E5, 0x581D}, //1495 #CJK UNIFIED IDEOGRAPH
+ {0x88E6, 0x581F}, //1496 #CJK UNIFIED IDEOGRAPH
+ {0x88E7, 0x5822}, //1497 #CJK UNIFIED IDEOGRAPH
+ {0x88E8, 0x5823}, //1498 #CJK UNIFIED IDEOGRAPH
+ {0x88E9, 0x5825}, //1499 #CJK UNIFIED IDEOGRAPH
+ {0x88EA, 0x5826}, //1500 #CJK UNIFIED IDEOGRAPH
+ {0x88EB, 0x5827}, //1501 #CJK UNIFIED IDEOGRAPH
+ {0x88EC, 0x5828}, //1502 #CJK UNIFIED IDEOGRAPH
+ {0x88ED, 0x5829}, //1503 #CJK UNIFIED IDEOGRAPH
+ {0x88EE, 0x582B}, //1504 #CJK UNIFIED IDEOGRAPH
+ {0x88EF, 0x582C}, //1505 #CJK UNIFIED IDEOGRAPH
+ {0x88F0, 0x582D}, //1506 #CJK UNIFIED IDEOGRAPH
+ {0x88F1, 0x582E}, //1507 #CJK UNIFIED IDEOGRAPH
+ {0x88F2, 0x582F}, //1508 #CJK UNIFIED IDEOGRAPH
+ {0x88F3, 0x5831}, //1509 #CJK UNIFIED IDEOGRAPH
+ {0x88F4, 0x5832}, //1510 #CJK UNIFIED IDEOGRAPH
+ {0x88F5, 0x5833}, //1511 #CJK UNIFIED IDEOGRAPH
+ {0x88F6, 0x5834}, //1512 #CJK UNIFIED IDEOGRAPH
+ {0x88F7, 0x5836}, //1513 #CJK UNIFIED IDEOGRAPH
+ {0x88F8, 0x5837}, //1514 #CJK UNIFIED IDEOGRAPH
+ {0x88F9, 0x5838}, //1515 #CJK UNIFIED IDEOGRAPH
+ {0x88FA, 0x5839}, //1516 #CJK UNIFIED IDEOGRAPH
+ {0x88FB, 0x583A}, //1517 #CJK UNIFIED IDEOGRAPH
+ {0x88FC, 0x583B}, //1518 #CJK UNIFIED IDEOGRAPH
+ {0x88FD, 0x583C}, //1519 #CJK UNIFIED IDEOGRAPH
+ {0x88FE, 0x583D}, //1520 #CJK UNIFIED IDEOGRAPH
+ {0x8940, 0x583E}, //1521 #CJK UNIFIED IDEOGRAPH
+ {0x8941, 0x583F}, //1522 #CJK UNIFIED IDEOGRAPH
+ {0x8942, 0x5840}, //1523 #CJK UNIFIED IDEOGRAPH
+ {0x8943, 0x5841}, //1524 #CJK UNIFIED IDEOGRAPH
+ {0x8944, 0x5842}, //1525 #CJK UNIFIED IDEOGRAPH
+ {0x8945, 0x5843}, //1526 #CJK UNIFIED IDEOGRAPH
+ {0x8946, 0x5845}, //1527 #CJK UNIFIED IDEOGRAPH
+ {0x8947, 0x5846}, //1528 #CJK UNIFIED IDEOGRAPH
+ {0x8948, 0x5847}, //1529 #CJK UNIFIED IDEOGRAPH
+ {0x8949, 0x5848}, //1530 #CJK UNIFIED IDEOGRAPH
+ {0x894A, 0x5849}, //1531 #CJK UNIFIED IDEOGRAPH
+ {0x894B, 0x584A}, //1532 #CJK UNIFIED IDEOGRAPH
+ {0x894C, 0x584B}, //1533 #CJK UNIFIED IDEOGRAPH
+ {0x894D, 0x584E}, //1534 #CJK UNIFIED IDEOGRAPH
+ {0x894E, 0x584F}, //1535 #CJK UNIFIED IDEOGRAPH
+ {0x894F, 0x5850}, //1536 #CJK UNIFIED IDEOGRAPH
+ {0x8950, 0x5852}, //1537 #CJK UNIFIED IDEOGRAPH
+ {0x8951, 0x5853}, //1538 #CJK UNIFIED IDEOGRAPH
+ {0x8952, 0x5855}, //1539 #CJK UNIFIED IDEOGRAPH
+ {0x8953, 0x5856}, //1540 #CJK UNIFIED IDEOGRAPH
+ {0x8954, 0x5857}, //1541 #CJK UNIFIED IDEOGRAPH
+ {0x8955, 0x5859}, //1542 #CJK UNIFIED IDEOGRAPH
+ {0x8956, 0x585A}, //1543 #CJK UNIFIED IDEOGRAPH
+ {0x8957, 0x585B}, //1544 #CJK UNIFIED IDEOGRAPH
+ {0x8958, 0x585C}, //1545 #CJK UNIFIED IDEOGRAPH
+ {0x8959, 0x585D}, //1546 #CJK UNIFIED IDEOGRAPH
+ {0x895A, 0x585F}, //1547 #CJK UNIFIED IDEOGRAPH
+ {0x895B, 0x5860}, //1548 #CJK UNIFIED IDEOGRAPH
+ {0x895C, 0x5861}, //1549 #CJK UNIFIED IDEOGRAPH
+ {0x895D, 0x5862}, //1550 #CJK UNIFIED IDEOGRAPH
+ {0x895E, 0x5863}, //1551 #CJK UNIFIED IDEOGRAPH
+ {0x895F, 0x5864}, //1552 #CJK UNIFIED IDEOGRAPH
+ {0x8960, 0x5866}, //1553 #CJK UNIFIED IDEOGRAPH
+ {0x8961, 0x5867}, //1554 #CJK UNIFIED IDEOGRAPH
+ {0x8962, 0x5868}, //1555 #CJK UNIFIED IDEOGRAPH
+ {0x8963, 0x5869}, //1556 #CJK UNIFIED IDEOGRAPH
+ {0x8964, 0x586A}, //1557 #CJK UNIFIED IDEOGRAPH
+ {0x8965, 0x586D}, //1558 #CJK UNIFIED IDEOGRAPH
+ {0x8966, 0x586E}, //1559 #CJK UNIFIED IDEOGRAPH
+ {0x8967, 0x586F}, //1560 #CJK UNIFIED IDEOGRAPH
+ {0x8968, 0x5870}, //1561 #CJK UNIFIED IDEOGRAPH
+ {0x8969, 0x5871}, //1562 #CJK UNIFIED IDEOGRAPH
+ {0x896A, 0x5872}, //1563 #CJK UNIFIED IDEOGRAPH
+ {0x896B, 0x5873}, //1564 #CJK UNIFIED IDEOGRAPH
+ {0x896C, 0x5874}, //1565 #CJK UNIFIED IDEOGRAPH
+ {0x896D, 0x5875}, //1566 #CJK UNIFIED IDEOGRAPH
+ {0x896E, 0x5876}, //1567 #CJK UNIFIED IDEOGRAPH
+ {0x896F, 0x5877}, //1568 #CJK UNIFIED IDEOGRAPH
+ {0x8970, 0x5878}, //1569 #CJK UNIFIED IDEOGRAPH
+ {0x8971, 0x5879}, //1570 #CJK UNIFIED IDEOGRAPH
+ {0x8972, 0x587A}, //1571 #CJK UNIFIED IDEOGRAPH
+ {0x8973, 0x587B}, //1572 #CJK UNIFIED IDEOGRAPH
+ {0x8974, 0x587C}, //1573 #CJK UNIFIED IDEOGRAPH
+ {0x8975, 0x587D}, //1574 #CJK UNIFIED IDEOGRAPH
+ {0x8976, 0x587F}, //1575 #CJK UNIFIED IDEOGRAPH
+ {0x8977, 0x5882}, //1576 #CJK UNIFIED IDEOGRAPH
+ {0x8978, 0x5884}, //1577 #CJK UNIFIED IDEOGRAPH
+ {0x8979, 0x5886}, //1578 #CJK UNIFIED IDEOGRAPH
+ {0x897A, 0x5887}, //1579 #CJK UNIFIED IDEOGRAPH
+ {0x897B, 0x5888}, //1580 #CJK UNIFIED IDEOGRAPH
+ {0x897C, 0x588A}, //1581 #CJK UNIFIED IDEOGRAPH
+ {0x897D, 0x588B}, //1582 #CJK UNIFIED IDEOGRAPH
+ {0x897E, 0x588C}, //1583 #CJK UNIFIED IDEOGRAPH
+ {0x8980, 0x588D}, //1584 #CJK UNIFIED IDEOGRAPH
+ {0x8981, 0x588E}, //1585 #CJK UNIFIED IDEOGRAPH
+ {0x8982, 0x588F}, //1586 #CJK UNIFIED IDEOGRAPH
+ {0x8983, 0x5890}, //1587 #CJK UNIFIED IDEOGRAPH
+ {0x8984, 0x5891}, //1588 #CJK UNIFIED IDEOGRAPH
+ {0x8985, 0x5894}, //1589 #CJK UNIFIED IDEOGRAPH
+ {0x8986, 0x5895}, //1590 #CJK UNIFIED IDEOGRAPH
+ {0x8987, 0x5896}, //1591 #CJK UNIFIED IDEOGRAPH
+ {0x8988, 0x5897}, //1592 #CJK UNIFIED IDEOGRAPH
+ {0x8989, 0x5898}, //1593 #CJK UNIFIED IDEOGRAPH
+ {0x898A, 0x589B}, //1594 #CJK UNIFIED IDEOGRAPH
+ {0x898B, 0x589C}, //1595 #CJK UNIFIED IDEOGRAPH
+ {0x898C, 0x589D}, //1596 #CJK UNIFIED IDEOGRAPH
+ {0x898D, 0x58A0}, //1597 #CJK UNIFIED IDEOGRAPH
+ {0x898E, 0x58A1}, //1598 #CJK UNIFIED IDEOGRAPH
+ {0x898F, 0x58A2}, //1599 #CJK UNIFIED IDEOGRAPH
+ {0x8990, 0x58A3}, //1600 #CJK UNIFIED IDEOGRAPH
+ {0x8991, 0x58A4}, //1601 #CJK UNIFIED IDEOGRAPH
+ {0x8992, 0x58A5}, //1602 #CJK UNIFIED IDEOGRAPH
+ {0x8993, 0x58A6}, //1603 #CJK UNIFIED IDEOGRAPH
+ {0x8994, 0x58A7}, //1604 #CJK UNIFIED IDEOGRAPH
+ {0x8995, 0x58AA}, //1605 #CJK UNIFIED IDEOGRAPH
+ {0x8996, 0x58AB}, //1606 #CJK UNIFIED IDEOGRAPH
+ {0x8997, 0x58AC}, //1607 #CJK UNIFIED IDEOGRAPH
+ {0x8998, 0x58AD}, //1608 #CJK UNIFIED IDEOGRAPH
+ {0x8999, 0x58AE}, //1609 #CJK UNIFIED IDEOGRAPH
+ {0x899A, 0x58AF}, //1610 #CJK UNIFIED IDEOGRAPH
+ {0x899B, 0x58B0}, //1611 #CJK UNIFIED IDEOGRAPH
+ {0x899C, 0x58B1}, //1612 #CJK UNIFIED IDEOGRAPH
+ {0x899D, 0x58B2}, //1613 #CJK UNIFIED IDEOGRAPH
+ {0x899E, 0x58B3}, //1614 #CJK UNIFIED IDEOGRAPH
+ {0x899F, 0x58B4}, //1615 #CJK UNIFIED IDEOGRAPH
+ {0x89A0, 0x58B5}, //1616 #CJK UNIFIED IDEOGRAPH
+ {0x89A1, 0x58B6}, //1617 #CJK UNIFIED IDEOGRAPH
+ {0x89A2, 0x58B7}, //1618 #CJK UNIFIED IDEOGRAPH
+ {0x89A3, 0x58B8}, //1619 #CJK UNIFIED IDEOGRAPH
+ {0x89A4, 0x58B9}, //1620 #CJK UNIFIED IDEOGRAPH
+ {0x89A5, 0x58BA}, //1621 #CJK UNIFIED IDEOGRAPH
+ {0x89A6, 0x58BB}, //1622 #CJK UNIFIED IDEOGRAPH
+ {0x89A7, 0x58BD}, //1623 #CJK UNIFIED IDEOGRAPH
+ {0x89A8, 0x58BE}, //1624 #CJK UNIFIED IDEOGRAPH
+ {0x89A9, 0x58BF}, //1625 #CJK UNIFIED IDEOGRAPH
+ {0x89AA, 0x58C0}, //1626 #CJK UNIFIED IDEOGRAPH
+ {0x89AB, 0x58C2}, //1627 #CJK UNIFIED IDEOGRAPH
+ {0x89AC, 0x58C3}, //1628 #CJK UNIFIED IDEOGRAPH
+ {0x89AD, 0x58C4}, //1629 #CJK UNIFIED IDEOGRAPH
+ {0x89AE, 0x58C6}, //1630 #CJK UNIFIED IDEOGRAPH
+ {0x89AF, 0x58C7}, //1631 #CJK UNIFIED IDEOGRAPH
+ {0x89B0, 0x58C8}, //1632 #CJK UNIFIED IDEOGRAPH
+ {0x89B1, 0x58C9}, //1633 #CJK UNIFIED IDEOGRAPH
+ {0x89B2, 0x58CA}, //1634 #CJK UNIFIED IDEOGRAPH
+ {0x89B3, 0x58CB}, //1635 #CJK UNIFIED IDEOGRAPH
+ {0x89B4, 0x58CC}, //1636 #CJK UNIFIED IDEOGRAPH
+ {0x89B5, 0x58CD}, //1637 #CJK UNIFIED IDEOGRAPH
+ {0x89B6, 0x58CE}, //1638 #CJK UNIFIED IDEOGRAPH
+ {0x89B7, 0x58CF}, //1639 #CJK UNIFIED IDEOGRAPH
+ {0x89B8, 0x58D0}, //1640 #CJK UNIFIED IDEOGRAPH
+ {0x89B9, 0x58D2}, //1641 #CJK UNIFIED IDEOGRAPH
+ {0x89BA, 0x58D3}, //1642 #CJK UNIFIED IDEOGRAPH
+ {0x89BB, 0x58D4}, //1643 #CJK UNIFIED IDEOGRAPH
+ {0x89BC, 0x58D6}, //1644 #CJK UNIFIED IDEOGRAPH
+ {0x89BD, 0x58D7}, //1645 #CJK UNIFIED IDEOGRAPH
+ {0x89BE, 0x58D8}, //1646 #CJK UNIFIED IDEOGRAPH
+ {0x89BF, 0x58D9}, //1647 #CJK UNIFIED IDEOGRAPH
+ {0x89C0, 0x58DA}, //1648 #CJK UNIFIED IDEOGRAPH
+ {0x89C1, 0x58DB}, //1649 #CJK UNIFIED IDEOGRAPH
+ {0x89C2, 0x58DC}, //1650 #CJK UNIFIED IDEOGRAPH
+ {0x89C3, 0x58DD}, //1651 #CJK UNIFIED IDEOGRAPH
+ {0x89C4, 0x58DE}, //1652 #CJK UNIFIED IDEOGRAPH
+ {0x89C5, 0x58DF}, //1653 #CJK UNIFIED IDEOGRAPH
+ {0x89C6, 0x58E0}, //1654 #CJK UNIFIED IDEOGRAPH
+ {0x89C7, 0x58E1}, //1655 #CJK UNIFIED IDEOGRAPH
+ {0x89C8, 0x58E2}, //1656 #CJK UNIFIED IDEOGRAPH
+ {0x89C9, 0x58E3}, //1657 #CJK UNIFIED IDEOGRAPH
+ {0x89CA, 0x58E5}, //1658 #CJK UNIFIED IDEOGRAPH
+ {0x89CB, 0x58E6}, //1659 #CJK UNIFIED IDEOGRAPH
+ {0x89CC, 0x58E7}, //1660 #CJK UNIFIED IDEOGRAPH
+ {0x89CD, 0x58E8}, //1661 #CJK UNIFIED IDEOGRAPH
+ {0x89CE, 0x58E9}, //1662 #CJK UNIFIED IDEOGRAPH
+ {0x89CF, 0x58EA}, //1663 #CJK UNIFIED IDEOGRAPH
+ {0x89D0, 0x58ED}, //1664 #CJK UNIFIED IDEOGRAPH
+ {0x89D1, 0x58EF}, //1665 #CJK UNIFIED IDEOGRAPH
+ {0x89D2, 0x58F1}, //1666 #CJK UNIFIED IDEOGRAPH
+ {0x89D3, 0x58F2}, //1667 #CJK UNIFIED IDEOGRAPH
+ {0x89D4, 0x58F4}, //1668 #CJK UNIFIED IDEOGRAPH
+ {0x89D5, 0x58F5}, //1669 #CJK UNIFIED IDEOGRAPH
+ {0x89D6, 0x58F7}, //1670 #CJK UNIFIED IDEOGRAPH
+ {0x89D7, 0x58F8}, //1671 #CJK UNIFIED IDEOGRAPH
+ {0x89D8, 0x58FA}, //1672 #CJK UNIFIED IDEOGRAPH
+ {0x89D9, 0x58FB}, //1673 #CJK UNIFIED IDEOGRAPH
+ {0x89DA, 0x58FC}, //1674 #CJK UNIFIED IDEOGRAPH
+ {0x89DB, 0x58FD}, //1675 #CJK UNIFIED IDEOGRAPH
+ {0x89DC, 0x58FE}, //1676 #CJK UNIFIED IDEOGRAPH
+ {0x89DD, 0x58FF}, //1677 #CJK UNIFIED IDEOGRAPH
+ {0x89DE, 0x5900}, //1678 #CJK UNIFIED IDEOGRAPH
+ {0x89DF, 0x5901}, //1679 #CJK UNIFIED IDEOGRAPH
+ {0x89E0, 0x5903}, //1680 #CJK UNIFIED IDEOGRAPH
+ {0x89E1, 0x5905}, //1681 #CJK UNIFIED IDEOGRAPH
+ {0x89E2, 0x5906}, //1682 #CJK UNIFIED IDEOGRAPH
+ {0x89E3, 0x5908}, //1683 #CJK UNIFIED IDEOGRAPH
+ {0x89E4, 0x5909}, //1684 #CJK UNIFIED IDEOGRAPH
+ {0x89E5, 0x590A}, //1685 #CJK UNIFIED IDEOGRAPH
+ {0x89E6, 0x590B}, //1686 #CJK UNIFIED IDEOGRAPH
+ {0x89E7, 0x590C}, //1687 #CJK UNIFIED IDEOGRAPH
+ {0x89E8, 0x590E}, //1688 #CJK UNIFIED IDEOGRAPH
+ {0x89E9, 0x5910}, //1689 #CJK UNIFIED IDEOGRAPH
+ {0x89EA, 0x5911}, //1690 #CJK UNIFIED IDEOGRAPH
+ {0x89EB, 0x5912}, //1691 #CJK UNIFIED IDEOGRAPH
+ {0x89EC, 0x5913}, //1692 #CJK UNIFIED IDEOGRAPH
+ {0x89ED, 0x5917}, //1693 #CJK UNIFIED IDEOGRAPH
+ {0x89EE, 0x5918}, //1694 #CJK UNIFIED IDEOGRAPH
+ {0x89EF, 0x591B}, //1695 #CJK UNIFIED IDEOGRAPH
+ {0x89F0, 0x591D}, //1696 #CJK UNIFIED IDEOGRAPH
+ {0x89F1, 0x591E}, //1697 #CJK UNIFIED IDEOGRAPH
+ {0x89F2, 0x5920}, //1698 #CJK UNIFIED IDEOGRAPH
+ {0x89F3, 0x5921}, //1699 #CJK UNIFIED IDEOGRAPH
+ {0x89F4, 0x5922}, //1700 #CJK UNIFIED IDEOGRAPH
+ {0x89F5, 0x5923}, //1701 #CJK UNIFIED IDEOGRAPH
+ {0x89F6, 0x5926}, //1702 #CJK UNIFIED IDEOGRAPH
+ {0x89F7, 0x5928}, //1703 #CJK UNIFIED IDEOGRAPH
+ {0x89F8, 0x592C}, //1704 #CJK UNIFIED IDEOGRAPH
+ {0x89F9, 0x5930}, //1705 #CJK UNIFIED IDEOGRAPH
+ {0x89FA, 0x5932}, //1706 #CJK UNIFIED IDEOGRAPH
+ {0x89FB, 0x5933}, //1707 #CJK UNIFIED IDEOGRAPH
+ {0x89FC, 0x5935}, //1708 #CJK UNIFIED IDEOGRAPH
+ {0x89FD, 0x5936}, //1709 #CJK UNIFIED IDEOGRAPH
+ {0x89FE, 0x593B}, //1710 #CJK UNIFIED IDEOGRAPH
+ {0x8A40, 0x593D}, //1711 #CJK UNIFIED IDEOGRAPH
+ {0x8A41, 0x593E}, //1712 #CJK UNIFIED IDEOGRAPH
+ {0x8A42, 0x593F}, //1713 #CJK UNIFIED IDEOGRAPH
+ {0x8A43, 0x5940}, //1714 #CJK UNIFIED IDEOGRAPH
+ {0x8A44, 0x5943}, //1715 #CJK UNIFIED IDEOGRAPH
+ {0x8A45, 0x5945}, //1716 #CJK UNIFIED IDEOGRAPH
+ {0x8A46, 0x5946}, //1717 #CJK UNIFIED IDEOGRAPH
+ {0x8A47, 0x594A}, //1718 #CJK UNIFIED IDEOGRAPH
+ {0x8A48, 0x594C}, //1719 #CJK UNIFIED IDEOGRAPH
+ {0x8A49, 0x594D}, //1720 #CJK UNIFIED IDEOGRAPH
+ {0x8A4A, 0x5950}, //1721 #CJK UNIFIED IDEOGRAPH
+ {0x8A4B, 0x5952}, //1722 #CJK UNIFIED IDEOGRAPH
+ {0x8A4C, 0x5953}, //1723 #CJK UNIFIED IDEOGRAPH
+ {0x8A4D, 0x5959}, //1724 #CJK UNIFIED IDEOGRAPH
+ {0x8A4E, 0x595B}, //1725 #CJK UNIFIED IDEOGRAPH
+ {0x8A4F, 0x595C}, //1726 #CJK UNIFIED IDEOGRAPH
+ {0x8A50, 0x595D}, //1727 #CJK UNIFIED IDEOGRAPH
+ {0x8A51, 0x595E}, //1728 #CJK UNIFIED IDEOGRAPH
+ {0x8A52, 0x595F}, //1729 #CJK UNIFIED IDEOGRAPH
+ {0x8A53, 0x5961}, //1730 #CJK UNIFIED IDEOGRAPH
+ {0x8A54, 0x5963}, //1731 #CJK UNIFIED IDEOGRAPH
+ {0x8A55, 0x5964}, //1732 #CJK UNIFIED IDEOGRAPH
+ {0x8A56, 0x5966}, //1733 #CJK UNIFIED IDEOGRAPH
+ {0x8A57, 0x5967}, //1734 #CJK UNIFIED IDEOGRAPH
+ {0x8A58, 0x5968}, //1735 #CJK UNIFIED IDEOGRAPH
+ {0x8A59, 0x5969}, //1736 #CJK UNIFIED IDEOGRAPH
+ {0x8A5A, 0x596A}, //1737 #CJK UNIFIED IDEOGRAPH
+ {0x8A5B, 0x596B}, //1738 #CJK UNIFIED IDEOGRAPH
+ {0x8A5C, 0x596C}, //1739 #CJK UNIFIED IDEOGRAPH
+ {0x8A5D, 0x596D}, //1740 #CJK UNIFIED IDEOGRAPH
+ {0x8A5E, 0x596E}, //1741 #CJK UNIFIED IDEOGRAPH
+ {0x8A5F, 0x596F}, //1742 #CJK UNIFIED IDEOGRAPH
+ {0x8A60, 0x5970}, //1743 #CJK UNIFIED IDEOGRAPH
+ {0x8A61, 0x5971}, //1744 #CJK UNIFIED IDEOGRAPH
+ {0x8A62, 0x5972}, //1745 #CJK UNIFIED IDEOGRAPH
+ {0x8A63, 0x5975}, //1746 #CJK UNIFIED IDEOGRAPH
+ {0x8A64, 0x5977}, //1747 #CJK UNIFIED IDEOGRAPH
+ {0x8A65, 0x597A}, //1748 #CJK UNIFIED IDEOGRAPH
+ {0x8A66, 0x597B}, //1749 #CJK UNIFIED IDEOGRAPH
+ {0x8A67, 0x597C}, //1750 #CJK UNIFIED IDEOGRAPH
+ {0x8A68, 0x597E}, //1751 #CJK UNIFIED IDEOGRAPH
+ {0x8A69, 0x597F}, //1752 #CJK UNIFIED IDEOGRAPH
+ {0x8A6A, 0x5980}, //1753 #CJK UNIFIED IDEOGRAPH
+ {0x8A6B, 0x5985}, //1754 #CJK UNIFIED IDEOGRAPH
+ {0x8A6C, 0x5989}, //1755 #CJK UNIFIED IDEOGRAPH
+ {0x8A6D, 0x598B}, //1756 #CJK UNIFIED IDEOGRAPH
+ {0x8A6E, 0x598C}, //1757 #CJK UNIFIED IDEOGRAPH
+ {0x8A6F, 0x598E}, //1758 #CJK UNIFIED IDEOGRAPH
+ {0x8A70, 0x598F}, //1759 #CJK UNIFIED IDEOGRAPH
+ {0x8A71, 0x5990}, //1760 #CJK UNIFIED IDEOGRAPH
+ {0x8A72, 0x5991}, //1761 #CJK UNIFIED IDEOGRAPH
+ {0x8A73, 0x5994}, //1762 #CJK UNIFIED IDEOGRAPH
+ {0x8A74, 0x5995}, //1763 #CJK UNIFIED IDEOGRAPH
+ {0x8A75, 0x5998}, //1764 #CJK UNIFIED IDEOGRAPH
+ {0x8A76, 0x599A}, //1765 #CJK UNIFIED IDEOGRAPH
+ {0x8A77, 0x599B}, //1766 #CJK UNIFIED IDEOGRAPH
+ {0x8A78, 0x599C}, //1767 #CJK UNIFIED IDEOGRAPH
+ {0x8A79, 0x599D}, //1768 #CJK UNIFIED IDEOGRAPH
+ {0x8A7A, 0x599F}, //1769 #CJK UNIFIED IDEOGRAPH
+ {0x8A7B, 0x59A0}, //1770 #CJK UNIFIED IDEOGRAPH
+ {0x8A7C, 0x59A1}, //1771 #CJK UNIFIED IDEOGRAPH
+ {0x8A7D, 0x59A2}, //1772 #CJK UNIFIED IDEOGRAPH
+ {0x8A7E, 0x59A6}, //1773 #CJK UNIFIED IDEOGRAPH
+ {0x8A80, 0x59A7}, //1774 #CJK UNIFIED IDEOGRAPH
+ {0x8A81, 0x59AC}, //1775 #CJK UNIFIED IDEOGRAPH
+ {0x8A82, 0x59AD}, //1776 #CJK UNIFIED IDEOGRAPH
+ {0x8A83, 0x59B0}, //1777 #CJK UNIFIED IDEOGRAPH
+ {0x8A84, 0x59B1}, //1778 #CJK UNIFIED IDEOGRAPH
+ {0x8A85, 0x59B3}, //1779 #CJK UNIFIED IDEOGRAPH
+ {0x8A86, 0x59B4}, //1780 #CJK UNIFIED IDEOGRAPH
+ {0x8A87, 0x59B5}, //1781 #CJK UNIFIED IDEOGRAPH
+ {0x8A88, 0x59B6}, //1782 #CJK UNIFIED IDEOGRAPH
+ {0x8A89, 0x59B7}, //1783 #CJK UNIFIED IDEOGRAPH
+ {0x8A8A, 0x59B8}, //1784 #CJK UNIFIED IDEOGRAPH
+ {0x8A8B, 0x59BA}, //1785 #CJK UNIFIED IDEOGRAPH
+ {0x8A8C, 0x59BC}, //1786 #CJK UNIFIED IDEOGRAPH
+ {0x8A8D, 0x59BD}, //1787 #CJK UNIFIED IDEOGRAPH
+ {0x8A8E, 0x59BF}, //1788 #CJK UNIFIED IDEOGRAPH
+ {0x8A8F, 0x59C0}, //1789 #CJK UNIFIED IDEOGRAPH
+ {0x8A90, 0x59C1}, //1790 #CJK UNIFIED IDEOGRAPH
+ {0x8A91, 0x59C2}, //1791 #CJK UNIFIED IDEOGRAPH
+ {0x8A92, 0x59C3}, //1792 #CJK UNIFIED IDEOGRAPH
+ {0x8A93, 0x59C4}, //1793 #CJK UNIFIED IDEOGRAPH
+ {0x8A94, 0x59C5}, //1794 #CJK UNIFIED IDEOGRAPH
+ {0x8A95, 0x59C7}, //1795 #CJK UNIFIED IDEOGRAPH
+ {0x8A96, 0x59C8}, //1796 #CJK UNIFIED IDEOGRAPH
+ {0x8A97, 0x59C9}, //1797 #CJK UNIFIED IDEOGRAPH
+ {0x8A98, 0x59CC}, //1798 #CJK UNIFIED IDEOGRAPH
+ {0x8A99, 0x59CD}, //1799 #CJK UNIFIED IDEOGRAPH
+ {0x8A9A, 0x59CE}, //1800 #CJK UNIFIED IDEOGRAPH
+ {0x8A9B, 0x59CF}, //1801 #CJK UNIFIED IDEOGRAPH
+ {0x8A9C, 0x59D5}, //1802 #CJK UNIFIED IDEOGRAPH
+ {0x8A9D, 0x59D6}, //1803 #CJK UNIFIED IDEOGRAPH
+ {0x8A9E, 0x59D9}, //1804 #CJK UNIFIED IDEOGRAPH
+ {0x8A9F, 0x59DB}, //1805 #CJK UNIFIED IDEOGRAPH
+ {0x8AA0, 0x59DE}, //1806 #CJK UNIFIED IDEOGRAPH
+ {0x8AA1, 0x59DF}, //1807 #CJK UNIFIED IDEOGRAPH
+ {0x8AA2, 0x59E0}, //1808 #CJK UNIFIED IDEOGRAPH
+ {0x8AA3, 0x59E1}, //1809 #CJK UNIFIED IDEOGRAPH
+ {0x8AA4, 0x59E2}, //1810 #CJK UNIFIED IDEOGRAPH
+ {0x8AA5, 0x59E4}, //1811 #CJK UNIFIED IDEOGRAPH
+ {0x8AA6, 0x59E6}, //1812 #CJK UNIFIED IDEOGRAPH
+ {0x8AA7, 0x59E7}, //1813 #CJK UNIFIED IDEOGRAPH
+ {0x8AA8, 0x59E9}, //1814 #CJK UNIFIED IDEOGRAPH
+ {0x8AA9, 0x59EA}, //1815 #CJK UNIFIED IDEOGRAPH
+ {0x8AAA, 0x59EB}, //1816 #CJK UNIFIED IDEOGRAPH
+ {0x8AAB, 0x59ED}, //1817 #CJK UNIFIED IDEOGRAPH
+ {0x8AAC, 0x59EE}, //1818 #CJK UNIFIED IDEOGRAPH
+ {0x8AAD, 0x59EF}, //1819 #CJK UNIFIED IDEOGRAPH
+ {0x8AAE, 0x59F0}, //1820 #CJK UNIFIED IDEOGRAPH
+ {0x8AAF, 0x59F1}, //1821 #CJK UNIFIED IDEOGRAPH
+ {0x8AB0, 0x59F2}, //1822 #CJK UNIFIED IDEOGRAPH
+ {0x8AB1, 0x59F3}, //1823 #CJK UNIFIED IDEOGRAPH
+ {0x8AB2, 0x59F4}, //1824 #CJK UNIFIED IDEOGRAPH
+ {0x8AB3, 0x59F5}, //1825 #CJK UNIFIED IDEOGRAPH
+ {0x8AB4, 0x59F6}, //1826 #CJK UNIFIED IDEOGRAPH
+ {0x8AB5, 0x59F7}, //1827 #CJK UNIFIED IDEOGRAPH
+ {0x8AB6, 0x59F8}, //1828 #CJK UNIFIED IDEOGRAPH
+ {0x8AB7, 0x59FA}, //1829 #CJK UNIFIED IDEOGRAPH
+ {0x8AB8, 0x59FC}, //1830 #CJK UNIFIED IDEOGRAPH
+ {0x8AB9, 0x59FD}, //1831 #CJK UNIFIED IDEOGRAPH
+ {0x8ABA, 0x59FE}, //1832 #CJK UNIFIED IDEOGRAPH
+ {0x8ABB, 0x5A00}, //1833 #CJK UNIFIED IDEOGRAPH
+ {0x8ABC, 0x5A02}, //1834 #CJK UNIFIED IDEOGRAPH
+ {0x8ABD, 0x5A0A}, //1835 #CJK UNIFIED IDEOGRAPH
+ {0x8ABE, 0x5A0B}, //1836 #CJK UNIFIED IDEOGRAPH
+ {0x8ABF, 0x5A0D}, //1837 #CJK UNIFIED IDEOGRAPH
+ {0x8AC0, 0x5A0E}, //1838 #CJK UNIFIED IDEOGRAPH
+ {0x8AC1, 0x5A0F}, //1839 #CJK UNIFIED IDEOGRAPH
+ {0x8AC2, 0x5A10}, //1840 #CJK UNIFIED IDEOGRAPH
+ {0x8AC3, 0x5A12}, //1841 #CJK UNIFIED IDEOGRAPH
+ {0x8AC4, 0x5A14}, //1842 #CJK UNIFIED IDEOGRAPH
+ {0x8AC5, 0x5A15}, //1843 #CJK UNIFIED IDEOGRAPH
+ {0x8AC6, 0x5A16}, //1844 #CJK UNIFIED IDEOGRAPH
+ {0x8AC7, 0x5A17}, //1845 #CJK UNIFIED IDEOGRAPH
+ {0x8AC8, 0x5A19}, //1846 #CJK UNIFIED IDEOGRAPH
+ {0x8AC9, 0x5A1A}, //1847 #CJK UNIFIED IDEOGRAPH
+ {0x8ACA, 0x5A1B}, //1848 #CJK UNIFIED IDEOGRAPH
+ {0x8ACB, 0x5A1D}, //1849 #CJK UNIFIED IDEOGRAPH
+ {0x8ACC, 0x5A1E}, //1850 #CJK UNIFIED IDEOGRAPH
+ {0x8ACD, 0x5A21}, //1851 #CJK UNIFIED IDEOGRAPH
+ {0x8ACE, 0x5A22}, //1852 #CJK UNIFIED IDEOGRAPH
+ {0x8ACF, 0x5A24}, //1853 #CJK UNIFIED IDEOGRAPH
+ {0x8AD0, 0x5A26}, //1854 #CJK UNIFIED IDEOGRAPH
+ {0x8AD1, 0x5A27}, //1855 #CJK UNIFIED IDEOGRAPH
+ {0x8AD2, 0x5A28}, //1856 #CJK UNIFIED IDEOGRAPH
+ {0x8AD3, 0x5A2A}, //1857 #CJK UNIFIED IDEOGRAPH
+ {0x8AD4, 0x5A2B}, //1858 #CJK UNIFIED IDEOGRAPH
+ {0x8AD5, 0x5A2C}, //1859 #CJK UNIFIED IDEOGRAPH
+ {0x8AD6, 0x5A2D}, //1860 #CJK UNIFIED IDEOGRAPH
+ {0x8AD7, 0x5A2E}, //1861 #CJK UNIFIED IDEOGRAPH
+ {0x8AD8, 0x5A2F}, //1862 #CJK UNIFIED IDEOGRAPH
+ {0x8AD9, 0x5A30}, //1863 #CJK UNIFIED IDEOGRAPH
+ {0x8ADA, 0x5A33}, //1864 #CJK UNIFIED IDEOGRAPH
+ {0x8ADB, 0x5A35}, //1865 #CJK UNIFIED IDEOGRAPH
+ {0x8ADC, 0x5A37}, //1866 #CJK UNIFIED IDEOGRAPH
+ {0x8ADD, 0x5A38}, //1867 #CJK UNIFIED IDEOGRAPH
+ {0x8ADE, 0x5A39}, //1868 #CJK UNIFIED IDEOGRAPH
+ {0x8ADF, 0x5A3A}, //1869 #CJK UNIFIED IDEOGRAPH
+ {0x8AE0, 0x5A3B}, //1870 #CJK UNIFIED IDEOGRAPH
+ {0x8AE1, 0x5A3D}, //1871 #CJK UNIFIED IDEOGRAPH
+ {0x8AE2, 0x5A3E}, //1872 #CJK UNIFIED IDEOGRAPH
+ {0x8AE3, 0x5A3F}, //1873 #CJK UNIFIED IDEOGRAPH
+ {0x8AE4, 0x5A41}, //1874 #CJK UNIFIED IDEOGRAPH
+ {0x8AE5, 0x5A42}, //1875 #CJK UNIFIED IDEOGRAPH
+ {0x8AE6, 0x5A43}, //1876 #CJK UNIFIED IDEOGRAPH
+ {0x8AE7, 0x5A44}, //1877 #CJK UNIFIED IDEOGRAPH
+ {0x8AE8, 0x5A45}, //1878 #CJK UNIFIED IDEOGRAPH
+ {0x8AE9, 0x5A47}, //1879 #CJK UNIFIED IDEOGRAPH
+ {0x8AEA, 0x5A48}, //1880 #CJK UNIFIED IDEOGRAPH
+ {0x8AEB, 0x5A4B}, //1881 #CJK UNIFIED IDEOGRAPH
+ {0x8AEC, 0x5A4C}, //1882 #CJK UNIFIED IDEOGRAPH
+ {0x8AED, 0x5A4D}, //1883 #CJK UNIFIED IDEOGRAPH
+ {0x8AEE, 0x5A4E}, //1884 #CJK UNIFIED IDEOGRAPH
+ {0x8AEF, 0x5A4F}, //1885 #CJK UNIFIED IDEOGRAPH
+ {0x8AF0, 0x5A50}, //1886 #CJK UNIFIED IDEOGRAPH
+ {0x8AF1, 0x5A51}, //1887 #CJK UNIFIED IDEOGRAPH
+ {0x8AF2, 0x5A52}, //1888 #CJK UNIFIED IDEOGRAPH
+ {0x8AF3, 0x5A53}, //1889 #CJK UNIFIED IDEOGRAPH
+ {0x8AF4, 0x5A54}, //1890 #CJK UNIFIED IDEOGRAPH
+ {0x8AF5, 0x5A56}, //1891 #CJK UNIFIED IDEOGRAPH
+ {0x8AF6, 0x5A57}, //1892 #CJK UNIFIED IDEOGRAPH
+ {0x8AF7, 0x5A58}, //1893 #CJK UNIFIED IDEOGRAPH
+ {0x8AF8, 0x5A59}, //1894 #CJK UNIFIED IDEOGRAPH
+ {0x8AF9, 0x5A5B}, //1895 #CJK UNIFIED IDEOGRAPH
+ {0x8AFA, 0x5A5C}, //1896 #CJK UNIFIED IDEOGRAPH
+ {0x8AFB, 0x5A5D}, //1897 #CJK UNIFIED IDEOGRAPH
+ {0x8AFC, 0x5A5E}, //1898 #CJK UNIFIED IDEOGRAPH
+ {0x8AFD, 0x5A5F}, //1899 #CJK UNIFIED IDEOGRAPH
+ {0x8AFE, 0x5A60}, //1900 #CJK UNIFIED IDEOGRAPH
+ {0x8B40, 0x5A61}, //1901 #CJK UNIFIED IDEOGRAPH
+ {0x8B41, 0x5A63}, //1902 #CJK UNIFIED IDEOGRAPH
+ {0x8B42, 0x5A64}, //1903 #CJK UNIFIED IDEOGRAPH
+ {0x8B43, 0x5A65}, //1904 #CJK UNIFIED IDEOGRAPH
+ {0x8B44, 0x5A66}, //1905 #CJK UNIFIED IDEOGRAPH
+ {0x8B45, 0x5A68}, //1906 #CJK UNIFIED IDEOGRAPH
+ {0x8B46, 0x5A69}, //1907 #CJK UNIFIED IDEOGRAPH
+ {0x8B47, 0x5A6B}, //1908 #CJK UNIFIED IDEOGRAPH
+ {0x8B48, 0x5A6C}, //1909 #CJK UNIFIED IDEOGRAPH
+ {0x8B49, 0x5A6D}, //1910 #CJK UNIFIED IDEOGRAPH
+ {0x8B4A, 0x5A6E}, //1911 #CJK UNIFIED IDEOGRAPH
+ {0x8B4B, 0x5A6F}, //1912 #CJK UNIFIED IDEOGRAPH
+ {0x8B4C, 0x5A70}, //1913 #CJK UNIFIED IDEOGRAPH
+ {0x8B4D, 0x5A71}, //1914 #CJK UNIFIED IDEOGRAPH
+ {0x8B4E, 0x5A72}, //1915 #CJK UNIFIED IDEOGRAPH
+ {0x8B4F, 0x5A73}, //1916 #CJK UNIFIED IDEOGRAPH
+ {0x8B50, 0x5A78}, //1917 #CJK UNIFIED IDEOGRAPH
+ {0x8B51, 0x5A79}, //1918 #CJK UNIFIED IDEOGRAPH
+ {0x8B52, 0x5A7B}, //1919 #CJK UNIFIED IDEOGRAPH
+ {0x8B53, 0x5A7C}, //1920 #CJK UNIFIED IDEOGRAPH
+ {0x8B54, 0x5A7D}, //1921 #CJK UNIFIED IDEOGRAPH
+ {0x8B55, 0x5A7E}, //1922 #CJK UNIFIED IDEOGRAPH
+ {0x8B56, 0x5A80}, //1923 #CJK UNIFIED IDEOGRAPH
+ {0x8B57, 0x5A81}, //1924 #CJK UNIFIED IDEOGRAPH
+ {0x8B58, 0x5A82}, //1925 #CJK UNIFIED IDEOGRAPH
+ {0x8B59, 0x5A83}, //1926 #CJK UNIFIED IDEOGRAPH
+ {0x8B5A, 0x5A84}, //1927 #CJK UNIFIED IDEOGRAPH
+ {0x8B5B, 0x5A85}, //1928 #CJK UNIFIED IDEOGRAPH
+ {0x8B5C, 0x5A86}, //1929 #CJK UNIFIED IDEOGRAPH
+ {0x8B5D, 0x5A87}, //1930 #CJK UNIFIED IDEOGRAPH
+ {0x8B5E, 0x5A88}, //1931 #CJK UNIFIED IDEOGRAPH
+ {0x8B5F, 0x5A89}, //1932 #CJK UNIFIED IDEOGRAPH
+ {0x8B60, 0x5A8A}, //1933 #CJK UNIFIED IDEOGRAPH
+ {0x8B61, 0x5A8B}, //1934 #CJK UNIFIED IDEOGRAPH
+ {0x8B62, 0x5A8C}, //1935 #CJK UNIFIED IDEOGRAPH
+ {0x8B63, 0x5A8D}, //1936 #CJK UNIFIED IDEOGRAPH
+ {0x8B64, 0x5A8E}, //1937 #CJK UNIFIED IDEOGRAPH
+ {0x8B65, 0x5A8F}, //1938 #CJK UNIFIED IDEOGRAPH
+ {0x8B66, 0x5A90}, //1939 #CJK UNIFIED IDEOGRAPH
+ {0x8B67, 0x5A91}, //1940 #CJK UNIFIED IDEOGRAPH
+ {0x8B68, 0x5A93}, //1941 #CJK UNIFIED IDEOGRAPH
+ {0x8B69, 0x5A94}, //1942 #CJK UNIFIED IDEOGRAPH
+ {0x8B6A, 0x5A95}, //1943 #CJK UNIFIED IDEOGRAPH
+ {0x8B6B, 0x5A96}, //1944 #CJK UNIFIED IDEOGRAPH
+ {0x8B6C, 0x5A97}, //1945 #CJK UNIFIED IDEOGRAPH
+ {0x8B6D, 0x5A98}, //1946 #CJK UNIFIED IDEOGRAPH
+ {0x8B6E, 0x5A99}, //1947 #CJK UNIFIED IDEOGRAPH
+ {0x8B6F, 0x5A9C}, //1948 #CJK UNIFIED IDEOGRAPH
+ {0x8B70, 0x5A9D}, //1949 #CJK UNIFIED IDEOGRAPH
+ {0x8B71, 0x5A9E}, //1950 #CJK UNIFIED IDEOGRAPH
+ {0x8B72, 0x5A9F}, //1951 #CJK UNIFIED IDEOGRAPH
+ {0x8B73, 0x5AA0}, //1952 #CJK UNIFIED IDEOGRAPH
+ {0x8B74, 0x5AA1}, //1953 #CJK UNIFIED IDEOGRAPH
+ {0x8B75, 0x5AA2}, //1954 #CJK UNIFIED IDEOGRAPH
+ {0x8B76, 0x5AA3}, //1955 #CJK UNIFIED IDEOGRAPH
+ {0x8B77, 0x5AA4}, //1956 #CJK UNIFIED IDEOGRAPH
+ {0x8B78, 0x5AA5}, //1957 #CJK UNIFIED IDEOGRAPH
+ {0x8B79, 0x5AA6}, //1958 #CJK UNIFIED IDEOGRAPH
+ {0x8B7A, 0x5AA7}, //1959 #CJK UNIFIED IDEOGRAPH
+ {0x8B7B, 0x5AA8}, //1960 #CJK UNIFIED IDEOGRAPH
+ {0x8B7C, 0x5AA9}, //1961 #CJK UNIFIED IDEOGRAPH
+ {0x8B7D, 0x5AAB}, //1962 #CJK UNIFIED IDEOGRAPH
+ {0x8B7E, 0x5AAC}, //1963 #CJK UNIFIED IDEOGRAPH
+ {0x8B80, 0x5AAD}, //1964 #CJK UNIFIED IDEOGRAPH
+ {0x8B81, 0x5AAE}, //1965 #CJK UNIFIED IDEOGRAPH
+ {0x8B82, 0x5AAF}, //1966 #CJK UNIFIED IDEOGRAPH
+ {0x8B83, 0x5AB0}, //1967 #CJK UNIFIED IDEOGRAPH
+ {0x8B84, 0x5AB1}, //1968 #CJK UNIFIED IDEOGRAPH
+ {0x8B85, 0x5AB4}, //1969 #CJK UNIFIED IDEOGRAPH
+ {0x8B86, 0x5AB6}, //1970 #CJK UNIFIED IDEOGRAPH
+ {0x8B87, 0x5AB7}, //1971 #CJK UNIFIED IDEOGRAPH
+ {0x8B88, 0x5AB9}, //1972 #CJK UNIFIED IDEOGRAPH
+ {0x8B89, 0x5ABA}, //1973 #CJK UNIFIED IDEOGRAPH
+ {0x8B8A, 0x5ABB}, //1974 #CJK UNIFIED IDEOGRAPH
+ {0x8B8B, 0x5ABC}, //1975 #CJK UNIFIED IDEOGRAPH
+ {0x8B8C, 0x5ABD}, //1976 #CJK UNIFIED IDEOGRAPH
+ {0x8B8D, 0x5ABF}, //1977 #CJK UNIFIED IDEOGRAPH
+ {0x8B8E, 0x5AC0}, //1978 #CJK UNIFIED IDEOGRAPH
+ {0x8B8F, 0x5AC3}, //1979 #CJK UNIFIED IDEOGRAPH
+ {0x8B90, 0x5AC4}, //1980 #CJK UNIFIED IDEOGRAPH
+ {0x8B91, 0x5AC5}, //1981 #CJK UNIFIED IDEOGRAPH
+ {0x8B92, 0x5AC6}, //1982 #CJK UNIFIED IDEOGRAPH
+ {0x8B93, 0x5AC7}, //1983 #CJK UNIFIED IDEOGRAPH
+ {0x8B94, 0x5AC8}, //1984 #CJK UNIFIED IDEOGRAPH
+ {0x8B95, 0x5ACA}, //1985 #CJK UNIFIED IDEOGRAPH
+ {0x8B96, 0x5ACB}, //1986 #CJK UNIFIED IDEOGRAPH
+ {0x8B97, 0x5ACD}, //1987 #CJK UNIFIED IDEOGRAPH
+ {0x8B98, 0x5ACE}, //1988 #CJK UNIFIED IDEOGRAPH
+ {0x8B99, 0x5ACF}, //1989 #CJK UNIFIED IDEOGRAPH
+ {0x8B9A, 0x5AD0}, //1990 #CJK UNIFIED IDEOGRAPH
+ {0x8B9B, 0x5AD1}, //1991 #CJK UNIFIED IDEOGRAPH
+ {0x8B9C, 0x5AD3}, //1992 #CJK UNIFIED IDEOGRAPH
+ {0x8B9D, 0x5AD5}, //1993 #CJK UNIFIED IDEOGRAPH
+ {0x8B9E, 0x5AD7}, //1994 #CJK UNIFIED IDEOGRAPH
+ {0x8B9F, 0x5AD9}, //1995 #CJK UNIFIED IDEOGRAPH
+ {0x8BA0, 0x5ADA}, //1996 #CJK UNIFIED IDEOGRAPH
+ {0x8BA1, 0x5ADB}, //1997 #CJK UNIFIED IDEOGRAPH
+ {0x8BA2, 0x5ADD}, //1998 #CJK UNIFIED IDEOGRAPH
+ {0x8BA3, 0x5ADE}, //1999 #CJK UNIFIED IDEOGRAPH
+ {0x8BA4, 0x5ADF}, //2000 #CJK UNIFIED IDEOGRAPH
+ {0x8BA5, 0x5AE2}, //2001 #CJK UNIFIED IDEOGRAPH
+ {0x8BA6, 0x5AE4}, //2002 #CJK UNIFIED IDEOGRAPH
+ {0x8BA7, 0x5AE5}, //2003 #CJK UNIFIED IDEOGRAPH
+ {0x8BA8, 0x5AE7}, //2004 #CJK UNIFIED IDEOGRAPH
+ {0x8BA9, 0x5AE8}, //2005 #CJK UNIFIED IDEOGRAPH
+ {0x8BAA, 0x5AEA}, //2006 #CJK UNIFIED IDEOGRAPH
+ {0x8BAB, 0x5AEC}, //2007 #CJK UNIFIED IDEOGRAPH
+ {0x8BAC, 0x5AED}, //2008 #CJK UNIFIED IDEOGRAPH
+ {0x8BAD, 0x5AEE}, //2009 #CJK UNIFIED IDEOGRAPH
+ {0x8BAE, 0x5AEF}, //2010 #CJK UNIFIED IDEOGRAPH
+ {0x8BAF, 0x5AF0}, //2011 #CJK UNIFIED IDEOGRAPH
+ {0x8BB0, 0x5AF2}, //2012 #CJK UNIFIED IDEOGRAPH
+ {0x8BB1, 0x5AF3}, //2013 #CJK UNIFIED IDEOGRAPH
+ {0x8BB2, 0x5AF4}, //2014 #CJK UNIFIED IDEOGRAPH
+ {0x8BB3, 0x5AF5}, //2015 #CJK UNIFIED IDEOGRAPH
+ {0x8BB4, 0x5AF6}, //2016 #CJK UNIFIED IDEOGRAPH
+ {0x8BB5, 0x5AF7}, //2017 #CJK UNIFIED IDEOGRAPH
+ {0x8BB6, 0x5AF8}, //2018 #CJK UNIFIED IDEOGRAPH
+ {0x8BB7, 0x5AF9}, //2019 #CJK UNIFIED IDEOGRAPH
+ {0x8BB8, 0x5AFA}, //2020 #CJK UNIFIED IDEOGRAPH
+ {0x8BB9, 0x5AFB}, //2021 #CJK UNIFIED IDEOGRAPH
+ {0x8BBA, 0x5AFC}, //2022 #CJK UNIFIED IDEOGRAPH
+ {0x8BBB, 0x5AFD}, //2023 #CJK UNIFIED IDEOGRAPH
+ {0x8BBC, 0x5AFE}, //2024 #CJK UNIFIED IDEOGRAPH
+ {0x8BBD, 0x5AFF}, //2025 #CJK UNIFIED IDEOGRAPH
+ {0x8BBE, 0x5B00}, //2026 #CJK UNIFIED IDEOGRAPH
+ {0x8BBF, 0x5B01}, //2027 #CJK UNIFIED IDEOGRAPH
+ {0x8BC0, 0x5B02}, //2028 #CJK UNIFIED IDEOGRAPH
+ {0x8BC1, 0x5B03}, //2029 #CJK UNIFIED IDEOGRAPH
+ {0x8BC2, 0x5B04}, //2030 #CJK UNIFIED IDEOGRAPH
+ {0x8BC3, 0x5B05}, //2031 #CJK UNIFIED IDEOGRAPH
+ {0x8BC4, 0x5B06}, //2032 #CJK UNIFIED IDEOGRAPH
+ {0x8BC5, 0x5B07}, //2033 #CJK UNIFIED IDEOGRAPH
+ {0x8BC6, 0x5B08}, //2034 #CJK UNIFIED IDEOGRAPH
+ {0x8BC7, 0x5B0A}, //2035 #CJK UNIFIED IDEOGRAPH
+ {0x8BC8, 0x5B0B}, //2036 #CJK UNIFIED IDEOGRAPH
+ {0x8BC9, 0x5B0C}, //2037 #CJK UNIFIED IDEOGRAPH
+ {0x8BCA, 0x5B0D}, //2038 #CJK UNIFIED IDEOGRAPH
+ {0x8BCB, 0x5B0E}, //2039 #CJK UNIFIED IDEOGRAPH
+ {0x8BCC, 0x5B0F}, //2040 #CJK UNIFIED IDEOGRAPH
+ {0x8BCD, 0x5B10}, //2041 #CJK UNIFIED IDEOGRAPH
+ {0x8BCE, 0x5B11}, //2042 #CJK UNIFIED IDEOGRAPH
+ {0x8BCF, 0x5B12}, //2043 #CJK UNIFIED IDEOGRAPH
+ {0x8BD0, 0x5B13}, //2044 #CJK UNIFIED IDEOGRAPH
+ {0x8BD1, 0x5B14}, //2045 #CJK UNIFIED IDEOGRAPH
+ {0x8BD2, 0x5B15}, //2046 #CJK UNIFIED IDEOGRAPH
+ {0x8BD3, 0x5B18}, //2047 #CJK UNIFIED IDEOGRAPH
+ {0x8BD4, 0x5B19}, //2048 #CJK UNIFIED IDEOGRAPH
+ {0x8BD5, 0x5B1A}, //2049 #CJK UNIFIED IDEOGRAPH
+ {0x8BD6, 0x5B1B}, //2050 #CJK UNIFIED IDEOGRAPH
+ {0x8BD7, 0x5B1C}, //2051 #CJK UNIFIED IDEOGRAPH
+ {0x8BD8, 0x5B1D}, //2052 #CJK UNIFIED IDEOGRAPH
+ {0x8BD9, 0x5B1E}, //2053 #CJK UNIFIED IDEOGRAPH
+ {0x8BDA, 0x5B1F}, //2054 #CJK UNIFIED IDEOGRAPH
+ {0x8BDB, 0x5B20}, //2055 #CJK UNIFIED IDEOGRAPH
+ {0x8BDC, 0x5B21}, //2056 #CJK UNIFIED IDEOGRAPH
+ {0x8BDD, 0x5B22}, //2057 #CJK UNIFIED IDEOGRAPH
+ {0x8BDE, 0x5B23}, //2058 #CJK UNIFIED IDEOGRAPH
+ {0x8BDF, 0x5B24}, //2059 #CJK UNIFIED IDEOGRAPH
+ {0x8BE0, 0x5B25}, //2060 #CJK UNIFIED IDEOGRAPH
+ {0x8BE1, 0x5B26}, //2061 #CJK UNIFIED IDEOGRAPH
+ {0x8BE2, 0x5B27}, //2062 #CJK UNIFIED IDEOGRAPH
+ {0x8BE3, 0x5B28}, //2063 #CJK UNIFIED IDEOGRAPH
+ {0x8BE4, 0x5B29}, //2064 #CJK UNIFIED IDEOGRAPH
+ {0x8BE5, 0x5B2A}, //2065 #CJK UNIFIED IDEOGRAPH
+ {0x8BE6, 0x5B2B}, //2066 #CJK UNIFIED IDEOGRAPH
+ {0x8BE7, 0x5B2C}, //2067 #CJK UNIFIED IDEOGRAPH
+ {0x8BE8, 0x5B2D}, //2068 #CJK UNIFIED IDEOGRAPH
+ {0x8BE9, 0x5B2E}, //2069 #CJK UNIFIED IDEOGRAPH
+ {0x8BEA, 0x5B2F}, //2070 #CJK UNIFIED IDEOGRAPH
+ {0x8BEB, 0x5B30}, //2071 #CJK UNIFIED IDEOGRAPH
+ {0x8BEC, 0x5B31}, //2072 #CJK UNIFIED IDEOGRAPH
+ {0x8BED, 0x5B33}, //2073 #CJK UNIFIED IDEOGRAPH
+ {0x8BEE, 0x5B35}, //2074 #CJK UNIFIED IDEOGRAPH
+ {0x8BEF, 0x5B36}, //2075 #CJK UNIFIED IDEOGRAPH
+ {0x8BF0, 0x5B38}, //2076 #CJK UNIFIED IDEOGRAPH
+ {0x8BF1, 0x5B39}, //2077 #CJK UNIFIED IDEOGRAPH
+ {0x8BF2, 0x5B3A}, //2078 #CJK UNIFIED IDEOGRAPH
+ {0x8BF3, 0x5B3B}, //2079 #CJK UNIFIED IDEOGRAPH
+ {0x8BF4, 0x5B3C}, //2080 #CJK UNIFIED IDEOGRAPH
+ {0x8BF5, 0x5B3D}, //2081 #CJK UNIFIED IDEOGRAPH
+ {0x8BF6, 0x5B3E}, //2082 #CJK UNIFIED IDEOGRAPH
+ {0x8BF7, 0x5B3F}, //2083 #CJK UNIFIED IDEOGRAPH
+ {0x8BF8, 0x5B41}, //2084 #CJK UNIFIED IDEOGRAPH
+ {0x8BF9, 0x5B42}, //2085 #CJK UNIFIED IDEOGRAPH
+ {0x8BFA, 0x5B43}, //2086 #CJK UNIFIED IDEOGRAPH
+ {0x8BFB, 0x5B44}, //2087 #CJK UNIFIED IDEOGRAPH
+ {0x8BFC, 0x5B45}, //2088 #CJK UNIFIED IDEOGRAPH
+ {0x8BFD, 0x5B46}, //2089 #CJK UNIFIED IDEOGRAPH
+ {0x8BFE, 0x5B47}, //2090 #CJK UNIFIED IDEOGRAPH
+ {0x8C40, 0x5B48}, //2091 #CJK UNIFIED IDEOGRAPH
+ {0x8C41, 0x5B49}, //2092 #CJK UNIFIED IDEOGRAPH
+ {0x8C42, 0x5B4A}, //2093 #CJK UNIFIED IDEOGRAPH
+ {0x8C43, 0x5B4B}, //2094 #CJK UNIFIED IDEOGRAPH
+ {0x8C44, 0x5B4C}, //2095 #CJK UNIFIED IDEOGRAPH
+ {0x8C45, 0x5B4D}, //2096 #CJK UNIFIED IDEOGRAPH
+ {0x8C46, 0x5B4E}, //2097 #CJK UNIFIED IDEOGRAPH
+ {0x8C47, 0x5B4F}, //2098 #CJK UNIFIED IDEOGRAPH
+ {0x8C48, 0x5B52}, //2099 #CJK UNIFIED IDEOGRAPH
+ {0x8C49, 0x5B56}, //2100 #CJK UNIFIED IDEOGRAPH
+ {0x8C4A, 0x5B5E}, //2101 #CJK UNIFIED IDEOGRAPH
+ {0x8C4B, 0x5B60}, //2102 #CJK UNIFIED IDEOGRAPH
+ {0x8C4C, 0x5B61}, //2103 #CJK UNIFIED IDEOGRAPH
+ {0x8C4D, 0x5B67}, //2104 #CJK UNIFIED IDEOGRAPH
+ {0x8C4E, 0x5B68}, //2105 #CJK UNIFIED IDEOGRAPH
+ {0x8C4F, 0x5B6B}, //2106 #CJK UNIFIED IDEOGRAPH
+ {0x8C50, 0x5B6D}, //2107 #CJK UNIFIED IDEOGRAPH
+ {0x8C51, 0x5B6E}, //2108 #CJK UNIFIED IDEOGRAPH
+ {0x8C52, 0x5B6F}, //2109 #CJK UNIFIED IDEOGRAPH
+ {0x8C53, 0x5B72}, //2110 #CJK UNIFIED IDEOGRAPH
+ {0x8C54, 0x5B74}, //2111 #CJK UNIFIED IDEOGRAPH
+ {0x8C55, 0x5B76}, //2112 #CJK UNIFIED IDEOGRAPH
+ {0x8C56, 0x5B77}, //2113 #CJK UNIFIED IDEOGRAPH
+ {0x8C57, 0x5B78}, //2114 #CJK UNIFIED IDEOGRAPH
+ {0x8C58, 0x5B79}, //2115 #CJK UNIFIED IDEOGRAPH
+ {0x8C59, 0x5B7B}, //2116 #CJK UNIFIED IDEOGRAPH
+ {0x8C5A, 0x5B7C}, //2117 #CJK UNIFIED IDEOGRAPH
+ {0x8C5B, 0x5B7E}, //2118 #CJK UNIFIED IDEOGRAPH
+ {0x8C5C, 0x5B7F}, //2119 #CJK UNIFIED IDEOGRAPH
+ {0x8C5D, 0x5B82}, //2120 #CJK UNIFIED IDEOGRAPH
+ {0x8C5E, 0x5B86}, //2121 #CJK UNIFIED IDEOGRAPH
+ {0x8C5F, 0x5B8A}, //2122 #CJK UNIFIED IDEOGRAPH
+ {0x8C60, 0x5B8D}, //2123 #CJK UNIFIED IDEOGRAPH
+ {0x8C61, 0x5B8E}, //2124 #CJK UNIFIED IDEOGRAPH
+ {0x8C62, 0x5B90}, //2125 #CJK UNIFIED IDEOGRAPH
+ {0x8C63, 0x5B91}, //2126 #CJK UNIFIED IDEOGRAPH
+ {0x8C64, 0x5B92}, //2127 #CJK UNIFIED IDEOGRAPH
+ {0x8C65, 0x5B94}, //2128 #CJK UNIFIED IDEOGRAPH
+ {0x8C66, 0x5B96}, //2129 #CJK UNIFIED IDEOGRAPH
+ {0x8C67, 0x5B9F}, //2130 #CJK UNIFIED IDEOGRAPH
+ {0x8C68, 0x5BA7}, //2131 #CJK UNIFIED IDEOGRAPH
+ {0x8C69, 0x5BA8}, //2132 #CJK UNIFIED IDEOGRAPH
+ {0x8C6A, 0x5BA9}, //2133 #CJK UNIFIED IDEOGRAPH
+ {0x8C6B, 0x5BAC}, //2134 #CJK UNIFIED IDEOGRAPH
+ {0x8C6C, 0x5BAD}, //2135 #CJK UNIFIED IDEOGRAPH
+ {0x8C6D, 0x5BAE}, //2136 #CJK UNIFIED IDEOGRAPH
+ {0x8C6E, 0x5BAF}, //2137 #CJK UNIFIED IDEOGRAPH
+ {0x8C6F, 0x5BB1}, //2138 #CJK UNIFIED IDEOGRAPH
+ {0x8C70, 0x5BB2}, //2139 #CJK UNIFIED IDEOGRAPH
+ {0x8C71, 0x5BB7}, //2140 #CJK UNIFIED IDEOGRAPH
+ {0x8C72, 0x5BBA}, //2141 #CJK UNIFIED IDEOGRAPH
+ {0x8C73, 0x5BBB}, //2142 #CJK UNIFIED IDEOGRAPH
+ {0x8C74, 0x5BBC}, //2143 #CJK UNIFIED IDEOGRAPH
+ {0x8C75, 0x5BC0}, //2144 #CJK UNIFIED IDEOGRAPH
+ {0x8C76, 0x5BC1}, //2145 #CJK UNIFIED IDEOGRAPH
+ {0x8C77, 0x5BC3}, //2146 #CJK UNIFIED IDEOGRAPH
+ {0x8C78, 0x5BC8}, //2147 #CJK UNIFIED IDEOGRAPH
+ {0x8C79, 0x5BC9}, //2148 #CJK UNIFIED IDEOGRAPH
+ {0x8C7A, 0x5BCA}, //2149 #CJK UNIFIED IDEOGRAPH
+ {0x8C7B, 0x5BCB}, //2150 #CJK UNIFIED IDEOGRAPH
+ {0x8C7C, 0x5BCD}, //2151 #CJK UNIFIED IDEOGRAPH
+ {0x8C7D, 0x5BCE}, //2152 #CJK UNIFIED IDEOGRAPH
+ {0x8C7E, 0x5BCF}, //2153 #CJK UNIFIED IDEOGRAPH
+ {0x8C80, 0x5BD1}, //2154 #CJK UNIFIED IDEOGRAPH
+ {0x8C81, 0x5BD4}, //2155 #CJK UNIFIED IDEOGRAPH
+ {0x8C82, 0x5BD5}, //2156 #CJK UNIFIED IDEOGRAPH
+ {0x8C83, 0x5BD6}, //2157 #CJK UNIFIED IDEOGRAPH
+ {0x8C84, 0x5BD7}, //2158 #CJK UNIFIED IDEOGRAPH
+ {0x8C85, 0x5BD8}, //2159 #CJK UNIFIED IDEOGRAPH
+ {0x8C86, 0x5BD9}, //2160 #CJK UNIFIED IDEOGRAPH
+ {0x8C87, 0x5BDA}, //2161 #CJK UNIFIED IDEOGRAPH
+ {0x8C88, 0x5BDB}, //2162 #CJK UNIFIED IDEOGRAPH
+ {0x8C89, 0x5BDC}, //2163 #CJK UNIFIED IDEOGRAPH
+ {0x8C8A, 0x5BE0}, //2164 #CJK UNIFIED IDEOGRAPH
+ {0x8C8B, 0x5BE2}, //2165 #CJK UNIFIED IDEOGRAPH
+ {0x8C8C, 0x5BE3}, //2166 #CJK UNIFIED IDEOGRAPH
+ {0x8C8D, 0x5BE6}, //2167 #CJK UNIFIED IDEOGRAPH
+ {0x8C8E, 0x5BE7}, //2168 #CJK UNIFIED IDEOGRAPH
+ {0x8C8F, 0x5BE9}, //2169 #CJK UNIFIED IDEOGRAPH
+ {0x8C90, 0x5BEA}, //2170 #CJK UNIFIED IDEOGRAPH
+ {0x8C91, 0x5BEB}, //2171 #CJK UNIFIED IDEOGRAPH
+ {0x8C92, 0x5BEC}, //2172 #CJK UNIFIED IDEOGRAPH
+ {0x8C93, 0x5BED}, //2173 #CJK UNIFIED IDEOGRAPH
+ {0x8C94, 0x5BEF}, //2174 #CJK UNIFIED IDEOGRAPH
+ {0x8C95, 0x5BF1}, //2175 #CJK UNIFIED IDEOGRAPH
+ {0x8C96, 0x5BF2}, //2176 #CJK UNIFIED IDEOGRAPH
+ {0x8C97, 0x5BF3}, //2177 #CJK UNIFIED IDEOGRAPH
+ {0x8C98, 0x5BF4}, //2178 #CJK UNIFIED IDEOGRAPH
+ {0x8C99, 0x5BF5}, //2179 #CJK UNIFIED IDEOGRAPH
+ {0x8C9A, 0x5BF6}, //2180 #CJK UNIFIED IDEOGRAPH
+ {0x8C9B, 0x5BF7}, //2181 #CJK UNIFIED IDEOGRAPH
+ {0x8C9C, 0x5BFD}, //2182 #CJK UNIFIED IDEOGRAPH
+ {0x8C9D, 0x5BFE}, //2183 #CJK UNIFIED IDEOGRAPH
+ {0x8C9E, 0x5C00}, //2184 #CJK UNIFIED IDEOGRAPH
+ {0x8C9F, 0x5C02}, //2185 #CJK UNIFIED IDEOGRAPH
+ {0x8CA0, 0x5C03}, //2186 #CJK UNIFIED IDEOGRAPH
+ {0x8CA1, 0x5C05}, //2187 #CJK UNIFIED IDEOGRAPH
+ {0x8CA2, 0x5C07}, //2188 #CJK UNIFIED IDEOGRAPH
+ {0x8CA3, 0x5C08}, //2189 #CJK UNIFIED IDEOGRAPH
+ {0x8CA4, 0x5C0B}, //2190 #CJK UNIFIED IDEOGRAPH
+ {0x8CA5, 0x5C0C}, //2191 #CJK UNIFIED IDEOGRAPH
+ {0x8CA6, 0x5C0D}, //2192 #CJK UNIFIED IDEOGRAPH
+ {0x8CA7, 0x5C0E}, //2193 #CJK UNIFIED IDEOGRAPH
+ {0x8CA8, 0x5C10}, //2194 #CJK UNIFIED IDEOGRAPH
+ {0x8CA9, 0x5C12}, //2195 #CJK UNIFIED IDEOGRAPH
+ {0x8CAA, 0x5C13}, //2196 #CJK UNIFIED IDEOGRAPH
+ {0x8CAB, 0x5C17}, //2197 #CJK UNIFIED IDEOGRAPH
+ {0x8CAC, 0x5C19}, //2198 #CJK UNIFIED IDEOGRAPH
+ {0x8CAD, 0x5C1B}, //2199 #CJK UNIFIED IDEOGRAPH
+ {0x8CAE, 0x5C1E}, //2200 #CJK UNIFIED IDEOGRAPH
+ {0x8CAF, 0x5C1F}, //2201 #CJK UNIFIED IDEOGRAPH
+ {0x8CB0, 0x5C20}, //2202 #CJK UNIFIED IDEOGRAPH
+ {0x8CB1, 0x5C21}, //2203 #CJK UNIFIED IDEOGRAPH
+ {0x8CB2, 0x5C23}, //2204 #CJK UNIFIED IDEOGRAPH
+ {0x8CB3, 0x5C26}, //2205 #CJK UNIFIED IDEOGRAPH
+ {0x8CB4, 0x5C28}, //2206 #CJK UNIFIED IDEOGRAPH
+ {0x8CB5, 0x5C29}, //2207 #CJK UNIFIED IDEOGRAPH
+ {0x8CB6, 0x5C2A}, //2208 #CJK UNIFIED IDEOGRAPH
+ {0x8CB7, 0x5C2B}, //2209 #CJK UNIFIED IDEOGRAPH
+ {0x8CB8, 0x5C2D}, //2210 #CJK UNIFIED IDEOGRAPH
+ {0x8CB9, 0x5C2E}, //2211 #CJK UNIFIED IDEOGRAPH
+ {0x8CBA, 0x5C2F}, //2212 #CJK UNIFIED IDEOGRAPH
+ {0x8CBB, 0x5C30}, //2213 #CJK UNIFIED IDEOGRAPH
+ {0x8CBC, 0x5C32}, //2214 #CJK UNIFIED IDEOGRAPH
+ {0x8CBD, 0x5C33}, //2215 #CJK UNIFIED IDEOGRAPH
+ {0x8CBE, 0x5C35}, //2216 #CJK UNIFIED IDEOGRAPH
+ {0x8CBF, 0x5C36}, //2217 #CJK UNIFIED IDEOGRAPH
+ {0x8CC0, 0x5C37}, //2218 #CJK UNIFIED IDEOGRAPH
+ {0x8CC1, 0x5C43}, //2219 #CJK UNIFIED IDEOGRAPH
+ {0x8CC2, 0x5C44}, //2220 #CJK UNIFIED IDEOGRAPH
+ {0x8CC3, 0x5C46}, //2221 #CJK UNIFIED IDEOGRAPH
+ {0x8CC4, 0x5C47}, //2222 #CJK UNIFIED IDEOGRAPH
+ {0x8CC5, 0x5C4C}, //2223 #CJK UNIFIED IDEOGRAPH
+ {0x8CC6, 0x5C4D}, //2224 #CJK UNIFIED IDEOGRAPH
+ {0x8CC7, 0x5C52}, //2225 #CJK UNIFIED IDEOGRAPH
+ {0x8CC8, 0x5C53}, //2226 #CJK UNIFIED IDEOGRAPH
+ {0x8CC9, 0x5C54}, //2227 #CJK UNIFIED IDEOGRAPH
+ {0x8CCA, 0x5C56}, //2228 #CJK UNIFIED IDEOGRAPH
+ {0x8CCB, 0x5C57}, //2229 #CJK UNIFIED IDEOGRAPH
+ {0x8CCC, 0x5C58}, //2230 #CJK UNIFIED IDEOGRAPH
+ {0x8CCD, 0x5C5A}, //2231 #CJK UNIFIED IDEOGRAPH
+ {0x8CCE, 0x5C5B}, //2232 #CJK UNIFIED IDEOGRAPH
+ {0x8CCF, 0x5C5C}, //2233 #CJK UNIFIED IDEOGRAPH
+ {0x8CD0, 0x5C5D}, //2234 #CJK UNIFIED IDEOGRAPH
+ {0x8CD1, 0x5C5F}, //2235 #CJK UNIFIED IDEOGRAPH
+ {0x8CD2, 0x5C62}, //2236 #CJK UNIFIED IDEOGRAPH
+ {0x8CD3, 0x5C64}, //2237 #CJK UNIFIED IDEOGRAPH
+ {0x8CD4, 0x5C67}, //2238 #CJK UNIFIED IDEOGRAPH
+ {0x8CD5, 0x5C68}, //2239 #CJK UNIFIED IDEOGRAPH
+ {0x8CD6, 0x5C69}, //2240 #CJK UNIFIED IDEOGRAPH
+ {0x8CD7, 0x5C6A}, //2241 #CJK UNIFIED IDEOGRAPH
+ {0x8CD8, 0x5C6B}, //2242 #CJK UNIFIED IDEOGRAPH
+ {0x8CD9, 0x5C6C}, //2243 #CJK UNIFIED IDEOGRAPH
+ {0x8CDA, 0x5C6D}, //2244 #CJK UNIFIED IDEOGRAPH
+ {0x8CDB, 0x5C70}, //2245 #CJK UNIFIED IDEOGRAPH
+ {0x8CDC, 0x5C72}, //2246 #CJK UNIFIED IDEOGRAPH
+ {0x8CDD, 0x5C73}, //2247 #CJK UNIFIED IDEOGRAPH
+ {0x8CDE, 0x5C74}, //2248 #CJK UNIFIED IDEOGRAPH
+ {0x8CDF, 0x5C75}, //2249 #CJK UNIFIED IDEOGRAPH
+ {0x8CE0, 0x5C76}, //2250 #CJK UNIFIED IDEOGRAPH
+ {0x8CE1, 0x5C77}, //2251 #CJK UNIFIED IDEOGRAPH
+ {0x8CE2, 0x5C78}, //2252 #CJK UNIFIED IDEOGRAPH
+ {0x8CE3, 0x5C7B}, //2253 #CJK UNIFIED IDEOGRAPH
+ {0x8CE4, 0x5C7C}, //2254 #CJK UNIFIED IDEOGRAPH
+ {0x8CE5, 0x5C7D}, //2255 #CJK UNIFIED IDEOGRAPH
+ {0x8CE6, 0x5C7E}, //2256 #CJK UNIFIED IDEOGRAPH
+ {0x8CE7, 0x5C80}, //2257 #CJK UNIFIED IDEOGRAPH
+ {0x8CE8, 0x5C83}, //2258 #CJK UNIFIED IDEOGRAPH
+ {0x8CE9, 0x5C84}, //2259 #CJK UNIFIED IDEOGRAPH
+ {0x8CEA, 0x5C85}, //2260 #CJK UNIFIED IDEOGRAPH
+ {0x8CEB, 0x5C86}, //2261 #CJK UNIFIED IDEOGRAPH
+ {0x8CEC, 0x5C87}, //2262 #CJK UNIFIED IDEOGRAPH
+ {0x8CED, 0x5C89}, //2263 #CJK UNIFIED IDEOGRAPH
+ {0x8CEE, 0x5C8A}, //2264 #CJK UNIFIED IDEOGRAPH
+ {0x8CEF, 0x5C8B}, //2265 #CJK UNIFIED IDEOGRAPH
+ {0x8CF0, 0x5C8E}, //2266 #CJK UNIFIED IDEOGRAPH
+ {0x8CF1, 0x5C8F}, //2267 #CJK UNIFIED IDEOGRAPH
+ {0x8CF2, 0x5C92}, //2268 #CJK UNIFIED IDEOGRAPH
+ {0x8CF3, 0x5C93}, //2269 #CJK UNIFIED IDEOGRAPH
+ {0x8CF4, 0x5C95}, //2270 #CJK UNIFIED IDEOGRAPH
+ {0x8CF5, 0x5C9D}, //2271 #CJK UNIFIED IDEOGRAPH
+ {0x8CF6, 0x5C9E}, //2272 #CJK UNIFIED IDEOGRAPH
+ {0x8CF7, 0x5C9F}, //2273 #CJK UNIFIED IDEOGRAPH
+ {0x8CF8, 0x5CA0}, //2274 #CJK UNIFIED IDEOGRAPH
+ {0x8CF9, 0x5CA1}, //2275 #CJK UNIFIED IDEOGRAPH
+ {0x8CFA, 0x5CA4}, //2276 #CJK UNIFIED IDEOGRAPH
+ {0x8CFB, 0x5CA5}, //2277 #CJK UNIFIED IDEOGRAPH
+ {0x8CFC, 0x5CA6}, //2278 #CJK UNIFIED IDEOGRAPH
+ {0x8CFD, 0x5CA7}, //2279 #CJK UNIFIED IDEOGRAPH
+ {0x8CFE, 0x5CA8}, //2280 #CJK UNIFIED IDEOGRAPH
+ {0x8D40, 0x5CAA}, //2281 #CJK UNIFIED IDEOGRAPH
+ {0x8D41, 0x5CAE}, //2282 #CJK UNIFIED IDEOGRAPH
+ {0x8D42, 0x5CAF}, //2283 #CJK UNIFIED IDEOGRAPH
+ {0x8D43, 0x5CB0}, //2284 #CJK UNIFIED IDEOGRAPH
+ {0x8D44, 0x5CB2}, //2285 #CJK UNIFIED IDEOGRAPH
+ {0x8D45, 0x5CB4}, //2286 #CJK UNIFIED IDEOGRAPH
+ {0x8D46, 0x5CB6}, //2287 #CJK UNIFIED IDEOGRAPH
+ {0x8D47, 0x5CB9}, //2288 #CJK UNIFIED IDEOGRAPH
+ {0x8D48, 0x5CBA}, //2289 #CJK UNIFIED IDEOGRAPH
+ {0x8D49, 0x5CBB}, //2290 #CJK UNIFIED IDEOGRAPH
+ {0x8D4A, 0x5CBC}, //2291 #CJK UNIFIED IDEOGRAPH
+ {0x8D4B, 0x5CBE}, //2292 #CJK UNIFIED IDEOGRAPH
+ {0x8D4C, 0x5CC0}, //2293 #CJK UNIFIED IDEOGRAPH
+ {0x8D4D, 0x5CC2}, //2294 #CJK UNIFIED IDEOGRAPH
+ {0x8D4E, 0x5CC3}, //2295 #CJK UNIFIED IDEOGRAPH
+ {0x8D4F, 0x5CC5}, //2296 #CJK UNIFIED IDEOGRAPH
+ {0x8D50, 0x5CC6}, //2297 #CJK UNIFIED IDEOGRAPH
+ {0x8D51, 0x5CC7}, //2298 #CJK UNIFIED IDEOGRAPH
+ {0x8D52, 0x5CC8}, //2299 #CJK UNIFIED IDEOGRAPH
+ {0x8D53, 0x5CC9}, //2300 #CJK UNIFIED IDEOGRAPH
+ {0x8D54, 0x5CCA}, //2301 #CJK UNIFIED IDEOGRAPH
+ {0x8D55, 0x5CCC}, //2302 #CJK UNIFIED IDEOGRAPH
+ {0x8D56, 0x5CCD}, //2303 #CJK UNIFIED IDEOGRAPH
+ {0x8D57, 0x5CCE}, //2304 #CJK UNIFIED IDEOGRAPH
+ {0x8D58, 0x5CCF}, //2305 #CJK UNIFIED IDEOGRAPH
+ {0x8D59, 0x5CD0}, //2306 #CJK UNIFIED IDEOGRAPH
+ {0x8D5A, 0x5CD1}, //2307 #CJK UNIFIED IDEOGRAPH
+ {0x8D5B, 0x5CD3}, //2308 #CJK UNIFIED IDEOGRAPH
+ {0x8D5C, 0x5CD4}, //2309 #CJK UNIFIED IDEOGRAPH
+ {0x8D5D, 0x5CD5}, //2310 #CJK UNIFIED IDEOGRAPH
+ {0x8D5E, 0x5CD6}, //2311 #CJK UNIFIED IDEOGRAPH
+ {0x8D5F, 0x5CD7}, //2312 #CJK UNIFIED IDEOGRAPH
+ {0x8D60, 0x5CD8}, //2313 #CJK UNIFIED IDEOGRAPH
+ {0x8D61, 0x5CDA}, //2314 #CJK UNIFIED IDEOGRAPH
+ {0x8D62, 0x5CDB}, //2315 #CJK UNIFIED IDEOGRAPH
+ {0x8D63, 0x5CDC}, //2316 #CJK UNIFIED IDEOGRAPH
+ {0x8D64, 0x5CDD}, //2317 #CJK UNIFIED IDEOGRAPH
+ {0x8D65, 0x5CDE}, //2318 #CJK UNIFIED IDEOGRAPH
+ {0x8D66, 0x5CDF}, //2319 #CJK UNIFIED IDEOGRAPH
+ {0x8D67, 0x5CE0}, //2320 #CJK UNIFIED IDEOGRAPH
+ {0x8D68, 0x5CE2}, //2321 #CJK UNIFIED IDEOGRAPH
+ {0x8D69, 0x5CE3}, //2322 #CJK UNIFIED IDEOGRAPH
+ {0x8D6A, 0x5CE7}, //2323 #CJK UNIFIED IDEOGRAPH
+ {0x8D6B, 0x5CE9}, //2324 #CJK UNIFIED IDEOGRAPH
+ {0x8D6C, 0x5CEB}, //2325 #CJK UNIFIED IDEOGRAPH
+ {0x8D6D, 0x5CEC}, //2326 #CJK UNIFIED IDEOGRAPH
+ {0x8D6E, 0x5CEE}, //2327 #CJK UNIFIED IDEOGRAPH
+ {0x8D6F, 0x5CEF}, //2328 #CJK UNIFIED IDEOGRAPH
+ {0x8D70, 0x5CF1}, //2329 #CJK UNIFIED IDEOGRAPH
+ {0x8D71, 0x5CF2}, //2330 #CJK UNIFIED IDEOGRAPH
+ {0x8D72, 0x5CF3}, //2331 #CJK UNIFIED IDEOGRAPH
+ {0x8D73, 0x5CF4}, //2332 #CJK UNIFIED IDEOGRAPH
+ {0x8D74, 0x5CF5}, //2333 #CJK UNIFIED IDEOGRAPH
+ {0x8D75, 0x5CF6}, //2334 #CJK UNIFIED IDEOGRAPH
+ {0x8D76, 0x5CF7}, //2335 #CJK UNIFIED IDEOGRAPH
+ {0x8D77, 0x5CF8}, //2336 #CJK UNIFIED IDEOGRAPH
+ {0x8D78, 0x5CF9}, //2337 #CJK UNIFIED IDEOGRAPH
+ {0x8D79, 0x5CFA}, //2338 #CJK UNIFIED IDEOGRAPH
+ {0x8D7A, 0x5CFC}, //2339 #CJK UNIFIED IDEOGRAPH
+ {0x8D7B, 0x5CFD}, //2340 #CJK UNIFIED IDEOGRAPH
+ {0x8D7C, 0x5CFE}, //2341 #CJK UNIFIED IDEOGRAPH
+ {0x8D7D, 0x5CFF}, //2342 #CJK UNIFIED IDEOGRAPH
+ {0x8D7E, 0x5D00}, //2343 #CJK UNIFIED IDEOGRAPH
+ {0x8D80, 0x5D01}, //2344 #CJK UNIFIED IDEOGRAPH
+ {0x8D81, 0x5D04}, //2345 #CJK UNIFIED IDEOGRAPH
+ {0x8D82, 0x5D05}, //2346 #CJK UNIFIED IDEOGRAPH
+ {0x8D83, 0x5D08}, //2347 #CJK UNIFIED IDEOGRAPH
+ {0x8D84, 0x5D09}, //2348 #CJK UNIFIED IDEOGRAPH
+ {0x8D85, 0x5D0A}, //2349 #CJK UNIFIED IDEOGRAPH
+ {0x8D86, 0x5D0B}, //2350 #CJK UNIFIED IDEOGRAPH
+ {0x8D87, 0x5D0C}, //2351 #CJK UNIFIED IDEOGRAPH
+ {0x8D88, 0x5D0D}, //2352 #CJK UNIFIED IDEOGRAPH
+ {0x8D89, 0x5D0F}, //2353 #CJK UNIFIED IDEOGRAPH
+ {0x8D8A, 0x5D10}, //2354 #CJK UNIFIED IDEOGRAPH
+ {0x8D8B, 0x5D11}, //2355 #CJK UNIFIED IDEOGRAPH
+ {0x8D8C, 0x5D12}, //2356 #CJK UNIFIED IDEOGRAPH
+ {0x8D8D, 0x5D13}, //2357 #CJK UNIFIED IDEOGRAPH
+ {0x8D8E, 0x5D15}, //2358 #CJK UNIFIED IDEOGRAPH
+ {0x8D8F, 0x5D17}, //2359 #CJK UNIFIED IDEOGRAPH
+ {0x8D90, 0x5D18}, //2360 #CJK UNIFIED IDEOGRAPH
+ {0x8D91, 0x5D19}, //2361 #CJK UNIFIED IDEOGRAPH
+ {0x8D92, 0x5D1A}, //2362 #CJK UNIFIED IDEOGRAPH
+ {0x8D93, 0x5D1C}, //2363 #CJK UNIFIED IDEOGRAPH
+ {0x8D94, 0x5D1D}, //2364 #CJK UNIFIED IDEOGRAPH
+ {0x8D95, 0x5D1F}, //2365 #CJK UNIFIED IDEOGRAPH
+ {0x8D96, 0x5D20}, //2366 #CJK UNIFIED IDEOGRAPH
+ {0x8D97, 0x5D21}, //2367 #CJK UNIFIED IDEOGRAPH
+ {0x8D98, 0x5D22}, //2368 #CJK UNIFIED IDEOGRAPH
+ {0x8D99, 0x5D23}, //2369 #CJK UNIFIED IDEOGRAPH
+ {0x8D9A, 0x5D25}, //2370 #CJK UNIFIED IDEOGRAPH
+ {0x8D9B, 0x5D28}, //2371 #CJK UNIFIED IDEOGRAPH
+ {0x8D9C, 0x5D2A}, //2372 #CJK UNIFIED IDEOGRAPH
+ {0x8D9D, 0x5D2B}, //2373 #CJK UNIFIED IDEOGRAPH
+ {0x8D9E, 0x5D2C}, //2374 #CJK UNIFIED IDEOGRAPH
+ {0x8D9F, 0x5D2F}, //2375 #CJK UNIFIED IDEOGRAPH
+ {0x8DA0, 0x5D30}, //2376 #CJK UNIFIED IDEOGRAPH
+ {0x8DA1, 0x5D31}, //2377 #CJK UNIFIED IDEOGRAPH
+ {0x8DA2, 0x5D32}, //2378 #CJK UNIFIED IDEOGRAPH
+ {0x8DA3, 0x5D33}, //2379 #CJK UNIFIED IDEOGRAPH
+ {0x8DA4, 0x5D35}, //2380 #CJK UNIFIED IDEOGRAPH
+ {0x8DA5, 0x5D36}, //2381 #CJK UNIFIED IDEOGRAPH
+ {0x8DA6, 0x5D37}, //2382 #CJK UNIFIED IDEOGRAPH
+ {0x8DA7, 0x5D38}, //2383 #CJK UNIFIED IDEOGRAPH
+ {0x8DA8, 0x5D39}, //2384 #CJK UNIFIED IDEOGRAPH
+ {0x8DA9, 0x5D3A}, //2385 #CJK UNIFIED IDEOGRAPH
+ {0x8DAA, 0x5D3B}, //2386 #CJK UNIFIED IDEOGRAPH
+ {0x8DAB, 0x5D3C}, //2387 #CJK UNIFIED IDEOGRAPH
+ {0x8DAC, 0x5D3F}, //2388 #CJK UNIFIED IDEOGRAPH
+ {0x8DAD, 0x5D40}, //2389 #CJK UNIFIED IDEOGRAPH
+ {0x8DAE, 0x5D41}, //2390 #CJK UNIFIED IDEOGRAPH
+ {0x8DAF, 0x5D42}, //2391 #CJK UNIFIED IDEOGRAPH
+ {0x8DB0, 0x5D43}, //2392 #CJK UNIFIED IDEOGRAPH
+ {0x8DB1, 0x5D44}, //2393 #CJK UNIFIED IDEOGRAPH
+ {0x8DB2, 0x5D45}, //2394 #CJK UNIFIED IDEOGRAPH
+ {0x8DB3, 0x5D46}, //2395 #CJK UNIFIED IDEOGRAPH
+ {0x8DB4, 0x5D48}, //2396 #CJK UNIFIED IDEOGRAPH
+ {0x8DB5, 0x5D49}, //2397 #CJK UNIFIED IDEOGRAPH
+ {0x8DB6, 0x5D4D}, //2398 #CJK UNIFIED IDEOGRAPH
+ {0x8DB7, 0x5D4E}, //2399 #CJK UNIFIED IDEOGRAPH
+ {0x8DB8, 0x5D4F}, //2400 #CJK UNIFIED IDEOGRAPH
+ {0x8DB9, 0x5D50}, //2401 #CJK UNIFIED IDEOGRAPH
+ {0x8DBA, 0x5D51}, //2402 #CJK UNIFIED IDEOGRAPH
+ {0x8DBB, 0x5D52}, //2403 #CJK UNIFIED IDEOGRAPH
+ {0x8DBC, 0x5D53}, //2404 #CJK UNIFIED IDEOGRAPH
+ {0x8DBD, 0x5D54}, //2405 #CJK UNIFIED IDEOGRAPH
+ {0x8DBE, 0x5D55}, //2406 #CJK UNIFIED IDEOGRAPH
+ {0x8DBF, 0x5D56}, //2407 #CJK UNIFIED IDEOGRAPH
+ {0x8DC0, 0x5D57}, //2408 #CJK UNIFIED IDEOGRAPH
+ {0x8DC1, 0x5D59}, //2409 #CJK UNIFIED IDEOGRAPH
+ {0x8DC2, 0x5D5A}, //2410 #CJK UNIFIED IDEOGRAPH
+ {0x8DC3, 0x5D5C}, //2411 #CJK UNIFIED IDEOGRAPH
+ {0x8DC4, 0x5D5E}, //2412 #CJK UNIFIED IDEOGRAPH
+ {0x8DC5, 0x5D5F}, //2413 #CJK UNIFIED IDEOGRAPH
+ {0x8DC6, 0x5D60}, //2414 #CJK UNIFIED IDEOGRAPH
+ {0x8DC7, 0x5D61}, //2415 #CJK UNIFIED IDEOGRAPH
+ {0x8DC8, 0x5D62}, //2416 #CJK UNIFIED IDEOGRAPH
+ {0x8DC9, 0x5D63}, //2417 #CJK UNIFIED IDEOGRAPH
+ {0x8DCA, 0x5D64}, //2418 #CJK UNIFIED IDEOGRAPH
+ {0x8DCB, 0x5D65}, //2419 #CJK UNIFIED IDEOGRAPH
+ {0x8DCC, 0x5D66}, //2420 #CJK UNIFIED IDEOGRAPH
+ {0x8DCD, 0x5D67}, //2421 #CJK UNIFIED IDEOGRAPH
+ {0x8DCE, 0x5D68}, //2422 #CJK UNIFIED IDEOGRAPH
+ {0x8DCF, 0x5D6A}, //2423 #CJK UNIFIED IDEOGRAPH
+ {0x8DD0, 0x5D6D}, //2424 #CJK UNIFIED IDEOGRAPH
+ {0x8DD1, 0x5D6E}, //2425 #CJK UNIFIED IDEOGRAPH
+ {0x8DD2, 0x5D70}, //2426 #CJK UNIFIED IDEOGRAPH
+ {0x8DD3, 0x5D71}, //2427 #CJK UNIFIED IDEOGRAPH
+ {0x8DD4, 0x5D72}, //2428 #CJK UNIFIED IDEOGRAPH
+ {0x8DD5, 0x5D73}, //2429 #CJK UNIFIED IDEOGRAPH
+ {0x8DD6, 0x5D75}, //2430 #CJK UNIFIED IDEOGRAPH
+ {0x8DD7, 0x5D76}, //2431 #CJK UNIFIED IDEOGRAPH
+ {0x8DD8, 0x5D77}, //2432 #CJK UNIFIED IDEOGRAPH
+ {0x8DD9, 0x5D78}, //2433 #CJK UNIFIED IDEOGRAPH
+ {0x8DDA, 0x5D79}, //2434 #CJK UNIFIED IDEOGRAPH
+ {0x8DDB, 0x5D7A}, //2435 #CJK UNIFIED IDEOGRAPH
+ {0x8DDC, 0x5D7B}, //2436 #CJK UNIFIED IDEOGRAPH
+ {0x8DDD, 0x5D7C}, //2437 #CJK UNIFIED IDEOGRAPH
+ {0x8DDE, 0x5D7D}, //2438 #CJK UNIFIED IDEOGRAPH
+ {0x8DDF, 0x5D7E}, //2439 #CJK UNIFIED IDEOGRAPH
+ {0x8DE0, 0x5D7F}, //2440 #CJK UNIFIED IDEOGRAPH
+ {0x8DE1, 0x5D80}, //2441 #CJK UNIFIED IDEOGRAPH
+ {0x8DE2, 0x5D81}, //2442 #CJK UNIFIED IDEOGRAPH
+ {0x8DE3, 0x5D83}, //2443 #CJK UNIFIED IDEOGRAPH
+ {0x8DE4, 0x5D84}, //2444 #CJK UNIFIED IDEOGRAPH
+ {0x8DE5, 0x5D85}, //2445 #CJK UNIFIED IDEOGRAPH
+ {0x8DE6, 0x5D86}, //2446 #CJK UNIFIED IDEOGRAPH
+ {0x8DE7, 0x5D87}, //2447 #CJK UNIFIED IDEOGRAPH
+ {0x8DE8, 0x5D88}, //2448 #CJK UNIFIED IDEOGRAPH
+ {0x8DE9, 0x5D89}, //2449 #CJK UNIFIED IDEOGRAPH
+ {0x8DEA, 0x5D8A}, //2450 #CJK UNIFIED IDEOGRAPH
+ {0x8DEB, 0x5D8B}, //2451 #CJK UNIFIED IDEOGRAPH
+ {0x8DEC, 0x5D8C}, //2452 #CJK UNIFIED IDEOGRAPH
+ {0x8DED, 0x5D8D}, //2453 #CJK UNIFIED IDEOGRAPH
+ {0x8DEE, 0x5D8E}, //2454 #CJK UNIFIED IDEOGRAPH
+ {0x8DEF, 0x5D8F}, //2455 #CJK UNIFIED IDEOGRAPH
+ {0x8DF0, 0x5D90}, //2456 #CJK UNIFIED IDEOGRAPH
+ {0x8DF1, 0x5D91}, //2457 #CJK UNIFIED IDEOGRAPH
+ {0x8DF2, 0x5D92}, //2458 #CJK UNIFIED IDEOGRAPH
+ {0x8DF3, 0x5D93}, //2459 #CJK UNIFIED IDEOGRAPH
+ {0x8DF4, 0x5D94}, //2460 #CJK UNIFIED IDEOGRAPH
+ {0x8DF5, 0x5D95}, //2461 #CJK UNIFIED IDEOGRAPH
+ {0x8DF6, 0x5D96}, //2462 #CJK UNIFIED IDEOGRAPH
+ {0x8DF7, 0x5D97}, //2463 #CJK UNIFIED IDEOGRAPH
+ {0x8DF8, 0x5D98}, //2464 #CJK UNIFIED IDEOGRAPH
+ {0x8DF9, 0x5D9A}, //2465 #CJK UNIFIED IDEOGRAPH
+ {0x8DFA, 0x5D9B}, //2466 #CJK UNIFIED IDEOGRAPH
+ {0x8DFB, 0x5D9C}, //2467 #CJK UNIFIED IDEOGRAPH
+ {0x8DFC, 0x5D9E}, //2468 #CJK UNIFIED IDEOGRAPH
+ {0x8DFD, 0x5D9F}, //2469 #CJK UNIFIED IDEOGRAPH
+ {0x8DFE, 0x5DA0}, //2470 #CJK UNIFIED IDEOGRAPH
+ {0x8E40, 0x5DA1}, //2471 #CJK UNIFIED IDEOGRAPH
+ {0x8E41, 0x5DA2}, //2472 #CJK UNIFIED IDEOGRAPH
+ {0x8E42, 0x5DA3}, //2473 #CJK UNIFIED IDEOGRAPH
+ {0x8E43, 0x5DA4}, //2474 #CJK UNIFIED IDEOGRAPH
+ {0x8E44, 0x5DA5}, //2475 #CJK UNIFIED IDEOGRAPH
+ {0x8E45, 0x5DA6}, //2476 #CJK UNIFIED IDEOGRAPH
+ {0x8E46, 0x5DA7}, //2477 #CJK UNIFIED IDEOGRAPH
+ {0x8E47, 0x5DA8}, //2478 #CJK UNIFIED IDEOGRAPH
+ {0x8E48, 0x5DA9}, //2479 #CJK UNIFIED IDEOGRAPH
+ {0x8E49, 0x5DAA}, //2480 #CJK UNIFIED IDEOGRAPH
+ {0x8E4A, 0x5DAB}, //2481 #CJK UNIFIED IDEOGRAPH
+ {0x8E4B, 0x5DAC}, //2482 #CJK UNIFIED IDEOGRAPH
+ {0x8E4C, 0x5DAD}, //2483 #CJK UNIFIED IDEOGRAPH
+ {0x8E4D, 0x5DAE}, //2484 #CJK UNIFIED IDEOGRAPH
+ {0x8E4E, 0x5DAF}, //2485 #CJK UNIFIED IDEOGRAPH
+ {0x8E4F, 0x5DB0}, //2486 #CJK UNIFIED IDEOGRAPH
+ {0x8E50, 0x5DB1}, //2487 #CJK UNIFIED IDEOGRAPH
+ {0x8E51, 0x5DB2}, //2488 #CJK UNIFIED IDEOGRAPH
+ {0x8E52, 0x5DB3}, //2489 #CJK UNIFIED IDEOGRAPH
+ {0x8E53, 0x5DB4}, //2490 #CJK UNIFIED IDEOGRAPH
+ {0x8E54, 0x5DB5}, //2491 #CJK UNIFIED IDEOGRAPH
+ {0x8E55, 0x5DB6}, //2492 #CJK UNIFIED IDEOGRAPH
+ {0x8E56, 0x5DB8}, //2493 #CJK UNIFIED IDEOGRAPH
+ {0x8E57, 0x5DB9}, //2494 #CJK UNIFIED IDEOGRAPH
+ {0x8E58, 0x5DBA}, //2495 #CJK UNIFIED IDEOGRAPH
+ {0x8E59, 0x5DBB}, //2496 #CJK UNIFIED IDEOGRAPH
+ {0x8E5A, 0x5DBC}, //2497 #CJK UNIFIED IDEOGRAPH
+ {0x8E5B, 0x5DBD}, //2498 #CJK UNIFIED IDEOGRAPH
+ {0x8E5C, 0x5DBE}, //2499 #CJK UNIFIED IDEOGRAPH
+ {0x8E5D, 0x5DBF}, //2500 #CJK UNIFIED IDEOGRAPH
+ {0x8E5E, 0x5DC0}, //2501 #CJK UNIFIED IDEOGRAPH
+ {0x8E5F, 0x5DC1}, //2502 #CJK UNIFIED IDEOGRAPH
+ {0x8E60, 0x5DC2}, //2503 #CJK UNIFIED IDEOGRAPH
+ {0x8E61, 0x5DC3}, //2504 #CJK UNIFIED IDEOGRAPH
+ {0x8E62, 0x5DC4}, //2505 #CJK UNIFIED IDEOGRAPH
+ {0x8E63, 0x5DC6}, //2506 #CJK UNIFIED IDEOGRAPH
+ {0x8E64, 0x5DC7}, //2507 #CJK UNIFIED IDEOGRAPH
+ {0x8E65, 0x5DC8}, //2508 #CJK UNIFIED IDEOGRAPH
+ {0x8E66, 0x5DC9}, //2509 #CJK UNIFIED IDEOGRAPH
+ {0x8E67, 0x5DCA}, //2510 #CJK UNIFIED IDEOGRAPH
+ {0x8E68, 0x5DCB}, //2511 #CJK UNIFIED IDEOGRAPH
+ {0x8E69, 0x5DCC}, //2512 #CJK UNIFIED IDEOGRAPH
+ {0x8E6A, 0x5DCE}, //2513 #CJK UNIFIED IDEOGRAPH
+ {0x8E6B, 0x5DCF}, //2514 #CJK UNIFIED IDEOGRAPH
+ {0x8E6C, 0x5DD0}, //2515 #CJK UNIFIED IDEOGRAPH
+ {0x8E6D, 0x5DD1}, //2516 #CJK UNIFIED IDEOGRAPH
+ {0x8E6E, 0x5DD2}, //2517 #CJK UNIFIED IDEOGRAPH
+ {0x8E6F, 0x5DD3}, //2518 #CJK UNIFIED IDEOGRAPH
+ {0x8E70, 0x5DD4}, //2519 #CJK UNIFIED IDEOGRAPH
+ {0x8E71, 0x5DD5}, //2520 #CJK UNIFIED IDEOGRAPH
+ {0x8E72, 0x5DD6}, //2521 #CJK UNIFIED IDEOGRAPH
+ {0x8E73, 0x5DD7}, //2522 #CJK UNIFIED IDEOGRAPH
+ {0x8E74, 0x5DD8}, //2523 #CJK UNIFIED IDEOGRAPH
+ {0x8E75, 0x5DD9}, //2524 #CJK UNIFIED IDEOGRAPH
+ {0x8E76, 0x5DDA}, //2525 #CJK UNIFIED IDEOGRAPH
+ {0x8E77, 0x5DDC}, //2526 #CJK UNIFIED IDEOGRAPH
+ {0x8E78, 0x5DDF}, //2527 #CJK UNIFIED IDEOGRAPH
+ {0x8E79, 0x5DE0}, //2528 #CJK UNIFIED IDEOGRAPH
+ {0x8E7A, 0x5DE3}, //2529 #CJK UNIFIED IDEOGRAPH
+ {0x8E7B, 0x5DE4}, //2530 #CJK UNIFIED IDEOGRAPH
+ {0x8E7C, 0x5DEA}, //2531 #CJK UNIFIED IDEOGRAPH
+ {0x8E7D, 0x5DEC}, //2532 #CJK UNIFIED IDEOGRAPH
+ {0x8E7E, 0x5DED}, //2533 #CJK UNIFIED IDEOGRAPH
+ {0x8E80, 0x5DF0}, //2534 #CJK UNIFIED IDEOGRAPH
+ {0x8E81, 0x5DF5}, //2535 #CJK UNIFIED IDEOGRAPH
+ {0x8E82, 0x5DF6}, //2536 #CJK UNIFIED IDEOGRAPH
+ {0x8E83, 0x5DF8}, //2537 #CJK UNIFIED IDEOGRAPH
+ {0x8E84, 0x5DF9}, //2538 #CJK UNIFIED IDEOGRAPH
+ {0x8E85, 0x5DFA}, //2539 #CJK UNIFIED IDEOGRAPH
+ {0x8E86, 0x5DFB}, //2540 #CJK UNIFIED IDEOGRAPH
+ {0x8E87, 0x5DFC}, //2541 #CJK UNIFIED IDEOGRAPH
+ {0x8E88, 0x5DFF}, //2542 #CJK UNIFIED IDEOGRAPH
+ {0x8E89, 0x5E00}, //2543 #CJK UNIFIED IDEOGRAPH
+ {0x8E8A, 0x5E04}, //2544 #CJK UNIFIED IDEOGRAPH
+ {0x8E8B, 0x5E07}, //2545 #CJK UNIFIED IDEOGRAPH
+ {0x8E8C, 0x5E09}, //2546 #CJK UNIFIED IDEOGRAPH
+ {0x8E8D, 0x5E0A}, //2547 #CJK UNIFIED IDEOGRAPH
+ {0x8E8E, 0x5E0B}, //2548 #CJK UNIFIED IDEOGRAPH
+ {0x8E8F, 0x5E0D}, //2549 #CJK UNIFIED IDEOGRAPH
+ {0x8E90, 0x5E0E}, //2550 #CJK UNIFIED IDEOGRAPH
+ {0x8E91, 0x5E12}, //2551 #CJK UNIFIED IDEOGRAPH
+ {0x8E92, 0x5E13}, //2552 #CJK UNIFIED IDEOGRAPH
+ {0x8E93, 0x5E17}, //2553 #CJK UNIFIED IDEOGRAPH
+ {0x8E94, 0x5E1E}, //2554 #CJK UNIFIED IDEOGRAPH
+ {0x8E95, 0x5E1F}, //2555 #CJK UNIFIED IDEOGRAPH
+ {0x8E96, 0x5E20}, //2556 #CJK UNIFIED IDEOGRAPH
+ {0x8E97, 0x5E21}, //2557 #CJK UNIFIED IDEOGRAPH
+ {0x8E98, 0x5E22}, //2558 #CJK UNIFIED IDEOGRAPH
+ {0x8E99, 0x5E23}, //2559 #CJK UNIFIED IDEOGRAPH
+ {0x8E9A, 0x5E24}, //2560 #CJK UNIFIED IDEOGRAPH
+ {0x8E9B, 0x5E25}, //2561 #CJK UNIFIED IDEOGRAPH
+ {0x8E9C, 0x5E28}, //2562 #CJK UNIFIED IDEOGRAPH
+ {0x8E9D, 0x5E29}, //2563 #CJK UNIFIED IDEOGRAPH
+ {0x8E9E, 0x5E2A}, //2564 #CJK UNIFIED IDEOGRAPH
+ {0x8E9F, 0x5E2B}, //2565 #CJK UNIFIED IDEOGRAPH
+ {0x8EA0, 0x5E2C}, //2566 #CJK UNIFIED IDEOGRAPH
+ {0x8EA1, 0x5E2F}, //2567 #CJK UNIFIED IDEOGRAPH
+ {0x8EA2, 0x5E30}, //2568 #CJK UNIFIED IDEOGRAPH
+ {0x8EA3, 0x5E32}, //2569 #CJK UNIFIED IDEOGRAPH
+ {0x8EA4, 0x5E33}, //2570 #CJK UNIFIED IDEOGRAPH
+ {0x8EA5, 0x5E34}, //2571 #CJK UNIFIED IDEOGRAPH
+ {0x8EA6, 0x5E35}, //2572 #CJK UNIFIED IDEOGRAPH
+ {0x8EA7, 0x5E36}, //2573 #CJK UNIFIED IDEOGRAPH
+ {0x8EA8, 0x5E39}, //2574 #CJK UNIFIED IDEOGRAPH
+ {0x8EA9, 0x5E3A}, //2575 #CJK UNIFIED IDEOGRAPH
+ {0x8EAA, 0x5E3E}, //2576 #CJK UNIFIED IDEOGRAPH
+ {0x8EAB, 0x5E3F}, //2577 #CJK UNIFIED IDEOGRAPH
+ {0x8EAC, 0x5E40}, //2578 #CJK UNIFIED IDEOGRAPH
+ {0x8EAD, 0x5E41}, //2579 #CJK UNIFIED IDEOGRAPH
+ {0x8EAE, 0x5E43}, //2580 #CJK UNIFIED IDEOGRAPH
+ {0x8EAF, 0x5E46}, //2581 #CJK UNIFIED IDEOGRAPH
+ {0x8EB0, 0x5E47}, //2582 #CJK UNIFIED IDEOGRAPH
+ {0x8EB1, 0x5E48}, //2583 #CJK UNIFIED IDEOGRAPH
+ {0x8EB2, 0x5E49}, //2584 #CJK UNIFIED IDEOGRAPH
+ {0x8EB3, 0x5E4A}, //2585 #CJK UNIFIED IDEOGRAPH
+ {0x8EB4, 0x5E4B}, //2586 #CJK UNIFIED IDEOGRAPH
+ {0x8EB5, 0x5E4D}, //2587 #CJK UNIFIED IDEOGRAPH
+ {0x8EB6, 0x5E4E}, //2588 #CJK UNIFIED IDEOGRAPH
+ {0x8EB7, 0x5E4F}, //2589 #CJK UNIFIED IDEOGRAPH
+ {0x8EB8, 0x5E50}, //2590 #CJK UNIFIED IDEOGRAPH
+ {0x8EB9, 0x5E51}, //2591 #CJK UNIFIED IDEOGRAPH
+ {0x8EBA, 0x5E52}, //2592 #CJK UNIFIED IDEOGRAPH
+ {0x8EBB, 0x5E53}, //2593 #CJK UNIFIED IDEOGRAPH
+ {0x8EBC, 0x5E56}, //2594 #CJK UNIFIED IDEOGRAPH
+ {0x8EBD, 0x5E57}, //2595 #CJK UNIFIED IDEOGRAPH
+ {0x8EBE, 0x5E58}, //2596 #CJK UNIFIED IDEOGRAPH
+ {0x8EBF, 0x5E59}, //2597 #CJK UNIFIED IDEOGRAPH
+ {0x8EC0, 0x5E5A}, //2598 #CJK UNIFIED IDEOGRAPH
+ {0x8EC1, 0x5E5C}, //2599 #CJK UNIFIED IDEOGRAPH
+ {0x8EC2, 0x5E5D}, //2600 #CJK UNIFIED IDEOGRAPH
+ {0x8EC3, 0x5E5F}, //2601 #CJK UNIFIED IDEOGRAPH
+ {0x8EC4, 0x5E60}, //2602 #CJK UNIFIED IDEOGRAPH
+ {0x8EC5, 0x5E63}, //2603 #CJK UNIFIED IDEOGRAPH
+ {0x8EC6, 0x5E64}, //2604 #CJK UNIFIED IDEOGRAPH
+ {0x8EC7, 0x5E65}, //2605 #CJK UNIFIED IDEOGRAPH
+ {0x8EC8, 0x5E66}, //2606 #CJK UNIFIED IDEOGRAPH
+ {0x8EC9, 0x5E67}, //2607 #CJK UNIFIED IDEOGRAPH
+ {0x8ECA, 0x5E68}, //2608 #CJK UNIFIED IDEOGRAPH
+ {0x8ECB, 0x5E69}, //2609 #CJK UNIFIED IDEOGRAPH
+ {0x8ECC, 0x5E6A}, //2610 #CJK UNIFIED IDEOGRAPH
+ {0x8ECD, 0x5E6B}, //2611 #CJK UNIFIED IDEOGRAPH
+ {0x8ECE, 0x5E6C}, //2612 #CJK UNIFIED IDEOGRAPH
+ {0x8ECF, 0x5E6D}, //2613 #CJK UNIFIED IDEOGRAPH
+ {0x8ED0, 0x5E6E}, //2614 #CJK UNIFIED IDEOGRAPH
+ {0x8ED1, 0x5E6F}, //2615 #CJK UNIFIED IDEOGRAPH
+ {0x8ED2, 0x5E70}, //2616 #CJK UNIFIED IDEOGRAPH
+ {0x8ED3, 0x5E71}, //2617 #CJK UNIFIED IDEOGRAPH
+ {0x8ED4, 0x5E75}, //2618 #CJK UNIFIED IDEOGRAPH
+ {0x8ED5, 0x5E77}, //2619 #CJK UNIFIED IDEOGRAPH
+ {0x8ED6, 0x5E79}, //2620 #CJK UNIFIED IDEOGRAPH
+ {0x8ED7, 0x5E7E}, //2621 #CJK UNIFIED IDEOGRAPH
+ {0x8ED8, 0x5E81}, //2622 #CJK UNIFIED IDEOGRAPH
+ {0x8ED9, 0x5E82}, //2623 #CJK UNIFIED IDEOGRAPH
+ {0x8EDA, 0x5E83}, //2624 #CJK UNIFIED IDEOGRAPH
+ {0x8EDB, 0x5E85}, //2625 #CJK UNIFIED IDEOGRAPH
+ {0x8EDC, 0x5E88}, //2626 #CJK UNIFIED IDEOGRAPH
+ {0x8EDD, 0x5E89}, //2627 #CJK UNIFIED IDEOGRAPH
+ {0x8EDE, 0x5E8C}, //2628 #CJK UNIFIED IDEOGRAPH
+ {0x8EDF, 0x5E8D}, //2629 #CJK UNIFIED IDEOGRAPH
+ {0x8EE0, 0x5E8E}, //2630 #CJK UNIFIED IDEOGRAPH
+ {0x8EE1, 0x5E92}, //2631 #CJK UNIFIED IDEOGRAPH
+ {0x8EE2, 0x5E98}, //2632 #CJK UNIFIED IDEOGRAPH
+ {0x8EE3, 0x5E9B}, //2633 #CJK UNIFIED IDEOGRAPH
+ {0x8EE4, 0x5E9D}, //2634 #CJK UNIFIED IDEOGRAPH
+ {0x8EE5, 0x5EA1}, //2635 #CJK UNIFIED IDEOGRAPH
+ {0x8EE6, 0x5EA2}, //2636 #CJK UNIFIED IDEOGRAPH
+ {0x8EE7, 0x5EA3}, //2637 #CJK UNIFIED IDEOGRAPH
+ {0x8EE8, 0x5EA4}, //2638 #CJK UNIFIED IDEOGRAPH
+ {0x8EE9, 0x5EA8}, //2639 #CJK UNIFIED IDEOGRAPH
+ {0x8EEA, 0x5EA9}, //2640 #CJK UNIFIED IDEOGRAPH
+ {0x8EEB, 0x5EAA}, //2641 #CJK UNIFIED IDEOGRAPH
+ {0x8EEC, 0x5EAB}, //2642 #CJK UNIFIED IDEOGRAPH
+ {0x8EED, 0x5EAC}, //2643 #CJK UNIFIED IDEOGRAPH
+ {0x8EEE, 0x5EAE}, //2644 #CJK UNIFIED IDEOGRAPH
+ {0x8EEF, 0x5EAF}, //2645 #CJK UNIFIED IDEOGRAPH
+ {0x8EF0, 0x5EB0}, //2646 #CJK UNIFIED IDEOGRAPH
+ {0x8EF1, 0x5EB1}, //2647 #CJK UNIFIED IDEOGRAPH
+ {0x8EF2, 0x5EB2}, //2648 #CJK UNIFIED IDEOGRAPH
+ {0x8EF3, 0x5EB4}, //2649 #CJK UNIFIED IDEOGRAPH
+ {0x8EF4, 0x5EBA}, //2650 #CJK UNIFIED IDEOGRAPH
+ {0x8EF5, 0x5EBB}, //2651 #CJK UNIFIED IDEOGRAPH
+ {0x8EF6, 0x5EBC}, //2652 #CJK UNIFIED IDEOGRAPH
+ {0x8EF7, 0x5EBD}, //2653 #CJK UNIFIED IDEOGRAPH
+ {0x8EF8, 0x5EBF}, //2654 #CJK UNIFIED IDEOGRAPH
+ {0x8EF9, 0x5EC0}, //2655 #CJK UNIFIED IDEOGRAPH
+ {0x8EFA, 0x5EC1}, //2656 #CJK UNIFIED IDEOGRAPH
+ {0x8EFB, 0x5EC2}, //2657 #CJK UNIFIED IDEOGRAPH
+ {0x8EFC, 0x5EC3}, //2658 #CJK UNIFIED IDEOGRAPH
+ {0x8EFD, 0x5EC4}, //2659 #CJK UNIFIED IDEOGRAPH
+ {0x8EFE, 0x5EC5}, //2660 #CJK UNIFIED IDEOGRAPH
+ {0x8F40, 0x5EC6}, //2661 #CJK UNIFIED IDEOGRAPH
+ {0x8F41, 0x5EC7}, //2662 #CJK UNIFIED IDEOGRAPH
+ {0x8F42, 0x5EC8}, //2663 #CJK UNIFIED IDEOGRAPH
+ {0x8F43, 0x5ECB}, //2664 #CJK UNIFIED IDEOGRAPH
+ {0x8F44, 0x5ECC}, //2665 #CJK UNIFIED IDEOGRAPH
+ {0x8F45, 0x5ECD}, //2666 #CJK UNIFIED IDEOGRAPH
+ {0x8F46, 0x5ECE}, //2667 #CJK UNIFIED IDEOGRAPH
+ {0x8F47, 0x5ECF}, //2668 #CJK UNIFIED IDEOGRAPH
+ {0x8F48, 0x5ED0}, //2669 #CJK UNIFIED IDEOGRAPH
+ {0x8F49, 0x5ED4}, //2670 #CJK UNIFIED IDEOGRAPH
+ {0x8F4A, 0x5ED5}, //2671 #CJK UNIFIED IDEOGRAPH
+ {0x8F4B, 0x5ED7}, //2672 #CJK UNIFIED IDEOGRAPH
+ {0x8F4C, 0x5ED8}, //2673 #CJK UNIFIED IDEOGRAPH
+ {0x8F4D, 0x5ED9}, //2674 #CJK UNIFIED IDEOGRAPH
+ {0x8F4E, 0x5EDA}, //2675 #CJK UNIFIED IDEOGRAPH
+ {0x8F4F, 0x5EDC}, //2676 #CJK UNIFIED IDEOGRAPH
+ {0x8F50, 0x5EDD}, //2677 #CJK UNIFIED IDEOGRAPH
+ {0x8F51, 0x5EDE}, //2678 #CJK UNIFIED IDEOGRAPH
+ {0x8F52, 0x5EDF}, //2679 #CJK UNIFIED IDEOGRAPH
+ {0x8F53, 0x5EE0}, //2680 #CJK UNIFIED IDEOGRAPH
+ {0x8F54, 0x5EE1}, //2681 #CJK UNIFIED IDEOGRAPH
+ {0x8F55, 0x5EE2}, //2682 #CJK UNIFIED IDEOGRAPH
+ {0x8F56, 0x5EE3}, //2683 #CJK UNIFIED IDEOGRAPH
+ {0x8F57, 0x5EE4}, //2684 #CJK UNIFIED IDEOGRAPH
+ {0x8F58, 0x5EE5}, //2685 #CJK UNIFIED IDEOGRAPH
+ {0x8F59, 0x5EE6}, //2686 #CJK UNIFIED IDEOGRAPH
+ {0x8F5A, 0x5EE7}, //2687 #CJK UNIFIED IDEOGRAPH
+ {0x8F5B, 0x5EE9}, //2688 #CJK UNIFIED IDEOGRAPH
+ {0x8F5C, 0x5EEB}, //2689 #CJK UNIFIED IDEOGRAPH
+ {0x8F5D, 0x5EEC}, //2690 #CJK UNIFIED IDEOGRAPH
+ {0x8F5E, 0x5EED}, //2691 #CJK UNIFIED IDEOGRAPH
+ {0x8F5F, 0x5EEE}, //2692 #CJK UNIFIED IDEOGRAPH
+ {0x8F60, 0x5EEF}, //2693 #CJK UNIFIED IDEOGRAPH
+ {0x8F61, 0x5EF0}, //2694 #CJK UNIFIED IDEOGRAPH
+ {0x8F62, 0x5EF1}, //2695 #CJK UNIFIED IDEOGRAPH
+ {0x8F63, 0x5EF2}, //2696 #CJK UNIFIED IDEOGRAPH
+ {0x8F64, 0x5EF3}, //2697 #CJK UNIFIED IDEOGRAPH
+ {0x8F65, 0x5EF5}, //2698 #CJK UNIFIED IDEOGRAPH
+ {0x8F66, 0x5EF8}, //2699 #CJK UNIFIED IDEOGRAPH
+ {0x8F67, 0x5EF9}, //2700 #CJK UNIFIED IDEOGRAPH
+ {0x8F68, 0x5EFB}, //2701 #CJK UNIFIED IDEOGRAPH
+ {0x8F69, 0x5EFC}, //2702 #CJK UNIFIED IDEOGRAPH
+ {0x8F6A, 0x5EFD}, //2703 #CJK UNIFIED IDEOGRAPH
+ {0x8F6B, 0x5F05}, //2704 #CJK UNIFIED IDEOGRAPH
+ {0x8F6C, 0x5F06}, //2705 #CJK UNIFIED IDEOGRAPH
+ {0x8F6D, 0x5F07}, //2706 #CJK UNIFIED IDEOGRAPH
+ {0x8F6E, 0x5F09}, //2707 #CJK UNIFIED IDEOGRAPH
+ {0x8F6F, 0x5F0C}, //2708 #CJK UNIFIED IDEOGRAPH
+ {0x8F70, 0x5F0D}, //2709 #CJK UNIFIED IDEOGRAPH
+ {0x8F71, 0x5F0E}, //2710 #CJK UNIFIED IDEOGRAPH
+ {0x8F72, 0x5F10}, //2711 #CJK UNIFIED IDEOGRAPH
+ {0x8F73, 0x5F12}, //2712 #CJK UNIFIED IDEOGRAPH
+ {0x8F74, 0x5F14}, //2713 #CJK UNIFIED IDEOGRAPH
+ {0x8F75, 0x5F16}, //2714 #CJK UNIFIED IDEOGRAPH
+ {0x8F76, 0x5F19}, //2715 #CJK UNIFIED IDEOGRAPH
+ {0x8F77, 0x5F1A}, //2716 #CJK UNIFIED IDEOGRAPH
+ {0x8F78, 0x5F1C}, //2717 #CJK UNIFIED IDEOGRAPH
+ {0x8F79, 0x5F1D}, //2718 #CJK UNIFIED IDEOGRAPH
+ {0x8F7A, 0x5F1E}, //2719 #CJK UNIFIED IDEOGRAPH
+ {0x8F7B, 0x5F21}, //2720 #CJK UNIFIED IDEOGRAPH
+ {0x8F7C, 0x5F22}, //2721 #CJK UNIFIED IDEOGRAPH
+ {0x8F7D, 0x5F23}, //2722 #CJK UNIFIED IDEOGRAPH
+ {0x8F7E, 0x5F24}, //2723 #CJK UNIFIED IDEOGRAPH
+ {0x8F80, 0x5F28}, //2724 #CJK UNIFIED IDEOGRAPH
+ {0x8F81, 0x5F2B}, //2725 #CJK UNIFIED IDEOGRAPH
+ {0x8F82, 0x5F2C}, //2726 #CJK UNIFIED IDEOGRAPH
+ {0x8F83, 0x5F2E}, //2727 #CJK UNIFIED IDEOGRAPH
+ {0x8F84, 0x5F30}, //2728 #CJK UNIFIED IDEOGRAPH
+ {0x8F85, 0x5F32}, //2729 #CJK UNIFIED IDEOGRAPH
+ {0x8F86, 0x5F33}, //2730 #CJK UNIFIED IDEOGRAPH
+ {0x8F87, 0x5F34}, //2731 #CJK UNIFIED IDEOGRAPH
+ {0x8F88, 0x5F35}, //2732 #CJK UNIFIED IDEOGRAPH
+ {0x8F89, 0x5F36}, //2733 #CJK UNIFIED IDEOGRAPH
+ {0x8F8A, 0x5F37}, //2734 #CJK UNIFIED IDEOGRAPH
+ {0x8F8B, 0x5F38}, //2735 #CJK UNIFIED IDEOGRAPH
+ {0x8F8C, 0x5F3B}, //2736 #CJK UNIFIED IDEOGRAPH
+ {0x8F8D, 0x5F3D}, //2737 #CJK UNIFIED IDEOGRAPH
+ {0x8F8E, 0x5F3E}, //2738 #CJK UNIFIED IDEOGRAPH
+ {0x8F8F, 0x5F3F}, //2739 #CJK UNIFIED IDEOGRAPH
+ {0x8F90, 0x5F41}, //2740 #CJK UNIFIED IDEOGRAPH
+ {0x8F91, 0x5F42}, //2741 #CJK UNIFIED IDEOGRAPH
+ {0x8F92, 0x5F43}, //2742 #CJK UNIFIED IDEOGRAPH
+ {0x8F93, 0x5F44}, //2743 #CJK UNIFIED IDEOGRAPH
+ {0x8F94, 0x5F45}, //2744 #CJK UNIFIED IDEOGRAPH
+ {0x8F95, 0x5F46}, //2745 #CJK UNIFIED IDEOGRAPH
+ {0x8F96, 0x5F47}, //2746 #CJK UNIFIED IDEOGRAPH
+ {0x8F97, 0x5F48}, //2747 #CJK UNIFIED IDEOGRAPH
+ {0x8F98, 0x5F49}, //2748 #CJK UNIFIED IDEOGRAPH
+ {0x8F99, 0x5F4A}, //2749 #CJK UNIFIED IDEOGRAPH
+ {0x8F9A, 0x5F4B}, //2750 #CJK UNIFIED IDEOGRAPH
+ {0x8F9B, 0x5F4C}, //2751 #CJK UNIFIED IDEOGRAPH
+ {0x8F9C, 0x5F4D}, //2752 #CJK UNIFIED IDEOGRAPH
+ {0x8F9D, 0x5F4E}, //2753 #CJK UNIFIED IDEOGRAPH
+ {0x8F9E, 0x5F4F}, //2754 #CJK UNIFIED IDEOGRAPH
+ {0x8F9F, 0x5F51}, //2755 #CJK UNIFIED IDEOGRAPH
+ {0x8FA0, 0x5F54}, //2756 #CJK UNIFIED IDEOGRAPH
+ {0x8FA1, 0x5F59}, //2757 #CJK UNIFIED IDEOGRAPH
+ {0x8FA2, 0x5F5A}, //2758 #CJK UNIFIED IDEOGRAPH
+ {0x8FA3, 0x5F5B}, //2759 #CJK UNIFIED IDEOGRAPH
+ {0x8FA4, 0x5F5C}, //2760 #CJK UNIFIED IDEOGRAPH
+ {0x8FA5, 0x5F5E}, //2761 #CJK UNIFIED IDEOGRAPH
+ {0x8FA6, 0x5F5F}, //2762 #CJK UNIFIED IDEOGRAPH
+ {0x8FA7, 0x5F60}, //2763 #CJK UNIFIED IDEOGRAPH
+ {0x8FA8, 0x5F63}, //2764 #CJK UNIFIED IDEOGRAPH
+ {0x8FA9, 0x5F65}, //2765 #CJK UNIFIED IDEOGRAPH
+ {0x8FAA, 0x5F67}, //2766 #CJK UNIFIED IDEOGRAPH
+ {0x8FAB, 0x5F68}, //2767 #CJK UNIFIED IDEOGRAPH
+ {0x8FAC, 0x5F6B}, //2768 #CJK UNIFIED IDEOGRAPH
+ {0x8FAD, 0x5F6E}, //2769 #CJK UNIFIED IDEOGRAPH
+ {0x8FAE, 0x5F6F}, //2770 #CJK UNIFIED IDEOGRAPH
+ {0x8FAF, 0x5F72}, //2771 #CJK UNIFIED IDEOGRAPH
+ {0x8FB0, 0x5F74}, //2772 #CJK UNIFIED IDEOGRAPH
+ {0x8FB1, 0x5F75}, //2773 #CJK UNIFIED IDEOGRAPH
+ {0x8FB2, 0x5F76}, //2774 #CJK UNIFIED IDEOGRAPH
+ {0x8FB3, 0x5F78}, //2775 #CJK UNIFIED IDEOGRAPH
+ {0x8FB4, 0x5F7A}, //2776 #CJK UNIFIED IDEOGRAPH
+ {0x8FB5, 0x5F7D}, //2777 #CJK UNIFIED IDEOGRAPH
+ {0x8FB6, 0x5F7E}, //2778 #CJK UNIFIED IDEOGRAPH
+ {0x8FB7, 0x5F7F}, //2779 #CJK UNIFIED IDEOGRAPH
+ {0x8FB8, 0x5F83}, //2780 #CJK UNIFIED IDEOGRAPH
+ {0x8FB9, 0x5F86}, //2781 #CJK UNIFIED IDEOGRAPH
+ {0x8FBA, 0x5F8D}, //2782 #CJK UNIFIED IDEOGRAPH
+ {0x8FBB, 0x5F8E}, //2783 #CJK UNIFIED IDEOGRAPH
+ {0x8FBC, 0x5F8F}, //2784 #CJK UNIFIED IDEOGRAPH
+ {0x8FBD, 0x5F91}, //2785 #CJK UNIFIED IDEOGRAPH
+ {0x8FBE, 0x5F93}, //2786 #CJK UNIFIED IDEOGRAPH
+ {0x8FBF, 0x5F94}, //2787 #CJK UNIFIED IDEOGRAPH
+ {0x8FC0, 0x5F96}, //2788 #CJK UNIFIED IDEOGRAPH
+ {0x8FC1, 0x5F9A}, //2789 #CJK UNIFIED IDEOGRAPH
+ {0x8FC2, 0x5F9B}, //2790 #CJK UNIFIED IDEOGRAPH
+ {0x8FC3, 0x5F9D}, //2791 #CJK UNIFIED IDEOGRAPH
+ {0x8FC4, 0x5F9E}, //2792 #CJK UNIFIED IDEOGRAPH
+ {0x8FC5, 0x5F9F}, //2793 #CJK UNIFIED IDEOGRAPH
+ {0x8FC6, 0x5FA0}, //2794 #CJK UNIFIED IDEOGRAPH
+ {0x8FC7, 0x5FA2}, //2795 #CJK UNIFIED IDEOGRAPH
+ {0x8FC8, 0x5FA3}, //2796 #CJK UNIFIED IDEOGRAPH
+ {0x8FC9, 0x5FA4}, //2797 #CJK UNIFIED IDEOGRAPH
+ {0x8FCA, 0x5FA5}, //2798 #CJK UNIFIED IDEOGRAPH
+ {0x8FCB, 0x5FA6}, //2799 #CJK UNIFIED IDEOGRAPH
+ {0x8FCC, 0x5FA7}, //2800 #CJK UNIFIED IDEOGRAPH
+ {0x8FCD, 0x5FA9}, //2801 #CJK UNIFIED IDEOGRAPH
+ {0x8FCE, 0x5FAB}, //2802 #CJK UNIFIED IDEOGRAPH
+ {0x8FCF, 0x5FAC}, //2803 #CJK UNIFIED IDEOGRAPH
+ {0x8FD0, 0x5FAF}, //2804 #CJK UNIFIED IDEOGRAPH
+ {0x8FD1, 0x5FB0}, //2805 #CJK UNIFIED IDEOGRAPH
+ {0x8FD2, 0x5FB1}, //2806 #CJK UNIFIED IDEOGRAPH
+ {0x8FD3, 0x5FB2}, //2807 #CJK UNIFIED IDEOGRAPH
+ {0x8FD4, 0x5FB3}, //2808 #CJK UNIFIED IDEOGRAPH
+ {0x8FD5, 0x5FB4}, //2809 #CJK UNIFIED IDEOGRAPH
+ {0x8FD6, 0x5FB6}, //2810 #CJK UNIFIED IDEOGRAPH
+ {0x8FD7, 0x5FB8}, //2811 #CJK UNIFIED IDEOGRAPH
+ {0x8FD8, 0x5FB9}, //2812 #CJK UNIFIED IDEOGRAPH
+ {0x8FD9, 0x5FBA}, //2813 #CJK UNIFIED IDEOGRAPH
+ {0x8FDA, 0x5FBB}, //2814 #CJK UNIFIED IDEOGRAPH
+ {0x8FDB, 0x5FBE}, //2815 #CJK UNIFIED IDEOGRAPH
+ {0x8FDC, 0x5FBF}, //2816 #CJK UNIFIED IDEOGRAPH
+ {0x8FDD, 0x5FC0}, //2817 #CJK UNIFIED IDEOGRAPH
+ {0x8FDE, 0x5FC1}, //2818 #CJK UNIFIED IDEOGRAPH
+ {0x8FDF, 0x5FC2}, //2819 #CJK UNIFIED IDEOGRAPH
+ {0x8FE0, 0x5FC7}, //2820 #CJK UNIFIED IDEOGRAPH
+ {0x8FE1, 0x5FC8}, //2821 #CJK UNIFIED IDEOGRAPH
+ {0x8FE2, 0x5FCA}, //2822 #CJK UNIFIED IDEOGRAPH
+ {0x8FE3, 0x5FCB}, //2823 #CJK UNIFIED IDEOGRAPH
+ {0x8FE4, 0x5FCE}, //2824 #CJK UNIFIED IDEOGRAPH
+ {0x8FE5, 0x5FD3}, //2825 #CJK UNIFIED IDEOGRAPH
+ {0x8FE6, 0x5FD4}, //2826 #CJK UNIFIED IDEOGRAPH
+ {0x8FE7, 0x5FD5}, //2827 #CJK UNIFIED IDEOGRAPH
+ {0x8FE8, 0x5FDA}, //2828 #CJK UNIFIED IDEOGRAPH
+ {0x8FE9, 0x5FDB}, //2829 #CJK UNIFIED IDEOGRAPH
+ {0x8FEA, 0x5FDC}, //2830 #CJK UNIFIED IDEOGRAPH
+ {0x8FEB, 0x5FDE}, //2831 #CJK UNIFIED IDEOGRAPH
+ {0x8FEC, 0x5FDF}, //2832 #CJK UNIFIED IDEOGRAPH
+ {0x8FED, 0x5FE2}, //2833 #CJK UNIFIED IDEOGRAPH
+ {0x8FEE, 0x5FE3}, //2834 #CJK UNIFIED IDEOGRAPH
+ {0x8FEF, 0x5FE5}, //2835 #CJK UNIFIED IDEOGRAPH
+ {0x8FF0, 0x5FE6}, //2836 #CJK UNIFIED IDEOGRAPH
+ {0x8FF1, 0x5FE8}, //2837 #CJK UNIFIED IDEOGRAPH
+ {0x8FF2, 0x5FE9}, //2838 #CJK UNIFIED IDEOGRAPH
+ {0x8FF3, 0x5FEC}, //2839 #CJK UNIFIED IDEOGRAPH
+ {0x8FF4, 0x5FEF}, //2840 #CJK UNIFIED IDEOGRAPH
+ {0x8FF5, 0x5FF0}, //2841 #CJK UNIFIED IDEOGRAPH
+ {0x8FF6, 0x5FF2}, //2842 #CJK UNIFIED IDEOGRAPH
+ {0x8FF7, 0x5FF3}, //2843 #CJK UNIFIED IDEOGRAPH
+ {0x8FF8, 0x5FF4}, //2844 #CJK UNIFIED IDEOGRAPH
+ {0x8FF9, 0x5FF6}, //2845 #CJK UNIFIED IDEOGRAPH
+ {0x8FFA, 0x5FF7}, //2846 #CJK UNIFIED IDEOGRAPH
+ {0x8FFB, 0x5FF9}, //2847 #CJK UNIFIED IDEOGRAPH
+ {0x8FFC, 0x5FFA}, //2848 #CJK UNIFIED IDEOGRAPH
+ {0x8FFD, 0x5FFC}, //2849 #CJK UNIFIED IDEOGRAPH
+ {0x8FFE, 0x6007}, //2850 #CJK UNIFIED IDEOGRAPH
+ {0x9040, 0x6008}, //2851 #CJK UNIFIED IDEOGRAPH
+ {0x9041, 0x6009}, //2852 #CJK UNIFIED IDEOGRAPH
+ {0x9042, 0x600B}, //2853 #CJK UNIFIED IDEOGRAPH
+ {0x9043, 0x600C}, //2854 #CJK UNIFIED IDEOGRAPH
+ {0x9044, 0x6010}, //2855 #CJK UNIFIED IDEOGRAPH
+ {0x9045, 0x6011}, //2856 #CJK UNIFIED IDEOGRAPH
+ {0x9046, 0x6013}, //2857 #CJK UNIFIED IDEOGRAPH
+ {0x9047, 0x6017}, //2858 #CJK UNIFIED IDEOGRAPH
+ {0x9048, 0x6018}, //2859 #CJK UNIFIED IDEOGRAPH
+ {0x9049, 0x601A}, //2860 #CJK UNIFIED IDEOGRAPH
+ {0x904A, 0x601E}, //2861 #CJK UNIFIED IDEOGRAPH
+ {0x904B, 0x601F}, //2862 #CJK UNIFIED IDEOGRAPH
+ {0x904C, 0x6022}, //2863 #CJK UNIFIED IDEOGRAPH
+ {0x904D, 0x6023}, //2864 #CJK UNIFIED IDEOGRAPH
+ {0x904E, 0x6024}, //2865 #CJK UNIFIED IDEOGRAPH
+ {0x904F, 0x602C}, //2866 #CJK UNIFIED IDEOGRAPH
+ {0x9050, 0x602D}, //2867 #CJK UNIFIED IDEOGRAPH
+ {0x9051, 0x602E}, //2868 #CJK UNIFIED IDEOGRAPH
+ {0x9052, 0x6030}, //2869 #CJK UNIFIED IDEOGRAPH
+ {0x9053, 0x6031}, //2870 #CJK UNIFIED IDEOGRAPH
+ {0x9054, 0x6032}, //2871 #CJK UNIFIED IDEOGRAPH
+ {0x9055, 0x6033}, //2872 #CJK UNIFIED IDEOGRAPH
+ {0x9056, 0x6034}, //2873 #CJK UNIFIED IDEOGRAPH
+ {0x9057, 0x6036}, //2874 #CJK UNIFIED IDEOGRAPH
+ {0x9058, 0x6037}, //2875 #CJK UNIFIED IDEOGRAPH
+ {0x9059, 0x6038}, //2876 #CJK UNIFIED IDEOGRAPH
+ {0x905A, 0x6039}, //2877 #CJK UNIFIED IDEOGRAPH
+ {0x905B, 0x603A}, //2878 #CJK UNIFIED IDEOGRAPH
+ {0x905C, 0x603D}, //2879 #CJK UNIFIED IDEOGRAPH
+ {0x905D, 0x603E}, //2880 #CJK UNIFIED IDEOGRAPH
+ {0x905E, 0x6040}, //2881 #CJK UNIFIED IDEOGRAPH
+ {0x905F, 0x6044}, //2882 #CJK UNIFIED IDEOGRAPH
+ {0x9060, 0x6045}, //2883 #CJK UNIFIED IDEOGRAPH
+ {0x9061, 0x6046}, //2884 #CJK UNIFIED IDEOGRAPH
+ {0x9062, 0x6047}, //2885 #CJK UNIFIED IDEOGRAPH
+ {0x9063, 0x6048}, //2886 #CJK UNIFIED IDEOGRAPH
+ {0x9064, 0x6049}, //2887 #CJK UNIFIED IDEOGRAPH
+ {0x9065, 0x604A}, //2888 #CJK UNIFIED IDEOGRAPH
+ {0x9066, 0x604C}, //2889 #CJK UNIFIED IDEOGRAPH
+ {0x9067, 0x604E}, //2890 #CJK UNIFIED IDEOGRAPH
+ {0x9068, 0x604F}, //2891 #CJK UNIFIED IDEOGRAPH
+ {0x9069, 0x6051}, //2892 #CJK UNIFIED IDEOGRAPH
+ {0x906A, 0x6053}, //2893 #CJK UNIFIED IDEOGRAPH
+ {0x906B, 0x6054}, //2894 #CJK UNIFIED IDEOGRAPH
+ {0x906C, 0x6056}, //2895 #CJK UNIFIED IDEOGRAPH
+ {0x906D, 0x6057}, //2896 #CJK UNIFIED IDEOGRAPH
+ {0x906E, 0x6058}, //2897 #CJK UNIFIED IDEOGRAPH
+ {0x906F, 0x605B}, //2898 #CJK UNIFIED IDEOGRAPH
+ {0x9070, 0x605C}, //2899 #CJK UNIFIED IDEOGRAPH
+ {0x9071, 0x605E}, //2900 #CJK UNIFIED IDEOGRAPH
+ {0x9072, 0x605F}, //2901 #CJK UNIFIED IDEOGRAPH
+ {0x9073, 0x6060}, //2902 #CJK UNIFIED IDEOGRAPH
+ {0x9074, 0x6061}, //2903 #CJK UNIFIED IDEOGRAPH
+ {0x9075, 0x6065}, //2904 #CJK UNIFIED IDEOGRAPH
+ {0x9076, 0x6066}, //2905 #CJK UNIFIED IDEOGRAPH
+ {0x9077, 0x606E}, //2906 #CJK UNIFIED IDEOGRAPH
+ {0x9078, 0x6071}, //2907 #CJK UNIFIED IDEOGRAPH
+ {0x9079, 0x6072}, //2908 #CJK UNIFIED IDEOGRAPH
+ {0x907A, 0x6074}, //2909 #CJK UNIFIED IDEOGRAPH
+ {0x907B, 0x6075}, //2910 #CJK UNIFIED IDEOGRAPH
+ {0x907C, 0x6077}, //2911 #CJK UNIFIED IDEOGRAPH
+ {0x907D, 0x607E}, //2912 #CJK UNIFIED IDEOGRAPH
+ {0x907E, 0x6080}, //2913 #CJK UNIFIED IDEOGRAPH
+ {0x9080, 0x6081}, //2914 #CJK UNIFIED IDEOGRAPH
+ {0x9081, 0x6082}, //2915 #CJK UNIFIED IDEOGRAPH
+ {0x9082, 0x6085}, //2916 #CJK UNIFIED IDEOGRAPH
+ {0x9083, 0x6086}, //2917 #CJK UNIFIED IDEOGRAPH
+ {0x9084, 0x6087}, //2918 #CJK UNIFIED IDEOGRAPH
+ {0x9085, 0x6088}, //2919 #CJK UNIFIED IDEOGRAPH
+ {0x9086, 0x608A}, //2920 #CJK UNIFIED IDEOGRAPH
+ {0x9087, 0x608B}, //2921 #CJK UNIFIED IDEOGRAPH
+ {0x9088, 0x608E}, //2922 #CJK UNIFIED IDEOGRAPH
+ {0x9089, 0x608F}, //2923 #CJK UNIFIED IDEOGRAPH
+ {0x908A, 0x6090}, //2924 #CJK UNIFIED IDEOGRAPH
+ {0x908B, 0x6091}, //2925 #CJK UNIFIED IDEOGRAPH
+ {0x908C, 0x6093}, //2926 #CJK UNIFIED IDEOGRAPH
+ {0x908D, 0x6095}, //2927 #CJK UNIFIED IDEOGRAPH
+ {0x908E, 0x6097}, //2928 #CJK UNIFIED IDEOGRAPH
+ {0x908F, 0x6098}, //2929 #CJK UNIFIED IDEOGRAPH
+ {0x9090, 0x6099}, //2930 #CJK UNIFIED IDEOGRAPH
+ {0x9091, 0x609C}, //2931 #CJK UNIFIED IDEOGRAPH
+ {0x9092, 0x609E}, //2932 #CJK UNIFIED IDEOGRAPH
+ {0x9093, 0x60A1}, //2933 #CJK UNIFIED IDEOGRAPH
+ {0x9094, 0x60A2}, //2934 #CJK UNIFIED IDEOGRAPH
+ {0x9095, 0x60A4}, //2935 #CJK UNIFIED IDEOGRAPH
+ {0x9096, 0x60A5}, //2936 #CJK UNIFIED IDEOGRAPH
+ {0x9097, 0x60A7}, //2937 #CJK UNIFIED IDEOGRAPH
+ {0x9098, 0x60A9}, //2938 #CJK UNIFIED IDEOGRAPH
+ {0x9099, 0x60AA}, //2939 #CJK UNIFIED IDEOGRAPH
+ {0x909A, 0x60AE}, //2940 #CJK UNIFIED IDEOGRAPH
+ {0x909B, 0x60B0}, //2941 #CJK UNIFIED IDEOGRAPH
+ {0x909C, 0x60B3}, //2942 #CJK UNIFIED IDEOGRAPH
+ {0x909D, 0x60B5}, //2943 #CJK UNIFIED IDEOGRAPH
+ {0x909E, 0x60B6}, //2944 #CJK UNIFIED IDEOGRAPH
+ {0x909F, 0x60B7}, //2945 #CJK UNIFIED IDEOGRAPH
+ {0x90A0, 0x60B9}, //2946 #CJK UNIFIED IDEOGRAPH
+ {0x90A1, 0x60BA}, //2947 #CJK UNIFIED IDEOGRAPH
+ {0x90A2, 0x60BD}, //2948 #CJK UNIFIED IDEOGRAPH
+ {0x90A3, 0x60BE}, //2949 #CJK UNIFIED IDEOGRAPH
+ {0x90A4, 0x60BF}, //2950 #CJK UNIFIED IDEOGRAPH
+ {0x90A5, 0x60C0}, //2951 #CJK UNIFIED IDEOGRAPH
+ {0x90A6, 0x60C1}, //2952 #CJK UNIFIED IDEOGRAPH
+ {0x90A7, 0x60C2}, //2953 #CJK UNIFIED IDEOGRAPH
+ {0x90A8, 0x60C3}, //2954 #CJK UNIFIED IDEOGRAPH
+ {0x90A9, 0x60C4}, //2955 #CJK UNIFIED IDEOGRAPH
+ {0x90AA, 0x60C7}, //2956 #CJK UNIFIED IDEOGRAPH
+ {0x90AB, 0x60C8}, //2957 #CJK UNIFIED IDEOGRAPH
+ {0x90AC, 0x60C9}, //2958 #CJK UNIFIED IDEOGRAPH
+ {0x90AD, 0x60CC}, //2959 #CJK UNIFIED IDEOGRAPH
+ {0x90AE, 0x60CD}, //2960 #CJK UNIFIED IDEOGRAPH
+ {0x90AF, 0x60CE}, //2961 #CJK UNIFIED IDEOGRAPH
+ {0x90B0, 0x60CF}, //2962 #CJK UNIFIED IDEOGRAPH
+ {0x90B1, 0x60D0}, //2963 #CJK UNIFIED IDEOGRAPH
+ {0x90B2, 0x60D2}, //2964 #CJK UNIFIED IDEOGRAPH
+ {0x90B3, 0x60D3}, //2965 #CJK UNIFIED IDEOGRAPH
+ {0x90B4, 0x60D4}, //2966 #CJK UNIFIED IDEOGRAPH
+ {0x90B5, 0x60D6}, //2967 #CJK UNIFIED IDEOGRAPH
+ {0x90B6, 0x60D7}, //2968 #CJK UNIFIED IDEOGRAPH
+ {0x90B7, 0x60D9}, //2969 #CJK UNIFIED IDEOGRAPH
+ {0x90B8, 0x60DB}, //2970 #CJK UNIFIED IDEOGRAPH
+ {0x90B9, 0x60DE}, //2971 #CJK UNIFIED IDEOGRAPH
+ {0x90BA, 0x60E1}, //2972 #CJK UNIFIED IDEOGRAPH
+ {0x90BB, 0x60E2}, //2973 #CJK UNIFIED IDEOGRAPH
+ {0x90BC, 0x60E3}, //2974 #CJK UNIFIED IDEOGRAPH
+ {0x90BD, 0x60E4}, //2975 #CJK UNIFIED IDEOGRAPH
+ {0x90BE, 0x60E5}, //2976 #CJK UNIFIED IDEOGRAPH
+ {0x90BF, 0x60EA}, //2977 #CJK UNIFIED IDEOGRAPH
+ {0x90C0, 0x60F1}, //2978 #CJK UNIFIED IDEOGRAPH
+ {0x90C1, 0x60F2}, //2979 #CJK UNIFIED IDEOGRAPH
+ {0x90C2, 0x60F5}, //2980 #CJK UNIFIED IDEOGRAPH
+ {0x90C3, 0x60F7}, //2981 #CJK UNIFIED IDEOGRAPH
+ {0x90C4, 0x60F8}, //2982 #CJK UNIFIED IDEOGRAPH
+ {0x90C5, 0x60FB}, //2983 #CJK UNIFIED IDEOGRAPH
+ {0x90C6, 0x60FC}, //2984 #CJK UNIFIED IDEOGRAPH
+ {0x90C7, 0x60FD}, //2985 #CJK UNIFIED IDEOGRAPH
+ {0x90C8, 0x60FE}, //2986 #CJK UNIFIED IDEOGRAPH
+ {0x90C9, 0x60FF}, //2987 #CJK UNIFIED IDEOGRAPH
+ {0x90CA, 0x6102}, //2988 #CJK UNIFIED IDEOGRAPH
+ {0x90CB, 0x6103}, //2989 #CJK UNIFIED IDEOGRAPH
+ {0x90CC, 0x6104}, //2990 #CJK UNIFIED IDEOGRAPH
+ {0x90CD, 0x6105}, //2991 #CJK UNIFIED IDEOGRAPH
+ {0x90CE, 0x6107}, //2992 #CJK UNIFIED IDEOGRAPH
+ {0x90CF, 0x610A}, //2993 #CJK UNIFIED IDEOGRAPH
+ {0x90D0, 0x610B}, //2994 #CJK UNIFIED IDEOGRAPH
+ {0x90D1, 0x610C}, //2995 #CJK UNIFIED IDEOGRAPH
+ {0x90D2, 0x6110}, //2996 #CJK UNIFIED IDEOGRAPH
+ {0x90D3, 0x6111}, //2997 #CJK UNIFIED IDEOGRAPH
+ {0x90D4, 0x6112}, //2998 #CJK UNIFIED IDEOGRAPH
+ {0x90D5, 0x6113}, //2999 #CJK UNIFIED IDEOGRAPH
+ {0x90D6, 0x6114}, //3000 #CJK UNIFIED IDEOGRAPH
+ {0x90D7, 0x6116}, //3001 #CJK UNIFIED IDEOGRAPH
+ {0x90D8, 0x6117}, //3002 #CJK UNIFIED IDEOGRAPH
+ {0x90D9, 0x6118}, //3003 #CJK UNIFIED IDEOGRAPH
+ {0x90DA, 0x6119}, //3004 #CJK UNIFIED IDEOGRAPH
+ {0x90DB, 0x611B}, //3005 #CJK UNIFIED IDEOGRAPH
+ {0x90DC, 0x611C}, //3006 #CJK UNIFIED IDEOGRAPH
+ {0x90DD, 0x611D}, //3007 #CJK UNIFIED IDEOGRAPH
+ {0x90DE, 0x611E}, //3008 #CJK UNIFIED IDEOGRAPH
+ {0x90DF, 0x6121}, //3009 #CJK UNIFIED IDEOGRAPH
+ {0x90E0, 0x6122}, //3010 #CJK UNIFIED IDEOGRAPH
+ {0x90E1, 0x6125}, //3011 #CJK UNIFIED IDEOGRAPH
+ {0x90E2, 0x6128}, //3012 #CJK UNIFIED IDEOGRAPH
+ {0x90E3, 0x6129}, //3013 #CJK UNIFIED IDEOGRAPH
+ {0x90E4, 0x612A}, //3014 #CJK UNIFIED IDEOGRAPH
+ {0x90E5, 0x612C}, //3015 #CJK UNIFIED IDEOGRAPH
+ {0x90E6, 0x612D}, //3016 #CJK UNIFIED IDEOGRAPH
+ {0x90E7, 0x612E}, //3017 #CJK UNIFIED IDEOGRAPH
+ {0x90E8, 0x612F}, //3018 #CJK UNIFIED IDEOGRAPH
+ {0x90E9, 0x6130}, //3019 #CJK UNIFIED IDEOGRAPH
+ {0x90EA, 0x6131}, //3020 #CJK UNIFIED IDEOGRAPH
+ {0x90EB, 0x6132}, //3021 #CJK UNIFIED IDEOGRAPH
+ {0x90EC, 0x6133}, //3022 #CJK UNIFIED IDEOGRAPH
+ {0x90ED, 0x6134}, //3023 #CJK UNIFIED IDEOGRAPH
+ {0x90EE, 0x6135}, //3024 #CJK UNIFIED IDEOGRAPH
+ {0x90EF, 0x6136}, //3025 #CJK UNIFIED IDEOGRAPH
+ {0x90F0, 0x6137}, //3026 #CJK UNIFIED IDEOGRAPH
+ {0x90F1, 0x6138}, //3027 #CJK UNIFIED IDEOGRAPH
+ {0x90F2, 0x6139}, //3028 #CJK UNIFIED IDEOGRAPH
+ {0x90F3, 0x613A}, //3029 #CJK UNIFIED IDEOGRAPH
+ {0x90F4, 0x613B}, //3030 #CJK UNIFIED IDEOGRAPH
+ {0x90F5, 0x613C}, //3031 #CJK UNIFIED IDEOGRAPH
+ {0x90F6, 0x613D}, //3032 #CJK UNIFIED IDEOGRAPH
+ {0x90F7, 0x613E}, //3033 #CJK UNIFIED IDEOGRAPH
+ {0x90F8, 0x6140}, //3034 #CJK UNIFIED IDEOGRAPH
+ {0x90F9, 0x6141}, //3035 #CJK UNIFIED IDEOGRAPH
+ {0x90FA, 0x6142}, //3036 #CJK UNIFIED IDEOGRAPH
+ {0x90FB, 0x6143}, //3037 #CJK UNIFIED IDEOGRAPH
+ {0x90FC, 0x6144}, //3038 #CJK UNIFIED IDEOGRAPH
+ {0x90FD, 0x6145}, //3039 #CJK UNIFIED IDEOGRAPH
+ {0x90FE, 0x6146}, //3040 #CJK UNIFIED IDEOGRAPH
+ {0x9140, 0x6147}, //3041 #CJK UNIFIED IDEOGRAPH
+ {0x9141, 0x6149}, //3042 #CJK UNIFIED IDEOGRAPH
+ {0x9142, 0x614B}, //3043 #CJK UNIFIED IDEOGRAPH
+ {0x9143, 0x614D}, //3044 #CJK UNIFIED IDEOGRAPH
+ {0x9144, 0x614F}, //3045 #CJK UNIFIED IDEOGRAPH
+ {0x9145, 0x6150}, //3046 #CJK UNIFIED IDEOGRAPH
+ {0x9146, 0x6152}, //3047 #CJK UNIFIED IDEOGRAPH
+ {0x9147, 0x6153}, //3048 #CJK UNIFIED IDEOGRAPH
+ {0x9148, 0x6154}, //3049 #CJK UNIFIED IDEOGRAPH
+ {0x9149, 0x6156}, //3050 #CJK UNIFIED IDEOGRAPH
+ {0x914A, 0x6157}, //3051 #CJK UNIFIED IDEOGRAPH
+ {0x914B, 0x6158}, //3052 #CJK UNIFIED IDEOGRAPH
+ {0x914C, 0x6159}, //3053 #CJK UNIFIED IDEOGRAPH
+ {0x914D, 0x615A}, //3054 #CJK UNIFIED IDEOGRAPH
+ {0x914E, 0x615B}, //3055 #CJK UNIFIED IDEOGRAPH
+ {0x914F, 0x615C}, //3056 #CJK UNIFIED IDEOGRAPH
+ {0x9150, 0x615E}, //3057 #CJK UNIFIED IDEOGRAPH
+ {0x9151, 0x615F}, //3058 #CJK UNIFIED IDEOGRAPH
+ {0x9152, 0x6160}, //3059 #CJK UNIFIED IDEOGRAPH
+ {0x9153, 0x6161}, //3060 #CJK UNIFIED IDEOGRAPH
+ {0x9154, 0x6163}, //3061 #CJK UNIFIED IDEOGRAPH
+ {0x9155, 0x6164}, //3062 #CJK UNIFIED IDEOGRAPH
+ {0x9156, 0x6165}, //3063 #CJK UNIFIED IDEOGRAPH
+ {0x9157, 0x6166}, //3064 #CJK UNIFIED IDEOGRAPH
+ {0x9158, 0x6169}, //3065 #CJK UNIFIED IDEOGRAPH
+ {0x9159, 0x616A}, //3066 #CJK UNIFIED IDEOGRAPH
+ {0x915A, 0x616B}, //3067 #CJK UNIFIED IDEOGRAPH
+ {0x915B, 0x616C}, //3068 #CJK UNIFIED IDEOGRAPH
+ {0x915C, 0x616D}, //3069 #CJK UNIFIED IDEOGRAPH
+ {0x915D, 0x616E}, //3070 #CJK UNIFIED IDEOGRAPH
+ {0x915E, 0x616F}, //3071 #CJK UNIFIED IDEOGRAPH
+ {0x915F, 0x6171}, //3072 #CJK UNIFIED IDEOGRAPH
+ {0x9160, 0x6172}, //3073 #CJK UNIFIED IDEOGRAPH
+ {0x9161, 0x6173}, //3074 #CJK UNIFIED IDEOGRAPH
+ {0x9162, 0x6174}, //3075 #CJK UNIFIED IDEOGRAPH
+ {0x9163, 0x6176}, //3076 #CJK UNIFIED IDEOGRAPH
+ {0x9164, 0x6178}, //3077 #CJK UNIFIED IDEOGRAPH
+ {0x9165, 0x6179}, //3078 #CJK UNIFIED IDEOGRAPH
+ {0x9166, 0x617A}, //3079 #CJK UNIFIED IDEOGRAPH
+ {0x9167, 0x617B}, //3080 #CJK UNIFIED IDEOGRAPH
+ {0x9168, 0x617C}, //3081 #CJK UNIFIED IDEOGRAPH
+ {0x9169, 0x617D}, //3082 #CJK UNIFIED IDEOGRAPH
+ {0x916A, 0x617E}, //3083 #CJK UNIFIED IDEOGRAPH
+ {0x916B, 0x617F}, //3084 #CJK UNIFIED IDEOGRAPH
+ {0x916C, 0x6180}, //3085 #CJK UNIFIED IDEOGRAPH
+ {0x916D, 0x6181}, //3086 #CJK UNIFIED IDEOGRAPH
+ {0x916E, 0x6182}, //3087 #CJK UNIFIED IDEOGRAPH
+ {0x916F, 0x6183}, //3088 #CJK UNIFIED IDEOGRAPH
+ {0x9170, 0x6184}, //3089 #CJK UNIFIED IDEOGRAPH
+ {0x9171, 0x6185}, //3090 #CJK UNIFIED IDEOGRAPH
+ {0x9172, 0x6186}, //3091 #CJK UNIFIED IDEOGRAPH
+ {0x9173, 0x6187}, //3092 #CJK UNIFIED IDEOGRAPH
+ {0x9174, 0x6188}, //3093 #CJK UNIFIED IDEOGRAPH
+ {0x9175, 0x6189}, //3094 #CJK UNIFIED IDEOGRAPH
+ {0x9176, 0x618A}, //3095 #CJK UNIFIED IDEOGRAPH
+ {0x9177, 0x618C}, //3096 #CJK UNIFIED IDEOGRAPH
+ {0x9178, 0x618D}, //3097 #CJK UNIFIED IDEOGRAPH
+ {0x9179, 0x618F}, //3098 #CJK UNIFIED IDEOGRAPH
+ {0x917A, 0x6190}, //3099 #CJK UNIFIED IDEOGRAPH
+ {0x917B, 0x6191}, //3100 #CJK UNIFIED IDEOGRAPH
+ {0x917C, 0x6192}, //3101 #CJK UNIFIED IDEOGRAPH
+ {0x917D, 0x6193}, //3102 #CJK UNIFIED IDEOGRAPH
+ {0x917E, 0x6195}, //3103 #CJK UNIFIED IDEOGRAPH
+ {0x9180, 0x6196}, //3104 #CJK UNIFIED IDEOGRAPH
+ {0x9181, 0x6197}, //3105 #CJK UNIFIED IDEOGRAPH
+ {0x9182, 0x6198}, //3106 #CJK UNIFIED IDEOGRAPH
+ {0x9183, 0x6199}, //3107 #CJK UNIFIED IDEOGRAPH
+ {0x9184, 0x619A}, //3108 #CJK UNIFIED IDEOGRAPH
+ {0x9185, 0x619B}, //3109 #CJK UNIFIED IDEOGRAPH
+ {0x9186, 0x619C}, //3110 #CJK UNIFIED IDEOGRAPH
+ {0x9187, 0x619E}, //3111 #CJK UNIFIED IDEOGRAPH
+ {0x9188, 0x619F}, //3112 #CJK UNIFIED IDEOGRAPH
+ {0x9189, 0x61A0}, //3113 #CJK UNIFIED IDEOGRAPH
+ {0x918A, 0x61A1}, //3114 #CJK UNIFIED IDEOGRAPH
+ {0x918B, 0x61A2}, //3115 #CJK UNIFIED IDEOGRAPH
+ {0x918C, 0x61A3}, //3116 #CJK UNIFIED IDEOGRAPH
+ {0x918D, 0x61A4}, //3117 #CJK UNIFIED IDEOGRAPH
+ {0x918E, 0x61A5}, //3118 #CJK UNIFIED IDEOGRAPH
+ {0x918F, 0x61A6}, //3119 #CJK UNIFIED IDEOGRAPH
+ {0x9190, 0x61AA}, //3120 #CJK UNIFIED IDEOGRAPH
+ {0x9191, 0x61AB}, //3121 #CJK UNIFIED IDEOGRAPH
+ {0x9192, 0x61AD}, //3122 #CJK UNIFIED IDEOGRAPH
+ {0x9193, 0x61AE}, //3123 #CJK UNIFIED IDEOGRAPH
+ {0x9194, 0x61AF}, //3124 #CJK UNIFIED IDEOGRAPH
+ {0x9195, 0x61B0}, //3125 #CJK UNIFIED IDEOGRAPH
+ {0x9196, 0x61B1}, //3126 #CJK UNIFIED IDEOGRAPH
+ {0x9197, 0x61B2}, //3127 #CJK UNIFIED IDEOGRAPH
+ {0x9198, 0x61B3}, //3128 #CJK UNIFIED IDEOGRAPH
+ {0x9199, 0x61B4}, //3129 #CJK UNIFIED IDEOGRAPH
+ {0x919A, 0x61B5}, //3130 #CJK UNIFIED IDEOGRAPH
+ {0x919B, 0x61B6}, //3131 #CJK UNIFIED IDEOGRAPH
+ {0x919C, 0x61B8}, //3132 #CJK UNIFIED IDEOGRAPH
+ {0x919D, 0x61B9}, //3133 #CJK UNIFIED IDEOGRAPH
+ {0x919E, 0x61BA}, //3134 #CJK UNIFIED IDEOGRAPH
+ {0x919F, 0x61BB}, //3135 #CJK UNIFIED IDEOGRAPH
+ {0x91A0, 0x61BC}, //3136 #CJK UNIFIED IDEOGRAPH
+ {0x91A1, 0x61BD}, //3137 #CJK UNIFIED IDEOGRAPH
+ {0x91A2, 0x61BF}, //3138 #CJK UNIFIED IDEOGRAPH
+ {0x91A3, 0x61C0}, //3139 #CJK UNIFIED IDEOGRAPH
+ {0x91A4, 0x61C1}, //3140 #CJK UNIFIED IDEOGRAPH
+ {0x91A5, 0x61C3}, //3141 #CJK UNIFIED IDEOGRAPH
+ {0x91A6, 0x61C4}, //3142 #CJK UNIFIED IDEOGRAPH
+ {0x91A7, 0x61C5}, //3143 #CJK UNIFIED IDEOGRAPH
+ {0x91A8, 0x61C6}, //3144 #CJK UNIFIED IDEOGRAPH
+ {0x91A9, 0x61C7}, //3145 #CJK UNIFIED IDEOGRAPH
+ {0x91AA, 0x61C9}, //3146 #CJK UNIFIED IDEOGRAPH
+ {0x91AB, 0x61CC}, //3147 #CJK UNIFIED IDEOGRAPH
+ {0x91AC, 0x61CD}, //3148 #CJK UNIFIED IDEOGRAPH
+ {0x91AD, 0x61CE}, //3149 #CJK UNIFIED IDEOGRAPH
+ {0x91AE, 0x61CF}, //3150 #CJK UNIFIED IDEOGRAPH
+ {0x91AF, 0x61D0}, //3151 #CJK UNIFIED IDEOGRAPH
+ {0x91B0, 0x61D3}, //3152 #CJK UNIFIED IDEOGRAPH
+ {0x91B1, 0x61D5}, //3153 #CJK UNIFIED IDEOGRAPH
+ {0x91B2, 0x61D6}, //3154 #CJK UNIFIED IDEOGRAPH
+ {0x91B3, 0x61D7}, //3155 #CJK UNIFIED IDEOGRAPH
+ {0x91B4, 0x61D8}, //3156 #CJK UNIFIED IDEOGRAPH
+ {0x91B5, 0x61D9}, //3157 #CJK UNIFIED IDEOGRAPH
+ {0x91B6, 0x61DA}, //3158 #CJK UNIFIED IDEOGRAPH
+ {0x91B7, 0x61DB}, //3159 #CJK UNIFIED IDEOGRAPH
+ {0x91B8, 0x61DC}, //3160 #CJK UNIFIED IDEOGRAPH
+ {0x91B9, 0x61DD}, //3161 #CJK UNIFIED IDEOGRAPH
+ {0x91BA, 0x61DE}, //3162 #CJK UNIFIED IDEOGRAPH
+ {0x91BB, 0x61DF}, //3163 #CJK UNIFIED IDEOGRAPH
+ {0x91BC, 0x61E0}, //3164 #CJK UNIFIED IDEOGRAPH
+ {0x91BD, 0x61E1}, //3165 #CJK UNIFIED IDEOGRAPH
+ {0x91BE, 0x61E2}, //3166 #CJK UNIFIED IDEOGRAPH
+ {0x91BF, 0x61E3}, //3167 #CJK UNIFIED IDEOGRAPH
+ {0x91C0, 0x61E4}, //3168 #CJK UNIFIED IDEOGRAPH
+ {0x91C1, 0x61E5}, //3169 #CJK UNIFIED IDEOGRAPH
+ {0x91C2, 0x61E7}, //3170 #CJK UNIFIED IDEOGRAPH
+ {0x91C3, 0x61E8}, //3171 #CJK UNIFIED IDEOGRAPH
+ {0x91C4, 0x61E9}, //3172 #CJK UNIFIED IDEOGRAPH
+ {0x91C5, 0x61EA}, //3173 #CJK UNIFIED IDEOGRAPH
+ {0x91C6, 0x61EB}, //3174 #CJK UNIFIED IDEOGRAPH
+ {0x91C7, 0x61EC}, //3175 #CJK UNIFIED IDEOGRAPH
+ {0x91C8, 0x61ED}, //3176 #CJK UNIFIED IDEOGRAPH
+ {0x91C9, 0x61EE}, //3177 #CJK UNIFIED IDEOGRAPH
+ {0x91CA, 0x61EF}, //3178 #CJK UNIFIED IDEOGRAPH
+ {0x91CB, 0x61F0}, //3179 #CJK UNIFIED IDEOGRAPH
+ {0x91CC, 0x61F1}, //3180 #CJK UNIFIED IDEOGRAPH
+ {0x91CD, 0x61F2}, //3181 #CJK UNIFIED IDEOGRAPH
+ {0x91CE, 0x61F3}, //3182 #CJK UNIFIED IDEOGRAPH
+ {0x91CF, 0x61F4}, //3183 #CJK UNIFIED IDEOGRAPH
+ {0x91D0, 0x61F6}, //3184 #CJK UNIFIED IDEOGRAPH
+ {0x91D1, 0x61F7}, //3185 #CJK UNIFIED IDEOGRAPH
+ {0x91D2, 0x61F8}, //3186 #CJK UNIFIED IDEOGRAPH
+ {0x91D3, 0x61F9}, //3187 #CJK UNIFIED IDEOGRAPH
+ {0x91D4, 0x61FA}, //3188 #CJK UNIFIED IDEOGRAPH
+ {0x91D5, 0x61FB}, //3189 #CJK UNIFIED IDEOGRAPH
+ {0x91D6, 0x61FC}, //3190 #CJK UNIFIED IDEOGRAPH
+ {0x91D7, 0x61FD}, //3191 #CJK UNIFIED IDEOGRAPH
+ {0x91D8, 0x61FE}, //3192 #CJK UNIFIED IDEOGRAPH
+ {0x91D9, 0x6200}, //3193 #CJK UNIFIED IDEOGRAPH
+ {0x91DA, 0x6201}, //3194 #CJK UNIFIED IDEOGRAPH
+ {0x91DB, 0x6202}, //3195 #CJK UNIFIED IDEOGRAPH
+ {0x91DC, 0x6203}, //3196 #CJK UNIFIED IDEOGRAPH
+ {0x91DD, 0x6204}, //3197 #CJK UNIFIED IDEOGRAPH
+ {0x91DE, 0x6205}, //3198 #CJK UNIFIED IDEOGRAPH
+ {0x91DF, 0x6207}, //3199 #CJK UNIFIED IDEOGRAPH
+ {0x91E0, 0x6209}, //3200 #CJK UNIFIED IDEOGRAPH
+ {0x91E1, 0x6213}, //3201 #CJK UNIFIED IDEOGRAPH
+ {0x91E2, 0x6214}, //3202 #CJK UNIFIED IDEOGRAPH
+ {0x91E3, 0x6219}, //3203 #CJK UNIFIED IDEOGRAPH
+ {0x91E4, 0x621C}, //3204 #CJK UNIFIED IDEOGRAPH
+ {0x91E5, 0x621D}, //3205 #CJK UNIFIED IDEOGRAPH
+ {0x91E6, 0x621E}, //3206 #CJK UNIFIED IDEOGRAPH
+ {0x91E7, 0x6220}, //3207 #CJK UNIFIED IDEOGRAPH
+ {0x91E8, 0x6223}, //3208 #CJK UNIFIED IDEOGRAPH
+ {0x91E9, 0x6226}, //3209 #CJK UNIFIED IDEOGRAPH
+ {0x91EA, 0x6227}, //3210 #CJK UNIFIED IDEOGRAPH
+ {0x91EB, 0x6228}, //3211 #CJK UNIFIED IDEOGRAPH
+ {0x91EC, 0x6229}, //3212 #CJK UNIFIED IDEOGRAPH
+ {0x91ED, 0x622B}, //3213 #CJK UNIFIED IDEOGRAPH
+ {0x91EE, 0x622D}, //3214 #CJK UNIFIED IDEOGRAPH
+ {0x91EF, 0x622F}, //3215 #CJK UNIFIED IDEOGRAPH
+ {0x91F0, 0x6230}, //3216 #CJK UNIFIED IDEOGRAPH
+ {0x91F1, 0x6231}, //3217 #CJK UNIFIED IDEOGRAPH
+ {0x91F2, 0x6232}, //3218 #CJK UNIFIED IDEOGRAPH
+ {0x91F3, 0x6235}, //3219 #CJK UNIFIED IDEOGRAPH
+ {0x91F4, 0x6236}, //3220 #CJK UNIFIED IDEOGRAPH
+ {0x91F5, 0x6238}, //3221 #CJK UNIFIED IDEOGRAPH
+ {0x91F6, 0x6239}, //3222 #CJK UNIFIED IDEOGRAPH
+ {0x91F7, 0x623A}, //3223 #CJK UNIFIED IDEOGRAPH
+ {0x91F8, 0x623B}, //3224 #CJK UNIFIED IDEOGRAPH
+ {0x91F9, 0x623C}, //3225 #CJK UNIFIED IDEOGRAPH
+ {0x91FA, 0x6242}, //3226 #CJK UNIFIED IDEOGRAPH
+ {0x91FB, 0x6244}, //3227 #CJK UNIFIED IDEOGRAPH
+ {0x91FC, 0x6245}, //3228 #CJK UNIFIED IDEOGRAPH
+ {0x91FD, 0x6246}, //3229 #CJK UNIFIED IDEOGRAPH
+ {0x91FE, 0x624A}, //3230 #CJK UNIFIED IDEOGRAPH
+ {0x9240, 0x624F}, //3231 #CJK UNIFIED IDEOGRAPH
+ {0x9241, 0x6250}, //3232 #CJK UNIFIED IDEOGRAPH
+ {0x9242, 0x6255}, //3233 #CJK UNIFIED IDEOGRAPH
+ {0x9243, 0x6256}, //3234 #CJK UNIFIED IDEOGRAPH
+ {0x9244, 0x6257}, //3235 #CJK UNIFIED IDEOGRAPH
+ {0x9245, 0x6259}, //3236 #CJK UNIFIED IDEOGRAPH
+ {0x9246, 0x625A}, //3237 #CJK UNIFIED IDEOGRAPH
+ {0x9247, 0x625C}, //3238 #CJK UNIFIED IDEOGRAPH
+ {0x9248, 0x625D}, //3239 #CJK UNIFIED IDEOGRAPH
+ {0x9249, 0x625E}, //3240 #CJK UNIFIED IDEOGRAPH
+ {0x924A, 0x625F}, //3241 #CJK UNIFIED IDEOGRAPH
+ {0x924B, 0x6260}, //3242 #CJK UNIFIED IDEOGRAPH
+ {0x924C, 0x6261}, //3243 #CJK UNIFIED IDEOGRAPH
+ {0x924D, 0x6262}, //3244 #CJK UNIFIED IDEOGRAPH
+ {0x924E, 0x6264}, //3245 #CJK UNIFIED IDEOGRAPH
+ {0x924F, 0x6265}, //3246 #CJK UNIFIED IDEOGRAPH
+ {0x9250, 0x6268}, //3247 #CJK UNIFIED IDEOGRAPH
+ {0x9251, 0x6271}, //3248 #CJK UNIFIED IDEOGRAPH
+ {0x9252, 0x6272}, //3249 #CJK UNIFIED IDEOGRAPH
+ {0x9253, 0x6274}, //3250 #CJK UNIFIED IDEOGRAPH
+ {0x9254, 0x6275}, //3251 #CJK UNIFIED IDEOGRAPH
+ {0x9255, 0x6277}, //3252 #CJK UNIFIED IDEOGRAPH
+ {0x9256, 0x6278}, //3253 #CJK UNIFIED IDEOGRAPH
+ {0x9257, 0x627A}, //3254 #CJK UNIFIED IDEOGRAPH
+ {0x9258, 0x627B}, //3255 #CJK UNIFIED IDEOGRAPH
+ {0x9259, 0x627D}, //3256 #CJK UNIFIED IDEOGRAPH
+ {0x925A, 0x6281}, //3257 #CJK UNIFIED IDEOGRAPH
+ {0x925B, 0x6282}, //3258 #CJK UNIFIED IDEOGRAPH
+ {0x925C, 0x6283}, //3259 #CJK UNIFIED IDEOGRAPH
+ {0x925D, 0x6285}, //3260 #CJK UNIFIED IDEOGRAPH
+ {0x925E, 0x6286}, //3261 #CJK UNIFIED IDEOGRAPH
+ {0x925F, 0x6287}, //3262 #CJK UNIFIED IDEOGRAPH
+ {0x9260, 0x6288}, //3263 #CJK UNIFIED IDEOGRAPH
+ {0x9261, 0x628B}, //3264 #CJK UNIFIED IDEOGRAPH
+ {0x9262, 0x628C}, //3265 #CJK UNIFIED IDEOGRAPH
+ {0x9263, 0x628D}, //3266 #CJK UNIFIED IDEOGRAPH
+ {0x9264, 0x628E}, //3267 #CJK UNIFIED IDEOGRAPH
+ {0x9265, 0x628F}, //3268 #CJK UNIFIED IDEOGRAPH
+ {0x9266, 0x6290}, //3269 #CJK UNIFIED IDEOGRAPH
+ {0x9267, 0x6294}, //3270 #CJK UNIFIED IDEOGRAPH
+ {0x9268, 0x6299}, //3271 #CJK UNIFIED IDEOGRAPH
+ {0x9269, 0x629C}, //3272 #CJK UNIFIED IDEOGRAPH
+ {0x926A, 0x629D}, //3273 #CJK UNIFIED IDEOGRAPH
+ {0x926B, 0x629E}, //3274 #CJK UNIFIED IDEOGRAPH
+ {0x926C, 0x62A3}, //3275 #CJK UNIFIED IDEOGRAPH
+ {0x926D, 0x62A6}, //3276 #CJK UNIFIED IDEOGRAPH
+ {0x926E, 0x62A7}, //3277 #CJK UNIFIED IDEOGRAPH
+ {0x926F, 0x62A9}, //3278 #CJK UNIFIED IDEOGRAPH
+ {0x9270, 0x62AA}, //3279 #CJK UNIFIED IDEOGRAPH
+ {0x9271, 0x62AD}, //3280 #CJK UNIFIED IDEOGRAPH
+ {0x9272, 0x62AE}, //3281 #CJK UNIFIED IDEOGRAPH
+ {0x9273, 0x62AF}, //3282 #CJK UNIFIED IDEOGRAPH
+ {0x9274, 0x62B0}, //3283 #CJK UNIFIED IDEOGRAPH
+ {0x9275, 0x62B2}, //3284 #CJK UNIFIED IDEOGRAPH
+ {0x9276, 0x62B3}, //3285 #CJK UNIFIED IDEOGRAPH
+ {0x9277, 0x62B4}, //3286 #CJK UNIFIED IDEOGRAPH
+ {0x9278, 0x62B6}, //3287 #CJK UNIFIED IDEOGRAPH
+ {0x9279, 0x62B7}, //3288 #CJK UNIFIED IDEOGRAPH
+ {0x927A, 0x62B8}, //3289 #CJK UNIFIED IDEOGRAPH
+ {0x927B, 0x62BA}, //3290 #CJK UNIFIED IDEOGRAPH
+ {0x927C, 0x62BE}, //3291 #CJK UNIFIED IDEOGRAPH
+ {0x927D, 0x62C0}, //3292 #CJK UNIFIED IDEOGRAPH
+ {0x927E, 0x62C1}, //3293 #CJK UNIFIED IDEOGRAPH
+ {0x9280, 0x62C3}, //3294 #CJK UNIFIED IDEOGRAPH
+ {0x9281, 0x62CB}, //3295 #CJK UNIFIED IDEOGRAPH
+ {0x9282, 0x62CF}, //3296 #CJK UNIFIED IDEOGRAPH
+ {0x9283, 0x62D1}, //3297 #CJK UNIFIED IDEOGRAPH
+ {0x9284, 0x62D5}, //3298 #CJK UNIFIED IDEOGRAPH
+ {0x9285, 0x62DD}, //3299 #CJK UNIFIED IDEOGRAPH
+ {0x9286, 0x62DE}, //3300 #CJK UNIFIED IDEOGRAPH
+ {0x9287, 0x62E0}, //3301 #CJK UNIFIED IDEOGRAPH
+ {0x9288, 0x62E1}, //3302 #CJK UNIFIED IDEOGRAPH
+ {0x9289, 0x62E4}, //3303 #CJK UNIFIED IDEOGRAPH
+ {0x928A, 0x62EA}, //3304 #CJK UNIFIED IDEOGRAPH
+ {0x928B, 0x62EB}, //3305 #CJK UNIFIED IDEOGRAPH
+ {0x928C, 0x62F0}, //3306 #CJK UNIFIED IDEOGRAPH
+ {0x928D, 0x62F2}, //3307 #CJK UNIFIED IDEOGRAPH
+ {0x928E, 0x62F5}, //3308 #CJK UNIFIED IDEOGRAPH
+ {0x928F, 0x62F8}, //3309 #CJK UNIFIED IDEOGRAPH
+ {0x9290, 0x62F9}, //3310 #CJK UNIFIED IDEOGRAPH
+ {0x9291, 0x62FA}, //3311 #CJK UNIFIED IDEOGRAPH
+ {0x9292, 0x62FB}, //3312 #CJK UNIFIED IDEOGRAPH
+ {0x9293, 0x6300}, //3313 #CJK UNIFIED IDEOGRAPH
+ {0x9294, 0x6303}, //3314 #CJK UNIFIED IDEOGRAPH
+ {0x9295, 0x6304}, //3315 #CJK UNIFIED IDEOGRAPH
+ {0x9296, 0x6305}, //3316 #CJK UNIFIED IDEOGRAPH
+ {0x9297, 0x6306}, //3317 #CJK UNIFIED IDEOGRAPH
+ {0x9298, 0x630A}, //3318 #CJK UNIFIED IDEOGRAPH
+ {0x9299, 0x630B}, //3319 #CJK UNIFIED IDEOGRAPH
+ {0x929A, 0x630C}, //3320 #CJK UNIFIED IDEOGRAPH
+ {0x929B, 0x630D}, //3321 #CJK UNIFIED IDEOGRAPH
+ {0x929C, 0x630F}, //3322 #CJK UNIFIED IDEOGRAPH
+ {0x929D, 0x6310}, //3323 #CJK UNIFIED IDEOGRAPH
+ {0x929E, 0x6312}, //3324 #CJK UNIFIED IDEOGRAPH
+ {0x929F, 0x6313}, //3325 #CJK UNIFIED IDEOGRAPH
+ {0x92A0, 0x6314}, //3326 #CJK UNIFIED IDEOGRAPH
+ {0x92A1, 0x6315}, //3327 #CJK UNIFIED IDEOGRAPH
+ {0x92A2, 0x6317}, //3328 #CJK UNIFIED IDEOGRAPH
+ {0x92A3, 0x6318}, //3329 #CJK UNIFIED IDEOGRAPH
+ {0x92A4, 0x6319}, //3330 #CJK UNIFIED IDEOGRAPH
+ {0x92A5, 0x631C}, //3331 #CJK UNIFIED IDEOGRAPH
+ {0x92A6, 0x6326}, //3332 #CJK UNIFIED IDEOGRAPH
+ {0x92A7, 0x6327}, //3333 #CJK UNIFIED IDEOGRAPH
+ {0x92A8, 0x6329}, //3334 #CJK UNIFIED IDEOGRAPH
+ {0x92A9, 0x632C}, //3335 #CJK UNIFIED IDEOGRAPH
+ {0x92AA, 0x632D}, //3336 #CJK UNIFIED IDEOGRAPH
+ {0x92AB, 0x632E}, //3337 #CJK UNIFIED IDEOGRAPH
+ {0x92AC, 0x6330}, //3338 #CJK UNIFIED IDEOGRAPH
+ {0x92AD, 0x6331}, //3339 #CJK UNIFIED IDEOGRAPH
+ {0x92AE, 0x6333}, //3340 #CJK UNIFIED IDEOGRAPH
+ {0x92AF, 0x6334}, //3341 #CJK UNIFIED IDEOGRAPH
+ {0x92B0, 0x6335}, //3342 #CJK UNIFIED IDEOGRAPH
+ {0x92B1, 0x6336}, //3343 #CJK UNIFIED IDEOGRAPH
+ {0x92B2, 0x6337}, //3344 #CJK UNIFIED IDEOGRAPH
+ {0x92B3, 0x6338}, //3345 #CJK UNIFIED IDEOGRAPH
+ {0x92B4, 0x633B}, //3346 #CJK UNIFIED IDEOGRAPH
+ {0x92B5, 0x633C}, //3347 #CJK UNIFIED IDEOGRAPH
+ {0x92B6, 0x633E}, //3348 #CJK UNIFIED IDEOGRAPH
+ {0x92B7, 0x633F}, //3349 #CJK UNIFIED IDEOGRAPH
+ {0x92B8, 0x6340}, //3350 #CJK UNIFIED IDEOGRAPH
+ {0x92B9, 0x6341}, //3351 #CJK UNIFIED IDEOGRAPH
+ {0x92BA, 0x6344}, //3352 #CJK UNIFIED IDEOGRAPH
+ {0x92BB, 0x6347}, //3353 #CJK UNIFIED IDEOGRAPH
+ {0x92BC, 0x6348}, //3354 #CJK UNIFIED IDEOGRAPH
+ {0x92BD, 0x634A}, //3355 #CJK UNIFIED IDEOGRAPH
+ {0x92BE, 0x6351}, //3356 #CJK UNIFIED IDEOGRAPH
+ {0x92BF, 0x6352}, //3357 #CJK UNIFIED IDEOGRAPH
+ {0x92C0, 0x6353}, //3358 #CJK UNIFIED IDEOGRAPH
+ {0x92C1, 0x6354}, //3359 #CJK UNIFIED IDEOGRAPH
+ {0x92C2, 0x6356}, //3360 #CJK UNIFIED IDEOGRAPH
+ {0x92C3, 0x6357}, //3361 #CJK UNIFIED IDEOGRAPH
+ {0x92C4, 0x6358}, //3362 #CJK UNIFIED IDEOGRAPH
+ {0x92C5, 0x6359}, //3363 #CJK UNIFIED IDEOGRAPH
+ {0x92C6, 0x635A}, //3364 #CJK UNIFIED IDEOGRAPH
+ {0x92C7, 0x635B}, //3365 #CJK UNIFIED IDEOGRAPH
+ {0x92C8, 0x635C}, //3366 #CJK UNIFIED IDEOGRAPH
+ {0x92C9, 0x635D}, //3367 #CJK UNIFIED IDEOGRAPH
+ {0x92CA, 0x6360}, //3368 #CJK UNIFIED IDEOGRAPH
+ {0x92CB, 0x6364}, //3369 #CJK UNIFIED IDEOGRAPH
+ {0x92CC, 0x6365}, //3370 #CJK UNIFIED IDEOGRAPH
+ {0x92CD, 0x6366}, //3371 #CJK UNIFIED IDEOGRAPH
+ {0x92CE, 0x6368}, //3372 #CJK UNIFIED IDEOGRAPH
+ {0x92CF, 0x636A}, //3373 #CJK UNIFIED IDEOGRAPH
+ {0x92D0, 0x636B}, //3374 #CJK UNIFIED IDEOGRAPH
+ {0x92D1, 0x636C}, //3375 #CJK UNIFIED IDEOGRAPH
+ {0x92D2, 0x636F}, //3376 #CJK UNIFIED IDEOGRAPH
+ {0x92D3, 0x6370}, //3377 #CJK UNIFIED IDEOGRAPH
+ {0x92D4, 0x6372}, //3378 #CJK UNIFIED IDEOGRAPH
+ {0x92D5, 0x6373}, //3379 #CJK UNIFIED IDEOGRAPH
+ {0x92D6, 0x6374}, //3380 #CJK UNIFIED IDEOGRAPH
+ {0x92D7, 0x6375}, //3381 #CJK UNIFIED IDEOGRAPH
+ {0x92D8, 0x6378}, //3382 #CJK UNIFIED IDEOGRAPH
+ {0x92D9, 0x6379}, //3383 #CJK UNIFIED IDEOGRAPH
+ {0x92DA, 0x637C}, //3384 #CJK UNIFIED IDEOGRAPH
+ {0x92DB, 0x637D}, //3385 #CJK UNIFIED IDEOGRAPH
+ {0x92DC, 0x637E}, //3386 #CJK UNIFIED IDEOGRAPH
+ {0x92DD, 0x637F}, //3387 #CJK UNIFIED IDEOGRAPH
+ {0x92DE, 0x6381}, //3388 #CJK UNIFIED IDEOGRAPH
+ {0x92DF, 0x6383}, //3389 #CJK UNIFIED IDEOGRAPH
+ {0x92E0, 0x6384}, //3390 #CJK UNIFIED IDEOGRAPH
+ {0x92E1, 0x6385}, //3391 #CJK UNIFIED IDEOGRAPH
+ {0x92E2, 0x6386}, //3392 #CJK UNIFIED IDEOGRAPH
+ {0x92E3, 0x638B}, //3393 #CJK UNIFIED IDEOGRAPH
+ {0x92E4, 0x638D}, //3394 #CJK UNIFIED IDEOGRAPH
+ {0x92E5, 0x6391}, //3395 #CJK UNIFIED IDEOGRAPH
+ {0x92E6, 0x6393}, //3396 #CJK UNIFIED IDEOGRAPH
+ {0x92E7, 0x6394}, //3397 #CJK UNIFIED IDEOGRAPH
+ {0x92E8, 0x6395}, //3398 #CJK UNIFIED IDEOGRAPH
+ {0x92E9, 0x6397}, //3399 #CJK UNIFIED IDEOGRAPH
+ {0x92EA, 0x6399}, //3400 #CJK UNIFIED IDEOGRAPH
+ {0x92EB, 0x639A}, //3401 #CJK UNIFIED IDEOGRAPH
+ {0x92EC, 0x639B}, //3402 #CJK UNIFIED IDEOGRAPH
+ {0x92ED, 0x639C}, //3403 #CJK UNIFIED IDEOGRAPH
+ {0x92EE, 0x639D}, //3404 #CJK UNIFIED IDEOGRAPH
+ {0x92EF, 0x639E}, //3405 #CJK UNIFIED IDEOGRAPH
+ {0x92F0, 0x639F}, //3406 #CJK UNIFIED IDEOGRAPH
+ {0x92F1, 0x63A1}, //3407 #CJK UNIFIED IDEOGRAPH
+ {0x92F2, 0x63A4}, //3408 #CJK UNIFIED IDEOGRAPH
+ {0x92F3, 0x63A6}, //3409 #CJK UNIFIED IDEOGRAPH
+ {0x92F4, 0x63AB}, //3410 #CJK UNIFIED IDEOGRAPH
+ {0x92F5, 0x63AF}, //3411 #CJK UNIFIED IDEOGRAPH
+ {0x92F6, 0x63B1}, //3412 #CJK UNIFIED IDEOGRAPH
+ {0x92F7, 0x63B2}, //3413 #CJK UNIFIED IDEOGRAPH
+ {0x92F8, 0x63B5}, //3414 #CJK UNIFIED IDEOGRAPH
+ {0x92F9, 0x63B6}, //3415 #CJK UNIFIED IDEOGRAPH
+ {0x92FA, 0x63B9}, //3416 #CJK UNIFIED IDEOGRAPH
+ {0x92FB, 0x63BB}, //3417 #CJK UNIFIED IDEOGRAPH
+ {0x92FC, 0x63BD}, //3418 #CJK UNIFIED IDEOGRAPH
+ {0x92FD, 0x63BF}, //3419 #CJK UNIFIED IDEOGRAPH
+ {0x92FE, 0x63C0}, //3420 #CJK UNIFIED IDEOGRAPH
+ {0x9340, 0x63C1}, //3421 #CJK UNIFIED IDEOGRAPH
+ {0x9341, 0x63C2}, //3422 #CJK UNIFIED IDEOGRAPH
+ {0x9342, 0x63C3}, //3423 #CJK UNIFIED IDEOGRAPH
+ {0x9343, 0x63C5}, //3424 #CJK UNIFIED IDEOGRAPH
+ {0x9344, 0x63C7}, //3425 #CJK UNIFIED IDEOGRAPH
+ {0x9345, 0x63C8}, //3426 #CJK UNIFIED IDEOGRAPH
+ {0x9346, 0x63CA}, //3427 #CJK UNIFIED IDEOGRAPH
+ {0x9347, 0x63CB}, //3428 #CJK UNIFIED IDEOGRAPH
+ {0x9348, 0x63CC}, //3429 #CJK UNIFIED IDEOGRAPH
+ {0x9349, 0x63D1}, //3430 #CJK UNIFIED IDEOGRAPH
+ {0x934A, 0x63D3}, //3431 #CJK UNIFIED IDEOGRAPH
+ {0x934B, 0x63D4}, //3432 #CJK UNIFIED IDEOGRAPH
+ {0x934C, 0x63D5}, //3433 #CJK UNIFIED IDEOGRAPH
+ {0x934D, 0x63D7}, //3434 #CJK UNIFIED IDEOGRAPH
+ {0x934E, 0x63D8}, //3435 #CJK UNIFIED IDEOGRAPH
+ {0x934F, 0x63D9}, //3436 #CJK UNIFIED IDEOGRAPH
+ {0x9350, 0x63DA}, //3437 #CJK UNIFIED IDEOGRAPH
+ {0x9351, 0x63DB}, //3438 #CJK UNIFIED IDEOGRAPH
+ {0x9352, 0x63DC}, //3439 #CJK UNIFIED IDEOGRAPH
+ {0x9353, 0x63DD}, //3440 #CJK UNIFIED IDEOGRAPH
+ {0x9354, 0x63DF}, //3441 #CJK UNIFIED IDEOGRAPH
+ {0x9355, 0x63E2}, //3442 #CJK UNIFIED IDEOGRAPH
+ {0x9356, 0x63E4}, //3443 #CJK UNIFIED IDEOGRAPH
+ {0x9357, 0x63E5}, //3444 #CJK UNIFIED IDEOGRAPH
+ {0x9358, 0x63E6}, //3445 #CJK UNIFIED IDEOGRAPH
+ {0x9359, 0x63E7}, //3446 #CJK UNIFIED IDEOGRAPH
+ {0x935A, 0x63E8}, //3447 #CJK UNIFIED IDEOGRAPH
+ {0x935B, 0x63EB}, //3448 #CJK UNIFIED IDEOGRAPH
+ {0x935C, 0x63EC}, //3449 #CJK UNIFIED IDEOGRAPH
+ {0x935D, 0x63EE}, //3450 #CJK UNIFIED IDEOGRAPH
+ {0x935E, 0x63EF}, //3451 #CJK UNIFIED IDEOGRAPH
+ {0x935F, 0x63F0}, //3452 #CJK UNIFIED IDEOGRAPH
+ {0x9360, 0x63F1}, //3453 #CJK UNIFIED IDEOGRAPH
+ {0x9361, 0x63F3}, //3454 #CJK UNIFIED IDEOGRAPH
+ {0x9362, 0x63F5}, //3455 #CJK UNIFIED IDEOGRAPH
+ {0x9363, 0x63F7}, //3456 #CJK UNIFIED IDEOGRAPH
+ {0x9364, 0x63F9}, //3457 #CJK UNIFIED IDEOGRAPH
+ {0x9365, 0x63FA}, //3458 #CJK UNIFIED IDEOGRAPH
+ {0x9366, 0x63FB}, //3459 #CJK UNIFIED IDEOGRAPH
+ {0x9367, 0x63FC}, //3460 #CJK UNIFIED IDEOGRAPH
+ {0x9368, 0x63FE}, //3461 #CJK UNIFIED IDEOGRAPH
+ {0x9369, 0x6403}, //3462 #CJK UNIFIED IDEOGRAPH
+ {0x936A, 0x6404}, //3463 #CJK UNIFIED IDEOGRAPH
+ {0x936B, 0x6406}, //3464 #CJK UNIFIED IDEOGRAPH
+ {0x936C, 0x6407}, //3465 #CJK UNIFIED IDEOGRAPH
+ {0x936D, 0x6408}, //3466 #CJK UNIFIED IDEOGRAPH
+ {0x936E, 0x6409}, //3467 #CJK UNIFIED IDEOGRAPH
+ {0x936F, 0x640A}, //3468 #CJK UNIFIED IDEOGRAPH
+ {0x9370, 0x640D}, //3469 #CJK UNIFIED IDEOGRAPH
+ {0x9371, 0x640E}, //3470 #CJK UNIFIED IDEOGRAPH
+ {0x9372, 0x6411}, //3471 #CJK UNIFIED IDEOGRAPH
+ {0x9373, 0x6412}, //3472 #CJK UNIFIED IDEOGRAPH
+ {0x9374, 0x6415}, //3473 #CJK UNIFIED IDEOGRAPH
+ {0x9375, 0x6416}, //3474 #CJK UNIFIED IDEOGRAPH
+ {0x9376, 0x6417}, //3475 #CJK UNIFIED IDEOGRAPH
+ {0x9377, 0x6418}, //3476 #CJK UNIFIED IDEOGRAPH
+ {0x9378, 0x6419}, //3477 #CJK UNIFIED IDEOGRAPH
+ {0x9379, 0x641A}, //3478 #CJK UNIFIED IDEOGRAPH
+ {0x937A, 0x641D}, //3479 #CJK UNIFIED IDEOGRAPH
+ {0x937B, 0x641F}, //3480 #CJK UNIFIED IDEOGRAPH
+ {0x937C, 0x6422}, //3481 #CJK UNIFIED IDEOGRAPH
+ {0x937D, 0x6423}, //3482 #CJK UNIFIED IDEOGRAPH
+ {0x937E, 0x6424}, //3483 #CJK UNIFIED IDEOGRAPH
+ {0x9380, 0x6425}, //3484 #CJK UNIFIED IDEOGRAPH
+ {0x9381, 0x6427}, //3485 #CJK UNIFIED IDEOGRAPH
+ {0x9382, 0x6428}, //3486 #CJK UNIFIED IDEOGRAPH
+ {0x9383, 0x6429}, //3487 #CJK UNIFIED IDEOGRAPH
+ {0x9384, 0x642B}, //3488 #CJK UNIFIED IDEOGRAPH
+ {0x9385, 0x642E}, //3489 #CJK UNIFIED IDEOGRAPH
+ {0x9386, 0x642F}, //3490 #CJK UNIFIED IDEOGRAPH
+ {0x9387, 0x6430}, //3491 #CJK UNIFIED IDEOGRAPH
+ {0x9388, 0x6431}, //3492 #CJK UNIFIED IDEOGRAPH
+ {0x9389, 0x6432}, //3493 #CJK UNIFIED IDEOGRAPH
+ {0x938A, 0x6433}, //3494 #CJK UNIFIED IDEOGRAPH
+ {0x938B, 0x6435}, //3495 #CJK UNIFIED IDEOGRAPH
+ {0x938C, 0x6436}, //3496 #CJK UNIFIED IDEOGRAPH
+ {0x938D, 0x6437}, //3497 #CJK UNIFIED IDEOGRAPH
+ {0x938E, 0x6438}, //3498 #CJK UNIFIED IDEOGRAPH
+ {0x938F, 0x6439}, //3499 #CJK UNIFIED IDEOGRAPH
+ {0x9390, 0x643B}, //3500 #CJK UNIFIED IDEOGRAPH
+ {0x9391, 0x643C}, //3501 #CJK UNIFIED IDEOGRAPH
+ {0x9392, 0x643E}, //3502 #CJK UNIFIED IDEOGRAPH
+ {0x9393, 0x6440}, //3503 #CJK UNIFIED IDEOGRAPH
+ {0x9394, 0x6442}, //3504 #CJK UNIFIED IDEOGRAPH
+ {0x9395, 0x6443}, //3505 #CJK UNIFIED IDEOGRAPH
+ {0x9396, 0x6449}, //3506 #CJK UNIFIED IDEOGRAPH
+ {0x9397, 0x644B}, //3507 #CJK UNIFIED IDEOGRAPH
+ {0x9398, 0x644C}, //3508 #CJK UNIFIED IDEOGRAPH
+ {0x9399, 0x644D}, //3509 #CJK UNIFIED IDEOGRAPH
+ {0x939A, 0x644E}, //3510 #CJK UNIFIED IDEOGRAPH
+ {0x939B, 0x644F}, //3511 #CJK UNIFIED IDEOGRAPH
+ {0x939C, 0x6450}, //3512 #CJK UNIFIED IDEOGRAPH
+ {0x939D, 0x6451}, //3513 #CJK UNIFIED IDEOGRAPH
+ {0x939E, 0x6453}, //3514 #CJK UNIFIED IDEOGRAPH
+ {0x939F, 0x6455}, //3515 #CJK UNIFIED IDEOGRAPH
+ {0x93A0, 0x6456}, //3516 #CJK UNIFIED IDEOGRAPH
+ {0x93A1, 0x6457}, //3517 #CJK UNIFIED IDEOGRAPH
+ {0x93A2, 0x6459}, //3518 #CJK UNIFIED IDEOGRAPH
+ {0x93A3, 0x645A}, //3519 #CJK UNIFIED IDEOGRAPH
+ {0x93A4, 0x645B}, //3520 #CJK UNIFIED IDEOGRAPH
+ {0x93A5, 0x645C}, //3521 #CJK UNIFIED IDEOGRAPH
+ {0x93A6, 0x645D}, //3522 #CJK UNIFIED IDEOGRAPH
+ {0x93A7, 0x645F}, //3523 #CJK UNIFIED IDEOGRAPH
+ {0x93A8, 0x6460}, //3524 #CJK UNIFIED IDEOGRAPH
+ {0x93A9, 0x6461}, //3525 #CJK UNIFIED IDEOGRAPH
+ {0x93AA, 0x6462}, //3526 #CJK UNIFIED IDEOGRAPH
+ {0x93AB, 0x6463}, //3527 #CJK UNIFIED IDEOGRAPH
+ {0x93AC, 0x6464}, //3528 #CJK UNIFIED IDEOGRAPH
+ {0x93AD, 0x6465}, //3529 #CJK UNIFIED IDEOGRAPH
+ {0x93AE, 0x6466}, //3530 #CJK UNIFIED IDEOGRAPH
+ {0x93AF, 0x6468}, //3531 #CJK UNIFIED IDEOGRAPH
+ {0x93B0, 0x646A}, //3532 #CJK UNIFIED IDEOGRAPH
+ {0x93B1, 0x646B}, //3533 #CJK UNIFIED IDEOGRAPH
+ {0x93B2, 0x646C}, //3534 #CJK UNIFIED IDEOGRAPH
+ {0x93B3, 0x646E}, //3535 #CJK UNIFIED IDEOGRAPH
+ {0x93B4, 0x646F}, //3536 #CJK UNIFIED IDEOGRAPH
+ {0x93B5, 0x6470}, //3537 #CJK UNIFIED IDEOGRAPH
+ {0x93B6, 0x6471}, //3538 #CJK UNIFIED IDEOGRAPH
+ {0x93B7, 0x6472}, //3539 #CJK UNIFIED IDEOGRAPH
+ {0x93B8, 0x6473}, //3540 #CJK UNIFIED IDEOGRAPH
+ {0x93B9, 0x6474}, //3541 #CJK UNIFIED IDEOGRAPH
+ {0x93BA, 0x6475}, //3542 #CJK UNIFIED IDEOGRAPH
+ {0x93BB, 0x6476}, //3543 #CJK UNIFIED IDEOGRAPH
+ {0x93BC, 0x6477}, //3544 #CJK UNIFIED IDEOGRAPH
+ {0x93BD, 0x647B}, //3545 #CJK UNIFIED IDEOGRAPH
+ {0x93BE, 0x647C}, //3546 #CJK UNIFIED IDEOGRAPH
+ {0x93BF, 0x647D}, //3547 #CJK UNIFIED IDEOGRAPH
+ {0x93C0, 0x647E}, //3548 #CJK UNIFIED IDEOGRAPH
+ {0x93C1, 0x647F}, //3549 #CJK UNIFIED IDEOGRAPH
+ {0x93C2, 0x6480}, //3550 #CJK UNIFIED IDEOGRAPH
+ {0x93C3, 0x6481}, //3551 #CJK UNIFIED IDEOGRAPH
+ {0x93C4, 0x6483}, //3552 #CJK UNIFIED IDEOGRAPH
+ {0x93C5, 0x6486}, //3553 #CJK UNIFIED IDEOGRAPH
+ {0x93C6, 0x6488}, //3554 #CJK UNIFIED IDEOGRAPH
+ {0x93C7, 0x6489}, //3555 #CJK UNIFIED IDEOGRAPH
+ {0x93C8, 0x648A}, //3556 #CJK UNIFIED IDEOGRAPH
+ {0x93C9, 0x648B}, //3557 #CJK UNIFIED IDEOGRAPH
+ {0x93CA, 0x648C}, //3558 #CJK UNIFIED IDEOGRAPH
+ {0x93CB, 0x648D}, //3559 #CJK UNIFIED IDEOGRAPH
+ {0x93CC, 0x648E}, //3560 #CJK UNIFIED IDEOGRAPH
+ {0x93CD, 0x648F}, //3561 #CJK UNIFIED IDEOGRAPH
+ {0x93CE, 0x6490}, //3562 #CJK UNIFIED IDEOGRAPH
+ {0x93CF, 0x6493}, //3563 #CJK UNIFIED IDEOGRAPH
+ {0x93D0, 0x6494}, //3564 #CJK UNIFIED IDEOGRAPH
+ {0x93D1, 0x6497}, //3565 #CJK UNIFIED IDEOGRAPH
+ {0x93D2, 0x6498}, //3566 #CJK UNIFIED IDEOGRAPH
+ {0x93D3, 0x649A}, //3567 #CJK UNIFIED IDEOGRAPH
+ {0x93D4, 0x649B}, //3568 #CJK UNIFIED IDEOGRAPH
+ {0x93D5, 0x649C}, //3569 #CJK UNIFIED IDEOGRAPH
+ {0x93D6, 0x649D}, //3570 #CJK UNIFIED IDEOGRAPH
+ {0x93D7, 0x649F}, //3571 #CJK UNIFIED IDEOGRAPH
+ {0x93D8, 0x64A0}, //3572 #CJK UNIFIED IDEOGRAPH
+ {0x93D9, 0x64A1}, //3573 #CJK UNIFIED IDEOGRAPH
+ {0x93DA, 0x64A2}, //3574 #CJK UNIFIED IDEOGRAPH
+ {0x93DB, 0x64A3}, //3575 #CJK UNIFIED IDEOGRAPH
+ {0x93DC, 0x64A5}, //3576 #CJK UNIFIED IDEOGRAPH
+ {0x93DD, 0x64A6}, //3577 #CJK UNIFIED IDEOGRAPH
+ {0x93DE, 0x64A7}, //3578 #CJK UNIFIED IDEOGRAPH
+ {0x93DF, 0x64A8}, //3579 #CJK UNIFIED IDEOGRAPH
+ {0x93E0, 0x64AA}, //3580 #CJK UNIFIED IDEOGRAPH
+ {0x93E1, 0x64AB}, //3581 #CJK UNIFIED IDEOGRAPH
+ {0x93E2, 0x64AF}, //3582 #CJK UNIFIED IDEOGRAPH
+ {0x93E3, 0x64B1}, //3583 #CJK UNIFIED IDEOGRAPH
+ {0x93E4, 0x64B2}, //3584 #CJK UNIFIED IDEOGRAPH
+ {0x93E5, 0x64B3}, //3585 #CJK UNIFIED IDEOGRAPH
+ {0x93E6, 0x64B4}, //3586 #CJK UNIFIED IDEOGRAPH
+ {0x93E7, 0x64B6}, //3587 #CJK UNIFIED IDEOGRAPH
+ {0x93E8, 0x64B9}, //3588 #CJK UNIFIED IDEOGRAPH
+ {0x93E9, 0x64BB}, //3589 #CJK UNIFIED IDEOGRAPH
+ {0x93EA, 0x64BD}, //3590 #CJK UNIFIED IDEOGRAPH
+ {0x93EB, 0x64BE}, //3591 #CJK UNIFIED IDEOGRAPH
+ {0x93EC, 0x64BF}, //3592 #CJK UNIFIED IDEOGRAPH
+ {0x93ED, 0x64C1}, //3593 #CJK UNIFIED IDEOGRAPH
+ {0x93EE, 0x64C3}, //3594 #CJK UNIFIED IDEOGRAPH
+ {0x93EF, 0x64C4}, //3595 #CJK UNIFIED IDEOGRAPH
+ {0x93F0, 0x64C6}, //3596 #CJK UNIFIED IDEOGRAPH
+ {0x93F1, 0x64C7}, //3597 #CJK UNIFIED IDEOGRAPH
+ {0x93F2, 0x64C8}, //3598 #CJK UNIFIED IDEOGRAPH
+ {0x93F3, 0x64C9}, //3599 #CJK UNIFIED IDEOGRAPH
+ {0x93F4, 0x64CA}, //3600 #CJK UNIFIED IDEOGRAPH
+ {0x93F5, 0x64CB}, //3601 #CJK UNIFIED IDEOGRAPH
+ {0x93F6, 0x64CC}, //3602 #CJK UNIFIED IDEOGRAPH
+ {0x93F7, 0x64CF}, //3603 #CJK UNIFIED IDEOGRAPH
+ {0x93F8, 0x64D1}, //3604 #CJK UNIFIED IDEOGRAPH
+ {0x93F9, 0x64D3}, //3605 #CJK UNIFIED IDEOGRAPH
+ {0x93FA, 0x64D4}, //3606 #CJK UNIFIED IDEOGRAPH
+ {0x93FB, 0x64D5}, //3607 #CJK UNIFIED IDEOGRAPH
+ {0x93FC, 0x64D6}, //3608 #CJK UNIFIED IDEOGRAPH
+ {0x93FD, 0x64D9}, //3609 #CJK UNIFIED IDEOGRAPH
+ {0x93FE, 0x64DA}, //3610 #CJK UNIFIED IDEOGRAPH
+ {0x9440, 0x64DB}, //3611 #CJK UNIFIED IDEOGRAPH
+ {0x9441, 0x64DC}, //3612 #CJK UNIFIED IDEOGRAPH
+ {0x9442, 0x64DD}, //3613 #CJK UNIFIED IDEOGRAPH
+ {0x9443, 0x64DF}, //3614 #CJK UNIFIED IDEOGRAPH
+ {0x9444, 0x64E0}, //3615 #CJK UNIFIED IDEOGRAPH
+ {0x9445, 0x64E1}, //3616 #CJK UNIFIED IDEOGRAPH
+ {0x9446, 0x64E3}, //3617 #CJK UNIFIED IDEOGRAPH
+ {0x9447, 0x64E5}, //3618 #CJK UNIFIED IDEOGRAPH
+ {0x9448, 0x64E7}, //3619 #CJK UNIFIED IDEOGRAPH
+ {0x9449, 0x64E8}, //3620 #CJK UNIFIED IDEOGRAPH
+ {0x944A, 0x64E9}, //3621 #CJK UNIFIED IDEOGRAPH
+ {0x944B, 0x64EA}, //3622 #CJK UNIFIED IDEOGRAPH
+ {0x944C, 0x64EB}, //3623 #CJK UNIFIED IDEOGRAPH
+ {0x944D, 0x64EC}, //3624 #CJK UNIFIED IDEOGRAPH
+ {0x944E, 0x64ED}, //3625 #CJK UNIFIED IDEOGRAPH
+ {0x944F, 0x64EE}, //3626 #CJK UNIFIED IDEOGRAPH
+ {0x9450, 0x64EF}, //3627 #CJK UNIFIED IDEOGRAPH
+ {0x9451, 0x64F0}, //3628 #CJK UNIFIED IDEOGRAPH
+ {0x9452, 0x64F1}, //3629 #CJK UNIFIED IDEOGRAPH
+ {0x9453, 0x64F2}, //3630 #CJK UNIFIED IDEOGRAPH
+ {0x9454, 0x64F3}, //3631 #CJK UNIFIED IDEOGRAPH
+ {0x9455, 0x64F4}, //3632 #CJK UNIFIED IDEOGRAPH
+ {0x9456, 0x64F5}, //3633 #CJK UNIFIED IDEOGRAPH
+ {0x9457, 0x64F6}, //3634 #CJK UNIFIED IDEOGRAPH
+ {0x9458, 0x64F7}, //3635 #CJK UNIFIED IDEOGRAPH
+ {0x9459, 0x64F8}, //3636 #CJK UNIFIED IDEOGRAPH
+ {0x945A, 0x64F9}, //3637 #CJK UNIFIED IDEOGRAPH
+ {0x945B, 0x64FA}, //3638 #CJK UNIFIED IDEOGRAPH
+ {0x945C, 0x64FB}, //3639 #CJK UNIFIED IDEOGRAPH
+ {0x945D, 0x64FC}, //3640 #CJK UNIFIED IDEOGRAPH
+ {0x945E, 0x64FD}, //3641 #CJK UNIFIED IDEOGRAPH
+ {0x945F, 0x64FE}, //3642 #CJK UNIFIED IDEOGRAPH
+ {0x9460, 0x64FF}, //3643 #CJK UNIFIED IDEOGRAPH
+ {0x9461, 0x6501}, //3644 #CJK UNIFIED IDEOGRAPH
+ {0x9462, 0x6502}, //3645 #CJK UNIFIED IDEOGRAPH
+ {0x9463, 0x6503}, //3646 #CJK UNIFIED IDEOGRAPH
+ {0x9464, 0x6504}, //3647 #CJK UNIFIED IDEOGRAPH
+ {0x9465, 0x6505}, //3648 #CJK UNIFIED IDEOGRAPH
+ {0x9466, 0x6506}, //3649 #CJK UNIFIED IDEOGRAPH
+ {0x9467, 0x6507}, //3650 #CJK UNIFIED IDEOGRAPH
+ {0x9468, 0x6508}, //3651 #CJK UNIFIED IDEOGRAPH
+ {0x9469, 0x650A}, //3652 #CJK UNIFIED IDEOGRAPH
+ {0x946A, 0x650B}, //3653 #CJK UNIFIED IDEOGRAPH
+ {0x946B, 0x650C}, //3654 #CJK UNIFIED IDEOGRAPH
+ {0x946C, 0x650D}, //3655 #CJK UNIFIED IDEOGRAPH
+ {0x946D, 0x650E}, //3656 #CJK UNIFIED IDEOGRAPH
+ {0x946E, 0x650F}, //3657 #CJK UNIFIED IDEOGRAPH
+ {0x946F, 0x6510}, //3658 #CJK UNIFIED IDEOGRAPH
+ {0x9470, 0x6511}, //3659 #CJK UNIFIED IDEOGRAPH
+ {0x9471, 0x6513}, //3660 #CJK UNIFIED IDEOGRAPH
+ {0x9472, 0x6514}, //3661 #CJK UNIFIED IDEOGRAPH
+ {0x9473, 0x6515}, //3662 #CJK UNIFIED IDEOGRAPH
+ {0x9474, 0x6516}, //3663 #CJK UNIFIED IDEOGRAPH
+ {0x9475, 0x6517}, //3664 #CJK UNIFIED IDEOGRAPH
+ {0x9476, 0x6519}, //3665 #CJK UNIFIED IDEOGRAPH
+ {0x9477, 0x651A}, //3666 #CJK UNIFIED IDEOGRAPH
+ {0x9478, 0x651B}, //3667 #CJK UNIFIED IDEOGRAPH
+ {0x9479, 0x651C}, //3668 #CJK UNIFIED IDEOGRAPH
+ {0x947A, 0x651D}, //3669 #CJK UNIFIED IDEOGRAPH
+ {0x947B, 0x651E}, //3670 #CJK UNIFIED IDEOGRAPH
+ {0x947C, 0x651F}, //3671 #CJK UNIFIED IDEOGRAPH
+ {0x947D, 0x6520}, //3672 #CJK UNIFIED IDEOGRAPH
+ {0x947E, 0x6521}, //3673 #CJK UNIFIED IDEOGRAPH
+ {0x9480, 0x6522}, //3674 #CJK UNIFIED IDEOGRAPH
+ {0x9481, 0x6523}, //3675 #CJK UNIFIED IDEOGRAPH
+ {0x9482, 0x6524}, //3676 #CJK UNIFIED IDEOGRAPH
+ {0x9483, 0x6526}, //3677 #CJK UNIFIED IDEOGRAPH
+ {0x9484, 0x6527}, //3678 #CJK UNIFIED IDEOGRAPH
+ {0x9485, 0x6528}, //3679 #CJK UNIFIED IDEOGRAPH
+ {0x9486, 0x6529}, //3680 #CJK UNIFIED IDEOGRAPH
+ {0x9487, 0x652A}, //3681 #CJK UNIFIED IDEOGRAPH
+ {0x9488, 0x652C}, //3682 #CJK UNIFIED IDEOGRAPH
+ {0x9489, 0x652D}, //3683 #CJK UNIFIED IDEOGRAPH
+ {0x948A, 0x6530}, //3684 #CJK UNIFIED IDEOGRAPH
+ {0x948B, 0x6531}, //3685 #CJK UNIFIED IDEOGRAPH
+ {0x948C, 0x6532}, //3686 #CJK UNIFIED IDEOGRAPH
+ {0x948D, 0x6533}, //3687 #CJK UNIFIED IDEOGRAPH
+ {0x948E, 0x6537}, //3688 #CJK UNIFIED IDEOGRAPH
+ {0x948F, 0x653A}, //3689 #CJK UNIFIED IDEOGRAPH
+ {0x9490, 0x653C}, //3690 #CJK UNIFIED IDEOGRAPH
+ {0x9491, 0x653D}, //3691 #CJK UNIFIED IDEOGRAPH
+ {0x9492, 0x6540}, //3692 #CJK UNIFIED IDEOGRAPH
+ {0x9493, 0x6541}, //3693 #CJK UNIFIED IDEOGRAPH
+ {0x9494, 0x6542}, //3694 #CJK UNIFIED IDEOGRAPH
+ {0x9495, 0x6543}, //3695 #CJK UNIFIED IDEOGRAPH
+ {0x9496, 0x6544}, //3696 #CJK UNIFIED IDEOGRAPH
+ {0x9497, 0x6546}, //3697 #CJK UNIFIED IDEOGRAPH
+ {0x9498, 0x6547}, //3698 #CJK UNIFIED IDEOGRAPH
+ {0x9499, 0x654A}, //3699 #CJK UNIFIED IDEOGRAPH
+ {0x949A, 0x654B}, //3700 #CJK UNIFIED IDEOGRAPH
+ {0x949B, 0x654D}, //3701 #CJK UNIFIED IDEOGRAPH
+ {0x949C, 0x654E}, //3702 #CJK UNIFIED IDEOGRAPH
+ {0x949D, 0x6550}, //3703 #CJK UNIFIED IDEOGRAPH
+ {0x949E, 0x6552}, //3704 #CJK UNIFIED IDEOGRAPH
+ {0x949F, 0x6553}, //3705 #CJK UNIFIED IDEOGRAPH
+ {0x94A0, 0x6554}, //3706 #CJK UNIFIED IDEOGRAPH
+ {0x94A1, 0x6557}, //3707 #CJK UNIFIED IDEOGRAPH
+ {0x94A2, 0x6558}, //3708 #CJK UNIFIED IDEOGRAPH
+ {0x94A3, 0x655A}, //3709 #CJK UNIFIED IDEOGRAPH
+ {0x94A4, 0x655C}, //3710 #CJK UNIFIED IDEOGRAPH
+ {0x94A5, 0x655F}, //3711 #CJK UNIFIED IDEOGRAPH
+ {0x94A6, 0x6560}, //3712 #CJK UNIFIED IDEOGRAPH
+ {0x94A7, 0x6561}, //3713 #CJK UNIFIED IDEOGRAPH
+ {0x94A8, 0x6564}, //3714 #CJK UNIFIED IDEOGRAPH
+ {0x94A9, 0x6565}, //3715 #CJK UNIFIED IDEOGRAPH
+ {0x94AA, 0x6567}, //3716 #CJK UNIFIED IDEOGRAPH
+ {0x94AB, 0x6568}, //3717 #CJK UNIFIED IDEOGRAPH
+ {0x94AC, 0x6569}, //3718 #CJK UNIFIED IDEOGRAPH
+ {0x94AD, 0x656A}, //3719 #CJK UNIFIED IDEOGRAPH
+ {0x94AE, 0x656D}, //3720 #CJK UNIFIED IDEOGRAPH
+ {0x94AF, 0x656E}, //3721 #CJK UNIFIED IDEOGRAPH
+ {0x94B0, 0x656F}, //3722 #CJK UNIFIED IDEOGRAPH
+ {0x94B1, 0x6571}, //3723 #CJK UNIFIED IDEOGRAPH
+ {0x94B2, 0x6573}, //3724 #CJK UNIFIED IDEOGRAPH
+ {0x94B3, 0x6575}, //3725 #CJK UNIFIED IDEOGRAPH
+ {0x94B4, 0x6576}, //3726 #CJK UNIFIED IDEOGRAPH
+ {0x94B5, 0x6578}, //3727 #CJK UNIFIED IDEOGRAPH
+ {0x94B6, 0x6579}, //3728 #CJK UNIFIED IDEOGRAPH
+ {0x94B7, 0x657A}, //3729 #CJK UNIFIED IDEOGRAPH
+ {0x94B8, 0x657B}, //3730 #CJK UNIFIED IDEOGRAPH
+ {0x94B9, 0x657C}, //3731 #CJK UNIFIED IDEOGRAPH
+ {0x94BA, 0x657D}, //3732 #CJK UNIFIED IDEOGRAPH
+ {0x94BB, 0x657E}, //3733 #CJK UNIFIED IDEOGRAPH
+ {0x94BC, 0x657F}, //3734 #CJK UNIFIED IDEOGRAPH
+ {0x94BD, 0x6580}, //3735 #CJK UNIFIED IDEOGRAPH
+ {0x94BE, 0x6581}, //3736 #CJK UNIFIED IDEOGRAPH
+ {0x94BF, 0x6582}, //3737 #CJK UNIFIED IDEOGRAPH
+ {0x94C0, 0x6583}, //3738 #CJK UNIFIED IDEOGRAPH
+ {0x94C1, 0x6584}, //3739 #CJK UNIFIED IDEOGRAPH
+ {0x94C2, 0x6585}, //3740 #CJK UNIFIED IDEOGRAPH
+ {0x94C3, 0x6586}, //3741 #CJK UNIFIED IDEOGRAPH
+ {0x94C4, 0x6588}, //3742 #CJK UNIFIED IDEOGRAPH
+ {0x94C5, 0x6589}, //3743 #CJK UNIFIED IDEOGRAPH
+ {0x94C6, 0x658A}, //3744 #CJK UNIFIED IDEOGRAPH
+ {0x94C7, 0x658D}, //3745 #CJK UNIFIED IDEOGRAPH
+ {0x94C8, 0x658E}, //3746 #CJK UNIFIED IDEOGRAPH
+ {0x94C9, 0x658F}, //3747 #CJK UNIFIED IDEOGRAPH
+ {0x94CA, 0x6592}, //3748 #CJK UNIFIED IDEOGRAPH
+ {0x94CB, 0x6594}, //3749 #CJK UNIFIED IDEOGRAPH
+ {0x94CC, 0x6595}, //3750 #CJK UNIFIED IDEOGRAPH
+ {0x94CD, 0x6596}, //3751 #CJK UNIFIED IDEOGRAPH
+ {0x94CE, 0x6598}, //3752 #CJK UNIFIED IDEOGRAPH
+ {0x94CF, 0x659A}, //3753 #CJK UNIFIED IDEOGRAPH
+ {0x94D0, 0x659D}, //3754 #CJK UNIFIED IDEOGRAPH
+ {0x94D1, 0x659E}, //3755 #CJK UNIFIED IDEOGRAPH
+ {0x94D2, 0x65A0}, //3756 #CJK UNIFIED IDEOGRAPH
+ {0x94D3, 0x65A2}, //3757 #CJK UNIFIED IDEOGRAPH
+ {0x94D4, 0x65A3}, //3758 #CJK UNIFIED IDEOGRAPH
+ {0x94D5, 0x65A6}, //3759 #CJK UNIFIED IDEOGRAPH
+ {0x94D6, 0x65A8}, //3760 #CJK UNIFIED IDEOGRAPH
+ {0x94D7, 0x65AA}, //3761 #CJK UNIFIED IDEOGRAPH
+ {0x94D8, 0x65AC}, //3762 #CJK UNIFIED IDEOGRAPH
+ {0x94D9, 0x65AE}, //3763 #CJK UNIFIED IDEOGRAPH
+ {0x94DA, 0x65B1}, //3764 #CJK UNIFIED IDEOGRAPH
+ {0x94DB, 0x65B2}, //3765 #CJK UNIFIED IDEOGRAPH
+ {0x94DC, 0x65B3}, //3766 #CJK UNIFIED IDEOGRAPH
+ {0x94DD, 0x65B4}, //3767 #CJK UNIFIED IDEOGRAPH
+ {0x94DE, 0x65B5}, //3768 #CJK UNIFIED IDEOGRAPH
+ {0x94DF, 0x65B6}, //3769 #CJK UNIFIED IDEOGRAPH
+ {0x94E0, 0x65B7}, //3770 #CJK UNIFIED IDEOGRAPH
+ {0x94E1, 0x65B8}, //3771 #CJK UNIFIED IDEOGRAPH
+ {0x94E2, 0x65BA}, //3772 #CJK UNIFIED IDEOGRAPH
+ {0x94E3, 0x65BB}, //3773 #CJK UNIFIED IDEOGRAPH
+ {0x94E4, 0x65BE}, //3774 #CJK UNIFIED IDEOGRAPH
+ {0x94E5, 0x65BF}, //3775 #CJK UNIFIED IDEOGRAPH
+ {0x94E6, 0x65C0}, //3776 #CJK UNIFIED IDEOGRAPH
+ {0x94E7, 0x65C2}, //3777 #CJK UNIFIED IDEOGRAPH
+ {0x94E8, 0x65C7}, //3778 #CJK UNIFIED IDEOGRAPH
+ {0x94E9, 0x65C8}, //3779 #CJK UNIFIED IDEOGRAPH
+ {0x94EA, 0x65C9}, //3780 #CJK UNIFIED IDEOGRAPH
+ {0x94EB, 0x65CA}, //3781 #CJK UNIFIED IDEOGRAPH
+ {0x94EC, 0x65CD}, //3782 #CJK UNIFIED IDEOGRAPH
+ {0x94ED, 0x65D0}, //3783 #CJK UNIFIED IDEOGRAPH
+ {0x94EE, 0x65D1}, //3784 #CJK UNIFIED IDEOGRAPH
+ {0x94EF, 0x65D3}, //3785 #CJK UNIFIED IDEOGRAPH
+ {0x94F0, 0x65D4}, //3786 #CJK UNIFIED IDEOGRAPH
+ {0x94F1, 0x65D5}, //3787 #CJK UNIFIED IDEOGRAPH
+ {0x94F2, 0x65D8}, //3788 #CJK UNIFIED IDEOGRAPH
+ {0x94F3, 0x65D9}, //3789 #CJK UNIFIED IDEOGRAPH
+ {0x94F4, 0x65DA}, //3790 #CJK UNIFIED IDEOGRAPH
+ {0x94F5, 0x65DB}, //3791 #CJK UNIFIED IDEOGRAPH
+ {0x94F6, 0x65DC}, //3792 #CJK UNIFIED IDEOGRAPH
+ {0x94F7, 0x65DD}, //3793 #CJK UNIFIED IDEOGRAPH
+ {0x94F8, 0x65DE}, //3794 #CJK UNIFIED IDEOGRAPH
+ {0x94F9, 0x65DF}, //3795 #CJK UNIFIED IDEOGRAPH
+ {0x94FA, 0x65E1}, //3796 #CJK UNIFIED IDEOGRAPH
+ {0x94FB, 0x65E3}, //3797 #CJK UNIFIED IDEOGRAPH
+ {0x94FC, 0x65E4}, //3798 #CJK UNIFIED IDEOGRAPH
+ {0x94FD, 0x65EA}, //3799 #CJK UNIFIED IDEOGRAPH
+ {0x94FE, 0x65EB}, //3800 #CJK UNIFIED IDEOGRAPH
+ {0x9540, 0x65F2}, //3801 #CJK UNIFIED IDEOGRAPH
+ {0x9541, 0x65F3}, //3802 #CJK UNIFIED IDEOGRAPH
+ {0x9542, 0x65F4}, //3803 #CJK UNIFIED IDEOGRAPH
+ {0x9543, 0x65F5}, //3804 #CJK UNIFIED IDEOGRAPH
+ {0x9544, 0x65F8}, //3805 #CJK UNIFIED IDEOGRAPH
+ {0x9545, 0x65F9}, //3806 #CJK UNIFIED IDEOGRAPH
+ {0x9546, 0x65FB}, //3807 #CJK UNIFIED IDEOGRAPH
+ {0x9547, 0x65FC}, //3808 #CJK UNIFIED IDEOGRAPH
+ {0x9548, 0x65FD}, //3809 #CJK UNIFIED IDEOGRAPH
+ {0x9549, 0x65FE}, //3810 #CJK UNIFIED IDEOGRAPH
+ {0x954A, 0x65FF}, //3811 #CJK UNIFIED IDEOGRAPH
+ {0x954B, 0x6601}, //3812 #CJK UNIFIED IDEOGRAPH
+ {0x954C, 0x6604}, //3813 #CJK UNIFIED IDEOGRAPH
+ {0x954D, 0x6605}, //3814 #CJK UNIFIED IDEOGRAPH
+ {0x954E, 0x6607}, //3815 #CJK UNIFIED IDEOGRAPH
+ {0x954F, 0x6608}, //3816 #CJK UNIFIED IDEOGRAPH
+ {0x9550, 0x6609}, //3817 #CJK UNIFIED IDEOGRAPH
+ {0x9551, 0x660B}, //3818 #CJK UNIFIED IDEOGRAPH
+ {0x9552, 0x660D}, //3819 #CJK UNIFIED IDEOGRAPH
+ {0x9553, 0x6610}, //3820 #CJK UNIFIED IDEOGRAPH
+ {0x9554, 0x6611}, //3821 #CJK UNIFIED IDEOGRAPH
+ {0x9555, 0x6612}, //3822 #CJK UNIFIED IDEOGRAPH
+ {0x9556, 0x6616}, //3823 #CJK UNIFIED IDEOGRAPH
+ {0x9557, 0x6617}, //3824 #CJK UNIFIED IDEOGRAPH
+ {0x9558, 0x6618}, //3825 #CJK UNIFIED IDEOGRAPH
+ {0x9559, 0x661A}, //3826 #CJK UNIFIED IDEOGRAPH
+ {0x955A, 0x661B}, //3827 #CJK UNIFIED IDEOGRAPH
+ {0x955B, 0x661C}, //3828 #CJK UNIFIED IDEOGRAPH
+ {0x955C, 0x661E}, //3829 #CJK UNIFIED IDEOGRAPH
+ {0x955D, 0x6621}, //3830 #CJK UNIFIED IDEOGRAPH
+ {0x955E, 0x6622}, //3831 #CJK UNIFIED IDEOGRAPH
+ {0x955F, 0x6623}, //3832 #CJK UNIFIED IDEOGRAPH
+ {0x9560, 0x6624}, //3833 #CJK UNIFIED IDEOGRAPH
+ {0x9561, 0x6626}, //3834 #CJK UNIFIED IDEOGRAPH
+ {0x9562, 0x6629}, //3835 #CJK UNIFIED IDEOGRAPH
+ {0x9563, 0x662A}, //3836 #CJK UNIFIED IDEOGRAPH
+ {0x9564, 0x662B}, //3837 #CJK UNIFIED IDEOGRAPH
+ {0x9565, 0x662C}, //3838 #CJK UNIFIED IDEOGRAPH
+ {0x9566, 0x662E}, //3839 #CJK UNIFIED IDEOGRAPH
+ {0x9567, 0x6630}, //3840 #CJK UNIFIED IDEOGRAPH
+ {0x9568, 0x6632}, //3841 #CJK UNIFIED IDEOGRAPH
+ {0x9569, 0x6633}, //3842 #CJK UNIFIED IDEOGRAPH
+ {0x956A, 0x6637}, //3843 #CJK UNIFIED IDEOGRAPH
+ {0x956B, 0x6638}, //3844 #CJK UNIFIED IDEOGRAPH
+ {0x956C, 0x6639}, //3845 #CJK UNIFIED IDEOGRAPH
+ {0x956D, 0x663A}, //3846 #CJK UNIFIED IDEOGRAPH
+ {0x956E, 0x663B}, //3847 #CJK UNIFIED IDEOGRAPH
+ {0x956F, 0x663D}, //3848 #CJK UNIFIED IDEOGRAPH
+ {0x9570, 0x663F}, //3849 #CJK UNIFIED IDEOGRAPH
+ {0x9571, 0x6640}, //3850 #CJK UNIFIED IDEOGRAPH
+ {0x9572, 0x6642}, //3851 #CJK UNIFIED IDEOGRAPH
+ {0x9573, 0x6644}, //3852 #CJK UNIFIED IDEOGRAPH
+ {0x9574, 0x6645}, //3853 #CJK UNIFIED IDEOGRAPH
+ {0x9575, 0x6646}, //3854 #CJK UNIFIED IDEOGRAPH
+ {0x9576, 0x6647}, //3855 #CJK UNIFIED IDEOGRAPH
+ {0x9577, 0x6648}, //3856 #CJK UNIFIED IDEOGRAPH
+ {0x9578, 0x6649}, //3857 #CJK UNIFIED IDEOGRAPH
+ {0x9579, 0x664A}, //3858 #CJK UNIFIED IDEOGRAPH
+ {0x957A, 0x664D}, //3859 #CJK UNIFIED IDEOGRAPH
+ {0x957B, 0x664E}, //3860 #CJK UNIFIED IDEOGRAPH
+ {0x957C, 0x6650}, //3861 #CJK UNIFIED IDEOGRAPH
+ {0x957D, 0x6651}, //3862 #CJK UNIFIED IDEOGRAPH
+ {0x957E, 0x6658}, //3863 #CJK UNIFIED IDEOGRAPH
+ {0x9580, 0x6659}, //3864 #CJK UNIFIED IDEOGRAPH
+ {0x9581, 0x665B}, //3865 #CJK UNIFIED IDEOGRAPH
+ {0x9582, 0x665C}, //3866 #CJK UNIFIED IDEOGRAPH
+ {0x9583, 0x665D}, //3867 #CJK UNIFIED IDEOGRAPH
+ {0x9584, 0x665E}, //3868 #CJK UNIFIED IDEOGRAPH
+ {0x9585, 0x6660}, //3869 #CJK UNIFIED IDEOGRAPH
+ {0x9586, 0x6662}, //3870 #CJK UNIFIED IDEOGRAPH
+ {0x9587, 0x6663}, //3871 #CJK UNIFIED IDEOGRAPH
+ {0x9588, 0x6665}, //3872 #CJK UNIFIED IDEOGRAPH
+ {0x9589, 0x6667}, //3873 #CJK UNIFIED IDEOGRAPH
+ {0x958A, 0x6669}, //3874 #CJK UNIFIED IDEOGRAPH
+ {0x958B, 0x666A}, //3875 #CJK UNIFIED IDEOGRAPH
+ {0x958C, 0x666B}, //3876 #CJK UNIFIED IDEOGRAPH
+ {0x958D, 0x666C}, //3877 #CJK UNIFIED IDEOGRAPH
+ {0x958E, 0x666D}, //3878 #CJK UNIFIED IDEOGRAPH
+ {0x958F, 0x6671}, //3879 #CJK UNIFIED IDEOGRAPH
+ {0x9590, 0x6672}, //3880 #CJK UNIFIED IDEOGRAPH
+ {0x9591, 0x6673}, //3881 #CJK UNIFIED IDEOGRAPH
+ {0x9592, 0x6675}, //3882 #CJK UNIFIED IDEOGRAPH
+ {0x9593, 0x6678}, //3883 #CJK UNIFIED IDEOGRAPH
+ {0x9594, 0x6679}, //3884 #CJK UNIFIED IDEOGRAPH
+ {0x9595, 0x667B}, //3885 #CJK UNIFIED IDEOGRAPH
+ {0x9596, 0x667C}, //3886 #CJK UNIFIED IDEOGRAPH
+ {0x9597, 0x667D}, //3887 #CJK UNIFIED IDEOGRAPH
+ {0x9598, 0x667F}, //3888 #CJK UNIFIED IDEOGRAPH
+ {0x9599, 0x6680}, //3889 #CJK UNIFIED IDEOGRAPH
+ {0x959A, 0x6681}, //3890 #CJK UNIFIED IDEOGRAPH
+ {0x959B, 0x6683}, //3891 #CJK UNIFIED IDEOGRAPH
+ {0x959C, 0x6685}, //3892 #CJK UNIFIED IDEOGRAPH
+ {0x959D, 0x6686}, //3893 #CJK UNIFIED IDEOGRAPH
+ {0x959E, 0x6688}, //3894 #CJK UNIFIED IDEOGRAPH
+ {0x959F, 0x6689}, //3895 #CJK UNIFIED IDEOGRAPH
+ {0x95A0, 0x668A}, //3896 #CJK UNIFIED IDEOGRAPH
+ {0x95A1, 0x668B}, //3897 #CJK UNIFIED IDEOGRAPH
+ {0x95A2, 0x668D}, //3898 #CJK UNIFIED IDEOGRAPH
+ {0x95A3, 0x668E}, //3899 #CJK UNIFIED IDEOGRAPH
+ {0x95A4, 0x668F}, //3900 #CJK UNIFIED IDEOGRAPH
+ {0x95A5, 0x6690}, //3901 #CJK UNIFIED IDEOGRAPH
+ {0x95A6, 0x6692}, //3902 #CJK UNIFIED IDEOGRAPH
+ {0x95A7, 0x6693}, //3903 #CJK UNIFIED IDEOGRAPH
+ {0x95A8, 0x6694}, //3904 #CJK UNIFIED IDEOGRAPH
+ {0x95A9, 0x6695}, //3905 #CJK UNIFIED IDEOGRAPH
+ {0x95AA, 0x6698}, //3906 #CJK UNIFIED IDEOGRAPH
+ {0x95AB, 0x6699}, //3907 #CJK UNIFIED IDEOGRAPH
+ {0x95AC, 0x669A}, //3908 #CJK UNIFIED IDEOGRAPH
+ {0x95AD, 0x669B}, //3909 #CJK UNIFIED IDEOGRAPH
+ {0x95AE, 0x669C}, //3910 #CJK UNIFIED IDEOGRAPH
+ {0x95AF, 0x669E}, //3911 #CJK UNIFIED IDEOGRAPH
+ {0x95B0, 0x669F}, //3912 #CJK UNIFIED IDEOGRAPH
+ {0x95B1, 0x66A0}, //3913 #CJK UNIFIED IDEOGRAPH
+ {0x95B2, 0x66A1}, //3914 #CJK UNIFIED IDEOGRAPH
+ {0x95B3, 0x66A2}, //3915 #CJK UNIFIED IDEOGRAPH
+ {0x95B4, 0x66A3}, //3916 #CJK UNIFIED IDEOGRAPH
+ {0x95B5, 0x66A4}, //3917 #CJK UNIFIED IDEOGRAPH
+ {0x95B6, 0x66A5}, //3918 #CJK UNIFIED IDEOGRAPH
+ {0x95B7, 0x66A6}, //3919 #CJK UNIFIED IDEOGRAPH
+ {0x95B8, 0x66A9}, //3920 #CJK UNIFIED IDEOGRAPH
+ {0x95B9, 0x66AA}, //3921 #CJK UNIFIED IDEOGRAPH
+ {0x95BA, 0x66AB}, //3922 #CJK UNIFIED IDEOGRAPH
+ {0x95BB, 0x66AC}, //3923 #CJK UNIFIED IDEOGRAPH
+ {0x95BC, 0x66AD}, //3924 #CJK UNIFIED IDEOGRAPH
+ {0x95BD, 0x66AF}, //3925 #CJK UNIFIED IDEOGRAPH
+ {0x95BE, 0x66B0}, //3926 #CJK UNIFIED IDEOGRAPH
+ {0x95BF, 0x66B1}, //3927 #CJK UNIFIED IDEOGRAPH
+ {0x95C0, 0x66B2}, //3928 #CJK UNIFIED IDEOGRAPH
+ {0x95C1, 0x66B3}, //3929 #CJK UNIFIED IDEOGRAPH
+ {0x95C2, 0x66B5}, //3930 #CJK UNIFIED IDEOGRAPH
+ {0x95C3, 0x66B6}, //3931 #CJK UNIFIED IDEOGRAPH
+ {0x95C4, 0x66B7}, //3932 #CJK UNIFIED IDEOGRAPH
+ {0x95C5, 0x66B8}, //3933 #CJK UNIFIED IDEOGRAPH
+ {0x95C6, 0x66BA}, //3934 #CJK UNIFIED IDEOGRAPH
+ {0x95C7, 0x66BB}, //3935 #CJK UNIFIED IDEOGRAPH
+ {0x95C8, 0x66BC}, //3936 #CJK UNIFIED IDEOGRAPH
+ {0x95C9, 0x66BD}, //3937 #CJK UNIFIED IDEOGRAPH
+ {0x95CA, 0x66BF}, //3938 #CJK UNIFIED IDEOGRAPH
+ {0x95CB, 0x66C0}, //3939 #CJK UNIFIED IDEOGRAPH
+ {0x95CC, 0x66C1}, //3940 #CJK UNIFIED IDEOGRAPH
+ {0x95CD, 0x66C2}, //3941 #CJK UNIFIED IDEOGRAPH
+ {0x95CE, 0x66C3}, //3942 #CJK UNIFIED IDEOGRAPH
+ {0x95CF, 0x66C4}, //3943 #CJK UNIFIED IDEOGRAPH
+ {0x95D0, 0x66C5}, //3944 #CJK UNIFIED IDEOGRAPH
+ {0x95D1, 0x66C6}, //3945 #CJK UNIFIED IDEOGRAPH
+ {0x95D2, 0x66C7}, //3946 #CJK UNIFIED IDEOGRAPH
+ {0x95D3, 0x66C8}, //3947 #CJK UNIFIED IDEOGRAPH
+ {0x95D4, 0x66C9}, //3948 #CJK UNIFIED IDEOGRAPH
+ {0x95D5, 0x66CA}, //3949 #CJK UNIFIED IDEOGRAPH
+ {0x95D6, 0x66CB}, //3950 #CJK UNIFIED IDEOGRAPH
+ {0x95D7, 0x66CC}, //3951 #CJK UNIFIED IDEOGRAPH
+ {0x95D8, 0x66CD}, //3952 #CJK UNIFIED IDEOGRAPH
+ {0x95D9, 0x66CE}, //3953 #CJK UNIFIED IDEOGRAPH
+ {0x95DA, 0x66CF}, //3954 #CJK UNIFIED IDEOGRAPH
+ {0x95DB, 0x66D0}, //3955 #CJK UNIFIED IDEOGRAPH
+ {0x95DC, 0x66D1}, //3956 #CJK UNIFIED IDEOGRAPH
+ {0x95DD, 0x66D2}, //3957 #CJK UNIFIED IDEOGRAPH
+ {0x95DE, 0x66D3}, //3958 #CJK UNIFIED IDEOGRAPH
+ {0x95DF, 0x66D4}, //3959 #CJK UNIFIED IDEOGRAPH
+ {0x95E0, 0x66D5}, //3960 #CJK UNIFIED IDEOGRAPH
+ {0x95E1, 0x66D6}, //3961 #CJK UNIFIED IDEOGRAPH
+ {0x95E2, 0x66D7}, //3962 #CJK UNIFIED IDEOGRAPH
+ {0x95E3, 0x66D8}, //3963 #CJK UNIFIED IDEOGRAPH
+ {0x95E4, 0x66DA}, //3964 #CJK UNIFIED IDEOGRAPH
+ {0x95E5, 0x66DE}, //3965 #CJK UNIFIED IDEOGRAPH
+ {0x95E6, 0x66DF}, //3966 #CJK UNIFIED IDEOGRAPH
+ {0x95E7, 0x66E0}, //3967 #CJK UNIFIED IDEOGRAPH
+ {0x95E8, 0x66E1}, //3968 #CJK UNIFIED IDEOGRAPH
+ {0x95E9, 0x66E2}, //3969 #CJK UNIFIED IDEOGRAPH
+ {0x95EA, 0x66E3}, //3970 #CJK UNIFIED IDEOGRAPH
+ {0x95EB, 0x66E4}, //3971 #CJK UNIFIED IDEOGRAPH
+ {0x95EC, 0x66E5}, //3972 #CJK UNIFIED IDEOGRAPH
+ {0x95ED, 0x66E7}, //3973 #CJK UNIFIED IDEOGRAPH
+ {0x95EE, 0x66E8}, //3974 #CJK UNIFIED IDEOGRAPH
+ {0x95EF, 0x66EA}, //3975 #CJK UNIFIED IDEOGRAPH
+ {0x95F0, 0x66EB}, //3976 #CJK UNIFIED IDEOGRAPH
+ {0x95F1, 0x66EC}, //3977 #CJK UNIFIED IDEOGRAPH
+ {0x95F2, 0x66ED}, //3978 #CJK UNIFIED IDEOGRAPH
+ {0x95F3, 0x66EE}, //3979 #CJK UNIFIED IDEOGRAPH
+ {0x95F4, 0x66EF}, //3980 #CJK UNIFIED IDEOGRAPH
+ {0x95F5, 0x66F1}, //3981 #CJK UNIFIED IDEOGRAPH
+ {0x95F6, 0x66F5}, //3982 #CJK UNIFIED IDEOGRAPH
+ {0x95F7, 0x66F6}, //3983 #CJK UNIFIED IDEOGRAPH
+ {0x95F8, 0x66F8}, //3984 #CJK UNIFIED IDEOGRAPH
+ {0x95F9, 0x66FA}, //3985 #CJK UNIFIED IDEOGRAPH
+ {0x95FA, 0x66FB}, //3986 #CJK UNIFIED IDEOGRAPH
+ {0x95FB, 0x66FD}, //3987 #CJK UNIFIED IDEOGRAPH
+ {0x95FC, 0x6701}, //3988 #CJK UNIFIED IDEOGRAPH
+ {0x95FD, 0x6702}, //3989 #CJK UNIFIED IDEOGRAPH
+ {0x95FE, 0x6703}, //3990 #CJK UNIFIED IDEOGRAPH
+ {0x9640, 0x6704}, //3991 #CJK UNIFIED IDEOGRAPH
+ {0x9641, 0x6705}, //3992 #CJK UNIFIED IDEOGRAPH
+ {0x9642, 0x6706}, //3993 #CJK UNIFIED IDEOGRAPH
+ {0x9643, 0x6707}, //3994 #CJK UNIFIED IDEOGRAPH
+ {0x9644, 0x670C}, //3995 #CJK UNIFIED IDEOGRAPH
+ {0x9645, 0x670E}, //3996 #CJK UNIFIED IDEOGRAPH
+ {0x9646, 0x670F}, //3997 #CJK UNIFIED IDEOGRAPH
+ {0x9647, 0x6711}, //3998 #CJK UNIFIED IDEOGRAPH
+ {0x9648, 0x6712}, //3999 #CJK UNIFIED IDEOGRAPH
+ {0x9649, 0x6713}, //4000 #CJK UNIFIED IDEOGRAPH
+ {0x964A, 0x6716}, //4001 #CJK UNIFIED IDEOGRAPH
+ {0x964B, 0x6718}, //4002 #CJK UNIFIED IDEOGRAPH
+ {0x964C, 0x6719}, //4003 #CJK UNIFIED IDEOGRAPH
+ {0x964D, 0x671A}, //4004 #CJK UNIFIED IDEOGRAPH
+ {0x964E, 0x671C}, //4005 #CJK UNIFIED IDEOGRAPH
+ {0x964F, 0x671E}, //4006 #CJK UNIFIED IDEOGRAPH
+ {0x9650, 0x6720}, //4007 #CJK UNIFIED IDEOGRAPH
+ {0x9651, 0x6721}, //4008 #CJK UNIFIED IDEOGRAPH
+ {0x9652, 0x6722}, //4009 #CJK UNIFIED IDEOGRAPH
+ {0x9653, 0x6723}, //4010 #CJK UNIFIED IDEOGRAPH
+ {0x9654, 0x6724}, //4011 #CJK UNIFIED IDEOGRAPH
+ {0x9655, 0x6725}, //4012 #CJK UNIFIED IDEOGRAPH
+ {0x9656, 0x6727}, //4013 #CJK UNIFIED IDEOGRAPH
+ {0x9657, 0x6729}, //4014 #CJK UNIFIED IDEOGRAPH
+ {0x9658, 0x672E}, //4015 #CJK UNIFIED IDEOGRAPH
+ {0x9659, 0x6730}, //4016 #CJK UNIFIED IDEOGRAPH
+ {0x965A, 0x6732}, //4017 #CJK UNIFIED IDEOGRAPH
+ {0x965B, 0x6733}, //4018 #CJK UNIFIED IDEOGRAPH
+ {0x965C, 0x6736}, //4019 #CJK UNIFIED IDEOGRAPH
+ {0x965D, 0x6737}, //4020 #CJK UNIFIED IDEOGRAPH
+ {0x965E, 0x6738}, //4021 #CJK UNIFIED IDEOGRAPH
+ {0x965F, 0x6739}, //4022 #CJK UNIFIED IDEOGRAPH
+ {0x9660, 0x673B}, //4023 #CJK UNIFIED IDEOGRAPH
+ {0x9661, 0x673C}, //4024 #CJK UNIFIED IDEOGRAPH
+ {0x9662, 0x673E}, //4025 #CJK UNIFIED IDEOGRAPH
+ {0x9663, 0x673F}, //4026 #CJK UNIFIED IDEOGRAPH
+ {0x9664, 0x6741}, //4027 #CJK UNIFIED IDEOGRAPH
+ {0x9665, 0x6744}, //4028 #CJK UNIFIED IDEOGRAPH
+ {0x9666, 0x6745}, //4029 #CJK UNIFIED IDEOGRAPH
+ {0x9667, 0x6747}, //4030 #CJK UNIFIED IDEOGRAPH
+ {0x9668, 0x674A}, //4031 #CJK UNIFIED IDEOGRAPH
+ {0x9669, 0x674B}, //4032 #CJK UNIFIED IDEOGRAPH
+ {0x966A, 0x674D}, //4033 #CJK UNIFIED IDEOGRAPH
+ {0x966B, 0x6752}, //4034 #CJK UNIFIED IDEOGRAPH
+ {0x966C, 0x6754}, //4035 #CJK UNIFIED IDEOGRAPH
+ {0x966D, 0x6755}, //4036 #CJK UNIFIED IDEOGRAPH
+ {0x966E, 0x6757}, //4037 #CJK UNIFIED IDEOGRAPH
+ {0x966F, 0x6758}, //4038 #CJK UNIFIED IDEOGRAPH
+ {0x9670, 0x6759}, //4039 #CJK UNIFIED IDEOGRAPH
+ {0x9671, 0x675A}, //4040 #CJK UNIFIED IDEOGRAPH
+ {0x9672, 0x675B}, //4041 #CJK UNIFIED IDEOGRAPH
+ {0x9673, 0x675D}, //4042 #CJK UNIFIED IDEOGRAPH
+ {0x9674, 0x6762}, //4043 #CJK UNIFIED IDEOGRAPH
+ {0x9675, 0x6763}, //4044 #CJK UNIFIED IDEOGRAPH
+ {0x9676, 0x6764}, //4045 #CJK UNIFIED IDEOGRAPH
+ {0x9677, 0x6766}, //4046 #CJK UNIFIED IDEOGRAPH
+ {0x9678, 0x6767}, //4047 #CJK UNIFIED IDEOGRAPH
+ {0x9679, 0x676B}, //4048 #CJK UNIFIED IDEOGRAPH
+ {0x967A, 0x676C}, //4049 #CJK UNIFIED IDEOGRAPH
+ {0x967B, 0x676E}, //4050 #CJK UNIFIED IDEOGRAPH
+ {0x967C, 0x6771}, //4051 #CJK UNIFIED IDEOGRAPH
+ {0x967D, 0x6774}, //4052 #CJK UNIFIED IDEOGRAPH
+ {0x967E, 0x6776}, //4053 #CJK UNIFIED IDEOGRAPH
+ {0x9680, 0x6778}, //4054 #CJK UNIFIED IDEOGRAPH
+ {0x9681, 0x6779}, //4055 #CJK UNIFIED IDEOGRAPH
+ {0x9682, 0x677A}, //4056 #CJK UNIFIED IDEOGRAPH
+ {0x9683, 0x677B}, //4057 #CJK UNIFIED IDEOGRAPH
+ {0x9684, 0x677D}, //4058 #CJK UNIFIED IDEOGRAPH
+ {0x9685, 0x6780}, //4059 #CJK UNIFIED IDEOGRAPH
+ {0x9686, 0x6782}, //4060 #CJK UNIFIED IDEOGRAPH
+ {0x9687, 0x6783}, //4061 #CJK UNIFIED IDEOGRAPH
+ {0x9688, 0x6785}, //4062 #CJK UNIFIED IDEOGRAPH
+ {0x9689, 0x6786}, //4063 #CJK UNIFIED IDEOGRAPH
+ {0x968A, 0x6788}, //4064 #CJK UNIFIED IDEOGRAPH
+ {0x968B, 0x678A}, //4065 #CJK UNIFIED IDEOGRAPH
+ {0x968C, 0x678C}, //4066 #CJK UNIFIED IDEOGRAPH
+ {0x968D, 0x678D}, //4067 #CJK UNIFIED IDEOGRAPH
+ {0x968E, 0x678E}, //4068 #CJK UNIFIED IDEOGRAPH
+ {0x968F, 0x678F}, //4069 #CJK UNIFIED IDEOGRAPH
+ {0x9690, 0x6791}, //4070 #CJK UNIFIED IDEOGRAPH
+ {0x9691, 0x6792}, //4071 #CJK UNIFIED IDEOGRAPH
+ {0x9692, 0x6793}, //4072 #CJK UNIFIED IDEOGRAPH
+ {0x9693, 0x6794}, //4073 #CJK UNIFIED IDEOGRAPH
+ {0x9694, 0x6796}, //4074 #CJK UNIFIED IDEOGRAPH
+ {0x9695, 0x6799}, //4075 #CJK UNIFIED IDEOGRAPH
+ {0x9696, 0x679B}, //4076 #CJK UNIFIED IDEOGRAPH
+ {0x9697, 0x679F}, //4077 #CJK UNIFIED IDEOGRAPH
+ {0x9698, 0x67A0}, //4078 #CJK UNIFIED IDEOGRAPH
+ {0x9699, 0x67A1}, //4079 #CJK UNIFIED IDEOGRAPH
+ {0x969A, 0x67A4}, //4080 #CJK UNIFIED IDEOGRAPH
+ {0x969B, 0x67A6}, //4081 #CJK UNIFIED IDEOGRAPH
+ {0x969C, 0x67A9}, //4082 #CJK UNIFIED IDEOGRAPH
+ {0x969D, 0x67AC}, //4083 #CJK UNIFIED IDEOGRAPH
+ {0x969E, 0x67AE}, //4084 #CJK UNIFIED IDEOGRAPH
+ {0x969F, 0x67B1}, //4085 #CJK UNIFIED IDEOGRAPH
+ {0x96A0, 0x67B2}, //4086 #CJK UNIFIED IDEOGRAPH
+ {0x96A1, 0x67B4}, //4087 #CJK UNIFIED IDEOGRAPH
+ {0x96A2, 0x67B9}, //4088 #CJK UNIFIED IDEOGRAPH
+ {0x96A3, 0x67BA}, //4089 #CJK UNIFIED IDEOGRAPH
+ {0x96A4, 0x67BB}, //4090 #CJK UNIFIED IDEOGRAPH
+ {0x96A5, 0x67BC}, //4091 #CJK UNIFIED IDEOGRAPH
+ {0x96A6, 0x67BD}, //4092 #CJK UNIFIED IDEOGRAPH
+ {0x96A7, 0x67BE}, //4093 #CJK UNIFIED IDEOGRAPH
+ {0x96A8, 0x67BF}, //4094 #CJK UNIFIED IDEOGRAPH
+ {0x96A9, 0x67C0}, //4095 #CJK UNIFIED IDEOGRAPH
+ {0x96AA, 0x67C2}, //4096 #CJK UNIFIED IDEOGRAPH
+ {0x96AB, 0x67C5}, //4097 #CJK UNIFIED IDEOGRAPH
+ {0x96AC, 0x67C6}, //4098 #CJK UNIFIED IDEOGRAPH
+ {0x96AD, 0x67C7}, //4099 #CJK UNIFIED IDEOGRAPH
+ {0x96AE, 0x67C8}, //4100 #CJK UNIFIED IDEOGRAPH
+ {0x96AF, 0x67C9}, //4101 #CJK UNIFIED IDEOGRAPH
+ {0x96B0, 0x67CA}, //4102 #CJK UNIFIED IDEOGRAPH
+ {0x96B1, 0x67CB}, //4103 #CJK UNIFIED IDEOGRAPH
+ {0x96B2, 0x67CC}, //4104 #CJK UNIFIED IDEOGRAPH
+ {0x96B3, 0x67CD}, //4105 #CJK UNIFIED IDEOGRAPH
+ {0x96B4, 0x67CE}, //4106 #CJK UNIFIED IDEOGRAPH
+ {0x96B5, 0x67D5}, //4107 #CJK UNIFIED IDEOGRAPH
+ {0x96B6, 0x67D6}, //4108 #CJK UNIFIED IDEOGRAPH
+ {0x96B7, 0x67D7}, //4109 #CJK UNIFIED IDEOGRAPH
+ {0x96B8, 0x67DB}, //4110 #CJK UNIFIED IDEOGRAPH
+ {0x96B9, 0x67DF}, //4111 #CJK UNIFIED IDEOGRAPH
+ {0x96BA, 0x67E1}, //4112 #CJK UNIFIED IDEOGRAPH
+ {0x96BB, 0x67E3}, //4113 #CJK UNIFIED IDEOGRAPH
+ {0x96BC, 0x67E4}, //4114 #CJK UNIFIED IDEOGRAPH
+ {0x96BD, 0x67E6}, //4115 #CJK UNIFIED IDEOGRAPH
+ {0x96BE, 0x67E7}, //4116 #CJK UNIFIED IDEOGRAPH
+ {0x96BF, 0x67E8}, //4117 #CJK UNIFIED IDEOGRAPH
+ {0x96C0, 0x67EA}, //4118 #CJK UNIFIED IDEOGRAPH
+ {0x96C1, 0x67EB}, //4119 #CJK UNIFIED IDEOGRAPH
+ {0x96C2, 0x67ED}, //4120 #CJK UNIFIED IDEOGRAPH
+ {0x96C3, 0x67EE}, //4121 #CJK UNIFIED IDEOGRAPH
+ {0x96C4, 0x67F2}, //4122 #CJK UNIFIED IDEOGRAPH
+ {0x96C5, 0x67F5}, //4123 #CJK UNIFIED IDEOGRAPH
+ {0x96C6, 0x67F6}, //4124 #CJK UNIFIED IDEOGRAPH
+ {0x96C7, 0x67F7}, //4125 #CJK UNIFIED IDEOGRAPH
+ {0x96C8, 0x67F8}, //4126 #CJK UNIFIED IDEOGRAPH
+ {0x96C9, 0x67F9}, //4127 #CJK UNIFIED IDEOGRAPH
+ {0x96CA, 0x67FA}, //4128 #CJK UNIFIED IDEOGRAPH
+ {0x96CB, 0x67FB}, //4129 #CJK UNIFIED IDEOGRAPH
+ {0x96CC, 0x67FC}, //4130 #CJK UNIFIED IDEOGRAPH
+ {0x96CD, 0x67FE}, //4131 #CJK UNIFIED IDEOGRAPH
+ {0x96CE, 0x6801}, //4132 #CJK UNIFIED IDEOGRAPH
+ {0x96CF, 0x6802}, //4133 #CJK UNIFIED IDEOGRAPH
+ {0x96D0, 0x6803}, //4134 #CJK UNIFIED IDEOGRAPH
+ {0x96D1, 0x6804}, //4135 #CJK UNIFIED IDEOGRAPH
+ {0x96D2, 0x6806}, //4136 #CJK UNIFIED IDEOGRAPH
+ {0x96D3, 0x680D}, //4137 #CJK UNIFIED IDEOGRAPH
+ {0x96D4, 0x6810}, //4138 #CJK UNIFIED IDEOGRAPH
+ {0x96D5, 0x6812}, //4139 #CJK UNIFIED IDEOGRAPH
+ {0x96D6, 0x6814}, //4140 #CJK UNIFIED IDEOGRAPH
+ {0x96D7, 0x6815}, //4141 #CJK UNIFIED IDEOGRAPH
+ {0x96D8, 0x6818}, //4142 #CJK UNIFIED IDEOGRAPH
+ {0x96D9, 0x6819}, //4143 #CJK UNIFIED IDEOGRAPH
+ {0x96DA, 0x681A}, //4144 #CJK UNIFIED IDEOGRAPH
+ {0x96DB, 0x681B}, //4145 #CJK UNIFIED IDEOGRAPH
+ {0x96DC, 0x681C}, //4146 #CJK UNIFIED IDEOGRAPH
+ {0x96DD, 0x681E}, //4147 #CJK UNIFIED IDEOGRAPH
+ {0x96DE, 0x681F}, //4148 #CJK UNIFIED IDEOGRAPH
+ {0x96DF, 0x6820}, //4149 #CJK UNIFIED IDEOGRAPH
+ {0x96E0, 0x6822}, //4150 #CJK UNIFIED IDEOGRAPH
+ {0x96E1, 0x6823}, //4151 #CJK UNIFIED IDEOGRAPH
+ {0x96E2, 0x6824}, //4152 #CJK UNIFIED IDEOGRAPH
+ {0x96E3, 0x6825}, //4153 #CJK UNIFIED IDEOGRAPH
+ {0x96E4, 0x6826}, //4154 #CJK UNIFIED IDEOGRAPH
+ {0x96E5, 0x6827}, //4155 #CJK UNIFIED IDEOGRAPH
+ {0x96E6, 0x6828}, //4156 #CJK UNIFIED IDEOGRAPH
+ {0x96E7, 0x682B}, //4157 #CJK UNIFIED IDEOGRAPH
+ {0x96E8, 0x682C}, //4158 #CJK UNIFIED IDEOGRAPH
+ {0x96E9, 0x682D}, //4159 #CJK UNIFIED IDEOGRAPH
+ {0x96EA, 0x682E}, //4160 #CJK UNIFIED IDEOGRAPH
+ {0x96EB, 0x682F}, //4161 #CJK UNIFIED IDEOGRAPH
+ {0x96EC, 0x6830}, //4162 #CJK UNIFIED IDEOGRAPH
+ {0x96ED, 0x6831}, //4163 #CJK UNIFIED IDEOGRAPH
+ {0x96EE, 0x6834}, //4164 #CJK UNIFIED IDEOGRAPH
+ {0x96EF, 0x6835}, //4165 #CJK UNIFIED IDEOGRAPH
+ {0x96F0, 0x6836}, //4166 #CJK UNIFIED IDEOGRAPH
+ {0x96F1, 0x683A}, //4167 #CJK UNIFIED IDEOGRAPH
+ {0x96F2, 0x683B}, //4168 #CJK UNIFIED IDEOGRAPH
+ {0x96F3, 0x683F}, //4169 #CJK UNIFIED IDEOGRAPH
+ {0x96F4, 0x6847}, //4170 #CJK UNIFIED IDEOGRAPH
+ {0x96F5, 0x684B}, //4171 #CJK UNIFIED IDEOGRAPH
+ {0x96F6, 0x684D}, //4172 #CJK UNIFIED IDEOGRAPH
+ {0x96F7, 0x684F}, //4173 #CJK UNIFIED IDEOGRAPH
+ {0x96F8, 0x6852}, //4174 #CJK UNIFIED IDEOGRAPH
+ {0x96F9, 0x6856}, //4175 #CJK UNIFIED IDEOGRAPH
+ {0x96FA, 0x6857}, //4176 #CJK UNIFIED IDEOGRAPH
+ {0x96FB, 0x6858}, //4177 #CJK UNIFIED IDEOGRAPH
+ {0x96FC, 0x6859}, //4178 #CJK UNIFIED IDEOGRAPH
+ {0x96FD, 0x685A}, //4179 #CJK UNIFIED IDEOGRAPH
+ {0x96FE, 0x685B}, //4180 #CJK UNIFIED IDEOGRAPH
+ {0x9740, 0x685C}, //4181 #CJK UNIFIED IDEOGRAPH
+ {0x9741, 0x685D}, //4182 #CJK UNIFIED IDEOGRAPH
+ {0x9742, 0x685E}, //4183 #CJK UNIFIED IDEOGRAPH
+ {0x9743, 0x685F}, //4184 #CJK UNIFIED IDEOGRAPH
+ {0x9744, 0x686A}, //4185 #CJK UNIFIED IDEOGRAPH
+ {0x9745, 0x686C}, //4186 #CJK UNIFIED IDEOGRAPH
+ {0x9746, 0x686D}, //4187 #CJK UNIFIED IDEOGRAPH
+ {0x9747, 0x686E}, //4188 #CJK UNIFIED IDEOGRAPH
+ {0x9748, 0x686F}, //4189 #CJK UNIFIED IDEOGRAPH
+ {0x9749, 0x6870}, //4190 #CJK UNIFIED IDEOGRAPH
+ {0x974A, 0x6871}, //4191 #CJK UNIFIED IDEOGRAPH
+ {0x974B, 0x6872}, //4192 #CJK UNIFIED IDEOGRAPH
+ {0x974C, 0x6873}, //4193 #CJK UNIFIED IDEOGRAPH
+ {0x974D, 0x6875}, //4194 #CJK UNIFIED IDEOGRAPH
+ {0x974E, 0x6878}, //4195 #CJK UNIFIED IDEOGRAPH
+ {0x974F, 0x6879}, //4196 #CJK UNIFIED IDEOGRAPH
+ {0x9750, 0x687A}, //4197 #CJK UNIFIED IDEOGRAPH
+ {0x9751, 0x687B}, //4198 #CJK UNIFIED IDEOGRAPH
+ {0x9752, 0x687C}, //4199 #CJK UNIFIED IDEOGRAPH
+ {0x9753, 0x687D}, //4200 #CJK UNIFIED IDEOGRAPH
+ {0x9754, 0x687E}, //4201 #CJK UNIFIED IDEOGRAPH
+ {0x9755, 0x687F}, //4202 #CJK UNIFIED IDEOGRAPH
+ {0x9756, 0x6880}, //4203 #CJK UNIFIED IDEOGRAPH
+ {0x9757, 0x6882}, //4204 #CJK UNIFIED IDEOGRAPH
+ {0x9758, 0x6884}, //4205 #CJK UNIFIED IDEOGRAPH
+ {0x9759, 0x6887}, //4206 #CJK UNIFIED IDEOGRAPH
+ {0x975A, 0x6888}, //4207 #CJK UNIFIED IDEOGRAPH
+ {0x975B, 0x6889}, //4208 #CJK UNIFIED IDEOGRAPH
+ {0x975C, 0x688A}, //4209 #CJK UNIFIED IDEOGRAPH
+ {0x975D, 0x688B}, //4210 #CJK UNIFIED IDEOGRAPH
+ {0x975E, 0x688C}, //4211 #CJK UNIFIED IDEOGRAPH
+ {0x975F, 0x688D}, //4212 #CJK UNIFIED IDEOGRAPH
+ {0x9760, 0x688E}, //4213 #CJK UNIFIED IDEOGRAPH
+ {0x9761, 0x6890}, //4214 #CJK UNIFIED IDEOGRAPH
+ {0x9762, 0x6891}, //4215 #CJK UNIFIED IDEOGRAPH
+ {0x9763, 0x6892}, //4216 #CJK UNIFIED IDEOGRAPH
+ {0x9764, 0x6894}, //4217 #CJK UNIFIED IDEOGRAPH
+ {0x9765, 0x6895}, //4218 #CJK UNIFIED IDEOGRAPH
+ {0x9766, 0x6896}, //4219 #CJK UNIFIED IDEOGRAPH
+ {0x9767, 0x6898}, //4220 #CJK UNIFIED IDEOGRAPH
+ {0x9768, 0x6899}, //4221 #CJK UNIFIED IDEOGRAPH
+ {0x9769, 0x689A}, //4222 #CJK UNIFIED IDEOGRAPH
+ {0x976A, 0x689B}, //4223 #CJK UNIFIED IDEOGRAPH
+ {0x976B, 0x689C}, //4224 #CJK UNIFIED IDEOGRAPH
+ {0x976C, 0x689D}, //4225 #CJK UNIFIED IDEOGRAPH
+ {0x976D, 0x689E}, //4226 #CJK UNIFIED IDEOGRAPH
+ {0x976E, 0x689F}, //4227 #CJK UNIFIED IDEOGRAPH
+ {0x976F, 0x68A0}, //4228 #CJK UNIFIED IDEOGRAPH
+ {0x9770, 0x68A1}, //4229 #CJK UNIFIED IDEOGRAPH
+ {0x9771, 0x68A3}, //4230 #CJK UNIFIED IDEOGRAPH
+ {0x9772, 0x68A4}, //4231 #CJK UNIFIED IDEOGRAPH
+ {0x9773, 0x68A5}, //4232 #CJK UNIFIED IDEOGRAPH
+ {0x9774, 0x68A9}, //4233 #CJK UNIFIED IDEOGRAPH
+ {0x9775, 0x68AA}, //4234 #CJK UNIFIED IDEOGRAPH
+ {0x9776, 0x68AB}, //4235 #CJK UNIFIED IDEOGRAPH
+ {0x9777, 0x68AC}, //4236 #CJK UNIFIED IDEOGRAPH
+ {0x9778, 0x68AE}, //4237 #CJK UNIFIED IDEOGRAPH
+ {0x9779, 0x68B1}, //4238 #CJK UNIFIED IDEOGRAPH
+ {0x977A, 0x68B2}, //4239 #CJK UNIFIED IDEOGRAPH
+ {0x977B, 0x68B4}, //4240 #CJK UNIFIED IDEOGRAPH
+ {0x977C, 0x68B6}, //4241 #CJK UNIFIED IDEOGRAPH
+ {0x977D, 0x68B7}, //4242 #CJK UNIFIED IDEOGRAPH
+ {0x977E, 0x68B8}, //4243 #CJK UNIFIED IDEOGRAPH
+ {0x9780, 0x68B9}, //4244 #CJK UNIFIED IDEOGRAPH
+ {0x9781, 0x68BA}, //4245 #CJK UNIFIED IDEOGRAPH
+ {0x9782, 0x68BB}, //4246 #CJK UNIFIED IDEOGRAPH
+ {0x9783, 0x68BC}, //4247 #CJK UNIFIED IDEOGRAPH
+ {0x9784, 0x68BD}, //4248 #CJK UNIFIED IDEOGRAPH
+ {0x9785, 0x68BE}, //4249 #CJK UNIFIED IDEOGRAPH
+ {0x9786, 0x68BF}, //4250 #CJK UNIFIED IDEOGRAPH
+ {0x9787, 0x68C1}, //4251 #CJK UNIFIED IDEOGRAPH
+ {0x9788, 0x68C3}, //4252 #CJK UNIFIED IDEOGRAPH
+ {0x9789, 0x68C4}, //4253 #CJK UNIFIED IDEOGRAPH
+ {0x978A, 0x68C5}, //4254 #CJK UNIFIED IDEOGRAPH
+ {0x978B, 0x68C6}, //4255 #CJK UNIFIED IDEOGRAPH
+ {0x978C, 0x68C7}, //4256 #CJK UNIFIED IDEOGRAPH
+ {0x978D, 0x68C8}, //4257 #CJK UNIFIED IDEOGRAPH
+ {0x978E, 0x68CA}, //4258 #CJK UNIFIED IDEOGRAPH
+ {0x978F, 0x68CC}, //4259 #CJK UNIFIED IDEOGRAPH
+ {0x9790, 0x68CE}, //4260 #CJK UNIFIED IDEOGRAPH
+ {0x9791, 0x68CF}, //4261 #CJK UNIFIED IDEOGRAPH
+ {0x9792, 0x68D0}, //4262 #CJK UNIFIED IDEOGRAPH
+ {0x9793, 0x68D1}, //4263 #CJK UNIFIED IDEOGRAPH
+ {0x9794, 0x68D3}, //4264 #CJK UNIFIED IDEOGRAPH
+ {0x9795, 0x68D4}, //4265 #CJK UNIFIED IDEOGRAPH
+ {0x9796, 0x68D6}, //4266 #CJK UNIFIED IDEOGRAPH
+ {0x9797, 0x68D7}, //4267 #CJK UNIFIED IDEOGRAPH
+ {0x9798, 0x68D9}, //4268 #CJK UNIFIED IDEOGRAPH
+ {0x9799, 0x68DB}, //4269 #CJK UNIFIED IDEOGRAPH
+ {0x979A, 0x68DC}, //4270 #CJK UNIFIED IDEOGRAPH
+ {0x979B, 0x68DD}, //4271 #CJK UNIFIED IDEOGRAPH
+ {0x979C, 0x68DE}, //4272 #CJK UNIFIED IDEOGRAPH
+ {0x979D, 0x68DF}, //4273 #CJK UNIFIED IDEOGRAPH
+ {0x979E, 0x68E1}, //4274 #CJK UNIFIED IDEOGRAPH
+ {0x979F, 0x68E2}, //4275 #CJK UNIFIED IDEOGRAPH
+ {0x97A0, 0x68E4}, //4276 #CJK UNIFIED IDEOGRAPH
+ {0x97A1, 0x68E5}, //4277 #CJK UNIFIED IDEOGRAPH
+ {0x97A2, 0x68E6}, //4278 #CJK UNIFIED IDEOGRAPH
+ {0x97A3, 0x68E7}, //4279 #CJK UNIFIED IDEOGRAPH
+ {0x97A4, 0x68E8}, //4280 #CJK UNIFIED IDEOGRAPH
+ {0x97A5, 0x68E9}, //4281 #CJK UNIFIED IDEOGRAPH
+ {0x97A6, 0x68EA}, //4282 #CJK UNIFIED IDEOGRAPH
+ {0x97A7, 0x68EB}, //4283 #CJK UNIFIED IDEOGRAPH
+ {0x97A8, 0x68EC}, //4284 #CJK UNIFIED IDEOGRAPH
+ {0x97A9, 0x68ED}, //4285 #CJK UNIFIED IDEOGRAPH
+ {0x97AA, 0x68EF}, //4286 #CJK UNIFIED IDEOGRAPH
+ {0x97AB, 0x68F2}, //4287 #CJK UNIFIED IDEOGRAPH
+ {0x97AC, 0x68F3}, //4288 #CJK UNIFIED IDEOGRAPH
+ {0x97AD, 0x68F4}, //4289 #CJK UNIFIED IDEOGRAPH
+ {0x97AE, 0x68F6}, //4290 #CJK UNIFIED IDEOGRAPH
+ {0x97AF, 0x68F7}, //4291 #CJK UNIFIED IDEOGRAPH
+ {0x97B0, 0x68F8}, //4292 #CJK UNIFIED IDEOGRAPH
+ {0x97B1, 0x68FB}, //4293 #CJK UNIFIED IDEOGRAPH
+ {0x97B2, 0x68FD}, //4294 #CJK UNIFIED IDEOGRAPH
+ {0x97B3, 0x68FE}, //4295 #CJK UNIFIED IDEOGRAPH
+ {0x97B4, 0x68FF}, //4296 #CJK UNIFIED IDEOGRAPH
+ {0x97B5, 0x6900}, //4297 #CJK UNIFIED IDEOGRAPH
+ {0x97B6, 0x6902}, //4298 #CJK UNIFIED IDEOGRAPH
+ {0x97B7, 0x6903}, //4299 #CJK UNIFIED IDEOGRAPH
+ {0x97B8, 0x6904}, //4300 #CJK UNIFIED IDEOGRAPH
+ {0x97B9, 0x6906}, //4301 #CJK UNIFIED IDEOGRAPH
+ {0x97BA, 0x6907}, //4302 #CJK UNIFIED IDEOGRAPH
+ {0x97BB, 0x6908}, //4303 #CJK UNIFIED IDEOGRAPH
+ {0x97BC, 0x6909}, //4304 #CJK UNIFIED IDEOGRAPH
+ {0x97BD, 0x690A}, //4305 #CJK UNIFIED IDEOGRAPH
+ {0x97BE, 0x690C}, //4306 #CJK UNIFIED IDEOGRAPH
+ {0x97BF, 0x690F}, //4307 #CJK UNIFIED IDEOGRAPH
+ {0x97C0, 0x6911}, //4308 #CJK UNIFIED IDEOGRAPH
+ {0x97C1, 0x6913}, //4309 #CJK UNIFIED IDEOGRAPH
+ {0x97C2, 0x6914}, //4310 #CJK UNIFIED IDEOGRAPH
+ {0x97C3, 0x6915}, //4311 #CJK UNIFIED IDEOGRAPH
+ {0x97C4, 0x6916}, //4312 #CJK UNIFIED IDEOGRAPH
+ {0x97C5, 0x6917}, //4313 #CJK UNIFIED IDEOGRAPH
+ {0x97C6, 0x6918}, //4314 #CJK UNIFIED IDEOGRAPH
+ {0x97C7, 0x6919}, //4315 #CJK UNIFIED IDEOGRAPH
+ {0x97C8, 0x691A}, //4316 #CJK UNIFIED IDEOGRAPH
+ {0x97C9, 0x691B}, //4317 #CJK UNIFIED IDEOGRAPH
+ {0x97CA, 0x691C}, //4318 #CJK UNIFIED IDEOGRAPH
+ {0x97CB, 0x691D}, //4319 #CJK UNIFIED IDEOGRAPH
+ {0x97CC, 0x691E}, //4320 #CJK UNIFIED IDEOGRAPH
+ {0x97CD, 0x6921}, //4321 #CJK UNIFIED IDEOGRAPH
+ {0x97CE, 0x6922}, //4322 #CJK UNIFIED IDEOGRAPH
+ {0x97CF, 0x6923}, //4323 #CJK UNIFIED IDEOGRAPH
+ {0x97D0, 0x6925}, //4324 #CJK UNIFIED IDEOGRAPH
+ {0x97D1, 0x6926}, //4325 #CJK UNIFIED IDEOGRAPH
+ {0x97D2, 0x6927}, //4326 #CJK UNIFIED IDEOGRAPH
+ {0x97D3, 0x6928}, //4327 #CJK UNIFIED IDEOGRAPH
+ {0x97D4, 0x6929}, //4328 #CJK UNIFIED IDEOGRAPH
+ {0x97D5, 0x692A}, //4329 #CJK UNIFIED IDEOGRAPH
+ {0x97D6, 0x692B}, //4330 #CJK UNIFIED IDEOGRAPH
+ {0x97D7, 0x692C}, //4331 #CJK UNIFIED IDEOGRAPH
+ {0x97D8, 0x692E}, //4332 #CJK UNIFIED IDEOGRAPH
+ {0x97D9, 0x692F}, //4333 #CJK UNIFIED IDEOGRAPH
+ {0x97DA, 0x6931}, //4334 #CJK UNIFIED IDEOGRAPH
+ {0x97DB, 0x6932}, //4335 #CJK UNIFIED IDEOGRAPH
+ {0x97DC, 0x6933}, //4336 #CJK UNIFIED IDEOGRAPH
+ {0x97DD, 0x6935}, //4337 #CJK UNIFIED IDEOGRAPH
+ {0x97DE, 0x6936}, //4338 #CJK UNIFIED IDEOGRAPH
+ {0x97DF, 0x6937}, //4339 #CJK UNIFIED IDEOGRAPH
+ {0x97E0, 0x6938}, //4340 #CJK UNIFIED IDEOGRAPH
+ {0x97E1, 0x693A}, //4341 #CJK UNIFIED IDEOGRAPH
+ {0x97E2, 0x693B}, //4342 #CJK UNIFIED IDEOGRAPH
+ {0x97E3, 0x693C}, //4343 #CJK UNIFIED IDEOGRAPH
+ {0x97E4, 0x693E}, //4344 #CJK UNIFIED IDEOGRAPH
+ {0x97E5, 0x6940}, //4345 #CJK UNIFIED IDEOGRAPH
+ {0x97E6, 0x6941}, //4346 #CJK UNIFIED IDEOGRAPH
+ {0x97E7, 0x6943}, //4347 #CJK UNIFIED IDEOGRAPH
+ {0x97E8, 0x6944}, //4348 #CJK UNIFIED IDEOGRAPH
+ {0x97E9, 0x6945}, //4349 #CJK UNIFIED IDEOGRAPH
+ {0x97EA, 0x6946}, //4350 #CJK UNIFIED IDEOGRAPH
+ {0x97EB, 0x6947}, //4351 #CJK UNIFIED IDEOGRAPH
+ {0x97EC, 0x6948}, //4352 #CJK UNIFIED IDEOGRAPH
+ {0x97ED, 0x6949}, //4353 #CJK UNIFIED IDEOGRAPH
+ {0x97EE, 0x694A}, //4354 #CJK UNIFIED IDEOGRAPH
+ {0x97EF, 0x694B}, //4355 #CJK UNIFIED IDEOGRAPH
+ {0x97F0, 0x694C}, //4356 #CJK UNIFIED IDEOGRAPH
+ {0x97F1, 0x694D}, //4357 #CJK UNIFIED IDEOGRAPH
+ {0x97F2, 0x694E}, //4358 #CJK UNIFIED IDEOGRAPH
+ {0x97F3, 0x694F}, //4359 #CJK UNIFIED IDEOGRAPH
+ {0x97F4, 0x6950}, //4360 #CJK UNIFIED IDEOGRAPH
+ {0x97F5, 0x6951}, //4361 #CJK UNIFIED IDEOGRAPH
+ {0x97F6, 0x6952}, //4362 #CJK UNIFIED IDEOGRAPH
+ {0x97F7, 0x6953}, //4363 #CJK UNIFIED IDEOGRAPH
+ {0x97F8, 0x6955}, //4364 #CJK UNIFIED IDEOGRAPH
+ {0x97F9, 0x6956}, //4365 #CJK UNIFIED IDEOGRAPH
+ {0x97FA, 0x6958}, //4366 #CJK UNIFIED IDEOGRAPH
+ {0x97FB, 0x6959}, //4367 #CJK UNIFIED IDEOGRAPH
+ {0x97FC, 0x695B}, //4368 #CJK UNIFIED IDEOGRAPH
+ {0x97FD, 0x695C}, //4369 #CJK UNIFIED IDEOGRAPH
+ {0x97FE, 0x695F}, //4370 #CJK UNIFIED IDEOGRAPH
+ {0x9840, 0x6961}, //4371 #CJK UNIFIED IDEOGRAPH
+ {0x9841, 0x6962}, //4372 #CJK UNIFIED IDEOGRAPH
+ {0x9842, 0x6964}, //4373 #CJK UNIFIED IDEOGRAPH
+ {0x9843, 0x6965}, //4374 #CJK UNIFIED IDEOGRAPH
+ {0x9844, 0x6967}, //4375 #CJK UNIFIED IDEOGRAPH
+ {0x9845, 0x6968}, //4376 #CJK UNIFIED IDEOGRAPH
+ {0x9846, 0x6969}, //4377 #CJK UNIFIED IDEOGRAPH
+ {0x9847, 0x696A}, //4378 #CJK UNIFIED IDEOGRAPH
+ {0x9848, 0x696C}, //4379 #CJK UNIFIED IDEOGRAPH
+ {0x9849, 0x696D}, //4380 #CJK UNIFIED IDEOGRAPH
+ {0x984A, 0x696F}, //4381 #CJK UNIFIED IDEOGRAPH
+ {0x984B, 0x6970}, //4382 #CJK UNIFIED IDEOGRAPH
+ {0x984C, 0x6972}, //4383 #CJK UNIFIED IDEOGRAPH
+ {0x984D, 0x6973}, //4384 #CJK UNIFIED IDEOGRAPH
+ {0x984E, 0x6974}, //4385 #CJK UNIFIED IDEOGRAPH
+ {0x984F, 0x6975}, //4386 #CJK UNIFIED IDEOGRAPH
+ {0x9850, 0x6976}, //4387 #CJK UNIFIED IDEOGRAPH
+ {0x9851, 0x697A}, //4388 #CJK UNIFIED IDEOGRAPH
+ {0x9852, 0x697B}, //4389 #CJK UNIFIED IDEOGRAPH
+ {0x9853, 0x697D}, //4390 #CJK UNIFIED IDEOGRAPH
+ {0x9854, 0x697E}, //4391 #CJK UNIFIED IDEOGRAPH
+ {0x9855, 0x697F}, //4392 #CJK UNIFIED IDEOGRAPH
+ {0x9856, 0x6981}, //4393 #CJK UNIFIED IDEOGRAPH
+ {0x9857, 0x6983}, //4394 #CJK UNIFIED IDEOGRAPH
+ {0x9858, 0x6985}, //4395 #CJK UNIFIED IDEOGRAPH
+ {0x9859, 0x698A}, //4396 #CJK UNIFIED IDEOGRAPH
+ {0x985A, 0x698B}, //4397 #CJK UNIFIED IDEOGRAPH
+ {0x985B, 0x698C}, //4398 #CJK UNIFIED IDEOGRAPH
+ {0x985C, 0x698E}, //4399 #CJK UNIFIED IDEOGRAPH
+ {0x985D, 0x698F}, //4400 #CJK UNIFIED IDEOGRAPH
+ {0x985E, 0x6990}, //4401 #CJK UNIFIED IDEOGRAPH
+ {0x985F, 0x6991}, //4402 #CJK UNIFIED IDEOGRAPH
+ {0x9860, 0x6992}, //4403 #CJK UNIFIED IDEOGRAPH
+ {0x9861, 0x6993}, //4404 #CJK UNIFIED IDEOGRAPH
+ {0x9862, 0x6996}, //4405 #CJK UNIFIED IDEOGRAPH
+ {0x9863, 0x6997}, //4406 #CJK UNIFIED IDEOGRAPH
+ {0x9864, 0x6999}, //4407 #CJK UNIFIED IDEOGRAPH
+ {0x9865, 0x699A}, //4408 #CJK UNIFIED IDEOGRAPH
+ {0x9866, 0x699D}, //4409 #CJK UNIFIED IDEOGRAPH
+ {0x9867, 0x699E}, //4410 #CJK UNIFIED IDEOGRAPH
+ {0x9868, 0x699F}, //4411 #CJK UNIFIED IDEOGRAPH
+ {0x9869, 0x69A0}, //4412 #CJK UNIFIED IDEOGRAPH
+ {0x986A, 0x69A1}, //4413 #CJK UNIFIED IDEOGRAPH
+ {0x986B, 0x69A2}, //4414 #CJK UNIFIED IDEOGRAPH
+ {0x986C, 0x69A3}, //4415 #CJK UNIFIED IDEOGRAPH
+ {0x986D, 0x69A4}, //4416 #CJK UNIFIED IDEOGRAPH
+ {0x986E, 0x69A5}, //4417 #CJK UNIFIED IDEOGRAPH
+ {0x986F, 0x69A6}, //4418 #CJK UNIFIED IDEOGRAPH
+ {0x9870, 0x69A9}, //4419 #CJK UNIFIED IDEOGRAPH
+ {0x9871, 0x69AA}, //4420 #CJK UNIFIED IDEOGRAPH
+ {0x9872, 0x69AC}, //4421 #CJK UNIFIED IDEOGRAPH
+ {0x9873, 0x69AE}, //4422 #CJK UNIFIED IDEOGRAPH
+ {0x9874, 0x69AF}, //4423 #CJK UNIFIED IDEOGRAPH
+ {0x9875, 0x69B0}, //4424 #CJK UNIFIED IDEOGRAPH
+ {0x9876, 0x69B2}, //4425 #CJK UNIFIED IDEOGRAPH
+ {0x9877, 0x69B3}, //4426 #CJK UNIFIED IDEOGRAPH
+ {0x9878, 0x69B5}, //4427 #CJK UNIFIED IDEOGRAPH
+ {0x9879, 0x69B6}, //4428 #CJK UNIFIED IDEOGRAPH
+ {0x987A, 0x69B8}, //4429 #CJK UNIFIED IDEOGRAPH
+ {0x987B, 0x69B9}, //4430 #CJK UNIFIED IDEOGRAPH
+ {0x987C, 0x69BA}, //4431 #CJK UNIFIED IDEOGRAPH
+ {0x987D, 0x69BC}, //4432 #CJK UNIFIED IDEOGRAPH
+ {0x987E, 0x69BD}, //4433 #CJK UNIFIED IDEOGRAPH
+ {0x9880, 0x69BE}, //4434 #CJK UNIFIED IDEOGRAPH
+ {0x9881, 0x69BF}, //4435 #CJK UNIFIED IDEOGRAPH
+ {0x9882, 0x69C0}, //4436 #CJK UNIFIED IDEOGRAPH
+ {0x9883, 0x69C2}, //4437 #CJK UNIFIED IDEOGRAPH
+ {0x9884, 0x69C3}, //4438 #CJK UNIFIED IDEOGRAPH
+ {0x9885, 0x69C4}, //4439 #CJK UNIFIED IDEOGRAPH
+ {0x9886, 0x69C5}, //4440 #CJK UNIFIED IDEOGRAPH
+ {0x9887, 0x69C6}, //4441 #CJK UNIFIED IDEOGRAPH
+ {0x9888, 0x69C7}, //4442 #CJK UNIFIED IDEOGRAPH
+ {0x9889, 0x69C8}, //4443 #CJK UNIFIED IDEOGRAPH
+ {0x988A, 0x69C9}, //4444 #CJK UNIFIED IDEOGRAPH
+ {0x988B, 0x69CB}, //4445 #CJK UNIFIED IDEOGRAPH
+ {0x988C, 0x69CD}, //4446 #CJK UNIFIED IDEOGRAPH
+ {0x988D, 0x69CF}, //4447 #CJK UNIFIED IDEOGRAPH
+ {0x988E, 0x69D1}, //4448 #CJK UNIFIED IDEOGRAPH
+ {0x988F, 0x69D2}, //4449 #CJK UNIFIED IDEOGRAPH
+ {0x9890, 0x69D3}, //4450 #CJK UNIFIED IDEOGRAPH
+ {0x9891, 0x69D5}, //4451 #CJK UNIFIED IDEOGRAPH
+ {0x9892, 0x69D6}, //4452 #CJK UNIFIED IDEOGRAPH
+ {0x9893, 0x69D7}, //4453 #CJK UNIFIED IDEOGRAPH
+ {0x9894, 0x69D8}, //4454 #CJK UNIFIED IDEOGRAPH
+ {0x9895, 0x69D9}, //4455 #CJK UNIFIED IDEOGRAPH
+ {0x9896, 0x69DA}, //4456 #CJK UNIFIED IDEOGRAPH
+ {0x9897, 0x69DC}, //4457 #CJK UNIFIED IDEOGRAPH
+ {0x9898, 0x69DD}, //4458 #CJK UNIFIED IDEOGRAPH
+ {0x9899, 0x69DE}, //4459 #CJK UNIFIED IDEOGRAPH
+ {0x989A, 0x69E1}, //4460 #CJK UNIFIED IDEOGRAPH
+ {0x989B, 0x69E2}, //4461 #CJK UNIFIED IDEOGRAPH
+ {0x989C, 0x69E3}, //4462 #CJK UNIFIED IDEOGRAPH
+ {0x989D, 0x69E4}, //4463 #CJK UNIFIED IDEOGRAPH
+ {0x989E, 0x69E5}, //4464 #CJK UNIFIED IDEOGRAPH
+ {0x989F, 0x69E6}, //4465 #CJK UNIFIED IDEOGRAPH
+ {0x98A0, 0x69E7}, //4466 #CJK UNIFIED IDEOGRAPH
+ {0x98A1, 0x69E8}, //4467 #CJK UNIFIED IDEOGRAPH
+ {0x98A2, 0x69E9}, //4468 #CJK UNIFIED IDEOGRAPH
+ {0x98A3, 0x69EA}, //4469 #CJK UNIFIED IDEOGRAPH
+ {0x98A4, 0x69EB}, //4470 #CJK UNIFIED IDEOGRAPH
+ {0x98A5, 0x69EC}, //4471 #CJK UNIFIED IDEOGRAPH
+ {0x98A6, 0x69EE}, //4472 #CJK UNIFIED IDEOGRAPH
+ {0x98A7, 0x69EF}, //4473 #CJK UNIFIED IDEOGRAPH
+ {0x98A8, 0x69F0}, //4474 #CJK UNIFIED IDEOGRAPH
+ {0x98A9, 0x69F1}, //4475 #CJK UNIFIED IDEOGRAPH
+ {0x98AA, 0x69F3}, //4476 #CJK UNIFIED IDEOGRAPH
+ {0x98AB, 0x69F4}, //4477 #CJK UNIFIED IDEOGRAPH
+ {0x98AC, 0x69F5}, //4478 #CJK UNIFIED IDEOGRAPH
+ {0x98AD, 0x69F6}, //4479 #CJK UNIFIED IDEOGRAPH
+ {0x98AE, 0x69F7}, //4480 #CJK UNIFIED IDEOGRAPH
+ {0x98AF, 0x69F8}, //4481 #CJK UNIFIED IDEOGRAPH
+ {0x98B0, 0x69F9}, //4482 #CJK UNIFIED IDEOGRAPH
+ {0x98B1, 0x69FA}, //4483 #CJK UNIFIED IDEOGRAPH
+ {0x98B2, 0x69FB}, //4484 #CJK UNIFIED IDEOGRAPH
+ {0x98B3, 0x69FC}, //4485 #CJK UNIFIED IDEOGRAPH
+ {0x98B4, 0x69FE}, //4486 #CJK UNIFIED IDEOGRAPH
+ {0x98B5, 0x6A00}, //4487 #CJK UNIFIED IDEOGRAPH
+ {0x98B6, 0x6A01}, //4488 #CJK UNIFIED IDEOGRAPH
+ {0x98B7, 0x6A02}, //4489 #CJK UNIFIED IDEOGRAPH
+ {0x98B8, 0x6A03}, //4490 #CJK UNIFIED IDEOGRAPH
+ {0x98B9, 0x6A04}, //4491 #CJK UNIFIED IDEOGRAPH
+ {0x98BA, 0x6A05}, //4492 #CJK UNIFIED IDEOGRAPH
+ {0x98BB, 0x6A06}, //4493 #CJK UNIFIED IDEOGRAPH
+ {0x98BC, 0x6A07}, //4494 #CJK UNIFIED IDEOGRAPH
+ {0x98BD, 0x6A08}, //4495 #CJK UNIFIED IDEOGRAPH
+ {0x98BE, 0x6A09}, //4496 #CJK UNIFIED IDEOGRAPH
+ {0x98BF, 0x6A0B}, //4497 #CJK UNIFIED IDEOGRAPH
+ {0x98C0, 0x6A0C}, //4498 #CJK UNIFIED IDEOGRAPH
+ {0x98C1, 0x6A0D}, //4499 #CJK UNIFIED IDEOGRAPH
+ {0x98C2, 0x6A0E}, //4500 #CJK UNIFIED IDEOGRAPH
+ {0x98C3, 0x6A0F}, //4501 #CJK UNIFIED IDEOGRAPH
+ {0x98C4, 0x6A10}, //4502 #CJK UNIFIED IDEOGRAPH
+ {0x98C5, 0x6A11}, //4503 #CJK UNIFIED IDEOGRAPH
+ {0x98C6, 0x6A12}, //4504 #CJK UNIFIED IDEOGRAPH
+ {0x98C7, 0x6A13}, //4505 #CJK UNIFIED IDEOGRAPH
+ {0x98C8, 0x6A14}, //4506 #CJK UNIFIED IDEOGRAPH
+ {0x98C9, 0x6A15}, //4507 #CJK UNIFIED IDEOGRAPH
+ {0x98CA, 0x6A16}, //4508 #CJK UNIFIED IDEOGRAPH
+ {0x98CB, 0x6A19}, //4509 #CJK UNIFIED IDEOGRAPH
+ {0x98CC, 0x6A1A}, //4510 #CJK UNIFIED IDEOGRAPH
+ {0x98CD, 0x6A1B}, //4511 #CJK UNIFIED IDEOGRAPH
+ {0x98CE, 0x6A1C}, //4512 #CJK UNIFIED IDEOGRAPH
+ {0x98CF, 0x6A1D}, //4513 #CJK UNIFIED IDEOGRAPH
+ {0x98D0, 0x6A1E}, //4514 #CJK UNIFIED IDEOGRAPH
+ {0x98D1, 0x6A20}, //4515 #CJK UNIFIED IDEOGRAPH
+ {0x98D2, 0x6A22}, //4516 #CJK UNIFIED IDEOGRAPH
+ {0x98D3, 0x6A23}, //4517 #CJK UNIFIED IDEOGRAPH
+ {0x98D4, 0x6A24}, //4518 #CJK UNIFIED IDEOGRAPH
+ {0x98D5, 0x6A25}, //4519 #CJK UNIFIED IDEOGRAPH
+ {0x98D6, 0x6A26}, //4520 #CJK UNIFIED IDEOGRAPH
+ {0x98D7, 0x6A27}, //4521 #CJK UNIFIED IDEOGRAPH
+ {0x98D8, 0x6A29}, //4522 #CJK UNIFIED IDEOGRAPH
+ {0x98D9, 0x6A2B}, //4523 #CJK UNIFIED IDEOGRAPH
+ {0x98DA, 0x6A2C}, //4524 #CJK UNIFIED IDEOGRAPH
+ {0x98DB, 0x6A2D}, //4525 #CJK UNIFIED IDEOGRAPH
+ {0x98DC, 0x6A2E}, //4526 #CJK UNIFIED IDEOGRAPH
+ {0x98DD, 0x6A30}, //4527 #CJK UNIFIED IDEOGRAPH
+ {0x98DE, 0x6A32}, //4528 #CJK UNIFIED IDEOGRAPH
+ {0x98DF, 0x6A33}, //4529 #CJK UNIFIED IDEOGRAPH
+ {0x98E0, 0x6A34}, //4530 #CJK UNIFIED IDEOGRAPH
+ {0x98E1, 0x6A36}, //4531 #CJK UNIFIED IDEOGRAPH
+ {0x98E2, 0x6A37}, //4532 #CJK UNIFIED IDEOGRAPH
+ {0x98E3, 0x6A38}, //4533 #CJK UNIFIED IDEOGRAPH
+ {0x98E4, 0x6A39}, //4534 #CJK UNIFIED IDEOGRAPH
+ {0x98E5, 0x6A3A}, //4535 #CJK UNIFIED IDEOGRAPH
+ {0x98E6, 0x6A3B}, //4536 #CJK UNIFIED IDEOGRAPH
+ {0x98E7, 0x6A3C}, //4537 #CJK UNIFIED IDEOGRAPH
+ {0x98E8, 0x6A3F}, //4538 #CJK UNIFIED IDEOGRAPH
+ {0x98E9, 0x6A40}, //4539 #CJK UNIFIED IDEOGRAPH
+ {0x98EA, 0x6A41}, //4540 #CJK UNIFIED IDEOGRAPH
+ {0x98EB, 0x6A42}, //4541 #CJK UNIFIED IDEOGRAPH
+ {0x98EC, 0x6A43}, //4542 #CJK UNIFIED IDEOGRAPH
+ {0x98ED, 0x6A45}, //4543 #CJK UNIFIED IDEOGRAPH
+ {0x98EE, 0x6A46}, //4544 #CJK UNIFIED IDEOGRAPH
+ {0x98EF, 0x6A48}, //4545 #CJK UNIFIED IDEOGRAPH
+ {0x98F0, 0x6A49}, //4546 #CJK UNIFIED IDEOGRAPH
+ {0x98F1, 0x6A4A}, //4547 #CJK UNIFIED IDEOGRAPH
+ {0x98F2, 0x6A4B}, //4548 #CJK UNIFIED IDEOGRAPH
+ {0x98F3, 0x6A4C}, //4549 #CJK UNIFIED IDEOGRAPH
+ {0x98F4, 0x6A4D}, //4550 #CJK UNIFIED IDEOGRAPH
+ {0x98F5, 0x6A4E}, //4551 #CJK UNIFIED IDEOGRAPH
+ {0x98F6, 0x6A4F}, //4552 #CJK UNIFIED IDEOGRAPH
+ {0x98F7, 0x6A51}, //4553 #CJK UNIFIED IDEOGRAPH
+ {0x98F8, 0x6A52}, //4554 #CJK UNIFIED IDEOGRAPH
+ {0x98F9, 0x6A53}, //4555 #CJK UNIFIED IDEOGRAPH
+ {0x98FA, 0x6A54}, //4556 #CJK UNIFIED IDEOGRAPH
+ {0x98FB, 0x6A55}, //4557 #CJK UNIFIED IDEOGRAPH
+ {0x98FC, 0x6A56}, //4558 #CJK UNIFIED IDEOGRAPH
+ {0x98FD, 0x6A57}, //4559 #CJK UNIFIED IDEOGRAPH
+ {0x98FE, 0x6A5A}, //4560 #CJK UNIFIED IDEOGRAPH
+ {0x9940, 0x6A5C}, //4561 #CJK UNIFIED IDEOGRAPH
+ {0x9941, 0x6A5D}, //4562 #CJK UNIFIED IDEOGRAPH
+ {0x9942, 0x6A5E}, //4563 #CJK UNIFIED IDEOGRAPH
+ {0x9943, 0x6A5F}, //4564 #CJK UNIFIED IDEOGRAPH
+ {0x9944, 0x6A60}, //4565 #CJK UNIFIED IDEOGRAPH
+ {0x9945, 0x6A62}, //4566 #CJK UNIFIED IDEOGRAPH
+ {0x9946, 0x6A63}, //4567 #CJK UNIFIED IDEOGRAPH
+ {0x9947, 0x6A64}, //4568 #CJK UNIFIED IDEOGRAPH
+ {0x9948, 0x6A66}, //4569 #CJK UNIFIED IDEOGRAPH
+ {0x9949, 0x6A67}, //4570 #CJK UNIFIED IDEOGRAPH
+ {0x994A, 0x6A68}, //4571 #CJK UNIFIED IDEOGRAPH
+ {0x994B, 0x6A69}, //4572 #CJK UNIFIED IDEOGRAPH
+ {0x994C, 0x6A6A}, //4573 #CJK UNIFIED IDEOGRAPH
+ {0x994D, 0x6A6B}, //4574 #CJK UNIFIED IDEOGRAPH
+ {0x994E, 0x6A6C}, //4575 #CJK UNIFIED IDEOGRAPH
+ {0x994F, 0x6A6D}, //4576 #CJK UNIFIED IDEOGRAPH
+ {0x9950, 0x6A6E}, //4577 #CJK UNIFIED IDEOGRAPH
+ {0x9951, 0x6A6F}, //4578 #CJK UNIFIED IDEOGRAPH
+ {0x9952, 0x6A70}, //4579 #CJK UNIFIED IDEOGRAPH
+ {0x9953, 0x6A72}, //4580 #CJK UNIFIED IDEOGRAPH
+ {0x9954, 0x6A73}, //4581 #CJK UNIFIED IDEOGRAPH
+ {0x9955, 0x6A74}, //4582 #CJK UNIFIED IDEOGRAPH
+ {0x9956, 0x6A75}, //4583 #CJK UNIFIED IDEOGRAPH
+ {0x9957, 0x6A76}, //4584 #CJK UNIFIED IDEOGRAPH
+ {0x9958, 0x6A77}, //4585 #CJK UNIFIED IDEOGRAPH
+ {0x9959, 0x6A78}, //4586 #CJK UNIFIED IDEOGRAPH
+ {0x995A, 0x6A7A}, //4587 #CJK UNIFIED IDEOGRAPH
+ {0x995B, 0x6A7B}, //4588 #CJK UNIFIED IDEOGRAPH
+ {0x995C, 0x6A7D}, //4589 #CJK UNIFIED IDEOGRAPH
+ {0x995D, 0x6A7E}, //4590 #CJK UNIFIED IDEOGRAPH
+ {0x995E, 0x6A7F}, //4591 #CJK UNIFIED IDEOGRAPH
+ {0x995F, 0x6A81}, //4592 #CJK UNIFIED IDEOGRAPH
+ {0x9960, 0x6A82}, //4593 #CJK UNIFIED IDEOGRAPH
+ {0x9961, 0x6A83}, //4594 #CJK UNIFIED IDEOGRAPH
+ {0x9962, 0x6A85}, //4595 #CJK UNIFIED IDEOGRAPH
+ {0x9963, 0x6A86}, //4596 #CJK UNIFIED IDEOGRAPH
+ {0x9964, 0x6A87}, //4597 #CJK UNIFIED IDEOGRAPH
+ {0x9965, 0x6A88}, //4598 #CJK UNIFIED IDEOGRAPH
+ {0x9966, 0x6A89}, //4599 #CJK UNIFIED IDEOGRAPH
+ {0x9967, 0x6A8A}, //4600 #CJK UNIFIED IDEOGRAPH
+ {0x9968, 0x6A8B}, //4601 #CJK UNIFIED IDEOGRAPH
+ {0x9969, 0x6A8C}, //4602 #CJK UNIFIED IDEOGRAPH
+ {0x996A, 0x6A8D}, //4603 #CJK UNIFIED IDEOGRAPH
+ {0x996B, 0x6A8F}, //4604 #CJK UNIFIED IDEOGRAPH
+ {0x996C, 0x6A92}, //4605 #CJK UNIFIED IDEOGRAPH
+ {0x996D, 0x6A93}, //4606 #CJK UNIFIED IDEOGRAPH
+ {0x996E, 0x6A94}, //4607 #CJK UNIFIED IDEOGRAPH
+ {0x996F, 0x6A95}, //4608 #CJK UNIFIED IDEOGRAPH
+ {0x9970, 0x6A96}, //4609 #CJK UNIFIED IDEOGRAPH
+ {0x9971, 0x6A98}, //4610 #CJK UNIFIED IDEOGRAPH
+ {0x9972, 0x6A99}, //4611 #CJK UNIFIED IDEOGRAPH
+ {0x9973, 0x6A9A}, //4612 #CJK UNIFIED IDEOGRAPH
+ {0x9974, 0x6A9B}, //4613 #CJK UNIFIED IDEOGRAPH
+ {0x9975, 0x6A9C}, //4614 #CJK UNIFIED IDEOGRAPH
+ {0x9976, 0x6A9D}, //4615 #CJK UNIFIED IDEOGRAPH
+ {0x9977, 0x6A9E}, //4616 #CJK UNIFIED IDEOGRAPH
+ {0x9978, 0x6A9F}, //4617 #CJK UNIFIED IDEOGRAPH
+ {0x9979, 0x6AA1}, //4618 #CJK UNIFIED IDEOGRAPH
+ {0x997A, 0x6AA2}, //4619 #CJK UNIFIED IDEOGRAPH
+ {0x997B, 0x6AA3}, //4620 #CJK UNIFIED IDEOGRAPH
+ {0x997C, 0x6AA4}, //4621 #CJK UNIFIED IDEOGRAPH
+ {0x997D, 0x6AA5}, //4622 #CJK UNIFIED IDEOGRAPH
+ {0x997E, 0x6AA6}, //4623 #CJK UNIFIED IDEOGRAPH
+ {0x9980, 0x6AA7}, //4624 #CJK UNIFIED IDEOGRAPH
+ {0x9981, 0x6AA8}, //4625 #CJK UNIFIED IDEOGRAPH
+ {0x9982, 0x6AAA}, //4626 #CJK UNIFIED IDEOGRAPH
+ {0x9983, 0x6AAD}, //4627 #CJK UNIFIED IDEOGRAPH
+ {0x9984, 0x6AAE}, //4628 #CJK UNIFIED IDEOGRAPH
+ {0x9985, 0x6AAF}, //4629 #CJK UNIFIED IDEOGRAPH
+ {0x9986, 0x6AB0}, //4630 #CJK UNIFIED IDEOGRAPH
+ {0x9987, 0x6AB1}, //4631 #CJK UNIFIED IDEOGRAPH
+ {0x9988, 0x6AB2}, //4632 #CJK UNIFIED IDEOGRAPH
+ {0x9989, 0x6AB3}, //4633 #CJK UNIFIED IDEOGRAPH
+ {0x998A, 0x6AB4}, //4634 #CJK UNIFIED IDEOGRAPH
+ {0x998B, 0x6AB5}, //4635 #CJK UNIFIED IDEOGRAPH
+ {0x998C, 0x6AB6}, //4636 #CJK UNIFIED IDEOGRAPH
+ {0x998D, 0x6AB7}, //4637 #CJK UNIFIED IDEOGRAPH
+ {0x998E, 0x6AB8}, //4638 #CJK UNIFIED IDEOGRAPH
+ {0x998F, 0x6AB9}, //4639 #CJK UNIFIED IDEOGRAPH
+ {0x9990, 0x6ABA}, //4640 #CJK UNIFIED IDEOGRAPH
+ {0x9991, 0x6ABB}, //4641 #CJK UNIFIED IDEOGRAPH
+ {0x9992, 0x6ABC}, //4642 #CJK UNIFIED IDEOGRAPH
+ {0x9993, 0x6ABD}, //4643 #CJK UNIFIED IDEOGRAPH
+ {0x9994, 0x6ABE}, //4644 #CJK UNIFIED IDEOGRAPH
+ {0x9995, 0x6ABF}, //4645 #CJK UNIFIED IDEOGRAPH
+ {0x9996, 0x6AC0}, //4646 #CJK UNIFIED IDEOGRAPH
+ {0x9997, 0x6AC1}, //4647 #CJK UNIFIED IDEOGRAPH
+ {0x9998, 0x6AC2}, //4648 #CJK UNIFIED IDEOGRAPH
+ {0x9999, 0x6AC3}, //4649 #CJK UNIFIED IDEOGRAPH
+ {0x999A, 0x6AC4}, //4650 #CJK UNIFIED IDEOGRAPH
+ {0x999B, 0x6AC5}, //4651 #CJK UNIFIED IDEOGRAPH
+ {0x999C, 0x6AC6}, //4652 #CJK UNIFIED IDEOGRAPH
+ {0x999D, 0x6AC7}, //4653 #CJK UNIFIED IDEOGRAPH
+ {0x999E, 0x6AC8}, //4654 #CJK UNIFIED IDEOGRAPH
+ {0x999F, 0x6AC9}, //4655 #CJK UNIFIED IDEOGRAPH
+ {0x99A0, 0x6ACA}, //4656 #CJK UNIFIED IDEOGRAPH
+ {0x99A1, 0x6ACB}, //4657 #CJK UNIFIED IDEOGRAPH
+ {0x99A2, 0x6ACC}, //4658 #CJK UNIFIED IDEOGRAPH
+ {0x99A3, 0x6ACD}, //4659 #CJK UNIFIED IDEOGRAPH
+ {0x99A4, 0x6ACE}, //4660 #CJK UNIFIED IDEOGRAPH
+ {0x99A5, 0x6ACF}, //4661 #CJK UNIFIED IDEOGRAPH
+ {0x99A6, 0x6AD0}, //4662 #CJK UNIFIED IDEOGRAPH
+ {0x99A7, 0x6AD1}, //4663 #CJK UNIFIED IDEOGRAPH
+ {0x99A8, 0x6AD2}, //4664 #CJK UNIFIED IDEOGRAPH
+ {0x99A9, 0x6AD3}, //4665 #CJK UNIFIED IDEOGRAPH
+ {0x99AA, 0x6AD4}, //4666 #CJK UNIFIED IDEOGRAPH
+ {0x99AB, 0x6AD5}, //4667 #CJK UNIFIED IDEOGRAPH
+ {0x99AC, 0x6AD6}, //4668 #CJK UNIFIED IDEOGRAPH
+ {0x99AD, 0x6AD7}, //4669 #CJK UNIFIED IDEOGRAPH
+ {0x99AE, 0x6AD8}, //4670 #CJK UNIFIED IDEOGRAPH
+ {0x99AF, 0x6AD9}, //4671 #CJK UNIFIED IDEOGRAPH
+ {0x99B0, 0x6ADA}, //4672 #CJK UNIFIED IDEOGRAPH
+ {0x99B1, 0x6ADB}, //4673 #CJK UNIFIED IDEOGRAPH
+ {0x99B2, 0x6ADC}, //4674 #CJK UNIFIED IDEOGRAPH
+ {0x99B3, 0x6ADD}, //4675 #CJK UNIFIED IDEOGRAPH
+ {0x99B4, 0x6ADE}, //4676 #CJK UNIFIED IDEOGRAPH
+ {0x99B5, 0x6ADF}, //4677 #CJK UNIFIED IDEOGRAPH
+ {0x99B6, 0x6AE0}, //4678 #CJK UNIFIED IDEOGRAPH
+ {0x99B7, 0x6AE1}, //4679 #CJK UNIFIED IDEOGRAPH
+ {0x99B8, 0x6AE2}, //4680 #CJK UNIFIED IDEOGRAPH
+ {0x99B9, 0x6AE3}, //4681 #CJK UNIFIED IDEOGRAPH
+ {0x99BA, 0x6AE4}, //4682 #CJK UNIFIED IDEOGRAPH
+ {0x99BB, 0x6AE5}, //4683 #CJK UNIFIED IDEOGRAPH
+ {0x99BC, 0x6AE6}, //4684 #CJK UNIFIED IDEOGRAPH
+ {0x99BD, 0x6AE7}, //4685 #CJK UNIFIED IDEOGRAPH
+ {0x99BE, 0x6AE8}, //4686 #CJK UNIFIED IDEOGRAPH
+ {0x99BF, 0x6AE9}, //4687 #CJK UNIFIED IDEOGRAPH
+ {0x99C0, 0x6AEA}, //4688 #CJK UNIFIED IDEOGRAPH
+ {0x99C1, 0x6AEB}, //4689 #CJK UNIFIED IDEOGRAPH
+ {0x99C2, 0x6AEC}, //4690 #CJK UNIFIED IDEOGRAPH
+ {0x99C3, 0x6AED}, //4691 #CJK UNIFIED IDEOGRAPH
+ {0x99C4, 0x6AEE}, //4692 #CJK UNIFIED IDEOGRAPH
+ {0x99C5, 0x6AEF}, //4693 #CJK UNIFIED IDEOGRAPH
+ {0x99C6, 0x6AF0}, //4694 #CJK UNIFIED IDEOGRAPH
+ {0x99C7, 0x6AF1}, //4695 #CJK UNIFIED IDEOGRAPH
+ {0x99C8, 0x6AF2}, //4696 #CJK UNIFIED IDEOGRAPH
+ {0x99C9, 0x6AF3}, //4697 #CJK UNIFIED IDEOGRAPH
+ {0x99CA, 0x6AF4}, //4698 #CJK UNIFIED IDEOGRAPH
+ {0x99CB, 0x6AF5}, //4699 #CJK UNIFIED IDEOGRAPH
+ {0x99CC, 0x6AF6}, //4700 #CJK UNIFIED IDEOGRAPH
+ {0x99CD, 0x6AF7}, //4701 #CJK UNIFIED IDEOGRAPH
+ {0x99CE, 0x6AF8}, //4702 #CJK UNIFIED IDEOGRAPH
+ {0x99CF, 0x6AF9}, //4703 #CJK UNIFIED IDEOGRAPH
+ {0x99D0, 0x6AFA}, //4704 #CJK UNIFIED IDEOGRAPH
+ {0x99D1, 0x6AFB}, //4705 #CJK UNIFIED IDEOGRAPH
+ {0x99D2, 0x6AFC}, //4706 #CJK UNIFIED IDEOGRAPH
+ {0x99D3, 0x6AFD}, //4707 #CJK UNIFIED IDEOGRAPH
+ {0x99D4, 0x6AFE}, //4708 #CJK UNIFIED IDEOGRAPH
+ {0x99D5, 0x6AFF}, //4709 #CJK UNIFIED IDEOGRAPH
+ {0x99D6, 0x6B00}, //4710 #CJK UNIFIED IDEOGRAPH
+ {0x99D7, 0x6B01}, //4711 #CJK UNIFIED IDEOGRAPH
+ {0x99D8, 0x6B02}, //4712 #CJK UNIFIED IDEOGRAPH
+ {0x99D9, 0x6B03}, //4713 #CJK UNIFIED IDEOGRAPH
+ {0x99DA, 0x6B04}, //4714 #CJK UNIFIED IDEOGRAPH
+ {0x99DB, 0x6B05}, //4715 #CJK UNIFIED IDEOGRAPH
+ {0x99DC, 0x6B06}, //4716 #CJK UNIFIED IDEOGRAPH
+ {0x99DD, 0x6B07}, //4717 #CJK UNIFIED IDEOGRAPH
+ {0x99DE, 0x6B08}, //4718 #CJK UNIFIED IDEOGRAPH
+ {0x99DF, 0x6B09}, //4719 #CJK UNIFIED IDEOGRAPH
+ {0x99E0, 0x6B0A}, //4720 #CJK UNIFIED IDEOGRAPH
+ {0x99E1, 0x6B0B}, //4721 #CJK UNIFIED IDEOGRAPH
+ {0x99E2, 0x6B0C}, //4722 #CJK UNIFIED IDEOGRAPH
+ {0x99E3, 0x6B0D}, //4723 #CJK UNIFIED IDEOGRAPH
+ {0x99E4, 0x6B0E}, //4724 #CJK UNIFIED IDEOGRAPH
+ {0x99E5, 0x6B0F}, //4725 #CJK UNIFIED IDEOGRAPH
+ {0x99E6, 0x6B10}, //4726 #CJK UNIFIED IDEOGRAPH
+ {0x99E7, 0x6B11}, //4727 #CJK UNIFIED IDEOGRAPH
+ {0x99E8, 0x6B12}, //4728 #CJK UNIFIED IDEOGRAPH
+ {0x99E9, 0x6B13}, //4729 #CJK UNIFIED IDEOGRAPH
+ {0x99EA, 0x6B14}, //4730 #CJK UNIFIED IDEOGRAPH
+ {0x99EB, 0x6B15}, //4731 #CJK UNIFIED IDEOGRAPH
+ {0x99EC, 0x6B16}, //4732 #CJK UNIFIED IDEOGRAPH
+ {0x99ED, 0x6B17}, //4733 #CJK UNIFIED IDEOGRAPH
+ {0x99EE, 0x6B18}, //4734 #CJK UNIFIED IDEOGRAPH
+ {0x99EF, 0x6B19}, //4735 #CJK UNIFIED IDEOGRAPH
+ {0x99F0, 0x6B1A}, //4736 #CJK UNIFIED IDEOGRAPH
+ {0x99F1, 0x6B1B}, //4737 #CJK UNIFIED IDEOGRAPH
+ {0x99F2, 0x6B1C}, //4738 #CJK UNIFIED IDEOGRAPH
+ {0x99F3, 0x6B1D}, //4739 #CJK UNIFIED IDEOGRAPH
+ {0x99F4, 0x6B1E}, //4740 #CJK UNIFIED IDEOGRAPH
+ {0x99F5, 0x6B1F}, //4741 #CJK UNIFIED IDEOGRAPH
+ {0x99F6, 0x6B25}, //4742 #CJK UNIFIED IDEOGRAPH
+ {0x99F7, 0x6B26}, //4743 #CJK UNIFIED IDEOGRAPH
+ {0x99F8, 0x6B28}, //4744 #CJK UNIFIED IDEOGRAPH
+ {0x99F9, 0x6B29}, //4745 #CJK UNIFIED IDEOGRAPH
+ {0x99FA, 0x6B2A}, //4746 #CJK UNIFIED IDEOGRAPH
+ {0x99FB, 0x6B2B}, //4747 #CJK UNIFIED IDEOGRAPH
+ {0x99FC, 0x6B2C}, //4748 #CJK UNIFIED IDEOGRAPH
+ {0x99FD, 0x6B2D}, //4749 #CJK UNIFIED IDEOGRAPH
+ {0x99FE, 0x6B2E}, //4750 #CJK UNIFIED IDEOGRAPH
+ {0x9A40, 0x6B2F}, //4751 #CJK UNIFIED IDEOGRAPH
+ {0x9A41, 0x6B30}, //4752 #CJK UNIFIED IDEOGRAPH
+ {0x9A42, 0x6B31}, //4753 #CJK UNIFIED IDEOGRAPH
+ {0x9A43, 0x6B33}, //4754 #CJK UNIFIED IDEOGRAPH
+ {0x9A44, 0x6B34}, //4755 #CJK UNIFIED IDEOGRAPH
+ {0x9A45, 0x6B35}, //4756 #CJK UNIFIED IDEOGRAPH
+ {0x9A46, 0x6B36}, //4757 #CJK UNIFIED IDEOGRAPH
+ {0x9A47, 0x6B38}, //4758 #CJK UNIFIED IDEOGRAPH
+ {0x9A48, 0x6B3B}, //4759 #CJK UNIFIED IDEOGRAPH
+ {0x9A49, 0x6B3C}, //4760 #CJK UNIFIED IDEOGRAPH
+ {0x9A4A, 0x6B3D}, //4761 #CJK UNIFIED IDEOGRAPH
+ {0x9A4B, 0x6B3F}, //4762 #CJK UNIFIED IDEOGRAPH
+ {0x9A4C, 0x6B40}, //4763 #CJK UNIFIED IDEOGRAPH
+ {0x9A4D, 0x6B41}, //4764 #CJK UNIFIED IDEOGRAPH
+ {0x9A4E, 0x6B42}, //4765 #CJK UNIFIED IDEOGRAPH
+ {0x9A4F, 0x6B44}, //4766 #CJK UNIFIED IDEOGRAPH
+ {0x9A50, 0x6B45}, //4767 #CJK UNIFIED IDEOGRAPH
+ {0x9A51, 0x6B48}, //4768 #CJK UNIFIED IDEOGRAPH
+ {0x9A52, 0x6B4A}, //4769 #CJK UNIFIED IDEOGRAPH
+ {0x9A53, 0x6B4B}, //4770 #CJK UNIFIED IDEOGRAPH
+ {0x9A54, 0x6B4D}, //4771 #CJK UNIFIED IDEOGRAPH
+ {0x9A55, 0x6B4E}, //4772 #CJK UNIFIED IDEOGRAPH
+ {0x9A56, 0x6B4F}, //4773 #CJK UNIFIED IDEOGRAPH
+ {0x9A57, 0x6B50}, //4774 #CJK UNIFIED IDEOGRAPH
+ {0x9A58, 0x6B51}, //4775 #CJK UNIFIED IDEOGRAPH
+ {0x9A59, 0x6B52}, //4776 #CJK UNIFIED IDEOGRAPH
+ {0x9A5A, 0x6B53}, //4777 #CJK UNIFIED IDEOGRAPH
+ {0x9A5B, 0x6B54}, //4778 #CJK UNIFIED IDEOGRAPH
+ {0x9A5C, 0x6B55}, //4779 #CJK UNIFIED IDEOGRAPH
+ {0x9A5D, 0x6B56}, //4780 #CJK UNIFIED IDEOGRAPH
+ {0x9A5E, 0x6B57}, //4781 #CJK UNIFIED IDEOGRAPH
+ {0x9A5F, 0x6B58}, //4782 #CJK UNIFIED IDEOGRAPH
+ {0x9A60, 0x6B5A}, //4783 #CJK UNIFIED IDEOGRAPH
+ {0x9A61, 0x6B5B}, //4784 #CJK UNIFIED IDEOGRAPH
+ {0x9A62, 0x6B5C}, //4785 #CJK UNIFIED IDEOGRAPH
+ {0x9A63, 0x6B5D}, //4786 #CJK UNIFIED IDEOGRAPH
+ {0x9A64, 0x6B5E}, //4787 #CJK UNIFIED IDEOGRAPH
+ {0x9A65, 0x6B5F}, //4788 #CJK UNIFIED IDEOGRAPH
+ {0x9A66, 0x6B60}, //4789 #CJK UNIFIED IDEOGRAPH
+ {0x9A67, 0x6B61}, //4790 #CJK UNIFIED IDEOGRAPH
+ {0x9A68, 0x6B68}, //4791 #CJK UNIFIED IDEOGRAPH
+ {0x9A69, 0x6B69}, //4792 #CJK UNIFIED IDEOGRAPH
+ {0x9A6A, 0x6B6B}, //4793 #CJK UNIFIED IDEOGRAPH
+ {0x9A6B, 0x6B6C}, //4794 #CJK UNIFIED IDEOGRAPH
+ {0x9A6C, 0x6B6D}, //4795 #CJK UNIFIED IDEOGRAPH
+ {0x9A6D, 0x6B6E}, //4796 #CJK UNIFIED IDEOGRAPH
+ {0x9A6E, 0x6B6F}, //4797 #CJK UNIFIED IDEOGRAPH
+ {0x9A6F, 0x6B70}, //4798 #CJK UNIFIED IDEOGRAPH
+ {0x9A70, 0x6B71}, //4799 #CJK UNIFIED IDEOGRAPH
+ {0x9A71, 0x6B72}, //4800 #CJK UNIFIED IDEOGRAPH
+ {0x9A72, 0x6B73}, //4801 #CJK UNIFIED IDEOGRAPH
+ {0x9A73, 0x6B74}, //4802 #CJK UNIFIED IDEOGRAPH
+ {0x9A74, 0x6B75}, //4803 #CJK UNIFIED IDEOGRAPH
+ {0x9A75, 0x6B76}, //4804 #CJK UNIFIED IDEOGRAPH
+ {0x9A76, 0x6B77}, //4805 #CJK UNIFIED IDEOGRAPH
+ {0x9A77, 0x6B78}, //4806 #CJK UNIFIED IDEOGRAPH
+ {0x9A78, 0x6B7A}, //4807 #CJK UNIFIED IDEOGRAPH
+ {0x9A79, 0x6B7D}, //4808 #CJK UNIFIED IDEOGRAPH
+ {0x9A7A, 0x6B7E}, //4809 #CJK UNIFIED IDEOGRAPH
+ {0x9A7B, 0x6B7F}, //4810 #CJK UNIFIED IDEOGRAPH
+ {0x9A7C, 0x6B80}, //4811 #CJK UNIFIED IDEOGRAPH
+ {0x9A7D, 0x6B85}, //4812 #CJK UNIFIED IDEOGRAPH
+ {0x9A7E, 0x6B88}, //4813 #CJK UNIFIED IDEOGRAPH
+ {0x9A80, 0x6B8C}, //4814 #CJK UNIFIED IDEOGRAPH
+ {0x9A81, 0x6B8E}, //4815 #CJK UNIFIED IDEOGRAPH
+ {0x9A82, 0x6B8F}, //4816 #CJK UNIFIED IDEOGRAPH
+ {0x9A83, 0x6B90}, //4817 #CJK UNIFIED IDEOGRAPH
+ {0x9A84, 0x6B91}, //4818 #CJK UNIFIED IDEOGRAPH
+ {0x9A85, 0x6B94}, //4819 #CJK UNIFIED IDEOGRAPH
+ {0x9A86, 0x6B95}, //4820 #CJK UNIFIED IDEOGRAPH
+ {0x9A87, 0x6B97}, //4821 #CJK UNIFIED IDEOGRAPH
+ {0x9A88, 0x6B98}, //4822 #CJK UNIFIED IDEOGRAPH
+ {0x9A89, 0x6B99}, //4823 #CJK UNIFIED IDEOGRAPH
+ {0x9A8A, 0x6B9C}, //4824 #CJK UNIFIED IDEOGRAPH
+ {0x9A8B, 0x6B9D}, //4825 #CJK UNIFIED IDEOGRAPH
+ {0x9A8C, 0x6B9E}, //4826 #CJK UNIFIED IDEOGRAPH
+ {0x9A8D, 0x6B9F}, //4827 #CJK UNIFIED IDEOGRAPH
+ {0x9A8E, 0x6BA0}, //4828 #CJK UNIFIED IDEOGRAPH
+ {0x9A8F, 0x6BA2}, //4829 #CJK UNIFIED IDEOGRAPH
+ {0x9A90, 0x6BA3}, //4830 #CJK UNIFIED IDEOGRAPH
+ {0x9A91, 0x6BA4}, //4831 #CJK UNIFIED IDEOGRAPH
+ {0x9A92, 0x6BA5}, //4832 #CJK UNIFIED IDEOGRAPH
+ {0x9A93, 0x6BA6}, //4833 #CJK UNIFIED IDEOGRAPH
+ {0x9A94, 0x6BA7}, //4834 #CJK UNIFIED IDEOGRAPH
+ {0x9A95, 0x6BA8}, //4835 #CJK UNIFIED IDEOGRAPH
+ {0x9A96, 0x6BA9}, //4836 #CJK UNIFIED IDEOGRAPH
+ {0x9A97, 0x6BAB}, //4837 #CJK UNIFIED IDEOGRAPH
+ {0x9A98, 0x6BAC}, //4838 #CJK UNIFIED IDEOGRAPH
+ {0x9A99, 0x6BAD}, //4839 #CJK UNIFIED IDEOGRAPH
+ {0x9A9A, 0x6BAE}, //4840 #CJK UNIFIED IDEOGRAPH
+ {0x9A9B, 0x6BAF}, //4841 #CJK UNIFIED IDEOGRAPH
+ {0x9A9C, 0x6BB0}, //4842 #CJK UNIFIED IDEOGRAPH
+ {0x9A9D, 0x6BB1}, //4843 #CJK UNIFIED IDEOGRAPH
+ {0x9A9E, 0x6BB2}, //4844 #CJK UNIFIED IDEOGRAPH
+ {0x9A9F, 0x6BB6}, //4845 #CJK UNIFIED IDEOGRAPH
+ {0x9AA0, 0x6BB8}, //4846 #CJK UNIFIED IDEOGRAPH
+ {0x9AA1, 0x6BB9}, //4847 #CJK UNIFIED IDEOGRAPH
+ {0x9AA2, 0x6BBA}, //4848 #CJK UNIFIED IDEOGRAPH
+ {0x9AA3, 0x6BBB}, //4849 #CJK UNIFIED IDEOGRAPH
+ {0x9AA4, 0x6BBC}, //4850 #CJK UNIFIED IDEOGRAPH
+ {0x9AA5, 0x6BBD}, //4851 #CJK UNIFIED IDEOGRAPH
+ {0x9AA6, 0x6BBE}, //4852 #CJK UNIFIED IDEOGRAPH
+ {0x9AA7, 0x6BC0}, //4853 #CJK UNIFIED IDEOGRAPH
+ {0x9AA8, 0x6BC3}, //4854 #CJK UNIFIED IDEOGRAPH
+ {0x9AA9, 0x6BC4}, //4855 #CJK UNIFIED IDEOGRAPH
+ {0x9AAA, 0x6BC6}, //4856 #CJK UNIFIED IDEOGRAPH
+ {0x9AAB, 0x6BC7}, //4857 #CJK UNIFIED IDEOGRAPH
+ {0x9AAC, 0x6BC8}, //4858 #CJK UNIFIED IDEOGRAPH
+ {0x9AAD, 0x6BC9}, //4859 #CJK UNIFIED IDEOGRAPH
+ {0x9AAE, 0x6BCA}, //4860 #CJK UNIFIED IDEOGRAPH
+ {0x9AAF, 0x6BCC}, //4861 #CJK UNIFIED IDEOGRAPH
+ {0x9AB0, 0x6BCE}, //4862 #CJK UNIFIED IDEOGRAPH
+ {0x9AB1, 0x6BD0}, //4863 #CJK UNIFIED IDEOGRAPH
+ {0x9AB2, 0x6BD1}, //4864 #CJK UNIFIED IDEOGRAPH
+ {0x9AB3, 0x6BD8}, //4865 #CJK UNIFIED IDEOGRAPH
+ {0x9AB4, 0x6BDA}, //4866 #CJK UNIFIED IDEOGRAPH
+ {0x9AB5, 0x6BDC}, //4867 #CJK UNIFIED IDEOGRAPH
+ {0x9AB6, 0x6BDD}, //4868 #CJK UNIFIED IDEOGRAPH
+ {0x9AB7, 0x6BDE}, //4869 #CJK UNIFIED IDEOGRAPH
+ {0x9AB8, 0x6BDF}, //4870 #CJK UNIFIED IDEOGRAPH
+ {0x9AB9, 0x6BE0}, //4871 #CJK UNIFIED IDEOGRAPH
+ {0x9ABA, 0x6BE2}, //4872 #CJK UNIFIED IDEOGRAPH
+ {0x9ABB, 0x6BE3}, //4873 #CJK UNIFIED IDEOGRAPH
+ {0x9ABC, 0x6BE4}, //4874 #CJK UNIFIED IDEOGRAPH
+ {0x9ABD, 0x6BE5}, //4875 #CJK UNIFIED IDEOGRAPH
+ {0x9ABE, 0x6BE6}, //4876 #CJK UNIFIED IDEOGRAPH
+ {0x9ABF, 0x6BE7}, //4877 #CJK UNIFIED IDEOGRAPH
+ {0x9AC0, 0x6BE8}, //4878 #CJK UNIFIED IDEOGRAPH
+ {0x9AC1, 0x6BE9}, //4879 #CJK UNIFIED IDEOGRAPH
+ {0x9AC2, 0x6BEC}, //4880 #CJK UNIFIED IDEOGRAPH
+ {0x9AC3, 0x6BED}, //4881 #CJK UNIFIED IDEOGRAPH
+ {0x9AC4, 0x6BEE}, //4882 #CJK UNIFIED IDEOGRAPH
+ {0x9AC5, 0x6BF0}, //4883 #CJK UNIFIED IDEOGRAPH
+ {0x9AC6, 0x6BF1}, //4884 #CJK UNIFIED IDEOGRAPH
+ {0x9AC7, 0x6BF2}, //4885 #CJK UNIFIED IDEOGRAPH
+ {0x9AC8, 0x6BF4}, //4886 #CJK UNIFIED IDEOGRAPH
+ {0x9AC9, 0x6BF6}, //4887 #CJK UNIFIED IDEOGRAPH
+ {0x9ACA, 0x6BF7}, //4888 #CJK UNIFIED IDEOGRAPH
+ {0x9ACB, 0x6BF8}, //4889 #CJK UNIFIED IDEOGRAPH
+ {0x9ACC, 0x6BFA}, //4890 #CJK UNIFIED IDEOGRAPH
+ {0x9ACD, 0x6BFB}, //4891 #CJK UNIFIED IDEOGRAPH
+ {0x9ACE, 0x6BFC}, //4892 #CJK UNIFIED IDEOGRAPH
+ {0x9ACF, 0x6BFE}, //4893 #CJK UNIFIED IDEOGRAPH
+ {0x9AD0, 0x6BFF}, //4894 #CJK UNIFIED IDEOGRAPH
+ {0x9AD1, 0x6C00}, //4895 #CJK UNIFIED IDEOGRAPH
+ {0x9AD2, 0x6C01}, //4896 #CJK UNIFIED IDEOGRAPH
+ {0x9AD3, 0x6C02}, //4897 #CJK UNIFIED IDEOGRAPH
+ {0x9AD4, 0x6C03}, //4898 #CJK UNIFIED IDEOGRAPH
+ {0x9AD5, 0x6C04}, //4899 #CJK UNIFIED IDEOGRAPH
+ {0x9AD6, 0x6C08}, //4900 #CJK UNIFIED IDEOGRAPH
+ {0x9AD7, 0x6C09}, //4901 #CJK UNIFIED IDEOGRAPH
+ {0x9AD8, 0x6C0A}, //4902 #CJK UNIFIED IDEOGRAPH
+ {0x9AD9, 0x6C0B}, //4903 #CJK UNIFIED IDEOGRAPH
+ {0x9ADA, 0x6C0C}, //4904 #CJK UNIFIED IDEOGRAPH
+ {0x9ADB, 0x6C0E}, //4905 #CJK UNIFIED IDEOGRAPH
+ {0x9ADC, 0x6C12}, //4906 #CJK UNIFIED IDEOGRAPH
+ {0x9ADD, 0x6C17}, //4907 #CJK UNIFIED IDEOGRAPH
+ {0x9ADE, 0x6C1C}, //4908 #CJK UNIFIED IDEOGRAPH
+ {0x9ADF, 0x6C1D}, //4909 #CJK UNIFIED IDEOGRAPH
+ {0x9AE0, 0x6C1E}, //4910 #CJK UNIFIED IDEOGRAPH
+ {0x9AE1, 0x6C20}, //4911 #CJK UNIFIED IDEOGRAPH
+ {0x9AE2, 0x6C23}, //4912 #CJK UNIFIED IDEOGRAPH
+ {0x9AE3, 0x6C25}, //4913 #CJK UNIFIED IDEOGRAPH
+ {0x9AE4, 0x6C2B}, //4914 #CJK UNIFIED IDEOGRAPH
+ {0x9AE5, 0x6C2C}, //4915 #CJK UNIFIED IDEOGRAPH
+ {0x9AE6, 0x6C2D}, //4916 #CJK UNIFIED IDEOGRAPH
+ {0x9AE7, 0x6C31}, //4917 #CJK UNIFIED IDEOGRAPH
+ {0x9AE8, 0x6C33}, //4918 #CJK UNIFIED IDEOGRAPH
+ {0x9AE9, 0x6C36}, //4919 #CJK UNIFIED IDEOGRAPH
+ {0x9AEA, 0x6C37}, //4920 #CJK UNIFIED IDEOGRAPH
+ {0x9AEB, 0x6C39}, //4921 #CJK UNIFIED IDEOGRAPH
+ {0x9AEC, 0x6C3A}, //4922 #CJK UNIFIED IDEOGRAPH
+ {0x9AED, 0x6C3B}, //4923 #CJK UNIFIED IDEOGRAPH
+ {0x9AEE, 0x6C3C}, //4924 #CJK UNIFIED IDEOGRAPH
+ {0x9AEF, 0x6C3E}, //4925 #CJK UNIFIED IDEOGRAPH
+ {0x9AF0, 0x6C3F}, //4926 #CJK UNIFIED IDEOGRAPH
+ {0x9AF1, 0x6C43}, //4927 #CJK UNIFIED IDEOGRAPH
+ {0x9AF2, 0x6C44}, //4928 #CJK UNIFIED IDEOGRAPH
+ {0x9AF3, 0x6C45}, //4929 #CJK UNIFIED IDEOGRAPH
+ {0x9AF4, 0x6C48}, //4930 #CJK UNIFIED IDEOGRAPH
+ {0x9AF5, 0x6C4B}, //4931 #CJK UNIFIED IDEOGRAPH
+ {0x9AF6, 0x6C4C}, //4932 #CJK UNIFIED IDEOGRAPH
+ {0x9AF7, 0x6C4D}, //4933 #CJK UNIFIED IDEOGRAPH
+ {0x9AF8, 0x6C4E}, //4934 #CJK UNIFIED IDEOGRAPH
+ {0x9AF9, 0x6C4F}, //4935 #CJK UNIFIED IDEOGRAPH
+ {0x9AFA, 0x6C51}, //4936 #CJK UNIFIED IDEOGRAPH
+ {0x9AFB, 0x6C52}, //4937 #CJK UNIFIED IDEOGRAPH
+ {0x9AFC, 0x6C53}, //4938 #CJK UNIFIED IDEOGRAPH
+ {0x9AFD, 0x6C56}, //4939 #CJK UNIFIED IDEOGRAPH
+ {0x9AFE, 0x6C58}, //4940 #CJK UNIFIED IDEOGRAPH
+ {0x9B40, 0x6C59}, //4941 #CJK UNIFIED IDEOGRAPH
+ {0x9B41, 0x6C5A}, //4942 #CJK UNIFIED IDEOGRAPH
+ {0x9B42, 0x6C62}, //4943 #CJK UNIFIED IDEOGRAPH
+ {0x9B43, 0x6C63}, //4944 #CJK UNIFIED IDEOGRAPH
+ {0x9B44, 0x6C65}, //4945 #CJK UNIFIED IDEOGRAPH
+ {0x9B45, 0x6C66}, //4946 #CJK UNIFIED IDEOGRAPH
+ {0x9B46, 0x6C67}, //4947 #CJK UNIFIED IDEOGRAPH
+ {0x9B47, 0x6C6B}, //4948 #CJK UNIFIED IDEOGRAPH
+ {0x9B48, 0x6C6C}, //4949 #CJK UNIFIED IDEOGRAPH
+ {0x9B49, 0x6C6D}, //4950 #CJK UNIFIED IDEOGRAPH
+ {0x9B4A, 0x6C6E}, //4951 #CJK UNIFIED IDEOGRAPH
+ {0x9B4B, 0x6C6F}, //4952 #CJK UNIFIED IDEOGRAPH
+ {0x9B4C, 0x6C71}, //4953 #CJK UNIFIED IDEOGRAPH
+ {0x9B4D, 0x6C73}, //4954 #CJK UNIFIED IDEOGRAPH
+ {0x9B4E, 0x6C75}, //4955 #CJK UNIFIED IDEOGRAPH
+ {0x9B4F, 0x6C77}, //4956 #CJK UNIFIED IDEOGRAPH
+ {0x9B50, 0x6C78}, //4957 #CJK UNIFIED IDEOGRAPH
+ {0x9B51, 0x6C7A}, //4958 #CJK UNIFIED IDEOGRAPH
+ {0x9B52, 0x6C7B}, //4959 #CJK UNIFIED IDEOGRAPH
+ {0x9B53, 0x6C7C}, //4960 #CJK UNIFIED IDEOGRAPH
+ {0x9B54, 0x6C7F}, //4961 #CJK UNIFIED IDEOGRAPH
+ {0x9B55, 0x6C80}, //4962 #CJK UNIFIED IDEOGRAPH
+ {0x9B56, 0x6C84}, //4963 #CJK UNIFIED IDEOGRAPH
+ {0x9B57, 0x6C87}, //4964 #CJK UNIFIED IDEOGRAPH
+ {0x9B58, 0x6C8A}, //4965 #CJK UNIFIED IDEOGRAPH
+ {0x9B59, 0x6C8B}, //4966 #CJK UNIFIED IDEOGRAPH
+ {0x9B5A, 0x6C8D}, //4967 #CJK UNIFIED IDEOGRAPH
+ {0x9B5B, 0x6C8E}, //4968 #CJK UNIFIED IDEOGRAPH
+ {0x9B5C, 0x6C91}, //4969 #CJK UNIFIED IDEOGRAPH
+ {0x9B5D, 0x6C92}, //4970 #CJK UNIFIED IDEOGRAPH
+ {0x9B5E, 0x6C95}, //4971 #CJK UNIFIED IDEOGRAPH
+ {0x9B5F, 0x6C96}, //4972 #CJK UNIFIED IDEOGRAPH
+ {0x9B60, 0x6C97}, //4973 #CJK UNIFIED IDEOGRAPH
+ {0x9B61, 0x6C98}, //4974 #CJK UNIFIED IDEOGRAPH
+ {0x9B62, 0x6C9A}, //4975 #CJK UNIFIED IDEOGRAPH
+ {0x9B63, 0x6C9C}, //4976 #CJK UNIFIED IDEOGRAPH
+ {0x9B64, 0x6C9D}, //4977 #CJK UNIFIED IDEOGRAPH
+ {0x9B65, 0x6C9E}, //4978 #CJK UNIFIED IDEOGRAPH
+ {0x9B66, 0x6CA0}, //4979 #CJK UNIFIED IDEOGRAPH
+ {0x9B67, 0x6CA2}, //4980 #CJK UNIFIED IDEOGRAPH
+ {0x9B68, 0x6CA8}, //4981 #CJK UNIFIED IDEOGRAPH
+ {0x9B69, 0x6CAC}, //4982 #CJK UNIFIED IDEOGRAPH
+ {0x9B6A, 0x6CAF}, //4983 #CJK UNIFIED IDEOGRAPH
+ {0x9B6B, 0x6CB0}, //4984 #CJK UNIFIED IDEOGRAPH
+ {0x9B6C, 0x6CB4}, //4985 #CJK UNIFIED IDEOGRAPH
+ {0x9B6D, 0x6CB5}, //4986 #CJK UNIFIED IDEOGRAPH
+ {0x9B6E, 0x6CB6}, //4987 #CJK UNIFIED IDEOGRAPH
+ {0x9B6F, 0x6CB7}, //4988 #CJK UNIFIED IDEOGRAPH
+ {0x9B70, 0x6CBA}, //4989 #CJK UNIFIED IDEOGRAPH
+ {0x9B71, 0x6CC0}, //4990 #CJK UNIFIED IDEOGRAPH
+ {0x9B72, 0x6CC1}, //4991 #CJK UNIFIED IDEOGRAPH
+ {0x9B73, 0x6CC2}, //4992 #CJK UNIFIED IDEOGRAPH
+ {0x9B74, 0x6CC3}, //4993 #CJK UNIFIED IDEOGRAPH
+ {0x9B75, 0x6CC6}, //4994 #CJK UNIFIED IDEOGRAPH
+ {0x9B76, 0x6CC7}, //4995 #CJK UNIFIED IDEOGRAPH
+ {0x9B77, 0x6CC8}, //4996 #CJK UNIFIED IDEOGRAPH
+ {0x9B78, 0x6CCB}, //4997 #CJK UNIFIED IDEOGRAPH
+ {0x9B79, 0x6CCD}, //4998 #CJK UNIFIED IDEOGRAPH
+ {0x9B7A, 0x6CCE}, //4999 #CJK UNIFIED IDEOGRAPH
+ {0x9B7B, 0x6CCF}, //5000 #CJK UNIFIED IDEOGRAPH
+ {0x9B7C, 0x6CD1}, //5001 #CJK UNIFIED IDEOGRAPH
+ {0x9B7D, 0x6CD2}, //5002 #CJK UNIFIED IDEOGRAPH
+ {0x9B7E, 0x6CD8}, //5003 #CJK UNIFIED IDEOGRAPH
+ {0x9B80, 0x6CD9}, //5004 #CJK UNIFIED IDEOGRAPH
+ {0x9B81, 0x6CDA}, //5005 #CJK UNIFIED IDEOGRAPH
+ {0x9B82, 0x6CDC}, //5006 #CJK UNIFIED IDEOGRAPH
+ {0x9B83, 0x6CDD}, //5007 #CJK UNIFIED IDEOGRAPH
+ {0x9B84, 0x6CDF}, //5008 #CJK UNIFIED IDEOGRAPH
+ {0x9B85, 0x6CE4}, //5009 #CJK UNIFIED IDEOGRAPH
+ {0x9B86, 0x6CE6}, //5010 #CJK UNIFIED IDEOGRAPH
+ {0x9B87, 0x6CE7}, //5011 #CJK UNIFIED IDEOGRAPH
+ {0x9B88, 0x6CE9}, //5012 #CJK UNIFIED IDEOGRAPH
+ {0x9B89, 0x6CEC}, //5013 #CJK UNIFIED IDEOGRAPH
+ {0x9B8A, 0x6CED}, //5014 #CJK UNIFIED IDEOGRAPH
+ {0x9B8B, 0x6CF2}, //5015 #CJK UNIFIED IDEOGRAPH
+ {0x9B8C, 0x6CF4}, //5016 #CJK UNIFIED IDEOGRAPH
+ {0x9B8D, 0x6CF9}, //5017 #CJK UNIFIED IDEOGRAPH
+ {0x9B8E, 0x6CFF}, //5018 #CJK UNIFIED IDEOGRAPH
+ {0x9B8F, 0x6D00}, //5019 #CJK UNIFIED IDEOGRAPH
+ {0x9B90, 0x6D02}, //5020 #CJK UNIFIED IDEOGRAPH
+ {0x9B91, 0x6D03}, //5021 #CJK UNIFIED IDEOGRAPH
+ {0x9B92, 0x6D05}, //5022 #CJK UNIFIED IDEOGRAPH
+ {0x9B93, 0x6D06}, //5023 #CJK UNIFIED IDEOGRAPH
+ {0x9B94, 0x6D08}, //5024 #CJK UNIFIED IDEOGRAPH
+ {0x9B95, 0x6D09}, //5025 #CJK UNIFIED IDEOGRAPH
+ {0x9B96, 0x6D0A}, //5026 #CJK UNIFIED IDEOGRAPH
+ {0x9B97, 0x6D0D}, //5027 #CJK UNIFIED IDEOGRAPH
+ {0x9B98, 0x6D0F}, //5028 #CJK UNIFIED IDEOGRAPH
+ {0x9B99, 0x6D10}, //5029 #CJK UNIFIED IDEOGRAPH
+ {0x9B9A, 0x6D11}, //5030 #CJK UNIFIED IDEOGRAPH
+ {0x9B9B, 0x6D13}, //5031 #CJK UNIFIED IDEOGRAPH
+ {0x9B9C, 0x6D14}, //5032 #CJK UNIFIED IDEOGRAPH
+ {0x9B9D, 0x6D15}, //5033 #CJK UNIFIED IDEOGRAPH
+ {0x9B9E, 0x6D16}, //5034 #CJK UNIFIED IDEOGRAPH
+ {0x9B9F, 0x6D18}, //5035 #CJK UNIFIED IDEOGRAPH
+ {0x9BA0, 0x6D1C}, //5036 #CJK UNIFIED IDEOGRAPH
+ {0x9BA1, 0x6D1D}, //5037 #CJK UNIFIED IDEOGRAPH
+ {0x9BA2, 0x6D1F}, //5038 #CJK UNIFIED IDEOGRAPH
+ {0x9BA3, 0x6D20}, //5039 #CJK UNIFIED IDEOGRAPH
+ {0x9BA4, 0x6D21}, //5040 #CJK UNIFIED IDEOGRAPH
+ {0x9BA5, 0x6D22}, //5041 #CJK UNIFIED IDEOGRAPH
+ {0x9BA6, 0x6D23}, //5042 #CJK UNIFIED IDEOGRAPH
+ {0x9BA7, 0x6D24}, //5043 #CJK UNIFIED IDEOGRAPH
+ {0x9BA8, 0x6D26}, //5044 #CJK UNIFIED IDEOGRAPH
+ {0x9BA9, 0x6D28}, //5045 #CJK UNIFIED IDEOGRAPH
+ {0x9BAA, 0x6D29}, //5046 #CJK UNIFIED IDEOGRAPH
+ {0x9BAB, 0x6D2C}, //5047 #CJK UNIFIED IDEOGRAPH
+ {0x9BAC, 0x6D2D}, //5048 #CJK UNIFIED IDEOGRAPH
+ {0x9BAD, 0x6D2F}, //5049 #CJK UNIFIED IDEOGRAPH
+ {0x9BAE, 0x6D30}, //5050 #CJK UNIFIED IDEOGRAPH
+ {0x9BAF, 0x6D34}, //5051 #CJK UNIFIED IDEOGRAPH
+ {0x9BB0, 0x6D36}, //5052 #CJK UNIFIED IDEOGRAPH
+ {0x9BB1, 0x6D37}, //5053 #CJK UNIFIED IDEOGRAPH
+ {0x9BB2, 0x6D38}, //5054 #CJK UNIFIED IDEOGRAPH
+ {0x9BB3, 0x6D3A}, //5055 #CJK UNIFIED IDEOGRAPH
+ {0x9BB4, 0x6D3F}, //5056 #CJK UNIFIED IDEOGRAPH
+ {0x9BB5, 0x6D40}, //5057 #CJK UNIFIED IDEOGRAPH
+ {0x9BB6, 0x6D42}, //5058 #CJK UNIFIED IDEOGRAPH
+ {0x9BB7, 0x6D44}, //5059 #CJK UNIFIED IDEOGRAPH
+ {0x9BB8, 0x6D49}, //5060 #CJK UNIFIED IDEOGRAPH
+ {0x9BB9, 0x6D4C}, //5061 #CJK UNIFIED IDEOGRAPH
+ {0x9BBA, 0x6D50}, //5062 #CJK UNIFIED IDEOGRAPH
+ {0x9BBB, 0x6D55}, //5063 #CJK UNIFIED IDEOGRAPH
+ {0x9BBC, 0x6D56}, //5064 #CJK UNIFIED IDEOGRAPH
+ {0x9BBD, 0x6D57}, //5065 #CJK UNIFIED IDEOGRAPH
+ {0x9BBE, 0x6D58}, //5066 #CJK UNIFIED IDEOGRAPH
+ {0x9BBF, 0x6D5B}, //5067 #CJK UNIFIED IDEOGRAPH
+ {0x9BC0, 0x6D5D}, //5068 #CJK UNIFIED IDEOGRAPH
+ {0x9BC1, 0x6D5F}, //5069 #CJK UNIFIED IDEOGRAPH
+ {0x9BC2, 0x6D61}, //5070 #CJK UNIFIED IDEOGRAPH
+ {0x9BC3, 0x6D62}, //5071 #CJK UNIFIED IDEOGRAPH
+ {0x9BC4, 0x6D64}, //5072 #CJK UNIFIED IDEOGRAPH
+ {0x9BC5, 0x6D65}, //5073 #CJK UNIFIED IDEOGRAPH
+ {0x9BC6, 0x6D67}, //5074 #CJK UNIFIED IDEOGRAPH
+ {0x9BC7, 0x6D68}, //5075 #CJK UNIFIED IDEOGRAPH
+ {0x9BC8, 0x6D6B}, //5076 #CJK UNIFIED IDEOGRAPH
+ {0x9BC9, 0x6D6C}, //5077 #CJK UNIFIED IDEOGRAPH
+ {0x9BCA, 0x6D6D}, //5078 #CJK UNIFIED IDEOGRAPH
+ {0x9BCB, 0x6D70}, //5079 #CJK UNIFIED IDEOGRAPH
+ {0x9BCC, 0x6D71}, //5080 #CJK UNIFIED IDEOGRAPH
+ {0x9BCD, 0x6D72}, //5081 #CJK UNIFIED IDEOGRAPH
+ {0x9BCE, 0x6D73}, //5082 #CJK UNIFIED IDEOGRAPH
+ {0x9BCF, 0x6D75}, //5083 #CJK UNIFIED IDEOGRAPH
+ {0x9BD0, 0x6D76}, //5084 #CJK UNIFIED IDEOGRAPH
+ {0x9BD1, 0x6D79}, //5085 #CJK UNIFIED IDEOGRAPH
+ {0x9BD2, 0x6D7A}, //5086 #CJK UNIFIED IDEOGRAPH
+ {0x9BD3, 0x6D7B}, //5087 #CJK UNIFIED IDEOGRAPH
+ {0x9BD4, 0x6D7D}, //5088 #CJK UNIFIED IDEOGRAPH
+ {0x9BD5, 0x6D7E}, //5089 #CJK UNIFIED IDEOGRAPH
+ {0x9BD6, 0x6D7F}, //5090 #CJK UNIFIED IDEOGRAPH
+ {0x9BD7, 0x6D80}, //5091 #CJK UNIFIED IDEOGRAPH
+ {0x9BD8, 0x6D81}, //5092 #CJK UNIFIED IDEOGRAPH
+ {0x9BD9, 0x6D83}, //5093 #CJK UNIFIED IDEOGRAPH
+ {0x9BDA, 0x6D84}, //5094 #CJK UNIFIED IDEOGRAPH
+ {0x9BDB, 0x6D86}, //5095 #CJK UNIFIED IDEOGRAPH
+ {0x9BDC, 0x6D87}, //5096 #CJK UNIFIED IDEOGRAPH
+ {0x9BDD, 0x6D8A}, //5097 #CJK UNIFIED IDEOGRAPH
+ {0x9BDE, 0x6D8B}, //5098 #CJK UNIFIED IDEOGRAPH
+ {0x9BDF, 0x6D8D}, //5099 #CJK UNIFIED IDEOGRAPH
+ {0x9BE0, 0x6D8F}, //5100 #CJK UNIFIED IDEOGRAPH
+ {0x9BE1, 0x6D90}, //5101 #CJK UNIFIED IDEOGRAPH
+ {0x9BE2, 0x6D92}, //5102 #CJK UNIFIED IDEOGRAPH
+ {0x9BE3, 0x6D96}, //5103 #CJK UNIFIED IDEOGRAPH
+ {0x9BE4, 0x6D97}, //5104 #CJK UNIFIED IDEOGRAPH
+ {0x9BE5, 0x6D98}, //5105 #CJK UNIFIED IDEOGRAPH
+ {0x9BE6, 0x6D99}, //5106 #CJK UNIFIED IDEOGRAPH
+ {0x9BE7, 0x6D9A}, //5107 #CJK UNIFIED IDEOGRAPH
+ {0x9BE8, 0x6D9C}, //5108 #CJK UNIFIED IDEOGRAPH
+ {0x9BE9, 0x6DA2}, //5109 #CJK UNIFIED IDEOGRAPH
+ {0x9BEA, 0x6DA5}, //5110 #CJK UNIFIED IDEOGRAPH
+ {0x9BEB, 0x6DAC}, //5111 #CJK UNIFIED IDEOGRAPH
+ {0x9BEC, 0x6DAD}, //5112 #CJK UNIFIED IDEOGRAPH
+ {0x9BED, 0x6DB0}, //5113 #CJK UNIFIED IDEOGRAPH
+ {0x9BEE, 0x6DB1}, //5114 #CJK UNIFIED IDEOGRAPH
+ {0x9BEF, 0x6DB3}, //5115 #CJK UNIFIED IDEOGRAPH
+ {0x9BF0, 0x6DB4}, //5116 #CJK UNIFIED IDEOGRAPH
+ {0x9BF1, 0x6DB6}, //5117 #CJK UNIFIED IDEOGRAPH
+ {0x9BF2, 0x6DB7}, //5118 #CJK UNIFIED IDEOGRAPH
+ {0x9BF3, 0x6DB9}, //5119 #CJK UNIFIED IDEOGRAPH
+ {0x9BF4, 0x6DBA}, //5120 #CJK UNIFIED IDEOGRAPH
+ {0x9BF5, 0x6DBB}, //5121 #CJK UNIFIED IDEOGRAPH
+ {0x9BF6, 0x6DBC}, //5122 #CJK UNIFIED IDEOGRAPH
+ {0x9BF7, 0x6DBD}, //5123 #CJK UNIFIED IDEOGRAPH
+ {0x9BF8, 0x6DBE}, //5124 #CJK UNIFIED IDEOGRAPH
+ {0x9BF9, 0x6DC1}, //5125 #CJK UNIFIED IDEOGRAPH
+ {0x9BFA, 0x6DC2}, //5126 #CJK UNIFIED IDEOGRAPH
+ {0x9BFB, 0x6DC3}, //5127 #CJK UNIFIED IDEOGRAPH
+ {0x9BFC, 0x6DC8}, //5128 #CJK UNIFIED IDEOGRAPH
+ {0x9BFD, 0x6DC9}, //5129 #CJK UNIFIED IDEOGRAPH
+ {0x9BFE, 0x6DCA}, //5130 #CJK UNIFIED IDEOGRAPH
+ {0x9C40, 0x6DCD}, //5131 #CJK UNIFIED IDEOGRAPH
+ {0x9C41, 0x6DCE}, //5132 #CJK UNIFIED IDEOGRAPH
+ {0x9C42, 0x6DCF}, //5133 #CJK UNIFIED IDEOGRAPH
+ {0x9C43, 0x6DD0}, //5134 #CJK UNIFIED IDEOGRAPH
+ {0x9C44, 0x6DD2}, //5135 #CJK UNIFIED IDEOGRAPH
+ {0x9C45, 0x6DD3}, //5136 #CJK UNIFIED IDEOGRAPH
+ {0x9C46, 0x6DD4}, //5137 #CJK UNIFIED IDEOGRAPH
+ {0x9C47, 0x6DD5}, //5138 #CJK UNIFIED IDEOGRAPH
+ {0x9C48, 0x6DD7}, //5139 #CJK UNIFIED IDEOGRAPH
+ {0x9C49, 0x6DDA}, //5140 #CJK UNIFIED IDEOGRAPH
+ {0x9C4A, 0x6DDB}, //5141 #CJK UNIFIED IDEOGRAPH
+ {0x9C4B, 0x6DDC}, //5142 #CJK UNIFIED IDEOGRAPH
+ {0x9C4C, 0x6DDF}, //5143 #CJK UNIFIED IDEOGRAPH
+ {0x9C4D, 0x6DE2}, //5144 #CJK UNIFIED IDEOGRAPH
+ {0x9C4E, 0x6DE3}, //5145 #CJK UNIFIED IDEOGRAPH
+ {0x9C4F, 0x6DE5}, //5146 #CJK UNIFIED IDEOGRAPH
+ {0x9C50, 0x6DE7}, //5147 #CJK UNIFIED IDEOGRAPH
+ {0x9C51, 0x6DE8}, //5148 #CJK UNIFIED IDEOGRAPH
+ {0x9C52, 0x6DE9}, //5149 #CJK UNIFIED IDEOGRAPH
+ {0x9C53, 0x6DEA}, //5150 #CJK UNIFIED IDEOGRAPH
+ {0x9C54, 0x6DED}, //5151 #CJK UNIFIED IDEOGRAPH
+ {0x9C55, 0x6DEF}, //5152 #CJK UNIFIED IDEOGRAPH
+ {0x9C56, 0x6DF0}, //5153 #CJK UNIFIED IDEOGRAPH
+ {0x9C57, 0x6DF2}, //5154 #CJK UNIFIED IDEOGRAPH
+ {0x9C58, 0x6DF4}, //5155 #CJK UNIFIED IDEOGRAPH
+ {0x9C59, 0x6DF5}, //5156 #CJK UNIFIED IDEOGRAPH
+ {0x9C5A, 0x6DF6}, //5157 #CJK UNIFIED IDEOGRAPH
+ {0x9C5B, 0x6DF8}, //5158 #CJK UNIFIED IDEOGRAPH
+ {0x9C5C, 0x6DFA}, //5159 #CJK UNIFIED IDEOGRAPH
+ {0x9C5D, 0x6DFD}, //5160 #CJK UNIFIED IDEOGRAPH
+ {0x9C5E, 0x6DFE}, //5161 #CJK UNIFIED IDEOGRAPH
+ {0x9C5F, 0x6DFF}, //5162 #CJK UNIFIED IDEOGRAPH
+ {0x9C60, 0x6E00}, //5163 #CJK UNIFIED IDEOGRAPH
+ {0x9C61, 0x6E01}, //5164 #CJK UNIFIED IDEOGRAPH
+ {0x9C62, 0x6E02}, //5165 #CJK UNIFIED IDEOGRAPH
+ {0x9C63, 0x6E03}, //5166 #CJK UNIFIED IDEOGRAPH
+ {0x9C64, 0x6E04}, //5167 #CJK UNIFIED IDEOGRAPH
+ {0x9C65, 0x6E06}, //5168 #CJK UNIFIED IDEOGRAPH
+ {0x9C66, 0x6E07}, //5169 #CJK UNIFIED IDEOGRAPH
+ {0x9C67, 0x6E08}, //5170 #CJK UNIFIED IDEOGRAPH
+ {0x9C68, 0x6E09}, //5171 #CJK UNIFIED IDEOGRAPH
+ {0x9C69, 0x6E0B}, //5172 #CJK UNIFIED IDEOGRAPH
+ {0x9C6A, 0x6E0F}, //5173 #CJK UNIFIED IDEOGRAPH
+ {0x9C6B, 0x6E12}, //5174 #CJK UNIFIED IDEOGRAPH
+ {0x9C6C, 0x6E13}, //5175 #CJK UNIFIED IDEOGRAPH
+ {0x9C6D, 0x6E15}, //5176 #CJK UNIFIED IDEOGRAPH
+ {0x9C6E, 0x6E18}, //5177 #CJK UNIFIED IDEOGRAPH
+ {0x9C6F, 0x6E19}, //5178 #CJK UNIFIED IDEOGRAPH
+ {0x9C70, 0x6E1B}, //5179 #CJK UNIFIED IDEOGRAPH
+ {0x9C71, 0x6E1C}, //5180 #CJK UNIFIED IDEOGRAPH
+ {0x9C72, 0x6E1E}, //5181 #CJK UNIFIED IDEOGRAPH
+ {0x9C73, 0x6E1F}, //5182 #CJK UNIFIED IDEOGRAPH
+ {0x9C74, 0x6E22}, //5183 #CJK UNIFIED IDEOGRAPH
+ {0x9C75, 0x6E26}, //5184 #CJK UNIFIED IDEOGRAPH
+ {0x9C76, 0x6E27}, //5185 #CJK UNIFIED IDEOGRAPH
+ {0x9C77, 0x6E28}, //5186 #CJK UNIFIED IDEOGRAPH
+ {0x9C78, 0x6E2A}, //5187 #CJK UNIFIED IDEOGRAPH
+ {0x9C79, 0x6E2C}, //5188 #CJK UNIFIED IDEOGRAPH
+ {0x9C7A, 0x6E2E}, //5189 #CJK UNIFIED IDEOGRAPH
+ {0x9C7B, 0x6E30}, //5190 #CJK UNIFIED IDEOGRAPH
+ {0x9C7C, 0x6E31}, //5191 #CJK UNIFIED IDEOGRAPH
+ {0x9C7D, 0x6E33}, //5192 #CJK UNIFIED IDEOGRAPH
+ {0x9C7E, 0x6E35}, //5193 #CJK UNIFIED IDEOGRAPH
+ {0x9C80, 0x6E36}, //5194 #CJK UNIFIED IDEOGRAPH
+ {0x9C81, 0x6E37}, //5195 #CJK UNIFIED IDEOGRAPH
+ {0x9C82, 0x6E39}, //5196 #CJK UNIFIED IDEOGRAPH
+ {0x9C83, 0x6E3B}, //5197 #CJK UNIFIED IDEOGRAPH
+ {0x9C84, 0x6E3C}, //5198 #CJK UNIFIED IDEOGRAPH
+ {0x9C85, 0x6E3D}, //5199 #CJK UNIFIED IDEOGRAPH
+ {0x9C86, 0x6E3E}, //5200 #CJK UNIFIED IDEOGRAPH
+ {0x9C87, 0x6E3F}, //5201 #CJK UNIFIED IDEOGRAPH
+ {0x9C88, 0x6E40}, //5202 #CJK UNIFIED IDEOGRAPH
+ {0x9C89, 0x6E41}, //5203 #CJK UNIFIED IDEOGRAPH
+ {0x9C8A, 0x6E42}, //5204 #CJK UNIFIED IDEOGRAPH
+ {0x9C8B, 0x6E45}, //5205 #CJK UNIFIED IDEOGRAPH
+ {0x9C8C, 0x6E46}, //5206 #CJK UNIFIED IDEOGRAPH
+ {0x9C8D, 0x6E47}, //5207 #CJK UNIFIED IDEOGRAPH
+ {0x9C8E, 0x6E48}, //5208 #CJK UNIFIED IDEOGRAPH
+ {0x9C8F, 0x6E49}, //5209 #CJK UNIFIED IDEOGRAPH
+ {0x9C90, 0x6E4A}, //5210 #CJK UNIFIED IDEOGRAPH
+ {0x9C91, 0x6E4B}, //5211 #CJK UNIFIED IDEOGRAPH
+ {0x9C92, 0x6E4C}, //5212 #CJK UNIFIED IDEOGRAPH
+ {0x9C93, 0x6E4F}, //5213 #CJK UNIFIED IDEOGRAPH
+ {0x9C94, 0x6E50}, //5214 #CJK UNIFIED IDEOGRAPH
+ {0x9C95, 0x6E51}, //5215 #CJK UNIFIED IDEOGRAPH
+ {0x9C96, 0x6E52}, //5216 #CJK UNIFIED IDEOGRAPH
+ {0x9C97, 0x6E55}, //5217 #CJK UNIFIED IDEOGRAPH
+ {0x9C98, 0x6E57}, //5218 #CJK UNIFIED IDEOGRAPH
+ {0x9C99, 0x6E59}, //5219 #CJK UNIFIED IDEOGRAPH
+ {0x9C9A, 0x6E5A}, //5220 #CJK UNIFIED IDEOGRAPH
+ {0x9C9B, 0x6E5C}, //5221 #CJK UNIFIED IDEOGRAPH
+ {0x9C9C, 0x6E5D}, //5222 #CJK UNIFIED IDEOGRAPH
+ {0x9C9D, 0x6E5E}, //5223 #CJK UNIFIED IDEOGRAPH
+ {0x9C9E, 0x6E60}, //5224 #CJK UNIFIED IDEOGRAPH
+ {0x9C9F, 0x6E61}, //5225 #CJK UNIFIED IDEOGRAPH
+ {0x9CA0, 0x6E62}, //5226 #CJK UNIFIED IDEOGRAPH
+ {0x9CA1, 0x6E63}, //5227 #CJK UNIFIED IDEOGRAPH
+ {0x9CA2, 0x6E64}, //5228 #CJK UNIFIED IDEOGRAPH
+ {0x9CA3, 0x6E65}, //5229 #CJK UNIFIED IDEOGRAPH
+ {0x9CA4, 0x6E66}, //5230 #CJK UNIFIED IDEOGRAPH
+ {0x9CA5, 0x6E67}, //5231 #CJK UNIFIED IDEOGRAPH
+ {0x9CA6, 0x6E68}, //5232 #CJK UNIFIED IDEOGRAPH
+ {0x9CA7, 0x6E69}, //5233 #CJK UNIFIED IDEOGRAPH
+ {0x9CA8, 0x6E6A}, //5234 #CJK UNIFIED IDEOGRAPH
+ {0x9CA9, 0x6E6C}, //5235 #CJK UNIFIED IDEOGRAPH
+ {0x9CAA, 0x6E6D}, //5236 #CJK UNIFIED IDEOGRAPH
+ {0x9CAB, 0x6E6F}, //5237 #CJK UNIFIED IDEOGRAPH
+ {0x9CAC, 0x6E70}, //5238 #CJK UNIFIED IDEOGRAPH
+ {0x9CAD, 0x6E71}, //5239 #CJK UNIFIED IDEOGRAPH
+ {0x9CAE, 0x6E72}, //5240 #CJK UNIFIED IDEOGRAPH
+ {0x9CAF, 0x6E73}, //5241 #CJK UNIFIED IDEOGRAPH
+ {0x9CB0, 0x6E74}, //5242 #CJK UNIFIED IDEOGRAPH
+ {0x9CB1, 0x6E75}, //5243 #CJK UNIFIED IDEOGRAPH
+ {0x9CB2, 0x6E76}, //5244 #CJK UNIFIED IDEOGRAPH
+ {0x9CB3, 0x6E77}, //5245 #CJK UNIFIED IDEOGRAPH
+ {0x9CB4, 0x6E78}, //5246 #CJK UNIFIED IDEOGRAPH
+ {0x9CB5, 0x6E79}, //5247 #CJK UNIFIED IDEOGRAPH
+ {0x9CB6, 0x6E7A}, //5248 #CJK UNIFIED IDEOGRAPH
+ {0x9CB7, 0x6E7B}, //5249 #CJK UNIFIED IDEOGRAPH
+ {0x9CB8, 0x6E7C}, //5250 #CJK UNIFIED IDEOGRAPH
+ {0x9CB9, 0x6E7D}, //5251 #CJK UNIFIED IDEOGRAPH
+ {0x9CBA, 0x6E80}, //5252 #CJK UNIFIED IDEOGRAPH
+ {0x9CBB, 0x6E81}, //5253 #CJK UNIFIED IDEOGRAPH
+ {0x9CBC, 0x6E82}, //5254 #CJK UNIFIED IDEOGRAPH
+ {0x9CBD, 0x6E84}, //5255 #CJK UNIFIED IDEOGRAPH
+ {0x9CBE, 0x6E87}, //5256 #CJK UNIFIED IDEOGRAPH
+ {0x9CBF, 0x6E88}, //5257 #CJK UNIFIED IDEOGRAPH
+ {0x9CC0, 0x6E8A}, //5258 #CJK UNIFIED IDEOGRAPH
+ {0x9CC1, 0x6E8B}, //5259 #CJK UNIFIED IDEOGRAPH
+ {0x9CC2, 0x6E8C}, //5260 #CJK UNIFIED IDEOGRAPH
+ {0x9CC3, 0x6E8D}, //5261 #CJK UNIFIED IDEOGRAPH
+ {0x9CC4, 0x6E8E}, //5262 #CJK UNIFIED IDEOGRAPH
+ {0x9CC5, 0x6E91}, //5263 #CJK UNIFIED IDEOGRAPH
+ {0x9CC6, 0x6E92}, //5264 #CJK UNIFIED IDEOGRAPH
+ {0x9CC7, 0x6E93}, //5265 #CJK UNIFIED IDEOGRAPH
+ {0x9CC8, 0x6E94}, //5266 #CJK UNIFIED IDEOGRAPH
+ {0x9CC9, 0x6E95}, //5267 #CJK UNIFIED IDEOGRAPH
+ {0x9CCA, 0x6E96}, //5268 #CJK UNIFIED IDEOGRAPH
+ {0x9CCB, 0x6E97}, //5269 #CJK UNIFIED IDEOGRAPH
+ {0x9CCC, 0x6E99}, //5270 #CJK UNIFIED IDEOGRAPH
+ {0x9CCD, 0x6E9A}, //5271 #CJK UNIFIED IDEOGRAPH
+ {0x9CCE, 0x6E9B}, //5272 #CJK UNIFIED IDEOGRAPH
+ {0x9CCF, 0x6E9D}, //5273 #CJK UNIFIED IDEOGRAPH
+ {0x9CD0, 0x6E9E}, //5274 #CJK UNIFIED IDEOGRAPH
+ {0x9CD1, 0x6EA0}, //5275 #CJK UNIFIED IDEOGRAPH
+ {0x9CD2, 0x6EA1}, //5276 #CJK UNIFIED IDEOGRAPH
+ {0x9CD3, 0x6EA3}, //5277 #CJK UNIFIED IDEOGRAPH
+ {0x9CD4, 0x6EA4}, //5278 #CJK UNIFIED IDEOGRAPH
+ {0x9CD5, 0x6EA6}, //5279 #CJK UNIFIED IDEOGRAPH
+ {0x9CD6, 0x6EA8}, //5280 #CJK UNIFIED IDEOGRAPH
+ {0x9CD7, 0x6EA9}, //5281 #CJK UNIFIED IDEOGRAPH
+ {0x9CD8, 0x6EAB}, //5282 #CJK UNIFIED IDEOGRAPH
+ {0x9CD9, 0x6EAC}, //5283 #CJK UNIFIED IDEOGRAPH
+ {0x9CDA, 0x6EAD}, //5284 #CJK UNIFIED IDEOGRAPH
+ {0x9CDB, 0x6EAE}, //5285 #CJK UNIFIED IDEOGRAPH
+ {0x9CDC, 0x6EB0}, //5286 #CJK UNIFIED IDEOGRAPH
+ {0x9CDD, 0x6EB3}, //5287 #CJK UNIFIED IDEOGRAPH
+ {0x9CDE, 0x6EB5}, //5288 #CJK UNIFIED IDEOGRAPH
+ {0x9CDF, 0x6EB8}, //5289 #CJK UNIFIED IDEOGRAPH
+ {0x9CE0, 0x6EB9}, //5290 #CJK UNIFIED IDEOGRAPH
+ {0x9CE1, 0x6EBC}, //5291 #CJK UNIFIED IDEOGRAPH
+ {0x9CE2, 0x6EBE}, //5292 #CJK UNIFIED IDEOGRAPH
+ {0x9CE3, 0x6EBF}, //5293 #CJK UNIFIED IDEOGRAPH
+ {0x9CE4, 0x6EC0}, //5294 #CJK UNIFIED IDEOGRAPH
+ {0x9CE5, 0x6EC3}, //5295 #CJK UNIFIED IDEOGRAPH
+ {0x9CE6, 0x6EC4}, //5296 #CJK UNIFIED IDEOGRAPH
+ {0x9CE7, 0x6EC5}, //5297 #CJK UNIFIED IDEOGRAPH
+ {0x9CE8, 0x6EC6}, //5298 #CJK UNIFIED IDEOGRAPH
+ {0x9CE9, 0x6EC8}, //5299 #CJK UNIFIED IDEOGRAPH
+ {0x9CEA, 0x6EC9}, //5300 #CJK UNIFIED IDEOGRAPH
+ {0x9CEB, 0x6ECA}, //5301 #CJK UNIFIED IDEOGRAPH
+ {0x9CEC, 0x6ECC}, //5302 #CJK UNIFIED IDEOGRAPH
+ {0x9CED, 0x6ECD}, //5303 #CJK UNIFIED IDEOGRAPH
+ {0x9CEE, 0x6ECE}, //5304 #CJK UNIFIED IDEOGRAPH
+ {0x9CEF, 0x6ED0}, //5305 #CJK UNIFIED IDEOGRAPH
+ {0x9CF0, 0x6ED2}, //5306 #CJK UNIFIED IDEOGRAPH
+ {0x9CF1, 0x6ED6}, //5307 #CJK UNIFIED IDEOGRAPH
+ {0x9CF2, 0x6ED8}, //5308 #CJK UNIFIED IDEOGRAPH
+ {0x9CF3, 0x6ED9}, //5309 #CJK UNIFIED IDEOGRAPH
+ {0x9CF4, 0x6EDB}, //5310 #CJK UNIFIED IDEOGRAPH
+ {0x9CF5, 0x6EDC}, //5311 #CJK UNIFIED IDEOGRAPH
+ {0x9CF6, 0x6EDD}, //5312 #CJK UNIFIED IDEOGRAPH
+ {0x9CF7, 0x6EE3}, //5313 #CJK UNIFIED IDEOGRAPH
+ {0x9CF8, 0x6EE7}, //5314 #CJK UNIFIED IDEOGRAPH
+ {0x9CF9, 0x6EEA}, //5315 #CJK UNIFIED IDEOGRAPH
+ {0x9CFA, 0x6EEB}, //5316 #CJK UNIFIED IDEOGRAPH
+ {0x9CFB, 0x6EEC}, //5317 #CJK UNIFIED IDEOGRAPH
+ {0x9CFC, 0x6EED}, //5318 #CJK UNIFIED IDEOGRAPH
+ {0x9CFD, 0x6EEE}, //5319 #CJK UNIFIED IDEOGRAPH
+ {0x9CFE, 0x6EEF}, //5320 #CJK UNIFIED IDEOGRAPH
+ {0x9D40, 0x6EF0}, //5321 #CJK UNIFIED IDEOGRAPH
+ {0x9D41, 0x6EF1}, //5322 #CJK UNIFIED IDEOGRAPH
+ {0x9D42, 0x6EF2}, //5323 #CJK UNIFIED IDEOGRAPH
+ {0x9D43, 0x6EF3}, //5324 #CJK UNIFIED IDEOGRAPH
+ {0x9D44, 0x6EF5}, //5325 #CJK UNIFIED IDEOGRAPH
+ {0x9D45, 0x6EF6}, //5326 #CJK UNIFIED IDEOGRAPH
+ {0x9D46, 0x6EF7}, //5327 #CJK UNIFIED IDEOGRAPH
+ {0x9D47, 0x6EF8}, //5328 #CJK UNIFIED IDEOGRAPH
+ {0x9D48, 0x6EFA}, //5329 #CJK UNIFIED IDEOGRAPH
+ {0x9D49, 0x6EFB}, //5330 #CJK UNIFIED IDEOGRAPH
+ {0x9D4A, 0x6EFC}, //5331 #CJK UNIFIED IDEOGRAPH
+ {0x9D4B, 0x6EFD}, //5332 #CJK UNIFIED IDEOGRAPH
+ {0x9D4C, 0x6EFE}, //5333 #CJK UNIFIED IDEOGRAPH
+ {0x9D4D, 0x6EFF}, //5334 #CJK UNIFIED IDEOGRAPH
+ {0x9D4E, 0x6F00}, //5335 #CJK UNIFIED IDEOGRAPH
+ {0x9D4F, 0x6F01}, //5336 #CJK UNIFIED IDEOGRAPH
+ {0x9D50, 0x6F03}, //5337 #CJK UNIFIED IDEOGRAPH
+ {0x9D51, 0x6F04}, //5338 #CJK UNIFIED IDEOGRAPH
+ {0x9D52, 0x6F05}, //5339 #CJK UNIFIED IDEOGRAPH
+ {0x9D53, 0x6F07}, //5340 #CJK UNIFIED IDEOGRAPH
+ {0x9D54, 0x6F08}, //5341 #CJK UNIFIED IDEOGRAPH
+ {0x9D55, 0x6F0A}, //5342 #CJK UNIFIED IDEOGRAPH
+ {0x9D56, 0x6F0B}, //5343 #CJK UNIFIED IDEOGRAPH
+ {0x9D57, 0x6F0C}, //5344 #CJK UNIFIED IDEOGRAPH
+ {0x9D58, 0x6F0D}, //5345 #CJK UNIFIED IDEOGRAPH
+ {0x9D59, 0x6F0E}, //5346 #CJK UNIFIED IDEOGRAPH
+ {0x9D5A, 0x6F10}, //5347 #CJK UNIFIED IDEOGRAPH
+ {0x9D5B, 0x6F11}, //5348 #CJK UNIFIED IDEOGRAPH
+ {0x9D5C, 0x6F12}, //5349 #CJK UNIFIED IDEOGRAPH
+ {0x9D5D, 0x6F16}, //5350 #CJK UNIFIED IDEOGRAPH
+ {0x9D5E, 0x6F17}, //5351 #CJK UNIFIED IDEOGRAPH
+ {0x9D5F, 0x6F18}, //5352 #CJK UNIFIED IDEOGRAPH
+ {0x9D60, 0x6F19}, //5353 #CJK UNIFIED IDEOGRAPH
+ {0x9D61, 0x6F1A}, //5354 #CJK UNIFIED IDEOGRAPH
+ {0x9D62, 0x6F1B}, //5355 #CJK UNIFIED IDEOGRAPH
+ {0x9D63, 0x6F1C}, //5356 #CJK UNIFIED IDEOGRAPH
+ {0x9D64, 0x6F1D}, //5357 #CJK UNIFIED IDEOGRAPH
+ {0x9D65, 0x6F1E}, //5358 #CJK UNIFIED IDEOGRAPH
+ {0x9D66, 0x6F1F}, //5359 #CJK UNIFIED IDEOGRAPH
+ {0x9D67, 0x6F21}, //5360 #CJK UNIFIED IDEOGRAPH
+ {0x9D68, 0x6F22}, //5361 #CJK UNIFIED IDEOGRAPH
+ {0x9D69, 0x6F23}, //5362 #CJK UNIFIED IDEOGRAPH
+ {0x9D6A, 0x6F25}, //5363 #CJK UNIFIED IDEOGRAPH
+ {0x9D6B, 0x6F26}, //5364 #CJK UNIFIED IDEOGRAPH
+ {0x9D6C, 0x6F27}, //5365 #CJK UNIFIED IDEOGRAPH
+ {0x9D6D, 0x6F28}, //5366 #CJK UNIFIED IDEOGRAPH
+ {0x9D6E, 0x6F2C}, //5367 #CJK UNIFIED IDEOGRAPH
+ {0x9D6F, 0x6F2E}, //5368 #CJK UNIFIED IDEOGRAPH
+ {0x9D70, 0x6F30}, //5369 #CJK UNIFIED IDEOGRAPH
+ {0x9D71, 0x6F32}, //5370 #CJK UNIFIED IDEOGRAPH
+ {0x9D72, 0x6F34}, //5371 #CJK UNIFIED IDEOGRAPH
+ {0x9D73, 0x6F35}, //5372 #CJK UNIFIED IDEOGRAPH
+ {0x9D74, 0x6F37}, //5373 #CJK UNIFIED IDEOGRAPH
+ {0x9D75, 0x6F38}, //5374 #CJK UNIFIED IDEOGRAPH
+ {0x9D76, 0x6F39}, //5375 #CJK UNIFIED IDEOGRAPH
+ {0x9D77, 0x6F3A}, //5376 #CJK UNIFIED IDEOGRAPH
+ {0x9D78, 0x6F3B}, //5377 #CJK UNIFIED IDEOGRAPH
+ {0x9D79, 0x6F3C}, //5378 #CJK UNIFIED IDEOGRAPH
+ {0x9D7A, 0x6F3D}, //5379 #CJK UNIFIED IDEOGRAPH
+ {0x9D7B, 0x6F3F}, //5380 #CJK UNIFIED IDEOGRAPH
+ {0x9D7C, 0x6F40}, //5381 #CJK UNIFIED IDEOGRAPH
+ {0x9D7D, 0x6F41}, //5382 #CJK UNIFIED IDEOGRAPH
+ {0x9D7E, 0x6F42}, //5383 #CJK UNIFIED IDEOGRAPH
+ {0x9D80, 0x6F43}, //5384 #CJK UNIFIED IDEOGRAPH
+ {0x9D81, 0x6F44}, //5385 #CJK UNIFIED IDEOGRAPH
+ {0x9D82, 0x6F45}, //5386 #CJK UNIFIED IDEOGRAPH
+ {0x9D83, 0x6F48}, //5387 #CJK UNIFIED IDEOGRAPH
+ {0x9D84, 0x6F49}, //5388 #CJK UNIFIED IDEOGRAPH
+ {0x9D85, 0x6F4A}, //5389 #CJK UNIFIED IDEOGRAPH
+ {0x9D86, 0x6F4C}, //5390 #CJK UNIFIED IDEOGRAPH
+ {0x9D87, 0x6F4E}, //5391 #CJK UNIFIED IDEOGRAPH
+ {0x9D88, 0x6F4F}, //5392 #CJK UNIFIED IDEOGRAPH
+ {0x9D89, 0x6F50}, //5393 #CJK UNIFIED IDEOGRAPH
+ {0x9D8A, 0x6F51}, //5394 #CJK UNIFIED IDEOGRAPH
+ {0x9D8B, 0x6F52}, //5395 #CJK UNIFIED IDEOGRAPH
+ {0x9D8C, 0x6F53}, //5396 #CJK UNIFIED IDEOGRAPH
+ {0x9D8D, 0x6F54}, //5397 #CJK UNIFIED IDEOGRAPH
+ {0x9D8E, 0x6F55}, //5398 #CJK UNIFIED IDEOGRAPH
+ {0x9D8F, 0x6F56}, //5399 #CJK UNIFIED IDEOGRAPH
+ {0x9D90, 0x6F57}, //5400 #CJK UNIFIED IDEOGRAPH
+ {0x9D91, 0x6F59}, //5401 #CJK UNIFIED IDEOGRAPH
+ {0x9D92, 0x6F5A}, //5402 #CJK UNIFIED IDEOGRAPH
+ {0x9D93, 0x6F5B}, //5403 #CJK UNIFIED IDEOGRAPH
+ {0x9D94, 0x6F5D}, //5404 #CJK UNIFIED IDEOGRAPH
+ {0x9D95, 0x6F5F}, //5405 #CJK UNIFIED IDEOGRAPH
+ {0x9D96, 0x6F60}, //5406 #CJK UNIFIED IDEOGRAPH
+ {0x9D97, 0x6F61}, //5407 #CJK UNIFIED IDEOGRAPH
+ {0x9D98, 0x6F63}, //5408 #CJK UNIFIED IDEOGRAPH
+ {0x9D99, 0x6F64}, //5409 #CJK UNIFIED IDEOGRAPH
+ {0x9D9A, 0x6F65}, //5410 #CJK UNIFIED IDEOGRAPH
+ {0x9D9B, 0x6F67}, //5411 #CJK UNIFIED IDEOGRAPH
+ {0x9D9C, 0x6F68}, //5412 #CJK UNIFIED IDEOGRAPH
+ {0x9D9D, 0x6F69}, //5413 #CJK UNIFIED IDEOGRAPH
+ {0x9D9E, 0x6F6A}, //5414 #CJK UNIFIED IDEOGRAPH
+ {0x9D9F, 0x6F6B}, //5415 #CJK UNIFIED IDEOGRAPH
+ {0x9DA0, 0x6F6C}, //5416 #CJK UNIFIED IDEOGRAPH
+ {0x9DA1, 0x6F6F}, //5417 #CJK UNIFIED IDEOGRAPH
+ {0x9DA2, 0x6F70}, //5418 #CJK UNIFIED IDEOGRAPH
+ {0x9DA3, 0x6F71}, //5419 #CJK UNIFIED IDEOGRAPH
+ {0x9DA4, 0x6F73}, //5420 #CJK UNIFIED IDEOGRAPH
+ {0x9DA5, 0x6F75}, //5421 #CJK UNIFIED IDEOGRAPH
+ {0x9DA6, 0x6F76}, //5422 #CJK UNIFIED IDEOGRAPH
+ {0x9DA7, 0x6F77}, //5423 #CJK UNIFIED IDEOGRAPH
+ {0x9DA8, 0x6F79}, //5424 #CJK UNIFIED IDEOGRAPH
+ {0x9DA9, 0x6F7B}, //5425 #CJK UNIFIED IDEOGRAPH
+ {0x9DAA, 0x6F7D}, //5426 #CJK UNIFIED IDEOGRAPH
+ {0x9DAB, 0x6F7E}, //5427 #CJK UNIFIED IDEOGRAPH
+ {0x9DAC, 0x6F7F}, //5428 #CJK UNIFIED IDEOGRAPH
+ {0x9DAD, 0x6F80}, //5429 #CJK UNIFIED IDEOGRAPH
+ {0x9DAE, 0x6F81}, //5430 #CJK UNIFIED IDEOGRAPH
+ {0x9DAF, 0x6F82}, //5431 #CJK UNIFIED IDEOGRAPH
+ {0x9DB0, 0x6F83}, //5432 #CJK UNIFIED IDEOGRAPH
+ {0x9DB1, 0x6F85}, //5433 #CJK UNIFIED IDEOGRAPH
+ {0x9DB2, 0x6F86}, //5434 #CJK UNIFIED IDEOGRAPH
+ {0x9DB3, 0x6F87}, //5435 #CJK UNIFIED IDEOGRAPH
+ {0x9DB4, 0x6F8A}, //5436 #CJK UNIFIED IDEOGRAPH
+ {0x9DB5, 0x6F8B}, //5437 #CJK UNIFIED IDEOGRAPH
+ {0x9DB6, 0x6F8F}, //5438 #CJK UNIFIED IDEOGRAPH
+ {0x9DB7, 0x6F90}, //5439 #CJK UNIFIED IDEOGRAPH
+ {0x9DB8, 0x6F91}, //5440 #CJK UNIFIED IDEOGRAPH
+ {0x9DB9, 0x6F92}, //5441 #CJK UNIFIED IDEOGRAPH
+ {0x9DBA, 0x6F93}, //5442 #CJK UNIFIED IDEOGRAPH
+ {0x9DBB, 0x6F94}, //5443 #CJK UNIFIED IDEOGRAPH
+ {0x9DBC, 0x6F95}, //5444 #CJK UNIFIED IDEOGRAPH
+ {0x9DBD, 0x6F96}, //5445 #CJK UNIFIED IDEOGRAPH
+ {0x9DBE, 0x6F97}, //5446 #CJK UNIFIED IDEOGRAPH
+ {0x9DBF, 0x6F98}, //5447 #CJK UNIFIED IDEOGRAPH
+ {0x9DC0, 0x6F99}, //5448 #CJK UNIFIED IDEOGRAPH
+ {0x9DC1, 0x6F9A}, //5449 #CJK UNIFIED IDEOGRAPH
+ {0x9DC2, 0x6F9B}, //5450 #CJK UNIFIED IDEOGRAPH
+ {0x9DC3, 0x6F9D}, //5451 #CJK UNIFIED IDEOGRAPH
+ {0x9DC4, 0x6F9E}, //5452 #CJK UNIFIED IDEOGRAPH
+ {0x9DC5, 0x6F9F}, //5453 #CJK UNIFIED IDEOGRAPH
+ {0x9DC6, 0x6FA0}, //5454 #CJK UNIFIED IDEOGRAPH
+ {0x9DC7, 0x6FA2}, //5455 #CJK UNIFIED IDEOGRAPH
+ {0x9DC8, 0x6FA3}, //5456 #CJK UNIFIED IDEOGRAPH
+ {0x9DC9, 0x6FA4}, //5457 #CJK UNIFIED IDEOGRAPH
+ {0x9DCA, 0x6FA5}, //5458 #CJK UNIFIED IDEOGRAPH
+ {0x9DCB, 0x6FA6}, //5459 #CJK UNIFIED IDEOGRAPH
+ {0x9DCC, 0x6FA8}, //5460 #CJK UNIFIED IDEOGRAPH
+ {0x9DCD, 0x6FA9}, //5461 #CJK UNIFIED IDEOGRAPH
+ {0x9DCE, 0x6FAA}, //5462 #CJK UNIFIED IDEOGRAPH
+ {0x9DCF, 0x6FAB}, //5463 #CJK UNIFIED IDEOGRAPH
+ {0x9DD0, 0x6FAC}, //5464 #CJK UNIFIED IDEOGRAPH
+ {0x9DD1, 0x6FAD}, //5465 #CJK UNIFIED IDEOGRAPH
+ {0x9DD2, 0x6FAE}, //5466 #CJK UNIFIED IDEOGRAPH
+ {0x9DD3, 0x6FAF}, //5467 #CJK UNIFIED IDEOGRAPH
+ {0x9DD4, 0x6FB0}, //5468 #CJK UNIFIED IDEOGRAPH
+ {0x9DD5, 0x6FB1}, //5469 #CJK UNIFIED IDEOGRAPH
+ {0x9DD6, 0x6FB2}, //5470 #CJK UNIFIED IDEOGRAPH
+ {0x9DD7, 0x6FB4}, //5471 #CJK UNIFIED IDEOGRAPH
+ {0x9DD8, 0x6FB5}, //5472 #CJK UNIFIED IDEOGRAPH
+ {0x9DD9, 0x6FB7}, //5473 #CJK UNIFIED IDEOGRAPH
+ {0x9DDA, 0x6FB8}, //5474 #CJK UNIFIED IDEOGRAPH
+ {0x9DDB, 0x6FBA}, //5475 #CJK UNIFIED IDEOGRAPH
+ {0x9DDC, 0x6FBB}, //5476 #CJK UNIFIED IDEOGRAPH
+ {0x9DDD, 0x6FBC}, //5477 #CJK UNIFIED IDEOGRAPH
+ {0x9DDE, 0x6FBD}, //5478 #CJK UNIFIED IDEOGRAPH
+ {0x9DDF, 0x6FBE}, //5479 #CJK UNIFIED IDEOGRAPH
+ {0x9DE0, 0x6FBF}, //5480 #CJK UNIFIED IDEOGRAPH
+ {0x9DE1, 0x6FC1}, //5481 #CJK UNIFIED IDEOGRAPH
+ {0x9DE2, 0x6FC3}, //5482 #CJK UNIFIED IDEOGRAPH
+ {0x9DE3, 0x6FC4}, //5483 #CJK UNIFIED IDEOGRAPH
+ {0x9DE4, 0x6FC5}, //5484 #CJK UNIFIED IDEOGRAPH
+ {0x9DE5, 0x6FC6}, //5485 #CJK UNIFIED IDEOGRAPH
+ {0x9DE6, 0x6FC7}, //5486 #CJK UNIFIED IDEOGRAPH
+ {0x9DE7, 0x6FC8}, //5487 #CJK UNIFIED IDEOGRAPH
+ {0x9DE8, 0x6FCA}, //5488 #CJK UNIFIED IDEOGRAPH
+ {0x9DE9, 0x6FCB}, //5489 #CJK UNIFIED IDEOGRAPH
+ {0x9DEA, 0x6FCC}, //5490 #CJK UNIFIED IDEOGRAPH
+ {0x9DEB, 0x6FCD}, //5491 #CJK UNIFIED IDEOGRAPH
+ {0x9DEC, 0x6FCE}, //5492 #CJK UNIFIED IDEOGRAPH
+ {0x9DED, 0x6FCF}, //5493 #CJK UNIFIED IDEOGRAPH
+ {0x9DEE, 0x6FD0}, //5494 #CJK UNIFIED IDEOGRAPH
+ {0x9DEF, 0x6FD3}, //5495 #CJK UNIFIED IDEOGRAPH
+ {0x9DF0, 0x6FD4}, //5496 #CJK UNIFIED IDEOGRAPH
+ {0x9DF1, 0x6FD5}, //5497 #CJK UNIFIED IDEOGRAPH
+ {0x9DF2, 0x6FD6}, //5498 #CJK UNIFIED IDEOGRAPH
+ {0x9DF3, 0x6FD7}, //5499 #CJK UNIFIED IDEOGRAPH
+ {0x9DF4, 0x6FD8}, //5500 #CJK UNIFIED IDEOGRAPH
+ {0x9DF5, 0x6FD9}, //5501 #CJK UNIFIED IDEOGRAPH
+ {0x9DF6, 0x6FDA}, //5502 #CJK UNIFIED IDEOGRAPH
+ {0x9DF7, 0x6FDB}, //5503 #CJK UNIFIED IDEOGRAPH
+ {0x9DF8, 0x6FDC}, //5504 #CJK UNIFIED IDEOGRAPH
+ {0x9DF9, 0x6FDD}, //5505 #CJK UNIFIED IDEOGRAPH
+ {0x9DFA, 0x6FDF}, //5506 #CJK UNIFIED IDEOGRAPH
+ {0x9DFB, 0x6FE2}, //5507 #CJK UNIFIED IDEOGRAPH
+ {0x9DFC, 0x6FE3}, //5508 #CJK UNIFIED IDEOGRAPH
+ {0x9DFD, 0x6FE4}, //5509 #CJK UNIFIED IDEOGRAPH
+ {0x9DFE, 0x6FE5}, //5510 #CJK UNIFIED IDEOGRAPH
+ {0x9E40, 0x6FE6}, //5511 #CJK UNIFIED IDEOGRAPH
+ {0x9E41, 0x6FE7}, //5512 #CJK UNIFIED IDEOGRAPH
+ {0x9E42, 0x6FE8}, //5513 #CJK UNIFIED IDEOGRAPH
+ {0x9E43, 0x6FE9}, //5514 #CJK UNIFIED IDEOGRAPH
+ {0x9E44, 0x6FEA}, //5515 #CJK UNIFIED IDEOGRAPH
+ {0x9E45, 0x6FEB}, //5516 #CJK UNIFIED IDEOGRAPH
+ {0x9E46, 0x6FEC}, //5517 #CJK UNIFIED IDEOGRAPH
+ {0x9E47, 0x6FED}, //5518 #CJK UNIFIED IDEOGRAPH
+ {0x9E48, 0x6FF0}, //5519 #CJK UNIFIED IDEOGRAPH
+ {0x9E49, 0x6FF1}, //5520 #CJK UNIFIED IDEOGRAPH
+ {0x9E4A, 0x6FF2}, //5521 #CJK UNIFIED IDEOGRAPH
+ {0x9E4B, 0x6FF3}, //5522 #CJK UNIFIED IDEOGRAPH
+ {0x9E4C, 0x6FF4}, //5523 #CJK UNIFIED IDEOGRAPH
+ {0x9E4D, 0x6FF5}, //5524 #CJK UNIFIED IDEOGRAPH
+ {0x9E4E, 0x6FF6}, //5525 #CJK UNIFIED IDEOGRAPH
+ {0x9E4F, 0x6FF7}, //5526 #CJK UNIFIED IDEOGRAPH
+ {0x9E50, 0x6FF8}, //5527 #CJK UNIFIED IDEOGRAPH
+ {0x9E51, 0x6FF9}, //5528 #CJK UNIFIED IDEOGRAPH
+ {0x9E52, 0x6FFA}, //5529 #CJK UNIFIED IDEOGRAPH
+ {0x9E53, 0x6FFB}, //5530 #CJK UNIFIED IDEOGRAPH
+ {0x9E54, 0x6FFC}, //5531 #CJK UNIFIED IDEOGRAPH
+ {0x9E55, 0x6FFD}, //5532 #CJK UNIFIED IDEOGRAPH
+ {0x9E56, 0x6FFE}, //5533 #CJK UNIFIED IDEOGRAPH
+ {0x9E57, 0x6FFF}, //5534 #CJK UNIFIED IDEOGRAPH
+ {0x9E58, 0x7000}, //5535 #CJK UNIFIED IDEOGRAPH
+ {0x9E59, 0x7001}, //5536 #CJK UNIFIED IDEOGRAPH
+ {0x9E5A, 0x7002}, //5537 #CJK UNIFIED IDEOGRAPH
+ {0x9E5B, 0x7003}, //5538 #CJK UNIFIED IDEOGRAPH
+ {0x9E5C, 0x7004}, //5539 #CJK UNIFIED IDEOGRAPH
+ {0x9E5D, 0x7005}, //5540 #CJK UNIFIED IDEOGRAPH
+ {0x9E5E, 0x7006}, //5541 #CJK UNIFIED IDEOGRAPH
+ {0x9E5F, 0x7007}, //5542 #CJK UNIFIED IDEOGRAPH
+ {0x9E60, 0x7008}, //5543 #CJK UNIFIED IDEOGRAPH
+ {0x9E61, 0x7009}, //5544 #CJK UNIFIED IDEOGRAPH
+ {0x9E62, 0x700A}, //5545 #CJK UNIFIED IDEOGRAPH
+ {0x9E63, 0x700B}, //5546 #CJK UNIFIED IDEOGRAPH
+ {0x9E64, 0x700C}, //5547 #CJK UNIFIED IDEOGRAPH
+ {0x9E65, 0x700D}, //5548 #CJK UNIFIED IDEOGRAPH
+ {0x9E66, 0x700E}, //5549 #CJK UNIFIED IDEOGRAPH
+ {0x9E67, 0x700F}, //5550 #CJK UNIFIED IDEOGRAPH
+ {0x9E68, 0x7010}, //5551 #CJK UNIFIED IDEOGRAPH
+ {0x9E69, 0x7012}, //5552 #CJK UNIFIED IDEOGRAPH
+ {0x9E6A, 0x7013}, //5553 #CJK UNIFIED IDEOGRAPH
+ {0x9E6B, 0x7014}, //5554 #CJK UNIFIED IDEOGRAPH
+ {0x9E6C, 0x7015}, //5555 #CJK UNIFIED IDEOGRAPH
+ {0x9E6D, 0x7016}, //5556 #CJK UNIFIED IDEOGRAPH
+ {0x9E6E, 0x7017}, //5557 #CJK UNIFIED IDEOGRAPH
+ {0x9E6F, 0x7018}, //5558 #CJK UNIFIED IDEOGRAPH
+ {0x9E70, 0x7019}, //5559 #CJK UNIFIED IDEOGRAPH
+ {0x9E71, 0x701C}, //5560 #CJK UNIFIED IDEOGRAPH
+ {0x9E72, 0x701D}, //5561 #CJK UNIFIED IDEOGRAPH
+ {0x9E73, 0x701E}, //5562 #CJK UNIFIED IDEOGRAPH
+ {0x9E74, 0x701F}, //5563 #CJK UNIFIED IDEOGRAPH
+ {0x9E75, 0x7020}, //5564 #CJK UNIFIED IDEOGRAPH
+ {0x9E76, 0x7021}, //5565 #CJK UNIFIED IDEOGRAPH
+ {0x9E77, 0x7022}, //5566 #CJK UNIFIED IDEOGRAPH
+ {0x9E78, 0x7024}, //5567 #CJK UNIFIED IDEOGRAPH
+ {0x9E79, 0x7025}, //5568 #CJK UNIFIED IDEOGRAPH
+ {0x9E7A, 0x7026}, //5569 #CJK UNIFIED IDEOGRAPH
+ {0x9E7B, 0x7027}, //5570 #CJK UNIFIED IDEOGRAPH
+ {0x9E7C, 0x7028}, //5571 #CJK UNIFIED IDEOGRAPH
+ {0x9E7D, 0x7029}, //5572 #CJK UNIFIED IDEOGRAPH
+ {0x9E7E, 0x702A}, //5573 #CJK UNIFIED IDEOGRAPH
+ {0x9E80, 0x702B}, //5574 #CJK UNIFIED IDEOGRAPH
+ {0x9E81, 0x702C}, //5575 #CJK UNIFIED IDEOGRAPH
+ {0x9E82, 0x702D}, //5576 #CJK UNIFIED IDEOGRAPH
+ {0x9E83, 0x702E}, //5577 #CJK UNIFIED IDEOGRAPH
+ {0x9E84, 0x702F}, //5578 #CJK UNIFIED IDEOGRAPH
+ {0x9E85, 0x7030}, //5579 #CJK UNIFIED IDEOGRAPH
+ {0x9E86, 0x7031}, //5580 #CJK UNIFIED IDEOGRAPH
+ {0x9E87, 0x7032}, //5581 #CJK UNIFIED IDEOGRAPH
+ {0x9E88, 0x7033}, //5582 #CJK UNIFIED IDEOGRAPH
+ {0x9E89, 0x7034}, //5583 #CJK UNIFIED IDEOGRAPH
+ {0x9E8A, 0x7036}, //5584 #CJK UNIFIED IDEOGRAPH
+ {0x9E8B, 0x7037}, //5585 #CJK UNIFIED IDEOGRAPH
+ {0x9E8C, 0x7038}, //5586 #CJK UNIFIED IDEOGRAPH
+ {0x9E8D, 0x703A}, //5587 #CJK UNIFIED IDEOGRAPH
+ {0x9E8E, 0x703B}, //5588 #CJK UNIFIED IDEOGRAPH
+ {0x9E8F, 0x703C}, //5589 #CJK UNIFIED IDEOGRAPH
+ {0x9E90, 0x703D}, //5590 #CJK UNIFIED IDEOGRAPH
+ {0x9E91, 0x703E}, //5591 #CJK UNIFIED IDEOGRAPH
+ {0x9E92, 0x703F}, //5592 #CJK UNIFIED IDEOGRAPH
+ {0x9E93, 0x7040}, //5593 #CJK UNIFIED IDEOGRAPH
+ {0x9E94, 0x7041}, //5594 #CJK UNIFIED IDEOGRAPH
+ {0x9E95, 0x7042}, //5595 #CJK UNIFIED IDEOGRAPH
+ {0x9E96, 0x7043}, //5596 #CJK UNIFIED IDEOGRAPH
+ {0x9E97, 0x7044}, //5597 #CJK UNIFIED IDEOGRAPH
+ {0x9E98, 0x7045}, //5598 #CJK UNIFIED IDEOGRAPH
+ {0x9E99, 0x7046}, //5599 #CJK UNIFIED IDEOGRAPH
+ {0x9E9A, 0x7047}, //5600 #CJK UNIFIED IDEOGRAPH
+ {0x9E9B, 0x7048}, //5601 #CJK UNIFIED IDEOGRAPH
+ {0x9E9C, 0x7049}, //5602 #CJK UNIFIED IDEOGRAPH
+ {0x9E9D, 0x704A}, //5603 #CJK UNIFIED IDEOGRAPH
+ {0x9E9E, 0x704B}, //5604 #CJK UNIFIED IDEOGRAPH
+ {0x9E9F, 0x704D}, //5605 #CJK UNIFIED IDEOGRAPH
+ {0x9EA0, 0x704E}, //5606 #CJK UNIFIED IDEOGRAPH
+ {0x9EA1, 0x7050}, //5607 #CJK UNIFIED IDEOGRAPH
+ {0x9EA2, 0x7051}, //5608 #CJK UNIFIED IDEOGRAPH
+ {0x9EA3, 0x7052}, //5609 #CJK UNIFIED IDEOGRAPH
+ {0x9EA4, 0x7053}, //5610 #CJK UNIFIED IDEOGRAPH
+ {0x9EA5, 0x7054}, //5611 #CJK UNIFIED IDEOGRAPH
+ {0x9EA6, 0x7055}, //5612 #CJK UNIFIED IDEOGRAPH
+ {0x9EA7, 0x7056}, //5613 #CJK UNIFIED IDEOGRAPH
+ {0x9EA8, 0x7057}, //5614 #CJK UNIFIED IDEOGRAPH
+ {0x9EA9, 0x7058}, //5615 #CJK UNIFIED IDEOGRAPH
+ {0x9EAA, 0x7059}, //5616 #CJK UNIFIED IDEOGRAPH
+ {0x9EAB, 0x705A}, //5617 #CJK UNIFIED IDEOGRAPH
+ {0x9EAC, 0x705B}, //5618 #CJK UNIFIED IDEOGRAPH
+ {0x9EAD, 0x705C}, //5619 #CJK UNIFIED IDEOGRAPH
+ {0x9EAE, 0x705D}, //5620 #CJK UNIFIED IDEOGRAPH
+ {0x9EAF, 0x705F}, //5621 #CJK UNIFIED IDEOGRAPH
+ {0x9EB0, 0x7060}, //5622 #CJK UNIFIED IDEOGRAPH
+ {0x9EB1, 0x7061}, //5623 #CJK UNIFIED IDEOGRAPH
+ {0x9EB2, 0x7062}, //5624 #CJK UNIFIED IDEOGRAPH
+ {0x9EB3, 0x7063}, //5625 #CJK UNIFIED IDEOGRAPH
+ {0x9EB4, 0x7064}, //5626 #CJK UNIFIED IDEOGRAPH
+ {0x9EB5, 0x7065}, //5627 #CJK UNIFIED IDEOGRAPH
+ {0x9EB6, 0x7066}, //5628 #CJK UNIFIED IDEOGRAPH
+ {0x9EB7, 0x7067}, //5629 #CJK UNIFIED IDEOGRAPH
+ {0x9EB8, 0x7068}, //5630 #CJK UNIFIED IDEOGRAPH
+ {0x9EB9, 0x7069}, //5631 #CJK UNIFIED IDEOGRAPH
+ {0x9EBA, 0x706A}, //5632 #CJK UNIFIED IDEOGRAPH
+ {0x9EBB, 0x706E}, //5633 #CJK UNIFIED IDEOGRAPH
+ {0x9EBC, 0x7071}, //5634 #CJK UNIFIED IDEOGRAPH
+ {0x9EBD, 0x7072}, //5635 #CJK UNIFIED IDEOGRAPH
+ {0x9EBE, 0x7073}, //5636 #CJK UNIFIED IDEOGRAPH
+ {0x9EBF, 0x7074}, //5637 #CJK UNIFIED IDEOGRAPH
+ {0x9EC0, 0x7077}, //5638 #CJK UNIFIED IDEOGRAPH
+ {0x9EC1, 0x7079}, //5639 #CJK UNIFIED IDEOGRAPH
+ {0x9EC2, 0x707A}, //5640 #CJK UNIFIED IDEOGRAPH
+ {0x9EC3, 0x707B}, //5641 #CJK UNIFIED IDEOGRAPH
+ {0x9EC4, 0x707D}, //5642 #CJK UNIFIED IDEOGRAPH
+ {0x9EC5, 0x7081}, //5643 #CJK UNIFIED IDEOGRAPH
+ {0x9EC6, 0x7082}, //5644 #CJK UNIFIED IDEOGRAPH
+ {0x9EC7, 0x7083}, //5645 #CJK UNIFIED IDEOGRAPH
+ {0x9EC8, 0x7084}, //5646 #CJK UNIFIED IDEOGRAPH
+ {0x9EC9, 0x7086}, //5647 #CJK UNIFIED IDEOGRAPH
+ {0x9ECA, 0x7087}, //5648 #CJK UNIFIED IDEOGRAPH
+ {0x9ECB, 0x7088}, //5649 #CJK UNIFIED IDEOGRAPH
+ {0x9ECC, 0x708B}, //5650 #CJK UNIFIED IDEOGRAPH
+ {0x9ECD, 0x708C}, //5651 #CJK UNIFIED IDEOGRAPH
+ {0x9ECE, 0x708D}, //5652 #CJK UNIFIED IDEOGRAPH
+ {0x9ECF, 0x708F}, //5653 #CJK UNIFIED IDEOGRAPH
+ {0x9ED0, 0x7090}, //5654 #CJK UNIFIED IDEOGRAPH
+ {0x9ED1, 0x7091}, //5655 #CJK UNIFIED IDEOGRAPH
+ {0x9ED2, 0x7093}, //5656 #CJK UNIFIED IDEOGRAPH
+ {0x9ED3, 0x7097}, //5657 #CJK UNIFIED IDEOGRAPH
+ {0x9ED4, 0x7098}, //5658 #CJK UNIFIED IDEOGRAPH
+ {0x9ED5, 0x709A}, //5659 #CJK UNIFIED IDEOGRAPH
+ {0x9ED6, 0x709B}, //5660 #CJK UNIFIED IDEOGRAPH
+ {0x9ED7, 0x709E}, //5661 #CJK UNIFIED IDEOGRAPH
+ {0x9ED8, 0x709F}, //5662 #CJK UNIFIED IDEOGRAPH
+ {0x9ED9, 0x70A0}, //5663 #CJK UNIFIED IDEOGRAPH
+ {0x9EDA, 0x70A1}, //5664 #CJK UNIFIED IDEOGRAPH
+ {0x9EDB, 0x70A2}, //5665 #CJK UNIFIED IDEOGRAPH
+ {0x9EDC, 0x70A3}, //5666 #CJK UNIFIED IDEOGRAPH
+ {0x9EDD, 0x70A4}, //5667 #CJK UNIFIED IDEOGRAPH
+ {0x9EDE, 0x70A5}, //5668 #CJK UNIFIED IDEOGRAPH
+ {0x9EDF, 0x70A6}, //5669 #CJK UNIFIED IDEOGRAPH
+ {0x9EE0, 0x70A7}, //5670 #CJK UNIFIED IDEOGRAPH
+ {0x9EE1, 0x70A8}, //5671 #CJK UNIFIED IDEOGRAPH
+ {0x9EE2, 0x70A9}, //5672 #CJK UNIFIED IDEOGRAPH
+ {0x9EE3, 0x70AA}, //5673 #CJK UNIFIED IDEOGRAPH
+ {0x9EE4, 0x70B0}, //5674 #CJK UNIFIED IDEOGRAPH
+ {0x9EE5, 0x70B2}, //5675 #CJK UNIFIED IDEOGRAPH
+ {0x9EE6, 0x70B4}, //5676 #CJK UNIFIED IDEOGRAPH
+ {0x9EE7, 0x70B5}, //5677 #CJK UNIFIED IDEOGRAPH
+ {0x9EE8, 0x70B6}, //5678 #CJK UNIFIED IDEOGRAPH
+ {0x9EE9, 0x70BA}, //5679 #CJK UNIFIED IDEOGRAPH
+ {0x9EEA, 0x70BE}, //5680 #CJK UNIFIED IDEOGRAPH
+ {0x9EEB, 0x70BF}, //5681 #CJK UNIFIED IDEOGRAPH
+ {0x9EEC, 0x70C4}, //5682 #CJK UNIFIED IDEOGRAPH
+ {0x9EED, 0x70C5}, //5683 #CJK UNIFIED IDEOGRAPH
+ {0x9EEE, 0x70C6}, //5684 #CJK UNIFIED IDEOGRAPH
+ {0x9EEF, 0x70C7}, //5685 #CJK UNIFIED IDEOGRAPH
+ {0x9EF0, 0x70C9}, //5686 #CJK UNIFIED IDEOGRAPH
+ {0x9EF1, 0x70CB}, //5687 #CJK UNIFIED IDEOGRAPH
+ {0x9EF2, 0x70CC}, //5688 #CJK UNIFIED IDEOGRAPH
+ {0x9EF3, 0x70CD}, //5689 #CJK UNIFIED IDEOGRAPH
+ {0x9EF4, 0x70CE}, //5690 #CJK UNIFIED IDEOGRAPH
+ {0x9EF5, 0x70CF}, //5691 #CJK UNIFIED IDEOGRAPH
+ {0x9EF6, 0x70D0}, //5692 #CJK UNIFIED IDEOGRAPH
+ {0x9EF7, 0x70D1}, //5693 #CJK UNIFIED IDEOGRAPH
+ {0x9EF8, 0x70D2}, //5694 #CJK UNIFIED IDEOGRAPH
+ {0x9EF9, 0x70D3}, //5695 #CJK UNIFIED IDEOGRAPH
+ {0x9EFA, 0x70D4}, //5696 #CJK UNIFIED IDEOGRAPH
+ {0x9EFB, 0x70D5}, //5697 #CJK UNIFIED IDEOGRAPH
+ {0x9EFC, 0x70D6}, //5698 #CJK UNIFIED IDEOGRAPH
+ {0x9EFD, 0x70D7}, //5699 #CJK UNIFIED IDEOGRAPH
+ {0x9EFE, 0x70DA}, //5700 #CJK UNIFIED IDEOGRAPH
+ {0x9F40, 0x70DC}, //5701 #CJK UNIFIED IDEOGRAPH
+ {0x9F41, 0x70DD}, //5702 #CJK UNIFIED IDEOGRAPH
+ {0x9F42, 0x70DE}, //5703 #CJK UNIFIED IDEOGRAPH
+ {0x9F43, 0x70E0}, //5704 #CJK UNIFIED IDEOGRAPH
+ {0x9F44, 0x70E1}, //5705 #CJK UNIFIED IDEOGRAPH
+ {0x9F45, 0x70E2}, //5706 #CJK UNIFIED IDEOGRAPH
+ {0x9F46, 0x70E3}, //5707 #CJK UNIFIED IDEOGRAPH
+ {0x9F47, 0x70E5}, //5708 #CJK UNIFIED IDEOGRAPH
+ {0x9F48, 0x70EA}, //5709 #CJK UNIFIED IDEOGRAPH
+ {0x9F49, 0x70EE}, //5710 #CJK UNIFIED IDEOGRAPH
+ {0x9F4A, 0x70F0}, //5711 #CJK UNIFIED IDEOGRAPH
+ {0x9F4B, 0x70F1}, //5712 #CJK UNIFIED IDEOGRAPH
+ {0x9F4C, 0x70F2}, //5713 #CJK UNIFIED IDEOGRAPH
+ {0x9F4D, 0x70F3}, //5714 #CJK UNIFIED IDEOGRAPH
+ {0x9F4E, 0x70F4}, //5715 #CJK UNIFIED IDEOGRAPH
+ {0x9F4F, 0x70F5}, //5716 #CJK UNIFIED IDEOGRAPH
+ {0x9F50, 0x70F6}, //5717 #CJK UNIFIED IDEOGRAPH
+ {0x9F51, 0x70F8}, //5718 #CJK UNIFIED IDEOGRAPH
+ {0x9F52, 0x70FA}, //5719 #CJK UNIFIED IDEOGRAPH
+ {0x9F53, 0x70FB}, //5720 #CJK UNIFIED IDEOGRAPH
+ {0x9F54, 0x70FC}, //5721 #CJK UNIFIED IDEOGRAPH
+ {0x9F55, 0x70FE}, //5722 #CJK UNIFIED IDEOGRAPH
+ {0x9F56, 0x70FF}, //5723 #CJK UNIFIED IDEOGRAPH
+ {0x9F57, 0x7100}, //5724 #CJK UNIFIED IDEOGRAPH
+ {0x9F58, 0x7101}, //5725 #CJK UNIFIED IDEOGRAPH
+ {0x9F59, 0x7102}, //5726 #CJK UNIFIED IDEOGRAPH
+ {0x9F5A, 0x7103}, //5727 #CJK UNIFIED IDEOGRAPH
+ {0x9F5B, 0x7104}, //5728 #CJK UNIFIED IDEOGRAPH
+ {0x9F5C, 0x7105}, //5729 #CJK UNIFIED IDEOGRAPH
+ {0x9F5D, 0x7106}, //5730 #CJK UNIFIED IDEOGRAPH
+ {0x9F5E, 0x7107}, //5731 #CJK UNIFIED IDEOGRAPH
+ {0x9F5F, 0x7108}, //5732 #CJK UNIFIED IDEOGRAPH
+ {0x9F60, 0x710B}, //5733 #CJK UNIFIED IDEOGRAPH
+ {0x9F61, 0x710C}, //5734 #CJK UNIFIED IDEOGRAPH
+ {0x9F62, 0x710D}, //5735 #CJK UNIFIED IDEOGRAPH
+ {0x9F63, 0x710E}, //5736 #CJK UNIFIED IDEOGRAPH
+ {0x9F64, 0x710F}, //5737 #CJK UNIFIED IDEOGRAPH
+ {0x9F65, 0x7111}, //5738 #CJK UNIFIED IDEOGRAPH
+ {0x9F66, 0x7112}, //5739 #CJK UNIFIED IDEOGRAPH
+ {0x9F67, 0x7114}, //5740 #CJK UNIFIED IDEOGRAPH
+ {0x9F68, 0x7117}, //5741 #CJK UNIFIED IDEOGRAPH
+ {0x9F69, 0x711B}, //5742 #CJK UNIFIED IDEOGRAPH
+ {0x9F6A, 0x711C}, //5743 #CJK UNIFIED IDEOGRAPH
+ {0x9F6B, 0x711D}, //5744 #CJK UNIFIED IDEOGRAPH
+ {0x9F6C, 0x711E}, //5745 #CJK UNIFIED IDEOGRAPH
+ {0x9F6D, 0x711F}, //5746 #CJK UNIFIED IDEOGRAPH
+ {0x9F6E, 0x7120}, //5747 #CJK UNIFIED IDEOGRAPH
+ {0x9F6F, 0x7121}, //5748 #CJK UNIFIED IDEOGRAPH
+ {0x9F70, 0x7122}, //5749 #CJK UNIFIED IDEOGRAPH
+ {0x9F71, 0x7123}, //5750 #CJK UNIFIED IDEOGRAPH
+ {0x9F72, 0x7124}, //5751 #CJK UNIFIED IDEOGRAPH
+ {0x9F73, 0x7125}, //5752 #CJK UNIFIED IDEOGRAPH
+ {0x9F74, 0x7127}, //5753 #CJK UNIFIED IDEOGRAPH
+ {0x9F75, 0x7128}, //5754 #CJK UNIFIED IDEOGRAPH
+ {0x9F76, 0x7129}, //5755 #CJK UNIFIED IDEOGRAPH
+ {0x9F77, 0x712A}, //5756 #CJK UNIFIED IDEOGRAPH
+ {0x9F78, 0x712B}, //5757 #CJK UNIFIED IDEOGRAPH
+ {0x9F79, 0x712C}, //5758 #CJK UNIFIED IDEOGRAPH
+ {0x9F7A, 0x712D}, //5759 #CJK UNIFIED IDEOGRAPH
+ {0x9F7B, 0x712E}, //5760 #CJK UNIFIED IDEOGRAPH
+ {0x9F7C, 0x7132}, //5761 #CJK UNIFIED IDEOGRAPH
+ {0x9F7D, 0x7133}, //5762 #CJK UNIFIED IDEOGRAPH
+ {0x9F7E, 0x7134}, //5763 #CJK UNIFIED IDEOGRAPH
+ {0x9F80, 0x7135}, //5764 #CJK UNIFIED IDEOGRAPH
+ {0x9F81, 0x7137}, //5765 #CJK UNIFIED IDEOGRAPH
+ {0x9F82, 0x7138}, //5766 #CJK UNIFIED IDEOGRAPH
+ {0x9F83, 0x7139}, //5767 #CJK UNIFIED IDEOGRAPH
+ {0x9F84, 0x713A}, //5768 #CJK UNIFIED IDEOGRAPH
+ {0x9F85, 0x713B}, //5769 #CJK UNIFIED IDEOGRAPH
+ {0x9F86, 0x713C}, //5770 #CJK UNIFIED IDEOGRAPH
+ {0x9F87, 0x713D}, //5771 #CJK UNIFIED IDEOGRAPH
+ {0x9F88, 0x713E}, //5772 #CJK UNIFIED IDEOGRAPH
+ {0x9F89, 0x713F}, //5773 #CJK UNIFIED IDEOGRAPH
+ {0x9F8A, 0x7140}, //5774 #CJK UNIFIED IDEOGRAPH
+ {0x9F8B, 0x7141}, //5775 #CJK UNIFIED IDEOGRAPH
+ {0x9F8C, 0x7142}, //5776 #CJK UNIFIED IDEOGRAPH
+ {0x9F8D, 0x7143}, //5777 #CJK UNIFIED IDEOGRAPH
+ {0x9F8E, 0x7144}, //5778 #CJK UNIFIED IDEOGRAPH
+ {0x9F8F, 0x7146}, //5779 #CJK UNIFIED IDEOGRAPH
+ {0x9F90, 0x7147}, //5780 #CJK UNIFIED IDEOGRAPH
+ {0x9F91, 0x7148}, //5781 #CJK UNIFIED IDEOGRAPH
+ {0x9F92, 0x7149}, //5782 #CJK UNIFIED IDEOGRAPH
+ {0x9F93, 0x714B}, //5783 #CJK UNIFIED IDEOGRAPH
+ {0x9F94, 0x714D}, //5784 #CJK UNIFIED IDEOGRAPH
+ {0x9F95, 0x714F}, //5785 #CJK UNIFIED IDEOGRAPH
+ {0x9F96, 0x7150}, //5786 #CJK UNIFIED IDEOGRAPH
+ {0x9F97, 0x7151}, //5787 #CJK UNIFIED IDEOGRAPH
+ {0x9F98, 0x7152}, //5788 #CJK UNIFIED IDEOGRAPH
+ {0x9F99, 0x7153}, //5789 #CJK UNIFIED IDEOGRAPH
+ {0x9F9A, 0x7154}, //5790 #CJK UNIFIED IDEOGRAPH
+ {0x9F9B, 0x7155}, //5791 #CJK UNIFIED IDEOGRAPH
+ {0x9F9C, 0x7156}, //5792 #CJK UNIFIED IDEOGRAPH
+ {0x9F9D, 0x7157}, //5793 #CJK UNIFIED IDEOGRAPH
+ {0x9F9E, 0x7158}, //5794 #CJK UNIFIED IDEOGRAPH
+ {0x9F9F, 0x7159}, //5795 #CJK UNIFIED IDEOGRAPH
+ {0x9FA0, 0x715A}, //5796 #CJK UNIFIED IDEOGRAPH
+ {0x9FA1, 0x715B}, //5797 #CJK UNIFIED IDEOGRAPH
+ {0x9FA2, 0x715D}, //5798 #CJK UNIFIED IDEOGRAPH
+ {0x9FA3, 0x715F}, //5799 #CJK UNIFIED IDEOGRAPH
+ {0x9FA4, 0x7160}, //5800 #CJK UNIFIED IDEOGRAPH
+ {0x9FA5, 0x7161}, //5801 #CJK UNIFIED IDEOGRAPH
+ {0x9FA6, 0x7162}, //5802 #CJK UNIFIED IDEOGRAPH
+ {0x9FA7, 0x7163}, //5803 #CJK UNIFIED IDEOGRAPH
+ {0x9FA8, 0x7165}, //5804 #CJK UNIFIED IDEOGRAPH
+ {0x9FA9, 0x7169}, //5805 #CJK UNIFIED IDEOGRAPH
+ {0x9FAA, 0x716A}, //5806 #CJK UNIFIED IDEOGRAPH
+ {0x9FAB, 0x716B}, //5807 #CJK UNIFIED IDEOGRAPH
+ {0x9FAC, 0x716C}, //5808 #CJK UNIFIED IDEOGRAPH
+ {0x9FAD, 0x716D}, //5809 #CJK UNIFIED IDEOGRAPH
+ {0x9FAE, 0x716F}, //5810 #CJK UNIFIED IDEOGRAPH
+ {0x9FAF, 0x7170}, //5811 #CJK UNIFIED IDEOGRAPH
+ {0x9FB0, 0x7171}, //5812 #CJK UNIFIED IDEOGRAPH
+ {0x9FB1, 0x7174}, //5813 #CJK UNIFIED IDEOGRAPH
+ {0x9FB2, 0x7175}, //5814 #CJK UNIFIED IDEOGRAPH
+ {0x9FB3, 0x7176}, //5815 #CJK UNIFIED IDEOGRAPH
+ {0x9FB4, 0x7177}, //5816 #CJK UNIFIED IDEOGRAPH
+ {0x9FB5, 0x7179}, //5817 #CJK UNIFIED IDEOGRAPH
+ {0x9FB6, 0x717B}, //5818 #CJK UNIFIED IDEOGRAPH
+ {0x9FB7, 0x717C}, //5819 #CJK UNIFIED IDEOGRAPH
+ {0x9FB8, 0x717E}, //5820 #CJK UNIFIED IDEOGRAPH
+ {0x9FB9, 0x717F}, //5821 #CJK UNIFIED IDEOGRAPH
+ {0x9FBA, 0x7180}, //5822 #CJK UNIFIED IDEOGRAPH
+ {0x9FBB, 0x7181}, //5823 #CJK UNIFIED IDEOGRAPH
+ {0x9FBC, 0x7182}, //5824 #CJK UNIFIED IDEOGRAPH
+ {0x9FBD, 0x7183}, //5825 #CJK UNIFIED IDEOGRAPH
+ {0x9FBE, 0x7185}, //5826 #CJK UNIFIED IDEOGRAPH
+ {0x9FBF, 0x7186}, //5827 #CJK UNIFIED IDEOGRAPH
+ {0x9FC0, 0x7187}, //5828 #CJK UNIFIED IDEOGRAPH
+ {0x9FC1, 0x7188}, //5829 #CJK UNIFIED IDEOGRAPH
+ {0x9FC2, 0x7189}, //5830 #CJK UNIFIED IDEOGRAPH
+ {0x9FC3, 0x718B}, //5831 #CJK UNIFIED IDEOGRAPH
+ {0x9FC4, 0x718C}, //5832 #CJK UNIFIED IDEOGRAPH
+ {0x9FC5, 0x718D}, //5833 #CJK UNIFIED IDEOGRAPH
+ {0x9FC6, 0x718E}, //5834 #CJK UNIFIED IDEOGRAPH
+ {0x9FC7, 0x7190}, //5835 #CJK UNIFIED IDEOGRAPH
+ {0x9FC8, 0x7191}, //5836 #CJK UNIFIED IDEOGRAPH
+ {0x9FC9, 0x7192}, //5837 #CJK UNIFIED IDEOGRAPH
+ {0x9FCA, 0x7193}, //5838 #CJK UNIFIED IDEOGRAPH
+ {0x9FCB, 0x7195}, //5839 #CJK UNIFIED IDEOGRAPH
+ {0x9FCC, 0x7196}, //5840 #CJK UNIFIED IDEOGRAPH
+ {0x9FCD, 0x7197}, //5841 #CJK UNIFIED IDEOGRAPH
+ {0x9FCE, 0x719A}, //5842 #CJK UNIFIED IDEOGRAPH
+ {0x9FCF, 0x719B}, //5843 #CJK UNIFIED IDEOGRAPH
+ {0x9FD0, 0x719C}, //5844 #CJK UNIFIED IDEOGRAPH
+ {0x9FD1, 0x719D}, //5845 #CJK UNIFIED IDEOGRAPH
+ {0x9FD2, 0x719E}, //5846 #CJK UNIFIED IDEOGRAPH
+ {0x9FD3, 0x71A1}, //5847 #CJK UNIFIED IDEOGRAPH
+ {0x9FD4, 0x71A2}, //5848 #CJK UNIFIED IDEOGRAPH
+ {0x9FD5, 0x71A3}, //5849 #CJK UNIFIED IDEOGRAPH
+ {0x9FD6, 0x71A4}, //5850 #CJK UNIFIED IDEOGRAPH
+ {0x9FD7, 0x71A5}, //5851 #CJK UNIFIED IDEOGRAPH
+ {0x9FD8, 0x71A6}, //5852 #CJK UNIFIED IDEOGRAPH
+ {0x9FD9, 0x71A7}, //5853 #CJK UNIFIED IDEOGRAPH
+ {0x9FDA, 0x71A9}, //5854 #CJK UNIFIED IDEOGRAPH
+ {0x9FDB, 0x71AA}, //5855 #CJK UNIFIED IDEOGRAPH
+ {0x9FDC, 0x71AB}, //5856 #CJK UNIFIED IDEOGRAPH
+ {0x9FDD, 0x71AD}, //5857 #CJK UNIFIED IDEOGRAPH
+ {0x9FDE, 0x71AE}, //5858 #CJK UNIFIED IDEOGRAPH
+ {0x9FDF, 0x71AF}, //5859 #CJK UNIFIED IDEOGRAPH
+ {0x9FE0, 0x71B0}, //5860 #CJK UNIFIED IDEOGRAPH
+ {0x9FE1, 0x71B1}, //5861 #CJK UNIFIED IDEOGRAPH
+ {0x9FE2, 0x71B2}, //5862 #CJK UNIFIED IDEOGRAPH
+ {0x9FE3, 0x71B4}, //5863 #CJK UNIFIED IDEOGRAPH
+ {0x9FE4, 0x71B6}, //5864 #CJK UNIFIED IDEOGRAPH
+ {0x9FE5, 0x71B7}, //5865 #CJK UNIFIED IDEOGRAPH
+ {0x9FE6, 0x71B8}, //5866 #CJK UNIFIED IDEOGRAPH
+ {0x9FE7, 0x71BA}, //5867 #CJK UNIFIED IDEOGRAPH
+ {0x9FE8, 0x71BB}, //5868 #CJK UNIFIED IDEOGRAPH
+ {0x9FE9, 0x71BC}, //5869 #CJK UNIFIED IDEOGRAPH
+ {0x9FEA, 0x71BD}, //5870 #CJK UNIFIED IDEOGRAPH
+ {0x9FEB, 0x71BE}, //5871 #CJK UNIFIED IDEOGRAPH
+ {0x9FEC, 0x71BF}, //5872 #CJK UNIFIED IDEOGRAPH
+ {0x9FED, 0x71C0}, //5873 #CJK UNIFIED IDEOGRAPH
+ {0x9FEE, 0x71C1}, //5874 #CJK UNIFIED IDEOGRAPH
+ {0x9FEF, 0x71C2}, //5875 #CJK UNIFIED IDEOGRAPH
+ {0x9FF0, 0x71C4}, //5876 #CJK UNIFIED IDEOGRAPH
+ {0x9FF1, 0x71C5}, //5877 #CJK UNIFIED IDEOGRAPH
+ {0x9FF2, 0x71C6}, //5878 #CJK UNIFIED IDEOGRAPH
+ {0x9FF3, 0x71C7}, //5879 #CJK UNIFIED IDEOGRAPH
+ {0x9FF4, 0x71C8}, //5880 #CJK UNIFIED IDEOGRAPH
+ {0x9FF5, 0x71C9}, //5881 #CJK UNIFIED IDEOGRAPH
+ {0x9FF6, 0x71CA}, //5882 #CJK UNIFIED IDEOGRAPH
+ {0x9FF7, 0x71CB}, //5883 #CJK UNIFIED IDEOGRAPH
+ {0x9FF8, 0x71CC}, //5884 #CJK UNIFIED IDEOGRAPH
+ {0x9FF9, 0x71CD}, //5885 #CJK UNIFIED IDEOGRAPH
+ {0x9FFA, 0x71CF}, //5886 #CJK UNIFIED IDEOGRAPH
+ {0x9FFB, 0x71D0}, //5887 #CJK UNIFIED IDEOGRAPH
+ {0x9FFC, 0x71D1}, //5888 #CJK UNIFIED IDEOGRAPH
+ {0x9FFD, 0x71D2}, //5889 #CJK UNIFIED IDEOGRAPH
+ {0x9FFE, 0x71D3}, //5890 #CJK UNIFIED IDEOGRAPH
+ {0xA040, 0x71D6}, //5891 #CJK UNIFIED IDEOGRAPH
+ {0xA041, 0x71D7}, //5892 #CJK UNIFIED IDEOGRAPH
+ {0xA042, 0x71D8}, //5893 #CJK UNIFIED IDEOGRAPH
+ {0xA043, 0x71D9}, //5894 #CJK UNIFIED IDEOGRAPH
+ {0xA044, 0x71DA}, //5895 #CJK UNIFIED IDEOGRAPH
+ {0xA045, 0x71DB}, //5896 #CJK UNIFIED IDEOGRAPH
+ {0xA046, 0x71DC}, //5897 #CJK UNIFIED IDEOGRAPH
+ {0xA047, 0x71DD}, //5898 #CJK UNIFIED IDEOGRAPH
+ {0xA048, 0x71DE}, //5899 #CJK UNIFIED IDEOGRAPH
+ {0xA049, 0x71DF}, //5900 #CJK UNIFIED IDEOGRAPH
+ {0xA04A, 0x71E1}, //5901 #CJK UNIFIED IDEOGRAPH
+ {0xA04B, 0x71E2}, //5902 #CJK UNIFIED IDEOGRAPH
+ {0xA04C, 0x71E3}, //5903 #CJK UNIFIED IDEOGRAPH
+ {0xA04D, 0x71E4}, //5904 #CJK UNIFIED IDEOGRAPH
+ {0xA04E, 0x71E6}, //5905 #CJK UNIFIED IDEOGRAPH
+ {0xA04F, 0x71E8}, //5906 #CJK UNIFIED IDEOGRAPH
+ {0xA050, 0x71E9}, //5907 #CJK UNIFIED IDEOGRAPH
+ {0xA051, 0x71EA}, //5908 #CJK UNIFIED IDEOGRAPH
+ {0xA052, 0x71EB}, //5909 #CJK UNIFIED IDEOGRAPH
+ {0xA053, 0x71EC}, //5910 #CJK UNIFIED IDEOGRAPH
+ {0xA054, 0x71ED}, //5911 #CJK UNIFIED IDEOGRAPH
+ {0xA055, 0x71EF}, //5912 #CJK UNIFIED IDEOGRAPH
+ {0xA056, 0x71F0}, //5913 #CJK UNIFIED IDEOGRAPH
+ {0xA057, 0x71F1}, //5914 #CJK UNIFIED IDEOGRAPH
+ {0xA058, 0x71F2}, //5915 #CJK UNIFIED IDEOGRAPH
+ {0xA059, 0x71F3}, //5916 #CJK UNIFIED IDEOGRAPH
+ {0xA05A, 0x71F4}, //5917 #CJK UNIFIED IDEOGRAPH
+ {0xA05B, 0x71F5}, //5918 #CJK UNIFIED IDEOGRAPH
+ {0xA05C, 0x71F6}, //5919 #CJK UNIFIED IDEOGRAPH
+ {0xA05D, 0x71F7}, //5920 #CJK UNIFIED IDEOGRAPH
+ {0xA05E, 0x71F8}, //5921 #CJK UNIFIED IDEOGRAPH
+ {0xA05F, 0x71FA}, //5922 #CJK UNIFIED IDEOGRAPH
+ {0xA060, 0x71FB}, //5923 #CJK UNIFIED IDEOGRAPH
+ {0xA061, 0x71FC}, //5924 #CJK UNIFIED IDEOGRAPH
+ {0xA062, 0x71FD}, //5925 #CJK UNIFIED IDEOGRAPH
+ {0xA063, 0x71FE}, //5926 #CJK UNIFIED IDEOGRAPH
+ {0xA064, 0x71FF}, //5927 #CJK UNIFIED IDEOGRAPH
+ {0xA065, 0x7200}, //5928 #CJK UNIFIED IDEOGRAPH
+ {0xA066, 0x7201}, //5929 #CJK UNIFIED IDEOGRAPH
+ {0xA067, 0x7202}, //5930 #CJK UNIFIED IDEOGRAPH
+ {0xA068, 0x7203}, //5931 #CJK UNIFIED IDEOGRAPH
+ {0xA069, 0x7204}, //5932 #CJK UNIFIED IDEOGRAPH
+ {0xA06A, 0x7205}, //5933 #CJK UNIFIED IDEOGRAPH
+ {0xA06B, 0x7207}, //5934 #CJK UNIFIED IDEOGRAPH
+ {0xA06C, 0x7208}, //5935 #CJK UNIFIED IDEOGRAPH
+ {0xA06D, 0x7209}, //5936 #CJK UNIFIED IDEOGRAPH
+ {0xA06E, 0x720A}, //5937 #CJK UNIFIED IDEOGRAPH
+ {0xA06F, 0x720B}, //5938 #CJK UNIFIED IDEOGRAPH
+ {0xA070, 0x720C}, //5939 #CJK UNIFIED IDEOGRAPH
+ {0xA071, 0x720D}, //5940 #CJK UNIFIED IDEOGRAPH
+ {0xA072, 0x720E}, //5941 #CJK UNIFIED IDEOGRAPH
+ {0xA073, 0x720F}, //5942 #CJK UNIFIED IDEOGRAPH
+ {0xA074, 0x7210}, //5943 #CJK UNIFIED IDEOGRAPH
+ {0xA075, 0x7211}, //5944 #CJK UNIFIED IDEOGRAPH
+ {0xA076, 0x7212}, //5945 #CJK UNIFIED IDEOGRAPH
+ {0xA077, 0x7213}, //5946 #CJK UNIFIED IDEOGRAPH
+ {0xA078, 0x7214}, //5947 #CJK UNIFIED IDEOGRAPH
+ {0xA079, 0x7215}, //5948 #CJK UNIFIED IDEOGRAPH
+ {0xA07A, 0x7216}, //5949 #CJK UNIFIED IDEOGRAPH
+ {0xA07B, 0x7217}, //5950 #CJK UNIFIED IDEOGRAPH
+ {0xA07C, 0x7218}, //5951 #CJK UNIFIED IDEOGRAPH
+ {0xA07D, 0x7219}, //5952 #CJK UNIFIED IDEOGRAPH
+ {0xA07E, 0x721A}, //5953 #CJK UNIFIED IDEOGRAPH
+ {0xA080, 0x721B}, //5954 #CJK UNIFIED IDEOGRAPH
+ {0xA081, 0x721C}, //5955 #CJK UNIFIED IDEOGRAPH
+ {0xA082, 0x721E}, //5956 #CJK UNIFIED IDEOGRAPH
+ {0xA083, 0x721F}, //5957 #CJK UNIFIED IDEOGRAPH
+ {0xA084, 0x7220}, //5958 #CJK UNIFIED IDEOGRAPH
+ {0xA085, 0x7221}, //5959 #CJK UNIFIED IDEOGRAPH
+ {0xA086, 0x7222}, //5960 #CJK UNIFIED IDEOGRAPH
+ {0xA087, 0x7223}, //5961 #CJK UNIFIED IDEOGRAPH
+ {0xA088, 0x7224}, //5962 #CJK UNIFIED IDEOGRAPH
+ {0xA089, 0x7225}, //5963 #CJK UNIFIED IDEOGRAPH
+ {0xA08A, 0x7226}, //5964 #CJK UNIFIED IDEOGRAPH
+ {0xA08B, 0x7227}, //5965 #CJK UNIFIED IDEOGRAPH
+ {0xA08C, 0x7229}, //5966 #CJK UNIFIED IDEOGRAPH
+ {0xA08D, 0x722B}, //5967 #CJK UNIFIED IDEOGRAPH
+ {0xA08E, 0x722D}, //5968 #CJK UNIFIED IDEOGRAPH
+ {0xA08F, 0x722E}, //5969 #CJK UNIFIED IDEOGRAPH
+ {0xA090, 0x722F}, //5970 #CJK UNIFIED IDEOGRAPH
+ {0xA091, 0x7232}, //5971 #CJK UNIFIED IDEOGRAPH
+ {0xA092, 0x7233}, //5972 #CJK UNIFIED IDEOGRAPH
+ {0xA093, 0x7234}, //5973 #CJK UNIFIED IDEOGRAPH
+ {0xA094, 0x723A}, //5974 #CJK UNIFIED IDEOGRAPH
+ {0xA095, 0x723C}, //5975 #CJK UNIFIED IDEOGRAPH
+ {0xA096, 0x723E}, //5976 #CJK UNIFIED IDEOGRAPH
+ {0xA097, 0x7240}, //5977 #CJK UNIFIED IDEOGRAPH
+ {0xA098, 0x7241}, //5978 #CJK UNIFIED IDEOGRAPH
+ {0xA099, 0x7242}, //5979 #CJK UNIFIED IDEOGRAPH
+ {0xA09A, 0x7243}, //5980 #CJK UNIFIED IDEOGRAPH
+ {0xA09B, 0x7244}, //5981 #CJK UNIFIED IDEOGRAPH
+ {0xA09C, 0x7245}, //5982 #CJK UNIFIED IDEOGRAPH
+ {0xA09D, 0x7246}, //5983 #CJK UNIFIED IDEOGRAPH
+ {0xA09E, 0x7249}, //5984 #CJK UNIFIED IDEOGRAPH
+ {0xA09F, 0x724A}, //5985 #CJK UNIFIED IDEOGRAPH
+ {0xA0A0, 0x724B}, //5986 #CJK UNIFIED IDEOGRAPH
+ {0xA0A1, 0x724E}, //5987 #CJK UNIFIED IDEOGRAPH
+ {0xA0A2, 0x724F}, //5988 #CJK UNIFIED IDEOGRAPH
+ {0xA0A3, 0x7250}, //5989 #CJK UNIFIED IDEOGRAPH
+ {0xA0A4, 0x7251}, //5990 #CJK UNIFIED IDEOGRAPH
+ {0xA0A5, 0x7253}, //5991 #CJK UNIFIED IDEOGRAPH
+ {0xA0A6, 0x7254}, //5992 #CJK UNIFIED IDEOGRAPH
+ {0xA0A7, 0x7255}, //5993 #CJK UNIFIED IDEOGRAPH
+ {0xA0A8, 0x7257}, //5994 #CJK UNIFIED IDEOGRAPH
+ {0xA0A9, 0x7258}, //5995 #CJK UNIFIED IDEOGRAPH
+ {0xA0AA, 0x725A}, //5996 #CJK UNIFIED IDEOGRAPH
+ {0xA0AB, 0x725C}, //5997 #CJK UNIFIED IDEOGRAPH
+ {0xA0AC, 0x725E}, //5998 #CJK UNIFIED IDEOGRAPH
+ {0xA0AD, 0x7260}, //5999 #CJK UNIFIED IDEOGRAPH
+ {0xA0AE, 0x7263}, //6000 #CJK UNIFIED IDEOGRAPH
+ {0xA0AF, 0x7264}, //6001 #CJK UNIFIED IDEOGRAPH
+ {0xA0B0, 0x7265}, //6002 #CJK UNIFIED IDEOGRAPH
+ {0xA0B1, 0x7268}, //6003 #CJK UNIFIED IDEOGRAPH
+ {0xA0B2, 0x726A}, //6004 #CJK UNIFIED IDEOGRAPH
+ {0xA0B3, 0x726B}, //6005 #CJK UNIFIED IDEOGRAPH
+ {0xA0B4, 0x726C}, //6006 #CJK UNIFIED IDEOGRAPH
+ {0xA0B5, 0x726D}, //6007 #CJK UNIFIED IDEOGRAPH
+ {0xA0B6, 0x7270}, //6008 #CJK UNIFIED IDEOGRAPH
+ {0xA0B7, 0x7271}, //6009 #CJK UNIFIED IDEOGRAPH
+ {0xA0B8, 0x7273}, //6010 #CJK UNIFIED IDEOGRAPH
+ {0xA0B9, 0x7274}, //6011 #CJK UNIFIED IDEOGRAPH
+ {0xA0BA, 0x7276}, //6012 #CJK UNIFIED IDEOGRAPH
+ {0xA0BB, 0x7277}, //6013 #CJK UNIFIED IDEOGRAPH
+ {0xA0BC, 0x7278}, //6014 #CJK UNIFIED IDEOGRAPH
+ {0xA0BD, 0x727B}, //6015 #CJK UNIFIED IDEOGRAPH
+ {0xA0BE, 0x727C}, //6016 #CJK UNIFIED IDEOGRAPH
+ {0xA0BF, 0x727D}, //6017 #CJK UNIFIED IDEOGRAPH
+ {0xA0C0, 0x7282}, //6018 #CJK UNIFIED IDEOGRAPH
+ {0xA0C1, 0x7283}, //6019 #CJK UNIFIED IDEOGRAPH
+ {0xA0C2, 0x7285}, //6020 #CJK UNIFIED IDEOGRAPH
+ {0xA0C3, 0x7286}, //6021 #CJK UNIFIED IDEOGRAPH
+ {0xA0C4, 0x7287}, //6022 #CJK UNIFIED IDEOGRAPH
+ {0xA0C5, 0x7288}, //6023 #CJK UNIFIED IDEOGRAPH
+ {0xA0C6, 0x7289}, //6024 #CJK UNIFIED IDEOGRAPH
+ {0xA0C7, 0x728C}, //6025 #CJK UNIFIED IDEOGRAPH
+ {0xA0C8, 0x728E}, //6026 #CJK UNIFIED IDEOGRAPH
+ {0xA0C9, 0x7290}, //6027 #CJK UNIFIED IDEOGRAPH
+ {0xA0CA, 0x7291}, //6028 #CJK UNIFIED IDEOGRAPH
+ {0xA0CB, 0x7293}, //6029 #CJK UNIFIED IDEOGRAPH
+ {0xA0CC, 0x7294}, //6030 #CJK UNIFIED IDEOGRAPH
+ {0xA0CD, 0x7295}, //6031 #CJK UNIFIED IDEOGRAPH
+ {0xA0CE, 0x7296}, //6032 #CJK UNIFIED IDEOGRAPH
+ {0xA0CF, 0x7297}, //6033 #CJK UNIFIED IDEOGRAPH
+ {0xA0D0, 0x7298}, //6034 #CJK UNIFIED IDEOGRAPH
+ {0xA0D1, 0x7299}, //6035 #CJK UNIFIED IDEOGRAPH
+ {0xA0D2, 0x729A}, //6036 #CJK UNIFIED IDEOGRAPH
+ {0xA0D3, 0x729B}, //6037 #CJK UNIFIED IDEOGRAPH
+ {0xA0D4, 0x729C}, //6038 #CJK UNIFIED IDEOGRAPH
+ {0xA0D5, 0x729D}, //6039 #CJK UNIFIED IDEOGRAPH
+ {0xA0D6, 0x729E}, //6040 #CJK UNIFIED IDEOGRAPH
+ {0xA0D7, 0x72A0}, //6041 #CJK UNIFIED IDEOGRAPH
+ {0xA0D8, 0x72A1}, //6042 #CJK UNIFIED IDEOGRAPH
+ {0xA0D9, 0x72A2}, //6043 #CJK UNIFIED IDEOGRAPH
+ {0xA0DA, 0x72A3}, //6044 #CJK UNIFIED IDEOGRAPH
+ {0xA0DB, 0x72A4}, //6045 #CJK UNIFIED IDEOGRAPH
+ {0xA0DC, 0x72A5}, //6046 #CJK UNIFIED IDEOGRAPH
+ {0xA0DD, 0x72A6}, //6047 #CJK UNIFIED IDEOGRAPH
+ {0xA0DE, 0x72A7}, //6048 #CJK UNIFIED IDEOGRAPH
+ {0xA0DF, 0x72A8}, //6049 #CJK UNIFIED IDEOGRAPH
+ {0xA0E0, 0x72A9}, //6050 #CJK UNIFIED IDEOGRAPH
+ {0xA0E1, 0x72AA}, //6051 #CJK UNIFIED IDEOGRAPH
+ {0xA0E2, 0x72AB}, //6052 #CJK UNIFIED IDEOGRAPH
+ {0xA0E3, 0x72AE}, //6053 #CJK UNIFIED IDEOGRAPH
+ {0xA0E4, 0x72B1}, //6054 #CJK UNIFIED IDEOGRAPH
+ {0xA0E5, 0x72B2}, //6055 #CJK UNIFIED IDEOGRAPH
+ {0xA0E6, 0x72B3}, //6056 #CJK UNIFIED IDEOGRAPH
+ {0xA0E7, 0x72B5}, //6057 #CJK UNIFIED IDEOGRAPH
+ {0xA0E8, 0x72BA}, //6058 #CJK UNIFIED IDEOGRAPH
+ {0xA0E9, 0x72BB}, //6059 #CJK UNIFIED IDEOGRAPH
+ {0xA0EA, 0x72BC}, //6060 #CJK UNIFIED IDEOGRAPH
+ {0xA0EB, 0x72BD}, //6061 #CJK UNIFIED IDEOGRAPH
+ {0xA0EC, 0x72BE}, //6062 #CJK UNIFIED IDEOGRAPH
+ {0xA0ED, 0x72BF}, //6063 #CJK UNIFIED IDEOGRAPH
+ {0xA0EE, 0x72C0}, //6064 #CJK UNIFIED IDEOGRAPH
+ {0xA0EF, 0x72C5}, //6065 #CJK UNIFIED IDEOGRAPH
+ {0xA0F0, 0x72C6}, //6066 #CJK UNIFIED IDEOGRAPH
+ {0xA0F1, 0x72C7}, //6067 #CJK UNIFIED IDEOGRAPH
+ {0xA0F2, 0x72C9}, //6068 #CJK UNIFIED IDEOGRAPH
+ {0xA0F3, 0x72CA}, //6069 #CJK UNIFIED IDEOGRAPH
+ {0xA0F4, 0x72CB}, //6070 #CJK UNIFIED IDEOGRAPH
+ {0xA0F5, 0x72CC}, //6071 #CJK UNIFIED IDEOGRAPH
+ {0xA0F6, 0x72CF}, //6072 #CJK UNIFIED IDEOGRAPH
+ {0xA0F7, 0x72D1}, //6073 #CJK UNIFIED IDEOGRAPH
+ {0xA0F8, 0x72D3}, //6074 #CJK UNIFIED IDEOGRAPH
+ {0xA0F9, 0x72D4}, //6075 #CJK UNIFIED IDEOGRAPH
+ {0xA0FA, 0x72D5}, //6076 #CJK UNIFIED IDEOGRAPH
+ {0xA0FB, 0x72D6}, //6077 #CJK UNIFIED IDEOGRAPH
+ {0xA0FC, 0x72D8}, //6078 #CJK UNIFIED IDEOGRAPH
+ {0xA0FD, 0x72DA}, //6079 #CJK UNIFIED IDEOGRAPH
+ {0xA0FE, 0x72DB}, //6080 #CJK UNIFIED IDEOGRAPH
+ {0xA1A1, 0x3000}, //6081 #IDEOGRAPHIC SPACE
+ {0xA1A2, 0x3001}, //6082 #IDEOGRAPHIC COMMA
+ {0xA1A3, 0x3002}, //6083 #IDEOGRAPHIC FULL STOP
+ {0xA1A4, 0x00B7}, //6084 #MIDDLE DOT
+ {0xA1A5, 0x02C9}, //6085 #MODIFIER LETTER MACRON
+ {0xA1A6, 0x02C7}, //6086 #CARON
+ {0xA1A7, 0x00A8}, //6087 #DIAERESIS
+ {0xA1A8, 0x3003}, //6088 #DITTO MARK
+ {0xA1A9, 0x3005}, //6089 #IDEOGRAPHIC ITERATION MARK
+ {0xA1AA, 0x2014}, //6090 #EM DASH
+ {0xA1AB, 0xFF5E}, //6091 #FULLWIDTH TILDE
+ {0xA1AC, 0x2016}, //6092 #DOUBLE VERTICAL LINE
+ {0xA1AD, 0x2026}, //6093 #HORIZONTAL ELLIPSIS
+ {0xA1AE, 0x2018}, //6094 #LEFT SINGLE QUOTATION MARK
+ {0xA1AF, 0x2019}, //6095 #RIGHT SINGLE QUOTATION MARK
+ {0xA1B0, 0x201C}, //6096 #LEFT DOUBLE QUOTATION MARK
+ {0xA1B1, 0x201D}, //6097 #RIGHT DOUBLE QUOTATION MARK
+ {0xA1B2, 0x3014}, //6098 #LEFT TORTOISE SHELL BRACKET
+ {0xA1B3, 0x3015}, //6099 #RIGHT TORTOISE SHELL BRACKET
+ {0xA1B4, 0x3008}, //6100 #LEFT ANGLE BRACKET
+ {0xA1B5, 0x3009}, //6101 #RIGHT ANGLE BRACKET
+ {0xA1B6, 0x300A}, //6102 #LEFT DOUBLE ANGLE BRACKET
+ {0xA1B7, 0x300B}, //6103 #RIGHT DOUBLE ANGLE BRACKET
+ {0xA1B8, 0x300C}, //6104 #LEFT CORNER BRACKET
+ {0xA1B9, 0x300D}, //6105 #RIGHT CORNER BRACKET
+ {0xA1BA, 0x300E}, //6106 #LEFT WHITE CORNER BRACKET
+ {0xA1BB, 0x300F}, //6107 #RIGHT WHITE CORNER BRACKET
+ {0xA1BC, 0x3016}, //6108 #LEFT WHITE LENTICULAR BRACKET
+ {0xA1BD, 0x3017}, //6109 #RIGHT WHITE LENTICULAR BRACKET
+ {0xA1BE, 0x3010}, //6110 #LEFT BLACK LENTICULAR BRACKET
+ {0xA1BF, 0x3011}, //6111 #RIGHT BLACK LENTICULAR BRACKET
+ {0xA1C0, 0x00B1}, //6112 #PLUS-MINUS SIGN
+ {0xA1C1, 0x00D7}, //6113 #MULTIPLICATION SIGN
+ {0xA1C2, 0x00F7}, //6114 #DIVISION SIGN
+ {0xA1C3, 0x2236}, //6115 #RATIO
+ {0xA1C4, 0x2227}, //6116 #LOGICAL AND
+ {0xA1C5, 0x2228}, //6117 #LOGICAL OR
+ {0xA1C6, 0x2211}, //6118 #N-ARY SUMMATION
+ {0xA1C7, 0x220F}, //6119 #N-ARY PRODUCT
+ {0xA1C8, 0x222A}, //6120 #UNION
+ {0xA1C9, 0x2229}, //6121 #INTERSECTION
+ {0xA1CA, 0x2208}, //6122 #ELEMENT OF
+ {0xA1CB, 0x2237}, //6123 #PROPORTION
+ {0xA1CC, 0x221A}, //6124 #SQUARE ROOT
+ {0xA1CD, 0x22A5}, //6125 #UP TACK
+ {0xA1CE, 0x2225}, //6126 #PARALLEL TO
+ {0xA1CF, 0x2220}, //6127 #ANGLE
+ {0xA1D0, 0x2312}, //6128 #ARC
+ {0xA1D1, 0x2299}, //6129 #CIRCLED DOT OPERATOR
+ {0xA1D2, 0x222B}, //6130 #INTEGRAL
+ {0xA1D3, 0x222E}, //6131 #CONTOUR INTEGRAL
+ {0xA1D4, 0x2261}, //6132 #IDENTICAL TO
+ {0xA1D5, 0x224C}, //6133 #ALL EQUAL TO
+ {0xA1D6, 0x2248}, //6134 #ALMOST EQUAL TO
+ {0xA1D7, 0x223D}, //6135 #REVERSED TILDE
+ {0xA1D8, 0x221D}, //6136 #PROPORTIONAL TO
+ {0xA1D9, 0x2260}, //6137 #NOT EQUAL TO
+ {0xA1DA, 0x226E}, //6138 #NOT LESS-THAN
+ {0xA1DB, 0x226F}, //6139 #NOT GREATER-THAN
+ {0xA1DC, 0x2264}, //6140 #LESS-THAN OR EQUAL TO
+ {0xA1DD, 0x2265}, //6141 #GREATER-THAN OR EQUAL TO
+ {0xA1DE, 0x221E}, //6142 #INFINITY
+ {0xA1DF, 0x2235}, //6143 #BECAUSE
+ {0xA1E0, 0x2234}, //6144 #THEREFORE
+ {0xA1E1, 0x2642}, //6145 #MALE SIGN
+ {0xA1E2, 0x2640}, //6146 #FEMALE SIGN
+ {0xA1E3, 0x00B0}, //6147 #DEGREE SIGN
+ {0xA1E4, 0x2032}, //6148 #PRIME
+ {0xA1E5, 0x2033}, //6149 #DOUBLE PRIME
+ {0xA1E6, 0x2103}, //6150 #DEGREE CELSIUS
+ {0xA1E7, 0xFF04}, //6151 #FULLWIDTH DOLLAR SIGN
+ {0xA1E8, 0x00A4}, //6152 #CURRENCY SIGN
+ {0xA1E9, 0xFFE0}, //6153 #FULLWIDTH CENT SIGN
+ {0xA1EA, 0xFFE1}, //6154 #FULLWIDTH POUND SIGN
+ {0xA1EB, 0x2030}, //6155 #PER MILLE SIGN
+ {0xA1EC, 0x00A7}, //6156 #SECTION SIGN
+ {0xA1ED, 0x2116}, //6157 #NUMERO SIGN
+ {0xA1EE, 0x2606}, //6158 #WHITE STAR
+ {0xA1EF, 0x2605}, //6159 #BLACK STAR
+ {0xA1F0, 0x25CB}, //6160 #WHITE CIRCLE
+ {0xA1F1, 0x25CF}, //6161 #BLACK CIRCLE
+ {0xA1F2, 0x25CE}, //6162 #BULLSEYE
+ {0xA1F3, 0x25C7}, //6163 #WHITE DIAMOND
+ {0xA1F4, 0x25C6}, //6164 #BLACK DIAMOND
+ {0xA1F5, 0x25A1}, //6165 #WHITE SQUARE
+ {0xA1F6, 0x25A0}, //6166 #BLACK SQUARE
+ {0xA1F7, 0x25B3}, //6167 #WHITE UP-POINTING TRIANGLE
+ {0xA1F8, 0x25B2}, //6168 #BLACK UP-POINTING TRIANGLE
+ {0xA1F9, 0x203B}, //6169 #REFERENCE MARK
+ {0xA1FA, 0x2192}, //6170 #RIGHTWARDS ARROW
+ {0xA1FB, 0x2190}, //6171 #LEFTWARDS ARROW
+ {0xA1FC, 0x2191}, //6172 #UPWARDS ARROW
+ {0xA1FD, 0x2193}, //6173 #DOWNWARDS ARROW
+ {0xA1FE, 0x3013}, //6174 #GETA MARK
+ {0xA2A1, 0x2170}, //6175 #SMALL ROMAN NUMERAL ONE
+ {0xA2A2, 0x2171}, //6176 #SMALL ROMAN NUMERAL TWO
+ {0xA2A3, 0x2172}, //6177 #SMALL ROMAN NUMERAL THREE
+ {0xA2A4, 0x2173}, //6178 #SMALL ROMAN NUMERAL FOUR
+ {0xA2A5, 0x2174}, //6179 #SMALL ROMAN NUMERAL FIVE
+ {0xA2A6, 0x2175}, //6180 #SMALL ROMAN NUMERAL SIX
+ {0xA2A7, 0x2176}, //6181 #SMALL ROMAN NUMERAL SEVEN
+ {0xA2A8, 0x2177}, //6182 #SMALL ROMAN NUMERAL EIGHT
+ {0xA2A9, 0x2178}, //6183 #SMALL ROMAN NUMERAL NINE
+ {0xA2AA, 0x2179}, //6184 #SMALL ROMAN NUMERAL TEN
+ {0xA2B1, 0x2488}, //6185 #DIGIT ONE FULL STOP
+ {0xA2B2, 0x2489}, //6186 #DIGIT TWO FULL STOP
+ {0xA2B3, 0x248A}, //6187 #DIGIT THREE FULL STOP
+ {0xA2B4, 0x248B}, //6188 #DIGIT FOUR FULL STOP
+ {0xA2B5, 0x248C}, //6189 #DIGIT FIVE FULL STOP
+ {0xA2B6, 0x248D}, //6190 #DIGIT SIX FULL STOP
+ {0xA2B7, 0x248E}, //6191 #DIGIT SEVEN FULL STOP
+ {0xA2B8, 0x248F}, //6192 #DIGIT EIGHT FULL STOP
+ {0xA2B9, 0x2490}, //6193 #DIGIT NINE FULL STOP
+ {0xA2BA, 0x2491}, //6194 #NUMBER TEN FULL STOP
+ {0xA2BB, 0x2492}, //6195 #NUMBER ELEVEN FULL STOP
+ {0xA2BC, 0x2493}, //6196 #NUMBER TWELVE FULL STOP
+ {0xA2BD, 0x2494}, //6197 #NUMBER THIRTEEN FULL STOP
+ {0xA2BE, 0x2495}, //6198 #NUMBER FOURTEEN FULL STOP
+ {0xA2BF, 0x2496}, //6199 #NUMBER FIFTEEN FULL STOP
+ {0xA2C0, 0x2497}, //6200 #NUMBER SIXTEEN FULL STOP
+ {0xA2C1, 0x2498}, //6201 #NUMBER SEVENTEEN FULL STOP
+ {0xA2C2, 0x2499}, //6202 #NUMBER EIGHTEEN FULL STOP
+ {0xA2C3, 0x249A}, //6203 #NUMBER NINETEEN FULL STOP
+ {0xA2C4, 0x249B}, //6204 #NUMBER TWENTY FULL STOP
+ {0xA2C5, 0x2474}, //6205 #PARENTHESIZED DIGIT ONE
+ {0xA2C6, 0x2475}, //6206 #PARENTHESIZED DIGIT TWO
+ {0xA2C7, 0x2476}, //6207 #PARENTHESIZED DIGIT THREE
+ {0xA2C8, 0x2477}, //6208 #PARENTHESIZED DIGIT FOUR
+ {0xA2C9, 0x2478}, //6209 #PARENTHESIZED DIGIT FIVE
+ {0xA2CA, 0x2479}, //6210 #PARENTHESIZED DIGIT SIX
+ {0xA2CB, 0x247A}, //6211 #PARENTHESIZED DIGIT SEVEN
+ {0xA2CC, 0x247B}, //6212 #PARENTHESIZED DIGIT EIGHT
+ {0xA2CD, 0x247C}, //6213 #PARENTHESIZED DIGIT NINE
+ {0xA2CE, 0x247D}, //6214 #PARENTHESIZED NUMBER TEN
+ {0xA2CF, 0x247E}, //6215 #PARENTHESIZED NUMBER ELEVEN
+ {0xA2D0, 0x247F}, //6216 #PARENTHESIZED NUMBER TWELVE
+ {0xA2D1, 0x2480}, //6217 #PARENTHESIZED NUMBER THIRTEEN
+ {0xA2D2, 0x2481}, //6218 #PARENTHESIZED NUMBER FOURTEEN
+ {0xA2D3, 0x2482}, //6219 #PARENTHESIZED NUMBER FIFTEEN
+ {0xA2D4, 0x2483}, //6220 #PARENTHESIZED NUMBER SIXTEEN
+ {0xA2D5, 0x2484}, //6221 #PARENTHESIZED NUMBER SEVENTEEN
+ {0xA2D6, 0x2485}, //6222 #PARENTHESIZED NUMBER EIGHTEEN
+ {0xA2D7, 0x2486}, //6223 #PARENTHESIZED NUMBER NINETEEN
+ {0xA2D8, 0x2487}, //6224 #PARENTHESIZED NUMBER TWENTY
+ {0xA2D9, 0x2460}, //6225 #CIRCLED DIGIT ONE
+ {0xA2DA, 0x2461}, //6226 #CIRCLED DIGIT TWO
+ {0xA2DB, 0x2462}, //6227 #CIRCLED DIGIT THREE
+ {0xA2DC, 0x2463}, //6228 #CIRCLED DIGIT FOUR
+ {0xA2DD, 0x2464}, //6229 #CIRCLED DIGIT FIVE
+ {0xA2DE, 0x2465}, //6230 #CIRCLED DIGIT SIX
+ {0xA2DF, 0x2466}, //6231 #CIRCLED DIGIT SEVEN
+ {0xA2E0, 0x2467}, //6232 #CIRCLED DIGIT EIGHT
+ {0xA2E1, 0x2468}, //6233 #CIRCLED DIGIT NINE
+ {0xA2E2, 0x2469}, //6234 #CIRCLED NUMBER TEN
+ {0xA2E5, 0x3220}, //6235 #PARENTHESIZED IDEOGRAPH ONE
+ {0xA2E6, 0x3221}, //6236 #PARENTHESIZED IDEOGRAPH TWO
+ {0xA2E7, 0x3222}, //6237 #PARENTHESIZED IDEOGRAPH THREE
+ {0xA2E8, 0x3223}, //6238 #PARENTHESIZED IDEOGRAPH FOUR
+ {0xA2E9, 0x3224}, //6239 #PARENTHESIZED IDEOGRAPH FIVE
+ {0xA2EA, 0x3225}, //6240 #PARENTHESIZED IDEOGRAPH SIX
+ {0xA2EB, 0x3226}, //6241 #PARENTHESIZED IDEOGRAPH SEVEN
+ {0xA2EC, 0x3227}, //6242 #PARENTHESIZED IDEOGRAPH EIGHT
+ {0xA2ED, 0x3228}, //6243 #PARENTHESIZED IDEOGRAPH NINE
+ {0xA2EE, 0x3229}, //6244 #PARENTHESIZED IDEOGRAPH TEN
+ {0xA2F1, 0x2160}, //6245 #ROMAN NUMERAL ONE
+ {0xA2F2, 0x2161}, //6246 #ROMAN NUMERAL TWO
+ {0xA2F3, 0x2162}, //6247 #ROMAN NUMERAL THREE
+ {0xA2F4, 0x2163}, //6248 #ROMAN NUMERAL FOUR
+ {0xA2F5, 0x2164}, //6249 #ROMAN NUMERAL FIVE
+ {0xA2F6, 0x2165}, //6250 #ROMAN NUMERAL SIX
+ {0xA2F7, 0x2166}, //6251 #ROMAN NUMERAL SEVEN
+ {0xA2F8, 0x2167}, //6252 #ROMAN NUMERAL EIGHT
+ {0xA2F9, 0x2168}, //6253 #ROMAN NUMERAL NINE
+ {0xA2FA, 0x2169}, //6254 #ROMAN NUMERAL TEN
+ {0xA2FB, 0x216A}, //6255 #ROMAN NUMERAL ELEVEN
+ {0xA2FC, 0x216B}, //6256 #ROMAN NUMERAL TWELVE
+ {0xA3A1, 0xFF01}, //6257 #FULLWIDTH EXCLAMATION MARK
+ {0xA3A2, 0xFF02}, //6258 #FULLWIDTH QUOTATION MARK
+ {0xA3A3, 0xFF03}, //6259 #FULLWIDTH NUMBER SIGN
+ {0xA3A4, 0xFFE5}, //6260 #FULLWIDTH YEN SIGN
+ {0xA3A5, 0xFF05}, //6261 #FULLWIDTH PERCENT SIGN
+ {0xA3A6, 0xFF06}, //6262 #FULLWIDTH AMPERSAND
+ {0xA3A7, 0xFF07}, //6263 #FULLWIDTH APOSTROPHE
+ {0xA3A8, 0xFF08}, //6264 #FULLWIDTH LEFT PARENTHESIS
+ {0xA3A9, 0xFF09}, //6265 #FULLWIDTH RIGHT PARENTHESIS
+ {0xA3AA, 0xFF0A}, //6266 #FULLWIDTH ASTERISK
+ {0xA3AB, 0xFF0B}, //6267 #FULLWIDTH PLUS SIGN
+ {0xA3AC, 0xFF0C}, //6268 #FULLWIDTH COMMA
+ {0xA3AD, 0xFF0D}, //6269 #FULLWIDTH HYPHEN-MINUS
+ {0xA3AE, 0xFF0E}, //6270 #FULLWIDTH FULL STOP
+ {0xA3AF, 0xFF0F}, //6271 #FULLWIDTH SOLIDUS
+ {0xA3B0, 0xFF10}, //6272 #FULLWIDTH DIGIT ZERO
+ {0xA3B1, 0xFF11}, //6273 #FULLWIDTH DIGIT ONE
+ {0xA3B2, 0xFF12}, //6274 #FULLWIDTH DIGIT TWO
+ {0xA3B3, 0xFF13}, //6275 #FULLWIDTH DIGIT THREE
+ {0xA3B4, 0xFF14}, //6276 #FULLWIDTH DIGIT FOUR
+ {0xA3B5, 0xFF15}, //6277 #FULLWIDTH DIGIT FIVE
+ {0xA3B6, 0xFF16}, //6278 #FULLWIDTH DIGIT SIX
+ {0xA3B7, 0xFF17}, //6279 #FULLWIDTH DIGIT SEVEN
+ {0xA3B8, 0xFF18}, //6280 #FULLWIDTH DIGIT EIGHT
+ {0xA3B9, 0xFF19}, //6281 #FULLWIDTH DIGIT NINE
+ {0xA3BA, 0xFF1A}, //6282 #FULLWIDTH COLON
+ {0xA3BB, 0xFF1B}, //6283 #FULLWIDTH SEMICOLON
+ {0xA3BC, 0xFF1C}, //6284 #FULLWIDTH LESS-THAN SIGN
+ {0xA3BD, 0xFF1D}, //6285 #FULLWIDTH EQUALS SIGN
+ {0xA3BE, 0xFF1E}, //6286 #FULLWIDTH GREATER-THAN SIGN
+ {0xA3BF, 0xFF1F}, //6287 #FULLWIDTH QUESTION MARK
+ {0xA3C0, 0xFF20}, //6288 #FULLWIDTH COMMERCIAL AT
+ {0xA3C1, 0xFF21}, //6289 #FULLWIDTH LATIN CAPITAL LETTER A
+ {0xA3C2, 0xFF22}, //6290 #FULLWIDTH LATIN CAPITAL LETTER B
+ {0xA3C3, 0xFF23}, //6291 #FULLWIDTH LATIN CAPITAL LETTER C
+ {0xA3C4, 0xFF24}, //6292 #FULLWIDTH LATIN CAPITAL LETTER D
+ {0xA3C5, 0xFF25}, //6293 #FULLWIDTH LATIN CAPITAL LETTER E
+ {0xA3C6, 0xFF26}, //6294 #FULLWIDTH LATIN CAPITAL LETTER F
+ {0xA3C7, 0xFF27}, //6295 #FULLWIDTH LATIN CAPITAL LETTER G
+ {0xA3C8, 0xFF28}, //6296 #FULLWIDTH LATIN CAPITAL LETTER H
+ {0xA3C9, 0xFF29}, //6297 #FULLWIDTH LATIN CAPITAL LETTER I
+ {0xA3CA, 0xFF2A}, //6298 #FULLWIDTH LATIN CAPITAL LETTER J
+ {0xA3CB, 0xFF2B}, //6299 #FULLWIDTH LATIN CAPITAL LETTER K
+ {0xA3CC, 0xFF2C}, //6300 #FULLWIDTH LATIN CAPITAL LETTER L
+ {0xA3CD, 0xFF2D}, //6301 #FULLWIDTH LATIN CAPITAL LETTER M
+ {0xA3CE, 0xFF2E}, //6302 #FULLWIDTH LATIN CAPITAL LETTER N
+ {0xA3CF, 0xFF2F}, //6303 #FULLWIDTH LATIN CAPITAL LETTER O
+ {0xA3D0, 0xFF30}, //6304 #FULLWIDTH LATIN CAPITAL LETTER P
+ {0xA3D1, 0xFF31}, //6305 #FULLWIDTH LATIN CAPITAL LETTER Q
+ {0xA3D2, 0xFF32}, //6306 #FULLWIDTH LATIN CAPITAL LETTER R
+ {0xA3D3, 0xFF33}, //6307 #FULLWIDTH LATIN CAPITAL LETTER S
+ {0xA3D4, 0xFF34}, //6308 #FULLWIDTH LATIN CAPITAL LETTER T
+ {0xA3D5, 0xFF35}, //6309 #FULLWIDTH LATIN CAPITAL LETTER U
+ {0xA3D6, 0xFF36}, //6310 #FULLWIDTH LATIN CAPITAL LETTER V
+ {0xA3D7, 0xFF37}, //6311 #FULLWIDTH LATIN CAPITAL LETTER W
+ {0xA3D8, 0xFF38}, //6312 #FULLWIDTH LATIN CAPITAL LETTER X
+ {0xA3D9, 0xFF39}, //6313 #FULLWIDTH LATIN CAPITAL LETTER Y
+ {0xA3DA, 0xFF3A}, //6314 #FULLWIDTH LATIN CAPITAL LETTER Z
+ {0xA3DB, 0xFF3B}, //6315 #FULLWIDTH LEFT SQUARE BRACKET
+ {0xA3DC, 0xFF3C}, //6316 #FULLWIDTH REVERSE SOLIDUS
+ {0xA3DD, 0xFF3D}, //6317 #FULLWIDTH RIGHT SQUARE BRACKET
+ {0xA3DE, 0xFF3E}, //6318 #FULLWIDTH CIRCUMFLEX ACCENT
+ {0xA3DF, 0xFF3F}, //6319 #FULLWIDTH LOW LINE
+ {0xA3E0, 0xFF40}, //6320 #FULLWIDTH GRAVE ACCENT
+ {0xA3E1, 0xFF41}, //6321 #FULLWIDTH LATIN SMALL LETTER A
+ {0xA3E2, 0xFF42}, //6322 #FULLWIDTH LATIN SMALL LETTER B
+ {0xA3E3, 0xFF43}, //6323 #FULLWIDTH LATIN SMALL LETTER C
+ {0xA3E4, 0xFF44}, //6324 #FULLWIDTH LATIN SMALL LETTER D
+ {0xA3E5, 0xFF45}, //6325 #FULLWIDTH LATIN SMALL LETTER E
+ {0xA3E6, 0xFF46}, //6326 #FULLWIDTH LATIN SMALL LETTER F
+ {0xA3E7, 0xFF47}, //6327 #FULLWIDTH LATIN SMALL LETTER G
+ {0xA3E8, 0xFF48}, //6328 #FULLWIDTH LATIN SMALL LETTER H
+ {0xA3E9, 0xFF49}, //6329 #FULLWIDTH LATIN SMALL LETTER I
+ {0xA3EA, 0xFF4A}, //6330 #FULLWIDTH LATIN SMALL LETTER J
+ {0xA3EB, 0xFF4B}, //6331 #FULLWIDTH LATIN SMALL LETTER K
+ {0xA3EC, 0xFF4C}, //6332 #FULLWIDTH LATIN SMALL LETTER L
+ {0xA3ED, 0xFF4D}, //6333 #FULLWIDTH LATIN SMALL LETTER M
+ {0xA3EE, 0xFF4E}, //6334 #FULLWIDTH LATIN SMALL LETTER N
+ {0xA3EF, 0xFF4F}, //6335 #FULLWIDTH LATIN SMALL LETTER O
+ {0xA3F0, 0xFF50}, //6336 #FULLWIDTH LATIN SMALL LETTER P
+ {0xA3F1, 0xFF51}, //6337 #FULLWIDTH LATIN SMALL LETTER Q
+ {0xA3F2, 0xFF52}, //6338 #FULLWIDTH LATIN SMALL LETTER R
+ {0xA3F3, 0xFF53}, //6339 #FULLWIDTH LATIN SMALL LETTER S
+ {0xA3F4, 0xFF54}, //6340 #FULLWIDTH LATIN SMALL LETTER T
+ {0xA3F5, 0xFF55}, //6341 #FULLWIDTH LATIN SMALL LETTER U
+ {0xA3F6, 0xFF56}, //6342 #FULLWIDTH LATIN SMALL LETTER V
+ {0xA3F7, 0xFF57}, //6343 #FULLWIDTH LATIN SMALL LETTER W
+ {0xA3F8, 0xFF58}, //6344 #FULLWIDTH LATIN SMALL LETTER X
+ {0xA3F9, 0xFF59}, //6345 #FULLWIDTH LATIN SMALL LETTER Y
+ {0xA3FA, 0xFF5A}, //6346 #FULLWIDTH LATIN SMALL LETTER Z
+ {0xA3FB, 0xFF5B}, //6347 #FULLWIDTH LEFT CURLY BRACKET
+ {0xA3FC, 0xFF5C}, //6348 #FULLWIDTH VERTICAL LINE
+ {0xA3FD, 0xFF5D}, //6349 #FULLWIDTH RIGHT CURLY BRACKET
+ {0xA3FE, 0xFFE3}, //6350 #FULLWIDTH MACRON
+ {0xA4A1, 0x3041}, //6351 #HIRAGANA LETTER SMALL A
+ {0xA4A2, 0x3042}, //6352 #HIRAGANA LETTER A
+ {0xA4A3, 0x3043}, //6353 #HIRAGANA LETTER SMALL I
+ {0xA4A4, 0x3044}, //6354 #HIRAGANA LETTER I
+ {0xA4A5, 0x3045}, //6355 #HIRAGANA LETTER SMALL U
+ {0xA4A6, 0x3046}, //6356 #HIRAGANA LETTER U
+ {0xA4A7, 0x3047}, //6357 #HIRAGANA LETTER SMALL E
+ {0xA4A8, 0x3048}, //6358 #HIRAGANA LETTER E
+ {0xA4A9, 0x3049}, //6359 #HIRAGANA LETTER SMALL O
+ {0xA4AA, 0x304A}, //6360 #HIRAGANA LETTER O
+ {0xA4AB, 0x304B}, //6361 #HIRAGANA LETTER KA
+ {0xA4AC, 0x304C}, //6362 #HIRAGANA LETTER GA
+ {0xA4AD, 0x304D}, //6363 #HIRAGANA LETTER KI
+ {0xA4AE, 0x304E}, //6364 #HIRAGANA LETTER GI
+ {0xA4AF, 0x304F}, //6365 #HIRAGANA LETTER KU
+ {0xA4B0, 0x3050}, //6366 #HIRAGANA LETTER GU
+ {0xA4B1, 0x3051}, //6367 #HIRAGANA LETTER KE
+ {0xA4B2, 0x3052}, //6368 #HIRAGANA LETTER GE
+ {0xA4B3, 0x3053}, //6369 #HIRAGANA LETTER KO
+ {0xA4B4, 0x3054}, //6370 #HIRAGANA LETTER GO
+ {0xA4B5, 0x3055}, //6371 #HIRAGANA LETTER SA
+ {0xA4B6, 0x3056}, //6372 #HIRAGANA LETTER ZA
+ {0xA4B7, 0x3057}, //6373 #HIRAGANA LETTER SI
+ {0xA4B8, 0x3058}, //6374 #HIRAGANA LETTER ZI
+ {0xA4B9, 0x3059}, //6375 #HIRAGANA LETTER SU
+ {0xA4BA, 0x305A}, //6376 #HIRAGANA LETTER ZU
+ {0xA4BB, 0x305B}, //6377 #HIRAGANA LETTER SE
+ {0xA4BC, 0x305C}, //6378 #HIRAGANA LETTER ZE
+ {0xA4BD, 0x305D}, //6379 #HIRAGANA LETTER SO
+ {0xA4BE, 0x305E}, //6380 #HIRAGANA LETTER ZO
+ {0xA4BF, 0x305F}, //6381 #HIRAGANA LETTER TA
+ {0xA4C0, 0x3060}, //6382 #HIRAGANA LETTER DA
+ {0xA4C1, 0x3061}, //6383 #HIRAGANA LETTER TI
+ {0xA4C2, 0x3062}, //6384 #HIRAGANA LETTER DI
+ {0xA4C3, 0x3063}, //6385 #HIRAGANA LETTER SMALL TU
+ {0xA4C4, 0x3064}, //6386 #HIRAGANA LETTER TU
+ {0xA4C5, 0x3065}, //6387 #HIRAGANA LETTER DU
+ {0xA4C6, 0x3066}, //6388 #HIRAGANA LETTER TE
+ {0xA4C7, 0x3067}, //6389 #HIRAGANA LETTER DE
+ {0xA4C8, 0x3068}, //6390 #HIRAGANA LETTER TO
+ {0xA4C9, 0x3069}, //6391 #HIRAGANA LETTER DO
+ {0xA4CA, 0x306A}, //6392 #HIRAGANA LETTER NA
+ {0xA4CB, 0x306B}, //6393 #HIRAGANA LETTER NI
+ {0xA4CC, 0x306C}, //6394 #HIRAGANA LETTER NU
+ {0xA4CD, 0x306D}, //6395 #HIRAGANA LETTER NE
+ {0xA4CE, 0x306E}, //6396 #HIRAGANA LETTER NO
+ {0xA4CF, 0x306F}, //6397 #HIRAGANA LETTER HA
+ {0xA4D0, 0x3070}, //6398 #HIRAGANA LETTER BA
+ {0xA4D1, 0x3071}, //6399 #HIRAGANA LETTER PA
+ {0xA4D2, 0x3072}, //6400 #HIRAGANA LETTER HI
+ {0xA4D3, 0x3073}, //6401 #HIRAGANA LETTER BI
+ {0xA4D4, 0x3074}, //6402 #HIRAGANA LETTER PI
+ {0xA4D5, 0x3075}, //6403 #HIRAGANA LETTER HU
+ {0xA4D6, 0x3076}, //6404 #HIRAGANA LETTER BU
+ {0xA4D7, 0x3077}, //6405 #HIRAGANA LETTER PU
+ {0xA4D8, 0x3078}, //6406 #HIRAGANA LETTER HE
+ {0xA4D9, 0x3079}, //6407 #HIRAGANA LETTER BE
+ {0xA4DA, 0x307A}, //6408 #HIRAGANA LETTER PE
+ {0xA4DB, 0x307B}, //6409 #HIRAGANA LETTER HO
+ {0xA4DC, 0x307C}, //6410 #HIRAGANA LETTER BO
+ {0xA4DD, 0x307D}, //6411 #HIRAGANA LETTER PO
+ {0xA4DE, 0x307E}, //6412 #HIRAGANA LETTER MA
+ {0xA4DF, 0x307F}, //6413 #HIRAGANA LETTER MI
+ {0xA4E0, 0x3080}, //6414 #HIRAGANA LETTER MU
+ {0xA4E1, 0x3081}, //6415 #HIRAGANA LETTER ME
+ {0xA4E2, 0x3082}, //6416 #HIRAGANA LETTER MO
+ {0xA4E3, 0x3083}, //6417 #HIRAGANA LETTER SMALL YA
+ {0xA4E4, 0x3084}, //6418 #HIRAGANA LETTER YA
+ {0xA4E5, 0x3085}, //6419 #HIRAGANA LETTER SMALL YU
+ {0xA4E6, 0x3086}, //6420 #HIRAGANA LETTER YU
+ {0xA4E7, 0x3087}, //6421 #HIRAGANA LETTER SMALL YO
+ {0xA4E8, 0x3088}, //6422 #HIRAGANA LETTER YO
+ {0xA4E9, 0x3089}, //6423 #HIRAGANA LETTER RA
+ {0xA4EA, 0x308A}, //6424 #HIRAGANA LETTER RI
+ {0xA4EB, 0x308B}, //6425 #HIRAGANA LETTER RU
+ {0xA4EC, 0x308C}, //6426 #HIRAGANA LETTER RE
+ {0xA4ED, 0x308D}, //6427 #HIRAGANA LETTER RO
+ {0xA4EE, 0x308E}, //6428 #HIRAGANA LETTER SMALL WA
+ {0xA4EF, 0x308F}, //6429 #HIRAGANA LETTER WA
+ {0xA4F0, 0x3090}, //6430 #HIRAGANA LETTER WI
+ {0xA4F1, 0x3091}, //6431 #HIRAGANA LETTER WE
+ {0xA4F2, 0x3092}, //6432 #HIRAGANA LETTER WO
+ {0xA4F3, 0x3093}, //6433 #HIRAGANA LETTER N
+ {0xA5A1, 0x30A1}, //6434 #KATAKANA LETTER SMALL A
+ {0xA5A2, 0x30A2}, //6435 #KATAKANA LETTER A
+ {0xA5A3, 0x30A3}, //6436 #KATAKANA LETTER SMALL I
+ {0xA5A4, 0x30A4}, //6437 #KATAKANA LETTER I
+ {0xA5A5, 0x30A5}, //6438 #KATAKANA LETTER SMALL U
+ {0xA5A6, 0x30A6}, //6439 #KATAKANA LETTER U
+ {0xA5A7, 0x30A7}, //6440 #KATAKANA LETTER SMALL E
+ {0xA5A8, 0x30A8}, //6441 #KATAKANA LETTER E
+ {0xA5A9, 0x30A9}, //6442 #KATAKANA LETTER SMALL O
+ {0xA5AA, 0x30AA}, //6443 #KATAKANA LETTER O
+ {0xA5AB, 0x30AB}, //6444 #KATAKANA LETTER KA
+ {0xA5AC, 0x30AC}, //6445 #KATAKANA LETTER GA
+ {0xA5AD, 0x30AD}, //6446 #KATAKANA LETTER KI
+ {0xA5AE, 0x30AE}, //6447 #KATAKANA LETTER GI
+ {0xA5AF, 0x30AF}, //6448 #KATAKANA LETTER KU
+ {0xA5B0, 0x30B0}, //6449 #KATAKANA LETTER GU
+ {0xA5B1, 0x30B1}, //6450 #KATAKANA LETTER KE
+ {0xA5B2, 0x30B2}, //6451 #KATAKANA LETTER GE
+ {0xA5B3, 0x30B3}, //6452 #KATAKANA LETTER KO
+ {0xA5B4, 0x30B4}, //6453 #KATAKANA LETTER GO
+ {0xA5B5, 0x30B5}, //6454 #KATAKANA LETTER SA
+ {0xA5B6, 0x30B6}, //6455 #KATAKANA LETTER ZA
+ {0xA5B7, 0x30B7}, //6456 #KATAKANA LETTER SI
+ {0xA5B8, 0x30B8}, //6457 #KATAKANA LETTER ZI
+ {0xA5B9, 0x30B9}, //6458 #KATAKANA LETTER SU
+ {0xA5BA, 0x30BA}, //6459 #KATAKANA LETTER ZU
+ {0xA5BB, 0x30BB}, //6460 #KATAKANA LETTER SE
+ {0xA5BC, 0x30BC}, //6461 #KATAKANA LETTER ZE
+ {0xA5BD, 0x30BD}, //6462 #KATAKANA LETTER SO
+ {0xA5BE, 0x30BE}, //6463 #KATAKANA LETTER ZO
+ {0xA5BF, 0x30BF}, //6464 #KATAKANA LETTER TA
+ {0xA5C0, 0x30C0}, //6465 #KATAKANA LETTER DA
+ {0xA5C1, 0x30C1}, //6466 #KATAKANA LETTER TI
+ {0xA5C2, 0x30C2}, //6467 #KATAKANA LETTER DI
+ {0xA5C3, 0x30C3}, //6468 #KATAKANA LETTER SMALL TU
+ {0xA5C4, 0x30C4}, //6469 #KATAKANA LETTER TU
+ {0xA5C5, 0x30C5}, //6470 #KATAKANA LETTER DU
+ {0xA5C6, 0x30C6}, //6471 #KATAKANA LETTER TE
+ {0xA5C7, 0x30C7}, //6472 #KATAKANA LETTER DE
+ {0xA5C8, 0x30C8}, //6473 #KATAKANA LETTER TO
+ {0xA5C9, 0x30C9}, //6474 #KATAKANA LETTER DO
+ {0xA5CA, 0x30CA}, //6475 #KATAKANA LETTER NA
+ {0xA5CB, 0x30CB}, //6476 #KATAKANA LETTER NI
+ {0xA5CC, 0x30CC}, //6477 #KATAKANA LETTER NU
+ {0xA5CD, 0x30CD}, //6478 #KATAKANA LETTER NE
+ {0xA5CE, 0x30CE}, //6479 #KATAKANA LETTER NO
+ {0xA5CF, 0x30CF}, //6480 #KATAKANA LETTER HA
+ {0xA5D0, 0x30D0}, //6481 #KATAKANA LETTER BA
+ {0xA5D1, 0x30D1}, //6482 #KATAKANA LETTER PA
+ {0xA5D2, 0x30D2}, //6483 #KATAKANA LETTER HI
+ {0xA5D3, 0x30D3}, //6484 #KATAKANA LETTER BI
+ {0xA5D4, 0x30D4}, //6485 #KATAKANA LETTER PI
+ {0xA5D5, 0x30D5}, //6486 #KATAKANA LETTER HU
+ {0xA5D6, 0x30D6}, //6487 #KATAKANA LETTER BU
+ {0xA5D7, 0x30D7}, //6488 #KATAKANA LETTER PU
+ {0xA5D8, 0x30D8}, //6489 #KATAKANA LETTER HE
+ {0xA5D9, 0x30D9}, //6490 #KATAKANA LETTER BE
+ {0xA5DA, 0x30DA}, //6491 #KATAKANA LETTER PE
+ {0xA5DB, 0x30DB}, //6492 #KATAKANA LETTER HO
+ {0xA5DC, 0x30DC}, //6493 #KATAKANA LETTER BO
+ {0xA5DD, 0x30DD}, //6494 #KATAKANA LETTER PO
+ {0xA5DE, 0x30DE}, //6495 #KATAKANA LETTER MA
+ {0xA5DF, 0x30DF}, //6496 #KATAKANA LETTER MI
+ {0xA5E0, 0x30E0}, //6497 #KATAKANA LETTER MU
+ {0xA5E1, 0x30E1}, //6498 #KATAKANA LETTER ME
+ {0xA5E2, 0x30E2}, //6499 #KATAKANA LETTER MO
+ {0xA5E3, 0x30E3}, //6500 #KATAKANA LETTER SMALL YA
+ {0xA5E4, 0x30E4}, //6501 #KATAKANA LETTER YA
+ {0xA5E5, 0x30E5}, //6502 #KATAKANA LETTER SMALL YU
+ {0xA5E6, 0x30E6}, //6503 #KATAKANA LETTER YU
+ {0xA5E7, 0x30E7}, //6504 #KATAKANA LETTER SMALL YO
+ {0xA5E8, 0x30E8}, //6505 #KATAKANA LETTER YO
+ {0xA5E9, 0x30E9}, //6506 #KATAKANA LETTER RA
+ {0xA5EA, 0x30EA}, //6507 #KATAKANA LETTER RI
+ {0xA5EB, 0x30EB}, //6508 #KATAKANA LETTER RU
+ {0xA5EC, 0x30EC}, //6509 #KATAKANA LETTER RE
+ {0xA5ED, 0x30ED}, //6510 #KATAKANA LETTER RO
+ {0xA5EE, 0x30EE}, //6511 #KATAKANA LETTER SMALL WA
+ {0xA5EF, 0x30EF}, //6512 #KATAKANA LETTER WA
+ {0xA5F0, 0x30F0}, //6513 #KATAKANA LETTER WI
+ {0xA5F1, 0x30F1}, //6514 #KATAKANA LETTER WE
+ {0xA5F2, 0x30F2}, //6515 #KATAKANA LETTER WO
+ {0xA5F3, 0x30F3}, //6516 #KATAKANA LETTER N
+ {0xA5F4, 0x30F4}, //6517 #KATAKANA LETTER VU
+ {0xA5F5, 0x30F5}, //6518 #KATAKANA LETTER SMALL KA
+ {0xA5F6, 0x30F6}, //6519 #KATAKANA LETTER SMALL KE
+ {0xA6A1, 0x0391}, //6520 #GREEK CAPITAL LETTER ALPHA
+ {0xA6A2, 0x0392}, //6521 #GREEK CAPITAL LETTER BETA
+ {0xA6A3, 0x0393}, //6522 #GREEK CAPITAL LETTER GAMMA
+ {0xA6A4, 0x0394}, //6523 #GREEK CAPITAL LETTER DELTA
+ {0xA6A5, 0x0395}, //6524 #GREEK CAPITAL LETTER EPSILON
+ {0xA6A6, 0x0396}, //6525 #GREEK CAPITAL LETTER ZETA
+ {0xA6A7, 0x0397}, //6526 #GREEK CAPITAL LETTER ETA
+ {0xA6A8, 0x0398}, //6527 #GREEK CAPITAL LETTER THETA
+ {0xA6A9, 0x0399}, //6528 #GREEK CAPITAL LETTER IOTA
+ {0xA6AA, 0x039A}, //6529 #GREEK CAPITAL LETTER KAPPA
+ {0xA6AB, 0x039B}, //6530 #GREEK CAPITAL LETTER LAMDA
+ {0xA6AC, 0x039C}, //6531 #GREEK CAPITAL LETTER MU
+ {0xA6AD, 0x039D}, //6532 #GREEK CAPITAL LETTER NU
+ {0xA6AE, 0x039E}, //6533 #GREEK CAPITAL LETTER XI
+ {0xA6AF, 0x039F}, //6534 #GREEK CAPITAL LETTER OMICRON
+ {0xA6B0, 0x03A0}, //6535 #GREEK CAPITAL LETTER PI
+ {0xA6B1, 0x03A1}, //6536 #GREEK CAPITAL LETTER RHO
+ {0xA6B2, 0x03A3}, //6537 #GREEK CAPITAL LETTER SIGMA
+ {0xA6B3, 0x03A4}, //6538 #GREEK CAPITAL LETTER TAU
+ {0xA6B4, 0x03A5}, //6539 #GREEK CAPITAL LETTER UPSILON
+ {0xA6B5, 0x03A6}, //6540 #GREEK CAPITAL LETTER PHI
+ {0xA6B6, 0x03A7}, //6541 #GREEK CAPITAL LETTER CHI
+ {0xA6B7, 0x03A8}, //6542 #GREEK CAPITAL LETTER PSI
+ {0xA6B8, 0x03A9}, //6543 #GREEK CAPITAL LETTER OMEGA
+ {0xA6C1, 0x03B1}, //6544 #GREEK SMALL LETTER ALPHA
+ {0xA6C2, 0x03B2}, //6545 #GREEK SMALL LETTER BETA
+ {0xA6C3, 0x03B3}, //6546 #GREEK SMALL LETTER GAMMA
+ {0xA6C4, 0x03B4}, //6547 #GREEK SMALL LETTER DELTA
+ {0xA6C5, 0x03B5}, //6548 #GREEK SMALL LETTER EPSILON
+ {0xA6C6, 0x03B6}, //6549 #GREEK SMALL LETTER ZETA
+ {0xA6C7, 0x03B7}, //6550 #GREEK SMALL LETTER ETA
+ {0xA6C8, 0x03B8}, //6551 #GREEK SMALL LETTER THETA
+ {0xA6C9, 0x03B9}, //6552 #GREEK SMALL LETTER IOTA
+ {0xA6CA, 0x03BA}, //6553 #GREEK SMALL LETTER KAPPA
+ {0xA6CB, 0x03BB}, //6554 #GREEK SMALL LETTER LAMDA
+ {0xA6CC, 0x03BC}, //6555 #GREEK SMALL LETTER MU
+ {0xA6CD, 0x03BD}, //6556 #GREEK SMALL LETTER NU
+ {0xA6CE, 0x03BE}, //6557 #GREEK SMALL LETTER XI
+ {0xA6CF, 0x03BF}, //6558 #GREEK SMALL LETTER OMICRON
+ {0xA6D0, 0x03C0}, //6559 #GREEK SMALL LETTER PI
+ {0xA6D1, 0x03C1}, //6560 #GREEK SMALL LETTER RHO
+ {0xA6D2, 0x03C3}, //6561 #GREEK SMALL LETTER SIGMA
+ {0xA6D3, 0x03C4}, //6562 #GREEK SMALL LETTER TAU
+ {0xA6D4, 0x03C5}, //6563 #GREEK SMALL LETTER UPSILON
+ {0xA6D5, 0x03C6}, //6564 #GREEK SMALL LETTER PHI
+ {0xA6D6, 0x03C7}, //6565 #GREEK SMALL LETTER CHI
+ {0xA6D7, 0x03C8}, //6566 #GREEK SMALL LETTER PSI
+ {0xA6D8, 0x03C9}, //6567 #GREEK SMALL LETTER OMEGA
+ {0xA6E0, 0xFE35}, //6568 #PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS
+ {0xA6E1, 0xFE36}, //6569 #PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS
+ {0xA6E2, 0xFE39}, //6570 #PRESENTATION FORM FOR VERTICAL LEFT TORTOISE SHELL BRACKET
+ {0xA6E3, 0xFE3A}, //6571 #PRESENTATION FORM FOR VERTICAL RIGHT TORTOISE SHELL BRACKET
+ {0xA6E4, 0xFE3F}, //6572 #PRESENTATION FORM FOR VERTICAL LEFT ANGLE BRACKET
+ {0xA6E5, 0xFE40}, //6573 #PRESENTATION FORM FOR VERTICAL RIGHT ANGLE BRACKET
+ {0xA6E6, 0xFE3D}, //6574 #PRESENTATION FORM FOR VERTICAL LEFT DOUBLE ANGLE BRACKET
+ {0xA6E7, 0xFE3E}, //6575 #PRESENTATION FORM FOR VERTICAL RIGHT DOUBLE ANGLE BRACKET
+ {0xA6E8, 0xFE41}, //6576 #PRESENTATION FORM FOR VERTICAL LEFT CORNER BRACKET
+ {0xA6E9, 0xFE42}, //6577 #PRESENTATION FORM FOR VERTICAL RIGHT CORNER BRACKET
+ {0xA6EA, 0xFE43}, //6578 #PRESENTATION FORM FOR VERTICAL LEFT WHITE CORNER BRACKET
+ {0xA6EB, 0xFE44}, //6579 #PRESENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKET
+ {0xA6EE, 0xFE3B}, //6580 #PRESENTATION FORM FOR VERTICAL LEFT BLACK LENTICULAR BRACKET
+ {0xA6EF, 0xFE3C}, //6581 #PRESENTATION FORM FOR VERTICAL RIGHT BLACK LENTICULAR BRACKET
+ {0xA6F0, 0xFE37}, //6582 #PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET
+ {0xA6F1, 0xFE38}, //6583 #PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET
+ {0xA6F2, 0xFE31}, //6584 #PRESENTATION FORM FOR VERTICAL EM DASH
+ {0xA6F4, 0xFE33}, //6585 #PRESENTATION FORM FOR VERTICAL LOW LINE
+ {0xA6F5, 0xFE34}, //6586 #PRESENTATION FORM FOR VERTICAL WAVY LOW LINE
+ {0xA7A1, 0x0410}, //6587 #CYRILLIC CAPITAL LETTER A
+ {0xA7A2, 0x0411}, //6588 #CYRILLIC CAPITAL LETTER BE
+ {0xA7A3, 0x0412}, //6589 #CYRILLIC CAPITAL LETTER VE
+ {0xA7A4, 0x0413}, //6590 #CYRILLIC CAPITAL LETTER GHE
+ {0xA7A5, 0x0414}, //6591 #CYRILLIC CAPITAL LETTER DE
+ {0xA7A6, 0x0415}, //6592 #CYRILLIC CAPITAL LETTER IE
+ {0xA7A7, 0x0401}, //6593 #CYRILLIC CAPITAL LETTER IO
+ {0xA7A8, 0x0416}, //6594 #CYRILLIC CAPITAL LETTER ZHE
+ {0xA7A9, 0x0417}, //6595 #CYRILLIC CAPITAL LETTER ZE
+ {0xA7AA, 0x0418}, //6596 #CYRILLIC CAPITAL LETTER I
+ {0xA7AB, 0x0419}, //6597 #CYRILLIC CAPITAL LETTER SHORT I
+ {0xA7AC, 0x041A}, //6598 #CYRILLIC CAPITAL LETTER KA
+ {0xA7AD, 0x041B}, //6599 #CYRILLIC CAPITAL LETTER EL
+ {0xA7AE, 0x041C}, //6600 #CYRILLIC CAPITAL LETTER EM
+ {0xA7AF, 0x041D}, //6601 #CYRILLIC CAPITAL LETTER EN
+ {0xA7B0, 0x041E}, //6602 #CYRILLIC CAPITAL LETTER O
+ {0xA7B1, 0x041F}, //6603 #CYRILLIC CAPITAL LETTER PE
+ {0xA7B2, 0x0420}, //6604 #CYRILLIC CAPITAL LETTER ER
+ {0xA7B3, 0x0421}, //6605 #CYRILLIC CAPITAL LETTER ES
+ {0xA7B4, 0x0422}, //6606 #CYRILLIC CAPITAL LETTER TE
+ {0xA7B5, 0x0423}, //6607 #CYRILLIC CAPITAL LETTER U
+ {0xA7B6, 0x0424}, //6608 #CYRILLIC CAPITAL LETTER EF
+ {0xA7B7, 0x0425}, //6609 #CYRILLIC CAPITAL LETTER HA
+ {0xA7B8, 0x0426}, //6610 #CYRILLIC CAPITAL LETTER TSE
+ {0xA7B9, 0x0427}, //6611 #CYRILLIC CAPITAL LETTER CHE
+ {0xA7BA, 0x0428}, //6612 #CYRILLIC CAPITAL LETTER SHA
+ {0xA7BB, 0x0429}, //6613 #CYRILLIC CAPITAL LETTER SHCHA
+ {0xA7BC, 0x042A}, //6614 #CYRILLIC CAPITAL LETTER HARD SIGN
+ {0xA7BD, 0x042B}, //6615 #CYRILLIC CAPITAL LETTER YERU
+ {0xA7BE, 0x042C}, //6616 #CYRILLIC CAPITAL LETTER SOFT SIGN
+ {0xA7BF, 0x042D}, //6617 #CYRILLIC CAPITAL LETTER E
+ {0xA7C0, 0x042E}, //6618 #CYRILLIC CAPITAL LETTER YU
+ {0xA7C1, 0x042F}, //6619 #CYRILLIC CAPITAL LETTER YA
+ {0xA7D1, 0x0430}, //6620 #CYRILLIC SMALL LETTER A
+ {0xA7D2, 0x0431}, //6621 #CYRILLIC SMALL LETTER BE
+ {0xA7D3, 0x0432}, //6622 #CYRILLIC SMALL LETTER VE
+ {0xA7D4, 0x0433}, //6623 #CYRILLIC SMALL LETTER GHE
+ {0xA7D5, 0x0434}, //6624 #CYRILLIC SMALL LETTER DE
+ {0xA7D6, 0x0435}, //6625 #CYRILLIC SMALL LETTER IE
+ {0xA7D7, 0x0451}, //6626 #CYRILLIC SMALL LETTER IO
+ {0xA7D8, 0x0436}, //6627 #CYRILLIC SMALL LETTER ZHE
+ {0xA7D9, 0x0437}, //6628 #CYRILLIC SMALL LETTER ZE
+ {0xA7DA, 0x0438}, //6629 #CYRILLIC SMALL LETTER I
+ {0xA7DB, 0x0439}, //6630 #CYRILLIC SMALL LETTER SHORT I
+ {0xA7DC, 0x043A}, //6631 #CYRILLIC SMALL LETTER KA
+ {0xA7DD, 0x043B}, //6632 #CYRILLIC SMALL LETTER EL
+ {0xA7DE, 0x043C}, //6633 #CYRILLIC SMALL LETTER EM
+ {0xA7DF, 0x043D}, //6634 #CYRILLIC SMALL LETTER EN
+ {0xA7E0, 0x043E}, //6635 #CYRILLIC SMALL LETTER O
+ {0xA7E1, 0x043F}, //6636 #CYRILLIC SMALL LETTER PE
+ {0xA7E2, 0x0440}, //6637 #CYRILLIC SMALL LETTER ER
+ {0xA7E3, 0x0441}, //6638 #CYRILLIC SMALL LETTER ES
+ {0xA7E4, 0x0442}, //6639 #CYRILLIC SMALL LETTER TE
+ {0xA7E5, 0x0443}, //6640 #CYRILLIC SMALL LETTER U
+ {0xA7E6, 0x0444}, //6641 #CYRILLIC SMALL LETTER EF
+ {0xA7E7, 0x0445}, //6642 #CYRILLIC SMALL LETTER HA
+ {0xA7E8, 0x0446}, //6643 #CYRILLIC SMALL LETTER TSE
+ {0xA7E9, 0x0447}, //6644 #CYRILLIC SMALL LETTER CHE
+ {0xA7EA, 0x0448}, //6645 #CYRILLIC SMALL LETTER SHA
+ {0xA7EB, 0x0449}, //6646 #CYRILLIC SMALL LETTER SHCHA
+ {0xA7EC, 0x044A}, //6647 #CYRILLIC SMALL LETTER HARD SIGN
+ {0xA7ED, 0x044B}, //6648 #CYRILLIC SMALL LETTER YERU
+ {0xA7EE, 0x044C}, //6649 #CYRILLIC SMALL LETTER SOFT SIGN
+ {0xA7EF, 0x044D}, //6650 #CYRILLIC SMALL LETTER E
+ {0xA7F0, 0x044E}, //6651 #CYRILLIC SMALL LETTER YU
+ {0xA7F1, 0x044F}, //6652 #CYRILLIC SMALL LETTER YA
+ {0xA840, 0x02CA}, //6653 #MODIFIER LETTER ACUTE ACCENT
+ {0xA841, 0x02CB}, //6654 #MODIFIER LETTER GRAVE ACCENT
+ {0xA842, 0x02D9}, //6655 #DOT ABOVE
+ {0xA843, 0x2013}, //6656 #EN DASH
+ {0xA844, 0x2015}, //6657 #HORIZONTAL BAR
+ {0xA845, 0x2025}, //6658 #TWO DOT LEADER
+ {0xA846, 0x2035}, //6659 #REVERSED PRIME
+ {0xA847, 0x2105}, //6660 #CARE OF
+ {0xA848, 0x2109}, //6661 #DEGREE FAHRENHEIT
+ {0xA849, 0x2196}, //6662 #NORTH WEST ARROW
+ {0xA84A, 0x2197}, //6663 #NORTH EAST ARROW
+ {0xA84B, 0x2198}, //6664 #SOUTH EAST ARROW
+ {0xA84C, 0x2199}, //6665 #SOUTH WEST ARROW
+ {0xA84D, 0x2215}, //6666 #DIVISION SLASH
+ {0xA84E, 0x221F}, //6667 #RIGHT ANGLE
+ {0xA84F, 0x2223}, //6668 #DIVIDES
+ {0xA850, 0x2252}, //6669 #APPROXIMATELY EQUAL TO OR THE IMAGE OF
+ {0xA851, 0x2266}, //6670 #LESS-THAN OVER EQUAL TO
+ {0xA852, 0x2267}, //6671 #GREATER-THAN OVER EQUAL TO
+ {0xA853, 0x22BF}, //6672 #RIGHT TRIANGLE
+ {0xA854, 0x2550}, //6673 #BOX DRAWINGS DOUBLE HORIZONTAL
+ {0xA855, 0x2551}, //6674 #BOX DRAWINGS DOUBLE VERTICAL
+ {0xA856, 0x2552}, //6675 #BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE
+ {0xA857, 0x2553}, //6676 #BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE
+ {0xA858, 0x2554}, //6677 #BOX DRAWINGS DOUBLE DOWN AND RIGHT
+ {0xA859, 0x2555}, //6678 #BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE
+ {0xA85A, 0x2556}, //6679 #BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE
+ {0xA85B, 0x2557}, //6680 #BOX DRAWINGS DOUBLE DOWN AND LEFT
+ {0xA85C, 0x2558}, //6681 #BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE
+ {0xA85D, 0x2559}, //6682 #BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE
+ {0xA85E, 0x255A}, //6683 #BOX DRAWINGS DOUBLE UP AND RIGHT
+ {0xA85F, 0x255B}, //6684 #BOX DRAWINGS UP SINGLE AND LEFT DOUBLE
+ {0xA860, 0x255C}, //6685 #BOX DRAWINGS UP DOUBLE AND LEFT SINGLE
+ {0xA861, 0x255D}, //6686 #BOX DRAWINGS DOUBLE UP AND LEFT
+ {0xA862, 0x255E}, //6687 #BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE
+ {0xA863, 0x255F}, //6688 #BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE
+ {0xA864, 0x2560}, //6689 #BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
+ {0xA865, 0x2561}, //6690 #BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE
+ {0xA866, 0x2562}, //6691 #BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE
+ {0xA867, 0x2563}, //6692 #BOX DRAWINGS DOUBLE VERTICAL AND LEFT
+ {0xA868, 0x2564}, //6693 #BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE
+ {0xA869, 0x2565}, //6694 #BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE
+ {0xA86A, 0x2566}, //6695 #BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
+ {0xA86B, 0x2567}, //6696 #BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE
+ {0xA86C, 0x2568}, //6697 #BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE
+ {0xA86D, 0x2569}, //6698 #BOX DRAWINGS DOUBLE UP AND HORIZONTAL
+ {0xA86E, 0x256A}, //6699 #BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE
+ {0xA86F, 0x256B}, //6700 #BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE
+ {0xA870, 0x256C}, //6701 #BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
+ {0xA871, 0x256D}, //6702 #BOX DRAWINGS LIGHT ARC DOWN AND RIGHT
+ {0xA872, 0x256E}, //6703 #BOX DRAWINGS LIGHT ARC DOWN AND LEFT
+ {0xA873, 0x256F}, //6704 #BOX DRAWINGS LIGHT ARC UP AND LEFT
+ {0xA874, 0x2570}, //6705 #BOX DRAWINGS LIGHT ARC UP AND RIGHT
+ {0xA875, 0x2571}, //6706 #BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT
+ {0xA876, 0x2572}, //6707 #BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT
+ {0xA877, 0x2573}, //6708 #BOX DRAWINGS LIGHT DIAGONAL CROSS
+ {0xA878, 0x2581}, //6709 #LOWER ONE EIGHTH BLOCK
+ {0xA879, 0x2582}, //6710 #LOWER ONE QUARTER BLOCK
+ {0xA87A, 0x2583}, //6711 #LOWER THREE EIGHTHS BLOCK
+ {0xA87B, 0x2584}, //6712 #LOWER HALF BLOCK
+ {0xA87C, 0x2585}, //6713 #LOWER FIVE EIGHTHS BLOCK
+ {0xA87D, 0x2586}, //6714 #LOWER THREE QUARTERS BLOCK
+ {0xA87E, 0x2587}, //6715 #LOWER SEVEN EIGHTHS BLOCK
+ {0xA880, 0x2588}, //6716 #FULL BLOCK
+ {0xA881, 0x2589}, //6717 #LEFT SEVEN EIGHTHS BLOCK
+ {0xA882, 0x258A}, //6718 #LEFT THREE QUARTERS BLOCK
+ {0xA883, 0x258B}, //6719 #LEFT FIVE EIGHTHS BLOCK
+ {0xA884, 0x258C}, //6720 #LEFT HALF BLOCK
+ {0xA885, 0x258D}, //6721 #LEFT THREE EIGHTHS BLOCK
+ {0xA886, 0x258E}, //6722 #LEFT ONE QUARTER BLOCK
+ {0xA887, 0x258F}, //6723 #LEFT ONE EIGHTH BLOCK
+ {0xA888, 0x2593}, //6724 #DARK SHADE
+ {0xA889, 0x2594}, //6725 #UPPER ONE EIGHTH BLOCK
+ {0xA88A, 0x2595}, //6726 #RIGHT ONE EIGHTH BLOCK
+ {0xA88B, 0x25BC}, //6727 #BLACK DOWN-POINTING TRIANGLE
+ {0xA88C, 0x25BD}, //6728 #WHITE DOWN-POINTING TRIANGLE
+ {0xA88D, 0x25E2}, //6729 #BLACK LOWER RIGHT TRIANGLE
+ {0xA88E, 0x25E3}, //6730 #BLACK LOWER LEFT TRIANGLE
+ {0xA88F, 0x25E4}, //6731 #BLACK UPPER LEFT TRIANGLE
+ {0xA890, 0x25E5}, //6732 #BLACK UPPER RIGHT TRIANGLE
+ {0xA891, 0x2609}, //6733 #SUN
+ {0xA892, 0x2295}, //6734 #CIRCLED PLUS
+ {0xA893, 0x3012}, //6735 #POSTAL MARK
+ {0xA894, 0x301D}, //6736 #REVERSED DOUBLE PRIME QUOTATION MARK
+ {0xA895, 0x301E}, //6737 #DOUBLE PRIME QUOTATION MARK
+ {0xA8A1, 0x0101}, //6738 #LATIN SMALL LETTER A WITH MACRON
+ {0xA8A2, 0x00E1}, //6739 #LATIN SMALL LETTER A WITH ACUTE
+ {0xA8A3, 0x01CE}, //6740 #LATIN SMALL LETTER A WITH CARON
+ {0xA8A4, 0x00E0}, //6741 #LATIN SMALL LETTER A WITH GRAVE
+ {0xA8A5, 0x0113}, //6742 #LATIN SMALL LETTER E WITH MACRON
+ {0xA8A6, 0x00E9}, //6743 #LATIN SMALL LETTER E WITH ACUTE
+ {0xA8A7, 0x011B}, //6744 #LATIN SMALL LETTER E WITH CARON
+ {0xA8A8, 0x00E8}, //6745 #LATIN SMALL LETTER E WITH GRAVE
+ {0xA8A9, 0x012B}, //6746 #LATIN SMALL LETTER I WITH MACRON
+ {0xA8AA, 0x00ED}, //6747 #LATIN SMALL LETTER I WITH ACUTE
+ {0xA8AB, 0x01D0}, //6748 #LATIN SMALL LETTER I WITH CARON
+ {0xA8AC, 0x00EC}, //6749 #LATIN SMALL LETTER I WITH GRAVE
+ {0xA8AD, 0x014D}, //6750 #LATIN SMALL LETTER O WITH MACRON
+ {0xA8AE, 0x00F3}, //6751 #LATIN SMALL LETTER O WITH ACUTE
+ {0xA8AF, 0x01D2}, //6752 #LATIN SMALL LETTER O WITH CARON
+ {0xA8B0, 0x00F2}, //6753 #LATIN SMALL LETTER O WITH GRAVE
+ {0xA8B1, 0x016B}, //6754 #LATIN SMALL LETTER U WITH MACRON
+ {0xA8B2, 0x00FA}, //6755 #LATIN SMALL LETTER U WITH ACUTE
+ {0xA8B3, 0x01D4}, //6756 #LATIN SMALL LETTER U WITH CARON
+ {0xA8B4, 0x00F9}, //6757 #LATIN SMALL LETTER U WITH GRAVE
+ {0xA8B5, 0x01D6}, //6758 #LATIN SMALL LETTER U WITH DIAERESIS AND MACRON
+ {0xA8B6, 0x01D8}, //6759 #LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE
+ {0xA8B7, 0x01DA}, //6760 #LATIN SMALL LETTER U WITH DIAERESIS AND CARON
+ {0xA8B8, 0x01DC}, //6761 #LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE
+ {0xA8B9, 0x00FC}, //6762 #LATIN SMALL LETTER U WITH DIAERESIS
+ {0xA8BA, 0x00EA}, //6763 #LATIN SMALL LETTER E WITH CIRCUMFLEX
+ {0xA8BB, 0x0251}, //6764 #LATIN SMALL LETTER ALPHA
+ {0xA8BD, 0x0144}, //6765 #LATIN SMALL LETTER N WITH ACUTE
+ {0xA8BE, 0x0148}, //6766 #LATIN SMALL LETTER N WITH CARON
+ {0xA8C0, 0x0261}, //6767 #LATIN SMALL LETTER SCRIPT G
+ {0xA8C5, 0x3105}, //6768 #BOPOMOFO LETTER B
+ {0xA8C6, 0x3106}, //6769 #BOPOMOFO LETTER P
+ {0xA8C7, 0x3107}, //6770 #BOPOMOFO LETTER M
+ {0xA8C8, 0x3108}, //6771 #BOPOMOFO LETTER F
+ {0xA8C9, 0x3109}, //6772 #BOPOMOFO LETTER D
+ {0xA8CA, 0x310A}, //6773 #BOPOMOFO LETTER T
+ {0xA8CB, 0x310B}, //6774 #BOPOMOFO LETTER N
+ {0xA8CC, 0x310C}, //6775 #BOPOMOFO LETTER L
+ {0xA8CD, 0x310D}, //6776 #BOPOMOFO LETTER G
+ {0xA8CE, 0x310E}, //6777 #BOPOMOFO LETTER K
+ {0xA8CF, 0x310F}, //6778 #BOPOMOFO LETTER H
+ {0xA8D0, 0x3110}, //6779 #BOPOMOFO LETTER J
+ {0xA8D1, 0x3111}, //6780 #BOPOMOFO LETTER Q
+ {0xA8D2, 0x3112}, //6781 #BOPOMOFO LETTER X
+ {0xA8D3, 0x3113}, //6782 #BOPOMOFO LETTER ZH
+ {0xA8D4, 0x3114}, //6783 #BOPOMOFO LETTER CH
+ {0xA8D5, 0x3115}, //6784 #BOPOMOFO LETTER SH
+ {0xA8D6, 0x3116}, //6785 #BOPOMOFO LETTER R
+ {0xA8D7, 0x3117}, //6786 #BOPOMOFO LETTER Z
+ {0xA8D8, 0x3118}, //6787 #BOPOMOFO LETTER C
+ {0xA8D9, 0x3119}, //6788 #BOPOMOFO LETTER S
+ {0xA8DA, 0x311A}, //6789 #BOPOMOFO LETTER A
+ {0xA8DB, 0x311B}, //6790 #BOPOMOFO LETTER O
+ {0xA8DC, 0x311C}, //6791 #BOPOMOFO LETTER E
+ {0xA8DD, 0x311D}, //6792 #BOPOMOFO LETTER EH
+ {0xA8DE, 0x311E}, //6793 #BOPOMOFO LETTER AI
+ {0xA8DF, 0x311F}, //6794 #BOPOMOFO LETTER EI
+ {0xA8E0, 0x3120}, //6795 #BOPOMOFO LETTER AU
+ {0xA8E1, 0x3121}, //6796 #BOPOMOFO LETTER OU
+ {0xA8E2, 0x3122}, //6797 #BOPOMOFO LETTER AN
+ {0xA8E3, 0x3123}, //6798 #BOPOMOFO LETTER EN
+ {0xA8E4, 0x3124}, //6799 #BOPOMOFO LETTER ANG
+ {0xA8E5, 0x3125}, //6800 #BOPOMOFO LETTER ENG
+ {0xA8E6, 0x3126}, //6801 #BOPOMOFO LETTER ER
+ {0xA8E7, 0x3127}, //6802 #BOPOMOFO LETTER I
+ {0xA8E8, 0x3128}, //6803 #BOPOMOFO LETTER U
+ {0xA8E9, 0x3129}, //6804 #BOPOMOFO LETTER IU
+ {0xA940, 0x3021}, //6805 #HANGZHOU NUMERAL ONE
+ {0xA941, 0x3022}, //6806 #HANGZHOU NUMERAL TWO
+ {0xA942, 0x3023}, //6807 #HANGZHOU NUMERAL THREE
+ {0xA943, 0x3024}, //6808 #HANGZHOU NUMERAL FOUR
+ {0xA944, 0x3025}, //6809 #HANGZHOU NUMERAL FIVE
+ {0xA945, 0x3026}, //6810 #HANGZHOU NUMERAL SIX
+ {0xA946, 0x3027}, //6811 #HANGZHOU NUMERAL SEVEN
+ {0xA947, 0x3028}, //6812 #HANGZHOU NUMERAL EIGHT
+ {0xA948, 0x3029}, //6813 #HANGZHOU NUMERAL NINE
+ {0xA949, 0x32A3}, //6814 #CIRCLED IDEOGRAPH CORRECT
+ {0xA94A, 0x338E}, //6815 #SQUARE MG
+ {0xA94B, 0x338F}, //6816 #SQUARE KG
+ {0xA94C, 0x339C}, //6817 #SQUARE MM
+ {0xA94D, 0x339D}, //6818 #SQUARE CM
+ {0xA94E, 0x339E}, //6819 #SQUARE KM
+ {0xA94F, 0x33A1}, //6820 #SQUARE M SQUARED
+ {0xA950, 0x33C4}, //6821 #SQUARE CC
+ {0xA951, 0x33CE}, //6822 #SQUARE KM CAPITAL
+ {0xA952, 0x33D1}, //6823 #SQUARE LN
+ {0xA953, 0x33D2}, //6824 #SQUARE LOG
+ {0xA954, 0x33D5}, //6825 #SQUARE MIL
+ {0xA955, 0xFE30}, //6826 #PRESENTATION FORM FOR VERTICAL TWO DOT LEADER
+ {0xA956, 0xFFE2}, //6827 #FULLWIDTH NOT SIGN
+ {0xA957, 0xFFE4}, //6828 #FULLWIDTH BROKEN BAR
+ {0xA959, 0x2121}, //6829 #TELEPHONE SIGN
+ {0xA95A, 0x3231}, //6830 #PARENTHESIZED IDEOGRAPH STOCK
+ {0xA95C, 0x2010}, //6831 #HYPHEN
+ {0xA960, 0x30FC}, //6832 #KATAKANA-HIRAGANA PROLONGED SOUND MARK
+ {0xA961, 0x309B}, //6833 #KATAKANA-HIRAGANA VOICED SOUND MARK
+ {0xA962, 0x309C}, //6834 #KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
+ {0xA963, 0x30FD}, //6835 #KATAKANA ITERATION MARK
+ {0xA964, 0x30FE}, //6836 #KATAKANA VOICED ITERATION MARK
+ {0xA965, 0x3006}, //6837 #IDEOGRAPHIC CLOSING MARK
+ {0xA966, 0x309D}, //6838 #HIRAGANA ITERATION MARK
+ {0xA967, 0x309E}, //6839 #HIRAGANA VOICED ITERATION MARK
+ {0xA968, 0xFE49}, //6840 #DASHED OVERLINE
+ {0xA969, 0xFE4A}, //6841 #CENTRELINE OVERLINE
+ {0xA96A, 0xFE4B}, //6842 #WAVY OVERLINE
+ {0xA96B, 0xFE4C}, //6843 #DOUBLE WAVY OVERLINE
+ {0xA96C, 0xFE4D}, //6844 #DASHED LOW LINE
+ {0xA96D, 0xFE4E}, //6845 #CENTRELINE LOW LINE
+ {0xA96E, 0xFE4F}, //6846 #WAVY LOW LINE
+ {0xA96F, 0xFE50}, //6847 #SMALL COMMA
+ {0xA970, 0xFE51}, //6848 #SMALL IDEOGRAPHIC COMMA
+ {0xA971, 0xFE52}, //6849 #SMALL FULL STOP
+ {0xA972, 0xFE54}, //6850 #SMALL SEMICOLON
+ {0xA973, 0xFE55}, //6851 #SMALL COLON
+ {0xA974, 0xFE56}, //6852 #SMALL QUESTION MARK
+ {0xA975, 0xFE57}, //6853 #SMALL EXCLAMATION MARK
+ {0xA976, 0xFE59}, //6854 #SMALL LEFT PARENTHESIS
+ {0xA977, 0xFE5A}, //6855 #SMALL RIGHT PARENTHESIS
+ {0xA978, 0xFE5B}, //6856 #SMALL LEFT CURLY BRACKET
+ {0xA979, 0xFE5C}, //6857 #SMALL RIGHT CURLY BRACKET
+ {0xA97A, 0xFE5D}, //6858 #SMALL LEFT TORTOISE SHELL BRACKET
+ {0xA97B, 0xFE5E}, //6859 #SMALL RIGHT TORTOISE SHELL BRACKET
+ {0xA97C, 0xFE5F}, //6860 #SMALL NUMBER SIGN
+ {0xA97D, 0xFE60}, //6861 #SMALL AMPERSAND
+ {0xA97E, 0xFE61}, //6862 #SMALL ASTERISK
+ {0xA980, 0xFE62}, //6863 #SMALL PLUS SIGN
+ {0xA981, 0xFE63}, //6864 #SMALL HYPHEN-MINUS
+ {0xA982, 0xFE64}, //6865 #SMALL LESS-THAN SIGN
+ {0xA983, 0xFE65}, //6866 #SMALL GREATER-THAN SIGN
+ {0xA984, 0xFE66}, //6867 #SMALL EQUALS SIGN
+ {0xA985, 0xFE68}, //6868 #SMALL REVERSE SOLIDUS
+ {0xA986, 0xFE69}, //6869 #SMALL DOLLAR SIGN
+ {0xA987, 0xFE6A}, //6870 #SMALL PERCENT SIGN
+ {0xA988, 0xFE6B}, //6871 #SMALL COMMERCIAL AT
+ {0xA996, 0x3007}, //6872 #IDEOGRAPHIC NUMBER ZERO
+ {0xA9A4, 0x2500}, //6873 #BOX DRAWINGS LIGHT HORIZONTAL
+ {0xA9A5, 0x2501}, //6874 #BOX DRAWINGS HEAVY HORIZONTAL
+ {0xA9A6, 0x2502}, //6875 #BOX DRAWINGS LIGHT VERTICAL
+ {0xA9A7, 0x2503}, //6876 #BOX DRAWINGS HEAVY VERTICAL
+ {0xA9A8, 0x2504}, //6877 #BOX DRAWINGS LIGHT TRIPLE DASH HORIZONTAL
+ {0xA9A9, 0x2505}, //6878 #BOX DRAWINGS HEAVY TRIPLE DASH HORIZONTAL
+ {0xA9AA, 0x2506}, //6879 #BOX DRAWINGS LIGHT TRIPLE DASH VERTICAL
+ {0xA9AB, 0x2507}, //6880 #BOX DRAWINGS HEAVY TRIPLE DASH VERTICAL
+ {0xA9AC, 0x2508}, //6881 #BOX DRAWINGS LIGHT QUADRUPLE DASH HORIZONTAL
+ {0xA9AD, 0x2509}, //6882 #BOX DRAWINGS HEAVY QUADRUPLE DASH HORIZONTAL
+ {0xA9AE, 0x250A}, //6883 #BOX DRAWINGS LIGHT QUADRUPLE DASH VERTICAL
+ {0xA9AF, 0x250B}, //6884 #BOX DRAWINGS HEAVY QUADRUPLE DASH VERTICAL
+ {0xA9B0, 0x250C}, //6885 #BOX DRAWINGS LIGHT DOWN AND RIGHT
+ {0xA9B1, 0x250D}, //6886 #BOX DRAWINGS DOWN LIGHT AND RIGHT HEAVY
+ {0xA9B2, 0x250E}, //6887 #BOX DRAWINGS DOWN HEAVY AND RIGHT LIGHT
+ {0xA9B3, 0x250F}, //6888 #BOX DRAWINGS HEAVY DOWN AND RIGHT
+ {0xA9B4, 0x2510}, //6889 #BOX DRAWINGS LIGHT DOWN AND LEFT
+ {0xA9B5, 0x2511}, //6890 #BOX DRAWINGS DOWN LIGHT AND LEFT HEAVY
+ {0xA9B6, 0x2512}, //6891 #BOX DRAWINGS DOWN HEAVY AND LEFT LIGHT
+ {0xA9B7, 0x2513}, //6892 #BOX DRAWINGS HEAVY DOWN AND LEFT
+ {0xA9B8, 0x2514}, //6893 #BOX DRAWINGS LIGHT UP AND RIGHT
+ {0xA9B9, 0x2515}, //6894 #BOX DRAWINGS UP LIGHT AND RIGHT HEAVY
+ {0xA9BA, 0x2516}, //6895 #BOX DRAWINGS UP HEAVY AND RIGHT LIGHT
+ {0xA9BB, 0x2517}, //6896 #BOX DRAWINGS HEAVY UP AND RIGHT
+ {0xA9BC, 0x2518}, //6897 #BOX DRAWINGS LIGHT UP AND LEFT
+ {0xA9BD, 0x2519}, //6898 #BOX DRAWINGS UP LIGHT AND LEFT HEAVY
+ {0xA9BE, 0x251A}, //6899 #BOX DRAWINGS UP HEAVY AND LEFT LIGHT
+ {0xA9BF, 0x251B}, //6900 #BOX DRAWINGS HEAVY UP AND LEFT
+ {0xA9C0, 0x251C}, //6901 #BOX DRAWINGS LIGHT VERTICAL AND RIGHT
+ {0xA9C1, 0x251D}, //6902 #BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY
+ {0xA9C2, 0x251E}, //6903 #BOX DRAWINGS UP HEAVY AND RIGHT DOWN LIGHT
+ {0xA9C3, 0x251F}, //6904 #BOX DRAWINGS DOWN HEAVY AND RIGHT UP LIGHT
+ {0xA9C4, 0x2520}, //6905 #BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT
+ {0xA9C5, 0x2521}, //6906 #BOX DRAWINGS DOWN LIGHT AND RIGHT UP HEAVY
+ {0xA9C6, 0x2522}, //6907 #BOX DRAWINGS UP LIGHT AND RIGHT DOWN HEAVY
+ {0xA9C7, 0x2523}, //6908 #BOX DRAWINGS HEAVY VERTICAL AND RIGHT
+ {0xA9C8, 0x2524}, //6909 #BOX DRAWINGS LIGHT VERTICAL AND LEFT
+ {0xA9C9, 0x2525}, //6910 #BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY
+ {0xA9CA, 0x2526}, //6911 #BOX DRAWINGS UP HEAVY AND LEFT DOWN LIGHT
+ {0xA9CB, 0x2527}, //6912 #BOX DRAWINGS DOWN HEAVY AND LEFT UP LIGHT
+ {0xA9CC, 0x2528}, //6913 #BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT
+ {0xA9CD, 0x2529}, //6914 #BOX DRAWINGS DOWN LIGHT AND LEFT UP HEAVY
+ {0xA9CE, 0x252A}, //6915 #BOX DRAWINGS UP LIGHT AND LEFT DOWN HEAVY
+ {0xA9CF, 0x252B}, //6916 #BOX DRAWINGS HEAVY VERTICAL AND LEFT
+ {0xA9D0, 0x252C}, //6917 #BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
+ {0xA9D1, 0x252D}, //6918 #BOX DRAWINGS LEFT HEAVY AND RIGHT DOWN LIGHT
+ {0xA9D2, 0x252E}, //6919 #BOX DRAWINGS RIGHT HEAVY AND LEFT DOWN LIGHT
+ {0xA9D3, 0x252F}, //6920 #BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY
+ {0xA9D4, 0x2530}, //6921 #BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT
+ {0xA9D5, 0x2531}, //6922 #BOX DRAWINGS RIGHT LIGHT AND LEFT DOWN HEAVY
+ {0xA9D6, 0x2532}, //6923 #BOX DRAWINGS LEFT LIGHT AND RIGHT DOWN HEAVY
+ {0xA9D7, 0x2533}, //6924 #BOX DRAWINGS HEAVY DOWN AND HORIZONTAL
+ {0xA9D8, 0x2534}, //6925 #BOX DRAWINGS LIGHT UP AND HORIZONTAL
+ {0xA9D9, 0x2535}, //6926 #BOX DRAWINGS LEFT HEAVY AND RIGHT UP LIGHT
+ {0xA9DA, 0x2536}, //6927 #BOX DRAWINGS RIGHT HEAVY AND LEFT UP LIGHT
+ {0xA9DB, 0x2537}, //6928 #BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY
+ {0xA9DC, 0x2538}, //6929 #BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT
+ {0xA9DD, 0x2539}, //6930 #BOX DRAWINGS RIGHT LIGHT AND LEFT UP HEAVY
+ {0xA9DE, 0x253A}, //6931 #BOX DRAWINGS LEFT LIGHT AND RIGHT UP HEAVY
+ {0xA9DF, 0x253B}, //6932 #BOX DRAWINGS HEAVY UP AND HORIZONTAL
+ {0xA9E0, 0x253C}, //6933 #BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
+ {0xA9E1, 0x253D}, //6934 #BOX DRAWINGS LEFT HEAVY AND RIGHT VERTICAL LIGHT
+ {0xA9E2, 0x253E}, //6935 #BOX DRAWINGS RIGHT HEAVY AND LEFT VERTICAL LIGHT
+ {0xA9E3, 0x253F}, //6936 #BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY
+ {0xA9E4, 0x2540}, //6937 #BOX DRAWINGS UP HEAVY AND DOWN HORIZONTAL LIGHT
+ {0xA9E5, 0x2541}, //6938 #BOX DRAWINGS DOWN HEAVY AND UP HORIZONTAL LIGHT
+ {0xA9E6, 0x2542}, //6939 #BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT
+ {0xA9E7, 0x2543}, //6940 #BOX DRAWINGS LEFT UP HEAVY AND RIGHT DOWN LIGHT
+ {0xA9E8, 0x2544}, //6941 #BOX DRAWINGS RIGHT UP HEAVY AND LEFT DOWN LIGHT
+ {0xA9E9, 0x2545}, //6942 #BOX DRAWINGS LEFT DOWN HEAVY AND RIGHT UP LIGHT
+ {0xA9EA, 0x2546}, //6943 #BOX DRAWINGS RIGHT DOWN HEAVY AND LEFT UP LIGHT
+ {0xA9EB, 0x2547}, //6944 #BOX DRAWINGS DOWN LIGHT AND UP HORIZONTAL HEAVY
+ {0xA9EC, 0x2548}, //6945 #BOX DRAWINGS UP LIGHT AND DOWN HORIZONTAL HEAVY
+ {0xA9ED, 0x2549}, //6946 #BOX DRAWINGS RIGHT LIGHT AND LEFT VERTICAL HEAVY
+ {0xA9EE, 0x254A}, //6947 #BOX DRAWINGS LEFT LIGHT AND RIGHT VERTICAL HEAVY
+ {0xA9EF, 0x254B}, //6948 #BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL
+ {0xAA40, 0x72DC}, //6949 #CJK UNIFIED IDEOGRAPH
+ {0xAA41, 0x72DD}, //6950 #CJK UNIFIED IDEOGRAPH
+ {0xAA42, 0x72DF}, //6951 #CJK UNIFIED IDEOGRAPH
+ {0xAA43, 0x72E2}, //6952 #CJK UNIFIED IDEOGRAPH
+ {0xAA44, 0x72E3}, //6953 #CJK UNIFIED IDEOGRAPH
+ {0xAA45, 0x72E4}, //6954 #CJK UNIFIED IDEOGRAPH
+ {0xAA46, 0x72E5}, //6955 #CJK UNIFIED IDEOGRAPH
+ {0xAA47, 0x72E6}, //6956 #CJK UNIFIED IDEOGRAPH
+ {0xAA48, 0x72E7}, //6957 #CJK UNIFIED IDEOGRAPH
+ {0xAA49, 0x72EA}, //6958 #CJK UNIFIED IDEOGRAPH
+ {0xAA4A, 0x72EB}, //6959 #CJK UNIFIED IDEOGRAPH
+ {0xAA4B, 0x72F5}, //6960 #CJK UNIFIED IDEOGRAPH
+ {0xAA4C, 0x72F6}, //6961 #CJK UNIFIED IDEOGRAPH
+ {0xAA4D, 0x72F9}, //6962 #CJK UNIFIED IDEOGRAPH
+ {0xAA4E, 0x72FD}, //6963 #CJK UNIFIED IDEOGRAPH
+ {0xAA4F, 0x72FE}, //6964 #CJK UNIFIED IDEOGRAPH
+ {0xAA50, 0x72FF}, //6965 #CJK UNIFIED IDEOGRAPH
+ {0xAA51, 0x7300}, //6966 #CJK UNIFIED IDEOGRAPH
+ {0xAA52, 0x7302}, //6967 #CJK UNIFIED IDEOGRAPH
+ {0xAA53, 0x7304}, //6968 #CJK UNIFIED IDEOGRAPH
+ {0xAA54, 0x7305}, //6969 #CJK UNIFIED IDEOGRAPH
+ {0xAA55, 0x7306}, //6970 #CJK UNIFIED IDEOGRAPH
+ {0xAA56, 0x7307}, //6971 #CJK UNIFIED IDEOGRAPH
+ {0xAA57, 0x7308}, //6972 #CJK UNIFIED IDEOGRAPH
+ {0xAA58, 0x7309}, //6973 #CJK UNIFIED IDEOGRAPH
+ {0xAA59, 0x730B}, //6974 #CJK UNIFIED IDEOGRAPH
+ {0xAA5A, 0x730C}, //6975 #CJK UNIFIED IDEOGRAPH
+ {0xAA5B, 0x730D}, //6976 #CJK UNIFIED IDEOGRAPH
+ {0xAA5C, 0x730F}, //6977 #CJK UNIFIED IDEOGRAPH
+ {0xAA5D, 0x7310}, //6978 #CJK UNIFIED IDEOGRAPH
+ {0xAA5E, 0x7311}, //6979 #CJK UNIFIED IDEOGRAPH
+ {0xAA5F, 0x7312}, //6980 #CJK UNIFIED IDEOGRAPH
+ {0xAA60, 0x7314}, //6981 #CJK UNIFIED IDEOGRAPH
+ {0xAA61, 0x7318}, //6982 #CJK UNIFIED IDEOGRAPH
+ {0xAA62, 0x7319}, //6983 #CJK UNIFIED IDEOGRAPH
+ {0xAA63, 0x731A}, //6984 #CJK UNIFIED IDEOGRAPH
+ {0xAA64, 0x731F}, //6985 #CJK UNIFIED IDEOGRAPH
+ {0xAA65, 0x7320}, //6986 #CJK UNIFIED IDEOGRAPH
+ {0xAA66, 0x7323}, //6987 #CJK UNIFIED IDEOGRAPH
+ {0xAA67, 0x7324}, //6988 #CJK UNIFIED IDEOGRAPH
+ {0xAA68, 0x7326}, //6989 #CJK UNIFIED IDEOGRAPH
+ {0xAA69, 0x7327}, //6990 #CJK UNIFIED IDEOGRAPH
+ {0xAA6A, 0x7328}, //6991 #CJK UNIFIED IDEOGRAPH
+ {0xAA6B, 0x732D}, //6992 #CJK UNIFIED IDEOGRAPH
+ {0xAA6C, 0x732F}, //6993 #CJK UNIFIED IDEOGRAPH
+ {0xAA6D, 0x7330}, //6994 #CJK UNIFIED IDEOGRAPH
+ {0xAA6E, 0x7332}, //6995 #CJK UNIFIED IDEOGRAPH
+ {0xAA6F, 0x7333}, //6996 #CJK UNIFIED IDEOGRAPH
+ {0xAA70, 0x7335}, //6997 #CJK UNIFIED IDEOGRAPH
+ {0xAA71, 0x7336}, //6998 #CJK UNIFIED IDEOGRAPH
+ {0xAA72, 0x733A}, //6999 #CJK UNIFIED IDEOGRAPH
+ {0xAA73, 0x733B}, //7000 #CJK UNIFIED IDEOGRAPH
+ {0xAA74, 0x733C}, //7001 #CJK UNIFIED IDEOGRAPH
+ {0xAA75, 0x733D}, //7002 #CJK UNIFIED IDEOGRAPH
+ {0xAA76, 0x7340}, //7003 #CJK UNIFIED IDEOGRAPH
+ {0xAA77, 0x7341}, //7004 #CJK UNIFIED IDEOGRAPH
+ {0xAA78, 0x7342}, //7005 #CJK UNIFIED IDEOGRAPH
+ {0xAA79, 0x7343}, //7006 #CJK UNIFIED IDEOGRAPH
+ {0xAA7A, 0x7344}, //7007 #CJK UNIFIED IDEOGRAPH
+ {0xAA7B, 0x7345}, //7008 #CJK UNIFIED IDEOGRAPH
+ {0xAA7C, 0x7346}, //7009 #CJK UNIFIED IDEOGRAPH
+ {0xAA7D, 0x7347}, //7010 #CJK UNIFIED IDEOGRAPH
+ {0xAA7E, 0x7348}, //7011 #CJK UNIFIED IDEOGRAPH
+ {0xAA80, 0x7349}, //7012 #CJK UNIFIED IDEOGRAPH
+ {0xAA81, 0x734A}, //7013 #CJK UNIFIED IDEOGRAPH
+ {0xAA82, 0x734B}, //7014 #CJK UNIFIED IDEOGRAPH
+ {0xAA83, 0x734C}, //7015 #CJK UNIFIED IDEOGRAPH
+ {0xAA84, 0x734E}, //7016 #CJK UNIFIED IDEOGRAPH
+ {0xAA85, 0x734F}, //7017 #CJK UNIFIED IDEOGRAPH
+ {0xAA86, 0x7351}, //7018 #CJK UNIFIED IDEOGRAPH
+ {0xAA87, 0x7353}, //7019 #CJK UNIFIED IDEOGRAPH
+ {0xAA88, 0x7354}, //7020 #CJK UNIFIED IDEOGRAPH
+ {0xAA89, 0x7355}, //7021 #CJK UNIFIED IDEOGRAPH
+ {0xAA8A, 0x7356}, //7022 #CJK UNIFIED IDEOGRAPH
+ {0xAA8B, 0x7358}, //7023 #CJK UNIFIED IDEOGRAPH
+ {0xAA8C, 0x7359}, //7024 #CJK UNIFIED IDEOGRAPH
+ {0xAA8D, 0x735A}, //7025 #CJK UNIFIED IDEOGRAPH
+ {0xAA8E, 0x735B}, //7026 #CJK UNIFIED IDEOGRAPH
+ {0xAA8F, 0x735C}, //7027 #CJK UNIFIED IDEOGRAPH
+ {0xAA90, 0x735D}, //7028 #CJK UNIFIED IDEOGRAPH
+ {0xAA91, 0x735E}, //7029 #CJK UNIFIED IDEOGRAPH
+ {0xAA92, 0x735F}, //7030 #CJK UNIFIED IDEOGRAPH
+ {0xAA93, 0x7361}, //7031 #CJK UNIFIED IDEOGRAPH
+ {0xAA94, 0x7362}, //7032 #CJK UNIFIED IDEOGRAPH
+ {0xAA95, 0x7363}, //7033 #CJK UNIFIED IDEOGRAPH
+ {0xAA96, 0x7364}, //7034 #CJK UNIFIED IDEOGRAPH
+ {0xAA97, 0x7365}, //7035 #CJK UNIFIED IDEOGRAPH
+ {0xAA98, 0x7366}, //7036 #CJK UNIFIED IDEOGRAPH
+ {0xAA99, 0x7367}, //7037 #CJK UNIFIED IDEOGRAPH
+ {0xAA9A, 0x7368}, //7038 #CJK UNIFIED IDEOGRAPH
+ {0xAA9B, 0x7369}, //7039 #CJK UNIFIED IDEOGRAPH
+ {0xAA9C, 0x736A}, //7040 #CJK UNIFIED IDEOGRAPH
+ {0xAA9D, 0x736B}, //7041 #CJK UNIFIED IDEOGRAPH
+ {0xAA9E, 0x736E}, //7042 #CJK UNIFIED IDEOGRAPH
+ {0xAA9F, 0x7370}, //7043 #CJK UNIFIED IDEOGRAPH
+ {0xAAA0, 0x7371}, //7044 #CJK UNIFIED IDEOGRAPH
+ {0xAB40, 0x7372}, //7045 #CJK UNIFIED IDEOGRAPH
+ {0xAB41, 0x7373}, //7046 #CJK UNIFIED IDEOGRAPH
+ {0xAB42, 0x7374}, //7047 #CJK UNIFIED IDEOGRAPH
+ {0xAB43, 0x7375}, //7048 #CJK UNIFIED IDEOGRAPH
+ {0xAB44, 0x7376}, //7049 #CJK UNIFIED IDEOGRAPH
+ {0xAB45, 0x7377}, //7050 #CJK UNIFIED IDEOGRAPH
+ {0xAB46, 0x7378}, //7051 #CJK UNIFIED IDEOGRAPH
+ {0xAB47, 0x7379}, //7052 #CJK UNIFIED IDEOGRAPH
+ {0xAB48, 0x737A}, //7053 #CJK UNIFIED IDEOGRAPH
+ {0xAB49, 0x737B}, //7054 #CJK UNIFIED IDEOGRAPH
+ {0xAB4A, 0x737C}, //7055 #CJK UNIFIED IDEOGRAPH
+ {0xAB4B, 0x737D}, //7056 #CJK UNIFIED IDEOGRAPH
+ {0xAB4C, 0x737F}, //7057 #CJK UNIFIED IDEOGRAPH
+ {0xAB4D, 0x7380}, //7058 #CJK UNIFIED IDEOGRAPH
+ {0xAB4E, 0x7381}, //7059 #CJK UNIFIED IDEOGRAPH
+ {0xAB4F, 0x7382}, //7060 #CJK UNIFIED IDEOGRAPH
+ {0xAB50, 0x7383}, //7061 #CJK UNIFIED IDEOGRAPH
+ {0xAB51, 0x7385}, //7062 #CJK UNIFIED IDEOGRAPH
+ {0xAB52, 0x7386}, //7063 #CJK UNIFIED IDEOGRAPH
+ {0xAB53, 0x7388}, //7064 #CJK UNIFIED IDEOGRAPH
+ {0xAB54, 0x738A}, //7065 #CJK UNIFIED IDEOGRAPH
+ {0xAB55, 0x738C}, //7066 #CJK UNIFIED IDEOGRAPH
+ {0xAB56, 0x738D}, //7067 #CJK UNIFIED IDEOGRAPH
+ {0xAB57, 0x738F}, //7068 #CJK UNIFIED IDEOGRAPH
+ {0xAB58, 0x7390}, //7069 #CJK UNIFIED IDEOGRAPH
+ {0xAB59, 0x7392}, //7070 #CJK UNIFIED IDEOGRAPH
+ {0xAB5A, 0x7393}, //7071 #CJK UNIFIED IDEOGRAPH
+ {0xAB5B, 0x7394}, //7072 #CJK UNIFIED IDEOGRAPH
+ {0xAB5C, 0x7395}, //7073 #CJK UNIFIED IDEOGRAPH
+ {0xAB5D, 0x7397}, //7074 #CJK UNIFIED IDEOGRAPH
+ {0xAB5E, 0x7398}, //7075 #CJK UNIFIED IDEOGRAPH
+ {0xAB5F, 0x7399}, //7076 #CJK UNIFIED IDEOGRAPH
+ {0xAB60, 0x739A}, //7077 #CJK UNIFIED IDEOGRAPH
+ {0xAB61, 0x739C}, //7078 #CJK UNIFIED IDEOGRAPH
+ {0xAB62, 0x739D}, //7079 #CJK UNIFIED IDEOGRAPH
+ {0xAB63, 0x739E}, //7080 #CJK UNIFIED IDEOGRAPH
+ {0xAB64, 0x73A0}, //7081 #CJK UNIFIED IDEOGRAPH
+ {0xAB65, 0x73A1}, //7082 #CJK UNIFIED IDEOGRAPH
+ {0xAB66, 0x73A3}, //7083 #CJK UNIFIED IDEOGRAPH
+ {0xAB67, 0x73A4}, //7084 #CJK UNIFIED IDEOGRAPH
+ {0xAB68, 0x73A5}, //7085 #CJK UNIFIED IDEOGRAPH
+ {0xAB69, 0x73A6}, //7086 #CJK UNIFIED IDEOGRAPH
+ {0xAB6A, 0x73A7}, //7087 #CJK UNIFIED IDEOGRAPH
+ {0xAB6B, 0x73A8}, //7088 #CJK UNIFIED IDEOGRAPH
+ {0xAB6C, 0x73AA}, //7089 #CJK UNIFIED IDEOGRAPH
+ {0xAB6D, 0x73AC}, //7090 #CJK UNIFIED IDEOGRAPH
+ {0xAB6E, 0x73AD}, //7091 #CJK UNIFIED IDEOGRAPH
+ {0xAB6F, 0x73B1}, //7092 #CJK UNIFIED IDEOGRAPH
+ {0xAB70, 0x73B4}, //7093 #CJK UNIFIED IDEOGRAPH
+ {0xAB71, 0x73B5}, //7094 #CJK UNIFIED IDEOGRAPH
+ {0xAB72, 0x73B6}, //7095 #CJK UNIFIED IDEOGRAPH
+ {0xAB73, 0x73B8}, //7096 #CJK UNIFIED IDEOGRAPH
+ {0xAB74, 0x73B9}, //7097 #CJK UNIFIED IDEOGRAPH
+ {0xAB75, 0x73BC}, //7098 #CJK UNIFIED IDEOGRAPH
+ {0xAB76, 0x73BD}, //7099 #CJK UNIFIED IDEOGRAPH
+ {0xAB77, 0x73BE}, //7100 #CJK UNIFIED IDEOGRAPH
+ {0xAB78, 0x73BF}, //7101 #CJK UNIFIED IDEOGRAPH
+ {0xAB79, 0x73C1}, //7102 #CJK UNIFIED IDEOGRAPH
+ {0xAB7A, 0x73C3}, //7103 #CJK UNIFIED IDEOGRAPH
+ {0xAB7B, 0x73C4}, //7104 #CJK UNIFIED IDEOGRAPH
+ {0xAB7C, 0x73C5}, //7105 #CJK UNIFIED IDEOGRAPH
+ {0xAB7D, 0x73C6}, //7106 #CJK UNIFIED IDEOGRAPH
+ {0xAB7E, 0x73C7}, //7107 #CJK UNIFIED IDEOGRAPH
+ {0xAB80, 0x73CB}, //7108 #CJK UNIFIED IDEOGRAPH
+ {0xAB81, 0x73CC}, //7109 #CJK UNIFIED IDEOGRAPH
+ {0xAB82, 0x73CE}, //7110 #CJK UNIFIED IDEOGRAPH
+ {0xAB83, 0x73D2}, //7111 #CJK UNIFIED IDEOGRAPH
+ {0xAB84, 0x73D3}, //7112 #CJK UNIFIED IDEOGRAPH
+ {0xAB85, 0x73D4}, //7113 #CJK UNIFIED IDEOGRAPH
+ {0xAB86, 0x73D5}, //7114 #CJK UNIFIED IDEOGRAPH
+ {0xAB87, 0x73D6}, //7115 #CJK UNIFIED IDEOGRAPH
+ {0xAB88, 0x73D7}, //7116 #CJK UNIFIED IDEOGRAPH
+ {0xAB89, 0x73D8}, //7117 #CJK UNIFIED IDEOGRAPH
+ {0xAB8A, 0x73DA}, //7118 #CJK UNIFIED IDEOGRAPH
+ {0xAB8B, 0x73DB}, //7119 #CJK UNIFIED IDEOGRAPH
+ {0xAB8C, 0x73DC}, //7120 #CJK UNIFIED IDEOGRAPH
+ {0xAB8D, 0x73DD}, //7121 #CJK UNIFIED IDEOGRAPH
+ {0xAB8E, 0x73DF}, //7122 #CJK UNIFIED IDEOGRAPH
+ {0xAB8F, 0x73E1}, //7123 #CJK UNIFIED IDEOGRAPH
+ {0xAB90, 0x73E2}, //7124 #CJK UNIFIED IDEOGRAPH
+ {0xAB91, 0x73E3}, //7125 #CJK UNIFIED IDEOGRAPH
+ {0xAB92, 0x73E4}, //7126 #CJK UNIFIED IDEOGRAPH
+ {0xAB93, 0x73E6}, //7127 #CJK UNIFIED IDEOGRAPH
+ {0xAB94, 0x73E8}, //7128 #CJK UNIFIED IDEOGRAPH
+ {0xAB95, 0x73EA}, //7129 #CJK UNIFIED IDEOGRAPH
+ {0xAB96, 0x73EB}, //7130 #CJK UNIFIED IDEOGRAPH
+ {0xAB97, 0x73EC}, //7131 #CJK UNIFIED IDEOGRAPH
+ {0xAB98, 0x73EE}, //7132 #CJK UNIFIED IDEOGRAPH
+ {0xAB99, 0x73EF}, //7133 #CJK UNIFIED IDEOGRAPH
+ {0xAB9A, 0x73F0}, //7134 #CJK UNIFIED IDEOGRAPH
+ {0xAB9B, 0x73F1}, //7135 #CJK UNIFIED IDEOGRAPH
+ {0xAB9C, 0x73F3}, //7136 #CJK UNIFIED IDEOGRAPH
+ {0xAB9D, 0x73F4}, //7137 #CJK UNIFIED IDEOGRAPH
+ {0xAB9E, 0x73F5}, //7138 #CJK UNIFIED IDEOGRAPH
+ {0xAB9F, 0x73F6}, //7139 #CJK UNIFIED IDEOGRAPH
+ {0xABA0, 0x73F7}, //7140 #CJK UNIFIED IDEOGRAPH
+ {0xAC40, 0x73F8}, //7141 #CJK UNIFIED IDEOGRAPH
+ {0xAC41, 0x73F9}, //7142 #CJK UNIFIED IDEOGRAPH
+ {0xAC42, 0x73FA}, //7143 #CJK UNIFIED IDEOGRAPH
+ {0xAC43, 0x73FB}, //7144 #CJK UNIFIED IDEOGRAPH
+ {0xAC44, 0x73FC}, //7145 #CJK UNIFIED IDEOGRAPH
+ {0xAC45, 0x73FD}, //7146 #CJK UNIFIED IDEOGRAPH
+ {0xAC46, 0x73FE}, //7147 #CJK UNIFIED IDEOGRAPH
+ {0xAC47, 0x73FF}, //7148 #CJK UNIFIED IDEOGRAPH
+ {0xAC48, 0x7400}, //7149 #CJK UNIFIED IDEOGRAPH
+ {0xAC49, 0x7401}, //7150 #CJK UNIFIED IDEOGRAPH
+ {0xAC4A, 0x7402}, //7151 #CJK UNIFIED IDEOGRAPH
+ {0xAC4B, 0x7404}, //7152 #CJK UNIFIED IDEOGRAPH
+ {0xAC4C, 0x7407}, //7153 #CJK UNIFIED IDEOGRAPH
+ {0xAC4D, 0x7408}, //7154 #CJK UNIFIED IDEOGRAPH
+ {0xAC4E, 0x740B}, //7155 #CJK UNIFIED IDEOGRAPH
+ {0xAC4F, 0x740C}, //7156 #CJK UNIFIED IDEOGRAPH
+ {0xAC50, 0x740D}, //7157 #CJK UNIFIED IDEOGRAPH
+ {0xAC51, 0x740E}, //7158 #CJK UNIFIED IDEOGRAPH
+ {0xAC52, 0x7411}, //7159 #CJK UNIFIED IDEOGRAPH
+ {0xAC53, 0x7412}, //7160 #CJK UNIFIED IDEOGRAPH
+ {0xAC54, 0x7413}, //7161 #CJK UNIFIED IDEOGRAPH
+ {0xAC55, 0x7414}, //7162 #CJK UNIFIED IDEOGRAPH
+ {0xAC56, 0x7415}, //7163 #CJK UNIFIED IDEOGRAPH
+ {0xAC57, 0x7416}, //7164 #CJK UNIFIED IDEOGRAPH
+ {0xAC58, 0x7417}, //7165 #CJK UNIFIED IDEOGRAPH
+ {0xAC59, 0x7418}, //7166 #CJK UNIFIED IDEOGRAPH
+ {0xAC5A, 0x7419}, //7167 #CJK UNIFIED IDEOGRAPH
+ {0xAC5B, 0x741C}, //7168 #CJK UNIFIED IDEOGRAPH
+ {0xAC5C, 0x741D}, //7169 #CJK UNIFIED IDEOGRAPH
+ {0xAC5D, 0x741E}, //7170 #CJK UNIFIED IDEOGRAPH
+ {0xAC5E, 0x741F}, //7171 #CJK UNIFIED IDEOGRAPH
+ {0xAC5F, 0x7420}, //7172 #CJK UNIFIED IDEOGRAPH
+ {0xAC60, 0x7421}, //7173 #CJK UNIFIED IDEOGRAPH
+ {0xAC61, 0x7423}, //7174 #CJK UNIFIED IDEOGRAPH
+ {0xAC62, 0x7424}, //7175 #CJK UNIFIED IDEOGRAPH
+ {0xAC63, 0x7427}, //7176 #CJK UNIFIED IDEOGRAPH
+ {0xAC64, 0x7429}, //7177 #CJK UNIFIED IDEOGRAPH
+ {0xAC65, 0x742B}, //7178 #CJK UNIFIED IDEOGRAPH
+ {0xAC66, 0x742D}, //7179 #CJK UNIFIED IDEOGRAPH
+ {0xAC67, 0x742F}, //7180 #CJK UNIFIED IDEOGRAPH
+ {0xAC68, 0x7431}, //7181 #CJK UNIFIED IDEOGRAPH
+ {0xAC69, 0x7432}, //7182 #CJK UNIFIED IDEOGRAPH
+ {0xAC6A, 0x7437}, //7183 #CJK UNIFIED IDEOGRAPH
+ {0xAC6B, 0x7438}, //7184 #CJK UNIFIED IDEOGRAPH
+ {0xAC6C, 0x7439}, //7185 #CJK UNIFIED IDEOGRAPH
+ {0xAC6D, 0x743A}, //7186 #CJK UNIFIED IDEOGRAPH
+ {0xAC6E, 0x743B}, //7187 #CJK UNIFIED IDEOGRAPH
+ {0xAC6F, 0x743D}, //7188 #CJK UNIFIED IDEOGRAPH
+ {0xAC70, 0x743E}, //7189 #CJK UNIFIED IDEOGRAPH
+ {0xAC71, 0x743F}, //7190 #CJK UNIFIED IDEOGRAPH
+ {0xAC72, 0x7440}, //7191 #CJK UNIFIED IDEOGRAPH
+ {0xAC73, 0x7442}, //7192 #CJK UNIFIED IDEOGRAPH
+ {0xAC74, 0x7443}, //7193 #CJK UNIFIED IDEOGRAPH
+ {0xAC75, 0x7444}, //7194 #CJK UNIFIED IDEOGRAPH
+ {0xAC76, 0x7445}, //7195 #CJK UNIFIED IDEOGRAPH
+ {0xAC77, 0x7446}, //7196 #CJK UNIFIED IDEOGRAPH
+ {0xAC78, 0x7447}, //7197 #CJK UNIFIED IDEOGRAPH
+ {0xAC79, 0x7448}, //7198 #CJK UNIFIED IDEOGRAPH
+ {0xAC7A, 0x7449}, //7199 #CJK UNIFIED IDEOGRAPH
+ {0xAC7B, 0x744A}, //7200 #CJK UNIFIED IDEOGRAPH
+ {0xAC7C, 0x744B}, //7201 #CJK UNIFIED IDEOGRAPH
+ {0xAC7D, 0x744C}, //7202 #CJK UNIFIED IDEOGRAPH
+ {0xAC7E, 0x744D}, //7203 #CJK UNIFIED IDEOGRAPH
+ {0xAC80, 0x744E}, //7204 #CJK UNIFIED IDEOGRAPH
+ {0xAC81, 0x744F}, //7205 #CJK UNIFIED IDEOGRAPH
+ {0xAC82, 0x7450}, //7206 #CJK UNIFIED IDEOGRAPH
+ {0xAC83, 0x7451}, //7207 #CJK UNIFIED IDEOGRAPH
+ {0xAC84, 0x7452}, //7208 #CJK UNIFIED IDEOGRAPH
+ {0xAC85, 0x7453}, //7209 #CJK UNIFIED IDEOGRAPH
+ {0xAC86, 0x7454}, //7210 #CJK UNIFIED IDEOGRAPH
+ {0xAC87, 0x7456}, //7211 #CJK UNIFIED IDEOGRAPH
+ {0xAC88, 0x7458}, //7212 #CJK UNIFIED IDEOGRAPH
+ {0xAC89, 0x745D}, //7213 #CJK UNIFIED IDEOGRAPH
+ {0xAC8A, 0x7460}, //7214 #CJK UNIFIED IDEOGRAPH
+ {0xAC8B, 0x7461}, //7215 #CJK UNIFIED IDEOGRAPH
+ {0xAC8C, 0x7462}, //7216 #CJK UNIFIED IDEOGRAPH
+ {0xAC8D, 0x7463}, //7217 #CJK UNIFIED IDEOGRAPH
+ {0xAC8E, 0x7464}, //7218 #CJK UNIFIED IDEOGRAPH
+ {0xAC8F, 0x7465}, //7219 #CJK UNIFIED IDEOGRAPH
+ {0xAC90, 0x7466}, //7220 #CJK UNIFIED IDEOGRAPH
+ {0xAC91, 0x7467}, //7221 #CJK UNIFIED IDEOGRAPH
+ {0xAC92, 0x7468}, //7222 #CJK UNIFIED IDEOGRAPH
+ {0xAC93, 0x7469}, //7223 #CJK UNIFIED IDEOGRAPH
+ {0xAC94, 0x746A}, //7224 #CJK UNIFIED IDEOGRAPH
+ {0xAC95, 0x746B}, //7225 #CJK UNIFIED IDEOGRAPH
+ {0xAC96, 0x746C}, //7226 #CJK UNIFIED IDEOGRAPH
+ {0xAC97, 0x746E}, //7227 #CJK UNIFIED IDEOGRAPH
+ {0xAC98, 0x746F}, //7228 #CJK UNIFIED IDEOGRAPH
+ {0xAC99, 0x7471}, //7229 #CJK UNIFIED IDEOGRAPH
+ {0xAC9A, 0x7472}, //7230 #CJK UNIFIED IDEOGRAPH
+ {0xAC9B, 0x7473}, //7231 #CJK UNIFIED IDEOGRAPH
+ {0xAC9C, 0x7474}, //7232 #CJK UNIFIED IDEOGRAPH
+ {0xAC9D, 0x7475}, //7233 #CJK UNIFIED IDEOGRAPH
+ {0xAC9E, 0x7478}, //7234 #CJK UNIFIED IDEOGRAPH
+ {0xAC9F, 0x7479}, //7235 #CJK UNIFIED IDEOGRAPH
+ {0xACA0, 0x747A}, //7236 #CJK UNIFIED IDEOGRAPH
+ {0xAD40, 0x747B}, //7237 #CJK UNIFIED IDEOGRAPH
+ {0xAD41, 0x747C}, //7238 #CJK UNIFIED IDEOGRAPH
+ {0xAD42, 0x747D}, //7239 #CJK UNIFIED IDEOGRAPH
+ {0xAD43, 0x747F}, //7240 #CJK UNIFIED IDEOGRAPH
+ {0xAD44, 0x7482}, //7241 #CJK UNIFIED IDEOGRAPH
+ {0xAD45, 0x7484}, //7242 #CJK UNIFIED IDEOGRAPH
+ {0xAD46, 0x7485}, //7243 #CJK UNIFIED IDEOGRAPH
+ {0xAD47, 0x7486}, //7244 #CJK UNIFIED IDEOGRAPH
+ {0xAD48, 0x7488}, //7245 #CJK UNIFIED IDEOGRAPH
+ {0xAD49, 0x7489}, //7246 #CJK UNIFIED IDEOGRAPH
+ {0xAD4A, 0x748A}, //7247 #CJK UNIFIED IDEOGRAPH
+ {0xAD4B, 0x748C}, //7248 #CJK UNIFIED IDEOGRAPH
+ {0xAD4C, 0x748D}, //7249 #CJK UNIFIED IDEOGRAPH
+ {0xAD4D, 0x748F}, //7250 #CJK UNIFIED IDEOGRAPH
+ {0xAD4E, 0x7491}, //7251 #CJK UNIFIED IDEOGRAPH
+ {0xAD4F, 0x7492}, //7252 #CJK UNIFIED IDEOGRAPH
+ {0xAD50, 0x7493}, //7253 #CJK UNIFIED IDEOGRAPH
+ {0xAD51, 0x7494}, //7254 #CJK UNIFIED IDEOGRAPH
+ {0xAD52, 0x7495}, //7255 #CJK UNIFIED IDEOGRAPH
+ {0xAD53, 0x7496}, //7256 #CJK UNIFIED IDEOGRAPH
+ {0xAD54, 0x7497}, //7257 #CJK UNIFIED IDEOGRAPH
+ {0xAD55, 0x7498}, //7258 #CJK UNIFIED IDEOGRAPH
+ {0xAD56, 0x7499}, //7259 #CJK UNIFIED IDEOGRAPH
+ {0xAD57, 0x749A}, //7260 #CJK UNIFIED IDEOGRAPH
+ {0xAD58, 0x749B}, //7261 #CJK UNIFIED IDEOGRAPH
+ {0xAD59, 0x749D}, //7262 #CJK UNIFIED IDEOGRAPH
+ {0xAD5A, 0x749F}, //7263 #CJK UNIFIED IDEOGRAPH
+ {0xAD5B, 0x74A0}, //7264 #CJK UNIFIED IDEOGRAPH
+ {0xAD5C, 0x74A1}, //7265 #CJK UNIFIED IDEOGRAPH
+ {0xAD5D, 0x74A2}, //7266 #CJK UNIFIED IDEOGRAPH
+ {0xAD5E, 0x74A3}, //7267 #CJK UNIFIED IDEOGRAPH
+ {0xAD5F, 0x74A4}, //7268 #CJK UNIFIED IDEOGRAPH
+ {0xAD60, 0x74A5}, //7269 #CJK UNIFIED IDEOGRAPH
+ {0xAD61, 0x74A6}, //7270 #CJK UNIFIED IDEOGRAPH
+ {0xAD62, 0x74AA}, //7271 #CJK UNIFIED IDEOGRAPH
+ {0xAD63, 0x74AB}, //7272 #CJK UNIFIED IDEOGRAPH
+ {0xAD64, 0x74AC}, //7273 #CJK UNIFIED IDEOGRAPH
+ {0xAD65, 0x74AD}, //7274 #CJK UNIFIED IDEOGRAPH
+ {0xAD66, 0x74AE}, //7275 #CJK UNIFIED IDEOGRAPH
+ {0xAD67, 0x74AF}, //7276 #CJK UNIFIED IDEOGRAPH
+ {0xAD68, 0x74B0}, //7277 #CJK UNIFIED IDEOGRAPH
+ {0xAD69, 0x74B1}, //7278 #CJK UNIFIED IDEOGRAPH
+ {0xAD6A, 0x74B2}, //7279 #CJK UNIFIED IDEOGRAPH
+ {0xAD6B, 0x74B3}, //7280 #CJK UNIFIED IDEOGRAPH
+ {0xAD6C, 0x74B4}, //7281 #CJK UNIFIED IDEOGRAPH
+ {0xAD6D, 0x74B5}, //7282 #CJK UNIFIED IDEOGRAPH
+ {0xAD6E, 0x74B6}, //7283 #CJK UNIFIED IDEOGRAPH
+ {0xAD6F, 0x74B7}, //7284 #CJK UNIFIED IDEOGRAPH
+ {0xAD70, 0x74B8}, //7285 #CJK UNIFIED IDEOGRAPH
+ {0xAD71, 0x74B9}, //7286 #CJK UNIFIED IDEOGRAPH
+ {0xAD72, 0x74BB}, //7287 #CJK UNIFIED IDEOGRAPH
+ {0xAD73, 0x74BC}, //7288 #CJK UNIFIED IDEOGRAPH
+ {0xAD74, 0x74BD}, //7289 #CJK UNIFIED IDEOGRAPH
+ {0xAD75, 0x74BE}, //7290 #CJK UNIFIED IDEOGRAPH
+ {0xAD76, 0x74BF}, //7291 #CJK UNIFIED IDEOGRAPH
+ {0xAD77, 0x74C0}, //7292 #CJK UNIFIED IDEOGRAPH
+ {0xAD78, 0x74C1}, //7293 #CJK UNIFIED IDEOGRAPH
+ {0xAD79, 0x74C2}, //7294 #CJK UNIFIED IDEOGRAPH
+ {0xAD7A, 0x74C3}, //7295 #CJK UNIFIED IDEOGRAPH
+ {0xAD7B, 0x74C4}, //7296 #CJK UNIFIED IDEOGRAPH
+ {0xAD7C, 0x74C5}, //7297 #CJK UNIFIED IDEOGRAPH
+ {0xAD7D, 0x74C6}, //7298 #CJK UNIFIED IDEOGRAPH
+ {0xAD7E, 0x74C7}, //7299 #CJK UNIFIED IDEOGRAPH
+ {0xAD80, 0x74C8}, //7300 #CJK UNIFIED IDEOGRAPH
+ {0xAD81, 0x74C9}, //7301 #CJK UNIFIED IDEOGRAPH
+ {0xAD82, 0x74CA}, //7302 #CJK UNIFIED IDEOGRAPH
+ {0xAD83, 0x74CB}, //7303 #CJK UNIFIED IDEOGRAPH
+ {0xAD84, 0x74CC}, //7304 #CJK UNIFIED IDEOGRAPH
+ {0xAD85, 0x74CD}, //7305 #CJK UNIFIED IDEOGRAPH
+ {0xAD86, 0x74CE}, //7306 #CJK UNIFIED IDEOGRAPH
+ {0xAD87, 0x74CF}, //7307 #CJK UNIFIED IDEOGRAPH
+ {0xAD88, 0x74D0}, //7308 #CJK UNIFIED IDEOGRAPH
+ {0xAD89, 0x74D1}, //7309 #CJK UNIFIED IDEOGRAPH
+ {0xAD8A, 0x74D3}, //7310 #CJK UNIFIED IDEOGRAPH
+ {0xAD8B, 0x74D4}, //7311 #CJK UNIFIED IDEOGRAPH
+ {0xAD8C, 0x74D5}, //7312 #CJK UNIFIED IDEOGRAPH
+ {0xAD8D, 0x74D6}, //7313 #CJK UNIFIED IDEOGRAPH
+ {0xAD8E, 0x74D7}, //7314 #CJK UNIFIED IDEOGRAPH
+ {0xAD8F, 0x74D8}, //7315 #CJK UNIFIED IDEOGRAPH
+ {0xAD90, 0x74D9}, //7316 #CJK UNIFIED IDEOGRAPH
+ {0xAD91, 0x74DA}, //7317 #CJK UNIFIED IDEOGRAPH
+ {0xAD92, 0x74DB}, //7318 #CJK UNIFIED IDEOGRAPH
+ {0xAD93, 0x74DD}, //7319 #CJK UNIFIED IDEOGRAPH
+ {0xAD94, 0x74DF}, //7320 #CJK UNIFIED IDEOGRAPH
+ {0xAD95, 0x74E1}, //7321 #CJK UNIFIED IDEOGRAPH
+ {0xAD96, 0x74E5}, //7322 #CJK UNIFIED IDEOGRAPH
+ {0xAD97, 0x74E7}, //7323 #CJK UNIFIED IDEOGRAPH
+ {0xAD98, 0x74E8}, //7324 #CJK UNIFIED IDEOGRAPH
+ {0xAD99, 0x74E9}, //7325 #CJK UNIFIED IDEOGRAPH
+ {0xAD9A, 0x74EA}, //7326 #CJK UNIFIED IDEOGRAPH
+ {0xAD9B, 0x74EB}, //7327 #CJK UNIFIED IDEOGRAPH
+ {0xAD9C, 0x74EC}, //7328 #CJK UNIFIED IDEOGRAPH
+ {0xAD9D, 0x74ED}, //7329 #CJK UNIFIED IDEOGRAPH
+ {0xAD9E, 0x74F0}, //7330 #CJK UNIFIED IDEOGRAPH
+ {0xAD9F, 0x74F1}, //7331 #CJK UNIFIED IDEOGRAPH
+ {0xADA0, 0x74F2}, //7332 #CJK UNIFIED IDEOGRAPH
+ {0xAE40, 0x74F3}, //7333 #CJK UNIFIED IDEOGRAPH
+ {0xAE41, 0x74F5}, //7334 #CJK UNIFIED IDEOGRAPH
+ {0xAE42, 0x74F8}, //7335 #CJK UNIFIED IDEOGRAPH
+ {0xAE43, 0x74F9}, //7336 #CJK UNIFIED IDEOGRAPH
+ {0xAE44, 0x74FA}, //7337 #CJK UNIFIED IDEOGRAPH
+ {0xAE45, 0x74FB}, //7338 #CJK UNIFIED IDEOGRAPH
+ {0xAE46, 0x74FC}, //7339 #CJK UNIFIED IDEOGRAPH
+ {0xAE47, 0x74FD}, //7340 #CJK UNIFIED IDEOGRAPH
+ {0xAE48, 0x74FE}, //7341 #CJK UNIFIED IDEOGRAPH
+ {0xAE49, 0x7500}, //7342 #CJK UNIFIED IDEOGRAPH
+ {0xAE4A, 0x7501}, //7343 #CJK UNIFIED IDEOGRAPH
+ {0xAE4B, 0x7502}, //7344 #CJK UNIFIED IDEOGRAPH
+ {0xAE4C, 0x7503}, //7345 #CJK UNIFIED IDEOGRAPH
+ {0xAE4D, 0x7505}, //7346 #CJK UNIFIED IDEOGRAPH
+ {0xAE4E, 0x7506}, //7347 #CJK UNIFIED IDEOGRAPH
+ {0xAE4F, 0x7507}, //7348 #CJK UNIFIED IDEOGRAPH
+ {0xAE50, 0x7508}, //7349 #CJK UNIFIED IDEOGRAPH
+ {0xAE51, 0x7509}, //7350 #CJK UNIFIED IDEOGRAPH
+ {0xAE52, 0x750A}, //7351 #CJK UNIFIED IDEOGRAPH
+ {0xAE53, 0x750B}, //7352 #CJK UNIFIED IDEOGRAPH
+ {0xAE54, 0x750C}, //7353 #CJK UNIFIED IDEOGRAPH
+ {0xAE55, 0x750E}, //7354 #CJK UNIFIED IDEOGRAPH
+ {0xAE56, 0x7510}, //7355 #CJK UNIFIED IDEOGRAPH
+ {0xAE57, 0x7512}, //7356 #CJK UNIFIED IDEOGRAPH
+ {0xAE58, 0x7514}, //7357 #CJK UNIFIED IDEOGRAPH
+ {0xAE59, 0x7515}, //7358 #CJK UNIFIED IDEOGRAPH
+ {0xAE5A, 0x7516}, //7359 #CJK UNIFIED IDEOGRAPH
+ {0xAE5B, 0x7517}, //7360 #CJK UNIFIED IDEOGRAPH
+ {0xAE5C, 0x751B}, //7361 #CJK UNIFIED IDEOGRAPH
+ {0xAE5D, 0x751D}, //7362 #CJK UNIFIED IDEOGRAPH
+ {0xAE5E, 0x751E}, //7363 #CJK UNIFIED IDEOGRAPH
+ {0xAE5F, 0x7520}, //7364 #CJK UNIFIED IDEOGRAPH
+ {0xAE60, 0x7521}, //7365 #CJK UNIFIED IDEOGRAPH
+ {0xAE61, 0x7522}, //7366 #CJK UNIFIED IDEOGRAPH
+ {0xAE62, 0x7523}, //7367 #CJK UNIFIED IDEOGRAPH
+ {0xAE63, 0x7524}, //7368 #CJK UNIFIED IDEOGRAPH
+ {0xAE64, 0x7526}, //7369 #CJK UNIFIED IDEOGRAPH
+ {0xAE65, 0x7527}, //7370 #CJK UNIFIED IDEOGRAPH
+ {0xAE66, 0x752A}, //7371 #CJK UNIFIED IDEOGRAPH
+ {0xAE67, 0x752E}, //7372 #CJK UNIFIED IDEOGRAPH
+ {0xAE68, 0x7534}, //7373 #CJK UNIFIED IDEOGRAPH
+ {0xAE69, 0x7536}, //7374 #CJK UNIFIED IDEOGRAPH
+ {0xAE6A, 0x7539}, //7375 #CJK UNIFIED IDEOGRAPH
+ {0xAE6B, 0x753C}, //7376 #CJK UNIFIED IDEOGRAPH
+ {0xAE6C, 0x753D}, //7377 #CJK UNIFIED IDEOGRAPH
+ {0xAE6D, 0x753F}, //7378 #CJK UNIFIED IDEOGRAPH
+ {0xAE6E, 0x7541}, //7379 #CJK UNIFIED IDEOGRAPH
+ {0xAE6F, 0x7542}, //7380 #CJK UNIFIED IDEOGRAPH
+ {0xAE70, 0x7543}, //7381 #CJK UNIFIED IDEOGRAPH
+ {0xAE71, 0x7544}, //7382 #CJK UNIFIED IDEOGRAPH
+ {0xAE72, 0x7546}, //7383 #CJK UNIFIED IDEOGRAPH
+ {0xAE73, 0x7547}, //7384 #CJK UNIFIED IDEOGRAPH
+ {0xAE74, 0x7549}, //7385 #CJK UNIFIED IDEOGRAPH
+ {0xAE75, 0x754A}, //7386 #CJK UNIFIED IDEOGRAPH
+ {0xAE76, 0x754D}, //7387 #CJK UNIFIED IDEOGRAPH
+ {0xAE77, 0x7550}, //7388 #CJK UNIFIED IDEOGRAPH
+ {0xAE78, 0x7551}, //7389 #CJK UNIFIED IDEOGRAPH
+ {0xAE79, 0x7552}, //7390 #CJK UNIFIED IDEOGRAPH
+ {0xAE7A, 0x7553}, //7391 #CJK UNIFIED IDEOGRAPH
+ {0xAE7B, 0x7555}, //7392 #CJK UNIFIED IDEOGRAPH
+ {0xAE7C, 0x7556}, //7393 #CJK UNIFIED IDEOGRAPH
+ {0xAE7D, 0x7557}, //7394 #CJK UNIFIED IDEOGRAPH
+ {0xAE7E, 0x7558}, //7395 #CJK UNIFIED IDEOGRAPH
+ {0xAE80, 0x755D}, //7396 #CJK UNIFIED IDEOGRAPH
+ {0xAE81, 0x755E}, //7397 #CJK UNIFIED IDEOGRAPH
+ {0xAE82, 0x755F}, //7398 #CJK UNIFIED IDEOGRAPH
+ {0xAE83, 0x7560}, //7399 #CJK UNIFIED IDEOGRAPH
+ {0xAE84, 0x7561}, //7400 #CJK UNIFIED IDEOGRAPH
+ {0xAE85, 0x7562}, //7401 #CJK UNIFIED IDEOGRAPH
+ {0xAE86, 0x7563}, //7402 #CJK UNIFIED IDEOGRAPH
+ {0xAE87, 0x7564}, //7403 #CJK UNIFIED IDEOGRAPH
+ {0xAE88, 0x7567}, //7404 #CJK UNIFIED IDEOGRAPH
+ {0xAE89, 0x7568}, //7405 #CJK UNIFIED IDEOGRAPH
+ {0xAE8A, 0x7569}, //7406 #CJK UNIFIED IDEOGRAPH
+ {0xAE8B, 0x756B}, //7407 #CJK UNIFIED IDEOGRAPH
+ {0xAE8C, 0x756C}, //7408 #CJK UNIFIED IDEOGRAPH
+ {0xAE8D, 0x756D}, //7409 #CJK UNIFIED IDEOGRAPH
+ {0xAE8E, 0x756E}, //7410 #CJK UNIFIED IDEOGRAPH
+ {0xAE8F, 0x756F}, //7411 #CJK UNIFIED IDEOGRAPH
+ {0xAE90, 0x7570}, //7412 #CJK UNIFIED IDEOGRAPH
+ {0xAE91, 0x7571}, //7413 #CJK UNIFIED IDEOGRAPH
+ {0xAE92, 0x7573}, //7414 #CJK UNIFIED IDEOGRAPH
+ {0xAE93, 0x7575}, //7415 #CJK UNIFIED IDEOGRAPH
+ {0xAE94, 0x7576}, //7416 #CJK UNIFIED IDEOGRAPH
+ {0xAE95, 0x7577}, //7417 #CJK UNIFIED IDEOGRAPH
+ {0xAE96, 0x757A}, //7418 #CJK UNIFIED IDEOGRAPH
+ {0xAE97, 0x757B}, //7419 #CJK UNIFIED IDEOGRAPH
+ {0xAE98, 0x757C}, //7420 #CJK UNIFIED IDEOGRAPH
+ {0xAE99, 0x757D}, //7421 #CJK UNIFIED IDEOGRAPH
+ {0xAE9A, 0x757E}, //7422 #CJK UNIFIED IDEOGRAPH
+ {0xAE9B, 0x7580}, //7423 #CJK UNIFIED IDEOGRAPH
+ {0xAE9C, 0x7581}, //7424 #CJK UNIFIED IDEOGRAPH
+ {0xAE9D, 0x7582}, //7425 #CJK UNIFIED IDEOGRAPH
+ {0xAE9E, 0x7584}, //7426 #CJK UNIFIED IDEOGRAPH
+ {0xAE9F, 0x7585}, //7427 #CJK UNIFIED IDEOGRAPH
+ {0xAEA0, 0x7587}, //7428 #CJK UNIFIED IDEOGRAPH
+ {0xAF40, 0x7588}, //7429 #CJK UNIFIED IDEOGRAPH
+ {0xAF41, 0x7589}, //7430 #CJK UNIFIED IDEOGRAPH
+ {0xAF42, 0x758A}, //7431 #CJK UNIFIED IDEOGRAPH
+ {0xAF43, 0x758C}, //7432 #CJK UNIFIED IDEOGRAPH
+ {0xAF44, 0x758D}, //7433 #CJK UNIFIED IDEOGRAPH
+ {0xAF45, 0x758E}, //7434 #CJK UNIFIED IDEOGRAPH
+ {0xAF46, 0x7590}, //7435 #CJK UNIFIED IDEOGRAPH
+ {0xAF47, 0x7593}, //7436 #CJK UNIFIED IDEOGRAPH
+ {0xAF48, 0x7595}, //7437 #CJK UNIFIED IDEOGRAPH
+ {0xAF49, 0x7598}, //7438 #CJK UNIFIED IDEOGRAPH
+ {0xAF4A, 0x759B}, //7439 #CJK UNIFIED IDEOGRAPH
+ {0xAF4B, 0x759C}, //7440 #CJK UNIFIED IDEOGRAPH
+ {0xAF4C, 0x759E}, //7441 #CJK UNIFIED IDEOGRAPH
+ {0xAF4D, 0x75A2}, //7442 #CJK UNIFIED IDEOGRAPH
+ {0xAF4E, 0x75A6}, //7443 #CJK UNIFIED IDEOGRAPH
+ {0xAF4F, 0x75A7}, //7444 #CJK UNIFIED IDEOGRAPH
+ {0xAF50, 0x75A8}, //7445 #CJK UNIFIED IDEOGRAPH
+ {0xAF51, 0x75A9}, //7446 #CJK UNIFIED IDEOGRAPH
+ {0xAF52, 0x75AA}, //7447 #CJK UNIFIED IDEOGRAPH
+ {0xAF53, 0x75AD}, //7448 #CJK UNIFIED IDEOGRAPH
+ {0xAF54, 0x75B6}, //7449 #CJK UNIFIED IDEOGRAPH
+ {0xAF55, 0x75B7}, //7450 #CJK UNIFIED IDEOGRAPH
+ {0xAF56, 0x75BA}, //7451 #CJK UNIFIED IDEOGRAPH
+ {0xAF57, 0x75BB}, //7452 #CJK UNIFIED IDEOGRAPH
+ {0xAF58, 0x75BF}, //7453 #CJK UNIFIED IDEOGRAPH
+ {0xAF59, 0x75C0}, //7454 #CJK UNIFIED IDEOGRAPH
+ {0xAF5A, 0x75C1}, //7455 #CJK UNIFIED IDEOGRAPH
+ {0xAF5B, 0x75C6}, //7456 #CJK UNIFIED IDEOGRAPH
+ {0xAF5C, 0x75CB}, //7457 #CJK UNIFIED IDEOGRAPH
+ {0xAF5D, 0x75CC}, //7458 #CJK UNIFIED IDEOGRAPH
+ {0xAF5E, 0x75CE}, //7459 #CJK UNIFIED IDEOGRAPH
+ {0xAF5F, 0x75CF}, //7460 #CJK UNIFIED IDEOGRAPH
+ {0xAF60, 0x75D0}, //7461 #CJK UNIFIED IDEOGRAPH
+ {0xAF61, 0x75D1}, //7462 #CJK UNIFIED IDEOGRAPH
+ {0xAF62, 0x75D3}, //7463 #CJK UNIFIED IDEOGRAPH
+ {0xAF63, 0x75D7}, //7464 #CJK UNIFIED IDEOGRAPH
+ {0xAF64, 0x75D9}, //7465 #CJK UNIFIED IDEOGRAPH
+ {0xAF65, 0x75DA}, //7466 #CJK UNIFIED IDEOGRAPH
+ {0xAF66, 0x75DC}, //7467 #CJK UNIFIED IDEOGRAPH
+ {0xAF67, 0x75DD}, //7468 #CJK UNIFIED IDEOGRAPH
+ {0xAF68, 0x75DF}, //7469 #CJK UNIFIED IDEOGRAPH
+ {0xAF69, 0x75E0}, //7470 #CJK UNIFIED IDEOGRAPH
+ {0xAF6A, 0x75E1}, //7471 #CJK UNIFIED IDEOGRAPH
+ {0xAF6B, 0x75E5}, //7472 #CJK UNIFIED IDEOGRAPH
+ {0xAF6C, 0x75E9}, //7473 #CJK UNIFIED IDEOGRAPH
+ {0xAF6D, 0x75EC}, //7474 #CJK UNIFIED IDEOGRAPH
+ {0xAF6E, 0x75ED}, //7475 #CJK UNIFIED IDEOGRAPH
+ {0xAF6F, 0x75EE}, //7476 #CJK UNIFIED IDEOGRAPH
+ {0xAF70, 0x75EF}, //7477 #CJK UNIFIED IDEOGRAPH
+ {0xAF71, 0x75F2}, //7478 #CJK UNIFIED IDEOGRAPH
+ {0xAF72, 0x75F3}, //7479 #CJK UNIFIED IDEOGRAPH
+ {0xAF73, 0x75F5}, //7480 #CJK UNIFIED IDEOGRAPH
+ {0xAF74, 0x75F6}, //7481 #CJK UNIFIED IDEOGRAPH
+ {0xAF75, 0x75F7}, //7482 #CJK UNIFIED IDEOGRAPH
+ {0xAF76, 0x75F8}, //7483 #CJK UNIFIED IDEOGRAPH
+ {0xAF77, 0x75FA}, //7484 #CJK UNIFIED IDEOGRAPH
+ {0xAF78, 0x75FB}, //7485 #CJK UNIFIED IDEOGRAPH
+ {0xAF79, 0x75FD}, //7486 #CJK UNIFIED IDEOGRAPH
+ {0xAF7A, 0x75FE}, //7487 #CJK UNIFIED IDEOGRAPH
+ {0xAF7B, 0x7602}, //7488 #CJK UNIFIED IDEOGRAPH
+ {0xAF7C, 0x7604}, //7489 #CJK UNIFIED IDEOGRAPH
+ {0xAF7D, 0x7606}, //7490 #CJK UNIFIED IDEOGRAPH
+ {0xAF7E, 0x7607}, //7491 #CJK UNIFIED IDEOGRAPH
+ {0xAF80, 0x7608}, //7492 #CJK UNIFIED IDEOGRAPH
+ {0xAF81, 0x7609}, //7493 #CJK UNIFIED IDEOGRAPH
+ {0xAF82, 0x760B}, //7494 #CJK UNIFIED IDEOGRAPH
+ {0xAF83, 0x760D}, //7495 #CJK UNIFIED IDEOGRAPH
+ {0xAF84, 0x760E}, //7496 #CJK UNIFIED IDEOGRAPH
+ {0xAF85, 0x760F}, //7497 #CJK UNIFIED IDEOGRAPH
+ {0xAF86, 0x7611}, //7498 #CJK UNIFIED IDEOGRAPH
+ {0xAF87, 0x7612}, //7499 #CJK UNIFIED IDEOGRAPH
+ {0xAF88, 0x7613}, //7500 #CJK UNIFIED IDEOGRAPH
+ {0xAF89, 0x7614}, //7501 #CJK UNIFIED IDEOGRAPH
+ {0xAF8A, 0x7616}, //7502 #CJK UNIFIED IDEOGRAPH
+ {0xAF8B, 0x761A}, //7503 #CJK UNIFIED IDEOGRAPH
+ {0xAF8C, 0x761C}, //7504 #CJK UNIFIED IDEOGRAPH
+ {0xAF8D, 0x761D}, //7505 #CJK UNIFIED IDEOGRAPH
+ {0xAF8E, 0x761E}, //7506 #CJK UNIFIED IDEOGRAPH
+ {0xAF8F, 0x7621}, //7507 #CJK UNIFIED IDEOGRAPH
+ {0xAF90, 0x7623}, //7508 #CJK UNIFIED IDEOGRAPH
+ {0xAF91, 0x7627}, //7509 #CJK UNIFIED IDEOGRAPH
+ {0xAF92, 0x7628}, //7510 #CJK UNIFIED IDEOGRAPH
+ {0xAF93, 0x762C}, //7511 #CJK UNIFIED IDEOGRAPH
+ {0xAF94, 0x762E}, //7512 #CJK UNIFIED IDEOGRAPH
+ {0xAF95, 0x762F}, //7513 #CJK UNIFIED IDEOGRAPH
+ {0xAF96, 0x7631}, //7514 #CJK UNIFIED IDEOGRAPH
+ {0xAF97, 0x7632}, //7515 #CJK UNIFIED IDEOGRAPH
+ {0xAF98, 0x7636}, //7516 #CJK UNIFIED IDEOGRAPH
+ {0xAF99, 0x7637}, //7517 #CJK UNIFIED IDEOGRAPH
+ {0xAF9A, 0x7639}, //7518 #CJK UNIFIED IDEOGRAPH
+ {0xAF9B, 0x763A}, //7519 #CJK UNIFIED IDEOGRAPH
+ {0xAF9C, 0x763B}, //7520 #CJK UNIFIED IDEOGRAPH
+ {0xAF9D, 0x763D}, //7521 #CJK UNIFIED IDEOGRAPH
+ {0xAF9E, 0x7641}, //7522 #CJK UNIFIED IDEOGRAPH
+ {0xAF9F, 0x7642}, //7523 #CJK UNIFIED IDEOGRAPH
+ {0xAFA0, 0x7644}, //7524 #CJK UNIFIED IDEOGRAPH
+ {0xB040, 0x7645}, //7525 #CJK UNIFIED IDEOGRAPH
+ {0xB041, 0x7646}, //7526 #CJK UNIFIED IDEOGRAPH
+ {0xB042, 0x7647}, //7527 #CJK UNIFIED IDEOGRAPH
+ {0xB043, 0x7648}, //7528 #CJK UNIFIED IDEOGRAPH
+ {0xB044, 0x7649}, //7529 #CJK UNIFIED IDEOGRAPH
+ {0xB045, 0x764A}, //7530 #CJK UNIFIED IDEOGRAPH
+ {0xB046, 0x764B}, //7531 #CJK UNIFIED IDEOGRAPH
+ {0xB047, 0x764E}, //7532 #CJK UNIFIED IDEOGRAPH
+ {0xB048, 0x764F}, //7533 #CJK UNIFIED IDEOGRAPH
+ {0xB049, 0x7650}, //7534 #CJK UNIFIED IDEOGRAPH
+ {0xB04A, 0x7651}, //7535 #CJK UNIFIED IDEOGRAPH
+ {0xB04B, 0x7652}, //7536 #CJK UNIFIED IDEOGRAPH
+ {0xB04C, 0x7653}, //7537 #CJK UNIFIED IDEOGRAPH
+ {0xB04D, 0x7655}, //7538 #CJK UNIFIED IDEOGRAPH
+ {0xB04E, 0x7657}, //7539 #CJK UNIFIED IDEOGRAPH
+ {0xB04F, 0x7658}, //7540 #CJK UNIFIED IDEOGRAPH
+ {0xB050, 0x7659}, //7541 #CJK UNIFIED IDEOGRAPH
+ {0xB051, 0x765A}, //7542 #CJK UNIFIED IDEOGRAPH
+ {0xB052, 0x765B}, //7543 #CJK UNIFIED IDEOGRAPH
+ {0xB053, 0x765D}, //7544 #CJK UNIFIED IDEOGRAPH
+ {0xB054, 0x765F}, //7545 #CJK UNIFIED IDEOGRAPH
+ {0xB055, 0x7660}, //7546 #CJK UNIFIED IDEOGRAPH
+ {0xB056, 0x7661}, //7547 #CJK UNIFIED IDEOGRAPH
+ {0xB057, 0x7662}, //7548 #CJK UNIFIED IDEOGRAPH
+ {0xB058, 0x7664}, //7549 #CJK UNIFIED IDEOGRAPH
+ {0xB059, 0x7665}, //7550 #CJK UNIFIED IDEOGRAPH
+ {0xB05A, 0x7666}, //7551 #CJK UNIFIED IDEOGRAPH
+ {0xB05B, 0x7667}, //7552 #CJK UNIFIED IDEOGRAPH
+ {0xB05C, 0x7668}, //7553 #CJK UNIFIED IDEOGRAPH
+ {0xB05D, 0x7669}, //7554 #CJK UNIFIED IDEOGRAPH
+ {0xB05E, 0x766A}, //7555 #CJK UNIFIED IDEOGRAPH
+ {0xB05F, 0x766C}, //7556 #CJK UNIFIED IDEOGRAPH
+ {0xB060, 0x766D}, //7557 #CJK UNIFIED IDEOGRAPH
+ {0xB061, 0x766E}, //7558 #CJK UNIFIED IDEOGRAPH
+ {0xB062, 0x7670}, //7559 #CJK UNIFIED IDEOGRAPH
+ {0xB063, 0x7671}, //7560 #CJK UNIFIED IDEOGRAPH
+ {0xB064, 0x7672}, //7561 #CJK UNIFIED IDEOGRAPH
+ {0xB065, 0x7673}, //7562 #CJK UNIFIED IDEOGRAPH
+ {0xB066, 0x7674}, //7563 #CJK UNIFIED IDEOGRAPH
+ {0xB067, 0x7675}, //7564 #CJK UNIFIED IDEOGRAPH
+ {0xB068, 0x7676}, //7565 #CJK UNIFIED IDEOGRAPH
+ {0xB069, 0x7677}, //7566 #CJK UNIFIED IDEOGRAPH
+ {0xB06A, 0x7679}, //7567 #CJK UNIFIED IDEOGRAPH
+ {0xB06B, 0x767A}, //7568 #CJK UNIFIED IDEOGRAPH
+ {0xB06C, 0x767C}, //7569 #CJK UNIFIED IDEOGRAPH
+ {0xB06D, 0x767F}, //7570 #CJK UNIFIED IDEOGRAPH
+ {0xB06E, 0x7680}, //7571 #CJK UNIFIED IDEOGRAPH
+ {0xB06F, 0x7681}, //7572 #CJK UNIFIED IDEOGRAPH
+ {0xB070, 0x7683}, //7573 #CJK UNIFIED IDEOGRAPH
+ {0xB071, 0x7685}, //7574 #CJK UNIFIED IDEOGRAPH
+ {0xB072, 0x7689}, //7575 #CJK UNIFIED IDEOGRAPH
+ {0xB073, 0x768A}, //7576 #CJK UNIFIED IDEOGRAPH
+ {0xB074, 0x768C}, //7577 #CJK UNIFIED IDEOGRAPH
+ {0xB075, 0x768D}, //7578 #CJK UNIFIED IDEOGRAPH
+ {0xB076, 0x768F}, //7579 #CJK UNIFIED IDEOGRAPH
+ {0xB077, 0x7690}, //7580 #CJK UNIFIED IDEOGRAPH
+ {0xB078, 0x7692}, //7581 #CJK UNIFIED IDEOGRAPH
+ {0xB079, 0x7694}, //7582 #CJK UNIFIED IDEOGRAPH
+ {0xB07A, 0x7695}, //7583 #CJK UNIFIED IDEOGRAPH
+ {0xB07B, 0x7697}, //7584 #CJK UNIFIED IDEOGRAPH
+ {0xB07C, 0x7698}, //7585 #CJK UNIFIED IDEOGRAPH
+ {0xB07D, 0x769A}, //7586 #CJK UNIFIED IDEOGRAPH
+ {0xB07E, 0x769B}, //7587 #CJK UNIFIED IDEOGRAPH
+ {0xB080, 0x769C}, //7588 #CJK UNIFIED IDEOGRAPH
+ {0xB081, 0x769D}, //7589 #CJK UNIFIED IDEOGRAPH
+ {0xB082, 0x769E}, //7590 #CJK UNIFIED IDEOGRAPH
+ {0xB083, 0x769F}, //7591 #CJK UNIFIED IDEOGRAPH
+ {0xB084, 0x76A0}, //7592 #CJK UNIFIED IDEOGRAPH
+ {0xB085, 0x76A1}, //7593 #CJK UNIFIED IDEOGRAPH
+ {0xB086, 0x76A2}, //7594 #CJK UNIFIED IDEOGRAPH
+ {0xB087, 0x76A3}, //7595 #CJK UNIFIED IDEOGRAPH
+ {0xB088, 0x76A5}, //7596 #CJK UNIFIED IDEOGRAPH
+ {0xB089, 0x76A6}, //7597 #CJK UNIFIED IDEOGRAPH
+ {0xB08A, 0x76A7}, //7598 #CJK UNIFIED IDEOGRAPH
+ {0xB08B, 0x76A8}, //7599 #CJK UNIFIED IDEOGRAPH
+ {0xB08C, 0x76A9}, //7600 #CJK UNIFIED IDEOGRAPH
+ {0xB08D, 0x76AA}, //7601 #CJK UNIFIED IDEOGRAPH
+ {0xB08E, 0x76AB}, //7602 #CJK UNIFIED IDEOGRAPH
+ {0xB08F, 0x76AC}, //7603 #CJK UNIFIED IDEOGRAPH
+ {0xB090, 0x76AD}, //7604 #CJK UNIFIED IDEOGRAPH
+ {0xB091, 0x76AF}, //7605 #CJK UNIFIED IDEOGRAPH
+ {0xB092, 0x76B0}, //7606 #CJK UNIFIED IDEOGRAPH
+ {0xB093, 0x76B3}, //7607 #CJK UNIFIED IDEOGRAPH
+ {0xB094, 0x76B5}, //7608 #CJK UNIFIED IDEOGRAPH
+ {0xB095, 0x76B6}, //7609 #CJK UNIFIED IDEOGRAPH
+ {0xB096, 0x76B7}, //7610 #CJK UNIFIED IDEOGRAPH
+ {0xB097, 0x76B8}, //7611 #CJK UNIFIED IDEOGRAPH
+ {0xB098, 0x76B9}, //7612 #CJK UNIFIED IDEOGRAPH
+ {0xB099, 0x76BA}, //7613 #CJK UNIFIED IDEOGRAPH
+ {0xB09A, 0x76BB}, //7614 #CJK UNIFIED IDEOGRAPH
+ {0xB09B, 0x76BC}, //7615 #CJK UNIFIED IDEOGRAPH
+ {0xB09C, 0x76BD}, //7616 #CJK UNIFIED IDEOGRAPH
+ {0xB09D, 0x76BE}, //7617 #CJK UNIFIED IDEOGRAPH
+ {0xB09E, 0x76C0}, //7618 #CJK UNIFIED IDEOGRAPH
+ {0xB09F, 0x76C1}, //7619 #CJK UNIFIED IDEOGRAPH
+ {0xB0A0, 0x76C3}, //7620 #CJK UNIFIED IDEOGRAPH
+ {0xB0A1, 0x554A}, //7621 #CJK UNIFIED IDEOGRAPH
+ {0xB0A2, 0x963F}, //7622 #CJK UNIFIED IDEOGRAPH
+ {0xB0A3, 0x57C3}, //7623 #CJK UNIFIED IDEOGRAPH
+ {0xB0A4, 0x6328}, //7624 #CJK UNIFIED IDEOGRAPH
+ {0xB0A5, 0x54CE}, //7625 #CJK UNIFIED IDEOGRAPH
+ {0xB0A6, 0x5509}, //7626 #CJK UNIFIED IDEOGRAPH
+ {0xB0A7, 0x54C0}, //7627 #CJK UNIFIED IDEOGRAPH
+ {0xB0A8, 0x7691}, //7628 #CJK UNIFIED IDEOGRAPH
+ {0xB0A9, 0x764C}, //7629 #CJK UNIFIED IDEOGRAPH
+ {0xB0AA, 0x853C}, //7630 #CJK UNIFIED IDEOGRAPH
+ {0xB0AB, 0x77EE}, //7631 #CJK UNIFIED IDEOGRAPH
+ {0xB0AC, 0x827E}, //7632 #CJK UNIFIED IDEOGRAPH
+ {0xB0AD, 0x788D}, //7633 #CJK UNIFIED IDEOGRAPH
+ {0xB0AE, 0x7231}, //7634 #CJK UNIFIED IDEOGRAPH
+ {0xB0AF, 0x9698}, //7635 #CJK UNIFIED IDEOGRAPH
+ {0xB0B0, 0x978D}, //7636 #CJK UNIFIED IDEOGRAPH
+ {0xB0B1, 0x6C28}, //7637 #CJK UNIFIED IDEOGRAPH
+ {0xB0B2, 0x5B89}, //7638 #CJK UNIFIED IDEOGRAPH
+ {0xB0B3, 0x4FFA}, //7639 #CJK UNIFIED IDEOGRAPH
+ {0xB0B4, 0x6309}, //7640 #CJK UNIFIED IDEOGRAPH
+ {0xB0B5, 0x6697}, //7641 #CJK UNIFIED IDEOGRAPH
+ {0xB0B6, 0x5CB8}, //7642 #CJK UNIFIED IDEOGRAPH
+ {0xB0B7, 0x80FA}, //7643 #CJK UNIFIED IDEOGRAPH
+ {0xB0B8, 0x6848}, //7644 #CJK UNIFIED IDEOGRAPH
+ {0xB0B9, 0x80AE}, //7645 #CJK UNIFIED IDEOGRAPH
+ {0xB0BA, 0x6602}, //7646 #CJK UNIFIED IDEOGRAPH
+ {0xB0BB, 0x76CE}, //7647 #CJK UNIFIED IDEOGRAPH
+ {0xB0BC, 0x51F9}, //7648 #CJK UNIFIED IDEOGRAPH
+ {0xB0BD, 0x6556}, //7649 #CJK UNIFIED IDEOGRAPH
+ {0xB0BE, 0x71AC}, //7650 #CJK UNIFIED IDEOGRAPH
+ {0xB0BF, 0x7FF1}, //7651 #CJK UNIFIED IDEOGRAPH
+ {0xB0C0, 0x8884}, //7652 #CJK UNIFIED IDEOGRAPH
+ {0xB0C1, 0x50B2}, //7653 #CJK UNIFIED IDEOGRAPH
+ {0xB0C2, 0x5965}, //7654 #CJK UNIFIED IDEOGRAPH
+ {0xB0C3, 0x61CA}, //7655 #CJK UNIFIED IDEOGRAPH
+ {0xB0C4, 0x6FB3}, //7656 #CJK UNIFIED IDEOGRAPH
+ {0xB0C5, 0x82AD}, //7657 #CJK UNIFIED IDEOGRAPH
+ {0xB0C6, 0x634C}, //7658 #CJK UNIFIED IDEOGRAPH
+ {0xB0C7, 0x6252}, //7659 #CJK UNIFIED IDEOGRAPH
+ {0xB0C8, 0x53ED}, //7660 #CJK UNIFIED IDEOGRAPH
+ {0xB0C9, 0x5427}, //7661 #CJK UNIFIED IDEOGRAPH
+ {0xB0CA, 0x7B06}, //7662 #CJK UNIFIED IDEOGRAPH
+ {0xB0CB, 0x516B}, //7663 #CJK UNIFIED IDEOGRAPH
+ {0xB0CC, 0x75A4}, //7664 #CJK UNIFIED IDEOGRAPH
+ {0xB0CD, 0x5DF4}, //7665 #CJK UNIFIED IDEOGRAPH
+ {0xB0CE, 0x62D4}, //7666 #CJK UNIFIED IDEOGRAPH
+ {0xB0CF, 0x8DCB}, //7667 #CJK UNIFIED IDEOGRAPH
+ {0xB0D0, 0x9776}, //7668 #CJK UNIFIED IDEOGRAPH
+ {0xB0D1, 0x628A}, //7669 #CJK UNIFIED IDEOGRAPH
+ {0xB0D2, 0x8019}, //7670 #CJK UNIFIED IDEOGRAPH
+ {0xB0D3, 0x575D}, //7671 #CJK UNIFIED IDEOGRAPH
+ {0xB0D4, 0x9738}, //7672 #CJK UNIFIED IDEOGRAPH
+ {0xB0D5, 0x7F62}, //7673 #CJK UNIFIED IDEOGRAPH
+ {0xB0D6, 0x7238}, //7674 #CJK UNIFIED IDEOGRAPH
+ {0xB0D7, 0x767D}, //7675 #CJK UNIFIED IDEOGRAPH
+ {0xB0D8, 0x67CF}, //7676 #CJK UNIFIED IDEOGRAPH
+ {0xB0D9, 0x767E}, //7677 #CJK UNIFIED IDEOGRAPH
+ {0xB0DA, 0x6446}, //7678 #CJK UNIFIED IDEOGRAPH
+ {0xB0DB, 0x4F70}, //7679 #CJK UNIFIED IDEOGRAPH
+ {0xB0DC, 0x8D25}, //7680 #CJK UNIFIED IDEOGRAPH
+ {0xB0DD, 0x62DC}, //7681 #CJK UNIFIED IDEOGRAPH
+ {0xB0DE, 0x7A17}, //7682 #CJK UNIFIED IDEOGRAPH
+ {0xB0DF, 0x6591}, //7683 #CJK UNIFIED IDEOGRAPH
+ {0xB0E0, 0x73ED}, //7684 #CJK UNIFIED IDEOGRAPH
+ {0xB0E1, 0x642C}, //7685 #CJK UNIFIED IDEOGRAPH
+ {0xB0E2, 0x6273}, //7686 #CJK UNIFIED IDEOGRAPH
+ {0xB0E3, 0x822C}, //7687 #CJK UNIFIED IDEOGRAPH
+ {0xB0E4, 0x9881}, //7688 #CJK UNIFIED IDEOGRAPH
+ {0xB0E5, 0x677F}, //7689 #CJK UNIFIED IDEOGRAPH
+ {0xB0E6, 0x7248}, //7690 #CJK UNIFIED IDEOGRAPH
+ {0xB0E7, 0x626E}, //7691 #CJK UNIFIED IDEOGRAPH
+ {0xB0E8, 0x62CC}, //7692 #CJK UNIFIED IDEOGRAPH
+ {0xB0E9, 0x4F34}, //7693 #CJK UNIFIED IDEOGRAPH
+ {0xB0EA, 0x74E3}, //7694 #CJK UNIFIED IDEOGRAPH
+ {0xB0EB, 0x534A}, //7695 #CJK UNIFIED IDEOGRAPH
+ {0xB0EC, 0x529E}, //7696 #CJK UNIFIED IDEOGRAPH
+ {0xB0ED, 0x7ECA}, //7697 #CJK UNIFIED IDEOGRAPH
+ {0xB0EE, 0x90A6}, //7698 #CJK UNIFIED IDEOGRAPH
+ {0xB0EF, 0x5E2E}, //7699 #CJK UNIFIED IDEOGRAPH
+ {0xB0F0, 0x6886}, //7700 #CJK UNIFIED IDEOGRAPH
+ {0xB0F1, 0x699C}, //7701 #CJK UNIFIED IDEOGRAPH
+ {0xB0F2, 0x8180}, //7702 #CJK UNIFIED IDEOGRAPH
+ {0xB0F3, 0x7ED1}, //7703 #CJK UNIFIED IDEOGRAPH
+ {0xB0F4, 0x68D2}, //7704 #CJK UNIFIED IDEOGRAPH
+ {0xB0F5, 0x78C5}, //7705 #CJK UNIFIED IDEOGRAPH
+ {0xB0F6, 0x868C}, //7706 #CJK UNIFIED IDEOGRAPH
+ {0xB0F7, 0x9551}, //7707 #CJK UNIFIED IDEOGRAPH
+ {0xB0F8, 0x508D}, //7708 #CJK UNIFIED IDEOGRAPH
+ {0xB0F9, 0x8C24}, //7709 #CJK UNIFIED IDEOGRAPH
+ {0xB0FA, 0x82DE}, //7710 #CJK UNIFIED IDEOGRAPH
+ {0xB0FB, 0x80DE}, //7711 #CJK UNIFIED IDEOGRAPH
+ {0xB0FC, 0x5305}, //7712 #CJK UNIFIED IDEOGRAPH
+ {0xB0FD, 0x8912}, //7713 #CJK UNIFIED IDEOGRAPH
+ {0xB0FE, 0x5265}, //7714 #CJK UNIFIED IDEOGRAPH
+ {0xB140, 0x76C4}, //7715 #CJK UNIFIED IDEOGRAPH
+ {0xB141, 0x76C7}, //7716 #CJK UNIFIED IDEOGRAPH
+ {0xB142, 0x76C9}, //7717 #CJK UNIFIED IDEOGRAPH
+ {0xB143, 0x76CB}, //7718 #CJK UNIFIED IDEOGRAPH
+ {0xB144, 0x76CC}, //7719 #CJK UNIFIED IDEOGRAPH
+ {0xB145, 0x76D3}, //7720 #CJK UNIFIED IDEOGRAPH
+ {0xB146, 0x76D5}, //7721 #CJK UNIFIED IDEOGRAPH
+ {0xB147, 0x76D9}, //7722 #CJK UNIFIED IDEOGRAPH
+ {0xB148, 0x76DA}, //7723 #CJK UNIFIED IDEOGRAPH
+ {0xB149, 0x76DC}, //7724 #CJK UNIFIED IDEOGRAPH
+ {0xB14A, 0x76DD}, //7725 #CJK UNIFIED IDEOGRAPH
+ {0xB14B, 0x76DE}, //7726 #CJK UNIFIED IDEOGRAPH
+ {0xB14C, 0x76E0}, //7727 #CJK UNIFIED IDEOGRAPH
+ {0xB14D, 0x76E1}, //7728 #CJK UNIFIED IDEOGRAPH
+ {0xB14E, 0x76E2}, //7729 #CJK UNIFIED IDEOGRAPH
+ {0xB14F, 0x76E3}, //7730 #CJK UNIFIED IDEOGRAPH
+ {0xB150, 0x76E4}, //7731 #CJK UNIFIED IDEOGRAPH
+ {0xB151, 0x76E6}, //7732 #CJK UNIFIED IDEOGRAPH
+ {0xB152, 0x76E7}, //7733 #CJK UNIFIED IDEOGRAPH
+ {0xB153, 0x76E8}, //7734 #CJK UNIFIED IDEOGRAPH
+ {0xB154, 0x76E9}, //7735 #CJK UNIFIED IDEOGRAPH
+ {0xB155, 0x76EA}, //7736 #CJK UNIFIED IDEOGRAPH
+ {0xB156, 0x76EB}, //7737 #CJK UNIFIED IDEOGRAPH
+ {0xB157, 0x76EC}, //7738 #CJK UNIFIED IDEOGRAPH
+ {0xB158, 0x76ED}, //7739 #CJK UNIFIED IDEOGRAPH
+ {0xB159, 0x76F0}, //7740 #CJK UNIFIED IDEOGRAPH
+ {0xB15A, 0x76F3}, //7741 #CJK UNIFIED IDEOGRAPH
+ {0xB15B, 0x76F5}, //7742 #CJK UNIFIED IDEOGRAPH
+ {0xB15C, 0x76F6}, //7743 #CJK UNIFIED IDEOGRAPH
+ {0xB15D, 0x76F7}, //7744 #CJK UNIFIED IDEOGRAPH
+ {0xB15E, 0x76FA}, //7745 #CJK UNIFIED IDEOGRAPH
+ {0xB15F, 0x76FB}, //7746 #CJK UNIFIED IDEOGRAPH
+ {0xB160, 0x76FD}, //7747 #CJK UNIFIED IDEOGRAPH
+ {0xB161, 0x76FF}, //7748 #CJK UNIFIED IDEOGRAPH
+ {0xB162, 0x7700}, //7749 #CJK UNIFIED IDEOGRAPH
+ {0xB163, 0x7702}, //7750 #CJK UNIFIED IDEOGRAPH
+ {0xB164, 0x7703}, //7751 #CJK UNIFIED IDEOGRAPH
+ {0xB165, 0x7705}, //7752 #CJK UNIFIED IDEOGRAPH
+ {0xB166, 0x7706}, //7753 #CJK UNIFIED IDEOGRAPH
+ {0xB167, 0x770A}, //7754 #CJK UNIFIED IDEOGRAPH
+ {0xB168, 0x770C}, //7755 #CJK UNIFIED IDEOGRAPH
+ {0xB169, 0x770E}, //7756 #CJK UNIFIED IDEOGRAPH
+ {0xB16A, 0x770F}, //7757 #CJK UNIFIED IDEOGRAPH
+ {0xB16B, 0x7710}, //7758 #CJK UNIFIED IDEOGRAPH
+ {0xB16C, 0x7711}, //7759 #CJK UNIFIED IDEOGRAPH
+ {0xB16D, 0x7712}, //7760 #CJK UNIFIED IDEOGRAPH
+ {0xB16E, 0x7713}, //7761 #CJK UNIFIED IDEOGRAPH
+ {0xB16F, 0x7714}, //7762 #CJK UNIFIED IDEOGRAPH
+ {0xB170, 0x7715}, //7763 #CJK UNIFIED IDEOGRAPH
+ {0xB171, 0x7716}, //7764 #CJK UNIFIED IDEOGRAPH
+ {0xB172, 0x7717}, //7765 #CJK UNIFIED IDEOGRAPH
+ {0xB173, 0x7718}, //7766 #CJK UNIFIED IDEOGRAPH
+ {0xB174, 0x771B}, //7767 #CJK UNIFIED IDEOGRAPH
+ {0xB175, 0x771C}, //7768 #CJK UNIFIED IDEOGRAPH
+ {0xB176, 0x771D}, //7769 #CJK UNIFIED IDEOGRAPH
+ {0xB177, 0x771E}, //7770 #CJK UNIFIED IDEOGRAPH
+ {0xB178, 0x7721}, //7771 #CJK UNIFIED IDEOGRAPH
+ {0xB179, 0x7723}, //7772 #CJK UNIFIED IDEOGRAPH
+ {0xB17A, 0x7724}, //7773 #CJK UNIFIED IDEOGRAPH
+ {0xB17B, 0x7725}, //7774 #CJK UNIFIED IDEOGRAPH
+ {0xB17C, 0x7727}, //7775 #CJK UNIFIED IDEOGRAPH
+ {0xB17D, 0x772A}, //7776 #CJK UNIFIED IDEOGRAPH
+ {0xB17E, 0x772B}, //7777 #CJK UNIFIED IDEOGRAPH
+ {0xB180, 0x772C}, //7778 #CJK UNIFIED IDEOGRAPH
+ {0xB181, 0x772E}, //7779 #CJK UNIFIED IDEOGRAPH
+ {0xB182, 0x7730}, //7780 #CJK UNIFIED IDEOGRAPH
+ {0xB183, 0x7731}, //7781 #CJK UNIFIED IDEOGRAPH
+ {0xB184, 0x7732}, //7782 #CJK UNIFIED IDEOGRAPH
+ {0xB185, 0x7733}, //7783 #CJK UNIFIED IDEOGRAPH
+ {0xB186, 0x7734}, //7784 #CJK UNIFIED IDEOGRAPH
+ {0xB187, 0x7739}, //7785 #CJK UNIFIED IDEOGRAPH
+ {0xB188, 0x773B}, //7786 #CJK UNIFIED IDEOGRAPH
+ {0xB189, 0x773D}, //7787 #CJK UNIFIED IDEOGRAPH
+ {0xB18A, 0x773E}, //7788 #CJK UNIFIED IDEOGRAPH
+ {0xB18B, 0x773F}, //7789 #CJK UNIFIED IDEOGRAPH
+ {0xB18C, 0x7742}, //7790 #CJK UNIFIED IDEOGRAPH
+ {0xB18D, 0x7744}, //7791 #CJK UNIFIED IDEOGRAPH
+ {0xB18E, 0x7745}, //7792 #CJK UNIFIED IDEOGRAPH
+ {0xB18F, 0x7746}, //7793 #CJK UNIFIED IDEOGRAPH
+ {0xB190, 0x7748}, //7794 #CJK UNIFIED IDEOGRAPH
+ {0xB191, 0x7749}, //7795 #CJK UNIFIED IDEOGRAPH
+ {0xB192, 0x774A}, //7796 #CJK UNIFIED IDEOGRAPH
+ {0xB193, 0x774B}, //7797 #CJK UNIFIED IDEOGRAPH
+ {0xB194, 0x774C}, //7798 #CJK UNIFIED IDEOGRAPH
+ {0xB195, 0x774D}, //7799 #CJK UNIFIED IDEOGRAPH
+ {0xB196, 0x774E}, //7800 #CJK UNIFIED IDEOGRAPH
+ {0xB197, 0x774F}, //7801 #CJK UNIFIED IDEOGRAPH
+ {0xB198, 0x7752}, //7802 #CJK UNIFIED IDEOGRAPH
+ {0xB199, 0x7753}, //7803 #CJK UNIFIED IDEOGRAPH
+ {0xB19A, 0x7754}, //7804 #CJK UNIFIED IDEOGRAPH
+ {0xB19B, 0x7755}, //7805 #CJK UNIFIED IDEOGRAPH
+ {0xB19C, 0x7756}, //7806 #CJK UNIFIED IDEOGRAPH
+ {0xB19D, 0x7757}, //7807 #CJK UNIFIED IDEOGRAPH
+ {0xB19E, 0x7758}, //7808 #CJK UNIFIED IDEOGRAPH
+ {0xB19F, 0x7759}, //7809 #CJK UNIFIED IDEOGRAPH
+ {0xB1A0, 0x775C}, //7810 #CJK UNIFIED IDEOGRAPH
+ {0xB1A1, 0x8584}, //7811 #CJK UNIFIED IDEOGRAPH
+ {0xB1A2, 0x96F9}, //7812 #CJK UNIFIED IDEOGRAPH
+ {0xB1A3, 0x4FDD}, //7813 #CJK UNIFIED IDEOGRAPH
+ {0xB1A4, 0x5821}, //7814 #CJK UNIFIED IDEOGRAPH
+ {0xB1A5, 0x9971}, //7815 #CJK UNIFIED IDEOGRAPH
+ {0xB1A6, 0x5B9D}, //7816 #CJK UNIFIED IDEOGRAPH
+ {0xB1A7, 0x62B1}, //7817 #CJK UNIFIED IDEOGRAPH
+ {0xB1A8, 0x62A5}, //7818 #CJK UNIFIED IDEOGRAPH
+ {0xB1A9, 0x66B4}, //7819 #CJK UNIFIED IDEOGRAPH
+ {0xB1AA, 0x8C79}, //7820 #CJK UNIFIED IDEOGRAPH
+ {0xB1AB, 0x9C8D}, //7821 #CJK UNIFIED IDEOGRAPH
+ {0xB1AC, 0x7206}, //7822 #CJK UNIFIED IDEOGRAPH
+ {0xB1AD, 0x676F}, //7823 #CJK UNIFIED IDEOGRAPH
+ {0xB1AE, 0x7891}, //7824 #CJK UNIFIED IDEOGRAPH
+ {0xB1AF, 0x60B2}, //7825 #CJK UNIFIED IDEOGRAPH
+ {0xB1B0, 0x5351}, //7826 #CJK UNIFIED IDEOGRAPH
+ {0xB1B1, 0x5317}, //7827 #CJK UNIFIED IDEOGRAPH
+ {0xB1B2, 0x8F88}, //7828 #CJK UNIFIED IDEOGRAPH
+ {0xB1B3, 0x80CC}, //7829 #CJK UNIFIED IDEOGRAPH
+ {0xB1B4, 0x8D1D}, //7830 #CJK UNIFIED IDEOGRAPH
+ {0xB1B5, 0x94A1}, //7831 #CJK UNIFIED IDEOGRAPH
+ {0xB1B6, 0x500D}, //7832 #CJK UNIFIED IDEOGRAPH
+ {0xB1B7, 0x72C8}, //7833 #CJK UNIFIED IDEOGRAPH
+ {0xB1B8, 0x5907}, //7834 #CJK UNIFIED IDEOGRAPH
+ {0xB1B9, 0x60EB}, //7835 #CJK UNIFIED IDEOGRAPH
+ {0xB1BA, 0x7119}, //7836 #CJK UNIFIED IDEOGRAPH
+ {0xB1BB, 0x88AB}, //7837 #CJK UNIFIED IDEOGRAPH
+ {0xB1BC, 0x5954}, //7838 #CJK UNIFIED IDEOGRAPH
+ {0xB1BD, 0x82EF}, //7839 #CJK UNIFIED IDEOGRAPH
+ {0xB1BE, 0x672C}, //7840 #CJK UNIFIED IDEOGRAPH
+ {0xB1BF, 0x7B28}, //7841 #CJK UNIFIED IDEOGRAPH
+ {0xB1C0, 0x5D29}, //7842 #CJK UNIFIED IDEOGRAPH
+ {0xB1C1, 0x7EF7}, //7843 #CJK UNIFIED IDEOGRAPH
+ {0xB1C2, 0x752D}, //7844 #CJK UNIFIED IDEOGRAPH
+ {0xB1C3, 0x6CF5}, //7845 #CJK UNIFIED IDEOGRAPH
+ {0xB1C4, 0x8E66}, //7846 #CJK UNIFIED IDEOGRAPH
+ {0xB1C5, 0x8FF8}, //7847 #CJK UNIFIED IDEOGRAPH
+ {0xB1C6, 0x903C}, //7848 #CJK UNIFIED IDEOGRAPH
+ {0xB1C7, 0x9F3B}, //7849 #CJK UNIFIED IDEOGRAPH
+ {0xB1C8, 0x6BD4}, //7850 #CJK UNIFIED IDEOGRAPH
+ {0xB1C9, 0x9119}, //7851 #CJK UNIFIED IDEOGRAPH
+ {0xB1CA, 0x7B14}, //7852 #CJK UNIFIED IDEOGRAPH
+ {0xB1CB, 0x5F7C}, //7853 #CJK UNIFIED IDEOGRAPH
+ {0xB1CC, 0x78A7}, //7854 #CJK UNIFIED IDEOGRAPH
+ {0xB1CD, 0x84D6}, //7855 #CJK UNIFIED IDEOGRAPH
+ {0xB1CE, 0x853D}, //7856 #CJK UNIFIED IDEOGRAPH
+ {0xB1CF, 0x6BD5}, //7857 #CJK UNIFIED IDEOGRAPH
+ {0xB1D0, 0x6BD9}, //7858 #CJK UNIFIED IDEOGRAPH
+ {0xB1D1, 0x6BD6}, //7859 #CJK UNIFIED IDEOGRAPH
+ {0xB1D2, 0x5E01}, //7860 #CJK UNIFIED IDEOGRAPH
+ {0xB1D3, 0x5E87}, //7861 #CJK UNIFIED IDEOGRAPH
+ {0xB1D4, 0x75F9}, //7862 #CJK UNIFIED IDEOGRAPH
+ {0xB1D5, 0x95ED}, //7863 #CJK UNIFIED IDEOGRAPH
+ {0xB1D6, 0x655D}, //7864 #CJK UNIFIED IDEOGRAPH
+ {0xB1D7, 0x5F0A}, //7865 #CJK UNIFIED IDEOGRAPH
+ {0xB1D8, 0x5FC5}, //7866 #CJK UNIFIED IDEOGRAPH
+ {0xB1D9, 0x8F9F}, //7867 #CJK UNIFIED IDEOGRAPH
+ {0xB1DA, 0x58C1}, //7868 #CJK UNIFIED IDEOGRAPH
+ {0xB1DB, 0x81C2}, //7869 #CJK UNIFIED IDEOGRAPH
+ {0xB1DC, 0x907F}, //7870 #CJK UNIFIED IDEOGRAPH
+ {0xB1DD, 0x965B}, //7871 #CJK UNIFIED IDEOGRAPH
+ {0xB1DE, 0x97AD}, //7872 #CJK UNIFIED IDEOGRAPH
+ {0xB1DF, 0x8FB9}, //7873 #CJK UNIFIED IDEOGRAPH
+ {0xB1E0, 0x7F16}, //7874 #CJK UNIFIED IDEOGRAPH
+ {0xB1E1, 0x8D2C}, //7875 #CJK UNIFIED IDEOGRAPH
+ {0xB1E2, 0x6241}, //7876 #CJK UNIFIED IDEOGRAPH
+ {0xB1E3, 0x4FBF}, //7877 #CJK UNIFIED IDEOGRAPH
+ {0xB1E4, 0x53D8}, //7878 #CJK UNIFIED IDEOGRAPH
+ {0xB1E5, 0x535E}, //7879 #CJK UNIFIED IDEOGRAPH
+ {0xB1E6, 0x8FA8}, //7880 #CJK UNIFIED IDEOGRAPH
+ {0xB1E7, 0x8FA9}, //7881 #CJK UNIFIED IDEOGRAPH
+ {0xB1E8, 0x8FAB}, //7882 #CJK UNIFIED IDEOGRAPH
+ {0xB1E9, 0x904D}, //7883 #CJK UNIFIED IDEOGRAPH
+ {0xB1EA, 0x6807}, //7884 #CJK UNIFIED IDEOGRAPH
+ {0xB1EB, 0x5F6A}, //7885 #CJK UNIFIED IDEOGRAPH
+ {0xB1EC, 0x8198}, //7886 #CJK UNIFIED IDEOGRAPH
+ {0xB1ED, 0x8868}, //7887 #CJK UNIFIED IDEOGRAPH
+ {0xB1EE, 0x9CD6}, //7888 #CJK UNIFIED IDEOGRAPH
+ {0xB1EF, 0x618B}, //7889 #CJK UNIFIED IDEOGRAPH
+ {0xB1F0, 0x522B}, //7890 #CJK UNIFIED IDEOGRAPH
+ {0xB1F1, 0x762A}, //7891 #CJK UNIFIED IDEOGRAPH
+ {0xB1F2, 0x5F6C}, //7892 #CJK UNIFIED IDEOGRAPH
+ {0xB1F3, 0x658C}, //7893 #CJK UNIFIED IDEOGRAPH
+ {0xB1F4, 0x6FD2}, //7894 #CJK UNIFIED IDEOGRAPH
+ {0xB1F5, 0x6EE8}, //7895 #CJK UNIFIED IDEOGRAPH
+ {0xB1F6, 0x5BBE}, //7896 #CJK UNIFIED IDEOGRAPH
+ {0xB1F7, 0x6448}, //7897 #CJK UNIFIED IDEOGRAPH
+ {0xB1F8, 0x5175}, //7898 #CJK UNIFIED IDEOGRAPH
+ {0xB1F9, 0x51B0}, //7899 #CJK UNIFIED IDEOGRAPH
+ {0xB1FA, 0x67C4}, //7900 #CJK UNIFIED IDEOGRAPH
+ {0xB1FB, 0x4E19}, //7901 #CJK UNIFIED IDEOGRAPH
+ {0xB1FC, 0x79C9}, //7902 #CJK UNIFIED IDEOGRAPH
+ {0xB1FD, 0x997C}, //7903 #CJK UNIFIED IDEOGRAPH
+ {0xB1FE, 0x70B3}, //7904 #CJK UNIFIED IDEOGRAPH
+ {0xB240, 0x775D}, //7905 #CJK UNIFIED IDEOGRAPH
+ {0xB241, 0x775E}, //7906 #CJK UNIFIED IDEOGRAPH
+ {0xB242, 0x775F}, //7907 #CJK UNIFIED IDEOGRAPH
+ {0xB243, 0x7760}, //7908 #CJK UNIFIED IDEOGRAPH
+ {0xB244, 0x7764}, //7909 #CJK UNIFIED IDEOGRAPH
+ {0xB245, 0x7767}, //7910 #CJK UNIFIED IDEOGRAPH
+ {0xB246, 0x7769}, //7911 #CJK UNIFIED IDEOGRAPH
+ {0xB247, 0x776A}, //7912 #CJK UNIFIED IDEOGRAPH
+ {0xB248, 0x776D}, //7913 #CJK UNIFIED IDEOGRAPH
+ {0xB249, 0x776E}, //7914 #CJK UNIFIED IDEOGRAPH
+ {0xB24A, 0x776F}, //7915 #CJK UNIFIED IDEOGRAPH
+ {0xB24B, 0x7770}, //7916 #CJK UNIFIED IDEOGRAPH
+ {0xB24C, 0x7771}, //7917 #CJK UNIFIED IDEOGRAPH
+ {0xB24D, 0x7772}, //7918 #CJK UNIFIED IDEOGRAPH
+ {0xB24E, 0x7773}, //7919 #CJK UNIFIED IDEOGRAPH
+ {0xB24F, 0x7774}, //7920 #CJK UNIFIED IDEOGRAPH
+ {0xB250, 0x7775}, //7921 #CJK UNIFIED IDEOGRAPH
+ {0xB251, 0x7776}, //7922 #CJK UNIFIED IDEOGRAPH
+ {0xB252, 0x7777}, //7923 #CJK UNIFIED IDEOGRAPH
+ {0xB253, 0x7778}, //7924 #CJK UNIFIED IDEOGRAPH
+ {0xB254, 0x777A}, //7925 #CJK UNIFIED IDEOGRAPH
+ {0xB255, 0x777B}, //7926 #CJK UNIFIED IDEOGRAPH
+ {0xB256, 0x777C}, //7927 #CJK UNIFIED IDEOGRAPH
+ {0xB257, 0x7781}, //7928 #CJK UNIFIED IDEOGRAPH
+ {0xB258, 0x7782}, //7929 #CJK UNIFIED IDEOGRAPH
+ {0xB259, 0x7783}, //7930 #CJK UNIFIED IDEOGRAPH
+ {0xB25A, 0x7786}, //7931 #CJK UNIFIED IDEOGRAPH
+ {0xB25B, 0x7787}, //7932 #CJK UNIFIED IDEOGRAPH
+ {0xB25C, 0x7788}, //7933 #CJK UNIFIED IDEOGRAPH
+ {0xB25D, 0x7789}, //7934 #CJK UNIFIED IDEOGRAPH
+ {0xB25E, 0x778A}, //7935 #CJK UNIFIED IDEOGRAPH
+ {0xB25F, 0x778B}, //7936 #CJK UNIFIED IDEOGRAPH
+ {0xB260, 0x778F}, //7937 #CJK UNIFIED IDEOGRAPH
+ {0xB261, 0x7790}, //7938 #CJK UNIFIED IDEOGRAPH
+ {0xB262, 0x7793}, //7939 #CJK UNIFIED IDEOGRAPH
+ {0xB263, 0x7794}, //7940 #CJK UNIFIED IDEOGRAPH
+ {0xB264, 0x7795}, //7941 #CJK UNIFIED IDEOGRAPH
+ {0xB265, 0x7796}, //7942 #CJK UNIFIED IDEOGRAPH
+ {0xB266, 0x7797}, //7943 #CJK UNIFIED IDEOGRAPH
+ {0xB267, 0x7798}, //7944 #CJK UNIFIED IDEOGRAPH
+ {0xB268, 0x7799}, //7945 #CJK UNIFIED IDEOGRAPH
+ {0xB269, 0x779A}, //7946 #CJK UNIFIED IDEOGRAPH
+ {0xB26A, 0x779B}, //7947 #CJK UNIFIED IDEOGRAPH
+ {0xB26B, 0x779C}, //7948 #CJK UNIFIED IDEOGRAPH
+ {0xB26C, 0x779D}, //7949 #CJK UNIFIED IDEOGRAPH
+ {0xB26D, 0x779E}, //7950 #CJK UNIFIED IDEOGRAPH
+ {0xB26E, 0x77A1}, //7951 #CJK UNIFIED IDEOGRAPH
+ {0xB26F, 0x77A3}, //7952 #CJK UNIFIED IDEOGRAPH
+ {0xB270, 0x77A4}, //7953 #CJK UNIFIED IDEOGRAPH
+ {0xB271, 0x77A6}, //7954 #CJK UNIFIED IDEOGRAPH
+ {0xB272, 0x77A8}, //7955 #CJK UNIFIED IDEOGRAPH
+ {0xB273, 0x77AB}, //7956 #CJK UNIFIED IDEOGRAPH
+ {0xB274, 0x77AD}, //7957 #CJK UNIFIED IDEOGRAPH
+ {0xB275, 0x77AE}, //7958 #CJK UNIFIED IDEOGRAPH
+ {0xB276, 0x77AF}, //7959 #CJK UNIFIED IDEOGRAPH
+ {0xB277, 0x77B1}, //7960 #CJK UNIFIED IDEOGRAPH
+ {0xB278, 0x77B2}, //7961 #CJK UNIFIED IDEOGRAPH
+ {0xB279, 0x77B4}, //7962 #CJK UNIFIED IDEOGRAPH
+ {0xB27A, 0x77B6}, //7963 #CJK UNIFIED IDEOGRAPH
+ {0xB27B, 0x77B7}, //7964 #CJK UNIFIED IDEOGRAPH
+ {0xB27C, 0x77B8}, //7965 #CJK UNIFIED IDEOGRAPH
+ {0xB27D, 0x77B9}, //7966 #CJK UNIFIED IDEOGRAPH
+ {0xB27E, 0x77BA}, //7967 #CJK UNIFIED IDEOGRAPH
+ {0xB280, 0x77BC}, //7968 #CJK UNIFIED IDEOGRAPH
+ {0xB281, 0x77BE}, //7969 #CJK UNIFIED IDEOGRAPH
+ {0xB282, 0x77C0}, //7970 #CJK UNIFIED IDEOGRAPH
+ {0xB283, 0x77C1}, //7971 #CJK UNIFIED IDEOGRAPH
+ {0xB284, 0x77C2}, //7972 #CJK UNIFIED IDEOGRAPH
+ {0xB285, 0x77C3}, //7973 #CJK UNIFIED IDEOGRAPH
+ {0xB286, 0x77C4}, //7974 #CJK UNIFIED IDEOGRAPH
+ {0xB287, 0x77C5}, //7975 #CJK UNIFIED IDEOGRAPH
+ {0xB288, 0x77C6}, //7976 #CJK UNIFIED IDEOGRAPH
+ {0xB289, 0x77C7}, //7977 #CJK UNIFIED IDEOGRAPH
+ {0xB28A, 0x77C8}, //7978 #CJK UNIFIED IDEOGRAPH
+ {0xB28B, 0x77C9}, //7979 #CJK UNIFIED IDEOGRAPH
+ {0xB28C, 0x77CA}, //7980 #CJK UNIFIED IDEOGRAPH
+ {0xB28D, 0x77CB}, //7981 #CJK UNIFIED IDEOGRAPH
+ {0xB28E, 0x77CC}, //7982 #CJK UNIFIED IDEOGRAPH
+ {0xB28F, 0x77CE}, //7983 #CJK UNIFIED IDEOGRAPH
+ {0xB290, 0x77CF}, //7984 #CJK UNIFIED IDEOGRAPH
+ {0xB291, 0x77D0}, //7985 #CJK UNIFIED IDEOGRAPH
+ {0xB292, 0x77D1}, //7986 #CJK UNIFIED IDEOGRAPH
+ {0xB293, 0x77D2}, //7987 #CJK UNIFIED IDEOGRAPH
+ {0xB294, 0x77D3}, //7988 #CJK UNIFIED IDEOGRAPH
+ {0xB295, 0x77D4}, //7989 #CJK UNIFIED IDEOGRAPH
+ {0xB296, 0x77D5}, //7990 #CJK UNIFIED IDEOGRAPH
+ {0xB297, 0x77D6}, //7991 #CJK UNIFIED IDEOGRAPH
+ {0xB298, 0x77D8}, //7992 #CJK UNIFIED IDEOGRAPH
+ {0xB299, 0x77D9}, //7993 #CJK UNIFIED IDEOGRAPH
+ {0xB29A, 0x77DA}, //7994 #CJK UNIFIED IDEOGRAPH
+ {0xB29B, 0x77DD}, //7995 #CJK UNIFIED IDEOGRAPH
+ {0xB29C, 0x77DE}, //7996 #CJK UNIFIED IDEOGRAPH
+ {0xB29D, 0x77DF}, //7997 #CJK UNIFIED IDEOGRAPH
+ {0xB29E, 0x77E0}, //7998 #CJK UNIFIED IDEOGRAPH
+ {0xB29F, 0x77E1}, //7999 #CJK UNIFIED IDEOGRAPH
+ {0xB2A0, 0x77E4}, //8000 #CJK UNIFIED IDEOGRAPH
+ {0xB2A1, 0x75C5}, //8001 #CJK UNIFIED IDEOGRAPH
+ {0xB2A2, 0x5E76}, //8002 #CJK UNIFIED IDEOGRAPH
+ {0xB2A3, 0x73BB}, //8003 #CJK UNIFIED IDEOGRAPH
+ {0xB2A4, 0x83E0}, //8004 #CJK UNIFIED IDEOGRAPH
+ {0xB2A5, 0x64AD}, //8005 #CJK UNIFIED IDEOGRAPH
+ {0xB2A6, 0x62E8}, //8006 #CJK UNIFIED IDEOGRAPH
+ {0xB2A7, 0x94B5}, //8007 #CJK UNIFIED IDEOGRAPH
+ {0xB2A8, 0x6CE2}, //8008 #CJK UNIFIED IDEOGRAPH
+ {0xB2A9, 0x535A}, //8009 #CJK UNIFIED IDEOGRAPH
+ {0xB2AA, 0x52C3}, //8010 #CJK UNIFIED IDEOGRAPH
+ {0xB2AB, 0x640F}, //8011 #CJK UNIFIED IDEOGRAPH
+ {0xB2AC, 0x94C2}, //8012 #CJK UNIFIED IDEOGRAPH
+ {0xB2AD, 0x7B94}, //8013 #CJK UNIFIED IDEOGRAPH
+ {0xB2AE, 0x4F2F}, //8014 #CJK UNIFIED IDEOGRAPH
+ {0xB2AF, 0x5E1B}, //8015 #CJK UNIFIED IDEOGRAPH
+ {0xB2B0, 0x8236}, //8016 #CJK UNIFIED IDEOGRAPH
+ {0xB2B1, 0x8116}, //8017 #CJK UNIFIED IDEOGRAPH
+ {0xB2B2, 0x818A}, //8018 #CJK UNIFIED IDEOGRAPH
+ {0xB2B3, 0x6E24}, //8019 #CJK UNIFIED IDEOGRAPH
+ {0xB2B4, 0x6CCA}, //8020 #CJK UNIFIED IDEOGRAPH
+ {0xB2B5, 0x9A73}, //8021 #CJK UNIFIED IDEOGRAPH
+ {0xB2B6, 0x6355}, //8022 #CJK UNIFIED IDEOGRAPH
+ {0xB2B7, 0x535C}, //8023 #CJK UNIFIED IDEOGRAPH
+ {0xB2B8, 0x54FA}, //8024 #CJK UNIFIED IDEOGRAPH
+ {0xB2B9, 0x8865}, //8025 #CJK UNIFIED IDEOGRAPH
+ {0xB2BA, 0x57E0}, //8026 #CJK UNIFIED IDEOGRAPH
+ {0xB2BB, 0x4E0D}, //8027 #CJK UNIFIED IDEOGRAPH
+ {0xB2BC, 0x5E03}, //8028 #CJK UNIFIED IDEOGRAPH
+ {0xB2BD, 0x6B65}, //8029 #CJK UNIFIED IDEOGRAPH
+ {0xB2BE, 0x7C3F}, //8030 #CJK UNIFIED IDEOGRAPH
+ {0xB2BF, 0x90E8}, //8031 #CJK UNIFIED IDEOGRAPH
+ {0xB2C0, 0x6016}, //8032 #CJK UNIFIED IDEOGRAPH
+ {0xB2C1, 0x64E6}, //8033 #CJK UNIFIED IDEOGRAPH
+ {0xB2C2, 0x731C}, //8034 #CJK UNIFIED IDEOGRAPH
+ {0xB2C3, 0x88C1}, //8035 #CJK UNIFIED IDEOGRAPH
+ {0xB2C4, 0x6750}, //8036 #CJK UNIFIED IDEOGRAPH
+ {0xB2C5, 0x624D}, //8037 #CJK UNIFIED IDEOGRAPH
+ {0xB2C6, 0x8D22}, //8038 #CJK UNIFIED IDEOGRAPH
+ {0xB2C7, 0x776C}, //8039 #CJK UNIFIED IDEOGRAPH
+ {0xB2C8, 0x8E29}, //8040 #CJK UNIFIED IDEOGRAPH
+ {0xB2C9, 0x91C7}, //8041 #CJK UNIFIED IDEOGRAPH
+ {0xB2CA, 0x5F69}, //8042 #CJK UNIFIED IDEOGRAPH
+ {0xB2CB, 0x83DC}, //8043 #CJK UNIFIED IDEOGRAPH
+ {0xB2CC, 0x8521}, //8044 #CJK UNIFIED IDEOGRAPH
+ {0xB2CD, 0x9910}, //8045 #CJK UNIFIED IDEOGRAPH
+ {0xB2CE, 0x53C2}, //8046 #CJK UNIFIED IDEOGRAPH
+ {0xB2CF, 0x8695}, //8047 #CJK UNIFIED IDEOGRAPH
+ {0xB2D0, 0x6B8B}, //8048 #CJK UNIFIED IDEOGRAPH
+ {0xB2D1, 0x60ED}, //8049 #CJK UNIFIED IDEOGRAPH
+ {0xB2D2, 0x60E8}, //8050 #CJK UNIFIED IDEOGRAPH
+ {0xB2D3, 0x707F}, //8051 #CJK UNIFIED IDEOGRAPH
+ {0xB2D4, 0x82CD}, //8052 #CJK UNIFIED IDEOGRAPH
+ {0xB2D5, 0x8231}, //8053 #CJK UNIFIED IDEOGRAPH
+ {0xB2D6, 0x4ED3}, //8054 #CJK UNIFIED IDEOGRAPH
+ {0xB2D7, 0x6CA7}, //8055 #CJK UNIFIED IDEOGRAPH
+ {0xB2D8, 0x85CF}, //8056 #CJK UNIFIED IDEOGRAPH
+ {0xB2D9, 0x64CD}, //8057 #CJK UNIFIED IDEOGRAPH
+ {0xB2DA, 0x7CD9}, //8058 #CJK UNIFIED IDEOGRAPH
+ {0xB2DB, 0x69FD}, //8059 #CJK UNIFIED IDEOGRAPH
+ {0xB2DC, 0x66F9}, //8060 #CJK UNIFIED IDEOGRAPH
+ {0xB2DD, 0x8349}, //8061 #CJK UNIFIED IDEOGRAPH
+ {0xB2DE, 0x5395}, //8062 #CJK UNIFIED IDEOGRAPH
+ {0xB2DF, 0x7B56}, //8063 #CJK UNIFIED IDEOGRAPH
+ {0xB2E0, 0x4FA7}, //8064 #CJK UNIFIED IDEOGRAPH
+ {0xB2E1, 0x518C}, //8065 #CJK UNIFIED IDEOGRAPH
+ {0xB2E2, 0x6D4B}, //8066 #CJK UNIFIED IDEOGRAPH
+ {0xB2E3, 0x5C42}, //8067 #CJK UNIFIED IDEOGRAPH
+ {0xB2E4, 0x8E6D}, //8068 #CJK UNIFIED IDEOGRAPH
+ {0xB2E5, 0x63D2}, //8069 #CJK UNIFIED IDEOGRAPH
+ {0xB2E6, 0x53C9}, //8070 #CJK UNIFIED IDEOGRAPH
+ {0xB2E7, 0x832C}, //8071 #CJK UNIFIED IDEOGRAPH
+ {0xB2E8, 0x8336}, //8072 #CJK UNIFIED IDEOGRAPH
+ {0xB2E9, 0x67E5}, //8073 #CJK UNIFIED IDEOGRAPH
+ {0xB2EA, 0x78B4}, //8074 #CJK UNIFIED IDEOGRAPH
+ {0xB2EB, 0x643D}, //8075 #CJK UNIFIED IDEOGRAPH
+ {0xB2EC, 0x5BDF}, //8076 #CJK UNIFIED IDEOGRAPH
+ {0xB2ED, 0x5C94}, //8077 #CJK UNIFIED IDEOGRAPH
+ {0xB2EE, 0x5DEE}, //8078 #CJK UNIFIED IDEOGRAPH
+ {0xB2EF, 0x8BE7}, //8079 #CJK UNIFIED IDEOGRAPH
+ {0xB2F0, 0x62C6}, //8080 #CJK UNIFIED IDEOGRAPH
+ {0xB2F1, 0x67F4}, //8081 #CJK UNIFIED IDEOGRAPH
+ {0xB2F2, 0x8C7A}, //8082 #CJK UNIFIED IDEOGRAPH
+ {0xB2F3, 0x6400}, //8083 #CJK UNIFIED IDEOGRAPH
+ {0xB2F4, 0x63BA}, //8084 #CJK UNIFIED IDEOGRAPH
+ {0xB2F5, 0x8749}, //8085 #CJK UNIFIED IDEOGRAPH
+ {0xB2F6, 0x998B}, //8086 #CJK UNIFIED IDEOGRAPH
+ {0xB2F7, 0x8C17}, //8087 #CJK UNIFIED IDEOGRAPH
+ {0xB2F8, 0x7F20}, //8088 #CJK UNIFIED IDEOGRAPH
+ {0xB2F9, 0x94F2}, //8089 #CJK UNIFIED IDEOGRAPH
+ {0xB2FA, 0x4EA7}, //8090 #CJK UNIFIED IDEOGRAPH
+ {0xB2FB, 0x9610}, //8091 #CJK UNIFIED IDEOGRAPH
+ {0xB2FC, 0x98A4}, //8092 #CJK UNIFIED IDEOGRAPH
+ {0xB2FD, 0x660C}, //8093 #CJK UNIFIED IDEOGRAPH
+ {0xB2FE, 0x7316}, //8094 #CJK UNIFIED IDEOGRAPH
+ {0xB340, 0x77E6}, //8095 #CJK UNIFIED IDEOGRAPH
+ {0xB341, 0x77E8}, //8096 #CJK UNIFIED IDEOGRAPH
+ {0xB342, 0x77EA}, //8097 #CJK UNIFIED IDEOGRAPH
+ {0xB343, 0x77EF}, //8098 #CJK UNIFIED IDEOGRAPH
+ {0xB344, 0x77F0}, //8099 #CJK UNIFIED IDEOGRAPH
+ {0xB345, 0x77F1}, //8100 #CJK UNIFIED IDEOGRAPH
+ {0xB346, 0x77F2}, //8101 #CJK UNIFIED IDEOGRAPH
+ {0xB347, 0x77F4}, //8102 #CJK UNIFIED IDEOGRAPH
+ {0xB348, 0x77F5}, //8103 #CJK UNIFIED IDEOGRAPH
+ {0xB349, 0x77F7}, //8104 #CJK UNIFIED IDEOGRAPH
+ {0xB34A, 0x77F9}, //8105 #CJK UNIFIED IDEOGRAPH
+ {0xB34B, 0x77FA}, //8106 #CJK UNIFIED IDEOGRAPH
+ {0xB34C, 0x77FB}, //8107 #CJK UNIFIED IDEOGRAPH
+ {0xB34D, 0x77FC}, //8108 #CJK UNIFIED IDEOGRAPH
+ {0xB34E, 0x7803}, //8109 #CJK UNIFIED IDEOGRAPH
+ {0xB34F, 0x7804}, //8110 #CJK UNIFIED IDEOGRAPH
+ {0xB350, 0x7805}, //8111 #CJK UNIFIED IDEOGRAPH
+ {0xB351, 0x7806}, //8112 #CJK UNIFIED IDEOGRAPH
+ {0xB352, 0x7807}, //8113 #CJK UNIFIED IDEOGRAPH
+ {0xB353, 0x7808}, //8114 #CJK UNIFIED IDEOGRAPH
+ {0xB354, 0x780A}, //8115 #CJK UNIFIED IDEOGRAPH
+ {0xB355, 0x780B}, //8116 #CJK UNIFIED IDEOGRAPH
+ {0xB356, 0x780E}, //8117 #CJK UNIFIED IDEOGRAPH
+ {0xB357, 0x780F}, //8118 #CJK UNIFIED IDEOGRAPH
+ {0xB358, 0x7810}, //8119 #CJK UNIFIED IDEOGRAPH
+ {0xB359, 0x7813}, //8120 #CJK UNIFIED IDEOGRAPH
+ {0xB35A, 0x7815}, //8121 #CJK UNIFIED IDEOGRAPH
+ {0xB35B, 0x7819}, //8122 #CJK UNIFIED IDEOGRAPH
+ {0xB35C, 0x781B}, //8123 #CJK UNIFIED IDEOGRAPH
+ {0xB35D, 0x781E}, //8124 #CJK UNIFIED IDEOGRAPH
+ {0xB35E, 0x7820}, //8125 #CJK UNIFIED IDEOGRAPH
+ {0xB35F, 0x7821}, //8126 #CJK UNIFIED IDEOGRAPH
+ {0xB360, 0x7822}, //8127 #CJK UNIFIED IDEOGRAPH
+ {0xB361, 0x7824}, //8128 #CJK UNIFIED IDEOGRAPH
+ {0xB362, 0x7828}, //8129 #CJK UNIFIED IDEOGRAPH
+ {0xB363, 0x782A}, //8130 #CJK UNIFIED IDEOGRAPH
+ {0xB364, 0x782B}, //8131 #CJK UNIFIED IDEOGRAPH
+ {0xB365, 0x782E}, //8132 #CJK UNIFIED IDEOGRAPH
+ {0xB366, 0x782F}, //8133 #CJK UNIFIED IDEOGRAPH
+ {0xB367, 0x7831}, //8134 #CJK UNIFIED IDEOGRAPH
+ {0xB368, 0x7832}, //8135 #CJK UNIFIED IDEOGRAPH
+ {0xB369, 0x7833}, //8136 #CJK UNIFIED IDEOGRAPH
+ {0xB36A, 0x7835}, //8137 #CJK UNIFIED IDEOGRAPH
+ {0xB36B, 0x7836}, //8138 #CJK UNIFIED IDEOGRAPH
+ {0xB36C, 0x783D}, //8139 #CJK UNIFIED IDEOGRAPH
+ {0xB36D, 0x783F}, //8140 #CJK UNIFIED IDEOGRAPH
+ {0xB36E, 0x7841}, //8141 #CJK UNIFIED IDEOGRAPH
+ {0xB36F, 0x7842}, //8142 #CJK UNIFIED IDEOGRAPH
+ {0xB370, 0x7843}, //8143 #CJK UNIFIED IDEOGRAPH
+ {0xB371, 0x7844}, //8144 #CJK UNIFIED IDEOGRAPH
+ {0xB372, 0x7846}, //8145 #CJK UNIFIED IDEOGRAPH
+ {0xB373, 0x7848}, //8146 #CJK UNIFIED IDEOGRAPH
+ {0xB374, 0x7849}, //8147 #CJK UNIFIED IDEOGRAPH
+ {0xB375, 0x784A}, //8148 #CJK UNIFIED IDEOGRAPH
+ {0xB376, 0x784B}, //8149 #CJK UNIFIED IDEOGRAPH
+ {0xB377, 0x784D}, //8150 #CJK UNIFIED IDEOGRAPH
+ {0xB378, 0x784F}, //8151 #CJK UNIFIED IDEOGRAPH
+ {0xB379, 0x7851}, //8152 #CJK UNIFIED IDEOGRAPH
+ {0xB37A, 0x7853}, //8153 #CJK UNIFIED IDEOGRAPH
+ {0xB37B, 0x7854}, //8154 #CJK UNIFIED IDEOGRAPH
+ {0xB37C, 0x7858}, //8155 #CJK UNIFIED IDEOGRAPH
+ {0xB37D, 0x7859}, //8156 #CJK UNIFIED IDEOGRAPH
+ {0xB37E, 0x785A}, //8157 #CJK UNIFIED IDEOGRAPH
+ {0xB380, 0x785B}, //8158 #CJK UNIFIED IDEOGRAPH
+ {0xB381, 0x785C}, //8159 #CJK UNIFIED IDEOGRAPH
+ {0xB382, 0x785E}, //8160 #CJK UNIFIED IDEOGRAPH
+ {0xB383, 0x785F}, //8161 #CJK UNIFIED IDEOGRAPH
+ {0xB384, 0x7860}, //8162 #CJK UNIFIED IDEOGRAPH
+ {0xB385, 0x7861}, //8163 #CJK UNIFIED IDEOGRAPH
+ {0xB386, 0x7862}, //8164 #CJK UNIFIED IDEOGRAPH
+ {0xB387, 0x7863}, //8165 #CJK UNIFIED IDEOGRAPH
+ {0xB388, 0x7864}, //8166 #CJK UNIFIED IDEOGRAPH
+ {0xB389, 0x7865}, //8167 #CJK UNIFIED IDEOGRAPH
+ {0xB38A, 0x7866}, //8168 #CJK UNIFIED IDEOGRAPH
+ {0xB38B, 0x7867}, //8169 #CJK UNIFIED IDEOGRAPH
+ {0xB38C, 0x7868}, //8170 #CJK UNIFIED IDEOGRAPH
+ {0xB38D, 0x7869}, //8171 #CJK UNIFIED IDEOGRAPH
+ {0xB38E, 0x786F}, //8172 #CJK UNIFIED IDEOGRAPH
+ {0xB38F, 0x7870}, //8173 #CJK UNIFIED IDEOGRAPH
+ {0xB390, 0x7871}, //8174 #CJK UNIFIED IDEOGRAPH
+ {0xB391, 0x7872}, //8175 #CJK UNIFIED IDEOGRAPH
+ {0xB392, 0x7873}, //8176 #CJK UNIFIED IDEOGRAPH
+ {0xB393, 0x7874}, //8177 #CJK UNIFIED IDEOGRAPH
+ {0xB394, 0x7875}, //8178 #CJK UNIFIED IDEOGRAPH
+ {0xB395, 0x7876}, //8179 #CJK UNIFIED IDEOGRAPH
+ {0xB396, 0x7878}, //8180 #CJK UNIFIED IDEOGRAPH
+ {0xB397, 0x7879}, //8181 #CJK UNIFIED IDEOGRAPH
+ {0xB398, 0x787A}, //8182 #CJK UNIFIED IDEOGRAPH
+ {0xB399, 0x787B}, //8183 #CJK UNIFIED IDEOGRAPH
+ {0xB39A, 0x787D}, //8184 #CJK UNIFIED IDEOGRAPH
+ {0xB39B, 0x787E}, //8185 #CJK UNIFIED IDEOGRAPH
+ {0xB39C, 0x787F}, //8186 #CJK UNIFIED IDEOGRAPH
+ {0xB39D, 0x7880}, //8187 #CJK UNIFIED IDEOGRAPH
+ {0xB39E, 0x7881}, //8188 #CJK UNIFIED IDEOGRAPH
+ {0xB39F, 0x7882}, //8189 #CJK UNIFIED IDEOGRAPH
+ {0xB3A0, 0x7883}, //8190 #CJK UNIFIED IDEOGRAPH
+ {0xB3A1, 0x573A}, //8191 #CJK UNIFIED IDEOGRAPH
+ {0xB3A2, 0x5C1D}, //8192 #CJK UNIFIED IDEOGRAPH
+ {0xB3A3, 0x5E38}, //8193 #CJK UNIFIED IDEOGRAPH
+ {0xB3A4, 0x957F}, //8194 #CJK UNIFIED IDEOGRAPH
+ {0xB3A5, 0x507F}, //8195 #CJK UNIFIED IDEOGRAPH
+ {0xB3A6, 0x80A0}, //8196 #CJK UNIFIED IDEOGRAPH
+ {0xB3A7, 0x5382}, //8197 #CJK UNIFIED IDEOGRAPH
+ {0xB3A8, 0x655E}, //8198 #CJK UNIFIED IDEOGRAPH
+ {0xB3A9, 0x7545}, //8199 #CJK UNIFIED IDEOGRAPH
+ {0xB3AA, 0x5531}, //8200 #CJK UNIFIED IDEOGRAPH
+ {0xB3AB, 0x5021}, //8201 #CJK UNIFIED IDEOGRAPH
+ {0xB3AC, 0x8D85}, //8202 #CJK UNIFIED IDEOGRAPH
+ {0xB3AD, 0x6284}, //8203 #CJK UNIFIED IDEOGRAPH
+ {0xB3AE, 0x949E}, //8204 #CJK UNIFIED IDEOGRAPH
+ {0xB3AF, 0x671D}, //8205 #CJK UNIFIED IDEOGRAPH
+ {0xB3B0, 0x5632}, //8206 #CJK UNIFIED IDEOGRAPH
+ {0xB3B1, 0x6F6E}, //8207 #CJK UNIFIED IDEOGRAPH
+ {0xB3B2, 0x5DE2}, //8208 #CJK UNIFIED IDEOGRAPH
+ {0xB3B3, 0x5435}, //8209 #CJK UNIFIED IDEOGRAPH
+ {0xB3B4, 0x7092}, //8210 #CJK UNIFIED IDEOGRAPH
+ {0xB3B5, 0x8F66}, //8211 #CJK UNIFIED IDEOGRAPH
+ {0xB3B6, 0x626F}, //8212 #CJK UNIFIED IDEOGRAPH
+ {0xB3B7, 0x64A4}, //8213 #CJK UNIFIED IDEOGRAPH
+ {0xB3B8, 0x63A3}, //8214 #CJK UNIFIED IDEOGRAPH
+ {0xB3B9, 0x5F7B}, //8215 #CJK UNIFIED IDEOGRAPH
+ {0xB3BA, 0x6F88}, //8216 #CJK UNIFIED IDEOGRAPH
+ {0xB3BB, 0x90F4}, //8217 #CJK UNIFIED IDEOGRAPH
+ {0xB3BC, 0x81E3}, //8218 #CJK UNIFIED IDEOGRAPH
+ {0xB3BD, 0x8FB0}, //8219 #CJK UNIFIED IDEOGRAPH
+ {0xB3BE, 0x5C18}, //8220 #CJK UNIFIED IDEOGRAPH
+ {0xB3BF, 0x6668}, //8221 #CJK UNIFIED IDEOGRAPH
+ {0xB3C0, 0x5FF1}, //8222 #CJK UNIFIED IDEOGRAPH
+ {0xB3C1, 0x6C89}, //8223 #CJK UNIFIED IDEOGRAPH
+ {0xB3C2, 0x9648}, //8224 #CJK UNIFIED IDEOGRAPH
+ {0xB3C3, 0x8D81}, //8225 #CJK UNIFIED IDEOGRAPH
+ {0xB3C4, 0x886C}, //8226 #CJK UNIFIED IDEOGRAPH
+ {0xB3C5, 0x6491}, //8227 #CJK UNIFIED IDEOGRAPH
+ {0xB3C6, 0x79F0}, //8228 #CJK UNIFIED IDEOGRAPH
+ {0xB3C7, 0x57CE}, //8229 #CJK UNIFIED IDEOGRAPH
+ {0xB3C8, 0x6A59}, //8230 #CJK UNIFIED IDEOGRAPH
+ {0xB3C9, 0x6210}, //8231 #CJK UNIFIED IDEOGRAPH
+ {0xB3CA, 0x5448}, //8232 #CJK UNIFIED IDEOGRAPH
+ {0xB3CB, 0x4E58}, //8233 #CJK UNIFIED IDEOGRAPH
+ {0xB3CC, 0x7A0B}, //8234 #CJK UNIFIED IDEOGRAPH
+ {0xB3CD, 0x60E9}, //8235 #CJK UNIFIED IDEOGRAPH
+ {0xB3CE, 0x6F84}, //8236 #CJK UNIFIED IDEOGRAPH
+ {0xB3CF, 0x8BDA}, //8237 #CJK UNIFIED IDEOGRAPH
+ {0xB3D0, 0x627F}, //8238 #CJK UNIFIED IDEOGRAPH
+ {0xB3D1, 0x901E}, //8239 #CJK UNIFIED IDEOGRAPH
+ {0xB3D2, 0x9A8B}, //8240 #CJK UNIFIED IDEOGRAPH
+ {0xB3D3, 0x79E4}, //8241 #CJK UNIFIED IDEOGRAPH
+ {0xB3D4, 0x5403}, //8242 #CJK UNIFIED IDEOGRAPH
+ {0xB3D5, 0x75F4}, //8243 #CJK UNIFIED IDEOGRAPH
+ {0xB3D6, 0x6301}, //8244 #CJK UNIFIED IDEOGRAPH
+ {0xB3D7, 0x5319}, //8245 #CJK UNIFIED IDEOGRAPH
+ {0xB3D8, 0x6C60}, //8246 #CJK UNIFIED IDEOGRAPH
+ {0xB3D9, 0x8FDF}, //8247 #CJK UNIFIED IDEOGRAPH
+ {0xB3DA, 0x5F1B}, //8248 #CJK UNIFIED IDEOGRAPH
+ {0xB3DB, 0x9A70}, //8249 #CJK UNIFIED IDEOGRAPH
+ {0xB3DC, 0x803B}, //8250 #CJK UNIFIED IDEOGRAPH
+ {0xB3DD, 0x9F7F}, //8251 #CJK UNIFIED IDEOGRAPH
+ {0xB3DE, 0x4F88}, //8252 #CJK UNIFIED IDEOGRAPH
+ {0xB3DF, 0x5C3A}, //8253 #CJK UNIFIED IDEOGRAPH
+ {0xB3E0, 0x8D64}, //8254 #CJK UNIFIED IDEOGRAPH
+ {0xB3E1, 0x7FC5}, //8255 #CJK UNIFIED IDEOGRAPH
+ {0xB3E2, 0x65A5}, //8256 #CJK UNIFIED IDEOGRAPH
+ {0xB3E3, 0x70BD}, //8257 #CJK UNIFIED IDEOGRAPH
+ {0xB3E4, 0x5145}, //8258 #CJK UNIFIED IDEOGRAPH
+ {0xB3E5, 0x51B2}, //8259 #CJK UNIFIED IDEOGRAPH
+ {0xB3E6, 0x866B}, //8260 #CJK UNIFIED IDEOGRAPH
+ {0xB3E7, 0x5D07}, //8261 #CJK UNIFIED IDEOGRAPH
+ {0xB3E8, 0x5BA0}, //8262 #CJK UNIFIED IDEOGRAPH
+ {0xB3E9, 0x62BD}, //8263 #CJK UNIFIED IDEOGRAPH
+ {0xB3EA, 0x916C}, //8264 #CJK UNIFIED IDEOGRAPH
+ {0xB3EB, 0x7574}, //8265 #CJK UNIFIED IDEOGRAPH
+ {0xB3EC, 0x8E0C}, //8266 #CJK UNIFIED IDEOGRAPH
+ {0xB3ED, 0x7A20}, //8267 #CJK UNIFIED IDEOGRAPH
+ {0xB3EE, 0x6101}, //8268 #CJK UNIFIED IDEOGRAPH
+ {0xB3EF, 0x7B79}, //8269 #CJK UNIFIED IDEOGRAPH
+ {0xB3F0, 0x4EC7}, //8270 #CJK UNIFIED IDEOGRAPH
+ {0xB3F1, 0x7EF8}, //8271 #CJK UNIFIED IDEOGRAPH
+ {0xB3F2, 0x7785}, //8272 #CJK UNIFIED IDEOGRAPH
+ {0xB3F3, 0x4E11}, //8273 #CJK UNIFIED IDEOGRAPH
+ {0xB3F4, 0x81ED}, //8274 #CJK UNIFIED IDEOGRAPH
+ {0xB3F5, 0x521D}, //8275 #CJK UNIFIED IDEOGRAPH
+ {0xB3F6, 0x51FA}, //8276 #CJK UNIFIED IDEOGRAPH
+ {0xB3F7, 0x6A71}, //8277 #CJK UNIFIED IDEOGRAPH
+ {0xB3F8, 0x53A8}, //8278 #CJK UNIFIED IDEOGRAPH
+ {0xB3F9, 0x8E87}, //8279 #CJK UNIFIED IDEOGRAPH
+ {0xB3FA, 0x9504}, //8280 #CJK UNIFIED IDEOGRAPH
+ {0xB3FB, 0x96CF}, //8281 #CJK UNIFIED IDEOGRAPH
+ {0xB3FC, 0x6EC1}, //8282 #CJK UNIFIED IDEOGRAPH
+ {0xB3FD, 0x9664}, //8283 #CJK UNIFIED IDEOGRAPH
+ {0xB3FE, 0x695A}, //8284 #CJK UNIFIED IDEOGRAPH
+ {0xB440, 0x7884}, //8285 #CJK UNIFIED IDEOGRAPH
+ {0xB441, 0x7885}, //8286 #CJK UNIFIED IDEOGRAPH
+ {0xB442, 0x7886}, //8287 #CJK UNIFIED IDEOGRAPH
+ {0xB443, 0x7888}, //8288 #CJK UNIFIED IDEOGRAPH
+ {0xB444, 0x788A}, //8289 #CJK UNIFIED IDEOGRAPH
+ {0xB445, 0x788B}, //8290 #CJK UNIFIED IDEOGRAPH
+ {0xB446, 0x788F}, //8291 #CJK UNIFIED IDEOGRAPH
+ {0xB447, 0x7890}, //8292 #CJK UNIFIED IDEOGRAPH
+ {0xB448, 0x7892}, //8293 #CJK UNIFIED IDEOGRAPH
+ {0xB449, 0x7894}, //8294 #CJK UNIFIED IDEOGRAPH
+ {0xB44A, 0x7895}, //8295 #CJK UNIFIED IDEOGRAPH
+ {0xB44B, 0x7896}, //8296 #CJK UNIFIED IDEOGRAPH
+ {0xB44C, 0x7899}, //8297 #CJK UNIFIED IDEOGRAPH
+ {0xB44D, 0x789D}, //8298 #CJK UNIFIED IDEOGRAPH
+ {0xB44E, 0x789E}, //8299 #CJK UNIFIED IDEOGRAPH
+ {0xB44F, 0x78A0}, //8300 #CJK UNIFIED IDEOGRAPH
+ {0xB450, 0x78A2}, //8301 #CJK UNIFIED IDEOGRAPH
+ {0xB451, 0x78A4}, //8302 #CJK UNIFIED IDEOGRAPH
+ {0xB452, 0x78A6}, //8303 #CJK UNIFIED IDEOGRAPH
+ {0xB453, 0x78A8}, //8304 #CJK UNIFIED IDEOGRAPH
+ {0xB454, 0x78A9}, //8305 #CJK UNIFIED IDEOGRAPH
+ {0xB455, 0x78AA}, //8306 #CJK UNIFIED IDEOGRAPH
+ {0xB456, 0x78AB}, //8307 #CJK UNIFIED IDEOGRAPH
+ {0xB457, 0x78AC}, //8308 #CJK UNIFIED IDEOGRAPH
+ {0xB458, 0x78AD}, //8309 #CJK UNIFIED IDEOGRAPH
+ {0xB459, 0x78AE}, //8310 #CJK UNIFIED IDEOGRAPH
+ {0xB45A, 0x78AF}, //8311 #CJK UNIFIED IDEOGRAPH
+ {0xB45B, 0x78B5}, //8312 #CJK UNIFIED IDEOGRAPH
+ {0xB45C, 0x78B6}, //8313 #CJK UNIFIED IDEOGRAPH
+ {0xB45D, 0x78B7}, //8314 #CJK UNIFIED IDEOGRAPH
+ {0xB45E, 0x78B8}, //8315 #CJK UNIFIED IDEOGRAPH
+ {0xB45F, 0x78BA}, //8316 #CJK UNIFIED IDEOGRAPH
+ {0xB460, 0x78BB}, //8317 #CJK UNIFIED IDEOGRAPH
+ {0xB461, 0x78BC}, //8318 #CJK UNIFIED IDEOGRAPH
+ {0xB462, 0x78BD}, //8319 #CJK UNIFIED IDEOGRAPH
+ {0xB463, 0x78BF}, //8320 #CJK UNIFIED IDEOGRAPH
+ {0xB464, 0x78C0}, //8321 #CJK UNIFIED IDEOGRAPH
+ {0xB465, 0x78C2}, //8322 #CJK UNIFIED IDEOGRAPH
+ {0xB466, 0x78C3}, //8323 #CJK UNIFIED IDEOGRAPH
+ {0xB467, 0x78C4}, //8324 #CJK UNIFIED IDEOGRAPH
+ {0xB468, 0x78C6}, //8325 #CJK UNIFIED IDEOGRAPH
+ {0xB469, 0x78C7}, //8326 #CJK UNIFIED IDEOGRAPH
+ {0xB46A, 0x78C8}, //8327 #CJK UNIFIED IDEOGRAPH
+ {0xB46B, 0x78CC}, //8328 #CJK UNIFIED IDEOGRAPH
+ {0xB46C, 0x78CD}, //8329 #CJK UNIFIED IDEOGRAPH
+ {0xB46D, 0x78CE}, //8330 #CJK UNIFIED IDEOGRAPH
+ {0xB46E, 0x78CF}, //8331 #CJK UNIFIED IDEOGRAPH
+ {0xB46F, 0x78D1}, //8332 #CJK UNIFIED IDEOGRAPH
+ {0xB470, 0x78D2}, //8333 #CJK UNIFIED IDEOGRAPH
+ {0xB471, 0x78D3}, //8334 #CJK UNIFIED IDEOGRAPH
+ {0xB472, 0x78D6}, //8335 #CJK UNIFIED IDEOGRAPH
+ {0xB473, 0x78D7}, //8336 #CJK UNIFIED IDEOGRAPH
+ {0xB474, 0x78D8}, //8337 #CJK UNIFIED IDEOGRAPH
+ {0xB475, 0x78DA}, //8338 #CJK UNIFIED IDEOGRAPH
+ {0xB476, 0x78DB}, //8339 #CJK UNIFIED IDEOGRAPH
+ {0xB477, 0x78DC}, //8340 #CJK UNIFIED IDEOGRAPH
+ {0xB478, 0x78DD}, //8341 #CJK UNIFIED IDEOGRAPH
+ {0xB479, 0x78DE}, //8342 #CJK UNIFIED IDEOGRAPH
+ {0xB47A, 0x78DF}, //8343 #CJK UNIFIED IDEOGRAPH
+ {0xB47B, 0x78E0}, //8344 #CJK UNIFIED IDEOGRAPH
+ {0xB47C, 0x78E1}, //8345 #CJK UNIFIED IDEOGRAPH
+ {0xB47D, 0x78E2}, //8346 #CJK UNIFIED IDEOGRAPH
+ {0xB47E, 0x78E3}, //8347 #CJK UNIFIED IDEOGRAPH
+ {0xB480, 0x78E4}, //8348 #CJK UNIFIED IDEOGRAPH
+ {0xB481, 0x78E5}, //8349 #CJK UNIFIED IDEOGRAPH
+ {0xB482, 0x78E6}, //8350 #CJK UNIFIED IDEOGRAPH
+ {0xB483, 0x78E7}, //8351 #CJK UNIFIED IDEOGRAPH
+ {0xB484, 0x78E9}, //8352 #CJK UNIFIED IDEOGRAPH
+ {0xB485, 0x78EA}, //8353 #CJK UNIFIED IDEOGRAPH
+ {0xB486, 0x78EB}, //8354 #CJK UNIFIED IDEOGRAPH
+ {0xB487, 0x78ED}, //8355 #CJK UNIFIED IDEOGRAPH
+ {0xB488, 0x78EE}, //8356 #CJK UNIFIED IDEOGRAPH
+ {0xB489, 0x78EF}, //8357 #CJK UNIFIED IDEOGRAPH
+ {0xB48A, 0x78F0}, //8358 #CJK UNIFIED IDEOGRAPH
+ {0xB48B, 0x78F1}, //8359 #CJK UNIFIED IDEOGRAPH
+ {0xB48C, 0x78F3}, //8360 #CJK UNIFIED IDEOGRAPH
+ {0xB48D, 0x78F5}, //8361 #CJK UNIFIED IDEOGRAPH
+ {0xB48E, 0x78F6}, //8362 #CJK UNIFIED IDEOGRAPH
+ {0xB48F, 0x78F8}, //8363 #CJK UNIFIED IDEOGRAPH
+ {0xB490, 0x78F9}, //8364 #CJK UNIFIED IDEOGRAPH
+ {0xB491, 0x78FB}, //8365 #CJK UNIFIED IDEOGRAPH
+ {0xB492, 0x78FC}, //8366 #CJK UNIFIED IDEOGRAPH
+ {0xB493, 0x78FD}, //8367 #CJK UNIFIED IDEOGRAPH
+ {0xB494, 0x78FE}, //8368 #CJK UNIFIED IDEOGRAPH
+ {0xB495, 0x78FF}, //8369 #CJK UNIFIED IDEOGRAPH
+ {0xB496, 0x7900}, //8370 #CJK UNIFIED IDEOGRAPH
+ {0xB497, 0x7902}, //8371 #CJK UNIFIED IDEOGRAPH
+ {0xB498, 0x7903}, //8372 #CJK UNIFIED IDEOGRAPH
+ {0xB499, 0x7904}, //8373 #CJK UNIFIED IDEOGRAPH
+ {0xB49A, 0x7906}, //8374 #CJK UNIFIED IDEOGRAPH
+ {0xB49B, 0x7907}, //8375 #CJK UNIFIED IDEOGRAPH
+ {0xB49C, 0x7908}, //8376 #CJK UNIFIED IDEOGRAPH
+ {0xB49D, 0x7909}, //8377 #CJK UNIFIED IDEOGRAPH
+ {0xB49E, 0x790A}, //8378 #CJK UNIFIED IDEOGRAPH
+ {0xB49F, 0x790B}, //8379 #CJK UNIFIED IDEOGRAPH
+ {0xB4A0, 0x790C}, //8380 #CJK UNIFIED IDEOGRAPH
+ {0xB4A1, 0x7840}, //8381 #CJK UNIFIED IDEOGRAPH
+ {0xB4A2, 0x50A8}, //8382 #CJK UNIFIED IDEOGRAPH
+ {0xB4A3, 0x77D7}, //8383 #CJK UNIFIED IDEOGRAPH
+ {0xB4A4, 0x6410}, //8384 #CJK UNIFIED IDEOGRAPH
+ {0xB4A5, 0x89E6}, //8385 #CJK UNIFIED IDEOGRAPH
+ {0xB4A6, 0x5904}, //8386 #CJK UNIFIED IDEOGRAPH
+ {0xB4A7, 0x63E3}, //8387 #CJK UNIFIED IDEOGRAPH
+ {0xB4A8, 0x5DDD}, //8388 #CJK UNIFIED IDEOGRAPH
+ {0xB4A9, 0x7A7F}, //8389 #CJK UNIFIED IDEOGRAPH
+ {0xB4AA, 0x693D}, //8390 #CJK UNIFIED IDEOGRAPH
+ {0xB4AB, 0x4F20}, //8391 #CJK UNIFIED IDEOGRAPH
+ {0xB4AC, 0x8239}, //8392 #CJK UNIFIED IDEOGRAPH
+ {0xB4AD, 0x5598}, //8393 #CJK UNIFIED IDEOGRAPH
+ {0xB4AE, 0x4E32}, //8394 #CJK UNIFIED IDEOGRAPH
+ {0xB4AF, 0x75AE}, //8395 #CJK UNIFIED IDEOGRAPH
+ {0xB4B0, 0x7A97}, //8396 #CJK UNIFIED IDEOGRAPH
+ {0xB4B1, 0x5E62}, //8397 #CJK UNIFIED IDEOGRAPH
+ {0xB4B2, 0x5E8A}, //8398 #CJK UNIFIED IDEOGRAPH
+ {0xB4B3, 0x95EF}, //8399 #CJK UNIFIED IDEOGRAPH
+ {0xB4B4, 0x521B}, //8400 #CJK UNIFIED IDEOGRAPH
+ {0xB4B5, 0x5439}, //8401 #CJK UNIFIED IDEOGRAPH
+ {0xB4B6, 0x708A}, //8402 #CJK UNIFIED IDEOGRAPH
+ {0xB4B7, 0x6376}, //8403 #CJK UNIFIED IDEOGRAPH
+ {0xB4B8, 0x9524}, //8404 #CJK UNIFIED IDEOGRAPH
+ {0xB4B9, 0x5782}, //8405 #CJK UNIFIED IDEOGRAPH
+ {0xB4BA, 0x6625}, //8406 #CJK UNIFIED IDEOGRAPH
+ {0xB4BB, 0x693F}, //8407 #CJK UNIFIED IDEOGRAPH
+ {0xB4BC, 0x9187}, //8408 #CJK UNIFIED IDEOGRAPH
+ {0xB4BD, 0x5507}, //8409 #CJK UNIFIED IDEOGRAPH
+ {0xB4BE, 0x6DF3}, //8410 #CJK UNIFIED IDEOGRAPH
+ {0xB4BF, 0x7EAF}, //8411 #CJK UNIFIED IDEOGRAPH
+ {0xB4C0, 0x8822}, //8412 #CJK UNIFIED IDEOGRAPH
+ {0xB4C1, 0x6233}, //8413 #CJK UNIFIED IDEOGRAPH
+ {0xB4C2, 0x7EF0}, //8414 #CJK UNIFIED IDEOGRAPH
+ {0xB4C3, 0x75B5}, //8415 #CJK UNIFIED IDEOGRAPH
+ {0xB4C4, 0x8328}, //8416 #CJK UNIFIED IDEOGRAPH
+ {0xB4C5, 0x78C1}, //8417 #CJK UNIFIED IDEOGRAPH
+ {0xB4C6, 0x96CC}, //8418 #CJK UNIFIED IDEOGRAPH
+ {0xB4C7, 0x8F9E}, //8419 #CJK UNIFIED IDEOGRAPH
+ {0xB4C8, 0x6148}, //8420 #CJK UNIFIED IDEOGRAPH
+ {0xB4C9, 0x74F7}, //8421 #CJK UNIFIED IDEOGRAPH
+ {0xB4CA, 0x8BCD}, //8422 #CJK UNIFIED IDEOGRAPH
+ {0xB4CB, 0x6B64}, //8423 #CJK UNIFIED IDEOGRAPH
+ {0xB4CC, 0x523A}, //8424 #CJK UNIFIED IDEOGRAPH
+ {0xB4CD, 0x8D50}, //8425 #CJK UNIFIED IDEOGRAPH
+ {0xB4CE, 0x6B21}, //8426 #CJK UNIFIED IDEOGRAPH
+ {0xB4CF, 0x806A}, //8427 #CJK UNIFIED IDEOGRAPH
+ {0xB4D0, 0x8471}, //8428 #CJK UNIFIED IDEOGRAPH
+ {0xB4D1, 0x56F1}, //8429 #CJK UNIFIED IDEOGRAPH
+ {0xB4D2, 0x5306}, //8430 #CJK UNIFIED IDEOGRAPH
+ {0xB4D3, 0x4ECE}, //8431 #CJK UNIFIED IDEOGRAPH
+ {0xB4D4, 0x4E1B}, //8432 #CJK UNIFIED IDEOGRAPH
+ {0xB4D5, 0x51D1}, //8433 #CJK UNIFIED IDEOGRAPH
+ {0xB4D6, 0x7C97}, //8434 #CJK UNIFIED IDEOGRAPH
+ {0xB4D7, 0x918B}, //8435 #CJK UNIFIED IDEOGRAPH
+ {0xB4D8, 0x7C07}, //8436 #CJK UNIFIED IDEOGRAPH
+ {0xB4D9, 0x4FC3}, //8437 #CJK UNIFIED IDEOGRAPH
+ {0xB4DA, 0x8E7F}, //8438 #CJK UNIFIED IDEOGRAPH
+ {0xB4DB, 0x7BE1}, //8439 #CJK UNIFIED IDEOGRAPH
+ {0xB4DC, 0x7A9C}, //8440 #CJK UNIFIED IDEOGRAPH
+ {0xB4DD, 0x6467}, //8441 #CJK UNIFIED IDEOGRAPH
+ {0xB4DE, 0x5D14}, //8442 #CJK UNIFIED IDEOGRAPH
+ {0xB4DF, 0x50AC}, //8443 #CJK UNIFIED IDEOGRAPH
+ {0xB4E0, 0x8106}, //8444 #CJK UNIFIED IDEOGRAPH
+ {0xB4E1, 0x7601}, //8445 #CJK UNIFIED IDEOGRAPH
+ {0xB4E2, 0x7CB9}, //8446 #CJK UNIFIED IDEOGRAPH
+ {0xB4E3, 0x6DEC}, //8447 #CJK UNIFIED IDEOGRAPH
+ {0xB4E4, 0x7FE0}, //8448 #CJK UNIFIED IDEOGRAPH
+ {0xB4E5, 0x6751}, //8449 #CJK UNIFIED IDEOGRAPH
+ {0xB4E6, 0x5B58}, //8450 #CJK UNIFIED IDEOGRAPH
+ {0xB4E7, 0x5BF8}, //8451 #CJK UNIFIED IDEOGRAPH
+ {0xB4E8, 0x78CB}, //8452 #CJK UNIFIED IDEOGRAPH
+ {0xB4E9, 0x64AE}, //8453 #CJK UNIFIED IDEOGRAPH
+ {0xB4EA, 0x6413}, //8454 #CJK UNIFIED IDEOGRAPH
+ {0xB4EB, 0x63AA}, //8455 #CJK UNIFIED IDEOGRAPH
+ {0xB4EC, 0x632B}, //8456 #CJK UNIFIED IDEOGRAPH
+ {0xB4ED, 0x9519}, //8457 #CJK UNIFIED IDEOGRAPH
+ {0xB4EE, 0x642D}, //8458 #CJK UNIFIED IDEOGRAPH
+ {0xB4EF, 0x8FBE}, //8459 #CJK UNIFIED IDEOGRAPH
+ {0xB4F0, 0x7B54}, //8460 #CJK UNIFIED IDEOGRAPH
+ {0xB4F1, 0x7629}, //8461 #CJK UNIFIED IDEOGRAPH
+ {0xB4F2, 0x6253}, //8462 #CJK UNIFIED IDEOGRAPH
+ {0xB4F3, 0x5927}, //8463 #CJK UNIFIED IDEOGRAPH
+ {0xB4F4, 0x5446}, //8464 #CJK UNIFIED IDEOGRAPH
+ {0xB4F5, 0x6B79}, //8465 #CJK UNIFIED IDEOGRAPH
+ {0xB4F6, 0x50A3}, //8466 #CJK UNIFIED IDEOGRAPH
+ {0xB4F7, 0x6234}, //8467 #CJK UNIFIED IDEOGRAPH
+ {0xB4F8, 0x5E26}, //8468 #CJK UNIFIED IDEOGRAPH
+ {0xB4F9, 0x6B86}, //8469 #CJK UNIFIED IDEOGRAPH
+ {0xB4FA, 0x4EE3}, //8470 #CJK UNIFIED IDEOGRAPH
+ {0xB4FB, 0x8D37}, //8471 #CJK UNIFIED IDEOGRAPH
+ {0xB4FC, 0x888B}, //8472 #CJK UNIFIED IDEOGRAPH
+ {0xB4FD, 0x5F85}, //8473 #CJK UNIFIED IDEOGRAPH
+ {0xB4FE, 0x902E}, //8474 #CJK UNIFIED IDEOGRAPH
+ {0xB540, 0x790D}, //8475 #CJK UNIFIED IDEOGRAPH
+ {0xB541, 0x790E}, //8476 #CJK UNIFIED IDEOGRAPH
+ {0xB542, 0x790F}, //8477 #CJK UNIFIED IDEOGRAPH
+ {0xB543, 0x7910}, //8478 #CJK UNIFIED IDEOGRAPH
+ {0xB544, 0x7911}, //8479 #CJK UNIFIED IDEOGRAPH
+ {0xB545, 0x7912}, //8480 #CJK UNIFIED IDEOGRAPH
+ {0xB546, 0x7914}, //8481 #CJK UNIFIED IDEOGRAPH
+ {0xB547, 0x7915}, //8482 #CJK UNIFIED IDEOGRAPH
+ {0xB548, 0x7916}, //8483 #CJK UNIFIED IDEOGRAPH
+ {0xB549, 0x7917}, //8484 #CJK UNIFIED IDEOGRAPH
+ {0xB54A, 0x7918}, //8485 #CJK UNIFIED IDEOGRAPH
+ {0xB54B, 0x7919}, //8486 #CJK UNIFIED IDEOGRAPH
+ {0xB54C, 0x791A}, //8487 #CJK UNIFIED IDEOGRAPH
+ {0xB54D, 0x791B}, //8488 #CJK UNIFIED IDEOGRAPH
+ {0xB54E, 0x791C}, //8489 #CJK UNIFIED IDEOGRAPH
+ {0xB54F, 0x791D}, //8490 #CJK UNIFIED IDEOGRAPH
+ {0xB550, 0x791F}, //8491 #CJK UNIFIED IDEOGRAPH
+ {0xB551, 0x7920}, //8492 #CJK UNIFIED IDEOGRAPH
+ {0xB552, 0x7921}, //8493 #CJK UNIFIED IDEOGRAPH
+ {0xB553, 0x7922}, //8494 #CJK UNIFIED IDEOGRAPH
+ {0xB554, 0x7923}, //8495 #CJK UNIFIED IDEOGRAPH
+ {0xB555, 0x7925}, //8496 #CJK UNIFIED IDEOGRAPH
+ {0xB556, 0x7926}, //8497 #CJK UNIFIED IDEOGRAPH
+ {0xB557, 0x7927}, //8498 #CJK UNIFIED IDEOGRAPH
+ {0xB558, 0x7928}, //8499 #CJK UNIFIED IDEOGRAPH
+ {0xB559, 0x7929}, //8500 #CJK UNIFIED IDEOGRAPH
+ {0xB55A, 0x792A}, //8501 #CJK UNIFIED IDEOGRAPH
+ {0xB55B, 0x792B}, //8502 #CJK UNIFIED IDEOGRAPH
+ {0xB55C, 0x792C}, //8503 #CJK UNIFIED IDEOGRAPH
+ {0xB55D, 0x792D}, //8504 #CJK UNIFIED IDEOGRAPH
+ {0xB55E, 0x792E}, //8505 #CJK UNIFIED IDEOGRAPH
+ {0xB55F, 0x792F}, //8506 #CJK UNIFIED IDEOGRAPH
+ {0xB560, 0x7930}, //8507 #CJK UNIFIED IDEOGRAPH
+ {0xB561, 0x7931}, //8508 #CJK UNIFIED IDEOGRAPH
+ {0xB562, 0x7932}, //8509 #CJK UNIFIED IDEOGRAPH
+ {0xB563, 0x7933}, //8510 #CJK UNIFIED IDEOGRAPH
+ {0xB564, 0x7935}, //8511 #CJK UNIFIED IDEOGRAPH
+ {0xB565, 0x7936}, //8512 #CJK UNIFIED IDEOGRAPH
+ {0xB566, 0x7937}, //8513 #CJK UNIFIED IDEOGRAPH
+ {0xB567, 0x7938}, //8514 #CJK UNIFIED IDEOGRAPH
+ {0xB568, 0x7939}, //8515 #CJK UNIFIED IDEOGRAPH
+ {0xB569, 0x793D}, //8516 #CJK UNIFIED IDEOGRAPH
+ {0xB56A, 0x793F}, //8517 #CJK UNIFIED IDEOGRAPH
+ {0xB56B, 0x7942}, //8518 #CJK UNIFIED IDEOGRAPH
+ {0xB56C, 0x7943}, //8519 #CJK UNIFIED IDEOGRAPH
+ {0xB56D, 0x7944}, //8520 #CJK UNIFIED IDEOGRAPH
+ {0xB56E, 0x7945}, //8521 #CJK UNIFIED IDEOGRAPH
+ {0xB56F, 0x7947}, //8522 #CJK UNIFIED IDEOGRAPH
+ {0xB570, 0x794A}, //8523 #CJK UNIFIED IDEOGRAPH
+ {0xB571, 0x794B}, //8524 #CJK UNIFIED IDEOGRAPH
+ {0xB572, 0x794C}, //8525 #CJK UNIFIED IDEOGRAPH
+ {0xB573, 0x794D}, //8526 #CJK UNIFIED IDEOGRAPH
+ {0xB574, 0x794E}, //8527 #CJK UNIFIED IDEOGRAPH
+ {0xB575, 0x794F}, //8528 #CJK UNIFIED IDEOGRAPH
+ {0xB576, 0x7950}, //8529 #CJK UNIFIED IDEOGRAPH
+ {0xB577, 0x7951}, //8530 #CJK UNIFIED IDEOGRAPH
+ {0xB578, 0x7952}, //8531 #CJK UNIFIED IDEOGRAPH
+ {0xB579, 0x7954}, //8532 #CJK UNIFIED IDEOGRAPH
+ {0xB57A, 0x7955}, //8533 #CJK UNIFIED IDEOGRAPH
+ {0xB57B, 0x7958}, //8534 #CJK UNIFIED IDEOGRAPH
+ {0xB57C, 0x7959}, //8535 #CJK UNIFIED IDEOGRAPH
+ {0xB57D, 0x7961}, //8536 #CJK UNIFIED IDEOGRAPH
+ {0xB57E, 0x7963}, //8537 #CJK UNIFIED IDEOGRAPH
+ {0xB580, 0x7964}, //8538 #CJK UNIFIED IDEOGRAPH
+ {0xB581, 0x7966}, //8539 #CJK UNIFIED IDEOGRAPH
+ {0xB582, 0x7969}, //8540 #CJK UNIFIED IDEOGRAPH
+ {0xB583, 0x796A}, //8541 #CJK UNIFIED IDEOGRAPH
+ {0xB584, 0x796B}, //8542 #CJK UNIFIED IDEOGRAPH
+ {0xB585, 0x796C}, //8543 #CJK UNIFIED IDEOGRAPH
+ {0xB586, 0x796E}, //8544 #CJK UNIFIED IDEOGRAPH
+ {0xB587, 0x7970}, //8545 #CJK UNIFIED IDEOGRAPH
+ {0xB588, 0x7971}, //8546 #CJK UNIFIED IDEOGRAPH
+ {0xB589, 0x7972}, //8547 #CJK UNIFIED IDEOGRAPH
+ {0xB58A, 0x7973}, //8548 #CJK UNIFIED IDEOGRAPH
+ {0xB58B, 0x7974}, //8549 #CJK UNIFIED IDEOGRAPH
+ {0xB58C, 0x7975}, //8550 #CJK UNIFIED IDEOGRAPH
+ {0xB58D, 0x7976}, //8551 #CJK UNIFIED IDEOGRAPH
+ {0xB58E, 0x7979}, //8552 #CJK UNIFIED IDEOGRAPH
+ {0xB58F, 0x797B}, //8553 #CJK UNIFIED IDEOGRAPH
+ {0xB590, 0x797C}, //8554 #CJK UNIFIED IDEOGRAPH
+ {0xB591, 0x797D}, //8555 #CJK UNIFIED IDEOGRAPH
+ {0xB592, 0x797E}, //8556 #CJK UNIFIED IDEOGRAPH
+ {0xB593, 0x797F}, //8557 #CJK UNIFIED IDEOGRAPH
+ {0xB594, 0x7982}, //8558 #CJK UNIFIED IDEOGRAPH
+ {0xB595, 0x7983}, //8559 #CJK UNIFIED IDEOGRAPH
+ {0xB596, 0x7986}, //8560 #CJK UNIFIED IDEOGRAPH
+ {0xB597, 0x7987}, //8561 #CJK UNIFIED IDEOGRAPH
+ {0xB598, 0x7988}, //8562 #CJK UNIFIED IDEOGRAPH
+ {0xB599, 0x7989}, //8563 #CJK UNIFIED IDEOGRAPH
+ {0xB59A, 0x798B}, //8564 #CJK UNIFIED IDEOGRAPH
+ {0xB59B, 0x798C}, //8565 #CJK UNIFIED IDEOGRAPH
+ {0xB59C, 0x798D}, //8566 #CJK UNIFIED IDEOGRAPH
+ {0xB59D, 0x798E}, //8567 #CJK UNIFIED IDEOGRAPH
+ {0xB59E, 0x7990}, //8568 #CJK UNIFIED IDEOGRAPH
+ {0xB59F, 0x7991}, //8569 #CJK UNIFIED IDEOGRAPH
+ {0xB5A0, 0x7992}, //8570 #CJK UNIFIED IDEOGRAPH
+ {0xB5A1, 0x6020}, //8571 #CJK UNIFIED IDEOGRAPH
+ {0xB5A2, 0x803D}, //8572 #CJK UNIFIED IDEOGRAPH
+ {0xB5A3, 0x62C5}, //8573 #CJK UNIFIED IDEOGRAPH
+ {0xB5A4, 0x4E39}, //8574 #CJK UNIFIED IDEOGRAPH
+ {0xB5A5, 0x5355}, //8575 #CJK UNIFIED IDEOGRAPH
+ {0xB5A6, 0x90F8}, //8576 #CJK UNIFIED IDEOGRAPH
+ {0xB5A7, 0x63B8}, //8577 #CJK UNIFIED IDEOGRAPH
+ {0xB5A8, 0x80C6}, //8578 #CJK UNIFIED IDEOGRAPH
+ {0xB5A9, 0x65E6}, //8579 #CJK UNIFIED IDEOGRAPH
+ {0xB5AA, 0x6C2E}, //8580 #CJK UNIFIED IDEOGRAPH
+ {0xB5AB, 0x4F46}, //8581 #CJK UNIFIED IDEOGRAPH
+ {0xB5AC, 0x60EE}, //8582 #CJK UNIFIED IDEOGRAPH
+ {0xB5AD, 0x6DE1}, //8583 #CJK UNIFIED IDEOGRAPH
+ {0xB5AE, 0x8BDE}, //8584 #CJK UNIFIED IDEOGRAPH
+ {0xB5AF, 0x5F39}, //8585 #CJK UNIFIED IDEOGRAPH
+ {0xB5B0, 0x86CB}, //8586 #CJK UNIFIED IDEOGRAPH
+ {0xB5B1, 0x5F53}, //8587 #CJK UNIFIED IDEOGRAPH
+ {0xB5B2, 0x6321}, //8588 #CJK UNIFIED IDEOGRAPH
+ {0xB5B3, 0x515A}, //8589 #CJK UNIFIED IDEOGRAPH
+ {0xB5B4, 0x8361}, //8590 #CJK UNIFIED IDEOGRAPH
+ {0xB5B5, 0x6863}, //8591 #CJK UNIFIED IDEOGRAPH
+ {0xB5B6, 0x5200}, //8592 #CJK UNIFIED IDEOGRAPH
+ {0xB5B7, 0x6363}, //8593 #CJK UNIFIED IDEOGRAPH
+ {0xB5B8, 0x8E48}, //8594 #CJK UNIFIED IDEOGRAPH
+ {0xB5B9, 0x5012}, //8595 #CJK UNIFIED IDEOGRAPH
+ {0xB5BA, 0x5C9B}, //8596 #CJK UNIFIED IDEOGRAPH
+ {0xB5BB, 0x7977}, //8597 #CJK UNIFIED IDEOGRAPH
+ {0xB5BC, 0x5BFC}, //8598 #CJK UNIFIED IDEOGRAPH
+ {0xB5BD, 0x5230}, //8599 #CJK UNIFIED IDEOGRAPH
+ {0xB5BE, 0x7A3B}, //8600 #CJK UNIFIED IDEOGRAPH
+ {0xB5BF, 0x60BC}, //8601 #CJK UNIFIED IDEOGRAPH
+ {0xB5C0, 0x9053}, //8602 #CJK UNIFIED IDEOGRAPH
+ {0xB5C1, 0x76D7}, //8603 #CJK UNIFIED IDEOGRAPH
+ {0xB5C2, 0x5FB7}, //8604 #CJK UNIFIED IDEOGRAPH
+ {0xB5C3, 0x5F97}, //8605 #CJK UNIFIED IDEOGRAPH
+ {0xB5C4, 0x7684}, //8606 #CJK UNIFIED IDEOGRAPH
+ {0xB5C5, 0x8E6C}, //8607 #CJK UNIFIED IDEOGRAPH
+ {0xB5C6, 0x706F}, //8608 #CJK UNIFIED IDEOGRAPH
+ {0xB5C7, 0x767B}, //8609 #CJK UNIFIED IDEOGRAPH
+ {0xB5C8, 0x7B49}, //8610 #CJK UNIFIED IDEOGRAPH
+ {0xB5C9, 0x77AA}, //8611 #CJK UNIFIED IDEOGRAPH
+ {0xB5CA, 0x51F3}, //8612 #CJK UNIFIED IDEOGRAPH
+ {0xB5CB, 0x9093}, //8613 #CJK UNIFIED IDEOGRAPH
+ {0xB5CC, 0x5824}, //8614 #CJK UNIFIED IDEOGRAPH
+ {0xB5CD, 0x4F4E}, //8615 #CJK UNIFIED IDEOGRAPH
+ {0xB5CE, 0x6EF4}, //8616 #CJK UNIFIED IDEOGRAPH
+ {0xB5CF, 0x8FEA}, //8617 #CJK UNIFIED IDEOGRAPH
+ {0xB5D0, 0x654C}, //8618 #CJK UNIFIED IDEOGRAPH
+ {0xB5D1, 0x7B1B}, //8619 #CJK UNIFIED IDEOGRAPH
+ {0xB5D2, 0x72C4}, //8620 #CJK UNIFIED IDEOGRAPH
+ {0xB5D3, 0x6DA4}, //8621 #CJK UNIFIED IDEOGRAPH
+ {0xB5D4, 0x7FDF}, //8622 #CJK UNIFIED IDEOGRAPH
+ {0xB5D5, 0x5AE1}, //8623 #CJK UNIFIED IDEOGRAPH
+ {0xB5D6, 0x62B5}, //8624 #CJK UNIFIED IDEOGRAPH
+ {0xB5D7, 0x5E95}, //8625 #CJK UNIFIED IDEOGRAPH
+ {0xB5D8, 0x5730}, //8626 #CJK UNIFIED IDEOGRAPH
+ {0xB5D9, 0x8482}, //8627 #CJK UNIFIED IDEOGRAPH
+ {0xB5DA, 0x7B2C}, //8628 #CJK UNIFIED IDEOGRAPH
+ {0xB5DB, 0x5E1D}, //8629 #CJK UNIFIED IDEOGRAPH
+ {0xB5DC, 0x5F1F}, //8630 #CJK UNIFIED IDEOGRAPH
+ {0xB5DD, 0x9012}, //8631 #CJK UNIFIED IDEOGRAPH
+ {0xB5DE, 0x7F14}, //8632 #CJK UNIFIED IDEOGRAPH
+ {0xB5DF, 0x98A0}, //8633 #CJK UNIFIED IDEOGRAPH
+ {0xB5E0, 0x6382}, //8634 #CJK UNIFIED IDEOGRAPH
+ {0xB5E1, 0x6EC7}, //8635 #CJK UNIFIED IDEOGRAPH
+ {0xB5E2, 0x7898}, //8636 #CJK UNIFIED IDEOGRAPH
+ {0xB5E3, 0x70B9}, //8637 #CJK UNIFIED IDEOGRAPH
+ {0xB5E4, 0x5178}, //8638 #CJK UNIFIED IDEOGRAPH
+ {0xB5E5, 0x975B}, //8639 #CJK UNIFIED IDEOGRAPH
+ {0xB5E6, 0x57AB}, //8640 #CJK UNIFIED IDEOGRAPH
+ {0xB5E7, 0x7535}, //8641 #CJK UNIFIED IDEOGRAPH
+ {0xB5E8, 0x4F43}, //8642 #CJK UNIFIED IDEOGRAPH
+ {0xB5E9, 0x7538}, //8643 #CJK UNIFIED IDEOGRAPH
+ {0xB5EA, 0x5E97}, //8644 #CJK UNIFIED IDEOGRAPH
+ {0xB5EB, 0x60E6}, //8645 #CJK UNIFIED IDEOGRAPH
+ {0xB5EC, 0x5960}, //8646 #CJK UNIFIED IDEOGRAPH
+ {0xB5ED, 0x6DC0}, //8647 #CJK UNIFIED IDEOGRAPH
+ {0xB5EE, 0x6BBF}, //8648 #CJK UNIFIED IDEOGRAPH
+ {0xB5EF, 0x7889}, //8649 #CJK UNIFIED IDEOGRAPH
+ {0xB5F0, 0x53FC}, //8650 #CJK UNIFIED IDEOGRAPH
+ {0xB5F1, 0x96D5}, //8651 #CJK UNIFIED IDEOGRAPH
+ {0xB5F2, 0x51CB}, //8652 #CJK UNIFIED IDEOGRAPH
+ {0xB5F3, 0x5201}, //8653 #CJK UNIFIED IDEOGRAPH
+ {0xB5F4, 0x6389}, //8654 #CJK UNIFIED IDEOGRAPH
+ {0xB5F5, 0x540A}, //8655 #CJK UNIFIED IDEOGRAPH
+ {0xB5F6, 0x9493}, //8656 #CJK UNIFIED IDEOGRAPH
+ {0xB5F7, 0x8C03}, //8657 #CJK UNIFIED IDEOGRAPH
+ {0xB5F8, 0x8DCC}, //8658 #CJK UNIFIED IDEOGRAPH
+ {0xB5F9, 0x7239}, //8659 #CJK UNIFIED IDEOGRAPH
+ {0xB5FA, 0x789F}, //8660 #CJK UNIFIED IDEOGRAPH
+ {0xB5FB, 0x8776}, //8661 #CJK UNIFIED IDEOGRAPH
+ {0xB5FC, 0x8FED}, //8662 #CJK UNIFIED IDEOGRAPH
+ {0xB5FD, 0x8C0D}, //8663 #CJK UNIFIED IDEOGRAPH
+ {0xB5FE, 0x53E0}, //8664 #CJK UNIFIED IDEOGRAPH
+ {0xB640, 0x7993}, //8665 #CJK UNIFIED IDEOGRAPH
+ {0xB641, 0x7994}, //8666 #CJK UNIFIED IDEOGRAPH
+ {0xB642, 0x7995}, //8667 #CJK UNIFIED IDEOGRAPH
+ {0xB643, 0x7996}, //8668 #CJK UNIFIED IDEOGRAPH
+ {0xB644, 0x7997}, //8669 #CJK UNIFIED IDEOGRAPH
+ {0xB645, 0x7998}, //8670 #CJK UNIFIED IDEOGRAPH
+ {0xB646, 0x7999}, //8671 #CJK UNIFIED IDEOGRAPH
+ {0xB647, 0x799B}, //8672 #CJK UNIFIED IDEOGRAPH
+ {0xB648, 0x799C}, //8673 #CJK UNIFIED IDEOGRAPH
+ {0xB649, 0x799D}, //8674 #CJK UNIFIED IDEOGRAPH
+ {0xB64A, 0x799E}, //8675 #CJK UNIFIED IDEOGRAPH
+ {0xB64B, 0x799F}, //8676 #CJK UNIFIED IDEOGRAPH
+ {0xB64C, 0x79A0}, //8677 #CJK UNIFIED IDEOGRAPH
+ {0xB64D, 0x79A1}, //8678 #CJK UNIFIED IDEOGRAPH
+ {0xB64E, 0x79A2}, //8679 #CJK UNIFIED IDEOGRAPH
+ {0xB64F, 0x79A3}, //8680 #CJK UNIFIED IDEOGRAPH
+ {0xB650, 0x79A4}, //8681 #CJK UNIFIED IDEOGRAPH
+ {0xB651, 0x79A5}, //8682 #CJK UNIFIED IDEOGRAPH
+ {0xB652, 0x79A6}, //8683 #CJK UNIFIED IDEOGRAPH
+ {0xB653, 0x79A8}, //8684 #CJK UNIFIED IDEOGRAPH
+ {0xB654, 0x79A9}, //8685 #CJK UNIFIED IDEOGRAPH
+ {0xB655, 0x79AA}, //8686 #CJK UNIFIED IDEOGRAPH
+ {0xB656, 0x79AB}, //8687 #CJK UNIFIED IDEOGRAPH
+ {0xB657, 0x79AC}, //8688 #CJK UNIFIED IDEOGRAPH
+ {0xB658, 0x79AD}, //8689 #CJK UNIFIED IDEOGRAPH
+ {0xB659, 0x79AE}, //8690 #CJK UNIFIED IDEOGRAPH
+ {0xB65A, 0x79AF}, //8691 #CJK UNIFIED IDEOGRAPH
+ {0xB65B, 0x79B0}, //8692 #CJK UNIFIED IDEOGRAPH
+ {0xB65C, 0x79B1}, //8693 #CJK UNIFIED IDEOGRAPH
+ {0xB65D, 0x79B2}, //8694 #CJK UNIFIED IDEOGRAPH
+ {0xB65E, 0x79B4}, //8695 #CJK UNIFIED IDEOGRAPH
+ {0xB65F, 0x79B5}, //8696 #CJK UNIFIED IDEOGRAPH
+ {0xB660, 0x79B6}, //8697 #CJK UNIFIED IDEOGRAPH
+ {0xB661, 0x79B7}, //8698 #CJK UNIFIED IDEOGRAPH
+ {0xB662, 0x79B8}, //8699 #CJK UNIFIED IDEOGRAPH
+ {0xB663, 0x79BC}, //8700 #CJK UNIFIED IDEOGRAPH
+ {0xB664, 0x79BF}, //8701 #CJK UNIFIED IDEOGRAPH
+ {0xB665, 0x79C2}, //8702 #CJK UNIFIED IDEOGRAPH
+ {0xB666, 0x79C4}, //8703 #CJK UNIFIED IDEOGRAPH
+ {0xB667, 0x79C5}, //8704 #CJK UNIFIED IDEOGRAPH
+ {0xB668, 0x79C7}, //8705 #CJK UNIFIED IDEOGRAPH
+ {0xB669, 0x79C8}, //8706 #CJK UNIFIED IDEOGRAPH
+ {0xB66A, 0x79CA}, //8707 #CJK UNIFIED IDEOGRAPH
+ {0xB66B, 0x79CC}, //8708 #CJK UNIFIED IDEOGRAPH
+ {0xB66C, 0x79CE}, //8709 #CJK UNIFIED IDEOGRAPH
+ {0xB66D, 0x79CF}, //8710 #CJK UNIFIED IDEOGRAPH
+ {0xB66E, 0x79D0}, //8711 #CJK UNIFIED IDEOGRAPH
+ {0xB66F, 0x79D3}, //8712 #CJK UNIFIED IDEOGRAPH
+ {0xB670, 0x79D4}, //8713 #CJK UNIFIED IDEOGRAPH
+ {0xB671, 0x79D6}, //8714 #CJK UNIFIED IDEOGRAPH
+ {0xB672, 0x79D7}, //8715 #CJK UNIFIED IDEOGRAPH
+ {0xB673, 0x79D9}, //8716 #CJK UNIFIED IDEOGRAPH
+ {0xB674, 0x79DA}, //8717 #CJK UNIFIED IDEOGRAPH
+ {0xB675, 0x79DB}, //8718 #CJK UNIFIED IDEOGRAPH
+ {0xB676, 0x79DC}, //8719 #CJK UNIFIED IDEOGRAPH
+ {0xB677, 0x79DD}, //8720 #CJK UNIFIED IDEOGRAPH
+ {0xB678, 0x79DE}, //8721 #CJK UNIFIED IDEOGRAPH
+ {0xB679, 0x79E0}, //8722 #CJK UNIFIED IDEOGRAPH
+ {0xB67A, 0x79E1}, //8723 #CJK UNIFIED IDEOGRAPH
+ {0xB67B, 0x79E2}, //8724 #CJK UNIFIED IDEOGRAPH
+ {0xB67C, 0x79E5}, //8725 #CJK UNIFIED IDEOGRAPH
+ {0xB67D, 0x79E8}, //8726 #CJK UNIFIED IDEOGRAPH
+ {0xB67E, 0x79EA}, //8727 #CJK UNIFIED IDEOGRAPH
+ {0xB680, 0x79EC}, //8728 #CJK UNIFIED IDEOGRAPH
+ {0xB681, 0x79EE}, //8729 #CJK UNIFIED IDEOGRAPH
+ {0xB682, 0x79F1}, //8730 #CJK UNIFIED IDEOGRAPH
+ {0xB683, 0x79F2}, //8731 #CJK UNIFIED IDEOGRAPH
+ {0xB684, 0x79F3}, //8732 #CJK UNIFIED IDEOGRAPH
+ {0xB685, 0x79F4}, //8733 #CJK UNIFIED IDEOGRAPH
+ {0xB686, 0x79F5}, //8734 #CJK UNIFIED IDEOGRAPH
+ {0xB687, 0x79F6}, //8735 #CJK UNIFIED IDEOGRAPH
+ {0xB688, 0x79F7}, //8736 #CJK UNIFIED IDEOGRAPH
+ {0xB689, 0x79F9}, //8737 #CJK UNIFIED IDEOGRAPH
+ {0xB68A, 0x79FA}, //8738 #CJK UNIFIED IDEOGRAPH
+ {0xB68B, 0x79FC}, //8739 #CJK UNIFIED IDEOGRAPH
+ {0xB68C, 0x79FE}, //8740 #CJK UNIFIED IDEOGRAPH
+ {0xB68D, 0x79FF}, //8741 #CJK UNIFIED IDEOGRAPH
+ {0xB68E, 0x7A01}, //8742 #CJK UNIFIED IDEOGRAPH
+ {0xB68F, 0x7A04}, //8743 #CJK UNIFIED IDEOGRAPH
+ {0xB690, 0x7A05}, //8744 #CJK UNIFIED IDEOGRAPH
+ {0xB691, 0x7A07}, //8745 #CJK UNIFIED IDEOGRAPH
+ {0xB692, 0x7A08}, //8746 #CJK UNIFIED IDEOGRAPH
+ {0xB693, 0x7A09}, //8747 #CJK UNIFIED IDEOGRAPH
+ {0xB694, 0x7A0A}, //8748 #CJK UNIFIED IDEOGRAPH
+ {0xB695, 0x7A0C}, //8749 #CJK UNIFIED IDEOGRAPH
+ {0xB696, 0x7A0F}, //8750 #CJK UNIFIED IDEOGRAPH
+ {0xB697, 0x7A10}, //8751 #CJK UNIFIED IDEOGRAPH
+ {0xB698, 0x7A11}, //8752 #CJK UNIFIED IDEOGRAPH
+ {0xB699, 0x7A12}, //8753 #CJK UNIFIED IDEOGRAPH
+ {0xB69A, 0x7A13}, //8754 #CJK UNIFIED IDEOGRAPH
+ {0xB69B, 0x7A15}, //8755 #CJK UNIFIED IDEOGRAPH
+ {0xB69C, 0x7A16}, //8756 #CJK UNIFIED IDEOGRAPH
+ {0xB69D, 0x7A18}, //8757 #CJK UNIFIED IDEOGRAPH
+ {0xB69E, 0x7A19}, //8758 #CJK UNIFIED IDEOGRAPH
+ {0xB69F, 0x7A1B}, //8759 #CJK UNIFIED IDEOGRAPH
+ {0xB6A0, 0x7A1C}, //8760 #CJK UNIFIED IDEOGRAPH
+ {0xB6A1, 0x4E01}, //8761 #CJK UNIFIED IDEOGRAPH
+ {0xB6A2, 0x76EF}, //8762 #CJK UNIFIED IDEOGRAPH
+ {0xB6A3, 0x53EE}, //8763 #CJK UNIFIED IDEOGRAPH
+ {0xB6A4, 0x9489}, //8764 #CJK UNIFIED IDEOGRAPH
+ {0xB6A5, 0x9876}, //8765 #CJK UNIFIED IDEOGRAPH
+ {0xB6A6, 0x9F0E}, //8766 #CJK UNIFIED IDEOGRAPH
+ {0xB6A7, 0x952D}, //8767 #CJK UNIFIED IDEOGRAPH
+ {0xB6A8, 0x5B9A}, //8768 #CJK UNIFIED IDEOGRAPH
+ {0xB6A9, 0x8BA2}, //8769 #CJK UNIFIED IDEOGRAPH
+ {0xB6AA, 0x4E22}, //8770 #CJK UNIFIED IDEOGRAPH
+ {0xB6AB, 0x4E1C}, //8771 #CJK UNIFIED IDEOGRAPH
+ {0xB6AC, 0x51AC}, //8772 #CJK UNIFIED IDEOGRAPH
+ {0xB6AD, 0x8463}, //8773 #CJK UNIFIED IDEOGRAPH
+ {0xB6AE, 0x61C2}, //8774 #CJK UNIFIED IDEOGRAPH
+ {0xB6AF, 0x52A8}, //8775 #CJK UNIFIED IDEOGRAPH
+ {0xB6B0, 0x680B}, //8776 #CJK UNIFIED IDEOGRAPH
+ {0xB6B1, 0x4F97}, //8777 #CJK UNIFIED IDEOGRAPH
+ {0xB6B2, 0x606B}, //8778 #CJK UNIFIED IDEOGRAPH
+ {0xB6B3, 0x51BB}, //8779 #CJK UNIFIED IDEOGRAPH
+ {0xB6B4, 0x6D1E}, //8780 #CJK UNIFIED IDEOGRAPH
+ {0xB6B5, 0x515C}, //8781 #CJK UNIFIED IDEOGRAPH
+ {0xB6B6, 0x6296}, //8782 #CJK UNIFIED IDEOGRAPH
+ {0xB6B7, 0x6597}, //8783 #CJK UNIFIED IDEOGRAPH
+ {0xB6B8, 0x9661}, //8784 #CJK UNIFIED IDEOGRAPH
+ {0xB6B9, 0x8C46}, //8785 #CJK UNIFIED IDEOGRAPH
+ {0xB6BA, 0x9017}, //8786 #CJK UNIFIED IDEOGRAPH
+ {0xB6BB, 0x75D8}, //8787 #CJK UNIFIED IDEOGRAPH
+ {0xB6BC, 0x90FD}, //8788 #CJK UNIFIED IDEOGRAPH
+ {0xB6BD, 0x7763}, //8789 #CJK UNIFIED IDEOGRAPH
+ {0xB6BE, 0x6BD2}, //8790 #CJK UNIFIED IDEOGRAPH
+ {0xB6BF, 0x728A}, //8791 #CJK UNIFIED IDEOGRAPH
+ {0xB6C0, 0x72EC}, //8792 #CJK UNIFIED IDEOGRAPH
+ {0xB6C1, 0x8BFB}, //8793 #CJK UNIFIED IDEOGRAPH
+ {0xB6C2, 0x5835}, //8794 #CJK UNIFIED IDEOGRAPH
+ {0xB6C3, 0x7779}, //8795 #CJK UNIFIED IDEOGRAPH
+ {0xB6C4, 0x8D4C}, //8796 #CJK UNIFIED IDEOGRAPH
+ {0xB6C5, 0x675C}, //8797 #CJK UNIFIED IDEOGRAPH
+ {0xB6C6, 0x9540}, //8798 #CJK UNIFIED IDEOGRAPH
+ {0xB6C7, 0x809A}, //8799 #CJK UNIFIED IDEOGRAPH
+ {0xB6C8, 0x5EA6}, //8800 #CJK UNIFIED IDEOGRAPH
+ {0xB6C9, 0x6E21}, //8801 #CJK UNIFIED IDEOGRAPH
+ {0xB6CA, 0x5992}, //8802 #CJK UNIFIED IDEOGRAPH
+ {0xB6CB, 0x7AEF}, //8803 #CJK UNIFIED IDEOGRAPH
+ {0xB6CC, 0x77ED}, //8804 #CJK UNIFIED IDEOGRAPH
+ {0xB6CD, 0x953B}, //8805 #CJK UNIFIED IDEOGRAPH
+ {0xB6CE, 0x6BB5}, //8806 #CJK UNIFIED IDEOGRAPH
+ {0xB6CF, 0x65AD}, //8807 #CJK UNIFIED IDEOGRAPH
+ {0xB6D0, 0x7F0E}, //8808 #CJK UNIFIED IDEOGRAPH
+ {0xB6D1, 0x5806}, //8809 #CJK UNIFIED IDEOGRAPH
+ {0xB6D2, 0x5151}, //8810 #CJK UNIFIED IDEOGRAPH
+ {0xB6D3, 0x961F}, //8811 #CJK UNIFIED IDEOGRAPH
+ {0xB6D4, 0x5BF9}, //8812 #CJK UNIFIED IDEOGRAPH
+ {0xB6D5, 0x58A9}, //8813 #CJK UNIFIED IDEOGRAPH
+ {0xB6D6, 0x5428}, //8814 #CJK UNIFIED IDEOGRAPH
+ {0xB6D7, 0x8E72}, //8815 #CJK UNIFIED IDEOGRAPH
+ {0xB6D8, 0x6566}, //8816 #CJK UNIFIED IDEOGRAPH
+ {0xB6D9, 0x987F}, //8817 #CJK UNIFIED IDEOGRAPH
+ {0xB6DA, 0x56E4}, //8818 #CJK UNIFIED IDEOGRAPH
+ {0xB6DB, 0x949D}, //8819 #CJK UNIFIED IDEOGRAPH
+ {0xB6DC, 0x76FE}, //8820 #CJK UNIFIED IDEOGRAPH
+ {0xB6DD, 0x9041}, //8821 #CJK UNIFIED IDEOGRAPH
+ {0xB6DE, 0x6387}, //8822 #CJK UNIFIED IDEOGRAPH
+ {0xB6DF, 0x54C6}, //8823 #CJK UNIFIED IDEOGRAPH
+ {0xB6E0, 0x591A}, //8824 #CJK UNIFIED IDEOGRAPH
+ {0xB6E1, 0x593A}, //8825 #CJK UNIFIED IDEOGRAPH
+ {0xB6E2, 0x579B}, //8826 #CJK UNIFIED IDEOGRAPH
+ {0xB6E3, 0x8EB2}, //8827 #CJK UNIFIED IDEOGRAPH
+ {0xB6E4, 0x6735}, //8828 #CJK UNIFIED IDEOGRAPH
+ {0xB6E5, 0x8DFA}, //8829 #CJK UNIFIED IDEOGRAPH
+ {0xB6E6, 0x8235}, //8830 #CJK UNIFIED IDEOGRAPH
+ {0xB6E7, 0x5241}, //8831 #CJK UNIFIED IDEOGRAPH
+ {0xB6E8, 0x60F0}, //8832 #CJK UNIFIED IDEOGRAPH
+ {0xB6E9, 0x5815}, //8833 #CJK UNIFIED IDEOGRAPH
+ {0xB6EA, 0x86FE}, //8834 #CJK UNIFIED IDEOGRAPH
+ {0xB6EB, 0x5CE8}, //8835 #CJK UNIFIED IDEOGRAPH
+ {0xB6EC, 0x9E45}, //8836 #CJK UNIFIED IDEOGRAPH
+ {0xB6ED, 0x4FC4}, //8837 #CJK UNIFIED IDEOGRAPH
+ {0xB6EE, 0x989D}, //8838 #CJK UNIFIED IDEOGRAPH
+ {0xB6EF, 0x8BB9}, //8839 #CJK UNIFIED IDEOGRAPH
+ {0xB6F0, 0x5A25}, //8840 #CJK UNIFIED IDEOGRAPH
+ {0xB6F1, 0x6076}, //8841 #CJK UNIFIED IDEOGRAPH
+ {0xB6F2, 0x5384}, //8842 #CJK UNIFIED IDEOGRAPH
+ {0xB6F3, 0x627C}, //8843 #CJK UNIFIED IDEOGRAPH
+ {0xB6F4, 0x904F}, //8844 #CJK UNIFIED IDEOGRAPH
+ {0xB6F5, 0x9102}, //8845 #CJK UNIFIED IDEOGRAPH
+ {0xB6F6, 0x997F}, //8846 #CJK UNIFIED IDEOGRAPH
+ {0xB6F7, 0x6069}, //8847 #CJK UNIFIED IDEOGRAPH
+ {0xB6F8, 0x800C}, //8848 #CJK UNIFIED IDEOGRAPH
+ {0xB6F9, 0x513F}, //8849 #CJK UNIFIED IDEOGRAPH
+ {0xB6FA, 0x8033}, //8850 #CJK UNIFIED IDEOGRAPH
+ {0xB6FB, 0x5C14}, //8851 #CJK UNIFIED IDEOGRAPH
+ {0xB6FC, 0x9975}, //8852 #CJK UNIFIED IDEOGRAPH
+ {0xB6FD, 0x6D31}, //8853 #CJK UNIFIED IDEOGRAPH
+ {0xB6FE, 0x4E8C}, //8854 #CJK UNIFIED IDEOGRAPH
+ {0xB740, 0x7A1D}, //8855 #CJK UNIFIED IDEOGRAPH
+ {0xB741, 0x7A1F}, //8856 #CJK UNIFIED IDEOGRAPH
+ {0xB742, 0x7A21}, //8857 #CJK UNIFIED IDEOGRAPH
+ {0xB743, 0x7A22}, //8858 #CJK UNIFIED IDEOGRAPH
+ {0xB744, 0x7A24}, //8859 #CJK UNIFIED IDEOGRAPH
+ {0xB745, 0x7A25}, //8860 #CJK UNIFIED IDEOGRAPH
+ {0xB746, 0x7A26}, //8861 #CJK UNIFIED IDEOGRAPH
+ {0xB747, 0x7A27}, //8862 #CJK UNIFIED IDEOGRAPH
+ {0xB748, 0x7A28}, //8863 #CJK UNIFIED IDEOGRAPH
+ {0xB749, 0x7A29}, //8864 #CJK UNIFIED IDEOGRAPH
+ {0xB74A, 0x7A2A}, //8865 #CJK UNIFIED IDEOGRAPH
+ {0xB74B, 0x7A2B}, //8866 #CJK UNIFIED IDEOGRAPH
+ {0xB74C, 0x7A2C}, //8867 #CJK UNIFIED IDEOGRAPH
+ {0xB74D, 0x7A2D}, //8868 #CJK UNIFIED IDEOGRAPH
+ {0xB74E, 0x7A2E}, //8869 #CJK UNIFIED IDEOGRAPH
+ {0xB74F, 0x7A2F}, //8870 #CJK UNIFIED IDEOGRAPH
+ {0xB750, 0x7A30}, //8871 #CJK UNIFIED IDEOGRAPH
+ {0xB751, 0x7A31}, //8872 #CJK UNIFIED IDEOGRAPH
+ {0xB752, 0x7A32}, //8873 #CJK UNIFIED IDEOGRAPH
+ {0xB753, 0x7A34}, //8874 #CJK UNIFIED IDEOGRAPH
+ {0xB754, 0x7A35}, //8875 #CJK UNIFIED IDEOGRAPH
+ {0xB755, 0x7A36}, //8876 #CJK UNIFIED IDEOGRAPH
+ {0xB756, 0x7A38}, //8877 #CJK UNIFIED IDEOGRAPH
+ {0xB757, 0x7A3A}, //8878 #CJK UNIFIED IDEOGRAPH
+ {0xB758, 0x7A3E}, //8879 #CJK UNIFIED IDEOGRAPH
+ {0xB759, 0x7A40}, //8880 #CJK UNIFIED IDEOGRAPH
+ {0xB75A, 0x7A41}, //8881 #CJK UNIFIED IDEOGRAPH
+ {0xB75B, 0x7A42}, //8882 #CJK UNIFIED IDEOGRAPH
+ {0xB75C, 0x7A43}, //8883 #CJK UNIFIED IDEOGRAPH
+ {0xB75D, 0x7A44}, //8884 #CJK UNIFIED IDEOGRAPH
+ {0xB75E, 0x7A45}, //8885 #CJK UNIFIED IDEOGRAPH
+ {0xB75F, 0x7A47}, //8886 #CJK UNIFIED IDEOGRAPH
+ {0xB760, 0x7A48}, //8887 #CJK UNIFIED IDEOGRAPH
+ {0xB761, 0x7A49}, //8888 #CJK UNIFIED IDEOGRAPH
+ {0xB762, 0x7A4A}, //8889 #CJK UNIFIED IDEOGRAPH
+ {0xB763, 0x7A4B}, //8890 #CJK UNIFIED IDEOGRAPH
+ {0xB764, 0x7A4C}, //8891 #CJK UNIFIED IDEOGRAPH
+ {0xB765, 0x7A4D}, //8892 #CJK UNIFIED IDEOGRAPH
+ {0xB766, 0x7A4E}, //8893 #CJK UNIFIED IDEOGRAPH
+ {0xB767, 0x7A4F}, //8894 #CJK UNIFIED IDEOGRAPH
+ {0xB768, 0x7A50}, //8895 #CJK UNIFIED IDEOGRAPH
+ {0xB769, 0x7A52}, //8896 #CJK UNIFIED IDEOGRAPH
+ {0xB76A, 0x7A53}, //8897 #CJK UNIFIED IDEOGRAPH
+ {0xB76B, 0x7A54}, //8898 #CJK UNIFIED IDEOGRAPH
+ {0xB76C, 0x7A55}, //8899 #CJK UNIFIED IDEOGRAPH
+ {0xB76D, 0x7A56}, //8900 #CJK UNIFIED IDEOGRAPH
+ {0xB76E, 0x7A58}, //8901 #CJK UNIFIED IDEOGRAPH
+ {0xB76F, 0x7A59}, //8902 #CJK UNIFIED IDEOGRAPH
+ {0xB770, 0x7A5A}, //8903 #CJK UNIFIED IDEOGRAPH
+ {0xB771, 0x7A5B}, //8904 #CJK UNIFIED IDEOGRAPH
+ {0xB772, 0x7A5C}, //8905 #CJK UNIFIED IDEOGRAPH
+ {0xB773, 0x7A5D}, //8906 #CJK UNIFIED IDEOGRAPH
+ {0xB774, 0x7A5E}, //8907 #CJK UNIFIED IDEOGRAPH
+ {0xB775, 0x7A5F}, //8908 #CJK UNIFIED IDEOGRAPH
+ {0xB776, 0x7A60}, //8909 #CJK UNIFIED IDEOGRAPH
+ {0xB777, 0x7A61}, //8910 #CJK UNIFIED IDEOGRAPH
+ {0xB778, 0x7A62}, //8911 #CJK UNIFIED IDEOGRAPH
+ {0xB779, 0x7A63}, //8912 #CJK UNIFIED IDEOGRAPH
+ {0xB77A, 0x7A64}, //8913 #CJK UNIFIED IDEOGRAPH
+ {0xB77B, 0x7A65}, //8914 #CJK UNIFIED IDEOGRAPH
+ {0xB77C, 0x7A66}, //8915 #CJK UNIFIED IDEOGRAPH
+ {0xB77D, 0x7A67}, //8916 #CJK UNIFIED IDEOGRAPH
+ {0xB77E, 0x7A68}, //8917 #CJK UNIFIED IDEOGRAPH
+ {0xB780, 0x7A69}, //8918 #CJK UNIFIED IDEOGRAPH
+ {0xB781, 0x7A6A}, //8919 #CJK UNIFIED IDEOGRAPH
+ {0xB782, 0x7A6B}, //8920 #CJK UNIFIED IDEOGRAPH
+ {0xB783, 0x7A6C}, //8921 #CJK UNIFIED IDEOGRAPH
+ {0xB784, 0x7A6D}, //8922 #CJK UNIFIED IDEOGRAPH
+ {0xB785, 0x7A6E}, //8923 #CJK UNIFIED IDEOGRAPH
+ {0xB786, 0x7A6F}, //8924 #CJK UNIFIED IDEOGRAPH
+ {0xB787, 0x7A71}, //8925 #CJK UNIFIED IDEOGRAPH
+ {0xB788, 0x7A72}, //8926 #CJK UNIFIED IDEOGRAPH
+ {0xB789, 0x7A73}, //8927 #CJK UNIFIED IDEOGRAPH
+ {0xB78A, 0x7A75}, //8928 #CJK UNIFIED IDEOGRAPH
+ {0xB78B, 0x7A7B}, //8929 #CJK UNIFIED IDEOGRAPH
+ {0xB78C, 0x7A7C}, //8930 #CJK UNIFIED IDEOGRAPH
+ {0xB78D, 0x7A7D}, //8931 #CJK UNIFIED IDEOGRAPH
+ {0xB78E, 0x7A7E}, //8932 #CJK UNIFIED IDEOGRAPH
+ {0xB78F, 0x7A82}, //8933 #CJK UNIFIED IDEOGRAPH
+ {0xB790, 0x7A85}, //8934 #CJK UNIFIED IDEOGRAPH
+ {0xB791, 0x7A87}, //8935 #CJK UNIFIED IDEOGRAPH
+ {0xB792, 0x7A89}, //8936 #CJK UNIFIED IDEOGRAPH
+ {0xB793, 0x7A8A}, //8937 #CJK UNIFIED IDEOGRAPH
+ {0xB794, 0x7A8B}, //8938 #CJK UNIFIED IDEOGRAPH
+ {0xB795, 0x7A8C}, //8939 #CJK UNIFIED IDEOGRAPH
+ {0xB796, 0x7A8E}, //8940 #CJK UNIFIED IDEOGRAPH
+ {0xB797, 0x7A8F}, //8941 #CJK UNIFIED IDEOGRAPH
+ {0xB798, 0x7A90}, //8942 #CJK UNIFIED IDEOGRAPH
+ {0xB799, 0x7A93}, //8943 #CJK UNIFIED IDEOGRAPH
+ {0xB79A, 0x7A94}, //8944 #CJK UNIFIED IDEOGRAPH
+ {0xB79B, 0x7A99}, //8945 #CJK UNIFIED IDEOGRAPH
+ {0xB79C, 0x7A9A}, //8946 #CJK UNIFIED IDEOGRAPH
+ {0xB79D, 0x7A9B}, //8947 #CJK UNIFIED IDEOGRAPH
+ {0xB79E, 0x7A9E}, //8948 #CJK UNIFIED IDEOGRAPH
+ {0xB79F, 0x7AA1}, //8949 #CJK UNIFIED IDEOGRAPH
+ {0xB7A0, 0x7AA2}, //8950 #CJK UNIFIED IDEOGRAPH
+ {0xB7A1, 0x8D30}, //8951 #CJK UNIFIED IDEOGRAPH
+ {0xB7A2, 0x53D1}, //8952 #CJK UNIFIED IDEOGRAPH
+ {0xB7A3, 0x7F5A}, //8953 #CJK UNIFIED IDEOGRAPH
+ {0xB7A4, 0x7B4F}, //8954 #CJK UNIFIED IDEOGRAPH
+ {0xB7A5, 0x4F10}, //8955 #CJK UNIFIED IDEOGRAPH
+ {0xB7A6, 0x4E4F}, //8956 #CJK UNIFIED IDEOGRAPH
+ {0xB7A7, 0x9600}, //8957 #CJK UNIFIED IDEOGRAPH
+ {0xB7A8, 0x6CD5}, //8958 #CJK UNIFIED IDEOGRAPH
+ {0xB7A9, 0x73D0}, //8959 #CJK UNIFIED IDEOGRAPH
+ {0xB7AA, 0x85E9}, //8960 #CJK UNIFIED IDEOGRAPH
+ {0xB7AB, 0x5E06}, //8961 #CJK UNIFIED IDEOGRAPH
+ {0xB7AC, 0x756A}, //8962 #CJK UNIFIED IDEOGRAPH
+ {0xB7AD, 0x7FFB}, //8963 #CJK UNIFIED IDEOGRAPH
+ {0xB7AE, 0x6A0A}, //8964 #CJK UNIFIED IDEOGRAPH
+ {0xB7AF, 0x77FE}, //8965 #CJK UNIFIED IDEOGRAPH
+ {0xB7B0, 0x9492}, //8966 #CJK UNIFIED IDEOGRAPH
+ {0xB7B1, 0x7E41}, //8967 #CJK UNIFIED IDEOGRAPH
+ {0xB7B2, 0x51E1}, //8968 #CJK UNIFIED IDEOGRAPH
+ {0xB7B3, 0x70E6}, //8969 #CJK UNIFIED IDEOGRAPH
+ {0xB7B4, 0x53CD}, //8970 #CJK UNIFIED IDEOGRAPH
+ {0xB7B5, 0x8FD4}, //8971 #CJK UNIFIED IDEOGRAPH
+ {0xB7B6, 0x8303}, //8972 #CJK UNIFIED IDEOGRAPH
+ {0xB7B7, 0x8D29}, //8973 #CJK UNIFIED IDEOGRAPH
+ {0xB7B8, 0x72AF}, //8974 #CJK UNIFIED IDEOGRAPH
+ {0xB7B9, 0x996D}, //8975 #CJK UNIFIED IDEOGRAPH
+ {0xB7BA, 0x6CDB}, //8976 #CJK UNIFIED IDEOGRAPH
+ {0xB7BB, 0x574A}, //8977 #CJK UNIFIED IDEOGRAPH
+ {0xB7BC, 0x82B3}, //8978 #CJK UNIFIED IDEOGRAPH
+ {0xB7BD, 0x65B9}, //8979 #CJK UNIFIED IDEOGRAPH
+ {0xB7BE, 0x80AA}, //8980 #CJK UNIFIED IDEOGRAPH
+ {0xB7BF, 0x623F}, //8981 #CJK UNIFIED IDEOGRAPH
+ {0xB7C0, 0x9632}, //8982 #CJK UNIFIED IDEOGRAPH
+ {0xB7C1, 0x59A8}, //8983 #CJK UNIFIED IDEOGRAPH
+ {0xB7C2, 0x4EFF}, //8984 #CJK UNIFIED IDEOGRAPH
+ {0xB7C3, 0x8BBF}, //8985 #CJK UNIFIED IDEOGRAPH
+ {0xB7C4, 0x7EBA}, //8986 #CJK UNIFIED IDEOGRAPH
+ {0xB7C5, 0x653E}, //8987 #CJK UNIFIED IDEOGRAPH
+ {0xB7C6, 0x83F2}, //8988 #CJK UNIFIED IDEOGRAPH
+ {0xB7C7, 0x975E}, //8989 #CJK UNIFIED IDEOGRAPH
+ {0xB7C8, 0x5561}, //8990 #CJK UNIFIED IDEOGRAPH
+ {0xB7C9, 0x98DE}, //8991 #CJK UNIFIED IDEOGRAPH
+ {0xB7CA, 0x80A5}, //8992 #CJK UNIFIED IDEOGRAPH
+ {0xB7CB, 0x532A}, //8993 #CJK UNIFIED IDEOGRAPH
+ {0xB7CC, 0x8BFD}, //8994 #CJK UNIFIED IDEOGRAPH
+ {0xB7CD, 0x5420}, //8995 #CJK UNIFIED IDEOGRAPH
+ {0xB7CE, 0x80BA}, //8996 #CJK UNIFIED IDEOGRAPH
+ {0xB7CF, 0x5E9F}, //8997 #CJK UNIFIED IDEOGRAPH
+ {0xB7D0, 0x6CB8}, //8998 #CJK UNIFIED IDEOGRAPH
+ {0xB7D1, 0x8D39}, //8999 #CJK UNIFIED IDEOGRAPH
+ {0xB7D2, 0x82AC}, //9000 #CJK UNIFIED IDEOGRAPH
+ {0xB7D3, 0x915A}, //9001 #CJK UNIFIED IDEOGRAPH
+ {0xB7D4, 0x5429}, //9002 #CJK UNIFIED IDEOGRAPH
+ {0xB7D5, 0x6C1B}, //9003 #CJK UNIFIED IDEOGRAPH
+ {0xB7D6, 0x5206}, //9004 #CJK UNIFIED IDEOGRAPH
+ {0xB7D7, 0x7EB7}, //9005 #CJK UNIFIED IDEOGRAPH
+ {0xB7D8, 0x575F}, //9006 #CJK UNIFIED IDEOGRAPH
+ {0xB7D9, 0x711A}, //9007 #CJK UNIFIED IDEOGRAPH
+ {0xB7DA, 0x6C7E}, //9008 #CJK UNIFIED IDEOGRAPH
+ {0xB7DB, 0x7C89}, //9009 #CJK UNIFIED IDEOGRAPH
+ {0xB7DC, 0x594B}, //9010 #CJK UNIFIED IDEOGRAPH
+ {0xB7DD, 0x4EFD}, //9011 #CJK UNIFIED IDEOGRAPH
+ {0xB7DE, 0x5FFF}, //9012 #CJK UNIFIED IDEOGRAPH
+ {0xB7DF, 0x6124}, //9013 #CJK UNIFIED IDEOGRAPH
+ {0xB7E0, 0x7CAA}, //9014 #CJK UNIFIED IDEOGRAPH
+ {0xB7E1, 0x4E30}, //9015 #CJK UNIFIED IDEOGRAPH
+ {0xB7E2, 0x5C01}, //9016 #CJK UNIFIED IDEOGRAPH
+ {0xB7E3, 0x67AB}, //9017 #CJK UNIFIED IDEOGRAPH
+ {0xB7E4, 0x8702}, //9018 #CJK UNIFIED IDEOGRAPH
+ {0xB7E5, 0x5CF0}, //9019 #CJK UNIFIED IDEOGRAPH
+ {0xB7E6, 0x950B}, //9020 #CJK UNIFIED IDEOGRAPH
+ {0xB7E7, 0x98CE}, //9021 #CJK UNIFIED IDEOGRAPH
+ {0xB7E8, 0x75AF}, //9022 #CJK UNIFIED IDEOGRAPH
+ {0xB7E9, 0x70FD}, //9023 #CJK UNIFIED IDEOGRAPH
+ {0xB7EA, 0x9022}, //9024 #CJK UNIFIED IDEOGRAPH
+ {0xB7EB, 0x51AF}, //9025 #CJK UNIFIED IDEOGRAPH
+ {0xB7EC, 0x7F1D}, //9026 #CJK UNIFIED IDEOGRAPH
+ {0xB7ED, 0x8BBD}, //9027 #CJK UNIFIED IDEOGRAPH
+ {0xB7EE, 0x5949}, //9028 #CJK UNIFIED IDEOGRAPH
+ {0xB7EF, 0x51E4}, //9029 #CJK UNIFIED IDEOGRAPH
+ {0xB7F0, 0x4F5B}, //9030 #CJK UNIFIED IDEOGRAPH
+ {0xB7F1, 0x5426}, //9031 #CJK UNIFIED IDEOGRAPH
+ {0xB7F2, 0x592B}, //9032 #CJK UNIFIED IDEOGRAPH
+ {0xB7F3, 0x6577}, //9033 #CJK UNIFIED IDEOGRAPH
+ {0xB7F4, 0x80A4}, //9034 #CJK UNIFIED IDEOGRAPH
+ {0xB7F5, 0x5B75}, //9035 #CJK UNIFIED IDEOGRAPH
+ {0xB7F6, 0x6276}, //9036 #CJK UNIFIED IDEOGRAPH
+ {0xB7F7, 0x62C2}, //9037 #CJK UNIFIED IDEOGRAPH
+ {0xB7F8, 0x8F90}, //9038 #CJK UNIFIED IDEOGRAPH
+ {0xB7F9, 0x5E45}, //9039 #CJK UNIFIED IDEOGRAPH
+ {0xB7FA, 0x6C1F}, //9040 #CJK UNIFIED IDEOGRAPH
+ {0xB7FB, 0x7B26}, //9041 #CJK UNIFIED IDEOGRAPH
+ {0xB7FC, 0x4F0F}, //9042 #CJK UNIFIED IDEOGRAPH
+ {0xB7FD, 0x4FD8}, //9043 #CJK UNIFIED IDEOGRAPH
+ {0xB7FE, 0x670D}, //9044 #CJK UNIFIED IDEOGRAPH
+ {0xB840, 0x7AA3}, //9045 #CJK UNIFIED IDEOGRAPH
+ {0xB841, 0x7AA4}, //9046 #CJK UNIFIED IDEOGRAPH
+ {0xB842, 0x7AA7}, //9047 #CJK UNIFIED IDEOGRAPH
+ {0xB843, 0x7AA9}, //9048 #CJK UNIFIED IDEOGRAPH
+ {0xB844, 0x7AAA}, //9049 #CJK UNIFIED IDEOGRAPH
+ {0xB845, 0x7AAB}, //9050 #CJK UNIFIED IDEOGRAPH
+ {0xB846, 0x7AAE}, //9051 #CJK UNIFIED IDEOGRAPH
+ {0xB847, 0x7AAF}, //9052 #CJK UNIFIED IDEOGRAPH
+ {0xB848, 0x7AB0}, //9053 #CJK UNIFIED IDEOGRAPH
+ {0xB849, 0x7AB1}, //9054 #CJK UNIFIED IDEOGRAPH
+ {0xB84A, 0x7AB2}, //9055 #CJK UNIFIED IDEOGRAPH
+ {0xB84B, 0x7AB4}, //9056 #CJK UNIFIED IDEOGRAPH
+ {0xB84C, 0x7AB5}, //9057 #CJK UNIFIED IDEOGRAPH
+ {0xB84D, 0x7AB6}, //9058 #CJK UNIFIED IDEOGRAPH
+ {0xB84E, 0x7AB7}, //9059 #CJK UNIFIED IDEOGRAPH
+ {0xB84F, 0x7AB8}, //9060 #CJK UNIFIED IDEOGRAPH
+ {0xB850, 0x7AB9}, //9061 #CJK UNIFIED IDEOGRAPH
+ {0xB851, 0x7ABA}, //9062 #CJK UNIFIED IDEOGRAPH
+ {0xB852, 0x7ABB}, //9063 #CJK UNIFIED IDEOGRAPH
+ {0xB853, 0x7ABC}, //9064 #CJK UNIFIED IDEOGRAPH
+ {0xB854, 0x7ABD}, //9065 #CJK UNIFIED IDEOGRAPH
+ {0xB855, 0x7ABE}, //9066 #CJK UNIFIED IDEOGRAPH
+ {0xB856, 0x7AC0}, //9067 #CJK UNIFIED IDEOGRAPH
+ {0xB857, 0x7AC1}, //9068 #CJK UNIFIED IDEOGRAPH
+ {0xB858, 0x7AC2}, //9069 #CJK UNIFIED IDEOGRAPH
+ {0xB859, 0x7AC3}, //9070 #CJK UNIFIED IDEOGRAPH
+ {0xB85A, 0x7AC4}, //9071 #CJK UNIFIED IDEOGRAPH
+ {0xB85B, 0x7AC5}, //9072 #CJK UNIFIED IDEOGRAPH
+ {0xB85C, 0x7AC6}, //9073 #CJK UNIFIED IDEOGRAPH
+ {0xB85D, 0x7AC7}, //9074 #CJK UNIFIED IDEOGRAPH
+ {0xB85E, 0x7AC8}, //9075 #CJK UNIFIED IDEOGRAPH
+ {0xB85F, 0x7AC9}, //9076 #CJK UNIFIED IDEOGRAPH
+ {0xB860, 0x7ACA}, //9077 #CJK UNIFIED IDEOGRAPH
+ {0xB861, 0x7ACC}, //9078 #CJK UNIFIED IDEOGRAPH
+ {0xB862, 0x7ACD}, //9079 #CJK UNIFIED IDEOGRAPH
+ {0xB863, 0x7ACE}, //9080 #CJK UNIFIED IDEOGRAPH
+ {0xB864, 0x7ACF}, //9081 #CJK UNIFIED IDEOGRAPH
+ {0xB865, 0x7AD0}, //9082 #CJK UNIFIED IDEOGRAPH
+ {0xB866, 0x7AD1}, //9083 #CJK UNIFIED IDEOGRAPH
+ {0xB867, 0x7AD2}, //9084 #CJK UNIFIED IDEOGRAPH
+ {0xB868, 0x7AD3}, //9085 #CJK UNIFIED IDEOGRAPH
+ {0xB869, 0x7AD4}, //9086 #CJK UNIFIED IDEOGRAPH
+ {0xB86A, 0x7AD5}, //9087 #CJK UNIFIED IDEOGRAPH
+ {0xB86B, 0x7AD7}, //9088 #CJK UNIFIED IDEOGRAPH
+ {0xB86C, 0x7AD8}, //9089 #CJK UNIFIED IDEOGRAPH
+ {0xB86D, 0x7ADA}, //9090 #CJK UNIFIED IDEOGRAPH
+ {0xB86E, 0x7ADB}, //9091 #CJK UNIFIED IDEOGRAPH
+ {0xB86F, 0x7ADC}, //9092 #CJK UNIFIED IDEOGRAPH
+ {0xB870, 0x7ADD}, //9093 #CJK UNIFIED IDEOGRAPH
+ {0xB871, 0x7AE1}, //9094 #CJK UNIFIED IDEOGRAPH
+ {0xB872, 0x7AE2}, //9095 #CJK UNIFIED IDEOGRAPH
+ {0xB873, 0x7AE4}, //9096 #CJK UNIFIED IDEOGRAPH
+ {0xB874, 0x7AE7}, //9097 #CJK UNIFIED IDEOGRAPH
+ {0xB875, 0x7AE8}, //9098 #CJK UNIFIED IDEOGRAPH
+ {0xB876, 0x7AE9}, //9099 #CJK UNIFIED IDEOGRAPH
+ {0xB877, 0x7AEA}, //9100 #CJK UNIFIED IDEOGRAPH
+ {0xB878, 0x7AEB}, //9101 #CJK UNIFIED IDEOGRAPH
+ {0xB879, 0x7AEC}, //9102 #CJK UNIFIED IDEOGRAPH
+ {0xB87A, 0x7AEE}, //9103 #CJK UNIFIED IDEOGRAPH
+ {0xB87B, 0x7AF0}, //9104 #CJK UNIFIED IDEOGRAPH
+ {0xB87C, 0x7AF1}, //9105 #CJK UNIFIED IDEOGRAPH
+ {0xB87D, 0x7AF2}, //9106 #CJK UNIFIED IDEOGRAPH
+ {0xB87E, 0x7AF3}, //9107 #CJK UNIFIED IDEOGRAPH
+ {0xB880, 0x7AF4}, //9108 #CJK UNIFIED IDEOGRAPH
+ {0xB881, 0x7AF5}, //9109 #CJK UNIFIED IDEOGRAPH
+ {0xB882, 0x7AF6}, //9110 #CJK UNIFIED IDEOGRAPH
+ {0xB883, 0x7AF7}, //9111 #CJK UNIFIED IDEOGRAPH
+ {0xB884, 0x7AF8}, //9112 #CJK UNIFIED IDEOGRAPH
+ {0xB885, 0x7AFB}, //9113 #CJK UNIFIED IDEOGRAPH
+ {0xB886, 0x7AFC}, //9114 #CJK UNIFIED IDEOGRAPH
+ {0xB887, 0x7AFE}, //9115 #CJK UNIFIED IDEOGRAPH
+ {0xB888, 0x7B00}, //9116 #CJK UNIFIED IDEOGRAPH
+ {0xB889, 0x7B01}, //9117 #CJK UNIFIED IDEOGRAPH
+ {0xB88A, 0x7B02}, //9118 #CJK UNIFIED IDEOGRAPH
+ {0xB88B, 0x7B05}, //9119 #CJK UNIFIED IDEOGRAPH
+ {0xB88C, 0x7B07}, //9120 #CJK UNIFIED IDEOGRAPH
+ {0xB88D, 0x7B09}, //9121 #CJK UNIFIED IDEOGRAPH
+ {0xB88E, 0x7B0C}, //9122 #CJK UNIFIED IDEOGRAPH
+ {0xB88F, 0x7B0D}, //9123 #CJK UNIFIED IDEOGRAPH
+ {0xB890, 0x7B0E}, //9124 #CJK UNIFIED IDEOGRAPH
+ {0xB891, 0x7B10}, //9125 #CJK UNIFIED IDEOGRAPH
+ {0xB892, 0x7B12}, //9126 #CJK UNIFIED IDEOGRAPH
+ {0xB893, 0x7B13}, //9127 #CJK UNIFIED IDEOGRAPH
+ {0xB894, 0x7B16}, //9128 #CJK UNIFIED IDEOGRAPH
+ {0xB895, 0x7B17}, //9129 #CJK UNIFIED IDEOGRAPH
+ {0xB896, 0x7B18}, //9130 #CJK UNIFIED IDEOGRAPH
+ {0xB897, 0x7B1A}, //9131 #CJK UNIFIED IDEOGRAPH
+ {0xB898, 0x7B1C}, //9132 #CJK UNIFIED IDEOGRAPH
+ {0xB899, 0x7B1D}, //9133 #CJK UNIFIED IDEOGRAPH
+ {0xB89A, 0x7B1F}, //9134 #CJK UNIFIED IDEOGRAPH
+ {0xB89B, 0x7B21}, //9135 #CJK UNIFIED IDEOGRAPH
+ {0xB89C, 0x7B22}, //9136 #CJK UNIFIED IDEOGRAPH
+ {0xB89D, 0x7B23}, //9137 #CJK UNIFIED IDEOGRAPH
+ {0xB89E, 0x7B27}, //9138 #CJK UNIFIED IDEOGRAPH
+ {0xB89F, 0x7B29}, //9139 #CJK UNIFIED IDEOGRAPH
+ {0xB8A0, 0x7B2D}, //9140 #CJK UNIFIED IDEOGRAPH
+ {0xB8A1, 0x6D6E}, //9141 #CJK UNIFIED IDEOGRAPH
+ {0xB8A2, 0x6DAA}, //9142 #CJK UNIFIED IDEOGRAPH
+ {0xB8A3, 0x798F}, //9143 #CJK UNIFIED IDEOGRAPH
+ {0xB8A4, 0x88B1}, //9144 #CJK UNIFIED IDEOGRAPH
+ {0xB8A5, 0x5F17}, //9145 #CJK UNIFIED IDEOGRAPH
+ {0xB8A6, 0x752B}, //9146 #CJK UNIFIED IDEOGRAPH
+ {0xB8A7, 0x629A}, //9147 #CJK UNIFIED IDEOGRAPH
+ {0xB8A8, 0x8F85}, //9148 #CJK UNIFIED IDEOGRAPH
+ {0xB8A9, 0x4FEF}, //9149 #CJK UNIFIED IDEOGRAPH
+ {0xB8AA, 0x91DC}, //9150 #CJK UNIFIED IDEOGRAPH
+ {0xB8AB, 0x65A7}, //9151 #CJK UNIFIED IDEOGRAPH
+ {0xB8AC, 0x812F}, //9152 #CJK UNIFIED IDEOGRAPH
+ {0xB8AD, 0x8151}, //9153 #CJK UNIFIED IDEOGRAPH
+ {0xB8AE, 0x5E9C}, //9154 #CJK UNIFIED IDEOGRAPH
+ {0xB8AF, 0x8150}, //9155 #CJK UNIFIED IDEOGRAPH
+ {0xB8B0, 0x8D74}, //9156 #CJK UNIFIED IDEOGRAPH
+ {0xB8B1, 0x526F}, //9157 #CJK UNIFIED IDEOGRAPH
+ {0xB8B2, 0x8986}, //9158 #CJK UNIFIED IDEOGRAPH
+ {0xB8B3, 0x8D4B}, //9159 #CJK UNIFIED IDEOGRAPH
+ {0xB8B4, 0x590D}, //9160 #CJK UNIFIED IDEOGRAPH
+ {0xB8B5, 0x5085}, //9161 #CJK UNIFIED IDEOGRAPH
+ {0xB8B6, 0x4ED8}, //9162 #CJK UNIFIED IDEOGRAPH
+ {0xB8B7, 0x961C}, //9163 #CJK UNIFIED IDEOGRAPH
+ {0xB8B8, 0x7236}, //9164 #CJK UNIFIED IDEOGRAPH
+ {0xB8B9, 0x8179}, //9165 #CJK UNIFIED IDEOGRAPH
+ {0xB8BA, 0x8D1F}, //9166 #CJK UNIFIED IDEOGRAPH
+ {0xB8BB, 0x5BCC}, //9167 #CJK UNIFIED IDEOGRAPH
+ {0xB8BC, 0x8BA3}, //9168 #CJK UNIFIED IDEOGRAPH
+ {0xB8BD, 0x9644}, //9169 #CJK UNIFIED IDEOGRAPH
+ {0xB8BE, 0x5987}, //9170 #CJK UNIFIED IDEOGRAPH
+ {0xB8BF, 0x7F1A}, //9171 #CJK UNIFIED IDEOGRAPH
+ {0xB8C0, 0x5490}, //9172 #CJK UNIFIED IDEOGRAPH
+ {0xB8C1, 0x5676}, //9173 #CJK UNIFIED IDEOGRAPH
+ {0xB8C2, 0x560E}, //9174 #CJK UNIFIED IDEOGRAPH
+ {0xB8C3, 0x8BE5}, //9175 #CJK UNIFIED IDEOGRAPH
+ {0xB8C4, 0x6539}, //9176 #CJK UNIFIED IDEOGRAPH
+ {0xB8C5, 0x6982}, //9177 #CJK UNIFIED IDEOGRAPH
+ {0xB8C6, 0x9499}, //9178 #CJK UNIFIED IDEOGRAPH
+ {0xB8C7, 0x76D6}, //9179 #CJK UNIFIED IDEOGRAPH
+ {0xB8C8, 0x6E89}, //9180 #CJK UNIFIED IDEOGRAPH
+ {0xB8C9, 0x5E72}, //9181 #CJK UNIFIED IDEOGRAPH
+ {0xB8CA, 0x7518}, //9182 #CJK UNIFIED IDEOGRAPH
+ {0xB8CB, 0x6746}, //9183 #CJK UNIFIED IDEOGRAPH
+ {0xB8CC, 0x67D1}, //9184 #CJK UNIFIED IDEOGRAPH
+ {0xB8CD, 0x7AFF}, //9185 #CJK UNIFIED IDEOGRAPH
+ {0xB8CE, 0x809D}, //9186 #CJK UNIFIED IDEOGRAPH
+ {0xB8CF, 0x8D76}, //9187 #CJK UNIFIED IDEOGRAPH
+ {0xB8D0, 0x611F}, //9188 #CJK UNIFIED IDEOGRAPH
+ {0xB8D1, 0x79C6}, //9189 #CJK UNIFIED IDEOGRAPH
+ {0xB8D2, 0x6562}, //9190 #CJK UNIFIED IDEOGRAPH
+ {0xB8D3, 0x8D63}, //9191 #CJK UNIFIED IDEOGRAPH
+ {0xB8D4, 0x5188}, //9192 #CJK UNIFIED IDEOGRAPH
+ {0xB8D5, 0x521A}, //9193 #CJK UNIFIED IDEOGRAPH
+ {0xB8D6, 0x94A2}, //9194 #CJK UNIFIED IDEOGRAPH
+ {0xB8D7, 0x7F38}, //9195 #CJK UNIFIED IDEOGRAPH
+ {0xB8D8, 0x809B}, //9196 #CJK UNIFIED IDEOGRAPH
+ {0xB8D9, 0x7EB2}, //9197 #CJK UNIFIED IDEOGRAPH
+ {0xB8DA, 0x5C97}, //9198 #CJK UNIFIED IDEOGRAPH
+ {0xB8DB, 0x6E2F}, //9199 #CJK UNIFIED IDEOGRAPH
+ {0xB8DC, 0x6760}, //9200 #CJK UNIFIED IDEOGRAPH
+ {0xB8DD, 0x7BD9}, //9201 #CJK UNIFIED IDEOGRAPH
+ {0xB8DE, 0x768B}, //9202 #CJK UNIFIED IDEOGRAPH
+ {0xB8DF, 0x9AD8}, //9203 #CJK UNIFIED IDEOGRAPH
+ {0xB8E0, 0x818F}, //9204 #CJK UNIFIED IDEOGRAPH
+ {0xB8E1, 0x7F94}, //9205 #CJK UNIFIED IDEOGRAPH
+ {0xB8E2, 0x7CD5}, //9206 #CJK UNIFIED IDEOGRAPH
+ {0xB8E3, 0x641E}, //9207 #CJK UNIFIED IDEOGRAPH
+ {0xB8E4, 0x9550}, //9208 #CJK UNIFIED IDEOGRAPH
+ {0xB8E5, 0x7A3F}, //9209 #CJK UNIFIED IDEOGRAPH
+ {0xB8E6, 0x544A}, //9210 #CJK UNIFIED IDEOGRAPH
+ {0xB8E7, 0x54E5}, //9211 #CJK UNIFIED IDEOGRAPH
+ {0xB8E8, 0x6B4C}, //9212 #CJK UNIFIED IDEOGRAPH
+ {0xB8E9, 0x6401}, //9213 #CJK UNIFIED IDEOGRAPH
+ {0xB8EA, 0x6208}, //9214 #CJK UNIFIED IDEOGRAPH
+ {0xB8EB, 0x9E3D}, //9215 #CJK UNIFIED IDEOGRAPH
+ {0xB8EC, 0x80F3}, //9216 #CJK UNIFIED IDEOGRAPH
+ {0xB8ED, 0x7599}, //9217 #CJK UNIFIED IDEOGRAPH
+ {0xB8EE, 0x5272}, //9218 #CJK UNIFIED IDEOGRAPH
+ {0xB8EF, 0x9769}, //9219 #CJK UNIFIED IDEOGRAPH
+ {0xB8F0, 0x845B}, //9220 #CJK UNIFIED IDEOGRAPH
+ {0xB8F1, 0x683C}, //9221 #CJK UNIFIED IDEOGRAPH
+ {0xB8F2, 0x86E4}, //9222 #CJK UNIFIED IDEOGRAPH
+ {0xB8F3, 0x9601}, //9223 #CJK UNIFIED IDEOGRAPH
+ {0xB8F4, 0x9694}, //9224 #CJK UNIFIED IDEOGRAPH
+ {0xB8F5, 0x94EC}, //9225 #CJK UNIFIED IDEOGRAPH
+ {0xB8F6, 0x4E2A}, //9226 #CJK UNIFIED IDEOGRAPH
+ {0xB8F7, 0x5404}, //9227 #CJK UNIFIED IDEOGRAPH
+ {0xB8F8, 0x7ED9}, //9228 #CJK UNIFIED IDEOGRAPH
+ {0xB8F9, 0x6839}, //9229 #CJK UNIFIED IDEOGRAPH
+ {0xB8FA, 0x8DDF}, //9230 #CJK UNIFIED IDEOGRAPH
+ {0xB8FB, 0x8015}, //9231 #CJK UNIFIED IDEOGRAPH
+ {0xB8FC, 0x66F4}, //9232 #CJK UNIFIED IDEOGRAPH
+ {0xB8FD, 0x5E9A}, //9233 #CJK UNIFIED IDEOGRAPH
+ {0xB8FE, 0x7FB9}, //9234 #CJK UNIFIED IDEOGRAPH
+ {0xB940, 0x7B2F}, //9235 #CJK UNIFIED IDEOGRAPH
+ {0xB941, 0x7B30}, //9236 #CJK UNIFIED IDEOGRAPH
+ {0xB942, 0x7B32}, //9237 #CJK UNIFIED IDEOGRAPH
+ {0xB943, 0x7B34}, //9238 #CJK UNIFIED IDEOGRAPH
+ {0xB944, 0x7B35}, //9239 #CJK UNIFIED IDEOGRAPH
+ {0xB945, 0x7B36}, //9240 #CJK UNIFIED IDEOGRAPH
+ {0xB946, 0x7B37}, //9241 #CJK UNIFIED IDEOGRAPH
+ {0xB947, 0x7B39}, //9242 #CJK UNIFIED IDEOGRAPH
+ {0xB948, 0x7B3B}, //9243 #CJK UNIFIED IDEOGRAPH
+ {0xB949, 0x7B3D}, //9244 #CJK UNIFIED IDEOGRAPH
+ {0xB94A, 0x7B3F}, //9245 #CJK UNIFIED IDEOGRAPH
+ {0xB94B, 0x7B40}, //9246 #CJK UNIFIED IDEOGRAPH
+ {0xB94C, 0x7B41}, //9247 #CJK UNIFIED IDEOGRAPH
+ {0xB94D, 0x7B42}, //9248 #CJK UNIFIED IDEOGRAPH
+ {0xB94E, 0x7B43}, //9249 #CJK UNIFIED IDEOGRAPH
+ {0xB94F, 0x7B44}, //9250 #CJK UNIFIED IDEOGRAPH
+ {0xB950, 0x7B46}, //9251 #CJK UNIFIED IDEOGRAPH
+ {0xB951, 0x7B48}, //9252 #CJK UNIFIED IDEOGRAPH
+ {0xB952, 0x7B4A}, //9253 #CJK UNIFIED IDEOGRAPH
+ {0xB953, 0x7B4D}, //9254 #CJK UNIFIED IDEOGRAPH
+ {0xB954, 0x7B4E}, //9255 #CJK UNIFIED IDEOGRAPH
+ {0xB955, 0x7B53}, //9256 #CJK UNIFIED IDEOGRAPH
+ {0xB956, 0x7B55}, //9257 #CJK UNIFIED IDEOGRAPH
+ {0xB957, 0x7B57}, //9258 #CJK UNIFIED IDEOGRAPH
+ {0xB958, 0x7B59}, //9259 #CJK UNIFIED IDEOGRAPH
+ {0xB959, 0x7B5C}, //9260 #CJK UNIFIED IDEOGRAPH
+ {0xB95A, 0x7B5E}, //9261 #CJK UNIFIED IDEOGRAPH
+ {0xB95B, 0x7B5F}, //9262 #CJK UNIFIED IDEOGRAPH
+ {0xB95C, 0x7B61}, //9263 #CJK UNIFIED IDEOGRAPH
+ {0xB95D, 0x7B63}, //9264 #CJK UNIFIED IDEOGRAPH
+ {0xB95E, 0x7B64}, //9265 #CJK UNIFIED IDEOGRAPH
+ {0xB95F, 0x7B65}, //9266 #CJK UNIFIED IDEOGRAPH
+ {0xB960, 0x7B66}, //9267 #CJK UNIFIED IDEOGRAPH
+ {0xB961, 0x7B67}, //9268 #CJK UNIFIED IDEOGRAPH
+ {0xB962, 0x7B68}, //9269 #CJK UNIFIED IDEOGRAPH
+ {0xB963, 0x7B69}, //9270 #CJK UNIFIED IDEOGRAPH
+ {0xB964, 0x7B6A}, //9271 #CJK UNIFIED IDEOGRAPH
+ {0xB965, 0x7B6B}, //9272 #CJK UNIFIED IDEOGRAPH
+ {0xB966, 0x7B6C}, //9273 #CJK UNIFIED IDEOGRAPH
+ {0xB967, 0x7B6D}, //9274 #CJK UNIFIED IDEOGRAPH
+ {0xB968, 0x7B6F}, //9275 #CJK UNIFIED IDEOGRAPH
+ {0xB969, 0x7B70}, //9276 #CJK UNIFIED IDEOGRAPH
+ {0xB96A, 0x7B73}, //9277 #CJK UNIFIED IDEOGRAPH
+ {0xB96B, 0x7B74}, //9278 #CJK UNIFIED IDEOGRAPH
+ {0xB96C, 0x7B76}, //9279 #CJK UNIFIED IDEOGRAPH
+ {0xB96D, 0x7B78}, //9280 #CJK UNIFIED IDEOGRAPH
+ {0xB96E, 0x7B7A}, //9281 #CJK UNIFIED IDEOGRAPH
+ {0xB96F, 0x7B7C}, //9282 #CJK UNIFIED IDEOGRAPH
+ {0xB970, 0x7B7D}, //9283 #CJK UNIFIED IDEOGRAPH
+ {0xB971, 0x7B7F}, //9284 #CJK UNIFIED IDEOGRAPH
+ {0xB972, 0x7B81}, //9285 #CJK UNIFIED IDEOGRAPH
+ {0xB973, 0x7B82}, //9286 #CJK UNIFIED IDEOGRAPH
+ {0xB974, 0x7B83}, //9287 #CJK UNIFIED IDEOGRAPH
+ {0xB975, 0x7B84}, //9288 #CJK UNIFIED IDEOGRAPH
+ {0xB976, 0x7B86}, //9289 #CJK UNIFIED IDEOGRAPH
+ {0xB977, 0x7B87}, //9290 #CJK UNIFIED IDEOGRAPH
+ {0xB978, 0x7B88}, //9291 #CJK UNIFIED IDEOGRAPH
+ {0xB979, 0x7B89}, //9292 #CJK UNIFIED IDEOGRAPH
+ {0xB97A, 0x7B8A}, //9293 #CJK UNIFIED IDEOGRAPH
+ {0xB97B, 0x7B8B}, //9294 #CJK UNIFIED IDEOGRAPH
+ {0xB97C, 0x7B8C}, //9295 #CJK UNIFIED IDEOGRAPH
+ {0xB97D, 0x7B8E}, //9296 #CJK UNIFIED IDEOGRAPH
+ {0xB97E, 0x7B8F}, //9297 #CJK UNIFIED IDEOGRAPH
+ {0xB980, 0x7B91}, //9298 #CJK UNIFIED IDEOGRAPH
+ {0xB981, 0x7B92}, //9299 #CJK UNIFIED IDEOGRAPH
+ {0xB982, 0x7B93}, //9300 #CJK UNIFIED IDEOGRAPH
+ {0xB983, 0x7B96}, //9301 #CJK UNIFIED IDEOGRAPH
+ {0xB984, 0x7B98}, //9302 #CJK UNIFIED IDEOGRAPH
+ {0xB985, 0x7B99}, //9303 #CJK UNIFIED IDEOGRAPH
+ {0xB986, 0x7B9A}, //9304 #CJK UNIFIED IDEOGRAPH
+ {0xB987, 0x7B9B}, //9305 #CJK UNIFIED IDEOGRAPH
+ {0xB988, 0x7B9E}, //9306 #CJK UNIFIED IDEOGRAPH
+ {0xB989, 0x7B9F}, //9307 #CJK UNIFIED IDEOGRAPH
+ {0xB98A, 0x7BA0}, //9308 #CJK UNIFIED IDEOGRAPH
+ {0xB98B, 0x7BA3}, //9309 #CJK UNIFIED IDEOGRAPH
+ {0xB98C, 0x7BA4}, //9310 #CJK UNIFIED IDEOGRAPH
+ {0xB98D, 0x7BA5}, //9311 #CJK UNIFIED IDEOGRAPH
+ {0xB98E, 0x7BAE}, //9312 #CJK UNIFIED IDEOGRAPH
+ {0xB98F, 0x7BAF}, //9313 #CJK UNIFIED IDEOGRAPH
+ {0xB990, 0x7BB0}, //9314 #CJK UNIFIED IDEOGRAPH
+ {0xB991, 0x7BB2}, //9315 #CJK UNIFIED IDEOGRAPH
+ {0xB992, 0x7BB3}, //9316 #CJK UNIFIED IDEOGRAPH
+ {0xB993, 0x7BB5}, //9317 #CJK UNIFIED IDEOGRAPH
+ {0xB994, 0x7BB6}, //9318 #CJK UNIFIED IDEOGRAPH
+ {0xB995, 0x7BB7}, //9319 #CJK UNIFIED IDEOGRAPH
+ {0xB996, 0x7BB9}, //9320 #CJK UNIFIED IDEOGRAPH
+ {0xB997, 0x7BBA}, //9321 #CJK UNIFIED IDEOGRAPH
+ {0xB998, 0x7BBB}, //9322 #CJK UNIFIED IDEOGRAPH
+ {0xB999, 0x7BBC}, //9323 #CJK UNIFIED IDEOGRAPH
+ {0xB99A, 0x7BBD}, //9324 #CJK UNIFIED IDEOGRAPH
+ {0xB99B, 0x7BBE}, //9325 #CJK UNIFIED IDEOGRAPH
+ {0xB99C, 0x7BBF}, //9326 #CJK UNIFIED IDEOGRAPH
+ {0xB99D, 0x7BC0}, //9327 #CJK UNIFIED IDEOGRAPH
+ {0xB99E, 0x7BC2}, //9328 #CJK UNIFIED IDEOGRAPH
+ {0xB99F, 0x7BC3}, //9329 #CJK UNIFIED IDEOGRAPH
+ {0xB9A0, 0x7BC4}, //9330 #CJK UNIFIED IDEOGRAPH
+ {0xB9A1, 0x57C2}, //9331 #CJK UNIFIED IDEOGRAPH
+ {0xB9A2, 0x803F}, //9332 #CJK UNIFIED IDEOGRAPH
+ {0xB9A3, 0x6897}, //9333 #CJK UNIFIED IDEOGRAPH
+ {0xB9A4, 0x5DE5}, //9334 #CJK UNIFIED IDEOGRAPH
+ {0xB9A5, 0x653B}, //9335 #CJK UNIFIED IDEOGRAPH
+ {0xB9A6, 0x529F}, //9336 #CJK UNIFIED IDEOGRAPH
+ {0xB9A7, 0x606D}, //9337 #CJK UNIFIED IDEOGRAPH
+ {0xB9A8, 0x9F9A}, //9338 #CJK UNIFIED IDEOGRAPH
+ {0xB9A9, 0x4F9B}, //9339 #CJK UNIFIED IDEOGRAPH
+ {0xB9AA, 0x8EAC}, //9340 #CJK UNIFIED IDEOGRAPH
+ {0xB9AB, 0x516C}, //9341 #CJK UNIFIED IDEOGRAPH
+ {0xB9AC, 0x5BAB}, //9342 #CJK UNIFIED IDEOGRAPH
+ {0xB9AD, 0x5F13}, //9343 #CJK UNIFIED IDEOGRAPH
+ {0xB9AE, 0x5DE9}, //9344 #CJK UNIFIED IDEOGRAPH
+ {0xB9AF, 0x6C5E}, //9345 #CJK UNIFIED IDEOGRAPH
+ {0xB9B0, 0x62F1}, //9346 #CJK UNIFIED IDEOGRAPH
+ {0xB9B1, 0x8D21}, //9347 #CJK UNIFIED IDEOGRAPH
+ {0xB9B2, 0x5171}, //9348 #CJK UNIFIED IDEOGRAPH
+ {0xB9B3, 0x94A9}, //9349 #CJK UNIFIED IDEOGRAPH
+ {0xB9B4, 0x52FE}, //9350 #CJK UNIFIED IDEOGRAPH
+ {0xB9B5, 0x6C9F}, //9351 #CJK UNIFIED IDEOGRAPH
+ {0xB9B6, 0x82DF}, //9352 #CJK UNIFIED IDEOGRAPH
+ {0xB9B7, 0x72D7}, //9353 #CJK UNIFIED IDEOGRAPH
+ {0xB9B8, 0x57A2}, //9354 #CJK UNIFIED IDEOGRAPH
+ {0xB9B9, 0x6784}, //9355 #CJK UNIFIED IDEOGRAPH
+ {0xB9BA, 0x8D2D}, //9356 #CJK UNIFIED IDEOGRAPH
+ {0xB9BB, 0x591F}, //9357 #CJK UNIFIED IDEOGRAPH
+ {0xB9BC, 0x8F9C}, //9358 #CJK UNIFIED IDEOGRAPH
+ {0xB9BD, 0x83C7}, //9359 #CJK UNIFIED IDEOGRAPH
+ {0xB9BE, 0x5495}, //9360 #CJK UNIFIED IDEOGRAPH
+ {0xB9BF, 0x7B8D}, //9361 #CJK UNIFIED IDEOGRAPH
+ {0xB9C0, 0x4F30}, //9362 #CJK UNIFIED IDEOGRAPH
+ {0xB9C1, 0x6CBD}, //9363 #CJK UNIFIED IDEOGRAPH
+ {0xB9C2, 0x5B64}, //9364 #CJK UNIFIED IDEOGRAPH
+ {0xB9C3, 0x59D1}, //9365 #CJK UNIFIED IDEOGRAPH
+ {0xB9C4, 0x9F13}, //9366 #CJK UNIFIED IDEOGRAPH
+ {0xB9C5, 0x53E4}, //9367 #CJK UNIFIED IDEOGRAPH
+ {0xB9C6, 0x86CA}, //9368 #CJK UNIFIED IDEOGRAPH
+ {0xB9C7, 0x9AA8}, //9369 #CJK UNIFIED IDEOGRAPH
+ {0xB9C8, 0x8C37}, //9370 #CJK UNIFIED IDEOGRAPH
+ {0xB9C9, 0x80A1}, //9371 #CJK UNIFIED IDEOGRAPH
+ {0xB9CA, 0x6545}, //9372 #CJK UNIFIED IDEOGRAPH
+ {0xB9CB, 0x987E}, //9373 #CJK UNIFIED IDEOGRAPH
+ {0xB9CC, 0x56FA}, //9374 #CJK UNIFIED IDEOGRAPH
+ {0xB9CD, 0x96C7}, //9375 #CJK UNIFIED IDEOGRAPH
+ {0xB9CE, 0x522E}, //9376 #CJK UNIFIED IDEOGRAPH
+ {0xB9CF, 0x74DC}, //9377 #CJK UNIFIED IDEOGRAPH
+ {0xB9D0, 0x5250}, //9378 #CJK UNIFIED IDEOGRAPH
+ {0xB9D1, 0x5BE1}, //9379 #CJK UNIFIED IDEOGRAPH
+ {0xB9D2, 0x6302}, //9380 #CJK UNIFIED IDEOGRAPH
+ {0xB9D3, 0x8902}, //9381 #CJK UNIFIED IDEOGRAPH
+ {0xB9D4, 0x4E56}, //9382 #CJK UNIFIED IDEOGRAPH
+ {0xB9D5, 0x62D0}, //9383 #CJK UNIFIED IDEOGRAPH
+ {0xB9D6, 0x602A}, //9384 #CJK UNIFIED IDEOGRAPH
+ {0xB9D7, 0x68FA}, //9385 #CJK UNIFIED IDEOGRAPH
+ {0xB9D8, 0x5173}, //9386 #CJK UNIFIED IDEOGRAPH
+ {0xB9D9, 0x5B98}, //9387 #CJK UNIFIED IDEOGRAPH
+ {0xB9DA, 0x51A0}, //9388 #CJK UNIFIED IDEOGRAPH
+ {0xB9DB, 0x89C2}, //9389 #CJK UNIFIED IDEOGRAPH
+ {0xB9DC, 0x7BA1}, //9390 #CJK UNIFIED IDEOGRAPH
+ {0xB9DD, 0x9986}, //9391 #CJK UNIFIED IDEOGRAPH
+ {0xB9DE, 0x7F50}, //9392 #CJK UNIFIED IDEOGRAPH
+ {0xB9DF, 0x60EF}, //9393 #CJK UNIFIED IDEOGRAPH
+ {0xB9E0, 0x704C}, //9394 #CJK UNIFIED IDEOGRAPH
+ {0xB9E1, 0x8D2F}, //9395 #CJK UNIFIED IDEOGRAPH
+ {0xB9E2, 0x5149}, //9396 #CJK UNIFIED IDEOGRAPH
+ {0xB9E3, 0x5E7F}, //9397 #CJK UNIFIED IDEOGRAPH
+ {0xB9E4, 0x901B}, //9398 #CJK UNIFIED IDEOGRAPH
+ {0xB9E5, 0x7470}, //9399 #CJK UNIFIED IDEOGRAPH
+ {0xB9E6, 0x89C4}, //9400 #CJK UNIFIED IDEOGRAPH
+ {0xB9E7, 0x572D}, //9401 #CJK UNIFIED IDEOGRAPH
+ {0xB9E8, 0x7845}, //9402 #CJK UNIFIED IDEOGRAPH
+ {0xB9E9, 0x5F52}, //9403 #CJK UNIFIED IDEOGRAPH
+ {0xB9EA, 0x9F9F}, //9404 #CJK UNIFIED IDEOGRAPH
+ {0xB9EB, 0x95FA}, //9405 #CJK UNIFIED IDEOGRAPH
+ {0xB9EC, 0x8F68}, //9406 #CJK UNIFIED IDEOGRAPH
+ {0xB9ED, 0x9B3C}, //9407 #CJK UNIFIED IDEOGRAPH
+ {0xB9EE, 0x8BE1}, //9408 #CJK UNIFIED IDEOGRAPH
+ {0xB9EF, 0x7678}, //9409 #CJK UNIFIED IDEOGRAPH
+ {0xB9F0, 0x6842}, //9410 #CJK UNIFIED IDEOGRAPH
+ {0xB9F1, 0x67DC}, //9411 #CJK UNIFIED IDEOGRAPH
+ {0xB9F2, 0x8DEA}, //9412 #CJK UNIFIED IDEOGRAPH
+ {0xB9F3, 0x8D35}, //9413 #CJK UNIFIED IDEOGRAPH
+ {0xB9F4, 0x523D}, //9414 #CJK UNIFIED IDEOGRAPH
+ {0xB9F5, 0x8F8A}, //9415 #CJK UNIFIED IDEOGRAPH
+ {0xB9F6, 0x6EDA}, //9416 #CJK UNIFIED IDEOGRAPH
+ {0xB9F7, 0x68CD}, //9417 #CJK UNIFIED IDEOGRAPH
+ {0xB9F8, 0x9505}, //9418 #CJK UNIFIED IDEOGRAPH
+ {0xB9F9, 0x90ED}, //9419 #CJK UNIFIED IDEOGRAPH
+ {0xB9FA, 0x56FD}, //9420 #CJK UNIFIED IDEOGRAPH
+ {0xB9FB, 0x679C}, //9421 #CJK UNIFIED IDEOGRAPH
+ {0xB9FC, 0x88F9}, //9422 #CJK UNIFIED IDEOGRAPH
+ {0xB9FD, 0x8FC7}, //9423 #CJK UNIFIED IDEOGRAPH
+ {0xB9FE, 0x54C8}, //9424 #CJK UNIFIED IDEOGRAPH
+ {0xBA40, 0x7BC5}, //9425 #CJK UNIFIED IDEOGRAPH
+ {0xBA41, 0x7BC8}, //9426 #CJK UNIFIED IDEOGRAPH
+ {0xBA42, 0x7BC9}, //9427 #CJK UNIFIED IDEOGRAPH
+ {0xBA43, 0x7BCA}, //9428 #CJK UNIFIED IDEOGRAPH
+ {0xBA44, 0x7BCB}, //9429 #CJK UNIFIED IDEOGRAPH
+ {0xBA45, 0x7BCD}, //9430 #CJK UNIFIED IDEOGRAPH
+ {0xBA46, 0x7BCE}, //9431 #CJK UNIFIED IDEOGRAPH
+ {0xBA47, 0x7BCF}, //9432 #CJK UNIFIED IDEOGRAPH
+ {0xBA48, 0x7BD0}, //9433 #CJK UNIFIED IDEOGRAPH
+ {0xBA49, 0x7BD2}, //9434 #CJK UNIFIED IDEOGRAPH
+ {0xBA4A, 0x7BD4}, //9435 #CJK UNIFIED IDEOGRAPH
+ {0xBA4B, 0x7BD5}, //9436 #CJK UNIFIED IDEOGRAPH
+ {0xBA4C, 0x7BD6}, //9437 #CJK UNIFIED IDEOGRAPH
+ {0xBA4D, 0x7BD7}, //9438 #CJK UNIFIED IDEOGRAPH
+ {0xBA4E, 0x7BD8}, //9439 #CJK UNIFIED IDEOGRAPH
+ {0xBA4F, 0x7BDB}, //9440 #CJK UNIFIED IDEOGRAPH
+ {0xBA50, 0x7BDC}, //9441 #CJK UNIFIED IDEOGRAPH
+ {0xBA51, 0x7BDE}, //9442 #CJK UNIFIED IDEOGRAPH
+ {0xBA52, 0x7BDF}, //9443 #CJK UNIFIED IDEOGRAPH
+ {0xBA53, 0x7BE0}, //9444 #CJK UNIFIED IDEOGRAPH
+ {0xBA54, 0x7BE2}, //9445 #CJK UNIFIED IDEOGRAPH
+ {0xBA55, 0x7BE3}, //9446 #CJK UNIFIED IDEOGRAPH
+ {0xBA56, 0x7BE4}, //9447 #CJK UNIFIED IDEOGRAPH
+ {0xBA57, 0x7BE7}, //9448 #CJK UNIFIED IDEOGRAPH
+ {0xBA58, 0x7BE8}, //9449 #CJK UNIFIED IDEOGRAPH
+ {0xBA59, 0x7BE9}, //9450 #CJK UNIFIED IDEOGRAPH
+ {0xBA5A, 0x7BEB}, //9451 #CJK UNIFIED IDEOGRAPH
+ {0xBA5B, 0x7BEC}, //9452 #CJK UNIFIED IDEOGRAPH
+ {0xBA5C, 0x7BED}, //9453 #CJK UNIFIED IDEOGRAPH
+ {0xBA5D, 0x7BEF}, //9454 #CJK UNIFIED IDEOGRAPH
+ {0xBA5E, 0x7BF0}, //9455 #CJK UNIFIED IDEOGRAPH
+ {0xBA5F, 0x7BF2}, //9456 #CJK UNIFIED IDEOGRAPH
+ {0xBA60, 0x7BF3}, //9457 #CJK UNIFIED IDEOGRAPH
+ {0xBA61, 0x7BF4}, //9458 #CJK UNIFIED IDEOGRAPH
+ {0xBA62, 0x7BF5}, //9459 #CJK UNIFIED IDEOGRAPH
+ {0xBA63, 0x7BF6}, //9460 #CJK UNIFIED IDEOGRAPH
+ {0xBA64, 0x7BF8}, //9461 #CJK UNIFIED IDEOGRAPH
+ {0xBA65, 0x7BF9}, //9462 #CJK UNIFIED IDEOGRAPH
+ {0xBA66, 0x7BFA}, //9463 #CJK UNIFIED IDEOGRAPH
+ {0xBA67, 0x7BFB}, //9464 #CJK UNIFIED IDEOGRAPH
+ {0xBA68, 0x7BFD}, //9465 #CJK UNIFIED IDEOGRAPH
+ {0xBA69, 0x7BFF}, //9466 #CJK UNIFIED IDEOGRAPH
+ {0xBA6A, 0x7C00}, //9467 #CJK UNIFIED IDEOGRAPH
+ {0xBA6B, 0x7C01}, //9468 #CJK UNIFIED IDEOGRAPH
+ {0xBA6C, 0x7C02}, //9469 #CJK UNIFIED IDEOGRAPH
+ {0xBA6D, 0x7C03}, //9470 #CJK UNIFIED IDEOGRAPH
+ {0xBA6E, 0x7C04}, //9471 #CJK UNIFIED IDEOGRAPH
+ {0xBA6F, 0x7C05}, //9472 #CJK UNIFIED IDEOGRAPH
+ {0xBA70, 0x7C06}, //9473 #CJK UNIFIED IDEOGRAPH
+ {0xBA71, 0x7C08}, //9474 #CJK UNIFIED IDEOGRAPH
+ {0xBA72, 0x7C09}, //9475 #CJK UNIFIED IDEOGRAPH
+ {0xBA73, 0x7C0A}, //9476 #CJK UNIFIED IDEOGRAPH
+ {0xBA74, 0x7C0D}, //9477 #CJK UNIFIED IDEOGRAPH
+ {0xBA75, 0x7C0E}, //9478 #CJK UNIFIED IDEOGRAPH
+ {0xBA76, 0x7C10}, //9479 #CJK UNIFIED IDEOGRAPH
+ {0xBA77, 0x7C11}, //9480 #CJK UNIFIED IDEOGRAPH
+ {0xBA78, 0x7C12}, //9481 #CJK UNIFIED IDEOGRAPH
+ {0xBA79, 0x7C13}, //9482 #CJK UNIFIED IDEOGRAPH
+ {0xBA7A, 0x7C14}, //9483 #CJK UNIFIED IDEOGRAPH
+ {0xBA7B, 0x7C15}, //9484 #CJK UNIFIED IDEOGRAPH
+ {0xBA7C, 0x7C17}, //9485 #CJK UNIFIED IDEOGRAPH
+ {0xBA7D, 0x7C18}, //9486 #CJK UNIFIED IDEOGRAPH
+ {0xBA7E, 0x7C19}, //9487 #CJK UNIFIED IDEOGRAPH
+ {0xBA80, 0x7C1A}, //9488 #CJK UNIFIED IDEOGRAPH
+ {0xBA81, 0x7C1B}, //9489 #CJK UNIFIED IDEOGRAPH
+ {0xBA82, 0x7C1C}, //9490 #CJK UNIFIED IDEOGRAPH
+ {0xBA83, 0x7C1D}, //9491 #CJK UNIFIED IDEOGRAPH
+ {0xBA84, 0x7C1E}, //9492 #CJK UNIFIED IDEOGRAPH
+ {0xBA85, 0x7C20}, //9493 #CJK UNIFIED IDEOGRAPH
+ {0xBA86, 0x7C21}, //9494 #CJK UNIFIED IDEOGRAPH
+ {0xBA87, 0x7C22}, //9495 #CJK UNIFIED IDEOGRAPH
+ {0xBA88, 0x7C23}, //9496 #CJK UNIFIED IDEOGRAPH
+ {0xBA89, 0x7C24}, //9497 #CJK UNIFIED IDEOGRAPH
+ {0xBA8A, 0x7C25}, //9498 #CJK UNIFIED IDEOGRAPH
+ {0xBA8B, 0x7C28}, //9499 #CJK UNIFIED IDEOGRAPH
+ {0xBA8C, 0x7C29}, //9500 #CJK UNIFIED IDEOGRAPH
+ {0xBA8D, 0x7C2B}, //9501 #CJK UNIFIED IDEOGRAPH
+ {0xBA8E, 0x7C2C}, //9502 #CJK UNIFIED IDEOGRAPH
+ {0xBA8F, 0x7C2D}, //9503 #CJK UNIFIED IDEOGRAPH
+ {0xBA90, 0x7C2E}, //9504 #CJK UNIFIED IDEOGRAPH
+ {0xBA91, 0x7C2F}, //9505 #CJK UNIFIED IDEOGRAPH
+ {0xBA92, 0x7C30}, //9506 #CJK UNIFIED IDEOGRAPH
+ {0xBA93, 0x7C31}, //9507 #CJK UNIFIED IDEOGRAPH
+ {0xBA94, 0x7C32}, //9508 #CJK UNIFIED IDEOGRAPH
+ {0xBA95, 0x7C33}, //9509 #CJK UNIFIED IDEOGRAPH
+ {0xBA96, 0x7C34}, //9510 #CJK UNIFIED IDEOGRAPH
+ {0xBA97, 0x7C35}, //9511 #CJK UNIFIED IDEOGRAPH
+ {0xBA98, 0x7C36}, //9512 #CJK UNIFIED IDEOGRAPH
+ {0xBA99, 0x7C37}, //9513 #CJK UNIFIED IDEOGRAPH
+ {0xBA9A, 0x7C39}, //9514 #CJK UNIFIED IDEOGRAPH
+ {0xBA9B, 0x7C3A}, //9515 #CJK UNIFIED IDEOGRAPH
+ {0xBA9C, 0x7C3B}, //9516 #CJK UNIFIED IDEOGRAPH
+ {0xBA9D, 0x7C3C}, //9517 #CJK UNIFIED IDEOGRAPH
+ {0xBA9E, 0x7C3D}, //9518 #CJK UNIFIED IDEOGRAPH
+ {0xBA9F, 0x7C3E}, //9519 #CJK UNIFIED IDEOGRAPH
+ {0xBAA0, 0x7C42}, //9520 #CJK UNIFIED IDEOGRAPH
+ {0xBAA1, 0x9AB8}, //9521 #CJK UNIFIED IDEOGRAPH
+ {0xBAA2, 0x5B69}, //9522 #CJK UNIFIED IDEOGRAPH
+ {0xBAA3, 0x6D77}, //9523 #CJK UNIFIED IDEOGRAPH
+ {0xBAA4, 0x6C26}, //9524 #CJK UNIFIED IDEOGRAPH
+ {0xBAA5, 0x4EA5}, //9525 #CJK UNIFIED IDEOGRAPH
+ {0xBAA6, 0x5BB3}, //9526 #CJK UNIFIED IDEOGRAPH
+ {0xBAA7, 0x9A87}, //9527 #CJK UNIFIED IDEOGRAPH
+ {0xBAA8, 0x9163}, //9528 #CJK UNIFIED IDEOGRAPH
+ {0xBAA9, 0x61A8}, //9529 #CJK UNIFIED IDEOGRAPH
+ {0xBAAA, 0x90AF}, //9530 #CJK UNIFIED IDEOGRAPH
+ {0xBAAB, 0x97E9}, //9531 #CJK UNIFIED IDEOGRAPH
+ {0xBAAC, 0x542B}, //9532 #CJK UNIFIED IDEOGRAPH
+ {0xBAAD, 0x6DB5}, //9533 #CJK UNIFIED IDEOGRAPH
+ {0xBAAE, 0x5BD2}, //9534 #CJK UNIFIED IDEOGRAPH
+ {0xBAAF, 0x51FD}, //9535 #CJK UNIFIED IDEOGRAPH
+ {0xBAB0, 0x558A}, //9536 #CJK UNIFIED IDEOGRAPH
+ {0xBAB1, 0x7F55}, //9537 #CJK UNIFIED IDEOGRAPH
+ {0xBAB2, 0x7FF0}, //9538 #CJK UNIFIED IDEOGRAPH
+ {0xBAB3, 0x64BC}, //9539 #CJK UNIFIED IDEOGRAPH
+ {0xBAB4, 0x634D}, //9540 #CJK UNIFIED IDEOGRAPH
+ {0xBAB5, 0x65F1}, //9541 #CJK UNIFIED IDEOGRAPH
+ {0xBAB6, 0x61BE}, //9542 #CJK UNIFIED IDEOGRAPH
+ {0xBAB7, 0x608D}, //9543 #CJK UNIFIED IDEOGRAPH
+ {0xBAB8, 0x710A}, //9544 #CJK UNIFIED IDEOGRAPH
+ {0xBAB9, 0x6C57}, //9545 #CJK UNIFIED IDEOGRAPH
+ {0xBABA, 0x6C49}, //9546 #CJK UNIFIED IDEOGRAPH
+ {0xBABB, 0x592F}, //9547 #CJK UNIFIED IDEOGRAPH
+ {0xBABC, 0x676D}, //9548 #CJK UNIFIED IDEOGRAPH
+ {0xBABD, 0x822A}, //9549 #CJK UNIFIED IDEOGRAPH
+ {0xBABE, 0x58D5}, //9550 #CJK UNIFIED IDEOGRAPH
+ {0xBABF, 0x568E}, //9551 #CJK UNIFIED IDEOGRAPH
+ {0xBAC0, 0x8C6A}, //9552 #CJK UNIFIED IDEOGRAPH
+ {0xBAC1, 0x6BEB}, //9553 #CJK UNIFIED IDEOGRAPH
+ {0xBAC2, 0x90DD}, //9554 #CJK UNIFIED IDEOGRAPH
+ {0xBAC3, 0x597D}, //9555 #CJK UNIFIED IDEOGRAPH
+ {0xBAC4, 0x8017}, //9556 #CJK UNIFIED IDEOGRAPH
+ {0xBAC5, 0x53F7}, //9557 #CJK UNIFIED IDEOGRAPH
+ {0xBAC6, 0x6D69}, //9558 #CJK UNIFIED IDEOGRAPH
+ {0xBAC7, 0x5475}, //9559 #CJK UNIFIED IDEOGRAPH
+ {0xBAC8, 0x559D}, //9560 #CJK UNIFIED IDEOGRAPH
+ {0xBAC9, 0x8377}, //9561 #CJK UNIFIED IDEOGRAPH
+ {0xBACA, 0x83CF}, //9562 #CJK UNIFIED IDEOGRAPH
+ {0xBACB, 0x6838}, //9563 #CJK UNIFIED IDEOGRAPH
+ {0xBACC, 0x79BE}, //9564 #CJK UNIFIED IDEOGRAPH
+ {0xBACD, 0x548C}, //9565 #CJK UNIFIED IDEOGRAPH
+ {0xBACE, 0x4F55}, //9566 #CJK UNIFIED IDEOGRAPH
+ {0xBACF, 0x5408}, //9567 #CJK UNIFIED IDEOGRAPH
+ {0xBAD0, 0x76D2}, //9568 #CJK UNIFIED IDEOGRAPH
+ {0xBAD1, 0x8C89}, //9569 #CJK UNIFIED IDEOGRAPH
+ {0xBAD2, 0x9602}, //9570 #CJK UNIFIED IDEOGRAPH
+ {0xBAD3, 0x6CB3}, //9571 #CJK UNIFIED IDEOGRAPH
+ {0xBAD4, 0x6DB8}, //9572 #CJK UNIFIED IDEOGRAPH
+ {0xBAD5, 0x8D6B}, //9573 #CJK UNIFIED IDEOGRAPH
+ {0xBAD6, 0x8910}, //9574 #CJK UNIFIED IDEOGRAPH
+ {0xBAD7, 0x9E64}, //9575 #CJK UNIFIED IDEOGRAPH
+ {0xBAD8, 0x8D3A}, //9576 #CJK UNIFIED IDEOGRAPH
+ {0xBAD9, 0x563F}, //9577 #CJK UNIFIED IDEOGRAPH
+ {0xBADA, 0x9ED1}, //9578 #CJK UNIFIED IDEOGRAPH
+ {0xBADB, 0x75D5}, //9579 #CJK UNIFIED IDEOGRAPH
+ {0xBADC, 0x5F88}, //9580 #CJK UNIFIED IDEOGRAPH
+ {0xBADD, 0x72E0}, //9581 #CJK UNIFIED IDEOGRAPH
+ {0xBADE, 0x6068}, //9582 #CJK UNIFIED IDEOGRAPH
+ {0xBADF, 0x54FC}, //9583 #CJK UNIFIED IDEOGRAPH
+ {0xBAE0, 0x4EA8}, //9584 #CJK UNIFIED IDEOGRAPH
+ {0xBAE1, 0x6A2A}, //9585 #CJK UNIFIED IDEOGRAPH
+ {0xBAE2, 0x8861}, //9586 #CJK UNIFIED IDEOGRAPH
+ {0xBAE3, 0x6052}, //9587 #CJK UNIFIED IDEOGRAPH
+ {0xBAE4, 0x8F70}, //9588 #CJK UNIFIED IDEOGRAPH
+ {0xBAE5, 0x54C4}, //9589 #CJK UNIFIED IDEOGRAPH
+ {0xBAE6, 0x70D8}, //9590 #CJK UNIFIED IDEOGRAPH
+ {0xBAE7, 0x8679}, //9591 #CJK UNIFIED IDEOGRAPH
+ {0xBAE8, 0x9E3F}, //9592 #CJK UNIFIED IDEOGRAPH
+ {0xBAE9, 0x6D2A}, //9593 #CJK UNIFIED IDEOGRAPH
+ {0xBAEA, 0x5B8F}, //9594 #CJK UNIFIED IDEOGRAPH
+ {0xBAEB, 0x5F18}, //9595 #CJK UNIFIED IDEOGRAPH
+ {0xBAEC, 0x7EA2}, //9596 #CJK UNIFIED IDEOGRAPH
+ {0xBAED, 0x5589}, //9597 #CJK UNIFIED IDEOGRAPH
+ {0xBAEE, 0x4FAF}, //9598 #CJK UNIFIED IDEOGRAPH
+ {0xBAEF, 0x7334}, //9599 #CJK UNIFIED IDEOGRAPH
+ {0xBAF0, 0x543C}, //9600 #CJK UNIFIED IDEOGRAPH
+ {0xBAF1, 0x539A}, //9601 #CJK UNIFIED IDEOGRAPH
+ {0xBAF2, 0x5019}, //9602 #CJK UNIFIED IDEOGRAPH
+ {0xBAF3, 0x540E}, //9603 #CJK UNIFIED IDEOGRAPH
+ {0xBAF4, 0x547C}, //9604 #CJK UNIFIED IDEOGRAPH
+ {0xBAF5, 0x4E4E}, //9605 #CJK UNIFIED IDEOGRAPH
+ {0xBAF6, 0x5FFD}, //9606 #CJK UNIFIED IDEOGRAPH
+ {0xBAF7, 0x745A}, //9607 #CJK UNIFIED IDEOGRAPH
+ {0xBAF8, 0x58F6}, //9608 #CJK UNIFIED IDEOGRAPH
+ {0xBAF9, 0x846B}, //9609 #CJK UNIFIED IDEOGRAPH
+ {0xBAFA, 0x80E1}, //9610 #CJK UNIFIED IDEOGRAPH
+ {0xBAFB, 0x8774}, //9611 #CJK UNIFIED IDEOGRAPH
+ {0xBAFC, 0x72D0}, //9612 #CJK UNIFIED IDEOGRAPH
+ {0xBAFD, 0x7CCA}, //9613 #CJK UNIFIED IDEOGRAPH
+ {0xBAFE, 0x6E56}, //9614 #CJK UNIFIED IDEOGRAPH
+ {0xBB40, 0x7C43}, //9615 #CJK UNIFIED IDEOGRAPH
+ {0xBB41, 0x7C44}, //9616 #CJK UNIFIED IDEOGRAPH
+ {0xBB42, 0x7C45}, //9617 #CJK UNIFIED IDEOGRAPH
+ {0xBB43, 0x7C46}, //9618 #CJK UNIFIED IDEOGRAPH
+ {0xBB44, 0x7C47}, //9619 #CJK UNIFIED IDEOGRAPH
+ {0xBB45, 0x7C48}, //9620 #CJK UNIFIED IDEOGRAPH
+ {0xBB46, 0x7C49}, //9621 #CJK UNIFIED IDEOGRAPH
+ {0xBB47, 0x7C4A}, //9622 #CJK UNIFIED IDEOGRAPH
+ {0xBB48, 0x7C4B}, //9623 #CJK UNIFIED IDEOGRAPH
+ {0xBB49, 0x7C4C}, //9624 #CJK UNIFIED IDEOGRAPH
+ {0xBB4A, 0x7C4E}, //9625 #CJK UNIFIED IDEOGRAPH
+ {0xBB4B, 0x7C4F}, //9626 #CJK UNIFIED IDEOGRAPH
+ {0xBB4C, 0x7C50}, //9627 #CJK UNIFIED IDEOGRAPH
+ {0xBB4D, 0x7C51}, //9628 #CJK UNIFIED IDEOGRAPH
+ {0xBB4E, 0x7C52}, //9629 #CJK UNIFIED IDEOGRAPH
+ {0xBB4F, 0x7C53}, //9630 #CJK UNIFIED IDEOGRAPH
+ {0xBB50, 0x7C54}, //9631 #CJK UNIFIED IDEOGRAPH
+ {0xBB51, 0x7C55}, //9632 #CJK UNIFIED IDEOGRAPH
+ {0xBB52, 0x7C56}, //9633 #CJK UNIFIED IDEOGRAPH
+ {0xBB53, 0x7C57}, //9634 #CJK UNIFIED IDEOGRAPH
+ {0xBB54, 0x7C58}, //9635 #CJK UNIFIED IDEOGRAPH
+ {0xBB55, 0x7C59}, //9636 #CJK UNIFIED IDEOGRAPH
+ {0xBB56, 0x7C5A}, //9637 #CJK UNIFIED IDEOGRAPH
+ {0xBB57, 0x7C5B}, //9638 #CJK UNIFIED IDEOGRAPH
+ {0xBB58, 0x7C5C}, //9639 #CJK UNIFIED IDEOGRAPH
+ {0xBB59, 0x7C5D}, //9640 #CJK UNIFIED IDEOGRAPH
+ {0xBB5A, 0x7C5E}, //9641 #CJK UNIFIED IDEOGRAPH
+ {0xBB5B, 0x7C5F}, //9642 #CJK UNIFIED IDEOGRAPH
+ {0xBB5C, 0x7C60}, //9643 #CJK UNIFIED IDEOGRAPH
+ {0xBB5D, 0x7C61}, //9644 #CJK UNIFIED IDEOGRAPH
+ {0xBB5E, 0x7C62}, //9645 #CJK UNIFIED IDEOGRAPH
+ {0xBB5F, 0x7C63}, //9646 #CJK UNIFIED IDEOGRAPH
+ {0xBB60, 0x7C64}, //9647 #CJK UNIFIED IDEOGRAPH
+ {0xBB61, 0x7C65}, //9648 #CJK UNIFIED IDEOGRAPH
+ {0xBB62, 0x7C66}, //9649 #CJK UNIFIED IDEOGRAPH
+ {0xBB63, 0x7C67}, //9650 #CJK UNIFIED IDEOGRAPH
+ {0xBB64, 0x7C68}, //9651 #CJK UNIFIED IDEOGRAPH
+ {0xBB65, 0x7C69}, //9652 #CJK UNIFIED IDEOGRAPH
+ {0xBB66, 0x7C6A}, //9653 #CJK UNIFIED IDEOGRAPH
+ {0xBB67, 0x7C6B}, //9654 #CJK UNIFIED IDEOGRAPH
+ {0xBB68, 0x7C6C}, //9655 #CJK UNIFIED IDEOGRAPH
+ {0xBB69, 0x7C6D}, //9656 #CJK UNIFIED IDEOGRAPH
+ {0xBB6A, 0x7C6E}, //9657 #CJK UNIFIED IDEOGRAPH
+ {0xBB6B, 0x7C6F}, //9658 #CJK UNIFIED IDEOGRAPH
+ {0xBB6C, 0x7C70}, //9659 #CJK UNIFIED IDEOGRAPH
+ {0xBB6D, 0x7C71}, //9660 #CJK UNIFIED IDEOGRAPH
+ {0xBB6E, 0x7C72}, //9661 #CJK UNIFIED IDEOGRAPH
+ {0xBB6F, 0x7C75}, //9662 #CJK UNIFIED IDEOGRAPH
+ {0xBB70, 0x7C76}, //9663 #CJK UNIFIED IDEOGRAPH
+ {0xBB71, 0x7C77}, //9664 #CJK UNIFIED IDEOGRAPH
+ {0xBB72, 0x7C78}, //9665 #CJK UNIFIED IDEOGRAPH
+ {0xBB73, 0x7C79}, //9666 #CJK UNIFIED IDEOGRAPH
+ {0xBB74, 0x7C7A}, //9667 #CJK UNIFIED IDEOGRAPH
+ {0xBB75, 0x7C7E}, //9668 #CJK UNIFIED IDEOGRAPH
+ {0xBB76, 0x7C7F}, //9669 #CJK UNIFIED IDEOGRAPH
+ {0xBB77, 0x7C80}, //9670 #CJK UNIFIED IDEOGRAPH
+ {0xBB78, 0x7C81}, //9671 #CJK UNIFIED IDEOGRAPH
+ {0xBB79, 0x7C82}, //9672 #CJK UNIFIED IDEOGRAPH
+ {0xBB7A, 0x7C83}, //9673 #CJK UNIFIED IDEOGRAPH
+ {0xBB7B, 0x7C84}, //9674 #CJK UNIFIED IDEOGRAPH
+ {0xBB7C, 0x7C85}, //9675 #CJK UNIFIED IDEOGRAPH
+ {0xBB7D, 0x7C86}, //9676 #CJK UNIFIED IDEOGRAPH
+ {0xBB7E, 0x7C87}, //9677 #CJK UNIFIED IDEOGRAPH
+ {0xBB80, 0x7C88}, //9678 #CJK UNIFIED IDEOGRAPH
+ {0xBB81, 0x7C8A}, //9679 #CJK UNIFIED IDEOGRAPH
+ {0xBB82, 0x7C8B}, //9680 #CJK UNIFIED IDEOGRAPH
+ {0xBB83, 0x7C8C}, //9681 #CJK UNIFIED IDEOGRAPH
+ {0xBB84, 0x7C8D}, //9682 #CJK UNIFIED IDEOGRAPH
+ {0xBB85, 0x7C8E}, //9683 #CJK UNIFIED IDEOGRAPH
+ {0xBB86, 0x7C8F}, //9684 #CJK UNIFIED IDEOGRAPH
+ {0xBB87, 0x7C90}, //9685 #CJK UNIFIED IDEOGRAPH
+ {0xBB88, 0x7C93}, //9686 #CJK UNIFIED IDEOGRAPH
+ {0xBB89, 0x7C94}, //9687 #CJK UNIFIED IDEOGRAPH
+ {0xBB8A, 0x7C96}, //9688 #CJK UNIFIED IDEOGRAPH
+ {0xBB8B, 0x7C99}, //9689 #CJK UNIFIED IDEOGRAPH
+ {0xBB8C, 0x7C9A}, //9690 #CJK UNIFIED IDEOGRAPH
+ {0xBB8D, 0x7C9B}, //9691 #CJK UNIFIED IDEOGRAPH
+ {0xBB8E, 0x7CA0}, //9692 #CJK UNIFIED IDEOGRAPH
+ {0xBB8F, 0x7CA1}, //9693 #CJK UNIFIED IDEOGRAPH
+ {0xBB90, 0x7CA3}, //9694 #CJK UNIFIED IDEOGRAPH
+ {0xBB91, 0x7CA6}, //9695 #CJK UNIFIED IDEOGRAPH
+ {0xBB92, 0x7CA7}, //9696 #CJK UNIFIED IDEOGRAPH
+ {0xBB93, 0x7CA8}, //9697 #CJK UNIFIED IDEOGRAPH
+ {0xBB94, 0x7CA9}, //9698 #CJK UNIFIED IDEOGRAPH
+ {0xBB95, 0x7CAB}, //9699 #CJK UNIFIED IDEOGRAPH
+ {0xBB96, 0x7CAC}, //9700 #CJK UNIFIED IDEOGRAPH
+ {0xBB97, 0x7CAD}, //9701 #CJK UNIFIED IDEOGRAPH
+ {0xBB98, 0x7CAF}, //9702 #CJK UNIFIED IDEOGRAPH
+ {0xBB99, 0x7CB0}, //9703 #CJK UNIFIED IDEOGRAPH
+ {0xBB9A, 0x7CB4}, //9704 #CJK UNIFIED IDEOGRAPH
+ {0xBB9B, 0x7CB5}, //9705 #CJK UNIFIED IDEOGRAPH
+ {0xBB9C, 0x7CB6}, //9706 #CJK UNIFIED IDEOGRAPH
+ {0xBB9D, 0x7CB7}, //9707 #CJK UNIFIED IDEOGRAPH
+ {0xBB9E, 0x7CB8}, //9708 #CJK UNIFIED IDEOGRAPH
+ {0xBB9F, 0x7CBA}, //9709 #CJK UNIFIED IDEOGRAPH
+ {0xBBA0, 0x7CBB}, //9710 #CJK UNIFIED IDEOGRAPH
+ {0xBBA1, 0x5F27}, //9711 #CJK UNIFIED IDEOGRAPH
+ {0xBBA2, 0x864E}, //9712 #CJK UNIFIED IDEOGRAPH
+ {0xBBA3, 0x552C}, //9713 #CJK UNIFIED IDEOGRAPH
+ {0xBBA4, 0x62A4}, //9714 #CJK UNIFIED IDEOGRAPH
+ {0xBBA5, 0x4E92}, //9715 #CJK UNIFIED IDEOGRAPH
+ {0xBBA6, 0x6CAA}, //9716 #CJK UNIFIED IDEOGRAPH
+ {0xBBA7, 0x6237}, //9717 #CJK UNIFIED IDEOGRAPH
+ {0xBBA8, 0x82B1}, //9718 #CJK UNIFIED IDEOGRAPH
+ {0xBBA9, 0x54D7}, //9719 #CJK UNIFIED IDEOGRAPH
+ {0xBBAA, 0x534E}, //9720 #CJK UNIFIED IDEOGRAPH
+ {0xBBAB, 0x733E}, //9721 #CJK UNIFIED IDEOGRAPH
+ {0xBBAC, 0x6ED1}, //9722 #CJK UNIFIED IDEOGRAPH
+ {0xBBAD, 0x753B}, //9723 #CJK UNIFIED IDEOGRAPH
+ {0xBBAE, 0x5212}, //9724 #CJK UNIFIED IDEOGRAPH
+ {0xBBAF, 0x5316}, //9725 #CJK UNIFIED IDEOGRAPH
+ {0xBBB0, 0x8BDD}, //9726 #CJK UNIFIED IDEOGRAPH
+ {0xBBB1, 0x69D0}, //9727 #CJK UNIFIED IDEOGRAPH
+ {0xBBB2, 0x5F8A}, //9728 #CJK UNIFIED IDEOGRAPH
+ {0xBBB3, 0x6000}, //9729 #CJK UNIFIED IDEOGRAPH
+ {0xBBB4, 0x6DEE}, //9730 #CJK UNIFIED IDEOGRAPH
+ {0xBBB5, 0x574F}, //9731 #CJK UNIFIED IDEOGRAPH
+ {0xBBB6, 0x6B22}, //9732 #CJK UNIFIED IDEOGRAPH
+ {0xBBB7, 0x73AF}, //9733 #CJK UNIFIED IDEOGRAPH
+ {0xBBB8, 0x6853}, //9734 #CJK UNIFIED IDEOGRAPH
+ {0xBBB9, 0x8FD8}, //9735 #CJK UNIFIED IDEOGRAPH
+ {0xBBBA, 0x7F13}, //9736 #CJK UNIFIED IDEOGRAPH
+ {0xBBBB, 0x6362}, //9737 #CJK UNIFIED IDEOGRAPH
+ {0xBBBC, 0x60A3}, //9738 #CJK UNIFIED IDEOGRAPH
+ {0xBBBD, 0x5524}, //9739 #CJK UNIFIED IDEOGRAPH
+ {0xBBBE, 0x75EA}, //9740 #CJK UNIFIED IDEOGRAPH
+ {0xBBBF, 0x8C62}, //9741 #CJK UNIFIED IDEOGRAPH
+ {0xBBC0, 0x7115}, //9742 #CJK UNIFIED IDEOGRAPH
+ {0xBBC1, 0x6DA3}, //9743 #CJK UNIFIED IDEOGRAPH
+ {0xBBC2, 0x5BA6}, //9744 #CJK UNIFIED IDEOGRAPH
+ {0xBBC3, 0x5E7B}, //9745 #CJK UNIFIED IDEOGRAPH
+ {0xBBC4, 0x8352}, //9746 #CJK UNIFIED IDEOGRAPH
+ {0xBBC5, 0x614C}, //9747 #CJK UNIFIED IDEOGRAPH
+ {0xBBC6, 0x9EC4}, //9748 #CJK UNIFIED IDEOGRAPH
+ {0xBBC7, 0x78FA}, //9749 #CJK UNIFIED IDEOGRAPH
+ {0xBBC8, 0x8757}, //9750 #CJK UNIFIED IDEOGRAPH
+ {0xBBC9, 0x7C27}, //9751 #CJK UNIFIED IDEOGRAPH
+ {0xBBCA, 0x7687}, //9752 #CJK UNIFIED IDEOGRAPH
+ {0xBBCB, 0x51F0}, //9753 #CJK UNIFIED IDEOGRAPH
+ {0xBBCC, 0x60F6}, //9754 #CJK UNIFIED IDEOGRAPH
+ {0xBBCD, 0x714C}, //9755 #CJK UNIFIED IDEOGRAPH
+ {0xBBCE, 0x6643}, //9756 #CJK UNIFIED IDEOGRAPH
+ {0xBBCF, 0x5E4C}, //9757 #CJK UNIFIED IDEOGRAPH
+ {0xBBD0, 0x604D}, //9758 #CJK UNIFIED IDEOGRAPH
+ {0xBBD1, 0x8C0E}, //9759 #CJK UNIFIED IDEOGRAPH
+ {0xBBD2, 0x7070}, //9760 #CJK UNIFIED IDEOGRAPH
+ {0xBBD3, 0x6325}, //9761 #CJK UNIFIED IDEOGRAPH
+ {0xBBD4, 0x8F89}, //9762 #CJK UNIFIED IDEOGRAPH
+ {0xBBD5, 0x5FBD}, //9763 #CJK UNIFIED IDEOGRAPH
+ {0xBBD6, 0x6062}, //9764 #CJK UNIFIED IDEOGRAPH
+ {0xBBD7, 0x86D4}, //9765 #CJK UNIFIED IDEOGRAPH
+ {0xBBD8, 0x56DE}, //9766 #CJK UNIFIED IDEOGRAPH
+ {0xBBD9, 0x6BC1}, //9767 #CJK UNIFIED IDEOGRAPH
+ {0xBBDA, 0x6094}, //9768 #CJK UNIFIED IDEOGRAPH
+ {0xBBDB, 0x6167}, //9769 #CJK UNIFIED IDEOGRAPH
+ {0xBBDC, 0x5349}, //9770 #CJK UNIFIED IDEOGRAPH
+ {0xBBDD, 0x60E0}, //9771 #CJK UNIFIED IDEOGRAPH
+ {0xBBDE, 0x6666}, //9772 #CJK UNIFIED IDEOGRAPH
+ {0xBBDF, 0x8D3F}, //9773 #CJK UNIFIED IDEOGRAPH
+ {0xBBE0, 0x79FD}, //9774 #CJK UNIFIED IDEOGRAPH
+ {0xBBE1, 0x4F1A}, //9775 #CJK UNIFIED IDEOGRAPH
+ {0xBBE2, 0x70E9}, //9776 #CJK UNIFIED IDEOGRAPH
+ {0xBBE3, 0x6C47}, //9777 #CJK UNIFIED IDEOGRAPH
+ {0xBBE4, 0x8BB3}, //9778 #CJK UNIFIED IDEOGRAPH
+ {0xBBE5, 0x8BF2}, //9779 #CJK UNIFIED IDEOGRAPH
+ {0xBBE6, 0x7ED8}, //9780 #CJK UNIFIED IDEOGRAPH
+ {0xBBE7, 0x8364}, //9781 #CJK UNIFIED IDEOGRAPH
+ {0xBBE8, 0x660F}, //9782 #CJK UNIFIED IDEOGRAPH
+ {0xBBE9, 0x5A5A}, //9783 #CJK UNIFIED IDEOGRAPH
+ {0xBBEA, 0x9B42}, //9784 #CJK UNIFIED IDEOGRAPH
+ {0xBBEB, 0x6D51}, //9785 #CJK UNIFIED IDEOGRAPH
+ {0xBBEC, 0x6DF7}, //9786 #CJK UNIFIED IDEOGRAPH
+ {0xBBED, 0x8C41}, //9787 #CJK UNIFIED IDEOGRAPH
+ {0xBBEE, 0x6D3B}, //9788 #CJK UNIFIED IDEOGRAPH
+ {0xBBEF, 0x4F19}, //9789 #CJK UNIFIED IDEOGRAPH
+ {0xBBF0, 0x706B}, //9790 #CJK UNIFIED IDEOGRAPH
+ {0xBBF1, 0x83B7}, //9791 #CJK UNIFIED IDEOGRAPH
+ {0xBBF2, 0x6216}, //9792 #CJK UNIFIED IDEOGRAPH
+ {0xBBF3, 0x60D1}, //9793 #CJK UNIFIED IDEOGRAPH
+ {0xBBF4, 0x970D}, //9794 #CJK UNIFIED IDEOGRAPH
+ {0xBBF5, 0x8D27}, //9795 #CJK UNIFIED IDEOGRAPH
+ {0xBBF6, 0x7978}, //9796 #CJK UNIFIED IDEOGRAPH
+ {0xBBF7, 0x51FB}, //9797 #CJK UNIFIED IDEOGRAPH
+ {0xBBF8, 0x573E}, //9798 #CJK UNIFIED IDEOGRAPH
+ {0xBBF9, 0x57FA}, //9799 #CJK UNIFIED IDEOGRAPH
+ {0xBBFA, 0x673A}, //9800 #CJK UNIFIED IDEOGRAPH
+ {0xBBFB, 0x7578}, //9801 #CJK UNIFIED IDEOGRAPH
+ {0xBBFC, 0x7A3D}, //9802 #CJK UNIFIED IDEOGRAPH
+ {0xBBFD, 0x79EF}, //9803 #CJK UNIFIED IDEOGRAPH
+ {0xBBFE, 0x7B95}, //9804 #CJK UNIFIED IDEOGRAPH
+ {0xBC40, 0x7CBF}, //9805 #CJK UNIFIED IDEOGRAPH
+ {0xBC41, 0x7CC0}, //9806 #CJK UNIFIED IDEOGRAPH
+ {0xBC42, 0x7CC2}, //9807 #CJK UNIFIED IDEOGRAPH
+ {0xBC43, 0x7CC3}, //9808 #CJK UNIFIED IDEOGRAPH
+ {0xBC44, 0x7CC4}, //9809 #CJK UNIFIED IDEOGRAPH
+ {0xBC45, 0x7CC6}, //9810 #CJK UNIFIED IDEOGRAPH
+ {0xBC46, 0x7CC9}, //9811 #CJK UNIFIED IDEOGRAPH
+ {0xBC47, 0x7CCB}, //9812 #CJK UNIFIED IDEOGRAPH
+ {0xBC48, 0x7CCE}, //9813 #CJK UNIFIED IDEOGRAPH
+ {0xBC49, 0x7CCF}, //9814 #CJK UNIFIED IDEOGRAPH
+ {0xBC4A, 0x7CD0}, //9815 #CJK UNIFIED IDEOGRAPH
+ {0xBC4B, 0x7CD1}, //9816 #CJK UNIFIED IDEOGRAPH
+ {0xBC4C, 0x7CD2}, //9817 #CJK UNIFIED IDEOGRAPH
+ {0xBC4D, 0x7CD3}, //9818 #CJK UNIFIED IDEOGRAPH
+ {0xBC4E, 0x7CD4}, //9819 #CJK UNIFIED IDEOGRAPH
+ {0xBC4F, 0x7CD8}, //9820 #CJK UNIFIED IDEOGRAPH
+ {0xBC50, 0x7CDA}, //9821 #CJK UNIFIED IDEOGRAPH
+ {0xBC51, 0x7CDB}, //9822 #CJK UNIFIED IDEOGRAPH
+ {0xBC52, 0x7CDD}, //9823 #CJK UNIFIED IDEOGRAPH
+ {0xBC53, 0x7CDE}, //9824 #CJK UNIFIED IDEOGRAPH
+ {0xBC54, 0x7CE1}, //9825 #CJK UNIFIED IDEOGRAPH
+ {0xBC55, 0x7CE2}, //9826 #CJK UNIFIED IDEOGRAPH
+ {0xBC56, 0x7CE3}, //9827 #CJK UNIFIED IDEOGRAPH
+ {0xBC57, 0x7CE4}, //9828 #CJK UNIFIED IDEOGRAPH
+ {0xBC58, 0x7CE5}, //9829 #CJK UNIFIED IDEOGRAPH
+ {0xBC59, 0x7CE6}, //9830 #CJK UNIFIED IDEOGRAPH
+ {0xBC5A, 0x7CE7}, //9831 #CJK UNIFIED IDEOGRAPH
+ {0xBC5B, 0x7CE9}, //9832 #CJK UNIFIED IDEOGRAPH
+ {0xBC5C, 0x7CEA}, //9833 #CJK UNIFIED IDEOGRAPH
+ {0xBC5D, 0x7CEB}, //9834 #CJK UNIFIED IDEOGRAPH
+ {0xBC5E, 0x7CEC}, //9835 #CJK UNIFIED IDEOGRAPH
+ {0xBC5F, 0x7CED}, //9836 #CJK UNIFIED IDEOGRAPH
+ {0xBC60, 0x7CEE}, //9837 #CJK UNIFIED IDEOGRAPH
+ {0xBC61, 0x7CF0}, //9838 #CJK UNIFIED IDEOGRAPH
+ {0xBC62, 0x7CF1}, //9839 #CJK UNIFIED IDEOGRAPH
+ {0xBC63, 0x7CF2}, //9840 #CJK UNIFIED IDEOGRAPH
+ {0xBC64, 0x7CF3}, //9841 #CJK UNIFIED IDEOGRAPH
+ {0xBC65, 0x7CF4}, //9842 #CJK UNIFIED IDEOGRAPH
+ {0xBC66, 0x7CF5}, //9843 #CJK UNIFIED IDEOGRAPH
+ {0xBC67, 0x7CF6}, //9844 #CJK UNIFIED IDEOGRAPH
+ {0xBC68, 0x7CF7}, //9845 #CJK UNIFIED IDEOGRAPH
+ {0xBC69, 0x7CF9}, //9846 #CJK UNIFIED IDEOGRAPH
+ {0xBC6A, 0x7CFA}, //9847 #CJK UNIFIED IDEOGRAPH
+ {0xBC6B, 0x7CFC}, //9848 #CJK UNIFIED IDEOGRAPH
+ {0xBC6C, 0x7CFD}, //9849 #CJK UNIFIED IDEOGRAPH
+ {0xBC6D, 0x7CFE}, //9850 #CJK UNIFIED IDEOGRAPH
+ {0xBC6E, 0x7CFF}, //9851 #CJK UNIFIED IDEOGRAPH
+ {0xBC6F, 0x7D00}, //9852 #CJK UNIFIED IDEOGRAPH
+ {0xBC70, 0x7D01}, //9853 #CJK UNIFIED IDEOGRAPH
+ {0xBC71, 0x7D02}, //9854 #CJK UNIFIED IDEOGRAPH
+ {0xBC72, 0x7D03}, //9855 #CJK UNIFIED IDEOGRAPH
+ {0xBC73, 0x7D04}, //9856 #CJK UNIFIED IDEOGRAPH
+ {0xBC74, 0x7D05}, //9857 #CJK UNIFIED IDEOGRAPH
+ {0xBC75, 0x7D06}, //9858 #CJK UNIFIED IDEOGRAPH
+ {0xBC76, 0x7D07}, //9859 #CJK UNIFIED IDEOGRAPH
+ {0xBC77, 0x7D08}, //9860 #CJK UNIFIED IDEOGRAPH
+ {0xBC78, 0x7D09}, //9861 #CJK UNIFIED IDEOGRAPH
+ {0xBC79, 0x7D0B}, //9862 #CJK UNIFIED IDEOGRAPH
+ {0xBC7A, 0x7D0C}, //9863 #CJK UNIFIED IDEOGRAPH
+ {0xBC7B, 0x7D0D}, //9864 #CJK UNIFIED IDEOGRAPH
+ {0xBC7C, 0x7D0E}, //9865 #CJK UNIFIED IDEOGRAPH
+ {0xBC7D, 0x7D0F}, //9866 #CJK UNIFIED IDEOGRAPH
+ {0xBC7E, 0x7D10}, //9867 #CJK UNIFIED IDEOGRAPH
+ {0xBC80, 0x7D11}, //9868 #CJK UNIFIED IDEOGRAPH
+ {0xBC81, 0x7D12}, //9869 #CJK UNIFIED IDEOGRAPH
+ {0xBC82, 0x7D13}, //9870 #CJK UNIFIED IDEOGRAPH
+ {0xBC83, 0x7D14}, //9871 #CJK UNIFIED IDEOGRAPH
+ {0xBC84, 0x7D15}, //9872 #CJK UNIFIED IDEOGRAPH
+ {0xBC85, 0x7D16}, //9873 #CJK UNIFIED IDEOGRAPH
+ {0xBC86, 0x7D17}, //9874 #CJK UNIFIED IDEOGRAPH
+ {0xBC87, 0x7D18}, //9875 #CJK UNIFIED IDEOGRAPH
+ {0xBC88, 0x7D19}, //9876 #CJK UNIFIED IDEOGRAPH
+ {0xBC89, 0x7D1A}, //9877 #CJK UNIFIED IDEOGRAPH
+ {0xBC8A, 0x7D1B}, //9878 #CJK UNIFIED IDEOGRAPH
+ {0xBC8B, 0x7D1C}, //9879 #CJK UNIFIED IDEOGRAPH
+ {0xBC8C, 0x7D1D}, //9880 #CJK UNIFIED IDEOGRAPH
+ {0xBC8D, 0x7D1E}, //9881 #CJK UNIFIED IDEOGRAPH
+ {0xBC8E, 0x7D1F}, //9882 #CJK UNIFIED IDEOGRAPH
+ {0xBC8F, 0x7D21}, //9883 #CJK UNIFIED IDEOGRAPH
+ {0xBC90, 0x7D23}, //9884 #CJK UNIFIED IDEOGRAPH
+ {0xBC91, 0x7D24}, //9885 #CJK UNIFIED IDEOGRAPH
+ {0xBC92, 0x7D25}, //9886 #CJK UNIFIED IDEOGRAPH
+ {0xBC93, 0x7D26}, //9887 #CJK UNIFIED IDEOGRAPH
+ {0xBC94, 0x7D28}, //9888 #CJK UNIFIED IDEOGRAPH
+ {0xBC95, 0x7D29}, //9889 #CJK UNIFIED IDEOGRAPH
+ {0xBC96, 0x7D2A}, //9890 #CJK UNIFIED IDEOGRAPH
+ {0xBC97, 0x7D2C}, //9891 #CJK UNIFIED IDEOGRAPH
+ {0xBC98, 0x7D2D}, //9892 #CJK UNIFIED IDEOGRAPH
+ {0xBC99, 0x7D2E}, //9893 #CJK UNIFIED IDEOGRAPH
+ {0xBC9A, 0x7D30}, //9894 #CJK UNIFIED IDEOGRAPH
+ {0xBC9B, 0x7D31}, //9895 #CJK UNIFIED IDEOGRAPH
+ {0xBC9C, 0x7D32}, //9896 #CJK UNIFIED IDEOGRAPH
+ {0xBC9D, 0x7D33}, //9897 #CJK UNIFIED IDEOGRAPH
+ {0xBC9E, 0x7D34}, //9898 #CJK UNIFIED IDEOGRAPH
+ {0xBC9F, 0x7D35}, //9899 #CJK UNIFIED IDEOGRAPH
+ {0xBCA0, 0x7D36}, //9900 #CJK UNIFIED IDEOGRAPH
+ {0xBCA1, 0x808C}, //9901 #CJK UNIFIED IDEOGRAPH
+ {0xBCA2, 0x9965}, //9902 #CJK UNIFIED IDEOGRAPH
+ {0xBCA3, 0x8FF9}, //9903 #CJK UNIFIED IDEOGRAPH
+ {0xBCA4, 0x6FC0}, //9904 #CJK UNIFIED IDEOGRAPH
+ {0xBCA5, 0x8BA5}, //9905 #CJK UNIFIED IDEOGRAPH
+ {0xBCA6, 0x9E21}, //9906 #CJK UNIFIED IDEOGRAPH
+ {0xBCA7, 0x59EC}, //9907 #CJK UNIFIED IDEOGRAPH
+ {0xBCA8, 0x7EE9}, //9908 #CJK UNIFIED IDEOGRAPH
+ {0xBCA9, 0x7F09}, //9909 #CJK UNIFIED IDEOGRAPH
+ {0xBCAA, 0x5409}, //9910 #CJK UNIFIED IDEOGRAPH
+ {0xBCAB, 0x6781}, //9911 #CJK UNIFIED IDEOGRAPH
+ {0xBCAC, 0x68D8}, //9912 #CJK UNIFIED IDEOGRAPH
+ {0xBCAD, 0x8F91}, //9913 #CJK UNIFIED IDEOGRAPH
+ {0xBCAE, 0x7C4D}, //9914 #CJK UNIFIED IDEOGRAPH
+ {0xBCAF, 0x96C6}, //9915 #CJK UNIFIED IDEOGRAPH
+ {0xBCB0, 0x53CA}, //9916 #CJK UNIFIED IDEOGRAPH
+ {0xBCB1, 0x6025}, //9917 #CJK UNIFIED IDEOGRAPH
+ {0xBCB2, 0x75BE}, //9918 #CJK UNIFIED IDEOGRAPH
+ {0xBCB3, 0x6C72}, //9919 #CJK UNIFIED IDEOGRAPH
+ {0xBCB4, 0x5373}, //9920 #CJK UNIFIED IDEOGRAPH
+ {0xBCB5, 0x5AC9}, //9921 #CJK UNIFIED IDEOGRAPH
+ {0xBCB6, 0x7EA7}, //9922 #CJK UNIFIED IDEOGRAPH
+ {0xBCB7, 0x6324}, //9923 #CJK UNIFIED IDEOGRAPH
+ {0xBCB8, 0x51E0}, //9924 #CJK UNIFIED IDEOGRAPH
+ {0xBCB9, 0x810A}, //9925 #CJK UNIFIED IDEOGRAPH
+ {0xBCBA, 0x5DF1}, //9926 #CJK UNIFIED IDEOGRAPH
+ {0xBCBB, 0x84DF}, //9927 #CJK UNIFIED IDEOGRAPH
+ {0xBCBC, 0x6280}, //9928 #CJK UNIFIED IDEOGRAPH
+ {0xBCBD, 0x5180}, //9929 #CJK UNIFIED IDEOGRAPH
+ {0xBCBE, 0x5B63}, //9930 #CJK UNIFIED IDEOGRAPH
+ {0xBCBF, 0x4F0E}, //9931 #CJK UNIFIED IDEOGRAPH
+ {0xBCC0, 0x796D}, //9932 #CJK UNIFIED IDEOGRAPH
+ {0xBCC1, 0x5242}, //9933 #CJK UNIFIED IDEOGRAPH
+ {0xBCC2, 0x60B8}, //9934 #CJK UNIFIED IDEOGRAPH
+ {0xBCC3, 0x6D4E}, //9935 #CJK UNIFIED IDEOGRAPH
+ {0xBCC4, 0x5BC4}, //9936 #CJK UNIFIED IDEOGRAPH
+ {0xBCC5, 0x5BC2}, //9937 #CJK UNIFIED IDEOGRAPH
+ {0xBCC6, 0x8BA1}, //9938 #CJK UNIFIED IDEOGRAPH
+ {0xBCC7, 0x8BB0}, //9939 #CJK UNIFIED IDEOGRAPH
+ {0xBCC8, 0x65E2}, //9940 #CJK UNIFIED IDEOGRAPH
+ {0xBCC9, 0x5FCC}, //9941 #CJK UNIFIED IDEOGRAPH
+ {0xBCCA, 0x9645}, //9942 #CJK UNIFIED IDEOGRAPH
+ {0xBCCB, 0x5993}, //9943 #CJK UNIFIED IDEOGRAPH
+ {0xBCCC, 0x7EE7}, //9944 #CJK UNIFIED IDEOGRAPH
+ {0xBCCD, 0x7EAA}, //9945 #CJK UNIFIED IDEOGRAPH
+ {0xBCCE, 0x5609}, //9946 #CJK UNIFIED IDEOGRAPH
+ {0xBCCF, 0x67B7}, //9947 #CJK UNIFIED IDEOGRAPH
+ {0xBCD0, 0x5939}, //9948 #CJK UNIFIED IDEOGRAPH
+ {0xBCD1, 0x4F73}, //9949 #CJK UNIFIED IDEOGRAPH
+ {0xBCD2, 0x5BB6}, //9950 #CJK UNIFIED IDEOGRAPH
+ {0xBCD3, 0x52A0}, //9951 #CJK UNIFIED IDEOGRAPH
+ {0xBCD4, 0x835A}, //9952 #CJK UNIFIED IDEOGRAPH
+ {0xBCD5, 0x988A}, //9953 #CJK UNIFIED IDEOGRAPH
+ {0xBCD6, 0x8D3E}, //9954 #CJK UNIFIED IDEOGRAPH
+ {0xBCD7, 0x7532}, //9955 #CJK UNIFIED IDEOGRAPH
+ {0xBCD8, 0x94BE}, //9956 #CJK UNIFIED IDEOGRAPH
+ {0xBCD9, 0x5047}, //9957 #CJK UNIFIED IDEOGRAPH
+ {0xBCDA, 0x7A3C}, //9958 #CJK UNIFIED IDEOGRAPH
+ {0xBCDB, 0x4EF7}, //9959 #CJK UNIFIED IDEOGRAPH
+ {0xBCDC, 0x67B6}, //9960 #CJK UNIFIED IDEOGRAPH
+ {0xBCDD, 0x9A7E}, //9961 #CJK UNIFIED IDEOGRAPH
+ {0xBCDE, 0x5AC1}, //9962 #CJK UNIFIED IDEOGRAPH
+ {0xBCDF, 0x6B7C}, //9963 #CJK UNIFIED IDEOGRAPH
+ {0xBCE0, 0x76D1}, //9964 #CJK UNIFIED IDEOGRAPH
+ {0xBCE1, 0x575A}, //9965 #CJK UNIFIED IDEOGRAPH
+ {0xBCE2, 0x5C16}, //9966 #CJK UNIFIED IDEOGRAPH
+ {0xBCE3, 0x7B3A}, //9967 #CJK UNIFIED IDEOGRAPH
+ {0xBCE4, 0x95F4}, //9968 #CJK UNIFIED IDEOGRAPH
+ {0xBCE5, 0x714E}, //9969 #CJK UNIFIED IDEOGRAPH
+ {0xBCE6, 0x517C}, //9970 #CJK UNIFIED IDEOGRAPH
+ {0xBCE7, 0x80A9}, //9971 #CJK UNIFIED IDEOGRAPH
+ {0xBCE8, 0x8270}, //9972 #CJK UNIFIED IDEOGRAPH
+ {0xBCE9, 0x5978}, //9973 #CJK UNIFIED IDEOGRAPH
+ {0xBCEA, 0x7F04}, //9974 #CJK UNIFIED IDEOGRAPH
+ {0xBCEB, 0x8327}, //9975 #CJK UNIFIED IDEOGRAPH
+ {0xBCEC, 0x68C0}, //9976 #CJK UNIFIED IDEOGRAPH
+ {0xBCED, 0x67EC}, //9977 #CJK UNIFIED IDEOGRAPH
+ {0xBCEE, 0x78B1}, //9978 #CJK UNIFIED IDEOGRAPH
+ {0xBCEF, 0x7877}, //9979 #CJK UNIFIED IDEOGRAPH
+ {0xBCF0, 0x62E3}, //9980 #CJK UNIFIED IDEOGRAPH
+ {0xBCF1, 0x6361}, //9981 #CJK UNIFIED IDEOGRAPH
+ {0xBCF2, 0x7B80}, //9982 #CJK UNIFIED IDEOGRAPH
+ {0xBCF3, 0x4FED}, //9983 #CJK UNIFIED IDEOGRAPH
+ {0xBCF4, 0x526A}, //9984 #CJK UNIFIED IDEOGRAPH
+ {0xBCF5, 0x51CF}, //9985 #CJK UNIFIED IDEOGRAPH
+ {0xBCF6, 0x8350}, //9986 #CJK UNIFIED IDEOGRAPH
+ {0xBCF7, 0x69DB}, //9987 #CJK UNIFIED IDEOGRAPH
+ {0xBCF8, 0x9274}, //9988 #CJK UNIFIED IDEOGRAPH
+ {0xBCF9, 0x8DF5}, //9989 #CJK UNIFIED IDEOGRAPH
+ {0xBCFA, 0x8D31}, //9990 #CJK UNIFIED IDEOGRAPH
+ {0xBCFB, 0x89C1}, //9991 #CJK UNIFIED IDEOGRAPH
+ {0xBCFC, 0x952E}, //9992 #CJK UNIFIED IDEOGRAPH
+ {0xBCFD, 0x7BAD}, //9993 #CJK UNIFIED IDEOGRAPH
+ {0xBCFE, 0x4EF6}, //9994 #CJK UNIFIED IDEOGRAPH
+ {0xBD40, 0x7D37}, //9995 #CJK UNIFIED IDEOGRAPH
+ {0xBD41, 0x7D38}, //9996 #CJK UNIFIED IDEOGRAPH
+ {0xBD42, 0x7D39}, //9997 #CJK UNIFIED IDEOGRAPH
+ {0xBD43, 0x7D3A}, //9998 #CJK UNIFIED IDEOGRAPH
+ {0xBD44, 0x7D3B}, //9999 #CJK UNIFIED IDEOGRAPH
+ {0xBD45, 0x7D3C}, //10000 #CJK UNIFIED IDEOGRAPH
+ {0xBD46, 0x7D3D}, //10001 #CJK UNIFIED IDEOGRAPH
+ {0xBD47, 0x7D3E}, //10002 #CJK UNIFIED IDEOGRAPH
+ {0xBD48, 0x7D3F}, //10003 #CJK UNIFIED IDEOGRAPH
+ {0xBD49, 0x7D40}, //10004 #CJK UNIFIED IDEOGRAPH
+ {0xBD4A, 0x7D41}, //10005 #CJK UNIFIED IDEOGRAPH
+ {0xBD4B, 0x7D42}, //10006 #CJK UNIFIED IDEOGRAPH
+ {0xBD4C, 0x7D43}, //10007 #CJK UNIFIED IDEOGRAPH
+ {0xBD4D, 0x7D44}, //10008 #CJK UNIFIED IDEOGRAPH
+ {0xBD4E, 0x7D45}, //10009 #CJK UNIFIED IDEOGRAPH
+ {0xBD4F, 0x7D46}, //10010 #CJK UNIFIED IDEOGRAPH
+ {0xBD50, 0x7D47}, //10011 #CJK UNIFIED IDEOGRAPH
+ {0xBD51, 0x7D48}, //10012 #CJK UNIFIED IDEOGRAPH
+ {0xBD52, 0x7D49}, //10013 #CJK UNIFIED IDEOGRAPH
+ {0xBD53, 0x7D4A}, //10014 #CJK UNIFIED IDEOGRAPH
+ {0xBD54, 0x7D4B}, //10015 #CJK UNIFIED IDEOGRAPH
+ {0xBD55, 0x7D4C}, //10016 #CJK UNIFIED IDEOGRAPH
+ {0xBD56, 0x7D4D}, //10017 #CJK UNIFIED IDEOGRAPH
+ {0xBD57, 0x7D4E}, //10018 #CJK UNIFIED IDEOGRAPH
+ {0xBD58, 0x7D4F}, //10019 #CJK UNIFIED IDEOGRAPH
+ {0xBD59, 0x7D50}, //10020 #CJK UNIFIED IDEOGRAPH
+ {0xBD5A, 0x7D51}, //10021 #CJK UNIFIED IDEOGRAPH
+ {0xBD5B, 0x7D52}, //10022 #CJK UNIFIED IDEOGRAPH
+ {0xBD5C, 0x7D53}, //10023 #CJK UNIFIED IDEOGRAPH
+ {0xBD5D, 0x7D54}, //10024 #CJK UNIFIED IDEOGRAPH
+ {0xBD5E, 0x7D55}, //10025 #CJK UNIFIED IDEOGRAPH
+ {0xBD5F, 0x7D56}, //10026 #CJK UNIFIED IDEOGRAPH
+ {0xBD60, 0x7D57}, //10027 #CJK UNIFIED IDEOGRAPH
+ {0xBD61, 0x7D58}, //10028 #CJK UNIFIED IDEOGRAPH
+ {0xBD62, 0x7D59}, //10029 #CJK UNIFIED IDEOGRAPH
+ {0xBD63, 0x7D5A}, //10030 #CJK UNIFIED IDEOGRAPH
+ {0xBD64, 0x7D5B}, //10031 #CJK UNIFIED IDEOGRAPH
+ {0xBD65, 0x7D5C}, //10032 #CJK UNIFIED IDEOGRAPH
+ {0xBD66, 0x7D5D}, //10033 #CJK UNIFIED IDEOGRAPH
+ {0xBD67, 0x7D5E}, //10034 #CJK UNIFIED IDEOGRAPH
+ {0xBD68, 0x7D5F}, //10035 #CJK UNIFIED IDEOGRAPH
+ {0xBD69, 0x7D60}, //10036 #CJK UNIFIED IDEOGRAPH
+ {0xBD6A, 0x7D61}, //10037 #CJK UNIFIED IDEOGRAPH
+ {0xBD6B, 0x7D62}, //10038 #CJK UNIFIED IDEOGRAPH
+ {0xBD6C, 0x7D63}, //10039 #CJK UNIFIED IDEOGRAPH
+ {0xBD6D, 0x7D64}, //10040 #CJK UNIFIED IDEOGRAPH
+ {0xBD6E, 0x7D65}, //10041 #CJK UNIFIED IDEOGRAPH
+ {0xBD6F, 0x7D66}, //10042 #CJK UNIFIED IDEOGRAPH
+ {0xBD70, 0x7D67}, //10043 #CJK UNIFIED IDEOGRAPH
+ {0xBD71, 0x7D68}, //10044 #CJK UNIFIED IDEOGRAPH
+ {0xBD72, 0x7D69}, //10045 #CJK UNIFIED IDEOGRAPH
+ {0xBD73, 0x7D6A}, //10046 #CJK UNIFIED IDEOGRAPH
+ {0xBD74, 0x7D6B}, //10047 #CJK UNIFIED IDEOGRAPH
+ {0xBD75, 0x7D6C}, //10048 #CJK UNIFIED IDEOGRAPH
+ {0xBD76, 0x7D6D}, //10049 #CJK UNIFIED IDEOGRAPH
+ {0xBD77, 0x7D6F}, //10050 #CJK UNIFIED IDEOGRAPH
+ {0xBD78, 0x7D70}, //10051 #CJK UNIFIED IDEOGRAPH
+ {0xBD79, 0x7D71}, //10052 #CJK UNIFIED IDEOGRAPH
+ {0xBD7A, 0x7D72}, //10053 #CJK UNIFIED IDEOGRAPH
+ {0xBD7B, 0x7D73}, //10054 #CJK UNIFIED IDEOGRAPH
+ {0xBD7C, 0x7D74}, //10055 #CJK UNIFIED IDEOGRAPH
+ {0xBD7D, 0x7D75}, //10056 #CJK UNIFIED IDEOGRAPH
+ {0xBD7E, 0x7D76}, //10057 #CJK UNIFIED IDEOGRAPH
+ {0xBD80, 0x7D78}, //10058 #CJK UNIFIED IDEOGRAPH
+ {0xBD81, 0x7D79}, //10059 #CJK UNIFIED IDEOGRAPH
+ {0xBD82, 0x7D7A}, //10060 #CJK UNIFIED IDEOGRAPH
+ {0xBD83, 0x7D7B}, //10061 #CJK UNIFIED IDEOGRAPH
+ {0xBD84, 0x7D7C}, //10062 #CJK UNIFIED IDEOGRAPH
+ {0xBD85, 0x7D7D}, //10063 #CJK UNIFIED IDEOGRAPH
+ {0xBD86, 0x7D7E}, //10064 #CJK UNIFIED IDEOGRAPH
+ {0xBD87, 0x7D7F}, //10065 #CJK UNIFIED IDEOGRAPH
+ {0xBD88, 0x7D80}, //10066 #CJK UNIFIED IDEOGRAPH
+ {0xBD89, 0x7D81}, //10067 #CJK UNIFIED IDEOGRAPH
+ {0xBD8A, 0x7D82}, //10068 #CJK UNIFIED IDEOGRAPH
+ {0xBD8B, 0x7D83}, //10069 #CJK UNIFIED IDEOGRAPH
+ {0xBD8C, 0x7D84}, //10070 #CJK UNIFIED IDEOGRAPH
+ {0xBD8D, 0x7D85}, //10071 #CJK UNIFIED IDEOGRAPH
+ {0xBD8E, 0x7D86}, //10072 #CJK UNIFIED IDEOGRAPH
+ {0xBD8F, 0x7D87}, //10073 #CJK UNIFIED IDEOGRAPH
+ {0xBD90, 0x7D88}, //10074 #CJK UNIFIED IDEOGRAPH
+ {0xBD91, 0x7D89}, //10075 #CJK UNIFIED IDEOGRAPH
+ {0xBD92, 0x7D8A}, //10076 #CJK UNIFIED IDEOGRAPH
+ {0xBD93, 0x7D8B}, //10077 #CJK UNIFIED IDEOGRAPH
+ {0xBD94, 0x7D8C}, //10078 #CJK UNIFIED IDEOGRAPH
+ {0xBD95, 0x7D8D}, //10079 #CJK UNIFIED IDEOGRAPH
+ {0xBD96, 0x7D8E}, //10080 #CJK UNIFIED IDEOGRAPH
+ {0xBD97, 0x7D8F}, //10081 #CJK UNIFIED IDEOGRAPH
+ {0xBD98, 0x7D90}, //10082 #CJK UNIFIED IDEOGRAPH
+ {0xBD99, 0x7D91}, //10083 #CJK UNIFIED IDEOGRAPH
+ {0xBD9A, 0x7D92}, //10084 #CJK UNIFIED IDEOGRAPH
+ {0xBD9B, 0x7D93}, //10085 #CJK UNIFIED IDEOGRAPH
+ {0xBD9C, 0x7D94}, //10086 #CJK UNIFIED IDEOGRAPH
+ {0xBD9D, 0x7D95}, //10087 #CJK UNIFIED IDEOGRAPH
+ {0xBD9E, 0x7D96}, //10088 #CJK UNIFIED IDEOGRAPH
+ {0xBD9F, 0x7D97}, //10089 #CJK UNIFIED IDEOGRAPH
+ {0xBDA0, 0x7D98}, //10090 #CJK UNIFIED IDEOGRAPH
+ {0xBDA1, 0x5065}, //10091 #CJK UNIFIED IDEOGRAPH
+ {0xBDA2, 0x8230}, //10092 #CJK UNIFIED IDEOGRAPH
+ {0xBDA3, 0x5251}, //10093 #CJK UNIFIED IDEOGRAPH
+ {0xBDA4, 0x996F}, //10094 #CJK UNIFIED IDEOGRAPH
+ {0xBDA5, 0x6E10}, //10095 #CJK UNIFIED IDEOGRAPH
+ {0xBDA6, 0x6E85}, //10096 #CJK UNIFIED IDEOGRAPH
+ {0xBDA7, 0x6DA7}, //10097 #CJK UNIFIED IDEOGRAPH
+ {0xBDA8, 0x5EFA}, //10098 #CJK UNIFIED IDEOGRAPH
+ {0xBDA9, 0x50F5}, //10099 #CJK UNIFIED IDEOGRAPH
+ {0xBDAA, 0x59DC}, //10100 #CJK UNIFIED IDEOGRAPH
+ {0xBDAB, 0x5C06}, //10101 #CJK UNIFIED IDEOGRAPH
+ {0xBDAC, 0x6D46}, //10102 #CJK UNIFIED IDEOGRAPH
+ {0xBDAD, 0x6C5F}, //10103 #CJK UNIFIED IDEOGRAPH
+ {0xBDAE, 0x7586}, //10104 #CJK UNIFIED IDEOGRAPH
+ {0xBDAF, 0x848B}, //10105 #CJK UNIFIED IDEOGRAPH
+ {0xBDB0, 0x6868}, //10106 #CJK UNIFIED IDEOGRAPH
+ {0xBDB1, 0x5956}, //10107 #CJK UNIFIED IDEOGRAPH
+ {0xBDB2, 0x8BB2}, //10108 #CJK UNIFIED IDEOGRAPH
+ {0xBDB3, 0x5320}, //10109 #CJK UNIFIED IDEOGRAPH
+ {0xBDB4, 0x9171}, //10110 #CJK UNIFIED IDEOGRAPH
+ {0xBDB5, 0x964D}, //10111 #CJK UNIFIED IDEOGRAPH
+ {0xBDB6, 0x8549}, //10112 #CJK UNIFIED IDEOGRAPH
+ {0xBDB7, 0x6912}, //10113 #CJK UNIFIED IDEOGRAPH
+ {0xBDB8, 0x7901}, //10114 #CJK UNIFIED IDEOGRAPH
+ {0xBDB9, 0x7126}, //10115 #CJK UNIFIED IDEOGRAPH
+ {0xBDBA, 0x80F6}, //10116 #CJK UNIFIED IDEOGRAPH
+ {0xBDBB, 0x4EA4}, //10117 #CJK UNIFIED IDEOGRAPH
+ {0xBDBC, 0x90CA}, //10118 #CJK UNIFIED IDEOGRAPH
+ {0xBDBD, 0x6D47}, //10119 #CJK UNIFIED IDEOGRAPH
+ {0xBDBE, 0x9A84}, //10120 #CJK UNIFIED IDEOGRAPH
+ {0xBDBF, 0x5A07}, //10121 #CJK UNIFIED IDEOGRAPH
+ {0xBDC0, 0x56BC}, //10122 #CJK UNIFIED IDEOGRAPH
+ {0xBDC1, 0x6405}, //10123 #CJK UNIFIED IDEOGRAPH
+ {0xBDC2, 0x94F0}, //10124 #CJK UNIFIED IDEOGRAPH
+ {0xBDC3, 0x77EB}, //10125 #CJK UNIFIED IDEOGRAPH
+ {0xBDC4, 0x4FA5}, //10126 #CJK UNIFIED IDEOGRAPH
+ {0xBDC5, 0x811A}, //10127 #CJK UNIFIED IDEOGRAPH
+ {0xBDC6, 0x72E1}, //10128 #CJK UNIFIED IDEOGRAPH
+ {0xBDC7, 0x89D2}, //10129 #CJK UNIFIED IDEOGRAPH
+ {0xBDC8, 0x997A}, //10130 #CJK UNIFIED IDEOGRAPH
+ {0xBDC9, 0x7F34}, //10131 #CJK UNIFIED IDEOGRAPH
+ {0xBDCA, 0x7EDE}, //10132 #CJK UNIFIED IDEOGRAPH
+ {0xBDCB, 0x527F}, //10133 #CJK UNIFIED IDEOGRAPH
+ {0xBDCC, 0x6559}, //10134 #CJK UNIFIED IDEOGRAPH
+ {0xBDCD, 0x9175}, //10135 #CJK UNIFIED IDEOGRAPH
+ {0xBDCE, 0x8F7F}, //10136 #CJK UNIFIED IDEOGRAPH
+ {0xBDCF, 0x8F83}, //10137 #CJK UNIFIED IDEOGRAPH
+ {0xBDD0, 0x53EB}, //10138 #CJK UNIFIED IDEOGRAPH
+ {0xBDD1, 0x7A96}, //10139 #CJK UNIFIED IDEOGRAPH
+ {0xBDD2, 0x63ED}, //10140 #CJK UNIFIED IDEOGRAPH
+ {0xBDD3, 0x63A5}, //10141 #CJK UNIFIED IDEOGRAPH
+ {0xBDD4, 0x7686}, //10142 #CJK UNIFIED IDEOGRAPH
+ {0xBDD5, 0x79F8}, //10143 #CJK UNIFIED IDEOGRAPH
+ {0xBDD6, 0x8857}, //10144 #CJK UNIFIED IDEOGRAPH
+ {0xBDD7, 0x9636}, //10145 #CJK UNIFIED IDEOGRAPH
+ {0xBDD8, 0x622A}, //10146 #CJK UNIFIED IDEOGRAPH
+ {0xBDD9, 0x52AB}, //10147 #CJK UNIFIED IDEOGRAPH
+ {0xBDDA, 0x8282}, //10148 #CJK UNIFIED IDEOGRAPH
+ {0xBDDB, 0x6854}, //10149 #CJK UNIFIED IDEOGRAPH
+ {0xBDDC, 0x6770}, //10150 #CJK UNIFIED IDEOGRAPH
+ {0xBDDD, 0x6377}, //10151 #CJK UNIFIED IDEOGRAPH
+ {0xBDDE, 0x776B}, //10152 #CJK UNIFIED IDEOGRAPH
+ {0xBDDF, 0x7AED}, //10153 #CJK UNIFIED IDEOGRAPH
+ {0xBDE0, 0x6D01}, //10154 #CJK UNIFIED IDEOGRAPH
+ {0xBDE1, 0x7ED3}, //10155 #CJK UNIFIED IDEOGRAPH
+ {0xBDE2, 0x89E3}, //10156 #CJK UNIFIED IDEOGRAPH
+ {0xBDE3, 0x59D0}, //10157 #CJK UNIFIED IDEOGRAPH
+ {0xBDE4, 0x6212}, //10158 #CJK UNIFIED IDEOGRAPH
+ {0xBDE5, 0x85C9}, //10159 #CJK UNIFIED IDEOGRAPH
+ {0xBDE6, 0x82A5}, //10160 #CJK UNIFIED IDEOGRAPH
+ {0xBDE7, 0x754C}, //10161 #CJK UNIFIED IDEOGRAPH
+ {0xBDE8, 0x501F}, //10162 #CJK UNIFIED IDEOGRAPH
+ {0xBDE9, 0x4ECB}, //10163 #CJK UNIFIED IDEOGRAPH
+ {0xBDEA, 0x75A5}, //10164 #CJK UNIFIED IDEOGRAPH
+ {0xBDEB, 0x8BEB}, //10165 #CJK UNIFIED IDEOGRAPH
+ {0xBDEC, 0x5C4A}, //10166 #CJK UNIFIED IDEOGRAPH
+ {0xBDED, 0x5DFE}, //10167 #CJK UNIFIED IDEOGRAPH
+ {0xBDEE, 0x7B4B}, //10168 #CJK UNIFIED IDEOGRAPH
+ {0xBDEF, 0x65A4}, //10169 #CJK UNIFIED IDEOGRAPH
+ {0xBDF0, 0x91D1}, //10170 #CJK UNIFIED IDEOGRAPH
+ {0xBDF1, 0x4ECA}, //10171 #CJK UNIFIED IDEOGRAPH
+ {0xBDF2, 0x6D25}, //10172 #CJK UNIFIED IDEOGRAPH
+ {0xBDF3, 0x895F}, //10173 #CJK UNIFIED IDEOGRAPH
+ {0xBDF4, 0x7D27}, //10174 #CJK UNIFIED IDEOGRAPH
+ {0xBDF5, 0x9526}, //10175 #CJK UNIFIED IDEOGRAPH
+ {0xBDF6, 0x4EC5}, //10176 #CJK UNIFIED IDEOGRAPH
+ {0xBDF7, 0x8C28}, //10177 #CJK UNIFIED IDEOGRAPH
+ {0xBDF8, 0x8FDB}, //10178 #CJK UNIFIED IDEOGRAPH
+ {0xBDF9, 0x9773}, //10179 #CJK UNIFIED IDEOGRAPH
+ {0xBDFA, 0x664B}, //10180 #CJK UNIFIED IDEOGRAPH
+ {0xBDFB, 0x7981}, //10181 #CJK UNIFIED IDEOGRAPH
+ {0xBDFC, 0x8FD1}, //10182 #CJK UNIFIED IDEOGRAPH
+ {0xBDFD, 0x70EC}, //10183 #CJK UNIFIED IDEOGRAPH
+ {0xBDFE, 0x6D78}, //10184 #CJK UNIFIED IDEOGRAPH
+ {0xBE40, 0x7D99}, //10185 #CJK UNIFIED IDEOGRAPH
+ {0xBE41, 0x7D9A}, //10186 #CJK UNIFIED IDEOGRAPH
+ {0xBE42, 0x7D9B}, //10187 #CJK UNIFIED IDEOGRAPH
+ {0xBE43, 0x7D9C}, //10188 #CJK UNIFIED IDEOGRAPH
+ {0xBE44, 0x7D9D}, //10189 #CJK UNIFIED IDEOGRAPH
+ {0xBE45, 0x7D9E}, //10190 #CJK UNIFIED IDEOGRAPH
+ {0xBE46, 0x7D9F}, //10191 #CJK UNIFIED IDEOGRAPH
+ {0xBE47, 0x7DA0}, //10192 #CJK UNIFIED IDEOGRAPH
+ {0xBE48, 0x7DA1}, //10193 #CJK UNIFIED IDEOGRAPH
+ {0xBE49, 0x7DA2}, //10194 #CJK UNIFIED IDEOGRAPH
+ {0xBE4A, 0x7DA3}, //10195 #CJK UNIFIED IDEOGRAPH
+ {0xBE4B, 0x7DA4}, //10196 #CJK UNIFIED IDEOGRAPH
+ {0xBE4C, 0x7DA5}, //10197 #CJK UNIFIED IDEOGRAPH
+ {0xBE4D, 0x7DA7}, //10198 #CJK UNIFIED IDEOGRAPH
+ {0xBE4E, 0x7DA8}, //10199 #CJK UNIFIED IDEOGRAPH
+ {0xBE4F, 0x7DA9}, //10200 #CJK UNIFIED IDEOGRAPH
+ {0xBE50, 0x7DAA}, //10201 #CJK UNIFIED IDEOGRAPH
+ {0xBE51, 0x7DAB}, //10202 #CJK UNIFIED IDEOGRAPH
+ {0xBE52, 0x7DAC}, //10203 #CJK UNIFIED IDEOGRAPH
+ {0xBE53, 0x7DAD}, //10204 #CJK UNIFIED IDEOGRAPH
+ {0xBE54, 0x7DAF}, //10205 #CJK UNIFIED IDEOGRAPH
+ {0xBE55, 0x7DB0}, //10206 #CJK UNIFIED IDEOGRAPH
+ {0xBE56, 0x7DB1}, //10207 #CJK UNIFIED IDEOGRAPH
+ {0xBE57, 0x7DB2}, //10208 #CJK UNIFIED IDEOGRAPH
+ {0xBE58, 0x7DB3}, //10209 #CJK UNIFIED IDEOGRAPH
+ {0xBE59, 0x7DB4}, //10210 #CJK UNIFIED IDEOGRAPH
+ {0xBE5A, 0x7DB5}, //10211 #CJK UNIFIED IDEOGRAPH
+ {0xBE5B, 0x7DB6}, //10212 #CJK UNIFIED IDEOGRAPH
+ {0xBE5C, 0x7DB7}, //10213 #CJK UNIFIED IDEOGRAPH
+ {0xBE5D, 0x7DB8}, //10214 #CJK UNIFIED IDEOGRAPH
+ {0xBE5E, 0x7DB9}, //10215 #CJK UNIFIED IDEOGRAPH
+ {0xBE5F, 0x7DBA}, //10216 #CJK UNIFIED IDEOGRAPH
+ {0xBE60, 0x7DBB}, //10217 #CJK UNIFIED IDEOGRAPH
+ {0xBE61, 0x7DBC}, //10218 #CJK UNIFIED IDEOGRAPH
+ {0xBE62, 0x7DBD}, //10219 #CJK UNIFIED IDEOGRAPH
+ {0xBE63, 0x7DBE}, //10220 #CJK UNIFIED IDEOGRAPH
+ {0xBE64, 0x7DBF}, //10221 #CJK UNIFIED IDEOGRAPH
+ {0xBE65, 0x7DC0}, //10222 #CJK UNIFIED IDEOGRAPH
+ {0xBE66, 0x7DC1}, //10223 #CJK UNIFIED IDEOGRAPH
+ {0xBE67, 0x7DC2}, //10224 #CJK UNIFIED IDEOGRAPH
+ {0xBE68, 0x7DC3}, //10225 #CJK UNIFIED IDEOGRAPH
+ {0xBE69, 0x7DC4}, //10226 #CJK UNIFIED IDEOGRAPH
+ {0xBE6A, 0x7DC5}, //10227 #CJK UNIFIED IDEOGRAPH
+ {0xBE6B, 0x7DC6}, //10228 #CJK UNIFIED IDEOGRAPH
+ {0xBE6C, 0x7DC7}, //10229 #CJK UNIFIED IDEOGRAPH
+ {0xBE6D, 0x7DC8}, //10230 #CJK UNIFIED IDEOGRAPH
+ {0xBE6E, 0x7DC9}, //10231 #CJK UNIFIED IDEOGRAPH
+ {0xBE6F, 0x7DCA}, //10232 #CJK UNIFIED IDEOGRAPH
+ {0xBE70, 0x7DCB}, //10233 #CJK UNIFIED IDEOGRAPH
+ {0xBE71, 0x7DCC}, //10234 #CJK UNIFIED IDEOGRAPH
+ {0xBE72, 0x7DCD}, //10235 #CJK UNIFIED IDEOGRAPH
+ {0xBE73, 0x7DCE}, //10236 #CJK UNIFIED IDEOGRAPH
+ {0xBE74, 0x7DCF}, //10237 #CJK UNIFIED IDEOGRAPH
+ {0xBE75, 0x7DD0}, //10238 #CJK UNIFIED IDEOGRAPH
+ {0xBE76, 0x7DD1}, //10239 #CJK UNIFIED IDEOGRAPH
+ {0xBE77, 0x7DD2}, //10240 #CJK UNIFIED IDEOGRAPH
+ {0xBE78, 0x7DD3}, //10241 #CJK UNIFIED IDEOGRAPH
+ {0xBE79, 0x7DD4}, //10242 #CJK UNIFIED IDEOGRAPH
+ {0xBE7A, 0x7DD5}, //10243 #CJK UNIFIED IDEOGRAPH
+ {0xBE7B, 0x7DD6}, //10244 #CJK UNIFIED IDEOGRAPH
+ {0xBE7C, 0x7DD7}, //10245 #CJK UNIFIED IDEOGRAPH
+ {0xBE7D, 0x7DD8}, //10246 #CJK UNIFIED IDEOGRAPH
+ {0xBE7E, 0x7DD9}, //10247 #CJK UNIFIED IDEOGRAPH
+ {0xBE80, 0x7DDA}, //10248 #CJK UNIFIED IDEOGRAPH
+ {0xBE81, 0x7DDB}, //10249 #CJK UNIFIED IDEOGRAPH
+ {0xBE82, 0x7DDC}, //10250 #CJK UNIFIED IDEOGRAPH
+ {0xBE83, 0x7DDD}, //10251 #CJK UNIFIED IDEOGRAPH
+ {0xBE84, 0x7DDE}, //10252 #CJK UNIFIED IDEOGRAPH
+ {0xBE85, 0x7DDF}, //10253 #CJK UNIFIED IDEOGRAPH
+ {0xBE86, 0x7DE0}, //10254 #CJK UNIFIED IDEOGRAPH
+ {0xBE87, 0x7DE1}, //10255 #CJK UNIFIED IDEOGRAPH
+ {0xBE88, 0x7DE2}, //10256 #CJK UNIFIED IDEOGRAPH
+ {0xBE89, 0x7DE3}, //10257 #CJK UNIFIED IDEOGRAPH
+ {0xBE8A, 0x7DE4}, //10258 #CJK UNIFIED IDEOGRAPH
+ {0xBE8B, 0x7DE5}, //10259 #CJK UNIFIED IDEOGRAPH
+ {0xBE8C, 0x7DE6}, //10260 #CJK UNIFIED IDEOGRAPH
+ {0xBE8D, 0x7DE7}, //10261 #CJK UNIFIED IDEOGRAPH
+ {0xBE8E, 0x7DE8}, //10262 #CJK UNIFIED IDEOGRAPH
+ {0xBE8F, 0x7DE9}, //10263 #CJK UNIFIED IDEOGRAPH
+ {0xBE90, 0x7DEA}, //10264 #CJK UNIFIED IDEOGRAPH
+ {0xBE91, 0x7DEB}, //10265 #CJK UNIFIED IDEOGRAPH
+ {0xBE92, 0x7DEC}, //10266 #CJK UNIFIED IDEOGRAPH
+ {0xBE93, 0x7DED}, //10267 #CJK UNIFIED IDEOGRAPH
+ {0xBE94, 0x7DEE}, //10268 #CJK UNIFIED IDEOGRAPH
+ {0xBE95, 0x7DEF}, //10269 #CJK UNIFIED IDEOGRAPH
+ {0xBE96, 0x7DF0}, //10270 #CJK UNIFIED IDEOGRAPH
+ {0xBE97, 0x7DF1}, //10271 #CJK UNIFIED IDEOGRAPH
+ {0xBE98, 0x7DF2}, //10272 #CJK UNIFIED IDEOGRAPH
+ {0xBE99, 0x7DF3}, //10273 #CJK UNIFIED IDEOGRAPH
+ {0xBE9A, 0x7DF4}, //10274 #CJK UNIFIED IDEOGRAPH
+ {0xBE9B, 0x7DF5}, //10275 #CJK UNIFIED IDEOGRAPH
+ {0xBE9C, 0x7DF6}, //10276 #CJK UNIFIED IDEOGRAPH
+ {0xBE9D, 0x7DF7}, //10277 #CJK UNIFIED IDEOGRAPH
+ {0xBE9E, 0x7DF8}, //10278 #CJK UNIFIED IDEOGRAPH
+ {0xBE9F, 0x7DF9}, //10279 #CJK UNIFIED IDEOGRAPH
+ {0xBEA0, 0x7DFA}, //10280 #CJK UNIFIED IDEOGRAPH
+ {0xBEA1, 0x5C3D}, //10281 #CJK UNIFIED IDEOGRAPH
+ {0xBEA2, 0x52B2}, //10282 #CJK UNIFIED IDEOGRAPH
+ {0xBEA3, 0x8346}, //10283 #CJK UNIFIED IDEOGRAPH
+ {0xBEA4, 0x5162}, //10284 #CJK UNIFIED IDEOGRAPH
+ {0xBEA5, 0x830E}, //10285 #CJK UNIFIED IDEOGRAPH
+ {0xBEA6, 0x775B}, //10286 #CJK UNIFIED IDEOGRAPH
+ {0xBEA7, 0x6676}, //10287 #CJK UNIFIED IDEOGRAPH
+ {0xBEA8, 0x9CB8}, //10288 #CJK UNIFIED IDEOGRAPH
+ {0xBEA9, 0x4EAC}, //10289 #CJK UNIFIED IDEOGRAPH
+ {0xBEAA, 0x60CA}, //10290 #CJK UNIFIED IDEOGRAPH
+ {0xBEAB, 0x7CBE}, //10291 #CJK UNIFIED IDEOGRAPH
+ {0xBEAC, 0x7CB3}, //10292 #CJK UNIFIED IDEOGRAPH
+ {0xBEAD, 0x7ECF}, //10293 #CJK UNIFIED IDEOGRAPH
+ {0xBEAE, 0x4E95}, //10294 #CJK UNIFIED IDEOGRAPH
+ {0xBEAF, 0x8B66}, //10295 #CJK UNIFIED IDEOGRAPH
+ {0xBEB0, 0x666F}, //10296 #CJK UNIFIED IDEOGRAPH
+ {0xBEB1, 0x9888}, //10297 #CJK UNIFIED IDEOGRAPH
+ {0xBEB2, 0x9759}, //10298 #CJK UNIFIED IDEOGRAPH
+ {0xBEB3, 0x5883}, //10299 #CJK UNIFIED IDEOGRAPH
+ {0xBEB4, 0x656C}, //10300 #CJK UNIFIED IDEOGRAPH
+ {0xBEB5, 0x955C}, //10301 #CJK UNIFIED IDEOGRAPH
+ {0xBEB6, 0x5F84}, //10302 #CJK UNIFIED IDEOGRAPH
+ {0xBEB7, 0x75C9}, //10303 #CJK UNIFIED IDEOGRAPH
+ {0xBEB8, 0x9756}, //10304 #CJK UNIFIED IDEOGRAPH
+ {0xBEB9, 0x7ADF}, //10305 #CJK UNIFIED IDEOGRAPH
+ {0xBEBA, 0x7ADE}, //10306 #CJK UNIFIED IDEOGRAPH
+ {0xBEBB, 0x51C0}, //10307 #CJK UNIFIED IDEOGRAPH
+ {0xBEBC, 0x70AF}, //10308 #CJK UNIFIED IDEOGRAPH
+ {0xBEBD, 0x7A98}, //10309 #CJK UNIFIED IDEOGRAPH
+ {0xBEBE, 0x63EA}, //10310 #CJK UNIFIED IDEOGRAPH
+ {0xBEBF, 0x7A76}, //10311 #CJK UNIFIED IDEOGRAPH
+ {0xBEC0, 0x7EA0}, //10312 #CJK UNIFIED IDEOGRAPH
+ {0xBEC1, 0x7396}, //10313 #CJK UNIFIED IDEOGRAPH
+ {0xBEC2, 0x97ED}, //10314 #CJK UNIFIED IDEOGRAPH
+ {0xBEC3, 0x4E45}, //10315 #CJK UNIFIED IDEOGRAPH
+ {0xBEC4, 0x7078}, //10316 #CJK UNIFIED IDEOGRAPH
+ {0xBEC5, 0x4E5D}, //10317 #CJK UNIFIED IDEOGRAPH
+ {0xBEC6, 0x9152}, //10318 #CJK UNIFIED IDEOGRAPH
+ {0xBEC7, 0x53A9}, //10319 #CJK UNIFIED IDEOGRAPH
+ {0xBEC8, 0x6551}, //10320 #CJK UNIFIED IDEOGRAPH
+ {0xBEC9, 0x65E7}, //10321 #CJK UNIFIED IDEOGRAPH
+ {0xBECA, 0x81FC}, //10322 #CJK UNIFIED IDEOGRAPH
+ {0xBECB, 0x8205}, //10323 #CJK UNIFIED IDEOGRAPH
+ {0xBECC, 0x548E}, //10324 #CJK UNIFIED IDEOGRAPH
+ {0xBECD, 0x5C31}, //10325 #CJK UNIFIED IDEOGRAPH
+ {0xBECE, 0x759A}, //10326 #CJK UNIFIED IDEOGRAPH
+ {0xBECF, 0x97A0}, //10327 #CJK UNIFIED IDEOGRAPH
+ {0xBED0, 0x62D8}, //10328 #CJK UNIFIED IDEOGRAPH
+ {0xBED1, 0x72D9}, //10329 #CJK UNIFIED IDEOGRAPH
+ {0xBED2, 0x75BD}, //10330 #CJK UNIFIED IDEOGRAPH
+ {0xBED3, 0x5C45}, //10331 #CJK UNIFIED IDEOGRAPH
+ {0xBED4, 0x9A79}, //10332 #CJK UNIFIED IDEOGRAPH
+ {0xBED5, 0x83CA}, //10333 #CJK UNIFIED IDEOGRAPH
+ {0xBED6, 0x5C40}, //10334 #CJK UNIFIED IDEOGRAPH
+ {0xBED7, 0x5480}, //10335 #CJK UNIFIED IDEOGRAPH
+ {0xBED8, 0x77E9}, //10336 #CJK UNIFIED IDEOGRAPH
+ {0xBED9, 0x4E3E}, //10337 #CJK UNIFIED IDEOGRAPH
+ {0xBEDA, 0x6CAE}, //10338 #CJK UNIFIED IDEOGRAPH
+ {0xBEDB, 0x805A}, //10339 #CJK UNIFIED IDEOGRAPH
+ {0xBEDC, 0x62D2}, //10340 #CJK UNIFIED IDEOGRAPH
+ {0xBEDD, 0x636E}, //10341 #CJK UNIFIED IDEOGRAPH
+ {0xBEDE, 0x5DE8}, //10342 #CJK UNIFIED IDEOGRAPH
+ {0xBEDF, 0x5177}, //10343 #CJK UNIFIED IDEOGRAPH
+ {0xBEE0, 0x8DDD}, //10344 #CJK UNIFIED IDEOGRAPH
+ {0xBEE1, 0x8E1E}, //10345 #CJK UNIFIED IDEOGRAPH
+ {0xBEE2, 0x952F}, //10346 #CJK UNIFIED IDEOGRAPH
+ {0xBEE3, 0x4FF1}, //10347 #CJK UNIFIED IDEOGRAPH
+ {0xBEE4, 0x53E5}, //10348 #CJK UNIFIED IDEOGRAPH
+ {0xBEE5, 0x60E7}, //10349 #CJK UNIFIED IDEOGRAPH
+ {0xBEE6, 0x70AC}, //10350 #CJK UNIFIED IDEOGRAPH
+ {0xBEE7, 0x5267}, //10351 #CJK UNIFIED IDEOGRAPH
+ {0xBEE8, 0x6350}, //10352 #CJK UNIFIED IDEOGRAPH
+ {0xBEE9, 0x9E43}, //10353 #CJK UNIFIED IDEOGRAPH
+ {0xBEEA, 0x5A1F}, //10354 #CJK UNIFIED IDEOGRAPH
+ {0xBEEB, 0x5026}, //10355 #CJK UNIFIED IDEOGRAPH
+ {0xBEEC, 0x7737}, //10356 #CJK UNIFIED IDEOGRAPH
+ {0xBEED, 0x5377}, //10357 #CJK UNIFIED IDEOGRAPH
+ {0xBEEE, 0x7EE2}, //10358 #CJK UNIFIED IDEOGRAPH
+ {0xBEEF, 0x6485}, //10359 #CJK UNIFIED IDEOGRAPH
+ {0xBEF0, 0x652B}, //10360 #CJK UNIFIED IDEOGRAPH
+ {0xBEF1, 0x6289}, //10361 #CJK UNIFIED IDEOGRAPH
+ {0xBEF2, 0x6398}, //10362 #CJK UNIFIED IDEOGRAPH
+ {0xBEF3, 0x5014}, //10363 #CJK UNIFIED IDEOGRAPH
+ {0xBEF4, 0x7235}, //10364 #CJK UNIFIED IDEOGRAPH
+ {0xBEF5, 0x89C9}, //10365 #CJK UNIFIED IDEOGRAPH
+ {0xBEF6, 0x51B3}, //10366 #CJK UNIFIED IDEOGRAPH
+ {0xBEF7, 0x8BC0}, //10367 #CJK UNIFIED IDEOGRAPH
+ {0xBEF8, 0x7EDD}, //10368 #CJK UNIFIED IDEOGRAPH
+ {0xBEF9, 0x5747}, //10369 #CJK UNIFIED IDEOGRAPH
+ {0xBEFA, 0x83CC}, //10370 #CJK UNIFIED IDEOGRAPH
+ {0xBEFB, 0x94A7}, //10371 #CJK UNIFIED IDEOGRAPH
+ {0xBEFC, 0x519B}, //10372 #CJK UNIFIED IDEOGRAPH
+ {0xBEFD, 0x541B}, //10373 #CJK UNIFIED IDEOGRAPH
+ {0xBEFE, 0x5CFB}, //10374 #CJK UNIFIED IDEOGRAPH
+ {0xBF40, 0x7DFB}, //10375 #CJK UNIFIED IDEOGRAPH
+ {0xBF41, 0x7DFC}, //10376 #CJK UNIFIED IDEOGRAPH
+ {0xBF42, 0x7DFD}, //10377 #CJK UNIFIED IDEOGRAPH
+ {0xBF43, 0x7DFE}, //10378 #CJK UNIFIED IDEOGRAPH
+ {0xBF44, 0x7DFF}, //10379 #CJK UNIFIED IDEOGRAPH
+ {0xBF45, 0x7E00}, //10380 #CJK UNIFIED IDEOGRAPH
+ {0xBF46, 0x7E01}, //10381 #CJK UNIFIED IDEOGRAPH
+ {0xBF47, 0x7E02}, //10382 #CJK UNIFIED IDEOGRAPH
+ {0xBF48, 0x7E03}, //10383 #CJK UNIFIED IDEOGRAPH
+ {0xBF49, 0x7E04}, //10384 #CJK UNIFIED IDEOGRAPH
+ {0xBF4A, 0x7E05}, //10385 #CJK UNIFIED IDEOGRAPH
+ {0xBF4B, 0x7E06}, //10386 #CJK UNIFIED IDEOGRAPH
+ {0xBF4C, 0x7E07}, //10387 #CJK UNIFIED IDEOGRAPH
+ {0xBF4D, 0x7E08}, //10388 #CJK UNIFIED IDEOGRAPH
+ {0xBF4E, 0x7E09}, //10389 #CJK UNIFIED IDEOGRAPH
+ {0xBF4F, 0x7E0A}, //10390 #CJK UNIFIED IDEOGRAPH
+ {0xBF50, 0x7E0B}, //10391 #CJK UNIFIED IDEOGRAPH
+ {0xBF51, 0x7E0C}, //10392 #CJK UNIFIED IDEOGRAPH
+ {0xBF52, 0x7E0D}, //10393 #CJK UNIFIED IDEOGRAPH
+ {0xBF53, 0x7E0E}, //10394 #CJK UNIFIED IDEOGRAPH
+ {0xBF54, 0x7E0F}, //10395 #CJK UNIFIED IDEOGRAPH
+ {0xBF55, 0x7E10}, //10396 #CJK UNIFIED IDEOGRAPH
+ {0xBF56, 0x7E11}, //10397 #CJK UNIFIED IDEOGRAPH
+ {0xBF57, 0x7E12}, //10398 #CJK UNIFIED IDEOGRAPH
+ {0xBF58, 0x7E13}, //10399 #CJK UNIFIED IDEOGRAPH
+ {0xBF59, 0x7E14}, //10400 #CJK UNIFIED IDEOGRAPH
+ {0xBF5A, 0x7E15}, //10401 #CJK UNIFIED IDEOGRAPH
+ {0xBF5B, 0x7E16}, //10402 #CJK UNIFIED IDEOGRAPH
+ {0xBF5C, 0x7E17}, //10403 #CJK UNIFIED IDEOGRAPH
+ {0xBF5D, 0x7E18}, //10404 #CJK UNIFIED IDEOGRAPH
+ {0xBF5E, 0x7E19}, //10405 #CJK UNIFIED IDEOGRAPH
+ {0xBF5F, 0x7E1A}, //10406 #CJK UNIFIED IDEOGRAPH
+ {0xBF60, 0x7E1B}, //10407 #CJK UNIFIED IDEOGRAPH
+ {0xBF61, 0x7E1C}, //10408 #CJK UNIFIED IDEOGRAPH
+ {0xBF62, 0x7E1D}, //10409 #CJK UNIFIED IDEOGRAPH
+ {0xBF63, 0x7E1E}, //10410 #CJK UNIFIED IDEOGRAPH
+ {0xBF64, 0x7E1F}, //10411 #CJK UNIFIED IDEOGRAPH
+ {0xBF65, 0x7E20}, //10412 #CJK UNIFIED IDEOGRAPH
+ {0xBF66, 0x7E21}, //10413 #CJK UNIFIED IDEOGRAPH
+ {0xBF67, 0x7E22}, //10414 #CJK UNIFIED IDEOGRAPH
+ {0xBF68, 0x7E23}, //10415 #CJK UNIFIED IDEOGRAPH
+ {0xBF69, 0x7E24}, //10416 #CJK UNIFIED IDEOGRAPH
+ {0xBF6A, 0x7E25}, //10417 #CJK UNIFIED IDEOGRAPH
+ {0xBF6B, 0x7E26}, //10418 #CJK UNIFIED IDEOGRAPH
+ {0xBF6C, 0x7E27}, //10419 #CJK UNIFIED IDEOGRAPH
+ {0xBF6D, 0x7E28}, //10420 #CJK UNIFIED IDEOGRAPH
+ {0xBF6E, 0x7E29}, //10421 #CJK UNIFIED IDEOGRAPH
+ {0xBF6F, 0x7E2A}, //10422 #CJK UNIFIED IDEOGRAPH
+ {0xBF70, 0x7E2B}, //10423 #CJK UNIFIED IDEOGRAPH
+ {0xBF71, 0x7E2C}, //10424 #CJK UNIFIED IDEOGRAPH
+ {0xBF72, 0x7E2D}, //10425 #CJK UNIFIED IDEOGRAPH
+ {0xBF73, 0x7E2E}, //10426 #CJK UNIFIED IDEOGRAPH
+ {0xBF74, 0x7E2F}, //10427 #CJK UNIFIED IDEOGRAPH
+ {0xBF75, 0x7E30}, //10428 #CJK UNIFIED IDEOGRAPH
+ {0xBF76, 0x7E31}, //10429 #CJK UNIFIED IDEOGRAPH
+ {0xBF77, 0x7E32}, //10430 #CJK UNIFIED IDEOGRAPH
+ {0xBF78, 0x7E33}, //10431 #CJK UNIFIED IDEOGRAPH
+ {0xBF79, 0x7E34}, //10432 #CJK UNIFIED IDEOGRAPH
+ {0xBF7A, 0x7E35}, //10433 #CJK UNIFIED IDEOGRAPH
+ {0xBF7B, 0x7E36}, //10434 #CJK UNIFIED IDEOGRAPH
+ {0xBF7C, 0x7E37}, //10435 #CJK UNIFIED IDEOGRAPH
+ {0xBF7D, 0x7E38}, //10436 #CJK UNIFIED IDEOGRAPH
+ {0xBF7E, 0x7E39}, //10437 #CJK UNIFIED IDEOGRAPH
+ {0xBF80, 0x7E3A}, //10438 #CJK UNIFIED IDEOGRAPH
+ {0xBF81, 0x7E3C}, //10439 #CJK UNIFIED IDEOGRAPH
+ {0xBF82, 0x7E3D}, //10440 #CJK UNIFIED IDEOGRAPH
+ {0xBF83, 0x7E3E}, //10441 #CJK UNIFIED IDEOGRAPH
+ {0xBF84, 0x7E3F}, //10442 #CJK UNIFIED IDEOGRAPH
+ {0xBF85, 0x7E40}, //10443 #CJK UNIFIED IDEOGRAPH
+ {0xBF86, 0x7E42}, //10444 #CJK UNIFIED IDEOGRAPH
+ {0xBF87, 0x7E43}, //10445 #CJK UNIFIED IDEOGRAPH
+ {0xBF88, 0x7E44}, //10446 #CJK UNIFIED IDEOGRAPH
+ {0xBF89, 0x7E45}, //10447 #CJK UNIFIED IDEOGRAPH
+ {0xBF8A, 0x7E46}, //10448 #CJK UNIFIED IDEOGRAPH
+ {0xBF8B, 0x7E48}, //10449 #CJK UNIFIED IDEOGRAPH
+ {0xBF8C, 0x7E49}, //10450 #CJK UNIFIED IDEOGRAPH
+ {0xBF8D, 0x7E4A}, //10451 #CJK UNIFIED IDEOGRAPH
+ {0xBF8E, 0x7E4B}, //10452 #CJK UNIFIED IDEOGRAPH
+ {0xBF8F, 0x7E4C}, //10453 #CJK UNIFIED IDEOGRAPH
+ {0xBF90, 0x7E4D}, //10454 #CJK UNIFIED IDEOGRAPH
+ {0xBF91, 0x7E4E}, //10455 #CJK UNIFIED IDEOGRAPH
+ {0xBF92, 0x7E4F}, //10456 #CJK UNIFIED IDEOGRAPH
+ {0xBF93, 0x7E50}, //10457 #CJK UNIFIED IDEOGRAPH
+ {0xBF94, 0x7E51}, //10458 #CJK UNIFIED IDEOGRAPH
+ {0xBF95, 0x7E52}, //10459 #CJK UNIFIED IDEOGRAPH
+ {0xBF96, 0x7E53}, //10460 #CJK UNIFIED IDEOGRAPH
+ {0xBF97, 0x7E54}, //10461 #CJK UNIFIED IDEOGRAPH
+ {0xBF98, 0x7E55}, //10462 #CJK UNIFIED IDEOGRAPH
+ {0xBF99, 0x7E56}, //10463 #CJK UNIFIED IDEOGRAPH
+ {0xBF9A, 0x7E57}, //10464 #CJK UNIFIED IDEOGRAPH
+ {0xBF9B, 0x7E58}, //10465 #CJK UNIFIED IDEOGRAPH
+ {0xBF9C, 0x7E59}, //10466 #CJK UNIFIED IDEOGRAPH
+ {0xBF9D, 0x7E5A}, //10467 #CJK UNIFIED IDEOGRAPH
+ {0xBF9E, 0x7E5B}, //10468 #CJK UNIFIED IDEOGRAPH
+ {0xBF9F, 0x7E5C}, //10469 #CJK UNIFIED IDEOGRAPH
+ {0xBFA0, 0x7E5D}, //10470 #CJK UNIFIED IDEOGRAPH
+ {0xBFA1, 0x4FCA}, //10471 #CJK UNIFIED IDEOGRAPH
+ {0xBFA2, 0x7AE3}, //10472 #CJK UNIFIED IDEOGRAPH
+ {0xBFA3, 0x6D5A}, //10473 #CJK UNIFIED IDEOGRAPH
+ {0xBFA4, 0x90E1}, //10474 #CJK UNIFIED IDEOGRAPH
+ {0xBFA5, 0x9A8F}, //10475 #CJK UNIFIED IDEOGRAPH
+ {0xBFA6, 0x5580}, //10476 #CJK UNIFIED IDEOGRAPH
+ {0xBFA7, 0x5496}, //10477 #CJK UNIFIED IDEOGRAPH
+ {0xBFA8, 0x5361}, //10478 #CJK UNIFIED IDEOGRAPH
+ {0xBFA9, 0x54AF}, //10479 #CJK UNIFIED IDEOGRAPH
+ {0xBFAA, 0x5F00}, //10480 #CJK UNIFIED IDEOGRAPH
+ {0xBFAB, 0x63E9}, //10481 #CJK UNIFIED IDEOGRAPH
+ {0xBFAC, 0x6977}, //10482 #CJK UNIFIED IDEOGRAPH
+ {0xBFAD, 0x51EF}, //10483 #CJK UNIFIED IDEOGRAPH
+ {0xBFAE, 0x6168}, //10484 #CJK UNIFIED IDEOGRAPH
+ {0xBFAF, 0x520A}, //10485 #CJK UNIFIED IDEOGRAPH
+ {0xBFB0, 0x582A}, //10486 #CJK UNIFIED IDEOGRAPH
+ {0xBFB1, 0x52D8}, //10487 #CJK UNIFIED IDEOGRAPH
+ {0xBFB2, 0x574E}, //10488 #CJK UNIFIED IDEOGRAPH
+ {0xBFB3, 0x780D}, //10489 #CJK UNIFIED IDEOGRAPH
+ {0xBFB4, 0x770B}, //10490 #CJK UNIFIED IDEOGRAPH
+ {0xBFB5, 0x5EB7}, //10491 #CJK UNIFIED IDEOGRAPH
+ {0xBFB6, 0x6177}, //10492 #CJK UNIFIED IDEOGRAPH
+ {0xBFB7, 0x7CE0}, //10493 #CJK UNIFIED IDEOGRAPH
+ {0xBFB8, 0x625B}, //10494 #CJK UNIFIED IDEOGRAPH
+ {0xBFB9, 0x6297}, //10495 #CJK UNIFIED IDEOGRAPH
+ {0xBFBA, 0x4EA2}, //10496 #CJK UNIFIED IDEOGRAPH
+ {0xBFBB, 0x7095}, //10497 #CJK UNIFIED IDEOGRAPH
+ {0xBFBC, 0x8003}, //10498 #CJK UNIFIED IDEOGRAPH
+ {0xBFBD, 0x62F7}, //10499 #CJK UNIFIED IDEOGRAPH
+ {0xBFBE, 0x70E4}, //10500 #CJK UNIFIED IDEOGRAPH
+ {0xBFBF, 0x9760}, //10501 #CJK UNIFIED IDEOGRAPH
+ {0xBFC0, 0x5777}, //10502 #CJK UNIFIED IDEOGRAPH
+ {0xBFC1, 0x82DB}, //10503 #CJK UNIFIED IDEOGRAPH
+ {0xBFC2, 0x67EF}, //10504 #CJK UNIFIED IDEOGRAPH
+ {0xBFC3, 0x68F5}, //10505 #CJK UNIFIED IDEOGRAPH
+ {0xBFC4, 0x78D5}, //10506 #CJK UNIFIED IDEOGRAPH
+ {0xBFC5, 0x9897}, //10507 #CJK UNIFIED IDEOGRAPH
+ {0xBFC6, 0x79D1}, //10508 #CJK UNIFIED IDEOGRAPH
+ {0xBFC7, 0x58F3}, //10509 #CJK UNIFIED IDEOGRAPH
+ {0xBFC8, 0x54B3}, //10510 #CJK UNIFIED IDEOGRAPH
+ {0xBFC9, 0x53EF}, //10511 #CJK UNIFIED IDEOGRAPH
+ {0xBFCA, 0x6E34}, //10512 #CJK UNIFIED IDEOGRAPH
+ {0xBFCB, 0x514B}, //10513 #CJK UNIFIED IDEOGRAPH
+ {0xBFCC, 0x523B}, //10514 #CJK UNIFIED IDEOGRAPH
+ {0xBFCD, 0x5BA2}, //10515 #CJK UNIFIED IDEOGRAPH
+ {0xBFCE, 0x8BFE}, //10516 #CJK UNIFIED IDEOGRAPH
+ {0xBFCF, 0x80AF}, //10517 #CJK UNIFIED IDEOGRAPH
+ {0xBFD0, 0x5543}, //10518 #CJK UNIFIED IDEOGRAPH
+ {0xBFD1, 0x57A6}, //10519 #CJK UNIFIED IDEOGRAPH
+ {0xBFD2, 0x6073}, //10520 #CJK UNIFIED IDEOGRAPH
+ {0xBFD3, 0x5751}, //10521 #CJK UNIFIED IDEOGRAPH
+ {0xBFD4, 0x542D}, //10522 #CJK UNIFIED IDEOGRAPH
+ {0xBFD5, 0x7A7A}, //10523 #CJK UNIFIED IDEOGRAPH
+ {0xBFD6, 0x6050}, //10524 #CJK UNIFIED IDEOGRAPH
+ {0xBFD7, 0x5B54}, //10525 #CJK UNIFIED IDEOGRAPH
+ {0xBFD8, 0x63A7}, //10526 #CJK UNIFIED IDEOGRAPH
+ {0xBFD9, 0x62A0}, //10527 #CJK UNIFIED IDEOGRAPH
+ {0xBFDA, 0x53E3}, //10528 #CJK UNIFIED IDEOGRAPH
+ {0xBFDB, 0x6263}, //10529 #CJK UNIFIED IDEOGRAPH
+ {0xBFDC, 0x5BC7}, //10530 #CJK UNIFIED IDEOGRAPH
+ {0xBFDD, 0x67AF}, //10531 #CJK UNIFIED IDEOGRAPH
+ {0xBFDE, 0x54ED}, //10532 #CJK UNIFIED IDEOGRAPH
+ {0xBFDF, 0x7A9F}, //10533 #CJK UNIFIED IDEOGRAPH
+ {0xBFE0, 0x82E6}, //10534 #CJK UNIFIED IDEOGRAPH
+ {0xBFE1, 0x9177}, //10535 #CJK UNIFIED IDEOGRAPH
+ {0xBFE2, 0x5E93}, //10536 #CJK UNIFIED IDEOGRAPH
+ {0xBFE3, 0x88E4}, //10537 #CJK UNIFIED IDEOGRAPH
+ {0xBFE4, 0x5938}, //10538 #CJK UNIFIED IDEOGRAPH
+ {0xBFE5, 0x57AE}, //10539 #CJK UNIFIED IDEOGRAPH
+ {0xBFE6, 0x630E}, //10540 #CJK UNIFIED IDEOGRAPH
+ {0xBFE7, 0x8DE8}, //10541 #CJK UNIFIED IDEOGRAPH
+ {0xBFE8, 0x80EF}, //10542 #CJK UNIFIED IDEOGRAPH
+ {0xBFE9, 0x5757}, //10543 #CJK UNIFIED IDEOGRAPH
+ {0xBFEA, 0x7B77}, //10544 #CJK UNIFIED IDEOGRAPH
+ {0xBFEB, 0x4FA9}, //10545 #CJK UNIFIED IDEOGRAPH
+ {0xBFEC, 0x5FEB}, //10546 #CJK UNIFIED IDEOGRAPH
+ {0xBFED, 0x5BBD}, //10547 #CJK UNIFIED IDEOGRAPH
+ {0xBFEE, 0x6B3E}, //10548 #CJK UNIFIED IDEOGRAPH
+ {0xBFEF, 0x5321}, //10549 #CJK UNIFIED IDEOGRAPH
+ {0xBFF0, 0x7B50}, //10550 #CJK UNIFIED IDEOGRAPH
+ {0xBFF1, 0x72C2}, //10551 #CJK UNIFIED IDEOGRAPH
+ {0xBFF2, 0x6846}, //10552 #CJK UNIFIED IDEOGRAPH
+ {0xBFF3, 0x77FF}, //10553 #CJK UNIFIED IDEOGRAPH
+ {0xBFF4, 0x7736}, //10554 #CJK UNIFIED IDEOGRAPH
+ {0xBFF5, 0x65F7}, //10555 #CJK UNIFIED IDEOGRAPH
+ {0xBFF6, 0x51B5}, //10556 #CJK UNIFIED IDEOGRAPH
+ {0xBFF7, 0x4E8F}, //10557 #CJK UNIFIED IDEOGRAPH
+ {0xBFF8, 0x76D4}, //10558 #CJK UNIFIED IDEOGRAPH
+ {0xBFF9, 0x5CBF}, //10559 #CJK UNIFIED IDEOGRAPH
+ {0xBFFA, 0x7AA5}, //10560 #CJK UNIFIED IDEOGRAPH
+ {0xBFFB, 0x8475}, //10561 #CJK UNIFIED IDEOGRAPH
+ {0xBFFC, 0x594E}, //10562 #CJK UNIFIED IDEOGRAPH
+ {0xBFFD, 0x9B41}, //10563 #CJK UNIFIED IDEOGRAPH
+ {0xBFFE, 0x5080}, //10564 #CJK UNIFIED IDEOGRAPH
+ {0xC040, 0x7E5E}, //10565 #CJK UNIFIED IDEOGRAPH
+ {0xC041, 0x7E5F}, //10566 #CJK UNIFIED IDEOGRAPH
+ {0xC042, 0x7E60}, //10567 #CJK UNIFIED IDEOGRAPH
+ {0xC043, 0x7E61}, //10568 #CJK UNIFIED IDEOGRAPH
+ {0xC044, 0x7E62}, //10569 #CJK UNIFIED IDEOGRAPH
+ {0xC045, 0x7E63}, //10570 #CJK UNIFIED IDEOGRAPH
+ {0xC046, 0x7E64}, //10571 #CJK UNIFIED IDEOGRAPH
+ {0xC047, 0x7E65}, //10572 #CJK UNIFIED IDEOGRAPH
+ {0xC048, 0x7E66}, //10573 #CJK UNIFIED IDEOGRAPH
+ {0xC049, 0x7E67}, //10574 #CJK UNIFIED IDEOGRAPH
+ {0xC04A, 0x7E68}, //10575 #CJK UNIFIED IDEOGRAPH
+ {0xC04B, 0x7E69}, //10576 #CJK UNIFIED IDEOGRAPH
+ {0xC04C, 0x7E6A}, //10577 #CJK UNIFIED IDEOGRAPH
+ {0xC04D, 0x7E6B}, //10578 #CJK UNIFIED IDEOGRAPH
+ {0xC04E, 0x7E6C}, //10579 #CJK UNIFIED IDEOGRAPH
+ {0xC04F, 0x7E6D}, //10580 #CJK UNIFIED IDEOGRAPH
+ {0xC050, 0x7E6E}, //10581 #CJK UNIFIED IDEOGRAPH
+ {0xC051, 0x7E6F}, //10582 #CJK UNIFIED IDEOGRAPH
+ {0xC052, 0x7E70}, //10583 #CJK UNIFIED IDEOGRAPH
+ {0xC053, 0x7E71}, //10584 #CJK UNIFIED IDEOGRAPH
+ {0xC054, 0x7E72}, //10585 #CJK UNIFIED IDEOGRAPH
+ {0xC055, 0x7E73}, //10586 #CJK UNIFIED IDEOGRAPH
+ {0xC056, 0x7E74}, //10587 #CJK UNIFIED IDEOGRAPH
+ {0xC057, 0x7E75}, //10588 #CJK UNIFIED IDEOGRAPH
+ {0xC058, 0x7E76}, //10589 #CJK UNIFIED IDEOGRAPH
+ {0xC059, 0x7E77}, //10590 #CJK UNIFIED IDEOGRAPH
+ {0xC05A, 0x7E78}, //10591 #CJK UNIFIED IDEOGRAPH
+ {0xC05B, 0x7E79}, //10592 #CJK UNIFIED IDEOGRAPH
+ {0xC05C, 0x7E7A}, //10593 #CJK UNIFIED IDEOGRAPH
+ {0xC05D, 0x7E7B}, //10594 #CJK UNIFIED IDEOGRAPH
+ {0xC05E, 0x7E7C}, //10595 #CJK UNIFIED IDEOGRAPH
+ {0xC05F, 0x7E7D}, //10596 #CJK UNIFIED IDEOGRAPH
+ {0xC060, 0x7E7E}, //10597 #CJK UNIFIED IDEOGRAPH
+ {0xC061, 0x7E7F}, //10598 #CJK UNIFIED IDEOGRAPH
+ {0xC062, 0x7E80}, //10599 #CJK UNIFIED IDEOGRAPH
+ {0xC063, 0x7E81}, //10600 #CJK UNIFIED IDEOGRAPH
+ {0xC064, 0x7E83}, //10601 #CJK UNIFIED IDEOGRAPH
+ {0xC065, 0x7E84}, //10602 #CJK UNIFIED IDEOGRAPH
+ {0xC066, 0x7E85}, //10603 #CJK UNIFIED IDEOGRAPH
+ {0xC067, 0x7E86}, //10604 #CJK UNIFIED IDEOGRAPH
+ {0xC068, 0x7E87}, //10605 #CJK UNIFIED IDEOGRAPH
+ {0xC069, 0x7E88}, //10606 #CJK UNIFIED IDEOGRAPH
+ {0xC06A, 0x7E89}, //10607 #CJK UNIFIED IDEOGRAPH
+ {0xC06B, 0x7E8A}, //10608 #CJK UNIFIED IDEOGRAPH
+ {0xC06C, 0x7E8B}, //10609 #CJK UNIFIED IDEOGRAPH
+ {0xC06D, 0x7E8C}, //10610 #CJK UNIFIED IDEOGRAPH
+ {0xC06E, 0x7E8D}, //10611 #CJK UNIFIED IDEOGRAPH
+ {0xC06F, 0x7E8E}, //10612 #CJK UNIFIED IDEOGRAPH
+ {0xC070, 0x7E8F}, //10613 #CJK UNIFIED IDEOGRAPH
+ {0xC071, 0x7E90}, //10614 #CJK UNIFIED IDEOGRAPH
+ {0xC072, 0x7E91}, //10615 #CJK UNIFIED IDEOGRAPH
+ {0xC073, 0x7E92}, //10616 #CJK UNIFIED IDEOGRAPH
+ {0xC074, 0x7E93}, //10617 #CJK UNIFIED IDEOGRAPH
+ {0xC075, 0x7E94}, //10618 #CJK UNIFIED IDEOGRAPH
+ {0xC076, 0x7E95}, //10619 #CJK UNIFIED IDEOGRAPH
+ {0xC077, 0x7E96}, //10620 #CJK UNIFIED IDEOGRAPH
+ {0xC078, 0x7E97}, //10621 #CJK UNIFIED IDEOGRAPH
+ {0xC079, 0x7E98}, //10622 #CJK UNIFIED IDEOGRAPH
+ {0xC07A, 0x7E99}, //10623 #CJK UNIFIED IDEOGRAPH
+ {0xC07B, 0x7E9A}, //10624 #CJK UNIFIED IDEOGRAPH
+ {0xC07C, 0x7E9C}, //10625 #CJK UNIFIED IDEOGRAPH
+ {0xC07D, 0x7E9D}, //10626 #CJK UNIFIED IDEOGRAPH
+ {0xC07E, 0x7E9E}, //10627 #CJK UNIFIED IDEOGRAPH
+ {0xC080, 0x7EAE}, //10628 #CJK UNIFIED IDEOGRAPH
+ {0xC081, 0x7EB4}, //10629 #CJK UNIFIED IDEOGRAPH
+ {0xC082, 0x7EBB}, //10630 #CJK UNIFIED IDEOGRAPH
+ {0xC083, 0x7EBC}, //10631 #CJK UNIFIED IDEOGRAPH
+ {0xC084, 0x7ED6}, //10632 #CJK UNIFIED IDEOGRAPH
+ {0xC085, 0x7EE4}, //10633 #CJK UNIFIED IDEOGRAPH
+ {0xC086, 0x7EEC}, //10634 #CJK UNIFIED IDEOGRAPH
+ {0xC087, 0x7EF9}, //10635 #CJK UNIFIED IDEOGRAPH
+ {0xC088, 0x7F0A}, //10636 #CJK UNIFIED IDEOGRAPH
+ {0xC089, 0x7F10}, //10637 #CJK UNIFIED IDEOGRAPH
+ {0xC08A, 0x7F1E}, //10638 #CJK UNIFIED IDEOGRAPH
+ {0xC08B, 0x7F37}, //10639 #CJK UNIFIED IDEOGRAPH
+ {0xC08C, 0x7F39}, //10640 #CJK UNIFIED IDEOGRAPH
+ {0xC08D, 0x7F3B}, //10641 #CJK UNIFIED IDEOGRAPH
+ {0xC08E, 0x7F3C}, //10642 #CJK UNIFIED IDEOGRAPH
+ {0xC08F, 0x7F3D}, //10643 #CJK UNIFIED IDEOGRAPH
+ {0xC090, 0x7F3E}, //10644 #CJK UNIFIED IDEOGRAPH
+ {0xC091, 0x7F3F}, //10645 #CJK UNIFIED IDEOGRAPH
+ {0xC092, 0x7F40}, //10646 #CJK UNIFIED IDEOGRAPH
+ {0xC093, 0x7F41}, //10647 #CJK UNIFIED IDEOGRAPH
+ {0xC094, 0x7F43}, //10648 #CJK UNIFIED IDEOGRAPH
+ {0xC095, 0x7F46}, //10649 #CJK UNIFIED IDEOGRAPH
+ {0xC096, 0x7F47}, //10650 #CJK UNIFIED IDEOGRAPH
+ {0xC097, 0x7F48}, //10651 #CJK UNIFIED IDEOGRAPH
+ {0xC098, 0x7F49}, //10652 #CJK UNIFIED IDEOGRAPH
+ {0xC099, 0x7F4A}, //10653 #CJK UNIFIED IDEOGRAPH
+ {0xC09A, 0x7F4B}, //10654 #CJK UNIFIED IDEOGRAPH
+ {0xC09B, 0x7F4C}, //10655 #CJK UNIFIED IDEOGRAPH
+ {0xC09C, 0x7F4D}, //10656 #CJK UNIFIED IDEOGRAPH
+ {0xC09D, 0x7F4E}, //10657 #CJK UNIFIED IDEOGRAPH
+ {0xC09E, 0x7F4F}, //10658 #CJK UNIFIED IDEOGRAPH
+ {0xC09F, 0x7F52}, //10659 #CJK UNIFIED IDEOGRAPH
+ {0xC0A0, 0x7F53}, //10660 #CJK UNIFIED IDEOGRAPH
+ {0xC0A1, 0x9988}, //10661 #CJK UNIFIED IDEOGRAPH
+ {0xC0A2, 0x6127}, //10662 #CJK UNIFIED IDEOGRAPH
+ {0xC0A3, 0x6E83}, //10663 #CJK UNIFIED IDEOGRAPH
+ {0xC0A4, 0x5764}, //10664 #CJK UNIFIED IDEOGRAPH
+ {0xC0A5, 0x6606}, //10665 #CJK UNIFIED IDEOGRAPH
+ {0xC0A6, 0x6346}, //10666 #CJK UNIFIED IDEOGRAPH
+ {0xC0A7, 0x56F0}, //10667 #CJK UNIFIED IDEOGRAPH
+ {0xC0A8, 0x62EC}, //10668 #CJK UNIFIED IDEOGRAPH
+ {0xC0A9, 0x6269}, //10669 #CJK UNIFIED IDEOGRAPH
+ {0xC0AA, 0x5ED3}, //10670 #CJK UNIFIED IDEOGRAPH
+ {0xC0AB, 0x9614}, //10671 #CJK UNIFIED IDEOGRAPH
+ {0xC0AC, 0x5783}, //10672 #CJK UNIFIED IDEOGRAPH
+ {0xC0AD, 0x62C9}, //10673 #CJK UNIFIED IDEOGRAPH
+ {0xC0AE, 0x5587}, //10674 #CJK UNIFIED IDEOGRAPH
+ {0xC0AF, 0x8721}, //10675 #CJK UNIFIED IDEOGRAPH
+ {0xC0B0, 0x814A}, //10676 #CJK UNIFIED IDEOGRAPH
+ {0xC0B1, 0x8FA3}, //10677 #CJK UNIFIED IDEOGRAPH
+ {0xC0B2, 0x5566}, //10678 #CJK UNIFIED IDEOGRAPH
+ {0xC0B3, 0x83B1}, //10679 #CJK UNIFIED IDEOGRAPH
+ {0xC0B4, 0x6765}, //10680 #CJK UNIFIED IDEOGRAPH
+ {0xC0B5, 0x8D56}, //10681 #CJK UNIFIED IDEOGRAPH
+ {0xC0B6, 0x84DD}, //10682 #CJK UNIFIED IDEOGRAPH
+ {0xC0B7, 0x5A6A}, //10683 #CJK UNIFIED IDEOGRAPH
+ {0xC0B8, 0x680F}, //10684 #CJK UNIFIED IDEOGRAPH
+ {0xC0B9, 0x62E6}, //10685 #CJK UNIFIED IDEOGRAPH
+ {0xC0BA, 0x7BEE}, //10686 #CJK UNIFIED IDEOGRAPH
+ {0xC0BB, 0x9611}, //10687 #CJK UNIFIED IDEOGRAPH
+ {0xC0BC, 0x5170}, //10688 #CJK UNIFIED IDEOGRAPH
+ {0xC0BD, 0x6F9C}, //10689 #CJK UNIFIED IDEOGRAPH
+ {0xC0BE, 0x8C30}, //10690 #CJK UNIFIED IDEOGRAPH
+ {0xC0BF, 0x63FD}, //10691 #CJK UNIFIED IDEOGRAPH
+ {0xC0C0, 0x89C8}, //10692 #CJK UNIFIED IDEOGRAPH
+ {0xC0C1, 0x61D2}, //10693 #CJK UNIFIED IDEOGRAPH
+ {0xC0C2, 0x7F06}, //10694 #CJK UNIFIED IDEOGRAPH
+ {0xC0C3, 0x70C2}, //10695 #CJK UNIFIED IDEOGRAPH
+ {0xC0C4, 0x6EE5}, //10696 #CJK UNIFIED IDEOGRAPH
+ {0xC0C5, 0x7405}, //10697 #CJK UNIFIED IDEOGRAPH
+ {0xC0C6, 0x6994}, //10698 #CJK UNIFIED IDEOGRAPH
+ {0xC0C7, 0x72FC}, //10699 #CJK UNIFIED IDEOGRAPH
+ {0xC0C8, 0x5ECA}, //10700 #CJK UNIFIED IDEOGRAPH
+ {0xC0C9, 0x90CE}, //10701 #CJK UNIFIED IDEOGRAPH
+ {0xC0CA, 0x6717}, //10702 #CJK UNIFIED IDEOGRAPH
+ {0xC0CB, 0x6D6A}, //10703 #CJK UNIFIED IDEOGRAPH
+ {0xC0CC, 0x635E}, //10704 #CJK UNIFIED IDEOGRAPH
+ {0xC0CD, 0x52B3}, //10705 #CJK UNIFIED IDEOGRAPH
+ {0xC0CE, 0x7262}, //10706 #CJK UNIFIED IDEOGRAPH
+ {0xC0CF, 0x8001}, //10707 #CJK UNIFIED IDEOGRAPH
+ {0xC0D0, 0x4F6C}, //10708 #CJK UNIFIED IDEOGRAPH
+ {0xC0D1, 0x59E5}, //10709 #CJK UNIFIED IDEOGRAPH
+ {0xC0D2, 0x916A}, //10710 #CJK UNIFIED IDEOGRAPH
+ {0xC0D3, 0x70D9}, //10711 #CJK UNIFIED IDEOGRAPH
+ {0xC0D4, 0x6D9D}, //10712 #CJK UNIFIED IDEOGRAPH
+ {0xC0D5, 0x52D2}, //10713 #CJK UNIFIED IDEOGRAPH
+ {0xC0D6, 0x4E50}, //10714 #CJK UNIFIED IDEOGRAPH
+ {0xC0D7, 0x96F7}, //10715 #CJK UNIFIED IDEOGRAPH
+ {0xC0D8, 0x956D}, //10716 #CJK UNIFIED IDEOGRAPH
+ {0xC0D9, 0x857E}, //10717 #CJK UNIFIED IDEOGRAPH
+ {0xC0DA, 0x78CA}, //10718 #CJK UNIFIED IDEOGRAPH
+ {0xC0DB, 0x7D2F}, //10719 #CJK UNIFIED IDEOGRAPH
+ {0xC0DC, 0x5121}, //10720 #CJK UNIFIED IDEOGRAPH
+ {0xC0DD, 0x5792}, //10721 #CJK UNIFIED IDEOGRAPH
+ {0xC0DE, 0x64C2}, //10722 #CJK UNIFIED IDEOGRAPH
+ {0xC0DF, 0x808B}, //10723 #CJK UNIFIED IDEOGRAPH
+ {0xC0E0, 0x7C7B}, //10724 #CJK UNIFIED IDEOGRAPH
+ {0xC0E1, 0x6CEA}, //10725 #CJK UNIFIED IDEOGRAPH
+ {0xC0E2, 0x68F1}, //10726 #CJK UNIFIED IDEOGRAPH
+ {0xC0E3, 0x695E}, //10727 #CJK UNIFIED IDEOGRAPH
+ {0xC0E4, 0x51B7}, //10728 #CJK UNIFIED IDEOGRAPH
+ {0xC0E5, 0x5398}, //10729 #CJK UNIFIED IDEOGRAPH
+ {0xC0E6, 0x68A8}, //10730 #CJK UNIFIED IDEOGRAPH
+ {0xC0E7, 0x7281}, //10731 #CJK UNIFIED IDEOGRAPH
+ {0xC0E8, 0x9ECE}, //10732 #CJK UNIFIED IDEOGRAPH
+ {0xC0E9, 0x7BF1}, //10733 #CJK UNIFIED IDEOGRAPH
+ {0xC0EA, 0x72F8}, //10734 #CJK UNIFIED IDEOGRAPH
+ {0xC0EB, 0x79BB}, //10735 #CJK UNIFIED IDEOGRAPH
+ {0xC0EC, 0x6F13}, //10736 #CJK UNIFIED IDEOGRAPH
+ {0xC0ED, 0x7406}, //10737 #CJK UNIFIED IDEOGRAPH
+ {0xC0EE, 0x674E}, //10738 #CJK UNIFIED IDEOGRAPH
+ {0xC0EF, 0x91CC}, //10739 #CJK UNIFIED IDEOGRAPH
+ {0xC0F0, 0x9CA4}, //10740 #CJK UNIFIED IDEOGRAPH
+ {0xC0F1, 0x793C}, //10741 #CJK UNIFIED IDEOGRAPH
+ {0xC0F2, 0x8389}, //10742 #CJK UNIFIED IDEOGRAPH
+ {0xC0F3, 0x8354}, //10743 #CJK UNIFIED IDEOGRAPH
+ {0xC0F4, 0x540F}, //10744 #CJK UNIFIED IDEOGRAPH
+ {0xC0F5, 0x6817}, //10745 #CJK UNIFIED IDEOGRAPH
+ {0xC0F6, 0x4E3D}, //10746 #CJK UNIFIED IDEOGRAPH
+ {0xC0F7, 0x5389}, //10747 #CJK UNIFIED IDEOGRAPH
+ {0xC0F8, 0x52B1}, //10748 #CJK UNIFIED IDEOGRAPH
+ {0xC0F9, 0x783E}, //10749 #CJK UNIFIED IDEOGRAPH
+ {0xC0FA, 0x5386}, //10750 #CJK UNIFIED IDEOGRAPH
+ {0xC0FB, 0x5229}, //10751 #CJK UNIFIED IDEOGRAPH
+ {0xC0FC, 0x5088}, //10752 #CJK UNIFIED IDEOGRAPH
+ {0xC0FD, 0x4F8B}, //10753 #CJK UNIFIED IDEOGRAPH
+ {0xC0FE, 0x4FD0}, //10754 #CJK UNIFIED IDEOGRAPH
+ {0xC140, 0x7F56}, //10755 #CJK UNIFIED IDEOGRAPH
+ {0xC141, 0x7F59}, //10756 #CJK UNIFIED IDEOGRAPH
+ {0xC142, 0x7F5B}, //10757 #CJK UNIFIED IDEOGRAPH
+ {0xC143, 0x7F5C}, //10758 #CJK UNIFIED IDEOGRAPH
+ {0xC144, 0x7F5D}, //10759 #CJK UNIFIED IDEOGRAPH
+ {0xC145, 0x7F5E}, //10760 #CJK UNIFIED IDEOGRAPH
+ {0xC146, 0x7F60}, //10761 #CJK UNIFIED IDEOGRAPH
+ {0xC147, 0x7F63}, //10762 #CJK UNIFIED IDEOGRAPH
+ {0xC148, 0x7F64}, //10763 #CJK UNIFIED IDEOGRAPH
+ {0xC149, 0x7F65}, //10764 #CJK UNIFIED IDEOGRAPH
+ {0xC14A, 0x7F66}, //10765 #CJK UNIFIED IDEOGRAPH
+ {0xC14B, 0x7F67}, //10766 #CJK UNIFIED IDEOGRAPH
+ {0xC14C, 0x7F6B}, //10767 #CJK UNIFIED IDEOGRAPH
+ {0xC14D, 0x7F6C}, //10768 #CJK UNIFIED IDEOGRAPH
+ {0xC14E, 0x7F6D}, //10769 #CJK UNIFIED IDEOGRAPH
+ {0xC14F, 0x7F6F}, //10770 #CJK UNIFIED IDEOGRAPH
+ {0xC150, 0x7F70}, //10771 #CJK UNIFIED IDEOGRAPH
+ {0xC151, 0x7F73}, //10772 #CJK UNIFIED IDEOGRAPH
+ {0xC152, 0x7F75}, //10773 #CJK UNIFIED IDEOGRAPH
+ {0xC153, 0x7F76}, //10774 #CJK UNIFIED IDEOGRAPH
+ {0xC154, 0x7F77}, //10775 #CJK UNIFIED IDEOGRAPH
+ {0xC155, 0x7F78}, //10776 #CJK UNIFIED IDEOGRAPH
+ {0xC156, 0x7F7A}, //10777 #CJK UNIFIED IDEOGRAPH
+ {0xC157, 0x7F7B}, //10778 #CJK UNIFIED IDEOGRAPH
+ {0xC158, 0x7F7C}, //10779 #CJK UNIFIED IDEOGRAPH
+ {0xC159, 0x7F7D}, //10780 #CJK UNIFIED IDEOGRAPH
+ {0xC15A, 0x7F7F}, //10781 #CJK UNIFIED IDEOGRAPH
+ {0xC15B, 0x7F80}, //10782 #CJK UNIFIED IDEOGRAPH
+ {0xC15C, 0x7F82}, //10783 #CJK UNIFIED IDEOGRAPH
+ {0xC15D, 0x7F83}, //10784 #CJK UNIFIED IDEOGRAPH
+ {0xC15E, 0x7F84}, //10785 #CJK UNIFIED IDEOGRAPH
+ {0xC15F, 0x7F85}, //10786 #CJK UNIFIED IDEOGRAPH
+ {0xC160, 0x7F86}, //10787 #CJK UNIFIED IDEOGRAPH
+ {0xC161, 0x7F87}, //10788 #CJK UNIFIED IDEOGRAPH
+ {0xC162, 0x7F88}, //10789 #CJK UNIFIED IDEOGRAPH
+ {0xC163, 0x7F89}, //10790 #CJK UNIFIED IDEOGRAPH
+ {0xC164, 0x7F8B}, //10791 #CJK UNIFIED IDEOGRAPH
+ {0xC165, 0x7F8D}, //10792 #CJK UNIFIED IDEOGRAPH
+ {0xC166, 0x7F8F}, //10793 #CJK UNIFIED IDEOGRAPH
+ {0xC167, 0x7F90}, //10794 #CJK UNIFIED IDEOGRAPH
+ {0xC168, 0x7F91}, //10795 #CJK UNIFIED IDEOGRAPH
+ {0xC169, 0x7F92}, //10796 #CJK UNIFIED IDEOGRAPH
+ {0xC16A, 0x7F93}, //10797 #CJK UNIFIED IDEOGRAPH
+ {0xC16B, 0x7F95}, //10798 #CJK UNIFIED IDEOGRAPH
+ {0xC16C, 0x7F96}, //10799 #CJK UNIFIED IDEOGRAPH
+ {0xC16D, 0x7F97}, //10800 #CJK UNIFIED IDEOGRAPH
+ {0xC16E, 0x7F98}, //10801 #CJK UNIFIED IDEOGRAPH
+ {0xC16F, 0x7F99}, //10802 #CJK UNIFIED IDEOGRAPH
+ {0xC170, 0x7F9B}, //10803 #CJK UNIFIED IDEOGRAPH
+ {0xC171, 0x7F9C}, //10804 #CJK UNIFIED IDEOGRAPH
+ {0xC172, 0x7FA0}, //10805 #CJK UNIFIED IDEOGRAPH
+ {0xC173, 0x7FA2}, //10806 #CJK UNIFIED IDEOGRAPH
+ {0xC174, 0x7FA3}, //10807 #CJK UNIFIED IDEOGRAPH
+ {0xC175, 0x7FA5}, //10808 #CJK UNIFIED IDEOGRAPH
+ {0xC176, 0x7FA6}, //10809 #CJK UNIFIED IDEOGRAPH
+ {0xC177, 0x7FA8}, //10810 #CJK UNIFIED IDEOGRAPH
+ {0xC178, 0x7FA9}, //10811 #CJK UNIFIED IDEOGRAPH
+ {0xC179, 0x7FAA}, //10812 #CJK UNIFIED IDEOGRAPH
+ {0xC17A, 0x7FAB}, //10813 #CJK UNIFIED IDEOGRAPH
+ {0xC17B, 0x7FAC}, //10814 #CJK UNIFIED IDEOGRAPH
+ {0xC17C, 0x7FAD}, //10815 #CJK UNIFIED IDEOGRAPH
+ {0xC17D, 0x7FAE}, //10816 #CJK UNIFIED IDEOGRAPH
+ {0xC17E, 0x7FB1}, //10817 #CJK UNIFIED IDEOGRAPH
+ {0xC180, 0x7FB3}, //10818 #CJK UNIFIED IDEOGRAPH
+ {0xC181, 0x7FB4}, //10819 #CJK UNIFIED IDEOGRAPH
+ {0xC182, 0x7FB5}, //10820 #CJK UNIFIED IDEOGRAPH
+ {0xC183, 0x7FB6}, //10821 #CJK UNIFIED IDEOGRAPH
+ {0xC184, 0x7FB7}, //10822 #CJK UNIFIED IDEOGRAPH
+ {0xC185, 0x7FBA}, //10823 #CJK UNIFIED IDEOGRAPH
+ {0xC186, 0x7FBB}, //10824 #CJK UNIFIED IDEOGRAPH
+ {0xC187, 0x7FBE}, //10825 #CJK UNIFIED IDEOGRAPH
+ {0xC188, 0x7FC0}, //10826 #CJK UNIFIED IDEOGRAPH
+ {0xC189, 0x7FC2}, //10827 #CJK UNIFIED IDEOGRAPH
+ {0xC18A, 0x7FC3}, //10828 #CJK UNIFIED IDEOGRAPH
+ {0xC18B, 0x7FC4}, //10829 #CJK UNIFIED IDEOGRAPH
+ {0xC18C, 0x7FC6}, //10830 #CJK UNIFIED IDEOGRAPH
+ {0xC18D, 0x7FC7}, //10831 #CJK UNIFIED IDEOGRAPH
+ {0xC18E, 0x7FC8}, //10832 #CJK UNIFIED IDEOGRAPH
+ {0xC18F, 0x7FC9}, //10833 #CJK UNIFIED IDEOGRAPH
+ {0xC190, 0x7FCB}, //10834 #CJK UNIFIED IDEOGRAPH
+ {0xC191, 0x7FCD}, //10835 #CJK UNIFIED IDEOGRAPH
+ {0xC192, 0x7FCF}, //10836 #CJK UNIFIED IDEOGRAPH
+ {0xC193, 0x7FD0}, //10837 #CJK UNIFIED IDEOGRAPH
+ {0xC194, 0x7FD1}, //10838 #CJK UNIFIED IDEOGRAPH
+ {0xC195, 0x7FD2}, //10839 #CJK UNIFIED IDEOGRAPH
+ {0xC196, 0x7FD3}, //10840 #CJK UNIFIED IDEOGRAPH
+ {0xC197, 0x7FD6}, //10841 #CJK UNIFIED IDEOGRAPH
+ {0xC198, 0x7FD7}, //10842 #CJK UNIFIED IDEOGRAPH
+ {0xC199, 0x7FD9}, //10843 #CJK UNIFIED IDEOGRAPH
+ {0xC19A, 0x7FDA}, //10844 #CJK UNIFIED IDEOGRAPH
+ {0xC19B, 0x7FDB}, //10845 #CJK UNIFIED IDEOGRAPH
+ {0xC19C, 0x7FDC}, //10846 #CJK UNIFIED IDEOGRAPH
+ {0xC19D, 0x7FDD}, //10847 #CJK UNIFIED IDEOGRAPH
+ {0xC19E, 0x7FDE}, //10848 #CJK UNIFIED IDEOGRAPH
+ {0xC19F, 0x7FE2}, //10849 #CJK UNIFIED IDEOGRAPH
+ {0xC1A0, 0x7FE3}, //10850 #CJK UNIFIED IDEOGRAPH
+ {0xC1A1, 0x75E2}, //10851 #CJK UNIFIED IDEOGRAPH
+ {0xC1A2, 0x7ACB}, //10852 #CJK UNIFIED IDEOGRAPH
+ {0xC1A3, 0x7C92}, //10853 #CJK UNIFIED IDEOGRAPH
+ {0xC1A4, 0x6CA5}, //10854 #CJK UNIFIED IDEOGRAPH
+ {0xC1A5, 0x96B6}, //10855 #CJK UNIFIED IDEOGRAPH
+ {0xC1A6, 0x529B}, //10856 #CJK UNIFIED IDEOGRAPH
+ {0xC1A7, 0x7483}, //10857 #CJK UNIFIED IDEOGRAPH
+ {0xC1A8, 0x54E9}, //10858 #CJK UNIFIED IDEOGRAPH
+ {0xC1A9, 0x4FE9}, //10859 #CJK UNIFIED IDEOGRAPH
+ {0xC1AA, 0x8054}, //10860 #CJK UNIFIED IDEOGRAPH
+ {0xC1AB, 0x83B2}, //10861 #CJK UNIFIED IDEOGRAPH
+ {0xC1AC, 0x8FDE}, //10862 #CJK UNIFIED IDEOGRAPH
+ {0xC1AD, 0x9570}, //10863 #CJK UNIFIED IDEOGRAPH
+ {0xC1AE, 0x5EC9}, //10864 #CJK UNIFIED IDEOGRAPH
+ {0xC1AF, 0x601C}, //10865 #CJK UNIFIED IDEOGRAPH
+ {0xC1B0, 0x6D9F}, //10866 #CJK UNIFIED IDEOGRAPH
+ {0xC1B1, 0x5E18}, //10867 #CJK UNIFIED IDEOGRAPH
+ {0xC1B2, 0x655B}, //10868 #CJK UNIFIED IDEOGRAPH
+ {0xC1B3, 0x8138}, //10869 #CJK UNIFIED IDEOGRAPH
+ {0xC1B4, 0x94FE}, //10870 #CJK UNIFIED IDEOGRAPH
+ {0xC1B5, 0x604B}, //10871 #CJK UNIFIED IDEOGRAPH
+ {0xC1B6, 0x70BC}, //10872 #CJK UNIFIED IDEOGRAPH
+ {0xC1B7, 0x7EC3}, //10873 #CJK UNIFIED IDEOGRAPH
+ {0xC1B8, 0x7CAE}, //10874 #CJK UNIFIED IDEOGRAPH
+ {0xC1B9, 0x51C9}, //10875 #CJK UNIFIED IDEOGRAPH
+ {0xC1BA, 0x6881}, //10876 #CJK UNIFIED IDEOGRAPH
+ {0xC1BB, 0x7CB1}, //10877 #CJK UNIFIED IDEOGRAPH
+ {0xC1BC, 0x826F}, //10878 #CJK UNIFIED IDEOGRAPH
+ {0xC1BD, 0x4E24}, //10879 #CJK UNIFIED IDEOGRAPH
+ {0xC1BE, 0x8F86}, //10880 #CJK UNIFIED IDEOGRAPH
+ {0xC1BF, 0x91CF}, //10881 #CJK UNIFIED IDEOGRAPH
+ {0xC1C0, 0x667E}, //10882 #CJK UNIFIED IDEOGRAPH
+ {0xC1C1, 0x4EAE}, //10883 #CJK UNIFIED IDEOGRAPH
+ {0xC1C2, 0x8C05}, //10884 #CJK UNIFIED IDEOGRAPH
+ {0xC1C3, 0x64A9}, //10885 #CJK UNIFIED IDEOGRAPH
+ {0xC1C4, 0x804A}, //10886 #CJK UNIFIED IDEOGRAPH
+ {0xC1C5, 0x50DA}, //10887 #CJK UNIFIED IDEOGRAPH
+ {0xC1C6, 0x7597}, //10888 #CJK UNIFIED IDEOGRAPH
+ {0xC1C7, 0x71CE}, //10889 #CJK UNIFIED IDEOGRAPH
+ {0xC1C8, 0x5BE5}, //10890 #CJK UNIFIED IDEOGRAPH
+ {0xC1C9, 0x8FBD}, //10891 #CJK UNIFIED IDEOGRAPH
+ {0xC1CA, 0x6F66}, //10892 #CJK UNIFIED IDEOGRAPH
+ {0xC1CB, 0x4E86}, //10893 #CJK UNIFIED IDEOGRAPH
+ {0xC1CC, 0x6482}, //10894 #CJK UNIFIED IDEOGRAPH
+ {0xC1CD, 0x9563}, //10895 #CJK UNIFIED IDEOGRAPH
+ {0xC1CE, 0x5ED6}, //10896 #CJK UNIFIED IDEOGRAPH
+ {0xC1CF, 0x6599}, //10897 #CJK UNIFIED IDEOGRAPH
+ {0xC1D0, 0x5217}, //10898 #CJK UNIFIED IDEOGRAPH
+ {0xC1D1, 0x88C2}, //10899 #CJK UNIFIED IDEOGRAPH
+ {0xC1D2, 0x70C8}, //10900 #CJK UNIFIED IDEOGRAPH
+ {0xC1D3, 0x52A3}, //10901 #CJK UNIFIED IDEOGRAPH
+ {0xC1D4, 0x730E}, //10902 #CJK UNIFIED IDEOGRAPH
+ {0xC1D5, 0x7433}, //10903 #CJK UNIFIED IDEOGRAPH
+ {0xC1D6, 0x6797}, //10904 #CJK UNIFIED IDEOGRAPH
+ {0xC1D7, 0x78F7}, //10905 #CJK UNIFIED IDEOGRAPH
+ {0xC1D8, 0x9716}, //10906 #CJK UNIFIED IDEOGRAPH
+ {0xC1D9, 0x4E34}, //10907 #CJK UNIFIED IDEOGRAPH
+ {0xC1DA, 0x90BB}, //10908 #CJK UNIFIED IDEOGRAPH
+ {0xC1DB, 0x9CDE}, //10909 #CJK UNIFIED IDEOGRAPH
+ {0xC1DC, 0x6DCB}, //10910 #CJK UNIFIED IDEOGRAPH
+ {0xC1DD, 0x51DB}, //10911 #CJK UNIFIED IDEOGRAPH
+ {0xC1DE, 0x8D41}, //10912 #CJK UNIFIED IDEOGRAPH
+ {0xC1DF, 0x541D}, //10913 #CJK UNIFIED IDEOGRAPH
+ {0xC1E0, 0x62CE}, //10914 #CJK UNIFIED IDEOGRAPH
+ {0xC1E1, 0x73B2}, //10915 #CJK UNIFIED IDEOGRAPH
+ {0xC1E2, 0x83F1}, //10916 #CJK UNIFIED IDEOGRAPH
+ {0xC1E3, 0x96F6}, //10917 #CJK UNIFIED IDEOGRAPH
+ {0xC1E4, 0x9F84}, //10918 #CJK UNIFIED IDEOGRAPH
+ {0xC1E5, 0x94C3}, //10919 #CJK UNIFIED IDEOGRAPH
+ {0xC1E6, 0x4F36}, //10920 #CJK UNIFIED IDEOGRAPH
+ {0xC1E7, 0x7F9A}, //10921 #CJK UNIFIED IDEOGRAPH
+ {0xC1E8, 0x51CC}, //10922 #CJK UNIFIED IDEOGRAPH
+ {0xC1E9, 0x7075}, //10923 #CJK UNIFIED IDEOGRAPH
+ {0xC1EA, 0x9675}, //10924 #CJK UNIFIED IDEOGRAPH
+ {0xC1EB, 0x5CAD}, //10925 #CJK UNIFIED IDEOGRAPH
+ {0xC1EC, 0x9886}, //10926 #CJK UNIFIED IDEOGRAPH
+ {0xC1ED, 0x53E6}, //10927 #CJK UNIFIED IDEOGRAPH
+ {0xC1EE, 0x4EE4}, //10928 #CJK UNIFIED IDEOGRAPH
+ {0xC1EF, 0x6E9C}, //10929 #CJK UNIFIED IDEOGRAPH
+ {0xC1F0, 0x7409}, //10930 #CJK UNIFIED IDEOGRAPH
+ {0xC1F1, 0x69B4}, //10931 #CJK UNIFIED IDEOGRAPH
+ {0xC1F2, 0x786B}, //10932 #CJK UNIFIED IDEOGRAPH
+ {0xC1F3, 0x998F}, //10933 #CJK UNIFIED IDEOGRAPH
+ {0xC1F4, 0x7559}, //10934 #CJK UNIFIED IDEOGRAPH
+ {0xC1F5, 0x5218}, //10935 #CJK UNIFIED IDEOGRAPH
+ {0xC1F6, 0x7624}, //10936 #CJK UNIFIED IDEOGRAPH
+ {0xC1F7, 0x6D41}, //10937 #CJK UNIFIED IDEOGRAPH
+ {0xC1F8, 0x67F3}, //10938 #CJK UNIFIED IDEOGRAPH
+ {0xC1F9, 0x516D}, //10939 #CJK UNIFIED IDEOGRAPH
+ {0xC1FA, 0x9F99}, //10940 #CJK UNIFIED IDEOGRAPH
+ {0xC1FB, 0x804B}, //10941 #CJK UNIFIED IDEOGRAPH
+ {0xC1FC, 0x5499}, //10942 #CJK UNIFIED IDEOGRAPH
+ {0xC1FD, 0x7B3C}, //10943 #CJK UNIFIED IDEOGRAPH
+ {0xC1FE, 0x7ABF}, //10944 #CJK UNIFIED IDEOGRAPH
+ {0xC240, 0x7FE4}, //10945 #CJK UNIFIED IDEOGRAPH
+ {0xC241, 0x7FE7}, //10946 #CJK UNIFIED IDEOGRAPH
+ {0xC242, 0x7FE8}, //10947 #CJK UNIFIED IDEOGRAPH
+ {0xC243, 0x7FEA}, //10948 #CJK UNIFIED IDEOGRAPH
+ {0xC244, 0x7FEB}, //10949 #CJK UNIFIED IDEOGRAPH
+ {0xC245, 0x7FEC}, //10950 #CJK UNIFIED IDEOGRAPH
+ {0xC246, 0x7FED}, //10951 #CJK UNIFIED IDEOGRAPH
+ {0xC247, 0x7FEF}, //10952 #CJK UNIFIED IDEOGRAPH
+ {0xC248, 0x7FF2}, //10953 #CJK UNIFIED IDEOGRAPH
+ {0xC249, 0x7FF4}, //10954 #CJK UNIFIED IDEOGRAPH
+ {0xC24A, 0x7FF5}, //10955 #CJK UNIFIED IDEOGRAPH
+ {0xC24B, 0x7FF6}, //10956 #CJK UNIFIED IDEOGRAPH
+ {0xC24C, 0x7FF7}, //10957 #CJK UNIFIED IDEOGRAPH
+ {0xC24D, 0x7FF8}, //10958 #CJK UNIFIED IDEOGRAPH
+ {0xC24E, 0x7FF9}, //10959 #CJK UNIFIED IDEOGRAPH
+ {0xC24F, 0x7FFA}, //10960 #CJK UNIFIED IDEOGRAPH
+ {0xC250, 0x7FFD}, //10961 #CJK UNIFIED IDEOGRAPH
+ {0xC251, 0x7FFE}, //10962 #CJK UNIFIED IDEOGRAPH
+ {0xC252, 0x7FFF}, //10963 #CJK UNIFIED IDEOGRAPH
+ {0xC253, 0x8002}, //10964 #CJK UNIFIED IDEOGRAPH
+ {0xC254, 0x8007}, //10965 #CJK UNIFIED IDEOGRAPH
+ {0xC255, 0x8008}, //10966 #CJK UNIFIED IDEOGRAPH
+ {0xC256, 0x8009}, //10967 #CJK UNIFIED IDEOGRAPH
+ {0xC257, 0x800A}, //10968 #CJK UNIFIED IDEOGRAPH
+ {0xC258, 0x800E}, //10969 #CJK UNIFIED IDEOGRAPH
+ {0xC259, 0x800F}, //10970 #CJK UNIFIED IDEOGRAPH
+ {0xC25A, 0x8011}, //10971 #CJK UNIFIED IDEOGRAPH
+ {0xC25B, 0x8013}, //10972 #CJK UNIFIED IDEOGRAPH
+ {0xC25C, 0x801A}, //10973 #CJK UNIFIED IDEOGRAPH
+ {0xC25D, 0x801B}, //10974 #CJK UNIFIED IDEOGRAPH
+ {0xC25E, 0x801D}, //10975 #CJK UNIFIED IDEOGRAPH
+ {0xC25F, 0x801E}, //10976 #CJK UNIFIED IDEOGRAPH
+ {0xC260, 0x801F}, //10977 #CJK UNIFIED IDEOGRAPH
+ {0xC261, 0x8021}, //10978 #CJK UNIFIED IDEOGRAPH
+ {0xC262, 0x8023}, //10979 #CJK UNIFIED IDEOGRAPH
+ {0xC263, 0x8024}, //10980 #CJK UNIFIED IDEOGRAPH
+ {0xC264, 0x802B}, //10981 #CJK UNIFIED IDEOGRAPH
+ {0xC265, 0x802C}, //10982 #CJK UNIFIED IDEOGRAPH
+ {0xC266, 0x802D}, //10983 #CJK UNIFIED IDEOGRAPH
+ {0xC267, 0x802E}, //10984 #CJK UNIFIED IDEOGRAPH
+ {0xC268, 0x802F}, //10985 #CJK UNIFIED IDEOGRAPH
+ {0xC269, 0x8030}, //10986 #CJK UNIFIED IDEOGRAPH
+ {0xC26A, 0x8032}, //10987 #CJK UNIFIED IDEOGRAPH
+ {0xC26B, 0x8034}, //10988 #CJK UNIFIED IDEOGRAPH
+ {0xC26C, 0x8039}, //10989 #CJK UNIFIED IDEOGRAPH
+ {0xC26D, 0x803A}, //10990 #CJK UNIFIED IDEOGRAPH
+ {0xC26E, 0x803C}, //10991 #CJK UNIFIED IDEOGRAPH
+ {0xC26F, 0x803E}, //10992 #CJK UNIFIED IDEOGRAPH
+ {0xC270, 0x8040}, //10993 #CJK UNIFIED IDEOGRAPH
+ {0xC271, 0x8041}, //10994 #CJK UNIFIED IDEOGRAPH
+ {0xC272, 0x8044}, //10995 #CJK UNIFIED IDEOGRAPH
+ {0xC273, 0x8045}, //10996 #CJK UNIFIED IDEOGRAPH
+ {0xC274, 0x8047}, //10997 #CJK UNIFIED IDEOGRAPH
+ {0xC275, 0x8048}, //10998 #CJK UNIFIED IDEOGRAPH
+ {0xC276, 0x8049}, //10999 #CJK UNIFIED IDEOGRAPH
+ {0xC277, 0x804E}, //11000 #CJK UNIFIED IDEOGRAPH
+ {0xC278, 0x804F}, //11001 #CJK UNIFIED IDEOGRAPH
+ {0xC279, 0x8050}, //11002 #CJK UNIFIED IDEOGRAPH
+ {0xC27A, 0x8051}, //11003 #CJK UNIFIED IDEOGRAPH
+ {0xC27B, 0x8053}, //11004 #CJK UNIFIED IDEOGRAPH
+ {0xC27C, 0x8055}, //11005 #CJK UNIFIED IDEOGRAPH
+ {0xC27D, 0x8056}, //11006 #CJK UNIFIED IDEOGRAPH
+ {0xC27E, 0x8057}, //11007 #CJK UNIFIED IDEOGRAPH
+ {0xC280, 0x8059}, //11008 #CJK UNIFIED IDEOGRAPH
+ {0xC281, 0x805B}, //11009 #CJK UNIFIED IDEOGRAPH
+ {0xC282, 0x805C}, //11010 #CJK UNIFIED IDEOGRAPH
+ {0xC283, 0x805D}, //11011 #CJK UNIFIED IDEOGRAPH
+ {0xC284, 0x805E}, //11012 #CJK UNIFIED IDEOGRAPH
+ {0xC285, 0x805F}, //11013 #CJK UNIFIED IDEOGRAPH
+ {0xC286, 0x8060}, //11014 #CJK UNIFIED IDEOGRAPH
+ {0xC287, 0x8061}, //11015 #CJK UNIFIED IDEOGRAPH
+ {0xC288, 0x8062}, //11016 #CJK UNIFIED IDEOGRAPH
+ {0xC289, 0x8063}, //11017 #CJK UNIFIED IDEOGRAPH
+ {0xC28A, 0x8064}, //11018 #CJK UNIFIED IDEOGRAPH
+ {0xC28B, 0x8065}, //11019 #CJK UNIFIED IDEOGRAPH
+ {0xC28C, 0x8066}, //11020 #CJK UNIFIED IDEOGRAPH
+ {0xC28D, 0x8067}, //11021 #CJK UNIFIED IDEOGRAPH
+ {0xC28E, 0x8068}, //11022 #CJK UNIFIED IDEOGRAPH
+ {0xC28F, 0x806B}, //11023 #CJK UNIFIED IDEOGRAPH
+ {0xC290, 0x806C}, //11024 #CJK UNIFIED IDEOGRAPH
+ {0xC291, 0x806D}, //11025 #CJK UNIFIED IDEOGRAPH
+ {0xC292, 0x806E}, //11026 #CJK UNIFIED IDEOGRAPH
+ {0xC293, 0x806F}, //11027 #CJK UNIFIED IDEOGRAPH
+ {0xC294, 0x8070}, //11028 #CJK UNIFIED IDEOGRAPH
+ {0xC295, 0x8072}, //11029 #CJK UNIFIED IDEOGRAPH
+ {0xC296, 0x8073}, //11030 #CJK UNIFIED IDEOGRAPH
+ {0xC297, 0x8074}, //11031 #CJK UNIFIED IDEOGRAPH
+ {0xC298, 0x8075}, //11032 #CJK UNIFIED IDEOGRAPH
+ {0xC299, 0x8076}, //11033 #CJK UNIFIED IDEOGRAPH
+ {0xC29A, 0x8077}, //11034 #CJK UNIFIED IDEOGRAPH
+ {0xC29B, 0x8078}, //11035 #CJK UNIFIED IDEOGRAPH
+ {0xC29C, 0x8079}, //11036 #CJK UNIFIED IDEOGRAPH
+ {0xC29D, 0x807A}, //11037 #CJK UNIFIED IDEOGRAPH
+ {0xC29E, 0x807B}, //11038 #CJK UNIFIED IDEOGRAPH
+ {0xC29F, 0x807C}, //11039 #CJK UNIFIED IDEOGRAPH
+ {0xC2A0, 0x807D}, //11040 #CJK UNIFIED IDEOGRAPH
+ {0xC2A1, 0x9686}, //11041 #CJK UNIFIED IDEOGRAPH
+ {0xC2A2, 0x5784}, //11042 #CJK UNIFIED IDEOGRAPH
+ {0xC2A3, 0x62E2}, //11043 #CJK UNIFIED IDEOGRAPH
+ {0xC2A4, 0x9647}, //11044 #CJK UNIFIED IDEOGRAPH
+ {0xC2A5, 0x697C}, //11045 #CJK UNIFIED IDEOGRAPH
+ {0xC2A6, 0x5A04}, //11046 #CJK UNIFIED IDEOGRAPH
+ {0xC2A7, 0x6402}, //11047 #CJK UNIFIED IDEOGRAPH
+ {0xC2A8, 0x7BD3}, //11048 #CJK UNIFIED IDEOGRAPH
+ {0xC2A9, 0x6F0F}, //11049 #CJK UNIFIED IDEOGRAPH
+ {0xC2AA, 0x964B}, //11050 #CJK UNIFIED IDEOGRAPH
+ {0xC2AB, 0x82A6}, //11051 #CJK UNIFIED IDEOGRAPH
+ {0xC2AC, 0x5362}, //11052 #CJK UNIFIED IDEOGRAPH
+ {0xC2AD, 0x9885}, //11053 #CJK UNIFIED IDEOGRAPH
+ {0xC2AE, 0x5E90}, //11054 #CJK UNIFIED IDEOGRAPH
+ {0xC2AF, 0x7089}, //11055 #CJK UNIFIED IDEOGRAPH
+ {0xC2B0, 0x63B3}, //11056 #CJK UNIFIED IDEOGRAPH
+ {0xC2B1, 0x5364}, //11057 #CJK UNIFIED IDEOGRAPH
+ {0xC2B2, 0x864F}, //11058 #CJK UNIFIED IDEOGRAPH
+ {0xC2B3, 0x9C81}, //11059 #CJK UNIFIED IDEOGRAPH
+ {0xC2B4, 0x9E93}, //11060 #CJK UNIFIED IDEOGRAPH
+ {0xC2B5, 0x788C}, //11061 #CJK UNIFIED IDEOGRAPH
+ {0xC2B6, 0x9732}, //11062 #CJK UNIFIED IDEOGRAPH
+ {0xC2B7, 0x8DEF}, //11063 #CJK UNIFIED IDEOGRAPH
+ {0xC2B8, 0x8D42}, //11064 #CJK UNIFIED IDEOGRAPH
+ {0xC2B9, 0x9E7F}, //11065 #CJK UNIFIED IDEOGRAPH
+ {0xC2BA, 0x6F5E}, //11066 #CJK UNIFIED IDEOGRAPH
+ {0xC2BB, 0x7984}, //11067 #CJK UNIFIED IDEOGRAPH
+ {0xC2BC, 0x5F55}, //11068 #CJK UNIFIED IDEOGRAPH
+ {0xC2BD, 0x9646}, //11069 #CJK UNIFIED IDEOGRAPH
+ {0xC2BE, 0x622E}, //11070 #CJK UNIFIED IDEOGRAPH
+ {0xC2BF, 0x9A74}, //11071 #CJK UNIFIED IDEOGRAPH
+ {0xC2C0, 0x5415}, //11072 #CJK UNIFIED IDEOGRAPH
+ {0xC2C1, 0x94DD}, //11073 #CJK UNIFIED IDEOGRAPH
+ {0xC2C2, 0x4FA3}, //11074 #CJK UNIFIED IDEOGRAPH
+ {0xC2C3, 0x65C5}, //11075 #CJK UNIFIED IDEOGRAPH
+ {0xC2C4, 0x5C65}, //11076 #CJK UNIFIED IDEOGRAPH
+ {0xC2C5, 0x5C61}, //11077 #CJK UNIFIED IDEOGRAPH
+ {0xC2C6, 0x7F15}, //11078 #CJK UNIFIED IDEOGRAPH
+ {0xC2C7, 0x8651}, //11079 #CJK UNIFIED IDEOGRAPH
+ {0xC2C8, 0x6C2F}, //11080 #CJK UNIFIED IDEOGRAPH
+ {0xC2C9, 0x5F8B}, //11081 #CJK UNIFIED IDEOGRAPH
+ {0xC2CA, 0x7387}, //11082 #CJK UNIFIED IDEOGRAPH
+ {0xC2CB, 0x6EE4}, //11083 #CJK UNIFIED IDEOGRAPH
+ {0xC2CC, 0x7EFF}, //11084 #CJK UNIFIED IDEOGRAPH
+ {0xC2CD, 0x5CE6}, //11085 #CJK UNIFIED IDEOGRAPH
+ {0xC2CE, 0x631B}, //11086 #CJK UNIFIED IDEOGRAPH
+ {0xC2CF, 0x5B6A}, //11087 #CJK UNIFIED IDEOGRAPH
+ {0xC2D0, 0x6EE6}, //11088 #CJK UNIFIED IDEOGRAPH
+ {0xC2D1, 0x5375}, //11089 #CJK UNIFIED IDEOGRAPH
+ {0xC2D2, 0x4E71}, //11090 #CJK UNIFIED IDEOGRAPH
+ {0xC2D3, 0x63A0}, //11091 #CJK UNIFIED IDEOGRAPH
+ {0xC2D4, 0x7565}, //11092 #CJK UNIFIED IDEOGRAPH
+ {0xC2D5, 0x62A1}, //11093 #CJK UNIFIED IDEOGRAPH
+ {0xC2D6, 0x8F6E}, //11094 #CJK UNIFIED IDEOGRAPH
+ {0xC2D7, 0x4F26}, //11095 #CJK UNIFIED IDEOGRAPH
+ {0xC2D8, 0x4ED1}, //11096 #CJK UNIFIED IDEOGRAPH
+ {0xC2D9, 0x6CA6}, //11097 #CJK UNIFIED IDEOGRAPH
+ {0xC2DA, 0x7EB6}, //11098 #CJK UNIFIED IDEOGRAPH
+ {0xC2DB, 0x8BBA}, //11099 #CJK UNIFIED IDEOGRAPH
+ {0xC2DC, 0x841D}, //11100 #CJK UNIFIED IDEOGRAPH
+ {0xC2DD, 0x87BA}, //11101 #CJK UNIFIED IDEOGRAPH
+ {0xC2DE, 0x7F57}, //11102 #CJK UNIFIED IDEOGRAPH
+ {0xC2DF, 0x903B}, //11103 #CJK UNIFIED IDEOGRAPH
+ {0xC2E0, 0x9523}, //11104 #CJK UNIFIED IDEOGRAPH
+ {0xC2E1, 0x7BA9}, //11105 #CJK UNIFIED IDEOGRAPH
+ {0xC2E2, 0x9AA1}, //11106 #CJK UNIFIED IDEOGRAPH
+ {0xC2E3, 0x88F8}, //11107 #CJK UNIFIED IDEOGRAPH
+ {0xC2E4, 0x843D}, //11108 #CJK UNIFIED IDEOGRAPH
+ {0xC2E5, 0x6D1B}, //11109 #CJK UNIFIED IDEOGRAPH
+ {0xC2E6, 0x9A86}, //11110 #CJK UNIFIED IDEOGRAPH
+ {0xC2E7, 0x7EDC}, //11111 #CJK UNIFIED IDEOGRAPH
+ {0xC2E8, 0x5988}, //11112 #CJK UNIFIED IDEOGRAPH
+ {0xC2E9, 0x9EBB}, //11113 #CJK UNIFIED IDEOGRAPH
+ {0xC2EA, 0x739B}, //11114 #CJK UNIFIED IDEOGRAPH
+ {0xC2EB, 0x7801}, //11115 #CJK UNIFIED IDEOGRAPH
+ {0xC2EC, 0x8682}, //11116 #CJK UNIFIED IDEOGRAPH
+ {0xC2ED, 0x9A6C}, //11117 #CJK UNIFIED IDEOGRAPH
+ {0xC2EE, 0x9A82}, //11118 #CJK UNIFIED IDEOGRAPH
+ {0xC2EF, 0x561B}, //11119 #CJK UNIFIED IDEOGRAPH
+ {0xC2F0, 0x5417}, //11120 #CJK UNIFIED IDEOGRAPH
+ {0xC2F1, 0x57CB}, //11121 #CJK UNIFIED IDEOGRAPH
+ {0xC2F2, 0x4E70}, //11122 #CJK UNIFIED IDEOGRAPH
+ {0xC2F3, 0x9EA6}, //11123 #CJK UNIFIED IDEOGRAPH
+ {0xC2F4, 0x5356}, //11124 #CJK UNIFIED IDEOGRAPH
+ {0xC2F5, 0x8FC8}, //11125 #CJK UNIFIED IDEOGRAPH
+ {0xC2F6, 0x8109}, //11126 #CJK UNIFIED IDEOGRAPH
+ {0xC2F7, 0x7792}, //11127 #CJK UNIFIED IDEOGRAPH
+ {0xC2F8, 0x9992}, //11128 #CJK UNIFIED IDEOGRAPH
+ {0xC2F9, 0x86EE}, //11129 #CJK UNIFIED IDEOGRAPH
+ {0xC2FA, 0x6EE1}, //11130 #CJK UNIFIED IDEOGRAPH
+ {0xC2FB, 0x8513}, //11131 #CJK UNIFIED IDEOGRAPH
+ {0xC2FC, 0x66FC}, //11132 #CJK UNIFIED IDEOGRAPH
+ {0xC2FD, 0x6162}, //11133 #CJK UNIFIED IDEOGRAPH
+ {0xC2FE, 0x6F2B}, //11134 #CJK UNIFIED IDEOGRAPH
+ {0xC340, 0x807E}, //11135 #CJK UNIFIED IDEOGRAPH
+ {0xC341, 0x8081}, //11136 #CJK UNIFIED IDEOGRAPH
+ {0xC342, 0x8082}, //11137 #CJK UNIFIED IDEOGRAPH
+ {0xC343, 0x8085}, //11138 #CJK UNIFIED IDEOGRAPH
+ {0xC344, 0x8088}, //11139 #CJK UNIFIED IDEOGRAPH
+ {0xC345, 0x808A}, //11140 #CJK UNIFIED IDEOGRAPH
+ {0xC346, 0x808D}, //11141 #CJK UNIFIED IDEOGRAPH
+ {0xC347, 0x808E}, //11142 #CJK UNIFIED IDEOGRAPH
+ {0xC348, 0x808F}, //11143 #CJK UNIFIED IDEOGRAPH
+ {0xC349, 0x8090}, //11144 #CJK UNIFIED IDEOGRAPH
+ {0xC34A, 0x8091}, //11145 #CJK UNIFIED IDEOGRAPH
+ {0xC34B, 0x8092}, //11146 #CJK UNIFIED IDEOGRAPH
+ {0xC34C, 0x8094}, //11147 #CJK UNIFIED IDEOGRAPH
+ {0xC34D, 0x8095}, //11148 #CJK UNIFIED IDEOGRAPH
+ {0xC34E, 0x8097}, //11149 #CJK UNIFIED IDEOGRAPH
+ {0xC34F, 0x8099}, //11150 #CJK UNIFIED IDEOGRAPH
+ {0xC350, 0x809E}, //11151 #CJK UNIFIED IDEOGRAPH
+ {0xC351, 0x80A3}, //11152 #CJK UNIFIED IDEOGRAPH
+ {0xC352, 0x80A6}, //11153 #CJK UNIFIED IDEOGRAPH
+ {0xC353, 0x80A7}, //11154 #CJK UNIFIED IDEOGRAPH
+ {0xC354, 0x80A8}, //11155 #CJK UNIFIED IDEOGRAPH
+ {0xC355, 0x80AC}, //11156 #CJK UNIFIED IDEOGRAPH
+ {0xC356, 0x80B0}, //11157 #CJK UNIFIED IDEOGRAPH
+ {0xC357, 0x80B3}, //11158 #CJK UNIFIED IDEOGRAPH
+ {0xC358, 0x80B5}, //11159 #CJK UNIFIED IDEOGRAPH
+ {0xC359, 0x80B6}, //11160 #CJK UNIFIED IDEOGRAPH
+ {0xC35A, 0x80B8}, //11161 #CJK UNIFIED IDEOGRAPH
+ {0xC35B, 0x80B9}, //11162 #CJK UNIFIED IDEOGRAPH
+ {0xC35C, 0x80BB}, //11163 #CJK UNIFIED IDEOGRAPH
+ {0xC35D, 0x80C5}, //11164 #CJK UNIFIED IDEOGRAPH
+ {0xC35E, 0x80C7}, //11165 #CJK UNIFIED IDEOGRAPH
+ {0xC35F, 0x80C8}, //11166 #CJK UNIFIED IDEOGRAPH
+ {0xC360, 0x80C9}, //11167 #CJK UNIFIED IDEOGRAPH
+ {0xC361, 0x80CA}, //11168 #CJK UNIFIED IDEOGRAPH
+ {0xC362, 0x80CB}, //11169 #CJK UNIFIED IDEOGRAPH
+ {0xC363, 0x80CF}, //11170 #CJK UNIFIED IDEOGRAPH
+ {0xC364, 0x80D0}, //11171 #CJK UNIFIED IDEOGRAPH
+ {0xC365, 0x80D1}, //11172 #CJK UNIFIED IDEOGRAPH
+ {0xC366, 0x80D2}, //11173 #CJK UNIFIED IDEOGRAPH
+ {0xC367, 0x80D3}, //11174 #CJK UNIFIED IDEOGRAPH
+ {0xC368, 0x80D4}, //11175 #CJK UNIFIED IDEOGRAPH
+ {0xC369, 0x80D5}, //11176 #CJK UNIFIED IDEOGRAPH
+ {0xC36A, 0x80D8}, //11177 #CJK UNIFIED IDEOGRAPH
+ {0xC36B, 0x80DF}, //11178 #CJK UNIFIED IDEOGRAPH
+ {0xC36C, 0x80E0}, //11179 #CJK UNIFIED IDEOGRAPH
+ {0xC36D, 0x80E2}, //11180 #CJK UNIFIED IDEOGRAPH
+ {0xC36E, 0x80E3}, //11181 #CJK UNIFIED IDEOGRAPH
+ {0xC36F, 0x80E6}, //11182 #CJK UNIFIED IDEOGRAPH
+ {0xC370, 0x80EE}, //11183 #CJK UNIFIED IDEOGRAPH
+ {0xC371, 0x80F5}, //11184 #CJK UNIFIED IDEOGRAPH
+ {0xC372, 0x80F7}, //11185 #CJK UNIFIED IDEOGRAPH
+ {0xC373, 0x80F9}, //11186 #CJK UNIFIED IDEOGRAPH
+ {0xC374, 0x80FB}, //11187 #CJK UNIFIED IDEOGRAPH
+ {0xC375, 0x80FE}, //11188 #CJK UNIFIED IDEOGRAPH
+ {0xC376, 0x80FF}, //11189 #CJK UNIFIED IDEOGRAPH
+ {0xC377, 0x8100}, //11190 #CJK UNIFIED IDEOGRAPH
+ {0xC378, 0x8101}, //11191 #CJK UNIFIED IDEOGRAPH
+ {0xC379, 0x8103}, //11192 #CJK UNIFIED IDEOGRAPH
+ {0xC37A, 0x8104}, //11193 #CJK UNIFIED IDEOGRAPH
+ {0xC37B, 0x8105}, //11194 #CJK UNIFIED IDEOGRAPH
+ {0xC37C, 0x8107}, //11195 #CJK UNIFIED IDEOGRAPH
+ {0xC37D, 0x8108}, //11196 #CJK UNIFIED IDEOGRAPH
+ {0xC37E, 0x810B}, //11197 #CJK UNIFIED IDEOGRAPH
+ {0xC380, 0x810C}, //11198 #CJK UNIFIED IDEOGRAPH
+ {0xC381, 0x8115}, //11199 #CJK UNIFIED IDEOGRAPH
+ {0xC382, 0x8117}, //11200 #CJK UNIFIED IDEOGRAPH
+ {0xC383, 0x8119}, //11201 #CJK UNIFIED IDEOGRAPH
+ {0xC384, 0x811B}, //11202 #CJK UNIFIED IDEOGRAPH
+ {0xC385, 0x811C}, //11203 #CJK UNIFIED IDEOGRAPH
+ {0xC386, 0x811D}, //11204 #CJK UNIFIED IDEOGRAPH
+ {0xC387, 0x811F}, //11205 #CJK UNIFIED IDEOGRAPH
+ {0xC388, 0x8120}, //11206 #CJK UNIFIED IDEOGRAPH
+ {0xC389, 0x8121}, //11207 #CJK UNIFIED IDEOGRAPH
+ {0xC38A, 0x8122}, //11208 #CJK UNIFIED IDEOGRAPH
+ {0xC38B, 0x8123}, //11209 #CJK UNIFIED IDEOGRAPH
+ {0xC38C, 0x8124}, //11210 #CJK UNIFIED IDEOGRAPH
+ {0xC38D, 0x8125}, //11211 #CJK UNIFIED IDEOGRAPH
+ {0xC38E, 0x8126}, //11212 #CJK UNIFIED IDEOGRAPH
+ {0xC38F, 0x8127}, //11213 #CJK UNIFIED IDEOGRAPH
+ {0xC390, 0x8128}, //11214 #CJK UNIFIED IDEOGRAPH
+ {0xC391, 0x8129}, //11215 #CJK UNIFIED IDEOGRAPH
+ {0xC392, 0x812A}, //11216 #CJK UNIFIED IDEOGRAPH
+ {0xC393, 0x812B}, //11217 #CJK UNIFIED IDEOGRAPH
+ {0xC394, 0x812D}, //11218 #CJK UNIFIED IDEOGRAPH
+ {0xC395, 0x812E}, //11219 #CJK UNIFIED IDEOGRAPH
+ {0xC396, 0x8130}, //11220 #CJK UNIFIED IDEOGRAPH
+ {0xC397, 0x8133}, //11221 #CJK UNIFIED IDEOGRAPH
+ {0xC398, 0x8134}, //11222 #CJK UNIFIED IDEOGRAPH
+ {0xC399, 0x8135}, //11223 #CJK UNIFIED IDEOGRAPH
+ {0xC39A, 0x8137}, //11224 #CJK UNIFIED IDEOGRAPH
+ {0xC39B, 0x8139}, //11225 #CJK UNIFIED IDEOGRAPH
+ {0xC39C, 0x813A}, //11226 #CJK UNIFIED IDEOGRAPH
+ {0xC39D, 0x813B}, //11227 #CJK UNIFIED IDEOGRAPH
+ {0xC39E, 0x813C}, //11228 #CJK UNIFIED IDEOGRAPH
+ {0xC39F, 0x813D}, //11229 #CJK UNIFIED IDEOGRAPH
+ {0xC3A0, 0x813F}, //11230 #CJK UNIFIED IDEOGRAPH
+ {0xC3A1, 0x8C29}, //11231 #CJK UNIFIED IDEOGRAPH
+ {0xC3A2, 0x8292}, //11232 #CJK UNIFIED IDEOGRAPH
+ {0xC3A3, 0x832B}, //11233 #CJK UNIFIED IDEOGRAPH
+ {0xC3A4, 0x76F2}, //11234 #CJK UNIFIED IDEOGRAPH
+ {0xC3A5, 0x6C13}, //11235 #CJK UNIFIED IDEOGRAPH
+ {0xC3A6, 0x5FD9}, //11236 #CJK UNIFIED IDEOGRAPH
+ {0xC3A7, 0x83BD}, //11237 #CJK UNIFIED IDEOGRAPH
+ {0xC3A8, 0x732B}, //11238 #CJK UNIFIED IDEOGRAPH
+ {0xC3A9, 0x8305}, //11239 #CJK UNIFIED IDEOGRAPH
+ {0xC3AA, 0x951A}, //11240 #CJK UNIFIED IDEOGRAPH
+ {0xC3AB, 0x6BDB}, //11241 #CJK UNIFIED IDEOGRAPH
+ {0xC3AC, 0x77DB}, //11242 #CJK UNIFIED IDEOGRAPH
+ {0xC3AD, 0x94C6}, //11243 #CJK UNIFIED IDEOGRAPH
+ {0xC3AE, 0x536F}, //11244 #CJK UNIFIED IDEOGRAPH
+ {0xC3AF, 0x8302}, //11245 #CJK UNIFIED IDEOGRAPH
+ {0xC3B0, 0x5192}, //11246 #CJK UNIFIED IDEOGRAPH
+ {0xC3B1, 0x5E3D}, //11247 #CJK UNIFIED IDEOGRAPH
+ {0xC3B2, 0x8C8C}, //11248 #CJK UNIFIED IDEOGRAPH
+ {0xC3B3, 0x8D38}, //11249 #CJK UNIFIED IDEOGRAPH
+ {0xC3B4, 0x4E48}, //11250 #CJK UNIFIED IDEOGRAPH
+ {0xC3B5, 0x73AB}, //11251 #CJK UNIFIED IDEOGRAPH
+ {0xC3B6, 0x679A}, //11252 #CJK UNIFIED IDEOGRAPH
+ {0xC3B7, 0x6885}, //11253 #CJK UNIFIED IDEOGRAPH
+ {0xC3B8, 0x9176}, //11254 #CJK UNIFIED IDEOGRAPH
+ {0xC3B9, 0x9709}, //11255 #CJK UNIFIED IDEOGRAPH
+ {0xC3BA, 0x7164}, //11256 #CJK UNIFIED IDEOGRAPH
+ {0xC3BB, 0x6CA1}, //11257 #CJK UNIFIED IDEOGRAPH
+ {0xC3BC, 0x7709}, //11258 #CJK UNIFIED IDEOGRAPH
+ {0xC3BD, 0x5A92}, //11259 #CJK UNIFIED IDEOGRAPH
+ {0xC3BE, 0x9541}, //11260 #CJK UNIFIED IDEOGRAPH
+ {0xC3BF, 0x6BCF}, //11261 #CJK UNIFIED IDEOGRAPH
+ {0xC3C0, 0x7F8E}, //11262 #CJK UNIFIED IDEOGRAPH
+ {0xC3C1, 0x6627}, //11263 #CJK UNIFIED IDEOGRAPH
+ {0xC3C2, 0x5BD0}, //11264 #CJK UNIFIED IDEOGRAPH
+ {0xC3C3, 0x59B9}, //11265 #CJK UNIFIED IDEOGRAPH
+ {0xC3C4, 0x5A9A}, //11266 #CJK UNIFIED IDEOGRAPH
+ {0xC3C5, 0x95E8}, //11267 #CJK UNIFIED IDEOGRAPH
+ {0xC3C6, 0x95F7}, //11268 #CJK UNIFIED IDEOGRAPH
+ {0xC3C7, 0x4EEC}, //11269 #CJK UNIFIED IDEOGRAPH
+ {0xC3C8, 0x840C}, //11270 #CJK UNIFIED IDEOGRAPH
+ {0xC3C9, 0x8499}, //11271 #CJK UNIFIED IDEOGRAPH
+ {0xC3CA, 0x6AAC}, //11272 #CJK UNIFIED IDEOGRAPH
+ {0xC3CB, 0x76DF}, //11273 #CJK UNIFIED IDEOGRAPH
+ {0xC3CC, 0x9530}, //11274 #CJK UNIFIED IDEOGRAPH
+ {0xC3CD, 0x731B}, //11275 #CJK UNIFIED IDEOGRAPH
+ {0xC3CE, 0x68A6}, //11276 #CJK UNIFIED IDEOGRAPH
+ {0xC3CF, 0x5B5F}, //11277 #CJK UNIFIED IDEOGRAPH
+ {0xC3D0, 0x772F}, //11278 #CJK UNIFIED IDEOGRAPH
+ {0xC3D1, 0x919A}, //11279 #CJK UNIFIED IDEOGRAPH
+ {0xC3D2, 0x9761}, //11280 #CJK UNIFIED IDEOGRAPH
+ {0xC3D3, 0x7CDC}, //11281 #CJK UNIFIED IDEOGRAPH
+ {0xC3D4, 0x8FF7}, //11282 #CJK UNIFIED IDEOGRAPH
+ {0xC3D5, 0x8C1C}, //11283 #CJK UNIFIED IDEOGRAPH
+ {0xC3D6, 0x5F25}, //11284 #CJK UNIFIED IDEOGRAPH
+ {0xC3D7, 0x7C73}, //11285 #CJK UNIFIED IDEOGRAPH
+ {0xC3D8, 0x79D8}, //11286 #CJK UNIFIED IDEOGRAPH
+ {0xC3D9, 0x89C5}, //11287 #CJK UNIFIED IDEOGRAPH
+ {0xC3DA, 0x6CCC}, //11288 #CJK UNIFIED IDEOGRAPH
+ {0xC3DB, 0x871C}, //11289 #CJK UNIFIED IDEOGRAPH
+ {0xC3DC, 0x5BC6}, //11290 #CJK UNIFIED IDEOGRAPH
+ {0xC3DD, 0x5E42}, //11291 #CJK UNIFIED IDEOGRAPH
+ {0xC3DE, 0x68C9}, //11292 #CJK UNIFIED IDEOGRAPH
+ {0xC3DF, 0x7720}, //11293 #CJK UNIFIED IDEOGRAPH
+ {0xC3E0, 0x7EF5}, //11294 #CJK UNIFIED IDEOGRAPH
+ {0xC3E1, 0x5195}, //11295 #CJK UNIFIED IDEOGRAPH
+ {0xC3E2, 0x514D}, //11296 #CJK UNIFIED IDEOGRAPH
+ {0xC3E3, 0x52C9}, //11297 #CJK UNIFIED IDEOGRAPH
+ {0xC3E4, 0x5A29}, //11298 #CJK UNIFIED IDEOGRAPH
+ {0xC3E5, 0x7F05}, //11299 #CJK UNIFIED IDEOGRAPH
+ {0xC3E6, 0x9762}, //11300 #CJK UNIFIED IDEOGRAPH
+ {0xC3E7, 0x82D7}, //11301 #CJK UNIFIED IDEOGRAPH
+ {0xC3E8, 0x63CF}, //11302 #CJK UNIFIED IDEOGRAPH
+ {0xC3E9, 0x7784}, //11303 #CJK UNIFIED IDEOGRAPH
+ {0xC3EA, 0x85D0}, //11304 #CJK UNIFIED IDEOGRAPH
+ {0xC3EB, 0x79D2}, //11305 #CJK UNIFIED IDEOGRAPH
+ {0xC3EC, 0x6E3A}, //11306 #CJK UNIFIED IDEOGRAPH
+ {0xC3ED, 0x5E99}, //11307 #CJK UNIFIED IDEOGRAPH
+ {0xC3EE, 0x5999}, //11308 #CJK UNIFIED IDEOGRAPH
+ {0xC3EF, 0x8511}, //11309 #CJK UNIFIED IDEOGRAPH
+ {0xC3F0, 0x706D}, //11310 #CJK UNIFIED IDEOGRAPH
+ {0xC3F1, 0x6C11}, //11311 #CJK UNIFIED IDEOGRAPH
+ {0xC3F2, 0x62BF}, //11312 #CJK UNIFIED IDEOGRAPH
+ {0xC3F3, 0x76BF}, //11313 #CJK UNIFIED IDEOGRAPH
+ {0xC3F4, 0x654F}, //11314 #CJK UNIFIED IDEOGRAPH
+ {0xC3F5, 0x60AF}, //11315 #CJK UNIFIED IDEOGRAPH
+ {0xC3F6, 0x95FD}, //11316 #CJK UNIFIED IDEOGRAPH
+ {0xC3F7, 0x660E}, //11317 #CJK UNIFIED IDEOGRAPH
+ {0xC3F8, 0x879F}, //11318 #CJK UNIFIED IDEOGRAPH
+ {0xC3F9, 0x9E23}, //11319 #CJK UNIFIED IDEOGRAPH
+ {0xC3FA, 0x94ED}, //11320 #CJK UNIFIED IDEOGRAPH
+ {0xC3FB, 0x540D}, //11321 #CJK UNIFIED IDEOGRAPH
+ {0xC3FC, 0x547D}, //11322 #CJK UNIFIED IDEOGRAPH
+ {0xC3FD, 0x8C2C}, //11323 #CJK UNIFIED IDEOGRAPH
+ {0xC3FE, 0x6478}, //11324 #CJK UNIFIED IDEOGRAPH
+ {0xC440, 0x8140}, //11325 #CJK UNIFIED IDEOGRAPH
+ {0xC441, 0x8141}, //11326 #CJK UNIFIED IDEOGRAPH
+ {0xC442, 0x8142}, //11327 #CJK UNIFIED IDEOGRAPH
+ {0xC443, 0x8143}, //11328 #CJK UNIFIED IDEOGRAPH
+ {0xC444, 0x8144}, //11329 #CJK UNIFIED IDEOGRAPH
+ {0xC445, 0x8145}, //11330 #CJK UNIFIED IDEOGRAPH
+ {0xC446, 0x8147}, //11331 #CJK UNIFIED IDEOGRAPH
+ {0xC447, 0x8149}, //11332 #CJK UNIFIED IDEOGRAPH
+ {0xC448, 0x814D}, //11333 #CJK UNIFIED IDEOGRAPH
+ {0xC449, 0x814E}, //11334 #CJK UNIFIED IDEOGRAPH
+ {0xC44A, 0x814F}, //11335 #CJK UNIFIED IDEOGRAPH
+ {0xC44B, 0x8152}, //11336 #CJK UNIFIED IDEOGRAPH
+ {0xC44C, 0x8156}, //11337 #CJK UNIFIED IDEOGRAPH
+ {0xC44D, 0x8157}, //11338 #CJK UNIFIED IDEOGRAPH
+ {0xC44E, 0x8158}, //11339 #CJK UNIFIED IDEOGRAPH
+ {0xC44F, 0x815B}, //11340 #CJK UNIFIED IDEOGRAPH
+ {0xC450, 0x815C}, //11341 #CJK UNIFIED IDEOGRAPH
+ {0xC451, 0x815D}, //11342 #CJK UNIFIED IDEOGRAPH
+ {0xC452, 0x815E}, //11343 #CJK UNIFIED IDEOGRAPH
+ {0xC453, 0x815F}, //11344 #CJK UNIFIED IDEOGRAPH
+ {0xC454, 0x8161}, //11345 #CJK UNIFIED IDEOGRAPH
+ {0xC455, 0x8162}, //11346 #CJK UNIFIED IDEOGRAPH
+ {0xC456, 0x8163}, //11347 #CJK UNIFIED IDEOGRAPH
+ {0xC457, 0x8164}, //11348 #CJK UNIFIED IDEOGRAPH
+ {0xC458, 0x8166}, //11349 #CJK UNIFIED IDEOGRAPH
+ {0xC459, 0x8168}, //11350 #CJK UNIFIED IDEOGRAPH
+ {0xC45A, 0x816A}, //11351 #CJK UNIFIED IDEOGRAPH
+ {0xC45B, 0x816B}, //11352 #CJK UNIFIED IDEOGRAPH
+ {0xC45C, 0x816C}, //11353 #CJK UNIFIED IDEOGRAPH
+ {0xC45D, 0x816F}, //11354 #CJK UNIFIED IDEOGRAPH
+ {0xC45E, 0x8172}, //11355 #CJK UNIFIED IDEOGRAPH
+ {0xC45F, 0x8173}, //11356 #CJK UNIFIED IDEOGRAPH
+ {0xC460, 0x8175}, //11357 #CJK UNIFIED IDEOGRAPH
+ {0xC461, 0x8176}, //11358 #CJK UNIFIED IDEOGRAPH
+ {0xC462, 0x8177}, //11359 #CJK UNIFIED IDEOGRAPH
+ {0xC463, 0x8178}, //11360 #CJK UNIFIED IDEOGRAPH
+ {0xC464, 0x8181}, //11361 #CJK UNIFIED IDEOGRAPH
+ {0xC465, 0x8183}, //11362 #CJK UNIFIED IDEOGRAPH
+ {0xC466, 0x8184}, //11363 #CJK UNIFIED IDEOGRAPH
+ {0xC467, 0x8185}, //11364 #CJK UNIFIED IDEOGRAPH
+ {0xC468, 0x8186}, //11365 #CJK UNIFIED IDEOGRAPH
+ {0xC469, 0x8187}, //11366 #CJK UNIFIED IDEOGRAPH
+ {0xC46A, 0x8189}, //11367 #CJK UNIFIED IDEOGRAPH
+ {0xC46B, 0x818B}, //11368 #CJK UNIFIED IDEOGRAPH
+ {0xC46C, 0x818C}, //11369 #CJK UNIFIED IDEOGRAPH
+ {0xC46D, 0x818D}, //11370 #CJK UNIFIED IDEOGRAPH
+ {0xC46E, 0x818E}, //11371 #CJK UNIFIED IDEOGRAPH
+ {0xC46F, 0x8190}, //11372 #CJK UNIFIED IDEOGRAPH
+ {0xC470, 0x8192}, //11373 #CJK UNIFIED IDEOGRAPH
+ {0xC471, 0x8193}, //11374 #CJK UNIFIED IDEOGRAPH
+ {0xC472, 0x8194}, //11375 #CJK UNIFIED IDEOGRAPH
+ {0xC473, 0x8195}, //11376 #CJK UNIFIED IDEOGRAPH
+ {0xC474, 0x8196}, //11377 #CJK UNIFIED IDEOGRAPH
+ {0xC475, 0x8197}, //11378 #CJK UNIFIED IDEOGRAPH
+ {0xC476, 0x8199}, //11379 #CJK UNIFIED IDEOGRAPH
+ {0xC477, 0x819A}, //11380 #CJK UNIFIED IDEOGRAPH
+ {0xC478, 0x819E}, //11381 #CJK UNIFIED IDEOGRAPH
+ {0xC479, 0x819F}, //11382 #CJK UNIFIED IDEOGRAPH
+ {0xC47A, 0x81A0}, //11383 #CJK UNIFIED IDEOGRAPH
+ {0xC47B, 0x81A1}, //11384 #CJK UNIFIED IDEOGRAPH
+ {0xC47C, 0x81A2}, //11385 #CJK UNIFIED IDEOGRAPH
+ {0xC47D, 0x81A4}, //11386 #CJK UNIFIED IDEOGRAPH
+ {0xC47E, 0x81A5}, //11387 #CJK UNIFIED IDEOGRAPH
+ {0xC480, 0x81A7}, //11388 #CJK UNIFIED IDEOGRAPH
+ {0xC481, 0x81A9}, //11389 #CJK UNIFIED IDEOGRAPH
+ {0xC482, 0x81AB}, //11390 #CJK UNIFIED IDEOGRAPH
+ {0xC483, 0x81AC}, //11391 #CJK UNIFIED IDEOGRAPH
+ {0xC484, 0x81AD}, //11392 #CJK UNIFIED IDEOGRAPH
+ {0xC485, 0x81AE}, //11393 #CJK UNIFIED IDEOGRAPH
+ {0xC486, 0x81AF}, //11394 #CJK UNIFIED IDEOGRAPH
+ {0xC487, 0x81B0}, //11395 #CJK UNIFIED IDEOGRAPH
+ {0xC488, 0x81B1}, //11396 #CJK UNIFIED IDEOGRAPH
+ {0xC489, 0x81B2}, //11397 #CJK UNIFIED IDEOGRAPH
+ {0xC48A, 0x81B4}, //11398 #CJK UNIFIED IDEOGRAPH
+ {0xC48B, 0x81B5}, //11399 #CJK UNIFIED IDEOGRAPH
+ {0xC48C, 0x81B6}, //11400 #CJK UNIFIED IDEOGRAPH
+ {0xC48D, 0x81B7}, //11401 #CJK UNIFIED IDEOGRAPH
+ {0xC48E, 0x81B8}, //11402 #CJK UNIFIED IDEOGRAPH
+ {0xC48F, 0x81B9}, //11403 #CJK UNIFIED IDEOGRAPH
+ {0xC490, 0x81BC}, //11404 #CJK UNIFIED IDEOGRAPH
+ {0xC491, 0x81BD}, //11405 #CJK UNIFIED IDEOGRAPH
+ {0xC492, 0x81BE}, //11406 #CJK UNIFIED IDEOGRAPH
+ {0xC493, 0x81BF}, //11407 #CJK UNIFIED IDEOGRAPH
+ {0xC494, 0x81C4}, //11408 #CJK UNIFIED IDEOGRAPH
+ {0xC495, 0x81C5}, //11409 #CJK UNIFIED IDEOGRAPH
+ {0xC496, 0x81C7}, //11410 #CJK UNIFIED IDEOGRAPH
+ {0xC497, 0x81C8}, //11411 #CJK UNIFIED IDEOGRAPH
+ {0xC498, 0x81C9}, //11412 #CJK UNIFIED IDEOGRAPH
+ {0xC499, 0x81CB}, //11413 #CJK UNIFIED IDEOGRAPH
+ {0xC49A, 0x81CD}, //11414 #CJK UNIFIED IDEOGRAPH
+ {0xC49B, 0x81CE}, //11415 #CJK UNIFIED IDEOGRAPH
+ {0xC49C, 0x81CF}, //11416 #CJK UNIFIED IDEOGRAPH
+ {0xC49D, 0x81D0}, //11417 #CJK UNIFIED IDEOGRAPH
+ {0xC49E, 0x81D1}, //11418 #CJK UNIFIED IDEOGRAPH
+ {0xC49F, 0x81D2}, //11419 #CJK UNIFIED IDEOGRAPH
+ {0xC4A0, 0x81D3}, //11420 #CJK UNIFIED IDEOGRAPH
+ {0xC4A1, 0x6479}, //11421 #CJK UNIFIED IDEOGRAPH
+ {0xC4A2, 0x8611}, //11422 #CJK UNIFIED IDEOGRAPH
+ {0xC4A3, 0x6A21}, //11423 #CJK UNIFIED IDEOGRAPH
+ {0xC4A4, 0x819C}, //11424 #CJK UNIFIED IDEOGRAPH
+ {0xC4A5, 0x78E8}, //11425 #CJK UNIFIED IDEOGRAPH
+ {0xC4A6, 0x6469}, //11426 #CJK UNIFIED IDEOGRAPH
+ {0xC4A7, 0x9B54}, //11427 #CJK UNIFIED IDEOGRAPH
+ {0xC4A8, 0x62B9}, //11428 #CJK UNIFIED IDEOGRAPH
+ {0xC4A9, 0x672B}, //11429 #CJK UNIFIED IDEOGRAPH
+ {0xC4AA, 0x83AB}, //11430 #CJK UNIFIED IDEOGRAPH
+ {0xC4AB, 0x58A8}, //11431 #CJK UNIFIED IDEOGRAPH
+ {0xC4AC, 0x9ED8}, //11432 #CJK UNIFIED IDEOGRAPH
+ {0xC4AD, 0x6CAB}, //11433 #CJK UNIFIED IDEOGRAPH
+ {0xC4AE, 0x6F20}, //11434 #CJK UNIFIED IDEOGRAPH
+ {0xC4AF, 0x5BDE}, //11435 #CJK UNIFIED IDEOGRAPH
+ {0xC4B0, 0x964C}, //11436 #CJK UNIFIED IDEOGRAPH
+ {0xC4B1, 0x8C0B}, //11437 #CJK UNIFIED IDEOGRAPH
+ {0xC4B2, 0x725F}, //11438 #CJK UNIFIED IDEOGRAPH
+ {0xC4B3, 0x67D0}, //11439 #CJK UNIFIED IDEOGRAPH
+ {0xC4B4, 0x62C7}, //11440 #CJK UNIFIED IDEOGRAPH
+ {0xC4B5, 0x7261}, //11441 #CJK UNIFIED IDEOGRAPH
+ {0xC4B6, 0x4EA9}, //11442 #CJK UNIFIED IDEOGRAPH
+ {0xC4B7, 0x59C6}, //11443 #CJK UNIFIED IDEOGRAPH
+ {0xC4B8, 0x6BCD}, //11444 #CJK UNIFIED IDEOGRAPH
+ {0xC4B9, 0x5893}, //11445 #CJK UNIFIED IDEOGRAPH
+ {0xC4BA, 0x66AE}, //11446 #CJK UNIFIED IDEOGRAPH
+ {0xC4BB, 0x5E55}, //11447 #CJK UNIFIED IDEOGRAPH
+ {0xC4BC, 0x52DF}, //11448 #CJK UNIFIED IDEOGRAPH
+ {0xC4BD, 0x6155}, //11449 #CJK UNIFIED IDEOGRAPH
+ {0xC4BE, 0x6728}, //11450 #CJK UNIFIED IDEOGRAPH
+ {0xC4BF, 0x76EE}, //11451 #CJK UNIFIED IDEOGRAPH
+ {0xC4C0, 0x7766}, //11452 #CJK UNIFIED IDEOGRAPH
+ {0xC4C1, 0x7267}, //11453 #CJK UNIFIED IDEOGRAPH
+ {0xC4C2, 0x7A46}, //11454 #CJK UNIFIED IDEOGRAPH
+ {0xC4C3, 0x62FF}, //11455 #CJK UNIFIED IDEOGRAPH
+ {0xC4C4, 0x54EA}, //11456 #CJK UNIFIED IDEOGRAPH
+ {0xC4C5, 0x5450}, //11457 #CJK UNIFIED IDEOGRAPH
+ {0xC4C6, 0x94A0}, //11458 #CJK UNIFIED IDEOGRAPH
+ {0xC4C7, 0x90A3}, //11459 #CJK UNIFIED IDEOGRAPH
+ {0xC4C8, 0x5A1C}, //11460 #CJK UNIFIED IDEOGRAPH
+ {0xC4C9, 0x7EB3}, //11461 #CJK UNIFIED IDEOGRAPH
+ {0xC4CA, 0x6C16}, //11462 #CJK UNIFIED IDEOGRAPH
+ {0xC4CB, 0x4E43}, //11463 #CJK UNIFIED IDEOGRAPH
+ {0xC4CC, 0x5976}, //11464 #CJK UNIFIED IDEOGRAPH
+ {0xC4CD, 0x8010}, //11465 #CJK UNIFIED IDEOGRAPH
+ {0xC4CE, 0x5948}, //11466 #CJK UNIFIED IDEOGRAPH
+ {0xC4CF, 0x5357}, //11467 #CJK UNIFIED IDEOGRAPH
+ {0xC4D0, 0x7537}, //11468 #CJK UNIFIED IDEOGRAPH
+ {0xC4D1, 0x96BE}, //11469 #CJK UNIFIED IDEOGRAPH
+ {0xC4D2, 0x56CA}, //11470 #CJK UNIFIED IDEOGRAPH
+ {0xC4D3, 0x6320}, //11471 #CJK UNIFIED IDEOGRAPH
+ {0xC4D4, 0x8111}, //11472 #CJK UNIFIED IDEOGRAPH
+ {0xC4D5, 0x607C}, //11473 #CJK UNIFIED IDEOGRAPH
+ {0xC4D6, 0x95F9}, //11474 #CJK UNIFIED IDEOGRAPH
+ {0xC4D7, 0x6DD6}, //11475 #CJK UNIFIED IDEOGRAPH
+ {0xC4D8, 0x5462}, //11476 #CJK UNIFIED IDEOGRAPH
+ {0xC4D9, 0x9981}, //11477 #CJK UNIFIED IDEOGRAPH
+ {0xC4DA, 0x5185}, //11478 #CJK UNIFIED IDEOGRAPH
+ {0xC4DB, 0x5AE9}, //11479 #CJK UNIFIED IDEOGRAPH
+ {0xC4DC, 0x80FD}, //11480 #CJK UNIFIED IDEOGRAPH
+ {0xC4DD, 0x59AE}, //11481 #CJK UNIFIED IDEOGRAPH
+ {0xC4DE, 0x9713}, //11482 #CJK UNIFIED IDEOGRAPH
+ {0xC4DF, 0x502A}, //11483 #CJK UNIFIED IDEOGRAPH
+ {0xC4E0, 0x6CE5}, //11484 #CJK UNIFIED IDEOGRAPH
+ {0xC4E1, 0x5C3C}, //11485 #CJK UNIFIED IDEOGRAPH
+ {0xC4E2, 0x62DF}, //11486 #CJK UNIFIED IDEOGRAPH
+ {0xC4E3, 0x4F60}, //11487 #CJK UNIFIED IDEOGRAPH
+ {0xC4E4, 0x533F}, //11488 #CJK UNIFIED IDEOGRAPH
+ {0xC4E5, 0x817B}, //11489 #CJK UNIFIED IDEOGRAPH
+ {0xC4E6, 0x9006}, //11490 #CJK UNIFIED IDEOGRAPH
+ {0xC4E7, 0x6EBA}, //11491 #CJK UNIFIED IDEOGRAPH
+ {0xC4E8, 0x852B}, //11492 #CJK UNIFIED IDEOGRAPH
+ {0xC4E9, 0x62C8}, //11493 #CJK UNIFIED IDEOGRAPH
+ {0xC4EA, 0x5E74}, //11494 #CJK UNIFIED IDEOGRAPH
+ {0xC4EB, 0x78BE}, //11495 #CJK UNIFIED IDEOGRAPH
+ {0xC4EC, 0x64B5}, //11496 #CJK UNIFIED IDEOGRAPH
+ {0xC4ED, 0x637B}, //11497 #CJK UNIFIED IDEOGRAPH
+ {0xC4EE, 0x5FF5}, //11498 #CJK UNIFIED IDEOGRAPH
+ {0xC4EF, 0x5A18}, //11499 #CJK UNIFIED IDEOGRAPH
+ {0xC4F0, 0x917F}, //11500 #CJK UNIFIED IDEOGRAPH
+ {0xC4F1, 0x9E1F}, //11501 #CJK UNIFIED IDEOGRAPH
+ {0xC4F2, 0x5C3F}, //11502 #CJK UNIFIED IDEOGRAPH
+ {0xC4F3, 0x634F}, //11503 #CJK UNIFIED IDEOGRAPH
+ {0xC4F4, 0x8042}, //11504 #CJK UNIFIED IDEOGRAPH
+ {0xC4F5, 0x5B7D}, //11505 #CJK UNIFIED IDEOGRAPH
+ {0xC4F6, 0x556E}, //11506 #CJK UNIFIED IDEOGRAPH
+ {0xC4F7, 0x954A}, //11507 #CJK UNIFIED IDEOGRAPH
+ {0xC4F8, 0x954D}, //11508 #CJK UNIFIED IDEOGRAPH
+ {0xC4F9, 0x6D85}, //11509 #CJK UNIFIED IDEOGRAPH
+ {0xC4FA, 0x60A8}, //11510 #CJK UNIFIED IDEOGRAPH
+ {0xC4FB, 0x67E0}, //11511 #CJK UNIFIED IDEOGRAPH
+ {0xC4FC, 0x72DE}, //11512 #CJK UNIFIED IDEOGRAPH
+ {0xC4FD, 0x51DD}, //11513 #CJK UNIFIED IDEOGRAPH
+ {0xC4FE, 0x5B81}, //11514 #CJK UNIFIED IDEOGRAPH
+ {0xC540, 0x81D4}, //11515 #CJK UNIFIED IDEOGRAPH
+ {0xC541, 0x81D5}, //11516 #CJK UNIFIED IDEOGRAPH
+ {0xC542, 0x81D6}, //11517 #CJK UNIFIED IDEOGRAPH
+ {0xC543, 0x81D7}, //11518 #CJK UNIFIED IDEOGRAPH
+ {0xC544, 0x81D8}, //11519 #CJK UNIFIED IDEOGRAPH
+ {0xC545, 0x81D9}, //11520 #CJK UNIFIED IDEOGRAPH
+ {0xC546, 0x81DA}, //11521 #CJK UNIFIED IDEOGRAPH
+ {0xC547, 0x81DB}, //11522 #CJK UNIFIED IDEOGRAPH
+ {0xC548, 0x81DC}, //11523 #CJK UNIFIED IDEOGRAPH
+ {0xC549, 0x81DD}, //11524 #CJK UNIFIED IDEOGRAPH
+ {0xC54A, 0x81DE}, //11525 #CJK UNIFIED IDEOGRAPH
+ {0xC54B, 0x81DF}, //11526 #CJK UNIFIED IDEOGRAPH
+ {0xC54C, 0x81E0}, //11527 #CJK UNIFIED IDEOGRAPH
+ {0xC54D, 0x81E1}, //11528 #CJK UNIFIED IDEOGRAPH
+ {0xC54E, 0x81E2}, //11529 #CJK UNIFIED IDEOGRAPH
+ {0xC54F, 0x81E4}, //11530 #CJK UNIFIED IDEOGRAPH
+ {0xC550, 0x81E5}, //11531 #CJK UNIFIED IDEOGRAPH
+ {0xC551, 0x81E6}, //11532 #CJK UNIFIED IDEOGRAPH
+ {0xC552, 0x81E8}, //11533 #CJK UNIFIED IDEOGRAPH
+ {0xC553, 0x81E9}, //11534 #CJK UNIFIED IDEOGRAPH
+ {0xC554, 0x81EB}, //11535 #CJK UNIFIED IDEOGRAPH
+ {0xC555, 0x81EE}, //11536 #CJK UNIFIED IDEOGRAPH
+ {0xC556, 0x81EF}, //11537 #CJK UNIFIED IDEOGRAPH
+ {0xC557, 0x81F0}, //11538 #CJK UNIFIED IDEOGRAPH
+ {0xC558, 0x81F1}, //11539 #CJK UNIFIED IDEOGRAPH
+ {0xC559, 0x81F2}, //11540 #CJK UNIFIED IDEOGRAPH
+ {0xC55A, 0x81F5}, //11541 #CJK UNIFIED IDEOGRAPH
+ {0xC55B, 0x81F6}, //11542 #CJK UNIFIED IDEOGRAPH
+ {0xC55C, 0x81F7}, //11543 #CJK UNIFIED IDEOGRAPH
+ {0xC55D, 0x81F8}, //11544 #CJK UNIFIED IDEOGRAPH
+ {0xC55E, 0x81F9}, //11545 #CJK UNIFIED IDEOGRAPH
+ {0xC55F, 0x81FA}, //11546 #CJK UNIFIED IDEOGRAPH
+ {0xC560, 0x81FD}, //11547 #CJK UNIFIED IDEOGRAPH
+ {0xC561, 0x81FF}, //11548 #CJK UNIFIED IDEOGRAPH
+ {0xC562, 0x8203}, //11549 #CJK UNIFIED IDEOGRAPH
+ {0xC563, 0x8207}, //11550 #CJK UNIFIED IDEOGRAPH
+ {0xC564, 0x8208}, //11551 #CJK UNIFIED IDEOGRAPH
+ {0xC565, 0x8209}, //11552 #CJK UNIFIED IDEOGRAPH
+ {0xC566, 0x820A}, //11553 #CJK UNIFIED IDEOGRAPH
+ {0xC567, 0x820B}, //11554 #CJK UNIFIED IDEOGRAPH
+ {0xC568, 0x820E}, //11555 #CJK UNIFIED IDEOGRAPH
+ {0xC569, 0x820F}, //11556 #CJK UNIFIED IDEOGRAPH
+ {0xC56A, 0x8211}, //11557 #CJK UNIFIED IDEOGRAPH
+ {0xC56B, 0x8213}, //11558 #CJK UNIFIED IDEOGRAPH
+ {0xC56C, 0x8215}, //11559 #CJK UNIFIED IDEOGRAPH
+ {0xC56D, 0x8216}, //11560 #CJK UNIFIED IDEOGRAPH
+ {0xC56E, 0x8217}, //11561 #CJK UNIFIED IDEOGRAPH
+ {0xC56F, 0x8218}, //11562 #CJK UNIFIED IDEOGRAPH
+ {0xC570, 0x8219}, //11563 #CJK UNIFIED IDEOGRAPH
+ {0xC571, 0x821A}, //11564 #CJK UNIFIED IDEOGRAPH
+ {0xC572, 0x821D}, //11565 #CJK UNIFIED IDEOGRAPH
+ {0xC573, 0x8220}, //11566 #CJK UNIFIED IDEOGRAPH
+ {0xC574, 0x8224}, //11567 #CJK UNIFIED IDEOGRAPH
+ {0xC575, 0x8225}, //11568 #CJK UNIFIED IDEOGRAPH
+ {0xC576, 0x8226}, //11569 #CJK UNIFIED IDEOGRAPH
+ {0xC577, 0x8227}, //11570 #CJK UNIFIED IDEOGRAPH
+ {0xC578, 0x8229}, //11571 #CJK UNIFIED IDEOGRAPH
+ {0xC579, 0x822E}, //11572 #CJK UNIFIED IDEOGRAPH
+ {0xC57A, 0x8232}, //11573 #CJK UNIFIED IDEOGRAPH
+ {0xC57B, 0x823A}, //11574 #CJK UNIFIED IDEOGRAPH
+ {0xC57C, 0x823C}, //11575 #CJK UNIFIED IDEOGRAPH
+ {0xC57D, 0x823D}, //11576 #CJK UNIFIED IDEOGRAPH
+ {0xC57E, 0x823F}, //11577 #CJK UNIFIED IDEOGRAPH
+ {0xC580, 0x8240}, //11578 #CJK UNIFIED IDEOGRAPH
+ {0xC581, 0x8241}, //11579 #CJK UNIFIED IDEOGRAPH
+ {0xC582, 0x8242}, //11580 #CJK UNIFIED IDEOGRAPH
+ {0xC583, 0x8243}, //11581 #CJK UNIFIED IDEOGRAPH
+ {0xC584, 0x8245}, //11582 #CJK UNIFIED IDEOGRAPH
+ {0xC585, 0x8246}, //11583 #CJK UNIFIED IDEOGRAPH
+ {0xC586, 0x8248}, //11584 #CJK UNIFIED IDEOGRAPH
+ {0xC587, 0x824A}, //11585 #CJK UNIFIED IDEOGRAPH
+ {0xC588, 0x824C}, //11586 #CJK UNIFIED IDEOGRAPH
+ {0xC589, 0x824D}, //11587 #CJK UNIFIED IDEOGRAPH
+ {0xC58A, 0x824E}, //11588 #CJK UNIFIED IDEOGRAPH
+ {0xC58B, 0x8250}, //11589 #CJK UNIFIED IDEOGRAPH
+ {0xC58C, 0x8251}, //11590 #CJK UNIFIED IDEOGRAPH
+ {0xC58D, 0x8252}, //11591 #CJK UNIFIED IDEOGRAPH
+ {0xC58E, 0x8253}, //11592 #CJK UNIFIED IDEOGRAPH
+ {0xC58F, 0x8254}, //11593 #CJK UNIFIED IDEOGRAPH
+ {0xC590, 0x8255}, //11594 #CJK UNIFIED IDEOGRAPH
+ {0xC591, 0x8256}, //11595 #CJK UNIFIED IDEOGRAPH
+ {0xC592, 0x8257}, //11596 #CJK UNIFIED IDEOGRAPH
+ {0xC593, 0x8259}, //11597 #CJK UNIFIED IDEOGRAPH
+ {0xC594, 0x825B}, //11598 #CJK UNIFIED IDEOGRAPH
+ {0xC595, 0x825C}, //11599 #CJK UNIFIED IDEOGRAPH
+ {0xC596, 0x825D}, //11600 #CJK UNIFIED IDEOGRAPH
+ {0xC597, 0x825E}, //11601 #CJK UNIFIED IDEOGRAPH
+ {0xC598, 0x8260}, //11602 #CJK UNIFIED IDEOGRAPH
+ {0xC599, 0x8261}, //11603 #CJK UNIFIED IDEOGRAPH
+ {0xC59A, 0x8262}, //11604 #CJK UNIFIED IDEOGRAPH
+ {0xC59B, 0x8263}, //11605 #CJK UNIFIED IDEOGRAPH
+ {0xC59C, 0x8264}, //11606 #CJK UNIFIED IDEOGRAPH
+ {0xC59D, 0x8265}, //11607 #CJK UNIFIED IDEOGRAPH
+ {0xC59E, 0x8266}, //11608 #CJK UNIFIED IDEOGRAPH
+ {0xC59F, 0x8267}, //11609 #CJK UNIFIED IDEOGRAPH
+ {0xC5A0, 0x8269}, //11610 #CJK UNIFIED IDEOGRAPH
+ {0xC5A1, 0x62E7}, //11611 #CJK UNIFIED IDEOGRAPH
+ {0xC5A2, 0x6CDE}, //11612 #CJK UNIFIED IDEOGRAPH
+ {0xC5A3, 0x725B}, //11613 #CJK UNIFIED IDEOGRAPH
+ {0xC5A4, 0x626D}, //11614 #CJK UNIFIED IDEOGRAPH
+ {0xC5A5, 0x94AE}, //11615 #CJK UNIFIED IDEOGRAPH
+ {0xC5A6, 0x7EBD}, //11616 #CJK UNIFIED IDEOGRAPH
+ {0xC5A7, 0x8113}, //11617 #CJK UNIFIED IDEOGRAPH
+ {0xC5A8, 0x6D53}, //11618 #CJK UNIFIED IDEOGRAPH
+ {0xC5A9, 0x519C}, //11619 #CJK UNIFIED IDEOGRAPH
+ {0xC5AA, 0x5F04}, //11620 #CJK UNIFIED IDEOGRAPH
+ {0xC5AB, 0x5974}, //11621 #CJK UNIFIED IDEOGRAPH
+ {0xC5AC, 0x52AA}, //11622 #CJK UNIFIED IDEOGRAPH
+ {0xC5AD, 0x6012}, //11623 #CJK UNIFIED IDEOGRAPH
+ {0xC5AE, 0x5973}, //11624 #CJK UNIFIED IDEOGRAPH
+ {0xC5AF, 0x6696}, //11625 #CJK UNIFIED IDEOGRAPH
+ {0xC5B0, 0x8650}, //11626 #CJK UNIFIED IDEOGRAPH
+ {0xC5B1, 0x759F}, //11627 #CJK UNIFIED IDEOGRAPH
+ {0xC5B2, 0x632A}, //11628 #CJK UNIFIED IDEOGRAPH
+ {0xC5B3, 0x61E6}, //11629 #CJK UNIFIED IDEOGRAPH
+ {0xC5B4, 0x7CEF}, //11630 #CJK UNIFIED IDEOGRAPH
+ {0xC5B5, 0x8BFA}, //11631 #CJK UNIFIED IDEOGRAPH
+ {0xC5B6, 0x54E6}, //11632 #CJK UNIFIED IDEOGRAPH
+ {0xC5B7, 0x6B27}, //11633 #CJK UNIFIED IDEOGRAPH
+ {0xC5B8, 0x9E25}, //11634 #CJK UNIFIED IDEOGRAPH
+ {0xC5B9, 0x6BB4}, //11635 #CJK UNIFIED IDEOGRAPH
+ {0xC5BA, 0x85D5}, //11636 #CJK UNIFIED IDEOGRAPH
+ {0xC5BB, 0x5455}, //11637 #CJK UNIFIED IDEOGRAPH
+ {0xC5BC, 0x5076}, //11638 #CJK UNIFIED IDEOGRAPH
+ {0xC5BD, 0x6CA4}, //11639 #CJK UNIFIED IDEOGRAPH
+ {0xC5BE, 0x556A}, //11640 #CJK UNIFIED IDEOGRAPH
+ {0xC5BF, 0x8DB4}, //11641 #CJK UNIFIED IDEOGRAPH
+ {0xC5C0, 0x722C}, //11642 #CJK UNIFIED IDEOGRAPH
+ {0xC5C1, 0x5E15}, //11643 #CJK UNIFIED IDEOGRAPH
+ {0xC5C2, 0x6015}, //11644 #CJK UNIFIED IDEOGRAPH
+ {0xC5C3, 0x7436}, //11645 #CJK UNIFIED IDEOGRAPH
+ {0xC5C4, 0x62CD}, //11646 #CJK UNIFIED IDEOGRAPH
+ {0xC5C5, 0x6392}, //11647 #CJK UNIFIED IDEOGRAPH
+ {0xC5C6, 0x724C}, //11648 #CJK UNIFIED IDEOGRAPH
+ {0xC5C7, 0x5F98}, //11649 #CJK UNIFIED IDEOGRAPH
+ {0xC5C8, 0x6E43}, //11650 #CJK UNIFIED IDEOGRAPH
+ {0xC5C9, 0x6D3E}, //11651 #CJK UNIFIED IDEOGRAPH
+ {0xC5CA, 0x6500}, //11652 #CJK UNIFIED IDEOGRAPH
+ {0xC5CB, 0x6F58}, //11653 #CJK UNIFIED IDEOGRAPH
+ {0xC5CC, 0x76D8}, //11654 #CJK UNIFIED IDEOGRAPH
+ {0xC5CD, 0x78D0}, //11655 #CJK UNIFIED IDEOGRAPH
+ {0xC5CE, 0x76FC}, //11656 #CJK UNIFIED IDEOGRAPH
+ {0xC5CF, 0x7554}, //11657 #CJK UNIFIED IDEOGRAPH
+ {0xC5D0, 0x5224}, //11658 #CJK UNIFIED IDEOGRAPH
+ {0xC5D1, 0x53DB}, //11659 #CJK UNIFIED IDEOGRAPH
+ {0xC5D2, 0x4E53}, //11660 #CJK UNIFIED IDEOGRAPH
+ {0xC5D3, 0x5E9E}, //11661 #CJK UNIFIED IDEOGRAPH
+ {0xC5D4, 0x65C1}, //11662 #CJK UNIFIED IDEOGRAPH
+ {0xC5D5, 0x802A}, //11663 #CJK UNIFIED IDEOGRAPH
+ {0xC5D6, 0x80D6}, //11664 #CJK UNIFIED IDEOGRAPH
+ {0xC5D7, 0x629B}, //11665 #CJK UNIFIED IDEOGRAPH
+ {0xC5D8, 0x5486}, //11666 #CJK UNIFIED IDEOGRAPH
+ {0xC5D9, 0x5228}, //11667 #CJK UNIFIED IDEOGRAPH
+ {0xC5DA, 0x70AE}, //11668 #CJK UNIFIED IDEOGRAPH
+ {0xC5DB, 0x888D}, //11669 #CJK UNIFIED IDEOGRAPH
+ {0xC5DC, 0x8DD1}, //11670 #CJK UNIFIED IDEOGRAPH
+ {0xC5DD, 0x6CE1}, //11671 #CJK UNIFIED IDEOGRAPH
+ {0xC5DE, 0x5478}, //11672 #CJK UNIFIED IDEOGRAPH
+ {0xC5DF, 0x80DA}, //11673 #CJK UNIFIED IDEOGRAPH
+ {0xC5E0, 0x57F9}, //11674 #CJK UNIFIED IDEOGRAPH
+ {0xC5E1, 0x88F4}, //11675 #CJK UNIFIED IDEOGRAPH
+ {0xC5E2, 0x8D54}, //11676 #CJK UNIFIED IDEOGRAPH
+ {0xC5E3, 0x966A}, //11677 #CJK UNIFIED IDEOGRAPH
+ {0xC5E4, 0x914D}, //11678 #CJK UNIFIED IDEOGRAPH
+ {0xC5E5, 0x4F69}, //11679 #CJK UNIFIED IDEOGRAPH
+ {0xC5E6, 0x6C9B}, //11680 #CJK UNIFIED IDEOGRAPH
+ {0xC5E7, 0x55B7}, //11681 #CJK UNIFIED IDEOGRAPH
+ {0xC5E8, 0x76C6}, //11682 #CJK UNIFIED IDEOGRAPH
+ {0xC5E9, 0x7830}, //11683 #CJK UNIFIED IDEOGRAPH
+ {0xC5EA, 0x62A8}, //11684 #CJK UNIFIED IDEOGRAPH
+ {0xC5EB, 0x70F9}, //11685 #CJK UNIFIED IDEOGRAPH
+ {0xC5EC, 0x6F8E}, //11686 #CJK UNIFIED IDEOGRAPH
+ {0xC5ED, 0x5F6D}, //11687 #CJK UNIFIED IDEOGRAPH
+ {0xC5EE, 0x84EC}, //11688 #CJK UNIFIED IDEOGRAPH
+ {0xC5EF, 0x68DA}, //11689 #CJK UNIFIED IDEOGRAPH
+ {0xC5F0, 0x787C}, //11690 #CJK UNIFIED IDEOGRAPH
+ {0xC5F1, 0x7BF7}, //11691 #CJK UNIFIED IDEOGRAPH
+ {0xC5F2, 0x81A8}, //11692 #CJK UNIFIED IDEOGRAPH
+ {0xC5F3, 0x670B}, //11693 #CJK UNIFIED IDEOGRAPH
+ {0xC5F4, 0x9E4F}, //11694 #CJK UNIFIED IDEOGRAPH
+ {0xC5F5, 0x6367}, //11695 #CJK UNIFIED IDEOGRAPH
+ {0xC5F6, 0x78B0}, //11696 #CJK UNIFIED IDEOGRAPH
+ {0xC5F7, 0x576F}, //11697 #CJK UNIFIED IDEOGRAPH
+ {0xC5F8, 0x7812}, //11698 #CJK UNIFIED IDEOGRAPH
+ {0xC5F9, 0x9739}, //11699 #CJK UNIFIED IDEOGRAPH
+ {0xC5FA, 0x6279}, //11700 #CJK UNIFIED IDEOGRAPH
+ {0xC5FB, 0x62AB}, //11701 #CJK UNIFIED IDEOGRAPH
+ {0xC5FC, 0x5288}, //11702 #CJK UNIFIED IDEOGRAPH
+ {0xC5FD, 0x7435}, //11703 #CJK UNIFIED IDEOGRAPH
+ {0xC5FE, 0x6BD7}, //11704 #CJK UNIFIED IDEOGRAPH
+ {0xC640, 0x826A}, //11705 #CJK UNIFIED IDEOGRAPH
+ {0xC641, 0x826B}, //11706 #CJK UNIFIED IDEOGRAPH
+ {0xC642, 0x826C}, //11707 #CJK UNIFIED IDEOGRAPH
+ {0xC643, 0x826D}, //11708 #CJK UNIFIED IDEOGRAPH
+ {0xC644, 0x8271}, //11709 #CJK UNIFIED IDEOGRAPH
+ {0xC645, 0x8275}, //11710 #CJK UNIFIED IDEOGRAPH
+ {0xC646, 0x8276}, //11711 #CJK UNIFIED IDEOGRAPH
+ {0xC647, 0x8277}, //11712 #CJK UNIFIED IDEOGRAPH
+ {0xC648, 0x8278}, //11713 #CJK UNIFIED IDEOGRAPH
+ {0xC649, 0x827B}, //11714 #CJK UNIFIED IDEOGRAPH
+ {0xC64A, 0x827C}, //11715 #CJK UNIFIED IDEOGRAPH
+ {0xC64B, 0x8280}, //11716 #CJK UNIFIED IDEOGRAPH
+ {0xC64C, 0x8281}, //11717 #CJK UNIFIED IDEOGRAPH
+ {0xC64D, 0x8283}, //11718 #CJK UNIFIED IDEOGRAPH
+ {0xC64E, 0x8285}, //11719 #CJK UNIFIED IDEOGRAPH
+ {0xC64F, 0x8286}, //11720 #CJK UNIFIED IDEOGRAPH
+ {0xC650, 0x8287}, //11721 #CJK UNIFIED IDEOGRAPH
+ {0xC651, 0x8289}, //11722 #CJK UNIFIED IDEOGRAPH
+ {0xC652, 0x828C}, //11723 #CJK UNIFIED IDEOGRAPH
+ {0xC653, 0x8290}, //11724 #CJK UNIFIED IDEOGRAPH
+ {0xC654, 0x8293}, //11725 #CJK UNIFIED IDEOGRAPH
+ {0xC655, 0x8294}, //11726 #CJK UNIFIED IDEOGRAPH
+ {0xC656, 0x8295}, //11727 #CJK UNIFIED IDEOGRAPH
+ {0xC657, 0x8296}, //11728 #CJK UNIFIED IDEOGRAPH
+ {0xC658, 0x829A}, //11729 #CJK UNIFIED IDEOGRAPH
+ {0xC659, 0x829B}, //11730 #CJK UNIFIED IDEOGRAPH
+ {0xC65A, 0x829E}, //11731 #CJK UNIFIED IDEOGRAPH
+ {0xC65B, 0x82A0}, //11732 #CJK UNIFIED IDEOGRAPH
+ {0xC65C, 0x82A2}, //11733 #CJK UNIFIED IDEOGRAPH
+ {0xC65D, 0x82A3}, //11734 #CJK UNIFIED IDEOGRAPH
+ {0xC65E, 0x82A7}, //11735 #CJK UNIFIED IDEOGRAPH
+ {0xC65F, 0x82B2}, //11736 #CJK UNIFIED IDEOGRAPH
+ {0xC660, 0x82B5}, //11737 #CJK UNIFIED IDEOGRAPH
+ {0xC661, 0x82B6}, //11738 #CJK UNIFIED IDEOGRAPH
+ {0xC662, 0x82BA}, //11739 #CJK UNIFIED IDEOGRAPH
+ {0xC663, 0x82BB}, //11740 #CJK UNIFIED IDEOGRAPH
+ {0xC664, 0x82BC}, //11741 #CJK UNIFIED IDEOGRAPH
+ {0xC665, 0x82BF}, //11742 #CJK UNIFIED IDEOGRAPH
+ {0xC666, 0x82C0}, //11743 #CJK UNIFIED IDEOGRAPH
+ {0xC667, 0x82C2}, //11744 #CJK UNIFIED IDEOGRAPH
+ {0xC668, 0x82C3}, //11745 #CJK UNIFIED IDEOGRAPH
+ {0xC669, 0x82C5}, //11746 #CJK UNIFIED IDEOGRAPH
+ {0xC66A, 0x82C6}, //11747 #CJK UNIFIED IDEOGRAPH
+ {0xC66B, 0x82C9}, //11748 #CJK UNIFIED IDEOGRAPH
+ {0xC66C, 0x82D0}, //11749 #CJK UNIFIED IDEOGRAPH
+ {0xC66D, 0x82D6}, //11750 #CJK UNIFIED IDEOGRAPH
+ {0xC66E, 0x82D9}, //11751 #CJK UNIFIED IDEOGRAPH
+ {0xC66F, 0x82DA}, //11752 #CJK UNIFIED IDEOGRAPH
+ {0xC670, 0x82DD}, //11753 #CJK UNIFIED IDEOGRAPH
+ {0xC671, 0x82E2}, //11754 #CJK UNIFIED IDEOGRAPH
+ {0xC672, 0x82E7}, //11755 #CJK UNIFIED IDEOGRAPH
+ {0xC673, 0x82E8}, //11756 #CJK UNIFIED IDEOGRAPH
+ {0xC674, 0x82E9}, //11757 #CJK UNIFIED IDEOGRAPH
+ {0xC675, 0x82EA}, //11758 #CJK UNIFIED IDEOGRAPH
+ {0xC676, 0x82EC}, //11759 #CJK UNIFIED IDEOGRAPH
+ {0xC677, 0x82ED}, //11760 #CJK UNIFIED IDEOGRAPH
+ {0xC678, 0x82EE}, //11761 #CJK UNIFIED IDEOGRAPH
+ {0xC679, 0x82F0}, //11762 #CJK UNIFIED IDEOGRAPH
+ {0xC67A, 0x82F2}, //11763 #CJK UNIFIED IDEOGRAPH
+ {0xC67B, 0x82F3}, //11764 #CJK UNIFIED IDEOGRAPH
+ {0xC67C, 0x82F5}, //11765 #CJK UNIFIED IDEOGRAPH
+ {0xC67D, 0x82F6}, //11766 #CJK UNIFIED IDEOGRAPH
+ {0xC67E, 0x82F8}, //11767 #CJK UNIFIED IDEOGRAPH
+ {0xC680, 0x82FA}, //11768 #CJK UNIFIED IDEOGRAPH
+ {0xC681, 0x82FC}, //11769 #CJK UNIFIED IDEOGRAPH
+ {0xC682, 0x82FD}, //11770 #CJK UNIFIED IDEOGRAPH
+ {0xC683, 0x82FE}, //11771 #CJK UNIFIED IDEOGRAPH
+ {0xC684, 0x82FF}, //11772 #CJK UNIFIED IDEOGRAPH
+ {0xC685, 0x8300}, //11773 #CJK UNIFIED IDEOGRAPH
+ {0xC686, 0x830A}, //11774 #CJK UNIFIED IDEOGRAPH
+ {0xC687, 0x830B}, //11775 #CJK UNIFIED IDEOGRAPH
+ {0xC688, 0x830D}, //11776 #CJK UNIFIED IDEOGRAPH
+ {0xC689, 0x8310}, //11777 #CJK UNIFIED IDEOGRAPH
+ {0xC68A, 0x8312}, //11778 #CJK UNIFIED IDEOGRAPH
+ {0xC68B, 0x8313}, //11779 #CJK UNIFIED IDEOGRAPH
+ {0xC68C, 0x8316}, //11780 #CJK UNIFIED IDEOGRAPH
+ {0xC68D, 0x8318}, //11781 #CJK UNIFIED IDEOGRAPH
+ {0xC68E, 0x8319}, //11782 #CJK UNIFIED IDEOGRAPH
+ {0xC68F, 0x831D}, //11783 #CJK UNIFIED IDEOGRAPH
+ {0xC690, 0x831E}, //11784 #CJK UNIFIED IDEOGRAPH
+ {0xC691, 0x831F}, //11785 #CJK UNIFIED IDEOGRAPH
+ {0xC692, 0x8320}, //11786 #CJK UNIFIED IDEOGRAPH
+ {0xC693, 0x8321}, //11787 #CJK UNIFIED IDEOGRAPH
+ {0xC694, 0x8322}, //11788 #CJK UNIFIED IDEOGRAPH
+ {0xC695, 0x8323}, //11789 #CJK UNIFIED IDEOGRAPH
+ {0xC696, 0x8324}, //11790 #CJK UNIFIED IDEOGRAPH
+ {0xC697, 0x8325}, //11791 #CJK UNIFIED IDEOGRAPH
+ {0xC698, 0x8326}, //11792 #CJK UNIFIED IDEOGRAPH
+ {0xC699, 0x8329}, //11793 #CJK UNIFIED IDEOGRAPH
+ {0xC69A, 0x832A}, //11794 #CJK UNIFIED IDEOGRAPH
+ {0xC69B, 0x832E}, //11795 #CJK UNIFIED IDEOGRAPH
+ {0xC69C, 0x8330}, //11796 #CJK UNIFIED IDEOGRAPH
+ {0xC69D, 0x8332}, //11797 #CJK UNIFIED IDEOGRAPH
+ {0xC69E, 0x8337}, //11798 #CJK UNIFIED IDEOGRAPH
+ {0xC69F, 0x833B}, //11799 #CJK UNIFIED IDEOGRAPH
+ {0xC6A0, 0x833D}, //11800 #CJK UNIFIED IDEOGRAPH
+ {0xC6A1, 0x5564}, //11801 #CJK UNIFIED IDEOGRAPH
+ {0xC6A2, 0x813E}, //11802 #CJK UNIFIED IDEOGRAPH
+ {0xC6A3, 0x75B2}, //11803 #CJK UNIFIED IDEOGRAPH
+ {0xC6A4, 0x76AE}, //11804 #CJK UNIFIED IDEOGRAPH
+ {0xC6A5, 0x5339}, //11805 #CJK UNIFIED IDEOGRAPH
+ {0xC6A6, 0x75DE}, //11806 #CJK UNIFIED IDEOGRAPH
+ {0xC6A7, 0x50FB}, //11807 #CJK UNIFIED IDEOGRAPH
+ {0xC6A8, 0x5C41}, //11808 #CJK UNIFIED IDEOGRAPH
+ {0xC6A9, 0x8B6C}, //11809 #CJK UNIFIED IDEOGRAPH
+ {0xC6AA, 0x7BC7}, //11810 #CJK UNIFIED IDEOGRAPH
+ {0xC6AB, 0x504F}, //11811 #CJK UNIFIED IDEOGRAPH
+ {0xC6AC, 0x7247}, //11812 #CJK UNIFIED IDEOGRAPH
+ {0xC6AD, 0x9A97}, //11813 #CJK UNIFIED IDEOGRAPH
+ {0xC6AE, 0x98D8}, //11814 #CJK UNIFIED IDEOGRAPH
+ {0xC6AF, 0x6F02}, //11815 #CJK UNIFIED IDEOGRAPH
+ {0xC6B0, 0x74E2}, //11816 #CJK UNIFIED IDEOGRAPH
+ {0xC6B1, 0x7968}, //11817 #CJK UNIFIED IDEOGRAPH
+ {0xC6B2, 0x6487}, //11818 #CJK UNIFIED IDEOGRAPH
+ {0xC6B3, 0x77A5}, //11819 #CJK UNIFIED IDEOGRAPH
+ {0xC6B4, 0x62FC}, //11820 #CJK UNIFIED IDEOGRAPH
+ {0xC6B5, 0x9891}, //11821 #CJK UNIFIED IDEOGRAPH
+ {0xC6B6, 0x8D2B}, //11822 #CJK UNIFIED IDEOGRAPH
+ {0xC6B7, 0x54C1}, //11823 #CJK UNIFIED IDEOGRAPH
+ {0xC6B8, 0x8058}, //11824 #CJK UNIFIED IDEOGRAPH
+ {0xC6B9, 0x4E52}, //11825 #CJK UNIFIED IDEOGRAPH
+ {0xC6BA, 0x576A}, //11826 #CJK UNIFIED IDEOGRAPH
+ {0xC6BB, 0x82F9}, //11827 #CJK UNIFIED IDEOGRAPH
+ {0xC6BC, 0x840D}, //11828 #CJK UNIFIED IDEOGRAPH
+ {0xC6BD, 0x5E73}, //11829 #CJK UNIFIED IDEOGRAPH
+ {0xC6BE, 0x51ED}, //11830 #CJK UNIFIED IDEOGRAPH
+ {0xC6BF, 0x74F6}, //11831 #CJK UNIFIED IDEOGRAPH
+ {0xC6C0, 0x8BC4}, //11832 #CJK UNIFIED IDEOGRAPH
+ {0xC6C1, 0x5C4F}, //11833 #CJK UNIFIED IDEOGRAPH
+ {0xC6C2, 0x5761}, //11834 #CJK UNIFIED IDEOGRAPH
+ {0xC6C3, 0x6CFC}, //11835 #CJK UNIFIED IDEOGRAPH
+ {0xC6C4, 0x9887}, //11836 #CJK UNIFIED IDEOGRAPH
+ {0xC6C5, 0x5A46}, //11837 #CJK UNIFIED IDEOGRAPH
+ {0xC6C6, 0x7834}, //11838 #CJK UNIFIED IDEOGRAPH
+ {0xC6C7, 0x9B44}, //11839 #CJK UNIFIED IDEOGRAPH
+ {0xC6C8, 0x8FEB}, //11840 #CJK UNIFIED IDEOGRAPH
+ {0xC6C9, 0x7C95}, //11841 #CJK UNIFIED IDEOGRAPH
+ {0xC6CA, 0x5256}, //11842 #CJK UNIFIED IDEOGRAPH
+ {0xC6CB, 0x6251}, //11843 #CJK UNIFIED IDEOGRAPH
+ {0xC6CC, 0x94FA}, //11844 #CJK UNIFIED IDEOGRAPH
+ {0xC6CD, 0x4EC6}, //11845 #CJK UNIFIED IDEOGRAPH
+ {0xC6CE, 0x8386}, //11846 #CJK UNIFIED IDEOGRAPH
+ {0xC6CF, 0x8461}, //11847 #CJK UNIFIED IDEOGRAPH
+ {0xC6D0, 0x83E9}, //11848 #CJK UNIFIED IDEOGRAPH
+ {0xC6D1, 0x84B2}, //11849 #CJK UNIFIED IDEOGRAPH
+ {0xC6D2, 0x57D4}, //11850 #CJK UNIFIED IDEOGRAPH
+ {0xC6D3, 0x6734}, //11851 #CJK UNIFIED IDEOGRAPH
+ {0xC6D4, 0x5703}, //11852 #CJK UNIFIED IDEOGRAPH
+ {0xC6D5, 0x666E}, //11853 #CJK UNIFIED IDEOGRAPH
+ {0xC6D6, 0x6D66}, //11854 #CJK UNIFIED IDEOGRAPH
+ {0xC6D7, 0x8C31}, //11855 #CJK UNIFIED IDEOGRAPH
+ {0xC6D8, 0x66DD}, //11856 #CJK UNIFIED IDEOGRAPH
+ {0xC6D9, 0x7011}, //11857 #CJK UNIFIED IDEOGRAPH
+ {0xC6DA, 0x671F}, //11858 #CJK UNIFIED IDEOGRAPH
+ {0xC6DB, 0x6B3A}, //11859 #CJK UNIFIED IDEOGRAPH
+ {0xC6DC, 0x6816}, //11860 #CJK UNIFIED IDEOGRAPH
+ {0xC6DD, 0x621A}, //11861 #CJK UNIFIED IDEOGRAPH
+ {0xC6DE, 0x59BB}, //11862 #CJK UNIFIED IDEOGRAPH
+ {0xC6DF, 0x4E03}, //11863 #CJK UNIFIED IDEOGRAPH
+ {0xC6E0, 0x51C4}, //11864 #CJK UNIFIED IDEOGRAPH
+ {0xC6E1, 0x6F06}, //11865 #CJK UNIFIED IDEOGRAPH
+ {0xC6E2, 0x67D2}, //11866 #CJK UNIFIED IDEOGRAPH
+ {0xC6E3, 0x6C8F}, //11867 #CJK UNIFIED IDEOGRAPH
+ {0xC6E4, 0x5176}, //11868 #CJK UNIFIED IDEOGRAPH
+ {0xC6E5, 0x68CB}, //11869 #CJK UNIFIED IDEOGRAPH
+ {0xC6E6, 0x5947}, //11870 #CJK UNIFIED IDEOGRAPH
+ {0xC6E7, 0x6B67}, //11871 #CJK UNIFIED IDEOGRAPH
+ {0xC6E8, 0x7566}, //11872 #CJK UNIFIED IDEOGRAPH
+ {0xC6E9, 0x5D0E}, //11873 #CJK UNIFIED IDEOGRAPH
+ {0xC6EA, 0x8110}, //11874 #CJK UNIFIED IDEOGRAPH
+ {0xC6EB, 0x9F50}, //11875 #CJK UNIFIED IDEOGRAPH
+ {0xC6EC, 0x65D7}, //11876 #CJK UNIFIED IDEOGRAPH
+ {0xC6ED, 0x7948}, //11877 #CJK UNIFIED IDEOGRAPH
+ {0xC6EE, 0x7941}, //11878 #CJK UNIFIED IDEOGRAPH
+ {0xC6EF, 0x9A91}, //11879 #CJK UNIFIED IDEOGRAPH
+ {0xC6F0, 0x8D77}, //11880 #CJK UNIFIED IDEOGRAPH
+ {0xC6F1, 0x5C82}, //11881 #CJK UNIFIED IDEOGRAPH
+ {0xC6F2, 0x4E5E}, //11882 #CJK UNIFIED IDEOGRAPH
+ {0xC6F3, 0x4F01}, //11883 #CJK UNIFIED IDEOGRAPH
+ {0xC6F4, 0x542F}, //11884 #CJK UNIFIED IDEOGRAPH
+ {0xC6F5, 0x5951}, //11885 #CJK UNIFIED IDEOGRAPH
+ {0xC6F6, 0x780C}, //11886 #CJK UNIFIED IDEOGRAPH
+ {0xC6F7, 0x5668}, //11887 #CJK UNIFIED IDEOGRAPH
+ {0xC6F8, 0x6C14}, //11888 #CJK UNIFIED IDEOGRAPH
+ {0xC6F9, 0x8FC4}, //11889 #CJK UNIFIED IDEOGRAPH
+ {0xC6FA, 0x5F03}, //11890 #CJK UNIFIED IDEOGRAPH
+ {0xC6FB, 0x6C7D}, //11891 #CJK UNIFIED IDEOGRAPH
+ {0xC6FC, 0x6CE3}, //11892 #CJK UNIFIED IDEOGRAPH
+ {0xC6FD, 0x8BAB}, //11893 #CJK UNIFIED IDEOGRAPH
+ {0xC6FE, 0x6390}, //11894 #CJK UNIFIED IDEOGRAPH
+ {0xC740, 0x833E}, //11895 #CJK UNIFIED IDEOGRAPH
+ {0xC741, 0x833F}, //11896 #CJK UNIFIED IDEOGRAPH
+ {0xC742, 0x8341}, //11897 #CJK UNIFIED IDEOGRAPH
+ {0xC743, 0x8342}, //11898 #CJK UNIFIED IDEOGRAPH
+ {0xC744, 0x8344}, //11899 #CJK UNIFIED IDEOGRAPH
+ {0xC745, 0x8345}, //11900 #CJK UNIFIED IDEOGRAPH
+ {0xC746, 0x8348}, //11901 #CJK UNIFIED IDEOGRAPH
+ {0xC747, 0x834A}, //11902 #CJK UNIFIED IDEOGRAPH
+ {0xC748, 0x834B}, //11903 #CJK UNIFIED IDEOGRAPH
+ {0xC749, 0x834C}, //11904 #CJK UNIFIED IDEOGRAPH
+ {0xC74A, 0x834D}, //11905 #CJK UNIFIED IDEOGRAPH
+ {0xC74B, 0x834E}, //11906 #CJK UNIFIED IDEOGRAPH
+ {0xC74C, 0x8353}, //11907 #CJK UNIFIED IDEOGRAPH
+ {0xC74D, 0x8355}, //11908 #CJK UNIFIED IDEOGRAPH
+ {0xC74E, 0x8356}, //11909 #CJK UNIFIED IDEOGRAPH
+ {0xC74F, 0x8357}, //11910 #CJK UNIFIED IDEOGRAPH
+ {0xC750, 0x8358}, //11911 #CJK UNIFIED IDEOGRAPH
+ {0xC751, 0x8359}, //11912 #CJK UNIFIED IDEOGRAPH
+ {0xC752, 0x835D}, //11913 #CJK UNIFIED IDEOGRAPH
+ {0xC753, 0x8362}, //11914 #CJK UNIFIED IDEOGRAPH
+ {0xC754, 0x8370}, //11915 #CJK UNIFIED IDEOGRAPH
+ {0xC755, 0x8371}, //11916 #CJK UNIFIED IDEOGRAPH
+ {0xC756, 0x8372}, //11917 #CJK UNIFIED IDEOGRAPH
+ {0xC757, 0x8373}, //11918 #CJK UNIFIED IDEOGRAPH
+ {0xC758, 0x8374}, //11919 #CJK UNIFIED IDEOGRAPH
+ {0xC759, 0x8375}, //11920 #CJK UNIFIED IDEOGRAPH
+ {0xC75A, 0x8376}, //11921 #CJK UNIFIED IDEOGRAPH
+ {0xC75B, 0x8379}, //11922 #CJK UNIFIED IDEOGRAPH
+ {0xC75C, 0x837A}, //11923 #CJK UNIFIED IDEOGRAPH
+ {0xC75D, 0x837E}, //11924 #CJK UNIFIED IDEOGRAPH
+ {0xC75E, 0x837F}, //11925 #CJK UNIFIED IDEOGRAPH
+ {0xC75F, 0x8380}, //11926 #CJK UNIFIED IDEOGRAPH
+ {0xC760, 0x8381}, //11927 #CJK UNIFIED IDEOGRAPH
+ {0xC761, 0x8382}, //11928 #CJK UNIFIED IDEOGRAPH
+ {0xC762, 0x8383}, //11929 #CJK UNIFIED IDEOGRAPH
+ {0xC763, 0x8384}, //11930 #CJK UNIFIED IDEOGRAPH
+ {0xC764, 0x8387}, //11931 #CJK UNIFIED IDEOGRAPH
+ {0xC765, 0x8388}, //11932 #CJK UNIFIED IDEOGRAPH
+ {0xC766, 0x838A}, //11933 #CJK UNIFIED IDEOGRAPH
+ {0xC767, 0x838B}, //11934 #CJK UNIFIED IDEOGRAPH
+ {0xC768, 0x838C}, //11935 #CJK UNIFIED IDEOGRAPH
+ {0xC769, 0x838D}, //11936 #CJK UNIFIED IDEOGRAPH
+ {0xC76A, 0x838F}, //11937 #CJK UNIFIED IDEOGRAPH
+ {0xC76B, 0x8390}, //11938 #CJK UNIFIED IDEOGRAPH
+ {0xC76C, 0x8391}, //11939 #CJK UNIFIED IDEOGRAPH
+ {0xC76D, 0x8394}, //11940 #CJK UNIFIED IDEOGRAPH
+ {0xC76E, 0x8395}, //11941 #CJK UNIFIED IDEOGRAPH
+ {0xC76F, 0x8396}, //11942 #CJK UNIFIED IDEOGRAPH
+ {0xC770, 0x8397}, //11943 #CJK UNIFIED IDEOGRAPH
+ {0xC771, 0x8399}, //11944 #CJK UNIFIED IDEOGRAPH
+ {0xC772, 0x839A}, //11945 #CJK UNIFIED IDEOGRAPH
+ {0xC773, 0x839D}, //11946 #CJK UNIFIED IDEOGRAPH
+ {0xC774, 0x839F}, //11947 #CJK UNIFIED IDEOGRAPH
+ {0xC775, 0x83A1}, //11948 #CJK UNIFIED IDEOGRAPH
+ {0xC776, 0x83A2}, //11949 #CJK UNIFIED IDEOGRAPH
+ {0xC777, 0x83A3}, //11950 #CJK UNIFIED IDEOGRAPH
+ {0xC778, 0x83A4}, //11951 #CJK UNIFIED IDEOGRAPH
+ {0xC779, 0x83A5}, //11952 #CJK UNIFIED IDEOGRAPH
+ {0xC77A, 0x83A6}, //11953 #CJK UNIFIED IDEOGRAPH
+ {0xC77B, 0x83A7}, //11954 #CJK UNIFIED IDEOGRAPH
+ {0xC77C, 0x83AC}, //11955 #CJK UNIFIED IDEOGRAPH
+ {0xC77D, 0x83AD}, //11956 #CJK UNIFIED IDEOGRAPH
+ {0xC77E, 0x83AE}, //11957 #CJK UNIFIED IDEOGRAPH
+ {0xC780, 0x83AF}, //11958 #CJK UNIFIED IDEOGRAPH
+ {0xC781, 0x83B5}, //11959 #CJK UNIFIED IDEOGRAPH
+ {0xC782, 0x83BB}, //11960 #CJK UNIFIED IDEOGRAPH
+ {0xC783, 0x83BE}, //11961 #CJK UNIFIED IDEOGRAPH
+ {0xC784, 0x83BF}, //11962 #CJK UNIFIED IDEOGRAPH
+ {0xC785, 0x83C2}, //11963 #CJK UNIFIED IDEOGRAPH
+ {0xC786, 0x83C3}, //11964 #CJK UNIFIED IDEOGRAPH
+ {0xC787, 0x83C4}, //11965 #CJK UNIFIED IDEOGRAPH
+ {0xC788, 0x83C6}, //11966 #CJK UNIFIED IDEOGRAPH
+ {0xC789, 0x83C8}, //11967 #CJK UNIFIED IDEOGRAPH
+ {0xC78A, 0x83C9}, //11968 #CJK UNIFIED IDEOGRAPH
+ {0xC78B, 0x83CB}, //11969 #CJK UNIFIED IDEOGRAPH
+ {0xC78C, 0x83CD}, //11970 #CJK UNIFIED IDEOGRAPH
+ {0xC78D, 0x83CE}, //11971 #CJK UNIFIED IDEOGRAPH
+ {0xC78E, 0x83D0}, //11972 #CJK UNIFIED IDEOGRAPH
+ {0xC78F, 0x83D1}, //11973 #CJK UNIFIED IDEOGRAPH
+ {0xC790, 0x83D2}, //11974 #CJK UNIFIED IDEOGRAPH
+ {0xC791, 0x83D3}, //11975 #CJK UNIFIED IDEOGRAPH
+ {0xC792, 0x83D5}, //11976 #CJK UNIFIED IDEOGRAPH
+ {0xC793, 0x83D7}, //11977 #CJK UNIFIED IDEOGRAPH
+ {0xC794, 0x83D9}, //11978 #CJK UNIFIED IDEOGRAPH
+ {0xC795, 0x83DA}, //11979 #CJK UNIFIED IDEOGRAPH
+ {0xC796, 0x83DB}, //11980 #CJK UNIFIED IDEOGRAPH
+ {0xC797, 0x83DE}, //11981 #CJK UNIFIED IDEOGRAPH
+ {0xC798, 0x83E2}, //11982 #CJK UNIFIED IDEOGRAPH
+ {0xC799, 0x83E3}, //11983 #CJK UNIFIED IDEOGRAPH
+ {0xC79A, 0x83E4}, //11984 #CJK UNIFIED IDEOGRAPH
+ {0xC79B, 0x83E6}, //11985 #CJK UNIFIED IDEOGRAPH
+ {0xC79C, 0x83E7}, //11986 #CJK UNIFIED IDEOGRAPH
+ {0xC79D, 0x83E8}, //11987 #CJK UNIFIED IDEOGRAPH
+ {0xC79E, 0x83EB}, //11988 #CJK UNIFIED IDEOGRAPH
+ {0xC79F, 0x83EC}, //11989 #CJK UNIFIED IDEOGRAPH
+ {0xC7A0, 0x83ED}, //11990 #CJK UNIFIED IDEOGRAPH
+ {0xC7A1, 0x6070}, //11991 #CJK UNIFIED IDEOGRAPH
+ {0xC7A2, 0x6D3D}, //11992 #CJK UNIFIED IDEOGRAPH
+ {0xC7A3, 0x7275}, //11993 #CJK UNIFIED IDEOGRAPH
+ {0xC7A4, 0x6266}, //11994 #CJK UNIFIED IDEOGRAPH
+ {0xC7A5, 0x948E}, //11995 #CJK UNIFIED IDEOGRAPH
+ {0xC7A6, 0x94C5}, //11996 #CJK UNIFIED IDEOGRAPH
+ {0xC7A7, 0x5343}, //11997 #CJK UNIFIED IDEOGRAPH
+ {0xC7A8, 0x8FC1}, //11998 #CJK UNIFIED IDEOGRAPH
+ {0xC7A9, 0x7B7E}, //11999 #CJK UNIFIED IDEOGRAPH
+ {0xC7AA, 0x4EDF}, //12000 #CJK UNIFIED IDEOGRAPH
+ {0xC7AB, 0x8C26}, //12001 #CJK UNIFIED IDEOGRAPH
+ {0xC7AC, 0x4E7E}, //12002 #CJK UNIFIED IDEOGRAPH
+ {0xC7AD, 0x9ED4}, //12003 #CJK UNIFIED IDEOGRAPH
+ {0xC7AE, 0x94B1}, //12004 #CJK UNIFIED IDEOGRAPH
+ {0xC7AF, 0x94B3}, //12005 #CJK UNIFIED IDEOGRAPH
+ {0xC7B0, 0x524D}, //12006 #CJK UNIFIED IDEOGRAPH
+ {0xC7B1, 0x6F5C}, //12007 #CJK UNIFIED IDEOGRAPH
+ {0xC7B2, 0x9063}, //12008 #CJK UNIFIED IDEOGRAPH
+ {0xC7B3, 0x6D45}, //12009 #CJK UNIFIED IDEOGRAPH
+ {0xC7B4, 0x8C34}, //12010 #CJK UNIFIED IDEOGRAPH
+ {0xC7B5, 0x5811}, //12011 #CJK UNIFIED IDEOGRAPH
+ {0xC7B6, 0x5D4C}, //12012 #CJK UNIFIED IDEOGRAPH
+ {0xC7B7, 0x6B20}, //12013 #CJK UNIFIED IDEOGRAPH
+ {0xC7B8, 0x6B49}, //12014 #CJK UNIFIED IDEOGRAPH
+ {0xC7B9, 0x67AA}, //12015 #CJK UNIFIED IDEOGRAPH
+ {0xC7BA, 0x545B}, //12016 #CJK UNIFIED IDEOGRAPH
+ {0xC7BB, 0x8154}, //12017 #CJK UNIFIED IDEOGRAPH
+ {0xC7BC, 0x7F8C}, //12018 #CJK UNIFIED IDEOGRAPH
+ {0xC7BD, 0x5899}, //12019 #CJK UNIFIED IDEOGRAPH
+ {0xC7BE, 0x8537}, //12020 #CJK UNIFIED IDEOGRAPH
+ {0xC7BF, 0x5F3A}, //12021 #CJK UNIFIED IDEOGRAPH
+ {0xC7C0, 0x62A2}, //12022 #CJK UNIFIED IDEOGRAPH
+ {0xC7C1, 0x6A47}, //12023 #CJK UNIFIED IDEOGRAPH
+ {0xC7C2, 0x9539}, //12024 #CJK UNIFIED IDEOGRAPH
+ {0xC7C3, 0x6572}, //12025 #CJK UNIFIED IDEOGRAPH
+ {0xC7C4, 0x6084}, //12026 #CJK UNIFIED IDEOGRAPH
+ {0xC7C5, 0x6865}, //12027 #CJK UNIFIED IDEOGRAPH
+ {0xC7C6, 0x77A7}, //12028 #CJK UNIFIED IDEOGRAPH
+ {0xC7C7, 0x4E54}, //12029 #CJK UNIFIED IDEOGRAPH
+ {0xC7C8, 0x4FA8}, //12030 #CJK UNIFIED IDEOGRAPH
+ {0xC7C9, 0x5DE7}, //12031 #CJK UNIFIED IDEOGRAPH
+ {0xC7CA, 0x9798}, //12032 #CJK UNIFIED IDEOGRAPH
+ {0xC7CB, 0x64AC}, //12033 #CJK UNIFIED IDEOGRAPH
+ {0xC7CC, 0x7FD8}, //12034 #CJK UNIFIED IDEOGRAPH
+ {0xC7CD, 0x5CED}, //12035 #CJK UNIFIED IDEOGRAPH
+ {0xC7CE, 0x4FCF}, //12036 #CJK UNIFIED IDEOGRAPH
+ {0xC7CF, 0x7A8D}, //12037 #CJK UNIFIED IDEOGRAPH
+ {0xC7D0, 0x5207}, //12038 #CJK UNIFIED IDEOGRAPH
+ {0xC7D1, 0x8304}, //12039 #CJK UNIFIED IDEOGRAPH
+ {0xC7D2, 0x4E14}, //12040 #CJK UNIFIED IDEOGRAPH
+ {0xC7D3, 0x602F}, //12041 #CJK UNIFIED IDEOGRAPH
+ {0xC7D4, 0x7A83}, //12042 #CJK UNIFIED IDEOGRAPH
+ {0xC7D5, 0x94A6}, //12043 #CJK UNIFIED IDEOGRAPH
+ {0xC7D6, 0x4FB5}, //12044 #CJK UNIFIED IDEOGRAPH
+ {0xC7D7, 0x4EB2}, //12045 #CJK UNIFIED IDEOGRAPH
+ {0xC7D8, 0x79E6}, //12046 #CJK UNIFIED IDEOGRAPH
+ {0xC7D9, 0x7434}, //12047 #CJK UNIFIED IDEOGRAPH
+ {0xC7DA, 0x52E4}, //12048 #CJK UNIFIED IDEOGRAPH
+ {0xC7DB, 0x82B9}, //12049 #CJK UNIFIED IDEOGRAPH
+ {0xC7DC, 0x64D2}, //12050 #CJK UNIFIED IDEOGRAPH
+ {0xC7DD, 0x79BD}, //12051 #CJK UNIFIED IDEOGRAPH
+ {0xC7DE, 0x5BDD}, //12052 #CJK UNIFIED IDEOGRAPH
+ {0xC7DF, 0x6C81}, //12053 #CJK UNIFIED IDEOGRAPH
+ {0xC7E0, 0x9752}, //12054 #CJK UNIFIED IDEOGRAPH
+ {0xC7E1, 0x8F7B}, //12055 #CJK UNIFIED IDEOGRAPH
+ {0xC7E2, 0x6C22}, //12056 #CJK UNIFIED IDEOGRAPH
+ {0xC7E3, 0x503E}, //12057 #CJK UNIFIED IDEOGRAPH
+ {0xC7E4, 0x537F}, //12058 #CJK UNIFIED IDEOGRAPH
+ {0xC7E5, 0x6E05}, //12059 #CJK UNIFIED IDEOGRAPH
+ {0xC7E6, 0x64CE}, //12060 #CJK UNIFIED IDEOGRAPH
+ {0xC7E7, 0x6674}, //12061 #CJK UNIFIED IDEOGRAPH
+ {0xC7E8, 0x6C30}, //12062 #CJK UNIFIED IDEOGRAPH
+ {0xC7E9, 0x60C5}, //12063 #CJK UNIFIED IDEOGRAPH
+ {0xC7EA, 0x9877}, //12064 #CJK UNIFIED IDEOGRAPH
+ {0xC7EB, 0x8BF7}, //12065 #CJK UNIFIED IDEOGRAPH
+ {0xC7EC, 0x5E86}, //12066 #CJK UNIFIED IDEOGRAPH
+ {0xC7ED, 0x743C}, //12067 #CJK UNIFIED IDEOGRAPH
+ {0xC7EE, 0x7A77}, //12068 #CJK UNIFIED IDEOGRAPH
+ {0xC7EF, 0x79CB}, //12069 #CJK UNIFIED IDEOGRAPH
+ {0xC7F0, 0x4E18}, //12070 #CJK UNIFIED IDEOGRAPH
+ {0xC7F1, 0x90B1}, //12071 #CJK UNIFIED IDEOGRAPH
+ {0xC7F2, 0x7403}, //12072 #CJK UNIFIED IDEOGRAPH
+ {0xC7F3, 0x6C42}, //12073 #CJK UNIFIED IDEOGRAPH
+ {0xC7F4, 0x56DA}, //12074 #CJK UNIFIED IDEOGRAPH
+ {0xC7F5, 0x914B}, //12075 #CJK UNIFIED IDEOGRAPH
+ {0xC7F6, 0x6CC5}, //12076 #CJK UNIFIED IDEOGRAPH
+ {0xC7F7, 0x8D8B}, //12077 #CJK UNIFIED IDEOGRAPH
+ {0xC7F8, 0x533A}, //12078 #CJK UNIFIED IDEOGRAPH
+ {0xC7F9, 0x86C6}, //12079 #CJK UNIFIED IDEOGRAPH
+ {0xC7FA, 0x66F2}, //12080 #CJK UNIFIED IDEOGRAPH
+ {0xC7FB, 0x8EAF}, //12081 #CJK UNIFIED IDEOGRAPH
+ {0xC7FC, 0x5C48}, //12082 #CJK UNIFIED IDEOGRAPH
+ {0xC7FD, 0x9A71}, //12083 #CJK UNIFIED IDEOGRAPH
+ {0xC7FE, 0x6E20}, //12084 #CJK UNIFIED IDEOGRAPH
+ {0xC840, 0x83EE}, //12085 #CJK UNIFIED IDEOGRAPH
+ {0xC841, 0x83EF}, //12086 #CJK UNIFIED IDEOGRAPH
+ {0xC842, 0x83F3}, //12087 #CJK UNIFIED IDEOGRAPH
+ {0xC843, 0x83F4}, //12088 #CJK UNIFIED IDEOGRAPH
+ {0xC844, 0x83F5}, //12089 #CJK UNIFIED IDEOGRAPH
+ {0xC845, 0x83F6}, //12090 #CJK UNIFIED IDEOGRAPH
+ {0xC846, 0x83F7}, //12091 #CJK UNIFIED IDEOGRAPH
+ {0xC847, 0x83FA}, //12092 #CJK UNIFIED IDEOGRAPH
+ {0xC848, 0x83FB}, //12093 #CJK UNIFIED IDEOGRAPH
+ {0xC849, 0x83FC}, //12094 #CJK UNIFIED IDEOGRAPH
+ {0xC84A, 0x83FE}, //12095 #CJK UNIFIED IDEOGRAPH
+ {0xC84B, 0x83FF}, //12096 #CJK UNIFIED IDEOGRAPH
+ {0xC84C, 0x8400}, //12097 #CJK UNIFIED IDEOGRAPH
+ {0xC84D, 0x8402}, //12098 #CJK UNIFIED IDEOGRAPH
+ {0xC84E, 0x8405}, //12099 #CJK UNIFIED IDEOGRAPH
+ {0xC84F, 0x8407}, //12100 #CJK UNIFIED IDEOGRAPH
+ {0xC850, 0x8408}, //12101 #CJK UNIFIED IDEOGRAPH
+ {0xC851, 0x8409}, //12102 #CJK UNIFIED IDEOGRAPH
+ {0xC852, 0x840A}, //12103 #CJK UNIFIED IDEOGRAPH
+ {0xC853, 0x8410}, //12104 #CJK UNIFIED IDEOGRAPH
+ {0xC854, 0x8412}, //12105 #CJK UNIFIED IDEOGRAPH
+ {0xC855, 0x8413}, //12106 #CJK UNIFIED IDEOGRAPH
+ {0xC856, 0x8414}, //12107 #CJK UNIFIED IDEOGRAPH
+ {0xC857, 0x8415}, //12108 #CJK UNIFIED IDEOGRAPH
+ {0xC858, 0x8416}, //12109 #CJK UNIFIED IDEOGRAPH
+ {0xC859, 0x8417}, //12110 #CJK UNIFIED IDEOGRAPH
+ {0xC85A, 0x8419}, //12111 #CJK UNIFIED IDEOGRAPH
+ {0xC85B, 0x841A}, //12112 #CJK UNIFIED IDEOGRAPH
+ {0xC85C, 0x841B}, //12113 #CJK UNIFIED IDEOGRAPH
+ {0xC85D, 0x841E}, //12114 #CJK UNIFIED IDEOGRAPH
+ {0xC85E, 0x841F}, //12115 #CJK UNIFIED IDEOGRAPH
+ {0xC85F, 0x8420}, //12116 #CJK UNIFIED IDEOGRAPH
+ {0xC860, 0x8421}, //12117 #CJK UNIFIED IDEOGRAPH
+ {0xC861, 0x8422}, //12118 #CJK UNIFIED IDEOGRAPH
+ {0xC862, 0x8423}, //12119 #CJK UNIFIED IDEOGRAPH
+ {0xC863, 0x8429}, //12120 #CJK UNIFIED IDEOGRAPH
+ {0xC864, 0x842A}, //12121 #CJK UNIFIED IDEOGRAPH
+ {0xC865, 0x842B}, //12122 #CJK UNIFIED IDEOGRAPH
+ {0xC866, 0x842C}, //12123 #CJK UNIFIED IDEOGRAPH
+ {0xC867, 0x842D}, //12124 #CJK UNIFIED IDEOGRAPH
+ {0xC868, 0x842E}, //12125 #CJK UNIFIED IDEOGRAPH
+ {0xC869, 0x842F}, //12126 #CJK UNIFIED IDEOGRAPH
+ {0xC86A, 0x8430}, //12127 #CJK UNIFIED IDEOGRAPH
+ {0xC86B, 0x8432}, //12128 #CJK UNIFIED IDEOGRAPH
+ {0xC86C, 0x8433}, //12129 #CJK UNIFIED IDEOGRAPH
+ {0xC86D, 0x8434}, //12130 #CJK UNIFIED IDEOGRAPH
+ {0xC86E, 0x8435}, //12131 #CJK UNIFIED IDEOGRAPH
+ {0xC86F, 0x8436}, //12132 #CJK UNIFIED IDEOGRAPH
+ {0xC870, 0x8437}, //12133 #CJK UNIFIED IDEOGRAPH
+ {0xC871, 0x8439}, //12134 #CJK UNIFIED IDEOGRAPH
+ {0xC872, 0x843A}, //12135 #CJK UNIFIED IDEOGRAPH
+ {0xC873, 0x843B}, //12136 #CJK UNIFIED IDEOGRAPH
+ {0xC874, 0x843E}, //12137 #CJK UNIFIED IDEOGRAPH
+ {0xC875, 0x843F}, //12138 #CJK UNIFIED IDEOGRAPH
+ {0xC876, 0x8440}, //12139 #CJK UNIFIED IDEOGRAPH
+ {0xC877, 0x8441}, //12140 #CJK UNIFIED IDEOGRAPH
+ {0xC878, 0x8442}, //12141 #CJK UNIFIED IDEOGRAPH
+ {0xC879, 0x8443}, //12142 #CJK UNIFIED IDEOGRAPH
+ {0xC87A, 0x8444}, //12143 #CJK UNIFIED IDEOGRAPH
+ {0xC87B, 0x8445}, //12144 #CJK UNIFIED IDEOGRAPH
+ {0xC87C, 0x8447}, //12145 #CJK UNIFIED IDEOGRAPH
+ {0xC87D, 0x8448}, //12146 #CJK UNIFIED IDEOGRAPH
+ {0xC87E, 0x8449}, //12147 #CJK UNIFIED IDEOGRAPH
+ {0xC880, 0x844A}, //12148 #CJK UNIFIED IDEOGRAPH
+ {0xC881, 0x844B}, //12149 #CJK UNIFIED IDEOGRAPH
+ {0xC882, 0x844C}, //12150 #CJK UNIFIED IDEOGRAPH
+ {0xC883, 0x844D}, //12151 #CJK UNIFIED IDEOGRAPH
+ {0xC884, 0x844E}, //12152 #CJK UNIFIED IDEOGRAPH
+ {0xC885, 0x844F}, //12153 #CJK UNIFIED IDEOGRAPH
+ {0xC886, 0x8450}, //12154 #CJK UNIFIED IDEOGRAPH
+ {0xC887, 0x8452}, //12155 #CJK UNIFIED IDEOGRAPH
+ {0xC888, 0x8453}, //12156 #CJK UNIFIED IDEOGRAPH
+ {0xC889, 0x8454}, //12157 #CJK UNIFIED IDEOGRAPH
+ {0xC88A, 0x8455}, //12158 #CJK UNIFIED IDEOGRAPH
+ {0xC88B, 0x8456}, //12159 #CJK UNIFIED IDEOGRAPH
+ {0xC88C, 0x8458}, //12160 #CJK UNIFIED IDEOGRAPH
+ {0xC88D, 0x845D}, //12161 #CJK UNIFIED IDEOGRAPH
+ {0xC88E, 0x845E}, //12162 #CJK UNIFIED IDEOGRAPH
+ {0xC88F, 0x845F}, //12163 #CJK UNIFIED IDEOGRAPH
+ {0xC890, 0x8460}, //12164 #CJK UNIFIED IDEOGRAPH
+ {0xC891, 0x8462}, //12165 #CJK UNIFIED IDEOGRAPH
+ {0xC892, 0x8464}, //12166 #CJK UNIFIED IDEOGRAPH
+ {0xC893, 0x8465}, //12167 #CJK UNIFIED IDEOGRAPH
+ {0xC894, 0x8466}, //12168 #CJK UNIFIED IDEOGRAPH
+ {0xC895, 0x8467}, //12169 #CJK UNIFIED IDEOGRAPH
+ {0xC896, 0x8468}, //12170 #CJK UNIFIED IDEOGRAPH
+ {0xC897, 0x846A}, //12171 #CJK UNIFIED IDEOGRAPH
+ {0xC898, 0x846E}, //12172 #CJK UNIFIED IDEOGRAPH
+ {0xC899, 0x846F}, //12173 #CJK UNIFIED IDEOGRAPH
+ {0xC89A, 0x8470}, //12174 #CJK UNIFIED IDEOGRAPH
+ {0xC89B, 0x8472}, //12175 #CJK UNIFIED IDEOGRAPH
+ {0xC89C, 0x8474}, //12176 #CJK UNIFIED IDEOGRAPH
+ {0xC89D, 0x8477}, //12177 #CJK UNIFIED IDEOGRAPH
+ {0xC89E, 0x8479}, //12178 #CJK UNIFIED IDEOGRAPH
+ {0xC89F, 0x847B}, //12179 #CJK UNIFIED IDEOGRAPH
+ {0xC8A0, 0x847C}, //12180 #CJK UNIFIED IDEOGRAPH
+ {0xC8A1, 0x53D6}, //12181 #CJK UNIFIED IDEOGRAPH
+ {0xC8A2, 0x5A36}, //12182 #CJK UNIFIED IDEOGRAPH
+ {0xC8A3, 0x9F8B}, //12183 #CJK UNIFIED IDEOGRAPH
+ {0xC8A4, 0x8DA3}, //12184 #CJK UNIFIED IDEOGRAPH
+ {0xC8A5, 0x53BB}, //12185 #CJK UNIFIED IDEOGRAPH
+ {0xC8A6, 0x5708}, //12186 #CJK UNIFIED IDEOGRAPH
+ {0xC8A7, 0x98A7}, //12187 #CJK UNIFIED IDEOGRAPH
+ {0xC8A8, 0x6743}, //12188 #CJK UNIFIED IDEOGRAPH
+ {0xC8A9, 0x919B}, //12189 #CJK UNIFIED IDEOGRAPH
+ {0xC8AA, 0x6CC9}, //12190 #CJK UNIFIED IDEOGRAPH
+ {0xC8AB, 0x5168}, //12191 #CJK UNIFIED IDEOGRAPH
+ {0xC8AC, 0x75CA}, //12192 #CJK UNIFIED IDEOGRAPH
+ {0xC8AD, 0x62F3}, //12193 #CJK UNIFIED IDEOGRAPH
+ {0xC8AE, 0x72AC}, //12194 #CJK UNIFIED IDEOGRAPH
+ {0xC8AF, 0x5238}, //12195 #CJK UNIFIED IDEOGRAPH
+ {0xC8B0, 0x529D}, //12196 #CJK UNIFIED IDEOGRAPH
+ {0xC8B1, 0x7F3A}, //12197 #CJK UNIFIED IDEOGRAPH
+ {0xC8B2, 0x7094}, //12198 #CJK UNIFIED IDEOGRAPH
+ {0xC8B3, 0x7638}, //12199 #CJK UNIFIED IDEOGRAPH
+ {0xC8B4, 0x5374}, //12200 #CJK UNIFIED IDEOGRAPH
+ {0xC8B5, 0x9E4A}, //12201 #CJK UNIFIED IDEOGRAPH
+ {0xC8B6, 0x69B7}, //12202 #CJK UNIFIED IDEOGRAPH
+ {0xC8B7, 0x786E}, //12203 #CJK UNIFIED IDEOGRAPH
+ {0xC8B8, 0x96C0}, //12204 #CJK UNIFIED IDEOGRAPH
+ {0xC8B9, 0x88D9}, //12205 #CJK UNIFIED IDEOGRAPH
+ {0xC8BA, 0x7FA4}, //12206 #CJK UNIFIED IDEOGRAPH
+ {0xC8BB, 0x7136}, //12207 #CJK UNIFIED IDEOGRAPH
+ {0xC8BC, 0x71C3}, //12208 #CJK UNIFIED IDEOGRAPH
+ {0xC8BD, 0x5189}, //12209 #CJK UNIFIED IDEOGRAPH
+ {0xC8BE, 0x67D3}, //12210 #CJK UNIFIED IDEOGRAPH
+ {0xC8BF, 0x74E4}, //12211 #CJK UNIFIED IDEOGRAPH
+ {0xC8C0, 0x58E4}, //12212 #CJK UNIFIED IDEOGRAPH
+ {0xC8C1, 0x6518}, //12213 #CJK UNIFIED IDEOGRAPH
+ {0xC8C2, 0x56B7}, //12214 #CJK UNIFIED IDEOGRAPH
+ {0xC8C3, 0x8BA9}, //12215 #CJK UNIFIED IDEOGRAPH
+ {0xC8C4, 0x9976}, //12216 #CJK UNIFIED IDEOGRAPH
+ {0xC8C5, 0x6270}, //12217 #CJK UNIFIED IDEOGRAPH
+ {0xC8C6, 0x7ED5}, //12218 #CJK UNIFIED IDEOGRAPH
+ {0xC8C7, 0x60F9}, //12219 #CJK UNIFIED IDEOGRAPH
+ {0xC8C8, 0x70ED}, //12220 #CJK UNIFIED IDEOGRAPH
+ {0xC8C9, 0x58EC}, //12221 #CJK UNIFIED IDEOGRAPH
+ {0xC8CA, 0x4EC1}, //12222 #CJK UNIFIED IDEOGRAPH
+ {0xC8CB, 0x4EBA}, //12223 #CJK UNIFIED IDEOGRAPH
+ {0xC8CC, 0x5FCD}, //12224 #CJK UNIFIED IDEOGRAPH
+ {0xC8CD, 0x97E7}, //12225 #CJK UNIFIED IDEOGRAPH
+ {0xC8CE, 0x4EFB}, //12226 #CJK UNIFIED IDEOGRAPH
+ {0xC8CF, 0x8BA4}, //12227 #CJK UNIFIED IDEOGRAPH
+ {0xC8D0, 0x5203}, //12228 #CJK UNIFIED IDEOGRAPH
+ {0xC8D1, 0x598A}, //12229 #CJK UNIFIED IDEOGRAPH
+ {0xC8D2, 0x7EAB}, //12230 #CJK UNIFIED IDEOGRAPH
+ {0xC8D3, 0x6254}, //12231 #CJK UNIFIED IDEOGRAPH
+ {0xC8D4, 0x4ECD}, //12232 #CJK UNIFIED IDEOGRAPH
+ {0xC8D5, 0x65E5}, //12233 #CJK UNIFIED IDEOGRAPH
+ {0xC8D6, 0x620E}, //12234 #CJK UNIFIED IDEOGRAPH
+ {0xC8D7, 0x8338}, //12235 #CJK UNIFIED IDEOGRAPH
+ {0xC8D8, 0x84C9}, //12236 #CJK UNIFIED IDEOGRAPH
+ {0xC8D9, 0x8363}, //12237 #CJK UNIFIED IDEOGRAPH
+ {0xC8DA, 0x878D}, //12238 #CJK UNIFIED IDEOGRAPH
+ {0xC8DB, 0x7194}, //12239 #CJK UNIFIED IDEOGRAPH
+ {0xC8DC, 0x6EB6}, //12240 #CJK UNIFIED IDEOGRAPH
+ {0xC8DD, 0x5BB9}, //12241 #CJK UNIFIED IDEOGRAPH
+ {0xC8DE, 0x7ED2}, //12242 #CJK UNIFIED IDEOGRAPH
+ {0xC8DF, 0x5197}, //12243 #CJK UNIFIED IDEOGRAPH
+ {0xC8E0, 0x63C9}, //12244 #CJK UNIFIED IDEOGRAPH
+ {0xC8E1, 0x67D4}, //12245 #CJK UNIFIED IDEOGRAPH
+ {0xC8E2, 0x8089}, //12246 #CJK UNIFIED IDEOGRAPH
+ {0xC8E3, 0x8339}, //12247 #CJK UNIFIED IDEOGRAPH
+ {0xC8E4, 0x8815}, //12248 #CJK UNIFIED IDEOGRAPH
+ {0xC8E5, 0x5112}, //12249 #CJK UNIFIED IDEOGRAPH
+ {0xC8E6, 0x5B7A}, //12250 #CJK UNIFIED IDEOGRAPH
+ {0xC8E7, 0x5982}, //12251 #CJK UNIFIED IDEOGRAPH
+ {0xC8E8, 0x8FB1}, //12252 #CJK UNIFIED IDEOGRAPH
+ {0xC8E9, 0x4E73}, //12253 #CJK UNIFIED IDEOGRAPH
+ {0xC8EA, 0x6C5D}, //12254 #CJK UNIFIED IDEOGRAPH
+ {0xC8EB, 0x5165}, //12255 #CJK UNIFIED IDEOGRAPH
+ {0xC8EC, 0x8925}, //12256 #CJK UNIFIED IDEOGRAPH
+ {0xC8ED, 0x8F6F}, //12257 #CJK UNIFIED IDEOGRAPH
+ {0xC8EE, 0x962E}, //12258 #CJK UNIFIED IDEOGRAPH
+ {0xC8EF, 0x854A}, //12259 #CJK UNIFIED IDEOGRAPH
+ {0xC8F0, 0x745E}, //12260 #CJK UNIFIED IDEOGRAPH
+ {0xC8F1, 0x9510}, //12261 #CJK UNIFIED IDEOGRAPH
+ {0xC8F2, 0x95F0}, //12262 #CJK UNIFIED IDEOGRAPH
+ {0xC8F3, 0x6DA6}, //12263 #CJK UNIFIED IDEOGRAPH
+ {0xC8F4, 0x82E5}, //12264 #CJK UNIFIED IDEOGRAPH
+ {0xC8F5, 0x5F31}, //12265 #CJK UNIFIED IDEOGRAPH
+ {0xC8F6, 0x6492}, //12266 #CJK UNIFIED IDEOGRAPH
+ {0xC8F7, 0x6D12}, //12267 #CJK UNIFIED IDEOGRAPH
+ {0xC8F8, 0x8428}, //12268 #CJK UNIFIED IDEOGRAPH
+ {0xC8F9, 0x816E}, //12269 #CJK UNIFIED IDEOGRAPH
+ {0xC8FA, 0x9CC3}, //12270 #CJK UNIFIED IDEOGRAPH
+ {0xC8FB, 0x585E}, //12271 #CJK UNIFIED IDEOGRAPH
+ {0xC8FC, 0x8D5B}, //12272 #CJK UNIFIED IDEOGRAPH
+ {0xC8FD, 0x4E09}, //12273 #CJK UNIFIED IDEOGRAPH
+ {0xC8FE, 0x53C1}, //12274 #CJK UNIFIED IDEOGRAPH
+ {0xC940, 0x847D}, //12275 #CJK UNIFIED IDEOGRAPH
+ {0xC941, 0x847E}, //12276 #CJK UNIFIED IDEOGRAPH
+ {0xC942, 0x847F}, //12277 #CJK UNIFIED IDEOGRAPH
+ {0xC943, 0x8480}, //12278 #CJK UNIFIED IDEOGRAPH
+ {0xC944, 0x8481}, //12279 #CJK UNIFIED IDEOGRAPH
+ {0xC945, 0x8483}, //12280 #CJK UNIFIED IDEOGRAPH
+ {0xC946, 0x8484}, //12281 #CJK UNIFIED IDEOGRAPH
+ {0xC947, 0x8485}, //12282 #CJK UNIFIED IDEOGRAPH
+ {0xC948, 0x8486}, //12283 #CJK UNIFIED IDEOGRAPH
+ {0xC949, 0x848A}, //12284 #CJK UNIFIED IDEOGRAPH
+ {0xC94A, 0x848D}, //12285 #CJK UNIFIED IDEOGRAPH
+ {0xC94B, 0x848F}, //12286 #CJK UNIFIED IDEOGRAPH
+ {0xC94C, 0x8490}, //12287 #CJK UNIFIED IDEOGRAPH
+ {0xC94D, 0x8491}, //12288 #CJK UNIFIED IDEOGRAPH
+ {0xC94E, 0x8492}, //12289 #CJK UNIFIED IDEOGRAPH
+ {0xC94F, 0x8493}, //12290 #CJK UNIFIED IDEOGRAPH
+ {0xC950, 0x8494}, //12291 #CJK UNIFIED IDEOGRAPH
+ {0xC951, 0x8495}, //12292 #CJK UNIFIED IDEOGRAPH
+ {0xC952, 0x8496}, //12293 #CJK UNIFIED IDEOGRAPH
+ {0xC953, 0x8498}, //12294 #CJK UNIFIED IDEOGRAPH
+ {0xC954, 0x849A}, //12295 #CJK UNIFIED IDEOGRAPH
+ {0xC955, 0x849B}, //12296 #CJK UNIFIED IDEOGRAPH
+ {0xC956, 0x849D}, //12297 #CJK UNIFIED IDEOGRAPH
+ {0xC957, 0x849E}, //12298 #CJK UNIFIED IDEOGRAPH
+ {0xC958, 0x849F}, //12299 #CJK UNIFIED IDEOGRAPH
+ {0xC959, 0x84A0}, //12300 #CJK UNIFIED IDEOGRAPH
+ {0xC95A, 0x84A2}, //12301 #CJK UNIFIED IDEOGRAPH
+ {0xC95B, 0x84A3}, //12302 #CJK UNIFIED IDEOGRAPH
+ {0xC95C, 0x84A4}, //12303 #CJK UNIFIED IDEOGRAPH
+ {0xC95D, 0x84A5}, //12304 #CJK UNIFIED IDEOGRAPH
+ {0xC95E, 0x84A6}, //12305 #CJK UNIFIED IDEOGRAPH
+ {0xC95F, 0x84A7}, //12306 #CJK UNIFIED IDEOGRAPH
+ {0xC960, 0x84A8}, //12307 #CJK UNIFIED IDEOGRAPH
+ {0xC961, 0x84A9}, //12308 #CJK UNIFIED IDEOGRAPH
+ {0xC962, 0x84AA}, //12309 #CJK UNIFIED IDEOGRAPH
+ {0xC963, 0x84AB}, //12310 #CJK UNIFIED IDEOGRAPH
+ {0xC964, 0x84AC}, //12311 #CJK UNIFIED IDEOGRAPH
+ {0xC965, 0x84AD}, //12312 #CJK UNIFIED IDEOGRAPH
+ {0xC966, 0x84AE}, //12313 #CJK UNIFIED IDEOGRAPH
+ {0xC967, 0x84B0}, //12314 #CJK UNIFIED IDEOGRAPH
+ {0xC968, 0x84B1}, //12315 #CJK UNIFIED IDEOGRAPH
+ {0xC969, 0x84B3}, //12316 #CJK UNIFIED IDEOGRAPH
+ {0xC96A, 0x84B5}, //12317 #CJK UNIFIED IDEOGRAPH
+ {0xC96B, 0x84B6}, //12318 #CJK UNIFIED IDEOGRAPH
+ {0xC96C, 0x84B7}, //12319 #CJK UNIFIED IDEOGRAPH
+ {0xC96D, 0x84BB}, //12320 #CJK UNIFIED IDEOGRAPH
+ {0xC96E, 0x84BC}, //12321 #CJK UNIFIED IDEOGRAPH
+ {0xC96F, 0x84BE}, //12322 #CJK UNIFIED IDEOGRAPH
+ {0xC970, 0x84C0}, //12323 #CJK UNIFIED IDEOGRAPH
+ {0xC971, 0x84C2}, //12324 #CJK UNIFIED IDEOGRAPH
+ {0xC972, 0x84C3}, //12325 #CJK UNIFIED IDEOGRAPH
+ {0xC973, 0x84C5}, //12326 #CJK UNIFIED IDEOGRAPH
+ {0xC974, 0x84C6}, //12327 #CJK UNIFIED IDEOGRAPH
+ {0xC975, 0x84C7}, //12328 #CJK UNIFIED IDEOGRAPH
+ {0xC976, 0x84C8}, //12329 #CJK UNIFIED IDEOGRAPH
+ {0xC977, 0x84CB}, //12330 #CJK UNIFIED IDEOGRAPH
+ {0xC978, 0x84CC}, //12331 #CJK UNIFIED IDEOGRAPH
+ {0xC979, 0x84CE}, //12332 #CJK UNIFIED IDEOGRAPH
+ {0xC97A, 0x84CF}, //12333 #CJK UNIFIED IDEOGRAPH
+ {0xC97B, 0x84D2}, //12334 #CJK UNIFIED IDEOGRAPH
+ {0xC97C, 0x84D4}, //12335 #CJK UNIFIED IDEOGRAPH
+ {0xC97D, 0x84D5}, //12336 #CJK UNIFIED IDEOGRAPH
+ {0xC97E, 0x84D7}, //12337 #CJK UNIFIED IDEOGRAPH
+ {0xC980, 0x84D8}, //12338 #CJK UNIFIED IDEOGRAPH
+ {0xC981, 0x84D9}, //12339 #CJK UNIFIED IDEOGRAPH
+ {0xC982, 0x84DA}, //12340 #CJK UNIFIED IDEOGRAPH
+ {0xC983, 0x84DB}, //12341 #CJK UNIFIED IDEOGRAPH
+ {0xC984, 0x84DC}, //12342 #CJK UNIFIED IDEOGRAPH
+ {0xC985, 0x84DE}, //12343 #CJK UNIFIED IDEOGRAPH
+ {0xC986, 0x84E1}, //12344 #CJK UNIFIED IDEOGRAPH
+ {0xC987, 0x84E2}, //12345 #CJK UNIFIED IDEOGRAPH
+ {0xC988, 0x84E4}, //12346 #CJK UNIFIED IDEOGRAPH
+ {0xC989, 0x84E7}, //12347 #CJK UNIFIED IDEOGRAPH
+ {0xC98A, 0x84E8}, //12348 #CJK UNIFIED IDEOGRAPH
+ {0xC98B, 0x84E9}, //12349 #CJK UNIFIED IDEOGRAPH
+ {0xC98C, 0x84EA}, //12350 #CJK UNIFIED IDEOGRAPH
+ {0xC98D, 0x84EB}, //12351 #CJK UNIFIED IDEOGRAPH
+ {0xC98E, 0x84ED}, //12352 #CJK UNIFIED IDEOGRAPH
+ {0xC98F, 0x84EE}, //12353 #CJK UNIFIED IDEOGRAPH
+ {0xC990, 0x84EF}, //12354 #CJK UNIFIED IDEOGRAPH
+ {0xC991, 0x84F1}, //12355 #CJK UNIFIED IDEOGRAPH
+ {0xC992, 0x84F2}, //12356 #CJK UNIFIED IDEOGRAPH
+ {0xC993, 0x84F3}, //12357 #CJK UNIFIED IDEOGRAPH
+ {0xC994, 0x84F4}, //12358 #CJK UNIFIED IDEOGRAPH
+ {0xC995, 0x84F5}, //12359 #CJK UNIFIED IDEOGRAPH
+ {0xC996, 0x84F6}, //12360 #CJK UNIFIED IDEOGRAPH
+ {0xC997, 0x84F7}, //12361 #CJK UNIFIED IDEOGRAPH
+ {0xC998, 0x84F8}, //12362 #CJK UNIFIED IDEOGRAPH
+ {0xC999, 0x84F9}, //12363 #CJK UNIFIED IDEOGRAPH
+ {0xC99A, 0x84FA}, //12364 #CJK UNIFIED IDEOGRAPH
+ {0xC99B, 0x84FB}, //12365 #CJK UNIFIED IDEOGRAPH
+ {0xC99C, 0x84FD}, //12366 #CJK UNIFIED IDEOGRAPH
+ {0xC99D, 0x84FE}, //12367 #CJK UNIFIED IDEOGRAPH
+ {0xC99E, 0x8500}, //12368 #CJK UNIFIED IDEOGRAPH
+ {0xC99F, 0x8501}, //12369 #CJK UNIFIED IDEOGRAPH
+ {0xC9A0, 0x8502}, //12370 #CJK UNIFIED IDEOGRAPH
+ {0xC9A1, 0x4F1E}, //12371 #CJK UNIFIED IDEOGRAPH
+ {0xC9A2, 0x6563}, //12372 #CJK UNIFIED IDEOGRAPH
+ {0xC9A3, 0x6851}, //12373 #CJK UNIFIED IDEOGRAPH
+ {0xC9A4, 0x55D3}, //12374 #CJK UNIFIED IDEOGRAPH
+ {0xC9A5, 0x4E27}, //12375 #CJK UNIFIED IDEOGRAPH
+ {0xC9A6, 0x6414}, //12376 #CJK UNIFIED IDEOGRAPH
+ {0xC9A7, 0x9A9A}, //12377 #CJK UNIFIED IDEOGRAPH
+ {0xC9A8, 0x626B}, //12378 #CJK UNIFIED IDEOGRAPH
+ {0xC9A9, 0x5AC2}, //12379 #CJK UNIFIED IDEOGRAPH
+ {0xC9AA, 0x745F}, //12380 #CJK UNIFIED IDEOGRAPH
+ {0xC9AB, 0x8272}, //12381 #CJK UNIFIED IDEOGRAPH
+ {0xC9AC, 0x6DA9}, //12382 #CJK UNIFIED IDEOGRAPH
+ {0xC9AD, 0x68EE}, //12383 #CJK UNIFIED IDEOGRAPH
+ {0xC9AE, 0x50E7}, //12384 #CJK UNIFIED IDEOGRAPH
+ {0xC9AF, 0x838E}, //12385 #CJK UNIFIED IDEOGRAPH
+ {0xC9B0, 0x7802}, //12386 #CJK UNIFIED IDEOGRAPH
+ {0xC9B1, 0x6740}, //12387 #CJK UNIFIED IDEOGRAPH
+ {0xC9B2, 0x5239}, //12388 #CJK UNIFIED IDEOGRAPH
+ {0xC9B3, 0x6C99}, //12389 #CJK UNIFIED IDEOGRAPH
+ {0xC9B4, 0x7EB1}, //12390 #CJK UNIFIED IDEOGRAPH
+ {0xC9B5, 0x50BB}, //12391 #CJK UNIFIED IDEOGRAPH
+ {0xC9B6, 0x5565}, //12392 #CJK UNIFIED IDEOGRAPH
+ {0xC9B7, 0x715E}, //12393 #CJK UNIFIED IDEOGRAPH
+ {0xC9B8, 0x7B5B}, //12394 #CJK UNIFIED IDEOGRAPH
+ {0xC9B9, 0x6652}, //12395 #CJK UNIFIED IDEOGRAPH
+ {0xC9BA, 0x73CA}, //12396 #CJK UNIFIED IDEOGRAPH
+ {0xC9BB, 0x82EB}, //12397 #CJK UNIFIED IDEOGRAPH
+ {0xC9BC, 0x6749}, //12398 #CJK UNIFIED IDEOGRAPH
+ {0xC9BD, 0x5C71}, //12399 #CJK UNIFIED IDEOGRAPH
+ {0xC9BE, 0x5220}, //12400 #CJK UNIFIED IDEOGRAPH
+ {0xC9BF, 0x717D}, //12401 #CJK UNIFIED IDEOGRAPH
+ {0xC9C0, 0x886B}, //12402 #CJK UNIFIED IDEOGRAPH
+ {0xC9C1, 0x95EA}, //12403 #CJK UNIFIED IDEOGRAPH
+ {0xC9C2, 0x9655}, //12404 #CJK UNIFIED IDEOGRAPH
+ {0xC9C3, 0x64C5}, //12405 #CJK UNIFIED IDEOGRAPH
+ {0xC9C4, 0x8D61}, //12406 #CJK UNIFIED IDEOGRAPH
+ {0xC9C5, 0x81B3}, //12407 #CJK UNIFIED IDEOGRAPH
+ {0xC9C6, 0x5584}, //12408 #CJK UNIFIED IDEOGRAPH
+ {0xC9C7, 0x6C55}, //12409 #CJK UNIFIED IDEOGRAPH
+ {0xC9C8, 0x6247}, //12410 #CJK UNIFIED IDEOGRAPH
+ {0xC9C9, 0x7F2E}, //12411 #CJK UNIFIED IDEOGRAPH
+ {0xC9CA, 0x5892}, //12412 #CJK UNIFIED IDEOGRAPH
+ {0xC9CB, 0x4F24}, //12413 #CJK UNIFIED IDEOGRAPH
+ {0xC9CC, 0x5546}, //12414 #CJK UNIFIED IDEOGRAPH
+ {0xC9CD, 0x8D4F}, //12415 #CJK UNIFIED IDEOGRAPH
+ {0xC9CE, 0x664C}, //12416 #CJK UNIFIED IDEOGRAPH
+ {0xC9CF, 0x4E0A}, //12417 #CJK UNIFIED IDEOGRAPH
+ {0xC9D0, 0x5C1A}, //12418 #CJK UNIFIED IDEOGRAPH
+ {0xC9D1, 0x88F3}, //12419 #CJK UNIFIED IDEOGRAPH
+ {0xC9D2, 0x68A2}, //12420 #CJK UNIFIED IDEOGRAPH
+ {0xC9D3, 0x634E}, //12421 #CJK UNIFIED IDEOGRAPH
+ {0xC9D4, 0x7A0D}, //12422 #CJK UNIFIED IDEOGRAPH
+ {0xC9D5, 0x70E7}, //12423 #CJK UNIFIED IDEOGRAPH
+ {0xC9D6, 0x828D}, //12424 #CJK UNIFIED IDEOGRAPH
+ {0xC9D7, 0x52FA}, //12425 #CJK UNIFIED IDEOGRAPH
+ {0xC9D8, 0x97F6}, //12426 #CJK UNIFIED IDEOGRAPH
+ {0xC9D9, 0x5C11}, //12427 #CJK UNIFIED IDEOGRAPH
+ {0xC9DA, 0x54E8}, //12428 #CJK UNIFIED IDEOGRAPH
+ {0xC9DB, 0x90B5}, //12429 #CJK UNIFIED IDEOGRAPH
+ {0xC9DC, 0x7ECD}, //12430 #CJK UNIFIED IDEOGRAPH
+ {0xC9DD, 0x5962}, //12431 #CJK UNIFIED IDEOGRAPH
+ {0xC9DE, 0x8D4A}, //12432 #CJK UNIFIED IDEOGRAPH
+ {0xC9DF, 0x86C7}, //12433 #CJK UNIFIED IDEOGRAPH
+ {0xC9E0, 0x820C}, //12434 #CJK UNIFIED IDEOGRAPH
+ {0xC9E1, 0x820D}, //12435 #CJK UNIFIED IDEOGRAPH
+ {0xC9E2, 0x8D66}, //12436 #CJK UNIFIED IDEOGRAPH
+ {0xC9E3, 0x6444}, //12437 #CJK UNIFIED IDEOGRAPH
+ {0xC9E4, 0x5C04}, //12438 #CJK UNIFIED IDEOGRAPH
+ {0xC9E5, 0x6151}, //12439 #CJK UNIFIED IDEOGRAPH
+ {0xC9E6, 0x6D89}, //12440 #CJK UNIFIED IDEOGRAPH
+ {0xC9E7, 0x793E}, //12441 #CJK UNIFIED IDEOGRAPH
+ {0xC9E8, 0x8BBE}, //12442 #CJK UNIFIED IDEOGRAPH
+ {0xC9E9, 0x7837}, //12443 #CJK UNIFIED IDEOGRAPH
+ {0xC9EA, 0x7533}, //12444 #CJK UNIFIED IDEOGRAPH
+ {0xC9EB, 0x547B}, //12445 #CJK UNIFIED IDEOGRAPH
+ {0xC9EC, 0x4F38}, //12446 #CJK UNIFIED IDEOGRAPH
+ {0xC9ED, 0x8EAB}, //12447 #CJK UNIFIED IDEOGRAPH
+ {0xC9EE, 0x6DF1}, //12448 #CJK UNIFIED IDEOGRAPH
+ {0xC9EF, 0x5A20}, //12449 #CJK UNIFIED IDEOGRAPH
+ {0xC9F0, 0x7EC5}, //12450 #CJK UNIFIED IDEOGRAPH
+ {0xC9F1, 0x795E}, //12451 #CJK UNIFIED IDEOGRAPH
+ {0xC9F2, 0x6C88}, //12452 #CJK UNIFIED IDEOGRAPH
+ {0xC9F3, 0x5BA1}, //12453 #CJK UNIFIED IDEOGRAPH
+ {0xC9F4, 0x5A76}, //12454 #CJK UNIFIED IDEOGRAPH
+ {0xC9F5, 0x751A}, //12455 #CJK UNIFIED IDEOGRAPH
+ {0xC9F6, 0x80BE}, //12456 #CJK UNIFIED IDEOGRAPH
+ {0xC9F7, 0x614E}, //12457 #CJK UNIFIED IDEOGRAPH
+ {0xC9F8, 0x6E17}, //12458 #CJK UNIFIED IDEOGRAPH
+ {0xC9F9, 0x58F0}, //12459 #CJK UNIFIED IDEOGRAPH
+ {0xC9FA, 0x751F}, //12460 #CJK UNIFIED IDEOGRAPH
+ {0xC9FB, 0x7525}, //12461 #CJK UNIFIED IDEOGRAPH
+ {0xC9FC, 0x7272}, //12462 #CJK UNIFIED IDEOGRAPH
+ {0xC9FD, 0x5347}, //12463 #CJK UNIFIED IDEOGRAPH
+ {0xC9FE, 0x7EF3}, //12464 #CJK UNIFIED IDEOGRAPH
+ {0xCA40, 0x8503}, //12465 #CJK UNIFIED IDEOGRAPH
+ {0xCA41, 0x8504}, //12466 #CJK UNIFIED IDEOGRAPH
+ {0xCA42, 0x8505}, //12467 #CJK UNIFIED IDEOGRAPH
+ {0xCA43, 0x8506}, //12468 #CJK UNIFIED IDEOGRAPH
+ {0xCA44, 0x8507}, //12469 #CJK UNIFIED IDEOGRAPH
+ {0xCA45, 0x8508}, //12470 #CJK UNIFIED IDEOGRAPH
+ {0xCA46, 0x8509}, //12471 #CJK UNIFIED IDEOGRAPH
+ {0xCA47, 0x850A}, //12472 #CJK UNIFIED IDEOGRAPH
+ {0xCA48, 0x850B}, //12473 #CJK UNIFIED IDEOGRAPH
+ {0xCA49, 0x850D}, //12474 #CJK UNIFIED IDEOGRAPH
+ {0xCA4A, 0x850E}, //12475 #CJK UNIFIED IDEOGRAPH
+ {0xCA4B, 0x850F}, //12476 #CJK UNIFIED IDEOGRAPH
+ {0xCA4C, 0x8510}, //12477 #CJK UNIFIED IDEOGRAPH
+ {0xCA4D, 0x8512}, //12478 #CJK UNIFIED IDEOGRAPH
+ {0xCA4E, 0x8514}, //12479 #CJK UNIFIED IDEOGRAPH
+ {0xCA4F, 0x8515}, //12480 #CJK UNIFIED IDEOGRAPH
+ {0xCA50, 0x8516}, //12481 #CJK UNIFIED IDEOGRAPH
+ {0xCA51, 0x8518}, //12482 #CJK UNIFIED IDEOGRAPH
+ {0xCA52, 0x8519}, //12483 #CJK UNIFIED IDEOGRAPH
+ {0xCA53, 0x851B}, //12484 #CJK UNIFIED IDEOGRAPH
+ {0xCA54, 0x851C}, //12485 #CJK UNIFIED IDEOGRAPH
+ {0xCA55, 0x851D}, //12486 #CJK UNIFIED IDEOGRAPH
+ {0xCA56, 0x851E}, //12487 #CJK UNIFIED IDEOGRAPH
+ {0xCA57, 0x8520}, //12488 #CJK UNIFIED IDEOGRAPH
+ {0xCA58, 0x8522}, //12489 #CJK UNIFIED IDEOGRAPH
+ {0xCA59, 0x8523}, //12490 #CJK UNIFIED IDEOGRAPH
+ {0xCA5A, 0x8524}, //12491 #CJK UNIFIED IDEOGRAPH
+ {0xCA5B, 0x8525}, //12492 #CJK UNIFIED IDEOGRAPH
+ {0xCA5C, 0x8526}, //12493 #CJK UNIFIED IDEOGRAPH
+ {0xCA5D, 0x8527}, //12494 #CJK UNIFIED IDEOGRAPH
+ {0xCA5E, 0x8528}, //12495 #CJK UNIFIED IDEOGRAPH
+ {0xCA5F, 0x8529}, //12496 #CJK UNIFIED IDEOGRAPH
+ {0xCA60, 0x852A}, //12497 #CJK UNIFIED IDEOGRAPH
+ {0xCA61, 0x852D}, //12498 #CJK UNIFIED IDEOGRAPH
+ {0xCA62, 0x852E}, //12499 #CJK UNIFIED IDEOGRAPH
+ {0xCA63, 0x852F}, //12500 #CJK UNIFIED IDEOGRAPH
+ {0xCA64, 0x8530}, //12501 #CJK UNIFIED IDEOGRAPH
+ {0xCA65, 0x8531}, //12502 #CJK UNIFIED IDEOGRAPH
+ {0xCA66, 0x8532}, //12503 #CJK UNIFIED IDEOGRAPH
+ {0xCA67, 0x8533}, //12504 #CJK UNIFIED IDEOGRAPH
+ {0xCA68, 0x8534}, //12505 #CJK UNIFIED IDEOGRAPH
+ {0xCA69, 0x8535}, //12506 #CJK UNIFIED IDEOGRAPH
+ {0xCA6A, 0x8536}, //12507 #CJK UNIFIED IDEOGRAPH
+ {0xCA6B, 0x853E}, //12508 #CJK UNIFIED IDEOGRAPH
+ {0xCA6C, 0x853F}, //12509 #CJK UNIFIED IDEOGRAPH
+ {0xCA6D, 0x8540}, //12510 #CJK UNIFIED IDEOGRAPH
+ {0xCA6E, 0x8541}, //12511 #CJK UNIFIED IDEOGRAPH
+ {0xCA6F, 0x8542}, //12512 #CJK UNIFIED IDEOGRAPH
+ {0xCA70, 0x8544}, //12513 #CJK UNIFIED IDEOGRAPH
+ {0xCA71, 0x8545}, //12514 #CJK UNIFIED IDEOGRAPH
+ {0xCA72, 0x8546}, //12515 #CJK UNIFIED IDEOGRAPH
+ {0xCA73, 0x8547}, //12516 #CJK UNIFIED IDEOGRAPH
+ {0xCA74, 0x854B}, //12517 #CJK UNIFIED IDEOGRAPH
+ {0xCA75, 0x854C}, //12518 #CJK UNIFIED IDEOGRAPH
+ {0xCA76, 0x854D}, //12519 #CJK UNIFIED IDEOGRAPH
+ {0xCA77, 0x854E}, //12520 #CJK UNIFIED IDEOGRAPH
+ {0xCA78, 0x854F}, //12521 #CJK UNIFIED IDEOGRAPH
+ {0xCA79, 0x8550}, //12522 #CJK UNIFIED IDEOGRAPH
+ {0xCA7A, 0x8551}, //12523 #CJK UNIFIED IDEOGRAPH
+ {0xCA7B, 0x8552}, //12524 #CJK UNIFIED IDEOGRAPH
+ {0xCA7C, 0x8553}, //12525 #CJK UNIFIED IDEOGRAPH
+ {0xCA7D, 0x8554}, //12526 #CJK UNIFIED IDEOGRAPH
+ {0xCA7E, 0x8555}, //12527 #CJK UNIFIED IDEOGRAPH
+ {0xCA80, 0x8557}, //12528 #CJK UNIFIED IDEOGRAPH
+ {0xCA81, 0x8558}, //12529 #CJK UNIFIED IDEOGRAPH
+ {0xCA82, 0x855A}, //12530 #CJK UNIFIED IDEOGRAPH
+ {0xCA83, 0x855B}, //12531 #CJK UNIFIED IDEOGRAPH
+ {0xCA84, 0x855C}, //12532 #CJK UNIFIED IDEOGRAPH
+ {0xCA85, 0x855D}, //12533 #CJK UNIFIED IDEOGRAPH
+ {0xCA86, 0x855F}, //12534 #CJK UNIFIED IDEOGRAPH
+ {0xCA87, 0x8560}, //12535 #CJK UNIFIED IDEOGRAPH
+ {0xCA88, 0x8561}, //12536 #CJK UNIFIED IDEOGRAPH
+ {0xCA89, 0x8562}, //12537 #CJK UNIFIED IDEOGRAPH
+ {0xCA8A, 0x8563}, //12538 #CJK UNIFIED IDEOGRAPH
+ {0xCA8B, 0x8565}, //12539 #CJK UNIFIED IDEOGRAPH
+ {0xCA8C, 0x8566}, //12540 #CJK UNIFIED IDEOGRAPH
+ {0xCA8D, 0x8567}, //12541 #CJK UNIFIED IDEOGRAPH
+ {0xCA8E, 0x8569}, //12542 #CJK UNIFIED IDEOGRAPH
+ {0xCA8F, 0x856A}, //12543 #CJK UNIFIED IDEOGRAPH
+ {0xCA90, 0x856B}, //12544 #CJK UNIFIED IDEOGRAPH
+ {0xCA91, 0x856C}, //12545 #CJK UNIFIED IDEOGRAPH
+ {0xCA92, 0x856D}, //12546 #CJK UNIFIED IDEOGRAPH
+ {0xCA93, 0x856E}, //12547 #CJK UNIFIED IDEOGRAPH
+ {0xCA94, 0x856F}, //12548 #CJK UNIFIED IDEOGRAPH
+ {0xCA95, 0x8570}, //12549 #CJK UNIFIED IDEOGRAPH
+ {0xCA96, 0x8571}, //12550 #CJK UNIFIED IDEOGRAPH
+ {0xCA97, 0x8573}, //12551 #CJK UNIFIED IDEOGRAPH
+ {0xCA98, 0x8575}, //12552 #CJK UNIFIED IDEOGRAPH
+ {0xCA99, 0x8576}, //12553 #CJK UNIFIED IDEOGRAPH
+ {0xCA9A, 0x8577}, //12554 #CJK UNIFIED IDEOGRAPH
+ {0xCA9B, 0x8578}, //12555 #CJK UNIFIED IDEOGRAPH
+ {0xCA9C, 0x857C}, //12556 #CJK UNIFIED IDEOGRAPH
+ {0xCA9D, 0x857D}, //12557 #CJK UNIFIED IDEOGRAPH
+ {0xCA9E, 0x857F}, //12558 #CJK UNIFIED IDEOGRAPH
+ {0xCA9F, 0x8580}, //12559 #CJK UNIFIED IDEOGRAPH
+ {0xCAA0, 0x8581}, //12560 #CJK UNIFIED IDEOGRAPH
+ {0xCAA1, 0x7701}, //12561 #CJK UNIFIED IDEOGRAPH
+ {0xCAA2, 0x76DB}, //12562 #CJK UNIFIED IDEOGRAPH
+ {0xCAA3, 0x5269}, //12563 #CJK UNIFIED IDEOGRAPH
+ {0xCAA4, 0x80DC}, //12564 #CJK UNIFIED IDEOGRAPH
+ {0xCAA5, 0x5723}, //12565 #CJK UNIFIED IDEOGRAPH
+ {0xCAA6, 0x5E08}, //12566 #CJK UNIFIED IDEOGRAPH
+ {0xCAA7, 0x5931}, //12567 #CJK UNIFIED IDEOGRAPH
+ {0xCAA8, 0x72EE}, //12568 #CJK UNIFIED IDEOGRAPH
+ {0xCAA9, 0x65BD}, //12569 #CJK UNIFIED IDEOGRAPH
+ {0xCAAA, 0x6E7F}, //12570 #CJK UNIFIED IDEOGRAPH
+ {0xCAAB, 0x8BD7}, //12571 #CJK UNIFIED IDEOGRAPH
+ {0xCAAC, 0x5C38}, //12572 #CJK UNIFIED IDEOGRAPH
+ {0xCAAD, 0x8671}, //12573 #CJK UNIFIED IDEOGRAPH
+ {0xCAAE, 0x5341}, //12574 #CJK UNIFIED IDEOGRAPH
+ {0xCAAF, 0x77F3}, //12575 #CJK UNIFIED IDEOGRAPH
+ {0xCAB0, 0x62FE}, //12576 #CJK UNIFIED IDEOGRAPH
+ {0xCAB1, 0x65F6}, //12577 #CJK UNIFIED IDEOGRAPH
+ {0xCAB2, 0x4EC0}, //12578 #CJK UNIFIED IDEOGRAPH
+ {0xCAB3, 0x98DF}, //12579 #CJK UNIFIED IDEOGRAPH
+ {0xCAB4, 0x8680}, //12580 #CJK UNIFIED IDEOGRAPH
+ {0xCAB5, 0x5B9E}, //12581 #CJK UNIFIED IDEOGRAPH
+ {0xCAB6, 0x8BC6}, //12582 #CJK UNIFIED IDEOGRAPH
+ {0xCAB7, 0x53F2}, //12583 #CJK UNIFIED IDEOGRAPH
+ {0xCAB8, 0x77E2}, //12584 #CJK UNIFIED IDEOGRAPH
+ {0xCAB9, 0x4F7F}, //12585 #CJK UNIFIED IDEOGRAPH
+ {0xCABA, 0x5C4E}, //12586 #CJK UNIFIED IDEOGRAPH
+ {0xCABB, 0x9A76}, //12587 #CJK UNIFIED IDEOGRAPH
+ {0xCABC, 0x59CB}, //12588 #CJK UNIFIED IDEOGRAPH
+ {0xCABD, 0x5F0F}, //12589 #CJK UNIFIED IDEOGRAPH
+ {0xCABE, 0x793A}, //12590 #CJK UNIFIED IDEOGRAPH
+ {0xCABF, 0x58EB}, //12591 #CJK UNIFIED IDEOGRAPH
+ {0xCAC0, 0x4E16}, //12592 #CJK UNIFIED IDEOGRAPH
+ {0xCAC1, 0x67FF}, //12593 #CJK UNIFIED IDEOGRAPH
+ {0xCAC2, 0x4E8B}, //12594 #CJK UNIFIED IDEOGRAPH
+ {0xCAC3, 0x62ED}, //12595 #CJK UNIFIED IDEOGRAPH
+ {0xCAC4, 0x8A93}, //12596 #CJK UNIFIED IDEOGRAPH
+ {0xCAC5, 0x901D}, //12597 #CJK UNIFIED IDEOGRAPH
+ {0xCAC6, 0x52BF}, //12598 #CJK UNIFIED IDEOGRAPH
+ {0xCAC7, 0x662F}, //12599 #CJK UNIFIED IDEOGRAPH
+ {0xCAC8, 0x55DC}, //12600 #CJK UNIFIED IDEOGRAPH
+ {0xCAC9, 0x566C}, //12601 #CJK UNIFIED IDEOGRAPH
+ {0xCACA, 0x9002}, //12602 #CJK UNIFIED IDEOGRAPH
+ {0xCACB, 0x4ED5}, //12603 #CJK UNIFIED IDEOGRAPH
+ {0xCACC, 0x4F8D}, //12604 #CJK UNIFIED IDEOGRAPH
+ {0xCACD, 0x91CA}, //12605 #CJK UNIFIED IDEOGRAPH
+ {0xCACE, 0x9970}, //12606 #CJK UNIFIED IDEOGRAPH
+ {0xCACF, 0x6C0F}, //12607 #CJK UNIFIED IDEOGRAPH
+ {0xCAD0, 0x5E02}, //12608 #CJK UNIFIED IDEOGRAPH
+ {0xCAD1, 0x6043}, //12609 #CJK UNIFIED IDEOGRAPH
+ {0xCAD2, 0x5BA4}, //12610 #CJK UNIFIED IDEOGRAPH
+ {0xCAD3, 0x89C6}, //12611 #CJK UNIFIED IDEOGRAPH
+ {0xCAD4, 0x8BD5}, //12612 #CJK UNIFIED IDEOGRAPH
+ {0xCAD5, 0x6536}, //12613 #CJK UNIFIED IDEOGRAPH
+ {0xCAD6, 0x624B}, //12614 #CJK UNIFIED IDEOGRAPH
+ {0xCAD7, 0x9996}, //12615 #CJK UNIFIED IDEOGRAPH
+ {0xCAD8, 0x5B88}, //12616 #CJK UNIFIED IDEOGRAPH
+ {0xCAD9, 0x5BFF}, //12617 #CJK UNIFIED IDEOGRAPH
+ {0xCADA, 0x6388}, //12618 #CJK UNIFIED IDEOGRAPH
+ {0xCADB, 0x552E}, //12619 #CJK UNIFIED IDEOGRAPH
+ {0xCADC, 0x53D7}, //12620 #CJK UNIFIED IDEOGRAPH
+ {0xCADD, 0x7626}, //12621 #CJK UNIFIED IDEOGRAPH
+ {0xCADE, 0x517D}, //12622 #CJK UNIFIED IDEOGRAPH
+ {0xCADF, 0x852C}, //12623 #CJK UNIFIED IDEOGRAPH
+ {0xCAE0, 0x67A2}, //12624 #CJK UNIFIED IDEOGRAPH
+ {0xCAE1, 0x68B3}, //12625 #CJK UNIFIED IDEOGRAPH
+ {0xCAE2, 0x6B8A}, //12626 #CJK UNIFIED IDEOGRAPH
+ {0xCAE3, 0x6292}, //12627 #CJK UNIFIED IDEOGRAPH
+ {0xCAE4, 0x8F93}, //12628 #CJK UNIFIED IDEOGRAPH
+ {0xCAE5, 0x53D4}, //12629 #CJK UNIFIED IDEOGRAPH
+ {0xCAE6, 0x8212}, //12630 #CJK UNIFIED IDEOGRAPH
+ {0xCAE7, 0x6DD1}, //12631 #CJK UNIFIED IDEOGRAPH
+ {0xCAE8, 0x758F}, //12632 #CJK UNIFIED IDEOGRAPH
+ {0xCAE9, 0x4E66}, //12633 #CJK UNIFIED IDEOGRAPH
+ {0xCAEA, 0x8D4E}, //12634 #CJK UNIFIED IDEOGRAPH
+ {0xCAEB, 0x5B70}, //12635 #CJK UNIFIED IDEOGRAPH
+ {0xCAEC, 0x719F}, //12636 #CJK UNIFIED IDEOGRAPH
+ {0xCAED, 0x85AF}, //12637 #CJK UNIFIED IDEOGRAPH
+ {0xCAEE, 0x6691}, //12638 #CJK UNIFIED IDEOGRAPH
+ {0xCAEF, 0x66D9}, //12639 #CJK UNIFIED IDEOGRAPH
+ {0xCAF0, 0x7F72}, //12640 #CJK UNIFIED IDEOGRAPH
+ {0xCAF1, 0x8700}, //12641 #CJK UNIFIED IDEOGRAPH
+ {0xCAF2, 0x9ECD}, //12642 #CJK UNIFIED IDEOGRAPH
+ {0xCAF3, 0x9F20}, //12643 #CJK UNIFIED IDEOGRAPH
+ {0xCAF4, 0x5C5E}, //12644 #CJK UNIFIED IDEOGRAPH
+ {0xCAF5, 0x672F}, //12645 #CJK UNIFIED IDEOGRAPH
+ {0xCAF6, 0x8FF0}, //12646 #CJK UNIFIED IDEOGRAPH
+ {0xCAF7, 0x6811}, //12647 #CJK UNIFIED IDEOGRAPH
+ {0xCAF8, 0x675F}, //12648 #CJK UNIFIED IDEOGRAPH
+ {0xCAF9, 0x620D}, //12649 #CJK UNIFIED IDEOGRAPH
+ {0xCAFA, 0x7AD6}, //12650 #CJK UNIFIED IDEOGRAPH
+ {0xCAFB, 0x5885}, //12651 #CJK UNIFIED IDEOGRAPH
+ {0xCAFC, 0x5EB6}, //12652 #CJK UNIFIED IDEOGRAPH
+ {0xCAFD, 0x6570}, //12653 #CJK UNIFIED IDEOGRAPH
+ {0xCAFE, 0x6F31}, //12654 #CJK UNIFIED IDEOGRAPH
+ {0xCB40, 0x8582}, //12655 #CJK UNIFIED IDEOGRAPH
+ {0xCB41, 0x8583}, //12656 #CJK UNIFIED IDEOGRAPH
+ {0xCB42, 0x8586}, //12657 #CJK UNIFIED IDEOGRAPH
+ {0xCB43, 0x8588}, //12658 #CJK UNIFIED IDEOGRAPH
+ {0xCB44, 0x8589}, //12659 #CJK UNIFIED IDEOGRAPH
+ {0xCB45, 0x858A}, //12660 #CJK UNIFIED IDEOGRAPH
+ {0xCB46, 0x858B}, //12661 #CJK UNIFIED IDEOGRAPH
+ {0xCB47, 0x858C}, //12662 #CJK UNIFIED IDEOGRAPH
+ {0xCB48, 0x858D}, //12663 #CJK UNIFIED IDEOGRAPH
+ {0xCB49, 0x858E}, //12664 #CJK UNIFIED IDEOGRAPH
+ {0xCB4A, 0x8590}, //12665 #CJK UNIFIED IDEOGRAPH
+ {0xCB4B, 0x8591}, //12666 #CJK UNIFIED IDEOGRAPH
+ {0xCB4C, 0x8592}, //12667 #CJK UNIFIED IDEOGRAPH
+ {0xCB4D, 0x8593}, //12668 #CJK UNIFIED IDEOGRAPH
+ {0xCB4E, 0x8594}, //12669 #CJK UNIFIED IDEOGRAPH
+ {0xCB4F, 0x8595}, //12670 #CJK UNIFIED IDEOGRAPH
+ {0xCB50, 0x8596}, //12671 #CJK UNIFIED IDEOGRAPH
+ {0xCB51, 0x8597}, //12672 #CJK UNIFIED IDEOGRAPH
+ {0xCB52, 0x8598}, //12673 #CJK UNIFIED IDEOGRAPH
+ {0xCB53, 0x8599}, //12674 #CJK UNIFIED IDEOGRAPH
+ {0xCB54, 0x859A}, //12675 #CJK UNIFIED IDEOGRAPH
+ {0xCB55, 0x859D}, //12676 #CJK UNIFIED IDEOGRAPH
+ {0xCB56, 0x859E}, //12677 #CJK UNIFIED IDEOGRAPH
+ {0xCB57, 0x859F}, //12678 #CJK UNIFIED IDEOGRAPH
+ {0xCB58, 0x85A0}, //12679 #CJK UNIFIED IDEOGRAPH
+ {0xCB59, 0x85A1}, //12680 #CJK UNIFIED IDEOGRAPH
+ {0xCB5A, 0x85A2}, //12681 #CJK UNIFIED IDEOGRAPH
+ {0xCB5B, 0x85A3}, //12682 #CJK UNIFIED IDEOGRAPH
+ {0xCB5C, 0x85A5}, //12683 #CJK UNIFIED IDEOGRAPH
+ {0xCB5D, 0x85A6}, //12684 #CJK UNIFIED IDEOGRAPH
+ {0xCB5E, 0x85A7}, //12685 #CJK UNIFIED IDEOGRAPH
+ {0xCB5F, 0x85A9}, //12686 #CJK UNIFIED IDEOGRAPH
+ {0xCB60, 0x85AB}, //12687 #CJK UNIFIED IDEOGRAPH
+ {0xCB61, 0x85AC}, //12688 #CJK UNIFIED IDEOGRAPH
+ {0xCB62, 0x85AD}, //12689 #CJK UNIFIED IDEOGRAPH
+ {0xCB63, 0x85B1}, //12690 #CJK UNIFIED IDEOGRAPH
+ {0xCB64, 0x85B2}, //12691 #CJK UNIFIED IDEOGRAPH
+ {0xCB65, 0x85B3}, //12692 #CJK UNIFIED IDEOGRAPH
+ {0xCB66, 0x85B4}, //12693 #CJK UNIFIED IDEOGRAPH
+ {0xCB67, 0x85B5}, //12694 #CJK UNIFIED IDEOGRAPH
+ {0xCB68, 0x85B6}, //12695 #CJK UNIFIED IDEOGRAPH
+ {0xCB69, 0x85B8}, //12696 #CJK UNIFIED IDEOGRAPH
+ {0xCB6A, 0x85BA}, //12697 #CJK UNIFIED IDEOGRAPH
+ {0xCB6B, 0x85BB}, //12698 #CJK UNIFIED IDEOGRAPH
+ {0xCB6C, 0x85BC}, //12699 #CJK UNIFIED IDEOGRAPH
+ {0xCB6D, 0x85BD}, //12700 #CJK UNIFIED IDEOGRAPH
+ {0xCB6E, 0x85BE}, //12701 #CJK UNIFIED IDEOGRAPH
+ {0xCB6F, 0x85BF}, //12702 #CJK UNIFIED IDEOGRAPH
+ {0xCB70, 0x85C0}, //12703 #CJK UNIFIED IDEOGRAPH
+ {0xCB71, 0x85C2}, //12704 #CJK UNIFIED IDEOGRAPH
+ {0xCB72, 0x85C3}, //12705 #CJK UNIFIED IDEOGRAPH
+ {0xCB73, 0x85C4}, //12706 #CJK UNIFIED IDEOGRAPH
+ {0xCB74, 0x85C5}, //12707 #CJK UNIFIED IDEOGRAPH
+ {0xCB75, 0x85C6}, //12708 #CJK UNIFIED IDEOGRAPH
+ {0xCB76, 0x85C7}, //12709 #CJK UNIFIED IDEOGRAPH
+ {0xCB77, 0x85C8}, //12710 #CJK UNIFIED IDEOGRAPH
+ {0xCB78, 0x85CA}, //12711 #CJK UNIFIED IDEOGRAPH
+ {0xCB79, 0x85CB}, //12712 #CJK UNIFIED IDEOGRAPH
+ {0xCB7A, 0x85CC}, //12713 #CJK UNIFIED IDEOGRAPH
+ {0xCB7B, 0x85CD}, //12714 #CJK UNIFIED IDEOGRAPH
+ {0xCB7C, 0x85CE}, //12715 #CJK UNIFIED IDEOGRAPH
+ {0xCB7D, 0x85D1}, //12716 #CJK UNIFIED IDEOGRAPH
+ {0xCB7E, 0x85D2}, //12717 #CJK UNIFIED IDEOGRAPH
+ {0xCB80, 0x85D4}, //12718 #CJK UNIFIED IDEOGRAPH
+ {0xCB81, 0x85D6}, //12719 #CJK UNIFIED IDEOGRAPH
+ {0xCB82, 0x85D7}, //12720 #CJK UNIFIED IDEOGRAPH
+ {0xCB83, 0x85D8}, //12721 #CJK UNIFIED IDEOGRAPH
+ {0xCB84, 0x85D9}, //12722 #CJK UNIFIED IDEOGRAPH
+ {0xCB85, 0x85DA}, //12723 #CJK UNIFIED IDEOGRAPH
+ {0xCB86, 0x85DB}, //12724 #CJK UNIFIED IDEOGRAPH
+ {0xCB87, 0x85DD}, //12725 #CJK UNIFIED IDEOGRAPH
+ {0xCB88, 0x85DE}, //12726 #CJK UNIFIED IDEOGRAPH
+ {0xCB89, 0x85DF}, //12727 #CJK UNIFIED IDEOGRAPH
+ {0xCB8A, 0x85E0}, //12728 #CJK UNIFIED IDEOGRAPH
+ {0xCB8B, 0x85E1}, //12729 #CJK UNIFIED IDEOGRAPH
+ {0xCB8C, 0x85E2}, //12730 #CJK UNIFIED IDEOGRAPH
+ {0xCB8D, 0x85E3}, //12731 #CJK UNIFIED IDEOGRAPH
+ {0xCB8E, 0x85E5}, //12732 #CJK UNIFIED IDEOGRAPH
+ {0xCB8F, 0x85E6}, //12733 #CJK UNIFIED IDEOGRAPH
+ {0xCB90, 0x85E7}, //12734 #CJK UNIFIED IDEOGRAPH
+ {0xCB91, 0x85E8}, //12735 #CJK UNIFIED IDEOGRAPH
+ {0xCB92, 0x85EA}, //12736 #CJK UNIFIED IDEOGRAPH
+ {0xCB93, 0x85EB}, //12737 #CJK UNIFIED IDEOGRAPH
+ {0xCB94, 0x85EC}, //12738 #CJK UNIFIED IDEOGRAPH
+ {0xCB95, 0x85ED}, //12739 #CJK UNIFIED IDEOGRAPH
+ {0xCB96, 0x85EE}, //12740 #CJK UNIFIED IDEOGRAPH
+ {0xCB97, 0x85EF}, //12741 #CJK UNIFIED IDEOGRAPH
+ {0xCB98, 0x85F0}, //12742 #CJK UNIFIED IDEOGRAPH
+ {0xCB99, 0x85F1}, //12743 #CJK UNIFIED IDEOGRAPH
+ {0xCB9A, 0x85F2}, //12744 #CJK UNIFIED IDEOGRAPH
+ {0xCB9B, 0x85F3}, //12745 #CJK UNIFIED IDEOGRAPH
+ {0xCB9C, 0x85F4}, //12746 #CJK UNIFIED IDEOGRAPH
+ {0xCB9D, 0x85F5}, //12747 #CJK UNIFIED IDEOGRAPH
+ {0xCB9E, 0x85F6}, //12748 #CJK UNIFIED IDEOGRAPH
+ {0xCB9F, 0x85F7}, //12749 #CJK UNIFIED IDEOGRAPH
+ {0xCBA0, 0x85F8}, //12750 #CJK UNIFIED IDEOGRAPH
+ {0xCBA1, 0x6055}, //12751 #CJK UNIFIED IDEOGRAPH
+ {0xCBA2, 0x5237}, //12752 #CJK UNIFIED IDEOGRAPH
+ {0xCBA3, 0x800D}, //12753 #CJK UNIFIED IDEOGRAPH
+ {0xCBA4, 0x6454}, //12754 #CJK UNIFIED IDEOGRAPH
+ {0xCBA5, 0x8870}, //12755 #CJK UNIFIED IDEOGRAPH
+ {0xCBA6, 0x7529}, //12756 #CJK UNIFIED IDEOGRAPH
+ {0xCBA7, 0x5E05}, //12757 #CJK UNIFIED IDEOGRAPH
+ {0xCBA8, 0x6813}, //12758 #CJK UNIFIED IDEOGRAPH
+ {0xCBA9, 0x62F4}, //12759 #CJK UNIFIED IDEOGRAPH
+ {0xCBAA, 0x971C}, //12760 #CJK UNIFIED IDEOGRAPH
+ {0xCBAB, 0x53CC}, //12761 #CJK UNIFIED IDEOGRAPH
+ {0xCBAC, 0x723D}, //12762 #CJK UNIFIED IDEOGRAPH
+ {0xCBAD, 0x8C01}, //12763 #CJK UNIFIED IDEOGRAPH
+ {0xCBAE, 0x6C34}, //12764 #CJK UNIFIED IDEOGRAPH
+ {0xCBAF, 0x7761}, //12765 #CJK UNIFIED IDEOGRAPH
+ {0xCBB0, 0x7A0E}, //12766 #CJK UNIFIED IDEOGRAPH
+ {0xCBB1, 0x542E}, //12767 #CJK UNIFIED IDEOGRAPH
+ {0xCBB2, 0x77AC}, //12768 #CJK UNIFIED IDEOGRAPH
+ {0xCBB3, 0x987A}, //12769 #CJK UNIFIED IDEOGRAPH
+ {0xCBB4, 0x821C}, //12770 #CJK UNIFIED IDEOGRAPH
+ {0xCBB5, 0x8BF4}, //12771 #CJK UNIFIED IDEOGRAPH
+ {0xCBB6, 0x7855}, //12772 #CJK UNIFIED IDEOGRAPH
+ {0xCBB7, 0x6714}, //12773 #CJK UNIFIED IDEOGRAPH
+ {0xCBB8, 0x70C1}, //12774 #CJK UNIFIED IDEOGRAPH
+ {0xCBB9, 0x65AF}, //12775 #CJK UNIFIED IDEOGRAPH
+ {0xCBBA, 0x6495}, //12776 #CJK UNIFIED IDEOGRAPH
+ {0xCBBB, 0x5636}, //12777 #CJK UNIFIED IDEOGRAPH
+ {0xCBBC, 0x601D}, //12778 #CJK UNIFIED IDEOGRAPH
+ {0xCBBD, 0x79C1}, //12779 #CJK UNIFIED IDEOGRAPH
+ {0xCBBE, 0x53F8}, //12780 #CJK UNIFIED IDEOGRAPH
+ {0xCBBF, 0x4E1D}, //12781 #CJK UNIFIED IDEOGRAPH
+ {0xCBC0, 0x6B7B}, //12782 #CJK UNIFIED IDEOGRAPH
+ {0xCBC1, 0x8086}, //12783 #CJK UNIFIED IDEOGRAPH
+ {0xCBC2, 0x5BFA}, //12784 #CJK UNIFIED IDEOGRAPH
+ {0xCBC3, 0x55E3}, //12785 #CJK UNIFIED IDEOGRAPH
+ {0xCBC4, 0x56DB}, //12786 #CJK UNIFIED IDEOGRAPH
+ {0xCBC5, 0x4F3A}, //12787 #CJK UNIFIED IDEOGRAPH
+ {0xCBC6, 0x4F3C}, //12788 #CJK UNIFIED IDEOGRAPH
+ {0xCBC7, 0x9972}, //12789 #CJK UNIFIED IDEOGRAPH
+ {0xCBC8, 0x5DF3}, //12790 #CJK UNIFIED IDEOGRAPH
+ {0xCBC9, 0x677E}, //12791 #CJK UNIFIED IDEOGRAPH
+ {0xCBCA, 0x8038}, //12792 #CJK UNIFIED IDEOGRAPH
+ {0xCBCB, 0x6002}, //12793 #CJK UNIFIED IDEOGRAPH
+ {0xCBCC, 0x9882}, //12794 #CJK UNIFIED IDEOGRAPH
+ {0xCBCD, 0x9001}, //12795 #CJK UNIFIED IDEOGRAPH
+ {0xCBCE, 0x5B8B}, //12796 #CJK UNIFIED IDEOGRAPH
+ {0xCBCF, 0x8BBC}, //12797 #CJK UNIFIED IDEOGRAPH
+ {0xCBD0, 0x8BF5}, //12798 #CJK UNIFIED IDEOGRAPH
+ {0xCBD1, 0x641C}, //12799 #CJK UNIFIED IDEOGRAPH
+ {0xCBD2, 0x8258}, //12800 #CJK UNIFIED IDEOGRAPH
+ {0xCBD3, 0x64DE}, //12801 #CJK UNIFIED IDEOGRAPH
+ {0xCBD4, 0x55FD}, //12802 #CJK UNIFIED IDEOGRAPH
+ {0xCBD5, 0x82CF}, //12803 #CJK UNIFIED IDEOGRAPH
+ {0xCBD6, 0x9165}, //12804 #CJK UNIFIED IDEOGRAPH
+ {0xCBD7, 0x4FD7}, //12805 #CJK UNIFIED IDEOGRAPH
+ {0xCBD8, 0x7D20}, //12806 #CJK UNIFIED IDEOGRAPH
+ {0xCBD9, 0x901F}, //12807 #CJK UNIFIED IDEOGRAPH
+ {0xCBDA, 0x7C9F}, //12808 #CJK UNIFIED IDEOGRAPH
+ {0xCBDB, 0x50F3}, //12809 #CJK UNIFIED IDEOGRAPH
+ {0xCBDC, 0x5851}, //12810 #CJK UNIFIED IDEOGRAPH
+ {0xCBDD, 0x6EAF}, //12811 #CJK UNIFIED IDEOGRAPH
+ {0xCBDE, 0x5BBF}, //12812 #CJK UNIFIED IDEOGRAPH
+ {0xCBDF, 0x8BC9}, //12813 #CJK UNIFIED IDEOGRAPH
+ {0xCBE0, 0x8083}, //12814 #CJK UNIFIED IDEOGRAPH
+ {0xCBE1, 0x9178}, //12815 #CJK UNIFIED IDEOGRAPH
+ {0xCBE2, 0x849C}, //12816 #CJK UNIFIED IDEOGRAPH
+ {0xCBE3, 0x7B97}, //12817 #CJK UNIFIED IDEOGRAPH
+ {0xCBE4, 0x867D}, //12818 #CJK UNIFIED IDEOGRAPH
+ {0xCBE5, 0x968B}, //12819 #CJK UNIFIED IDEOGRAPH
+ {0xCBE6, 0x968F}, //12820 #CJK UNIFIED IDEOGRAPH
+ {0xCBE7, 0x7EE5}, //12821 #CJK UNIFIED IDEOGRAPH
+ {0xCBE8, 0x9AD3}, //12822 #CJK UNIFIED IDEOGRAPH
+ {0xCBE9, 0x788E}, //12823 #CJK UNIFIED IDEOGRAPH
+ {0xCBEA, 0x5C81}, //12824 #CJK UNIFIED IDEOGRAPH
+ {0xCBEB, 0x7A57}, //12825 #CJK UNIFIED IDEOGRAPH
+ {0xCBEC, 0x9042}, //12826 #CJK UNIFIED IDEOGRAPH
+ {0xCBED, 0x96A7}, //12827 #CJK UNIFIED IDEOGRAPH
+ {0xCBEE, 0x795F}, //12828 #CJK UNIFIED IDEOGRAPH
+ {0xCBEF, 0x5B59}, //12829 #CJK UNIFIED IDEOGRAPH
+ {0xCBF0, 0x635F}, //12830 #CJK UNIFIED IDEOGRAPH
+ {0xCBF1, 0x7B0B}, //12831 #CJK UNIFIED IDEOGRAPH
+ {0xCBF2, 0x84D1}, //12832 #CJK UNIFIED IDEOGRAPH
+ {0xCBF3, 0x68AD}, //12833 #CJK UNIFIED IDEOGRAPH
+ {0xCBF4, 0x5506}, //12834 #CJK UNIFIED IDEOGRAPH
+ {0xCBF5, 0x7F29}, //12835 #CJK UNIFIED IDEOGRAPH
+ {0xCBF6, 0x7410}, //12836 #CJK UNIFIED IDEOGRAPH
+ {0xCBF7, 0x7D22}, //12837 #CJK UNIFIED IDEOGRAPH
+ {0xCBF8, 0x9501}, //12838 #CJK UNIFIED IDEOGRAPH
+ {0xCBF9, 0x6240}, //12839 #CJK UNIFIED IDEOGRAPH
+ {0xCBFA, 0x584C}, //12840 #CJK UNIFIED IDEOGRAPH
+ {0xCBFB, 0x4ED6}, //12841 #CJK UNIFIED IDEOGRAPH
+ {0xCBFC, 0x5B83}, //12842 #CJK UNIFIED IDEOGRAPH
+ {0xCBFD, 0x5979}, //12843 #CJK UNIFIED IDEOGRAPH
+ {0xCBFE, 0x5854}, //12844 #CJK UNIFIED IDEOGRAPH
+ {0xCC40, 0x85F9}, //12845 #CJK UNIFIED IDEOGRAPH
+ {0xCC41, 0x85FA}, //12846 #CJK UNIFIED IDEOGRAPH
+ {0xCC42, 0x85FC}, //12847 #CJK UNIFIED IDEOGRAPH
+ {0xCC43, 0x85FD}, //12848 #CJK UNIFIED IDEOGRAPH
+ {0xCC44, 0x85FE}, //12849 #CJK UNIFIED IDEOGRAPH
+ {0xCC45, 0x8600}, //12850 #CJK UNIFIED IDEOGRAPH
+ {0xCC46, 0x8601}, //12851 #CJK UNIFIED IDEOGRAPH
+ {0xCC47, 0x8602}, //12852 #CJK UNIFIED IDEOGRAPH
+ {0xCC48, 0x8603}, //12853 #CJK UNIFIED IDEOGRAPH
+ {0xCC49, 0x8604}, //12854 #CJK UNIFIED IDEOGRAPH
+ {0xCC4A, 0x8606}, //12855 #CJK UNIFIED IDEOGRAPH
+ {0xCC4B, 0x8607}, //12856 #CJK UNIFIED IDEOGRAPH
+ {0xCC4C, 0x8608}, //12857 #CJK UNIFIED IDEOGRAPH
+ {0xCC4D, 0x8609}, //12858 #CJK UNIFIED IDEOGRAPH
+ {0xCC4E, 0x860A}, //12859 #CJK UNIFIED IDEOGRAPH
+ {0xCC4F, 0x860B}, //12860 #CJK UNIFIED IDEOGRAPH
+ {0xCC50, 0x860C}, //12861 #CJK UNIFIED IDEOGRAPH
+ {0xCC51, 0x860D}, //12862 #CJK UNIFIED IDEOGRAPH
+ {0xCC52, 0x860E}, //12863 #CJK UNIFIED IDEOGRAPH
+ {0xCC53, 0x860F}, //12864 #CJK UNIFIED IDEOGRAPH
+ {0xCC54, 0x8610}, //12865 #CJK UNIFIED IDEOGRAPH
+ {0xCC55, 0x8612}, //12866 #CJK UNIFIED IDEOGRAPH
+ {0xCC56, 0x8613}, //12867 #CJK UNIFIED IDEOGRAPH
+ {0xCC57, 0x8614}, //12868 #CJK UNIFIED IDEOGRAPH
+ {0xCC58, 0x8615}, //12869 #CJK UNIFIED IDEOGRAPH
+ {0xCC59, 0x8617}, //12870 #CJK UNIFIED IDEOGRAPH
+ {0xCC5A, 0x8618}, //12871 #CJK UNIFIED IDEOGRAPH
+ {0xCC5B, 0x8619}, //12872 #CJK UNIFIED IDEOGRAPH
+ {0xCC5C, 0x861A}, //12873 #CJK UNIFIED IDEOGRAPH
+ {0xCC5D, 0x861B}, //12874 #CJK UNIFIED IDEOGRAPH
+ {0xCC5E, 0x861C}, //12875 #CJK UNIFIED IDEOGRAPH
+ {0xCC5F, 0x861D}, //12876 #CJK UNIFIED IDEOGRAPH
+ {0xCC60, 0x861E}, //12877 #CJK UNIFIED IDEOGRAPH
+ {0xCC61, 0x861F}, //12878 #CJK UNIFIED IDEOGRAPH
+ {0xCC62, 0x8620}, //12879 #CJK UNIFIED IDEOGRAPH
+ {0xCC63, 0x8621}, //12880 #CJK UNIFIED IDEOGRAPH
+ {0xCC64, 0x8622}, //12881 #CJK UNIFIED IDEOGRAPH
+ {0xCC65, 0x8623}, //12882 #CJK UNIFIED IDEOGRAPH
+ {0xCC66, 0x8624}, //12883 #CJK UNIFIED IDEOGRAPH
+ {0xCC67, 0x8625}, //12884 #CJK UNIFIED IDEOGRAPH
+ {0xCC68, 0x8626}, //12885 #CJK UNIFIED IDEOGRAPH
+ {0xCC69, 0x8628}, //12886 #CJK UNIFIED IDEOGRAPH
+ {0xCC6A, 0x862A}, //12887 #CJK UNIFIED IDEOGRAPH
+ {0xCC6B, 0x862B}, //12888 #CJK UNIFIED IDEOGRAPH
+ {0xCC6C, 0x862C}, //12889 #CJK UNIFIED IDEOGRAPH
+ {0xCC6D, 0x862D}, //12890 #CJK UNIFIED IDEOGRAPH
+ {0xCC6E, 0x862E}, //12891 #CJK UNIFIED IDEOGRAPH
+ {0xCC6F, 0x862F}, //12892 #CJK UNIFIED IDEOGRAPH
+ {0xCC70, 0x8630}, //12893 #CJK UNIFIED IDEOGRAPH
+ {0xCC71, 0x8631}, //12894 #CJK UNIFIED IDEOGRAPH
+ {0xCC72, 0x8632}, //12895 #CJK UNIFIED IDEOGRAPH
+ {0xCC73, 0x8633}, //12896 #CJK UNIFIED IDEOGRAPH
+ {0xCC74, 0x8634}, //12897 #CJK UNIFIED IDEOGRAPH
+ {0xCC75, 0x8635}, //12898 #CJK UNIFIED IDEOGRAPH
+ {0xCC76, 0x8636}, //12899 #CJK UNIFIED IDEOGRAPH
+ {0xCC77, 0x8637}, //12900 #CJK UNIFIED IDEOGRAPH
+ {0xCC78, 0x8639}, //12901 #CJK UNIFIED IDEOGRAPH
+ {0xCC79, 0x863A}, //12902 #CJK UNIFIED IDEOGRAPH
+ {0xCC7A, 0x863B}, //12903 #CJK UNIFIED IDEOGRAPH
+ {0xCC7B, 0x863D}, //12904 #CJK UNIFIED IDEOGRAPH
+ {0xCC7C, 0x863E}, //12905 #CJK UNIFIED IDEOGRAPH
+ {0xCC7D, 0x863F}, //12906 #CJK UNIFIED IDEOGRAPH
+ {0xCC7E, 0x8640}, //12907 #CJK UNIFIED IDEOGRAPH
+ {0xCC80, 0x8641}, //12908 #CJK UNIFIED IDEOGRAPH
+ {0xCC81, 0x8642}, //12909 #CJK UNIFIED IDEOGRAPH
+ {0xCC82, 0x8643}, //12910 #CJK UNIFIED IDEOGRAPH
+ {0xCC83, 0x8644}, //12911 #CJK UNIFIED IDEOGRAPH
+ {0xCC84, 0x8645}, //12912 #CJK UNIFIED IDEOGRAPH
+ {0xCC85, 0x8646}, //12913 #CJK UNIFIED IDEOGRAPH
+ {0xCC86, 0x8647}, //12914 #CJK UNIFIED IDEOGRAPH
+ {0xCC87, 0x8648}, //12915 #CJK UNIFIED IDEOGRAPH
+ {0xCC88, 0x8649}, //12916 #CJK UNIFIED IDEOGRAPH
+ {0xCC89, 0x864A}, //12917 #CJK UNIFIED IDEOGRAPH
+ {0xCC8A, 0x864B}, //12918 #CJK UNIFIED IDEOGRAPH
+ {0xCC8B, 0x864C}, //12919 #CJK UNIFIED IDEOGRAPH
+ {0xCC8C, 0x8652}, //12920 #CJK UNIFIED IDEOGRAPH
+ {0xCC8D, 0x8653}, //12921 #CJK UNIFIED IDEOGRAPH
+ {0xCC8E, 0x8655}, //12922 #CJK UNIFIED IDEOGRAPH
+ {0xCC8F, 0x8656}, //12923 #CJK UNIFIED IDEOGRAPH
+ {0xCC90, 0x8657}, //12924 #CJK UNIFIED IDEOGRAPH
+ {0xCC91, 0x8658}, //12925 #CJK UNIFIED IDEOGRAPH
+ {0xCC92, 0x8659}, //12926 #CJK UNIFIED IDEOGRAPH
+ {0xCC93, 0x865B}, //12927 #CJK UNIFIED IDEOGRAPH
+ {0xCC94, 0x865C}, //12928 #CJK UNIFIED IDEOGRAPH
+ {0xCC95, 0x865D}, //12929 #CJK UNIFIED IDEOGRAPH
+ {0xCC96, 0x865F}, //12930 #CJK UNIFIED IDEOGRAPH
+ {0xCC97, 0x8660}, //12931 #CJK UNIFIED IDEOGRAPH
+ {0xCC98, 0x8661}, //12932 #CJK UNIFIED IDEOGRAPH
+ {0xCC99, 0x8663}, //12933 #CJK UNIFIED IDEOGRAPH
+ {0xCC9A, 0x8664}, //12934 #CJK UNIFIED IDEOGRAPH
+ {0xCC9B, 0x8665}, //12935 #CJK UNIFIED IDEOGRAPH
+ {0xCC9C, 0x8666}, //12936 #CJK UNIFIED IDEOGRAPH
+ {0xCC9D, 0x8667}, //12937 #CJK UNIFIED IDEOGRAPH
+ {0xCC9E, 0x8668}, //12938 #CJK UNIFIED IDEOGRAPH
+ {0xCC9F, 0x8669}, //12939 #CJK UNIFIED IDEOGRAPH
+ {0xCCA0, 0x866A}, //12940 #CJK UNIFIED IDEOGRAPH
+ {0xCCA1, 0x736D}, //12941 #CJK UNIFIED IDEOGRAPH
+ {0xCCA2, 0x631E}, //12942 #CJK UNIFIED IDEOGRAPH
+ {0xCCA3, 0x8E4B}, //12943 #CJK UNIFIED IDEOGRAPH
+ {0xCCA4, 0x8E0F}, //12944 #CJK UNIFIED IDEOGRAPH
+ {0xCCA5, 0x80CE}, //12945 #CJK UNIFIED IDEOGRAPH
+ {0xCCA6, 0x82D4}, //12946 #CJK UNIFIED IDEOGRAPH
+ {0xCCA7, 0x62AC}, //12947 #CJK UNIFIED IDEOGRAPH
+ {0xCCA8, 0x53F0}, //12948 #CJK UNIFIED IDEOGRAPH
+ {0xCCA9, 0x6CF0}, //12949 #CJK UNIFIED IDEOGRAPH
+ {0xCCAA, 0x915E}, //12950 #CJK UNIFIED IDEOGRAPH
+ {0xCCAB, 0x592A}, //12951 #CJK UNIFIED IDEOGRAPH
+ {0xCCAC, 0x6001}, //12952 #CJK UNIFIED IDEOGRAPH
+ {0xCCAD, 0x6C70}, //12953 #CJK UNIFIED IDEOGRAPH
+ {0xCCAE, 0x574D}, //12954 #CJK UNIFIED IDEOGRAPH
+ {0xCCAF, 0x644A}, //12955 #CJK UNIFIED IDEOGRAPH
+ {0xCCB0, 0x8D2A}, //12956 #CJK UNIFIED IDEOGRAPH
+ {0xCCB1, 0x762B}, //12957 #CJK UNIFIED IDEOGRAPH
+ {0xCCB2, 0x6EE9}, //12958 #CJK UNIFIED IDEOGRAPH
+ {0xCCB3, 0x575B}, //12959 #CJK UNIFIED IDEOGRAPH
+ {0xCCB4, 0x6A80}, //12960 #CJK UNIFIED IDEOGRAPH
+ {0xCCB5, 0x75F0}, //12961 #CJK UNIFIED IDEOGRAPH
+ {0xCCB6, 0x6F6D}, //12962 #CJK UNIFIED IDEOGRAPH
+ {0xCCB7, 0x8C2D}, //12963 #CJK UNIFIED IDEOGRAPH
+ {0xCCB8, 0x8C08}, //12964 #CJK UNIFIED IDEOGRAPH
+ {0xCCB9, 0x5766}, //12965 #CJK UNIFIED IDEOGRAPH
+ {0xCCBA, 0x6BEF}, //12966 #CJK UNIFIED IDEOGRAPH
+ {0xCCBB, 0x8892}, //12967 #CJK UNIFIED IDEOGRAPH
+ {0xCCBC, 0x78B3}, //12968 #CJK UNIFIED IDEOGRAPH
+ {0xCCBD, 0x63A2}, //12969 #CJK UNIFIED IDEOGRAPH
+ {0xCCBE, 0x53F9}, //12970 #CJK UNIFIED IDEOGRAPH
+ {0xCCBF, 0x70AD}, //12971 #CJK UNIFIED IDEOGRAPH
+ {0xCCC0, 0x6C64}, //12972 #CJK UNIFIED IDEOGRAPH
+ {0xCCC1, 0x5858}, //12973 #CJK UNIFIED IDEOGRAPH
+ {0xCCC2, 0x642A}, //12974 #CJK UNIFIED IDEOGRAPH
+ {0xCCC3, 0x5802}, //12975 #CJK UNIFIED IDEOGRAPH
+ {0xCCC4, 0x68E0}, //12976 #CJK UNIFIED IDEOGRAPH
+ {0xCCC5, 0x819B}, //12977 #CJK UNIFIED IDEOGRAPH
+ {0xCCC6, 0x5510}, //12978 #CJK UNIFIED IDEOGRAPH
+ {0xCCC7, 0x7CD6}, //12979 #CJK UNIFIED IDEOGRAPH
+ {0xCCC8, 0x5018}, //12980 #CJK UNIFIED IDEOGRAPH
+ {0xCCC9, 0x8EBA}, //12981 #CJK UNIFIED IDEOGRAPH
+ {0xCCCA, 0x6DCC}, //12982 #CJK UNIFIED IDEOGRAPH
+ {0xCCCB, 0x8D9F}, //12983 #CJK UNIFIED IDEOGRAPH
+ {0xCCCC, 0x70EB}, //12984 #CJK UNIFIED IDEOGRAPH
+ {0xCCCD, 0x638F}, //12985 #CJK UNIFIED IDEOGRAPH
+ {0xCCCE, 0x6D9B}, //12986 #CJK UNIFIED IDEOGRAPH
+ {0xCCCF, 0x6ED4}, //12987 #CJK UNIFIED IDEOGRAPH
+ {0xCCD0, 0x7EE6}, //12988 #CJK UNIFIED IDEOGRAPH
+ {0xCCD1, 0x8404}, //12989 #CJK UNIFIED IDEOGRAPH
+ {0xCCD2, 0x6843}, //12990 #CJK UNIFIED IDEOGRAPH
+ {0xCCD3, 0x9003}, //12991 #CJK UNIFIED IDEOGRAPH
+ {0xCCD4, 0x6DD8}, //12992 #CJK UNIFIED IDEOGRAPH
+ {0xCCD5, 0x9676}, //12993 #CJK UNIFIED IDEOGRAPH
+ {0xCCD6, 0x8BA8}, //12994 #CJK UNIFIED IDEOGRAPH
+ {0xCCD7, 0x5957}, //12995 #CJK UNIFIED IDEOGRAPH
+ {0xCCD8, 0x7279}, //12996 #CJK UNIFIED IDEOGRAPH
+ {0xCCD9, 0x85E4}, //12997 #CJK UNIFIED IDEOGRAPH
+ {0xCCDA, 0x817E}, //12998 #CJK UNIFIED IDEOGRAPH
+ {0xCCDB, 0x75BC}, //12999 #CJK UNIFIED IDEOGRAPH
+ {0xCCDC, 0x8A8A}, //13000 #CJK UNIFIED IDEOGRAPH
+ {0xCCDD, 0x68AF}, //13001 #CJK UNIFIED IDEOGRAPH
+ {0xCCDE, 0x5254}, //13002 #CJK UNIFIED IDEOGRAPH
+ {0xCCDF, 0x8E22}, //13003 #CJK UNIFIED IDEOGRAPH
+ {0xCCE0, 0x9511}, //13004 #CJK UNIFIED IDEOGRAPH
+ {0xCCE1, 0x63D0}, //13005 #CJK UNIFIED IDEOGRAPH
+ {0xCCE2, 0x9898}, //13006 #CJK UNIFIED IDEOGRAPH
+ {0xCCE3, 0x8E44}, //13007 #CJK UNIFIED IDEOGRAPH
+ {0xCCE4, 0x557C}, //13008 #CJK UNIFIED IDEOGRAPH
+ {0xCCE5, 0x4F53}, //13009 #CJK UNIFIED IDEOGRAPH
+ {0xCCE6, 0x66FF}, //13010 #CJK UNIFIED IDEOGRAPH
+ {0xCCE7, 0x568F}, //13011 #CJK UNIFIED IDEOGRAPH
+ {0xCCE8, 0x60D5}, //13012 #CJK UNIFIED IDEOGRAPH
+ {0xCCE9, 0x6D95}, //13013 #CJK UNIFIED IDEOGRAPH
+ {0xCCEA, 0x5243}, //13014 #CJK UNIFIED IDEOGRAPH
+ {0xCCEB, 0x5C49}, //13015 #CJK UNIFIED IDEOGRAPH
+ {0xCCEC, 0x5929}, //13016 #CJK UNIFIED IDEOGRAPH
+ {0xCCED, 0x6DFB}, //13017 #CJK UNIFIED IDEOGRAPH
+ {0xCCEE, 0x586B}, //13018 #CJK UNIFIED IDEOGRAPH
+ {0xCCEF, 0x7530}, //13019 #CJK UNIFIED IDEOGRAPH
+ {0xCCF0, 0x751C}, //13020 #CJK UNIFIED IDEOGRAPH
+ {0xCCF1, 0x606C}, //13021 #CJK UNIFIED IDEOGRAPH
+ {0xCCF2, 0x8214}, //13022 #CJK UNIFIED IDEOGRAPH
+ {0xCCF3, 0x8146}, //13023 #CJK UNIFIED IDEOGRAPH
+ {0xCCF4, 0x6311}, //13024 #CJK UNIFIED IDEOGRAPH
+ {0xCCF5, 0x6761}, //13025 #CJK UNIFIED IDEOGRAPH
+ {0xCCF6, 0x8FE2}, //13026 #CJK UNIFIED IDEOGRAPH
+ {0xCCF7, 0x773A}, //13027 #CJK UNIFIED IDEOGRAPH
+ {0xCCF8, 0x8DF3}, //13028 #CJK UNIFIED IDEOGRAPH
+ {0xCCF9, 0x8D34}, //13029 #CJK UNIFIED IDEOGRAPH
+ {0xCCFA, 0x94C1}, //13030 #CJK UNIFIED IDEOGRAPH
+ {0xCCFB, 0x5E16}, //13031 #CJK UNIFIED IDEOGRAPH
+ {0xCCFC, 0x5385}, //13032 #CJK UNIFIED IDEOGRAPH
+ {0xCCFD, 0x542C}, //13033 #CJK UNIFIED IDEOGRAPH
+ {0xCCFE, 0x70C3}, //13034 #CJK UNIFIED IDEOGRAPH
+ {0xCD40, 0x866D}, //13035 #CJK UNIFIED IDEOGRAPH
+ {0xCD41, 0x866F}, //13036 #CJK UNIFIED IDEOGRAPH
+ {0xCD42, 0x8670}, //13037 #CJK UNIFIED IDEOGRAPH
+ {0xCD43, 0x8672}, //13038 #CJK UNIFIED IDEOGRAPH
+ {0xCD44, 0x8673}, //13039 #CJK UNIFIED IDEOGRAPH
+ {0xCD45, 0x8674}, //13040 #CJK UNIFIED IDEOGRAPH
+ {0xCD46, 0x8675}, //13041 #CJK UNIFIED IDEOGRAPH
+ {0xCD47, 0x8676}, //13042 #CJK UNIFIED IDEOGRAPH
+ {0xCD48, 0x8677}, //13043 #CJK UNIFIED IDEOGRAPH
+ {0xCD49, 0x8678}, //13044 #CJK UNIFIED IDEOGRAPH
+ {0xCD4A, 0x8683}, //13045 #CJK UNIFIED IDEOGRAPH
+ {0xCD4B, 0x8684}, //13046 #CJK UNIFIED IDEOGRAPH
+ {0xCD4C, 0x8685}, //13047 #CJK UNIFIED IDEOGRAPH
+ {0xCD4D, 0x8686}, //13048 #CJK UNIFIED IDEOGRAPH
+ {0xCD4E, 0x8687}, //13049 #CJK UNIFIED IDEOGRAPH
+ {0xCD4F, 0x8688}, //13050 #CJK UNIFIED IDEOGRAPH
+ {0xCD50, 0x8689}, //13051 #CJK UNIFIED IDEOGRAPH
+ {0xCD51, 0x868E}, //13052 #CJK UNIFIED IDEOGRAPH
+ {0xCD52, 0x868F}, //13053 #CJK UNIFIED IDEOGRAPH
+ {0xCD53, 0x8690}, //13054 #CJK UNIFIED IDEOGRAPH
+ {0xCD54, 0x8691}, //13055 #CJK UNIFIED IDEOGRAPH
+ {0xCD55, 0x8692}, //13056 #CJK UNIFIED IDEOGRAPH
+ {0xCD56, 0x8694}, //13057 #CJK UNIFIED IDEOGRAPH
+ {0xCD57, 0x8696}, //13058 #CJK UNIFIED IDEOGRAPH
+ {0xCD58, 0x8697}, //13059 #CJK UNIFIED IDEOGRAPH
+ {0xCD59, 0x8698}, //13060 #CJK UNIFIED IDEOGRAPH
+ {0xCD5A, 0x8699}, //13061 #CJK UNIFIED IDEOGRAPH
+ {0xCD5B, 0x869A}, //13062 #CJK UNIFIED IDEOGRAPH
+ {0xCD5C, 0x869B}, //13063 #CJK UNIFIED IDEOGRAPH
+ {0xCD5D, 0x869E}, //13064 #CJK UNIFIED IDEOGRAPH
+ {0xCD5E, 0x869F}, //13065 #CJK UNIFIED IDEOGRAPH
+ {0xCD5F, 0x86A0}, //13066 #CJK UNIFIED IDEOGRAPH
+ {0xCD60, 0x86A1}, //13067 #CJK UNIFIED IDEOGRAPH
+ {0xCD61, 0x86A2}, //13068 #CJK UNIFIED IDEOGRAPH
+ {0xCD62, 0x86A5}, //13069 #CJK UNIFIED IDEOGRAPH
+ {0xCD63, 0x86A6}, //13070 #CJK UNIFIED IDEOGRAPH
+ {0xCD64, 0x86AB}, //13071 #CJK UNIFIED IDEOGRAPH
+ {0xCD65, 0x86AD}, //13072 #CJK UNIFIED IDEOGRAPH
+ {0xCD66, 0x86AE}, //13073 #CJK UNIFIED IDEOGRAPH
+ {0xCD67, 0x86B2}, //13074 #CJK UNIFIED IDEOGRAPH
+ {0xCD68, 0x86B3}, //13075 #CJK UNIFIED IDEOGRAPH
+ {0xCD69, 0x86B7}, //13076 #CJK UNIFIED IDEOGRAPH
+ {0xCD6A, 0x86B8}, //13077 #CJK UNIFIED IDEOGRAPH
+ {0xCD6B, 0x86B9}, //13078 #CJK UNIFIED IDEOGRAPH
+ {0xCD6C, 0x86BB}, //13079 #CJK UNIFIED IDEOGRAPH
+ {0xCD6D, 0x86BC}, //13080 #CJK UNIFIED IDEOGRAPH
+ {0xCD6E, 0x86BD}, //13081 #CJK UNIFIED IDEOGRAPH
+ {0xCD6F, 0x86BE}, //13082 #CJK UNIFIED IDEOGRAPH
+ {0xCD70, 0x86BF}, //13083 #CJK UNIFIED IDEOGRAPH
+ {0xCD71, 0x86C1}, //13084 #CJK UNIFIED IDEOGRAPH
+ {0xCD72, 0x86C2}, //13085 #CJK UNIFIED IDEOGRAPH
+ {0xCD73, 0x86C3}, //13086 #CJK UNIFIED IDEOGRAPH
+ {0xCD74, 0x86C5}, //13087 #CJK UNIFIED IDEOGRAPH
+ {0xCD75, 0x86C8}, //13088 #CJK UNIFIED IDEOGRAPH
+ {0xCD76, 0x86CC}, //13089 #CJK UNIFIED IDEOGRAPH
+ {0xCD77, 0x86CD}, //13090 #CJK UNIFIED IDEOGRAPH
+ {0xCD78, 0x86D2}, //13091 #CJK UNIFIED IDEOGRAPH
+ {0xCD79, 0x86D3}, //13092 #CJK UNIFIED IDEOGRAPH
+ {0xCD7A, 0x86D5}, //13093 #CJK UNIFIED IDEOGRAPH
+ {0xCD7B, 0x86D6}, //13094 #CJK UNIFIED IDEOGRAPH
+ {0xCD7C, 0x86D7}, //13095 #CJK UNIFIED IDEOGRAPH
+ {0xCD7D, 0x86DA}, //13096 #CJK UNIFIED IDEOGRAPH
+ {0xCD7E, 0x86DC}, //13097 #CJK UNIFIED IDEOGRAPH
+ {0xCD80, 0x86DD}, //13098 #CJK UNIFIED IDEOGRAPH
+ {0xCD81, 0x86E0}, //13099 #CJK UNIFIED IDEOGRAPH
+ {0xCD82, 0x86E1}, //13100 #CJK UNIFIED IDEOGRAPH
+ {0xCD83, 0x86E2}, //13101 #CJK UNIFIED IDEOGRAPH
+ {0xCD84, 0x86E3}, //13102 #CJK UNIFIED IDEOGRAPH
+ {0xCD85, 0x86E5}, //13103 #CJK UNIFIED IDEOGRAPH
+ {0xCD86, 0x86E6}, //13104 #CJK UNIFIED IDEOGRAPH
+ {0xCD87, 0x86E7}, //13105 #CJK UNIFIED IDEOGRAPH
+ {0xCD88, 0x86E8}, //13106 #CJK UNIFIED IDEOGRAPH
+ {0xCD89, 0x86EA}, //13107 #CJK UNIFIED IDEOGRAPH
+ {0xCD8A, 0x86EB}, //13108 #CJK UNIFIED IDEOGRAPH
+ {0xCD8B, 0x86EC}, //13109 #CJK UNIFIED IDEOGRAPH
+ {0xCD8C, 0x86EF}, //13110 #CJK UNIFIED IDEOGRAPH
+ {0xCD8D, 0x86F5}, //13111 #CJK UNIFIED IDEOGRAPH
+ {0xCD8E, 0x86F6}, //13112 #CJK UNIFIED IDEOGRAPH
+ {0xCD8F, 0x86F7}, //13113 #CJK UNIFIED IDEOGRAPH
+ {0xCD90, 0x86FA}, //13114 #CJK UNIFIED IDEOGRAPH
+ {0xCD91, 0x86FB}, //13115 #CJK UNIFIED IDEOGRAPH
+ {0xCD92, 0x86FC}, //13116 #CJK UNIFIED IDEOGRAPH
+ {0xCD93, 0x86FD}, //13117 #CJK UNIFIED IDEOGRAPH
+ {0xCD94, 0x86FF}, //13118 #CJK UNIFIED IDEOGRAPH
+ {0xCD95, 0x8701}, //13119 #CJK UNIFIED IDEOGRAPH
+ {0xCD96, 0x8704}, //13120 #CJK UNIFIED IDEOGRAPH
+ {0xCD97, 0x8705}, //13121 #CJK UNIFIED IDEOGRAPH
+ {0xCD98, 0x8706}, //13122 #CJK UNIFIED IDEOGRAPH
+ {0xCD99, 0x870B}, //13123 #CJK UNIFIED IDEOGRAPH
+ {0xCD9A, 0x870C}, //13124 #CJK UNIFIED IDEOGRAPH
+ {0xCD9B, 0x870E}, //13125 #CJK UNIFIED IDEOGRAPH
+ {0xCD9C, 0x870F}, //13126 #CJK UNIFIED IDEOGRAPH
+ {0xCD9D, 0x8710}, //13127 #CJK UNIFIED IDEOGRAPH
+ {0xCD9E, 0x8711}, //13128 #CJK UNIFIED IDEOGRAPH
+ {0xCD9F, 0x8714}, //13129 #CJK UNIFIED IDEOGRAPH
+ {0xCDA0, 0x8716}, //13130 #CJK UNIFIED IDEOGRAPH
+ {0xCDA1, 0x6C40}, //13131 #CJK UNIFIED IDEOGRAPH
+ {0xCDA2, 0x5EF7}, //13132 #CJK UNIFIED IDEOGRAPH
+ {0xCDA3, 0x505C}, //13133 #CJK UNIFIED IDEOGRAPH
+ {0xCDA4, 0x4EAD}, //13134 #CJK UNIFIED IDEOGRAPH
+ {0xCDA5, 0x5EAD}, //13135 #CJK UNIFIED IDEOGRAPH
+ {0xCDA6, 0x633A}, //13136 #CJK UNIFIED IDEOGRAPH
+ {0xCDA7, 0x8247}, //13137 #CJK UNIFIED IDEOGRAPH
+ {0xCDA8, 0x901A}, //13138 #CJK UNIFIED IDEOGRAPH
+ {0xCDA9, 0x6850}, //13139 #CJK UNIFIED IDEOGRAPH
+ {0xCDAA, 0x916E}, //13140 #CJK UNIFIED IDEOGRAPH
+ {0xCDAB, 0x77B3}, //13141 #CJK UNIFIED IDEOGRAPH
+ {0xCDAC, 0x540C}, //13142 #CJK UNIFIED IDEOGRAPH
+ {0xCDAD, 0x94DC}, //13143 #CJK UNIFIED IDEOGRAPH
+ {0xCDAE, 0x5F64}, //13144 #CJK UNIFIED IDEOGRAPH
+ {0xCDAF, 0x7AE5}, //13145 #CJK UNIFIED IDEOGRAPH
+ {0xCDB0, 0x6876}, //13146 #CJK UNIFIED IDEOGRAPH
+ {0xCDB1, 0x6345}, //13147 #CJK UNIFIED IDEOGRAPH
+ {0xCDB2, 0x7B52}, //13148 #CJK UNIFIED IDEOGRAPH
+ {0xCDB3, 0x7EDF}, //13149 #CJK UNIFIED IDEOGRAPH
+ {0xCDB4, 0x75DB}, //13150 #CJK UNIFIED IDEOGRAPH
+ {0xCDB5, 0x5077}, //13151 #CJK UNIFIED IDEOGRAPH
+ {0xCDB6, 0x6295}, //13152 #CJK UNIFIED IDEOGRAPH
+ {0xCDB7, 0x5934}, //13153 #CJK UNIFIED IDEOGRAPH
+ {0xCDB8, 0x900F}, //13154 #CJK UNIFIED IDEOGRAPH
+ {0xCDB9, 0x51F8}, //13155 #CJK UNIFIED IDEOGRAPH
+ {0xCDBA, 0x79C3}, //13156 #CJK UNIFIED IDEOGRAPH
+ {0xCDBB, 0x7A81}, //13157 #CJK UNIFIED IDEOGRAPH
+ {0xCDBC, 0x56FE}, //13158 #CJK UNIFIED IDEOGRAPH
+ {0xCDBD, 0x5F92}, //13159 #CJK UNIFIED IDEOGRAPH
+ {0xCDBE, 0x9014}, //13160 #CJK UNIFIED IDEOGRAPH
+ {0xCDBF, 0x6D82}, //13161 #CJK UNIFIED IDEOGRAPH
+ {0xCDC0, 0x5C60}, //13162 #CJK UNIFIED IDEOGRAPH
+ {0xCDC1, 0x571F}, //13163 #CJK UNIFIED IDEOGRAPH
+ {0xCDC2, 0x5410}, //13164 #CJK UNIFIED IDEOGRAPH
+ {0xCDC3, 0x5154}, //13165 #CJK UNIFIED IDEOGRAPH
+ {0xCDC4, 0x6E4D}, //13166 #CJK UNIFIED IDEOGRAPH
+ {0xCDC5, 0x56E2}, //13167 #CJK UNIFIED IDEOGRAPH
+ {0xCDC6, 0x63A8}, //13168 #CJK UNIFIED IDEOGRAPH
+ {0xCDC7, 0x9893}, //13169 #CJK UNIFIED IDEOGRAPH
+ {0xCDC8, 0x817F}, //13170 #CJK UNIFIED IDEOGRAPH
+ {0xCDC9, 0x8715}, //13171 #CJK UNIFIED IDEOGRAPH
+ {0xCDCA, 0x892A}, //13172 #CJK UNIFIED IDEOGRAPH
+ {0xCDCB, 0x9000}, //13173 #CJK UNIFIED IDEOGRAPH
+ {0xCDCC, 0x541E}, //13174 #CJK UNIFIED IDEOGRAPH
+ {0xCDCD, 0x5C6F}, //13175 #CJK UNIFIED IDEOGRAPH
+ {0xCDCE, 0x81C0}, //13176 #CJK UNIFIED IDEOGRAPH
+ {0xCDCF, 0x62D6}, //13177 #CJK UNIFIED IDEOGRAPH
+ {0xCDD0, 0x6258}, //13178 #CJK UNIFIED IDEOGRAPH
+ {0xCDD1, 0x8131}, //13179 #CJK UNIFIED IDEOGRAPH
+ {0xCDD2, 0x9E35}, //13180 #CJK UNIFIED IDEOGRAPH
+ {0xCDD3, 0x9640}, //13181 #CJK UNIFIED IDEOGRAPH
+ {0xCDD4, 0x9A6E}, //13182 #CJK UNIFIED IDEOGRAPH
+ {0xCDD5, 0x9A7C}, //13183 #CJK UNIFIED IDEOGRAPH
+ {0xCDD6, 0x692D}, //13184 #CJK UNIFIED IDEOGRAPH
+ {0xCDD7, 0x59A5}, //13185 #CJK UNIFIED IDEOGRAPH
+ {0xCDD8, 0x62D3}, //13186 #CJK UNIFIED IDEOGRAPH
+ {0xCDD9, 0x553E}, //13187 #CJK UNIFIED IDEOGRAPH
+ {0xCDDA, 0x6316}, //13188 #CJK UNIFIED IDEOGRAPH
+ {0xCDDB, 0x54C7}, //13189 #CJK UNIFIED IDEOGRAPH
+ {0xCDDC, 0x86D9}, //13190 #CJK UNIFIED IDEOGRAPH
+ {0xCDDD, 0x6D3C}, //13191 #CJK UNIFIED IDEOGRAPH
+ {0xCDDE, 0x5A03}, //13192 #CJK UNIFIED IDEOGRAPH
+ {0xCDDF, 0x74E6}, //13193 #CJK UNIFIED IDEOGRAPH
+ {0xCDE0, 0x889C}, //13194 #CJK UNIFIED IDEOGRAPH
+ {0xCDE1, 0x6B6A}, //13195 #CJK UNIFIED IDEOGRAPH
+ {0xCDE2, 0x5916}, //13196 #CJK UNIFIED IDEOGRAPH
+ {0xCDE3, 0x8C4C}, //13197 #CJK UNIFIED IDEOGRAPH
+ {0xCDE4, 0x5F2F}, //13198 #CJK UNIFIED IDEOGRAPH
+ {0xCDE5, 0x6E7E}, //13199 #CJK UNIFIED IDEOGRAPH
+ {0xCDE6, 0x73A9}, //13200 #CJK UNIFIED IDEOGRAPH
+ {0xCDE7, 0x987D}, //13201 #CJK UNIFIED IDEOGRAPH
+ {0xCDE8, 0x4E38}, //13202 #CJK UNIFIED IDEOGRAPH
+ {0xCDE9, 0x70F7}, //13203 #CJK UNIFIED IDEOGRAPH
+ {0xCDEA, 0x5B8C}, //13204 #CJK UNIFIED IDEOGRAPH
+ {0xCDEB, 0x7897}, //13205 #CJK UNIFIED IDEOGRAPH
+ {0xCDEC, 0x633D}, //13206 #CJK UNIFIED IDEOGRAPH
+ {0xCDED, 0x665A}, //13207 #CJK UNIFIED IDEOGRAPH
+ {0xCDEE, 0x7696}, //13208 #CJK UNIFIED IDEOGRAPH
+ {0xCDEF, 0x60CB}, //13209 #CJK UNIFIED IDEOGRAPH
+ {0xCDF0, 0x5B9B}, //13210 #CJK UNIFIED IDEOGRAPH
+ {0xCDF1, 0x5A49}, //13211 #CJK UNIFIED IDEOGRAPH
+ {0xCDF2, 0x4E07}, //13212 #CJK UNIFIED IDEOGRAPH
+ {0xCDF3, 0x8155}, //13213 #CJK UNIFIED IDEOGRAPH
+ {0xCDF4, 0x6C6A}, //13214 #CJK UNIFIED IDEOGRAPH
+ {0xCDF5, 0x738B}, //13215 #CJK UNIFIED IDEOGRAPH
+ {0xCDF6, 0x4EA1}, //13216 #CJK UNIFIED IDEOGRAPH
+ {0xCDF7, 0x6789}, //13217 #CJK UNIFIED IDEOGRAPH
+ {0xCDF8, 0x7F51}, //13218 #CJK UNIFIED IDEOGRAPH
+ {0xCDF9, 0x5F80}, //13219 #CJK UNIFIED IDEOGRAPH
+ {0xCDFA, 0x65FA}, //13220 #CJK UNIFIED IDEOGRAPH
+ {0xCDFB, 0x671B}, //13221 #CJK UNIFIED IDEOGRAPH
+ {0xCDFC, 0x5FD8}, //13222 #CJK UNIFIED IDEOGRAPH
+ {0xCDFD, 0x5984}, //13223 #CJK UNIFIED IDEOGRAPH
+ {0xCDFE, 0x5A01}, //13224 #CJK UNIFIED IDEOGRAPH
+ {0xCE40, 0x8719}, //13225 #CJK UNIFIED IDEOGRAPH
+ {0xCE41, 0x871B}, //13226 #CJK UNIFIED IDEOGRAPH
+ {0xCE42, 0x871D}, //13227 #CJK UNIFIED IDEOGRAPH
+ {0xCE43, 0x871F}, //13228 #CJK UNIFIED IDEOGRAPH
+ {0xCE44, 0x8720}, //13229 #CJK UNIFIED IDEOGRAPH
+ {0xCE45, 0x8724}, //13230 #CJK UNIFIED IDEOGRAPH
+ {0xCE46, 0x8726}, //13231 #CJK UNIFIED IDEOGRAPH
+ {0xCE47, 0x8727}, //13232 #CJK UNIFIED IDEOGRAPH
+ {0xCE48, 0x8728}, //13233 #CJK UNIFIED IDEOGRAPH
+ {0xCE49, 0x872A}, //13234 #CJK UNIFIED IDEOGRAPH
+ {0xCE4A, 0x872B}, //13235 #CJK UNIFIED IDEOGRAPH
+ {0xCE4B, 0x872C}, //13236 #CJK UNIFIED IDEOGRAPH
+ {0xCE4C, 0x872D}, //13237 #CJK UNIFIED IDEOGRAPH
+ {0xCE4D, 0x872F}, //13238 #CJK UNIFIED IDEOGRAPH
+ {0xCE4E, 0x8730}, //13239 #CJK UNIFIED IDEOGRAPH
+ {0xCE4F, 0x8732}, //13240 #CJK UNIFIED IDEOGRAPH
+ {0xCE50, 0x8733}, //13241 #CJK UNIFIED IDEOGRAPH
+ {0xCE51, 0x8735}, //13242 #CJK UNIFIED IDEOGRAPH
+ {0xCE52, 0x8736}, //13243 #CJK UNIFIED IDEOGRAPH
+ {0xCE53, 0x8738}, //13244 #CJK UNIFIED IDEOGRAPH
+ {0xCE54, 0x8739}, //13245 #CJK UNIFIED IDEOGRAPH
+ {0xCE55, 0x873A}, //13246 #CJK UNIFIED IDEOGRAPH
+ {0xCE56, 0x873C}, //13247 #CJK UNIFIED IDEOGRAPH
+ {0xCE57, 0x873D}, //13248 #CJK UNIFIED IDEOGRAPH
+ {0xCE58, 0x8740}, //13249 #CJK UNIFIED IDEOGRAPH
+ {0xCE59, 0x8741}, //13250 #CJK UNIFIED IDEOGRAPH
+ {0xCE5A, 0x8742}, //13251 #CJK UNIFIED IDEOGRAPH
+ {0xCE5B, 0x8743}, //13252 #CJK UNIFIED IDEOGRAPH
+ {0xCE5C, 0x8744}, //13253 #CJK UNIFIED IDEOGRAPH
+ {0xCE5D, 0x8745}, //13254 #CJK UNIFIED IDEOGRAPH
+ {0xCE5E, 0x8746}, //13255 #CJK UNIFIED IDEOGRAPH
+ {0xCE5F, 0x874A}, //13256 #CJK UNIFIED IDEOGRAPH
+ {0xCE60, 0x874B}, //13257 #CJK UNIFIED IDEOGRAPH
+ {0xCE61, 0x874D}, //13258 #CJK UNIFIED IDEOGRAPH
+ {0xCE62, 0x874F}, //13259 #CJK UNIFIED IDEOGRAPH
+ {0xCE63, 0x8750}, //13260 #CJK UNIFIED IDEOGRAPH
+ {0xCE64, 0x8751}, //13261 #CJK UNIFIED IDEOGRAPH
+ {0xCE65, 0x8752}, //13262 #CJK UNIFIED IDEOGRAPH
+ {0xCE66, 0x8754}, //13263 #CJK UNIFIED IDEOGRAPH
+ {0xCE67, 0x8755}, //13264 #CJK UNIFIED IDEOGRAPH
+ {0xCE68, 0x8756}, //13265 #CJK UNIFIED IDEOGRAPH
+ {0xCE69, 0x8758}, //13266 #CJK UNIFIED IDEOGRAPH
+ {0xCE6A, 0x875A}, //13267 #CJK UNIFIED IDEOGRAPH
+ {0xCE6B, 0x875B}, //13268 #CJK UNIFIED IDEOGRAPH
+ {0xCE6C, 0x875C}, //13269 #CJK UNIFIED IDEOGRAPH
+ {0xCE6D, 0x875D}, //13270 #CJK UNIFIED IDEOGRAPH
+ {0xCE6E, 0x875E}, //13271 #CJK UNIFIED IDEOGRAPH
+ {0xCE6F, 0x875F}, //13272 #CJK UNIFIED IDEOGRAPH
+ {0xCE70, 0x8761}, //13273 #CJK UNIFIED IDEOGRAPH
+ {0xCE71, 0x8762}, //13274 #CJK UNIFIED IDEOGRAPH
+ {0xCE72, 0x8766}, //13275 #CJK UNIFIED IDEOGRAPH
+ {0xCE73, 0x8767}, //13276 #CJK UNIFIED IDEOGRAPH
+ {0xCE74, 0x8768}, //13277 #CJK UNIFIED IDEOGRAPH
+ {0xCE75, 0x8769}, //13278 #CJK UNIFIED IDEOGRAPH
+ {0xCE76, 0x876A}, //13279 #CJK UNIFIED IDEOGRAPH
+ {0xCE77, 0x876B}, //13280 #CJK UNIFIED IDEOGRAPH
+ {0xCE78, 0x876C}, //13281 #CJK UNIFIED IDEOGRAPH
+ {0xCE79, 0x876D}, //13282 #CJK UNIFIED IDEOGRAPH
+ {0xCE7A, 0x876F}, //13283 #CJK UNIFIED IDEOGRAPH
+ {0xCE7B, 0x8771}, //13284 #CJK UNIFIED IDEOGRAPH
+ {0xCE7C, 0x8772}, //13285 #CJK UNIFIED IDEOGRAPH
+ {0xCE7D, 0x8773}, //13286 #CJK UNIFIED IDEOGRAPH
+ {0xCE7E, 0x8775}, //13287 #CJK UNIFIED IDEOGRAPH
+ {0xCE80, 0x8777}, //13288 #CJK UNIFIED IDEOGRAPH
+ {0xCE81, 0x8778}, //13289 #CJK UNIFIED IDEOGRAPH
+ {0xCE82, 0x8779}, //13290 #CJK UNIFIED IDEOGRAPH
+ {0xCE83, 0x877A}, //13291 #CJK UNIFIED IDEOGRAPH
+ {0xCE84, 0x877F}, //13292 #CJK UNIFIED IDEOGRAPH
+ {0xCE85, 0x8780}, //13293 #CJK UNIFIED IDEOGRAPH
+ {0xCE86, 0x8781}, //13294 #CJK UNIFIED IDEOGRAPH
+ {0xCE87, 0x8784}, //13295 #CJK UNIFIED IDEOGRAPH
+ {0xCE88, 0x8786}, //13296 #CJK UNIFIED IDEOGRAPH
+ {0xCE89, 0x8787}, //13297 #CJK UNIFIED IDEOGRAPH
+ {0xCE8A, 0x8789}, //13298 #CJK UNIFIED IDEOGRAPH
+ {0xCE8B, 0x878A}, //13299 #CJK UNIFIED IDEOGRAPH
+ {0xCE8C, 0x878C}, //13300 #CJK UNIFIED IDEOGRAPH
+ {0xCE8D, 0x878E}, //13301 #CJK UNIFIED IDEOGRAPH
+ {0xCE8E, 0x878F}, //13302 #CJK UNIFIED IDEOGRAPH
+ {0xCE8F, 0x8790}, //13303 #CJK UNIFIED IDEOGRAPH
+ {0xCE90, 0x8791}, //13304 #CJK UNIFIED IDEOGRAPH
+ {0xCE91, 0x8792}, //13305 #CJK UNIFIED IDEOGRAPH
+ {0xCE92, 0x8794}, //13306 #CJK UNIFIED IDEOGRAPH
+ {0xCE93, 0x8795}, //13307 #CJK UNIFIED IDEOGRAPH
+ {0xCE94, 0x8796}, //13308 #CJK UNIFIED IDEOGRAPH
+ {0xCE95, 0x8798}, //13309 #CJK UNIFIED IDEOGRAPH
+ {0xCE96, 0x8799}, //13310 #CJK UNIFIED IDEOGRAPH
+ {0xCE97, 0x879A}, //13311 #CJK UNIFIED IDEOGRAPH
+ {0xCE98, 0x879B}, //13312 #CJK UNIFIED IDEOGRAPH
+ {0xCE99, 0x879C}, //13313 #CJK UNIFIED IDEOGRAPH
+ {0xCE9A, 0x879D}, //13314 #CJK UNIFIED IDEOGRAPH
+ {0xCE9B, 0x879E}, //13315 #CJK UNIFIED IDEOGRAPH
+ {0xCE9C, 0x87A0}, //13316 #CJK UNIFIED IDEOGRAPH
+ {0xCE9D, 0x87A1}, //13317 #CJK UNIFIED IDEOGRAPH
+ {0xCE9E, 0x87A2}, //13318 #CJK UNIFIED IDEOGRAPH
+ {0xCE9F, 0x87A3}, //13319 #CJK UNIFIED IDEOGRAPH
+ {0xCEA0, 0x87A4}, //13320 #CJK UNIFIED IDEOGRAPH
+ {0xCEA1, 0x5DCD}, //13321 #CJK UNIFIED IDEOGRAPH
+ {0xCEA2, 0x5FAE}, //13322 #CJK UNIFIED IDEOGRAPH
+ {0xCEA3, 0x5371}, //13323 #CJK UNIFIED IDEOGRAPH
+ {0xCEA4, 0x97E6}, //13324 #CJK UNIFIED IDEOGRAPH
+ {0xCEA5, 0x8FDD}, //13325 #CJK UNIFIED IDEOGRAPH
+ {0xCEA6, 0x6845}, //13326 #CJK UNIFIED IDEOGRAPH
+ {0xCEA7, 0x56F4}, //13327 #CJK UNIFIED IDEOGRAPH
+ {0xCEA8, 0x552F}, //13328 #CJK UNIFIED IDEOGRAPH
+ {0xCEA9, 0x60DF}, //13329 #CJK UNIFIED IDEOGRAPH
+ {0xCEAA, 0x4E3A}, //13330 #CJK UNIFIED IDEOGRAPH
+ {0xCEAB, 0x6F4D}, //13331 #CJK UNIFIED IDEOGRAPH
+ {0xCEAC, 0x7EF4}, //13332 #CJK UNIFIED IDEOGRAPH
+ {0xCEAD, 0x82C7}, //13333 #CJK UNIFIED IDEOGRAPH
+ {0xCEAE, 0x840E}, //13334 #CJK UNIFIED IDEOGRAPH
+ {0xCEAF, 0x59D4}, //13335 #CJK UNIFIED IDEOGRAPH
+ {0xCEB0, 0x4F1F}, //13336 #CJK UNIFIED IDEOGRAPH
+ {0xCEB1, 0x4F2A}, //13337 #CJK UNIFIED IDEOGRAPH
+ {0xCEB2, 0x5C3E}, //13338 #CJK UNIFIED IDEOGRAPH
+ {0xCEB3, 0x7EAC}, //13339 #CJK UNIFIED IDEOGRAPH
+ {0xCEB4, 0x672A}, //13340 #CJK UNIFIED IDEOGRAPH
+ {0xCEB5, 0x851A}, //13341 #CJK UNIFIED IDEOGRAPH
+ {0xCEB6, 0x5473}, //13342 #CJK UNIFIED IDEOGRAPH
+ {0xCEB7, 0x754F}, //13343 #CJK UNIFIED IDEOGRAPH
+ {0xCEB8, 0x80C3}, //13344 #CJK UNIFIED IDEOGRAPH
+ {0xCEB9, 0x5582}, //13345 #CJK UNIFIED IDEOGRAPH
+ {0xCEBA, 0x9B4F}, //13346 #CJK UNIFIED IDEOGRAPH
+ {0xCEBB, 0x4F4D}, //13347 #CJK UNIFIED IDEOGRAPH
+ {0xCEBC, 0x6E2D}, //13348 #CJK UNIFIED IDEOGRAPH
+ {0xCEBD, 0x8C13}, //13349 #CJK UNIFIED IDEOGRAPH
+ {0xCEBE, 0x5C09}, //13350 #CJK UNIFIED IDEOGRAPH
+ {0xCEBF, 0x6170}, //13351 #CJK UNIFIED IDEOGRAPH
+ {0xCEC0, 0x536B}, //13352 #CJK UNIFIED IDEOGRAPH
+ {0xCEC1, 0x761F}, //13353 #CJK UNIFIED IDEOGRAPH
+ {0xCEC2, 0x6E29}, //13354 #CJK UNIFIED IDEOGRAPH
+ {0xCEC3, 0x868A}, //13355 #CJK UNIFIED IDEOGRAPH
+ {0xCEC4, 0x6587}, //13356 #CJK UNIFIED IDEOGRAPH
+ {0xCEC5, 0x95FB}, //13357 #CJK UNIFIED IDEOGRAPH
+ {0xCEC6, 0x7EB9}, //13358 #CJK UNIFIED IDEOGRAPH
+ {0xCEC7, 0x543B}, //13359 #CJK UNIFIED IDEOGRAPH
+ {0xCEC8, 0x7A33}, //13360 #CJK UNIFIED IDEOGRAPH
+ {0xCEC9, 0x7D0A}, //13361 #CJK UNIFIED IDEOGRAPH
+ {0xCECA, 0x95EE}, //13362 #CJK UNIFIED IDEOGRAPH
+ {0xCECB, 0x55E1}, //13363 #CJK UNIFIED IDEOGRAPH
+ {0xCECC, 0x7FC1}, //13364 #CJK UNIFIED IDEOGRAPH
+ {0xCECD, 0x74EE}, //13365 #CJK UNIFIED IDEOGRAPH
+ {0xCECE, 0x631D}, //13366 #CJK UNIFIED IDEOGRAPH
+ {0xCECF, 0x8717}, //13367 #CJK UNIFIED IDEOGRAPH
+ {0xCED0, 0x6DA1}, //13368 #CJK UNIFIED IDEOGRAPH
+ {0xCED1, 0x7A9D}, //13369 #CJK UNIFIED IDEOGRAPH
+ {0xCED2, 0x6211}, //13370 #CJK UNIFIED IDEOGRAPH
+ {0xCED3, 0x65A1}, //13371 #CJK UNIFIED IDEOGRAPH
+ {0xCED4, 0x5367}, //13372 #CJK UNIFIED IDEOGRAPH
+ {0xCED5, 0x63E1}, //13373 #CJK UNIFIED IDEOGRAPH
+ {0xCED6, 0x6C83}, //13374 #CJK UNIFIED IDEOGRAPH
+ {0xCED7, 0x5DEB}, //13375 #CJK UNIFIED IDEOGRAPH
+ {0xCED8, 0x545C}, //13376 #CJK UNIFIED IDEOGRAPH
+ {0xCED9, 0x94A8}, //13377 #CJK UNIFIED IDEOGRAPH
+ {0xCEDA, 0x4E4C}, //13378 #CJK UNIFIED IDEOGRAPH
+ {0xCEDB, 0x6C61}, //13379 #CJK UNIFIED IDEOGRAPH
+ {0xCEDC, 0x8BEC}, //13380 #CJK UNIFIED IDEOGRAPH
+ {0xCEDD, 0x5C4B}, //13381 #CJK UNIFIED IDEOGRAPH
+ {0xCEDE, 0x65E0}, //13382 #CJK UNIFIED IDEOGRAPH
+ {0xCEDF, 0x829C}, //13383 #CJK UNIFIED IDEOGRAPH
+ {0xCEE0, 0x68A7}, //13384 #CJK UNIFIED IDEOGRAPH
+ {0xCEE1, 0x543E}, //13385 #CJK UNIFIED IDEOGRAPH
+ {0xCEE2, 0x5434}, //13386 #CJK UNIFIED IDEOGRAPH
+ {0xCEE3, 0x6BCB}, //13387 #CJK UNIFIED IDEOGRAPH
+ {0xCEE4, 0x6B66}, //13388 #CJK UNIFIED IDEOGRAPH
+ {0xCEE5, 0x4E94}, //13389 #CJK UNIFIED IDEOGRAPH
+ {0xCEE6, 0x6342}, //13390 #CJK UNIFIED IDEOGRAPH
+ {0xCEE7, 0x5348}, //13391 #CJK UNIFIED IDEOGRAPH
+ {0xCEE8, 0x821E}, //13392 #CJK UNIFIED IDEOGRAPH
+ {0xCEE9, 0x4F0D}, //13393 #CJK UNIFIED IDEOGRAPH
+ {0xCEEA, 0x4FAE}, //13394 #CJK UNIFIED IDEOGRAPH
+ {0xCEEB, 0x575E}, //13395 #CJK UNIFIED IDEOGRAPH
+ {0xCEEC, 0x620A}, //13396 #CJK UNIFIED IDEOGRAPH
+ {0xCEED, 0x96FE}, //13397 #CJK UNIFIED IDEOGRAPH
+ {0xCEEE, 0x6664}, //13398 #CJK UNIFIED IDEOGRAPH
+ {0xCEEF, 0x7269}, //13399 #CJK UNIFIED IDEOGRAPH
+ {0xCEF0, 0x52FF}, //13400 #CJK UNIFIED IDEOGRAPH
+ {0xCEF1, 0x52A1}, //13401 #CJK UNIFIED IDEOGRAPH
+ {0xCEF2, 0x609F}, //13402 #CJK UNIFIED IDEOGRAPH
+ {0xCEF3, 0x8BEF}, //13403 #CJK UNIFIED IDEOGRAPH
+ {0xCEF4, 0x6614}, //13404 #CJK UNIFIED IDEOGRAPH
+ {0xCEF5, 0x7199}, //13405 #CJK UNIFIED IDEOGRAPH
+ {0xCEF6, 0x6790}, //13406 #CJK UNIFIED IDEOGRAPH
+ {0xCEF7, 0x897F}, //13407 #CJK UNIFIED IDEOGRAPH
+ {0xCEF8, 0x7852}, //13408 #CJK UNIFIED IDEOGRAPH
+ {0xCEF9, 0x77FD}, //13409 #CJK UNIFIED IDEOGRAPH
+ {0xCEFA, 0x6670}, //13410 #CJK UNIFIED IDEOGRAPH
+ {0xCEFB, 0x563B}, //13411 #CJK UNIFIED IDEOGRAPH
+ {0xCEFC, 0x5438}, //13412 #CJK UNIFIED IDEOGRAPH
+ {0xCEFD, 0x9521}, //13413 #CJK UNIFIED IDEOGRAPH
+ {0xCEFE, 0x727A}, //13414 #CJK UNIFIED IDEOGRAPH
+ {0xCF40, 0x87A5}, //13415 #CJK UNIFIED IDEOGRAPH
+ {0xCF41, 0x87A6}, //13416 #CJK UNIFIED IDEOGRAPH
+ {0xCF42, 0x87A7}, //13417 #CJK UNIFIED IDEOGRAPH
+ {0xCF43, 0x87A9}, //13418 #CJK UNIFIED IDEOGRAPH
+ {0xCF44, 0x87AA}, //13419 #CJK UNIFIED IDEOGRAPH
+ {0xCF45, 0x87AE}, //13420 #CJK UNIFIED IDEOGRAPH
+ {0xCF46, 0x87B0}, //13421 #CJK UNIFIED IDEOGRAPH
+ {0xCF47, 0x87B1}, //13422 #CJK UNIFIED IDEOGRAPH
+ {0xCF48, 0x87B2}, //13423 #CJK UNIFIED IDEOGRAPH
+ {0xCF49, 0x87B4}, //13424 #CJK UNIFIED IDEOGRAPH
+ {0xCF4A, 0x87B6}, //13425 #CJK UNIFIED IDEOGRAPH
+ {0xCF4B, 0x87B7}, //13426 #CJK UNIFIED IDEOGRAPH
+ {0xCF4C, 0x87B8}, //13427 #CJK UNIFIED IDEOGRAPH
+ {0xCF4D, 0x87B9}, //13428 #CJK UNIFIED IDEOGRAPH
+ {0xCF4E, 0x87BB}, //13429 #CJK UNIFIED IDEOGRAPH
+ {0xCF4F, 0x87BC}, //13430 #CJK UNIFIED IDEOGRAPH
+ {0xCF50, 0x87BE}, //13431 #CJK UNIFIED IDEOGRAPH
+ {0xCF51, 0x87BF}, //13432 #CJK UNIFIED IDEOGRAPH
+ {0xCF52, 0x87C1}, //13433 #CJK UNIFIED IDEOGRAPH
+ {0xCF53, 0x87C2}, //13434 #CJK UNIFIED IDEOGRAPH
+ {0xCF54, 0x87C3}, //13435 #CJK UNIFIED IDEOGRAPH
+ {0xCF55, 0x87C4}, //13436 #CJK UNIFIED IDEOGRAPH
+ {0xCF56, 0x87C5}, //13437 #CJK UNIFIED IDEOGRAPH
+ {0xCF57, 0x87C7}, //13438 #CJK UNIFIED IDEOGRAPH
+ {0xCF58, 0x87C8}, //13439 #CJK UNIFIED IDEOGRAPH
+ {0xCF59, 0x87C9}, //13440 #CJK UNIFIED IDEOGRAPH
+ {0xCF5A, 0x87CC}, //13441 #CJK UNIFIED IDEOGRAPH
+ {0xCF5B, 0x87CD}, //13442 #CJK UNIFIED IDEOGRAPH
+ {0xCF5C, 0x87CE}, //13443 #CJK UNIFIED IDEOGRAPH
+ {0xCF5D, 0x87CF}, //13444 #CJK UNIFIED IDEOGRAPH
+ {0xCF5E, 0x87D0}, //13445 #CJK UNIFIED IDEOGRAPH
+ {0xCF5F, 0x87D4}, //13446 #CJK UNIFIED IDEOGRAPH
+ {0xCF60, 0x87D5}, //13447 #CJK UNIFIED IDEOGRAPH
+ {0xCF61, 0x87D6}, //13448 #CJK UNIFIED IDEOGRAPH
+ {0xCF62, 0x87D7}, //13449 #CJK UNIFIED IDEOGRAPH
+ {0xCF63, 0x87D8}, //13450 #CJK UNIFIED IDEOGRAPH
+ {0xCF64, 0x87D9}, //13451 #CJK UNIFIED IDEOGRAPH
+ {0xCF65, 0x87DA}, //13452 #CJK UNIFIED IDEOGRAPH
+ {0xCF66, 0x87DC}, //13453 #CJK UNIFIED IDEOGRAPH
+ {0xCF67, 0x87DD}, //13454 #CJK UNIFIED IDEOGRAPH
+ {0xCF68, 0x87DE}, //13455 #CJK UNIFIED IDEOGRAPH
+ {0xCF69, 0x87DF}, //13456 #CJK UNIFIED IDEOGRAPH
+ {0xCF6A, 0x87E1}, //13457 #CJK UNIFIED IDEOGRAPH
+ {0xCF6B, 0x87E2}, //13458 #CJK UNIFIED IDEOGRAPH
+ {0xCF6C, 0x87E3}, //13459 #CJK UNIFIED IDEOGRAPH
+ {0xCF6D, 0x87E4}, //13460 #CJK UNIFIED IDEOGRAPH
+ {0xCF6E, 0x87E6}, //13461 #CJK UNIFIED IDEOGRAPH
+ {0xCF6F, 0x87E7}, //13462 #CJK UNIFIED IDEOGRAPH
+ {0xCF70, 0x87E8}, //13463 #CJK UNIFIED IDEOGRAPH
+ {0xCF71, 0x87E9}, //13464 #CJK UNIFIED IDEOGRAPH
+ {0xCF72, 0x87EB}, //13465 #CJK UNIFIED IDEOGRAPH
+ {0xCF73, 0x87EC}, //13466 #CJK UNIFIED IDEOGRAPH
+ {0xCF74, 0x87ED}, //13467 #CJK UNIFIED IDEOGRAPH
+ {0xCF75, 0x87EF}, //13468 #CJK UNIFIED IDEOGRAPH
+ {0xCF76, 0x87F0}, //13469 #CJK UNIFIED IDEOGRAPH
+ {0xCF77, 0x87F1}, //13470 #CJK UNIFIED IDEOGRAPH
+ {0xCF78, 0x87F2}, //13471 #CJK UNIFIED IDEOGRAPH
+ {0xCF79, 0x87F3}, //13472 #CJK UNIFIED IDEOGRAPH
+ {0xCF7A, 0x87F4}, //13473 #CJK UNIFIED IDEOGRAPH
+ {0xCF7B, 0x87F5}, //13474 #CJK UNIFIED IDEOGRAPH
+ {0xCF7C, 0x87F6}, //13475 #CJK UNIFIED IDEOGRAPH
+ {0xCF7D, 0x87F7}, //13476 #CJK UNIFIED IDEOGRAPH
+ {0xCF7E, 0x87F8}, //13477 #CJK UNIFIED IDEOGRAPH
+ {0xCF80, 0x87FA}, //13478 #CJK UNIFIED IDEOGRAPH
+ {0xCF81, 0x87FB}, //13479 #CJK UNIFIED IDEOGRAPH
+ {0xCF82, 0x87FC}, //13480 #CJK UNIFIED IDEOGRAPH
+ {0xCF83, 0x87FD}, //13481 #CJK UNIFIED IDEOGRAPH
+ {0xCF84, 0x87FF}, //13482 #CJK UNIFIED IDEOGRAPH
+ {0xCF85, 0x8800}, //13483 #CJK UNIFIED IDEOGRAPH
+ {0xCF86, 0x8801}, //13484 #CJK UNIFIED IDEOGRAPH
+ {0xCF87, 0x8802}, //13485 #CJK UNIFIED IDEOGRAPH
+ {0xCF88, 0x8804}, //13486 #CJK UNIFIED IDEOGRAPH
+ {0xCF89, 0x8805}, //13487 #CJK UNIFIED IDEOGRAPH
+ {0xCF8A, 0x8806}, //13488 #CJK UNIFIED IDEOGRAPH
+ {0xCF8B, 0x8807}, //13489 #CJK UNIFIED IDEOGRAPH
+ {0xCF8C, 0x8808}, //13490 #CJK UNIFIED IDEOGRAPH
+ {0xCF8D, 0x8809}, //13491 #CJK UNIFIED IDEOGRAPH
+ {0xCF8E, 0x880B}, //13492 #CJK UNIFIED IDEOGRAPH
+ {0xCF8F, 0x880C}, //13493 #CJK UNIFIED IDEOGRAPH
+ {0xCF90, 0x880D}, //13494 #CJK UNIFIED IDEOGRAPH
+ {0xCF91, 0x880E}, //13495 #CJK UNIFIED IDEOGRAPH
+ {0xCF92, 0x880F}, //13496 #CJK UNIFIED IDEOGRAPH
+ {0xCF93, 0x8810}, //13497 #CJK UNIFIED IDEOGRAPH
+ {0xCF94, 0x8811}, //13498 #CJK UNIFIED IDEOGRAPH
+ {0xCF95, 0x8812}, //13499 #CJK UNIFIED IDEOGRAPH
+ {0xCF96, 0x8814}, //13500 #CJK UNIFIED IDEOGRAPH
+ {0xCF97, 0x8817}, //13501 #CJK UNIFIED IDEOGRAPH
+ {0xCF98, 0x8818}, //13502 #CJK UNIFIED IDEOGRAPH
+ {0xCF99, 0x8819}, //13503 #CJK UNIFIED IDEOGRAPH
+ {0xCF9A, 0x881A}, //13504 #CJK UNIFIED IDEOGRAPH
+ {0xCF9B, 0x881C}, //13505 #CJK UNIFIED IDEOGRAPH
+ {0xCF9C, 0x881D}, //13506 #CJK UNIFIED IDEOGRAPH
+ {0xCF9D, 0x881E}, //13507 #CJK UNIFIED IDEOGRAPH
+ {0xCF9E, 0x881F}, //13508 #CJK UNIFIED IDEOGRAPH
+ {0xCF9F, 0x8820}, //13509 #CJK UNIFIED IDEOGRAPH
+ {0xCFA0, 0x8823}, //13510 #CJK UNIFIED IDEOGRAPH
+ {0xCFA1, 0x7A00}, //13511 #CJK UNIFIED IDEOGRAPH
+ {0xCFA2, 0x606F}, //13512 #CJK UNIFIED IDEOGRAPH
+ {0xCFA3, 0x5E0C}, //13513 #CJK UNIFIED IDEOGRAPH
+ {0xCFA4, 0x6089}, //13514 #CJK UNIFIED IDEOGRAPH
+ {0xCFA5, 0x819D}, //13515 #CJK UNIFIED IDEOGRAPH
+ {0xCFA6, 0x5915}, //13516 #CJK UNIFIED IDEOGRAPH
+ {0xCFA7, 0x60DC}, //13517 #CJK UNIFIED IDEOGRAPH
+ {0xCFA8, 0x7184}, //13518 #CJK UNIFIED IDEOGRAPH
+ {0xCFA9, 0x70EF}, //13519 #CJK UNIFIED IDEOGRAPH
+ {0xCFAA, 0x6EAA}, //13520 #CJK UNIFIED IDEOGRAPH
+ {0xCFAB, 0x6C50}, //13521 #CJK UNIFIED IDEOGRAPH
+ {0xCFAC, 0x7280}, //13522 #CJK UNIFIED IDEOGRAPH
+ {0xCFAD, 0x6A84}, //13523 #CJK UNIFIED IDEOGRAPH
+ {0xCFAE, 0x88AD}, //13524 #CJK UNIFIED IDEOGRAPH
+ {0xCFAF, 0x5E2D}, //13525 #CJK UNIFIED IDEOGRAPH
+ {0xCFB0, 0x4E60}, //13526 #CJK UNIFIED IDEOGRAPH
+ {0xCFB1, 0x5AB3}, //13527 #CJK UNIFIED IDEOGRAPH
+ {0xCFB2, 0x559C}, //13528 #CJK UNIFIED IDEOGRAPH
+ {0xCFB3, 0x94E3}, //13529 #CJK UNIFIED IDEOGRAPH
+ {0xCFB4, 0x6D17}, //13530 #CJK UNIFIED IDEOGRAPH
+ {0xCFB5, 0x7CFB}, //13531 #CJK UNIFIED IDEOGRAPH
+ {0xCFB6, 0x9699}, //13532 #CJK UNIFIED IDEOGRAPH
+ {0xCFB7, 0x620F}, //13533 #CJK UNIFIED IDEOGRAPH
+ {0xCFB8, 0x7EC6}, //13534 #CJK UNIFIED IDEOGRAPH
+ {0xCFB9, 0x778E}, //13535 #CJK UNIFIED IDEOGRAPH
+ {0xCFBA, 0x867E}, //13536 #CJK UNIFIED IDEOGRAPH
+ {0xCFBB, 0x5323}, //13537 #CJK UNIFIED IDEOGRAPH
+ {0xCFBC, 0x971E}, //13538 #CJK UNIFIED IDEOGRAPH
+ {0xCFBD, 0x8F96}, //13539 #CJK UNIFIED IDEOGRAPH
+ {0xCFBE, 0x6687}, //13540 #CJK UNIFIED IDEOGRAPH
+ {0xCFBF, 0x5CE1}, //13541 #CJK UNIFIED IDEOGRAPH
+ {0xCFC0, 0x4FA0}, //13542 #CJK UNIFIED IDEOGRAPH
+ {0xCFC1, 0x72ED}, //13543 #CJK UNIFIED IDEOGRAPH
+ {0xCFC2, 0x4E0B}, //13544 #CJK UNIFIED IDEOGRAPH
+ {0xCFC3, 0x53A6}, //13545 #CJK UNIFIED IDEOGRAPH
+ {0xCFC4, 0x590F}, //13546 #CJK UNIFIED IDEOGRAPH
+ {0xCFC5, 0x5413}, //13547 #CJK UNIFIED IDEOGRAPH
+ {0xCFC6, 0x6380}, //13548 #CJK UNIFIED IDEOGRAPH
+ {0xCFC7, 0x9528}, //13549 #CJK UNIFIED IDEOGRAPH
+ {0xCFC8, 0x5148}, //13550 #CJK UNIFIED IDEOGRAPH
+ {0xCFC9, 0x4ED9}, //13551 #CJK UNIFIED IDEOGRAPH
+ {0xCFCA, 0x9C9C}, //13552 #CJK UNIFIED IDEOGRAPH
+ {0xCFCB, 0x7EA4}, //13553 #CJK UNIFIED IDEOGRAPH
+ {0xCFCC, 0x54B8}, //13554 #CJK UNIFIED IDEOGRAPH
+ {0xCFCD, 0x8D24}, //13555 #CJK UNIFIED IDEOGRAPH
+ {0xCFCE, 0x8854}, //13556 #CJK UNIFIED IDEOGRAPH
+ {0xCFCF, 0x8237}, //13557 #CJK UNIFIED IDEOGRAPH
+ {0xCFD0, 0x95F2}, //13558 #CJK UNIFIED IDEOGRAPH
+ {0xCFD1, 0x6D8E}, //13559 #CJK UNIFIED IDEOGRAPH
+ {0xCFD2, 0x5F26}, //13560 #CJK UNIFIED IDEOGRAPH
+ {0xCFD3, 0x5ACC}, //13561 #CJK UNIFIED IDEOGRAPH
+ {0xCFD4, 0x663E}, //13562 #CJK UNIFIED IDEOGRAPH
+ {0xCFD5, 0x9669}, //13563 #CJK UNIFIED IDEOGRAPH
+ {0xCFD6, 0x73B0}, //13564 #CJK UNIFIED IDEOGRAPH
+ {0xCFD7, 0x732E}, //13565 #CJK UNIFIED IDEOGRAPH
+ {0xCFD8, 0x53BF}, //13566 #CJK UNIFIED IDEOGRAPH
+ {0xCFD9, 0x817A}, //13567 #CJK UNIFIED IDEOGRAPH
+ {0xCFDA, 0x9985}, //13568 #CJK UNIFIED IDEOGRAPH
+ {0xCFDB, 0x7FA1}, //13569 #CJK UNIFIED IDEOGRAPH
+ {0xCFDC, 0x5BAA}, //13570 #CJK UNIFIED IDEOGRAPH
+ {0xCFDD, 0x9677}, //13571 #CJK UNIFIED IDEOGRAPH
+ {0xCFDE, 0x9650}, //13572 #CJK UNIFIED IDEOGRAPH
+ {0xCFDF, 0x7EBF}, //13573 #CJK UNIFIED IDEOGRAPH
+ {0xCFE0, 0x76F8}, //13574 #CJK UNIFIED IDEOGRAPH
+ {0xCFE1, 0x53A2}, //13575 #CJK UNIFIED IDEOGRAPH
+ {0xCFE2, 0x9576}, //13576 #CJK UNIFIED IDEOGRAPH
+ {0xCFE3, 0x9999}, //13577 #CJK UNIFIED IDEOGRAPH
+ {0xCFE4, 0x7BB1}, //13578 #CJK UNIFIED IDEOGRAPH
+ {0xCFE5, 0x8944}, //13579 #CJK UNIFIED IDEOGRAPH
+ {0xCFE6, 0x6E58}, //13580 #CJK UNIFIED IDEOGRAPH
+ {0xCFE7, 0x4E61}, //13581 #CJK UNIFIED IDEOGRAPH
+ {0xCFE8, 0x7FD4}, //13582 #CJK UNIFIED IDEOGRAPH
+ {0xCFE9, 0x7965}, //13583 #CJK UNIFIED IDEOGRAPH
+ {0xCFEA, 0x8BE6}, //13584 #CJK UNIFIED IDEOGRAPH
+ {0xCFEB, 0x60F3}, //13585 #CJK UNIFIED IDEOGRAPH
+ {0xCFEC, 0x54CD}, //13586 #CJK UNIFIED IDEOGRAPH
+ {0xCFED, 0x4EAB}, //13587 #CJK UNIFIED IDEOGRAPH
+ {0xCFEE, 0x9879}, //13588 #CJK UNIFIED IDEOGRAPH
+ {0xCFEF, 0x5DF7}, //13589 #CJK UNIFIED IDEOGRAPH
+ {0xCFF0, 0x6A61}, //13590 #CJK UNIFIED IDEOGRAPH
+ {0xCFF1, 0x50CF}, //13591 #CJK UNIFIED IDEOGRAPH
+ {0xCFF2, 0x5411}, //13592 #CJK UNIFIED IDEOGRAPH
+ {0xCFF3, 0x8C61}, //13593 #CJK UNIFIED IDEOGRAPH
+ {0xCFF4, 0x8427}, //13594 #CJK UNIFIED IDEOGRAPH
+ {0xCFF5, 0x785D}, //13595 #CJK UNIFIED IDEOGRAPH
+ {0xCFF6, 0x9704}, //13596 #CJK UNIFIED IDEOGRAPH
+ {0xCFF7, 0x524A}, //13597 #CJK UNIFIED IDEOGRAPH
+ {0xCFF8, 0x54EE}, //13598 #CJK UNIFIED IDEOGRAPH
+ {0xCFF9, 0x56A3}, //13599 #CJK UNIFIED IDEOGRAPH
+ {0xCFFA, 0x9500}, //13600 #CJK UNIFIED IDEOGRAPH
+ {0xCFFB, 0x6D88}, //13601 #CJK UNIFIED IDEOGRAPH
+ {0xCFFC, 0x5BB5}, //13602 #CJK UNIFIED IDEOGRAPH
+ {0xCFFD, 0x6DC6}, //13603 #CJK UNIFIED IDEOGRAPH
+ {0xCFFE, 0x6653}, //13604 #CJK UNIFIED IDEOGRAPH
+ {0xD040, 0x8824}, //13605 #CJK UNIFIED IDEOGRAPH
+ {0xD041, 0x8825}, //13606 #CJK UNIFIED IDEOGRAPH
+ {0xD042, 0x8826}, //13607 #CJK UNIFIED IDEOGRAPH
+ {0xD043, 0x8827}, //13608 #CJK UNIFIED IDEOGRAPH
+ {0xD044, 0x8828}, //13609 #CJK UNIFIED IDEOGRAPH
+ {0xD045, 0x8829}, //13610 #CJK UNIFIED IDEOGRAPH
+ {0xD046, 0x882A}, //13611 #CJK UNIFIED IDEOGRAPH
+ {0xD047, 0x882B}, //13612 #CJK UNIFIED IDEOGRAPH
+ {0xD048, 0x882C}, //13613 #CJK UNIFIED IDEOGRAPH
+ {0xD049, 0x882D}, //13614 #CJK UNIFIED IDEOGRAPH
+ {0xD04A, 0x882E}, //13615 #CJK UNIFIED IDEOGRAPH
+ {0xD04B, 0x882F}, //13616 #CJK UNIFIED IDEOGRAPH
+ {0xD04C, 0x8830}, //13617 #CJK UNIFIED IDEOGRAPH
+ {0xD04D, 0x8831}, //13618 #CJK UNIFIED IDEOGRAPH
+ {0xD04E, 0x8833}, //13619 #CJK UNIFIED IDEOGRAPH
+ {0xD04F, 0x8834}, //13620 #CJK UNIFIED IDEOGRAPH
+ {0xD050, 0x8835}, //13621 #CJK UNIFIED IDEOGRAPH
+ {0xD051, 0x8836}, //13622 #CJK UNIFIED IDEOGRAPH
+ {0xD052, 0x8837}, //13623 #CJK UNIFIED IDEOGRAPH
+ {0xD053, 0x8838}, //13624 #CJK UNIFIED IDEOGRAPH
+ {0xD054, 0x883A}, //13625 #CJK UNIFIED IDEOGRAPH
+ {0xD055, 0x883B}, //13626 #CJK UNIFIED IDEOGRAPH
+ {0xD056, 0x883D}, //13627 #CJK UNIFIED IDEOGRAPH
+ {0xD057, 0x883E}, //13628 #CJK UNIFIED IDEOGRAPH
+ {0xD058, 0x883F}, //13629 #CJK UNIFIED IDEOGRAPH
+ {0xD059, 0x8841}, //13630 #CJK UNIFIED IDEOGRAPH
+ {0xD05A, 0x8842}, //13631 #CJK UNIFIED IDEOGRAPH
+ {0xD05B, 0x8843}, //13632 #CJK UNIFIED IDEOGRAPH
+ {0xD05C, 0x8846}, //13633 #CJK UNIFIED IDEOGRAPH
+ {0xD05D, 0x8847}, //13634 #CJK UNIFIED IDEOGRAPH
+ {0xD05E, 0x8848}, //13635 #CJK UNIFIED IDEOGRAPH
+ {0xD05F, 0x8849}, //13636 #CJK UNIFIED IDEOGRAPH
+ {0xD060, 0x884A}, //13637 #CJK UNIFIED IDEOGRAPH
+ {0xD061, 0x884B}, //13638 #CJK UNIFIED IDEOGRAPH
+ {0xD062, 0x884E}, //13639 #CJK UNIFIED IDEOGRAPH
+ {0xD063, 0x884F}, //13640 #CJK UNIFIED IDEOGRAPH
+ {0xD064, 0x8850}, //13641 #CJK UNIFIED IDEOGRAPH
+ {0xD065, 0x8851}, //13642 #CJK UNIFIED IDEOGRAPH
+ {0xD066, 0x8852}, //13643 #CJK UNIFIED IDEOGRAPH
+ {0xD067, 0x8853}, //13644 #CJK UNIFIED IDEOGRAPH
+ {0xD068, 0x8855}, //13645 #CJK UNIFIED IDEOGRAPH
+ {0xD069, 0x8856}, //13646 #CJK UNIFIED IDEOGRAPH
+ {0xD06A, 0x8858}, //13647 #CJK UNIFIED IDEOGRAPH
+ {0xD06B, 0x885A}, //13648 #CJK UNIFIED IDEOGRAPH
+ {0xD06C, 0x885B}, //13649 #CJK UNIFIED IDEOGRAPH
+ {0xD06D, 0x885C}, //13650 #CJK UNIFIED IDEOGRAPH
+ {0xD06E, 0x885D}, //13651 #CJK UNIFIED IDEOGRAPH
+ {0xD06F, 0x885E}, //13652 #CJK UNIFIED IDEOGRAPH
+ {0xD070, 0x885F}, //13653 #CJK UNIFIED IDEOGRAPH
+ {0xD071, 0x8860}, //13654 #CJK UNIFIED IDEOGRAPH
+ {0xD072, 0x8866}, //13655 #CJK UNIFIED IDEOGRAPH
+ {0xD073, 0x8867}, //13656 #CJK UNIFIED IDEOGRAPH
+ {0xD074, 0x886A}, //13657 #CJK UNIFIED IDEOGRAPH
+ {0xD075, 0x886D}, //13658 #CJK UNIFIED IDEOGRAPH
+ {0xD076, 0x886F}, //13659 #CJK UNIFIED IDEOGRAPH
+ {0xD077, 0x8871}, //13660 #CJK UNIFIED IDEOGRAPH
+ {0xD078, 0x8873}, //13661 #CJK UNIFIED IDEOGRAPH
+ {0xD079, 0x8874}, //13662 #CJK UNIFIED IDEOGRAPH
+ {0xD07A, 0x8875}, //13663 #CJK UNIFIED IDEOGRAPH
+ {0xD07B, 0x8876}, //13664 #CJK UNIFIED IDEOGRAPH
+ {0xD07C, 0x8878}, //13665 #CJK UNIFIED IDEOGRAPH
+ {0xD07D, 0x8879}, //13666 #CJK UNIFIED IDEOGRAPH
+ {0xD07E, 0x887A}, //13667 #CJK UNIFIED IDEOGRAPH
+ {0xD080, 0x887B}, //13668 #CJK UNIFIED IDEOGRAPH
+ {0xD081, 0x887C}, //13669 #CJK UNIFIED IDEOGRAPH
+ {0xD082, 0x8880}, //13670 #CJK UNIFIED IDEOGRAPH
+ {0xD083, 0x8883}, //13671 #CJK UNIFIED IDEOGRAPH
+ {0xD084, 0x8886}, //13672 #CJK UNIFIED IDEOGRAPH
+ {0xD085, 0x8887}, //13673 #CJK UNIFIED IDEOGRAPH
+ {0xD086, 0x8889}, //13674 #CJK UNIFIED IDEOGRAPH
+ {0xD087, 0x888A}, //13675 #CJK UNIFIED IDEOGRAPH
+ {0xD088, 0x888C}, //13676 #CJK UNIFIED IDEOGRAPH
+ {0xD089, 0x888E}, //13677 #CJK UNIFIED IDEOGRAPH
+ {0xD08A, 0x888F}, //13678 #CJK UNIFIED IDEOGRAPH
+ {0xD08B, 0x8890}, //13679 #CJK UNIFIED IDEOGRAPH
+ {0xD08C, 0x8891}, //13680 #CJK UNIFIED IDEOGRAPH
+ {0xD08D, 0x8893}, //13681 #CJK UNIFIED IDEOGRAPH
+ {0xD08E, 0x8894}, //13682 #CJK UNIFIED IDEOGRAPH
+ {0xD08F, 0x8895}, //13683 #CJK UNIFIED IDEOGRAPH
+ {0xD090, 0x8897}, //13684 #CJK UNIFIED IDEOGRAPH
+ {0xD091, 0x8898}, //13685 #CJK UNIFIED IDEOGRAPH
+ {0xD092, 0x8899}, //13686 #CJK UNIFIED IDEOGRAPH
+ {0xD093, 0x889A}, //13687 #CJK UNIFIED IDEOGRAPH
+ {0xD094, 0x889B}, //13688 #CJK UNIFIED IDEOGRAPH
+ {0xD095, 0x889D}, //13689 #CJK UNIFIED IDEOGRAPH
+ {0xD096, 0x889E}, //13690 #CJK UNIFIED IDEOGRAPH
+ {0xD097, 0x889F}, //13691 #CJK UNIFIED IDEOGRAPH
+ {0xD098, 0x88A0}, //13692 #CJK UNIFIED IDEOGRAPH
+ {0xD099, 0x88A1}, //13693 #CJK UNIFIED IDEOGRAPH
+ {0xD09A, 0x88A3}, //13694 #CJK UNIFIED IDEOGRAPH
+ {0xD09B, 0x88A5}, //13695 #CJK UNIFIED IDEOGRAPH
+ {0xD09C, 0x88A6}, //13696 #CJK UNIFIED IDEOGRAPH
+ {0xD09D, 0x88A7}, //13697 #CJK UNIFIED IDEOGRAPH
+ {0xD09E, 0x88A8}, //13698 #CJK UNIFIED IDEOGRAPH
+ {0xD09F, 0x88A9}, //13699 #CJK UNIFIED IDEOGRAPH
+ {0xD0A0, 0x88AA}, //13700 #CJK UNIFIED IDEOGRAPH
+ {0xD0A1, 0x5C0F}, //13701 #CJK UNIFIED IDEOGRAPH
+ {0xD0A2, 0x5B5D}, //13702 #CJK UNIFIED IDEOGRAPH
+ {0xD0A3, 0x6821}, //13703 #CJK UNIFIED IDEOGRAPH
+ {0xD0A4, 0x8096}, //13704 #CJK UNIFIED IDEOGRAPH
+ {0xD0A5, 0x5578}, //13705 #CJK UNIFIED IDEOGRAPH
+ {0xD0A6, 0x7B11}, //13706 #CJK UNIFIED IDEOGRAPH
+ {0xD0A7, 0x6548}, //13707 #CJK UNIFIED IDEOGRAPH
+ {0xD0A8, 0x6954}, //13708 #CJK UNIFIED IDEOGRAPH
+ {0xD0A9, 0x4E9B}, //13709 #CJK UNIFIED IDEOGRAPH
+ {0xD0AA, 0x6B47}, //13710 #CJK UNIFIED IDEOGRAPH
+ {0xD0AB, 0x874E}, //13711 #CJK UNIFIED IDEOGRAPH
+ {0xD0AC, 0x978B}, //13712 #CJK UNIFIED IDEOGRAPH
+ {0xD0AD, 0x534F}, //13713 #CJK UNIFIED IDEOGRAPH
+ {0xD0AE, 0x631F}, //13714 #CJK UNIFIED IDEOGRAPH
+ {0xD0AF, 0x643A}, //13715 #CJK UNIFIED IDEOGRAPH
+ {0xD0B0, 0x90AA}, //13716 #CJK UNIFIED IDEOGRAPH
+ {0xD0B1, 0x659C}, //13717 #CJK UNIFIED IDEOGRAPH
+ {0xD0B2, 0x80C1}, //13718 #CJK UNIFIED IDEOGRAPH
+ {0xD0B3, 0x8C10}, //13719 #CJK UNIFIED IDEOGRAPH
+ {0xD0B4, 0x5199}, //13720 #CJK UNIFIED IDEOGRAPH
+ {0xD0B5, 0x68B0}, //13721 #CJK UNIFIED IDEOGRAPH
+ {0xD0B6, 0x5378}, //13722 #CJK UNIFIED IDEOGRAPH
+ {0xD0B7, 0x87F9}, //13723 #CJK UNIFIED IDEOGRAPH
+ {0xD0B8, 0x61C8}, //13724 #CJK UNIFIED IDEOGRAPH
+ {0xD0B9, 0x6CC4}, //13725 #CJK UNIFIED IDEOGRAPH
+ {0xD0BA, 0x6CFB}, //13726 #CJK UNIFIED IDEOGRAPH
+ {0xD0BB, 0x8C22}, //13727 #CJK UNIFIED IDEOGRAPH
+ {0xD0BC, 0x5C51}, //13728 #CJK UNIFIED IDEOGRAPH
+ {0xD0BD, 0x85AA}, //13729 #CJK UNIFIED IDEOGRAPH
+ {0xD0BE, 0x82AF}, //13730 #CJK UNIFIED IDEOGRAPH
+ {0xD0BF, 0x950C}, //13731 #CJK UNIFIED IDEOGRAPH
+ {0xD0C0, 0x6B23}, //13732 #CJK UNIFIED IDEOGRAPH
+ {0xD0C1, 0x8F9B}, //13733 #CJK UNIFIED IDEOGRAPH
+ {0xD0C2, 0x65B0}, //13734 #CJK UNIFIED IDEOGRAPH
+ {0xD0C3, 0x5FFB}, //13735 #CJK UNIFIED IDEOGRAPH
+ {0xD0C4, 0x5FC3}, //13736 #CJK UNIFIED IDEOGRAPH
+ {0xD0C5, 0x4FE1}, //13737 #CJK UNIFIED IDEOGRAPH
+ {0xD0C6, 0x8845}, //13738 #CJK UNIFIED IDEOGRAPH
+ {0xD0C7, 0x661F}, //13739 #CJK UNIFIED IDEOGRAPH
+ {0xD0C8, 0x8165}, //13740 #CJK UNIFIED IDEOGRAPH
+ {0xD0C9, 0x7329}, //13741 #CJK UNIFIED IDEOGRAPH
+ {0xD0CA, 0x60FA}, //13742 #CJK UNIFIED IDEOGRAPH
+ {0xD0CB, 0x5174}, //13743 #CJK UNIFIED IDEOGRAPH
+ {0xD0CC, 0x5211}, //13744 #CJK UNIFIED IDEOGRAPH
+ {0xD0CD, 0x578B}, //13745 #CJK UNIFIED IDEOGRAPH
+ {0xD0CE, 0x5F62}, //13746 #CJK UNIFIED IDEOGRAPH
+ {0xD0CF, 0x90A2}, //13747 #CJK UNIFIED IDEOGRAPH
+ {0xD0D0, 0x884C}, //13748 #CJK UNIFIED IDEOGRAPH
+ {0xD0D1, 0x9192}, //13749 #CJK UNIFIED IDEOGRAPH
+ {0xD0D2, 0x5E78}, //13750 #CJK UNIFIED IDEOGRAPH
+ {0xD0D3, 0x674F}, //13751 #CJK UNIFIED IDEOGRAPH
+ {0xD0D4, 0x6027}, //13752 #CJK UNIFIED IDEOGRAPH
+ {0xD0D5, 0x59D3}, //13753 #CJK UNIFIED IDEOGRAPH
+ {0xD0D6, 0x5144}, //13754 #CJK UNIFIED IDEOGRAPH
+ {0xD0D7, 0x51F6}, //13755 #CJK UNIFIED IDEOGRAPH
+ {0xD0D8, 0x80F8}, //13756 #CJK UNIFIED IDEOGRAPH
+ {0xD0D9, 0x5308}, //13757 #CJK UNIFIED IDEOGRAPH
+ {0xD0DA, 0x6C79}, //13758 #CJK UNIFIED IDEOGRAPH
+ {0xD0DB, 0x96C4}, //13759 #CJK UNIFIED IDEOGRAPH
+ {0xD0DC, 0x718A}, //13760 #CJK UNIFIED IDEOGRAPH
+ {0xD0DD, 0x4F11}, //13761 #CJK UNIFIED IDEOGRAPH
+ {0xD0DE, 0x4FEE}, //13762 #CJK UNIFIED IDEOGRAPH
+ {0xD0DF, 0x7F9E}, //13763 #CJK UNIFIED IDEOGRAPH
+ {0xD0E0, 0x673D}, //13764 #CJK UNIFIED IDEOGRAPH
+ {0xD0E1, 0x55C5}, //13765 #CJK UNIFIED IDEOGRAPH
+ {0xD0E2, 0x9508}, //13766 #CJK UNIFIED IDEOGRAPH
+ {0xD0E3, 0x79C0}, //13767 #CJK UNIFIED IDEOGRAPH
+ {0xD0E4, 0x8896}, //13768 #CJK UNIFIED IDEOGRAPH
+ {0xD0E5, 0x7EE3}, //13769 #CJK UNIFIED IDEOGRAPH
+ {0xD0E6, 0x589F}, //13770 #CJK UNIFIED IDEOGRAPH
+ {0xD0E7, 0x620C}, //13771 #CJK UNIFIED IDEOGRAPH
+ {0xD0E8, 0x9700}, //13772 #CJK UNIFIED IDEOGRAPH
+ {0xD0E9, 0x865A}, //13773 #CJK UNIFIED IDEOGRAPH
+ {0xD0EA, 0x5618}, //13774 #CJK UNIFIED IDEOGRAPH
+ {0xD0EB, 0x987B}, //13775 #CJK UNIFIED IDEOGRAPH
+ {0xD0EC, 0x5F90}, //13776 #CJK UNIFIED IDEOGRAPH
+ {0xD0ED, 0x8BB8}, //13777 #CJK UNIFIED IDEOGRAPH
+ {0xD0EE, 0x84C4}, //13778 #CJK UNIFIED IDEOGRAPH
+ {0xD0EF, 0x9157}, //13779 #CJK UNIFIED IDEOGRAPH
+ {0xD0F0, 0x53D9}, //13780 #CJK UNIFIED IDEOGRAPH
+ {0xD0F1, 0x65ED}, //13781 #CJK UNIFIED IDEOGRAPH
+ {0xD0F2, 0x5E8F}, //13782 #CJK UNIFIED IDEOGRAPH
+ {0xD0F3, 0x755C}, //13783 #CJK UNIFIED IDEOGRAPH
+ {0xD0F4, 0x6064}, //13784 #CJK UNIFIED IDEOGRAPH
+ {0xD0F5, 0x7D6E}, //13785 #CJK UNIFIED IDEOGRAPH
+ {0xD0F6, 0x5A7F}, //13786 #CJK UNIFIED IDEOGRAPH
+ {0xD0F7, 0x7EEA}, //13787 #CJK UNIFIED IDEOGRAPH
+ {0xD0F8, 0x7EED}, //13788 #CJK UNIFIED IDEOGRAPH
+ {0xD0F9, 0x8F69}, //13789 #CJK UNIFIED IDEOGRAPH
+ {0xD0FA, 0x55A7}, //13790 #CJK UNIFIED IDEOGRAPH
+ {0xD0FB, 0x5BA3}, //13791 #CJK UNIFIED IDEOGRAPH
+ {0xD0FC, 0x60AC}, //13792 #CJK UNIFIED IDEOGRAPH
+ {0xD0FD, 0x65CB}, //13793 #CJK UNIFIED IDEOGRAPH
+ {0xD0FE, 0x7384}, //13794 #CJK UNIFIED IDEOGRAPH
+ {0xD140, 0x88AC}, //13795 #CJK UNIFIED IDEOGRAPH
+ {0xD141, 0x88AE}, //13796 #CJK UNIFIED IDEOGRAPH
+ {0xD142, 0x88AF}, //13797 #CJK UNIFIED IDEOGRAPH
+ {0xD143, 0x88B0}, //13798 #CJK UNIFIED IDEOGRAPH
+ {0xD144, 0x88B2}, //13799 #CJK UNIFIED IDEOGRAPH
+ {0xD145, 0x88B3}, //13800 #CJK UNIFIED IDEOGRAPH
+ {0xD146, 0x88B4}, //13801 #CJK UNIFIED IDEOGRAPH
+ {0xD147, 0x88B5}, //13802 #CJK UNIFIED IDEOGRAPH
+ {0xD148, 0x88B6}, //13803 #CJK UNIFIED IDEOGRAPH
+ {0xD149, 0x88B8}, //13804 #CJK UNIFIED IDEOGRAPH
+ {0xD14A, 0x88B9}, //13805 #CJK UNIFIED IDEOGRAPH
+ {0xD14B, 0x88BA}, //13806 #CJK UNIFIED IDEOGRAPH
+ {0xD14C, 0x88BB}, //13807 #CJK UNIFIED IDEOGRAPH
+ {0xD14D, 0x88BD}, //13808 #CJK UNIFIED IDEOGRAPH
+ {0xD14E, 0x88BE}, //13809 #CJK UNIFIED IDEOGRAPH
+ {0xD14F, 0x88BF}, //13810 #CJK UNIFIED IDEOGRAPH
+ {0xD150, 0x88C0}, //13811 #CJK UNIFIED IDEOGRAPH
+ {0xD151, 0x88C3}, //13812 #CJK UNIFIED IDEOGRAPH
+ {0xD152, 0x88C4}, //13813 #CJK UNIFIED IDEOGRAPH
+ {0xD153, 0x88C7}, //13814 #CJK UNIFIED IDEOGRAPH
+ {0xD154, 0x88C8}, //13815 #CJK UNIFIED IDEOGRAPH
+ {0xD155, 0x88CA}, //13816 #CJK UNIFIED IDEOGRAPH
+ {0xD156, 0x88CB}, //13817 #CJK UNIFIED IDEOGRAPH
+ {0xD157, 0x88CC}, //13818 #CJK UNIFIED IDEOGRAPH
+ {0xD158, 0x88CD}, //13819 #CJK UNIFIED IDEOGRAPH
+ {0xD159, 0x88CF}, //13820 #CJK UNIFIED IDEOGRAPH
+ {0xD15A, 0x88D0}, //13821 #CJK UNIFIED IDEOGRAPH
+ {0xD15B, 0x88D1}, //13822 #CJK UNIFIED IDEOGRAPH
+ {0xD15C, 0x88D3}, //13823 #CJK UNIFIED IDEOGRAPH
+ {0xD15D, 0x88D6}, //13824 #CJK UNIFIED IDEOGRAPH
+ {0xD15E, 0x88D7}, //13825 #CJK UNIFIED IDEOGRAPH
+ {0xD15F, 0x88DA}, //13826 #CJK UNIFIED IDEOGRAPH
+ {0xD160, 0x88DB}, //13827 #CJK UNIFIED IDEOGRAPH
+ {0xD161, 0x88DC}, //13828 #CJK UNIFIED IDEOGRAPH
+ {0xD162, 0x88DD}, //13829 #CJK UNIFIED IDEOGRAPH
+ {0xD163, 0x88DE}, //13830 #CJK UNIFIED IDEOGRAPH
+ {0xD164, 0x88E0}, //13831 #CJK UNIFIED IDEOGRAPH
+ {0xD165, 0x88E1}, //13832 #CJK UNIFIED IDEOGRAPH
+ {0xD166, 0x88E6}, //13833 #CJK UNIFIED IDEOGRAPH
+ {0xD167, 0x88E7}, //13834 #CJK UNIFIED IDEOGRAPH
+ {0xD168, 0x88E9}, //13835 #CJK UNIFIED IDEOGRAPH
+ {0xD169, 0x88EA}, //13836 #CJK UNIFIED IDEOGRAPH
+ {0xD16A, 0x88EB}, //13837 #CJK UNIFIED IDEOGRAPH
+ {0xD16B, 0x88EC}, //13838 #CJK UNIFIED IDEOGRAPH
+ {0xD16C, 0x88ED}, //13839 #CJK UNIFIED IDEOGRAPH
+ {0xD16D, 0x88EE}, //13840 #CJK UNIFIED IDEOGRAPH
+ {0xD16E, 0x88EF}, //13841 #CJK UNIFIED IDEOGRAPH
+ {0xD16F, 0x88F2}, //13842 #CJK UNIFIED IDEOGRAPH
+ {0xD170, 0x88F5}, //13843 #CJK UNIFIED IDEOGRAPH
+ {0xD171, 0x88F6}, //13844 #CJK UNIFIED IDEOGRAPH
+ {0xD172, 0x88F7}, //13845 #CJK UNIFIED IDEOGRAPH
+ {0xD173, 0x88FA}, //13846 #CJK UNIFIED IDEOGRAPH
+ {0xD174, 0x88FB}, //13847 #CJK UNIFIED IDEOGRAPH
+ {0xD175, 0x88FD}, //13848 #CJK UNIFIED IDEOGRAPH
+ {0xD176, 0x88FF}, //13849 #CJK UNIFIED IDEOGRAPH
+ {0xD177, 0x8900}, //13850 #CJK UNIFIED IDEOGRAPH
+ {0xD178, 0x8901}, //13851 #CJK UNIFIED IDEOGRAPH
+ {0xD179, 0x8903}, //13852 #CJK UNIFIED IDEOGRAPH
+ {0xD17A, 0x8904}, //13853 #CJK UNIFIED IDEOGRAPH
+ {0xD17B, 0x8905}, //13854 #CJK UNIFIED IDEOGRAPH
+ {0xD17C, 0x8906}, //13855 #CJK UNIFIED IDEOGRAPH
+ {0xD17D, 0x8907}, //13856 #CJK UNIFIED IDEOGRAPH
+ {0xD17E, 0x8908}, //13857 #CJK UNIFIED IDEOGRAPH
+ {0xD180, 0x8909}, //13858 #CJK UNIFIED IDEOGRAPH
+ {0xD181, 0x890B}, //13859 #CJK UNIFIED IDEOGRAPH
+ {0xD182, 0x890C}, //13860 #CJK UNIFIED IDEOGRAPH
+ {0xD183, 0x890D}, //13861 #CJK UNIFIED IDEOGRAPH
+ {0xD184, 0x890E}, //13862 #CJK UNIFIED IDEOGRAPH
+ {0xD185, 0x890F}, //13863 #CJK UNIFIED IDEOGRAPH
+ {0xD186, 0x8911}, //13864 #CJK UNIFIED IDEOGRAPH
+ {0xD187, 0x8914}, //13865 #CJK UNIFIED IDEOGRAPH
+ {0xD188, 0x8915}, //13866 #CJK UNIFIED IDEOGRAPH
+ {0xD189, 0x8916}, //13867 #CJK UNIFIED IDEOGRAPH
+ {0xD18A, 0x8917}, //13868 #CJK UNIFIED IDEOGRAPH
+ {0xD18B, 0x8918}, //13869 #CJK UNIFIED IDEOGRAPH
+ {0xD18C, 0x891C}, //13870 #CJK UNIFIED IDEOGRAPH
+ {0xD18D, 0x891D}, //13871 #CJK UNIFIED IDEOGRAPH
+ {0xD18E, 0x891E}, //13872 #CJK UNIFIED IDEOGRAPH
+ {0xD18F, 0x891F}, //13873 #CJK UNIFIED IDEOGRAPH
+ {0xD190, 0x8920}, //13874 #CJK UNIFIED IDEOGRAPH
+ {0xD191, 0x8922}, //13875 #CJK UNIFIED IDEOGRAPH
+ {0xD192, 0x8923}, //13876 #CJK UNIFIED IDEOGRAPH
+ {0xD193, 0x8924}, //13877 #CJK UNIFIED IDEOGRAPH
+ {0xD194, 0x8926}, //13878 #CJK UNIFIED IDEOGRAPH
+ {0xD195, 0x8927}, //13879 #CJK UNIFIED IDEOGRAPH
+ {0xD196, 0x8928}, //13880 #CJK UNIFIED IDEOGRAPH
+ {0xD197, 0x8929}, //13881 #CJK UNIFIED IDEOGRAPH
+ {0xD198, 0x892C}, //13882 #CJK UNIFIED IDEOGRAPH
+ {0xD199, 0x892D}, //13883 #CJK UNIFIED IDEOGRAPH
+ {0xD19A, 0x892E}, //13884 #CJK UNIFIED IDEOGRAPH
+ {0xD19B, 0x892F}, //13885 #CJK UNIFIED IDEOGRAPH
+ {0xD19C, 0x8931}, //13886 #CJK UNIFIED IDEOGRAPH
+ {0xD19D, 0x8932}, //13887 #CJK UNIFIED IDEOGRAPH
+ {0xD19E, 0x8933}, //13888 #CJK UNIFIED IDEOGRAPH
+ {0xD19F, 0x8935}, //13889 #CJK UNIFIED IDEOGRAPH
+ {0xD1A0, 0x8937}, //13890 #CJK UNIFIED IDEOGRAPH
+ {0xD1A1, 0x9009}, //13891 #CJK UNIFIED IDEOGRAPH
+ {0xD1A2, 0x7663}, //13892 #CJK UNIFIED IDEOGRAPH
+ {0xD1A3, 0x7729}, //13893 #CJK UNIFIED IDEOGRAPH
+ {0xD1A4, 0x7EDA}, //13894 #CJK UNIFIED IDEOGRAPH
+ {0xD1A5, 0x9774}, //13895 #CJK UNIFIED IDEOGRAPH
+ {0xD1A6, 0x859B}, //13896 #CJK UNIFIED IDEOGRAPH
+ {0xD1A7, 0x5B66}, //13897 #CJK UNIFIED IDEOGRAPH
+ {0xD1A8, 0x7A74}, //13898 #CJK UNIFIED IDEOGRAPH
+ {0xD1A9, 0x96EA}, //13899 #CJK UNIFIED IDEOGRAPH
+ {0xD1AA, 0x8840}, //13900 #CJK UNIFIED IDEOGRAPH
+ {0xD1AB, 0x52CB}, //13901 #CJK UNIFIED IDEOGRAPH
+ {0xD1AC, 0x718F}, //13902 #CJK UNIFIED IDEOGRAPH
+ {0xD1AD, 0x5FAA}, //13903 #CJK UNIFIED IDEOGRAPH
+ {0xD1AE, 0x65EC}, //13904 #CJK UNIFIED IDEOGRAPH
+ {0xD1AF, 0x8BE2}, //13905 #CJK UNIFIED IDEOGRAPH
+ {0xD1B0, 0x5BFB}, //13906 #CJK UNIFIED IDEOGRAPH
+ {0xD1B1, 0x9A6F}, //13907 #CJK UNIFIED IDEOGRAPH
+ {0xD1B2, 0x5DE1}, //13908 #CJK UNIFIED IDEOGRAPH
+ {0xD1B3, 0x6B89}, //13909 #CJK UNIFIED IDEOGRAPH
+ {0xD1B4, 0x6C5B}, //13910 #CJK UNIFIED IDEOGRAPH
+ {0xD1B5, 0x8BAD}, //13911 #CJK UNIFIED IDEOGRAPH
+ {0xD1B6, 0x8BAF}, //13912 #CJK UNIFIED IDEOGRAPH
+ {0xD1B7, 0x900A}, //13913 #CJK UNIFIED IDEOGRAPH
+ {0xD1B8, 0x8FC5}, //13914 #CJK UNIFIED IDEOGRAPH
+ {0xD1B9, 0x538B}, //13915 #CJK UNIFIED IDEOGRAPH
+ {0xD1BA, 0x62BC}, //13916 #CJK UNIFIED IDEOGRAPH
+ {0xD1BB, 0x9E26}, //13917 #CJK UNIFIED IDEOGRAPH
+ {0xD1BC, 0x9E2D}, //13918 #CJK UNIFIED IDEOGRAPH
+ {0xD1BD, 0x5440}, //13919 #CJK UNIFIED IDEOGRAPH
+ {0xD1BE, 0x4E2B}, //13920 #CJK UNIFIED IDEOGRAPH
+ {0xD1BF, 0x82BD}, //13921 #CJK UNIFIED IDEOGRAPH
+ {0xD1C0, 0x7259}, //13922 #CJK UNIFIED IDEOGRAPH
+ {0xD1C1, 0x869C}, //13923 #CJK UNIFIED IDEOGRAPH
+ {0xD1C2, 0x5D16}, //13924 #CJK UNIFIED IDEOGRAPH
+ {0xD1C3, 0x8859}, //13925 #CJK UNIFIED IDEOGRAPH
+ {0xD1C4, 0x6DAF}, //13926 #CJK UNIFIED IDEOGRAPH
+ {0xD1C5, 0x96C5}, //13927 #CJK UNIFIED IDEOGRAPH
+ {0xD1C6, 0x54D1}, //13928 #CJK UNIFIED IDEOGRAPH
+ {0xD1C7, 0x4E9A}, //13929 #CJK UNIFIED IDEOGRAPH
+ {0xD1C8, 0x8BB6}, //13930 #CJK UNIFIED IDEOGRAPH
+ {0xD1C9, 0x7109}, //13931 #CJK UNIFIED IDEOGRAPH
+ {0xD1CA, 0x54BD}, //13932 #CJK UNIFIED IDEOGRAPH
+ {0xD1CB, 0x9609}, //13933 #CJK UNIFIED IDEOGRAPH
+ {0xD1CC, 0x70DF}, //13934 #CJK UNIFIED IDEOGRAPH
+ {0xD1CD, 0x6DF9}, //13935 #CJK UNIFIED IDEOGRAPH
+ {0xD1CE, 0x76D0}, //13936 #CJK UNIFIED IDEOGRAPH
+ {0xD1CF, 0x4E25}, //13937 #CJK UNIFIED IDEOGRAPH
+ {0xD1D0, 0x7814}, //13938 #CJK UNIFIED IDEOGRAPH
+ {0xD1D1, 0x8712}, //13939 #CJK UNIFIED IDEOGRAPH
+ {0xD1D2, 0x5CA9}, //13940 #CJK UNIFIED IDEOGRAPH
+ {0xD1D3, 0x5EF6}, //13941 #CJK UNIFIED IDEOGRAPH
+ {0xD1D4, 0x8A00}, //13942 #CJK UNIFIED IDEOGRAPH
+ {0xD1D5, 0x989C}, //13943 #CJK UNIFIED IDEOGRAPH
+ {0xD1D6, 0x960E}, //13944 #CJK UNIFIED IDEOGRAPH
+ {0xD1D7, 0x708E}, //13945 #CJK UNIFIED IDEOGRAPH
+ {0xD1D8, 0x6CBF}, //13946 #CJK UNIFIED IDEOGRAPH
+ {0xD1D9, 0x5944}, //13947 #CJK UNIFIED IDEOGRAPH
+ {0xD1DA, 0x63A9}, //13948 #CJK UNIFIED IDEOGRAPH
+ {0xD1DB, 0x773C}, //13949 #CJK UNIFIED IDEOGRAPH
+ {0xD1DC, 0x884D}, //13950 #CJK UNIFIED IDEOGRAPH
+ {0xD1DD, 0x6F14}, //13951 #CJK UNIFIED IDEOGRAPH
+ {0xD1DE, 0x8273}, //13952 #CJK UNIFIED IDEOGRAPH
+ {0xD1DF, 0x5830}, //13953 #CJK UNIFIED IDEOGRAPH
+ {0xD1E0, 0x71D5}, //13954 #CJK UNIFIED IDEOGRAPH
+ {0xD1E1, 0x538C}, //13955 #CJK UNIFIED IDEOGRAPH
+ {0xD1E2, 0x781A}, //13956 #CJK UNIFIED IDEOGRAPH
+ {0xD1E3, 0x96C1}, //13957 #CJK UNIFIED IDEOGRAPH
+ {0xD1E4, 0x5501}, //13958 #CJK UNIFIED IDEOGRAPH
+ {0xD1E5, 0x5F66}, //13959 #CJK UNIFIED IDEOGRAPH
+ {0xD1E6, 0x7130}, //13960 #CJK UNIFIED IDEOGRAPH
+ {0xD1E7, 0x5BB4}, //13961 #CJK UNIFIED IDEOGRAPH
+ {0xD1E8, 0x8C1A}, //13962 #CJK UNIFIED IDEOGRAPH
+ {0xD1E9, 0x9A8C}, //13963 #CJK UNIFIED IDEOGRAPH
+ {0xD1EA, 0x6B83}, //13964 #CJK UNIFIED IDEOGRAPH
+ {0xD1EB, 0x592E}, //13965 #CJK UNIFIED IDEOGRAPH
+ {0xD1EC, 0x9E2F}, //13966 #CJK UNIFIED IDEOGRAPH
+ {0xD1ED, 0x79E7}, //13967 #CJK UNIFIED IDEOGRAPH
+ {0xD1EE, 0x6768}, //13968 #CJK UNIFIED IDEOGRAPH
+ {0xD1EF, 0x626C}, //13969 #CJK UNIFIED IDEOGRAPH
+ {0xD1F0, 0x4F6F}, //13970 #CJK UNIFIED IDEOGRAPH
+ {0xD1F1, 0x75A1}, //13971 #CJK UNIFIED IDEOGRAPH
+ {0xD1F2, 0x7F8A}, //13972 #CJK UNIFIED IDEOGRAPH
+ {0xD1F3, 0x6D0B}, //13973 #CJK UNIFIED IDEOGRAPH
+ {0xD1F4, 0x9633}, //13974 #CJK UNIFIED IDEOGRAPH
+ {0xD1F5, 0x6C27}, //13975 #CJK UNIFIED IDEOGRAPH
+ {0xD1F6, 0x4EF0}, //13976 #CJK UNIFIED IDEOGRAPH
+ {0xD1F7, 0x75D2}, //13977 #CJK UNIFIED IDEOGRAPH
+ {0xD1F8, 0x517B}, //13978 #CJK UNIFIED IDEOGRAPH
+ {0xD1F9, 0x6837}, //13979 #CJK UNIFIED IDEOGRAPH
+ {0xD1FA, 0x6F3E}, //13980 #CJK UNIFIED IDEOGRAPH
+ {0xD1FB, 0x9080}, //13981 #CJK UNIFIED IDEOGRAPH
+ {0xD1FC, 0x8170}, //13982 #CJK UNIFIED IDEOGRAPH
+ {0xD1FD, 0x5996}, //13983 #CJK UNIFIED IDEOGRAPH
+ {0xD1FE, 0x7476}, //13984 #CJK UNIFIED IDEOGRAPH
+ {0xD240, 0x8938}, //13985 #CJK UNIFIED IDEOGRAPH
+ {0xD241, 0x8939}, //13986 #CJK UNIFIED IDEOGRAPH
+ {0xD242, 0x893A}, //13987 #CJK UNIFIED IDEOGRAPH
+ {0xD243, 0x893B}, //13988 #CJK UNIFIED IDEOGRAPH
+ {0xD244, 0x893C}, //13989 #CJK UNIFIED IDEOGRAPH
+ {0xD245, 0x893D}, //13990 #CJK UNIFIED IDEOGRAPH
+ {0xD246, 0x893E}, //13991 #CJK UNIFIED IDEOGRAPH
+ {0xD247, 0x893F}, //13992 #CJK UNIFIED IDEOGRAPH
+ {0xD248, 0x8940}, //13993 #CJK UNIFIED IDEOGRAPH
+ {0xD249, 0x8942}, //13994 #CJK UNIFIED IDEOGRAPH
+ {0xD24A, 0x8943}, //13995 #CJK UNIFIED IDEOGRAPH
+ {0xD24B, 0x8945}, //13996 #CJK UNIFIED IDEOGRAPH
+ {0xD24C, 0x8946}, //13997 #CJK UNIFIED IDEOGRAPH
+ {0xD24D, 0x8947}, //13998 #CJK UNIFIED IDEOGRAPH
+ {0xD24E, 0x8948}, //13999 #CJK UNIFIED IDEOGRAPH
+ {0xD24F, 0x8949}, //14000 #CJK UNIFIED IDEOGRAPH
+ {0xD250, 0x894A}, //14001 #CJK UNIFIED IDEOGRAPH
+ {0xD251, 0x894B}, //14002 #CJK UNIFIED IDEOGRAPH
+ {0xD252, 0x894C}, //14003 #CJK UNIFIED IDEOGRAPH
+ {0xD253, 0x894D}, //14004 #CJK UNIFIED IDEOGRAPH
+ {0xD254, 0x894E}, //14005 #CJK UNIFIED IDEOGRAPH
+ {0xD255, 0x894F}, //14006 #CJK UNIFIED IDEOGRAPH
+ {0xD256, 0x8950}, //14007 #CJK UNIFIED IDEOGRAPH
+ {0xD257, 0x8951}, //14008 #CJK UNIFIED IDEOGRAPH
+ {0xD258, 0x8952}, //14009 #CJK UNIFIED IDEOGRAPH
+ {0xD259, 0x8953}, //14010 #CJK UNIFIED IDEOGRAPH
+ {0xD25A, 0x8954}, //14011 #CJK UNIFIED IDEOGRAPH
+ {0xD25B, 0x8955}, //14012 #CJK UNIFIED IDEOGRAPH
+ {0xD25C, 0x8956}, //14013 #CJK UNIFIED IDEOGRAPH
+ {0xD25D, 0x8957}, //14014 #CJK UNIFIED IDEOGRAPH
+ {0xD25E, 0x8958}, //14015 #CJK UNIFIED IDEOGRAPH
+ {0xD25F, 0x8959}, //14016 #CJK UNIFIED IDEOGRAPH
+ {0xD260, 0x895A}, //14017 #CJK UNIFIED IDEOGRAPH
+ {0xD261, 0x895B}, //14018 #CJK UNIFIED IDEOGRAPH
+ {0xD262, 0x895C}, //14019 #CJK UNIFIED IDEOGRAPH
+ {0xD263, 0x895D}, //14020 #CJK UNIFIED IDEOGRAPH
+ {0xD264, 0x8960}, //14021 #CJK UNIFIED IDEOGRAPH
+ {0xD265, 0x8961}, //14022 #CJK UNIFIED IDEOGRAPH
+ {0xD266, 0x8962}, //14023 #CJK UNIFIED IDEOGRAPH
+ {0xD267, 0x8963}, //14024 #CJK UNIFIED IDEOGRAPH
+ {0xD268, 0x8964}, //14025 #CJK UNIFIED IDEOGRAPH
+ {0xD269, 0x8965}, //14026 #CJK UNIFIED IDEOGRAPH
+ {0xD26A, 0x8967}, //14027 #CJK UNIFIED IDEOGRAPH
+ {0xD26B, 0x8968}, //14028 #CJK UNIFIED IDEOGRAPH
+ {0xD26C, 0x8969}, //14029 #CJK UNIFIED IDEOGRAPH
+ {0xD26D, 0x896A}, //14030 #CJK UNIFIED IDEOGRAPH
+ {0xD26E, 0x896B}, //14031 #CJK UNIFIED IDEOGRAPH
+ {0xD26F, 0x896C}, //14032 #CJK UNIFIED IDEOGRAPH
+ {0xD270, 0x896D}, //14033 #CJK UNIFIED IDEOGRAPH
+ {0xD271, 0x896E}, //14034 #CJK UNIFIED IDEOGRAPH
+ {0xD272, 0x896F}, //14035 #CJK UNIFIED IDEOGRAPH
+ {0xD273, 0x8970}, //14036 #CJK UNIFIED IDEOGRAPH
+ {0xD274, 0x8971}, //14037 #CJK UNIFIED IDEOGRAPH
+ {0xD275, 0x8972}, //14038 #CJK UNIFIED IDEOGRAPH
+ {0xD276, 0x8973}, //14039 #CJK UNIFIED IDEOGRAPH
+ {0xD277, 0x8974}, //14040 #CJK UNIFIED IDEOGRAPH
+ {0xD278, 0x8975}, //14041 #CJK UNIFIED IDEOGRAPH
+ {0xD279, 0x8976}, //14042 #CJK UNIFIED IDEOGRAPH
+ {0xD27A, 0x8977}, //14043 #CJK UNIFIED IDEOGRAPH
+ {0xD27B, 0x8978}, //14044 #CJK UNIFIED IDEOGRAPH
+ {0xD27C, 0x8979}, //14045 #CJK UNIFIED IDEOGRAPH
+ {0xD27D, 0x897A}, //14046 #CJK UNIFIED IDEOGRAPH
+ {0xD27E, 0x897C}, //14047 #CJK UNIFIED IDEOGRAPH
+ {0xD280, 0x897D}, //14048 #CJK UNIFIED IDEOGRAPH
+ {0xD281, 0x897E}, //14049 #CJK UNIFIED IDEOGRAPH
+ {0xD282, 0x8980}, //14050 #CJK UNIFIED IDEOGRAPH
+ {0xD283, 0x8982}, //14051 #CJK UNIFIED IDEOGRAPH
+ {0xD284, 0x8984}, //14052 #CJK UNIFIED IDEOGRAPH
+ {0xD285, 0x8985}, //14053 #CJK UNIFIED IDEOGRAPH
+ {0xD286, 0x8987}, //14054 #CJK UNIFIED IDEOGRAPH
+ {0xD287, 0x8988}, //14055 #CJK UNIFIED IDEOGRAPH
+ {0xD288, 0x8989}, //14056 #CJK UNIFIED IDEOGRAPH
+ {0xD289, 0x898A}, //14057 #CJK UNIFIED IDEOGRAPH
+ {0xD28A, 0x898B}, //14058 #CJK UNIFIED IDEOGRAPH
+ {0xD28B, 0x898C}, //14059 #CJK UNIFIED IDEOGRAPH
+ {0xD28C, 0x898D}, //14060 #CJK UNIFIED IDEOGRAPH
+ {0xD28D, 0x898E}, //14061 #CJK UNIFIED IDEOGRAPH
+ {0xD28E, 0x898F}, //14062 #CJK UNIFIED IDEOGRAPH
+ {0xD28F, 0x8990}, //14063 #CJK UNIFIED IDEOGRAPH
+ {0xD290, 0x8991}, //14064 #CJK UNIFIED IDEOGRAPH
+ {0xD291, 0x8992}, //14065 #CJK UNIFIED IDEOGRAPH
+ {0xD292, 0x8993}, //14066 #CJK UNIFIED IDEOGRAPH
+ {0xD293, 0x8994}, //14067 #CJK UNIFIED IDEOGRAPH
+ {0xD294, 0x8995}, //14068 #CJK UNIFIED IDEOGRAPH
+ {0xD295, 0x8996}, //14069 #CJK UNIFIED IDEOGRAPH
+ {0xD296, 0x8997}, //14070 #CJK UNIFIED IDEOGRAPH
+ {0xD297, 0x8998}, //14071 #CJK UNIFIED IDEOGRAPH
+ {0xD298, 0x8999}, //14072 #CJK UNIFIED IDEOGRAPH
+ {0xD299, 0x899A}, //14073 #CJK UNIFIED IDEOGRAPH
+ {0xD29A, 0x899B}, //14074 #CJK UNIFIED IDEOGRAPH
+ {0xD29B, 0x899C}, //14075 #CJK UNIFIED IDEOGRAPH
+ {0xD29C, 0x899D}, //14076 #CJK UNIFIED IDEOGRAPH
+ {0xD29D, 0x899E}, //14077 #CJK UNIFIED IDEOGRAPH
+ {0xD29E, 0x899F}, //14078 #CJK UNIFIED IDEOGRAPH
+ {0xD29F, 0x89A0}, //14079 #CJK UNIFIED IDEOGRAPH
+ {0xD2A0, 0x89A1}, //14080 #CJK UNIFIED IDEOGRAPH
+ {0xD2A1, 0x6447}, //14081 #CJK UNIFIED IDEOGRAPH
+ {0xD2A2, 0x5C27}, //14082 #CJK UNIFIED IDEOGRAPH
+ {0xD2A3, 0x9065}, //14083 #CJK UNIFIED IDEOGRAPH
+ {0xD2A4, 0x7A91}, //14084 #CJK UNIFIED IDEOGRAPH
+ {0xD2A5, 0x8C23}, //14085 #CJK UNIFIED IDEOGRAPH
+ {0xD2A6, 0x59DA}, //14086 #CJK UNIFIED IDEOGRAPH
+ {0xD2A7, 0x54AC}, //14087 #CJK UNIFIED IDEOGRAPH
+ {0xD2A8, 0x8200}, //14088 #CJK UNIFIED IDEOGRAPH
+ {0xD2A9, 0x836F}, //14089 #CJK UNIFIED IDEOGRAPH
+ {0xD2AA, 0x8981}, //14090 #CJK UNIFIED IDEOGRAPH
+ {0xD2AB, 0x8000}, //14091 #CJK UNIFIED IDEOGRAPH
+ {0xD2AC, 0x6930}, //14092 #CJK UNIFIED IDEOGRAPH
+ {0xD2AD, 0x564E}, //14093 #CJK UNIFIED IDEOGRAPH
+ {0xD2AE, 0x8036}, //14094 #CJK UNIFIED IDEOGRAPH
+ {0xD2AF, 0x7237}, //14095 #CJK UNIFIED IDEOGRAPH
+ {0xD2B0, 0x91CE}, //14096 #CJK UNIFIED IDEOGRAPH
+ {0xD2B1, 0x51B6}, //14097 #CJK UNIFIED IDEOGRAPH
+ {0xD2B2, 0x4E5F}, //14098 #CJK UNIFIED IDEOGRAPH
+ {0xD2B3, 0x9875}, //14099 #CJK UNIFIED IDEOGRAPH
+ {0xD2B4, 0x6396}, //14100 #CJK UNIFIED IDEOGRAPH
+ {0xD2B5, 0x4E1A}, //14101 #CJK UNIFIED IDEOGRAPH
+ {0xD2B6, 0x53F6}, //14102 #CJK UNIFIED IDEOGRAPH
+ {0xD2B7, 0x66F3}, //14103 #CJK UNIFIED IDEOGRAPH
+ {0xD2B8, 0x814B}, //14104 #CJK UNIFIED IDEOGRAPH
+ {0xD2B9, 0x591C}, //14105 #CJK UNIFIED IDEOGRAPH
+ {0xD2BA, 0x6DB2}, //14106 #CJK UNIFIED IDEOGRAPH
+ {0xD2BB, 0x4E00}, //14107 #CJK UNIFIED IDEOGRAPH
+ {0xD2BC, 0x58F9}, //14108 #CJK UNIFIED IDEOGRAPH
+ {0xD2BD, 0x533B}, //14109 #CJK UNIFIED IDEOGRAPH
+ {0xD2BE, 0x63D6}, //14110 #CJK UNIFIED IDEOGRAPH
+ {0xD2BF, 0x94F1}, //14111 #CJK UNIFIED IDEOGRAPH
+ {0xD2C0, 0x4F9D}, //14112 #CJK UNIFIED IDEOGRAPH
+ {0xD2C1, 0x4F0A}, //14113 #CJK UNIFIED IDEOGRAPH
+ {0xD2C2, 0x8863}, //14114 #CJK UNIFIED IDEOGRAPH
+ {0xD2C3, 0x9890}, //14115 #CJK UNIFIED IDEOGRAPH
+ {0xD2C4, 0x5937}, //14116 #CJK UNIFIED IDEOGRAPH
+ {0xD2C5, 0x9057}, //14117 #CJK UNIFIED IDEOGRAPH
+ {0xD2C6, 0x79FB}, //14118 #CJK UNIFIED IDEOGRAPH
+ {0xD2C7, 0x4EEA}, //14119 #CJK UNIFIED IDEOGRAPH
+ {0xD2C8, 0x80F0}, //14120 #CJK UNIFIED IDEOGRAPH
+ {0xD2C9, 0x7591}, //14121 #CJK UNIFIED IDEOGRAPH
+ {0xD2CA, 0x6C82}, //14122 #CJK UNIFIED IDEOGRAPH
+ {0xD2CB, 0x5B9C}, //14123 #CJK UNIFIED IDEOGRAPH
+ {0xD2CC, 0x59E8}, //14124 #CJK UNIFIED IDEOGRAPH
+ {0xD2CD, 0x5F5D}, //14125 #CJK UNIFIED IDEOGRAPH
+ {0xD2CE, 0x6905}, //14126 #CJK UNIFIED IDEOGRAPH
+ {0xD2CF, 0x8681}, //14127 #CJK UNIFIED IDEOGRAPH
+ {0xD2D0, 0x501A}, //14128 #CJK UNIFIED IDEOGRAPH
+ {0xD2D1, 0x5DF2}, //14129 #CJK UNIFIED IDEOGRAPH
+ {0xD2D2, 0x4E59}, //14130 #CJK UNIFIED IDEOGRAPH
+ {0xD2D3, 0x77E3}, //14131 #CJK UNIFIED IDEOGRAPH
+ {0xD2D4, 0x4EE5}, //14132 #CJK UNIFIED IDEOGRAPH
+ {0xD2D5, 0x827A}, //14133 #CJK UNIFIED IDEOGRAPH
+ {0xD2D6, 0x6291}, //14134 #CJK UNIFIED IDEOGRAPH
+ {0xD2D7, 0x6613}, //14135 #CJK UNIFIED IDEOGRAPH
+ {0xD2D8, 0x9091}, //14136 #CJK UNIFIED IDEOGRAPH
+ {0xD2D9, 0x5C79}, //14137 #CJK UNIFIED IDEOGRAPH
+ {0xD2DA, 0x4EBF}, //14138 #CJK UNIFIED IDEOGRAPH
+ {0xD2DB, 0x5F79}, //14139 #CJK UNIFIED IDEOGRAPH
+ {0xD2DC, 0x81C6}, //14140 #CJK UNIFIED IDEOGRAPH
+ {0xD2DD, 0x9038}, //14141 #CJK UNIFIED IDEOGRAPH
+ {0xD2DE, 0x8084}, //14142 #CJK UNIFIED IDEOGRAPH
+ {0xD2DF, 0x75AB}, //14143 #CJK UNIFIED IDEOGRAPH
+ {0xD2E0, 0x4EA6}, //14144 #CJK UNIFIED IDEOGRAPH
+ {0xD2E1, 0x88D4}, //14145 #CJK UNIFIED IDEOGRAPH
+ {0xD2E2, 0x610F}, //14146 #CJK UNIFIED IDEOGRAPH
+ {0xD2E3, 0x6BC5}, //14147 #CJK UNIFIED IDEOGRAPH
+ {0xD2E4, 0x5FC6}, //14148 #CJK UNIFIED IDEOGRAPH
+ {0xD2E5, 0x4E49}, //14149 #CJK UNIFIED IDEOGRAPH
+ {0xD2E6, 0x76CA}, //14150 #CJK UNIFIED IDEOGRAPH
+ {0xD2E7, 0x6EA2}, //14151 #CJK UNIFIED IDEOGRAPH
+ {0xD2E8, 0x8BE3}, //14152 #CJK UNIFIED IDEOGRAPH
+ {0xD2E9, 0x8BAE}, //14153 #CJK UNIFIED IDEOGRAPH
+ {0xD2EA, 0x8C0A}, //14154 #CJK UNIFIED IDEOGRAPH
+ {0xD2EB, 0x8BD1}, //14155 #CJK UNIFIED IDEOGRAPH
+ {0xD2EC, 0x5F02}, //14156 #CJK UNIFIED IDEOGRAPH
+ {0xD2ED, 0x7FFC}, //14157 #CJK UNIFIED IDEOGRAPH
+ {0xD2EE, 0x7FCC}, //14158 #CJK UNIFIED IDEOGRAPH
+ {0xD2EF, 0x7ECE}, //14159 #CJK UNIFIED IDEOGRAPH
+ {0xD2F0, 0x8335}, //14160 #CJK UNIFIED IDEOGRAPH
+ {0xD2F1, 0x836B}, //14161 #CJK UNIFIED IDEOGRAPH
+ {0xD2F2, 0x56E0}, //14162 #CJK UNIFIED IDEOGRAPH
+ {0xD2F3, 0x6BB7}, //14163 #CJK UNIFIED IDEOGRAPH
+ {0xD2F4, 0x97F3}, //14164 #CJK UNIFIED IDEOGRAPH
+ {0xD2F5, 0x9634}, //14165 #CJK UNIFIED IDEOGRAPH
+ {0xD2F6, 0x59FB}, //14166 #CJK UNIFIED IDEOGRAPH
+ {0xD2F7, 0x541F}, //14167 #CJK UNIFIED IDEOGRAPH
+ {0xD2F8, 0x94F6}, //14168 #CJK UNIFIED IDEOGRAPH
+ {0xD2F9, 0x6DEB}, //14169 #CJK UNIFIED IDEOGRAPH
+ {0xD2FA, 0x5BC5}, //14170 #CJK UNIFIED IDEOGRAPH
+ {0xD2FB, 0x996E}, //14171 #CJK UNIFIED IDEOGRAPH
+ {0xD2FC, 0x5C39}, //14172 #CJK UNIFIED IDEOGRAPH
+ {0xD2FD, 0x5F15}, //14173 #CJK UNIFIED IDEOGRAPH
+ {0xD2FE, 0x9690}, //14174 #CJK UNIFIED IDEOGRAPH
+ {0xD340, 0x89A2}, //14175 #CJK UNIFIED IDEOGRAPH
+ {0xD341, 0x89A3}, //14176 #CJK UNIFIED IDEOGRAPH
+ {0xD342, 0x89A4}, //14177 #CJK UNIFIED IDEOGRAPH
+ {0xD343, 0x89A5}, //14178 #CJK UNIFIED IDEOGRAPH
+ {0xD344, 0x89A6}, //14179 #CJK UNIFIED IDEOGRAPH
+ {0xD345, 0x89A7}, //14180 #CJK UNIFIED IDEOGRAPH
+ {0xD346, 0x89A8}, //14181 #CJK UNIFIED IDEOGRAPH
+ {0xD347, 0x89A9}, //14182 #CJK UNIFIED IDEOGRAPH
+ {0xD348, 0x89AA}, //14183 #CJK UNIFIED IDEOGRAPH
+ {0xD349, 0x89AB}, //14184 #CJK UNIFIED IDEOGRAPH
+ {0xD34A, 0x89AC}, //14185 #CJK UNIFIED IDEOGRAPH
+ {0xD34B, 0x89AD}, //14186 #CJK UNIFIED IDEOGRAPH
+ {0xD34C, 0x89AE}, //14187 #CJK UNIFIED IDEOGRAPH
+ {0xD34D, 0x89AF}, //14188 #CJK UNIFIED IDEOGRAPH
+ {0xD34E, 0x89B0}, //14189 #CJK UNIFIED IDEOGRAPH
+ {0xD34F, 0x89B1}, //14190 #CJK UNIFIED IDEOGRAPH
+ {0xD350, 0x89B2}, //14191 #CJK UNIFIED IDEOGRAPH
+ {0xD351, 0x89B3}, //14192 #CJK UNIFIED IDEOGRAPH
+ {0xD352, 0x89B4}, //14193 #CJK UNIFIED IDEOGRAPH
+ {0xD353, 0x89B5}, //14194 #CJK UNIFIED IDEOGRAPH
+ {0xD354, 0x89B6}, //14195 #CJK UNIFIED IDEOGRAPH
+ {0xD355, 0x89B7}, //14196 #CJK UNIFIED IDEOGRAPH
+ {0xD356, 0x89B8}, //14197 #CJK UNIFIED IDEOGRAPH
+ {0xD357, 0x89B9}, //14198 #CJK UNIFIED IDEOGRAPH
+ {0xD358, 0x89BA}, //14199 #CJK UNIFIED IDEOGRAPH
+ {0xD359, 0x89BB}, //14200 #CJK UNIFIED IDEOGRAPH
+ {0xD35A, 0x89BC}, //14201 #CJK UNIFIED IDEOGRAPH
+ {0xD35B, 0x89BD}, //14202 #CJK UNIFIED IDEOGRAPH
+ {0xD35C, 0x89BE}, //14203 #CJK UNIFIED IDEOGRAPH
+ {0xD35D, 0x89BF}, //14204 #CJK UNIFIED IDEOGRAPH
+ {0xD35E, 0x89C0}, //14205 #CJK UNIFIED IDEOGRAPH
+ {0xD35F, 0x89C3}, //14206 #CJK UNIFIED IDEOGRAPH
+ {0xD360, 0x89CD}, //14207 #CJK UNIFIED IDEOGRAPH
+ {0xD361, 0x89D3}, //14208 #CJK UNIFIED IDEOGRAPH
+ {0xD362, 0x89D4}, //14209 #CJK UNIFIED IDEOGRAPH
+ {0xD363, 0x89D5}, //14210 #CJK UNIFIED IDEOGRAPH
+ {0xD364, 0x89D7}, //14211 #CJK UNIFIED IDEOGRAPH
+ {0xD365, 0x89D8}, //14212 #CJK UNIFIED IDEOGRAPH
+ {0xD366, 0x89D9}, //14213 #CJK UNIFIED IDEOGRAPH
+ {0xD367, 0x89DB}, //14214 #CJK UNIFIED IDEOGRAPH
+ {0xD368, 0x89DD}, //14215 #CJK UNIFIED IDEOGRAPH
+ {0xD369, 0x89DF}, //14216 #CJK UNIFIED IDEOGRAPH
+ {0xD36A, 0x89E0}, //14217 #CJK UNIFIED IDEOGRAPH
+ {0xD36B, 0x89E1}, //14218 #CJK UNIFIED IDEOGRAPH
+ {0xD36C, 0x89E2}, //14219 #CJK UNIFIED IDEOGRAPH
+ {0xD36D, 0x89E4}, //14220 #CJK UNIFIED IDEOGRAPH
+ {0xD36E, 0x89E7}, //14221 #CJK UNIFIED IDEOGRAPH
+ {0xD36F, 0x89E8}, //14222 #CJK UNIFIED IDEOGRAPH
+ {0xD370, 0x89E9}, //14223 #CJK UNIFIED IDEOGRAPH
+ {0xD371, 0x89EA}, //14224 #CJK UNIFIED IDEOGRAPH
+ {0xD372, 0x89EC}, //14225 #CJK UNIFIED IDEOGRAPH
+ {0xD373, 0x89ED}, //14226 #CJK UNIFIED IDEOGRAPH
+ {0xD374, 0x89EE}, //14227 #CJK UNIFIED IDEOGRAPH
+ {0xD375, 0x89F0}, //14228 #CJK UNIFIED IDEOGRAPH
+ {0xD376, 0x89F1}, //14229 #CJK UNIFIED IDEOGRAPH
+ {0xD377, 0x89F2}, //14230 #CJK UNIFIED IDEOGRAPH
+ {0xD378, 0x89F4}, //14231 #CJK UNIFIED IDEOGRAPH
+ {0xD379, 0x89F5}, //14232 #CJK UNIFIED IDEOGRAPH
+ {0xD37A, 0x89F6}, //14233 #CJK UNIFIED IDEOGRAPH
+ {0xD37B, 0x89F7}, //14234 #CJK UNIFIED IDEOGRAPH
+ {0xD37C, 0x89F8}, //14235 #CJK UNIFIED IDEOGRAPH
+ {0xD37D, 0x89F9}, //14236 #CJK UNIFIED IDEOGRAPH
+ {0xD37E, 0x89FA}, //14237 #CJK UNIFIED IDEOGRAPH
+ {0xD380, 0x89FB}, //14238 #CJK UNIFIED IDEOGRAPH
+ {0xD381, 0x89FC}, //14239 #CJK UNIFIED IDEOGRAPH
+ {0xD382, 0x89FD}, //14240 #CJK UNIFIED IDEOGRAPH
+ {0xD383, 0x89FE}, //14241 #CJK UNIFIED IDEOGRAPH
+ {0xD384, 0x89FF}, //14242 #CJK UNIFIED IDEOGRAPH
+ {0xD385, 0x8A01}, //14243 #CJK UNIFIED IDEOGRAPH
+ {0xD386, 0x8A02}, //14244 #CJK UNIFIED IDEOGRAPH
+ {0xD387, 0x8A03}, //14245 #CJK UNIFIED IDEOGRAPH
+ {0xD388, 0x8A04}, //14246 #CJK UNIFIED IDEOGRAPH
+ {0xD389, 0x8A05}, //14247 #CJK UNIFIED IDEOGRAPH
+ {0xD38A, 0x8A06}, //14248 #CJK UNIFIED IDEOGRAPH
+ {0xD38B, 0x8A08}, //14249 #CJK UNIFIED IDEOGRAPH
+ {0xD38C, 0x8A09}, //14250 #CJK UNIFIED IDEOGRAPH
+ {0xD38D, 0x8A0A}, //14251 #CJK UNIFIED IDEOGRAPH
+ {0xD38E, 0x8A0B}, //14252 #CJK UNIFIED IDEOGRAPH
+ {0xD38F, 0x8A0C}, //14253 #CJK UNIFIED IDEOGRAPH
+ {0xD390, 0x8A0D}, //14254 #CJK UNIFIED IDEOGRAPH
+ {0xD391, 0x8A0E}, //14255 #CJK UNIFIED IDEOGRAPH
+ {0xD392, 0x8A0F}, //14256 #CJK UNIFIED IDEOGRAPH
+ {0xD393, 0x8A10}, //14257 #CJK UNIFIED IDEOGRAPH
+ {0xD394, 0x8A11}, //14258 #CJK UNIFIED IDEOGRAPH
+ {0xD395, 0x8A12}, //14259 #CJK UNIFIED IDEOGRAPH
+ {0xD396, 0x8A13}, //14260 #CJK UNIFIED IDEOGRAPH
+ {0xD397, 0x8A14}, //14261 #CJK UNIFIED IDEOGRAPH
+ {0xD398, 0x8A15}, //14262 #CJK UNIFIED IDEOGRAPH
+ {0xD399, 0x8A16}, //14263 #CJK UNIFIED IDEOGRAPH
+ {0xD39A, 0x8A17}, //14264 #CJK UNIFIED IDEOGRAPH
+ {0xD39B, 0x8A18}, //14265 #CJK UNIFIED IDEOGRAPH
+ {0xD39C, 0x8A19}, //14266 #CJK UNIFIED IDEOGRAPH
+ {0xD39D, 0x8A1A}, //14267 #CJK UNIFIED IDEOGRAPH
+ {0xD39E, 0x8A1B}, //14268 #CJK UNIFIED IDEOGRAPH
+ {0xD39F, 0x8A1C}, //14269 #CJK UNIFIED IDEOGRAPH
+ {0xD3A0, 0x8A1D}, //14270 #CJK UNIFIED IDEOGRAPH
+ {0xD3A1, 0x5370}, //14271 #CJK UNIFIED IDEOGRAPH
+ {0xD3A2, 0x82F1}, //14272 #CJK UNIFIED IDEOGRAPH
+ {0xD3A3, 0x6A31}, //14273 #CJK UNIFIED IDEOGRAPH
+ {0xD3A4, 0x5A74}, //14274 #CJK UNIFIED IDEOGRAPH
+ {0xD3A5, 0x9E70}, //14275 #CJK UNIFIED IDEOGRAPH
+ {0xD3A6, 0x5E94}, //14276 #CJK UNIFIED IDEOGRAPH
+ {0xD3A7, 0x7F28}, //14277 #CJK UNIFIED IDEOGRAPH
+ {0xD3A8, 0x83B9}, //14278 #CJK UNIFIED IDEOGRAPH
+ {0xD3A9, 0x8424}, //14279 #CJK UNIFIED IDEOGRAPH
+ {0xD3AA, 0x8425}, //14280 #CJK UNIFIED IDEOGRAPH
+ {0xD3AB, 0x8367}, //14281 #CJK UNIFIED IDEOGRAPH
+ {0xD3AC, 0x8747}, //14282 #CJK UNIFIED IDEOGRAPH
+ {0xD3AD, 0x8FCE}, //14283 #CJK UNIFIED IDEOGRAPH
+ {0xD3AE, 0x8D62}, //14284 #CJK UNIFIED IDEOGRAPH
+ {0xD3AF, 0x76C8}, //14285 #CJK UNIFIED IDEOGRAPH
+ {0xD3B0, 0x5F71}, //14286 #CJK UNIFIED IDEOGRAPH
+ {0xD3B1, 0x9896}, //14287 #CJK UNIFIED IDEOGRAPH
+ {0xD3B2, 0x786C}, //14288 #CJK UNIFIED IDEOGRAPH
+ {0xD3B3, 0x6620}, //14289 #CJK UNIFIED IDEOGRAPH
+ {0xD3B4, 0x54DF}, //14290 #CJK UNIFIED IDEOGRAPH
+ {0xD3B5, 0x62E5}, //14291 #CJK UNIFIED IDEOGRAPH
+ {0xD3B6, 0x4F63}, //14292 #CJK UNIFIED IDEOGRAPH
+ {0xD3B7, 0x81C3}, //14293 #CJK UNIFIED IDEOGRAPH
+ {0xD3B8, 0x75C8}, //14294 #CJK UNIFIED IDEOGRAPH
+ {0xD3B9, 0x5EB8}, //14295 #CJK UNIFIED IDEOGRAPH
+ {0xD3BA, 0x96CD}, //14296 #CJK UNIFIED IDEOGRAPH
+ {0xD3BB, 0x8E0A}, //14297 #CJK UNIFIED IDEOGRAPH
+ {0xD3BC, 0x86F9}, //14298 #CJK UNIFIED IDEOGRAPH
+ {0xD3BD, 0x548F}, //14299 #CJK UNIFIED IDEOGRAPH
+ {0xD3BE, 0x6CF3}, //14300 #CJK UNIFIED IDEOGRAPH
+ {0xD3BF, 0x6D8C}, //14301 #CJK UNIFIED IDEOGRAPH
+ {0xD3C0, 0x6C38}, //14302 #CJK UNIFIED IDEOGRAPH
+ {0xD3C1, 0x607F}, //14303 #CJK UNIFIED IDEOGRAPH
+ {0xD3C2, 0x52C7}, //14304 #CJK UNIFIED IDEOGRAPH
+ {0xD3C3, 0x7528}, //14305 #CJK UNIFIED IDEOGRAPH
+ {0xD3C4, 0x5E7D}, //14306 #CJK UNIFIED IDEOGRAPH
+ {0xD3C5, 0x4F18}, //14307 #CJK UNIFIED IDEOGRAPH
+ {0xD3C6, 0x60A0}, //14308 #CJK UNIFIED IDEOGRAPH
+ {0xD3C7, 0x5FE7}, //14309 #CJK UNIFIED IDEOGRAPH
+ {0xD3C8, 0x5C24}, //14310 #CJK UNIFIED IDEOGRAPH
+ {0xD3C9, 0x7531}, //14311 #CJK UNIFIED IDEOGRAPH
+ {0xD3CA, 0x90AE}, //14312 #CJK UNIFIED IDEOGRAPH
+ {0xD3CB, 0x94C0}, //14313 #CJK UNIFIED IDEOGRAPH
+ {0xD3CC, 0x72B9}, //14314 #CJK UNIFIED IDEOGRAPH
+ {0xD3CD, 0x6CB9}, //14315 #CJK UNIFIED IDEOGRAPH
+ {0xD3CE, 0x6E38}, //14316 #CJK UNIFIED IDEOGRAPH
+ {0xD3CF, 0x9149}, //14317 #CJK UNIFIED IDEOGRAPH
+ {0xD3D0, 0x6709}, //14318 #CJK UNIFIED IDEOGRAPH
+ {0xD3D1, 0x53CB}, //14319 #CJK UNIFIED IDEOGRAPH
+ {0xD3D2, 0x53F3}, //14320 #CJK UNIFIED IDEOGRAPH
+ {0xD3D3, 0x4F51}, //14321 #CJK UNIFIED IDEOGRAPH
+ {0xD3D4, 0x91C9}, //14322 #CJK UNIFIED IDEOGRAPH
+ {0xD3D5, 0x8BF1}, //14323 #CJK UNIFIED IDEOGRAPH
+ {0xD3D6, 0x53C8}, //14324 #CJK UNIFIED IDEOGRAPH
+ {0xD3D7, 0x5E7C}, //14325 #CJK UNIFIED IDEOGRAPH
+ {0xD3D8, 0x8FC2}, //14326 #CJK UNIFIED IDEOGRAPH
+ {0xD3D9, 0x6DE4}, //14327 #CJK UNIFIED IDEOGRAPH
+ {0xD3DA, 0x4E8E}, //14328 #CJK UNIFIED IDEOGRAPH
+ {0xD3DB, 0x76C2}, //14329 #CJK UNIFIED IDEOGRAPH
+ {0xD3DC, 0x6986}, //14330 #CJK UNIFIED IDEOGRAPH
+ {0xD3DD, 0x865E}, //14331 #CJK UNIFIED IDEOGRAPH
+ {0xD3DE, 0x611A}, //14332 #CJK UNIFIED IDEOGRAPH
+ {0xD3DF, 0x8206}, //14333 #CJK UNIFIED IDEOGRAPH
+ {0xD3E0, 0x4F59}, //14334 #CJK UNIFIED IDEOGRAPH
+ {0xD3E1, 0x4FDE}, //14335 #CJK UNIFIED IDEOGRAPH
+ {0xD3E2, 0x903E}, //14336 #CJK UNIFIED IDEOGRAPH
+ {0xD3E3, 0x9C7C}, //14337 #CJK UNIFIED IDEOGRAPH
+ {0xD3E4, 0x6109}, //14338 #CJK UNIFIED IDEOGRAPH
+ {0xD3E5, 0x6E1D}, //14339 #CJK UNIFIED IDEOGRAPH
+ {0xD3E6, 0x6E14}, //14340 #CJK UNIFIED IDEOGRAPH
+ {0xD3E7, 0x9685}, //14341 #CJK UNIFIED IDEOGRAPH
+ {0xD3E8, 0x4E88}, //14342 #CJK UNIFIED IDEOGRAPH
+ {0xD3E9, 0x5A31}, //14343 #CJK UNIFIED IDEOGRAPH
+ {0xD3EA, 0x96E8}, //14344 #CJK UNIFIED IDEOGRAPH
+ {0xD3EB, 0x4E0E}, //14345 #CJK UNIFIED IDEOGRAPH
+ {0xD3EC, 0x5C7F}, //14346 #CJK UNIFIED IDEOGRAPH
+ {0xD3ED, 0x79B9}, //14347 #CJK UNIFIED IDEOGRAPH
+ {0xD3EE, 0x5B87}, //14348 #CJK UNIFIED IDEOGRAPH
+ {0xD3EF, 0x8BED}, //14349 #CJK UNIFIED IDEOGRAPH
+ {0xD3F0, 0x7FBD}, //14350 #CJK UNIFIED IDEOGRAPH
+ {0xD3F1, 0x7389}, //14351 #CJK UNIFIED IDEOGRAPH
+ {0xD3F2, 0x57DF}, //14352 #CJK UNIFIED IDEOGRAPH
+ {0xD3F3, 0x828B}, //14353 #CJK UNIFIED IDEOGRAPH
+ {0xD3F4, 0x90C1}, //14354 #CJK UNIFIED IDEOGRAPH
+ {0xD3F5, 0x5401}, //14355 #CJK UNIFIED IDEOGRAPH
+ {0xD3F6, 0x9047}, //14356 #CJK UNIFIED IDEOGRAPH
+ {0xD3F7, 0x55BB}, //14357 #CJK UNIFIED IDEOGRAPH
+ {0xD3F8, 0x5CEA}, //14358 #CJK UNIFIED IDEOGRAPH
+ {0xD3F9, 0x5FA1}, //14359 #CJK UNIFIED IDEOGRAPH
+ {0xD3FA, 0x6108}, //14360 #CJK UNIFIED IDEOGRAPH
+ {0xD3FB, 0x6B32}, //14361 #CJK UNIFIED IDEOGRAPH
+ {0xD3FC, 0x72F1}, //14362 #CJK UNIFIED IDEOGRAPH
+ {0xD3FD, 0x80B2}, //14363 #CJK UNIFIED IDEOGRAPH
+ {0xD3FE, 0x8A89}, //14364 #CJK UNIFIED IDEOGRAPH
+ {0xD440, 0x8A1E}, //14365 #CJK UNIFIED IDEOGRAPH
+ {0xD441, 0x8A1F}, //14366 #CJK UNIFIED IDEOGRAPH
+ {0xD442, 0x8A20}, //14367 #CJK UNIFIED IDEOGRAPH
+ {0xD443, 0x8A21}, //14368 #CJK UNIFIED IDEOGRAPH
+ {0xD444, 0x8A22}, //14369 #CJK UNIFIED IDEOGRAPH
+ {0xD445, 0x8A23}, //14370 #CJK UNIFIED IDEOGRAPH
+ {0xD446, 0x8A24}, //14371 #CJK UNIFIED IDEOGRAPH
+ {0xD447, 0x8A25}, //14372 #CJK UNIFIED IDEOGRAPH
+ {0xD448, 0x8A26}, //14373 #CJK UNIFIED IDEOGRAPH
+ {0xD449, 0x8A27}, //14374 #CJK UNIFIED IDEOGRAPH
+ {0xD44A, 0x8A28}, //14375 #CJK UNIFIED IDEOGRAPH
+ {0xD44B, 0x8A29}, //14376 #CJK UNIFIED IDEOGRAPH
+ {0xD44C, 0x8A2A}, //14377 #CJK UNIFIED IDEOGRAPH
+ {0xD44D, 0x8A2B}, //14378 #CJK UNIFIED IDEOGRAPH
+ {0xD44E, 0x8A2C}, //14379 #CJK UNIFIED IDEOGRAPH
+ {0xD44F, 0x8A2D}, //14380 #CJK UNIFIED IDEOGRAPH
+ {0xD450, 0x8A2E}, //14381 #CJK UNIFIED IDEOGRAPH
+ {0xD451, 0x8A2F}, //14382 #CJK UNIFIED IDEOGRAPH
+ {0xD452, 0x8A30}, //14383 #CJK UNIFIED IDEOGRAPH
+ {0xD453, 0x8A31}, //14384 #CJK UNIFIED IDEOGRAPH
+ {0xD454, 0x8A32}, //14385 #CJK UNIFIED IDEOGRAPH
+ {0xD455, 0x8A33}, //14386 #CJK UNIFIED IDEOGRAPH
+ {0xD456, 0x8A34}, //14387 #CJK UNIFIED IDEOGRAPH
+ {0xD457, 0x8A35}, //14388 #CJK UNIFIED IDEOGRAPH
+ {0xD458, 0x8A36}, //14389 #CJK UNIFIED IDEOGRAPH
+ {0xD459, 0x8A37}, //14390 #CJK UNIFIED IDEOGRAPH
+ {0xD45A, 0x8A38}, //14391 #CJK UNIFIED IDEOGRAPH
+ {0xD45B, 0x8A39}, //14392 #CJK UNIFIED IDEOGRAPH
+ {0xD45C, 0x8A3A}, //14393 #CJK UNIFIED IDEOGRAPH
+ {0xD45D, 0x8A3B}, //14394 #CJK UNIFIED IDEOGRAPH
+ {0xD45E, 0x8A3C}, //14395 #CJK UNIFIED IDEOGRAPH
+ {0xD45F, 0x8A3D}, //14396 #CJK UNIFIED IDEOGRAPH
+ {0xD460, 0x8A3F}, //14397 #CJK UNIFIED IDEOGRAPH
+ {0xD461, 0x8A40}, //14398 #CJK UNIFIED IDEOGRAPH
+ {0xD462, 0x8A41}, //14399 #CJK UNIFIED IDEOGRAPH
+ {0xD463, 0x8A42}, //14400 #CJK UNIFIED IDEOGRAPH
+ {0xD464, 0x8A43}, //14401 #CJK UNIFIED IDEOGRAPH
+ {0xD465, 0x8A44}, //14402 #CJK UNIFIED IDEOGRAPH
+ {0xD466, 0x8A45}, //14403 #CJK UNIFIED IDEOGRAPH
+ {0xD467, 0x8A46}, //14404 #CJK UNIFIED IDEOGRAPH
+ {0xD468, 0x8A47}, //14405 #CJK UNIFIED IDEOGRAPH
+ {0xD469, 0x8A49}, //14406 #CJK UNIFIED IDEOGRAPH
+ {0xD46A, 0x8A4A}, //14407 #CJK UNIFIED IDEOGRAPH
+ {0xD46B, 0x8A4B}, //14408 #CJK UNIFIED IDEOGRAPH
+ {0xD46C, 0x8A4C}, //14409 #CJK UNIFIED IDEOGRAPH
+ {0xD46D, 0x8A4D}, //14410 #CJK UNIFIED IDEOGRAPH
+ {0xD46E, 0x8A4E}, //14411 #CJK UNIFIED IDEOGRAPH
+ {0xD46F, 0x8A4F}, //14412 #CJK UNIFIED IDEOGRAPH
+ {0xD470, 0x8A50}, //14413 #CJK UNIFIED IDEOGRAPH
+ {0xD471, 0x8A51}, //14414 #CJK UNIFIED IDEOGRAPH
+ {0xD472, 0x8A52}, //14415 #CJK UNIFIED IDEOGRAPH
+ {0xD473, 0x8A53}, //14416 #CJK UNIFIED IDEOGRAPH
+ {0xD474, 0x8A54}, //14417 #CJK UNIFIED IDEOGRAPH
+ {0xD475, 0x8A55}, //14418 #CJK UNIFIED IDEOGRAPH
+ {0xD476, 0x8A56}, //14419 #CJK UNIFIED IDEOGRAPH
+ {0xD477, 0x8A57}, //14420 #CJK UNIFIED IDEOGRAPH
+ {0xD478, 0x8A58}, //14421 #CJK UNIFIED IDEOGRAPH
+ {0xD479, 0x8A59}, //14422 #CJK UNIFIED IDEOGRAPH
+ {0xD47A, 0x8A5A}, //14423 #CJK UNIFIED IDEOGRAPH
+ {0xD47B, 0x8A5B}, //14424 #CJK UNIFIED IDEOGRAPH
+ {0xD47C, 0x8A5C}, //14425 #CJK UNIFIED IDEOGRAPH
+ {0xD47D, 0x8A5D}, //14426 #CJK UNIFIED IDEOGRAPH
+ {0xD47E, 0x8A5E}, //14427 #CJK UNIFIED IDEOGRAPH
+ {0xD480, 0x8A5F}, //14428 #CJK UNIFIED IDEOGRAPH
+ {0xD481, 0x8A60}, //14429 #CJK UNIFIED IDEOGRAPH
+ {0xD482, 0x8A61}, //14430 #CJK UNIFIED IDEOGRAPH
+ {0xD483, 0x8A62}, //14431 #CJK UNIFIED IDEOGRAPH
+ {0xD484, 0x8A63}, //14432 #CJK UNIFIED IDEOGRAPH
+ {0xD485, 0x8A64}, //14433 #CJK UNIFIED IDEOGRAPH
+ {0xD486, 0x8A65}, //14434 #CJK UNIFIED IDEOGRAPH
+ {0xD487, 0x8A66}, //14435 #CJK UNIFIED IDEOGRAPH
+ {0xD488, 0x8A67}, //14436 #CJK UNIFIED IDEOGRAPH
+ {0xD489, 0x8A68}, //14437 #CJK UNIFIED IDEOGRAPH
+ {0xD48A, 0x8A69}, //14438 #CJK UNIFIED IDEOGRAPH
+ {0xD48B, 0x8A6A}, //14439 #CJK UNIFIED IDEOGRAPH
+ {0xD48C, 0x8A6B}, //14440 #CJK UNIFIED IDEOGRAPH
+ {0xD48D, 0x8A6C}, //14441 #CJK UNIFIED IDEOGRAPH
+ {0xD48E, 0x8A6D}, //14442 #CJK UNIFIED IDEOGRAPH
+ {0xD48F, 0x8A6E}, //14443 #CJK UNIFIED IDEOGRAPH
+ {0xD490, 0x8A6F}, //14444 #CJK UNIFIED IDEOGRAPH
+ {0xD491, 0x8A70}, //14445 #CJK UNIFIED IDEOGRAPH
+ {0xD492, 0x8A71}, //14446 #CJK UNIFIED IDEOGRAPH
+ {0xD493, 0x8A72}, //14447 #CJK UNIFIED IDEOGRAPH
+ {0xD494, 0x8A73}, //14448 #CJK UNIFIED IDEOGRAPH
+ {0xD495, 0x8A74}, //14449 #CJK UNIFIED IDEOGRAPH
+ {0xD496, 0x8A75}, //14450 #CJK UNIFIED IDEOGRAPH
+ {0xD497, 0x8A76}, //14451 #CJK UNIFIED IDEOGRAPH
+ {0xD498, 0x8A77}, //14452 #CJK UNIFIED IDEOGRAPH
+ {0xD499, 0x8A78}, //14453 #CJK UNIFIED IDEOGRAPH
+ {0xD49A, 0x8A7A}, //14454 #CJK UNIFIED IDEOGRAPH
+ {0xD49B, 0x8A7B}, //14455 #CJK UNIFIED IDEOGRAPH
+ {0xD49C, 0x8A7C}, //14456 #CJK UNIFIED IDEOGRAPH
+ {0xD49D, 0x8A7D}, //14457 #CJK UNIFIED IDEOGRAPH
+ {0xD49E, 0x8A7E}, //14458 #CJK UNIFIED IDEOGRAPH
+ {0xD49F, 0x8A7F}, //14459 #CJK UNIFIED IDEOGRAPH
+ {0xD4A0, 0x8A80}, //14460 #CJK UNIFIED IDEOGRAPH
+ {0xD4A1, 0x6D74}, //14461 #CJK UNIFIED IDEOGRAPH
+ {0xD4A2, 0x5BD3}, //14462 #CJK UNIFIED IDEOGRAPH
+ {0xD4A3, 0x88D5}, //14463 #CJK UNIFIED IDEOGRAPH
+ {0xD4A4, 0x9884}, //14464 #CJK UNIFIED IDEOGRAPH
+ {0xD4A5, 0x8C6B}, //14465 #CJK UNIFIED IDEOGRAPH
+ {0xD4A6, 0x9A6D}, //14466 #CJK UNIFIED IDEOGRAPH
+ {0xD4A7, 0x9E33}, //14467 #CJK UNIFIED IDEOGRAPH
+ {0xD4A8, 0x6E0A}, //14468 #CJK UNIFIED IDEOGRAPH
+ {0xD4A9, 0x51A4}, //14469 #CJK UNIFIED IDEOGRAPH
+ {0xD4AA, 0x5143}, //14470 #CJK UNIFIED IDEOGRAPH
+ {0xD4AB, 0x57A3}, //14471 #CJK UNIFIED IDEOGRAPH
+ {0xD4AC, 0x8881}, //14472 #CJK UNIFIED IDEOGRAPH
+ {0xD4AD, 0x539F}, //14473 #CJK UNIFIED IDEOGRAPH
+ {0xD4AE, 0x63F4}, //14474 #CJK UNIFIED IDEOGRAPH
+ {0xD4AF, 0x8F95}, //14475 #CJK UNIFIED IDEOGRAPH
+ {0xD4B0, 0x56ED}, //14476 #CJK UNIFIED IDEOGRAPH
+ {0xD4B1, 0x5458}, //14477 #CJK UNIFIED IDEOGRAPH
+ {0xD4B2, 0x5706}, //14478 #CJK UNIFIED IDEOGRAPH
+ {0xD4B3, 0x733F}, //14479 #CJK UNIFIED IDEOGRAPH
+ {0xD4B4, 0x6E90}, //14480 #CJK UNIFIED IDEOGRAPH
+ {0xD4B5, 0x7F18}, //14481 #CJK UNIFIED IDEOGRAPH
+ {0xD4B6, 0x8FDC}, //14482 #CJK UNIFIED IDEOGRAPH
+ {0xD4B7, 0x82D1}, //14483 #CJK UNIFIED IDEOGRAPH
+ {0xD4B8, 0x613F}, //14484 #CJK UNIFIED IDEOGRAPH
+ {0xD4B9, 0x6028}, //14485 #CJK UNIFIED IDEOGRAPH
+ {0xD4BA, 0x9662}, //14486 #CJK UNIFIED IDEOGRAPH
+ {0xD4BB, 0x66F0}, //14487 #CJK UNIFIED IDEOGRAPH
+ {0xD4BC, 0x7EA6}, //14488 #CJK UNIFIED IDEOGRAPH
+ {0xD4BD, 0x8D8A}, //14489 #CJK UNIFIED IDEOGRAPH
+ {0xD4BE, 0x8DC3}, //14490 #CJK UNIFIED IDEOGRAPH
+ {0xD4BF, 0x94A5}, //14491 #CJK UNIFIED IDEOGRAPH
+ {0xD4C0, 0x5CB3}, //14492 #CJK UNIFIED IDEOGRAPH
+ {0xD4C1, 0x7CA4}, //14493 #CJK UNIFIED IDEOGRAPH
+ {0xD4C2, 0x6708}, //14494 #CJK UNIFIED IDEOGRAPH
+ {0xD4C3, 0x60A6}, //14495 #CJK UNIFIED IDEOGRAPH
+ {0xD4C4, 0x9605}, //14496 #CJK UNIFIED IDEOGRAPH
+ {0xD4C5, 0x8018}, //14497 #CJK UNIFIED IDEOGRAPH
+ {0xD4C6, 0x4E91}, //14498 #CJK UNIFIED IDEOGRAPH
+ {0xD4C7, 0x90E7}, //14499 #CJK UNIFIED IDEOGRAPH
+ {0xD4C8, 0x5300}, //14500 #CJK UNIFIED IDEOGRAPH
+ {0xD4C9, 0x9668}, //14501 #CJK UNIFIED IDEOGRAPH
+ {0xD4CA, 0x5141}, //14502 #CJK UNIFIED IDEOGRAPH
+ {0xD4CB, 0x8FD0}, //14503 #CJK UNIFIED IDEOGRAPH
+ {0xD4CC, 0x8574}, //14504 #CJK UNIFIED IDEOGRAPH
+ {0xD4CD, 0x915D}, //14505 #CJK UNIFIED IDEOGRAPH
+ {0xD4CE, 0x6655}, //14506 #CJK UNIFIED IDEOGRAPH
+ {0xD4CF, 0x97F5}, //14507 #CJK UNIFIED IDEOGRAPH
+ {0xD4D0, 0x5B55}, //14508 #CJK UNIFIED IDEOGRAPH
+ {0xD4D1, 0x531D}, //14509 #CJK UNIFIED IDEOGRAPH
+ {0xD4D2, 0x7838}, //14510 #CJK UNIFIED IDEOGRAPH
+ {0xD4D3, 0x6742}, //14511 #CJK UNIFIED IDEOGRAPH
+ {0xD4D4, 0x683D}, //14512 #CJK UNIFIED IDEOGRAPH
+ {0xD4D5, 0x54C9}, //14513 #CJK UNIFIED IDEOGRAPH
+ {0xD4D6, 0x707E}, //14514 #CJK UNIFIED IDEOGRAPH
+ {0xD4D7, 0x5BB0}, //14515 #CJK UNIFIED IDEOGRAPH
+ {0xD4D8, 0x8F7D}, //14516 #CJK UNIFIED IDEOGRAPH
+ {0xD4D9, 0x518D}, //14517 #CJK UNIFIED IDEOGRAPH
+ {0xD4DA, 0x5728}, //14518 #CJK UNIFIED IDEOGRAPH
+ {0xD4DB, 0x54B1}, //14519 #CJK UNIFIED IDEOGRAPH
+ {0xD4DC, 0x6512}, //14520 #CJK UNIFIED IDEOGRAPH
+ {0xD4DD, 0x6682}, //14521 #CJK UNIFIED IDEOGRAPH
+ {0xD4DE, 0x8D5E}, //14522 #CJK UNIFIED IDEOGRAPH
+ {0xD4DF, 0x8D43}, //14523 #CJK UNIFIED IDEOGRAPH
+ {0xD4E0, 0x810F}, //14524 #CJK UNIFIED IDEOGRAPH
+ {0xD4E1, 0x846C}, //14525 #CJK UNIFIED IDEOGRAPH
+ {0xD4E2, 0x906D}, //14526 #CJK UNIFIED IDEOGRAPH
+ {0xD4E3, 0x7CDF}, //14527 #CJK UNIFIED IDEOGRAPH
+ {0xD4E4, 0x51FF}, //14528 #CJK UNIFIED IDEOGRAPH
+ {0xD4E5, 0x85FB}, //14529 #CJK UNIFIED IDEOGRAPH
+ {0xD4E6, 0x67A3}, //14530 #CJK UNIFIED IDEOGRAPH
+ {0xD4E7, 0x65E9}, //14531 #CJK UNIFIED IDEOGRAPH
+ {0xD4E8, 0x6FA1}, //14532 #CJK UNIFIED IDEOGRAPH
+ {0xD4E9, 0x86A4}, //14533 #CJK UNIFIED IDEOGRAPH
+ {0xD4EA, 0x8E81}, //14534 #CJK UNIFIED IDEOGRAPH
+ {0xD4EB, 0x566A}, //14535 #CJK UNIFIED IDEOGRAPH
+ {0xD4EC, 0x9020}, //14536 #CJK UNIFIED IDEOGRAPH
+ {0xD4ED, 0x7682}, //14537 #CJK UNIFIED IDEOGRAPH
+ {0xD4EE, 0x7076}, //14538 #CJK UNIFIED IDEOGRAPH
+ {0xD4EF, 0x71E5}, //14539 #CJK UNIFIED IDEOGRAPH
+ {0xD4F0, 0x8D23}, //14540 #CJK UNIFIED IDEOGRAPH
+ {0xD4F1, 0x62E9}, //14541 #CJK UNIFIED IDEOGRAPH
+ {0xD4F2, 0x5219}, //14542 #CJK UNIFIED IDEOGRAPH
+ {0xD4F3, 0x6CFD}, //14543 #CJK UNIFIED IDEOGRAPH
+ {0xD4F4, 0x8D3C}, //14544 #CJK UNIFIED IDEOGRAPH
+ {0xD4F5, 0x600E}, //14545 #CJK UNIFIED IDEOGRAPH
+ {0xD4F6, 0x589E}, //14546 #CJK UNIFIED IDEOGRAPH
+ {0xD4F7, 0x618E}, //14547 #CJK UNIFIED IDEOGRAPH
+ {0xD4F8, 0x66FE}, //14548 #CJK UNIFIED IDEOGRAPH
+ {0xD4F9, 0x8D60}, //14549 #CJK UNIFIED IDEOGRAPH
+ {0xD4FA, 0x624E}, //14550 #CJK UNIFIED IDEOGRAPH
+ {0xD4FB, 0x55B3}, //14551 #CJK UNIFIED IDEOGRAPH
+ {0xD4FC, 0x6E23}, //14552 #CJK UNIFIED IDEOGRAPH
+ {0xD4FD, 0x672D}, //14553 #CJK UNIFIED IDEOGRAPH
+ {0xD4FE, 0x8F67}, //14554 #CJK UNIFIED IDEOGRAPH
+ {0xD540, 0x8A81}, //14555 #CJK UNIFIED IDEOGRAPH
+ {0xD541, 0x8A82}, //14556 #CJK UNIFIED IDEOGRAPH
+ {0xD542, 0x8A83}, //14557 #CJK UNIFIED IDEOGRAPH
+ {0xD543, 0x8A84}, //14558 #CJK UNIFIED IDEOGRAPH
+ {0xD544, 0x8A85}, //14559 #CJK UNIFIED IDEOGRAPH
+ {0xD545, 0x8A86}, //14560 #CJK UNIFIED IDEOGRAPH
+ {0xD546, 0x8A87}, //14561 #CJK UNIFIED IDEOGRAPH
+ {0xD547, 0x8A88}, //14562 #CJK UNIFIED IDEOGRAPH
+ {0xD548, 0x8A8B}, //14563 #CJK UNIFIED IDEOGRAPH
+ {0xD549, 0x8A8C}, //14564 #CJK UNIFIED IDEOGRAPH
+ {0xD54A, 0x8A8D}, //14565 #CJK UNIFIED IDEOGRAPH
+ {0xD54B, 0x8A8E}, //14566 #CJK UNIFIED IDEOGRAPH
+ {0xD54C, 0x8A8F}, //14567 #CJK UNIFIED IDEOGRAPH
+ {0xD54D, 0x8A90}, //14568 #CJK UNIFIED IDEOGRAPH
+ {0xD54E, 0x8A91}, //14569 #CJK UNIFIED IDEOGRAPH
+ {0xD54F, 0x8A92}, //14570 #CJK UNIFIED IDEOGRAPH
+ {0xD550, 0x8A94}, //14571 #CJK UNIFIED IDEOGRAPH
+ {0xD551, 0x8A95}, //14572 #CJK UNIFIED IDEOGRAPH
+ {0xD552, 0x8A96}, //14573 #CJK UNIFIED IDEOGRAPH
+ {0xD553, 0x8A97}, //14574 #CJK UNIFIED IDEOGRAPH
+ {0xD554, 0x8A98}, //14575 #CJK UNIFIED IDEOGRAPH
+ {0xD555, 0x8A99}, //14576 #CJK UNIFIED IDEOGRAPH
+ {0xD556, 0x8A9A}, //14577 #CJK UNIFIED IDEOGRAPH
+ {0xD557, 0x8A9B}, //14578 #CJK UNIFIED IDEOGRAPH
+ {0xD558, 0x8A9C}, //14579 #CJK UNIFIED IDEOGRAPH
+ {0xD559, 0x8A9D}, //14580 #CJK UNIFIED IDEOGRAPH
+ {0xD55A, 0x8A9E}, //14581 #CJK UNIFIED IDEOGRAPH
+ {0xD55B, 0x8A9F}, //14582 #CJK UNIFIED IDEOGRAPH
+ {0xD55C, 0x8AA0}, //14583 #CJK UNIFIED IDEOGRAPH
+ {0xD55D, 0x8AA1}, //14584 #CJK UNIFIED IDEOGRAPH
+ {0xD55E, 0x8AA2}, //14585 #CJK UNIFIED IDEOGRAPH
+ {0xD55F, 0x8AA3}, //14586 #CJK UNIFIED IDEOGRAPH
+ {0xD560, 0x8AA4}, //14587 #CJK UNIFIED IDEOGRAPH
+ {0xD561, 0x8AA5}, //14588 #CJK UNIFIED IDEOGRAPH
+ {0xD562, 0x8AA6}, //14589 #CJK UNIFIED IDEOGRAPH
+ {0xD563, 0x8AA7}, //14590 #CJK UNIFIED IDEOGRAPH
+ {0xD564, 0x8AA8}, //14591 #CJK UNIFIED IDEOGRAPH
+ {0xD565, 0x8AA9}, //14592 #CJK UNIFIED IDEOGRAPH
+ {0xD566, 0x8AAA}, //14593 #CJK UNIFIED IDEOGRAPH
+ {0xD567, 0x8AAB}, //14594 #CJK UNIFIED IDEOGRAPH
+ {0xD568, 0x8AAC}, //14595 #CJK UNIFIED IDEOGRAPH
+ {0xD569, 0x8AAD}, //14596 #CJK UNIFIED IDEOGRAPH
+ {0xD56A, 0x8AAE}, //14597 #CJK UNIFIED IDEOGRAPH
+ {0xD56B, 0x8AAF}, //14598 #CJK UNIFIED IDEOGRAPH
+ {0xD56C, 0x8AB0}, //14599 #CJK UNIFIED IDEOGRAPH
+ {0xD56D, 0x8AB1}, //14600 #CJK UNIFIED IDEOGRAPH
+ {0xD56E, 0x8AB2}, //14601 #CJK UNIFIED IDEOGRAPH
+ {0xD56F, 0x8AB3}, //14602 #CJK UNIFIED IDEOGRAPH
+ {0xD570, 0x8AB4}, //14603 #CJK UNIFIED IDEOGRAPH
+ {0xD571, 0x8AB5}, //14604 #CJK UNIFIED IDEOGRAPH
+ {0xD572, 0x8AB6}, //14605 #CJK UNIFIED IDEOGRAPH
+ {0xD573, 0x8AB7}, //14606 #CJK UNIFIED IDEOGRAPH
+ {0xD574, 0x8AB8}, //14607 #CJK UNIFIED IDEOGRAPH
+ {0xD575, 0x8AB9}, //14608 #CJK UNIFIED IDEOGRAPH
+ {0xD576, 0x8ABA}, //14609 #CJK UNIFIED IDEOGRAPH
+ {0xD577, 0x8ABB}, //14610 #CJK UNIFIED IDEOGRAPH
+ {0xD578, 0x8ABC}, //14611 #CJK UNIFIED IDEOGRAPH
+ {0xD579, 0x8ABD}, //14612 #CJK UNIFIED IDEOGRAPH
+ {0xD57A, 0x8ABE}, //14613 #CJK UNIFIED IDEOGRAPH
+ {0xD57B, 0x8ABF}, //14614 #CJK UNIFIED IDEOGRAPH
+ {0xD57C, 0x8AC0}, //14615 #CJK UNIFIED IDEOGRAPH
+ {0xD57D, 0x8AC1}, //14616 #CJK UNIFIED IDEOGRAPH
+ {0xD57E, 0x8AC2}, //14617 #CJK UNIFIED IDEOGRAPH
+ {0xD580, 0x8AC3}, //14618 #CJK UNIFIED IDEOGRAPH
+ {0xD581, 0x8AC4}, //14619 #CJK UNIFIED IDEOGRAPH
+ {0xD582, 0x8AC5}, //14620 #CJK UNIFIED IDEOGRAPH
+ {0xD583, 0x8AC6}, //14621 #CJK UNIFIED IDEOGRAPH
+ {0xD584, 0x8AC7}, //14622 #CJK UNIFIED IDEOGRAPH
+ {0xD585, 0x8AC8}, //14623 #CJK UNIFIED IDEOGRAPH
+ {0xD586, 0x8AC9}, //14624 #CJK UNIFIED IDEOGRAPH
+ {0xD587, 0x8ACA}, //14625 #CJK UNIFIED IDEOGRAPH
+ {0xD588, 0x8ACB}, //14626 #CJK UNIFIED IDEOGRAPH
+ {0xD589, 0x8ACC}, //14627 #CJK UNIFIED IDEOGRAPH
+ {0xD58A, 0x8ACD}, //14628 #CJK UNIFIED IDEOGRAPH
+ {0xD58B, 0x8ACE}, //14629 #CJK UNIFIED IDEOGRAPH
+ {0xD58C, 0x8ACF}, //14630 #CJK UNIFIED IDEOGRAPH
+ {0xD58D, 0x8AD0}, //14631 #CJK UNIFIED IDEOGRAPH
+ {0xD58E, 0x8AD1}, //14632 #CJK UNIFIED IDEOGRAPH
+ {0xD58F, 0x8AD2}, //14633 #CJK UNIFIED IDEOGRAPH
+ {0xD590, 0x8AD3}, //14634 #CJK UNIFIED IDEOGRAPH
+ {0xD591, 0x8AD4}, //14635 #CJK UNIFIED IDEOGRAPH
+ {0xD592, 0x8AD5}, //14636 #CJK UNIFIED IDEOGRAPH
+ {0xD593, 0x8AD6}, //14637 #CJK UNIFIED IDEOGRAPH
+ {0xD594, 0x8AD7}, //14638 #CJK UNIFIED IDEOGRAPH
+ {0xD595, 0x8AD8}, //14639 #CJK UNIFIED IDEOGRAPH
+ {0xD596, 0x8AD9}, //14640 #CJK UNIFIED IDEOGRAPH
+ {0xD597, 0x8ADA}, //14641 #CJK UNIFIED IDEOGRAPH
+ {0xD598, 0x8ADB}, //14642 #CJK UNIFIED IDEOGRAPH
+ {0xD599, 0x8ADC}, //14643 #CJK UNIFIED IDEOGRAPH
+ {0xD59A, 0x8ADD}, //14644 #CJK UNIFIED IDEOGRAPH
+ {0xD59B, 0x8ADE}, //14645 #CJK UNIFIED IDEOGRAPH
+ {0xD59C, 0x8ADF}, //14646 #CJK UNIFIED IDEOGRAPH
+ {0xD59D, 0x8AE0}, //14647 #CJK UNIFIED IDEOGRAPH
+ {0xD59E, 0x8AE1}, //14648 #CJK UNIFIED IDEOGRAPH
+ {0xD59F, 0x8AE2}, //14649 #CJK UNIFIED IDEOGRAPH
+ {0xD5A0, 0x8AE3}, //14650 #CJK UNIFIED IDEOGRAPH
+ {0xD5A1, 0x94E1}, //14651 #CJK UNIFIED IDEOGRAPH
+ {0xD5A2, 0x95F8}, //14652 #CJK UNIFIED IDEOGRAPH
+ {0xD5A3, 0x7728}, //14653 #CJK UNIFIED IDEOGRAPH
+ {0xD5A4, 0x6805}, //14654 #CJK UNIFIED IDEOGRAPH
+ {0xD5A5, 0x69A8}, //14655 #CJK UNIFIED IDEOGRAPH
+ {0xD5A6, 0x548B}, //14656 #CJK UNIFIED IDEOGRAPH
+ {0xD5A7, 0x4E4D}, //14657 #CJK UNIFIED IDEOGRAPH
+ {0xD5A8, 0x70B8}, //14658 #CJK UNIFIED IDEOGRAPH
+ {0xD5A9, 0x8BC8}, //14659 #CJK UNIFIED IDEOGRAPH
+ {0xD5AA, 0x6458}, //14660 #CJK UNIFIED IDEOGRAPH
+ {0xD5AB, 0x658B}, //14661 #CJK UNIFIED IDEOGRAPH
+ {0xD5AC, 0x5B85}, //14662 #CJK UNIFIED IDEOGRAPH
+ {0xD5AD, 0x7A84}, //14663 #CJK UNIFIED IDEOGRAPH
+ {0xD5AE, 0x503A}, //14664 #CJK UNIFIED IDEOGRAPH
+ {0xD5AF, 0x5BE8}, //14665 #CJK UNIFIED IDEOGRAPH
+ {0xD5B0, 0x77BB}, //14666 #CJK UNIFIED IDEOGRAPH
+ {0xD5B1, 0x6BE1}, //14667 #CJK UNIFIED IDEOGRAPH
+ {0xD5B2, 0x8A79}, //14668 #CJK UNIFIED IDEOGRAPH
+ {0xD5B3, 0x7C98}, //14669 #CJK UNIFIED IDEOGRAPH
+ {0xD5B4, 0x6CBE}, //14670 #CJK UNIFIED IDEOGRAPH
+ {0xD5B5, 0x76CF}, //14671 #CJK UNIFIED IDEOGRAPH
+ {0xD5B6, 0x65A9}, //14672 #CJK UNIFIED IDEOGRAPH
+ {0xD5B7, 0x8F97}, //14673 #CJK UNIFIED IDEOGRAPH
+ {0xD5B8, 0x5D2D}, //14674 #CJK UNIFIED IDEOGRAPH
+ {0xD5B9, 0x5C55}, //14675 #CJK UNIFIED IDEOGRAPH
+ {0xD5BA, 0x8638}, //14676 #CJK UNIFIED IDEOGRAPH
+ {0xD5BB, 0x6808}, //14677 #CJK UNIFIED IDEOGRAPH
+ {0xD5BC, 0x5360}, //14678 #CJK UNIFIED IDEOGRAPH
+ {0xD5BD, 0x6218}, //14679 #CJK UNIFIED IDEOGRAPH
+ {0xD5BE, 0x7AD9}, //14680 #CJK UNIFIED IDEOGRAPH
+ {0xD5BF, 0x6E5B}, //14681 #CJK UNIFIED IDEOGRAPH
+ {0xD5C0, 0x7EFD}, //14682 #CJK UNIFIED IDEOGRAPH
+ {0xD5C1, 0x6A1F}, //14683 #CJK UNIFIED IDEOGRAPH
+ {0xD5C2, 0x7AE0}, //14684 #CJK UNIFIED IDEOGRAPH
+ {0xD5C3, 0x5F70}, //14685 #CJK UNIFIED IDEOGRAPH
+ {0xD5C4, 0x6F33}, //14686 #CJK UNIFIED IDEOGRAPH
+ {0xD5C5, 0x5F20}, //14687 #CJK UNIFIED IDEOGRAPH
+ {0xD5C6, 0x638C}, //14688 #CJK UNIFIED IDEOGRAPH
+ {0xD5C7, 0x6DA8}, //14689 #CJK UNIFIED IDEOGRAPH
+ {0xD5C8, 0x6756}, //14690 #CJK UNIFIED IDEOGRAPH
+ {0xD5C9, 0x4E08}, //14691 #CJK UNIFIED IDEOGRAPH
+ {0xD5CA, 0x5E10}, //14692 #CJK UNIFIED IDEOGRAPH
+ {0xD5CB, 0x8D26}, //14693 #CJK UNIFIED IDEOGRAPH
+ {0xD5CC, 0x4ED7}, //14694 #CJK UNIFIED IDEOGRAPH
+ {0xD5CD, 0x80C0}, //14695 #CJK UNIFIED IDEOGRAPH
+ {0xD5CE, 0x7634}, //14696 #CJK UNIFIED IDEOGRAPH
+ {0xD5CF, 0x969C}, //14697 #CJK UNIFIED IDEOGRAPH
+ {0xD5D0, 0x62DB}, //14698 #CJK UNIFIED IDEOGRAPH
+ {0xD5D1, 0x662D}, //14699 #CJK UNIFIED IDEOGRAPH
+ {0xD5D2, 0x627E}, //14700 #CJK UNIFIED IDEOGRAPH
+ {0xD5D3, 0x6CBC}, //14701 #CJK UNIFIED IDEOGRAPH
+ {0xD5D4, 0x8D75}, //14702 #CJK UNIFIED IDEOGRAPH
+ {0xD5D5, 0x7167}, //14703 #CJK UNIFIED IDEOGRAPH
+ {0xD5D6, 0x7F69}, //14704 #CJK UNIFIED IDEOGRAPH
+ {0xD5D7, 0x5146}, //14705 #CJK UNIFIED IDEOGRAPH
+ {0xD5D8, 0x8087}, //14706 #CJK UNIFIED IDEOGRAPH
+ {0xD5D9, 0x53EC}, //14707 #CJK UNIFIED IDEOGRAPH
+ {0xD5DA, 0x906E}, //14708 #CJK UNIFIED IDEOGRAPH
+ {0xD5DB, 0x6298}, //14709 #CJK UNIFIED IDEOGRAPH
+ {0xD5DC, 0x54F2}, //14710 #CJK UNIFIED IDEOGRAPH
+ {0xD5DD, 0x86F0}, //14711 #CJK UNIFIED IDEOGRAPH
+ {0xD5DE, 0x8F99}, //14712 #CJK UNIFIED IDEOGRAPH
+ {0xD5DF, 0x8005}, //14713 #CJK UNIFIED IDEOGRAPH
+ {0xD5E0, 0x9517}, //14714 #CJK UNIFIED IDEOGRAPH
+ {0xD5E1, 0x8517}, //14715 #CJK UNIFIED IDEOGRAPH
+ {0xD5E2, 0x8FD9}, //14716 #CJK UNIFIED IDEOGRAPH
+ {0xD5E3, 0x6D59}, //14717 #CJK UNIFIED IDEOGRAPH
+ {0xD5E4, 0x73CD}, //14718 #CJK UNIFIED IDEOGRAPH
+ {0xD5E5, 0x659F}, //14719 #CJK UNIFIED IDEOGRAPH
+ {0xD5E6, 0x771F}, //14720 #CJK UNIFIED IDEOGRAPH
+ {0xD5E7, 0x7504}, //14721 #CJK UNIFIED IDEOGRAPH
+ {0xD5E8, 0x7827}, //14722 #CJK UNIFIED IDEOGRAPH
+ {0xD5E9, 0x81FB}, //14723 #CJK UNIFIED IDEOGRAPH
+ {0xD5EA, 0x8D1E}, //14724 #CJK UNIFIED IDEOGRAPH
+ {0xD5EB, 0x9488}, //14725 #CJK UNIFIED IDEOGRAPH
+ {0xD5EC, 0x4FA6}, //14726 #CJK UNIFIED IDEOGRAPH
+ {0xD5ED, 0x6795}, //14727 #CJK UNIFIED IDEOGRAPH
+ {0xD5EE, 0x75B9}, //14728 #CJK UNIFIED IDEOGRAPH
+ {0xD5EF, 0x8BCA}, //14729 #CJK UNIFIED IDEOGRAPH
+ {0xD5F0, 0x9707}, //14730 #CJK UNIFIED IDEOGRAPH
+ {0xD5F1, 0x632F}, //14731 #CJK UNIFIED IDEOGRAPH
+ {0xD5F2, 0x9547}, //14732 #CJK UNIFIED IDEOGRAPH
+ {0xD5F3, 0x9635}, //14733 #CJK UNIFIED IDEOGRAPH
+ {0xD5F4, 0x84B8}, //14734 #CJK UNIFIED IDEOGRAPH
+ {0xD5F5, 0x6323}, //14735 #CJK UNIFIED IDEOGRAPH
+ {0xD5F6, 0x7741}, //14736 #CJK UNIFIED IDEOGRAPH
+ {0xD5F7, 0x5F81}, //14737 #CJK UNIFIED IDEOGRAPH
+ {0xD5F8, 0x72F0}, //14738 #CJK UNIFIED IDEOGRAPH
+ {0xD5F9, 0x4E89}, //14739 #CJK UNIFIED IDEOGRAPH
+ {0xD5FA, 0x6014}, //14740 #CJK UNIFIED IDEOGRAPH
+ {0xD5FB, 0x6574}, //14741 #CJK UNIFIED IDEOGRAPH
+ {0xD5FC, 0x62EF}, //14742 #CJK UNIFIED IDEOGRAPH
+ {0xD5FD, 0x6B63}, //14743 #CJK UNIFIED IDEOGRAPH
+ {0xD5FE, 0x653F}, //14744 #CJK UNIFIED IDEOGRAPH
+ {0xD640, 0x8AE4}, //14745 #CJK UNIFIED IDEOGRAPH
+ {0xD641, 0x8AE5}, //14746 #CJK UNIFIED IDEOGRAPH
+ {0xD642, 0x8AE6}, //14747 #CJK UNIFIED IDEOGRAPH
+ {0xD643, 0x8AE7}, //14748 #CJK UNIFIED IDEOGRAPH
+ {0xD644, 0x8AE8}, //14749 #CJK UNIFIED IDEOGRAPH
+ {0xD645, 0x8AE9}, //14750 #CJK UNIFIED IDEOGRAPH
+ {0xD646, 0x8AEA}, //14751 #CJK UNIFIED IDEOGRAPH
+ {0xD647, 0x8AEB}, //14752 #CJK UNIFIED IDEOGRAPH
+ {0xD648, 0x8AEC}, //14753 #CJK UNIFIED IDEOGRAPH
+ {0xD649, 0x8AED}, //14754 #CJK UNIFIED IDEOGRAPH
+ {0xD64A, 0x8AEE}, //14755 #CJK UNIFIED IDEOGRAPH
+ {0xD64B, 0x8AEF}, //14756 #CJK UNIFIED IDEOGRAPH
+ {0xD64C, 0x8AF0}, //14757 #CJK UNIFIED IDEOGRAPH
+ {0xD64D, 0x8AF1}, //14758 #CJK UNIFIED IDEOGRAPH
+ {0xD64E, 0x8AF2}, //14759 #CJK UNIFIED IDEOGRAPH
+ {0xD64F, 0x8AF3}, //14760 #CJK UNIFIED IDEOGRAPH
+ {0xD650, 0x8AF4}, //14761 #CJK UNIFIED IDEOGRAPH
+ {0xD651, 0x8AF5}, //14762 #CJK UNIFIED IDEOGRAPH
+ {0xD652, 0x8AF6}, //14763 #CJK UNIFIED IDEOGRAPH
+ {0xD653, 0x8AF7}, //14764 #CJK UNIFIED IDEOGRAPH
+ {0xD654, 0x8AF8}, //14765 #CJK UNIFIED IDEOGRAPH
+ {0xD655, 0x8AF9}, //14766 #CJK UNIFIED IDEOGRAPH
+ {0xD656, 0x8AFA}, //14767 #CJK UNIFIED IDEOGRAPH
+ {0xD657, 0x8AFB}, //14768 #CJK UNIFIED IDEOGRAPH
+ {0xD658, 0x8AFC}, //14769 #CJK UNIFIED IDEOGRAPH
+ {0xD659, 0x8AFD}, //14770 #CJK UNIFIED IDEOGRAPH
+ {0xD65A, 0x8AFE}, //14771 #CJK UNIFIED IDEOGRAPH
+ {0xD65B, 0x8AFF}, //14772 #CJK UNIFIED IDEOGRAPH
+ {0xD65C, 0x8B00}, //14773 #CJK UNIFIED IDEOGRAPH
+ {0xD65D, 0x8B01}, //14774 #CJK UNIFIED IDEOGRAPH
+ {0xD65E, 0x8B02}, //14775 #CJK UNIFIED IDEOGRAPH
+ {0xD65F, 0x8B03}, //14776 #CJK UNIFIED IDEOGRAPH
+ {0xD660, 0x8B04}, //14777 #CJK UNIFIED IDEOGRAPH
+ {0xD661, 0x8B05}, //14778 #CJK UNIFIED IDEOGRAPH
+ {0xD662, 0x8B06}, //14779 #CJK UNIFIED IDEOGRAPH
+ {0xD663, 0x8B08}, //14780 #CJK UNIFIED IDEOGRAPH
+ {0xD664, 0x8B09}, //14781 #CJK UNIFIED IDEOGRAPH
+ {0xD665, 0x8B0A}, //14782 #CJK UNIFIED IDEOGRAPH
+ {0xD666, 0x8B0B}, //14783 #CJK UNIFIED IDEOGRAPH
+ {0xD667, 0x8B0C}, //14784 #CJK UNIFIED IDEOGRAPH
+ {0xD668, 0x8B0D}, //14785 #CJK UNIFIED IDEOGRAPH
+ {0xD669, 0x8B0E}, //14786 #CJK UNIFIED IDEOGRAPH
+ {0xD66A, 0x8B0F}, //14787 #CJK UNIFIED IDEOGRAPH
+ {0xD66B, 0x8B10}, //14788 #CJK UNIFIED IDEOGRAPH
+ {0xD66C, 0x8B11}, //14789 #CJK UNIFIED IDEOGRAPH
+ {0xD66D, 0x8B12}, //14790 #CJK UNIFIED IDEOGRAPH
+ {0xD66E, 0x8B13}, //14791 #CJK UNIFIED IDEOGRAPH
+ {0xD66F, 0x8B14}, //14792 #CJK UNIFIED IDEOGRAPH
+ {0xD670, 0x8B15}, //14793 #CJK UNIFIED IDEOGRAPH
+ {0xD671, 0x8B16}, //14794 #CJK UNIFIED IDEOGRAPH
+ {0xD672, 0x8B17}, //14795 #CJK UNIFIED IDEOGRAPH
+ {0xD673, 0x8B18}, //14796 #CJK UNIFIED IDEOGRAPH
+ {0xD674, 0x8B19}, //14797 #CJK UNIFIED IDEOGRAPH
+ {0xD675, 0x8B1A}, //14798 #CJK UNIFIED IDEOGRAPH
+ {0xD676, 0x8B1B}, //14799 #CJK UNIFIED IDEOGRAPH
+ {0xD677, 0x8B1C}, //14800 #CJK UNIFIED IDEOGRAPH
+ {0xD678, 0x8B1D}, //14801 #CJK UNIFIED IDEOGRAPH
+ {0xD679, 0x8B1E}, //14802 #CJK UNIFIED IDEOGRAPH
+ {0xD67A, 0x8B1F}, //14803 #CJK UNIFIED IDEOGRAPH
+ {0xD67B, 0x8B20}, //14804 #CJK UNIFIED IDEOGRAPH
+ {0xD67C, 0x8B21}, //14805 #CJK UNIFIED IDEOGRAPH
+ {0xD67D, 0x8B22}, //14806 #CJK UNIFIED IDEOGRAPH
+ {0xD67E, 0x8B23}, //14807 #CJK UNIFIED IDEOGRAPH
+ {0xD680, 0x8B24}, //14808 #CJK UNIFIED IDEOGRAPH
+ {0xD681, 0x8B25}, //14809 #CJK UNIFIED IDEOGRAPH
+ {0xD682, 0x8B27}, //14810 #CJK UNIFIED IDEOGRAPH
+ {0xD683, 0x8B28}, //14811 #CJK UNIFIED IDEOGRAPH
+ {0xD684, 0x8B29}, //14812 #CJK UNIFIED IDEOGRAPH
+ {0xD685, 0x8B2A}, //14813 #CJK UNIFIED IDEOGRAPH
+ {0xD686, 0x8B2B}, //14814 #CJK UNIFIED IDEOGRAPH
+ {0xD687, 0x8B2C}, //14815 #CJK UNIFIED IDEOGRAPH
+ {0xD688, 0x8B2D}, //14816 #CJK UNIFIED IDEOGRAPH
+ {0xD689, 0x8B2E}, //14817 #CJK UNIFIED IDEOGRAPH
+ {0xD68A, 0x8B2F}, //14818 #CJK UNIFIED IDEOGRAPH
+ {0xD68B, 0x8B30}, //14819 #CJK UNIFIED IDEOGRAPH
+ {0xD68C, 0x8B31}, //14820 #CJK UNIFIED IDEOGRAPH
+ {0xD68D, 0x8B32}, //14821 #CJK UNIFIED IDEOGRAPH
+ {0xD68E, 0x8B33}, //14822 #CJK UNIFIED IDEOGRAPH
+ {0xD68F, 0x8B34}, //14823 #CJK UNIFIED IDEOGRAPH
+ {0xD690, 0x8B35}, //14824 #CJK UNIFIED IDEOGRAPH
+ {0xD691, 0x8B36}, //14825 #CJK UNIFIED IDEOGRAPH
+ {0xD692, 0x8B37}, //14826 #CJK UNIFIED IDEOGRAPH
+ {0xD693, 0x8B38}, //14827 #CJK UNIFIED IDEOGRAPH
+ {0xD694, 0x8B39}, //14828 #CJK UNIFIED IDEOGRAPH
+ {0xD695, 0x8B3A}, //14829 #CJK UNIFIED IDEOGRAPH
+ {0xD696, 0x8B3B}, //14830 #CJK UNIFIED IDEOGRAPH
+ {0xD697, 0x8B3C}, //14831 #CJK UNIFIED IDEOGRAPH
+ {0xD698, 0x8B3D}, //14832 #CJK UNIFIED IDEOGRAPH
+ {0xD699, 0x8B3E}, //14833 #CJK UNIFIED IDEOGRAPH
+ {0xD69A, 0x8B3F}, //14834 #CJK UNIFIED IDEOGRAPH
+ {0xD69B, 0x8B40}, //14835 #CJK UNIFIED IDEOGRAPH
+ {0xD69C, 0x8B41}, //14836 #CJK UNIFIED IDEOGRAPH
+ {0xD69D, 0x8B42}, //14837 #CJK UNIFIED IDEOGRAPH
+ {0xD69E, 0x8B43}, //14838 #CJK UNIFIED IDEOGRAPH
+ {0xD69F, 0x8B44}, //14839 #CJK UNIFIED IDEOGRAPH
+ {0xD6A0, 0x8B45}, //14840 #CJK UNIFIED IDEOGRAPH
+ {0xD6A1, 0x5E27}, //14841 #CJK UNIFIED IDEOGRAPH
+ {0xD6A2, 0x75C7}, //14842 #CJK UNIFIED IDEOGRAPH
+ {0xD6A3, 0x90D1}, //14843 #CJK UNIFIED IDEOGRAPH
+ {0xD6A4, 0x8BC1}, //14844 #CJK UNIFIED IDEOGRAPH
+ {0xD6A5, 0x829D}, //14845 #CJK UNIFIED IDEOGRAPH
+ {0xD6A6, 0x679D}, //14846 #CJK UNIFIED IDEOGRAPH
+ {0xD6A7, 0x652F}, //14847 #CJK UNIFIED IDEOGRAPH
+ {0xD6A8, 0x5431}, //14848 #CJK UNIFIED IDEOGRAPH
+ {0xD6A9, 0x8718}, //14849 #CJK UNIFIED IDEOGRAPH
+ {0xD6AA, 0x77E5}, //14850 #CJK UNIFIED IDEOGRAPH
+ {0xD6AB, 0x80A2}, //14851 #CJK UNIFIED IDEOGRAPH
+ {0xD6AC, 0x8102}, //14852 #CJK UNIFIED IDEOGRAPH
+ {0xD6AD, 0x6C41}, //14853 #CJK UNIFIED IDEOGRAPH
+ {0xD6AE, 0x4E4B}, //14854 #CJK UNIFIED IDEOGRAPH
+ {0xD6AF, 0x7EC7}, //14855 #CJK UNIFIED IDEOGRAPH
+ {0xD6B0, 0x804C}, //14856 #CJK UNIFIED IDEOGRAPH
+ {0xD6B1, 0x76F4}, //14857 #CJK UNIFIED IDEOGRAPH
+ {0xD6B2, 0x690D}, //14858 #CJK UNIFIED IDEOGRAPH
+ {0xD6B3, 0x6B96}, //14859 #CJK UNIFIED IDEOGRAPH
+ {0xD6B4, 0x6267}, //14860 #CJK UNIFIED IDEOGRAPH
+ {0xD6B5, 0x503C}, //14861 #CJK UNIFIED IDEOGRAPH
+ {0xD6B6, 0x4F84}, //14862 #CJK UNIFIED IDEOGRAPH
+ {0xD6B7, 0x5740}, //14863 #CJK UNIFIED IDEOGRAPH
+ {0xD6B8, 0x6307}, //14864 #CJK UNIFIED IDEOGRAPH
+ {0xD6B9, 0x6B62}, //14865 #CJK UNIFIED IDEOGRAPH
+ {0xD6BA, 0x8DBE}, //14866 #CJK UNIFIED IDEOGRAPH
+ {0xD6BB, 0x53EA}, //14867 #CJK UNIFIED IDEOGRAPH
+ {0xD6BC, 0x65E8}, //14868 #CJK UNIFIED IDEOGRAPH
+ {0xD6BD, 0x7EB8}, //14869 #CJK UNIFIED IDEOGRAPH
+ {0xD6BE, 0x5FD7}, //14870 #CJK UNIFIED IDEOGRAPH
+ {0xD6BF, 0x631A}, //14871 #CJK UNIFIED IDEOGRAPH
+ {0xD6C0, 0x63B7}, //14872 #CJK UNIFIED IDEOGRAPH
+ {0xD6C1, 0x81F3}, //14873 #CJK UNIFIED IDEOGRAPH
+ {0xD6C2, 0x81F4}, //14874 #CJK UNIFIED IDEOGRAPH
+ {0xD6C3, 0x7F6E}, //14875 #CJK UNIFIED IDEOGRAPH
+ {0xD6C4, 0x5E1C}, //14876 #CJK UNIFIED IDEOGRAPH
+ {0xD6C5, 0x5CD9}, //14877 #CJK UNIFIED IDEOGRAPH
+ {0xD6C6, 0x5236}, //14878 #CJK UNIFIED IDEOGRAPH
+ {0xD6C7, 0x667A}, //14879 #CJK UNIFIED IDEOGRAPH
+ {0xD6C8, 0x79E9}, //14880 #CJK UNIFIED IDEOGRAPH
+ {0xD6C9, 0x7A1A}, //14881 #CJK UNIFIED IDEOGRAPH
+ {0xD6CA, 0x8D28}, //14882 #CJK UNIFIED IDEOGRAPH
+ {0xD6CB, 0x7099}, //14883 #CJK UNIFIED IDEOGRAPH
+ {0xD6CC, 0x75D4}, //14884 #CJK UNIFIED IDEOGRAPH
+ {0xD6CD, 0x6EDE}, //14885 #CJK UNIFIED IDEOGRAPH
+ {0xD6CE, 0x6CBB}, //14886 #CJK UNIFIED IDEOGRAPH
+ {0xD6CF, 0x7A92}, //14887 #CJK UNIFIED IDEOGRAPH
+ {0xD6D0, 0x4E2D}, //14888 #CJK UNIFIED IDEOGRAPH
+ {0xD6D1, 0x76C5}, //14889 #CJK UNIFIED IDEOGRAPH
+ {0xD6D2, 0x5FE0}, //14890 #CJK UNIFIED IDEOGRAPH
+ {0xD6D3, 0x949F}, //14891 #CJK UNIFIED IDEOGRAPH
+ {0xD6D4, 0x8877}, //14892 #CJK UNIFIED IDEOGRAPH
+ {0xD6D5, 0x7EC8}, //14893 #CJK UNIFIED IDEOGRAPH
+ {0xD6D6, 0x79CD}, //14894 #CJK UNIFIED IDEOGRAPH
+ {0xD6D7, 0x80BF}, //14895 #CJK UNIFIED IDEOGRAPH
+ {0xD6D8, 0x91CD}, //14896 #CJK UNIFIED IDEOGRAPH
+ {0xD6D9, 0x4EF2}, //14897 #CJK UNIFIED IDEOGRAPH
+ {0xD6DA, 0x4F17}, //14898 #CJK UNIFIED IDEOGRAPH
+ {0xD6DB, 0x821F}, //14899 #CJK UNIFIED IDEOGRAPH
+ {0xD6DC, 0x5468}, //14900 #CJK UNIFIED IDEOGRAPH
+ {0xD6DD, 0x5DDE}, //14901 #CJK UNIFIED IDEOGRAPH
+ {0xD6DE, 0x6D32}, //14902 #CJK UNIFIED IDEOGRAPH
+ {0xD6DF, 0x8BCC}, //14903 #CJK UNIFIED IDEOGRAPH
+ {0xD6E0, 0x7CA5}, //14904 #CJK UNIFIED IDEOGRAPH
+ {0xD6E1, 0x8F74}, //14905 #CJK UNIFIED IDEOGRAPH
+ {0xD6E2, 0x8098}, //14906 #CJK UNIFIED IDEOGRAPH
+ {0xD6E3, 0x5E1A}, //14907 #CJK UNIFIED IDEOGRAPH
+ {0xD6E4, 0x5492}, //14908 #CJK UNIFIED IDEOGRAPH
+ {0xD6E5, 0x76B1}, //14909 #CJK UNIFIED IDEOGRAPH
+ {0xD6E6, 0x5B99}, //14910 #CJK UNIFIED IDEOGRAPH
+ {0xD6E7, 0x663C}, //14911 #CJK UNIFIED IDEOGRAPH
+ {0xD6E8, 0x9AA4}, //14912 #CJK UNIFIED IDEOGRAPH
+ {0xD6E9, 0x73E0}, //14913 #CJK UNIFIED IDEOGRAPH
+ {0xD6EA, 0x682A}, //14914 #CJK UNIFIED IDEOGRAPH
+ {0xD6EB, 0x86DB}, //14915 #CJK UNIFIED IDEOGRAPH
+ {0xD6EC, 0x6731}, //14916 #CJK UNIFIED IDEOGRAPH
+ {0xD6ED, 0x732A}, //14917 #CJK UNIFIED IDEOGRAPH
+ {0xD6EE, 0x8BF8}, //14918 #CJK UNIFIED IDEOGRAPH
+ {0xD6EF, 0x8BDB}, //14919 #CJK UNIFIED IDEOGRAPH
+ {0xD6F0, 0x9010}, //14920 #CJK UNIFIED IDEOGRAPH
+ {0xD6F1, 0x7AF9}, //14921 #CJK UNIFIED IDEOGRAPH
+ {0xD6F2, 0x70DB}, //14922 #CJK UNIFIED IDEOGRAPH
+ {0xD6F3, 0x716E}, //14923 #CJK UNIFIED IDEOGRAPH
+ {0xD6F4, 0x62C4}, //14924 #CJK UNIFIED IDEOGRAPH
+ {0xD6F5, 0x77A9}, //14925 #CJK UNIFIED IDEOGRAPH
+ {0xD6F6, 0x5631}, //14926 #CJK UNIFIED IDEOGRAPH
+ {0xD6F7, 0x4E3B}, //14927 #CJK UNIFIED IDEOGRAPH
+ {0xD6F8, 0x8457}, //14928 #CJK UNIFIED IDEOGRAPH
+ {0xD6F9, 0x67F1}, //14929 #CJK UNIFIED IDEOGRAPH
+ {0xD6FA, 0x52A9}, //14930 #CJK UNIFIED IDEOGRAPH
+ {0xD6FB, 0x86C0}, //14931 #CJK UNIFIED IDEOGRAPH
+ {0xD6FC, 0x8D2E}, //14932 #CJK UNIFIED IDEOGRAPH
+ {0xD6FD, 0x94F8}, //14933 #CJK UNIFIED IDEOGRAPH
+ {0xD6FE, 0x7B51}, //14934 #CJK UNIFIED IDEOGRAPH
+ {0xD740, 0x8B46}, //14935 #CJK UNIFIED IDEOGRAPH
+ {0xD741, 0x8B47}, //14936 #CJK UNIFIED IDEOGRAPH
+ {0xD742, 0x8B48}, //14937 #CJK UNIFIED IDEOGRAPH
+ {0xD743, 0x8B49}, //14938 #CJK UNIFIED IDEOGRAPH
+ {0xD744, 0x8B4A}, //14939 #CJK UNIFIED IDEOGRAPH
+ {0xD745, 0x8B4B}, //14940 #CJK UNIFIED IDEOGRAPH
+ {0xD746, 0x8B4C}, //14941 #CJK UNIFIED IDEOGRAPH
+ {0xD747, 0x8B4D}, //14942 #CJK UNIFIED IDEOGRAPH
+ {0xD748, 0x8B4E}, //14943 #CJK UNIFIED IDEOGRAPH
+ {0xD749, 0x8B4F}, //14944 #CJK UNIFIED IDEOGRAPH
+ {0xD74A, 0x8B50}, //14945 #CJK UNIFIED IDEOGRAPH
+ {0xD74B, 0x8B51}, //14946 #CJK UNIFIED IDEOGRAPH
+ {0xD74C, 0x8B52}, //14947 #CJK UNIFIED IDEOGRAPH
+ {0xD74D, 0x8B53}, //14948 #CJK UNIFIED IDEOGRAPH
+ {0xD74E, 0x8B54}, //14949 #CJK UNIFIED IDEOGRAPH
+ {0xD74F, 0x8B55}, //14950 #CJK UNIFIED IDEOGRAPH
+ {0xD750, 0x8B56}, //14951 #CJK UNIFIED IDEOGRAPH
+ {0xD751, 0x8B57}, //14952 #CJK UNIFIED IDEOGRAPH
+ {0xD752, 0x8B58}, //14953 #CJK UNIFIED IDEOGRAPH
+ {0xD753, 0x8B59}, //14954 #CJK UNIFIED IDEOGRAPH
+ {0xD754, 0x8B5A}, //14955 #CJK UNIFIED IDEOGRAPH
+ {0xD755, 0x8B5B}, //14956 #CJK UNIFIED IDEOGRAPH
+ {0xD756, 0x8B5C}, //14957 #CJK UNIFIED IDEOGRAPH
+ {0xD757, 0x8B5D}, //14958 #CJK UNIFIED IDEOGRAPH
+ {0xD758, 0x8B5E}, //14959 #CJK UNIFIED IDEOGRAPH
+ {0xD759, 0x8B5F}, //14960 #CJK UNIFIED IDEOGRAPH
+ {0xD75A, 0x8B60}, //14961 #CJK UNIFIED IDEOGRAPH
+ {0xD75B, 0x8B61}, //14962 #CJK UNIFIED IDEOGRAPH
+ {0xD75C, 0x8B62}, //14963 #CJK UNIFIED IDEOGRAPH
+ {0xD75D, 0x8B63}, //14964 #CJK UNIFIED IDEOGRAPH
+ {0xD75E, 0x8B64}, //14965 #CJK UNIFIED IDEOGRAPH
+ {0xD75F, 0x8B65}, //14966 #CJK UNIFIED IDEOGRAPH
+ {0xD760, 0x8B67}, //14967 #CJK UNIFIED IDEOGRAPH
+ {0xD761, 0x8B68}, //14968 #CJK UNIFIED IDEOGRAPH
+ {0xD762, 0x8B69}, //14969 #CJK UNIFIED IDEOGRAPH
+ {0xD763, 0x8B6A}, //14970 #CJK UNIFIED IDEOGRAPH
+ {0xD764, 0x8B6B}, //14971 #CJK UNIFIED IDEOGRAPH
+ {0xD765, 0x8B6D}, //14972 #CJK UNIFIED IDEOGRAPH
+ {0xD766, 0x8B6E}, //14973 #CJK UNIFIED IDEOGRAPH
+ {0xD767, 0x8B6F}, //14974 #CJK UNIFIED IDEOGRAPH
+ {0xD768, 0x8B70}, //14975 #CJK UNIFIED IDEOGRAPH
+ {0xD769, 0x8B71}, //14976 #CJK UNIFIED IDEOGRAPH
+ {0xD76A, 0x8B72}, //14977 #CJK UNIFIED IDEOGRAPH
+ {0xD76B, 0x8B73}, //14978 #CJK UNIFIED IDEOGRAPH
+ {0xD76C, 0x8B74}, //14979 #CJK UNIFIED IDEOGRAPH
+ {0xD76D, 0x8B75}, //14980 #CJK UNIFIED IDEOGRAPH
+ {0xD76E, 0x8B76}, //14981 #CJK UNIFIED IDEOGRAPH
+ {0xD76F, 0x8B77}, //14982 #CJK UNIFIED IDEOGRAPH
+ {0xD770, 0x8B78}, //14983 #CJK UNIFIED IDEOGRAPH
+ {0xD771, 0x8B79}, //14984 #CJK UNIFIED IDEOGRAPH
+ {0xD772, 0x8B7A}, //14985 #CJK UNIFIED IDEOGRAPH
+ {0xD773, 0x8B7B}, //14986 #CJK UNIFIED IDEOGRAPH
+ {0xD774, 0x8B7C}, //14987 #CJK UNIFIED IDEOGRAPH
+ {0xD775, 0x8B7D}, //14988 #CJK UNIFIED IDEOGRAPH
+ {0xD776, 0x8B7E}, //14989 #CJK UNIFIED IDEOGRAPH
+ {0xD777, 0x8B7F}, //14990 #CJK UNIFIED IDEOGRAPH
+ {0xD778, 0x8B80}, //14991 #CJK UNIFIED IDEOGRAPH
+ {0xD779, 0x8B81}, //14992 #CJK UNIFIED IDEOGRAPH
+ {0xD77A, 0x8B82}, //14993 #CJK UNIFIED IDEOGRAPH
+ {0xD77B, 0x8B83}, //14994 #CJK UNIFIED IDEOGRAPH
+ {0xD77C, 0x8B84}, //14995 #CJK UNIFIED IDEOGRAPH
+ {0xD77D, 0x8B85}, //14996 #CJK UNIFIED IDEOGRAPH
+ {0xD77E, 0x8B86}, //14997 #CJK UNIFIED IDEOGRAPH
+ {0xD780, 0x8B87}, //14998 #CJK UNIFIED IDEOGRAPH
+ {0xD781, 0x8B88}, //14999 #CJK UNIFIED IDEOGRAPH
+ {0xD782, 0x8B89}, //15000 #CJK UNIFIED IDEOGRAPH
+ {0xD783, 0x8B8A}, //15001 #CJK UNIFIED IDEOGRAPH
+ {0xD784, 0x8B8B}, //15002 #CJK UNIFIED IDEOGRAPH
+ {0xD785, 0x8B8C}, //15003 #CJK UNIFIED IDEOGRAPH
+ {0xD786, 0x8B8D}, //15004 #CJK UNIFIED IDEOGRAPH
+ {0xD787, 0x8B8E}, //15005 #CJK UNIFIED IDEOGRAPH
+ {0xD788, 0x8B8F}, //15006 #CJK UNIFIED IDEOGRAPH
+ {0xD789, 0x8B90}, //15007 #CJK UNIFIED IDEOGRAPH
+ {0xD78A, 0x8B91}, //15008 #CJK UNIFIED IDEOGRAPH
+ {0xD78B, 0x8B92}, //15009 #CJK UNIFIED IDEOGRAPH
+ {0xD78C, 0x8B93}, //15010 #CJK UNIFIED IDEOGRAPH
+ {0xD78D, 0x8B94}, //15011 #CJK UNIFIED IDEOGRAPH
+ {0xD78E, 0x8B95}, //15012 #CJK UNIFIED IDEOGRAPH
+ {0xD78F, 0x8B96}, //15013 #CJK UNIFIED IDEOGRAPH
+ {0xD790, 0x8B97}, //15014 #CJK UNIFIED IDEOGRAPH
+ {0xD791, 0x8B98}, //15015 #CJK UNIFIED IDEOGRAPH
+ {0xD792, 0x8B99}, //15016 #CJK UNIFIED IDEOGRAPH
+ {0xD793, 0x8B9A}, //15017 #CJK UNIFIED IDEOGRAPH
+ {0xD794, 0x8B9B}, //15018 #CJK UNIFIED IDEOGRAPH
+ {0xD795, 0x8B9C}, //15019 #CJK UNIFIED IDEOGRAPH
+ {0xD796, 0x8B9D}, //15020 #CJK UNIFIED IDEOGRAPH
+ {0xD797, 0x8B9E}, //15021 #CJK UNIFIED IDEOGRAPH
+ {0xD798, 0x8B9F}, //15022 #CJK UNIFIED IDEOGRAPH
+ {0xD799, 0x8BAC}, //15023 #CJK UNIFIED IDEOGRAPH
+ {0xD79A, 0x8BB1}, //15024 #CJK UNIFIED IDEOGRAPH
+ {0xD79B, 0x8BBB}, //15025 #CJK UNIFIED IDEOGRAPH
+ {0xD79C, 0x8BC7}, //15026 #CJK UNIFIED IDEOGRAPH
+ {0xD79D, 0x8BD0}, //15027 #CJK UNIFIED IDEOGRAPH
+ {0xD79E, 0x8BEA}, //15028 #CJK UNIFIED IDEOGRAPH
+ {0xD79F, 0x8C09}, //15029 #CJK UNIFIED IDEOGRAPH
+ {0xD7A0, 0x8C1E}, //15030 #CJK UNIFIED IDEOGRAPH
+ {0xD7A1, 0x4F4F}, //15031 #CJK UNIFIED IDEOGRAPH
+ {0xD7A2, 0x6CE8}, //15032 #CJK UNIFIED IDEOGRAPH
+ {0xD7A3, 0x795D}, //15033 #CJK UNIFIED IDEOGRAPH
+ {0xD7A4, 0x9A7B}, //15034 #CJK UNIFIED IDEOGRAPH
+ {0xD7A5, 0x6293}, //15035 #CJK UNIFIED IDEOGRAPH
+ {0xD7A6, 0x722A}, //15036 #CJK UNIFIED IDEOGRAPH
+ {0xD7A7, 0x62FD}, //15037 #CJK UNIFIED IDEOGRAPH
+ {0xD7A8, 0x4E13}, //15038 #CJK UNIFIED IDEOGRAPH
+ {0xD7A9, 0x7816}, //15039 #CJK UNIFIED IDEOGRAPH
+ {0xD7AA, 0x8F6C}, //15040 #CJK UNIFIED IDEOGRAPH
+ {0xD7AB, 0x64B0}, //15041 #CJK UNIFIED IDEOGRAPH
+ {0xD7AC, 0x8D5A}, //15042 #CJK UNIFIED IDEOGRAPH
+ {0xD7AD, 0x7BC6}, //15043 #CJK UNIFIED IDEOGRAPH
+ {0xD7AE, 0x6869}, //15044 #CJK UNIFIED IDEOGRAPH
+ {0xD7AF, 0x5E84}, //15045 #CJK UNIFIED IDEOGRAPH
+ {0xD7B0, 0x88C5}, //15046 #CJK UNIFIED IDEOGRAPH
+ {0xD7B1, 0x5986}, //15047 #CJK UNIFIED IDEOGRAPH
+ {0xD7B2, 0x649E}, //15048 #CJK UNIFIED IDEOGRAPH
+ {0xD7B3, 0x58EE}, //15049 #CJK UNIFIED IDEOGRAPH
+ {0xD7B4, 0x72B6}, //15050 #CJK UNIFIED IDEOGRAPH
+ {0xD7B5, 0x690E}, //15051 #CJK UNIFIED IDEOGRAPH
+ {0xD7B6, 0x9525}, //15052 #CJK UNIFIED IDEOGRAPH
+ {0xD7B7, 0x8FFD}, //15053 #CJK UNIFIED IDEOGRAPH
+ {0xD7B8, 0x8D58}, //15054 #CJK UNIFIED IDEOGRAPH
+ {0xD7B9, 0x5760}, //15055 #CJK UNIFIED IDEOGRAPH
+ {0xD7BA, 0x7F00}, //15056 #CJK UNIFIED IDEOGRAPH
+ {0xD7BB, 0x8C06}, //15057 #CJK UNIFIED IDEOGRAPH
+ {0xD7BC, 0x51C6}, //15058 #CJK UNIFIED IDEOGRAPH
+ {0xD7BD, 0x6349}, //15059 #CJK UNIFIED IDEOGRAPH
+ {0xD7BE, 0x62D9}, //15060 #CJK UNIFIED IDEOGRAPH
+ {0xD7BF, 0x5353}, //15061 #CJK UNIFIED IDEOGRAPH
+ {0xD7C0, 0x684C}, //15062 #CJK UNIFIED IDEOGRAPH
+ {0xD7C1, 0x7422}, //15063 #CJK UNIFIED IDEOGRAPH
+ {0xD7C2, 0x8301}, //15064 #CJK UNIFIED IDEOGRAPH
+ {0xD7C3, 0x914C}, //15065 #CJK UNIFIED IDEOGRAPH
+ {0xD7C4, 0x5544}, //15066 #CJK UNIFIED IDEOGRAPH
+ {0xD7C5, 0x7740}, //15067 #CJK UNIFIED IDEOGRAPH
+ {0xD7C6, 0x707C}, //15068 #CJK UNIFIED IDEOGRAPH
+ {0xD7C7, 0x6D4A}, //15069 #CJK UNIFIED IDEOGRAPH
+ {0xD7C8, 0x5179}, //15070 #CJK UNIFIED IDEOGRAPH
+ {0xD7C9, 0x54A8}, //15071 #CJK UNIFIED IDEOGRAPH
+ {0xD7CA, 0x8D44}, //15072 #CJK UNIFIED IDEOGRAPH
+ {0xD7CB, 0x59FF}, //15073 #CJK UNIFIED IDEOGRAPH
+ {0xD7CC, 0x6ECB}, //15074 #CJK UNIFIED IDEOGRAPH
+ {0xD7CD, 0x6DC4}, //15075 #CJK UNIFIED IDEOGRAPH
+ {0xD7CE, 0x5B5C}, //15076 #CJK UNIFIED IDEOGRAPH
+ {0xD7CF, 0x7D2B}, //15077 #CJK UNIFIED IDEOGRAPH
+ {0xD7D0, 0x4ED4}, //15078 #CJK UNIFIED IDEOGRAPH
+ {0xD7D1, 0x7C7D}, //15079 #CJK UNIFIED IDEOGRAPH
+ {0xD7D2, 0x6ED3}, //15080 #CJK UNIFIED IDEOGRAPH
+ {0xD7D3, 0x5B50}, //15081 #CJK UNIFIED IDEOGRAPH
+ {0xD7D4, 0x81EA}, //15082 #CJK UNIFIED IDEOGRAPH
+ {0xD7D5, 0x6E0D}, //15083 #CJK UNIFIED IDEOGRAPH
+ {0xD7D6, 0x5B57}, //15084 #CJK UNIFIED IDEOGRAPH
+ {0xD7D7, 0x9B03}, //15085 #CJK UNIFIED IDEOGRAPH
+ {0xD7D8, 0x68D5}, //15086 #CJK UNIFIED IDEOGRAPH
+ {0xD7D9, 0x8E2A}, //15087 #CJK UNIFIED IDEOGRAPH
+ {0xD7DA, 0x5B97}, //15088 #CJK UNIFIED IDEOGRAPH
+ {0xD7DB, 0x7EFC}, //15089 #CJK UNIFIED IDEOGRAPH
+ {0xD7DC, 0x603B}, //15090 #CJK UNIFIED IDEOGRAPH
+ {0xD7DD, 0x7EB5}, //15091 #CJK UNIFIED IDEOGRAPH
+ {0xD7DE, 0x90B9}, //15092 #CJK UNIFIED IDEOGRAPH
+ {0xD7DF, 0x8D70}, //15093 #CJK UNIFIED IDEOGRAPH
+ {0xD7E0, 0x594F}, //15094 #CJK UNIFIED IDEOGRAPH
+ {0xD7E1, 0x63CD}, //15095 #CJK UNIFIED IDEOGRAPH
+ {0xD7E2, 0x79DF}, //15096 #CJK UNIFIED IDEOGRAPH
+ {0xD7E3, 0x8DB3}, //15097 #CJK UNIFIED IDEOGRAPH
+ {0xD7E4, 0x5352}, //15098 #CJK UNIFIED IDEOGRAPH
+ {0xD7E5, 0x65CF}, //15099 #CJK UNIFIED IDEOGRAPH
+ {0xD7E6, 0x7956}, //15100 #CJK UNIFIED IDEOGRAPH
+ {0xD7E7, 0x8BC5}, //15101 #CJK UNIFIED IDEOGRAPH
+ {0xD7E8, 0x963B}, //15102 #CJK UNIFIED IDEOGRAPH
+ {0xD7E9, 0x7EC4}, //15103 #CJK UNIFIED IDEOGRAPH
+ {0xD7EA, 0x94BB}, //15104 #CJK UNIFIED IDEOGRAPH
+ {0xD7EB, 0x7E82}, //15105 #CJK UNIFIED IDEOGRAPH
+ {0xD7EC, 0x5634}, //15106 #CJK UNIFIED IDEOGRAPH
+ {0xD7ED, 0x9189}, //15107 #CJK UNIFIED IDEOGRAPH
+ {0xD7EE, 0x6700}, //15108 #CJK UNIFIED IDEOGRAPH
+ {0xD7EF, 0x7F6A}, //15109 #CJK UNIFIED IDEOGRAPH
+ {0xD7F0, 0x5C0A}, //15110 #CJK UNIFIED IDEOGRAPH
+ {0xD7F1, 0x9075}, //15111 #CJK UNIFIED IDEOGRAPH
+ {0xD7F2, 0x6628}, //15112 #CJK UNIFIED IDEOGRAPH
+ {0xD7F3, 0x5DE6}, //15113 #CJK UNIFIED IDEOGRAPH
+ {0xD7F4, 0x4F50}, //15114 #CJK UNIFIED IDEOGRAPH
+ {0xD7F5, 0x67DE}, //15115 #CJK UNIFIED IDEOGRAPH
+ {0xD7F6, 0x505A}, //15116 #CJK UNIFIED IDEOGRAPH
+ {0xD7F7, 0x4F5C}, //15117 #CJK UNIFIED IDEOGRAPH
+ {0xD7F8, 0x5750}, //15118 #CJK UNIFIED IDEOGRAPH
+ {0xD7F9, 0x5EA7}, //15119 #CJK UNIFIED IDEOGRAPH
+ {0xD840, 0x8C38}, //15120 #CJK UNIFIED IDEOGRAPH
+ {0xD841, 0x8C39}, //15121 #CJK UNIFIED IDEOGRAPH
+ {0xD842, 0x8C3A}, //15122 #CJK UNIFIED IDEOGRAPH
+ {0xD843, 0x8C3B}, //15123 #CJK UNIFIED IDEOGRAPH
+ {0xD844, 0x8C3C}, //15124 #CJK UNIFIED IDEOGRAPH
+ {0xD845, 0x8C3D}, //15125 #CJK UNIFIED IDEOGRAPH
+ {0xD846, 0x8C3E}, //15126 #CJK UNIFIED IDEOGRAPH
+ {0xD847, 0x8C3F}, //15127 #CJK UNIFIED IDEOGRAPH
+ {0xD848, 0x8C40}, //15128 #CJK UNIFIED IDEOGRAPH
+ {0xD849, 0x8C42}, //15129 #CJK UNIFIED IDEOGRAPH
+ {0xD84A, 0x8C43}, //15130 #CJK UNIFIED IDEOGRAPH
+ {0xD84B, 0x8C44}, //15131 #CJK UNIFIED IDEOGRAPH
+ {0xD84C, 0x8C45}, //15132 #CJK UNIFIED IDEOGRAPH
+ {0xD84D, 0x8C48}, //15133 #CJK UNIFIED IDEOGRAPH
+ {0xD84E, 0x8C4A}, //15134 #CJK UNIFIED IDEOGRAPH
+ {0xD84F, 0x8C4B}, //15135 #CJK UNIFIED IDEOGRAPH
+ {0xD850, 0x8C4D}, //15136 #CJK UNIFIED IDEOGRAPH
+ {0xD851, 0x8C4E}, //15137 #CJK UNIFIED IDEOGRAPH
+ {0xD852, 0x8C4F}, //15138 #CJK UNIFIED IDEOGRAPH
+ {0xD853, 0x8C50}, //15139 #CJK UNIFIED IDEOGRAPH
+ {0xD854, 0x8C51}, //15140 #CJK UNIFIED IDEOGRAPH
+ {0xD855, 0x8C52}, //15141 #CJK UNIFIED IDEOGRAPH
+ {0xD856, 0x8C53}, //15142 #CJK UNIFIED IDEOGRAPH
+ {0xD857, 0x8C54}, //15143 #CJK UNIFIED IDEOGRAPH
+ {0xD858, 0x8C56}, //15144 #CJK UNIFIED IDEOGRAPH
+ {0xD859, 0x8C57}, //15145 #CJK UNIFIED IDEOGRAPH
+ {0xD85A, 0x8C58}, //15146 #CJK UNIFIED IDEOGRAPH
+ {0xD85B, 0x8C59}, //15147 #CJK UNIFIED IDEOGRAPH
+ {0xD85C, 0x8C5B}, //15148 #CJK UNIFIED IDEOGRAPH
+ {0xD85D, 0x8C5C}, //15149 #CJK UNIFIED IDEOGRAPH
+ {0xD85E, 0x8C5D}, //15150 #CJK UNIFIED IDEOGRAPH
+ {0xD85F, 0x8C5E}, //15151 #CJK UNIFIED IDEOGRAPH
+ {0xD860, 0x8C5F}, //15152 #CJK UNIFIED IDEOGRAPH
+ {0xD861, 0x8C60}, //15153 #CJK UNIFIED IDEOGRAPH
+ {0xD862, 0x8C63}, //15154 #CJK UNIFIED IDEOGRAPH
+ {0xD863, 0x8C64}, //15155 #CJK UNIFIED IDEOGRAPH
+ {0xD864, 0x8C65}, //15156 #CJK UNIFIED IDEOGRAPH
+ {0xD865, 0x8C66}, //15157 #CJK UNIFIED IDEOGRAPH
+ {0xD866, 0x8C67}, //15158 #CJK UNIFIED IDEOGRAPH
+ {0xD867, 0x8C68}, //15159 #CJK UNIFIED IDEOGRAPH
+ {0xD868, 0x8C69}, //15160 #CJK UNIFIED IDEOGRAPH
+ {0xD869, 0x8C6C}, //15161 #CJK UNIFIED IDEOGRAPH
+ {0xD86A, 0x8C6D}, //15162 #CJK UNIFIED IDEOGRAPH
+ {0xD86B, 0x8C6E}, //15163 #CJK UNIFIED IDEOGRAPH
+ {0xD86C, 0x8C6F}, //15164 #CJK UNIFIED IDEOGRAPH
+ {0xD86D, 0x8C70}, //15165 #CJK UNIFIED IDEOGRAPH
+ {0xD86E, 0x8C71}, //15166 #CJK UNIFIED IDEOGRAPH
+ {0xD86F, 0x8C72}, //15167 #CJK UNIFIED IDEOGRAPH
+ {0xD870, 0x8C74}, //15168 #CJK UNIFIED IDEOGRAPH
+ {0xD871, 0x8C75}, //15169 #CJK UNIFIED IDEOGRAPH
+ {0xD872, 0x8C76}, //15170 #CJK UNIFIED IDEOGRAPH
+ {0xD873, 0x8C77}, //15171 #CJK UNIFIED IDEOGRAPH
+ {0xD874, 0x8C7B}, //15172 #CJK UNIFIED IDEOGRAPH
+ {0xD875, 0x8C7C}, //15173 #CJK UNIFIED IDEOGRAPH
+ {0xD876, 0x8C7D}, //15174 #CJK UNIFIED IDEOGRAPH
+ {0xD877, 0x8C7E}, //15175 #CJK UNIFIED IDEOGRAPH
+ {0xD878, 0x8C7F}, //15176 #CJK UNIFIED IDEOGRAPH
+ {0xD879, 0x8C80}, //15177 #CJK UNIFIED IDEOGRAPH
+ {0xD87A, 0x8C81}, //15178 #CJK UNIFIED IDEOGRAPH
+ {0xD87B, 0x8C83}, //15179 #CJK UNIFIED IDEOGRAPH
+ {0xD87C, 0x8C84}, //15180 #CJK UNIFIED IDEOGRAPH
+ {0xD87D, 0x8C86}, //15181 #CJK UNIFIED IDEOGRAPH
+ {0xD87E, 0x8C87}, //15182 #CJK UNIFIED IDEOGRAPH
+ {0xD880, 0x8C88}, //15183 #CJK UNIFIED IDEOGRAPH
+ {0xD881, 0x8C8B}, //15184 #CJK UNIFIED IDEOGRAPH
+ {0xD882, 0x8C8D}, //15185 #CJK UNIFIED IDEOGRAPH
+ {0xD883, 0x8C8E}, //15186 #CJK UNIFIED IDEOGRAPH
+ {0xD884, 0x8C8F}, //15187 #CJK UNIFIED IDEOGRAPH
+ {0xD885, 0x8C90}, //15188 #CJK UNIFIED IDEOGRAPH
+ {0xD886, 0x8C91}, //15189 #CJK UNIFIED IDEOGRAPH
+ {0xD887, 0x8C92}, //15190 #CJK UNIFIED IDEOGRAPH
+ {0xD888, 0x8C93}, //15191 #CJK UNIFIED IDEOGRAPH
+ {0xD889, 0x8C95}, //15192 #CJK UNIFIED IDEOGRAPH
+ {0xD88A, 0x8C96}, //15193 #CJK UNIFIED IDEOGRAPH
+ {0xD88B, 0x8C97}, //15194 #CJK UNIFIED IDEOGRAPH
+ {0xD88C, 0x8C99}, //15195 #CJK UNIFIED IDEOGRAPH
+ {0xD88D, 0x8C9A}, //15196 #CJK UNIFIED IDEOGRAPH
+ {0xD88E, 0x8C9B}, //15197 #CJK UNIFIED IDEOGRAPH
+ {0xD88F, 0x8C9C}, //15198 #CJK UNIFIED IDEOGRAPH
+ {0xD890, 0x8C9D}, //15199 #CJK UNIFIED IDEOGRAPH
+ {0xD891, 0x8C9E}, //15200 #CJK UNIFIED IDEOGRAPH
+ {0xD892, 0x8C9F}, //15201 #CJK UNIFIED IDEOGRAPH
+ {0xD893, 0x8CA0}, //15202 #CJK UNIFIED IDEOGRAPH
+ {0xD894, 0x8CA1}, //15203 #CJK UNIFIED IDEOGRAPH
+ {0xD895, 0x8CA2}, //15204 #CJK UNIFIED IDEOGRAPH
+ {0xD896, 0x8CA3}, //15205 #CJK UNIFIED IDEOGRAPH
+ {0xD897, 0x8CA4}, //15206 #CJK UNIFIED IDEOGRAPH
+ {0xD898, 0x8CA5}, //15207 #CJK UNIFIED IDEOGRAPH
+ {0xD899, 0x8CA6}, //15208 #CJK UNIFIED IDEOGRAPH
+ {0xD89A, 0x8CA7}, //15209 #CJK UNIFIED IDEOGRAPH
+ {0xD89B, 0x8CA8}, //15210 #CJK UNIFIED IDEOGRAPH
+ {0xD89C, 0x8CA9}, //15211 #CJK UNIFIED IDEOGRAPH
+ {0xD89D, 0x8CAA}, //15212 #CJK UNIFIED IDEOGRAPH
+ {0xD89E, 0x8CAB}, //15213 #CJK UNIFIED IDEOGRAPH
+ {0xD89F, 0x8CAC}, //15214 #CJK UNIFIED IDEOGRAPH
+ {0xD8A0, 0x8CAD}, //15215 #CJK UNIFIED IDEOGRAPH
+ {0xD8A1, 0x4E8D}, //15216 #CJK UNIFIED IDEOGRAPH
+ {0xD8A2, 0x4E0C}, //15217 #CJK UNIFIED IDEOGRAPH
+ {0xD8A3, 0x5140}, //15218 #CJK UNIFIED IDEOGRAPH
+ {0xD8A4, 0x4E10}, //15219 #CJK UNIFIED IDEOGRAPH
+ {0xD8A5, 0x5EFF}, //15220 #CJK UNIFIED IDEOGRAPH
+ {0xD8A6, 0x5345}, //15221 #CJK UNIFIED IDEOGRAPH
+ {0xD8A7, 0x4E15}, //15222 #CJK UNIFIED IDEOGRAPH
+ {0xD8A8, 0x4E98}, //15223 #CJK UNIFIED IDEOGRAPH
+ {0xD8A9, 0x4E1E}, //15224 #CJK UNIFIED IDEOGRAPH
+ {0xD8AA, 0x9B32}, //15225 #CJK UNIFIED IDEOGRAPH
+ {0xD8AB, 0x5B6C}, //15226 #CJK UNIFIED IDEOGRAPH
+ {0xD8AC, 0x5669}, //15227 #CJK UNIFIED IDEOGRAPH
+ {0xD8AD, 0x4E28}, //15228 #CJK UNIFIED IDEOGRAPH
+ {0xD8AE, 0x79BA}, //15229 #CJK UNIFIED IDEOGRAPH
+ {0xD8AF, 0x4E3F}, //15230 #CJK UNIFIED IDEOGRAPH
+ {0xD8B0, 0x5315}, //15231 #CJK UNIFIED IDEOGRAPH
+ {0xD8B1, 0x4E47}, //15232 #CJK UNIFIED IDEOGRAPH
+ {0xD8B2, 0x592D}, //15233 #CJK UNIFIED IDEOGRAPH
+ {0xD8B3, 0x723B}, //15234 #CJK UNIFIED IDEOGRAPH
+ {0xD8B4, 0x536E}, //15235 #CJK UNIFIED IDEOGRAPH
+ {0xD8B5, 0x6C10}, //15236 #CJK UNIFIED IDEOGRAPH
+ {0xD8B6, 0x56DF}, //15237 #CJK UNIFIED IDEOGRAPH
+ {0xD8B7, 0x80E4}, //15238 #CJK UNIFIED IDEOGRAPH
+ {0xD8B8, 0x9997}, //15239 #CJK UNIFIED IDEOGRAPH
+ {0xD8B9, 0x6BD3}, //15240 #CJK UNIFIED IDEOGRAPH
+ {0xD8BA, 0x777E}, //15241 #CJK UNIFIED IDEOGRAPH
+ {0xD8BB, 0x9F17}, //15242 #CJK UNIFIED IDEOGRAPH
+ {0xD8BC, 0x4E36}, //15243 #CJK UNIFIED IDEOGRAPH
+ {0xD8BD, 0x4E9F}, //15244 #CJK UNIFIED IDEOGRAPH
+ {0xD8BE, 0x9F10}, //15245 #CJK UNIFIED IDEOGRAPH
+ {0xD8BF, 0x4E5C}, //15246 #CJK UNIFIED IDEOGRAPH
+ {0xD8C0, 0x4E69}, //15247 #CJK UNIFIED IDEOGRAPH
+ {0xD8C1, 0x4E93}, //15248 #CJK UNIFIED IDEOGRAPH
+ {0xD8C2, 0x8288}, //15249 #CJK UNIFIED IDEOGRAPH
+ {0xD8C3, 0x5B5B}, //15250 #CJK UNIFIED IDEOGRAPH
+ {0xD8C4, 0x556C}, //15251 #CJK UNIFIED IDEOGRAPH
+ {0xD8C5, 0x560F}, //15252 #CJK UNIFIED IDEOGRAPH
+ {0xD8C6, 0x4EC4}, //15253 #CJK UNIFIED IDEOGRAPH
+ {0xD8C7, 0x538D}, //15254 #CJK UNIFIED IDEOGRAPH
+ {0xD8C8, 0x539D}, //15255 #CJK UNIFIED IDEOGRAPH
+ {0xD8C9, 0x53A3}, //15256 #CJK UNIFIED IDEOGRAPH
+ {0xD8CA, 0x53A5}, //15257 #CJK UNIFIED IDEOGRAPH
+ {0xD8CB, 0x53AE}, //15258 #CJK UNIFIED IDEOGRAPH
+ {0xD8CC, 0x9765}, //15259 #CJK UNIFIED IDEOGRAPH
+ {0xD8CD, 0x8D5D}, //15260 #CJK UNIFIED IDEOGRAPH
+ {0xD8CE, 0x531A}, //15261 #CJK UNIFIED IDEOGRAPH
+ {0xD8CF, 0x53F5}, //15262 #CJK UNIFIED IDEOGRAPH
+ {0xD8D0, 0x5326}, //15263 #CJK UNIFIED IDEOGRAPH
+ {0xD8D1, 0x532E}, //15264 #CJK UNIFIED IDEOGRAPH
+ {0xD8D2, 0x533E}, //15265 #CJK UNIFIED IDEOGRAPH
+ {0xD8D3, 0x8D5C}, //15266 #CJK UNIFIED IDEOGRAPH
+ {0xD8D4, 0x5366}, //15267 #CJK UNIFIED IDEOGRAPH
+ {0xD8D5, 0x5363}, //15268 #CJK UNIFIED IDEOGRAPH
+ {0xD8D6, 0x5202}, //15269 #CJK UNIFIED IDEOGRAPH
+ {0xD8D7, 0x5208}, //15270 #CJK UNIFIED IDEOGRAPH
+ {0xD8D8, 0x520E}, //15271 #CJK UNIFIED IDEOGRAPH
+ {0xD8D9, 0x522D}, //15272 #CJK UNIFIED IDEOGRAPH
+ {0xD8DA, 0x5233}, //15273 #CJK UNIFIED IDEOGRAPH
+ {0xD8DB, 0x523F}, //15274 #CJK UNIFIED IDEOGRAPH
+ {0xD8DC, 0x5240}, //15275 #CJK UNIFIED IDEOGRAPH
+ {0xD8DD, 0x524C}, //15276 #CJK UNIFIED IDEOGRAPH
+ {0xD8DE, 0x525E}, //15277 #CJK UNIFIED IDEOGRAPH
+ {0xD8DF, 0x5261}, //15278 #CJK UNIFIED IDEOGRAPH
+ {0xD8E0, 0x525C}, //15279 #CJK UNIFIED IDEOGRAPH
+ {0xD8E1, 0x84AF}, //15280 #CJK UNIFIED IDEOGRAPH
+ {0xD8E2, 0x527D}, //15281 #CJK UNIFIED IDEOGRAPH
+ {0xD8E3, 0x5282}, //15282 #CJK UNIFIED IDEOGRAPH
+ {0xD8E4, 0x5281}, //15283 #CJK UNIFIED IDEOGRAPH
+ {0xD8E5, 0x5290}, //15284 #CJK UNIFIED IDEOGRAPH
+ {0xD8E6, 0x5293}, //15285 #CJK UNIFIED IDEOGRAPH
+ {0xD8E7, 0x5182}, //15286 #CJK UNIFIED IDEOGRAPH
+ {0xD8E8, 0x7F54}, //15287 #CJK UNIFIED IDEOGRAPH
+ {0xD8E9, 0x4EBB}, //15288 #CJK UNIFIED IDEOGRAPH
+ {0xD8EA, 0x4EC3}, //15289 #CJK UNIFIED IDEOGRAPH
+ {0xD8EB, 0x4EC9}, //15290 #CJK UNIFIED IDEOGRAPH
+ {0xD8EC, 0x4EC2}, //15291 #CJK UNIFIED IDEOGRAPH
+ {0xD8ED, 0x4EE8}, //15292 #CJK UNIFIED IDEOGRAPH
+ {0xD8EE, 0x4EE1}, //15293 #CJK UNIFIED IDEOGRAPH
+ {0xD8EF, 0x4EEB}, //15294 #CJK UNIFIED IDEOGRAPH
+ {0xD8F0, 0x4EDE}, //15295 #CJK UNIFIED IDEOGRAPH
+ {0xD8F1, 0x4F1B}, //15296 #CJK UNIFIED IDEOGRAPH
+ {0xD8F2, 0x4EF3}, //15297 #CJK UNIFIED IDEOGRAPH
+ {0xD8F3, 0x4F22}, //15298 #CJK UNIFIED IDEOGRAPH
+ {0xD8F4, 0x4F64}, //15299 #CJK UNIFIED IDEOGRAPH
+ {0xD8F5, 0x4EF5}, //15300 #CJK UNIFIED IDEOGRAPH
+ {0xD8F6, 0x4F25}, //15301 #CJK UNIFIED IDEOGRAPH
+ {0xD8F7, 0x4F27}, //15302 #CJK UNIFIED IDEOGRAPH
+ {0xD8F8, 0x4F09}, //15303 #CJK UNIFIED IDEOGRAPH
+ {0xD8F9, 0x4F2B}, //15304 #CJK UNIFIED IDEOGRAPH
+ {0xD8FA, 0x4F5E}, //15305 #CJK UNIFIED IDEOGRAPH
+ {0xD8FB, 0x4F67}, //15306 #CJK UNIFIED IDEOGRAPH
+ {0xD8FC, 0x6538}, //15307 #CJK UNIFIED IDEOGRAPH
+ {0xD8FD, 0x4F5A}, //15308 #CJK UNIFIED IDEOGRAPH
+ {0xD8FE, 0x4F5D}, //15309 #CJK UNIFIED IDEOGRAPH
+ {0xD940, 0x8CAE}, //15310 #CJK UNIFIED IDEOGRAPH
+ {0xD941, 0x8CAF}, //15311 #CJK UNIFIED IDEOGRAPH
+ {0xD942, 0x8CB0}, //15312 #CJK UNIFIED IDEOGRAPH
+ {0xD943, 0x8CB1}, //15313 #CJK UNIFIED IDEOGRAPH
+ {0xD944, 0x8CB2}, //15314 #CJK UNIFIED IDEOGRAPH
+ {0xD945, 0x8CB3}, //15315 #CJK UNIFIED IDEOGRAPH
+ {0xD946, 0x8CB4}, //15316 #CJK UNIFIED IDEOGRAPH
+ {0xD947, 0x8CB5}, //15317 #CJK UNIFIED IDEOGRAPH
+ {0xD948, 0x8CB6}, //15318 #CJK UNIFIED IDEOGRAPH
+ {0xD949, 0x8CB7}, //15319 #CJK UNIFIED IDEOGRAPH
+ {0xD94A, 0x8CB8}, //15320 #CJK UNIFIED IDEOGRAPH
+ {0xD94B, 0x8CB9}, //15321 #CJK UNIFIED IDEOGRAPH
+ {0xD94C, 0x8CBA}, //15322 #CJK UNIFIED IDEOGRAPH
+ {0xD94D, 0x8CBB}, //15323 #CJK UNIFIED IDEOGRAPH
+ {0xD94E, 0x8CBC}, //15324 #CJK UNIFIED IDEOGRAPH
+ {0xD94F, 0x8CBD}, //15325 #CJK UNIFIED IDEOGRAPH
+ {0xD950, 0x8CBE}, //15326 #CJK UNIFIED IDEOGRAPH
+ {0xD951, 0x8CBF}, //15327 #CJK UNIFIED IDEOGRAPH
+ {0xD952, 0x8CC0}, //15328 #CJK UNIFIED IDEOGRAPH
+ {0xD953, 0x8CC1}, //15329 #CJK UNIFIED IDEOGRAPH
+ {0xD954, 0x8CC2}, //15330 #CJK UNIFIED IDEOGRAPH
+ {0xD955, 0x8CC3}, //15331 #CJK UNIFIED IDEOGRAPH
+ {0xD956, 0x8CC4}, //15332 #CJK UNIFIED IDEOGRAPH
+ {0xD957, 0x8CC5}, //15333 #CJK UNIFIED IDEOGRAPH
+ {0xD958, 0x8CC6}, //15334 #CJK UNIFIED IDEOGRAPH
+ {0xD959, 0x8CC7}, //15335 #CJK UNIFIED IDEOGRAPH
+ {0xD95A, 0x8CC8}, //15336 #CJK UNIFIED IDEOGRAPH
+ {0xD95B, 0x8CC9}, //15337 #CJK UNIFIED IDEOGRAPH
+ {0xD95C, 0x8CCA}, //15338 #CJK UNIFIED IDEOGRAPH
+ {0xD95D, 0x8CCB}, //15339 #CJK UNIFIED IDEOGRAPH
+ {0xD95E, 0x8CCC}, //15340 #CJK UNIFIED IDEOGRAPH
+ {0xD95F, 0x8CCD}, //15341 #CJK UNIFIED IDEOGRAPH
+ {0xD960, 0x8CCE}, //15342 #CJK UNIFIED IDEOGRAPH
+ {0xD961, 0x8CCF}, //15343 #CJK UNIFIED IDEOGRAPH
+ {0xD962, 0x8CD0}, //15344 #CJK UNIFIED IDEOGRAPH
+ {0xD963, 0x8CD1}, //15345 #CJK UNIFIED IDEOGRAPH
+ {0xD964, 0x8CD2}, //15346 #CJK UNIFIED IDEOGRAPH
+ {0xD965, 0x8CD3}, //15347 #CJK UNIFIED IDEOGRAPH
+ {0xD966, 0x8CD4}, //15348 #CJK UNIFIED IDEOGRAPH
+ {0xD967, 0x8CD5}, //15349 #CJK UNIFIED IDEOGRAPH
+ {0xD968, 0x8CD6}, //15350 #CJK UNIFIED IDEOGRAPH
+ {0xD969, 0x8CD7}, //15351 #CJK UNIFIED IDEOGRAPH
+ {0xD96A, 0x8CD8}, //15352 #CJK UNIFIED IDEOGRAPH
+ {0xD96B, 0x8CD9}, //15353 #CJK UNIFIED IDEOGRAPH
+ {0xD96C, 0x8CDA}, //15354 #CJK UNIFIED IDEOGRAPH
+ {0xD96D, 0x8CDB}, //15355 #CJK UNIFIED IDEOGRAPH
+ {0xD96E, 0x8CDC}, //15356 #CJK UNIFIED IDEOGRAPH
+ {0xD96F, 0x8CDD}, //15357 #CJK UNIFIED IDEOGRAPH
+ {0xD970, 0x8CDE}, //15358 #CJK UNIFIED IDEOGRAPH
+ {0xD971, 0x8CDF}, //15359 #CJK UNIFIED IDEOGRAPH
+ {0xD972, 0x8CE0}, //15360 #CJK UNIFIED IDEOGRAPH
+ {0xD973, 0x8CE1}, //15361 #CJK UNIFIED IDEOGRAPH
+ {0xD974, 0x8CE2}, //15362 #CJK UNIFIED IDEOGRAPH
+ {0xD975, 0x8CE3}, //15363 #CJK UNIFIED IDEOGRAPH
+ {0xD976, 0x8CE4}, //15364 #CJK UNIFIED IDEOGRAPH
+ {0xD977, 0x8CE5}, //15365 #CJK UNIFIED IDEOGRAPH
+ {0xD978, 0x8CE6}, //15366 #CJK UNIFIED IDEOGRAPH
+ {0xD979, 0x8CE7}, //15367 #CJK UNIFIED IDEOGRAPH
+ {0xD97A, 0x8CE8}, //15368 #CJK UNIFIED IDEOGRAPH
+ {0xD97B, 0x8CE9}, //15369 #CJK UNIFIED IDEOGRAPH
+ {0xD97C, 0x8CEA}, //15370 #CJK UNIFIED IDEOGRAPH
+ {0xD97D, 0x8CEB}, //15371 #CJK UNIFIED IDEOGRAPH
+ {0xD97E, 0x8CEC}, //15372 #CJK UNIFIED IDEOGRAPH
+ {0xD980, 0x8CED}, //15373 #CJK UNIFIED IDEOGRAPH
+ {0xD981, 0x8CEE}, //15374 #CJK UNIFIED IDEOGRAPH
+ {0xD982, 0x8CEF}, //15375 #CJK UNIFIED IDEOGRAPH
+ {0xD983, 0x8CF0}, //15376 #CJK UNIFIED IDEOGRAPH
+ {0xD984, 0x8CF1}, //15377 #CJK UNIFIED IDEOGRAPH
+ {0xD985, 0x8CF2}, //15378 #CJK UNIFIED IDEOGRAPH
+ {0xD986, 0x8CF3}, //15379 #CJK UNIFIED IDEOGRAPH
+ {0xD987, 0x8CF4}, //15380 #CJK UNIFIED IDEOGRAPH
+ {0xD988, 0x8CF5}, //15381 #CJK UNIFIED IDEOGRAPH
+ {0xD989, 0x8CF6}, //15382 #CJK UNIFIED IDEOGRAPH
+ {0xD98A, 0x8CF7}, //15383 #CJK UNIFIED IDEOGRAPH
+ {0xD98B, 0x8CF8}, //15384 #CJK UNIFIED IDEOGRAPH
+ {0xD98C, 0x8CF9}, //15385 #CJK UNIFIED IDEOGRAPH
+ {0xD98D, 0x8CFA}, //15386 #CJK UNIFIED IDEOGRAPH
+ {0xD98E, 0x8CFB}, //15387 #CJK UNIFIED IDEOGRAPH
+ {0xD98F, 0x8CFC}, //15388 #CJK UNIFIED IDEOGRAPH
+ {0xD990, 0x8CFD}, //15389 #CJK UNIFIED IDEOGRAPH
+ {0xD991, 0x8CFE}, //15390 #CJK UNIFIED IDEOGRAPH
+ {0xD992, 0x8CFF}, //15391 #CJK UNIFIED IDEOGRAPH
+ {0xD993, 0x8D00}, //15392 #CJK UNIFIED IDEOGRAPH
+ {0xD994, 0x8D01}, //15393 #CJK UNIFIED IDEOGRAPH
+ {0xD995, 0x8D02}, //15394 #CJK UNIFIED IDEOGRAPH
+ {0xD996, 0x8D03}, //15395 #CJK UNIFIED IDEOGRAPH
+ {0xD997, 0x8D04}, //15396 #CJK UNIFIED IDEOGRAPH
+ {0xD998, 0x8D05}, //15397 #CJK UNIFIED IDEOGRAPH
+ {0xD999, 0x8D06}, //15398 #CJK UNIFIED IDEOGRAPH
+ {0xD99A, 0x8D07}, //15399 #CJK UNIFIED IDEOGRAPH
+ {0xD99B, 0x8D08}, //15400 #CJK UNIFIED IDEOGRAPH
+ {0xD99C, 0x8D09}, //15401 #CJK UNIFIED IDEOGRAPH
+ {0xD99D, 0x8D0A}, //15402 #CJK UNIFIED IDEOGRAPH
+ {0xD99E, 0x8D0B}, //15403 #CJK UNIFIED IDEOGRAPH
+ {0xD99F, 0x8D0C}, //15404 #CJK UNIFIED IDEOGRAPH
+ {0xD9A0, 0x8D0D}, //15405 #CJK UNIFIED IDEOGRAPH
+ {0xD9A1, 0x4F5F}, //15406 #CJK UNIFIED IDEOGRAPH
+ {0xD9A2, 0x4F57}, //15407 #CJK UNIFIED IDEOGRAPH
+ {0xD9A3, 0x4F32}, //15408 #CJK UNIFIED IDEOGRAPH
+ {0xD9A4, 0x4F3D}, //15409 #CJK UNIFIED IDEOGRAPH
+ {0xD9A5, 0x4F76}, //15410 #CJK UNIFIED IDEOGRAPH
+ {0xD9A6, 0x4F74}, //15411 #CJK UNIFIED IDEOGRAPH
+ {0xD9A7, 0x4F91}, //15412 #CJK UNIFIED IDEOGRAPH
+ {0xD9A8, 0x4F89}, //15413 #CJK UNIFIED IDEOGRAPH
+ {0xD9A9, 0x4F83}, //15414 #CJK UNIFIED IDEOGRAPH
+ {0xD9AA, 0x4F8F}, //15415 #CJK UNIFIED IDEOGRAPH
+ {0xD9AB, 0x4F7E}, //15416 #CJK UNIFIED IDEOGRAPH
+ {0xD9AC, 0x4F7B}, //15417 #CJK UNIFIED IDEOGRAPH
+ {0xD9AD, 0x4FAA}, //15418 #CJK UNIFIED IDEOGRAPH
+ {0xD9AE, 0x4F7C}, //15419 #CJK UNIFIED IDEOGRAPH
+ {0xD9AF, 0x4FAC}, //15420 #CJK UNIFIED IDEOGRAPH
+ {0xD9B0, 0x4F94}, //15421 #CJK UNIFIED IDEOGRAPH
+ {0xD9B1, 0x4FE6}, //15422 #CJK UNIFIED IDEOGRAPH
+ {0xD9B2, 0x4FE8}, //15423 #CJK UNIFIED IDEOGRAPH
+ {0xD9B3, 0x4FEA}, //15424 #CJK UNIFIED IDEOGRAPH
+ {0xD9B4, 0x4FC5}, //15425 #CJK UNIFIED IDEOGRAPH
+ {0xD9B5, 0x4FDA}, //15426 #CJK UNIFIED IDEOGRAPH
+ {0xD9B6, 0x4FE3}, //15427 #CJK UNIFIED IDEOGRAPH
+ {0xD9B7, 0x4FDC}, //15428 #CJK UNIFIED IDEOGRAPH
+ {0xD9B8, 0x4FD1}, //15429 #CJK UNIFIED IDEOGRAPH
+ {0xD9B9, 0x4FDF}, //15430 #CJK UNIFIED IDEOGRAPH
+ {0xD9BA, 0x4FF8}, //15431 #CJK UNIFIED IDEOGRAPH
+ {0xD9BB, 0x5029}, //15432 #CJK UNIFIED IDEOGRAPH
+ {0xD9BC, 0x504C}, //15433 #CJK UNIFIED IDEOGRAPH
+ {0xD9BD, 0x4FF3}, //15434 #CJK UNIFIED IDEOGRAPH
+ {0xD9BE, 0x502C}, //15435 #CJK UNIFIED IDEOGRAPH
+ {0xD9BF, 0x500F}, //15436 #CJK UNIFIED IDEOGRAPH
+ {0xD9C0, 0x502E}, //15437 #CJK UNIFIED IDEOGRAPH
+ {0xD9C1, 0x502D}, //15438 #CJK UNIFIED IDEOGRAPH
+ {0xD9C2, 0x4FFE}, //15439 #CJK UNIFIED IDEOGRAPH
+ {0xD9C3, 0x501C}, //15440 #CJK UNIFIED IDEOGRAPH
+ {0xD9C4, 0x500C}, //15441 #CJK UNIFIED IDEOGRAPH
+ {0xD9C5, 0x5025}, //15442 #CJK UNIFIED IDEOGRAPH
+ {0xD9C6, 0x5028}, //15443 #CJK UNIFIED IDEOGRAPH
+ {0xD9C7, 0x507E}, //15444 #CJK UNIFIED IDEOGRAPH
+ {0xD9C8, 0x5043}, //15445 #CJK UNIFIED IDEOGRAPH
+ {0xD9C9, 0x5055}, //15446 #CJK UNIFIED IDEOGRAPH
+ {0xD9CA, 0x5048}, //15447 #CJK UNIFIED IDEOGRAPH
+ {0xD9CB, 0x504E}, //15448 #CJK UNIFIED IDEOGRAPH
+ {0xD9CC, 0x506C}, //15449 #CJK UNIFIED IDEOGRAPH
+ {0xD9CD, 0x507B}, //15450 #CJK UNIFIED IDEOGRAPH
+ {0xD9CE, 0x50A5}, //15451 #CJK UNIFIED IDEOGRAPH
+ {0xD9CF, 0x50A7}, //15452 #CJK UNIFIED IDEOGRAPH
+ {0xD9D0, 0x50A9}, //15453 #CJK UNIFIED IDEOGRAPH
+ {0xD9D1, 0x50BA}, //15454 #CJK UNIFIED IDEOGRAPH
+ {0xD9D2, 0x50D6}, //15455 #CJK UNIFIED IDEOGRAPH
+ {0xD9D3, 0x5106}, //15456 #CJK UNIFIED IDEOGRAPH
+ {0xD9D4, 0x50ED}, //15457 #CJK UNIFIED IDEOGRAPH
+ {0xD9D5, 0x50EC}, //15458 #CJK UNIFIED IDEOGRAPH
+ {0xD9D6, 0x50E6}, //15459 #CJK UNIFIED IDEOGRAPH
+ {0xD9D7, 0x50EE}, //15460 #CJK UNIFIED IDEOGRAPH
+ {0xD9D8, 0x5107}, //15461 #CJK UNIFIED IDEOGRAPH
+ {0xD9D9, 0x510B}, //15462 #CJK UNIFIED IDEOGRAPH
+ {0xD9DA, 0x4EDD}, //15463 #CJK UNIFIED IDEOGRAPH
+ {0xD9DB, 0x6C3D}, //15464 #CJK UNIFIED IDEOGRAPH
+ {0xD9DC, 0x4F58}, //15465 #CJK UNIFIED IDEOGRAPH
+ {0xD9DD, 0x4F65}, //15466 #CJK UNIFIED IDEOGRAPH
+ {0xD9DE, 0x4FCE}, //15467 #CJK UNIFIED IDEOGRAPH
+ {0xD9DF, 0x9FA0}, //15468 #CJK UNIFIED IDEOGRAPH
+ {0xD9E0, 0x6C46}, //15469 #CJK UNIFIED IDEOGRAPH
+ {0xD9E1, 0x7C74}, //15470 #CJK UNIFIED IDEOGRAPH
+ {0xD9E2, 0x516E}, //15471 #CJK UNIFIED IDEOGRAPH
+ {0xD9E3, 0x5DFD}, //15472 #CJK UNIFIED IDEOGRAPH
+ {0xD9E4, 0x9EC9}, //15473 #CJK UNIFIED IDEOGRAPH
+ {0xD9E5, 0x9998}, //15474 #CJK UNIFIED IDEOGRAPH
+ {0xD9E6, 0x5181}, //15475 #CJK UNIFIED IDEOGRAPH
+ {0xD9E7, 0x5914}, //15476 #CJK UNIFIED IDEOGRAPH
+ {0xD9E8, 0x52F9}, //15477 #CJK UNIFIED IDEOGRAPH
+ {0xD9E9, 0x530D}, //15478 #CJK UNIFIED IDEOGRAPH
+ {0xD9EA, 0x8A07}, //15479 #CJK UNIFIED IDEOGRAPH
+ {0xD9EB, 0x5310}, //15480 #CJK UNIFIED IDEOGRAPH
+ {0xD9EC, 0x51EB}, //15481 #CJK UNIFIED IDEOGRAPH
+ {0xD9ED, 0x5919}, //15482 #CJK UNIFIED IDEOGRAPH
+ {0xD9EE, 0x5155}, //15483 #CJK UNIFIED IDEOGRAPH
+ {0xD9EF, 0x4EA0}, //15484 #CJK UNIFIED IDEOGRAPH
+ {0xD9F0, 0x5156}, //15485 #CJK UNIFIED IDEOGRAPH
+ {0xD9F1, 0x4EB3}, //15486 #CJK UNIFIED IDEOGRAPH
+ {0xD9F2, 0x886E}, //15487 #CJK UNIFIED IDEOGRAPH
+ {0xD9F3, 0x88A4}, //15488 #CJK UNIFIED IDEOGRAPH
+ {0xD9F4, 0x4EB5}, //15489 #CJK UNIFIED IDEOGRAPH
+ {0xD9F5, 0x8114}, //15490 #CJK UNIFIED IDEOGRAPH
+ {0xD9F6, 0x88D2}, //15491 #CJK UNIFIED IDEOGRAPH
+ {0xD9F7, 0x7980}, //15492 #CJK UNIFIED IDEOGRAPH
+ {0xD9F8, 0x5B34}, //15493 #CJK UNIFIED IDEOGRAPH
+ {0xD9F9, 0x8803}, //15494 #CJK UNIFIED IDEOGRAPH
+ {0xD9FA, 0x7FB8}, //15495 #CJK UNIFIED IDEOGRAPH
+ {0xD9FB, 0x51AB}, //15496 #CJK UNIFIED IDEOGRAPH
+ {0xD9FC, 0x51B1}, //15497 #CJK UNIFIED IDEOGRAPH
+ {0xD9FD, 0x51BD}, //15498 #CJK UNIFIED IDEOGRAPH
+ {0xD9FE, 0x51BC}, //15499 #CJK UNIFIED IDEOGRAPH
+ {0xDA40, 0x8D0E}, //15500 #CJK UNIFIED IDEOGRAPH
+ {0xDA41, 0x8D0F}, //15501 #CJK UNIFIED IDEOGRAPH
+ {0xDA42, 0x8D10}, //15502 #CJK UNIFIED IDEOGRAPH
+ {0xDA43, 0x8D11}, //15503 #CJK UNIFIED IDEOGRAPH
+ {0xDA44, 0x8D12}, //15504 #CJK UNIFIED IDEOGRAPH
+ {0xDA45, 0x8D13}, //15505 #CJK UNIFIED IDEOGRAPH
+ {0xDA46, 0x8D14}, //15506 #CJK UNIFIED IDEOGRAPH
+ {0xDA47, 0x8D15}, //15507 #CJK UNIFIED IDEOGRAPH
+ {0xDA48, 0x8D16}, //15508 #CJK UNIFIED IDEOGRAPH
+ {0xDA49, 0x8D17}, //15509 #CJK UNIFIED IDEOGRAPH
+ {0xDA4A, 0x8D18}, //15510 #CJK UNIFIED IDEOGRAPH
+ {0xDA4B, 0x8D19}, //15511 #CJK UNIFIED IDEOGRAPH
+ {0xDA4C, 0x8D1A}, //15512 #CJK UNIFIED IDEOGRAPH
+ {0xDA4D, 0x8D1B}, //15513 #CJK UNIFIED IDEOGRAPH
+ {0xDA4E, 0x8D1C}, //15514 #CJK UNIFIED IDEOGRAPH
+ {0xDA4F, 0x8D20}, //15515 #CJK UNIFIED IDEOGRAPH
+ {0xDA50, 0x8D51}, //15516 #CJK UNIFIED IDEOGRAPH
+ {0xDA51, 0x8D52}, //15517 #CJK UNIFIED IDEOGRAPH
+ {0xDA52, 0x8D57}, //15518 #CJK UNIFIED IDEOGRAPH
+ {0xDA53, 0x8D5F}, //15519 #CJK UNIFIED IDEOGRAPH
+ {0xDA54, 0x8D65}, //15520 #CJK UNIFIED IDEOGRAPH
+ {0xDA55, 0x8D68}, //15521 #CJK UNIFIED IDEOGRAPH
+ {0xDA56, 0x8D69}, //15522 #CJK UNIFIED IDEOGRAPH
+ {0xDA57, 0x8D6A}, //15523 #CJK UNIFIED IDEOGRAPH
+ {0xDA58, 0x8D6C}, //15524 #CJK UNIFIED IDEOGRAPH
+ {0xDA59, 0x8D6E}, //15525 #CJK UNIFIED IDEOGRAPH
+ {0xDA5A, 0x8D6F}, //15526 #CJK UNIFIED IDEOGRAPH
+ {0xDA5B, 0x8D71}, //15527 #CJK UNIFIED IDEOGRAPH
+ {0xDA5C, 0x8D72}, //15528 #CJK UNIFIED IDEOGRAPH
+ {0xDA5D, 0x8D78}, //15529 #CJK UNIFIED IDEOGRAPH
+ {0xDA5E, 0x8D79}, //15530 #CJK UNIFIED IDEOGRAPH
+ {0xDA5F, 0x8D7A}, //15531 #CJK UNIFIED IDEOGRAPH
+ {0xDA60, 0x8D7B}, //15532 #CJK UNIFIED IDEOGRAPH
+ {0xDA61, 0x8D7C}, //15533 #CJK UNIFIED IDEOGRAPH
+ {0xDA62, 0x8D7D}, //15534 #CJK UNIFIED IDEOGRAPH
+ {0xDA63, 0x8D7E}, //15535 #CJK UNIFIED IDEOGRAPH
+ {0xDA64, 0x8D7F}, //15536 #CJK UNIFIED IDEOGRAPH
+ {0xDA65, 0x8D80}, //15537 #CJK UNIFIED IDEOGRAPH
+ {0xDA66, 0x8D82}, //15538 #CJK UNIFIED IDEOGRAPH
+ {0xDA67, 0x8D83}, //15539 #CJK UNIFIED IDEOGRAPH
+ {0xDA68, 0x8D86}, //15540 #CJK UNIFIED IDEOGRAPH
+ {0xDA69, 0x8D87}, //15541 #CJK UNIFIED IDEOGRAPH
+ {0xDA6A, 0x8D88}, //15542 #CJK UNIFIED IDEOGRAPH
+ {0xDA6B, 0x8D89}, //15543 #CJK UNIFIED IDEOGRAPH
+ {0xDA6C, 0x8D8C}, //15544 #CJK UNIFIED IDEOGRAPH
+ {0xDA6D, 0x8D8D}, //15545 #CJK UNIFIED IDEOGRAPH
+ {0xDA6E, 0x8D8E}, //15546 #CJK UNIFIED IDEOGRAPH
+ {0xDA6F, 0x8D8F}, //15547 #CJK UNIFIED IDEOGRAPH
+ {0xDA70, 0x8D90}, //15548 #CJK UNIFIED IDEOGRAPH
+ {0xDA71, 0x8D92}, //15549 #CJK UNIFIED IDEOGRAPH
+ {0xDA72, 0x8D93}, //15550 #CJK UNIFIED IDEOGRAPH
+ {0xDA73, 0x8D95}, //15551 #CJK UNIFIED IDEOGRAPH
+ {0xDA74, 0x8D96}, //15552 #CJK UNIFIED IDEOGRAPH
+ {0xDA75, 0x8D97}, //15553 #CJK UNIFIED IDEOGRAPH
+ {0xDA76, 0x8D98}, //15554 #CJK UNIFIED IDEOGRAPH
+ {0xDA77, 0x8D99}, //15555 #CJK UNIFIED IDEOGRAPH
+ {0xDA78, 0x8D9A}, //15556 #CJK UNIFIED IDEOGRAPH
+ {0xDA79, 0x8D9B}, //15557 #CJK UNIFIED IDEOGRAPH
+ {0xDA7A, 0x8D9C}, //15558 #CJK UNIFIED IDEOGRAPH
+ {0xDA7B, 0x8D9D}, //15559 #CJK UNIFIED IDEOGRAPH
+ {0xDA7C, 0x8D9E}, //15560 #CJK UNIFIED IDEOGRAPH
+ {0xDA7D, 0x8DA0}, //15561 #CJK UNIFIED IDEOGRAPH
+ {0xDA7E, 0x8DA1}, //15562 #CJK UNIFIED IDEOGRAPH
+ {0xDA80, 0x8DA2}, //15563 #CJK UNIFIED IDEOGRAPH
+ {0xDA81, 0x8DA4}, //15564 #CJK UNIFIED IDEOGRAPH
+ {0xDA82, 0x8DA5}, //15565 #CJK UNIFIED IDEOGRAPH
+ {0xDA83, 0x8DA6}, //15566 #CJK UNIFIED IDEOGRAPH
+ {0xDA84, 0x8DA7}, //15567 #CJK UNIFIED IDEOGRAPH
+ {0xDA85, 0x8DA8}, //15568 #CJK UNIFIED IDEOGRAPH
+ {0xDA86, 0x8DA9}, //15569 #CJK UNIFIED IDEOGRAPH
+ {0xDA87, 0x8DAA}, //15570 #CJK UNIFIED IDEOGRAPH
+ {0xDA88, 0x8DAB}, //15571 #CJK UNIFIED IDEOGRAPH
+ {0xDA89, 0x8DAC}, //15572 #CJK UNIFIED IDEOGRAPH
+ {0xDA8A, 0x8DAD}, //15573 #CJK UNIFIED IDEOGRAPH
+ {0xDA8B, 0x8DAE}, //15574 #CJK UNIFIED IDEOGRAPH
+ {0xDA8C, 0x8DAF}, //15575 #CJK UNIFIED IDEOGRAPH
+ {0xDA8D, 0x8DB0}, //15576 #CJK UNIFIED IDEOGRAPH
+ {0xDA8E, 0x8DB2}, //15577 #CJK UNIFIED IDEOGRAPH
+ {0xDA8F, 0x8DB6}, //15578 #CJK UNIFIED IDEOGRAPH
+ {0xDA90, 0x8DB7}, //15579 #CJK UNIFIED IDEOGRAPH
+ {0xDA91, 0x8DB9}, //15580 #CJK UNIFIED IDEOGRAPH
+ {0xDA92, 0x8DBB}, //15581 #CJK UNIFIED IDEOGRAPH
+ {0xDA93, 0x8DBD}, //15582 #CJK UNIFIED IDEOGRAPH
+ {0xDA94, 0x8DC0}, //15583 #CJK UNIFIED IDEOGRAPH
+ {0xDA95, 0x8DC1}, //15584 #CJK UNIFIED IDEOGRAPH
+ {0xDA96, 0x8DC2}, //15585 #CJK UNIFIED IDEOGRAPH
+ {0xDA97, 0x8DC5}, //15586 #CJK UNIFIED IDEOGRAPH
+ {0xDA98, 0x8DC7}, //15587 #CJK UNIFIED IDEOGRAPH
+ {0xDA99, 0x8DC8}, //15588 #CJK UNIFIED IDEOGRAPH
+ {0xDA9A, 0x8DC9}, //15589 #CJK UNIFIED IDEOGRAPH
+ {0xDA9B, 0x8DCA}, //15590 #CJK UNIFIED IDEOGRAPH
+ {0xDA9C, 0x8DCD}, //15591 #CJK UNIFIED IDEOGRAPH
+ {0xDA9D, 0x8DD0}, //15592 #CJK UNIFIED IDEOGRAPH
+ {0xDA9E, 0x8DD2}, //15593 #CJK UNIFIED IDEOGRAPH
+ {0xDA9F, 0x8DD3}, //15594 #CJK UNIFIED IDEOGRAPH
+ {0xDAA0, 0x8DD4}, //15595 #CJK UNIFIED IDEOGRAPH
+ {0xDAA1, 0x51C7}, //15596 #CJK UNIFIED IDEOGRAPH
+ {0xDAA2, 0x5196}, //15597 #CJK UNIFIED IDEOGRAPH
+ {0xDAA3, 0x51A2}, //15598 #CJK UNIFIED IDEOGRAPH
+ {0xDAA4, 0x51A5}, //15599 #CJK UNIFIED IDEOGRAPH
+ {0xDAA5, 0x8BA0}, //15600 #CJK UNIFIED IDEOGRAPH
+ {0xDAA6, 0x8BA6}, //15601 #CJK UNIFIED IDEOGRAPH
+ {0xDAA7, 0x8BA7}, //15602 #CJK UNIFIED IDEOGRAPH
+ {0xDAA8, 0x8BAA}, //15603 #CJK UNIFIED IDEOGRAPH
+ {0xDAA9, 0x8BB4}, //15604 #CJK UNIFIED IDEOGRAPH
+ {0xDAAA, 0x8BB5}, //15605 #CJK UNIFIED IDEOGRAPH
+ {0xDAAB, 0x8BB7}, //15606 #CJK UNIFIED IDEOGRAPH
+ {0xDAAC, 0x8BC2}, //15607 #CJK UNIFIED IDEOGRAPH
+ {0xDAAD, 0x8BC3}, //15608 #CJK UNIFIED IDEOGRAPH
+ {0xDAAE, 0x8BCB}, //15609 #CJK UNIFIED IDEOGRAPH
+ {0xDAAF, 0x8BCF}, //15610 #CJK UNIFIED IDEOGRAPH
+ {0xDAB0, 0x8BCE}, //15611 #CJK UNIFIED IDEOGRAPH
+ {0xDAB1, 0x8BD2}, //15612 #CJK UNIFIED IDEOGRAPH
+ {0xDAB2, 0x8BD3}, //15613 #CJK UNIFIED IDEOGRAPH
+ {0xDAB3, 0x8BD4}, //15614 #CJK UNIFIED IDEOGRAPH
+ {0xDAB4, 0x8BD6}, //15615 #CJK UNIFIED IDEOGRAPH
+ {0xDAB5, 0x8BD8}, //15616 #CJK UNIFIED IDEOGRAPH
+ {0xDAB6, 0x8BD9}, //15617 #CJK UNIFIED IDEOGRAPH
+ {0xDAB7, 0x8BDC}, //15618 #CJK UNIFIED IDEOGRAPH
+ {0xDAB8, 0x8BDF}, //15619 #CJK UNIFIED IDEOGRAPH
+ {0xDAB9, 0x8BE0}, //15620 #CJK UNIFIED IDEOGRAPH
+ {0xDABA, 0x8BE4}, //15621 #CJK UNIFIED IDEOGRAPH
+ {0xDABB, 0x8BE8}, //15622 #CJK UNIFIED IDEOGRAPH
+ {0xDABC, 0x8BE9}, //15623 #CJK UNIFIED IDEOGRAPH
+ {0xDABD, 0x8BEE}, //15624 #CJK UNIFIED IDEOGRAPH
+ {0xDABE, 0x8BF0}, //15625 #CJK UNIFIED IDEOGRAPH
+ {0xDABF, 0x8BF3}, //15626 #CJK UNIFIED IDEOGRAPH
+ {0xDAC0, 0x8BF6}, //15627 #CJK UNIFIED IDEOGRAPH
+ {0xDAC1, 0x8BF9}, //15628 #CJK UNIFIED IDEOGRAPH
+ {0xDAC2, 0x8BFC}, //15629 #CJK UNIFIED IDEOGRAPH
+ {0xDAC3, 0x8BFF}, //15630 #CJK UNIFIED IDEOGRAPH
+ {0xDAC4, 0x8C00}, //15631 #CJK UNIFIED IDEOGRAPH
+ {0xDAC5, 0x8C02}, //15632 #CJK UNIFIED IDEOGRAPH
+ {0xDAC6, 0x8C04}, //15633 #CJK UNIFIED IDEOGRAPH
+ {0xDAC7, 0x8C07}, //15634 #CJK UNIFIED IDEOGRAPH
+ {0xDAC8, 0x8C0C}, //15635 #CJK UNIFIED IDEOGRAPH
+ {0xDAC9, 0x8C0F}, //15636 #CJK UNIFIED IDEOGRAPH
+ {0xDACA, 0x8C11}, //15637 #CJK UNIFIED IDEOGRAPH
+ {0xDACB, 0x8C12}, //15638 #CJK UNIFIED IDEOGRAPH
+ {0xDACC, 0x8C14}, //15639 #CJK UNIFIED IDEOGRAPH
+ {0xDACD, 0x8C15}, //15640 #CJK UNIFIED IDEOGRAPH
+ {0xDACE, 0x8C16}, //15641 #CJK UNIFIED IDEOGRAPH
+ {0xDACF, 0x8C19}, //15642 #CJK UNIFIED IDEOGRAPH
+ {0xDAD0, 0x8C1B}, //15643 #CJK UNIFIED IDEOGRAPH
+ {0xDAD1, 0x8C18}, //15644 #CJK UNIFIED IDEOGRAPH
+ {0xDAD2, 0x8C1D}, //15645 #CJK UNIFIED IDEOGRAPH
+ {0xDAD3, 0x8C1F}, //15646 #CJK UNIFIED IDEOGRAPH
+ {0xDAD4, 0x8C20}, //15647 #CJK UNIFIED IDEOGRAPH
+ {0xDAD5, 0x8C21}, //15648 #CJK UNIFIED IDEOGRAPH
+ {0xDAD6, 0x8C25}, //15649 #CJK UNIFIED IDEOGRAPH
+ {0xDAD7, 0x8C27}, //15650 #CJK UNIFIED IDEOGRAPH
+ {0xDAD8, 0x8C2A}, //15651 #CJK UNIFIED IDEOGRAPH
+ {0xDAD9, 0x8C2B}, //15652 #CJK UNIFIED IDEOGRAPH
+ {0xDADA, 0x8C2E}, //15653 #CJK UNIFIED IDEOGRAPH
+ {0xDADB, 0x8C2F}, //15654 #CJK UNIFIED IDEOGRAPH
+ {0xDADC, 0x8C32}, //15655 #CJK UNIFIED IDEOGRAPH
+ {0xDADD, 0x8C33}, //15656 #CJK UNIFIED IDEOGRAPH
+ {0xDADE, 0x8C35}, //15657 #CJK UNIFIED IDEOGRAPH
+ {0xDADF, 0x8C36}, //15658 #CJK UNIFIED IDEOGRAPH
+ {0xDAE0, 0x5369}, //15659 #CJK UNIFIED IDEOGRAPH
+ {0xDAE1, 0x537A}, //15660 #CJK UNIFIED IDEOGRAPH
+ {0xDAE2, 0x961D}, //15661 #CJK UNIFIED IDEOGRAPH
+ {0xDAE3, 0x9622}, //15662 #CJK UNIFIED IDEOGRAPH
+ {0xDAE4, 0x9621}, //15663 #CJK UNIFIED IDEOGRAPH
+ {0xDAE5, 0x9631}, //15664 #CJK UNIFIED IDEOGRAPH
+ {0xDAE6, 0x962A}, //15665 #CJK UNIFIED IDEOGRAPH
+ {0xDAE7, 0x963D}, //15666 #CJK UNIFIED IDEOGRAPH
+ {0xDAE8, 0x963C}, //15667 #CJK UNIFIED IDEOGRAPH
+ {0xDAE9, 0x9642}, //15668 #CJK UNIFIED IDEOGRAPH
+ {0xDAEA, 0x9649}, //15669 #CJK UNIFIED IDEOGRAPH
+ {0xDAEB, 0x9654}, //15670 #CJK UNIFIED IDEOGRAPH
+ {0xDAEC, 0x965F}, //15671 #CJK UNIFIED IDEOGRAPH
+ {0xDAED, 0x9667}, //15672 #CJK UNIFIED IDEOGRAPH
+ {0xDAEE, 0x966C}, //15673 #CJK UNIFIED IDEOGRAPH
+ {0xDAEF, 0x9672}, //15674 #CJK UNIFIED IDEOGRAPH
+ {0xDAF0, 0x9674}, //15675 #CJK UNIFIED IDEOGRAPH
+ {0xDAF1, 0x9688}, //15676 #CJK UNIFIED IDEOGRAPH
+ {0xDAF2, 0x968D}, //15677 #CJK UNIFIED IDEOGRAPH
+ {0xDAF3, 0x9697}, //15678 #CJK UNIFIED IDEOGRAPH
+ {0xDAF4, 0x96B0}, //15679 #CJK UNIFIED IDEOGRAPH
+ {0xDAF5, 0x9097}, //15680 #CJK UNIFIED IDEOGRAPH
+ {0xDAF6, 0x909B}, //15681 #CJK UNIFIED IDEOGRAPH
+ {0xDAF7, 0x909D}, //15682 #CJK UNIFIED IDEOGRAPH
+ {0xDAF8, 0x9099}, //15683 #CJK UNIFIED IDEOGRAPH
+ {0xDAF9, 0x90AC}, //15684 #CJK UNIFIED IDEOGRAPH
+ {0xDAFA, 0x90A1}, //15685 #CJK UNIFIED IDEOGRAPH
+ {0xDAFB, 0x90B4}, //15686 #CJK UNIFIED IDEOGRAPH
+ {0xDAFC, 0x90B3}, //15687 #CJK UNIFIED IDEOGRAPH
+ {0xDAFD, 0x90B6}, //15688 #CJK UNIFIED IDEOGRAPH
+ {0xDAFE, 0x90BA}, //15689 #CJK UNIFIED IDEOGRAPH
+ {0xDB40, 0x8DD5}, //15690 #CJK UNIFIED IDEOGRAPH
+ {0xDB41, 0x8DD8}, //15691 #CJK UNIFIED IDEOGRAPH
+ {0xDB42, 0x8DD9}, //15692 #CJK UNIFIED IDEOGRAPH
+ {0xDB43, 0x8DDC}, //15693 #CJK UNIFIED IDEOGRAPH
+ {0xDB44, 0x8DE0}, //15694 #CJK UNIFIED IDEOGRAPH
+ {0xDB45, 0x8DE1}, //15695 #CJK UNIFIED IDEOGRAPH
+ {0xDB46, 0x8DE2}, //15696 #CJK UNIFIED IDEOGRAPH
+ {0xDB47, 0x8DE5}, //15697 #CJK UNIFIED IDEOGRAPH
+ {0xDB48, 0x8DE6}, //15698 #CJK UNIFIED IDEOGRAPH
+ {0xDB49, 0x8DE7}, //15699 #CJK UNIFIED IDEOGRAPH
+ {0xDB4A, 0x8DE9}, //15700 #CJK UNIFIED IDEOGRAPH
+ {0xDB4B, 0x8DED}, //15701 #CJK UNIFIED IDEOGRAPH
+ {0xDB4C, 0x8DEE}, //15702 #CJK UNIFIED IDEOGRAPH
+ {0xDB4D, 0x8DF0}, //15703 #CJK UNIFIED IDEOGRAPH
+ {0xDB4E, 0x8DF1}, //15704 #CJK UNIFIED IDEOGRAPH
+ {0xDB4F, 0x8DF2}, //15705 #CJK UNIFIED IDEOGRAPH
+ {0xDB50, 0x8DF4}, //15706 #CJK UNIFIED IDEOGRAPH
+ {0xDB51, 0x8DF6}, //15707 #CJK UNIFIED IDEOGRAPH
+ {0xDB52, 0x8DFC}, //15708 #CJK UNIFIED IDEOGRAPH
+ {0xDB53, 0x8DFE}, //15709 #CJK UNIFIED IDEOGRAPH
+ {0xDB54, 0x8DFF}, //15710 #CJK UNIFIED IDEOGRAPH
+ {0xDB55, 0x8E00}, //15711 #CJK UNIFIED IDEOGRAPH
+ {0xDB56, 0x8E01}, //15712 #CJK UNIFIED IDEOGRAPH
+ {0xDB57, 0x8E02}, //15713 #CJK UNIFIED IDEOGRAPH
+ {0xDB58, 0x8E03}, //15714 #CJK UNIFIED IDEOGRAPH
+ {0xDB59, 0x8E04}, //15715 #CJK UNIFIED IDEOGRAPH
+ {0xDB5A, 0x8E06}, //15716 #CJK UNIFIED IDEOGRAPH
+ {0xDB5B, 0x8E07}, //15717 #CJK UNIFIED IDEOGRAPH
+ {0xDB5C, 0x8E08}, //15718 #CJK UNIFIED IDEOGRAPH
+ {0xDB5D, 0x8E0B}, //15719 #CJK UNIFIED IDEOGRAPH
+ {0xDB5E, 0x8E0D}, //15720 #CJK UNIFIED IDEOGRAPH
+ {0xDB5F, 0x8E0E}, //15721 #CJK UNIFIED IDEOGRAPH
+ {0xDB60, 0x8E10}, //15722 #CJK UNIFIED IDEOGRAPH
+ {0xDB61, 0x8E11}, //15723 #CJK UNIFIED IDEOGRAPH
+ {0xDB62, 0x8E12}, //15724 #CJK UNIFIED IDEOGRAPH
+ {0xDB63, 0x8E13}, //15725 #CJK UNIFIED IDEOGRAPH
+ {0xDB64, 0x8E15}, //15726 #CJK UNIFIED IDEOGRAPH
+ {0xDB65, 0x8E16}, //15727 #CJK UNIFIED IDEOGRAPH
+ {0xDB66, 0x8E17}, //15728 #CJK UNIFIED IDEOGRAPH
+ {0xDB67, 0x8E18}, //15729 #CJK UNIFIED IDEOGRAPH
+ {0xDB68, 0x8E19}, //15730 #CJK UNIFIED IDEOGRAPH
+ {0xDB69, 0x8E1A}, //15731 #CJK UNIFIED IDEOGRAPH
+ {0xDB6A, 0x8E1B}, //15732 #CJK UNIFIED IDEOGRAPH
+ {0xDB6B, 0x8E1C}, //15733 #CJK UNIFIED IDEOGRAPH
+ {0xDB6C, 0x8E20}, //15734 #CJK UNIFIED IDEOGRAPH
+ {0xDB6D, 0x8E21}, //15735 #CJK UNIFIED IDEOGRAPH
+ {0xDB6E, 0x8E24}, //15736 #CJK UNIFIED IDEOGRAPH
+ {0xDB6F, 0x8E25}, //15737 #CJK UNIFIED IDEOGRAPH
+ {0xDB70, 0x8E26}, //15738 #CJK UNIFIED IDEOGRAPH
+ {0xDB71, 0x8E27}, //15739 #CJK UNIFIED IDEOGRAPH
+ {0xDB72, 0x8E28}, //15740 #CJK UNIFIED IDEOGRAPH
+ {0xDB73, 0x8E2B}, //15741 #CJK UNIFIED IDEOGRAPH
+ {0xDB74, 0x8E2D}, //15742 #CJK UNIFIED IDEOGRAPH
+ {0xDB75, 0x8E30}, //15743 #CJK UNIFIED IDEOGRAPH
+ {0xDB76, 0x8E32}, //15744 #CJK UNIFIED IDEOGRAPH
+ {0xDB77, 0x8E33}, //15745 #CJK UNIFIED IDEOGRAPH
+ {0xDB78, 0x8E34}, //15746 #CJK UNIFIED IDEOGRAPH
+ {0xDB79, 0x8E36}, //15747 #CJK UNIFIED IDEOGRAPH
+ {0xDB7A, 0x8E37}, //15748 #CJK UNIFIED IDEOGRAPH
+ {0xDB7B, 0x8E38}, //15749 #CJK UNIFIED IDEOGRAPH
+ {0xDB7C, 0x8E3B}, //15750 #CJK UNIFIED IDEOGRAPH
+ {0xDB7D, 0x8E3C}, //15751 #CJK UNIFIED IDEOGRAPH
+ {0xDB7E, 0x8E3E}, //15752 #CJK UNIFIED IDEOGRAPH
+ {0xDB80, 0x8E3F}, //15753 #CJK UNIFIED IDEOGRAPH
+ {0xDB81, 0x8E43}, //15754 #CJK UNIFIED IDEOGRAPH
+ {0xDB82, 0x8E45}, //15755 #CJK UNIFIED IDEOGRAPH
+ {0xDB83, 0x8E46}, //15756 #CJK UNIFIED IDEOGRAPH
+ {0xDB84, 0x8E4C}, //15757 #CJK UNIFIED IDEOGRAPH
+ {0xDB85, 0x8E4D}, //15758 #CJK UNIFIED IDEOGRAPH
+ {0xDB86, 0x8E4E}, //15759 #CJK UNIFIED IDEOGRAPH
+ {0xDB87, 0x8E4F}, //15760 #CJK UNIFIED IDEOGRAPH
+ {0xDB88, 0x8E50}, //15761 #CJK UNIFIED IDEOGRAPH
+ {0xDB89, 0x8E53}, //15762 #CJK UNIFIED IDEOGRAPH
+ {0xDB8A, 0x8E54}, //15763 #CJK UNIFIED IDEOGRAPH
+ {0xDB8B, 0x8E55}, //15764 #CJK UNIFIED IDEOGRAPH
+ {0xDB8C, 0x8E56}, //15765 #CJK UNIFIED IDEOGRAPH
+ {0xDB8D, 0x8E57}, //15766 #CJK UNIFIED IDEOGRAPH
+ {0xDB8E, 0x8E58}, //15767 #CJK UNIFIED IDEOGRAPH
+ {0xDB8F, 0x8E5A}, //15768 #CJK UNIFIED IDEOGRAPH
+ {0xDB90, 0x8E5B}, //15769 #CJK UNIFIED IDEOGRAPH
+ {0xDB91, 0x8E5C}, //15770 #CJK UNIFIED IDEOGRAPH
+ {0xDB92, 0x8E5D}, //15771 #CJK UNIFIED IDEOGRAPH
+ {0xDB93, 0x8E5E}, //15772 #CJK UNIFIED IDEOGRAPH
+ {0xDB94, 0x8E5F}, //15773 #CJK UNIFIED IDEOGRAPH
+ {0xDB95, 0x8E60}, //15774 #CJK UNIFIED IDEOGRAPH
+ {0xDB96, 0x8E61}, //15775 #CJK UNIFIED IDEOGRAPH
+ {0xDB97, 0x8E62}, //15776 #CJK UNIFIED IDEOGRAPH
+ {0xDB98, 0x8E63}, //15777 #CJK UNIFIED IDEOGRAPH
+ {0xDB99, 0x8E64}, //15778 #CJK UNIFIED IDEOGRAPH
+ {0xDB9A, 0x8E65}, //15779 #CJK UNIFIED IDEOGRAPH
+ {0xDB9B, 0x8E67}, //15780 #CJK UNIFIED IDEOGRAPH
+ {0xDB9C, 0x8E68}, //15781 #CJK UNIFIED IDEOGRAPH
+ {0xDB9D, 0x8E6A}, //15782 #CJK UNIFIED IDEOGRAPH
+ {0xDB9E, 0x8E6B}, //15783 #CJK UNIFIED IDEOGRAPH
+ {0xDB9F, 0x8E6E}, //15784 #CJK UNIFIED IDEOGRAPH
+ {0xDBA0, 0x8E71}, //15785 #CJK UNIFIED IDEOGRAPH
+ {0xDBA1, 0x90B8}, //15786 #CJK UNIFIED IDEOGRAPH
+ {0xDBA2, 0x90B0}, //15787 #CJK UNIFIED IDEOGRAPH
+ {0xDBA3, 0x90CF}, //15788 #CJK UNIFIED IDEOGRAPH
+ {0xDBA4, 0x90C5}, //15789 #CJK UNIFIED IDEOGRAPH
+ {0xDBA5, 0x90BE}, //15790 #CJK UNIFIED IDEOGRAPH
+ {0xDBA6, 0x90D0}, //15791 #CJK UNIFIED IDEOGRAPH
+ {0xDBA7, 0x90C4}, //15792 #CJK UNIFIED IDEOGRAPH
+ {0xDBA8, 0x90C7}, //15793 #CJK UNIFIED IDEOGRAPH
+ {0xDBA9, 0x90D3}, //15794 #CJK UNIFIED IDEOGRAPH
+ {0xDBAA, 0x90E6}, //15795 #CJK UNIFIED IDEOGRAPH
+ {0xDBAB, 0x90E2}, //15796 #CJK UNIFIED IDEOGRAPH
+ {0xDBAC, 0x90DC}, //15797 #CJK UNIFIED IDEOGRAPH
+ {0xDBAD, 0x90D7}, //15798 #CJK UNIFIED IDEOGRAPH
+ {0xDBAE, 0x90DB}, //15799 #CJK UNIFIED IDEOGRAPH
+ {0xDBAF, 0x90EB}, //15800 #CJK UNIFIED IDEOGRAPH
+ {0xDBB0, 0x90EF}, //15801 #CJK UNIFIED IDEOGRAPH
+ {0xDBB1, 0x90FE}, //15802 #CJK UNIFIED IDEOGRAPH
+ {0xDBB2, 0x9104}, //15803 #CJK UNIFIED IDEOGRAPH
+ {0xDBB3, 0x9122}, //15804 #CJK UNIFIED IDEOGRAPH
+ {0xDBB4, 0x911E}, //15805 #CJK UNIFIED IDEOGRAPH
+ {0xDBB5, 0x9123}, //15806 #CJK UNIFIED IDEOGRAPH
+ {0xDBB6, 0x9131}, //15807 #CJK UNIFIED IDEOGRAPH
+ {0xDBB7, 0x912F}, //15808 #CJK UNIFIED IDEOGRAPH
+ {0xDBB8, 0x9139}, //15809 #CJK UNIFIED IDEOGRAPH
+ {0xDBB9, 0x9143}, //15810 #CJK UNIFIED IDEOGRAPH
+ {0xDBBA, 0x9146}, //15811 #CJK UNIFIED IDEOGRAPH
+ {0xDBBB, 0x520D}, //15812 #CJK UNIFIED IDEOGRAPH
+ {0xDBBC, 0x5942}, //15813 #CJK UNIFIED IDEOGRAPH
+ {0xDBBD, 0x52A2}, //15814 #CJK UNIFIED IDEOGRAPH
+ {0xDBBE, 0x52AC}, //15815 #CJK UNIFIED IDEOGRAPH
+ {0xDBBF, 0x52AD}, //15816 #CJK UNIFIED IDEOGRAPH
+ {0xDBC0, 0x52BE}, //15817 #CJK UNIFIED IDEOGRAPH
+ {0xDBC1, 0x54FF}, //15818 #CJK UNIFIED IDEOGRAPH
+ {0xDBC2, 0x52D0}, //15819 #CJK UNIFIED IDEOGRAPH
+ {0xDBC3, 0x52D6}, //15820 #CJK UNIFIED IDEOGRAPH
+ {0xDBC4, 0x52F0}, //15821 #CJK UNIFIED IDEOGRAPH
+ {0xDBC5, 0x53DF}, //15822 #CJK UNIFIED IDEOGRAPH
+ {0xDBC6, 0x71EE}, //15823 #CJK UNIFIED IDEOGRAPH
+ {0xDBC7, 0x77CD}, //15824 #CJK UNIFIED IDEOGRAPH
+ {0xDBC8, 0x5EF4}, //15825 #CJK UNIFIED IDEOGRAPH
+ {0xDBC9, 0x51F5}, //15826 #CJK UNIFIED IDEOGRAPH
+ {0xDBCA, 0x51FC}, //15827 #CJK UNIFIED IDEOGRAPH
+ {0xDBCB, 0x9B2F}, //15828 #CJK UNIFIED IDEOGRAPH
+ {0xDBCC, 0x53B6}, //15829 #CJK UNIFIED IDEOGRAPH
+ {0xDBCD, 0x5F01}, //15830 #CJK UNIFIED IDEOGRAPH
+ {0xDBCE, 0x755A}, //15831 #CJK UNIFIED IDEOGRAPH
+ {0xDBCF, 0x5DEF}, //15832 #CJK UNIFIED IDEOGRAPH
+ {0xDBD0, 0x574C}, //15833 #CJK UNIFIED IDEOGRAPH
+ {0xDBD1, 0x57A9}, //15834 #CJK UNIFIED IDEOGRAPH
+ {0xDBD2, 0x57A1}, //15835 #CJK UNIFIED IDEOGRAPH
+ {0xDBD3, 0x587E}, //15836 #CJK UNIFIED IDEOGRAPH
+ {0xDBD4, 0x58BC}, //15837 #CJK UNIFIED IDEOGRAPH
+ {0xDBD5, 0x58C5}, //15838 #CJK UNIFIED IDEOGRAPH
+ {0xDBD6, 0x58D1}, //15839 #CJK UNIFIED IDEOGRAPH
+ {0xDBD7, 0x5729}, //15840 #CJK UNIFIED IDEOGRAPH
+ {0xDBD8, 0x572C}, //15841 #CJK UNIFIED IDEOGRAPH
+ {0xDBD9, 0x572A}, //15842 #CJK UNIFIED IDEOGRAPH
+ {0xDBDA, 0x5733}, //15843 #CJK UNIFIED IDEOGRAPH
+ {0xDBDB, 0x5739}, //15844 #CJK UNIFIED IDEOGRAPH
+ {0xDBDC, 0x572E}, //15845 #CJK UNIFIED IDEOGRAPH
+ {0xDBDD, 0x572F}, //15846 #CJK UNIFIED IDEOGRAPH
+ {0xDBDE, 0x575C}, //15847 #CJK UNIFIED IDEOGRAPH
+ {0xDBDF, 0x573B}, //15848 #CJK UNIFIED IDEOGRAPH
+ {0xDBE0, 0x5742}, //15849 #CJK UNIFIED IDEOGRAPH
+ {0xDBE1, 0x5769}, //15850 #CJK UNIFIED IDEOGRAPH
+ {0xDBE2, 0x5785}, //15851 #CJK UNIFIED IDEOGRAPH
+ {0xDBE3, 0x576B}, //15852 #CJK UNIFIED IDEOGRAPH
+ {0xDBE4, 0x5786}, //15853 #CJK UNIFIED IDEOGRAPH
+ {0xDBE5, 0x577C}, //15854 #CJK UNIFIED IDEOGRAPH
+ {0xDBE6, 0x577B}, //15855 #CJK UNIFIED IDEOGRAPH
+ {0xDBE7, 0x5768}, //15856 #CJK UNIFIED IDEOGRAPH
+ {0xDBE8, 0x576D}, //15857 #CJK UNIFIED IDEOGRAPH
+ {0xDBE9, 0x5776}, //15858 #CJK UNIFIED IDEOGRAPH
+ {0xDBEA, 0x5773}, //15859 #CJK UNIFIED IDEOGRAPH
+ {0xDBEB, 0x57AD}, //15860 #CJK UNIFIED IDEOGRAPH
+ {0xDBEC, 0x57A4}, //15861 #CJK UNIFIED IDEOGRAPH
+ {0xDBED, 0x578C}, //15862 #CJK UNIFIED IDEOGRAPH
+ {0xDBEE, 0x57B2}, //15863 #CJK UNIFIED IDEOGRAPH
+ {0xDBEF, 0x57CF}, //15864 #CJK UNIFIED IDEOGRAPH
+ {0xDBF0, 0x57A7}, //15865 #CJK UNIFIED IDEOGRAPH
+ {0xDBF1, 0x57B4}, //15866 #CJK UNIFIED IDEOGRAPH
+ {0xDBF2, 0x5793}, //15867 #CJK UNIFIED IDEOGRAPH
+ {0xDBF3, 0x57A0}, //15868 #CJK UNIFIED IDEOGRAPH
+ {0xDBF4, 0x57D5}, //15869 #CJK UNIFIED IDEOGRAPH
+ {0xDBF5, 0x57D8}, //15870 #CJK UNIFIED IDEOGRAPH
+ {0xDBF6, 0x57DA}, //15871 #CJK UNIFIED IDEOGRAPH
+ {0xDBF7, 0x57D9}, //15872 #CJK UNIFIED IDEOGRAPH
+ {0xDBF8, 0x57D2}, //15873 #CJK UNIFIED IDEOGRAPH
+ {0xDBF9, 0x57B8}, //15874 #CJK UNIFIED IDEOGRAPH
+ {0xDBFA, 0x57F4}, //15875 #CJK UNIFIED IDEOGRAPH
+ {0xDBFB, 0x57EF}, //15876 #CJK UNIFIED IDEOGRAPH
+ {0xDBFC, 0x57F8}, //15877 #CJK UNIFIED IDEOGRAPH
+ {0xDBFD, 0x57E4}, //15878 #CJK UNIFIED IDEOGRAPH
+ {0xDBFE, 0x57DD}, //15879 #CJK UNIFIED IDEOGRAPH
+ {0xDC40, 0x8E73}, //15880 #CJK UNIFIED IDEOGRAPH
+ {0xDC41, 0x8E75}, //15881 #CJK UNIFIED IDEOGRAPH
+ {0xDC42, 0x8E77}, //15882 #CJK UNIFIED IDEOGRAPH
+ {0xDC43, 0x8E78}, //15883 #CJK UNIFIED IDEOGRAPH
+ {0xDC44, 0x8E79}, //15884 #CJK UNIFIED IDEOGRAPH
+ {0xDC45, 0x8E7A}, //15885 #CJK UNIFIED IDEOGRAPH
+ {0xDC46, 0x8E7B}, //15886 #CJK UNIFIED IDEOGRAPH
+ {0xDC47, 0x8E7D}, //15887 #CJK UNIFIED IDEOGRAPH
+ {0xDC48, 0x8E7E}, //15888 #CJK UNIFIED IDEOGRAPH
+ {0xDC49, 0x8E80}, //15889 #CJK UNIFIED IDEOGRAPH
+ {0xDC4A, 0x8E82}, //15890 #CJK UNIFIED IDEOGRAPH
+ {0xDC4B, 0x8E83}, //15891 #CJK UNIFIED IDEOGRAPH
+ {0xDC4C, 0x8E84}, //15892 #CJK UNIFIED IDEOGRAPH
+ {0xDC4D, 0x8E86}, //15893 #CJK UNIFIED IDEOGRAPH
+ {0xDC4E, 0x8E88}, //15894 #CJK UNIFIED IDEOGRAPH
+ {0xDC4F, 0x8E89}, //15895 #CJK UNIFIED IDEOGRAPH
+ {0xDC50, 0x8E8A}, //15896 #CJK UNIFIED IDEOGRAPH
+ {0xDC51, 0x8E8B}, //15897 #CJK UNIFIED IDEOGRAPH
+ {0xDC52, 0x8E8C}, //15898 #CJK UNIFIED IDEOGRAPH
+ {0xDC53, 0x8E8D}, //15899 #CJK UNIFIED IDEOGRAPH
+ {0xDC54, 0x8E8E}, //15900 #CJK UNIFIED IDEOGRAPH
+ {0xDC55, 0x8E91}, //15901 #CJK UNIFIED IDEOGRAPH
+ {0xDC56, 0x8E92}, //15902 #CJK UNIFIED IDEOGRAPH
+ {0xDC57, 0x8E93}, //15903 #CJK UNIFIED IDEOGRAPH
+ {0xDC58, 0x8E95}, //15904 #CJK UNIFIED IDEOGRAPH
+ {0xDC59, 0x8E96}, //15905 #CJK UNIFIED IDEOGRAPH
+ {0xDC5A, 0x8E97}, //15906 #CJK UNIFIED IDEOGRAPH
+ {0xDC5B, 0x8E98}, //15907 #CJK UNIFIED IDEOGRAPH
+ {0xDC5C, 0x8E99}, //15908 #CJK UNIFIED IDEOGRAPH
+ {0xDC5D, 0x8E9A}, //15909 #CJK UNIFIED IDEOGRAPH
+ {0xDC5E, 0x8E9B}, //15910 #CJK UNIFIED IDEOGRAPH
+ {0xDC5F, 0x8E9D}, //15911 #CJK UNIFIED IDEOGRAPH
+ {0xDC60, 0x8E9F}, //15912 #CJK UNIFIED IDEOGRAPH
+ {0xDC61, 0x8EA0}, //15913 #CJK UNIFIED IDEOGRAPH
+ {0xDC62, 0x8EA1}, //15914 #CJK UNIFIED IDEOGRAPH
+ {0xDC63, 0x8EA2}, //15915 #CJK UNIFIED IDEOGRAPH
+ {0xDC64, 0x8EA3}, //15916 #CJK UNIFIED IDEOGRAPH
+ {0xDC65, 0x8EA4}, //15917 #CJK UNIFIED IDEOGRAPH
+ {0xDC66, 0x8EA5}, //15918 #CJK UNIFIED IDEOGRAPH
+ {0xDC67, 0x8EA6}, //15919 #CJK UNIFIED IDEOGRAPH
+ {0xDC68, 0x8EA7}, //15920 #CJK UNIFIED IDEOGRAPH
+ {0xDC69, 0x8EA8}, //15921 #CJK UNIFIED IDEOGRAPH
+ {0xDC6A, 0x8EA9}, //15922 #CJK UNIFIED IDEOGRAPH
+ {0xDC6B, 0x8EAA}, //15923 #CJK UNIFIED IDEOGRAPH
+ {0xDC6C, 0x8EAD}, //15924 #CJK UNIFIED IDEOGRAPH
+ {0xDC6D, 0x8EAE}, //15925 #CJK UNIFIED IDEOGRAPH
+ {0xDC6E, 0x8EB0}, //15926 #CJK UNIFIED IDEOGRAPH
+ {0xDC6F, 0x8EB1}, //15927 #CJK UNIFIED IDEOGRAPH
+ {0xDC70, 0x8EB3}, //15928 #CJK UNIFIED IDEOGRAPH
+ {0xDC71, 0x8EB4}, //15929 #CJK UNIFIED IDEOGRAPH
+ {0xDC72, 0x8EB5}, //15930 #CJK UNIFIED IDEOGRAPH
+ {0xDC73, 0x8EB6}, //15931 #CJK UNIFIED IDEOGRAPH
+ {0xDC74, 0x8EB7}, //15932 #CJK UNIFIED IDEOGRAPH
+ {0xDC75, 0x8EB8}, //15933 #CJK UNIFIED IDEOGRAPH
+ {0xDC76, 0x8EB9}, //15934 #CJK UNIFIED IDEOGRAPH
+ {0xDC77, 0x8EBB}, //15935 #CJK UNIFIED IDEOGRAPH
+ {0xDC78, 0x8EBC}, //15936 #CJK UNIFIED IDEOGRAPH
+ {0xDC79, 0x8EBD}, //15937 #CJK UNIFIED IDEOGRAPH
+ {0xDC7A, 0x8EBE}, //15938 #CJK UNIFIED IDEOGRAPH
+ {0xDC7B, 0x8EBF}, //15939 #CJK UNIFIED IDEOGRAPH
+ {0xDC7C, 0x8EC0}, //15940 #CJK UNIFIED IDEOGRAPH
+ {0xDC7D, 0x8EC1}, //15941 #CJK UNIFIED IDEOGRAPH
+ {0xDC7E, 0x8EC2}, //15942 #CJK UNIFIED IDEOGRAPH
+ {0xDC80, 0x8EC3}, //15943 #CJK UNIFIED IDEOGRAPH
+ {0xDC81, 0x8EC4}, //15944 #CJK UNIFIED IDEOGRAPH
+ {0xDC82, 0x8EC5}, //15945 #CJK UNIFIED IDEOGRAPH
+ {0xDC83, 0x8EC6}, //15946 #CJK UNIFIED IDEOGRAPH
+ {0xDC84, 0x8EC7}, //15947 #CJK UNIFIED IDEOGRAPH
+ {0xDC85, 0x8EC8}, //15948 #CJK UNIFIED IDEOGRAPH
+ {0xDC86, 0x8EC9}, //15949 #CJK UNIFIED IDEOGRAPH
+ {0xDC87, 0x8ECA}, //15950 #CJK UNIFIED IDEOGRAPH
+ {0xDC88, 0x8ECB}, //15951 #CJK UNIFIED IDEOGRAPH
+ {0xDC89, 0x8ECC}, //15952 #CJK UNIFIED IDEOGRAPH
+ {0xDC8A, 0x8ECD}, //15953 #CJK UNIFIED IDEOGRAPH
+ {0xDC8B, 0x8ECF}, //15954 #CJK UNIFIED IDEOGRAPH
+ {0xDC8C, 0x8ED0}, //15955 #CJK UNIFIED IDEOGRAPH
+ {0xDC8D, 0x8ED1}, //15956 #CJK UNIFIED IDEOGRAPH
+ {0xDC8E, 0x8ED2}, //15957 #CJK UNIFIED IDEOGRAPH
+ {0xDC8F, 0x8ED3}, //15958 #CJK UNIFIED IDEOGRAPH
+ {0xDC90, 0x8ED4}, //15959 #CJK UNIFIED IDEOGRAPH
+ {0xDC91, 0x8ED5}, //15960 #CJK UNIFIED IDEOGRAPH
+ {0xDC92, 0x8ED6}, //15961 #CJK UNIFIED IDEOGRAPH
+ {0xDC93, 0x8ED7}, //15962 #CJK UNIFIED IDEOGRAPH
+ {0xDC94, 0x8ED8}, //15963 #CJK UNIFIED IDEOGRAPH
+ {0xDC95, 0x8ED9}, //15964 #CJK UNIFIED IDEOGRAPH
+ {0xDC96, 0x8EDA}, //15965 #CJK UNIFIED IDEOGRAPH
+ {0xDC97, 0x8EDB}, //15966 #CJK UNIFIED IDEOGRAPH
+ {0xDC98, 0x8EDC}, //15967 #CJK UNIFIED IDEOGRAPH
+ {0xDC99, 0x8EDD}, //15968 #CJK UNIFIED IDEOGRAPH
+ {0xDC9A, 0x8EDE}, //15969 #CJK UNIFIED IDEOGRAPH
+ {0xDC9B, 0x8EDF}, //15970 #CJK UNIFIED IDEOGRAPH
+ {0xDC9C, 0x8EE0}, //15971 #CJK UNIFIED IDEOGRAPH
+ {0xDC9D, 0x8EE1}, //15972 #CJK UNIFIED IDEOGRAPH
+ {0xDC9E, 0x8EE2}, //15973 #CJK UNIFIED IDEOGRAPH
+ {0xDC9F, 0x8EE3}, //15974 #CJK UNIFIED IDEOGRAPH
+ {0xDCA0, 0x8EE4}, //15975 #CJK UNIFIED IDEOGRAPH
+ {0xDCA1, 0x580B}, //15976 #CJK UNIFIED IDEOGRAPH
+ {0xDCA2, 0x580D}, //15977 #CJK UNIFIED IDEOGRAPH
+ {0xDCA3, 0x57FD}, //15978 #CJK UNIFIED IDEOGRAPH
+ {0xDCA4, 0x57ED}, //15979 #CJK UNIFIED IDEOGRAPH
+ {0xDCA5, 0x5800}, //15980 #CJK UNIFIED IDEOGRAPH
+ {0xDCA6, 0x581E}, //15981 #CJK UNIFIED IDEOGRAPH
+ {0xDCA7, 0x5819}, //15982 #CJK UNIFIED IDEOGRAPH
+ {0xDCA8, 0x5844}, //15983 #CJK UNIFIED IDEOGRAPH
+ {0xDCA9, 0x5820}, //15984 #CJK UNIFIED IDEOGRAPH
+ {0xDCAA, 0x5865}, //15985 #CJK UNIFIED IDEOGRAPH
+ {0xDCAB, 0x586C}, //15986 #CJK UNIFIED IDEOGRAPH
+ {0xDCAC, 0x5881}, //15987 #CJK UNIFIED IDEOGRAPH
+ {0xDCAD, 0x5889}, //15988 #CJK UNIFIED IDEOGRAPH
+ {0xDCAE, 0x589A}, //15989 #CJK UNIFIED IDEOGRAPH
+ {0xDCAF, 0x5880}, //15990 #CJK UNIFIED IDEOGRAPH
+ {0xDCB0, 0x99A8}, //15991 #CJK UNIFIED IDEOGRAPH
+ {0xDCB1, 0x9F19}, //15992 #CJK UNIFIED IDEOGRAPH
+ {0xDCB2, 0x61FF}, //15993 #CJK UNIFIED IDEOGRAPH
+ {0xDCB3, 0x8279}, //15994 #CJK UNIFIED IDEOGRAPH
+ {0xDCB4, 0x827D}, //15995 #CJK UNIFIED IDEOGRAPH
+ {0xDCB5, 0x827F}, //15996 #CJK UNIFIED IDEOGRAPH
+ {0xDCB6, 0x828F}, //15997 #CJK UNIFIED IDEOGRAPH
+ {0xDCB7, 0x828A}, //15998 #CJK UNIFIED IDEOGRAPH
+ {0xDCB8, 0x82A8}, //15999 #CJK UNIFIED IDEOGRAPH
+ {0xDCB9, 0x8284}, //16000 #CJK UNIFIED IDEOGRAPH
+ {0xDCBA, 0x828E}, //16001 #CJK UNIFIED IDEOGRAPH
+ {0xDCBB, 0x8291}, //16002 #CJK UNIFIED IDEOGRAPH
+ {0xDCBC, 0x8297}, //16003 #CJK UNIFIED IDEOGRAPH
+ {0xDCBD, 0x8299}, //16004 #CJK UNIFIED IDEOGRAPH
+ {0xDCBE, 0x82AB}, //16005 #CJK UNIFIED IDEOGRAPH
+ {0xDCBF, 0x82B8}, //16006 #CJK UNIFIED IDEOGRAPH
+ {0xDCC0, 0x82BE}, //16007 #CJK UNIFIED IDEOGRAPH
+ {0xDCC1, 0x82B0}, //16008 #CJK UNIFIED IDEOGRAPH
+ {0xDCC2, 0x82C8}, //16009 #CJK UNIFIED IDEOGRAPH
+ {0xDCC3, 0x82CA}, //16010 #CJK UNIFIED IDEOGRAPH
+ {0xDCC4, 0x82E3}, //16011 #CJK UNIFIED IDEOGRAPH
+ {0xDCC5, 0x8298}, //16012 #CJK UNIFIED IDEOGRAPH
+ {0xDCC6, 0x82B7}, //16013 #CJK UNIFIED IDEOGRAPH
+ {0xDCC7, 0x82AE}, //16014 #CJK UNIFIED IDEOGRAPH
+ {0xDCC8, 0x82CB}, //16015 #CJK UNIFIED IDEOGRAPH
+ {0xDCC9, 0x82CC}, //16016 #CJK UNIFIED IDEOGRAPH
+ {0xDCCA, 0x82C1}, //16017 #CJK UNIFIED IDEOGRAPH
+ {0xDCCB, 0x82A9}, //16018 #CJK UNIFIED IDEOGRAPH
+ {0xDCCC, 0x82B4}, //16019 #CJK UNIFIED IDEOGRAPH
+ {0xDCCD, 0x82A1}, //16020 #CJK UNIFIED IDEOGRAPH
+ {0xDCCE, 0x82AA}, //16021 #CJK UNIFIED IDEOGRAPH
+ {0xDCCF, 0x829F}, //16022 #CJK UNIFIED IDEOGRAPH
+ {0xDCD0, 0x82C4}, //16023 #CJK UNIFIED IDEOGRAPH
+ {0xDCD1, 0x82CE}, //16024 #CJK UNIFIED IDEOGRAPH
+ {0xDCD2, 0x82A4}, //16025 #CJK UNIFIED IDEOGRAPH
+ {0xDCD3, 0x82E1}, //16026 #CJK UNIFIED IDEOGRAPH
+ {0xDCD4, 0x8309}, //16027 #CJK UNIFIED IDEOGRAPH
+ {0xDCD5, 0x82F7}, //16028 #CJK UNIFIED IDEOGRAPH
+ {0xDCD6, 0x82E4}, //16029 #CJK UNIFIED IDEOGRAPH
+ {0xDCD7, 0x830F}, //16030 #CJK UNIFIED IDEOGRAPH
+ {0xDCD8, 0x8307}, //16031 #CJK UNIFIED IDEOGRAPH
+ {0xDCD9, 0x82DC}, //16032 #CJK UNIFIED IDEOGRAPH
+ {0xDCDA, 0x82F4}, //16033 #CJK UNIFIED IDEOGRAPH
+ {0xDCDB, 0x82D2}, //16034 #CJK UNIFIED IDEOGRAPH
+ {0xDCDC, 0x82D8}, //16035 #CJK UNIFIED IDEOGRAPH
+ {0xDCDD, 0x830C}, //16036 #CJK UNIFIED IDEOGRAPH
+ {0xDCDE, 0x82FB}, //16037 #CJK UNIFIED IDEOGRAPH
+ {0xDCDF, 0x82D3}, //16038 #CJK UNIFIED IDEOGRAPH
+ {0xDCE0, 0x8311}, //16039 #CJK UNIFIED IDEOGRAPH
+ {0xDCE1, 0x831A}, //16040 #CJK UNIFIED IDEOGRAPH
+ {0xDCE2, 0x8306}, //16041 #CJK UNIFIED IDEOGRAPH
+ {0xDCE3, 0x8314}, //16042 #CJK UNIFIED IDEOGRAPH
+ {0xDCE4, 0x8315}, //16043 #CJK UNIFIED IDEOGRAPH
+ {0xDCE5, 0x82E0}, //16044 #CJK UNIFIED IDEOGRAPH
+ {0xDCE6, 0x82D5}, //16045 #CJK UNIFIED IDEOGRAPH
+ {0xDCE7, 0x831C}, //16046 #CJK UNIFIED IDEOGRAPH
+ {0xDCE8, 0x8351}, //16047 #CJK UNIFIED IDEOGRAPH
+ {0xDCE9, 0x835B}, //16048 #CJK UNIFIED IDEOGRAPH
+ {0xDCEA, 0x835C}, //16049 #CJK UNIFIED IDEOGRAPH
+ {0xDCEB, 0x8308}, //16050 #CJK UNIFIED IDEOGRAPH
+ {0xDCEC, 0x8392}, //16051 #CJK UNIFIED IDEOGRAPH
+ {0xDCED, 0x833C}, //16052 #CJK UNIFIED IDEOGRAPH
+ {0xDCEE, 0x8334}, //16053 #CJK UNIFIED IDEOGRAPH
+ {0xDCEF, 0x8331}, //16054 #CJK UNIFIED IDEOGRAPH
+ {0xDCF0, 0x839B}, //16055 #CJK UNIFIED IDEOGRAPH
+ {0xDCF1, 0x835E}, //16056 #CJK UNIFIED IDEOGRAPH
+ {0xDCF2, 0x832F}, //16057 #CJK UNIFIED IDEOGRAPH
+ {0xDCF3, 0x834F}, //16058 #CJK UNIFIED IDEOGRAPH
+ {0xDCF4, 0x8347}, //16059 #CJK UNIFIED IDEOGRAPH
+ {0xDCF5, 0x8343}, //16060 #CJK UNIFIED IDEOGRAPH
+ {0xDCF6, 0x835F}, //16061 #CJK UNIFIED IDEOGRAPH
+ {0xDCF7, 0x8340}, //16062 #CJK UNIFIED IDEOGRAPH
+ {0xDCF8, 0x8317}, //16063 #CJK UNIFIED IDEOGRAPH
+ {0xDCF9, 0x8360}, //16064 #CJK UNIFIED IDEOGRAPH
+ {0xDCFA, 0x832D}, //16065 #CJK UNIFIED IDEOGRAPH
+ {0xDCFB, 0x833A}, //16066 #CJK UNIFIED IDEOGRAPH
+ {0xDCFC, 0x8333}, //16067 #CJK UNIFIED IDEOGRAPH
+ {0xDCFD, 0x8366}, //16068 #CJK UNIFIED IDEOGRAPH
+ {0xDCFE, 0x8365}, //16069 #CJK UNIFIED IDEOGRAPH
+ {0xDD40, 0x8EE5}, //16070 #CJK UNIFIED IDEOGRAPH
+ {0xDD41, 0x8EE6}, //16071 #CJK UNIFIED IDEOGRAPH
+ {0xDD42, 0x8EE7}, //16072 #CJK UNIFIED IDEOGRAPH
+ {0xDD43, 0x8EE8}, //16073 #CJK UNIFIED IDEOGRAPH
+ {0xDD44, 0x8EE9}, //16074 #CJK UNIFIED IDEOGRAPH
+ {0xDD45, 0x8EEA}, //16075 #CJK UNIFIED IDEOGRAPH
+ {0xDD46, 0x8EEB}, //16076 #CJK UNIFIED IDEOGRAPH
+ {0xDD47, 0x8EEC}, //16077 #CJK UNIFIED IDEOGRAPH
+ {0xDD48, 0x8EED}, //16078 #CJK UNIFIED IDEOGRAPH
+ {0xDD49, 0x8EEE}, //16079 #CJK UNIFIED IDEOGRAPH
+ {0xDD4A, 0x8EEF}, //16080 #CJK UNIFIED IDEOGRAPH
+ {0xDD4B, 0x8EF0}, //16081 #CJK UNIFIED IDEOGRAPH
+ {0xDD4C, 0x8EF1}, //16082 #CJK UNIFIED IDEOGRAPH
+ {0xDD4D, 0x8EF2}, //16083 #CJK UNIFIED IDEOGRAPH
+ {0xDD4E, 0x8EF3}, //16084 #CJK UNIFIED IDEOGRAPH
+ {0xDD4F, 0x8EF4}, //16085 #CJK UNIFIED IDEOGRAPH
+ {0xDD50, 0x8EF5}, //16086 #CJK UNIFIED IDEOGRAPH
+ {0xDD51, 0x8EF6}, //16087 #CJK UNIFIED IDEOGRAPH
+ {0xDD52, 0x8EF7}, //16088 #CJK UNIFIED IDEOGRAPH
+ {0xDD53, 0x8EF8}, //16089 #CJK UNIFIED IDEOGRAPH
+ {0xDD54, 0x8EF9}, //16090 #CJK UNIFIED IDEOGRAPH
+ {0xDD55, 0x8EFA}, //16091 #CJK UNIFIED IDEOGRAPH
+ {0xDD56, 0x8EFB}, //16092 #CJK UNIFIED IDEOGRAPH
+ {0xDD57, 0x8EFC}, //16093 #CJK UNIFIED IDEOGRAPH
+ {0xDD58, 0x8EFD}, //16094 #CJK UNIFIED IDEOGRAPH
+ {0xDD59, 0x8EFE}, //16095 #CJK UNIFIED IDEOGRAPH
+ {0xDD5A, 0x8EFF}, //16096 #CJK UNIFIED IDEOGRAPH
+ {0xDD5B, 0x8F00}, //16097 #CJK UNIFIED IDEOGRAPH
+ {0xDD5C, 0x8F01}, //16098 #CJK UNIFIED IDEOGRAPH
+ {0xDD5D, 0x8F02}, //16099 #CJK UNIFIED IDEOGRAPH
+ {0xDD5E, 0x8F03}, //16100 #CJK UNIFIED IDEOGRAPH
+ {0xDD5F, 0x8F04}, //16101 #CJK UNIFIED IDEOGRAPH
+ {0xDD60, 0x8F05}, //16102 #CJK UNIFIED IDEOGRAPH
+ {0xDD61, 0x8F06}, //16103 #CJK UNIFIED IDEOGRAPH
+ {0xDD62, 0x8F07}, //16104 #CJK UNIFIED IDEOGRAPH
+ {0xDD63, 0x8F08}, //16105 #CJK UNIFIED IDEOGRAPH
+ {0xDD64, 0x8F09}, //16106 #CJK UNIFIED IDEOGRAPH
+ {0xDD65, 0x8F0A}, //16107 #CJK UNIFIED IDEOGRAPH
+ {0xDD66, 0x8F0B}, //16108 #CJK UNIFIED IDEOGRAPH
+ {0xDD67, 0x8F0C}, //16109 #CJK UNIFIED IDEOGRAPH
+ {0xDD68, 0x8F0D}, //16110 #CJK UNIFIED IDEOGRAPH
+ {0xDD69, 0x8F0E}, //16111 #CJK UNIFIED IDEOGRAPH
+ {0xDD6A, 0x8F0F}, //16112 #CJK UNIFIED IDEOGRAPH
+ {0xDD6B, 0x8F10}, //16113 #CJK UNIFIED IDEOGRAPH
+ {0xDD6C, 0x8F11}, //16114 #CJK UNIFIED IDEOGRAPH
+ {0xDD6D, 0x8F12}, //16115 #CJK UNIFIED IDEOGRAPH
+ {0xDD6E, 0x8F13}, //16116 #CJK UNIFIED IDEOGRAPH
+ {0xDD6F, 0x8F14}, //16117 #CJK UNIFIED IDEOGRAPH
+ {0xDD70, 0x8F15}, //16118 #CJK UNIFIED IDEOGRAPH
+ {0xDD71, 0x8F16}, //16119 #CJK UNIFIED IDEOGRAPH
+ {0xDD72, 0x8F17}, //16120 #CJK UNIFIED IDEOGRAPH
+ {0xDD73, 0x8F18}, //16121 #CJK UNIFIED IDEOGRAPH
+ {0xDD74, 0x8F19}, //16122 #CJK UNIFIED IDEOGRAPH
+ {0xDD75, 0x8F1A}, //16123 #CJK UNIFIED IDEOGRAPH
+ {0xDD76, 0x8F1B}, //16124 #CJK UNIFIED IDEOGRAPH
+ {0xDD77, 0x8F1C}, //16125 #CJK UNIFIED IDEOGRAPH
+ {0xDD78, 0x8F1D}, //16126 #CJK UNIFIED IDEOGRAPH
+ {0xDD79, 0x8F1E}, //16127 #CJK UNIFIED IDEOGRAPH
+ {0xDD7A, 0x8F1F}, //16128 #CJK UNIFIED IDEOGRAPH
+ {0xDD7B, 0x8F20}, //16129 #CJK UNIFIED IDEOGRAPH
+ {0xDD7C, 0x8F21}, //16130 #CJK UNIFIED IDEOGRAPH
+ {0xDD7D, 0x8F22}, //16131 #CJK UNIFIED IDEOGRAPH
+ {0xDD7E, 0x8F23}, //16132 #CJK UNIFIED IDEOGRAPH
+ {0xDD80, 0x8F24}, //16133 #CJK UNIFIED IDEOGRAPH
+ {0xDD81, 0x8F25}, //16134 #CJK UNIFIED IDEOGRAPH
+ {0xDD82, 0x8F26}, //16135 #CJK UNIFIED IDEOGRAPH
+ {0xDD83, 0x8F27}, //16136 #CJK UNIFIED IDEOGRAPH
+ {0xDD84, 0x8F28}, //16137 #CJK UNIFIED IDEOGRAPH
+ {0xDD85, 0x8F29}, //16138 #CJK UNIFIED IDEOGRAPH
+ {0xDD86, 0x8F2A}, //16139 #CJK UNIFIED IDEOGRAPH
+ {0xDD87, 0x8F2B}, //16140 #CJK UNIFIED IDEOGRAPH
+ {0xDD88, 0x8F2C}, //16141 #CJK UNIFIED IDEOGRAPH
+ {0xDD89, 0x8F2D}, //16142 #CJK UNIFIED IDEOGRAPH
+ {0xDD8A, 0x8F2E}, //16143 #CJK UNIFIED IDEOGRAPH
+ {0xDD8B, 0x8F2F}, //16144 #CJK UNIFIED IDEOGRAPH
+ {0xDD8C, 0x8F30}, //16145 #CJK UNIFIED IDEOGRAPH
+ {0xDD8D, 0x8F31}, //16146 #CJK UNIFIED IDEOGRAPH
+ {0xDD8E, 0x8F32}, //16147 #CJK UNIFIED IDEOGRAPH
+ {0xDD8F, 0x8F33}, //16148 #CJK UNIFIED IDEOGRAPH
+ {0xDD90, 0x8F34}, //16149 #CJK UNIFIED IDEOGRAPH
+ {0xDD91, 0x8F35}, //16150 #CJK UNIFIED IDEOGRAPH
+ {0xDD92, 0x8F36}, //16151 #CJK UNIFIED IDEOGRAPH
+ {0xDD93, 0x8F37}, //16152 #CJK UNIFIED IDEOGRAPH
+ {0xDD94, 0x8F38}, //16153 #CJK UNIFIED IDEOGRAPH
+ {0xDD95, 0x8F39}, //16154 #CJK UNIFIED IDEOGRAPH
+ {0xDD96, 0x8F3A}, //16155 #CJK UNIFIED IDEOGRAPH
+ {0xDD97, 0x8F3B}, //16156 #CJK UNIFIED IDEOGRAPH
+ {0xDD98, 0x8F3C}, //16157 #CJK UNIFIED IDEOGRAPH
+ {0xDD99, 0x8F3D}, //16158 #CJK UNIFIED IDEOGRAPH
+ {0xDD9A, 0x8F3E}, //16159 #CJK UNIFIED IDEOGRAPH
+ {0xDD9B, 0x8F3F}, //16160 #CJK UNIFIED IDEOGRAPH
+ {0xDD9C, 0x8F40}, //16161 #CJK UNIFIED IDEOGRAPH
+ {0xDD9D, 0x8F41}, //16162 #CJK UNIFIED IDEOGRAPH
+ {0xDD9E, 0x8F42}, //16163 #CJK UNIFIED IDEOGRAPH
+ {0xDD9F, 0x8F43}, //16164 #CJK UNIFIED IDEOGRAPH
+ {0xDDA0, 0x8F44}, //16165 #CJK UNIFIED IDEOGRAPH
+ {0xDDA1, 0x8368}, //16166 #CJK UNIFIED IDEOGRAPH
+ {0xDDA2, 0x831B}, //16167 #CJK UNIFIED IDEOGRAPH
+ {0xDDA3, 0x8369}, //16168 #CJK UNIFIED IDEOGRAPH
+ {0xDDA4, 0x836C}, //16169 #CJK UNIFIED IDEOGRAPH
+ {0xDDA5, 0x836A}, //16170 #CJK UNIFIED IDEOGRAPH
+ {0xDDA6, 0x836D}, //16171 #CJK UNIFIED IDEOGRAPH
+ {0xDDA7, 0x836E}, //16172 #CJK UNIFIED IDEOGRAPH
+ {0xDDA8, 0x83B0}, //16173 #CJK UNIFIED IDEOGRAPH
+ {0xDDA9, 0x8378}, //16174 #CJK UNIFIED IDEOGRAPH
+ {0xDDAA, 0x83B3}, //16175 #CJK UNIFIED IDEOGRAPH
+ {0xDDAB, 0x83B4}, //16176 #CJK UNIFIED IDEOGRAPH
+ {0xDDAC, 0x83A0}, //16177 #CJK UNIFIED IDEOGRAPH
+ {0xDDAD, 0x83AA}, //16178 #CJK UNIFIED IDEOGRAPH
+ {0xDDAE, 0x8393}, //16179 #CJK UNIFIED IDEOGRAPH
+ {0xDDAF, 0x839C}, //16180 #CJK UNIFIED IDEOGRAPH
+ {0xDDB0, 0x8385}, //16181 #CJK UNIFIED IDEOGRAPH
+ {0xDDB1, 0x837C}, //16182 #CJK UNIFIED IDEOGRAPH
+ {0xDDB2, 0x83B6}, //16183 #CJK UNIFIED IDEOGRAPH
+ {0xDDB3, 0x83A9}, //16184 #CJK UNIFIED IDEOGRAPH
+ {0xDDB4, 0x837D}, //16185 #CJK UNIFIED IDEOGRAPH
+ {0xDDB5, 0x83B8}, //16186 #CJK UNIFIED IDEOGRAPH
+ {0xDDB6, 0x837B}, //16187 #CJK UNIFIED IDEOGRAPH
+ {0xDDB7, 0x8398}, //16188 #CJK UNIFIED IDEOGRAPH
+ {0xDDB8, 0x839E}, //16189 #CJK UNIFIED IDEOGRAPH
+ {0xDDB9, 0x83A8}, //16190 #CJK UNIFIED IDEOGRAPH
+ {0xDDBA, 0x83BA}, //16191 #CJK UNIFIED IDEOGRAPH
+ {0xDDBB, 0x83BC}, //16192 #CJK UNIFIED IDEOGRAPH
+ {0xDDBC, 0x83C1}, //16193 #CJK UNIFIED IDEOGRAPH
+ {0xDDBD, 0x8401}, //16194 #CJK UNIFIED IDEOGRAPH
+ {0xDDBE, 0x83E5}, //16195 #CJK UNIFIED IDEOGRAPH
+ {0xDDBF, 0x83D8}, //16196 #CJK UNIFIED IDEOGRAPH
+ {0xDDC0, 0x5807}, //16197 #CJK UNIFIED IDEOGRAPH
+ {0xDDC1, 0x8418}, //16198 #CJK UNIFIED IDEOGRAPH
+ {0xDDC2, 0x840B}, //16199 #CJK UNIFIED IDEOGRAPH
+ {0xDDC3, 0x83DD}, //16200 #CJK UNIFIED IDEOGRAPH
+ {0xDDC4, 0x83FD}, //16201 #CJK UNIFIED IDEOGRAPH
+ {0xDDC5, 0x83D6}, //16202 #CJK UNIFIED IDEOGRAPH
+ {0xDDC6, 0x841C}, //16203 #CJK UNIFIED IDEOGRAPH
+ {0xDDC7, 0x8438}, //16204 #CJK UNIFIED IDEOGRAPH
+ {0xDDC8, 0x8411}, //16205 #CJK UNIFIED IDEOGRAPH
+ {0xDDC9, 0x8406}, //16206 #CJK UNIFIED IDEOGRAPH
+ {0xDDCA, 0x83D4}, //16207 #CJK UNIFIED IDEOGRAPH
+ {0xDDCB, 0x83DF}, //16208 #CJK UNIFIED IDEOGRAPH
+ {0xDDCC, 0x840F}, //16209 #CJK UNIFIED IDEOGRAPH
+ {0xDDCD, 0x8403}, //16210 #CJK UNIFIED IDEOGRAPH
+ {0xDDCE, 0x83F8}, //16211 #CJK UNIFIED IDEOGRAPH
+ {0xDDCF, 0x83F9}, //16212 #CJK UNIFIED IDEOGRAPH
+ {0xDDD0, 0x83EA}, //16213 #CJK UNIFIED IDEOGRAPH
+ {0xDDD1, 0x83C5}, //16214 #CJK UNIFIED IDEOGRAPH
+ {0xDDD2, 0x83C0}, //16215 #CJK UNIFIED IDEOGRAPH
+ {0xDDD3, 0x8426}, //16216 #CJK UNIFIED IDEOGRAPH
+ {0xDDD4, 0x83F0}, //16217 #CJK UNIFIED IDEOGRAPH
+ {0xDDD5, 0x83E1}, //16218 #CJK UNIFIED IDEOGRAPH
+ {0xDDD6, 0x845C}, //16219 #CJK UNIFIED IDEOGRAPH
+ {0xDDD7, 0x8451}, //16220 #CJK UNIFIED IDEOGRAPH
+ {0xDDD8, 0x845A}, //16221 #CJK UNIFIED IDEOGRAPH
+ {0xDDD9, 0x8459}, //16222 #CJK UNIFIED IDEOGRAPH
+ {0xDDDA, 0x8473}, //16223 #CJK UNIFIED IDEOGRAPH
+ {0xDDDB, 0x8487}, //16224 #CJK UNIFIED IDEOGRAPH
+ {0xDDDC, 0x8488}, //16225 #CJK UNIFIED IDEOGRAPH
+ {0xDDDD, 0x847A}, //16226 #CJK UNIFIED IDEOGRAPH
+ {0xDDDE, 0x8489}, //16227 #CJK UNIFIED IDEOGRAPH
+ {0xDDDF, 0x8478}, //16228 #CJK UNIFIED IDEOGRAPH
+ {0xDDE0, 0x843C}, //16229 #CJK UNIFIED IDEOGRAPH
+ {0xDDE1, 0x8446}, //16230 #CJK UNIFIED IDEOGRAPH
+ {0xDDE2, 0x8469}, //16231 #CJK UNIFIED IDEOGRAPH
+ {0xDDE3, 0x8476}, //16232 #CJK UNIFIED IDEOGRAPH
+ {0xDDE4, 0x848C}, //16233 #CJK UNIFIED IDEOGRAPH
+ {0xDDE5, 0x848E}, //16234 #CJK UNIFIED IDEOGRAPH
+ {0xDDE6, 0x8431}, //16235 #CJK UNIFIED IDEOGRAPH
+ {0xDDE7, 0x846D}, //16236 #CJK UNIFIED IDEOGRAPH
+ {0xDDE8, 0x84C1}, //16237 #CJK UNIFIED IDEOGRAPH
+ {0xDDE9, 0x84CD}, //16238 #CJK UNIFIED IDEOGRAPH
+ {0xDDEA, 0x84D0}, //16239 #CJK UNIFIED IDEOGRAPH
+ {0xDDEB, 0x84E6}, //16240 #CJK UNIFIED IDEOGRAPH
+ {0xDDEC, 0x84BD}, //16241 #CJK UNIFIED IDEOGRAPH
+ {0xDDED, 0x84D3}, //16242 #CJK UNIFIED IDEOGRAPH
+ {0xDDEE, 0x84CA}, //16243 #CJK UNIFIED IDEOGRAPH
+ {0xDDEF, 0x84BF}, //16244 #CJK UNIFIED IDEOGRAPH
+ {0xDDF0, 0x84BA}, //16245 #CJK UNIFIED IDEOGRAPH
+ {0xDDF1, 0x84E0}, //16246 #CJK UNIFIED IDEOGRAPH
+ {0xDDF2, 0x84A1}, //16247 #CJK UNIFIED IDEOGRAPH
+ {0xDDF3, 0x84B9}, //16248 #CJK UNIFIED IDEOGRAPH
+ {0xDDF4, 0x84B4}, //16249 #CJK UNIFIED IDEOGRAPH
+ {0xDDF5, 0x8497}, //16250 #CJK UNIFIED IDEOGRAPH
+ {0xDDF6, 0x84E5}, //16251 #CJK UNIFIED IDEOGRAPH
+ {0xDDF7, 0x84E3}, //16252 #CJK UNIFIED IDEOGRAPH
+ {0xDDF8, 0x850C}, //16253 #CJK UNIFIED IDEOGRAPH
+ {0xDDF9, 0x750D}, //16254 #CJK UNIFIED IDEOGRAPH
+ {0xDDFA, 0x8538}, //16255 #CJK UNIFIED IDEOGRAPH
+ {0xDDFB, 0x84F0}, //16256 #CJK UNIFIED IDEOGRAPH
+ {0xDDFC, 0x8539}, //16257 #CJK UNIFIED IDEOGRAPH
+ {0xDDFD, 0x851F}, //16258 #CJK UNIFIED IDEOGRAPH
+ {0xDDFE, 0x853A}, //16259 #CJK UNIFIED IDEOGRAPH
+ {0xDE40, 0x8F45}, //16260 #CJK UNIFIED IDEOGRAPH
+ {0xDE41, 0x8F46}, //16261 #CJK UNIFIED IDEOGRAPH
+ {0xDE42, 0x8F47}, //16262 #CJK UNIFIED IDEOGRAPH
+ {0xDE43, 0x8F48}, //16263 #CJK UNIFIED IDEOGRAPH
+ {0xDE44, 0x8F49}, //16264 #CJK UNIFIED IDEOGRAPH
+ {0xDE45, 0x8F4A}, //16265 #CJK UNIFIED IDEOGRAPH
+ {0xDE46, 0x8F4B}, //16266 #CJK UNIFIED IDEOGRAPH
+ {0xDE47, 0x8F4C}, //16267 #CJK UNIFIED IDEOGRAPH
+ {0xDE48, 0x8F4D}, //16268 #CJK UNIFIED IDEOGRAPH
+ {0xDE49, 0x8F4E}, //16269 #CJK UNIFIED IDEOGRAPH
+ {0xDE4A, 0x8F4F}, //16270 #CJK UNIFIED IDEOGRAPH
+ {0xDE4B, 0x8F50}, //16271 #CJK UNIFIED IDEOGRAPH
+ {0xDE4C, 0x8F51}, //16272 #CJK UNIFIED IDEOGRAPH
+ {0xDE4D, 0x8F52}, //16273 #CJK UNIFIED IDEOGRAPH
+ {0xDE4E, 0x8F53}, //16274 #CJK UNIFIED IDEOGRAPH
+ {0xDE4F, 0x8F54}, //16275 #CJK UNIFIED IDEOGRAPH
+ {0xDE50, 0x8F55}, //16276 #CJK UNIFIED IDEOGRAPH
+ {0xDE51, 0x8F56}, //16277 #CJK UNIFIED IDEOGRAPH
+ {0xDE52, 0x8F57}, //16278 #CJK UNIFIED IDEOGRAPH
+ {0xDE53, 0x8F58}, //16279 #CJK UNIFIED IDEOGRAPH
+ {0xDE54, 0x8F59}, //16280 #CJK UNIFIED IDEOGRAPH
+ {0xDE55, 0x8F5A}, //16281 #CJK UNIFIED IDEOGRAPH
+ {0xDE56, 0x8F5B}, //16282 #CJK UNIFIED IDEOGRAPH
+ {0xDE57, 0x8F5C}, //16283 #CJK UNIFIED IDEOGRAPH
+ {0xDE58, 0x8F5D}, //16284 #CJK UNIFIED IDEOGRAPH
+ {0xDE59, 0x8F5E}, //16285 #CJK UNIFIED IDEOGRAPH
+ {0xDE5A, 0x8F5F}, //16286 #CJK UNIFIED IDEOGRAPH
+ {0xDE5B, 0x8F60}, //16287 #CJK UNIFIED IDEOGRAPH
+ {0xDE5C, 0x8F61}, //16288 #CJK UNIFIED IDEOGRAPH
+ {0xDE5D, 0x8F62}, //16289 #CJK UNIFIED IDEOGRAPH
+ {0xDE5E, 0x8F63}, //16290 #CJK UNIFIED IDEOGRAPH
+ {0xDE5F, 0x8F64}, //16291 #CJK UNIFIED IDEOGRAPH
+ {0xDE60, 0x8F65}, //16292 #CJK UNIFIED IDEOGRAPH
+ {0xDE61, 0x8F6A}, //16293 #CJK UNIFIED IDEOGRAPH
+ {0xDE62, 0x8F80}, //16294 #CJK UNIFIED IDEOGRAPH
+ {0xDE63, 0x8F8C}, //16295 #CJK UNIFIED IDEOGRAPH
+ {0xDE64, 0x8F92}, //16296 #CJK UNIFIED IDEOGRAPH
+ {0xDE65, 0x8F9D}, //16297 #CJK UNIFIED IDEOGRAPH
+ {0xDE66, 0x8FA0}, //16298 #CJK UNIFIED IDEOGRAPH
+ {0xDE67, 0x8FA1}, //16299 #CJK UNIFIED IDEOGRAPH
+ {0xDE68, 0x8FA2}, //16300 #CJK UNIFIED IDEOGRAPH
+ {0xDE69, 0x8FA4}, //16301 #CJK UNIFIED IDEOGRAPH
+ {0xDE6A, 0x8FA5}, //16302 #CJK UNIFIED IDEOGRAPH
+ {0xDE6B, 0x8FA6}, //16303 #CJK UNIFIED IDEOGRAPH
+ {0xDE6C, 0x8FA7}, //16304 #CJK UNIFIED IDEOGRAPH
+ {0xDE6D, 0x8FAA}, //16305 #CJK UNIFIED IDEOGRAPH
+ {0xDE6E, 0x8FAC}, //16306 #CJK UNIFIED IDEOGRAPH
+ {0xDE6F, 0x8FAD}, //16307 #CJK UNIFIED IDEOGRAPH
+ {0xDE70, 0x8FAE}, //16308 #CJK UNIFIED IDEOGRAPH
+ {0xDE71, 0x8FAF}, //16309 #CJK UNIFIED IDEOGRAPH
+ {0xDE72, 0x8FB2}, //16310 #CJK UNIFIED IDEOGRAPH
+ {0xDE73, 0x8FB3}, //16311 #CJK UNIFIED IDEOGRAPH
+ {0xDE74, 0x8FB4}, //16312 #CJK UNIFIED IDEOGRAPH
+ {0xDE75, 0x8FB5}, //16313 #CJK UNIFIED IDEOGRAPH
+ {0xDE76, 0x8FB7}, //16314 #CJK UNIFIED IDEOGRAPH
+ {0xDE77, 0x8FB8}, //16315 #CJK UNIFIED IDEOGRAPH
+ {0xDE78, 0x8FBA}, //16316 #CJK UNIFIED IDEOGRAPH
+ {0xDE79, 0x8FBB}, //16317 #CJK UNIFIED IDEOGRAPH
+ {0xDE7A, 0x8FBC}, //16318 #CJK UNIFIED IDEOGRAPH
+ {0xDE7B, 0x8FBF}, //16319 #CJK UNIFIED IDEOGRAPH
+ {0xDE7C, 0x8FC0}, //16320 #CJK UNIFIED IDEOGRAPH
+ {0xDE7D, 0x8FC3}, //16321 #CJK UNIFIED IDEOGRAPH
+ {0xDE7E, 0x8FC6}, //16322 #CJK UNIFIED IDEOGRAPH
+ {0xDE80, 0x8FC9}, //16323 #CJK UNIFIED IDEOGRAPH
+ {0xDE81, 0x8FCA}, //16324 #CJK UNIFIED IDEOGRAPH
+ {0xDE82, 0x8FCB}, //16325 #CJK UNIFIED IDEOGRAPH
+ {0xDE83, 0x8FCC}, //16326 #CJK UNIFIED IDEOGRAPH
+ {0xDE84, 0x8FCD}, //16327 #CJK UNIFIED IDEOGRAPH
+ {0xDE85, 0x8FCF}, //16328 #CJK UNIFIED IDEOGRAPH
+ {0xDE86, 0x8FD2}, //16329 #CJK UNIFIED IDEOGRAPH
+ {0xDE87, 0x8FD6}, //16330 #CJK UNIFIED IDEOGRAPH
+ {0xDE88, 0x8FD7}, //16331 #CJK UNIFIED IDEOGRAPH
+ {0xDE89, 0x8FDA}, //16332 #CJK UNIFIED IDEOGRAPH
+ {0xDE8A, 0x8FE0}, //16333 #CJK UNIFIED IDEOGRAPH
+ {0xDE8B, 0x8FE1}, //16334 #CJK UNIFIED IDEOGRAPH
+ {0xDE8C, 0x8FE3}, //16335 #CJK UNIFIED IDEOGRAPH
+ {0xDE8D, 0x8FE7}, //16336 #CJK UNIFIED IDEOGRAPH
+ {0xDE8E, 0x8FEC}, //16337 #CJK UNIFIED IDEOGRAPH
+ {0xDE8F, 0x8FEF}, //16338 #CJK UNIFIED IDEOGRAPH
+ {0xDE90, 0x8FF1}, //16339 #CJK UNIFIED IDEOGRAPH
+ {0xDE91, 0x8FF2}, //16340 #CJK UNIFIED IDEOGRAPH
+ {0xDE92, 0x8FF4}, //16341 #CJK UNIFIED IDEOGRAPH
+ {0xDE93, 0x8FF5}, //16342 #CJK UNIFIED IDEOGRAPH
+ {0xDE94, 0x8FF6}, //16343 #CJK UNIFIED IDEOGRAPH
+ {0xDE95, 0x8FFA}, //16344 #CJK UNIFIED IDEOGRAPH
+ {0xDE96, 0x8FFB}, //16345 #CJK UNIFIED IDEOGRAPH
+ {0xDE97, 0x8FFC}, //16346 #CJK UNIFIED IDEOGRAPH
+ {0xDE98, 0x8FFE}, //16347 #CJK UNIFIED IDEOGRAPH
+ {0xDE99, 0x8FFF}, //16348 #CJK UNIFIED IDEOGRAPH
+ {0xDE9A, 0x9007}, //16349 #CJK UNIFIED IDEOGRAPH
+ {0xDE9B, 0x9008}, //16350 #CJK UNIFIED IDEOGRAPH
+ {0xDE9C, 0x900C}, //16351 #CJK UNIFIED IDEOGRAPH
+ {0xDE9D, 0x900E}, //16352 #CJK UNIFIED IDEOGRAPH
+ {0xDE9E, 0x9013}, //16353 #CJK UNIFIED IDEOGRAPH
+ {0xDE9F, 0x9015}, //16354 #CJK UNIFIED IDEOGRAPH
+ {0xDEA0, 0x9018}, //16355 #CJK UNIFIED IDEOGRAPH
+ {0xDEA1, 0x8556}, //16356 #CJK UNIFIED IDEOGRAPH
+ {0xDEA2, 0x853B}, //16357 #CJK UNIFIED IDEOGRAPH
+ {0xDEA3, 0x84FF}, //16358 #CJK UNIFIED IDEOGRAPH
+ {0xDEA4, 0x84FC}, //16359 #CJK UNIFIED IDEOGRAPH
+ {0xDEA5, 0x8559}, //16360 #CJK UNIFIED IDEOGRAPH
+ {0xDEA6, 0x8548}, //16361 #CJK UNIFIED IDEOGRAPH
+ {0xDEA7, 0x8568}, //16362 #CJK UNIFIED IDEOGRAPH
+ {0xDEA8, 0x8564}, //16363 #CJK UNIFIED IDEOGRAPH
+ {0xDEA9, 0x855E}, //16364 #CJK UNIFIED IDEOGRAPH
+ {0xDEAA, 0x857A}, //16365 #CJK UNIFIED IDEOGRAPH
+ {0xDEAB, 0x77A2}, //16366 #CJK UNIFIED IDEOGRAPH
+ {0xDEAC, 0x8543}, //16367 #CJK UNIFIED IDEOGRAPH
+ {0xDEAD, 0x8572}, //16368 #CJK UNIFIED IDEOGRAPH
+ {0xDEAE, 0x857B}, //16369 #CJK UNIFIED IDEOGRAPH
+ {0xDEAF, 0x85A4}, //16370 #CJK UNIFIED IDEOGRAPH
+ {0xDEB0, 0x85A8}, //16371 #CJK UNIFIED IDEOGRAPH
+ {0xDEB1, 0x8587}, //16372 #CJK UNIFIED IDEOGRAPH
+ {0xDEB2, 0x858F}, //16373 #CJK UNIFIED IDEOGRAPH
+ {0xDEB3, 0x8579}, //16374 #CJK UNIFIED IDEOGRAPH
+ {0xDEB4, 0x85AE}, //16375 #CJK UNIFIED IDEOGRAPH
+ {0xDEB5, 0x859C}, //16376 #CJK UNIFIED IDEOGRAPH
+ {0xDEB6, 0x8585}, //16377 #CJK UNIFIED IDEOGRAPH
+ {0xDEB7, 0x85B9}, //16378 #CJK UNIFIED IDEOGRAPH
+ {0xDEB8, 0x85B7}, //16379 #CJK UNIFIED IDEOGRAPH
+ {0xDEB9, 0x85B0}, //16380 #CJK UNIFIED IDEOGRAPH
+ {0xDEBA, 0x85D3}, //16381 #CJK UNIFIED IDEOGRAPH
+ {0xDEBB, 0x85C1}, //16382 #CJK UNIFIED IDEOGRAPH
+ {0xDEBC, 0x85DC}, //16383 #CJK UNIFIED IDEOGRAPH
+ {0xDEBD, 0x85FF}, //16384 #CJK UNIFIED IDEOGRAPH
+ {0xDEBE, 0x8627}, //16385 #CJK UNIFIED IDEOGRAPH
+ {0xDEBF, 0x8605}, //16386 #CJK UNIFIED IDEOGRAPH
+ {0xDEC0, 0x8629}, //16387 #CJK UNIFIED IDEOGRAPH
+ {0xDEC1, 0x8616}, //16388 #CJK UNIFIED IDEOGRAPH
+ {0xDEC2, 0x863C}, //16389 #CJK UNIFIED IDEOGRAPH
+ {0xDEC3, 0x5EFE}, //16390 #CJK UNIFIED IDEOGRAPH
+ {0xDEC4, 0x5F08}, //16391 #CJK UNIFIED IDEOGRAPH
+ {0xDEC5, 0x593C}, //16392 #CJK UNIFIED IDEOGRAPH
+ {0xDEC6, 0x5941}, //16393 #CJK UNIFIED IDEOGRAPH
+ {0xDEC7, 0x8037}, //16394 #CJK UNIFIED IDEOGRAPH
+ {0xDEC8, 0x5955}, //16395 #CJK UNIFIED IDEOGRAPH
+ {0xDEC9, 0x595A}, //16396 #CJK UNIFIED IDEOGRAPH
+ {0xDECA, 0x5958}, //16397 #CJK UNIFIED IDEOGRAPH
+ {0xDECB, 0x530F}, //16398 #CJK UNIFIED IDEOGRAPH
+ {0xDECC, 0x5C22}, //16399 #CJK UNIFIED IDEOGRAPH
+ {0xDECD, 0x5C25}, //16400 #CJK UNIFIED IDEOGRAPH
+ {0xDECE, 0x5C2C}, //16401 #CJK UNIFIED IDEOGRAPH
+ {0xDECF, 0x5C34}, //16402 #CJK UNIFIED IDEOGRAPH
+ {0xDED0, 0x624C}, //16403 #CJK UNIFIED IDEOGRAPH
+ {0xDED1, 0x626A}, //16404 #CJK UNIFIED IDEOGRAPH
+ {0xDED2, 0x629F}, //16405 #CJK UNIFIED IDEOGRAPH
+ {0xDED3, 0x62BB}, //16406 #CJK UNIFIED IDEOGRAPH
+ {0xDED4, 0x62CA}, //16407 #CJK UNIFIED IDEOGRAPH
+ {0xDED5, 0x62DA}, //16408 #CJK UNIFIED IDEOGRAPH
+ {0xDED6, 0x62D7}, //16409 #CJK UNIFIED IDEOGRAPH
+ {0xDED7, 0x62EE}, //16410 #CJK UNIFIED IDEOGRAPH
+ {0xDED8, 0x6322}, //16411 #CJK UNIFIED IDEOGRAPH
+ {0xDED9, 0x62F6}, //16412 #CJK UNIFIED IDEOGRAPH
+ {0xDEDA, 0x6339}, //16413 #CJK UNIFIED IDEOGRAPH
+ {0xDEDB, 0x634B}, //16414 #CJK UNIFIED IDEOGRAPH
+ {0xDEDC, 0x6343}, //16415 #CJK UNIFIED IDEOGRAPH
+ {0xDEDD, 0x63AD}, //16416 #CJK UNIFIED IDEOGRAPH
+ {0xDEDE, 0x63F6}, //16417 #CJK UNIFIED IDEOGRAPH
+ {0xDEDF, 0x6371}, //16418 #CJK UNIFIED IDEOGRAPH
+ {0xDEE0, 0x637A}, //16419 #CJK UNIFIED IDEOGRAPH
+ {0xDEE1, 0x638E}, //16420 #CJK UNIFIED IDEOGRAPH
+ {0xDEE2, 0x63B4}, //16421 #CJK UNIFIED IDEOGRAPH
+ {0xDEE3, 0x636D}, //16422 #CJK UNIFIED IDEOGRAPH
+ {0xDEE4, 0x63AC}, //16423 #CJK UNIFIED IDEOGRAPH
+ {0xDEE5, 0x638A}, //16424 #CJK UNIFIED IDEOGRAPH
+ {0xDEE6, 0x6369}, //16425 #CJK UNIFIED IDEOGRAPH
+ {0xDEE7, 0x63AE}, //16426 #CJK UNIFIED IDEOGRAPH
+ {0xDEE8, 0x63BC}, //16427 #CJK UNIFIED IDEOGRAPH
+ {0xDEE9, 0x63F2}, //16428 #CJK UNIFIED IDEOGRAPH
+ {0xDEEA, 0x63F8}, //16429 #CJK UNIFIED IDEOGRAPH
+ {0xDEEB, 0x63E0}, //16430 #CJK UNIFIED IDEOGRAPH
+ {0xDEEC, 0x63FF}, //16431 #CJK UNIFIED IDEOGRAPH
+ {0xDEED, 0x63C4}, //16432 #CJK UNIFIED IDEOGRAPH
+ {0xDEEE, 0x63DE}, //16433 #CJK UNIFIED IDEOGRAPH
+ {0xDEEF, 0x63CE}, //16434 #CJK UNIFIED IDEOGRAPH
+ {0xDEF0, 0x6452}, //16435 #CJK UNIFIED IDEOGRAPH
+ {0xDEF1, 0x63C6}, //16436 #CJK UNIFIED IDEOGRAPH
+ {0xDEF2, 0x63BE}, //16437 #CJK UNIFIED IDEOGRAPH
+ {0xDEF3, 0x6445}, //16438 #CJK UNIFIED IDEOGRAPH
+ {0xDEF4, 0x6441}, //16439 #CJK UNIFIED IDEOGRAPH
+ {0xDEF5, 0x640B}, //16440 #CJK UNIFIED IDEOGRAPH
+ {0xDEF6, 0x641B}, //16441 #CJK UNIFIED IDEOGRAPH
+ {0xDEF7, 0x6420}, //16442 #CJK UNIFIED IDEOGRAPH
+ {0xDEF8, 0x640C}, //16443 #CJK UNIFIED IDEOGRAPH
+ {0xDEF9, 0x6426}, //16444 #CJK UNIFIED IDEOGRAPH
+ {0xDEFA, 0x6421}, //16445 #CJK UNIFIED IDEOGRAPH
+ {0xDEFB, 0x645E}, //16446 #CJK UNIFIED IDEOGRAPH
+ {0xDEFC, 0x6484}, //16447 #CJK UNIFIED IDEOGRAPH
+ {0xDEFD, 0x646D}, //16448 #CJK UNIFIED IDEOGRAPH
+ {0xDEFE, 0x6496}, //16449 #CJK UNIFIED IDEOGRAPH
+ {0xDF40, 0x9019}, //16450 #CJK UNIFIED IDEOGRAPH
+ {0xDF41, 0x901C}, //16451 #CJK UNIFIED IDEOGRAPH
+ {0xDF42, 0x9023}, //16452 #CJK UNIFIED IDEOGRAPH
+ {0xDF43, 0x9024}, //16453 #CJK UNIFIED IDEOGRAPH
+ {0xDF44, 0x9025}, //16454 #CJK UNIFIED IDEOGRAPH
+ {0xDF45, 0x9027}, //16455 #CJK UNIFIED IDEOGRAPH
+ {0xDF46, 0x9028}, //16456 #CJK UNIFIED IDEOGRAPH
+ {0xDF47, 0x9029}, //16457 #CJK UNIFIED IDEOGRAPH
+ {0xDF48, 0x902A}, //16458 #CJK UNIFIED IDEOGRAPH
+ {0xDF49, 0x902B}, //16459 #CJK UNIFIED IDEOGRAPH
+ {0xDF4A, 0x902C}, //16460 #CJK UNIFIED IDEOGRAPH
+ {0xDF4B, 0x9030}, //16461 #CJK UNIFIED IDEOGRAPH
+ {0xDF4C, 0x9031}, //16462 #CJK UNIFIED IDEOGRAPH
+ {0xDF4D, 0x9032}, //16463 #CJK UNIFIED IDEOGRAPH
+ {0xDF4E, 0x9033}, //16464 #CJK UNIFIED IDEOGRAPH
+ {0xDF4F, 0x9034}, //16465 #CJK UNIFIED IDEOGRAPH
+ {0xDF50, 0x9037}, //16466 #CJK UNIFIED IDEOGRAPH
+ {0xDF51, 0x9039}, //16467 #CJK UNIFIED IDEOGRAPH
+ {0xDF52, 0x903A}, //16468 #CJK UNIFIED IDEOGRAPH
+ {0xDF53, 0x903D}, //16469 #CJK UNIFIED IDEOGRAPH
+ {0xDF54, 0x903F}, //16470 #CJK UNIFIED IDEOGRAPH
+ {0xDF55, 0x9040}, //16471 #CJK UNIFIED IDEOGRAPH
+ {0xDF56, 0x9043}, //16472 #CJK UNIFIED IDEOGRAPH
+ {0xDF57, 0x9045}, //16473 #CJK UNIFIED IDEOGRAPH
+ {0xDF58, 0x9046}, //16474 #CJK UNIFIED IDEOGRAPH
+ {0xDF59, 0x9048}, //16475 #CJK UNIFIED IDEOGRAPH
+ {0xDF5A, 0x9049}, //16476 #CJK UNIFIED IDEOGRAPH
+ {0xDF5B, 0x904A}, //16477 #CJK UNIFIED IDEOGRAPH
+ {0xDF5C, 0x904B}, //16478 #CJK UNIFIED IDEOGRAPH
+ {0xDF5D, 0x904C}, //16479 #CJK UNIFIED IDEOGRAPH
+ {0xDF5E, 0x904E}, //16480 #CJK UNIFIED IDEOGRAPH
+ {0xDF5F, 0x9054}, //16481 #CJK UNIFIED IDEOGRAPH
+ {0xDF60, 0x9055}, //16482 #CJK UNIFIED IDEOGRAPH
+ {0xDF61, 0x9056}, //16483 #CJK UNIFIED IDEOGRAPH
+ {0xDF62, 0x9059}, //16484 #CJK UNIFIED IDEOGRAPH
+ {0xDF63, 0x905A}, //16485 #CJK UNIFIED IDEOGRAPH
+ {0xDF64, 0x905C}, //16486 #CJK UNIFIED IDEOGRAPH
+ {0xDF65, 0x905D}, //16487 #CJK UNIFIED IDEOGRAPH
+ {0xDF66, 0x905E}, //16488 #CJK UNIFIED IDEOGRAPH
+ {0xDF67, 0x905F}, //16489 #CJK UNIFIED IDEOGRAPH
+ {0xDF68, 0x9060}, //16490 #CJK UNIFIED IDEOGRAPH
+ {0xDF69, 0x9061}, //16491 #CJK UNIFIED IDEOGRAPH
+ {0xDF6A, 0x9064}, //16492 #CJK UNIFIED IDEOGRAPH
+ {0xDF6B, 0x9066}, //16493 #CJK UNIFIED IDEOGRAPH
+ {0xDF6C, 0x9067}, //16494 #CJK UNIFIED IDEOGRAPH
+ {0xDF6D, 0x9069}, //16495 #CJK UNIFIED IDEOGRAPH
+ {0xDF6E, 0x906A}, //16496 #CJK UNIFIED IDEOGRAPH
+ {0xDF6F, 0x906B}, //16497 #CJK UNIFIED IDEOGRAPH
+ {0xDF70, 0x906C}, //16498 #CJK UNIFIED IDEOGRAPH
+ {0xDF71, 0x906F}, //16499 #CJK UNIFIED IDEOGRAPH
+ {0xDF72, 0x9070}, //16500 #CJK UNIFIED IDEOGRAPH
+ {0xDF73, 0x9071}, //16501 #CJK UNIFIED IDEOGRAPH
+ {0xDF74, 0x9072}, //16502 #CJK UNIFIED IDEOGRAPH
+ {0xDF75, 0x9073}, //16503 #CJK UNIFIED IDEOGRAPH
+ {0xDF76, 0x9076}, //16504 #CJK UNIFIED IDEOGRAPH
+ {0xDF77, 0x9077}, //16505 #CJK UNIFIED IDEOGRAPH
+ {0xDF78, 0x9078}, //16506 #CJK UNIFIED IDEOGRAPH
+ {0xDF79, 0x9079}, //16507 #CJK UNIFIED IDEOGRAPH
+ {0xDF7A, 0x907A}, //16508 #CJK UNIFIED IDEOGRAPH
+ {0xDF7B, 0x907B}, //16509 #CJK UNIFIED IDEOGRAPH
+ {0xDF7C, 0x907C}, //16510 #CJK UNIFIED IDEOGRAPH
+ {0xDF7D, 0x907E}, //16511 #CJK UNIFIED IDEOGRAPH
+ {0xDF7E, 0x9081}, //16512 #CJK UNIFIED IDEOGRAPH
+ {0xDF80, 0x9084}, //16513 #CJK UNIFIED IDEOGRAPH
+ {0xDF81, 0x9085}, //16514 #CJK UNIFIED IDEOGRAPH
+ {0xDF82, 0x9086}, //16515 #CJK UNIFIED IDEOGRAPH
+ {0xDF83, 0x9087}, //16516 #CJK UNIFIED IDEOGRAPH
+ {0xDF84, 0x9089}, //16517 #CJK UNIFIED IDEOGRAPH
+ {0xDF85, 0x908A}, //16518 #CJK UNIFIED IDEOGRAPH
+ {0xDF86, 0x908C}, //16519 #CJK UNIFIED IDEOGRAPH
+ {0xDF87, 0x908D}, //16520 #CJK UNIFIED IDEOGRAPH
+ {0xDF88, 0x908E}, //16521 #CJK UNIFIED IDEOGRAPH
+ {0xDF89, 0x908F}, //16522 #CJK UNIFIED IDEOGRAPH
+ {0xDF8A, 0x9090}, //16523 #CJK UNIFIED IDEOGRAPH
+ {0xDF8B, 0x9092}, //16524 #CJK UNIFIED IDEOGRAPH
+ {0xDF8C, 0x9094}, //16525 #CJK UNIFIED IDEOGRAPH
+ {0xDF8D, 0x9096}, //16526 #CJK UNIFIED IDEOGRAPH
+ {0xDF8E, 0x9098}, //16527 #CJK UNIFIED IDEOGRAPH
+ {0xDF8F, 0x909A}, //16528 #CJK UNIFIED IDEOGRAPH
+ {0xDF90, 0x909C}, //16529 #CJK UNIFIED IDEOGRAPH
+ {0xDF91, 0x909E}, //16530 #CJK UNIFIED IDEOGRAPH
+ {0xDF92, 0x909F}, //16531 #CJK UNIFIED IDEOGRAPH
+ {0xDF93, 0x90A0}, //16532 #CJK UNIFIED IDEOGRAPH
+ {0xDF94, 0x90A4}, //16533 #CJK UNIFIED IDEOGRAPH
+ {0xDF95, 0x90A5}, //16534 #CJK UNIFIED IDEOGRAPH
+ {0xDF96, 0x90A7}, //16535 #CJK UNIFIED IDEOGRAPH
+ {0xDF97, 0x90A8}, //16536 #CJK UNIFIED IDEOGRAPH
+ {0xDF98, 0x90A9}, //16537 #CJK UNIFIED IDEOGRAPH
+ {0xDF99, 0x90AB}, //16538 #CJK UNIFIED IDEOGRAPH
+ {0xDF9A, 0x90AD}, //16539 #CJK UNIFIED IDEOGRAPH
+ {0xDF9B, 0x90B2}, //16540 #CJK UNIFIED IDEOGRAPH
+ {0xDF9C, 0x90B7}, //16541 #CJK UNIFIED IDEOGRAPH
+ {0xDF9D, 0x90BC}, //16542 #CJK UNIFIED IDEOGRAPH
+ {0xDF9E, 0x90BD}, //16543 #CJK UNIFIED IDEOGRAPH
+ {0xDF9F, 0x90BF}, //16544 #CJK UNIFIED IDEOGRAPH
+ {0xDFA0, 0x90C0}, //16545 #CJK UNIFIED IDEOGRAPH
+ {0xDFA1, 0x647A}, //16546 #CJK UNIFIED IDEOGRAPH
+ {0xDFA2, 0x64B7}, //16547 #CJK UNIFIED IDEOGRAPH
+ {0xDFA3, 0x64B8}, //16548 #CJK UNIFIED IDEOGRAPH
+ {0xDFA4, 0x6499}, //16549 #CJK UNIFIED IDEOGRAPH
+ {0xDFA5, 0x64BA}, //16550 #CJK UNIFIED IDEOGRAPH
+ {0xDFA6, 0x64C0}, //16551 #CJK UNIFIED IDEOGRAPH
+ {0xDFA7, 0x64D0}, //16552 #CJK UNIFIED IDEOGRAPH
+ {0xDFA8, 0x64D7}, //16553 #CJK UNIFIED IDEOGRAPH
+ {0xDFA9, 0x64E4}, //16554 #CJK UNIFIED IDEOGRAPH
+ {0xDFAA, 0x64E2}, //16555 #CJK UNIFIED IDEOGRAPH
+ {0xDFAB, 0x6509}, //16556 #CJK UNIFIED IDEOGRAPH
+ {0xDFAC, 0x6525}, //16557 #CJK UNIFIED IDEOGRAPH
+ {0xDFAD, 0x652E}, //16558 #CJK UNIFIED IDEOGRAPH
+ {0xDFAE, 0x5F0B}, //16559 #CJK UNIFIED IDEOGRAPH
+ {0xDFAF, 0x5FD2}, //16560 #CJK UNIFIED IDEOGRAPH
+ {0xDFB0, 0x7519}, //16561 #CJK UNIFIED IDEOGRAPH
+ {0xDFB1, 0x5F11}, //16562 #CJK UNIFIED IDEOGRAPH
+ {0xDFB2, 0x535F}, //16563 #CJK UNIFIED IDEOGRAPH
+ {0xDFB3, 0x53F1}, //16564 #CJK UNIFIED IDEOGRAPH
+ {0xDFB4, 0x53FD}, //16565 #CJK UNIFIED IDEOGRAPH
+ {0xDFB5, 0x53E9}, //16566 #CJK UNIFIED IDEOGRAPH
+ {0xDFB6, 0x53E8}, //16567 #CJK UNIFIED IDEOGRAPH
+ {0xDFB7, 0x53FB}, //16568 #CJK UNIFIED IDEOGRAPH
+ {0xDFB8, 0x5412}, //16569 #CJK UNIFIED IDEOGRAPH
+ {0xDFB9, 0x5416}, //16570 #CJK UNIFIED IDEOGRAPH
+ {0xDFBA, 0x5406}, //16571 #CJK UNIFIED IDEOGRAPH
+ {0xDFBB, 0x544B}, //16572 #CJK UNIFIED IDEOGRAPH
+ {0xDFBC, 0x5452}, //16573 #CJK UNIFIED IDEOGRAPH
+ {0xDFBD, 0x5453}, //16574 #CJK UNIFIED IDEOGRAPH
+ {0xDFBE, 0x5454}, //16575 #CJK UNIFIED IDEOGRAPH
+ {0xDFBF, 0x5456}, //16576 #CJK UNIFIED IDEOGRAPH
+ {0xDFC0, 0x5443}, //16577 #CJK UNIFIED IDEOGRAPH
+ {0xDFC1, 0x5421}, //16578 #CJK UNIFIED IDEOGRAPH
+ {0xDFC2, 0x5457}, //16579 #CJK UNIFIED IDEOGRAPH
+ {0xDFC3, 0x5459}, //16580 #CJK UNIFIED IDEOGRAPH
+ {0xDFC4, 0x5423}, //16581 #CJK UNIFIED IDEOGRAPH
+ {0xDFC5, 0x5432}, //16582 #CJK UNIFIED IDEOGRAPH
+ {0xDFC6, 0x5482}, //16583 #CJK UNIFIED IDEOGRAPH
+ {0xDFC7, 0x5494}, //16584 #CJK UNIFIED IDEOGRAPH
+ {0xDFC8, 0x5477}, //16585 #CJK UNIFIED IDEOGRAPH
+ {0xDFC9, 0x5471}, //16586 #CJK UNIFIED IDEOGRAPH
+ {0xDFCA, 0x5464}, //16587 #CJK UNIFIED IDEOGRAPH
+ {0xDFCB, 0x549A}, //16588 #CJK UNIFIED IDEOGRAPH
+ {0xDFCC, 0x549B}, //16589 #CJK UNIFIED IDEOGRAPH
+ {0xDFCD, 0x5484}, //16590 #CJK UNIFIED IDEOGRAPH
+ {0xDFCE, 0x5476}, //16591 #CJK UNIFIED IDEOGRAPH
+ {0xDFCF, 0x5466}, //16592 #CJK UNIFIED IDEOGRAPH
+ {0xDFD0, 0x549D}, //16593 #CJK UNIFIED IDEOGRAPH
+ {0xDFD1, 0x54D0}, //16594 #CJK UNIFIED IDEOGRAPH
+ {0xDFD2, 0x54AD}, //16595 #CJK UNIFIED IDEOGRAPH
+ {0xDFD3, 0x54C2}, //16596 #CJK UNIFIED IDEOGRAPH
+ {0xDFD4, 0x54B4}, //16597 #CJK UNIFIED IDEOGRAPH
+ {0xDFD5, 0x54D2}, //16598 #CJK UNIFIED IDEOGRAPH
+ {0xDFD6, 0x54A7}, //16599 #CJK UNIFIED IDEOGRAPH
+ {0xDFD7, 0x54A6}, //16600 #CJK UNIFIED IDEOGRAPH
+ {0xDFD8, 0x54D3}, //16601 #CJK UNIFIED IDEOGRAPH
+ {0xDFD9, 0x54D4}, //16602 #CJK UNIFIED IDEOGRAPH
+ {0xDFDA, 0x5472}, //16603 #CJK UNIFIED IDEOGRAPH
+ {0xDFDB, 0x54A3}, //16604 #CJK UNIFIED IDEOGRAPH
+ {0xDFDC, 0x54D5}, //16605 #CJK UNIFIED IDEOGRAPH
+ {0xDFDD, 0x54BB}, //16606 #CJK UNIFIED IDEOGRAPH
+ {0xDFDE, 0x54BF}, //16607 #CJK UNIFIED IDEOGRAPH
+ {0xDFDF, 0x54CC}, //16608 #CJK UNIFIED IDEOGRAPH
+ {0xDFE0, 0x54D9}, //16609 #CJK UNIFIED IDEOGRAPH
+ {0xDFE1, 0x54DA}, //16610 #CJK UNIFIED IDEOGRAPH
+ {0xDFE2, 0x54DC}, //16611 #CJK UNIFIED IDEOGRAPH
+ {0xDFE3, 0x54A9}, //16612 #CJK UNIFIED IDEOGRAPH
+ {0xDFE4, 0x54AA}, //16613 #CJK UNIFIED IDEOGRAPH
+ {0xDFE5, 0x54A4}, //16614 #CJK UNIFIED IDEOGRAPH
+ {0xDFE6, 0x54DD}, //16615 #CJK UNIFIED IDEOGRAPH
+ {0xDFE7, 0x54CF}, //16616 #CJK UNIFIED IDEOGRAPH
+ {0xDFE8, 0x54DE}, //16617 #CJK UNIFIED IDEOGRAPH
+ {0xDFE9, 0x551B}, //16618 #CJK UNIFIED IDEOGRAPH
+ {0xDFEA, 0x54E7}, //16619 #CJK UNIFIED IDEOGRAPH
+ {0xDFEB, 0x5520}, //16620 #CJK UNIFIED IDEOGRAPH
+ {0xDFEC, 0x54FD}, //16621 #CJK UNIFIED IDEOGRAPH
+ {0xDFED, 0x5514}, //16622 #CJK UNIFIED IDEOGRAPH
+ {0xDFEE, 0x54F3}, //16623 #CJK UNIFIED IDEOGRAPH
+ {0xDFEF, 0x5522}, //16624 #CJK UNIFIED IDEOGRAPH
+ {0xDFF0, 0x5523}, //16625 #CJK UNIFIED IDEOGRAPH
+ {0xDFF1, 0x550F}, //16626 #CJK UNIFIED IDEOGRAPH
+ {0xDFF2, 0x5511}, //16627 #CJK UNIFIED IDEOGRAPH
+ {0xDFF3, 0x5527}, //16628 #CJK UNIFIED IDEOGRAPH
+ {0xDFF4, 0x552A}, //16629 #CJK UNIFIED IDEOGRAPH
+ {0xDFF5, 0x5567}, //16630 #CJK UNIFIED IDEOGRAPH
+ {0xDFF6, 0x558F}, //16631 #CJK UNIFIED IDEOGRAPH
+ {0xDFF7, 0x55B5}, //16632 #CJK UNIFIED IDEOGRAPH
+ {0xDFF8, 0x5549}, //16633 #CJK UNIFIED IDEOGRAPH
+ {0xDFF9, 0x556D}, //16634 #CJK UNIFIED IDEOGRAPH
+ {0xDFFA, 0x5541}, //16635 #CJK UNIFIED IDEOGRAPH
+ {0xDFFB, 0x5555}, //16636 #CJK UNIFIED IDEOGRAPH
+ {0xDFFC, 0x553F}, //16637 #CJK UNIFIED IDEOGRAPH
+ {0xDFFD, 0x5550}, //16638 #CJK UNIFIED IDEOGRAPH
+ {0xDFFE, 0x553C}, //16639 #CJK UNIFIED IDEOGRAPH
+ {0xE040, 0x90C2}, //16640 #CJK UNIFIED IDEOGRAPH
+ {0xE041, 0x90C3}, //16641 #CJK UNIFIED IDEOGRAPH
+ {0xE042, 0x90C6}, //16642 #CJK UNIFIED IDEOGRAPH
+ {0xE043, 0x90C8}, //16643 #CJK UNIFIED IDEOGRAPH
+ {0xE044, 0x90C9}, //16644 #CJK UNIFIED IDEOGRAPH
+ {0xE045, 0x90CB}, //16645 #CJK UNIFIED IDEOGRAPH
+ {0xE046, 0x90CC}, //16646 #CJK UNIFIED IDEOGRAPH
+ {0xE047, 0x90CD}, //16647 #CJK UNIFIED IDEOGRAPH
+ {0xE048, 0x90D2}, //16648 #CJK UNIFIED IDEOGRAPH
+ {0xE049, 0x90D4}, //16649 #CJK UNIFIED IDEOGRAPH
+ {0xE04A, 0x90D5}, //16650 #CJK UNIFIED IDEOGRAPH
+ {0xE04B, 0x90D6}, //16651 #CJK UNIFIED IDEOGRAPH
+ {0xE04C, 0x90D8}, //16652 #CJK UNIFIED IDEOGRAPH
+ {0xE04D, 0x90D9}, //16653 #CJK UNIFIED IDEOGRAPH
+ {0xE04E, 0x90DA}, //16654 #CJK UNIFIED IDEOGRAPH
+ {0xE04F, 0x90DE}, //16655 #CJK UNIFIED IDEOGRAPH
+ {0xE050, 0x90DF}, //16656 #CJK UNIFIED IDEOGRAPH
+ {0xE051, 0x90E0}, //16657 #CJK UNIFIED IDEOGRAPH
+ {0xE052, 0x90E3}, //16658 #CJK UNIFIED IDEOGRAPH
+ {0xE053, 0x90E4}, //16659 #CJK UNIFIED IDEOGRAPH
+ {0xE054, 0x90E5}, //16660 #CJK UNIFIED IDEOGRAPH
+ {0xE055, 0x90E9}, //16661 #CJK UNIFIED IDEOGRAPH
+ {0xE056, 0x90EA}, //16662 #CJK UNIFIED IDEOGRAPH
+ {0xE057, 0x90EC}, //16663 #CJK UNIFIED IDEOGRAPH
+ {0xE058, 0x90EE}, //16664 #CJK UNIFIED IDEOGRAPH
+ {0xE059, 0x90F0}, //16665 #CJK UNIFIED IDEOGRAPH
+ {0xE05A, 0x90F1}, //16666 #CJK UNIFIED IDEOGRAPH
+ {0xE05B, 0x90F2}, //16667 #CJK UNIFIED IDEOGRAPH
+ {0xE05C, 0x90F3}, //16668 #CJK UNIFIED IDEOGRAPH
+ {0xE05D, 0x90F5}, //16669 #CJK UNIFIED IDEOGRAPH
+ {0xE05E, 0x90F6}, //16670 #CJK UNIFIED IDEOGRAPH
+ {0xE05F, 0x90F7}, //16671 #CJK UNIFIED IDEOGRAPH
+ {0xE060, 0x90F9}, //16672 #CJK UNIFIED IDEOGRAPH
+ {0xE061, 0x90FA}, //16673 #CJK UNIFIED IDEOGRAPH
+ {0xE062, 0x90FB}, //16674 #CJK UNIFIED IDEOGRAPH
+ {0xE063, 0x90FC}, //16675 #CJK UNIFIED IDEOGRAPH
+ {0xE064, 0x90FF}, //16676 #CJK UNIFIED IDEOGRAPH
+ {0xE065, 0x9100}, //16677 #CJK UNIFIED IDEOGRAPH
+ {0xE066, 0x9101}, //16678 #CJK UNIFIED IDEOGRAPH
+ {0xE067, 0x9103}, //16679 #CJK UNIFIED IDEOGRAPH
+ {0xE068, 0x9105}, //16680 #CJK UNIFIED IDEOGRAPH
+ {0xE069, 0x9106}, //16681 #CJK UNIFIED IDEOGRAPH
+ {0xE06A, 0x9107}, //16682 #CJK UNIFIED IDEOGRAPH
+ {0xE06B, 0x9108}, //16683 #CJK UNIFIED IDEOGRAPH
+ {0xE06C, 0x9109}, //16684 #CJK UNIFIED IDEOGRAPH
+ {0xE06D, 0x910A}, //16685 #CJK UNIFIED IDEOGRAPH
+ {0xE06E, 0x910B}, //16686 #CJK UNIFIED IDEOGRAPH
+ {0xE06F, 0x910C}, //16687 #CJK UNIFIED IDEOGRAPH
+ {0xE070, 0x910D}, //16688 #CJK UNIFIED IDEOGRAPH
+ {0xE071, 0x910E}, //16689 #CJK UNIFIED IDEOGRAPH
+ {0xE072, 0x910F}, //16690 #CJK UNIFIED IDEOGRAPH
+ {0xE073, 0x9110}, //16691 #CJK UNIFIED IDEOGRAPH
+ {0xE074, 0x9111}, //16692 #CJK UNIFIED IDEOGRAPH
+ {0xE075, 0x9112}, //16693 #CJK UNIFIED IDEOGRAPH
+ {0xE076, 0x9113}, //16694 #CJK UNIFIED IDEOGRAPH
+ {0xE077, 0x9114}, //16695 #CJK UNIFIED IDEOGRAPH
+ {0xE078, 0x9115}, //16696 #CJK UNIFIED IDEOGRAPH
+ {0xE079, 0x9116}, //16697 #CJK UNIFIED IDEOGRAPH
+ {0xE07A, 0x9117}, //16698 #CJK UNIFIED IDEOGRAPH
+ {0xE07B, 0x9118}, //16699 #CJK UNIFIED IDEOGRAPH
+ {0xE07C, 0x911A}, //16700 #CJK UNIFIED IDEOGRAPH
+ {0xE07D, 0x911B}, //16701 #CJK UNIFIED IDEOGRAPH
+ {0xE07E, 0x911C}, //16702 #CJK UNIFIED IDEOGRAPH
+ {0xE080, 0x911D}, //16703 #CJK UNIFIED IDEOGRAPH
+ {0xE081, 0x911F}, //16704 #CJK UNIFIED IDEOGRAPH
+ {0xE082, 0x9120}, //16705 #CJK UNIFIED IDEOGRAPH
+ {0xE083, 0x9121}, //16706 #CJK UNIFIED IDEOGRAPH
+ {0xE084, 0x9124}, //16707 #CJK UNIFIED IDEOGRAPH
+ {0xE085, 0x9125}, //16708 #CJK UNIFIED IDEOGRAPH
+ {0xE086, 0x9126}, //16709 #CJK UNIFIED IDEOGRAPH
+ {0xE087, 0x9127}, //16710 #CJK UNIFIED IDEOGRAPH
+ {0xE088, 0x9128}, //16711 #CJK UNIFIED IDEOGRAPH
+ {0xE089, 0x9129}, //16712 #CJK UNIFIED IDEOGRAPH
+ {0xE08A, 0x912A}, //16713 #CJK UNIFIED IDEOGRAPH
+ {0xE08B, 0x912B}, //16714 #CJK UNIFIED IDEOGRAPH
+ {0xE08C, 0x912C}, //16715 #CJK UNIFIED IDEOGRAPH
+ {0xE08D, 0x912D}, //16716 #CJK UNIFIED IDEOGRAPH
+ {0xE08E, 0x912E}, //16717 #CJK UNIFIED IDEOGRAPH
+ {0xE08F, 0x9130}, //16718 #CJK UNIFIED IDEOGRAPH
+ {0xE090, 0x9132}, //16719 #CJK UNIFIED IDEOGRAPH
+ {0xE091, 0x9133}, //16720 #CJK UNIFIED IDEOGRAPH
+ {0xE092, 0x9134}, //16721 #CJK UNIFIED IDEOGRAPH
+ {0xE093, 0x9135}, //16722 #CJK UNIFIED IDEOGRAPH
+ {0xE094, 0x9136}, //16723 #CJK UNIFIED IDEOGRAPH
+ {0xE095, 0x9137}, //16724 #CJK UNIFIED IDEOGRAPH
+ {0xE096, 0x9138}, //16725 #CJK UNIFIED IDEOGRAPH
+ {0xE097, 0x913A}, //16726 #CJK UNIFIED IDEOGRAPH
+ {0xE098, 0x913B}, //16727 #CJK UNIFIED IDEOGRAPH
+ {0xE099, 0x913C}, //16728 #CJK UNIFIED IDEOGRAPH
+ {0xE09A, 0x913D}, //16729 #CJK UNIFIED IDEOGRAPH
+ {0xE09B, 0x913E}, //16730 #CJK UNIFIED IDEOGRAPH
+ {0xE09C, 0x913F}, //16731 #CJK UNIFIED IDEOGRAPH
+ {0xE09D, 0x9140}, //16732 #CJK UNIFIED IDEOGRAPH
+ {0xE09E, 0x9141}, //16733 #CJK UNIFIED IDEOGRAPH
+ {0xE09F, 0x9142}, //16734 #CJK UNIFIED IDEOGRAPH
+ {0xE0A0, 0x9144}, //16735 #CJK UNIFIED IDEOGRAPH
+ {0xE0A1, 0x5537}, //16736 #CJK UNIFIED IDEOGRAPH
+ {0xE0A2, 0x5556}, //16737 #CJK UNIFIED IDEOGRAPH
+ {0xE0A3, 0x5575}, //16738 #CJK UNIFIED IDEOGRAPH
+ {0xE0A4, 0x5576}, //16739 #CJK UNIFIED IDEOGRAPH
+ {0xE0A5, 0x5577}, //16740 #CJK UNIFIED IDEOGRAPH
+ {0xE0A6, 0x5533}, //16741 #CJK UNIFIED IDEOGRAPH
+ {0xE0A7, 0x5530}, //16742 #CJK UNIFIED IDEOGRAPH
+ {0xE0A8, 0x555C}, //16743 #CJK UNIFIED IDEOGRAPH
+ {0xE0A9, 0x558B}, //16744 #CJK UNIFIED IDEOGRAPH
+ {0xE0AA, 0x55D2}, //16745 #CJK UNIFIED IDEOGRAPH
+ {0xE0AB, 0x5583}, //16746 #CJK UNIFIED IDEOGRAPH
+ {0xE0AC, 0x55B1}, //16747 #CJK UNIFIED IDEOGRAPH
+ {0xE0AD, 0x55B9}, //16748 #CJK UNIFIED IDEOGRAPH
+ {0xE0AE, 0x5588}, //16749 #CJK UNIFIED IDEOGRAPH
+ {0xE0AF, 0x5581}, //16750 #CJK UNIFIED IDEOGRAPH
+ {0xE0B0, 0x559F}, //16751 #CJK UNIFIED IDEOGRAPH
+ {0xE0B1, 0x557E}, //16752 #CJK UNIFIED IDEOGRAPH
+ {0xE0B2, 0x55D6}, //16753 #CJK UNIFIED IDEOGRAPH
+ {0xE0B3, 0x5591}, //16754 #CJK UNIFIED IDEOGRAPH
+ {0xE0B4, 0x557B}, //16755 #CJK UNIFIED IDEOGRAPH
+ {0xE0B5, 0x55DF}, //16756 #CJK UNIFIED IDEOGRAPH
+ {0xE0B6, 0x55BD}, //16757 #CJK UNIFIED IDEOGRAPH
+ {0xE0B7, 0x55BE}, //16758 #CJK UNIFIED IDEOGRAPH
+ {0xE0B8, 0x5594}, //16759 #CJK UNIFIED IDEOGRAPH
+ {0xE0B9, 0x5599}, //16760 #CJK UNIFIED IDEOGRAPH
+ {0xE0BA, 0x55EA}, //16761 #CJK UNIFIED IDEOGRAPH
+ {0xE0BB, 0x55F7}, //16762 #CJK UNIFIED IDEOGRAPH
+ {0xE0BC, 0x55C9}, //16763 #CJK UNIFIED IDEOGRAPH
+ {0xE0BD, 0x561F}, //16764 #CJK UNIFIED IDEOGRAPH
+ {0xE0BE, 0x55D1}, //16765 #CJK UNIFIED IDEOGRAPH
+ {0xE0BF, 0x55EB}, //16766 #CJK UNIFIED IDEOGRAPH
+ {0xE0C0, 0x55EC}, //16767 #CJK UNIFIED IDEOGRAPH
+ {0xE0C1, 0x55D4}, //16768 #CJK UNIFIED IDEOGRAPH
+ {0xE0C2, 0x55E6}, //16769 #CJK UNIFIED IDEOGRAPH
+ {0xE0C3, 0x55DD}, //16770 #CJK UNIFIED IDEOGRAPH
+ {0xE0C4, 0x55C4}, //16771 #CJK UNIFIED IDEOGRAPH
+ {0xE0C5, 0x55EF}, //16772 #CJK UNIFIED IDEOGRAPH
+ {0xE0C6, 0x55E5}, //16773 #CJK UNIFIED IDEOGRAPH
+ {0xE0C7, 0x55F2}, //16774 #CJK UNIFIED IDEOGRAPH
+ {0xE0C8, 0x55F3}, //16775 #CJK UNIFIED IDEOGRAPH
+ {0xE0C9, 0x55CC}, //16776 #CJK UNIFIED IDEOGRAPH
+ {0xE0CA, 0x55CD}, //16777 #CJK UNIFIED IDEOGRAPH
+ {0xE0CB, 0x55E8}, //16778 #CJK UNIFIED IDEOGRAPH
+ {0xE0CC, 0x55F5}, //16779 #CJK UNIFIED IDEOGRAPH
+ {0xE0CD, 0x55E4}, //16780 #CJK UNIFIED IDEOGRAPH
+ {0xE0CE, 0x8F94}, //16781 #CJK UNIFIED IDEOGRAPH
+ {0xE0CF, 0x561E}, //16782 #CJK UNIFIED IDEOGRAPH
+ {0xE0D0, 0x5608}, //16783 #CJK UNIFIED IDEOGRAPH
+ {0xE0D1, 0x560C}, //16784 #CJK UNIFIED IDEOGRAPH
+ {0xE0D2, 0x5601}, //16785 #CJK UNIFIED IDEOGRAPH
+ {0xE0D3, 0x5624}, //16786 #CJK UNIFIED IDEOGRAPH
+ {0xE0D4, 0x5623}, //16787 #CJK UNIFIED IDEOGRAPH
+ {0xE0D5, 0x55FE}, //16788 #CJK UNIFIED IDEOGRAPH
+ {0xE0D6, 0x5600}, //16789 #CJK UNIFIED IDEOGRAPH
+ {0xE0D7, 0x5627}, //16790 #CJK UNIFIED IDEOGRAPH
+ {0xE0D8, 0x562D}, //16791 #CJK UNIFIED IDEOGRAPH
+ {0xE0D9, 0x5658}, //16792 #CJK UNIFIED IDEOGRAPH
+ {0xE0DA, 0x5639}, //16793 #CJK UNIFIED IDEOGRAPH
+ {0xE0DB, 0x5657}, //16794 #CJK UNIFIED IDEOGRAPH
+ {0xE0DC, 0x562C}, //16795 #CJK UNIFIED IDEOGRAPH
+ {0xE0DD, 0x564D}, //16796 #CJK UNIFIED IDEOGRAPH
+ {0xE0DE, 0x5662}, //16797 #CJK UNIFIED IDEOGRAPH
+ {0xE0DF, 0x5659}, //16798 #CJK UNIFIED IDEOGRAPH
+ {0xE0E0, 0x565C}, //16799 #CJK UNIFIED IDEOGRAPH
+ {0xE0E1, 0x564C}, //16800 #CJK UNIFIED IDEOGRAPH
+ {0xE0E2, 0x5654}, //16801 #CJK UNIFIED IDEOGRAPH
+ {0xE0E3, 0x5686}, //16802 #CJK UNIFIED IDEOGRAPH
+ {0xE0E4, 0x5664}, //16803 #CJK UNIFIED IDEOGRAPH
+ {0xE0E5, 0x5671}, //16804 #CJK UNIFIED IDEOGRAPH
+ {0xE0E6, 0x566B}, //16805 #CJK UNIFIED IDEOGRAPH
+ {0xE0E7, 0x567B}, //16806 #CJK UNIFIED IDEOGRAPH
+ {0xE0E8, 0x567C}, //16807 #CJK UNIFIED IDEOGRAPH
+ {0xE0E9, 0x5685}, //16808 #CJK UNIFIED IDEOGRAPH
+ {0xE0EA, 0x5693}, //16809 #CJK UNIFIED IDEOGRAPH
+ {0xE0EB, 0x56AF}, //16810 #CJK UNIFIED IDEOGRAPH
+ {0xE0EC, 0x56D4}, //16811 #CJK UNIFIED IDEOGRAPH
+ {0xE0ED, 0x56D7}, //16812 #CJK UNIFIED IDEOGRAPH
+ {0xE0EE, 0x56DD}, //16813 #CJK UNIFIED IDEOGRAPH
+ {0xE0EF, 0x56E1}, //16814 #CJK UNIFIED IDEOGRAPH
+ {0xE0F0, 0x56F5}, //16815 #CJK UNIFIED IDEOGRAPH
+ {0xE0F1, 0x56EB}, //16816 #CJK UNIFIED IDEOGRAPH
+ {0xE0F2, 0x56F9}, //16817 #CJK UNIFIED IDEOGRAPH
+ {0xE0F3, 0x56FF}, //16818 #CJK UNIFIED IDEOGRAPH
+ {0xE0F4, 0x5704}, //16819 #CJK UNIFIED IDEOGRAPH
+ {0xE0F5, 0x570A}, //16820 #CJK UNIFIED IDEOGRAPH
+ {0xE0F6, 0x5709}, //16821 #CJK UNIFIED IDEOGRAPH
+ {0xE0F7, 0x571C}, //16822 #CJK UNIFIED IDEOGRAPH
+ {0xE0F8, 0x5E0F}, //16823 #CJK UNIFIED IDEOGRAPH
+ {0xE0F9, 0x5E19}, //16824 #CJK UNIFIED IDEOGRAPH
+ {0xE0FA, 0x5E14}, //16825 #CJK UNIFIED IDEOGRAPH
+ {0xE0FB, 0x5E11}, //16826 #CJK UNIFIED IDEOGRAPH
+ {0xE0FC, 0x5E31}, //16827 #CJK UNIFIED IDEOGRAPH
+ {0xE0FD, 0x5E3B}, //16828 #CJK UNIFIED IDEOGRAPH
+ {0xE0FE, 0x5E3C}, //16829 #CJK UNIFIED IDEOGRAPH
+ {0xE140, 0x9145}, //16830 #CJK UNIFIED IDEOGRAPH
+ {0xE141, 0x9147}, //16831 #CJK UNIFIED IDEOGRAPH
+ {0xE142, 0x9148}, //16832 #CJK UNIFIED IDEOGRAPH
+ {0xE143, 0x9151}, //16833 #CJK UNIFIED IDEOGRAPH
+ {0xE144, 0x9153}, //16834 #CJK UNIFIED IDEOGRAPH
+ {0xE145, 0x9154}, //16835 #CJK UNIFIED IDEOGRAPH
+ {0xE146, 0x9155}, //16836 #CJK UNIFIED IDEOGRAPH
+ {0xE147, 0x9156}, //16837 #CJK UNIFIED IDEOGRAPH
+ {0xE148, 0x9158}, //16838 #CJK UNIFIED IDEOGRAPH
+ {0xE149, 0x9159}, //16839 #CJK UNIFIED IDEOGRAPH
+ {0xE14A, 0x915B}, //16840 #CJK UNIFIED IDEOGRAPH
+ {0xE14B, 0x915C}, //16841 #CJK UNIFIED IDEOGRAPH
+ {0xE14C, 0x915F}, //16842 #CJK UNIFIED IDEOGRAPH
+ {0xE14D, 0x9160}, //16843 #CJK UNIFIED IDEOGRAPH
+ {0xE14E, 0x9166}, //16844 #CJK UNIFIED IDEOGRAPH
+ {0xE14F, 0x9167}, //16845 #CJK UNIFIED IDEOGRAPH
+ {0xE150, 0x9168}, //16846 #CJK UNIFIED IDEOGRAPH
+ {0xE151, 0x916B}, //16847 #CJK UNIFIED IDEOGRAPH
+ {0xE152, 0x916D}, //16848 #CJK UNIFIED IDEOGRAPH
+ {0xE153, 0x9173}, //16849 #CJK UNIFIED IDEOGRAPH
+ {0xE154, 0x917A}, //16850 #CJK UNIFIED IDEOGRAPH
+ {0xE155, 0x917B}, //16851 #CJK UNIFIED IDEOGRAPH
+ {0xE156, 0x917C}, //16852 #CJK UNIFIED IDEOGRAPH
+ {0xE157, 0x9180}, //16853 #CJK UNIFIED IDEOGRAPH
+ {0xE158, 0x9181}, //16854 #CJK UNIFIED IDEOGRAPH
+ {0xE159, 0x9182}, //16855 #CJK UNIFIED IDEOGRAPH
+ {0xE15A, 0x9183}, //16856 #CJK UNIFIED IDEOGRAPH
+ {0xE15B, 0x9184}, //16857 #CJK UNIFIED IDEOGRAPH
+ {0xE15C, 0x9186}, //16858 #CJK UNIFIED IDEOGRAPH
+ {0xE15D, 0x9188}, //16859 #CJK UNIFIED IDEOGRAPH
+ {0xE15E, 0x918A}, //16860 #CJK UNIFIED IDEOGRAPH
+ {0xE15F, 0x918E}, //16861 #CJK UNIFIED IDEOGRAPH
+ {0xE160, 0x918F}, //16862 #CJK UNIFIED IDEOGRAPH
+ {0xE161, 0x9193}, //16863 #CJK UNIFIED IDEOGRAPH
+ {0xE162, 0x9194}, //16864 #CJK UNIFIED IDEOGRAPH
+ {0xE163, 0x9195}, //16865 #CJK UNIFIED IDEOGRAPH
+ {0xE164, 0x9196}, //16866 #CJK UNIFIED IDEOGRAPH
+ {0xE165, 0x9197}, //16867 #CJK UNIFIED IDEOGRAPH
+ {0xE166, 0x9198}, //16868 #CJK UNIFIED IDEOGRAPH
+ {0xE167, 0x9199}, //16869 #CJK UNIFIED IDEOGRAPH
+ {0xE168, 0x919C}, //16870 #CJK UNIFIED IDEOGRAPH
+ {0xE169, 0x919D}, //16871 #CJK UNIFIED IDEOGRAPH
+ {0xE16A, 0x919E}, //16872 #CJK UNIFIED IDEOGRAPH
+ {0xE16B, 0x919F}, //16873 #CJK UNIFIED IDEOGRAPH
+ {0xE16C, 0x91A0}, //16874 #CJK UNIFIED IDEOGRAPH
+ {0xE16D, 0x91A1}, //16875 #CJK UNIFIED IDEOGRAPH
+ {0xE16E, 0x91A4}, //16876 #CJK UNIFIED IDEOGRAPH
+ {0xE16F, 0x91A5}, //16877 #CJK UNIFIED IDEOGRAPH
+ {0xE170, 0x91A6}, //16878 #CJK UNIFIED IDEOGRAPH
+ {0xE171, 0x91A7}, //16879 #CJK UNIFIED IDEOGRAPH
+ {0xE172, 0x91A8}, //16880 #CJK UNIFIED IDEOGRAPH
+ {0xE173, 0x91A9}, //16881 #CJK UNIFIED IDEOGRAPH
+ {0xE174, 0x91AB}, //16882 #CJK UNIFIED IDEOGRAPH
+ {0xE175, 0x91AC}, //16883 #CJK UNIFIED IDEOGRAPH
+ {0xE176, 0x91B0}, //16884 #CJK UNIFIED IDEOGRAPH
+ {0xE177, 0x91B1}, //16885 #CJK UNIFIED IDEOGRAPH
+ {0xE178, 0x91B2}, //16886 #CJK UNIFIED IDEOGRAPH
+ {0xE179, 0x91B3}, //16887 #CJK UNIFIED IDEOGRAPH
+ {0xE17A, 0x91B6}, //16888 #CJK UNIFIED IDEOGRAPH
+ {0xE17B, 0x91B7}, //16889 #CJK UNIFIED IDEOGRAPH
+ {0xE17C, 0x91B8}, //16890 #CJK UNIFIED IDEOGRAPH
+ {0xE17D, 0x91B9}, //16891 #CJK UNIFIED IDEOGRAPH
+ {0xE17E, 0x91BB}, //16892 #CJK UNIFIED IDEOGRAPH
+ {0xE180, 0x91BC}, //16893 #CJK UNIFIED IDEOGRAPH
+ {0xE181, 0x91BD}, //16894 #CJK UNIFIED IDEOGRAPH
+ {0xE182, 0x91BE}, //16895 #CJK UNIFIED IDEOGRAPH
+ {0xE183, 0x91BF}, //16896 #CJK UNIFIED IDEOGRAPH
+ {0xE184, 0x91C0}, //16897 #CJK UNIFIED IDEOGRAPH
+ {0xE185, 0x91C1}, //16898 #CJK UNIFIED IDEOGRAPH
+ {0xE186, 0x91C2}, //16899 #CJK UNIFIED IDEOGRAPH
+ {0xE187, 0x91C3}, //16900 #CJK UNIFIED IDEOGRAPH
+ {0xE188, 0x91C4}, //16901 #CJK UNIFIED IDEOGRAPH
+ {0xE189, 0x91C5}, //16902 #CJK UNIFIED IDEOGRAPH
+ {0xE18A, 0x91C6}, //16903 #CJK UNIFIED IDEOGRAPH
+ {0xE18B, 0x91C8}, //16904 #CJK UNIFIED IDEOGRAPH
+ {0xE18C, 0x91CB}, //16905 #CJK UNIFIED IDEOGRAPH
+ {0xE18D, 0x91D0}, //16906 #CJK UNIFIED IDEOGRAPH
+ {0xE18E, 0x91D2}, //16907 #CJK UNIFIED IDEOGRAPH
+ {0xE18F, 0x91D3}, //16908 #CJK UNIFIED IDEOGRAPH
+ {0xE190, 0x91D4}, //16909 #CJK UNIFIED IDEOGRAPH
+ {0xE191, 0x91D5}, //16910 #CJK UNIFIED IDEOGRAPH
+ {0xE192, 0x91D6}, //16911 #CJK UNIFIED IDEOGRAPH
+ {0xE193, 0x91D7}, //16912 #CJK UNIFIED IDEOGRAPH
+ {0xE194, 0x91D8}, //16913 #CJK UNIFIED IDEOGRAPH
+ {0xE195, 0x91D9}, //16914 #CJK UNIFIED IDEOGRAPH
+ {0xE196, 0x91DA}, //16915 #CJK UNIFIED IDEOGRAPH
+ {0xE197, 0x91DB}, //16916 #CJK UNIFIED IDEOGRAPH
+ {0xE198, 0x91DD}, //16917 #CJK UNIFIED IDEOGRAPH
+ {0xE199, 0x91DE}, //16918 #CJK UNIFIED IDEOGRAPH
+ {0xE19A, 0x91DF}, //16919 #CJK UNIFIED IDEOGRAPH
+ {0xE19B, 0x91E0}, //16920 #CJK UNIFIED IDEOGRAPH
+ {0xE19C, 0x91E1}, //16921 #CJK UNIFIED IDEOGRAPH
+ {0xE19D, 0x91E2}, //16922 #CJK UNIFIED IDEOGRAPH
+ {0xE19E, 0x91E3}, //16923 #CJK UNIFIED IDEOGRAPH
+ {0xE19F, 0x91E4}, //16924 #CJK UNIFIED IDEOGRAPH
+ {0xE1A0, 0x91E5}, //16925 #CJK UNIFIED IDEOGRAPH
+ {0xE1A1, 0x5E37}, //16926 #CJK UNIFIED IDEOGRAPH
+ {0xE1A2, 0x5E44}, //16927 #CJK UNIFIED IDEOGRAPH
+ {0xE1A3, 0x5E54}, //16928 #CJK UNIFIED IDEOGRAPH
+ {0xE1A4, 0x5E5B}, //16929 #CJK UNIFIED IDEOGRAPH
+ {0xE1A5, 0x5E5E}, //16930 #CJK UNIFIED IDEOGRAPH
+ {0xE1A6, 0x5E61}, //16931 #CJK UNIFIED IDEOGRAPH
+ {0xE1A7, 0x5C8C}, //16932 #CJK UNIFIED IDEOGRAPH
+ {0xE1A8, 0x5C7A}, //16933 #CJK UNIFIED IDEOGRAPH
+ {0xE1A9, 0x5C8D}, //16934 #CJK UNIFIED IDEOGRAPH
+ {0xE1AA, 0x5C90}, //16935 #CJK UNIFIED IDEOGRAPH
+ {0xE1AB, 0x5C96}, //16936 #CJK UNIFIED IDEOGRAPH
+ {0xE1AC, 0x5C88}, //16937 #CJK UNIFIED IDEOGRAPH
+ {0xE1AD, 0x5C98}, //16938 #CJK UNIFIED IDEOGRAPH
+ {0xE1AE, 0x5C99}, //16939 #CJK UNIFIED IDEOGRAPH
+ {0xE1AF, 0x5C91}, //16940 #CJK UNIFIED IDEOGRAPH
+ {0xE1B0, 0x5C9A}, //16941 #CJK UNIFIED IDEOGRAPH
+ {0xE1B1, 0x5C9C}, //16942 #CJK UNIFIED IDEOGRAPH
+ {0xE1B2, 0x5CB5}, //16943 #CJK UNIFIED IDEOGRAPH
+ {0xE1B3, 0x5CA2}, //16944 #CJK UNIFIED IDEOGRAPH
+ {0xE1B4, 0x5CBD}, //16945 #CJK UNIFIED IDEOGRAPH
+ {0xE1B5, 0x5CAC}, //16946 #CJK UNIFIED IDEOGRAPH
+ {0xE1B6, 0x5CAB}, //16947 #CJK UNIFIED IDEOGRAPH
+ {0xE1B7, 0x5CB1}, //16948 #CJK UNIFIED IDEOGRAPH
+ {0xE1B8, 0x5CA3}, //16949 #CJK UNIFIED IDEOGRAPH
+ {0xE1B9, 0x5CC1}, //16950 #CJK UNIFIED IDEOGRAPH
+ {0xE1BA, 0x5CB7}, //16951 #CJK UNIFIED IDEOGRAPH
+ {0xE1BB, 0x5CC4}, //16952 #CJK UNIFIED IDEOGRAPH
+ {0xE1BC, 0x5CD2}, //16953 #CJK UNIFIED IDEOGRAPH
+ {0xE1BD, 0x5CE4}, //16954 #CJK UNIFIED IDEOGRAPH
+ {0xE1BE, 0x5CCB}, //16955 #CJK UNIFIED IDEOGRAPH
+ {0xE1BF, 0x5CE5}, //16956 #CJK UNIFIED IDEOGRAPH
+ {0xE1C0, 0x5D02}, //16957 #CJK UNIFIED IDEOGRAPH
+ {0xE1C1, 0x5D03}, //16958 #CJK UNIFIED IDEOGRAPH
+ {0xE1C2, 0x5D27}, //16959 #CJK UNIFIED IDEOGRAPH
+ {0xE1C3, 0x5D26}, //16960 #CJK UNIFIED IDEOGRAPH
+ {0xE1C4, 0x5D2E}, //16961 #CJK UNIFIED IDEOGRAPH
+ {0xE1C5, 0x5D24}, //16962 #CJK UNIFIED IDEOGRAPH
+ {0xE1C6, 0x5D1E}, //16963 #CJK UNIFIED IDEOGRAPH
+ {0xE1C7, 0x5D06}, //16964 #CJK UNIFIED IDEOGRAPH
+ {0xE1C8, 0x5D1B}, //16965 #CJK UNIFIED IDEOGRAPH
+ {0xE1C9, 0x5D58}, //16966 #CJK UNIFIED IDEOGRAPH
+ {0xE1CA, 0x5D3E}, //16967 #CJK UNIFIED IDEOGRAPH
+ {0xE1CB, 0x5D34}, //16968 #CJK UNIFIED IDEOGRAPH
+ {0xE1CC, 0x5D3D}, //16969 #CJK UNIFIED IDEOGRAPH
+ {0xE1CD, 0x5D6C}, //16970 #CJK UNIFIED IDEOGRAPH
+ {0xE1CE, 0x5D5B}, //16971 #CJK UNIFIED IDEOGRAPH
+ {0xE1CF, 0x5D6F}, //16972 #CJK UNIFIED IDEOGRAPH
+ {0xE1D0, 0x5D5D}, //16973 #CJK UNIFIED IDEOGRAPH
+ {0xE1D1, 0x5D6B}, //16974 #CJK UNIFIED IDEOGRAPH
+ {0xE1D2, 0x5D4B}, //16975 #CJK UNIFIED IDEOGRAPH
+ {0xE1D3, 0x5D4A}, //16976 #CJK UNIFIED IDEOGRAPH
+ {0xE1D4, 0x5D69}, //16977 #CJK UNIFIED IDEOGRAPH
+ {0xE1D5, 0x5D74}, //16978 #CJK UNIFIED IDEOGRAPH
+ {0xE1D6, 0x5D82}, //16979 #CJK UNIFIED IDEOGRAPH
+ {0xE1D7, 0x5D99}, //16980 #CJK UNIFIED IDEOGRAPH
+ {0xE1D8, 0x5D9D}, //16981 #CJK UNIFIED IDEOGRAPH
+ {0xE1D9, 0x8C73}, //16982 #CJK UNIFIED IDEOGRAPH
+ {0xE1DA, 0x5DB7}, //16983 #CJK UNIFIED IDEOGRAPH
+ {0xE1DB, 0x5DC5}, //16984 #CJK UNIFIED IDEOGRAPH
+ {0xE1DC, 0x5F73}, //16985 #CJK UNIFIED IDEOGRAPH
+ {0xE1DD, 0x5F77}, //16986 #CJK UNIFIED IDEOGRAPH
+ {0xE1DE, 0x5F82}, //16987 #CJK UNIFIED IDEOGRAPH
+ {0xE1DF, 0x5F87}, //16988 #CJK UNIFIED IDEOGRAPH
+ {0xE1E0, 0x5F89}, //16989 #CJK UNIFIED IDEOGRAPH
+ {0xE1E1, 0x5F8C}, //16990 #CJK UNIFIED IDEOGRAPH
+ {0xE1E2, 0x5F95}, //16991 #CJK UNIFIED IDEOGRAPH
+ {0xE1E3, 0x5F99}, //16992 #CJK UNIFIED IDEOGRAPH
+ {0xE1E4, 0x5F9C}, //16993 #CJK UNIFIED IDEOGRAPH
+ {0xE1E5, 0x5FA8}, //16994 #CJK UNIFIED IDEOGRAPH
+ {0xE1E6, 0x5FAD}, //16995 #CJK UNIFIED IDEOGRAPH
+ {0xE1E7, 0x5FB5}, //16996 #CJK UNIFIED IDEOGRAPH
+ {0xE1E8, 0x5FBC}, //16997 #CJK UNIFIED IDEOGRAPH
+ {0xE1E9, 0x8862}, //16998 #CJK UNIFIED IDEOGRAPH
+ {0xE1EA, 0x5F61}, //16999 #CJK UNIFIED IDEOGRAPH
+ {0xE1EB, 0x72AD}, //17000 #CJK UNIFIED IDEOGRAPH
+ {0xE1EC, 0x72B0}, //17001 #CJK UNIFIED IDEOGRAPH
+ {0xE1ED, 0x72B4}, //17002 #CJK UNIFIED IDEOGRAPH
+ {0xE1EE, 0x72B7}, //17003 #CJK UNIFIED IDEOGRAPH
+ {0xE1EF, 0x72B8}, //17004 #CJK UNIFIED IDEOGRAPH
+ {0xE1F0, 0x72C3}, //17005 #CJK UNIFIED IDEOGRAPH
+ {0xE1F1, 0x72C1}, //17006 #CJK UNIFIED IDEOGRAPH
+ {0xE1F2, 0x72CE}, //17007 #CJK UNIFIED IDEOGRAPH
+ {0xE1F3, 0x72CD}, //17008 #CJK UNIFIED IDEOGRAPH
+ {0xE1F4, 0x72D2}, //17009 #CJK UNIFIED IDEOGRAPH
+ {0xE1F5, 0x72E8}, //17010 #CJK UNIFIED IDEOGRAPH
+ {0xE1F6, 0x72EF}, //17011 #CJK UNIFIED IDEOGRAPH
+ {0xE1F7, 0x72E9}, //17012 #CJK UNIFIED IDEOGRAPH
+ {0xE1F8, 0x72F2}, //17013 #CJK UNIFIED IDEOGRAPH
+ {0xE1F9, 0x72F4}, //17014 #CJK UNIFIED IDEOGRAPH
+ {0xE1FA, 0x72F7}, //17015 #CJK UNIFIED IDEOGRAPH
+ {0xE1FB, 0x7301}, //17016 #CJK UNIFIED IDEOGRAPH
+ {0xE1FC, 0x72F3}, //17017 #CJK UNIFIED IDEOGRAPH
+ {0xE1FD, 0x7303}, //17018 #CJK UNIFIED IDEOGRAPH
+ {0xE1FE, 0x72FA}, //17019 #CJK UNIFIED IDEOGRAPH
+ {0xE240, 0x91E6}, //17020 #CJK UNIFIED IDEOGRAPH
+ {0xE241, 0x91E7}, //17021 #CJK UNIFIED IDEOGRAPH
+ {0xE242, 0x91E8}, //17022 #CJK UNIFIED IDEOGRAPH
+ {0xE243, 0x91E9}, //17023 #CJK UNIFIED IDEOGRAPH
+ {0xE244, 0x91EA}, //17024 #CJK UNIFIED IDEOGRAPH
+ {0xE245, 0x91EB}, //17025 #CJK UNIFIED IDEOGRAPH
+ {0xE246, 0x91EC}, //17026 #CJK UNIFIED IDEOGRAPH
+ {0xE247, 0x91ED}, //17027 #CJK UNIFIED IDEOGRAPH
+ {0xE248, 0x91EE}, //17028 #CJK UNIFIED IDEOGRAPH
+ {0xE249, 0x91EF}, //17029 #CJK UNIFIED IDEOGRAPH
+ {0xE24A, 0x91F0}, //17030 #CJK UNIFIED IDEOGRAPH
+ {0xE24B, 0x91F1}, //17031 #CJK UNIFIED IDEOGRAPH
+ {0xE24C, 0x91F2}, //17032 #CJK UNIFIED IDEOGRAPH
+ {0xE24D, 0x91F3}, //17033 #CJK UNIFIED IDEOGRAPH
+ {0xE24E, 0x91F4}, //17034 #CJK UNIFIED IDEOGRAPH
+ {0xE24F, 0x91F5}, //17035 #CJK UNIFIED IDEOGRAPH
+ {0xE250, 0x91F6}, //17036 #CJK UNIFIED IDEOGRAPH
+ {0xE251, 0x91F7}, //17037 #CJK UNIFIED IDEOGRAPH
+ {0xE252, 0x91F8}, //17038 #CJK UNIFIED IDEOGRAPH
+ {0xE253, 0x91F9}, //17039 #CJK UNIFIED IDEOGRAPH
+ {0xE254, 0x91FA}, //17040 #CJK UNIFIED IDEOGRAPH
+ {0xE255, 0x91FB}, //17041 #CJK UNIFIED IDEOGRAPH
+ {0xE256, 0x91FC}, //17042 #CJK UNIFIED IDEOGRAPH
+ {0xE257, 0x91FD}, //17043 #CJK UNIFIED IDEOGRAPH
+ {0xE258, 0x91FE}, //17044 #CJK UNIFIED IDEOGRAPH
+ {0xE259, 0x91FF}, //17045 #CJK UNIFIED IDEOGRAPH
+ {0xE25A, 0x9200}, //17046 #CJK UNIFIED IDEOGRAPH
+ {0xE25B, 0x9201}, //17047 #CJK UNIFIED IDEOGRAPH
+ {0xE25C, 0x9202}, //17048 #CJK UNIFIED IDEOGRAPH
+ {0xE25D, 0x9203}, //17049 #CJK UNIFIED IDEOGRAPH
+ {0xE25E, 0x9204}, //17050 #CJK UNIFIED IDEOGRAPH
+ {0xE25F, 0x9205}, //17051 #CJK UNIFIED IDEOGRAPH
+ {0xE260, 0x9206}, //17052 #CJK UNIFIED IDEOGRAPH
+ {0xE261, 0x9207}, //17053 #CJK UNIFIED IDEOGRAPH
+ {0xE262, 0x9208}, //17054 #CJK UNIFIED IDEOGRAPH
+ {0xE263, 0x9209}, //17055 #CJK UNIFIED IDEOGRAPH
+ {0xE264, 0x920A}, //17056 #CJK UNIFIED IDEOGRAPH
+ {0xE265, 0x920B}, //17057 #CJK UNIFIED IDEOGRAPH
+ {0xE266, 0x920C}, //17058 #CJK UNIFIED IDEOGRAPH
+ {0xE267, 0x920D}, //17059 #CJK UNIFIED IDEOGRAPH
+ {0xE268, 0x920E}, //17060 #CJK UNIFIED IDEOGRAPH
+ {0xE269, 0x920F}, //17061 #CJK UNIFIED IDEOGRAPH
+ {0xE26A, 0x9210}, //17062 #CJK UNIFIED IDEOGRAPH
+ {0xE26B, 0x9211}, //17063 #CJK UNIFIED IDEOGRAPH
+ {0xE26C, 0x9212}, //17064 #CJK UNIFIED IDEOGRAPH
+ {0xE26D, 0x9213}, //17065 #CJK UNIFIED IDEOGRAPH
+ {0xE26E, 0x9214}, //17066 #CJK UNIFIED IDEOGRAPH
+ {0xE26F, 0x9215}, //17067 #CJK UNIFIED IDEOGRAPH
+ {0xE270, 0x9216}, //17068 #CJK UNIFIED IDEOGRAPH
+ {0xE271, 0x9217}, //17069 #CJK UNIFIED IDEOGRAPH
+ {0xE272, 0x9218}, //17070 #CJK UNIFIED IDEOGRAPH
+ {0xE273, 0x9219}, //17071 #CJK UNIFIED IDEOGRAPH
+ {0xE274, 0x921A}, //17072 #CJK UNIFIED IDEOGRAPH
+ {0xE275, 0x921B}, //17073 #CJK UNIFIED IDEOGRAPH
+ {0xE276, 0x921C}, //17074 #CJK UNIFIED IDEOGRAPH
+ {0xE277, 0x921D}, //17075 #CJK UNIFIED IDEOGRAPH
+ {0xE278, 0x921E}, //17076 #CJK UNIFIED IDEOGRAPH
+ {0xE279, 0x921F}, //17077 #CJK UNIFIED IDEOGRAPH
+ {0xE27A, 0x9220}, //17078 #CJK UNIFIED IDEOGRAPH
+ {0xE27B, 0x9221}, //17079 #CJK UNIFIED IDEOGRAPH
+ {0xE27C, 0x9222}, //17080 #CJK UNIFIED IDEOGRAPH
+ {0xE27D, 0x9223}, //17081 #CJK UNIFIED IDEOGRAPH
+ {0xE27E, 0x9224}, //17082 #CJK UNIFIED IDEOGRAPH
+ {0xE280, 0x9225}, //17083 #CJK UNIFIED IDEOGRAPH
+ {0xE281, 0x9226}, //17084 #CJK UNIFIED IDEOGRAPH
+ {0xE282, 0x9227}, //17085 #CJK UNIFIED IDEOGRAPH
+ {0xE283, 0x9228}, //17086 #CJK UNIFIED IDEOGRAPH
+ {0xE284, 0x9229}, //17087 #CJK UNIFIED IDEOGRAPH
+ {0xE285, 0x922A}, //17088 #CJK UNIFIED IDEOGRAPH
+ {0xE286, 0x922B}, //17089 #CJK UNIFIED IDEOGRAPH
+ {0xE287, 0x922C}, //17090 #CJK UNIFIED IDEOGRAPH
+ {0xE288, 0x922D}, //17091 #CJK UNIFIED IDEOGRAPH
+ {0xE289, 0x922E}, //17092 #CJK UNIFIED IDEOGRAPH
+ {0xE28A, 0x922F}, //17093 #CJK UNIFIED IDEOGRAPH
+ {0xE28B, 0x9230}, //17094 #CJK UNIFIED IDEOGRAPH
+ {0xE28C, 0x9231}, //17095 #CJK UNIFIED IDEOGRAPH
+ {0xE28D, 0x9232}, //17096 #CJK UNIFIED IDEOGRAPH
+ {0xE28E, 0x9233}, //17097 #CJK UNIFIED IDEOGRAPH
+ {0xE28F, 0x9234}, //17098 #CJK UNIFIED IDEOGRAPH
+ {0xE290, 0x9235}, //17099 #CJK UNIFIED IDEOGRAPH
+ {0xE291, 0x9236}, //17100 #CJK UNIFIED IDEOGRAPH
+ {0xE292, 0x9237}, //17101 #CJK UNIFIED IDEOGRAPH
+ {0xE293, 0x9238}, //17102 #CJK UNIFIED IDEOGRAPH
+ {0xE294, 0x9239}, //17103 #CJK UNIFIED IDEOGRAPH
+ {0xE295, 0x923A}, //17104 #CJK UNIFIED IDEOGRAPH
+ {0xE296, 0x923B}, //17105 #CJK UNIFIED IDEOGRAPH
+ {0xE297, 0x923C}, //17106 #CJK UNIFIED IDEOGRAPH
+ {0xE298, 0x923D}, //17107 #CJK UNIFIED IDEOGRAPH
+ {0xE299, 0x923E}, //17108 #CJK UNIFIED IDEOGRAPH
+ {0xE29A, 0x923F}, //17109 #CJK UNIFIED IDEOGRAPH
+ {0xE29B, 0x9240}, //17110 #CJK UNIFIED IDEOGRAPH
+ {0xE29C, 0x9241}, //17111 #CJK UNIFIED IDEOGRAPH
+ {0xE29D, 0x9242}, //17112 #CJK UNIFIED IDEOGRAPH
+ {0xE29E, 0x9243}, //17113 #CJK UNIFIED IDEOGRAPH
+ {0xE29F, 0x9244}, //17114 #CJK UNIFIED IDEOGRAPH
+ {0xE2A0, 0x9245}, //17115 #CJK UNIFIED IDEOGRAPH
+ {0xE2A1, 0x72FB}, //17116 #CJK UNIFIED IDEOGRAPH
+ {0xE2A2, 0x7317}, //17117 #CJK UNIFIED IDEOGRAPH
+ {0xE2A3, 0x7313}, //17118 #CJK UNIFIED IDEOGRAPH
+ {0xE2A4, 0x7321}, //17119 #CJK UNIFIED IDEOGRAPH
+ {0xE2A5, 0x730A}, //17120 #CJK UNIFIED IDEOGRAPH
+ {0xE2A6, 0x731E}, //17121 #CJK UNIFIED IDEOGRAPH
+ {0xE2A7, 0x731D}, //17122 #CJK UNIFIED IDEOGRAPH
+ {0xE2A8, 0x7315}, //17123 #CJK UNIFIED IDEOGRAPH
+ {0xE2A9, 0x7322}, //17124 #CJK UNIFIED IDEOGRAPH
+ {0xE2AA, 0x7339}, //17125 #CJK UNIFIED IDEOGRAPH
+ {0xE2AB, 0x7325}, //17126 #CJK UNIFIED IDEOGRAPH
+ {0xE2AC, 0x732C}, //17127 #CJK UNIFIED IDEOGRAPH
+ {0xE2AD, 0x7338}, //17128 #CJK UNIFIED IDEOGRAPH
+ {0xE2AE, 0x7331}, //17129 #CJK UNIFIED IDEOGRAPH
+ {0xE2AF, 0x7350}, //17130 #CJK UNIFIED IDEOGRAPH
+ {0xE2B0, 0x734D}, //17131 #CJK UNIFIED IDEOGRAPH
+ {0xE2B1, 0x7357}, //17132 #CJK UNIFIED IDEOGRAPH
+ {0xE2B2, 0x7360}, //17133 #CJK UNIFIED IDEOGRAPH
+ {0xE2B3, 0x736C}, //17134 #CJK UNIFIED IDEOGRAPH
+ {0xE2B4, 0x736F}, //17135 #CJK UNIFIED IDEOGRAPH
+ {0xE2B5, 0x737E}, //17136 #CJK UNIFIED IDEOGRAPH
+ {0xE2B6, 0x821B}, //17137 #CJK UNIFIED IDEOGRAPH
+ {0xE2B7, 0x5925}, //17138 #CJK UNIFIED IDEOGRAPH
+ {0xE2B8, 0x98E7}, //17139 #CJK UNIFIED IDEOGRAPH
+ {0xE2B9, 0x5924}, //17140 #CJK UNIFIED IDEOGRAPH
+ {0xE2BA, 0x5902}, //17141 #CJK UNIFIED IDEOGRAPH
+ {0xE2BB, 0x9963}, //17142 #CJK UNIFIED IDEOGRAPH
+ {0xE2BC, 0x9967}, //17143 #CJK UNIFIED IDEOGRAPH
+ {0xE2BD, 0x9968}, //17144 #CJK UNIFIED IDEOGRAPH
+ {0xE2BE, 0x9969}, //17145 #CJK UNIFIED IDEOGRAPH
+ {0xE2BF, 0x996A}, //17146 #CJK UNIFIED IDEOGRAPH
+ {0xE2C0, 0x996B}, //17147 #CJK UNIFIED IDEOGRAPH
+ {0xE2C1, 0x996C}, //17148 #CJK UNIFIED IDEOGRAPH
+ {0xE2C2, 0x9974}, //17149 #CJK UNIFIED IDEOGRAPH
+ {0xE2C3, 0x9977}, //17150 #CJK UNIFIED IDEOGRAPH
+ {0xE2C4, 0x997D}, //17151 #CJK UNIFIED IDEOGRAPH
+ {0xE2C5, 0x9980}, //17152 #CJK UNIFIED IDEOGRAPH
+ {0xE2C6, 0x9984}, //17153 #CJK UNIFIED IDEOGRAPH
+ {0xE2C7, 0x9987}, //17154 #CJK UNIFIED IDEOGRAPH
+ {0xE2C8, 0x998A}, //17155 #CJK UNIFIED IDEOGRAPH
+ {0xE2C9, 0x998D}, //17156 #CJK UNIFIED IDEOGRAPH
+ {0xE2CA, 0x9990}, //17157 #CJK UNIFIED IDEOGRAPH
+ {0xE2CB, 0x9991}, //17158 #CJK UNIFIED IDEOGRAPH
+ {0xE2CC, 0x9993}, //17159 #CJK UNIFIED IDEOGRAPH
+ {0xE2CD, 0x9994}, //17160 #CJK UNIFIED IDEOGRAPH
+ {0xE2CE, 0x9995}, //17161 #CJK UNIFIED IDEOGRAPH
+ {0xE2CF, 0x5E80}, //17162 #CJK UNIFIED IDEOGRAPH
+ {0xE2D0, 0x5E91}, //17163 #CJK UNIFIED IDEOGRAPH
+ {0xE2D1, 0x5E8B}, //17164 #CJK UNIFIED IDEOGRAPH
+ {0xE2D2, 0x5E96}, //17165 #CJK UNIFIED IDEOGRAPH
+ {0xE2D3, 0x5EA5}, //17166 #CJK UNIFIED IDEOGRAPH
+ {0xE2D4, 0x5EA0}, //17167 #CJK UNIFIED IDEOGRAPH
+ {0xE2D5, 0x5EB9}, //17168 #CJK UNIFIED IDEOGRAPH
+ {0xE2D6, 0x5EB5}, //17169 #CJK UNIFIED IDEOGRAPH
+ {0xE2D7, 0x5EBE}, //17170 #CJK UNIFIED IDEOGRAPH
+ {0xE2D8, 0x5EB3}, //17171 #CJK UNIFIED IDEOGRAPH
+ {0xE2D9, 0x8D53}, //17172 #CJK UNIFIED IDEOGRAPH
+ {0xE2DA, 0x5ED2}, //17173 #CJK UNIFIED IDEOGRAPH
+ {0xE2DB, 0x5ED1}, //17174 #CJK UNIFIED IDEOGRAPH
+ {0xE2DC, 0x5EDB}, //17175 #CJK UNIFIED IDEOGRAPH
+ {0xE2DD, 0x5EE8}, //17176 #CJK UNIFIED IDEOGRAPH
+ {0xE2DE, 0x5EEA}, //17177 #CJK UNIFIED IDEOGRAPH
+ {0xE2DF, 0x81BA}, //17178 #CJK UNIFIED IDEOGRAPH
+ {0xE2E0, 0x5FC4}, //17179 #CJK UNIFIED IDEOGRAPH
+ {0xE2E1, 0x5FC9}, //17180 #CJK UNIFIED IDEOGRAPH
+ {0xE2E2, 0x5FD6}, //17181 #CJK UNIFIED IDEOGRAPH
+ {0xE2E3, 0x5FCF}, //17182 #CJK UNIFIED IDEOGRAPH
+ {0xE2E4, 0x6003}, //17183 #CJK UNIFIED IDEOGRAPH
+ {0xE2E5, 0x5FEE}, //17184 #CJK UNIFIED IDEOGRAPH
+ {0xE2E6, 0x6004}, //17185 #CJK UNIFIED IDEOGRAPH
+ {0xE2E7, 0x5FE1}, //17186 #CJK UNIFIED IDEOGRAPH
+ {0xE2E8, 0x5FE4}, //17187 #CJK UNIFIED IDEOGRAPH
+ {0xE2E9, 0x5FFE}, //17188 #CJK UNIFIED IDEOGRAPH
+ {0xE2EA, 0x6005}, //17189 #CJK UNIFIED IDEOGRAPH
+ {0xE2EB, 0x6006}, //17190 #CJK UNIFIED IDEOGRAPH
+ {0xE2EC, 0x5FEA}, //17191 #CJK UNIFIED IDEOGRAPH
+ {0xE2ED, 0x5FED}, //17192 #CJK UNIFIED IDEOGRAPH
+ {0xE2EE, 0x5FF8}, //17193 #CJK UNIFIED IDEOGRAPH
+ {0xE2EF, 0x6019}, //17194 #CJK UNIFIED IDEOGRAPH
+ {0xE2F0, 0x6035}, //17195 #CJK UNIFIED IDEOGRAPH
+ {0xE2F1, 0x6026}, //17196 #CJK UNIFIED IDEOGRAPH
+ {0xE2F2, 0x601B}, //17197 #CJK UNIFIED IDEOGRAPH
+ {0xE2F3, 0x600F}, //17198 #CJK UNIFIED IDEOGRAPH
+ {0xE2F4, 0x600D}, //17199 #CJK UNIFIED IDEOGRAPH
+ {0xE2F5, 0x6029}, //17200 #CJK UNIFIED IDEOGRAPH
+ {0xE2F6, 0x602B}, //17201 #CJK UNIFIED IDEOGRAPH
+ {0xE2F7, 0x600A}, //17202 #CJK UNIFIED IDEOGRAPH
+ {0xE2F8, 0x603F}, //17203 #CJK UNIFIED IDEOGRAPH
+ {0xE2F9, 0x6021}, //17204 #CJK UNIFIED IDEOGRAPH
+ {0xE2FA, 0x6078}, //17205 #CJK UNIFIED IDEOGRAPH
+ {0xE2FB, 0x6079}, //17206 #CJK UNIFIED IDEOGRAPH
+ {0xE2FC, 0x607B}, //17207 #CJK UNIFIED IDEOGRAPH
+ {0xE2FD, 0x607A}, //17208 #CJK UNIFIED IDEOGRAPH
+ {0xE2FE, 0x6042}, //17209 #CJK UNIFIED IDEOGRAPH
+ {0xE340, 0x9246}, //17210 #CJK UNIFIED IDEOGRAPH
+ {0xE341, 0x9247}, //17211 #CJK UNIFIED IDEOGRAPH
+ {0xE342, 0x9248}, //17212 #CJK UNIFIED IDEOGRAPH
+ {0xE343, 0x9249}, //17213 #CJK UNIFIED IDEOGRAPH
+ {0xE344, 0x924A}, //17214 #CJK UNIFIED IDEOGRAPH
+ {0xE345, 0x924B}, //17215 #CJK UNIFIED IDEOGRAPH
+ {0xE346, 0x924C}, //17216 #CJK UNIFIED IDEOGRAPH
+ {0xE347, 0x924D}, //17217 #CJK UNIFIED IDEOGRAPH
+ {0xE348, 0x924E}, //17218 #CJK UNIFIED IDEOGRAPH
+ {0xE349, 0x924F}, //17219 #CJK UNIFIED IDEOGRAPH
+ {0xE34A, 0x9250}, //17220 #CJK UNIFIED IDEOGRAPH
+ {0xE34B, 0x9251}, //17221 #CJK UNIFIED IDEOGRAPH
+ {0xE34C, 0x9252}, //17222 #CJK UNIFIED IDEOGRAPH
+ {0xE34D, 0x9253}, //17223 #CJK UNIFIED IDEOGRAPH
+ {0xE34E, 0x9254}, //17224 #CJK UNIFIED IDEOGRAPH
+ {0xE34F, 0x9255}, //17225 #CJK UNIFIED IDEOGRAPH
+ {0xE350, 0x9256}, //17226 #CJK UNIFIED IDEOGRAPH
+ {0xE351, 0x9257}, //17227 #CJK UNIFIED IDEOGRAPH
+ {0xE352, 0x9258}, //17228 #CJK UNIFIED IDEOGRAPH
+ {0xE353, 0x9259}, //17229 #CJK UNIFIED IDEOGRAPH
+ {0xE354, 0x925A}, //17230 #CJK UNIFIED IDEOGRAPH
+ {0xE355, 0x925B}, //17231 #CJK UNIFIED IDEOGRAPH
+ {0xE356, 0x925C}, //17232 #CJK UNIFIED IDEOGRAPH
+ {0xE357, 0x925D}, //17233 #CJK UNIFIED IDEOGRAPH
+ {0xE358, 0x925E}, //17234 #CJK UNIFIED IDEOGRAPH
+ {0xE359, 0x925F}, //17235 #CJK UNIFIED IDEOGRAPH
+ {0xE35A, 0x9260}, //17236 #CJK UNIFIED IDEOGRAPH
+ {0xE35B, 0x9261}, //17237 #CJK UNIFIED IDEOGRAPH
+ {0xE35C, 0x9262}, //17238 #CJK UNIFIED IDEOGRAPH
+ {0xE35D, 0x9263}, //17239 #CJK UNIFIED IDEOGRAPH
+ {0xE35E, 0x9264}, //17240 #CJK UNIFIED IDEOGRAPH
+ {0xE35F, 0x9265}, //17241 #CJK UNIFIED IDEOGRAPH
+ {0xE360, 0x9266}, //17242 #CJK UNIFIED IDEOGRAPH
+ {0xE361, 0x9267}, //17243 #CJK UNIFIED IDEOGRAPH
+ {0xE362, 0x9268}, //17244 #CJK UNIFIED IDEOGRAPH
+ {0xE363, 0x9269}, //17245 #CJK UNIFIED IDEOGRAPH
+ {0xE364, 0x926A}, //17246 #CJK UNIFIED IDEOGRAPH
+ {0xE365, 0x926B}, //17247 #CJK UNIFIED IDEOGRAPH
+ {0xE366, 0x926C}, //17248 #CJK UNIFIED IDEOGRAPH
+ {0xE367, 0x926D}, //17249 #CJK UNIFIED IDEOGRAPH
+ {0xE368, 0x926E}, //17250 #CJK UNIFIED IDEOGRAPH
+ {0xE369, 0x926F}, //17251 #CJK UNIFIED IDEOGRAPH
+ {0xE36A, 0x9270}, //17252 #CJK UNIFIED IDEOGRAPH
+ {0xE36B, 0x9271}, //17253 #CJK UNIFIED IDEOGRAPH
+ {0xE36C, 0x9272}, //17254 #CJK UNIFIED IDEOGRAPH
+ {0xE36D, 0x9273}, //17255 #CJK UNIFIED IDEOGRAPH
+ {0xE36E, 0x9275}, //17256 #CJK UNIFIED IDEOGRAPH
+ {0xE36F, 0x9276}, //17257 #CJK UNIFIED IDEOGRAPH
+ {0xE370, 0x9277}, //17258 #CJK UNIFIED IDEOGRAPH
+ {0xE371, 0x9278}, //17259 #CJK UNIFIED IDEOGRAPH
+ {0xE372, 0x9279}, //17260 #CJK UNIFIED IDEOGRAPH
+ {0xE373, 0x927A}, //17261 #CJK UNIFIED IDEOGRAPH
+ {0xE374, 0x927B}, //17262 #CJK UNIFIED IDEOGRAPH
+ {0xE375, 0x927C}, //17263 #CJK UNIFIED IDEOGRAPH
+ {0xE376, 0x927D}, //17264 #CJK UNIFIED IDEOGRAPH
+ {0xE377, 0x927E}, //17265 #CJK UNIFIED IDEOGRAPH
+ {0xE378, 0x927F}, //17266 #CJK UNIFIED IDEOGRAPH
+ {0xE379, 0x9280}, //17267 #CJK UNIFIED IDEOGRAPH
+ {0xE37A, 0x9281}, //17268 #CJK UNIFIED IDEOGRAPH
+ {0xE37B, 0x9282}, //17269 #CJK UNIFIED IDEOGRAPH
+ {0xE37C, 0x9283}, //17270 #CJK UNIFIED IDEOGRAPH
+ {0xE37D, 0x9284}, //17271 #CJK UNIFIED IDEOGRAPH
+ {0xE37E, 0x9285}, //17272 #CJK UNIFIED IDEOGRAPH
+ {0xE380, 0x9286}, //17273 #CJK UNIFIED IDEOGRAPH
+ {0xE381, 0x9287}, //17274 #CJK UNIFIED IDEOGRAPH
+ {0xE382, 0x9288}, //17275 #CJK UNIFIED IDEOGRAPH
+ {0xE383, 0x9289}, //17276 #CJK UNIFIED IDEOGRAPH
+ {0xE384, 0x928A}, //17277 #CJK UNIFIED IDEOGRAPH
+ {0xE385, 0x928B}, //17278 #CJK UNIFIED IDEOGRAPH
+ {0xE386, 0x928C}, //17279 #CJK UNIFIED IDEOGRAPH
+ {0xE387, 0x928D}, //17280 #CJK UNIFIED IDEOGRAPH
+ {0xE388, 0x928F}, //17281 #CJK UNIFIED IDEOGRAPH
+ {0xE389, 0x9290}, //17282 #CJK UNIFIED IDEOGRAPH
+ {0xE38A, 0x9291}, //17283 #CJK UNIFIED IDEOGRAPH
+ {0xE38B, 0x9292}, //17284 #CJK UNIFIED IDEOGRAPH
+ {0xE38C, 0x9293}, //17285 #CJK UNIFIED IDEOGRAPH
+ {0xE38D, 0x9294}, //17286 #CJK UNIFIED IDEOGRAPH
+ {0xE38E, 0x9295}, //17287 #CJK UNIFIED IDEOGRAPH
+ {0xE38F, 0x9296}, //17288 #CJK UNIFIED IDEOGRAPH
+ {0xE390, 0x9297}, //17289 #CJK UNIFIED IDEOGRAPH
+ {0xE391, 0x9298}, //17290 #CJK UNIFIED IDEOGRAPH
+ {0xE392, 0x9299}, //17291 #CJK UNIFIED IDEOGRAPH
+ {0xE393, 0x929A}, //17292 #CJK UNIFIED IDEOGRAPH
+ {0xE394, 0x929B}, //17293 #CJK UNIFIED IDEOGRAPH
+ {0xE395, 0x929C}, //17294 #CJK UNIFIED IDEOGRAPH
+ {0xE396, 0x929D}, //17295 #CJK UNIFIED IDEOGRAPH
+ {0xE397, 0x929E}, //17296 #CJK UNIFIED IDEOGRAPH
+ {0xE398, 0x929F}, //17297 #CJK UNIFIED IDEOGRAPH
+ {0xE399, 0x92A0}, //17298 #CJK UNIFIED IDEOGRAPH
+ {0xE39A, 0x92A1}, //17299 #CJK UNIFIED IDEOGRAPH
+ {0xE39B, 0x92A2}, //17300 #CJK UNIFIED IDEOGRAPH
+ {0xE39C, 0x92A3}, //17301 #CJK UNIFIED IDEOGRAPH
+ {0xE39D, 0x92A4}, //17302 #CJK UNIFIED IDEOGRAPH
+ {0xE39E, 0x92A5}, //17303 #CJK UNIFIED IDEOGRAPH
+ {0xE39F, 0x92A6}, //17304 #CJK UNIFIED IDEOGRAPH
+ {0xE3A0, 0x92A7}, //17305 #CJK UNIFIED IDEOGRAPH
+ {0xE3A1, 0x606A}, //17306 #CJK UNIFIED IDEOGRAPH
+ {0xE3A2, 0x607D}, //17307 #CJK UNIFIED IDEOGRAPH
+ {0xE3A3, 0x6096}, //17308 #CJK UNIFIED IDEOGRAPH
+ {0xE3A4, 0x609A}, //17309 #CJK UNIFIED IDEOGRAPH
+ {0xE3A5, 0x60AD}, //17310 #CJK UNIFIED IDEOGRAPH
+ {0xE3A6, 0x609D}, //17311 #CJK UNIFIED IDEOGRAPH
+ {0xE3A7, 0x6083}, //17312 #CJK UNIFIED IDEOGRAPH
+ {0xE3A8, 0x6092}, //17313 #CJK UNIFIED IDEOGRAPH
+ {0xE3A9, 0x608C}, //17314 #CJK UNIFIED IDEOGRAPH
+ {0xE3AA, 0x609B}, //17315 #CJK UNIFIED IDEOGRAPH
+ {0xE3AB, 0x60EC}, //17316 #CJK UNIFIED IDEOGRAPH
+ {0xE3AC, 0x60BB}, //17317 #CJK UNIFIED IDEOGRAPH
+ {0xE3AD, 0x60B1}, //17318 #CJK UNIFIED IDEOGRAPH
+ {0xE3AE, 0x60DD}, //17319 #CJK UNIFIED IDEOGRAPH
+ {0xE3AF, 0x60D8}, //17320 #CJK UNIFIED IDEOGRAPH
+ {0xE3B0, 0x60C6}, //17321 #CJK UNIFIED IDEOGRAPH
+ {0xE3B1, 0x60DA}, //17322 #CJK UNIFIED IDEOGRAPH
+ {0xE3B2, 0x60B4}, //17323 #CJK UNIFIED IDEOGRAPH
+ {0xE3B3, 0x6120}, //17324 #CJK UNIFIED IDEOGRAPH
+ {0xE3B4, 0x6126}, //17325 #CJK UNIFIED IDEOGRAPH
+ {0xE3B5, 0x6115}, //17326 #CJK UNIFIED IDEOGRAPH
+ {0xE3B6, 0x6123}, //17327 #CJK UNIFIED IDEOGRAPH
+ {0xE3B7, 0x60F4}, //17328 #CJK UNIFIED IDEOGRAPH
+ {0xE3B8, 0x6100}, //17329 #CJK UNIFIED IDEOGRAPH
+ {0xE3B9, 0x610E}, //17330 #CJK UNIFIED IDEOGRAPH
+ {0xE3BA, 0x612B}, //17331 #CJK UNIFIED IDEOGRAPH
+ {0xE3BB, 0x614A}, //17332 #CJK UNIFIED IDEOGRAPH
+ {0xE3BC, 0x6175}, //17333 #CJK UNIFIED IDEOGRAPH
+ {0xE3BD, 0x61AC}, //17334 #CJK UNIFIED IDEOGRAPH
+ {0xE3BE, 0x6194}, //17335 #CJK UNIFIED IDEOGRAPH
+ {0xE3BF, 0x61A7}, //17336 #CJK UNIFIED IDEOGRAPH
+ {0xE3C0, 0x61B7}, //17337 #CJK UNIFIED IDEOGRAPH
+ {0xE3C1, 0x61D4}, //17338 #CJK UNIFIED IDEOGRAPH
+ {0xE3C2, 0x61F5}, //17339 #CJK UNIFIED IDEOGRAPH
+ {0xE3C3, 0x5FDD}, //17340 #CJK UNIFIED IDEOGRAPH
+ {0xE3C4, 0x96B3}, //17341 #CJK UNIFIED IDEOGRAPH
+ {0xE3C5, 0x95E9}, //17342 #CJK UNIFIED IDEOGRAPH
+ {0xE3C6, 0x95EB}, //17343 #CJK UNIFIED IDEOGRAPH
+ {0xE3C7, 0x95F1}, //17344 #CJK UNIFIED IDEOGRAPH
+ {0xE3C8, 0x95F3}, //17345 #CJK UNIFIED IDEOGRAPH
+ {0xE3C9, 0x95F5}, //17346 #CJK UNIFIED IDEOGRAPH
+ {0xE3CA, 0x95F6}, //17347 #CJK UNIFIED IDEOGRAPH
+ {0xE3CB, 0x95FC}, //17348 #CJK UNIFIED IDEOGRAPH
+ {0xE3CC, 0x95FE}, //17349 #CJK UNIFIED IDEOGRAPH
+ {0xE3CD, 0x9603}, //17350 #CJK UNIFIED IDEOGRAPH
+ {0xE3CE, 0x9604}, //17351 #CJK UNIFIED IDEOGRAPH
+ {0xE3CF, 0x9606}, //17352 #CJK UNIFIED IDEOGRAPH
+ {0xE3D0, 0x9608}, //17353 #CJK UNIFIED IDEOGRAPH
+ {0xE3D1, 0x960A}, //17354 #CJK UNIFIED IDEOGRAPH
+ {0xE3D2, 0x960B}, //17355 #CJK UNIFIED IDEOGRAPH
+ {0xE3D3, 0x960C}, //17356 #CJK UNIFIED IDEOGRAPH
+ {0xE3D4, 0x960D}, //17357 #CJK UNIFIED IDEOGRAPH
+ {0xE3D5, 0x960F}, //17358 #CJK UNIFIED IDEOGRAPH
+ {0xE3D6, 0x9612}, //17359 #CJK UNIFIED IDEOGRAPH
+ {0xE3D7, 0x9615}, //17360 #CJK UNIFIED IDEOGRAPH
+ {0xE3D8, 0x9616}, //17361 #CJK UNIFIED IDEOGRAPH
+ {0xE3D9, 0x9617}, //17362 #CJK UNIFIED IDEOGRAPH
+ {0xE3DA, 0x9619}, //17363 #CJK UNIFIED IDEOGRAPH
+ {0xE3DB, 0x961A}, //17364 #CJK UNIFIED IDEOGRAPH
+ {0xE3DC, 0x4E2C}, //17365 #CJK UNIFIED IDEOGRAPH
+ {0xE3DD, 0x723F}, //17366 #CJK UNIFIED IDEOGRAPH
+ {0xE3DE, 0x6215}, //17367 #CJK UNIFIED IDEOGRAPH
+ {0xE3DF, 0x6C35}, //17368 #CJK UNIFIED IDEOGRAPH
+ {0xE3E0, 0x6C54}, //17369 #CJK UNIFIED IDEOGRAPH
+ {0xE3E1, 0x6C5C}, //17370 #CJK UNIFIED IDEOGRAPH
+ {0xE3E2, 0x6C4A}, //17371 #CJK UNIFIED IDEOGRAPH
+ {0xE3E3, 0x6CA3}, //17372 #CJK UNIFIED IDEOGRAPH
+ {0xE3E4, 0x6C85}, //17373 #CJK UNIFIED IDEOGRAPH
+ {0xE3E5, 0x6C90}, //17374 #CJK UNIFIED IDEOGRAPH
+ {0xE3E6, 0x6C94}, //17375 #CJK UNIFIED IDEOGRAPH
+ {0xE3E7, 0x6C8C}, //17376 #CJK UNIFIED IDEOGRAPH
+ {0xE3E8, 0x6C68}, //17377 #CJK UNIFIED IDEOGRAPH
+ {0xE3E9, 0x6C69}, //17378 #CJK UNIFIED IDEOGRAPH
+ {0xE3EA, 0x6C74}, //17379 #CJK UNIFIED IDEOGRAPH
+ {0xE3EB, 0x6C76}, //17380 #CJK UNIFIED IDEOGRAPH
+ {0xE3EC, 0x6C86}, //17381 #CJK UNIFIED IDEOGRAPH
+ {0xE3ED, 0x6CA9}, //17382 #CJK UNIFIED IDEOGRAPH
+ {0xE3EE, 0x6CD0}, //17383 #CJK UNIFIED IDEOGRAPH
+ {0xE3EF, 0x6CD4}, //17384 #CJK UNIFIED IDEOGRAPH
+ {0xE3F0, 0x6CAD}, //17385 #CJK UNIFIED IDEOGRAPH
+ {0xE3F1, 0x6CF7}, //17386 #CJK UNIFIED IDEOGRAPH
+ {0xE3F2, 0x6CF8}, //17387 #CJK UNIFIED IDEOGRAPH
+ {0xE3F3, 0x6CF1}, //17388 #CJK UNIFIED IDEOGRAPH
+ {0xE3F4, 0x6CD7}, //17389 #CJK UNIFIED IDEOGRAPH
+ {0xE3F5, 0x6CB2}, //17390 #CJK UNIFIED IDEOGRAPH
+ {0xE3F6, 0x6CE0}, //17391 #CJK UNIFIED IDEOGRAPH
+ {0xE3F7, 0x6CD6}, //17392 #CJK UNIFIED IDEOGRAPH
+ {0xE3F8, 0x6CFA}, //17393 #CJK UNIFIED IDEOGRAPH
+ {0xE3F9, 0x6CEB}, //17394 #CJK UNIFIED IDEOGRAPH
+ {0xE3FA, 0x6CEE}, //17395 #CJK UNIFIED IDEOGRAPH
+ {0xE3FB, 0x6CB1}, //17396 #CJK UNIFIED IDEOGRAPH
+ {0xE3FC, 0x6CD3}, //17397 #CJK UNIFIED IDEOGRAPH
+ {0xE3FD, 0x6CEF}, //17398 #CJK UNIFIED IDEOGRAPH
+ {0xE3FE, 0x6CFE}, //17399 #CJK UNIFIED IDEOGRAPH
+ {0xE440, 0x92A8}, //17400 #CJK UNIFIED IDEOGRAPH
+ {0xE441, 0x92A9}, //17401 #CJK UNIFIED IDEOGRAPH
+ {0xE442, 0x92AA}, //17402 #CJK UNIFIED IDEOGRAPH
+ {0xE443, 0x92AB}, //17403 #CJK UNIFIED IDEOGRAPH
+ {0xE444, 0x92AC}, //17404 #CJK UNIFIED IDEOGRAPH
+ {0xE445, 0x92AD}, //17405 #CJK UNIFIED IDEOGRAPH
+ {0xE446, 0x92AF}, //17406 #CJK UNIFIED IDEOGRAPH
+ {0xE447, 0x92B0}, //17407 #CJK UNIFIED IDEOGRAPH
+ {0xE448, 0x92B1}, //17408 #CJK UNIFIED IDEOGRAPH
+ {0xE449, 0x92B2}, //17409 #CJK UNIFIED IDEOGRAPH
+ {0xE44A, 0x92B3}, //17410 #CJK UNIFIED IDEOGRAPH
+ {0xE44B, 0x92B4}, //17411 #CJK UNIFIED IDEOGRAPH
+ {0xE44C, 0x92B5}, //17412 #CJK UNIFIED IDEOGRAPH
+ {0xE44D, 0x92B6}, //17413 #CJK UNIFIED IDEOGRAPH
+ {0xE44E, 0x92B7}, //17414 #CJK UNIFIED IDEOGRAPH
+ {0xE44F, 0x92B8}, //17415 #CJK UNIFIED IDEOGRAPH
+ {0xE450, 0x92B9}, //17416 #CJK UNIFIED IDEOGRAPH
+ {0xE451, 0x92BA}, //17417 #CJK UNIFIED IDEOGRAPH
+ {0xE452, 0x92BB}, //17418 #CJK UNIFIED IDEOGRAPH
+ {0xE453, 0x92BC}, //17419 #CJK UNIFIED IDEOGRAPH
+ {0xE454, 0x92BD}, //17420 #CJK UNIFIED IDEOGRAPH
+ {0xE455, 0x92BE}, //17421 #CJK UNIFIED IDEOGRAPH
+ {0xE456, 0x92BF}, //17422 #CJK UNIFIED IDEOGRAPH
+ {0xE457, 0x92C0}, //17423 #CJK UNIFIED IDEOGRAPH
+ {0xE458, 0x92C1}, //17424 #CJK UNIFIED IDEOGRAPH
+ {0xE459, 0x92C2}, //17425 #CJK UNIFIED IDEOGRAPH
+ {0xE45A, 0x92C3}, //17426 #CJK UNIFIED IDEOGRAPH
+ {0xE45B, 0x92C4}, //17427 #CJK UNIFIED IDEOGRAPH
+ {0xE45C, 0x92C5}, //17428 #CJK UNIFIED IDEOGRAPH
+ {0xE45D, 0x92C6}, //17429 #CJK UNIFIED IDEOGRAPH
+ {0xE45E, 0x92C7}, //17430 #CJK UNIFIED IDEOGRAPH
+ {0xE45F, 0x92C9}, //17431 #CJK UNIFIED IDEOGRAPH
+ {0xE460, 0x92CA}, //17432 #CJK UNIFIED IDEOGRAPH
+ {0xE461, 0x92CB}, //17433 #CJK UNIFIED IDEOGRAPH
+ {0xE462, 0x92CC}, //17434 #CJK UNIFIED IDEOGRAPH
+ {0xE463, 0x92CD}, //17435 #CJK UNIFIED IDEOGRAPH
+ {0xE464, 0x92CE}, //17436 #CJK UNIFIED IDEOGRAPH
+ {0xE465, 0x92CF}, //17437 #CJK UNIFIED IDEOGRAPH
+ {0xE466, 0x92D0}, //17438 #CJK UNIFIED IDEOGRAPH
+ {0xE467, 0x92D1}, //17439 #CJK UNIFIED IDEOGRAPH
+ {0xE468, 0x92D2}, //17440 #CJK UNIFIED IDEOGRAPH
+ {0xE469, 0x92D3}, //17441 #CJK UNIFIED IDEOGRAPH
+ {0xE46A, 0x92D4}, //17442 #CJK UNIFIED IDEOGRAPH
+ {0xE46B, 0x92D5}, //17443 #CJK UNIFIED IDEOGRAPH
+ {0xE46C, 0x92D6}, //17444 #CJK UNIFIED IDEOGRAPH
+ {0xE46D, 0x92D7}, //17445 #CJK UNIFIED IDEOGRAPH
+ {0xE46E, 0x92D8}, //17446 #CJK UNIFIED IDEOGRAPH
+ {0xE46F, 0x92D9}, //17447 #CJK UNIFIED IDEOGRAPH
+ {0xE470, 0x92DA}, //17448 #CJK UNIFIED IDEOGRAPH
+ {0xE471, 0x92DB}, //17449 #CJK UNIFIED IDEOGRAPH
+ {0xE472, 0x92DC}, //17450 #CJK UNIFIED IDEOGRAPH
+ {0xE473, 0x92DD}, //17451 #CJK UNIFIED IDEOGRAPH
+ {0xE474, 0x92DE}, //17452 #CJK UNIFIED IDEOGRAPH
+ {0xE475, 0x92DF}, //17453 #CJK UNIFIED IDEOGRAPH
+ {0xE476, 0x92E0}, //17454 #CJK UNIFIED IDEOGRAPH
+ {0xE477, 0x92E1}, //17455 #CJK UNIFIED IDEOGRAPH
+ {0xE478, 0x92E2}, //17456 #CJK UNIFIED IDEOGRAPH
+ {0xE479, 0x92E3}, //17457 #CJK UNIFIED IDEOGRAPH
+ {0xE47A, 0x92E4}, //17458 #CJK UNIFIED IDEOGRAPH
+ {0xE47B, 0x92E5}, //17459 #CJK UNIFIED IDEOGRAPH
+ {0xE47C, 0x92E6}, //17460 #CJK UNIFIED IDEOGRAPH
+ {0xE47D, 0x92E7}, //17461 #CJK UNIFIED IDEOGRAPH
+ {0xE47E, 0x92E8}, //17462 #CJK UNIFIED IDEOGRAPH
+ {0xE480, 0x92E9}, //17463 #CJK UNIFIED IDEOGRAPH
+ {0xE481, 0x92EA}, //17464 #CJK UNIFIED IDEOGRAPH
+ {0xE482, 0x92EB}, //17465 #CJK UNIFIED IDEOGRAPH
+ {0xE483, 0x92EC}, //17466 #CJK UNIFIED IDEOGRAPH
+ {0xE484, 0x92ED}, //17467 #CJK UNIFIED IDEOGRAPH
+ {0xE485, 0x92EE}, //17468 #CJK UNIFIED IDEOGRAPH
+ {0xE486, 0x92EF}, //17469 #CJK UNIFIED IDEOGRAPH
+ {0xE487, 0x92F0}, //17470 #CJK UNIFIED IDEOGRAPH
+ {0xE488, 0x92F1}, //17471 #CJK UNIFIED IDEOGRAPH
+ {0xE489, 0x92F2}, //17472 #CJK UNIFIED IDEOGRAPH
+ {0xE48A, 0x92F3}, //17473 #CJK UNIFIED IDEOGRAPH
+ {0xE48B, 0x92F4}, //17474 #CJK UNIFIED IDEOGRAPH
+ {0xE48C, 0x92F5}, //17475 #CJK UNIFIED IDEOGRAPH
+ {0xE48D, 0x92F6}, //17476 #CJK UNIFIED IDEOGRAPH
+ {0xE48E, 0x92F7}, //17477 #CJK UNIFIED IDEOGRAPH
+ {0xE48F, 0x92F8}, //17478 #CJK UNIFIED IDEOGRAPH
+ {0xE490, 0x92F9}, //17479 #CJK UNIFIED IDEOGRAPH
+ {0xE491, 0x92FA}, //17480 #CJK UNIFIED IDEOGRAPH
+ {0xE492, 0x92FB}, //17481 #CJK UNIFIED IDEOGRAPH
+ {0xE493, 0x92FC}, //17482 #CJK UNIFIED IDEOGRAPH
+ {0xE494, 0x92FD}, //17483 #CJK UNIFIED IDEOGRAPH
+ {0xE495, 0x92FE}, //17484 #CJK UNIFIED IDEOGRAPH
+ {0xE496, 0x92FF}, //17485 #CJK UNIFIED IDEOGRAPH
+ {0xE497, 0x9300}, //17486 #CJK UNIFIED IDEOGRAPH
+ {0xE498, 0x9301}, //17487 #CJK UNIFIED IDEOGRAPH
+ {0xE499, 0x9302}, //17488 #CJK UNIFIED IDEOGRAPH
+ {0xE49A, 0x9303}, //17489 #CJK UNIFIED IDEOGRAPH
+ {0xE49B, 0x9304}, //17490 #CJK UNIFIED IDEOGRAPH
+ {0xE49C, 0x9305}, //17491 #CJK UNIFIED IDEOGRAPH
+ {0xE49D, 0x9306}, //17492 #CJK UNIFIED IDEOGRAPH
+ {0xE49E, 0x9307}, //17493 #CJK UNIFIED IDEOGRAPH
+ {0xE49F, 0x9308}, //17494 #CJK UNIFIED IDEOGRAPH
+ {0xE4A0, 0x9309}, //17495 #CJK UNIFIED IDEOGRAPH
+ {0xE4A1, 0x6D39}, //17496 #CJK UNIFIED IDEOGRAPH
+ {0xE4A2, 0x6D27}, //17497 #CJK UNIFIED IDEOGRAPH
+ {0xE4A3, 0x6D0C}, //17498 #CJK UNIFIED IDEOGRAPH
+ {0xE4A4, 0x6D43}, //17499 #CJK UNIFIED IDEOGRAPH
+ {0xE4A5, 0x6D48}, //17500 #CJK UNIFIED IDEOGRAPH
+ {0xE4A6, 0x6D07}, //17501 #CJK UNIFIED IDEOGRAPH
+ {0xE4A7, 0x6D04}, //17502 #CJK UNIFIED IDEOGRAPH
+ {0xE4A8, 0x6D19}, //17503 #CJK UNIFIED IDEOGRAPH
+ {0xE4A9, 0x6D0E}, //17504 #CJK UNIFIED IDEOGRAPH
+ {0xE4AA, 0x6D2B}, //17505 #CJK UNIFIED IDEOGRAPH
+ {0xE4AB, 0x6D4D}, //17506 #CJK UNIFIED IDEOGRAPH
+ {0xE4AC, 0x6D2E}, //17507 #CJK UNIFIED IDEOGRAPH
+ {0xE4AD, 0x6D35}, //17508 #CJK UNIFIED IDEOGRAPH
+ {0xE4AE, 0x6D1A}, //17509 #CJK UNIFIED IDEOGRAPH
+ {0xE4AF, 0x6D4F}, //17510 #CJK UNIFIED IDEOGRAPH
+ {0xE4B0, 0x6D52}, //17511 #CJK UNIFIED IDEOGRAPH
+ {0xE4B1, 0x6D54}, //17512 #CJK UNIFIED IDEOGRAPH
+ {0xE4B2, 0x6D33}, //17513 #CJK UNIFIED IDEOGRAPH
+ {0xE4B3, 0x6D91}, //17514 #CJK UNIFIED IDEOGRAPH
+ {0xE4B4, 0x6D6F}, //17515 #CJK UNIFIED IDEOGRAPH
+ {0xE4B5, 0x6D9E}, //17516 #CJK UNIFIED IDEOGRAPH
+ {0xE4B6, 0x6DA0}, //17517 #CJK UNIFIED IDEOGRAPH
+ {0xE4B7, 0x6D5E}, //17518 #CJK UNIFIED IDEOGRAPH
+ {0xE4B8, 0x6D93}, //17519 #CJK UNIFIED IDEOGRAPH
+ {0xE4B9, 0x6D94}, //17520 #CJK UNIFIED IDEOGRAPH
+ {0xE4BA, 0x6D5C}, //17521 #CJK UNIFIED IDEOGRAPH
+ {0xE4BB, 0x6D60}, //17522 #CJK UNIFIED IDEOGRAPH
+ {0xE4BC, 0x6D7C}, //17523 #CJK UNIFIED IDEOGRAPH
+ {0xE4BD, 0x6D63}, //17524 #CJK UNIFIED IDEOGRAPH
+ {0xE4BE, 0x6E1A}, //17525 #CJK UNIFIED IDEOGRAPH
+ {0xE4BF, 0x6DC7}, //17526 #CJK UNIFIED IDEOGRAPH
+ {0xE4C0, 0x6DC5}, //17527 #CJK UNIFIED IDEOGRAPH
+ {0xE4C1, 0x6DDE}, //17528 #CJK UNIFIED IDEOGRAPH
+ {0xE4C2, 0x6E0E}, //17529 #CJK UNIFIED IDEOGRAPH
+ {0xE4C3, 0x6DBF}, //17530 #CJK UNIFIED IDEOGRAPH
+ {0xE4C4, 0x6DE0}, //17531 #CJK UNIFIED IDEOGRAPH
+ {0xE4C5, 0x6E11}, //17532 #CJK UNIFIED IDEOGRAPH
+ {0xE4C6, 0x6DE6}, //17533 #CJK UNIFIED IDEOGRAPH
+ {0xE4C7, 0x6DDD}, //17534 #CJK UNIFIED IDEOGRAPH
+ {0xE4C8, 0x6DD9}, //17535 #CJK UNIFIED IDEOGRAPH
+ {0xE4C9, 0x6E16}, //17536 #CJK UNIFIED IDEOGRAPH
+ {0xE4CA, 0x6DAB}, //17537 #CJK UNIFIED IDEOGRAPH
+ {0xE4CB, 0x6E0C}, //17538 #CJK UNIFIED IDEOGRAPH
+ {0xE4CC, 0x6DAE}, //17539 #CJK UNIFIED IDEOGRAPH
+ {0xE4CD, 0x6E2B}, //17540 #CJK UNIFIED IDEOGRAPH
+ {0xE4CE, 0x6E6E}, //17541 #CJK UNIFIED IDEOGRAPH
+ {0xE4CF, 0x6E4E}, //17542 #CJK UNIFIED IDEOGRAPH
+ {0xE4D0, 0x6E6B}, //17543 #CJK UNIFIED IDEOGRAPH
+ {0xE4D1, 0x6EB2}, //17544 #CJK UNIFIED IDEOGRAPH
+ {0xE4D2, 0x6E5F}, //17545 #CJK UNIFIED IDEOGRAPH
+ {0xE4D3, 0x6E86}, //17546 #CJK UNIFIED IDEOGRAPH
+ {0xE4D4, 0x6E53}, //17547 #CJK UNIFIED IDEOGRAPH
+ {0xE4D5, 0x6E54}, //17548 #CJK UNIFIED IDEOGRAPH
+ {0xE4D6, 0x6E32}, //17549 #CJK UNIFIED IDEOGRAPH
+ {0xE4D7, 0x6E25}, //17550 #CJK UNIFIED IDEOGRAPH
+ {0xE4D8, 0x6E44}, //17551 #CJK UNIFIED IDEOGRAPH
+ {0xE4D9, 0x6EDF}, //17552 #CJK UNIFIED IDEOGRAPH
+ {0xE4DA, 0x6EB1}, //17553 #CJK UNIFIED IDEOGRAPH
+ {0xE4DB, 0x6E98}, //17554 #CJK UNIFIED IDEOGRAPH
+ {0xE4DC, 0x6EE0}, //17555 #CJK UNIFIED IDEOGRAPH
+ {0xE4DD, 0x6F2D}, //17556 #CJK UNIFIED IDEOGRAPH
+ {0xE4DE, 0x6EE2}, //17557 #CJK UNIFIED IDEOGRAPH
+ {0xE4DF, 0x6EA5}, //17558 #CJK UNIFIED IDEOGRAPH
+ {0xE4E0, 0x6EA7}, //17559 #CJK UNIFIED IDEOGRAPH
+ {0xE4E1, 0x6EBD}, //17560 #CJK UNIFIED IDEOGRAPH
+ {0xE4E2, 0x6EBB}, //17561 #CJK UNIFIED IDEOGRAPH
+ {0xE4E3, 0x6EB7}, //17562 #CJK UNIFIED IDEOGRAPH
+ {0xE4E4, 0x6ED7}, //17563 #CJK UNIFIED IDEOGRAPH
+ {0xE4E5, 0x6EB4}, //17564 #CJK UNIFIED IDEOGRAPH
+ {0xE4E6, 0x6ECF}, //17565 #CJK UNIFIED IDEOGRAPH
+ {0xE4E7, 0x6E8F}, //17566 #CJK UNIFIED IDEOGRAPH
+ {0xE4E8, 0x6EC2}, //17567 #CJK UNIFIED IDEOGRAPH
+ {0xE4E9, 0x6E9F}, //17568 #CJK UNIFIED IDEOGRAPH
+ {0xE4EA, 0x6F62}, //17569 #CJK UNIFIED IDEOGRAPH
+ {0xE4EB, 0x6F46}, //17570 #CJK UNIFIED IDEOGRAPH
+ {0xE4EC, 0x6F47}, //17571 #CJK UNIFIED IDEOGRAPH
+ {0xE4ED, 0x6F24}, //17572 #CJK UNIFIED IDEOGRAPH
+ {0xE4EE, 0x6F15}, //17573 #CJK UNIFIED IDEOGRAPH
+ {0xE4EF, 0x6EF9}, //17574 #CJK UNIFIED IDEOGRAPH
+ {0xE4F0, 0x6F2F}, //17575 #CJK UNIFIED IDEOGRAPH
+ {0xE4F1, 0x6F36}, //17576 #CJK UNIFIED IDEOGRAPH
+ {0xE4F2, 0x6F4B}, //17577 #CJK UNIFIED IDEOGRAPH
+ {0xE4F3, 0x6F74}, //17578 #CJK UNIFIED IDEOGRAPH
+ {0xE4F4, 0x6F2A}, //17579 #CJK UNIFIED IDEOGRAPH
+ {0xE4F5, 0x6F09}, //17580 #CJK UNIFIED IDEOGRAPH
+ {0xE4F6, 0x6F29}, //17581 #CJK UNIFIED IDEOGRAPH
+ {0xE4F7, 0x6F89}, //17582 #CJK UNIFIED IDEOGRAPH
+ {0xE4F8, 0x6F8D}, //17583 #CJK UNIFIED IDEOGRAPH
+ {0xE4F9, 0x6F8C}, //17584 #CJK UNIFIED IDEOGRAPH
+ {0xE4FA, 0x6F78}, //17585 #CJK UNIFIED IDEOGRAPH
+ {0xE4FB, 0x6F72}, //17586 #CJK UNIFIED IDEOGRAPH
+ {0xE4FC, 0x6F7C}, //17587 #CJK UNIFIED IDEOGRAPH
+ {0xE4FD, 0x6F7A}, //17588 #CJK UNIFIED IDEOGRAPH
+ {0xE4FE, 0x6FD1}, //17589 #CJK UNIFIED IDEOGRAPH
+ {0xE540, 0x930A}, //17590 #CJK UNIFIED IDEOGRAPH
+ {0xE541, 0x930B}, //17591 #CJK UNIFIED IDEOGRAPH
+ {0xE542, 0x930C}, //17592 #CJK UNIFIED IDEOGRAPH
+ {0xE543, 0x930D}, //17593 #CJK UNIFIED IDEOGRAPH
+ {0xE544, 0x930E}, //17594 #CJK UNIFIED IDEOGRAPH
+ {0xE545, 0x930F}, //17595 #CJK UNIFIED IDEOGRAPH
+ {0xE546, 0x9310}, //17596 #CJK UNIFIED IDEOGRAPH
+ {0xE547, 0x9311}, //17597 #CJK UNIFIED IDEOGRAPH
+ {0xE548, 0x9312}, //17598 #CJK UNIFIED IDEOGRAPH
+ {0xE549, 0x9313}, //17599 #CJK UNIFIED IDEOGRAPH
+ {0xE54A, 0x9314}, //17600 #CJK UNIFIED IDEOGRAPH
+ {0xE54B, 0x9315}, //17601 #CJK UNIFIED IDEOGRAPH
+ {0xE54C, 0x9316}, //17602 #CJK UNIFIED IDEOGRAPH
+ {0xE54D, 0x9317}, //17603 #CJK UNIFIED IDEOGRAPH
+ {0xE54E, 0x9318}, //17604 #CJK UNIFIED IDEOGRAPH
+ {0xE54F, 0x9319}, //17605 #CJK UNIFIED IDEOGRAPH
+ {0xE550, 0x931A}, //17606 #CJK UNIFIED IDEOGRAPH
+ {0xE551, 0x931B}, //17607 #CJK UNIFIED IDEOGRAPH
+ {0xE552, 0x931C}, //17608 #CJK UNIFIED IDEOGRAPH
+ {0xE553, 0x931D}, //17609 #CJK UNIFIED IDEOGRAPH
+ {0xE554, 0x931E}, //17610 #CJK UNIFIED IDEOGRAPH
+ {0xE555, 0x931F}, //17611 #CJK UNIFIED IDEOGRAPH
+ {0xE556, 0x9320}, //17612 #CJK UNIFIED IDEOGRAPH
+ {0xE557, 0x9321}, //17613 #CJK UNIFIED IDEOGRAPH
+ {0xE558, 0x9322}, //17614 #CJK UNIFIED IDEOGRAPH
+ {0xE559, 0x9323}, //17615 #CJK UNIFIED IDEOGRAPH
+ {0xE55A, 0x9324}, //17616 #CJK UNIFIED IDEOGRAPH
+ {0xE55B, 0x9325}, //17617 #CJK UNIFIED IDEOGRAPH
+ {0xE55C, 0x9326}, //17618 #CJK UNIFIED IDEOGRAPH
+ {0xE55D, 0x9327}, //17619 #CJK UNIFIED IDEOGRAPH
+ {0xE55E, 0x9328}, //17620 #CJK UNIFIED IDEOGRAPH
+ {0xE55F, 0x9329}, //17621 #CJK UNIFIED IDEOGRAPH
+ {0xE560, 0x932A}, //17622 #CJK UNIFIED IDEOGRAPH
+ {0xE561, 0x932B}, //17623 #CJK UNIFIED IDEOGRAPH
+ {0xE562, 0x932C}, //17624 #CJK UNIFIED IDEOGRAPH
+ {0xE563, 0x932D}, //17625 #CJK UNIFIED IDEOGRAPH
+ {0xE564, 0x932E}, //17626 #CJK UNIFIED IDEOGRAPH
+ {0xE565, 0x932F}, //17627 #CJK UNIFIED IDEOGRAPH
+ {0xE566, 0x9330}, //17628 #CJK UNIFIED IDEOGRAPH
+ {0xE567, 0x9331}, //17629 #CJK UNIFIED IDEOGRAPH
+ {0xE568, 0x9332}, //17630 #CJK UNIFIED IDEOGRAPH
+ {0xE569, 0x9333}, //17631 #CJK UNIFIED IDEOGRAPH
+ {0xE56A, 0x9334}, //17632 #CJK UNIFIED IDEOGRAPH
+ {0xE56B, 0x9335}, //17633 #CJK UNIFIED IDEOGRAPH
+ {0xE56C, 0x9336}, //17634 #CJK UNIFIED IDEOGRAPH
+ {0xE56D, 0x9337}, //17635 #CJK UNIFIED IDEOGRAPH
+ {0xE56E, 0x9338}, //17636 #CJK UNIFIED IDEOGRAPH
+ {0xE56F, 0x9339}, //17637 #CJK UNIFIED IDEOGRAPH
+ {0xE570, 0x933A}, //17638 #CJK UNIFIED IDEOGRAPH
+ {0xE571, 0x933B}, //17639 #CJK UNIFIED IDEOGRAPH
+ {0xE572, 0x933C}, //17640 #CJK UNIFIED IDEOGRAPH
+ {0xE573, 0x933D}, //17641 #CJK UNIFIED IDEOGRAPH
+ {0xE574, 0x933F}, //17642 #CJK UNIFIED IDEOGRAPH
+ {0xE575, 0x9340}, //17643 #CJK UNIFIED IDEOGRAPH
+ {0xE576, 0x9341}, //17644 #CJK UNIFIED IDEOGRAPH
+ {0xE577, 0x9342}, //17645 #CJK UNIFIED IDEOGRAPH
+ {0xE578, 0x9343}, //17646 #CJK UNIFIED IDEOGRAPH
+ {0xE579, 0x9344}, //17647 #CJK UNIFIED IDEOGRAPH
+ {0xE57A, 0x9345}, //17648 #CJK UNIFIED IDEOGRAPH
+ {0xE57B, 0x9346}, //17649 #CJK UNIFIED IDEOGRAPH
+ {0xE57C, 0x9347}, //17650 #CJK UNIFIED IDEOGRAPH
+ {0xE57D, 0x9348}, //17651 #CJK UNIFIED IDEOGRAPH
+ {0xE57E, 0x9349}, //17652 #CJK UNIFIED IDEOGRAPH
+ {0xE580, 0x934A}, //17653 #CJK UNIFIED IDEOGRAPH
+ {0xE581, 0x934B}, //17654 #CJK UNIFIED IDEOGRAPH
+ {0xE582, 0x934C}, //17655 #CJK UNIFIED IDEOGRAPH
+ {0xE583, 0x934D}, //17656 #CJK UNIFIED IDEOGRAPH
+ {0xE584, 0x934E}, //17657 #CJK UNIFIED IDEOGRAPH
+ {0xE585, 0x934F}, //17658 #CJK UNIFIED IDEOGRAPH
+ {0xE586, 0x9350}, //17659 #CJK UNIFIED IDEOGRAPH
+ {0xE587, 0x9351}, //17660 #CJK UNIFIED IDEOGRAPH
+ {0xE588, 0x9352}, //17661 #CJK UNIFIED IDEOGRAPH
+ {0xE589, 0x9353}, //17662 #CJK UNIFIED IDEOGRAPH
+ {0xE58A, 0x9354}, //17663 #CJK UNIFIED IDEOGRAPH
+ {0xE58B, 0x9355}, //17664 #CJK UNIFIED IDEOGRAPH
+ {0xE58C, 0x9356}, //17665 #CJK UNIFIED IDEOGRAPH
+ {0xE58D, 0x9357}, //17666 #CJK UNIFIED IDEOGRAPH
+ {0xE58E, 0x9358}, //17667 #CJK UNIFIED IDEOGRAPH
+ {0xE58F, 0x9359}, //17668 #CJK UNIFIED IDEOGRAPH
+ {0xE590, 0x935A}, //17669 #CJK UNIFIED IDEOGRAPH
+ {0xE591, 0x935B}, //17670 #CJK UNIFIED IDEOGRAPH
+ {0xE592, 0x935C}, //17671 #CJK UNIFIED IDEOGRAPH
+ {0xE593, 0x935D}, //17672 #CJK UNIFIED IDEOGRAPH
+ {0xE594, 0x935E}, //17673 #CJK UNIFIED IDEOGRAPH
+ {0xE595, 0x935F}, //17674 #CJK UNIFIED IDEOGRAPH
+ {0xE596, 0x9360}, //17675 #CJK UNIFIED IDEOGRAPH
+ {0xE597, 0x9361}, //17676 #CJK UNIFIED IDEOGRAPH
+ {0xE598, 0x9362}, //17677 #CJK UNIFIED IDEOGRAPH
+ {0xE599, 0x9363}, //17678 #CJK UNIFIED IDEOGRAPH
+ {0xE59A, 0x9364}, //17679 #CJK UNIFIED IDEOGRAPH
+ {0xE59B, 0x9365}, //17680 #CJK UNIFIED IDEOGRAPH
+ {0xE59C, 0x9366}, //17681 #CJK UNIFIED IDEOGRAPH
+ {0xE59D, 0x9367}, //17682 #CJK UNIFIED IDEOGRAPH
+ {0xE59E, 0x9368}, //17683 #CJK UNIFIED IDEOGRAPH
+ {0xE59F, 0x9369}, //17684 #CJK UNIFIED IDEOGRAPH
+ {0xE5A0, 0x936B}, //17685 #CJK UNIFIED IDEOGRAPH
+ {0xE5A1, 0x6FC9}, //17686 #CJK UNIFIED IDEOGRAPH
+ {0xE5A2, 0x6FA7}, //17687 #CJK UNIFIED IDEOGRAPH
+ {0xE5A3, 0x6FB9}, //17688 #CJK UNIFIED IDEOGRAPH
+ {0xE5A4, 0x6FB6}, //17689 #CJK UNIFIED IDEOGRAPH
+ {0xE5A5, 0x6FC2}, //17690 #CJK UNIFIED IDEOGRAPH
+ {0xE5A6, 0x6FE1}, //17691 #CJK UNIFIED IDEOGRAPH
+ {0xE5A7, 0x6FEE}, //17692 #CJK UNIFIED IDEOGRAPH
+ {0xE5A8, 0x6FDE}, //17693 #CJK UNIFIED IDEOGRAPH
+ {0xE5A9, 0x6FE0}, //17694 #CJK UNIFIED IDEOGRAPH
+ {0xE5AA, 0x6FEF}, //17695 #CJK UNIFIED IDEOGRAPH
+ {0xE5AB, 0x701A}, //17696 #CJK UNIFIED IDEOGRAPH
+ {0xE5AC, 0x7023}, //17697 #CJK UNIFIED IDEOGRAPH
+ {0xE5AD, 0x701B}, //17698 #CJK UNIFIED IDEOGRAPH
+ {0xE5AE, 0x7039}, //17699 #CJK UNIFIED IDEOGRAPH
+ {0xE5AF, 0x7035}, //17700 #CJK UNIFIED IDEOGRAPH
+ {0xE5B0, 0x704F}, //17701 #CJK UNIFIED IDEOGRAPH
+ {0xE5B1, 0x705E}, //17702 #CJK UNIFIED IDEOGRAPH
+ {0xE5B2, 0x5B80}, //17703 #CJK UNIFIED IDEOGRAPH
+ {0xE5B3, 0x5B84}, //17704 #CJK UNIFIED IDEOGRAPH
+ {0xE5B4, 0x5B95}, //17705 #CJK UNIFIED IDEOGRAPH
+ {0xE5B5, 0x5B93}, //17706 #CJK UNIFIED IDEOGRAPH
+ {0xE5B6, 0x5BA5}, //17707 #CJK UNIFIED IDEOGRAPH
+ {0xE5B7, 0x5BB8}, //17708 #CJK UNIFIED IDEOGRAPH
+ {0xE5B8, 0x752F}, //17709 #CJK UNIFIED IDEOGRAPH
+ {0xE5B9, 0x9A9E}, //17710 #CJK UNIFIED IDEOGRAPH
+ {0xE5BA, 0x6434}, //17711 #CJK UNIFIED IDEOGRAPH
+ {0xE5BB, 0x5BE4}, //17712 #CJK UNIFIED IDEOGRAPH
+ {0xE5BC, 0x5BEE}, //17713 #CJK UNIFIED IDEOGRAPH
+ {0xE5BD, 0x8930}, //17714 #CJK UNIFIED IDEOGRAPH
+ {0xE5BE, 0x5BF0}, //17715 #CJK UNIFIED IDEOGRAPH
+ {0xE5BF, 0x8E47}, //17716 #CJK UNIFIED IDEOGRAPH
+ {0xE5C0, 0x8B07}, //17717 #CJK UNIFIED IDEOGRAPH
+ {0xE5C1, 0x8FB6}, //17718 #CJK UNIFIED IDEOGRAPH
+ {0xE5C2, 0x8FD3}, //17719 #CJK UNIFIED IDEOGRAPH
+ {0xE5C3, 0x8FD5}, //17720 #CJK UNIFIED IDEOGRAPH
+ {0xE5C4, 0x8FE5}, //17721 #CJK UNIFIED IDEOGRAPH
+ {0xE5C5, 0x8FEE}, //17722 #CJK UNIFIED IDEOGRAPH
+ {0xE5C6, 0x8FE4}, //17723 #CJK UNIFIED IDEOGRAPH
+ {0xE5C7, 0x8FE9}, //17724 #CJK UNIFIED IDEOGRAPH
+ {0xE5C8, 0x8FE6}, //17725 #CJK UNIFIED IDEOGRAPH
+ {0xE5C9, 0x8FF3}, //17726 #CJK UNIFIED IDEOGRAPH
+ {0xE5CA, 0x8FE8}, //17727 #CJK UNIFIED IDEOGRAPH
+ {0xE5CB, 0x9005}, //17728 #CJK UNIFIED IDEOGRAPH
+ {0xE5CC, 0x9004}, //17729 #CJK UNIFIED IDEOGRAPH
+ {0xE5CD, 0x900B}, //17730 #CJK UNIFIED IDEOGRAPH
+ {0xE5CE, 0x9026}, //17731 #CJK UNIFIED IDEOGRAPH
+ {0xE5CF, 0x9011}, //17732 #CJK UNIFIED IDEOGRAPH
+ {0xE5D0, 0x900D}, //17733 #CJK UNIFIED IDEOGRAPH
+ {0xE5D1, 0x9016}, //17734 #CJK UNIFIED IDEOGRAPH
+ {0xE5D2, 0x9021}, //17735 #CJK UNIFIED IDEOGRAPH
+ {0xE5D3, 0x9035}, //17736 #CJK UNIFIED IDEOGRAPH
+ {0xE5D4, 0x9036}, //17737 #CJK UNIFIED IDEOGRAPH
+ {0xE5D5, 0x902D}, //17738 #CJK UNIFIED IDEOGRAPH
+ {0xE5D6, 0x902F}, //17739 #CJK UNIFIED IDEOGRAPH
+ {0xE5D7, 0x9044}, //17740 #CJK UNIFIED IDEOGRAPH
+ {0xE5D8, 0x9051}, //17741 #CJK UNIFIED IDEOGRAPH
+ {0xE5D9, 0x9052}, //17742 #CJK UNIFIED IDEOGRAPH
+ {0xE5DA, 0x9050}, //17743 #CJK UNIFIED IDEOGRAPH
+ {0xE5DB, 0x9068}, //17744 #CJK UNIFIED IDEOGRAPH
+ {0xE5DC, 0x9058}, //17745 #CJK UNIFIED IDEOGRAPH
+ {0xE5DD, 0x9062}, //17746 #CJK UNIFIED IDEOGRAPH
+ {0xE5DE, 0x905B}, //17747 #CJK UNIFIED IDEOGRAPH
+ {0xE5DF, 0x66B9}, //17748 #CJK UNIFIED IDEOGRAPH
+ {0xE5E0, 0x9074}, //17749 #CJK UNIFIED IDEOGRAPH
+ {0xE5E1, 0x907D}, //17750 #CJK UNIFIED IDEOGRAPH
+ {0xE5E2, 0x9082}, //17751 #CJK UNIFIED IDEOGRAPH
+ {0xE5E3, 0x9088}, //17752 #CJK UNIFIED IDEOGRAPH
+ {0xE5E4, 0x9083}, //17753 #CJK UNIFIED IDEOGRAPH
+ {0xE5E5, 0x908B}, //17754 #CJK UNIFIED IDEOGRAPH
+ {0xE5E6, 0x5F50}, //17755 #CJK UNIFIED IDEOGRAPH
+ {0xE5E7, 0x5F57}, //17756 #CJK UNIFIED IDEOGRAPH
+ {0xE5E8, 0x5F56}, //17757 #CJK UNIFIED IDEOGRAPH
+ {0xE5E9, 0x5F58}, //17758 #CJK UNIFIED IDEOGRAPH
+ {0xE5EA, 0x5C3B}, //17759 #CJK UNIFIED IDEOGRAPH
+ {0xE5EB, 0x54AB}, //17760 #CJK UNIFIED IDEOGRAPH
+ {0xE5EC, 0x5C50}, //17761 #CJK UNIFIED IDEOGRAPH
+ {0xE5ED, 0x5C59}, //17762 #CJK UNIFIED IDEOGRAPH
+ {0xE5EE, 0x5B71}, //17763 #CJK UNIFIED IDEOGRAPH
+ {0xE5EF, 0x5C63}, //17764 #CJK UNIFIED IDEOGRAPH
+ {0xE5F0, 0x5C66}, //17765 #CJK UNIFIED IDEOGRAPH
+ {0xE5F1, 0x7FBC}, //17766 #CJK UNIFIED IDEOGRAPH
+ {0xE5F2, 0x5F2A}, //17767 #CJK UNIFIED IDEOGRAPH
+ {0xE5F3, 0x5F29}, //17768 #CJK UNIFIED IDEOGRAPH
+ {0xE5F4, 0x5F2D}, //17769 #CJK UNIFIED IDEOGRAPH
+ {0xE5F5, 0x8274}, //17770 #CJK UNIFIED IDEOGRAPH
+ {0xE5F6, 0x5F3C}, //17771 #CJK UNIFIED IDEOGRAPH
+ {0xE5F7, 0x9B3B}, //17772 #CJK UNIFIED IDEOGRAPH
+ {0xE5F8, 0x5C6E}, //17773 #CJK UNIFIED IDEOGRAPH
+ {0xE5F9, 0x5981}, //17774 #CJK UNIFIED IDEOGRAPH
+ {0xE5FA, 0x5983}, //17775 #CJK UNIFIED IDEOGRAPH
+ {0xE5FB, 0x598D}, //17776 #CJK UNIFIED IDEOGRAPH
+ {0xE5FC, 0x59A9}, //17777 #CJK UNIFIED IDEOGRAPH
+ {0xE5FD, 0x59AA}, //17778 #CJK UNIFIED IDEOGRAPH
+ {0xE5FE, 0x59A3}, //17779 #CJK UNIFIED IDEOGRAPH
+ {0xE640, 0x936C}, //17780 #CJK UNIFIED IDEOGRAPH
+ {0xE641, 0x936D}, //17781 #CJK UNIFIED IDEOGRAPH
+ {0xE642, 0x936E}, //17782 #CJK UNIFIED IDEOGRAPH
+ {0xE643, 0x936F}, //17783 #CJK UNIFIED IDEOGRAPH
+ {0xE644, 0x9370}, //17784 #CJK UNIFIED IDEOGRAPH
+ {0xE645, 0x9371}, //17785 #CJK UNIFIED IDEOGRAPH
+ {0xE646, 0x9372}, //17786 #CJK UNIFIED IDEOGRAPH
+ {0xE647, 0x9373}, //17787 #CJK UNIFIED IDEOGRAPH
+ {0xE648, 0x9374}, //17788 #CJK UNIFIED IDEOGRAPH
+ {0xE649, 0x9375}, //17789 #CJK UNIFIED IDEOGRAPH
+ {0xE64A, 0x9376}, //17790 #CJK UNIFIED IDEOGRAPH
+ {0xE64B, 0x9377}, //17791 #CJK UNIFIED IDEOGRAPH
+ {0xE64C, 0x9378}, //17792 #CJK UNIFIED IDEOGRAPH
+ {0xE64D, 0x9379}, //17793 #CJK UNIFIED IDEOGRAPH
+ {0xE64E, 0x937A}, //17794 #CJK UNIFIED IDEOGRAPH
+ {0xE64F, 0x937B}, //17795 #CJK UNIFIED IDEOGRAPH
+ {0xE650, 0x937C}, //17796 #CJK UNIFIED IDEOGRAPH
+ {0xE651, 0x937D}, //17797 #CJK UNIFIED IDEOGRAPH
+ {0xE652, 0x937E}, //17798 #CJK UNIFIED IDEOGRAPH
+ {0xE653, 0x937F}, //17799 #CJK UNIFIED IDEOGRAPH
+ {0xE654, 0x9380}, //17800 #CJK UNIFIED IDEOGRAPH
+ {0xE655, 0x9381}, //17801 #CJK UNIFIED IDEOGRAPH
+ {0xE656, 0x9382}, //17802 #CJK UNIFIED IDEOGRAPH
+ {0xE657, 0x9383}, //17803 #CJK UNIFIED IDEOGRAPH
+ {0xE658, 0x9384}, //17804 #CJK UNIFIED IDEOGRAPH
+ {0xE659, 0x9385}, //17805 #CJK UNIFIED IDEOGRAPH
+ {0xE65A, 0x9386}, //17806 #CJK UNIFIED IDEOGRAPH
+ {0xE65B, 0x9387}, //17807 #CJK UNIFIED IDEOGRAPH
+ {0xE65C, 0x9388}, //17808 #CJK UNIFIED IDEOGRAPH
+ {0xE65D, 0x9389}, //17809 #CJK UNIFIED IDEOGRAPH
+ {0xE65E, 0x938A}, //17810 #CJK UNIFIED IDEOGRAPH
+ {0xE65F, 0x938B}, //17811 #CJK UNIFIED IDEOGRAPH
+ {0xE660, 0x938C}, //17812 #CJK UNIFIED IDEOGRAPH
+ {0xE661, 0x938D}, //17813 #CJK UNIFIED IDEOGRAPH
+ {0xE662, 0x938E}, //17814 #CJK UNIFIED IDEOGRAPH
+ {0xE663, 0x9390}, //17815 #CJK UNIFIED IDEOGRAPH
+ {0xE664, 0x9391}, //17816 #CJK UNIFIED IDEOGRAPH
+ {0xE665, 0x9392}, //17817 #CJK UNIFIED IDEOGRAPH
+ {0xE666, 0x9393}, //17818 #CJK UNIFIED IDEOGRAPH
+ {0xE667, 0x9394}, //17819 #CJK UNIFIED IDEOGRAPH
+ {0xE668, 0x9395}, //17820 #CJK UNIFIED IDEOGRAPH
+ {0xE669, 0x9396}, //17821 #CJK UNIFIED IDEOGRAPH
+ {0xE66A, 0x9397}, //17822 #CJK UNIFIED IDEOGRAPH
+ {0xE66B, 0x9398}, //17823 #CJK UNIFIED IDEOGRAPH
+ {0xE66C, 0x9399}, //17824 #CJK UNIFIED IDEOGRAPH
+ {0xE66D, 0x939A}, //17825 #CJK UNIFIED IDEOGRAPH
+ {0xE66E, 0x939B}, //17826 #CJK UNIFIED IDEOGRAPH
+ {0xE66F, 0x939C}, //17827 #CJK UNIFIED IDEOGRAPH
+ {0xE670, 0x939D}, //17828 #CJK UNIFIED IDEOGRAPH
+ {0xE671, 0x939E}, //17829 #CJK UNIFIED IDEOGRAPH
+ {0xE672, 0x939F}, //17830 #CJK UNIFIED IDEOGRAPH
+ {0xE673, 0x93A0}, //17831 #CJK UNIFIED IDEOGRAPH
+ {0xE674, 0x93A1}, //17832 #CJK UNIFIED IDEOGRAPH
+ {0xE675, 0x93A2}, //17833 #CJK UNIFIED IDEOGRAPH
+ {0xE676, 0x93A3}, //17834 #CJK UNIFIED IDEOGRAPH
+ {0xE677, 0x93A4}, //17835 #CJK UNIFIED IDEOGRAPH
+ {0xE678, 0x93A5}, //17836 #CJK UNIFIED IDEOGRAPH
+ {0xE679, 0x93A6}, //17837 #CJK UNIFIED IDEOGRAPH
+ {0xE67A, 0x93A7}, //17838 #CJK UNIFIED IDEOGRAPH
+ {0xE67B, 0x93A8}, //17839 #CJK UNIFIED IDEOGRAPH
+ {0xE67C, 0x93A9}, //17840 #CJK UNIFIED IDEOGRAPH
+ {0xE67D, 0x93AA}, //17841 #CJK UNIFIED IDEOGRAPH
+ {0xE67E, 0x93AB}, //17842 #CJK UNIFIED IDEOGRAPH
+ {0xE680, 0x93AC}, //17843 #CJK UNIFIED IDEOGRAPH
+ {0xE681, 0x93AD}, //17844 #CJK UNIFIED IDEOGRAPH
+ {0xE682, 0x93AE}, //17845 #CJK UNIFIED IDEOGRAPH
+ {0xE683, 0x93AF}, //17846 #CJK UNIFIED IDEOGRAPH
+ {0xE684, 0x93B0}, //17847 #CJK UNIFIED IDEOGRAPH
+ {0xE685, 0x93B1}, //17848 #CJK UNIFIED IDEOGRAPH
+ {0xE686, 0x93B2}, //17849 #CJK UNIFIED IDEOGRAPH
+ {0xE687, 0x93B3}, //17850 #CJK UNIFIED IDEOGRAPH
+ {0xE688, 0x93B4}, //17851 #CJK UNIFIED IDEOGRAPH
+ {0xE689, 0x93B5}, //17852 #CJK UNIFIED IDEOGRAPH
+ {0xE68A, 0x93B6}, //17853 #CJK UNIFIED IDEOGRAPH
+ {0xE68B, 0x93B7}, //17854 #CJK UNIFIED IDEOGRAPH
+ {0xE68C, 0x93B8}, //17855 #CJK UNIFIED IDEOGRAPH
+ {0xE68D, 0x93B9}, //17856 #CJK UNIFIED IDEOGRAPH
+ {0xE68E, 0x93BA}, //17857 #CJK UNIFIED IDEOGRAPH
+ {0xE68F, 0x93BB}, //17858 #CJK UNIFIED IDEOGRAPH
+ {0xE690, 0x93BC}, //17859 #CJK UNIFIED IDEOGRAPH
+ {0xE691, 0x93BD}, //17860 #CJK UNIFIED IDEOGRAPH
+ {0xE692, 0x93BE}, //17861 #CJK UNIFIED IDEOGRAPH
+ {0xE693, 0x93BF}, //17862 #CJK UNIFIED IDEOGRAPH
+ {0xE694, 0x93C0}, //17863 #CJK UNIFIED IDEOGRAPH
+ {0xE695, 0x93C1}, //17864 #CJK UNIFIED IDEOGRAPH
+ {0xE696, 0x93C2}, //17865 #CJK UNIFIED IDEOGRAPH
+ {0xE697, 0x93C3}, //17866 #CJK UNIFIED IDEOGRAPH
+ {0xE698, 0x93C4}, //17867 #CJK UNIFIED IDEOGRAPH
+ {0xE699, 0x93C5}, //17868 #CJK UNIFIED IDEOGRAPH
+ {0xE69A, 0x93C6}, //17869 #CJK UNIFIED IDEOGRAPH
+ {0xE69B, 0x93C7}, //17870 #CJK UNIFIED IDEOGRAPH
+ {0xE69C, 0x93C8}, //17871 #CJK UNIFIED IDEOGRAPH
+ {0xE69D, 0x93C9}, //17872 #CJK UNIFIED IDEOGRAPH
+ {0xE69E, 0x93CB}, //17873 #CJK UNIFIED IDEOGRAPH
+ {0xE69F, 0x93CC}, //17874 #CJK UNIFIED IDEOGRAPH
+ {0xE6A0, 0x93CD}, //17875 #CJK UNIFIED IDEOGRAPH
+ {0xE6A1, 0x5997}, //17876 #CJK UNIFIED IDEOGRAPH
+ {0xE6A2, 0x59CA}, //17877 #CJK UNIFIED IDEOGRAPH
+ {0xE6A3, 0x59AB}, //17878 #CJK UNIFIED IDEOGRAPH
+ {0xE6A4, 0x599E}, //17879 #CJK UNIFIED IDEOGRAPH
+ {0xE6A5, 0x59A4}, //17880 #CJK UNIFIED IDEOGRAPH
+ {0xE6A6, 0x59D2}, //17881 #CJK UNIFIED IDEOGRAPH
+ {0xE6A7, 0x59B2}, //17882 #CJK UNIFIED IDEOGRAPH
+ {0xE6A8, 0x59AF}, //17883 #CJK UNIFIED IDEOGRAPH
+ {0xE6A9, 0x59D7}, //17884 #CJK UNIFIED IDEOGRAPH
+ {0xE6AA, 0x59BE}, //17885 #CJK UNIFIED IDEOGRAPH
+ {0xE6AB, 0x5A05}, //17886 #CJK UNIFIED IDEOGRAPH
+ {0xE6AC, 0x5A06}, //17887 #CJK UNIFIED IDEOGRAPH
+ {0xE6AD, 0x59DD}, //17888 #CJK UNIFIED IDEOGRAPH
+ {0xE6AE, 0x5A08}, //17889 #CJK UNIFIED IDEOGRAPH
+ {0xE6AF, 0x59E3}, //17890 #CJK UNIFIED IDEOGRAPH
+ {0xE6B0, 0x59D8}, //17891 #CJK UNIFIED IDEOGRAPH
+ {0xE6B1, 0x59F9}, //17892 #CJK UNIFIED IDEOGRAPH
+ {0xE6B2, 0x5A0C}, //17893 #CJK UNIFIED IDEOGRAPH
+ {0xE6B3, 0x5A09}, //17894 #CJK UNIFIED IDEOGRAPH
+ {0xE6B4, 0x5A32}, //17895 #CJK UNIFIED IDEOGRAPH
+ {0xE6B5, 0x5A34}, //17896 #CJK UNIFIED IDEOGRAPH
+ {0xE6B6, 0x5A11}, //17897 #CJK UNIFIED IDEOGRAPH
+ {0xE6B7, 0x5A23}, //17898 #CJK UNIFIED IDEOGRAPH
+ {0xE6B8, 0x5A13}, //17899 #CJK UNIFIED IDEOGRAPH
+ {0xE6B9, 0x5A40}, //17900 #CJK UNIFIED IDEOGRAPH
+ {0xE6BA, 0x5A67}, //17901 #CJK UNIFIED IDEOGRAPH
+ {0xE6BB, 0x5A4A}, //17902 #CJK UNIFIED IDEOGRAPH
+ {0xE6BC, 0x5A55}, //17903 #CJK UNIFIED IDEOGRAPH
+ {0xE6BD, 0x5A3C}, //17904 #CJK UNIFIED IDEOGRAPH
+ {0xE6BE, 0x5A62}, //17905 #CJK UNIFIED IDEOGRAPH
+ {0xE6BF, 0x5A75}, //17906 #CJK UNIFIED IDEOGRAPH
+ {0xE6C0, 0x80EC}, //17907 #CJK UNIFIED IDEOGRAPH
+ {0xE6C1, 0x5AAA}, //17908 #CJK UNIFIED IDEOGRAPH
+ {0xE6C2, 0x5A9B}, //17909 #CJK UNIFIED IDEOGRAPH
+ {0xE6C3, 0x5A77}, //17910 #CJK UNIFIED IDEOGRAPH
+ {0xE6C4, 0x5A7A}, //17911 #CJK UNIFIED IDEOGRAPH
+ {0xE6C5, 0x5ABE}, //17912 #CJK UNIFIED IDEOGRAPH
+ {0xE6C6, 0x5AEB}, //17913 #CJK UNIFIED IDEOGRAPH
+ {0xE6C7, 0x5AB2}, //17914 #CJK UNIFIED IDEOGRAPH
+ {0xE6C8, 0x5AD2}, //17915 #CJK UNIFIED IDEOGRAPH
+ {0xE6C9, 0x5AD4}, //17916 #CJK UNIFIED IDEOGRAPH
+ {0xE6CA, 0x5AB8}, //17917 #CJK UNIFIED IDEOGRAPH
+ {0xE6CB, 0x5AE0}, //17918 #CJK UNIFIED IDEOGRAPH
+ {0xE6CC, 0x5AE3}, //17919 #CJK UNIFIED IDEOGRAPH
+ {0xE6CD, 0x5AF1}, //17920 #CJK UNIFIED IDEOGRAPH
+ {0xE6CE, 0x5AD6}, //17921 #CJK UNIFIED IDEOGRAPH
+ {0xE6CF, 0x5AE6}, //17922 #CJK UNIFIED IDEOGRAPH
+ {0xE6D0, 0x5AD8}, //17923 #CJK UNIFIED IDEOGRAPH
+ {0xE6D1, 0x5ADC}, //17924 #CJK UNIFIED IDEOGRAPH
+ {0xE6D2, 0x5B09}, //17925 #CJK UNIFIED IDEOGRAPH
+ {0xE6D3, 0x5B17}, //17926 #CJK UNIFIED IDEOGRAPH
+ {0xE6D4, 0x5B16}, //17927 #CJK UNIFIED IDEOGRAPH
+ {0xE6D5, 0x5B32}, //17928 #CJK UNIFIED IDEOGRAPH
+ {0xE6D6, 0x5B37}, //17929 #CJK UNIFIED IDEOGRAPH
+ {0xE6D7, 0x5B40}, //17930 #CJK UNIFIED IDEOGRAPH
+ {0xE6D8, 0x5C15}, //17931 #CJK UNIFIED IDEOGRAPH
+ {0xE6D9, 0x5C1C}, //17932 #CJK UNIFIED IDEOGRAPH
+ {0xE6DA, 0x5B5A}, //17933 #CJK UNIFIED IDEOGRAPH
+ {0xE6DB, 0x5B65}, //17934 #CJK UNIFIED IDEOGRAPH
+ {0xE6DC, 0x5B73}, //17935 #CJK UNIFIED IDEOGRAPH
+ {0xE6DD, 0x5B51}, //17936 #CJK UNIFIED IDEOGRAPH
+ {0xE6DE, 0x5B53}, //17937 #CJK UNIFIED IDEOGRAPH
+ {0xE6DF, 0x5B62}, //17938 #CJK UNIFIED IDEOGRAPH
+ {0xE6E0, 0x9A75}, //17939 #CJK UNIFIED IDEOGRAPH
+ {0xE6E1, 0x9A77}, //17940 #CJK UNIFIED IDEOGRAPH
+ {0xE6E2, 0x9A78}, //17941 #CJK UNIFIED IDEOGRAPH
+ {0xE6E3, 0x9A7A}, //17942 #CJK UNIFIED IDEOGRAPH
+ {0xE6E4, 0x9A7F}, //17943 #CJK UNIFIED IDEOGRAPH
+ {0xE6E5, 0x9A7D}, //17944 #CJK UNIFIED IDEOGRAPH
+ {0xE6E6, 0x9A80}, //17945 #CJK UNIFIED IDEOGRAPH
+ {0xE6E7, 0x9A81}, //17946 #CJK UNIFIED IDEOGRAPH
+ {0xE6E8, 0x9A85}, //17947 #CJK UNIFIED IDEOGRAPH
+ {0xE6E9, 0x9A88}, //17948 #CJK UNIFIED IDEOGRAPH
+ {0xE6EA, 0x9A8A}, //17949 #CJK UNIFIED IDEOGRAPH
+ {0xE6EB, 0x9A90}, //17950 #CJK UNIFIED IDEOGRAPH
+ {0xE6EC, 0x9A92}, //17951 #CJK UNIFIED IDEOGRAPH
+ {0xE6ED, 0x9A93}, //17952 #CJK UNIFIED IDEOGRAPH
+ {0xE6EE, 0x9A96}, //17953 #CJK UNIFIED IDEOGRAPH
+ {0xE6EF, 0x9A98}, //17954 #CJK UNIFIED IDEOGRAPH
+ {0xE6F0, 0x9A9B}, //17955 #CJK UNIFIED IDEOGRAPH
+ {0xE6F1, 0x9A9C}, //17956 #CJK UNIFIED IDEOGRAPH
+ {0xE6F2, 0x9A9D}, //17957 #CJK UNIFIED IDEOGRAPH
+ {0xE6F3, 0x9A9F}, //17958 #CJK UNIFIED IDEOGRAPH
+ {0xE6F4, 0x9AA0}, //17959 #CJK UNIFIED IDEOGRAPH
+ {0xE6F5, 0x9AA2}, //17960 #CJK UNIFIED IDEOGRAPH
+ {0xE6F6, 0x9AA3}, //17961 #CJK UNIFIED IDEOGRAPH
+ {0xE6F7, 0x9AA5}, //17962 #CJK UNIFIED IDEOGRAPH
+ {0xE6F8, 0x9AA7}, //17963 #CJK UNIFIED IDEOGRAPH
+ {0xE6F9, 0x7E9F}, //17964 #CJK UNIFIED IDEOGRAPH
+ {0xE6FA, 0x7EA1}, //17965 #CJK UNIFIED IDEOGRAPH
+ {0xE6FB, 0x7EA3}, //17966 #CJK UNIFIED IDEOGRAPH
+ {0xE6FC, 0x7EA5}, //17967 #CJK UNIFIED IDEOGRAPH
+ {0xE6FD, 0x7EA8}, //17968 #CJK UNIFIED IDEOGRAPH
+ {0xE6FE, 0x7EA9}, //17969 #CJK UNIFIED IDEOGRAPH
+ {0xE740, 0x93CE}, //17970 #CJK UNIFIED IDEOGRAPH
+ {0xE741, 0x93CF}, //17971 #CJK UNIFIED IDEOGRAPH
+ {0xE742, 0x93D0}, //17972 #CJK UNIFIED IDEOGRAPH
+ {0xE743, 0x93D1}, //17973 #CJK UNIFIED IDEOGRAPH
+ {0xE744, 0x93D2}, //17974 #CJK UNIFIED IDEOGRAPH
+ {0xE745, 0x93D3}, //17975 #CJK UNIFIED IDEOGRAPH
+ {0xE746, 0x93D4}, //17976 #CJK UNIFIED IDEOGRAPH
+ {0xE747, 0x93D5}, //17977 #CJK UNIFIED IDEOGRAPH
+ {0xE748, 0x93D7}, //17978 #CJK UNIFIED IDEOGRAPH
+ {0xE749, 0x93D8}, //17979 #CJK UNIFIED IDEOGRAPH
+ {0xE74A, 0x93D9}, //17980 #CJK UNIFIED IDEOGRAPH
+ {0xE74B, 0x93DA}, //17981 #CJK UNIFIED IDEOGRAPH
+ {0xE74C, 0x93DB}, //17982 #CJK UNIFIED IDEOGRAPH
+ {0xE74D, 0x93DC}, //17983 #CJK UNIFIED IDEOGRAPH
+ {0xE74E, 0x93DD}, //17984 #CJK UNIFIED IDEOGRAPH
+ {0xE74F, 0x93DE}, //17985 #CJK UNIFIED IDEOGRAPH
+ {0xE750, 0x93DF}, //17986 #CJK UNIFIED IDEOGRAPH
+ {0xE751, 0x93E0}, //17987 #CJK UNIFIED IDEOGRAPH
+ {0xE752, 0x93E1}, //17988 #CJK UNIFIED IDEOGRAPH
+ {0xE753, 0x93E2}, //17989 #CJK UNIFIED IDEOGRAPH
+ {0xE754, 0x93E3}, //17990 #CJK UNIFIED IDEOGRAPH
+ {0xE755, 0x93E4}, //17991 #CJK UNIFIED IDEOGRAPH
+ {0xE756, 0x93E5}, //17992 #CJK UNIFIED IDEOGRAPH
+ {0xE757, 0x93E6}, //17993 #CJK UNIFIED IDEOGRAPH
+ {0xE758, 0x93E7}, //17994 #CJK UNIFIED IDEOGRAPH
+ {0xE759, 0x93E8}, //17995 #CJK UNIFIED IDEOGRAPH
+ {0xE75A, 0x93E9}, //17996 #CJK UNIFIED IDEOGRAPH
+ {0xE75B, 0x93EA}, //17997 #CJK UNIFIED IDEOGRAPH
+ {0xE75C, 0x93EB}, //17998 #CJK UNIFIED IDEOGRAPH
+ {0xE75D, 0x93EC}, //17999 #CJK UNIFIED IDEOGRAPH
+ {0xE75E, 0x93ED}, //18000 #CJK UNIFIED IDEOGRAPH
+ {0xE75F, 0x93EE}, //18001 #CJK UNIFIED IDEOGRAPH
+ {0xE760, 0x93EF}, //18002 #CJK UNIFIED IDEOGRAPH
+ {0xE761, 0x93F0}, //18003 #CJK UNIFIED IDEOGRAPH
+ {0xE762, 0x93F1}, //18004 #CJK UNIFIED IDEOGRAPH
+ {0xE763, 0x93F2}, //18005 #CJK UNIFIED IDEOGRAPH
+ {0xE764, 0x93F3}, //18006 #CJK UNIFIED IDEOGRAPH
+ {0xE765, 0x93F4}, //18007 #CJK UNIFIED IDEOGRAPH
+ {0xE766, 0x93F5}, //18008 #CJK UNIFIED IDEOGRAPH
+ {0xE767, 0x93F6}, //18009 #CJK UNIFIED IDEOGRAPH
+ {0xE768, 0x93F7}, //18010 #CJK UNIFIED IDEOGRAPH
+ {0xE769, 0x93F8}, //18011 #CJK UNIFIED IDEOGRAPH
+ {0xE76A, 0x93F9}, //18012 #CJK UNIFIED IDEOGRAPH
+ {0xE76B, 0x93FA}, //18013 #CJK UNIFIED IDEOGRAPH
+ {0xE76C, 0x93FB}, //18014 #CJK UNIFIED IDEOGRAPH
+ {0xE76D, 0x93FC}, //18015 #CJK UNIFIED IDEOGRAPH
+ {0xE76E, 0x93FD}, //18016 #CJK UNIFIED IDEOGRAPH
+ {0xE76F, 0x93FE}, //18017 #CJK UNIFIED IDEOGRAPH
+ {0xE770, 0x93FF}, //18018 #CJK UNIFIED IDEOGRAPH
+ {0xE771, 0x9400}, //18019 #CJK UNIFIED IDEOGRAPH
+ {0xE772, 0x9401}, //18020 #CJK UNIFIED IDEOGRAPH
+ {0xE773, 0x9402}, //18021 #CJK UNIFIED IDEOGRAPH
+ {0xE774, 0x9403}, //18022 #CJK UNIFIED IDEOGRAPH
+ {0xE775, 0x9404}, //18023 #CJK UNIFIED IDEOGRAPH
+ {0xE776, 0x9405}, //18024 #CJK UNIFIED IDEOGRAPH
+ {0xE777, 0x9406}, //18025 #CJK UNIFIED IDEOGRAPH
+ {0xE778, 0x9407}, //18026 #CJK UNIFIED IDEOGRAPH
+ {0xE779, 0x9408}, //18027 #CJK UNIFIED IDEOGRAPH
+ {0xE77A, 0x9409}, //18028 #CJK UNIFIED IDEOGRAPH
+ {0xE77B, 0x940A}, //18029 #CJK UNIFIED IDEOGRAPH
+ {0xE77C, 0x940B}, //18030 #CJK UNIFIED IDEOGRAPH
+ {0xE77D, 0x940C}, //18031 #CJK UNIFIED IDEOGRAPH
+ {0xE77E, 0x940D}, //18032 #CJK UNIFIED IDEOGRAPH
+ {0xE780, 0x940E}, //18033 #CJK UNIFIED IDEOGRAPH
+ {0xE781, 0x940F}, //18034 #CJK UNIFIED IDEOGRAPH
+ {0xE782, 0x9410}, //18035 #CJK UNIFIED IDEOGRAPH
+ {0xE783, 0x9411}, //18036 #CJK UNIFIED IDEOGRAPH
+ {0xE784, 0x9412}, //18037 #CJK UNIFIED IDEOGRAPH
+ {0xE785, 0x9413}, //18038 #CJK UNIFIED IDEOGRAPH
+ {0xE786, 0x9414}, //18039 #CJK UNIFIED IDEOGRAPH
+ {0xE787, 0x9415}, //18040 #CJK UNIFIED IDEOGRAPH
+ {0xE788, 0x9416}, //18041 #CJK UNIFIED IDEOGRAPH
+ {0xE789, 0x9417}, //18042 #CJK UNIFIED IDEOGRAPH
+ {0xE78A, 0x9418}, //18043 #CJK UNIFIED IDEOGRAPH
+ {0xE78B, 0x9419}, //18044 #CJK UNIFIED IDEOGRAPH
+ {0xE78C, 0x941A}, //18045 #CJK UNIFIED IDEOGRAPH
+ {0xE78D, 0x941B}, //18046 #CJK UNIFIED IDEOGRAPH
+ {0xE78E, 0x941C}, //18047 #CJK UNIFIED IDEOGRAPH
+ {0xE78F, 0x941D}, //18048 #CJK UNIFIED IDEOGRAPH
+ {0xE790, 0x941E}, //18049 #CJK UNIFIED IDEOGRAPH
+ {0xE791, 0x941F}, //18050 #CJK UNIFIED IDEOGRAPH
+ {0xE792, 0x9420}, //18051 #CJK UNIFIED IDEOGRAPH
+ {0xE793, 0x9421}, //18052 #CJK UNIFIED IDEOGRAPH
+ {0xE794, 0x9422}, //18053 #CJK UNIFIED IDEOGRAPH
+ {0xE795, 0x9423}, //18054 #CJK UNIFIED IDEOGRAPH
+ {0xE796, 0x9424}, //18055 #CJK UNIFIED IDEOGRAPH
+ {0xE797, 0x9425}, //18056 #CJK UNIFIED IDEOGRAPH
+ {0xE798, 0x9426}, //18057 #CJK UNIFIED IDEOGRAPH
+ {0xE799, 0x9427}, //18058 #CJK UNIFIED IDEOGRAPH
+ {0xE79A, 0x9428}, //18059 #CJK UNIFIED IDEOGRAPH
+ {0xE79B, 0x9429}, //18060 #CJK UNIFIED IDEOGRAPH
+ {0xE79C, 0x942A}, //18061 #CJK UNIFIED IDEOGRAPH
+ {0xE79D, 0x942B}, //18062 #CJK UNIFIED IDEOGRAPH
+ {0xE79E, 0x942C}, //18063 #CJK UNIFIED IDEOGRAPH
+ {0xE79F, 0x942D}, //18064 #CJK UNIFIED IDEOGRAPH
+ {0xE7A0, 0x942E}, //18065 #CJK UNIFIED IDEOGRAPH
+ {0xE7A1, 0x7EAD}, //18066 #CJK UNIFIED IDEOGRAPH
+ {0xE7A2, 0x7EB0}, //18067 #CJK UNIFIED IDEOGRAPH
+ {0xE7A3, 0x7EBE}, //18068 #CJK UNIFIED IDEOGRAPH
+ {0xE7A4, 0x7EC0}, //18069 #CJK UNIFIED IDEOGRAPH
+ {0xE7A5, 0x7EC1}, //18070 #CJK UNIFIED IDEOGRAPH
+ {0xE7A6, 0x7EC2}, //18071 #CJK UNIFIED IDEOGRAPH
+ {0xE7A7, 0x7EC9}, //18072 #CJK UNIFIED IDEOGRAPH
+ {0xE7A8, 0x7ECB}, //18073 #CJK UNIFIED IDEOGRAPH
+ {0xE7A9, 0x7ECC}, //18074 #CJK UNIFIED IDEOGRAPH
+ {0xE7AA, 0x7ED0}, //18075 #CJK UNIFIED IDEOGRAPH
+ {0xE7AB, 0x7ED4}, //18076 #CJK UNIFIED IDEOGRAPH
+ {0xE7AC, 0x7ED7}, //18077 #CJK UNIFIED IDEOGRAPH
+ {0xE7AD, 0x7EDB}, //18078 #CJK UNIFIED IDEOGRAPH
+ {0xE7AE, 0x7EE0}, //18079 #CJK UNIFIED IDEOGRAPH
+ {0xE7AF, 0x7EE1}, //18080 #CJK UNIFIED IDEOGRAPH
+ {0xE7B0, 0x7EE8}, //18081 #CJK UNIFIED IDEOGRAPH
+ {0xE7B1, 0x7EEB}, //18082 #CJK UNIFIED IDEOGRAPH
+ {0xE7B2, 0x7EEE}, //18083 #CJK UNIFIED IDEOGRAPH
+ {0xE7B3, 0x7EEF}, //18084 #CJK UNIFIED IDEOGRAPH
+ {0xE7B4, 0x7EF1}, //18085 #CJK UNIFIED IDEOGRAPH
+ {0xE7B5, 0x7EF2}, //18086 #CJK UNIFIED IDEOGRAPH
+ {0xE7B6, 0x7F0D}, //18087 #CJK UNIFIED IDEOGRAPH
+ {0xE7B7, 0x7EF6}, //18088 #CJK UNIFIED IDEOGRAPH
+ {0xE7B8, 0x7EFA}, //18089 #CJK UNIFIED IDEOGRAPH
+ {0xE7B9, 0x7EFB}, //18090 #CJK UNIFIED IDEOGRAPH
+ {0xE7BA, 0x7EFE}, //18091 #CJK UNIFIED IDEOGRAPH
+ {0xE7BB, 0x7F01}, //18092 #CJK UNIFIED IDEOGRAPH
+ {0xE7BC, 0x7F02}, //18093 #CJK UNIFIED IDEOGRAPH
+ {0xE7BD, 0x7F03}, //18094 #CJK UNIFIED IDEOGRAPH
+ {0xE7BE, 0x7F07}, //18095 #CJK UNIFIED IDEOGRAPH
+ {0xE7BF, 0x7F08}, //18096 #CJK UNIFIED IDEOGRAPH
+ {0xE7C0, 0x7F0B}, //18097 #CJK UNIFIED IDEOGRAPH
+ {0xE7C1, 0x7F0C}, //18098 #CJK UNIFIED IDEOGRAPH
+ {0xE7C2, 0x7F0F}, //18099 #CJK UNIFIED IDEOGRAPH
+ {0xE7C3, 0x7F11}, //18100 #CJK UNIFIED IDEOGRAPH
+ {0xE7C4, 0x7F12}, //18101 #CJK UNIFIED IDEOGRAPH
+ {0xE7C5, 0x7F17}, //18102 #CJK UNIFIED IDEOGRAPH
+ {0xE7C6, 0x7F19}, //18103 #CJK UNIFIED IDEOGRAPH
+ {0xE7C7, 0x7F1C}, //18104 #CJK UNIFIED IDEOGRAPH
+ {0xE7C8, 0x7F1B}, //18105 #CJK UNIFIED IDEOGRAPH
+ {0xE7C9, 0x7F1F}, //18106 #CJK UNIFIED IDEOGRAPH
+ {0xE7CA, 0x7F21}, //18107 #CJK UNIFIED IDEOGRAPH
+ {0xE7CB, 0x7F22}, //18108 #CJK UNIFIED IDEOGRAPH
+ {0xE7CC, 0x7F23}, //18109 #CJK UNIFIED IDEOGRAPH
+ {0xE7CD, 0x7F24}, //18110 #CJK UNIFIED IDEOGRAPH
+ {0xE7CE, 0x7F25}, //18111 #CJK UNIFIED IDEOGRAPH
+ {0xE7CF, 0x7F26}, //18112 #CJK UNIFIED IDEOGRAPH
+ {0xE7D0, 0x7F27}, //18113 #CJK UNIFIED IDEOGRAPH
+ {0xE7D1, 0x7F2A}, //18114 #CJK UNIFIED IDEOGRAPH
+ {0xE7D2, 0x7F2B}, //18115 #CJK UNIFIED IDEOGRAPH
+ {0xE7D3, 0x7F2C}, //18116 #CJK UNIFIED IDEOGRAPH
+ {0xE7D4, 0x7F2D}, //18117 #CJK UNIFIED IDEOGRAPH
+ {0xE7D5, 0x7F2F}, //18118 #CJK UNIFIED IDEOGRAPH
+ {0xE7D6, 0x7F30}, //18119 #CJK UNIFIED IDEOGRAPH
+ {0xE7D7, 0x7F31}, //18120 #CJK UNIFIED IDEOGRAPH
+ {0xE7D8, 0x7F32}, //18121 #CJK UNIFIED IDEOGRAPH
+ {0xE7D9, 0x7F33}, //18122 #CJK UNIFIED IDEOGRAPH
+ {0xE7DA, 0x7F35}, //18123 #CJK UNIFIED IDEOGRAPH
+ {0xE7DB, 0x5E7A}, //18124 #CJK UNIFIED IDEOGRAPH
+ {0xE7DC, 0x757F}, //18125 #CJK UNIFIED IDEOGRAPH
+ {0xE7DD, 0x5DDB}, //18126 #CJK UNIFIED IDEOGRAPH
+ {0xE7DE, 0x753E}, //18127 #CJK UNIFIED IDEOGRAPH
+ {0xE7DF, 0x9095}, //18128 #CJK UNIFIED IDEOGRAPH
+ {0xE7E0, 0x738E}, //18129 #CJK UNIFIED IDEOGRAPH
+ {0xE7E1, 0x7391}, //18130 #CJK UNIFIED IDEOGRAPH
+ {0xE7E2, 0x73AE}, //18131 #CJK UNIFIED IDEOGRAPH
+ {0xE7E3, 0x73A2}, //18132 #CJK UNIFIED IDEOGRAPH
+ {0xE7E4, 0x739F}, //18133 #CJK UNIFIED IDEOGRAPH
+ {0xE7E5, 0x73CF}, //18134 #CJK UNIFIED IDEOGRAPH
+ {0xE7E6, 0x73C2}, //18135 #CJK UNIFIED IDEOGRAPH
+ {0xE7E7, 0x73D1}, //18136 #CJK UNIFIED IDEOGRAPH
+ {0xE7E8, 0x73B7}, //18137 #CJK UNIFIED IDEOGRAPH
+ {0xE7E9, 0x73B3}, //18138 #CJK UNIFIED IDEOGRAPH
+ {0xE7EA, 0x73C0}, //18139 #CJK UNIFIED IDEOGRAPH
+ {0xE7EB, 0x73C9}, //18140 #CJK UNIFIED IDEOGRAPH
+ {0xE7EC, 0x73C8}, //18141 #CJK UNIFIED IDEOGRAPH
+ {0xE7ED, 0x73E5}, //18142 #CJK UNIFIED IDEOGRAPH
+ {0xE7EE, 0x73D9}, //18143 #CJK UNIFIED IDEOGRAPH
+ {0xE7EF, 0x987C}, //18144 #CJK UNIFIED IDEOGRAPH
+ {0xE7F0, 0x740A}, //18145 #CJK UNIFIED IDEOGRAPH
+ {0xE7F1, 0x73E9}, //18146 #CJK UNIFIED IDEOGRAPH
+ {0xE7F2, 0x73E7}, //18147 #CJK UNIFIED IDEOGRAPH
+ {0xE7F3, 0x73DE}, //18148 #CJK UNIFIED IDEOGRAPH
+ {0xE7F4, 0x73BA}, //18149 #CJK UNIFIED IDEOGRAPH
+ {0xE7F5, 0x73F2}, //18150 #CJK UNIFIED IDEOGRAPH
+ {0xE7F6, 0x740F}, //18151 #CJK UNIFIED IDEOGRAPH
+ {0xE7F7, 0x742A}, //18152 #CJK UNIFIED IDEOGRAPH
+ {0xE7F8, 0x745B}, //18153 #CJK UNIFIED IDEOGRAPH
+ {0xE7F9, 0x7426}, //18154 #CJK UNIFIED IDEOGRAPH
+ {0xE7FA, 0x7425}, //18155 #CJK UNIFIED IDEOGRAPH
+ {0xE7FB, 0x7428}, //18156 #CJK UNIFIED IDEOGRAPH
+ {0xE7FC, 0x7430}, //18157 #CJK UNIFIED IDEOGRAPH
+ {0xE7FD, 0x742E}, //18158 #CJK UNIFIED IDEOGRAPH
+ {0xE7FE, 0x742C}, //18159 #CJK UNIFIED IDEOGRAPH
+ {0xE840, 0x942F}, //18160 #CJK UNIFIED IDEOGRAPH
+ {0xE841, 0x9430}, //18161 #CJK UNIFIED IDEOGRAPH
+ {0xE842, 0x9431}, //18162 #CJK UNIFIED IDEOGRAPH
+ {0xE843, 0x9432}, //18163 #CJK UNIFIED IDEOGRAPH
+ {0xE844, 0x9433}, //18164 #CJK UNIFIED IDEOGRAPH
+ {0xE845, 0x9434}, //18165 #CJK UNIFIED IDEOGRAPH
+ {0xE846, 0x9435}, //18166 #CJK UNIFIED IDEOGRAPH
+ {0xE847, 0x9436}, //18167 #CJK UNIFIED IDEOGRAPH
+ {0xE848, 0x9437}, //18168 #CJK UNIFIED IDEOGRAPH
+ {0xE849, 0x9438}, //18169 #CJK UNIFIED IDEOGRAPH
+ {0xE84A, 0x9439}, //18170 #CJK UNIFIED IDEOGRAPH
+ {0xE84B, 0x943A}, //18171 #CJK UNIFIED IDEOGRAPH
+ {0xE84C, 0x943B}, //18172 #CJK UNIFIED IDEOGRAPH
+ {0xE84D, 0x943C}, //18173 #CJK UNIFIED IDEOGRAPH
+ {0xE84E, 0x943D}, //18174 #CJK UNIFIED IDEOGRAPH
+ {0xE84F, 0x943F}, //18175 #CJK UNIFIED IDEOGRAPH
+ {0xE850, 0x9440}, //18176 #CJK UNIFIED IDEOGRAPH
+ {0xE851, 0x9441}, //18177 #CJK UNIFIED IDEOGRAPH
+ {0xE852, 0x9442}, //18178 #CJK UNIFIED IDEOGRAPH
+ {0xE853, 0x9443}, //18179 #CJK UNIFIED IDEOGRAPH
+ {0xE854, 0x9444}, //18180 #CJK UNIFIED IDEOGRAPH
+ {0xE855, 0x9445}, //18181 #CJK UNIFIED IDEOGRAPH
+ {0xE856, 0x9446}, //18182 #CJK UNIFIED IDEOGRAPH
+ {0xE857, 0x9447}, //18183 #CJK UNIFIED IDEOGRAPH
+ {0xE858, 0x9448}, //18184 #CJK UNIFIED IDEOGRAPH
+ {0xE859, 0x9449}, //18185 #CJK UNIFIED IDEOGRAPH
+ {0xE85A, 0x944A}, //18186 #CJK UNIFIED IDEOGRAPH
+ {0xE85B, 0x944B}, //18187 #CJK UNIFIED IDEOGRAPH
+ {0xE85C, 0x944C}, //18188 #CJK UNIFIED IDEOGRAPH
+ {0xE85D, 0x944D}, //18189 #CJK UNIFIED IDEOGRAPH
+ {0xE85E, 0x944E}, //18190 #CJK UNIFIED IDEOGRAPH
+ {0xE85F, 0x944F}, //18191 #CJK UNIFIED IDEOGRAPH
+ {0xE860, 0x9450}, //18192 #CJK UNIFIED IDEOGRAPH
+ {0xE861, 0x9451}, //18193 #CJK UNIFIED IDEOGRAPH
+ {0xE862, 0x9452}, //18194 #CJK UNIFIED IDEOGRAPH
+ {0xE863, 0x9453}, //18195 #CJK UNIFIED IDEOGRAPH
+ {0xE864, 0x9454}, //18196 #CJK UNIFIED IDEOGRAPH
+ {0xE865, 0x9455}, //18197 #CJK UNIFIED IDEOGRAPH
+ {0xE866, 0x9456}, //18198 #CJK UNIFIED IDEOGRAPH
+ {0xE867, 0x9457}, //18199 #CJK UNIFIED IDEOGRAPH
+ {0xE868, 0x9458}, //18200 #CJK UNIFIED IDEOGRAPH
+ {0xE869, 0x9459}, //18201 #CJK UNIFIED IDEOGRAPH
+ {0xE86A, 0x945A}, //18202 #CJK UNIFIED IDEOGRAPH
+ {0xE86B, 0x945B}, //18203 #CJK UNIFIED IDEOGRAPH
+ {0xE86C, 0x945C}, //18204 #CJK UNIFIED IDEOGRAPH
+ {0xE86D, 0x945D}, //18205 #CJK UNIFIED IDEOGRAPH
+ {0xE86E, 0x945E}, //18206 #CJK UNIFIED IDEOGRAPH
+ {0xE86F, 0x945F}, //18207 #CJK UNIFIED IDEOGRAPH
+ {0xE870, 0x9460}, //18208 #CJK UNIFIED IDEOGRAPH
+ {0xE871, 0x9461}, //18209 #CJK UNIFIED IDEOGRAPH
+ {0xE872, 0x9462}, //18210 #CJK UNIFIED IDEOGRAPH
+ {0xE873, 0x9463}, //18211 #CJK UNIFIED IDEOGRAPH
+ {0xE874, 0x9464}, //18212 #CJK UNIFIED IDEOGRAPH
+ {0xE875, 0x9465}, //18213 #CJK UNIFIED IDEOGRAPH
+ {0xE876, 0x9466}, //18214 #CJK UNIFIED IDEOGRAPH
+ {0xE877, 0x9467}, //18215 #CJK UNIFIED IDEOGRAPH
+ {0xE878, 0x9468}, //18216 #CJK UNIFIED IDEOGRAPH
+ {0xE879, 0x9469}, //18217 #CJK UNIFIED IDEOGRAPH
+ {0xE87A, 0x946A}, //18218 #CJK UNIFIED IDEOGRAPH
+ {0xE87B, 0x946C}, //18219 #CJK UNIFIED IDEOGRAPH
+ {0xE87C, 0x946D}, //18220 #CJK UNIFIED IDEOGRAPH
+ {0xE87D, 0x946E}, //18221 #CJK UNIFIED IDEOGRAPH
+ {0xE87E, 0x946F}, //18222 #CJK UNIFIED IDEOGRAPH
+ {0xE880, 0x9470}, //18223 #CJK UNIFIED IDEOGRAPH
+ {0xE881, 0x9471}, //18224 #CJK UNIFIED IDEOGRAPH
+ {0xE882, 0x9472}, //18225 #CJK UNIFIED IDEOGRAPH
+ {0xE883, 0x9473}, //18226 #CJK UNIFIED IDEOGRAPH
+ {0xE884, 0x9474}, //18227 #CJK UNIFIED IDEOGRAPH
+ {0xE885, 0x9475}, //18228 #CJK UNIFIED IDEOGRAPH
+ {0xE886, 0x9476}, //18229 #CJK UNIFIED IDEOGRAPH
+ {0xE887, 0x9477}, //18230 #CJK UNIFIED IDEOGRAPH
+ {0xE888, 0x9478}, //18231 #CJK UNIFIED IDEOGRAPH
+ {0xE889, 0x9479}, //18232 #CJK UNIFIED IDEOGRAPH
+ {0xE88A, 0x947A}, //18233 #CJK UNIFIED IDEOGRAPH
+ {0xE88B, 0x947B}, //18234 #CJK UNIFIED IDEOGRAPH
+ {0xE88C, 0x947C}, //18235 #CJK UNIFIED IDEOGRAPH
+ {0xE88D, 0x947D}, //18236 #CJK UNIFIED IDEOGRAPH
+ {0xE88E, 0x947E}, //18237 #CJK UNIFIED IDEOGRAPH
+ {0xE88F, 0x947F}, //18238 #CJK UNIFIED IDEOGRAPH
+ {0xE890, 0x9480}, //18239 #CJK UNIFIED IDEOGRAPH
+ {0xE891, 0x9481}, //18240 #CJK UNIFIED IDEOGRAPH
+ {0xE892, 0x9482}, //18241 #CJK UNIFIED IDEOGRAPH
+ {0xE893, 0x9483}, //18242 #CJK UNIFIED IDEOGRAPH
+ {0xE894, 0x9484}, //18243 #CJK UNIFIED IDEOGRAPH
+ {0xE895, 0x9491}, //18244 #CJK UNIFIED IDEOGRAPH
+ {0xE896, 0x9496}, //18245 #CJK UNIFIED IDEOGRAPH
+ {0xE897, 0x9498}, //18246 #CJK UNIFIED IDEOGRAPH
+ {0xE898, 0x94C7}, //18247 #CJK UNIFIED IDEOGRAPH
+ {0xE899, 0x94CF}, //18248 #CJK UNIFIED IDEOGRAPH
+ {0xE89A, 0x94D3}, //18249 #CJK UNIFIED IDEOGRAPH
+ {0xE89B, 0x94D4}, //18250 #CJK UNIFIED IDEOGRAPH
+ {0xE89C, 0x94DA}, //18251 #CJK UNIFIED IDEOGRAPH
+ {0xE89D, 0x94E6}, //18252 #CJK UNIFIED IDEOGRAPH
+ {0xE89E, 0x94FB}, //18253 #CJK UNIFIED IDEOGRAPH
+ {0xE89F, 0x951C}, //18254 #CJK UNIFIED IDEOGRAPH
+ {0xE8A0, 0x9520}, //18255 #CJK UNIFIED IDEOGRAPH
+ {0xE8A1, 0x741B}, //18256 #CJK UNIFIED IDEOGRAPH
+ {0xE8A2, 0x741A}, //18257 #CJK UNIFIED IDEOGRAPH
+ {0xE8A3, 0x7441}, //18258 #CJK UNIFIED IDEOGRAPH
+ {0xE8A4, 0x745C}, //18259 #CJK UNIFIED IDEOGRAPH
+ {0xE8A5, 0x7457}, //18260 #CJK UNIFIED IDEOGRAPH
+ {0xE8A6, 0x7455}, //18261 #CJK UNIFIED IDEOGRAPH
+ {0xE8A7, 0x7459}, //18262 #CJK UNIFIED IDEOGRAPH
+ {0xE8A8, 0x7477}, //18263 #CJK UNIFIED IDEOGRAPH
+ {0xE8A9, 0x746D}, //18264 #CJK UNIFIED IDEOGRAPH
+ {0xE8AA, 0x747E}, //18265 #CJK UNIFIED IDEOGRAPH
+ {0xE8AB, 0x749C}, //18266 #CJK UNIFIED IDEOGRAPH
+ {0xE8AC, 0x748E}, //18267 #CJK UNIFIED IDEOGRAPH
+ {0xE8AD, 0x7480}, //18268 #CJK UNIFIED IDEOGRAPH
+ {0xE8AE, 0x7481}, //18269 #CJK UNIFIED IDEOGRAPH
+ {0xE8AF, 0x7487}, //18270 #CJK UNIFIED IDEOGRAPH
+ {0xE8B0, 0x748B}, //18271 #CJK UNIFIED IDEOGRAPH
+ {0xE8B1, 0x749E}, //18272 #CJK UNIFIED IDEOGRAPH
+ {0xE8B2, 0x74A8}, //18273 #CJK UNIFIED IDEOGRAPH
+ {0xE8B3, 0x74A9}, //18274 #CJK UNIFIED IDEOGRAPH
+ {0xE8B4, 0x7490}, //18275 #CJK UNIFIED IDEOGRAPH
+ {0xE8B5, 0x74A7}, //18276 #CJK UNIFIED IDEOGRAPH
+ {0xE8B6, 0x74D2}, //18277 #CJK UNIFIED IDEOGRAPH
+ {0xE8B7, 0x74BA}, //18278 #CJK UNIFIED IDEOGRAPH
+ {0xE8B8, 0x97EA}, //18279 #CJK UNIFIED IDEOGRAPH
+ {0xE8B9, 0x97EB}, //18280 #CJK UNIFIED IDEOGRAPH
+ {0xE8BA, 0x97EC}, //18281 #CJK UNIFIED IDEOGRAPH
+ {0xE8BB, 0x674C}, //18282 #CJK UNIFIED IDEOGRAPH
+ {0xE8BC, 0x6753}, //18283 #CJK UNIFIED IDEOGRAPH
+ {0xE8BD, 0x675E}, //18284 #CJK UNIFIED IDEOGRAPH
+ {0xE8BE, 0x6748}, //18285 #CJK UNIFIED IDEOGRAPH
+ {0xE8BF, 0x6769}, //18286 #CJK UNIFIED IDEOGRAPH
+ {0xE8C0, 0x67A5}, //18287 #CJK UNIFIED IDEOGRAPH
+ {0xE8C1, 0x6787}, //18288 #CJK UNIFIED IDEOGRAPH
+ {0xE8C2, 0x676A}, //18289 #CJK UNIFIED IDEOGRAPH
+ {0xE8C3, 0x6773}, //18290 #CJK UNIFIED IDEOGRAPH
+ {0xE8C4, 0x6798}, //18291 #CJK UNIFIED IDEOGRAPH
+ {0xE8C5, 0x67A7}, //18292 #CJK UNIFIED IDEOGRAPH
+ {0xE8C6, 0x6775}, //18293 #CJK UNIFIED IDEOGRAPH
+ {0xE8C7, 0x67A8}, //18294 #CJK UNIFIED IDEOGRAPH
+ {0xE8C8, 0x679E}, //18295 #CJK UNIFIED IDEOGRAPH
+ {0xE8C9, 0x67AD}, //18296 #CJK UNIFIED IDEOGRAPH
+ {0xE8CA, 0x678B}, //18297 #CJK UNIFIED IDEOGRAPH
+ {0xE8CB, 0x6777}, //18298 #CJK UNIFIED IDEOGRAPH
+ {0xE8CC, 0x677C}, //18299 #CJK UNIFIED IDEOGRAPH
+ {0xE8CD, 0x67F0}, //18300 #CJK UNIFIED IDEOGRAPH
+ {0xE8CE, 0x6809}, //18301 #CJK UNIFIED IDEOGRAPH
+ {0xE8CF, 0x67D8}, //18302 #CJK UNIFIED IDEOGRAPH
+ {0xE8D0, 0x680A}, //18303 #CJK UNIFIED IDEOGRAPH
+ {0xE8D1, 0x67E9}, //18304 #CJK UNIFIED IDEOGRAPH
+ {0xE8D2, 0x67B0}, //18305 #CJK UNIFIED IDEOGRAPH
+ {0xE8D3, 0x680C}, //18306 #CJK UNIFIED IDEOGRAPH
+ {0xE8D4, 0x67D9}, //18307 #CJK UNIFIED IDEOGRAPH
+ {0xE8D5, 0x67B5}, //18308 #CJK UNIFIED IDEOGRAPH
+ {0xE8D6, 0x67DA}, //18309 #CJK UNIFIED IDEOGRAPH
+ {0xE8D7, 0x67B3}, //18310 #CJK UNIFIED IDEOGRAPH
+ {0xE8D8, 0x67DD}, //18311 #CJK UNIFIED IDEOGRAPH
+ {0xE8D9, 0x6800}, //18312 #CJK UNIFIED IDEOGRAPH
+ {0xE8DA, 0x67C3}, //18313 #CJK UNIFIED IDEOGRAPH
+ {0xE8DB, 0x67B8}, //18314 #CJK UNIFIED IDEOGRAPH
+ {0xE8DC, 0x67E2}, //18315 #CJK UNIFIED IDEOGRAPH
+ {0xE8DD, 0x680E}, //18316 #CJK UNIFIED IDEOGRAPH
+ {0xE8DE, 0x67C1}, //18317 #CJK UNIFIED IDEOGRAPH
+ {0xE8DF, 0x67FD}, //18318 #CJK UNIFIED IDEOGRAPH
+ {0xE8E0, 0x6832}, //18319 #CJK UNIFIED IDEOGRAPH
+ {0xE8E1, 0x6833}, //18320 #CJK UNIFIED IDEOGRAPH
+ {0xE8E2, 0x6860}, //18321 #CJK UNIFIED IDEOGRAPH
+ {0xE8E3, 0x6861}, //18322 #CJK UNIFIED IDEOGRAPH
+ {0xE8E4, 0x684E}, //18323 #CJK UNIFIED IDEOGRAPH
+ {0xE8E5, 0x6862}, //18324 #CJK UNIFIED IDEOGRAPH
+ {0xE8E6, 0x6844}, //18325 #CJK UNIFIED IDEOGRAPH
+ {0xE8E7, 0x6864}, //18326 #CJK UNIFIED IDEOGRAPH
+ {0xE8E8, 0x6883}, //18327 #CJK UNIFIED IDEOGRAPH
+ {0xE8E9, 0x681D}, //18328 #CJK UNIFIED IDEOGRAPH
+ {0xE8EA, 0x6855}, //18329 #CJK UNIFIED IDEOGRAPH
+ {0xE8EB, 0x6866}, //18330 #CJK UNIFIED IDEOGRAPH
+ {0xE8EC, 0x6841}, //18331 #CJK UNIFIED IDEOGRAPH
+ {0xE8ED, 0x6867}, //18332 #CJK UNIFIED IDEOGRAPH
+ {0xE8EE, 0x6840}, //18333 #CJK UNIFIED IDEOGRAPH
+ {0xE8EF, 0x683E}, //18334 #CJK UNIFIED IDEOGRAPH
+ {0xE8F0, 0x684A}, //18335 #CJK UNIFIED IDEOGRAPH
+ {0xE8F1, 0x6849}, //18336 #CJK UNIFIED IDEOGRAPH
+ {0xE8F2, 0x6829}, //18337 #CJK UNIFIED IDEOGRAPH
+ {0xE8F3, 0x68B5}, //18338 #CJK UNIFIED IDEOGRAPH
+ {0xE8F4, 0x688F}, //18339 #CJK UNIFIED IDEOGRAPH
+ {0xE8F5, 0x6874}, //18340 #CJK UNIFIED IDEOGRAPH
+ {0xE8F6, 0x6877}, //18341 #CJK UNIFIED IDEOGRAPH
+ {0xE8F7, 0x6893}, //18342 #CJK UNIFIED IDEOGRAPH
+ {0xE8F8, 0x686B}, //18343 #CJK UNIFIED IDEOGRAPH
+ {0xE8F9, 0x68C2}, //18344 #CJK UNIFIED IDEOGRAPH
+ {0xE8FA, 0x696E}, //18345 #CJK UNIFIED IDEOGRAPH
+ {0xE8FB, 0x68FC}, //18346 #CJK UNIFIED IDEOGRAPH
+ {0xE8FC, 0x691F}, //18347 #CJK UNIFIED IDEOGRAPH
+ {0xE8FD, 0x6920}, //18348 #CJK UNIFIED IDEOGRAPH
+ {0xE8FE, 0x68F9}, //18349 #CJK UNIFIED IDEOGRAPH
+ {0xE940, 0x9527}, //18350 #CJK UNIFIED IDEOGRAPH
+ {0xE941, 0x9533}, //18351 #CJK UNIFIED IDEOGRAPH
+ {0xE942, 0x953D}, //18352 #CJK UNIFIED IDEOGRAPH
+ {0xE943, 0x9543}, //18353 #CJK UNIFIED IDEOGRAPH
+ {0xE944, 0x9548}, //18354 #CJK UNIFIED IDEOGRAPH
+ {0xE945, 0x954B}, //18355 #CJK UNIFIED IDEOGRAPH
+ {0xE946, 0x9555}, //18356 #CJK UNIFIED IDEOGRAPH
+ {0xE947, 0x955A}, //18357 #CJK UNIFIED IDEOGRAPH
+ {0xE948, 0x9560}, //18358 #CJK UNIFIED IDEOGRAPH
+ {0xE949, 0x956E}, //18359 #CJK UNIFIED IDEOGRAPH
+ {0xE94A, 0x9574}, //18360 #CJK UNIFIED IDEOGRAPH
+ {0xE94B, 0x9575}, //18361 #CJK UNIFIED IDEOGRAPH
+ {0xE94C, 0x9577}, //18362 #CJK UNIFIED IDEOGRAPH
+ {0xE94D, 0x9578}, //18363 #CJK UNIFIED IDEOGRAPH
+ {0xE94E, 0x9579}, //18364 #CJK UNIFIED IDEOGRAPH
+ {0xE94F, 0x957A}, //18365 #CJK UNIFIED IDEOGRAPH
+ {0xE950, 0x957B}, //18366 #CJK UNIFIED IDEOGRAPH
+ {0xE951, 0x957C}, //18367 #CJK UNIFIED IDEOGRAPH
+ {0xE952, 0x957D}, //18368 #CJK UNIFIED IDEOGRAPH
+ {0xE953, 0x957E}, //18369 #CJK UNIFIED IDEOGRAPH
+ {0xE954, 0x9580}, //18370 #CJK UNIFIED IDEOGRAPH
+ {0xE955, 0x9581}, //18371 #CJK UNIFIED IDEOGRAPH
+ {0xE956, 0x9582}, //18372 #CJK UNIFIED IDEOGRAPH
+ {0xE957, 0x9583}, //18373 #CJK UNIFIED IDEOGRAPH
+ {0xE958, 0x9584}, //18374 #CJK UNIFIED IDEOGRAPH
+ {0xE959, 0x9585}, //18375 #CJK UNIFIED IDEOGRAPH
+ {0xE95A, 0x9586}, //18376 #CJK UNIFIED IDEOGRAPH
+ {0xE95B, 0x9587}, //18377 #CJK UNIFIED IDEOGRAPH
+ {0xE95C, 0x9588}, //18378 #CJK UNIFIED IDEOGRAPH
+ {0xE95D, 0x9589}, //18379 #CJK UNIFIED IDEOGRAPH
+ {0xE95E, 0x958A}, //18380 #CJK UNIFIED IDEOGRAPH
+ {0xE95F, 0x958B}, //18381 #CJK UNIFIED IDEOGRAPH
+ {0xE960, 0x958C}, //18382 #CJK UNIFIED IDEOGRAPH
+ {0xE961, 0x958D}, //18383 #CJK UNIFIED IDEOGRAPH
+ {0xE962, 0x958E}, //18384 #CJK UNIFIED IDEOGRAPH
+ {0xE963, 0x958F}, //18385 #CJK UNIFIED IDEOGRAPH
+ {0xE964, 0x9590}, //18386 #CJK UNIFIED IDEOGRAPH
+ {0xE965, 0x9591}, //18387 #CJK UNIFIED IDEOGRAPH
+ {0xE966, 0x9592}, //18388 #CJK UNIFIED IDEOGRAPH
+ {0xE967, 0x9593}, //18389 #CJK UNIFIED IDEOGRAPH
+ {0xE968, 0x9594}, //18390 #CJK UNIFIED IDEOGRAPH
+ {0xE969, 0x9595}, //18391 #CJK UNIFIED IDEOGRAPH
+ {0xE96A, 0x9596}, //18392 #CJK UNIFIED IDEOGRAPH
+ {0xE96B, 0x9597}, //18393 #CJK UNIFIED IDEOGRAPH
+ {0xE96C, 0x9598}, //18394 #CJK UNIFIED IDEOGRAPH
+ {0xE96D, 0x9599}, //18395 #CJK UNIFIED IDEOGRAPH
+ {0xE96E, 0x959A}, //18396 #CJK UNIFIED IDEOGRAPH
+ {0xE96F, 0x959B}, //18397 #CJK UNIFIED IDEOGRAPH
+ {0xE970, 0x959C}, //18398 #CJK UNIFIED IDEOGRAPH
+ {0xE971, 0x959D}, //18399 #CJK UNIFIED IDEOGRAPH
+ {0xE972, 0x959E}, //18400 #CJK UNIFIED IDEOGRAPH
+ {0xE973, 0x959F}, //18401 #CJK UNIFIED IDEOGRAPH
+ {0xE974, 0x95A0}, //18402 #CJK UNIFIED IDEOGRAPH
+ {0xE975, 0x95A1}, //18403 #CJK UNIFIED IDEOGRAPH
+ {0xE976, 0x95A2}, //18404 #CJK UNIFIED IDEOGRAPH
+ {0xE977, 0x95A3}, //18405 #CJK UNIFIED IDEOGRAPH
+ {0xE978, 0x95A4}, //18406 #CJK UNIFIED IDEOGRAPH
+ {0xE979, 0x95A5}, //18407 #CJK UNIFIED IDEOGRAPH
+ {0xE97A, 0x95A6}, //18408 #CJK UNIFIED IDEOGRAPH
+ {0xE97B, 0x95A7}, //18409 #CJK UNIFIED IDEOGRAPH
+ {0xE97C, 0x95A8}, //18410 #CJK UNIFIED IDEOGRAPH
+ {0xE97D, 0x95A9}, //18411 #CJK UNIFIED IDEOGRAPH
+ {0xE97E, 0x95AA}, //18412 #CJK UNIFIED IDEOGRAPH
+ {0xE980, 0x95AB}, //18413 #CJK UNIFIED IDEOGRAPH
+ {0xE981, 0x95AC}, //18414 #CJK UNIFIED IDEOGRAPH
+ {0xE982, 0x95AD}, //18415 #CJK UNIFIED IDEOGRAPH
+ {0xE983, 0x95AE}, //18416 #CJK UNIFIED IDEOGRAPH
+ {0xE984, 0x95AF}, //18417 #CJK UNIFIED IDEOGRAPH
+ {0xE985, 0x95B0}, //18418 #CJK UNIFIED IDEOGRAPH
+ {0xE986, 0x95B1}, //18419 #CJK UNIFIED IDEOGRAPH
+ {0xE987, 0x95B2}, //18420 #CJK UNIFIED IDEOGRAPH
+ {0xE988, 0x95B3}, //18421 #CJK UNIFIED IDEOGRAPH
+ {0xE989, 0x95B4}, //18422 #CJK UNIFIED IDEOGRAPH
+ {0xE98A, 0x95B5}, //18423 #CJK UNIFIED IDEOGRAPH
+ {0xE98B, 0x95B6}, //18424 #CJK UNIFIED IDEOGRAPH
+ {0xE98C, 0x95B7}, //18425 #CJK UNIFIED IDEOGRAPH
+ {0xE98D, 0x95B8}, //18426 #CJK UNIFIED IDEOGRAPH
+ {0xE98E, 0x95B9}, //18427 #CJK UNIFIED IDEOGRAPH
+ {0xE98F, 0x95BA}, //18428 #CJK UNIFIED IDEOGRAPH
+ {0xE990, 0x95BB}, //18429 #CJK UNIFIED IDEOGRAPH
+ {0xE991, 0x95BC}, //18430 #CJK UNIFIED IDEOGRAPH
+ {0xE992, 0x95BD}, //18431 #CJK UNIFIED IDEOGRAPH
+ {0xE993, 0x95BE}, //18432 #CJK UNIFIED IDEOGRAPH
+ {0xE994, 0x95BF}, //18433 #CJK UNIFIED IDEOGRAPH
+ {0xE995, 0x95C0}, //18434 #CJK UNIFIED IDEOGRAPH
+ {0xE996, 0x95C1}, //18435 #CJK UNIFIED IDEOGRAPH
+ {0xE997, 0x95C2}, //18436 #CJK UNIFIED IDEOGRAPH
+ {0xE998, 0x95C3}, //18437 #CJK UNIFIED IDEOGRAPH
+ {0xE999, 0x95C4}, //18438 #CJK UNIFIED IDEOGRAPH
+ {0xE99A, 0x95C5}, //18439 #CJK UNIFIED IDEOGRAPH
+ {0xE99B, 0x95C6}, //18440 #CJK UNIFIED IDEOGRAPH
+ {0xE99C, 0x95C7}, //18441 #CJK UNIFIED IDEOGRAPH
+ {0xE99D, 0x95C8}, //18442 #CJK UNIFIED IDEOGRAPH
+ {0xE99E, 0x95C9}, //18443 #CJK UNIFIED IDEOGRAPH
+ {0xE99F, 0x95CA}, //18444 #CJK UNIFIED IDEOGRAPH
+ {0xE9A0, 0x95CB}, //18445 #CJK UNIFIED IDEOGRAPH
+ {0xE9A1, 0x6924}, //18446 #CJK UNIFIED IDEOGRAPH
+ {0xE9A2, 0x68F0}, //18447 #CJK UNIFIED IDEOGRAPH
+ {0xE9A3, 0x690B}, //18448 #CJK UNIFIED IDEOGRAPH
+ {0xE9A4, 0x6901}, //18449 #CJK UNIFIED IDEOGRAPH
+ {0xE9A5, 0x6957}, //18450 #CJK UNIFIED IDEOGRAPH
+ {0xE9A6, 0x68E3}, //18451 #CJK UNIFIED IDEOGRAPH
+ {0xE9A7, 0x6910}, //18452 #CJK UNIFIED IDEOGRAPH
+ {0xE9A8, 0x6971}, //18453 #CJK UNIFIED IDEOGRAPH
+ {0xE9A9, 0x6939}, //18454 #CJK UNIFIED IDEOGRAPH
+ {0xE9AA, 0x6960}, //18455 #CJK UNIFIED IDEOGRAPH
+ {0xE9AB, 0x6942}, //18456 #CJK UNIFIED IDEOGRAPH
+ {0xE9AC, 0x695D}, //18457 #CJK UNIFIED IDEOGRAPH
+ {0xE9AD, 0x6984}, //18458 #CJK UNIFIED IDEOGRAPH
+ {0xE9AE, 0x696B}, //18459 #CJK UNIFIED IDEOGRAPH
+ {0xE9AF, 0x6980}, //18460 #CJK UNIFIED IDEOGRAPH
+ {0xE9B0, 0x6998}, //18461 #CJK UNIFIED IDEOGRAPH
+ {0xE9B1, 0x6978}, //18462 #CJK UNIFIED IDEOGRAPH
+ {0xE9B2, 0x6934}, //18463 #CJK UNIFIED IDEOGRAPH
+ {0xE9B3, 0x69CC}, //18464 #CJK UNIFIED IDEOGRAPH
+ {0xE9B4, 0x6987}, //18465 #CJK UNIFIED IDEOGRAPH
+ {0xE9B5, 0x6988}, //18466 #CJK UNIFIED IDEOGRAPH
+ {0xE9B6, 0x69CE}, //18467 #CJK UNIFIED IDEOGRAPH
+ {0xE9B7, 0x6989}, //18468 #CJK UNIFIED IDEOGRAPH
+ {0xE9B8, 0x6966}, //18469 #CJK UNIFIED IDEOGRAPH
+ {0xE9B9, 0x6963}, //18470 #CJK UNIFIED IDEOGRAPH
+ {0xE9BA, 0x6979}, //18471 #CJK UNIFIED IDEOGRAPH
+ {0xE9BB, 0x699B}, //18472 #CJK UNIFIED IDEOGRAPH
+ {0xE9BC, 0x69A7}, //18473 #CJK UNIFIED IDEOGRAPH
+ {0xE9BD, 0x69BB}, //18474 #CJK UNIFIED IDEOGRAPH
+ {0xE9BE, 0x69AB}, //18475 #CJK UNIFIED IDEOGRAPH
+ {0xE9BF, 0x69AD}, //18476 #CJK UNIFIED IDEOGRAPH
+ {0xE9C0, 0x69D4}, //18477 #CJK UNIFIED IDEOGRAPH
+ {0xE9C1, 0x69B1}, //18478 #CJK UNIFIED IDEOGRAPH
+ {0xE9C2, 0x69C1}, //18479 #CJK UNIFIED IDEOGRAPH
+ {0xE9C3, 0x69CA}, //18480 #CJK UNIFIED IDEOGRAPH
+ {0xE9C4, 0x69DF}, //18481 #CJK UNIFIED IDEOGRAPH
+ {0xE9C5, 0x6995}, //18482 #CJK UNIFIED IDEOGRAPH
+ {0xE9C6, 0x69E0}, //18483 #CJK UNIFIED IDEOGRAPH
+ {0xE9C7, 0x698D}, //18484 #CJK UNIFIED IDEOGRAPH
+ {0xE9C8, 0x69FF}, //18485 #CJK UNIFIED IDEOGRAPH
+ {0xE9C9, 0x6A2F}, //18486 #CJK UNIFIED IDEOGRAPH
+ {0xE9CA, 0x69ED}, //18487 #CJK UNIFIED IDEOGRAPH
+ {0xE9CB, 0x6A17}, //18488 #CJK UNIFIED IDEOGRAPH
+ {0xE9CC, 0x6A18}, //18489 #CJK UNIFIED IDEOGRAPH
+ {0xE9CD, 0x6A65}, //18490 #CJK UNIFIED IDEOGRAPH
+ {0xE9CE, 0x69F2}, //18491 #CJK UNIFIED IDEOGRAPH
+ {0xE9CF, 0x6A44}, //18492 #CJK UNIFIED IDEOGRAPH
+ {0xE9D0, 0x6A3E}, //18493 #CJK UNIFIED IDEOGRAPH
+ {0xE9D1, 0x6AA0}, //18494 #CJK UNIFIED IDEOGRAPH
+ {0xE9D2, 0x6A50}, //18495 #CJK UNIFIED IDEOGRAPH
+ {0xE9D3, 0x6A5B}, //18496 #CJK UNIFIED IDEOGRAPH
+ {0xE9D4, 0x6A35}, //18497 #CJK UNIFIED IDEOGRAPH
+ {0xE9D5, 0x6A8E}, //18498 #CJK UNIFIED IDEOGRAPH
+ {0xE9D6, 0x6A79}, //18499 #CJK UNIFIED IDEOGRAPH
+ {0xE9D7, 0x6A3D}, //18500 #CJK UNIFIED IDEOGRAPH
+ {0xE9D8, 0x6A28}, //18501 #CJK UNIFIED IDEOGRAPH
+ {0xE9D9, 0x6A58}, //18502 #CJK UNIFIED IDEOGRAPH
+ {0xE9DA, 0x6A7C}, //18503 #CJK UNIFIED IDEOGRAPH
+ {0xE9DB, 0x6A91}, //18504 #CJK UNIFIED IDEOGRAPH
+ {0xE9DC, 0x6A90}, //18505 #CJK UNIFIED IDEOGRAPH
+ {0xE9DD, 0x6AA9}, //18506 #CJK UNIFIED IDEOGRAPH
+ {0xE9DE, 0x6A97}, //18507 #CJK UNIFIED IDEOGRAPH
+ {0xE9DF, 0x6AAB}, //18508 #CJK UNIFIED IDEOGRAPH
+ {0xE9E0, 0x7337}, //18509 #CJK UNIFIED IDEOGRAPH
+ {0xE9E1, 0x7352}, //18510 #CJK UNIFIED IDEOGRAPH
+ {0xE9E2, 0x6B81}, //18511 #CJK UNIFIED IDEOGRAPH
+ {0xE9E3, 0x6B82}, //18512 #CJK UNIFIED IDEOGRAPH
+ {0xE9E4, 0x6B87}, //18513 #CJK UNIFIED IDEOGRAPH
+ {0xE9E5, 0x6B84}, //18514 #CJK UNIFIED IDEOGRAPH
+ {0xE9E6, 0x6B92}, //18515 #CJK UNIFIED IDEOGRAPH
+ {0xE9E7, 0x6B93}, //18516 #CJK UNIFIED IDEOGRAPH
+ {0xE9E8, 0x6B8D}, //18517 #CJK UNIFIED IDEOGRAPH
+ {0xE9E9, 0x6B9A}, //18518 #CJK UNIFIED IDEOGRAPH
+ {0xE9EA, 0x6B9B}, //18519 #CJK UNIFIED IDEOGRAPH
+ {0xE9EB, 0x6BA1}, //18520 #CJK UNIFIED IDEOGRAPH
+ {0xE9EC, 0x6BAA}, //18521 #CJK UNIFIED IDEOGRAPH
+ {0xE9ED, 0x8F6B}, //18522 #CJK UNIFIED IDEOGRAPH
+ {0xE9EE, 0x8F6D}, //18523 #CJK UNIFIED IDEOGRAPH
+ {0xE9EF, 0x8F71}, //18524 #CJK UNIFIED IDEOGRAPH
+ {0xE9F0, 0x8F72}, //18525 #CJK UNIFIED IDEOGRAPH
+ {0xE9F1, 0x8F73}, //18526 #CJK UNIFIED IDEOGRAPH
+ {0xE9F2, 0x8F75}, //18527 #CJK UNIFIED IDEOGRAPH
+ {0xE9F3, 0x8F76}, //18528 #CJK UNIFIED IDEOGRAPH
+ {0xE9F4, 0x8F78}, //18529 #CJK UNIFIED IDEOGRAPH
+ {0xE9F5, 0x8F77}, //18530 #CJK UNIFIED IDEOGRAPH
+ {0xE9F6, 0x8F79}, //18531 #CJK UNIFIED IDEOGRAPH
+ {0xE9F7, 0x8F7A}, //18532 #CJK UNIFIED IDEOGRAPH
+ {0xE9F8, 0x8F7C}, //18533 #CJK UNIFIED IDEOGRAPH
+ {0xE9F9, 0x8F7E}, //18534 #CJK UNIFIED IDEOGRAPH
+ {0xE9FA, 0x8F81}, //18535 #CJK UNIFIED IDEOGRAPH
+ {0xE9FB, 0x8F82}, //18536 #CJK UNIFIED IDEOGRAPH
+ {0xE9FC, 0x8F84}, //18537 #CJK UNIFIED IDEOGRAPH
+ {0xE9FD, 0x8F87}, //18538 #CJK UNIFIED IDEOGRAPH
+ {0xE9FE, 0x8F8B}, //18539 #CJK UNIFIED IDEOGRAPH
+ {0xEA40, 0x95CC}, //18540 #CJK UNIFIED IDEOGRAPH
+ {0xEA41, 0x95CD}, //18541 #CJK UNIFIED IDEOGRAPH
+ {0xEA42, 0x95CE}, //18542 #CJK UNIFIED IDEOGRAPH
+ {0xEA43, 0x95CF}, //18543 #CJK UNIFIED IDEOGRAPH
+ {0xEA44, 0x95D0}, //18544 #CJK UNIFIED IDEOGRAPH
+ {0xEA45, 0x95D1}, //18545 #CJK UNIFIED IDEOGRAPH
+ {0xEA46, 0x95D2}, //18546 #CJK UNIFIED IDEOGRAPH
+ {0xEA47, 0x95D3}, //18547 #CJK UNIFIED IDEOGRAPH
+ {0xEA48, 0x95D4}, //18548 #CJK UNIFIED IDEOGRAPH
+ {0xEA49, 0x95D5}, //18549 #CJK UNIFIED IDEOGRAPH
+ {0xEA4A, 0x95D6}, //18550 #CJK UNIFIED IDEOGRAPH
+ {0xEA4B, 0x95D7}, //18551 #CJK UNIFIED IDEOGRAPH
+ {0xEA4C, 0x95D8}, //18552 #CJK UNIFIED IDEOGRAPH
+ {0xEA4D, 0x95D9}, //18553 #CJK UNIFIED IDEOGRAPH
+ {0xEA4E, 0x95DA}, //18554 #CJK UNIFIED IDEOGRAPH
+ {0xEA4F, 0x95DB}, //18555 #CJK UNIFIED IDEOGRAPH
+ {0xEA50, 0x95DC}, //18556 #CJK UNIFIED IDEOGRAPH
+ {0xEA51, 0x95DD}, //18557 #CJK UNIFIED IDEOGRAPH
+ {0xEA52, 0x95DE}, //18558 #CJK UNIFIED IDEOGRAPH
+ {0xEA53, 0x95DF}, //18559 #CJK UNIFIED IDEOGRAPH
+ {0xEA54, 0x95E0}, //18560 #CJK UNIFIED IDEOGRAPH
+ {0xEA55, 0x95E1}, //18561 #CJK UNIFIED IDEOGRAPH
+ {0xEA56, 0x95E2}, //18562 #CJK UNIFIED IDEOGRAPH
+ {0xEA57, 0x95E3}, //18563 #CJK UNIFIED IDEOGRAPH
+ {0xEA58, 0x95E4}, //18564 #CJK UNIFIED IDEOGRAPH
+ {0xEA59, 0x95E5}, //18565 #CJK UNIFIED IDEOGRAPH
+ {0xEA5A, 0x95E6}, //18566 #CJK UNIFIED IDEOGRAPH
+ {0xEA5B, 0x95E7}, //18567 #CJK UNIFIED IDEOGRAPH
+ {0xEA5C, 0x95EC}, //18568 #CJK UNIFIED IDEOGRAPH
+ {0xEA5D, 0x95FF}, //18569 #CJK UNIFIED IDEOGRAPH
+ {0xEA5E, 0x9607}, //18570 #CJK UNIFIED IDEOGRAPH
+ {0xEA5F, 0x9613}, //18571 #CJK UNIFIED IDEOGRAPH
+ {0xEA60, 0x9618}, //18572 #CJK UNIFIED IDEOGRAPH
+ {0xEA61, 0x961B}, //18573 #CJK UNIFIED IDEOGRAPH
+ {0xEA62, 0x961E}, //18574 #CJK UNIFIED IDEOGRAPH
+ {0xEA63, 0x9620}, //18575 #CJK UNIFIED IDEOGRAPH
+ {0xEA64, 0x9623}, //18576 #CJK UNIFIED IDEOGRAPH
+ {0xEA65, 0x9624}, //18577 #CJK UNIFIED IDEOGRAPH
+ {0xEA66, 0x9625}, //18578 #CJK UNIFIED IDEOGRAPH
+ {0xEA67, 0x9626}, //18579 #CJK UNIFIED IDEOGRAPH
+ {0xEA68, 0x9627}, //18580 #CJK UNIFIED IDEOGRAPH
+ {0xEA69, 0x9628}, //18581 #CJK UNIFIED IDEOGRAPH
+ {0xEA6A, 0x9629}, //18582 #CJK UNIFIED IDEOGRAPH
+ {0xEA6B, 0x962B}, //18583 #CJK UNIFIED IDEOGRAPH
+ {0xEA6C, 0x962C}, //18584 #CJK UNIFIED IDEOGRAPH
+ {0xEA6D, 0x962D}, //18585 #CJK UNIFIED IDEOGRAPH
+ {0xEA6E, 0x962F}, //18586 #CJK UNIFIED IDEOGRAPH
+ {0xEA6F, 0x9630}, //18587 #CJK UNIFIED IDEOGRAPH
+ {0xEA70, 0x9637}, //18588 #CJK UNIFIED IDEOGRAPH
+ {0xEA71, 0x9638}, //18589 #CJK UNIFIED IDEOGRAPH
+ {0xEA72, 0x9639}, //18590 #CJK UNIFIED IDEOGRAPH
+ {0xEA73, 0x963A}, //18591 #CJK UNIFIED IDEOGRAPH
+ {0xEA74, 0x963E}, //18592 #CJK UNIFIED IDEOGRAPH
+ {0xEA75, 0x9641}, //18593 #CJK UNIFIED IDEOGRAPH
+ {0xEA76, 0x9643}, //18594 #CJK UNIFIED IDEOGRAPH
+ {0xEA77, 0x964A}, //18595 #CJK UNIFIED IDEOGRAPH
+ {0xEA78, 0x964E}, //18596 #CJK UNIFIED IDEOGRAPH
+ {0xEA79, 0x964F}, //18597 #CJK UNIFIED IDEOGRAPH
+ {0xEA7A, 0x9651}, //18598 #CJK UNIFIED IDEOGRAPH
+ {0xEA7B, 0x9652}, //18599 #CJK UNIFIED IDEOGRAPH
+ {0xEA7C, 0x9653}, //18600 #CJK UNIFIED IDEOGRAPH
+ {0xEA7D, 0x9656}, //18601 #CJK UNIFIED IDEOGRAPH
+ {0xEA7E, 0x9657}, //18602 #CJK UNIFIED IDEOGRAPH
+ {0xEA80, 0x9658}, //18603 #CJK UNIFIED IDEOGRAPH
+ {0xEA81, 0x9659}, //18604 #CJK UNIFIED IDEOGRAPH
+ {0xEA82, 0x965A}, //18605 #CJK UNIFIED IDEOGRAPH
+ {0xEA83, 0x965C}, //18606 #CJK UNIFIED IDEOGRAPH
+ {0xEA84, 0x965D}, //18607 #CJK UNIFIED IDEOGRAPH
+ {0xEA85, 0x965E}, //18608 #CJK UNIFIED IDEOGRAPH
+ {0xEA86, 0x9660}, //18609 #CJK UNIFIED IDEOGRAPH
+ {0xEA87, 0x9663}, //18610 #CJK UNIFIED IDEOGRAPH
+ {0xEA88, 0x9665}, //18611 #CJK UNIFIED IDEOGRAPH
+ {0xEA89, 0x9666}, //18612 #CJK UNIFIED IDEOGRAPH
+ {0xEA8A, 0x966B}, //18613 #CJK UNIFIED IDEOGRAPH
+ {0xEA8B, 0x966D}, //18614 #CJK UNIFIED IDEOGRAPH
+ {0xEA8C, 0x966E}, //18615 #CJK UNIFIED IDEOGRAPH
+ {0xEA8D, 0x966F}, //18616 #CJK UNIFIED IDEOGRAPH
+ {0xEA8E, 0x9670}, //18617 #CJK UNIFIED IDEOGRAPH
+ {0xEA8F, 0x9671}, //18618 #CJK UNIFIED IDEOGRAPH
+ {0xEA90, 0x9673}, //18619 #CJK UNIFIED IDEOGRAPH
+ {0xEA91, 0x9678}, //18620 #CJK UNIFIED IDEOGRAPH
+ {0xEA92, 0x9679}, //18621 #CJK UNIFIED IDEOGRAPH
+ {0xEA93, 0x967A}, //18622 #CJK UNIFIED IDEOGRAPH
+ {0xEA94, 0x967B}, //18623 #CJK UNIFIED IDEOGRAPH
+ {0xEA95, 0x967C}, //18624 #CJK UNIFIED IDEOGRAPH
+ {0xEA96, 0x967D}, //18625 #CJK UNIFIED IDEOGRAPH
+ {0xEA97, 0x967E}, //18626 #CJK UNIFIED IDEOGRAPH
+ {0xEA98, 0x967F}, //18627 #CJK UNIFIED IDEOGRAPH
+ {0xEA99, 0x9680}, //18628 #CJK UNIFIED IDEOGRAPH
+ {0xEA9A, 0x9681}, //18629 #CJK UNIFIED IDEOGRAPH
+ {0xEA9B, 0x9682}, //18630 #CJK UNIFIED IDEOGRAPH
+ {0xEA9C, 0x9683}, //18631 #CJK UNIFIED IDEOGRAPH
+ {0xEA9D, 0x9684}, //18632 #CJK UNIFIED IDEOGRAPH
+ {0xEA9E, 0x9687}, //18633 #CJK UNIFIED IDEOGRAPH
+ {0xEA9F, 0x9689}, //18634 #CJK UNIFIED IDEOGRAPH
+ {0xEAA0, 0x968A}, //18635 #CJK UNIFIED IDEOGRAPH
+ {0xEAA1, 0x8F8D}, //18636 #CJK UNIFIED IDEOGRAPH
+ {0xEAA2, 0x8F8E}, //18637 #CJK UNIFIED IDEOGRAPH
+ {0xEAA3, 0x8F8F}, //18638 #CJK UNIFIED IDEOGRAPH
+ {0xEAA4, 0x8F98}, //18639 #CJK UNIFIED IDEOGRAPH
+ {0xEAA5, 0x8F9A}, //18640 #CJK UNIFIED IDEOGRAPH
+ {0xEAA6, 0x8ECE}, //18641 #CJK UNIFIED IDEOGRAPH
+ {0xEAA7, 0x620B}, //18642 #CJK UNIFIED IDEOGRAPH
+ {0xEAA8, 0x6217}, //18643 #CJK UNIFIED IDEOGRAPH
+ {0xEAA9, 0x621B}, //18644 #CJK UNIFIED IDEOGRAPH
+ {0xEAAA, 0x621F}, //18645 #CJK UNIFIED IDEOGRAPH
+ {0xEAAB, 0x6222}, //18646 #CJK UNIFIED IDEOGRAPH
+ {0xEAAC, 0x6221}, //18647 #CJK UNIFIED IDEOGRAPH
+ {0xEAAD, 0x6225}, //18648 #CJK UNIFIED IDEOGRAPH
+ {0xEAAE, 0x6224}, //18649 #CJK UNIFIED IDEOGRAPH
+ {0xEAAF, 0x622C}, //18650 #CJK UNIFIED IDEOGRAPH
+ {0xEAB0, 0x81E7}, //18651 #CJK UNIFIED IDEOGRAPH
+ {0xEAB1, 0x74EF}, //18652 #CJK UNIFIED IDEOGRAPH
+ {0xEAB2, 0x74F4}, //18653 #CJK UNIFIED IDEOGRAPH
+ {0xEAB3, 0x74FF}, //18654 #CJK UNIFIED IDEOGRAPH
+ {0xEAB4, 0x750F}, //18655 #CJK UNIFIED IDEOGRAPH
+ {0xEAB5, 0x7511}, //18656 #CJK UNIFIED IDEOGRAPH
+ {0xEAB6, 0x7513}, //18657 #CJK UNIFIED IDEOGRAPH
+ {0xEAB7, 0x6534}, //18658 #CJK UNIFIED IDEOGRAPH
+ {0xEAB8, 0x65EE}, //18659 #CJK UNIFIED IDEOGRAPH
+ {0xEAB9, 0x65EF}, //18660 #CJK UNIFIED IDEOGRAPH
+ {0xEABA, 0x65F0}, //18661 #CJK UNIFIED IDEOGRAPH
+ {0xEABB, 0x660A}, //18662 #CJK UNIFIED IDEOGRAPH
+ {0xEABC, 0x6619}, //18663 #CJK UNIFIED IDEOGRAPH
+ {0xEABD, 0x6772}, //18664 #CJK UNIFIED IDEOGRAPH
+ {0xEABE, 0x6603}, //18665 #CJK UNIFIED IDEOGRAPH
+ {0xEABF, 0x6615}, //18666 #CJK UNIFIED IDEOGRAPH
+ {0xEAC0, 0x6600}, //18667 #CJK UNIFIED IDEOGRAPH
+ {0xEAC1, 0x7085}, //18668 #CJK UNIFIED IDEOGRAPH
+ {0xEAC2, 0x66F7}, //18669 #CJK UNIFIED IDEOGRAPH
+ {0xEAC3, 0x661D}, //18670 #CJK UNIFIED IDEOGRAPH
+ {0xEAC4, 0x6634}, //18671 #CJK UNIFIED IDEOGRAPH
+ {0xEAC5, 0x6631}, //18672 #CJK UNIFIED IDEOGRAPH
+ {0xEAC6, 0x6636}, //18673 #CJK UNIFIED IDEOGRAPH
+ {0xEAC7, 0x6635}, //18674 #CJK UNIFIED IDEOGRAPH
+ {0xEAC8, 0x8006}, //18675 #CJK UNIFIED IDEOGRAPH
+ {0xEAC9, 0x665F}, //18676 #CJK UNIFIED IDEOGRAPH
+ {0xEACA, 0x6654}, //18677 #CJK UNIFIED IDEOGRAPH
+ {0xEACB, 0x6641}, //18678 #CJK UNIFIED IDEOGRAPH
+ {0xEACC, 0x664F}, //18679 #CJK UNIFIED IDEOGRAPH
+ {0xEACD, 0x6656}, //18680 #CJK UNIFIED IDEOGRAPH
+ {0xEACE, 0x6661}, //18681 #CJK UNIFIED IDEOGRAPH
+ {0xEACF, 0x6657}, //18682 #CJK UNIFIED IDEOGRAPH
+ {0xEAD0, 0x6677}, //18683 #CJK UNIFIED IDEOGRAPH
+ {0xEAD1, 0x6684}, //18684 #CJK UNIFIED IDEOGRAPH
+ {0xEAD2, 0x668C}, //18685 #CJK UNIFIED IDEOGRAPH
+ {0xEAD3, 0x66A7}, //18686 #CJK UNIFIED IDEOGRAPH
+ {0xEAD4, 0x669D}, //18687 #CJK UNIFIED IDEOGRAPH
+ {0xEAD5, 0x66BE}, //18688 #CJK UNIFIED IDEOGRAPH
+ {0xEAD6, 0x66DB}, //18689 #CJK UNIFIED IDEOGRAPH
+ {0xEAD7, 0x66DC}, //18690 #CJK UNIFIED IDEOGRAPH
+ {0xEAD8, 0x66E6}, //18691 #CJK UNIFIED IDEOGRAPH
+ {0xEAD9, 0x66E9}, //18692 #CJK UNIFIED IDEOGRAPH
+ {0xEADA, 0x8D32}, //18693 #CJK UNIFIED IDEOGRAPH
+ {0xEADB, 0x8D33}, //18694 #CJK UNIFIED IDEOGRAPH
+ {0xEADC, 0x8D36}, //18695 #CJK UNIFIED IDEOGRAPH
+ {0xEADD, 0x8D3B}, //18696 #CJK UNIFIED IDEOGRAPH
+ {0xEADE, 0x8D3D}, //18697 #CJK UNIFIED IDEOGRAPH
+ {0xEADF, 0x8D40}, //18698 #CJK UNIFIED IDEOGRAPH
+ {0xEAE0, 0x8D45}, //18699 #CJK UNIFIED IDEOGRAPH
+ {0xEAE1, 0x8D46}, //18700 #CJK UNIFIED IDEOGRAPH
+ {0xEAE2, 0x8D48}, //18701 #CJK UNIFIED IDEOGRAPH
+ {0xEAE3, 0x8D49}, //18702 #CJK UNIFIED IDEOGRAPH
+ {0xEAE4, 0x8D47}, //18703 #CJK UNIFIED IDEOGRAPH
+ {0xEAE5, 0x8D4D}, //18704 #CJK UNIFIED IDEOGRAPH
+ {0xEAE6, 0x8D55}, //18705 #CJK UNIFIED IDEOGRAPH
+ {0xEAE7, 0x8D59}, //18706 #CJK UNIFIED IDEOGRAPH
+ {0xEAE8, 0x89C7}, //18707 #CJK UNIFIED IDEOGRAPH
+ {0xEAE9, 0x89CA}, //18708 #CJK UNIFIED IDEOGRAPH
+ {0xEAEA, 0x89CB}, //18709 #CJK UNIFIED IDEOGRAPH
+ {0xEAEB, 0x89CC}, //18710 #CJK UNIFIED IDEOGRAPH
+ {0xEAEC, 0x89CE}, //18711 #CJK UNIFIED IDEOGRAPH
+ {0xEAED, 0x89CF}, //18712 #CJK UNIFIED IDEOGRAPH
+ {0xEAEE, 0x89D0}, //18713 #CJK UNIFIED IDEOGRAPH
+ {0xEAEF, 0x89D1}, //18714 #CJK UNIFIED IDEOGRAPH
+ {0xEAF0, 0x726E}, //18715 #CJK UNIFIED IDEOGRAPH
+ {0xEAF1, 0x729F}, //18716 #CJK UNIFIED IDEOGRAPH
+ {0xEAF2, 0x725D}, //18717 #CJK UNIFIED IDEOGRAPH
+ {0xEAF3, 0x7266}, //18718 #CJK UNIFIED IDEOGRAPH
+ {0xEAF4, 0x726F}, //18719 #CJK UNIFIED IDEOGRAPH
+ {0xEAF5, 0x727E}, //18720 #CJK UNIFIED IDEOGRAPH
+ {0xEAF6, 0x727F}, //18721 #CJK UNIFIED IDEOGRAPH
+ {0xEAF7, 0x7284}, //18722 #CJK UNIFIED IDEOGRAPH
+ {0xEAF8, 0x728B}, //18723 #CJK UNIFIED IDEOGRAPH
+ {0xEAF9, 0x728D}, //18724 #CJK UNIFIED IDEOGRAPH
+ {0xEAFA, 0x728F}, //18725 #CJK UNIFIED IDEOGRAPH
+ {0xEAFB, 0x7292}, //18726 #CJK UNIFIED IDEOGRAPH
+ {0xEAFC, 0x6308}, //18727 #CJK UNIFIED IDEOGRAPH
+ {0xEAFD, 0x6332}, //18728 #CJK UNIFIED IDEOGRAPH
+ {0xEAFE, 0x63B0}, //18729 #CJK UNIFIED IDEOGRAPH
+ {0xEB40, 0x968C}, //18730 #CJK UNIFIED IDEOGRAPH
+ {0xEB41, 0x968E}, //18731 #CJK UNIFIED IDEOGRAPH
+ {0xEB42, 0x9691}, //18732 #CJK UNIFIED IDEOGRAPH
+ {0xEB43, 0x9692}, //18733 #CJK UNIFIED IDEOGRAPH
+ {0xEB44, 0x9693}, //18734 #CJK UNIFIED IDEOGRAPH
+ {0xEB45, 0x9695}, //18735 #CJK UNIFIED IDEOGRAPH
+ {0xEB46, 0x9696}, //18736 #CJK UNIFIED IDEOGRAPH
+ {0xEB47, 0x969A}, //18737 #CJK UNIFIED IDEOGRAPH
+ {0xEB48, 0x969B}, //18738 #CJK UNIFIED IDEOGRAPH
+ {0xEB49, 0x969D}, //18739 #CJK UNIFIED IDEOGRAPH
+ {0xEB4A, 0x969E}, //18740 #CJK UNIFIED IDEOGRAPH
+ {0xEB4B, 0x969F}, //18741 #CJK UNIFIED IDEOGRAPH
+ {0xEB4C, 0x96A0}, //18742 #CJK UNIFIED IDEOGRAPH
+ {0xEB4D, 0x96A1}, //18743 #CJK UNIFIED IDEOGRAPH
+ {0xEB4E, 0x96A2}, //18744 #CJK UNIFIED IDEOGRAPH
+ {0xEB4F, 0x96A3}, //18745 #CJK UNIFIED IDEOGRAPH
+ {0xEB50, 0x96A4}, //18746 #CJK UNIFIED IDEOGRAPH
+ {0xEB51, 0x96A5}, //18747 #CJK UNIFIED IDEOGRAPH
+ {0xEB52, 0x96A6}, //18748 #CJK UNIFIED IDEOGRAPH
+ {0xEB53, 0x96A8}, //18749 #CJK UNIFIED IDEOGRAPH
+ {0xEB54, 0x96A9}, //18750 #CJK UNIFIED IDEOGRAPH
+ {0xEB55, 0x96AA}, //18751 #CJK UNIFIED IDEOGRAPH
+ {0xEB56, 0x96AB}, //18752 #CJK UNIFIED IDEOGRAPH
+ {0xEB57, 0x96AC}, //18753 #CJK UNIFIED IDEOGRAPH
+ {0xEB58, 0x96AD}, //18754 #CJK UNIFIED IDEOGRAPH
+ {0xEB59, 0x96AE}, //18755 #CJK UNIFIED IDEOGRAPH
+ {0xEB5A, 0x96AF}, //18756 #CJK UNIFIED IDEOGRAPH
+ {0xEB5B, 0x96B1}, //18757 #CJK UNIFIED IDEOGRAPH
+ {0xEB5C, 0x96B2}, //18758 #CJK UNIFIED IDEOGRAPH
+ {0xEB5D, 0x96B4}, //18759 #CJK UNIFIED IDEOGRAPH
+ {0xEB5E, 0x96B5}, //18760 #CJK UNIFIED IDEOGRAPH
+ {0xEB5F, 0x96B7}, //18761 #CJK UNIFIED IDEOGRAPH
+ {0xEB60, 0x96B8}, //18762 #CJK UNIFIED IDEOGRAPH
+ {0xEB61, 0x96BA}, //18763 #CJK UNIFIED IDEOGRAPH
+ {0xEB62, 0x96BB}, //18764 #CJK UNIFIED IDEOGRAPH
+ {0xEB63, 0x96BF}, //18765 #CJK UNIFIED IDEOGRAPH
+ {0xEB64, 0x96C2}, //18766 #CJK UNIFIED IDEOGRAPH
+ {0xEB65, 0x96C3}, //18767 #CJK UNIFIED IDEOGRAPH
+ {0xEB66, 0x96C8}, //18768 #CJK UNIFIED IDEOGRAPH
+ {0xEB67, 0x96CA}, //18769 #CJK UNIFIED IDEOGRAPH
+ {0xEB68, 0x96CB}, //18770 #CJK UNIFIED IDEOGRAPH
+ {0xEB69, 0x96D0}, //18771 #CJK UNIFIED IDEOGRAPH
+ {0xEB6A, 0x96D1}, //18772 #CJK UNIFIED IDEOGRAPH
+ {0xEB6B, 0x96D3}, //18773 #CJK UNIFIED IDEOGRAPH
+ {0xEB6C, 0x96D4}, //18774 #CJK UNIFIED IDEOGRAPH
+ {0xEB6D, 0x96D6}, //18775 #CJK UNIFIED IDEOGRAPH
+ {0xEB6E, 0x96D7}, //18776 #CJK UNIFIED IDEOGRAPH
+ {0xEB6F, 0x96D8}, //18777 #CJK UNIFIED IDEOGRAPH
+ {0xEB70, 0x96D9}, //18778 #CJK UNIFIED IDEOGRAPH
+ {0xEB71, 0x96DA}, //18779 #CJK UNIFIED IDEOGRAPH
+ {0xEB72, 0x96DB}, //18780 #CJK UNIFIED IDEOGRAPH
+ {0xEB73, 0x96DC}, //18781 #CJK UNIFIED IDEOGRAPH
+ {0xEB74, 0x96DD}, //18782 #CJK UNIFIED IDEOGRAPH
+ {0xEB75, 0x96DE}, //18783 #CJK UNIFIED IDEOGRAPH
+ {0xEB76, 0x96DF}, //18784 #CJK UNIFIED IDEOGRAPH
+ {0xEB77, 0x96E1}, //18785 #CJK UNIFIED IDEOGRAPH
+ {0xEB78, 0x96E2}, //18786 #CJK UNIFIED IDEOGRAPH
+ {0xEB79, 0x96E3}, //18787 #CJK UNIFIED IDEOGRAPH
+ {0xEB7A, 0x96E4}, //18788 #CJK UNIFIED IDEOGRAPH
+ {0xEB7B, 0x96E5}, //18789 #CJK UNIFIED IDEOGRAPH
+ {0xEB7C, 0x96E6}, //18790 #CJK UNIFIED IDEOGRAPH
+ {0xEB7D, 0x96E7}, //18791 #CJK UNIFIED IDEOGRAPH
+ {0xEB7E, 0x96EB}, //18792 #CJK UNIFIED IDEOGRAPH
+ {0xEB80, 0x96EC}, //18793 #CJK UNIFIED IDEOGRAPH
+ {0xEB81, 0x96ED}, //18794 #CJK UNIFIED IDEOGRAPH
+ {0xEB82, 0x96EE}, //18795 #CJK UNIFIED IDEOGRAPH
+ {0xEB83, 0x96F0}, //18796 #CJK UNIFIED IDEOGRAPH
+ {0xEB84, 0x96F1}, //18797 #CJK UNIFIED IDEOGRAPH
+ {0xEB85, 0x96F2}, //18798 #CJK UNIFIED IDEOGRAPH
+ {0xEB86, 0x96F4}, //18799 #CJK UNIFIED IDEOGRAPH
+ {0xEB87, 0x96F5}, //18800 #CJK UNIFIED IDEOGRAPH
+ {0xEB88, 0x96F8}, //18801 #CJK UNIFIED IDEOGRAPH
+ {0xEB89, 0x96FA}, //18802 #CJK UNIFIED IDEOGRAPH
+ {0xEB8A, 0x96FB}, //18803 #CJK UNIFIED IDEOGRAPH
+ {0xEB8B, 0x96FC}, //18804 #CJK UNIFIED IDEOGRAPH
+ {0xEB8C, 0x96FD}, //18805 #CJK UNIFIED IDEOGRAPH
+ {0xEB8D, 0x96FF}, //18806 #CJK UNIFIED IDEOGRAPH
+ {0xEB8E, 0x9702}, //18807 #CJK UNIFIED IDEOGRAPH
+ {0xEB8F, 0x9703}, //18808 #CJK UNIFIED IDEOGRAPH
+ {0xEB90, 0x9705}, //18809 #CJK UNIFIED IDEOGRAPH
+ {0xEB91, 0x970A}, //18810 #CJK UNIFIED IDEOGRAPH
+ {0xEB92, 0x970B}, //18811 #CJK UNIFIED IDEOGRAPH
+ {0xEB93, 0x970C}, //18812 #CJK UNIFIED IDEOGRAPH
+ {0xEB94, 0x9710}, //18813 #CJK UNIFIED IDEOGRAPH
+ {0xEB95, 0x9711}, //18814 #CJK UNIFIED IDEOGRAPH
+ {0xEB96, 0x9712}, //18815 #CJK UNIFIED IDEOGRAPH
+ {0xEB97, 0x9714}, //18816 #CJK UNIFIED IDEOGRAPH
+ {0xEB98, 0x9715}, //18817 #CJK UNIFIED IDEOGRAPH
+ {0xEB99, 0x9717}, //18818 #CJK UNIFIED IDEOGRAPH
+ {0xEB9A, 0x9718}, //18819 #CJK UNIFIED IDEOGRAPH
+ {0xEB9B, 0x9719}, //18820 #CJK UNIFIED IDEOGRAPH
+ {0xEB9C, 0x971A}, //18821 #CJK UNIFIED IDEOGRAPH
+ {0xEB9D, 0x971B}, //18822 #CJK UNIFIED IDEOGRAPH
+ {0xEB9E, 0x971D}, //18823 #CJK UNIFIED IDEOGRAPH
+ {0xEB9F, 0x971F}, //18824 #CJK UNIFIED IDEOGRAPH
+ {0xEBA0, 0x9720}, //18825 #CJK UNIFIED IDEOGRAPH
+ {0xEBA1, 0x643F}, //18826 #CJK UNIFIED IDEOGRAPH
+ {0xEBA2, 0x64D8}, //18827 #CJK UNIFIED IDEOGRAPH
+ {0xEBA3, 0x8004}, //18828 #CJK UNIFIED IDEOGRAPH
+ {0xEBA4, 0x6BEA}, //18829 #CJK UNIFIED IDEOGRAPH
+ {0xEBA5, 0x6BF3}, //18830 #CJK UNIFIED IDEOGRAPH
+ {0xEBA6, 0x6BFD}, //18831 #CJK UNIFIED IDEOGRAPH
+ {0xEBA7, 0x6BF5}, //18832 #CJK UNIFIED IDEOGRAPH
+ {0xEBA8, 0x6BF9}, //18833 #CJK UNIFIED IDEOGRAPH
+ {0xEBA9, 0x6C05}, //18834 #CJK UNIFIED IDEOGRAPH
+ {0xEBAA, 0x6C07}, //18835 #CJK UNIFIED IDEOGRAPH
+ {0xEBAB, 0x6C06}, //18836 #CJK UNIFIED IDEOGRAPH
+ {0xEBAC, 0x6C0D}, //18837 #CJK UNIFIED IDEOGRAPH
+ {0xEBAD, 0x6C15}, //18838 #CJK UNIFIED IDEOGRAPH
+ {0xEBAE, 0x6C18}, //18839 #CJK UNIFIED IDEOGRAPH
+ {0xEBAF, 0x6C19}, //18840 #CJK UNIFIED IDEOGRAPH
+ {0xEBB0, 0x6C1A}, //18841 #CJK UNIFIED IDEOGRAPH
+ {0xEBB1, 0x6C21}, //18842 #CJK UNIFIED IDEOGRAPH
+ {0xEBB2, 0x6C29}, //18843 #CJK UNIFIED IDEOGRAPH
+ {0xEBB3, 0x6C24}, //18844 #CJK UNIFIED IDEOGRAPH
+ {0xEBB4, 0x6C2A}, //18845 #CJK UNIFIED IDEOGRAPH
+ {0xEBB5, 0x6C32}, //18846 #CJK UNIFIED IDEOGRAPH
+ {0xEBB6, 0x6535}, //18847 #CJK UNIFIED IDEOGRAPH
+ {0xEBB7, 0x6555}, //18848 #CJK UNIFIED IDEOGRAPH
+ {0xEBB8, 0x656B}, //18849 #CJK UNIFIED IDEOGRAPH
+ {0xEBB9, 0x724D}, //18850 #CJK UNIFIED IDEOGRAPH
+ {0xEBBA, 0x7252}, //18851 #CJK UNIFIED IDEOGRAPH
+ {0xEBBB, 0x7256}, //18852 #CJK UNIFIED IDEOGRAPH
+ {0xEBBC, 0x7230}, //18853 #CJK UNIFIED IDEOGRAPH
+ {0xEBBD, 0x8662}, //18854 #CJK UNIFIED IDEOGRAPH
+ {0xEBBE, 0x5216}, //18855 #CJK UNIFIED IDEOGRAPH
+ {0xEBBF, 0x809F}, //18856 #CJK UNIFIED IDEOGRAPH
+ {0xEBC0, 0x809C}, //18857 #CJK UNIFIED IDEOGRAPH
+ {0xEBC1, 0x8093}, //18858 #CJK UNIFIED IDEOGRAPH
+ {0xEBC2, 0x80BC}, //18859 #CJK UNIFIED IDEOGRAPH
+ {0xEBC3, 0x670A}, //18860 #CJK UNIFIED IDEOGRAPH
+ {0xEBC4, 0x80BD}, //18861 #CJK UNIFIED IDEOGRAPH
+ {0xEBC5, 0x80B1}, //18862 #CJK UNIFIED IDEOGRAPH
+ {0xEBC6, 0x80AB}, //18863 #CJK UNIFIED IDEOGRAPH
+ {0xEBC7, 0x80AD}, //18864 #CJK UNIFIED IDEOGRAPH
+ {0xEBC8, 0x80B4}, //18865 #CJK UNIFIED IDEOGRAPH
+ {0xEBC9, 0x80B7}, //18866 #CJK UNIFIED IDEOGRAPH
+ {0xEBCA, 0x80E7}, //18867 #CJK UNIFIED IDEOGRAPH
+ {0xEBCB, 0x80E8}, //18868 #CJK UNIFIED IDEOGRAPH
+ {0xEBCC, 0x80E9}, //18869 #CJK UNIFIED IDEOGRAPH
+ {0xEBCD, 0x80EA}, //18870 #CJK UNIFIED IDEOGRAPH
+ {0xEBCE, 0x80DB}, //18871 #CJK UNIFIED IDEOGRAPH
+ {0xEBCF, 0x80C2}, //18872 #CJK UNIFIED IDEOGRAPH
+ {0xEBD0, 0x80C4}, //18873 #CJK UNIFIED IDEOGRAPH
+ {0xEBD1, 0x80D9}, //18874 #CJK UNIFIED IDEOGRAPH
+ {0xEBD2, 0x80CD}, //18875 #CJK UNIFIED IDEOGRAPH
+ {0xEBD3, 0x80D7}, //18876 #CJK UNIFIED IDEOGRAPH
+ {0xEBD4, 0x6710}, //18877 #CJK UNIFIED IDEOGRAPH
+ {0xEBD5, 0x80DD}, //18878 #CJK UNIFIED IDEOGRAPH
+ {0xEBD6, 0x80EB}, //18879 #CJK UNIFIED IDEOGRAPH
+ {0xEBD7, 0x80F1}, //18880 #CJK UNIFIED IDEOGRAPH
+ {0xEBD8, 0x80F4}, //18881 #CJK UNIFIED IDEOGRAPH
+ {0xEBD9, 0x80ED}, //18882 #CJK UNIFIED IDEOGRAPH
+ {0xEBDA, 0x810D}, //18883 #CJK UNIFIED IDEOGRAPH
+ {0xEBDB, 0x810E}, //18884 #CJK UNIFIED IDEOGRAPH
+ {0xEBDC, 0x80F2}, //18885 #CJK UNIFIED IDEOGRAPH
+ {0xEBDD, 0x80FC}, //18886 #CJK UNIFIED IDEOGRAPH
+ {0xEBDE, 0x6715}, //18887 #CJK UNIFIED IDEOGRAPH
+ {0xEBDF, 0x8112}, //18888 #CJK UNIFIED IDEOGRAPH
+ {0xEBE0, 0x8C5A}, //18889 #CJK UNIFIED IDEOGRAPH
+ {0xEBE1, 0x8136}, //18890 #CJK UNIFIED IDEOGRAPH
+ {0xEBE2, 0x811E}, //18891 #CJK UNIFIED IDEOGRAPH
+ {0xEBE3, 0x812C}, //18892 #CJK UNIFIED IDEOGRAPH
+ {0xEBE4, 0x8118}, //18893 #CJK UNIFIED IDEOGRAPH
+ {0xEBE5, 0x8132}, //18894 #CJK UNIFIED IDEOGRAPH
+ {0xEBE6, 0x8148}, //18895 #CJK UNIFIED IDEOGRAPH
+ {0xEBE7, 0x814C}, //18896 #CJK UNIFIED IDEOGRAPH
+ {0xEBE8, 0x8153}, //18897 #CJK UNIFIED IDEOGRAPH
+ {0xEBE9, 0x8174}, //18898 #CJK UNIFIED IDEOGRAPH
+ {0xEBEA, 0x8159}, //18899 #CJK UNIFIED IDEOGRAPH
+ {0xEBEB, 0x815A}, //18900 #CJK UNIFIED IDEOGRAPH
+ {0xEBEC, 0x8171}, //18901 #CJK UNIFIED IDEOGRAPH
+ {0xEBED, 0x8160}, //18902 #CJK UNIFIED IDEOGRAPH
+ {0xEBEE, 0x8169}, //18903 #CJK UNIFIED IDEOGRAPH
+ {0xEBEF, 0x817C}, //18904 #CJK UNIFIED IDEOGRAPH
+ {0xEBF0, 0x817D}, //18905 #CJK UNIFIED IDEOGRAPH
+ {0xEBF1, 0x816D}, //18906 #CJK UNIFIED IDEOGRAPH
+ {0xEBF2, 0x8167}, //18907 #CJK UNIFIED IDEOGRAPH
+ {0xEBF3, 0x584D}, //18908 #CJK UNIFIED IDEOGRAPH
+ {0xEBF4, 0x5AB5}, //18909 #CJK UNIFIED IDEOGRAPH
+ {0xEBF5, 0x8188}, //18910 #CJK UNIFIED IDEOGRAPH
+ {0xEBF6, 0x8182}, //18911 #CJK UNIFIED IDEOGRAPH
+ {0xEBF7, 0x8191}, //18912 #CJK UNIFIED IDEOGRAPH
+ {0xEBF8, 0x6ED5}, //18913 #CJK UNIFIED IDEOGRAPH
+ {0xEBF9, 0x81A3}, //18914 #CJK UNIFIED IDEOGRAPH
+ {0xEBFA, 0x81AA}, //18915 #CJK UNIFIED IDEOGRAPH
+ {0xEBFB, 0x81CC}, //18916 #CJK UNIFIED IDEOGRAPH
+ {0xEBFC, 0x6726}, //18917 #CJK UNIFIED IDEOGRAPH
+ {0xEBFD, 0x81CA}, //18918 #CJK UNIFIED IDEOGRAPH
+ {0xEBFE, 0x81BB}, //18919 #CJK UNIFIED IDEOGRAPH
+ {0xEC40, 0x9721}, //18920 #CJK UNIFIED IDEOGRAPH
+ {0xEC41, 0x9722}, //18921 #CJK UNIFIED IDEOGRAPH
+ {0xEC42, 0x9723}, //18922 #CJK UNIFIED IDEOGRAPH
+ {0xEC43, 0x9724}, //18923 #CJK UNIFIED IDEOGRAPH
+ {0xEC44, 0x9725}, //18924 #CJK UNIFIED IDEOGRAPH
+ {0xEC45, 0x9726}, //18925 #CJK UNIFIED IDEOGRAPH
+ {0xEC46, 0x9727}, //18926 #CJK UNIFIED IDEOGRAPH
+ {0xEC47, 0x9728}, //18927 #CJK UNIFIED IDEOGRAPH
+ {0xEC48, 0x9729}, //18928 #CJK UNIFIED IDEOGRAPH
+ {0xEC49, 0x972B}, //18929 #CJK UNIFIED IDEOGRAPH
+ {0xEC4A, 0x972C}, //18930 #CJK UNIFIED IDEOGRAPH
+ {0xEC4B, 0x972E}, //18931 #CJK UNIFIED IDEOGRAPH
+ {0xEC4C, 0x972F}, //18932 #CJK UNIFIED IDEOGRAPH
+ {0xEC4D, 0x9731}, //18933 #CJK UNIFIED IDEOGRAPH
+ {0xEC4E, 0x9733}, //18934 #CJK UNIFIED IDEOGRAPH
+ {0xEC4F, 0x9734}, //18935 #CJK UNIFIED IDEOGRAPH
+ {0xEC50, 0x9735}, //18936 #CJK UNIFIED IDEOGRAPH
+ {0xEC51, 0x9736}, //18937 #CJK UNIFIED IDEOGRAPH
+ {0xEC52, 0x9737}, //18938 #CJK UNIFIED IDEOGRAPH
+ {0xEC53, 0x973A}, //18939 #CJK UNIFIED IDEOGRAPH
+ {0xEC54, 0x973B}, //18940 #CJK UNIFIED IDEOGRAPH
+ {0xEC55, 0x973C}, //18941 #CJK UNIFIED IDEOGRAPH
+ {0xEC56, 0x973D}, //18942 #CJK UNIFIED IDEOGRAPH
+ {0xEC57, 0x973F}, //18943 #CJK UNIFIED IDEOGRAPH
+ {0xEC58, 0x9740}, //18944 #CJK UNIFIED IDEOGRAPH
+ {0xEC59, 0x9741}, //18945 #CJK UNIFIED IDEOGRAPH
+ {0xEC5A, 0x9742}, //18946 #CJK UNIFIED IDEOGRAPH
+ {0xEC5B, 0x9743}, //18947 #CJK UNIFIED IDEOGRAPH
+ {0xEC5C, 0x9744}, //18948 #CJK UNIFIED IDEOGRAPH
+ {0xEC5D, 0x9745}, //18949 #CJK UNIFIED IDEOGRAPH
+ {0xEC5E, 0x9746}, //18950 #CJK UNIFIED IDEOGRAPH
+ {0xEC5F, 0x9747}, //18951 #CJK UNIFIED IDEOGRAPH
+ {0xEC60, 0x9748}, //18952 #CJK UNIFIED IDEOGRAPH
+ {0xEC61, 0x9749}, //18953 #CJK UNIFIED IDEOGRAPH
+ {0xEC62, 0x974A}, //18954 #CJK UNIFIED IDEOGRAPH
+ {0xEC63, 0x974B}, //18955 #CJK UNIFIED IDEOGRAPH
+ {0xEC64, 0x974C}, //18956 #CJK UNIFIED IDEOGRAPH
+ {0xEC65, 0x974D}, //18957 #CJK UNIFIED IDEOGRAPH
+ {0xEC66, 0x974E}, //18958 #CJK UNIFIED IDEOGRAPH
+ {0xEC67, 0x974F}, //18959 #CJK UNIFIED IDEOGRAPH
+ {0xEC68, 0x9750}, //18960 #CJK UNIFIED IDEOGRAPH
+ {0xEC69, 0x9751}, //18961 #CJK UNIFIED IDEOGRAPH
+ {0xEC6A, 0x9754}, //18962 #CJK UNIFIED IDEOGRAPH
+ {0xEC6B, 0x9755}, //18963 #CJK UNIFIED IDEOGRAPH
+ {0xEC6C, 0x9757}, //18964 #CJK UNIFIED IDEOGRAPH
+ {0xEC6D, 0x9758}, //18965 #CJK UNIFIED IDEOGRAPH
+ {0xEC6E, 0x975A}, //18966 #CJK UNIFIED IDEOGRAPH
+ {0xEC6F, 0x975C}, //18967 #CJK UNIFIED IDEOGRAPH
+ {0xEC70, 0x975D}, //18968 #CJK UNIFIED IDEOGRAPH
+ {0xEC71, 0x975F}, //18969 #CJK UNIFIED IDEOGRAPH
+ {0xEC72, 0x9763}, //18970 #CJK UNIFIED IDEOGRAPH
+ {0xEC73, 0x9764}, //18971 #CJK UNIFIED IDEOGRAPH
+ {0xEC74, 0x9766}, //18972 #CJK UNIFIED IDEOGRAPH
+ {0xEC75, 0x9767}, //18973 #CJK UNIFIED IDEOGRAPH
+ {0xEC76, 0x9768}, //18974 #CJK UNIFIED IDEOGRAPH
+ {0xEC77, 0x976A}, //18975 #CJK UNIFIED IDEOGRAPH
+ {0xEC78, 0x976B}, //18976 #CJK UNIFIED IDEOGRAPH
+ {0xEC79, 0x976C}, //18977 #CJK UNIFIED IDEOGRAPH
+ {0xEC7A, 0x976D}, //18978 #CJK UNIFIED IDEOGRAPH
+ {0xEC7B, 0x976E}, //18979 #CJK UNIFIED IDEOGRAPH
+ {0xEC7C, 0x976F}, //18980 #CJK UNIFIED IDEOGRAPH
+ {0xEC7D, 0x9770}, //18981 #CJK UNIFIED IDEOGRAPH
+ {0xEC7E, 0x9771}, //18982 #CJK UNIFIED IDEOGRAPH
+ {0xEC80, 0x9772}, //18983 #CJK UNIFIED IDEOGRAPH
+ {0xEC81, 0x9775}, //18984 #CJK UNIFIED IDEOGRAPH
+ {0xEC82, 0x9777}, //18985 #CJK UNIFIED IDEOGRAPH
+ {0xEC83, 0x9778}, //18986 #CJK UNIFIED IDEOGRAPH
+ {0xEC84, 0x9779}, //18987 #CJK UNIFIED IDEOGRAPH
+ {0xEC85, 0x977A}, //18988 #CJK UNIFIED IDEOGRAPH
+ {0xEC86, 0x977B}, //18989 #CJK UNIFIED IDEOGRAPH
+ {0xEC87, 0x977D}, //18990 #CJK UNIFIED IDEOGRAPH
+ {0xEC88, 0x977E}, //18991 #CJK UNIFIED IDEOGRAPH
+ {0xEC89, 0x977F}, //18992 #CJK UNIFIED IDEOGRAPH
+ {0xEC8A, 0x9780}, //18993 #CJK UNIFIED IDEOGRAPH
+ {0xEC8B, 0x9781}, //18994 #CJK UNIFIED IDEOGRAPH
+ {0xEC8C, 0x9782}, //18995 #CJK UNIFIED IDEOGRAPH
+ {0xEC8D, 0x9783}, //18996 #CJK UNIFIED IDEOGRAPH
+ {0xEC8E, 0x9784}, //18997 #CJK UNIFIED IDEOGRAPH
+ {0xEC8F, 0x9786}, //18998 #CJK UNIFIED IDEOGRAPH
+ {0xEC90, 0x9787}, //18999 #CJK UNIFIED IDEOGRAPH
+ {0xEC91, 0x9788}, //19000 #CJK UNIFIED IDEOGRAPH
+ {0xEC92, 0x9789}, //19001 #CJK UNIFIED IDEOGRAPH
+ {0xEC93, 0x978A}, //19002 #CJK UNIFIED IDEOGRAPH
+ {0xEC94, 0x978C}, //19003 #CJK UNIFIED IDEOGRAPH
+ {0xEC95, 0x978E}, //19004 #CJK UNIFIED IDEOGRAPH
+ {0xEC96, 0x978F}, //19005 #CJK UNIFIED IDEOGRAPH
+ {0xEC97, 0x9790}, //19006 #CJK UNIFIED IDEOGRAPH
+ {0xEC98, 0x9793}, //19007 #CJK UNIFIED IDEOGRAPH
+ {0xEC99, 0x9795}, //19008 #CJK UNIFIED IDEOGRAPH
+ {0xEC9A, 0x9796}, //19009 #CJK UNIFIED IDEOGRAPH
+ {0xEC9B, 0x9797}, //19010 #CJK UNIFIED IDEOGRAPH
+ {0xEC9C, 0x9799}, //19011 #CJK UNIFIED IDEOGRAPH
+ {0xEC9D, 0x979A}, //19012 #CJK UNIFIED IDEOGRAPH
+ {0xEC9E, 0x979B}, //19013 #CJK UNIFIED IDEOGRAPH
+ {0xEC9F, 0x979C}, //19014 #CJK UNIFIED IDEOGRAPH
+ {0xECA0, 0x979D}, //19015 #CJK UNIFIED IDEOGRAPH
+ {0xECA1, 0x81C1}, //19016 #CJK UNIFIED IDEOGRAPH
+ {0xECA2, 0x81A6}, //19017 #CJK UNIFIED IDEOGRAPH
+ {0xECA3, 0x6B24}, //19018 #CJK UNIFIED IDEOGRAPH
+ {0xECA4, 0x6B37}, //19019 #CJK UNIFIED IDEOGRAPH
+ {0xECA5, 0x6B39}, //19020 #CJK UNIFIED IDEOGRAPH
+ {0xECA6, 0x6B43}, //19021 #CJK UNIFIED IDEOGRAPH
+ {0xECA7, 0x6B46}, //19022 #CJK UNIFIED IDEOGRAPH
+ {0xECA8, 0x6B59}, //19023 #CJK UNIFIED IDEOGRAPH
+ {0xECA9, 0x98D1}, //19024 #CJK UNIFIED IDEOGRAPH
+ {0xECAA, 0x98D2}, //19025 #CJK UNIFIED IDEOGRAPH
+ {0xECAB, 0x98D3}, //19026 #CJK UNIFIED IDEOGRAPH
+ {0xECAC, 0x98D5}, //19027 #CJK UNIFIED IDEOGRAPH
+ {0xECAD, 0x98D9}, //19028 #CJK UNIFIED IDEOGRAPH
+ {0xECAE, 0x98DA}, //19029 #CJK UNIFIED IDEOGRAPH
+ {0xECAF, 0x6BB3}, //19030 #CJK UNIFIED IDEOGRAPH
+ {0xECB0, 0x5F40}, //19031 #CJK UNIFIED IDEOGRAPH
+ {0xECB1, 0x6BC2}, //19032 #CJK UNIFIED IDEOGRAPH
+ {0xECB2, 0x89F3}, //19033 #CJK UNIFIED IDEOGRAPH
+ {0xECB3, 0x6590}, //19034 #CJK UNIFIED IDEOGRAPH
+ {0xECB4, 0x9F51}, //19035 #CJK UNIFIED IDEOGRAPH
+ {0xECB5, 0x6593}, //19036 #CJK UNIFIED IDEOGRAPH
+ {0xECB6, 0x65BC}, //19037 #CJK UNIFIED IDEOGRAPH
+ {0xECB7, 0x65C6}, //19038 #CJK UNIFIED IDEOGRAPH
+ {0xECB8, 0x65C4}, //19039 #CJK UNIFIED IDEOGRAPH
+ {0xECB9, 0x65C3}, //19040 #CJK UNIFIED IDEOGRAPH
+ {0xECBA, 0x65CC}, //19041 #CJK UNIFIED IDEOGRAPH
+ {0xECBB, 0x65CE}, //19042 #CJK UNIFIED IDEOGRAPH
+ {0xECBC, 0x65D2}, //19043 #CJK UNIFIED IDEOGRAPH
+ {0xECBD, 0x65D6}, //19044 #CJK UNIFIED IDEOGRAPH
+ {0xECBE, 0x7080}, //19045 #CJK UNIFIED IDEOGRAPH
+ {0xECBF, 0x709C}, //19046 #CJK UNIFIED IDEOGRAPH
+ {0xECC0, 0x7096}, //19047 #CJK UNIFIED IDEOGRAPH
+ {0xECC1, 0x709D}, //19048 #CJK UNIFIED IDEOGRAPH
+ {0xECC2, 0x70BB}, //19049 #CJK UNIFIED IDEOGRAPH
+ {0xECC3, 0x70C0}, //19050 #CJK UNIFIED IDEOGRAPH
+ {0xECC4, 0x70B7}, //19051 #CJK UNIFIED IDEOGRAPH
+ {0xECC5, 0x70AB}, //19052 #CJK UNIFIED IDEOGRAPH
+ {0xECC6, 0x70B1}, //19053 #CJK UNIFIED IDEOGRAPH
+ {0xECC7, 0x70E8}, //19054 #CJK UNIFIED IDEOGRAPH
+ {0xECC8, 0x70CA}, //19055 #CJK UNIFIED IDEOGRAPH
+ {0xECC9, 0x7110}, //19056 #CJK UNIFIED IDEOGRAPH
+ {0xECCA, 0x7113}, //19057 #CJK UNIFIED IDEOGRAPH
+ {0xECCB, 0x7116}, //19058 #CJK UNIFIED IDEOGRAPH
+ {0xECCC, 0x712F}, //19059 #CJK UNIFIED IDEOGRAPH
+ {0xECCD, 0x7131}, //19060 #CJK UNIFIED IDEOGRAPH
+ {0xECCE, 0x7173}, //19061 #CJK UNIFIED IDEOGRAPH
+ {0xECCF, 0x715C}, //19062 #CJK UNIFIED IDEOGRAPH
+ {0xECD0, 0x7168}, //19063 #CJK UNIFIED IDEOGRAPH
+ {0xECD1, 0x7145}, //19064 #CJK UNIFIED IDEOGRAPH
+ {0xECD2, 0x7172}, //19065 #CJK UNIFIED IDEOGRAPH
+ {0xECD3, 0x714A}, //19066 #CJK UNIFIED IDEOGRAPH
+ {0xECD4, 0x7178}, //19067 #CJK UNIFIED IDEOGRAPH
+ {0xECD5, 0x717A}, //19068 #CJK UNIFIED IDEOGRAPH
+ {0xECD6, 0x7198}, //19069 #CJK UNIFIED IDEOGRAPH
+ {0xECD7, 0x71B3}, //19070 #CJK UNIFIED IDEOGRAPH
+ {0xECD8, 0x71B5}, //19071 #CJK UNIFIED IDEOGRAPH
+ {0xECD9, 0x71A8}, //19072 #CJK UNIFIED IDEOGRAPH
+ {0xECDA, 0x71A0}, //19073 #CJK UNIFIED IDEOGRAPH
+ {0xECDB, 0x71E0}, //19074 #CJK UNIFIED IDEOGRAPH
+ {0xECDC, 0x71D4}, //19075 #CJK UNIFIED IDEOGRAPH
+ {0xECDD, 0x71E7}, //19076 #CJK UNIFIED IDEOGRAPH
+ {0xECDE, 0x71F9}, //19077 #CJK UNIFIED IDEOGRAPH
+ {0xECDF, 0x721D}, //19078 #CJK UNIFIED IDEOGRAPH
+ {0xECE0, 0x7228}, //19079 #CJK UNIFIED IDEOGRAPH
+ {0xECE1, 0x706C}, //19080 #CJK UNIFIED IDEOGRAPH
+ {0xECE2, 0x7118}, //19081 #CJK UNIFIED IDEOGRAPH
+ {0xECE3, 0x7166}, //19082 #CJK UNIFIED IDEOGRAPH
+ {0xECE4, 0x71B9}, //19083 #CJK UNIFIED IDEOGRAPH
+ {0xECE5, 0x623E}, //19084 #CJK UNIFIED IDEOGRAPH
+ {0xECE6, 0x623D}, //19085 #CJK UNIFIED IDEOGRAPH
+ {0xECE7, 0x6243}, //19086 #CJK UNIFIED IDEOGRAPH
+ {0xECE8, 0x6248}, //19087 #CJK UNIFIED IDEOGRAPH
+ {0xECE9, 0x6249}, //19088 #CJK UNIFIED IDEOGRAPH
+ {0xECEA, 0x793B}, //19089 #CJK UNIFIED IDEOGRAPH
+ {0xECEB, 0x7940}, //19090 #CJK UNIFIED IDEOGRAPH
+ {0xECEC, 0x7946}, //19091 #CJK UNIFIED IDEOGRAPH
+ {0xECED, 0x7949}, //19092 #CJK UNIFIED IDEOGRAPH
+ {0xECEE, 0x795B}, //19093 #CJK UNIFIED IDEOGRAPH
+ {0xECEF, 0x795C}, //19094 #CJK UNIFIED IDEOGRAPH
+ {0xECF0, 0x7953}, //19095 #CJK UNIFIED IDEOGRAPH
+ {0xECF1, 0x795A}, //19096 #CJK UNIFIED IDEOGRAPH
+ {0xECF2, 0x7962}, //19097 #CJK UNIFIED IDEOGRAPH
+ {0xECF3, 0x7957}, //19098 #CJK UNIFIED IDEOGRAPH
+ {0xECF4, 0x7960}, //19099 #CJK UNIFIED IDEOGRAPH
+ {0xECF5, 0x796F}, //19100 #CJK UNIFIED IDEOGRAPH
+ {0xECF6, 0x7967}, //19101 #CJK UNIFIED IDEOGRAPH
+ {0xECF7, 0x797A}, //19102 #CJK UNIFIED IDEOGRAPH
+ {0xECF8, 0x7985}, //19103 #CJK UNIFIED IDEOGRAPH
+ {0xECF9, 0x798A}, //19104 #CJK UNIFIED IDEOGRAPH
+ {0xECFA, 0x799A}, //19105 #CJK UNIFIED IDEOGRAPH
+ {0xECFB, 0x79A7}, //19106 #CJK UNIFIED IDEOGRAPH
+ {0xECFC, 0x79B3}, //19107 #CJK UNIFIED IDEOGRAPH
+ {0xECFD, 0x5FD1}, //19108 #CJK UNIFIED IDEOGRAPH
+ {0xECFE, 0x5FD0}, //19109 #CJK UNIFIED IDEOGRAPH
+ {0xED40, 0x979E}, //19110 #CJK UNIFIED IDEOGRAPH
+ {0xED41, 0x979F}, //19111 #CJK UNIFIED IDEOGRAPH
+ {0xED42, 0x97A1}, //19112 #CJK UNIFIED IDEOGRAPH
+ {0xED43, 0x97A2}, //19113 #CJK UNIFIED IDEOGRAPH
+ {0xED44, 0x97A4}, //19114 #CJK UNIFIED IDEOGRAPH
+ {0xED45, 0x97A5}, //19115 #CJK UNIFIED IDEOGRAPH
+ {0xED46, 0x97A6}, //19116 #CJK UNIFIED IDEOGRAPH
+ {0xED47, 0x97A7}, //19117 #CJK UNIFIED IDEOGRAPH
+ {0xED48, 0x97A8}, //19118 #CJK UNIFIED IDEOGRAPH
+ {0xED49, 0x97A9}, //19119 #CJK UNIFIED IDEOGRAPH
+ {0xED4A, 0x97AA}, //19120 #CJK UNIFIED IDEOGRAPH
+ {0xED4B, 0x97AC}, //19121 #CJK UNIFIED IDEOGRAPH
+ {0xED4C, 0x97AE}, //19122 #CJK UNIFIED IDEOGRAPH
+ {0xED4D, 0x97B0}, //19123 #CJK UNIFIED IDEOGRAPH
+ {0xED4E, 0x97B1}, //19124 #CJK UNIFIED IDEOGRAPH
+ {0xED4F, 0x97B3}, //19125 #CJK UNIFIED IDEOGRAPH
+ {0xED50, 0x97B5}, //19126 #CJK UNIFIED IDEOGRAPH
+ {0xED51, 0x97B6}, //19127 #CJK UNIFIED IDEOGRAPH
+ {0xED52, 0x97B7}, //19128 #CJK UNIFIED IDEOGRAPH
+ {0xED53, 0x97B8}, //19129 #CJK UNIFIED IDEOGRAPH
+ {0xED54, 0x97B9}, //19130 #CJK UNIFIED IDEOGRAPH
+ {0xED55, 0x97BA}, //19131 #CJK UNIFIED IDEOGRAPH
+ {0xED56, 0x97BB}, //19132 #CJK UNIFIED IDEOGRAPH
+ {0xED57, 0x97BC}, //19133 #CJK UNIFIED IDEOGRAPH
+ {0xED58, 0x97BD}, //19134 #CJK UNIFIED IDEOGRAPH
+ {0xED59, 0x97BE}, //19135 #CJK UNIFIED IDEOGRAPH
+ {0xED5A, 0x97BF}, //19136 #CJK UNIFIED IDEOGRAPH
+ {0xED5B, 0x97C0}, //19137 #CJK UNIFIED IDEOGRAPH
+ {0xED5C, 0x97C1}, //19138 #CJK UNIFIED IDEOGRAPH
+ {0xED5D, 0x97C2}, //19139 #CJK UNIFIED IDEOGRAPH
+ {0xED5E, 0x97C3}, //19140 #CJK UNIFIED IDEOGRAPH
+ {0xED5F, 0x97C4}, //19141 #CJK UNIFIED IDEOGRAPH
+ {0xED60, 0x97C5}, //19142 #CJK UNIFIED IDEOGRAPH
+ {0xED61, 0x97C6}, //19143 #CJK UNIFIED IDEOGRAPH
+ {0xED62, 0x97C7}, //19144 #CJK UNIFIED IDEOGRAPH
+ {0xED63, 0x97C8}, //19145 #CJK UNIFIED IDEOGRAPH
+ {0xED64, 0x97C9}, //19146 #CJK UNIFIED IDEOGRAPH
+ {0xED65, 0x97CA}, //19147 #CJK UNIFIED IDEOGRAPH
+ {0xED66, 0x97CB}, //19148 #CJK UNIFIED IDEOGRAPH
+ {0xED67, 0x97CC}, //19149 #CJK UNIFIED IDEOGRAPH
+ {0xED68, 0x97CD}, //19150 #CJK UNIFIED IDEOGRAPH
+ {0xED69, 0x97CE}, //19151 #CJK UNIFIED IDEOGRAPH
+ {0xED6A, 0x97CF}, //19152 #CJK UNIFIED IDEOGRAPH
+ {0xED6B, 0x97D0}, //19153 #CJK UNIFIED IDEOGRAPH
+ {0xED6C, 0x97D1}, //19154 #CJK UNIFIED IDEOGRAPH
+ {0xED6D, 0x97D2}, //19155 #CJK UNIFIED IDEOGRAPH
+ {0xED6E, 0x97D3}, //19156 #CJK UNIFIED IDEOGRAPH
+ {0xED6F, 0x97D4}, //19157 #CJK UNIFIED IDEOGRAPH
+ {0xED70, 0x97D5}, //19158 #CJK UNIFIED IDEOGRAPH
+ {0xED71, 0x97D6}, //19159 #CJK UNIFIED IDEOGRAPH
+ {0xED72, 0x97D7}, //19160 #CJK UNIFIED IDEOGRAPH
+ {0xED73, 0x97D8}, //19161 #CJK UNIFIED IDEOGRAPH
+ {0xED74, 0x97D9}, //19162 #CJK UNIFIED IDEOGRAPH
+ {0xED75, 0x97DA}, //19163 #CJK UNIFIED IDEOGRAPH
+ {0xED76, 0x97DB}, //19164 #CJK UNIFIED IDEOGRAPH
+ {0xED77, 0x97DC}, //19165 #CJK UNIFIED IDEOGRAPH
+ {0xED78, 0x97DD}, //19166 #CJK UNIFIED IDEOGRAPH
+ {0xED79, 0x97DE}, //19167 #CJK UNIFIED IDEOGRAPH
+ {0xED7A, 0x97DF}, //19168 #CJK UNIFIED IDEOGRAPH
+ {0xED7B, 0x97E0}, //19169 #CJK UNIFIED IDEOGRAPH
+ {0xED7C, 0x97E1}, //19170 #CJK UNIFIED IDEOGRAPH
+ {0xED7D, 0x97E2}, //19171 #CJK UNIFIED IDEOGRAPH
+ {0xED7E, 0x97E3}, //19172 #CJK UNIFIED IDEOGRAPH
+ {0xED80, 0x97E4}, //19173 #CJK UNIFIED IDEOGRAPH
+ {0xED81, 0x97E5}, //19174 #CJK UNIFIED IDEOGRAPH
+ {0xED82, 0x97E8}, //19175 #CJK UNIFIED IDEOGRAPH
+ {0xED83, 0x97EE}, //19176 #CJK UNIFIED IDEOGRAPH
+ {0xED84, 0x97EF}, //19177 #CJK UNIFIED IDEOGRAPH
+ {0xED85, 0x97F0}, //19178 #CJK UNIFIED IDEOGRAPH
+ {0xED86, 0x97F1}, //19179 #CJK UNIFIED IDEOGRAPH
+ {0xED87, 0x97F2}, //19180 #CJK UNIFIED IDEOGRAPH
+ {0xED88, 0x97F4}, //19181 #CJK UNIFIED IDEOGRAPH
+ {0xED89, 0x97F7}, //19182 #CJK UNIFIED IDEOGRAPH
+ {0xED8A, 0x97F8}, //19183 #CJK UNIFIED IDEOGRAPH
+ {0xED8B, 0x97F9}, //19184 #CJK UNIFIED IDEOGRAPH
+ {0xED8C, 0x97FA}, //19185 #CJK UNIFIED IDEOGRAPH
+ {0xED8D, 0x97FB}, //19186 #CJK UNIFIED IDEOGRAPH
+ {0xED8E, 0x97FC}, //19187 #CJK UNIFIED IDEOGRAPH
+ {0xED8F, 0x97FD}, //19188 #CJK UNIFIED IDEOGRAPH
+ {0xED90, 0x97FE}, //19189 #CJK UNIFIED IDEOGRAPH
+ {0xED91, 0x97FF}, //19190 #CJK UNIFIED IDEOGRAPH
+ {0xED92, 0x9800}, //19191 #CJK UNIFIED IDEOGRAPH
+ {0xED93, 0x9801}, //19192 #CJK UNIFIED IDEOGRAPH
+ {0xED94, 0x9802}, //19193 #CJK UNIFIED IDEOGRAPH
+ {0xED95, 0x9803}, //19194 #CJK UNIFIED IDEOGRAPH
+ {0xED96, 0x9804}, //19195 #CJK UNIFIED IDEOGRAPH
+ {0xED97, 0x9805}, //19196 #CJK UNIFIED IDEOGRAPH
+ {0xED98, 0x9806}, //19197 #CJK UNIFIED IDEOGRAPH
+ {0xED99, 0x9807}, //19198 #CJK UNIFIED IDEOGRAPH
+ {0xED9A, 0x9808}, //19199 #CJK UNIFIED IDEOGRAPH
+ {0xED9B, 0x9809}, //19200 #CJK UNIFIED IDEOGRAPH
+ {0xED9C, 0x980A}, //19201 #CJK UNIFIED IDEOGRAPH
+ {0xED9D, 0x980B}, //19202 #CJK UNIFIED IDEOGRAPH
+ {0xED9E, 0x980C}, //19203 #CJK UNIFIED IDEOGRAPH
+ {0xED9F, 0x980D}, //19204 #CJK UNIFIED IDEOGRAPH
+ {0xEDA0, 0x980E}, //19205 #CJK UNIFIED IDEOGRAPH
+ {0xEDA1, 0x603C}, //19206 #CJK UNIFIED IDEOGRAPH
+ {0xEDA2, 0x605D}, //19207 #CJK UNIFIED IDEOGRAPH
+ {0xEDA3, 0x605A}, //19208 #CJK UNIFIED IDEOGRAPH
+ {0xEDA4, 0x6067}, //19209 #CJK UNIFIED IDEOGRAPH
+ {0xEDA5, 0x6041}, //19210 #CJK UNIFIED IDEOGRAPH
+ {0xEDA6, 0x6059}, //19211 #CJK UNIFIED IDEOGRAPH
+ {0xEDA7, 0x6063}, //19212 #CJK UNIFIED IDEOGRAPH
+ {0xEDA8, 0x60AB}, //19213 #CJK UNIFIED IDEOGRAPH
+ {0xEDA9, 0x6106}, //19214 #CJK UNIFIED IDEOGRAPH
+ {0xEDAA, 0x610D}, //19215 #CJK UNIFIED IDEOGRAPH
+ {0xEDAB, 0x615D}, //19216 #CJK UNIFIED IDEOGRAPH
+ {0xEDAC, 0x61A9}, //19217 #CJK UNIFIED IDEOGRAPH
+ {0xEDAD, 0x619D}, //19218 #CJK UNIFIED IDEOGRAPH
+ {0xEDAE, 0x61CB}, //19219 #CJK UNIFIED IDEOGRAPH
+ {0xEDAF, 0x61D1}, //19220 #CJK UNIFIED IDEOGRAPH
+ {0xEDB0, 0x6206}, //19221 #CJK UNIFIED IDEOGRAPH
+ {0xEDB1, 0x8080}, //19222 #CJK UNIFIED IDEOGRAPH
+ {0xEDB2, 0x807F}, //19223 #CJK UNIFIED IDEOGRAPH
+ {0xEDB3, 0x6C93}, //19224 #CJK UNIFIED IDEOGRAPH
+ {0xEDB4, 0x6CF6}, //19225 #CJK UNIFIED IDEOGRAPH
+ {0xEDB5, 0x6DFC}, //19226 #CJK UNIFIED IDEOGRAPH
+ {0xEDB6, 0x77F6}, //19227 #CJK UNIFIED IDEOGRAPH
+ {0xEDB7, 0x77F8}, //19228 #CJK UNIFIED IDEOGRAPH
+ {0xEDB8, 0x7800}, //19229 #CJK UNIFIED IDEOGRAPH
+ {0xEDB9, 0x7809}, //19230 #CJK UNIFIED IDEOGRAPH
+ {0xEDBA, 0x7817}, //19231 #CJK UNIFIED IDEOGRAPH
+ {0xEDBB, 0x7818}, //19232 #CJK UNIFIED IDEOGRAPH
+ {0xEDBC, 0x7811}, //19233 #CJK UNIFIED IDEOGRAPH
+ {0xEDBD, 0x65AB}, //19234 #CJK UNIFIED IDEOGRAPH
+ {0xEDBE, 0x782D}, //19235 #CJK UNIFIED IDEOGRAPH
+ {0xEDBF, 0x781C}, //19236 #CJK UNIFIED IDEOGRAPH
+ {0xEDC0, 0x781D}, //19237 #CJK UNIFIED IDEOGRAPH
+ {0xEDC1, 0x7839}, //19238 #CJK UNIFIED IDEOGRAPH
+ {0xEDC2, 0x783A}, //19239 #CJK UNIFIED IDEOGRAPH
+ {0xEDC3, 0x783B}, //19240 #CJK UNIFIED IDEOGRAPH
+ {0xEDC4, 0x781F}, //19241 #CJK UNIFIED IDEOGRAPH
+ {0xEDC5, 0x783C}, //19242 #CJK UNIFIED IDEOGRAPH
+ {0xEDC6, 0x7825}, //19243 #CJK UNIFIED IDEOGRAPH
+ {0xEDC7, 0x782C}, //19244 #CJK UNIFIED IDEOGRAPH
+ {0xEDC8, 0x7823}, //19245 #CJK UNIFIED IDEOGRAPH
+ {0xEDC9, 0x7829}, //19246 #CJK UNIFIED IDEOGRAPH
+ {0xEDCA, 0x784E}, //19247 #CJK UNIFIED IDEOGRAPH
+ {0xEDCB, 0x786D}, //19248 #CJK UNIFIED IDEOGRAPH
+ {0xEDCC, 0x7856}, //19249 #CJK UNIFIED IDEOGRAPH
+ {0xEDCD, 0x7857}, //19250 #CJK UNIFIED IDEOGRAPH
+ {0xEDCE, 0x7826}, //19251 #CJK UNIFIED IDEOGRAPH
+ {0xEDCF, 0x7850}, //19252 #CJK UNIFIED IDEOGRAPH
+ {0xEDD0, 0x7847}, //19253 #CJK UNIFIED IDEOGRAPH
+ {0xEDD1, 0x784C}, //19254 #CJK UNIFIED IDEOGRAPH
+ {0xEDD2, 0x786A}, //19255 #CJK UNIFIED IDEOGRAPH
+ {0xEDD3, 0x789B}, //19256 #CJK UNIFIED IDEOGRAPH
+ {0xEDD4, 0x7893}, //19257 #CJK UNIFIED IDEOGRAPH
+ {0xEDD5, 0x789A}, //19258 #CJK UNIFIED IDEOGRAPH
+ {0xEDD6, 0x7887}, //19259 #CJK UNIFIED IDEOGRAPH
+ {0xEDD7, 0x789C}, //19260 #CJK UNIFIED IDEOGRAPH
+ {0xEDD8, 0x78A1}, //19261 #CJK UNIFIED IDEOGRAPH
+ {0xEDD9, 0x78A3}, //19262 #CJK UNIFIED IDEOGRAPH
+ {0xEDDA, 0x78B2}, //19263 #CJK UNIFIED IDEOGRAPH
+ {0xEDDB, 0x78B9}, //19264 #CJK UNIFIED IDEOGRAPH
+ {0xEDDC, 0x78A5}, //19265 #CJK UNIFIED IDEOGRAPH
+ {0xEDDD, 0x78D4}, //19266 #CJK UNIFIED IDEOGRAPH
+ {0xEDDE, 0x78D9}, //19267 #CJK UNIFIED IDEOGRAPH
+ {0xEDDF, 0x78C9}, //19268 #CJK UNIFIED IDEOGRAPH
+ {0xEDE0, 0x78EC}, //19269 #CJK UNIFIED IDEOGRAPH
+ {0xEDE1, 0x78F2}, //19270 #CJK UNIFIED IDEOGRAPH
+ {0xEDE2, 0x7905}, //19271 #CJK UNIFIED IDEOGRAPH
+ {0xEDE3, 0x78F4}, //19272 #CJK UNIFIED IDEOGRAPH
+ {0xEDE4, 0x7913}, //19273 #CJK UNIFIED IDEOGRAPH
+ {0xEDE5, 0x7924}, //19274 #CJK UNIFIED IDEOGRAPH
+ {0xEDE6, 0x791E}, //19275 #CJK UNIFIED IDEOGRAPH
+ {0xEDE7, 0x7934}, //19276 #CJK UNIFIED IDEOGRAPH
+ {0xEDE8, 0x9F9B}, //19277 #CJK UNIFIED IDEOGRAPH
+ {0xEDE9, 0x9EF9}, //19278 #CJK UNIFIED IDEOGRAPH
+ {0xEDEA, 0x9EFB}, //19279 #CJK UNIFIED IDEOGRAPH
+ {0xEDEB, 0x9EFC}, //19280 #CJK UNIFIED IDEOGRAPH
+ {0xEDEC, 0x76F1}, //19281 #CJK UNIFIED IDEOGRAPH
+ {0xEDED, 0x7704}, //19282 #CJK UNIFIED IDEOGRAPH
+ {0xEDEE, 0x770D}, //19283 #CJK UNIFIED IDEOGRAPH
+ {0xEDEF, 0x76F9}, //19284 #CJK UNIFIED IDEOGRAPH
+ {0xEDF0, 0x7707}, //19285 #CJK UNIFIED IDEOGRAPH
+ {0xEDF1, 0x7708}, //19286 #CJK UNIFIED IDEOGRAPH
+ {0xEDF2, 0x771A}, //19287 #CJK UNIFIED IDEOGRAPH
+ {0xEDF3, 0x7722}, //19288 #CJK UNIFIED IDEOGRAPH
+ {0xEDF4, 0x7719}, //19289 #CJK UNIFIED IDEOGRAPH
+ {0xEDF5, 0x772D}, //19290 #CJK UNIFIED IDEOGRAPH
+ {0xEDF6, 0x7726}, //19291 #CJK UNIFIED IDEOGRAPH
+ {0xEDF7, 0x7735}, //19292 #CJK UNIFIED IDEOGRAPH
+ {0xEDF8, 0x7738}, //19293 #CJK UNIFIED IDEOGRAPH
+ {0xEDF9, 0x7750}, //19294 #CJK UNIFIED IDEOGRAPH
+ {0xEDFA, 0x7751}, //19295 #CJK UNIFIED IDEOGRAPH
+ {0xEDFB, 0x7747}, //19296 #CJK UNIFIED IDEOGRAPH
+ {0xEDFC, 0x7743}, //19297 #CJK UNIFIED IDEOGRAPH
+ {0xEDFD, 0x775A}, //19298 #CJK UNIFIED IDEOGRAPH
+ {0xEDFE, 0x7768}, //19299 #CJK UNIFIED IDEOGRAPH
+ {0xEE40, 0x980F}, //19300 #CJK UNIFIED IDEOGRAPH
+ {0xEE41, 0x9810}, //19301 #CJK UNIFIED IDEOGRAPH
+ {0xEE42, 0x9811}, //19302 #CJK UNIFIED IDEOGRAPH
+ {0xEE43, 0x9812}, //19303 #CJK UNIFIED IDEOGRAPH
+ {0xEE44, 0x9813}, //19304 #CJK UNIFIED IDEOGRAPH
+ {0xEE45, 0x9814}, //19305 #CJK UNIFIED IDEOGRAPH
+ {0xEE46, 0x9815}, //19306 #CJK UNIFIED IDEOGRAPH
+ {0xEE47, 0x9816}, //19307 #CJK UNIFIED IDEOGRAPH
+ {0xEE48, 0x9817}, //19308 #CJK UNIFIED IDEOGRAPH
+ {0xEE49, 0x9818}, //19309 #CJK UNIFIED IDEOGRAPH
+ {0xEE4A, 0x9819}, //19310 #CJK UNIFIED IDEOGRAPH
+ {0xEE4B, 0x981A}, //19311 #CJK UNIFIED IDEOGRAPH
+ {0xEE4C, 0x981B}, //19312 #CJK UNIFIED IDEOGRAPH
+ {0xEE4D, 0x981C}, //19313 #CJK UNIFIED IDEOGRAPH
+ {0xEE4E, 0x981D}, //19314 #CJK UNIFIED IDEOGRAPH
+ {0xEE4F, 0x981E}, //19315 #CJK UNIFIED IDEOGRAPH
+ {0xEE50, 0x981F}, //19316 #CJK UNIFIED IDEOGRAPH
+ {0xEE51, 0x9820}, //19317 #CJK UNIFIED IDEOGRAPH
+ {0xEE52, 0x9821}, //19318 #CJK UNIFIED IDEOGRAPH
+ {0xEE53, 0x9822}, //19319 #CJK UNIFIED IDEOGRAPH
+ {0xEE54, 0x9823}, //19320 #CJK UNIFIED IDEOGRAPH
+ {0xEE55, 0x9824}, //19321 #CJK UNIFIED IDEOGRAPH
+ {0xEE56, 0x9825}, //19322 #CJK UNIFIED IDEOGRAPH
+ {0xEE57, 0x9826}, //19323 #CJK UNIFIED IDEOGRAPH
+ {0xEE58, 0x9827}, //19324 #CJK UNIFIED IDEOGRAPH
+ {0xEE59, 0x9828}, //19325 #CJK UNIFIED IDEOGRAPH
+ {0xEE5A, 0x9829}, //19326 #CJK UNIFIED IDEOGRAPH
+ {0xEE5B, 0x982A}, //19327 #CJK UNIFIED IDEOGRAPH
+ {0xEE5C, 0x982B}, //19328 #CJK UNIFIED IDEOGRAPH
+ {0xEE5D, 0x982C}, //19329 #CJK UNIFIED IDEOGRAPH
+ {0xEE5E, 0x982D}, //19330 #CJK UNIFIED IDEOGRAPH
+ {0xEE5F, 0x982E}, //19331 #CJK UNIFIED IDEOGRAPH
+ {0xEE60, 0x982F}, //19332 #CJK UNIFIED IDEOGRAPH
+ {0xEE61, 0x9830}, //19333 #CJK UNIFIED IDEOGRAPH
+ {0xEE62, 0x9831}, //19334 #CJK UNIFIED IDEOGRAPH
+ {0xEE63, 0x9832}, //19335 #CJK UNIFIED IDEOGRAPH
+ {0xEE64, 0x9833}, //19336 #CJK UNIFIED IDEOGRAPH
+ {0xEE65, 0x9834}, //19337 #CJK UNIFIED IDEOGRAPH
+ {0xEE66, 0x9835}, //19338 #CJK UNIFIED IDEOGRAPH
+ {0xEE67, 0x9836}, //19339 #CJK UNIFIED IDEOGRAPH
+ {0xEE68, 0x9837}, //19340 #CJK UNIFIED IDEOGRAPH
+ {0xEE69, 0x9838}, //19341 #CJK UNIFIED IDEOGRAPH
+ {0xEE6A, 0x9839}, //19342 #CJK UNIFIED IDEOGRAPH
+ {0xEE6B, 0x983A}, //19343 #CJK UNIFIED IDEOGRAPH
+ {0xEE6C, 0x983B}, //19344 #CJK UNIFIED IDEOGRAPH
+ {0xEE6D, 0x983C}, //19345 #CJK UNIFIED IDEOGRAPH
+ {0xEE6E, 0x983D}, //19346 #CJK UNIFIED IDEOGRAPH
+ {0xEE6F, 0x983E}, //19347 #CJK UNIFIED IDEOGRAPH
+ {0xEE70, 0x983F}, //19348 #CJK UNIFIED IDEOGRAPH
+ {0xEE71, 0x9840}, //19349 #CJK UNIFIED IDEOGRAPH
+ {0xEE72, 0x9841}, //19350 #CJK UNIFIED IDEOGRAPH
+ {0xEE73, 0x9842}, //19351 #CJK UNIFIED IDEOGRAPH
+ {0xEE74, 0x9843}, //19352 #CJK UNIFIED IDEOGRAPH
+ {0xEE75, 0x9844}, //19353 #CJK UNIFIED IDEOGRAPH
+ {0xEE76, 0x9845}, //19354 #CJK UNIFIED IDEOGRAPH
+ {0xEE77, 0x9846}, //19355 #CJK UNIFIED IDEOGRAPH
+ {0xEE78, 0x9847}, //19356 #CJK UNIFIED IDEOGRAPH
+ {0xEE79, 0x9848}, //19357 #CJK UNIFIED IDEOGRAPH
+ {0xEE7A, 0x9849}, //19358 #CJK UNIFIED IDEOGRAPH
+ {0xEE7B, 0x984A}, //19359 #CJK UNIFIED IDEOGRAPH
+ {0xEE7C, 0x984B}, //19360 #CJK UNIFIED IDEOGRAPH
+ {0xEE7D, 0x984C}, //19361 #CJK UNIFIED IDEOGRAPH
+ {0xEE7E, 0x984D}, //19362 #CJK UNIFIED IDEOGRAPH
+ {0xEE80, 0x984E}, //19363 #CJK UNIFIED IDEOGRAPH
+ {0xEE81, 0x984F}, //19364 #CJK UNIFIED IDEOGRAPH
+ {0xEE82, 0x9850}, //19365 #CJK UNIFIED IDEOGRAPH
+ {0xEE83, 0x9851}, //19366 #CJK UNIFIED IDEOGRAPH
+ {0xEE84, 0x9852}, //19367 #CJK UNIFIED IDEOGRAPH
+ {0xEE85, 0x9853}, //19368 #CJK UNIFIED IDEOGRAPH
+ {0xEE86, 0x9854}, //19369 #CJK UNIFIED IDEOGRAPH
+ {0xEE87, 0x9855}, //19370 #CJK UNIFIED IDEOGRAPH
+ {0xEE88, 0x9856}, //19371 #CJK UNIFIED IDEOGRAPH
+ {0xEE89, 0x9857}, //19372 #CJK UNIFIED IDEOGRAPH
+ {0xEE8A, 0x9858}, //19373 #CJK UNIFIED IDEOGRAPH
+ {0xEE8B, 0x9859}, //19374 #CJK UNIFIED IDEOGRAPH
+ {0xEE8C, 0x985A}, //19375 #CJK UNIFIED IDEOGRAPH
+ {0xEE8D, 0x985B}, //19376 #CJK UNIFIED IDEOGRAPH
+ {0xEE8E, 0x985C}, //19377 #CJK UNIFIED IDEOGRAPH
+ {0xEE8F, 0x985D}, //19378 #CJK UNIFIED IDEOGRAPH
+ {0xEE90, 0x985E}, //19379 #CJK UNIFIED IDEOGRAPH
+ {0xEE91, 0x985F}, //19380 #CJK UNIFIED IDEOGRAPH
+ {0xEE92, 0x9860}, //19381 #CJK UNIFIED IDEOGRAPH
+ {0xEE93, 0x9861}, //19382 #CJK UNIFIED IDEOGRAPH
+ {0xEE94, 0x9862}, //19383 #CJK UNIFIED IDEOGRAPH
+ {0xEE95, 0x9863}, //19384 #CJK UNIFIED IDEOGRAPH
+ {0xEE96, 0x9864}, //19385 #CJK UNIFIED IDEOGRAPH
+ {0xEE97, 0x9865}, //19386 #CJK UNIFIED IDEOGRAPH
+ {0xEE98, 0x9866}, //19387 #CJK UNIFIED IDEOGRAPH
+ {0xEE99, 0x9867}, //19388 #CJK UNIFIED IDEOGRAPH
+ {0xEE9A, 0x9868}, //19389 #CJK UNIFIED IDEOGRAPH
+ {0xEE9B, 0x9869}, //19390 #CJK UNIFIED IDEOGRAPH
+ {0xEE9C, 0x986A}, //19391 #CJK UNIFIED IDEOGRAPH
+ {0xEE9D, 0x986B}, //19392 #CJK UNIFIED IDEOGRAPH
+ {0xEE9E, 0x986C}, //19393 #CJK UNIFIED IDEOGRAPH
+ {0xEE9F, 0x986D}, //19394 #CJK UNIFIED IDEOGRAPH
+ {0xEEA0, 0x986E}, //19395 #CJK UNIFIED IDEOGRAPH
+ {0xEEA1, 0x7762}, //19396 #CJK UNIFIED IDEOGRAPH
+ {0xEEA2, 0x7765}, //19397 #CJK UNIFIED IDEOGRAPH
+ {0xEEA3, 0x777F}, //19398 #CJK UNIFIED IDEOGRAPH
+ {0xEEA4, 0x778D}, //19399 #CJK UNIFIED IDEOGRAPH
+ {0xEEA5, 0x777D}, //19400 #CJK UNIFIED IDEOGRAPH
+ {0xEEA6, 0x7780}, //19401 #CJK UNIFIED IDEOGRAPH
+ {0xEEA7, 0x778C}, //19402 #CJK UNIFIED IDEOGRAPH
+ {0xEEA8, 0x7791}, //19403 #CJK UNIFIED IDEOGRAPH
+ {0xEEA9, 0x779F}, //19404 #CJK UNIFIED IDEOGRAPH
+ {0xEEAA, 0x77A0}, //19405 #CJK UNIFIED IDEOGRAPH
+ {0xEEAB, 0x77B0}, //19406 #CJK UNIFIED IDEOGRAPH
+ {0xEEAC, 0x77B5}, //19407 #CJK UNIFIED IDEOGRAPH
+ {0xEEAD, 0x77BD}, //19408 #CJK UNIFIED IDEOGRAPH
+ {0xEEAE, 0x753A}, //19409 #CJK UNIFIED IDEOGRAPH
+ {0xEEAF, 0x7540}, //19410 #CJK UNIFIED IDEOGRAPH
+ {0xEEB0, 0x754E}, //19411 #CJK UNIFIED IDEOGRAPH
+ {0xEEB1, 0x754B}, //19412 #CJK UNIFIED IDEOGRAPH
+ {0xEEB2, 0x7548}, //19413 #CJK UNIFIED IDEOGRAPH
+ {0xEEB3, 0x755B}, //19414 #CJK UNIFIED IDEOGRAPH
+ {0xEEB4, 0x7572}, //19415 #CJK UNIFIED IDEOGRAPH
+ {0xEEB5, 0x7579}, //19416 #CJK UNIFIED IDEOGRAPH
+ {0xEEB6, 0x7583}, //19417 #CJK UNIFIED IDEOGRAPH
+ {0xEEB7, 0x7F58}, //19418 #CJK UNIFIED IDEOGRAPH
+ {0xEEB8, 0x7F61}, //19419 #CJK UNIFIED IDEOGRAPH
+ {0xEEB9, 0x7F5F}, //19420 #CJK UNIFIED IDEOGRAPH
+ {0xEEBA, 0x8A48}, //19421 #CJK UNIFIED IDEOGRAPH
+ {0xEEBB, 0x7F68}, //19422 #CJK UNIFIED IDEOGRAPH
+ {0xEEBC, 0x7F74}, //19423 #CJK UNIFIED IDEOGRAPH
+ {0xEEBD, 0x7F71}, //19424 #CJK UNIFIED IDEOGRAPH
+ {0xEEBE, 0x7F79}, //19425 #CJK UNIFIED IDEOGRAPH
+ {0xEEBF, 0x7F81}, //19426 #CJK UNIFIED IDEOGRAPH
+ {0xEEC0, 0x7F7E}, //19427 #CJK UNIFIED IDEOGRAPH
+ {0xEEC1, 0x76CD}, //19428 #CJK UNIFIED IDEOGRAPH
+ {0xEEC2, 0x76E5}, //19429 #CJK UNIFIED IDEOGRAPH
+ {0xEEC3, 0x8832}, //19430 #CJK UNIFIED IDEOGRAPH
+ {0xEEC4, 0x9485}, //19431 #CJK UNIFIED IDEOGRAPH
+ {0xEEC5, 0x9486}, //19432 #CJK UNIFIED IDEOGRAPH
+ {0xEEC6, 0x9487}, //19433 #CJK UNIFIED IDEOGRAPH
+ {0xEEC7, 0x948B}, //19434 #CJK UNIFIED IDEOGRAPH
+ {0xEEC8, 0x948A}, //19435 #CJK UNIFIED IDEOGRAPH
+ {0xEEC9, 0x948C}, //19436 #CJK UNIFIED IDEOGRAPH
+ {0xEECA, 0x948D}, //19437 #CJK UNIFIED IDEOGRAPH
+ {0xEECB, 0x948F}, //19438 #CJK UNIFIED IDEOGRAPH
+ {0xEECC, 0x9490}, //19439 #CJK UNIFIED IDEOGRAPH
+ {0xEECD, 0x9494}, //19440 #CJK UNIFIED IDEOGRAPH
+ {0xEECE, 0x9497}, //19441 #CJK UNIFIED IDEOGRAPH
+ {0xEECF, 0x9495}, //19442 #CJK UNIFIED IDEOGRAPH
+ {0xEED0, 0x949A}, //19443 #CJK UNIFIED IDEOGRAPH
+ {0xEED1, 0x949B}, //19444 #CJK UNIFIED IDEOGRAPH
+ {0xEED2, 0x949C}, //19445 #CJK UNIFIED IDEOGRAPH
+ {0xEED3, 0x94A3}, //19446 #CJK UNIFIED IDEOGRAPH
+ {0xEED4, 0x94A4}, //19447 #CJK UNIFIED IDEOGRAPH
+ {0xEED5, 0x94AB}, //19448 #CJK UNIFIED IDEOGRAPH
+ {0xEED6, 0x94AA}, //19449 #CJK UNIFIED IDEOGRAPH
+ {0xEED7, 0x94AD}, //19450 #CJK UNIFIED IDEOGRAPH
+ {0xEED8, 0x94AC}, //19451 #CJK UNIFIED IDEOGRAPH
+ {0xEED9, 0x94AF}, //19452 #CJK UNIFIED IDEOGRAPH
+ {0xEEDA, 0x94B0}, //19453 #CJK UNIFIED IDEOGRAPH
+ {0xEEDB, 0x94B2}, //19454 #CJK UNIFIED IDEOGRAPH
+ {0xEEDC, 0x94B4}, //19455 #CJK UNIFIED IDEOGRAPH
+ {0xEEDD, 0x94B6}, //19456 #CJK UNIFIED IDEOGRAPH
+ {0xEEDE, 0x94B7}, //19457 #CJK UNIFIED IDEOGRAPH
+ {0xEEDF, 0x94B8}, //19458 #CJK UNIFIED IDEOGRAPH
+ {0xEEE0, 0x94B9}, //19459 #CJK UNIFIED IDEOGRAPH
+ {0xEEE1, 0x94BA}, //19460 #CJK UNIFIED IDEOGRAPH
+ {0xEEE2, 0x94BC}, //19461 #CJK UNIFIED IDEOGRAPH
+ {0xEEE3, 0x94BD}, //19462 #CJK UNIFIED IDEOGRAPH
+ {0xEEE4, 0x94BF}, //19463 #CJK UNIFIED IDEOGRAPH
+ {0xEEE5, 0x94C4}, //19464 #CJK UNIFIED IDEOGRAPH
+ {0xEEE6, 0x94C8}, //19465 #CJK UNIFIED IDEOGRAPH
+ {0xEEE7, 0x94C9}, //19466 #CJK UNIFIED IDEOGRAPH
+ {0xEEE8, 0x94CA}, //19467 #CJK UNIFIED IDEOGRAPH
+ {0xEEE9, 0x94CB}, //19468 #CJK UNIFIED IDEOGRAPH
+ {0xEEEA, 0x94CC}, //19469 #CJK UNIFIED IDEOGRAPH
+ {0xEEEB, 0x94CD}, //19470 #CJK UNIFIED IDEOGRAPH
+ {0xEEEC, 0x94CE}, //19471 #CJK UNIFIED IDEOGRAPH
+ {0xEEED, 0x94D0}, //19472 #CJK UNIFIED IDEOGRAPH
+ {0xEEEE, 0x94D1}, //19473 #CJK UNIFIED IDEOGRAPH
+ {0xEEEF, 0x94D2}, //19474 #CJK UNIFIED IDEOGRAPH
+ {0xEEF0, 0x94D5}, //19475 #CJK UNIFIED IDEOGRAPH
+ {0xEEF1, 0x94D6}, //19476 #CJK UNIFIED IDEOGRAPH
+ {0xEEF2, 0x94D7}, //19477 #CJK UNIFIED IDEOGRAPH
+ {0xEEF3, 0x94D9}, //19478 #CJK UNIFIED IDEOGRAPH
+ {0xEEF4, 0x94D8}, //19479 #CJK UNIFIED IDEOGRAPH
+ {0xEEF5, 0x94DB}, //19480 #CJK UNIFIED IDEOGRAPH
+ {0xEEF6, 0x94DE}, //19481 #CJK UNIFIED IDEOGRAPH
+ {0xEEF7, 0x94DF}, //19482 #CJK UNIFIED IDEOGRAPH
+ {0xEEF8, 0x94E0}, //19483 #CJK UNIFIED IDEOGRAPH
+ {0xEEF9, 0x94E2}, //19484 #CJK UNIFIED IDEOGRAPH
+ {0xEEFA, 0x94E4}, //19485 #CJK UNIFIED IDEOGRAPH
+ {0xEEFB, 0x94E5}, //19486 #CJK UNIFIED IDEOGRAPH
+ {0xEEFC, 0x94E7}, //19487 #CJK UNIFIED IDEOGRAPH
+ {0xEEFD, 0x94E8}, //19488 #CJK UNIFIED IDEOGRAPH
+ {0xEEFE, 0x94EA}, //19489 #CJK UNIFIED IDEOGRAPH
+ {0xEF40, 0x986F}, //19490 #CJK UNIFIED IDEOGRAPH
+ {0xEF41, 0x9870}, //19491 #CJK UNIFIED IDEOGRAPH
+ {0xEF42, 0x9871}, //19492 #CJK UNIFIED IDEOGRAPH
+ {0xEF43, 0x9872}, //19493 #CJK UNIFIED IDEOGRAPH
+ {0xEF44, 0x9873}, //19494 #CJK UNIFIED IDEOGRAPH
+ {0xEF45, 0x9874}, //19495 #CJK UNIFIED IDEOGRAPH
+ {0xEF46, 0x988B}, //19496 #CJK UNIFIED IDEOGRAPH
+ {0xEF47, 0x988E}, //19497 #CJK UNIFIED IDEOGRAPH
+ {0xEF48, 0x9892}, //19498 #CJK UNIFIED IDEOGRAPH
+ {0xEF49, 0x9895}, //19499 #CJK UNIFIED IDEOGRAPH
+ {0xEF4A, 0x9899}, //19500 #CJK UNIFIED IDEOGRAPH
+ {0xEF4B, 0x98A3}, //19501 #CJK UNIFIED IDEOGRAPH
+ {0xEF4C, 0x98A8}, //19502 #CJK UNIFIED IDEOGRAPH
+ {0xEF4D, 0x98A9}, //19503 #CJK UNIFIED IDEOGRAPH
+ {0xEF4E, 0x98AA}, //19504 #CJK UNIFIED IDEOGRAPH
+ {0xEF4F, 0x98AB}, //19505 #CJK UNIFIED IDEOGRAPH
+ {0xEF50, 0x98AC}, //19506 #CJK UNIFIED IDEOGRAPH
+ {0xEF51, 0x98AD}, //19507 #CJK UNIFIED IDEOGRAPH
+ {0xEF52, 0x98AE}, //19508 #CJK UNIFIED IDEOGRAPH
+ {0xEF53, 0x98AF}, //19509 #CJK UNIFIED IDEOGRAPH
+ {0xEF54, 0x98B0}, //19510 #CJK UNIFIED IDEOGRAPH
+ {0xEF55, 0x98B1}, //19511 #CJK UNIFIED IDEOGRAPH
+ {0xEF56, 0x98B2}, //19512 #CJK UNIFIED IDEOGRAPH
+ {0xEF57, 0x98B3}, //19513 #CJK UNIFIED IDEOGRAPH
+ {0xEF58, 0x98B4}, //19514 #CJK UNIFIED IDEOGRAPH
+ {0xEF59, 0x98B5}, //19515 #CJK UNIFIED IDEOGRAPH
+ {0xEF5A, 0x98B6}, //19516 #CJK UNIFIED IDEOGRAPH
+ {0xEF5B, 0x98B7}, //19517 #CJK UNIFIED IDEOGRAPH
+ {0xEF5C, 0x98B8}, //19518 #CJK UNIFIED IDEOGRAPH
+ {0xEF5D, 0x98B9}, //19519 #CJK UNIFIED IDEOGRAPH
+ {0xEF5E, 0x98BA}, //19520 #CJK UNIFIED IDEOGRAPH
+ {0xEF5F, 0x98BB}, //19521 #CJK UNIFIED IDEOGRAPH
+ {0xEF60, 0x98BC}, //19522 #CJK UNIFIED IDEOGRAPH
+ {0xEF61, 0x98BD}, //19523 #CJK UNIFIED IDEOGRAPH
+ {0xEF62, 0x98BE}, //19524 #CJK UNIFIED IDEOGRAPH
+ {0xEF63, 0x98BF}, //19525 #CJK UNIFIED IDEOGRAPH
+ {0xEF64, 0x98C0}, //19526 #CJK UNIFIED IDEOGRAPH
+ {0xEF65, 0x98C1}, //19527 #CJK UNIFIED IDEOGRAPH
+ {0xEF66, 0x98C2}, //19528 #CJK UNIFIED IDEOGRAPH
+ {0xEF67, 0x98C3}, //19529 #CJK UNIFIED IDEOGRAPH
+ {0xEF68, 0x98C4}, //19530 #CJK UNIFIED IDEOGRAPH
+ {0xEF69, 0x98C5}, //19531 #CJK UNIFIED IDEOGRAPH
+ {0xEF6A, 0x98C6}, //19532 #CJK UNIFIED IDEOGRAPH
+ {0xEF6B, 0x98C7}, //19533 #CJK UNIFIED IDEOGRAPH
+ {0xEF6C, 0x98C8}, //19534 #CJK UNIFIED IDEOGRAPH
+ {0xEF6D, 0x98C9}, //19535 #CJK UNIFIED IDEOGRAPH
+ {0xEF6E, 0x98CA}, //19536 #CJK UNIFIED IDEOGRAPH
+ {0xEF6F, 0x98CB}, //19537 #CJK UNIFIED IDEOGRAPH
+ {0xEF70, 0x98CC}, //19538 #CJK UNIFIED IDEOGRAPH
+ {0xEF71, 0x98CD}, //19539 #CJK UNIFIED IDEOGRAPH
+ {0xEF72, 0x98CF}, //19540 #CJK UNIFIED IDEOGRAPH
+ {0xEF73, 0x98D0}, //19541 #CJK UNIFIED IDEOGRAPH
+ {0xEF74, 0x98D4}, //19542 #CJK UNIFIED IDEOGRAPH
+ {0xEF75, 0x98D6}, //19543 #CJK UNIFIED IDEOGRAPH
+ {0xEF76, 0x98D7}, //19544 #CJK UNIFIED IDEOGRAPH
+ {0xEF77, 0x98DB}, //19545 #CJK UNIFIED IDEOGRAPH
+ {0xEF78, 0x98DC}, //19546 #CJK UNIFIED IDEOGRAPH
+ {0xEF79, 0x98DD}, //19547 #CJK UNIFIED IDEOGRAPH
+ {0xEF7A, 0x98E0}, //19548 #CJK UNIFIED IDEOGRAPH
+ {0xEF7B, 0x98E1}, //19549 #CJK UNIFIED IDEOGRAPH
+ {0xEF7C, 0x98E2}, //19550 #CJK UNIFIED IDEOGRAPH
+ {0xEF7D, 0x98E3}, //19551 #CJK UNIFIED IDEOGRAPH
+ {0xEF7E, 0x98E4}, //19552 #CJK UNIFIED IDEOGRAPH
+ {0xEF80, 0x98E5}, //19553 #CJK UNIFIED IDEOGRAPH
+ {0xEF81, 0x98E6}, //19554 #CJK UNIFIED IDEOGRAPH
+ {0xEF82, 0x98E9}, //19555 #CJK UNIFIED IDEOGRAPH
+ {0xEF83, 0x98EA}, //19556 #CJK UNIFIED IDEOGRAPH
+ {0xEF84, 0x98EB}, //19557 #CJK UNIFIED IDEOGRAPH
+ {0xEF85, 0x98EC}, //19558 #CJK UNIFIED IDEOGRAPH
+ {0xEF86, 0x98ED}, //19559 #CJK UNIFIED IDEOGRAPH
+ {0xEF87, 0x98EE}, //19560 #CJK UNIFIED IDEOGRAPH
+ {0xEF88, 0x98EF}, //19561 #CJK UNIFIED IDEOGRAPH
+ {0xEF89, 0x98F0}, //19562 #CJK UNIFIED IDEOGRAPH
+ {0xEF8A, 0x98F1}, //19563 #CJK UNIFIED IDEOGRAPH
+ {0xEF8B, 0x98F2}, //19564 #CJK UNIFIED IDEOGRAPH
+ {0xEF8C, 0x98F3}, //19565 #CJK UNIFIED IDEOGRAPH
+ {0xEF8D, 0x98F4}, //19566 #CJK UNIFIED IDEOGRAPH
+ {0xEF8E, 0x98F5}, //19567 #CJK UNIFIED IDEOGRAPH
+ {0xEF8F, 0x98F6}, //19568 #CJK UNIFIED IDEOGRAPH
+ {0xEF90, 0x98F7}, //19569 #CJK UNIFIED IDEOGRAPH
+ {0xEF91, 0x98F8}, //19570 #CJK UNIFIED IDEOGRAPH
+ {0xEF92, 0x98F9}, //19571 #CJK UNIFIED IDEOGRAPH
+ {0xEF93, 0x98FA}, //19572 #CJK UNIFIED IDEOGRAPH
+ {0xEF94, 0x98FB}, //19573 #CJK UNIFIED IDEOGRAPH
+ {0xEF95, 0x98FC}, //19574 #CJK UNIFIED IDEOGRAPH
+ {0xEF96, 0x98FD}, //19575 #CJK UNIFIED IDEOGRAPH
+ {0xEF97, 0x98FE}, //19576 #CJK UNIFIED IDEOGRAPH
+ {0xEF98, 0x98FF}, //19577 #CJK UNIFIED IDEOGRAPH
+ {0xEF99, 0x9900}, //19578 #CJK UNIFIED IDEOGRAPH
+ {0xEF9A, 0x9901}, //19579 #CJK UNIFIED IDEOGRAPH
+ {0xEF9B, 0x9902}, //19580 #CJK UNIFIED IDEOGRAPH
+ {0xEF9C, 0x9903}, //19581 #CJK UNIFIED IDEOGRAPH
+ {0xEF9D, 0x9904}, //19582 #CJK UNIFIED IDEOGRAPH
+ {0xEF9E, 0x9905}, //19583 #CJK UNIFIED IDEOGRAPH
+ {0xEF9F, 0x9906}, //19584 #CJK UNIFIED IDEOGRAPH
+ {0xEFA0, 0x9907}, //19585 #CJK UNIFIED IDEOGRAPH
+ {0xEFA1, 0x94E9}, //19586 #CJK UNIFIED IDEOGRAPH
+ {0xEFA2, 0x94EB}, //19587 #CJK UNIFIED IDEOGRAPH
+ {0xEFA3, 0x94EE}, //19588 #CJK UNIFIED IDEOGRAPH
+ {0xEFA4, 0x94EF}, //19589 #CJK UNIFIED IDEOGRAPH
+ {0xEFA5, 0x94F3}, //19590 #CJK UNIFIED IDEOGRAPH
+ {0xEFA6, 0x94F4}, //19591 #CJK UNIFIED IDEOGRAPH
+ {0xEFA7, 0x94F5}, //19592 #CJK UNIFIED IDEOGRAPH
+ {0xEFA8, 0x94F7}, //19593 #CJK UNIFIED IDEOGRAPH
+ {0xEFA9, 0x94F9}, //19594 #CJK UNIFIED IDEOGRAPH
+ {0xEFAA, 0x94FC}, //19595 #CJK UNIFIED IDEOGRAPH
+ {0xEFAB, 0x94FD}, //19596 #CJK UNIFIED IDEOGRAPH
+ {0xEFAC, 0x94FF}, //19597 #CJK UNIFIED IDEOGRAPH
+ {0xEFAD, 0x9503}, //19598 #CJK UNIFIED IDEOGRAPH
+ {0xEFAE, 0x9502}, //19599 #CJK UNIFIED IDEOGRAPH
+ {0xEFAF, 0x9506}, //19600 #CJK UNIFIED IDEOGRAPH
+ {0xEFB0, 0x9507}, //19601 #CJK UNIFIED IDEOGRAPH
+ {0xEFB1, 0x9509}, //19602 #CJK UNIFIED IDEOGRAPH
+ {0xEFB2, 0x950A}, //19603 #CJK UNIFIED IDEOGRAPH
+ {0xEFB3, 0x950D}, //19604 #CJK UNIFIED IDEOGRAPH
+ {0xEFB4, 0x950E}, //19605 #CJK UNIFIED IDEOGRAPH
+ {0xEFB5, 0x950F}, //19606 #CJK UNIFIED IDEOGRAPH
+ {0xEFB6, 0x9512}, //19607 #CJK UNIFIED IDEOGRAPH
+ {0xEFB7, 0x9513}, //19608 #CJK UNIFIED IDEOGRAPH
+ {0xEFB8, 0x9514}, //19609 #CJK UNIFIED IDEOGRAPH
+ {0xEFB9, 0x9515}, //19610 #CJK UNIFIED IDEOGRAPH
+ {0xEFBA, 0x9516}, //19611 #CJK UNIFIED IDEOGRAPH
+ {0xEFBB, 0x9518}, //19612 #CJK UNIFIED IDEOGRAPH
+ {0xEFBC, 0x951B}, //19613 #CJK UNIFIED IDEOGRAPH
+ {0xEFBD, 0x951D}, //19614 #CJK UNIFIED IDEOGRAPH
+ {0xEFBE, 0x951E}, //19615 #CJK UNIFIED IDEOGRAPH
+ {0xEFBF, 0x951F}, //19616 #CJK UNIFIED IDEOGRAPH
+ {0xEFC0, 0x9522}, //19617 #CJK UNIFIED IDEOGRAPH
+ {0xEFC1, 0x952A}, //19618 #CJK UNIFIED IDEOGRAPH
+ {0xEFC2, 0x952B}, //19619 #CJK UNIFIED IDEOGRAPH
+ {0xEFC3, 0x9529}, //19620 #CJK UNIFIED IDEOGRAPH
+ {0xEFC4, 0x952C}, //19621 #CJK UNIFIED IDEOGRAPH
+ {0xEFC5, 0x9531}, //19622 #CJK UNIFIED IDEOGRAPH
+ {0xEFC6, 0x9532}, //19623 #CJK UNIFIED IDEOGRAPH
+ {0xEFC7, 0x9534}, //19624 #CJK UNIFIED IDEOGRAPH
+ {0xEFC8, 0x9536}, //19625 #CJK UNIFIED IDEOGRAPH
+ {0xEFC9, 0x9537}, //19626 #CJK UNIFIED IDEOGRAPH
+ {0xEFCA, 0x9538}, //19627 #CJK UNIFIED IDEOGRAPH
+ {0xEFCB, 0x953C}, //19628 #CJK UNIFIED IDEOGRAPH
+ {0xEFCC, 0x953E}, //19629 #CJK UNIFIED IDEOGRAPH
+ {0xEFCD, 0x953F}, //19630 #CJK UNIFIED IDEOGRAPH
+ {0xEFCE, 0x9542}, //19631 #CJK UNIFIED IDEOGRAPH
+ {0xEFCF, 0x9535}, //19632 #CJK UNIFIED IDEOGRAPH
+ {0xEFD0, 0x9544}, //19633 #CJK UNIFIED IDEOGRAPH
+ {0xEFD1, 0x9545}, //19634 #CJK UNIFIED IDEOGRAPH
+ {0xEFD2, 0x9546}, //19635 #CJK UNIFIED IDEOGRAPH
+ {0xEFD3, 0x9549}, //19636 #CJK UNIFIED IDEOGRAPH
+ {0xEFD4, 0x954C}, //19637 #CJK UNIFIED IDEOGRAPH
+ {0xEFD5, 0x954E}, //19638 #CJK UNIFIED IDEOGRAPH
+ {0xEFD6, 0x954F}, //19639 #CJK UNIFIED IDEOGRAPH
+ {0xEFD7, 0x9552}, //19640 #CJK UNIFIED IDEOGRAPH
+ {0xEFD8, 0x9553}, //19641 #CJK UNIFIED IDEOGRAPH
+ {0xEFD9, 0x9554}, //19642 #CJK UNIFIED IDEOGRAPH
+ {0xEFDA, 0x9556}, //19643 #CJK UNIFIED IDEOGRAPH
+ {0xEFDB, 0x9557}, //19644 #CJK UNIFIED IDEOGRAPH
+ {0xEFDC, 0x9558}, //19645 #CJK UNIFIED IDEOGRAPH
+ {0xEFDD, 0x9559}, //19646 #CJK UNIFIED IDEOGRAPH
+ {0xEFDE, 0x955B}, //19647 #CJK UNIFIED IDEOGRAPH
+ {0xEFDF, 0x955E}, //19648 #CJK UNIFIED IDEOGRAPH
+ {0xEFE0, 0x955F}, //19649 #CJK UNIFIED IDEOGRAPH
+ {0xEFE1, 0x955D}, //19650 #CJK UNIFIED IDEOGRAPH
+ {0xEFE2, 0x9561}, //19651 #CJK UNIFIED IDEOGRAPH
+ {0xEFE3, 0x9562}, //19652 #CJK UNIFIED IDEOGRAPH
+ {0xEFE4, 0x9564}, //19653 #CJK UNIFIED IDEOGRAPH
+ {0xEFE5, 0x9565}, //19654 #CJK UNIFIED IDEOGRAPH
+ {0xEFE6, 0x9566}, //19655 #CJK UNIFIED IDEOGRAPH
+ {0xEFE7, 0x9567}, //19656 #CJK UNIFIED IDEOGRAPH
+ {0xEFE8, 0x9568}, //19657 #CJK UNIFIED IDEOGRAPH
+ {0xEFE9, 0x9569}, //19658 #CJK UNIFIED IDEOGRAPH
+ {0xEFEA, 0x956A}, //19659 #CJK UNIFIED IDEOGRAPH
+ {0xEFEB, 0x956B}, //19660 #CJK UNIFIED IDEOGRAPH
+ {0xEFEC, 0x956C}, //19661 #CJK UNIFIED IDEOGRAPH
+ {0xEFED, 0x956F}, //19662 #CJK UNIFIED IDEOGRAPH
+ {0xEFEE, 0x9571}, //19663 #CJK UNIFIED IDEOGRAPH
+ {0xEFEF, 0x9572}, //19664 #CJK UNIFIED IDEOGRAPH
+ {0xEFF0, 0x9573}, //19665 #CJK UNIFIED IDEOGRAPH
+ {0xEFF1, 0x953A}, //19666 #CJK UNIFIED IDEOGRAPH
+ {0xEFF2, 0x77E7}, //19667 #CJK UNIFIED IDEOGRAPH
+ {0xEFF3, 0x77EC}, //19668 #CJK UNIFIED IDEOGRAPH
+ {0xEFF4, 0x96C9}, //19669 #CJK UNIFIED IDEOGRAPH
+ {0xEFF5, 0x79D5}, //19670 #CJK UNIFIED IDEOGRAPH
+ {0xEFF6, 0x79ED}, //19671 #CJK UNIFIED IDEOGRAPH
+ {0xEFF7, 0x79E3}, //19672 #CJK UNIFIED IDEOGRAPH
+ {0xEFF8, 0x79EB}, //19673 #CJK UNIFIED IDEOGRAPH
+ {0xEFF9, 0x7A06}, //19674 #CJK UNIFIED IDEOGRAPH
+ {0xEFFA, 0x5D47}, //19675 #CJK UNIFIED IDEOGRAPH
+ {0xEFFB, 0x7A03}, //19676 #CJK UNIFIED IDEOGRAPH
+ {0xEFFC, 0x7A02}, //19677 #CJK UNIFIED IDEOGRAPH
+ {0xEFFD, 0x7A1E}, //19678 #CJK UNIFIED IDEOGRAPH
+ {0xEFFE, 0x7A14}, //19679 #CJK UNIFIED IDEOGRAPH
+ {0xF040, 0x9908}, //19680 #CJK UNIFIED IDEOGRAPH
+ {0xF041, 0x9909}, //19681 #CJK UNIFIED IDEOGRAPH
+ {0xF042, 0x990A}, //19682 #CJK UNIFIED IDEOGRAPH
+ {0xF043, 0x990B}, //19683 #CJK UNIFIED IDEOGRAPH
+ {0xF044, 0x990C}, //19684 #CJK UNIFIED IDEOGRAPH
+ {0xF045, 0x990E}, //19685 #CJK UNIFIED IDEOGRAPH
+ {0xF046, 0x990F}, //19686 #CJK UNIFIED IDEOGRAPH
+ {0xF047, 0x9911}, //19687 #CJK UNIFIED IDEOGRAPH
+ {0xF048, 0x9912}, //19688 #CJK UNIFIED IDEOGRAPH
+ {0xF049, 0x9913}, //19689 #CJK UNIFIED IDEOGRAPH
+ {0xF04A, 0x9914}, //19690 #CJK UNIFIED IDEOGRAPH
+ {0xF04B, 0x9915}, //19691 #CJK UNIFIED IDEOGRAPH
+ {0xF04C, 0x9916}, //19692 #CJK UNIFIED IDEOGRAPH
+ {0xF04D, 0x9917}, //19693 #CJK UNIFIED IDEOGRAPH
+ {0xF04E, 0x9918}, //19694 #CJK UNIFIED IDEOGRAPH
+ {0xF04F, 0x9919}, //19695 #CJK UNIFIED IDEOGRAPH
+ {0xF050, 0x991A}, //19696 #CJK UNIFIED IDEOGRAPH
+ {0xF051, 0x991B}, //19697 #CJK UNIFIED IDEOGRAPH
+ {0xF052, 0x991C}, //19698 #CJK UNIFIED IDEOGRAPH
+ {0xF053, 0x991D}, //19699 #CJK UNIFIED IDEOGRAPH
+ {0xF054, 0x991E}, //19700 #CJK UNIFIED IDEOGRAPH
+ {0xF055, 0x991F}, //19701 #CJK UNIFIED IDEOGRAPH
+ {0xF056, 0x9920}, //19702 #CJK UNIFIED IDEOGRAPH
+ {0xF057, 0x9921}, //19703 #CJK UNIFIED IDEOGRAPH
+ {0xF058, 0x9922}, //19704 #CJK UNIFIED IDEOGRAPH
+ {0xF059, 0x9923}, //19705 #CJK UNIFIED IDEOGRAPH
+ {0xF05A, 0x9924}, //19706 #CJK UNIFIED IDEOGRAPH
+ {0xF05B, 0x9925}, //19707 #CJK UNIFIED IDEOGRAPH
+ {0xF05C, 0x9926}, //19708 #CJK UNIFIED IDEOGRAPH
+ {0xF05D, 0x9927}, //19709 #CJK UNIFIED IDEOGRAPH
+ {0xF05E, 0x9928}, //19710 #CJK UNIFIED IDEOGRAPH
+ {0xF05F, 0x9929}, //19711 #CJK UNIFIED IDEOGRAPH
+ {0xF060, 0x992A}, //19712 #CJK UNIFIED IDEOGRAPH
+ {0xF061, 0x992B}, //19713 #CJK UNIFIED IDEOGRAPH
+ {0xF062, 0x992C}, //19714 #CJK UNIFIED IDEOGRAPH
+ {0xF063, 0x992D}, //19715 #CJK UNIFIED IDEOGRAPH
+ {0xF064, 0x992F}, //19716 #CJK UNIFIED IDEOGRAPH
+ {0xF065, 0x9930}, //19717 #CJK UNIFIED IDEOGRAPH
+ {0xF066, 0x9931}, //19718 #CJK UNIFIED IDEOGRAPH
+ {0xF067, 0x9932}, //19719 #CJK UNIFIED IDEOGRAPH
+ {0xF068, 0x9933}, //19720 #CJK UNIFIED IDEOGRAPH
+ {0xF069, 0x9934}, //19721 #CJK UNIFIED IDEOGRAPH
+ {0xF06A, 0x9935}, //19722 #CJK UNIFIED IDEOGRAPH
+ {0xF06B, 0x9936}, //19723 #CJK UNIFIED IDEOGRAPH
+ {0xF06C, 0x9937}, //19724 #CJK UNIFIED IDEOGRAPH
+ {0xF06D, 0x9938}, //19725 #CJK UNIFIED IDEOGRAPH
+ {0xF06E, 0x9939}, //19726 #CJK UNIFIED IDEOGRAPH
+ {0xF06F, 0x993A}, //19727 #CJK UNIFIED IDEOGRAPH
+ {0xF070, 0x993B}, //19728 #CJK UNIFIED IDEOGRAPH
+ {0xF071, 0x993C}, //19729 #CJK UNIFIED IDEOGRAPH
+ {0xF072, 0x993D}, //19730 #CJK UNIFIED IDEOGRAPH
+ {0xF073, 0x993E}, //19731 #CJK UNIFIED IDEOGRAPH
+ {0xF074, 0x993F}, //19732 #CJK UNIFIED IDEOGRAPH
+ {0xF075, 0x9940}, //19733 #CJK UNIFIED IDEOGRAPH
+ {0xF076, 0x9941}, //19734 #CJK UNIFIED IDEOGRAPH
+ {0xF077, 0x9942}, //19735 #CJK UNIFIED IDEOGRAPH
+ {0xF078, 0x9943}, //19736 #CJK UNIFIED IDEOGRAPH
+ {0xF079, 0x9944}, //19737 #CJK UNIFIED IDEOGRAPH
+ {0xF07A, 0x9945}, //19738 #CJK UNIFIED IDEOGRAPH
+ {0xF07B, 0x9946}, //19739 #CJK UNIFIED IDEOGRAPH
+ {0xF07C, 0x9947}, //19740 #CJK UNIFIED IDEOGRAPH
+ {0xF07D, 0x9948}, //19741 #CJK UNIFIED IDEOGRAPH
+ {0xF07E, 0x9949}, //19742 #CJK UNIFIED IDEOGRAPH
+ {0xF080, 0x994A}, //19743 #CJK UNIFIED IDEOGRAPH
+ {0xF081, 0x994B}, //19744 #CJK UNIFIED IDEOGRAPH
+ {0xF082, 0x994C}, //19745 #CJK UNIFIED IDEOGRAPH
+ {0xF083, 0x994D}, //19746 #CJK UNIFIED IDEOGRAPH
+ {0xF084, 0x994E}, //19747 #CJK UNIFIED IDEOGRAPH
+ {0xF085, 0x994F}, //19748 #CJK UNIFIED IDEOGRAPH
+ {0xF086, 0x9950}, //19749 #CJK UNIFIED IDEOGRAPH
+ {0xF087, 0x9951}, //19750 #CJK UNIFIED IDEOGRAPH
+ {0xF088, 0x9952}, //19751 #CJK UNIFIED IDEOGRAPH
+ {0xF089, 0x9953}, //19752 #CJK UNIFIED IDEOGRAPH
+ {0xF08A, 0x9956}, //19753 #CJK UNIFIED IDEOGRAPH
+ {0xF08B, 0x9957}, //19754 #CJK UNIFIED IDEOGRAPH
+ {0xF08C, 0x9958}, //19755 #CJK UNIFIED IDEOGRAPH
+ {0xF08D, 0x9959}, //19756 #CJK UNIFIED IDEOGRAPH
+ {0xF08E, 0x995A}, //19757 #CJK UNIFIED IDEOGRAPH
+ {0xF08F, 0x995B}, //19758 #CJK UNIFIED IDEOGRAPH
+ {0xF090, 0x995C}, //19759 #CJK UNIFIED IDEOGRAPH
+ {0xF091, 0x995D}, //19760 #CJK UNIFIED IDEOGRAPH
+ {0xF092, 0x995E}, //19761 #CJK UNIFIED IDEOGRAPH
+ {0xF093, 0x995F}, //19762 #CJK UNIFIED IDEOGRAPH
+ {0xF094, 0x9960}, //19763 #CJK UNIFIED IDEOGRAPH
+ {0xF095, 0x9961}, //19764 #CJK UNIFIED IDEOGRAPH
+ {0xF096, 0x9962}, //19765 #CJK UNIFIED IDEOGRAPH
+ {0xF097, 0x9964}, //19766 #CJK UNIFIED IDEOGRAPH
+ {0xF098, 0x9966}, //19767 #CJK UNIFIED IDEOGRAPH
+ {0xF099, 0x9973}, //19768 #CJK UNIFIED IDEOGRAPH
+ {0xF09A, 0x9978}, //19769 #CJK UNIFIED IDEOGRAPH
+ {0xF09B, 0x9979}, //19770 #CJK UNIFIED IDEOGRAPH
+ {0xF09C, 0x997B}, //19771 #CJK UNIFIED IDEOGRAPH
+ {0xF09D, 0x997E}, //19772 #CJK UNIFIED IDEOGRAPH
+ {0xF09E, 0x9982}, //19773 #CJK UNIFIED IDEOGRAPH
+ {0xF09F, 0x9983}, //19774 #CJK UNIFIED IDEOGRAPH
+ {0xF0A0, 0x9989}, //19775 #CJK UNIFIED IDEOGRAPH
+ {0xF0A1, 0x7A39}, //19776 #CJK UNIFIED IDEOGRAPH
+ {0xF0A2, 0x7A37}, //19777 #CJK UNIFIED IDEOGRAPH
+ {0xF0A3, 0x7A51}, //19778 #CJK UNIFIED IDEOGRAPH
+ {0xF0A4, 0x9ECF}, //19779 #CJK UNIFIED IDEOGRAPH
+ {0xF0A5, 0x99A5}, //19780 #CJK UNIFIED IDEOGRAPH
+ {0xF0A6, 0x7A70}, //19781 #CJK UNIFIED IDEOGRAPH
+ {0xF0A7, 0x7688}, //19782 #CJK UNIFIED IDEOGRAPH
+ {0xF0A8, 0x768E}, //19783 #CJK UNIFIED IDEOGRAPH
+ {0xF0A9, 0x7693}, //19784 #CJK UNIFIED IDEOGRAPH
+ {0xF0AA, 0x7699}, //19785 #CJK UNIFIED IDEOGRAPH
+ {0xF0AB, 0x76A4}, //19786 #CJK UNIFIED IDEOGRAPH
+ {0xF0AC, 0x74DE}, //19787 #CJK UNIFIED IDEOGRAPH
+ {0xF0AD, 0x74E0}, //19788 #CJK UNIFIED IDEOGRAPH
+ {0xF0AE, 0x752C}, //19789 #CJK UNIFIED IDEOGRAPH
+ {0xF0AF, 0x9E20}, //19790 #CJK UNIFIED IDEOGRAPH
+ {0xF0B0, 0x9E22}, //19791 #CJK UNIFIED IDEOGRAPH
+ {0xF0B1, 0x9E28}, //19792 #CJK UNIFIED IDEOGRAPH
+ {0xF0B2, 0x9E29}, //19793 #CJK UNIFIED IDEOGRAPH
+ {0xF0B3, 0x9E2A}, //19794 #CJK UNIFIED IDEOGRAPH
+ {0xF0B4, 0x9E2B}, //19795 #CJK UNIFIED IDEOGRAPH
+ {0xF0B5, 0x9E2C}, //19796 #CJK UNIFIED IDEOGRAPH
+ {0xF0B6, 0x9E32}, //19797 #CJK UNIFIED IDEOGRAPH
+ {0xF0B7, 0x9E31}, //19798 #CJK UNIFIED IDEOGRAPH
+ {0xF0B8, 0x9E36}, //19799 #CJK UNIFIED IDEOGRAPH
+ {0xF0B9, 0x9E38}, //19800 #CJK UNIFIED IDEOGRAPH
+ {0xF0BA, 0x9E37}, //19801 #CJK UNIFIED IDEOGRAPH
+ {0xF0BB, 0x9E39}, //19802 #CJK UNIFIED IDEOGRAPH
+ {0xF0BC, 0x9E3A}, //19803 #CJK UNIFIED IDEOGRAPH
+ {0xF0BD, 0x9E3E}, //19804 #CJK UNIFIED IDEOGRAPH
+ {0xF0BE, 0x9E41}, //19805 #CJK UNIFIED IDEOGRAPH
+ {0xF0BF, 0x9E42}, //19806 #CJK UNIFIED IDEOGRAPH
+ {0xF0C0, 0x9E44}, //19807 #CJK UNIFIED IDEOGRAPH
+ {0xF0C1, 0x9E46}, //19808 #CJK UNIFIED IDEOGRAPH
+ {0xF0C2, 0x9E47}, //19809 #CJK UNIFIED IDEOGRAPH
+ {0xF0C3, 0x9E48}, //19810 #CJK UNIFIED IDEOGRAPH
+ {0xF0C4, 0x9E49}, //19811 #CJK UNIFIED IDEOGRAPH
+ {0xF0C5, 0x9E4B}, //19812 #CJK UNIFIED IDEOGRAPH
+ {0xF0C6, 0x9E4C}, //19813 #CJK UNIFIED IDEOGRAPH
+ {0xF0C7, 0x9E4E}, //19814 #CJK UNIFIED IDEOGRAPH
+ {0xF0C8, 0x9E51}, //19815 #CJK UNIFIED IDEOGRAPH
+ {0xF0C9, 0x9E55}, //19816 #CJK UNIFIED IDEOGRAPH
+ {0xF0CA, 0x9E57}, //19817 #CJK UNIFIED IDEOGRAPH
+ {0xF0CB, 0x9E5A}, //19818 #CJK UNIFIED IDEOGRAPH
+ {0xF0CC, 0x9E5B}, //19819 #CJK UNIFIED IDEOGRAPH
+ {0xF0CD, 0x9E5C}, //19820 #CJK UNIFIED IDEOGRAPH
+ {0xF0CE, 0x9E5E}, //19821 #CJK UNIFIED IDEOGRAPH
+ {0xF0CF, 0x9E63}, //19822 #CJK UNIFIED IDEOGRAPH
+ {0xF0D0, 0x9E66}, //19823 #CJK UNIFIED IDEOGRAPH
+ {0xF0D1, 0x9E67}, //19824 #CJK UNIFIED IDEOGRAPH
+ {0xF0D2, 0x9E68}, //19825 #CJK UNIFIED IDEOGRAPH
+ {0xF0D3, 0x9E69}, //19826 #CJK UNIFIED IDEOGRAPH
+ {0xF0D4, 0x9E6A}, //19827 #CJK UNIFIED IDEOGRAPH
+ {0xF0D5, 0x9E6B}, //19828 #CJK UNIFIED IDEOGRAPH
+ {0xF0D6, 0x9E6C}, //19829 #CJK UNIFIED IDEOGRAPH
+ {0xF0D7, 0x9E71}, //19830 #CJK UNIFIED IDEOGRAPH
+ {0xF0D8, 0x9E6D}, //19831 #CJK UNIFIED IDEOGRAPH
+ {0xF0D9, 0x9E73}, //19832 #CJK UNIFIED IDEOGRAPH
+ {0xF0DA, 0x7592}, //19833 #CJK UNIFIED IDEOGRAPH
+ {0xF0DB, 0x7594}, //19834 #CJK UNIFIED IDEOGRAPH
+ {0xF0DC, 0x7596}, //19835 #CJK UNIFIED IDEOGRAPH
+ {0xF0DD, 0x75A0}, //19836 #CJK UNIFIED IDEOGRAPH
+ {0xF0DE, 0x759D}, //19837 #CJK UNIFIED IDEOGRAPH
+ {0xF0DF, 0x75AC}, //19838 #CJK UNIFIED IDEOGRAPH
+ {0xF0E0, 0x75A3}, //19839 #CJK UNIFIED IDEOGRAPH
+ {0xF0E1, 0x75B3}, //19840 #CJK UNIFIED IDEOGRAPH
+ {0xF0E2, 0x75B4}, //19841 #CJK UNIFIED IDEOGRAPH
+ {0xF0E3, 0x75B8}, //19842 #CJK UNIFIED IDEOGRAPH
+ {0xF0E4, 0x75C4}, //19843 #CJK UNIFIED IDEOGRAPH
+ {0xF0E5, 0x75B1}, //19844 #CJK UNIFIED IDEOGRAPH
+ {0xF0E6, 0x75B0}, //19845 #CJK UNIFIED IDEOGRAPH
+ {0xF0E7, 0x75C3}, //19846 #CJK UNIFIED IDEOGRAPH
+ {0xF0E8, 0x75C2}, //19847 #CJK UNIFIED IDEOGRAPH
+ {0xF0E9, 0x75D6}, //19848 #CJK UNIFIED IDEOGRAPH
+ {0xF0EA, 0x75CD}, //19849 #CJK UNIFIED IDEOGRAPH
+ {0xF0EB, 0x75E3}, //19850 #CJK UNIFIED IDEOGRAPH
+ {0xF0EC, 0x75E8}, //19851 #CJK UNIFIED IDEOGRAPH
+ {0xF0ED, 0x75E6}, //19852 #CJK UNIFIED IDEOGRAPH
+ {0xF0EE, 0x75E4}, //19853 #CJK UNIFIED IDEOGRAPH
+ {0xF0EF, 0x75EB}, //19854 #CJK UNIFIED IDEOGRAPH
+ {0xF0F0, 0x75E7}, //19855 #CJK UNIFIED IDEOGRAPH
+ {0xF0F1, 0x7603}, //19856 #CJK UNIFIED IDEOGRAPH
+ {0xF0F2, 0x75F1}, //19857 #CJK UNIFIED IDEOGRAPH
+ {0xF0F3, 0x75FC}, //19858 #CJK UNIFIED IDEOGRAPH
+ {0xF0F4, 0x75FF}, //19859 #CJK UNIFIED IDEOGRAPH
+ {0xF0F5, 0x7610}, //19860 #CJK UNIFIED IDEOGRAPH
+ {0xF0F6, 0x7600}, //19861 #CJK UNIFIED IDEOGRAPH
+ {0xF0F7, 0x7605}, //19862 #CJK UNIFIED IDEOGRAPH
+ {0xF0F8, 0x760C}, //19863 #CJK UNIFIED IDEOGRAPH
+ {0xF0F9, 0x7617}, //19864 #CJK UNIFIED IDEOGRAPH
+ {0xF0FA, 0x760A}, //19865 #CJK UNIFIED IDEOGRAPH
+ {0xF0FB, 0x7625}, //19866 #CJK UNIFIED IDEOGRAPH
+ {0xF0FC, 0x7618}, //19867 #CJK UNIFIED IDEOGRAPH
+ {0xF0FD, 0x7615}, //19868 #CJK UNIFIED IDEOGRAPH
+ {0xF0FE, 0x7619}, //19869 #CJK UNIFIED IDEOGRAPH
+ {0xF140, 0x998C}, //19870 #CJK UNIFIED IDEOGRAPH
+ {0xF141, 0x998E}, //19871 #CJK UNIFIED IDEOGRAPH
+ {0xF142, 0x999A}, //19872 #CJK UNIFIED IDEOGRAPH
+ {0xF143, 0x999B}, //19873 #CJK UNIFIED IDEOGRAPH
+ {0xF144, 0x999C}, //19874 #CJK UNIFIED IDEOGRAPH
+ {0xF145, 0x999D}, //19875 #CJK UNIFIED IDEOGRAPH
+ {0xF146, 0x999E}, //19876 #CJK UNIFIED IDEOGRAPH
+ {0xF147, 0x999F}, //19877 #CJK UNIFIED IDEOGRAPH
+ {0xF148, 0x99A0}, //19878 #CJK UNIFIED IDEOGRAPH
+ {0xF149, 0x99A1}, //19879 #CJK UNIFIED IDEOGRAPH
+ {0xF14A, 0x99A2}, //19880 #CJK UNIFIED IDEOGRAPH
+ {0xF14B, 0x99A3}, //19881 #CJK UNIFIED IDEOGRAPH
+ {0xF14C, 0x99A4}, //19882 #CJK UNIFIED IDEOGRAPH
+ {0xF14D, 0x99A6}, //19883 #CJK UNIFIED IDEOGRAPH
+ {0xF14E, 0x99A7}, //19884 #CJK UNIFIED IDEOGRAPH
+ {0xF14F, 0x99A9}, //19885 #CJK UNIFIED IDEOGRAPH
+ {0xF150, 0x99AA}, //19886 #CJK UNIFIED IDEOGRAPH
+ {0xF151, 0x99AB}, //19887 #CJK UNIFIED IDEOGRAPH
+ {0xF152, 0x99AC}, //19888 #CJK UNIFIED IDEOGRAPH
+ {0xF153, 0x99AD}, //19889 #CJK UNIFIED IDEOGRAPH
+ {0xF154, 0x99AE}, //19890 #CJK UNIFIED IDEOGRAPH
+ {0xF155, 0x99AF}, //19891 #CJK UNIFIED IDEOGRAPH
+ {0xF156, 0x99B0}, //19892 #CJK UNIFIED IDEOGRAPH
+ {0xF157, 0x99B1}, //19893 #CJK UNIFIED IDEOGRAPH
+ {0xF158, 0x99B2}, //19894 #CJK UNIFIED IDEOGRAPH
+ {0xF159, 0x99B3}, //19895 #CJK UNIFIED IDEOGRAPH
+ {0xF15A, 0x99B4}, //19896 #CJK UNIFIED IDEOGRAPH
+ {0xF15B, 0x99B5}, //19897 #CJK UNIFIED IDEOGRAPH
+ {0xF15C, 0x99B6}, //19898 #CJK UNIFIED IDEOGRAPH
+ {0xF15D, 0x99B7}, //19899 #CJK UNIFIED IDEOGRAPH
+ {0xF15E, 0x99B8}, //19900 #CJK UNIFIED IDEOGRAPH
+ {0xF15F, 0x99B9}, //19901 #CJK UNIFIED IDEOGRAPH
+ {0xF160, 0x99BA}, //19902 #CJK UNIFIED IDEOGRAPH
+ {0xF161, 0x99BB}, //19903 #CJK UNIFIED IDEOGRAPH
+ {0xF162, 0x99BC}, //19904 #CJK UNIFIED IDEOGRAPH
+ {0xF163, 0x99BD}, //19905 #CJK UNIFIED IDEOGRAPH
+ {0xF164, 0x99BE}, //19906 #CJK UNIFIED IDEOGRAPH
+ {0xF165, 0x99BF}, //19907 #CJK UNIFIED IDEOGRAPH
+ {0xF166, 0x99C0}, //19908 #CJK UNIFIED IDEOGRAPH
+ {0xF167, 0x99C1}, //19909 #CJK UNIFIED IDEOGRAPH
+ {0xF168, 0x99C2}, //19910 #CJK UNIFIED IDEOGRAPH
+ {0xF169, 0x99C3}, //19911 #CJK UNIFIED IDEOGRAPH
+ {0xF16A, 0x99C4}, //19912 #CJK UNIFIED IDEOGRAPH
+ {0xF16B, 0x99C5}, //19913 #CJK UNIFIED IDEOGRAPH
+ {0xF16C, 0x99C6}, //19914 #CJK UNIFIED IDEOGRAPH
+ {0xF16D, 0x99C7}, //19915 #CJK UNIFIED IDEOGRAPH
+ {0xF16E, 0x99C8}, //19916 #CJK UNIFIED IDEOGRAPH
+ {0xF16F, 0x99C9}, //19917 #CJK UNIFIED IDEOGRAPH
+ {0xF170, 0x99CA}, //19918 #CJK UNIFIED IDEOGRAPH
+ {0xF171, 0x99CB}, //19919 #CJK UNIFIED IDEOGRAPH
+ {0xF172, 0x99CC}, //19920 #CJK UNIFIED IDEOGRAPH
+ {0xF173, 0x99CD}, //19921 #CJK UNIFIED IDEOGRAPH
+ {0xF174, 0x99CE}, //19922 #CJK UNIFIED IDEOGRAPH
+ {0xF175, 0x99CF}, //19923 #CJK UNIFIED IDEOGRAPH
+ {0xF176, 0x99D0}, //19924 #CJK UNIFIED IDEOGRAPH
+ {0xF177, 0x99D1}, //19925 #CJK UNIFIED IDEOGRAPH
+ {0xF178, 0x99D2}, //19926 #CJK UNIFIED IDEOGRAPH
+ {0xF179, 0x99D3}, //19927 #CJK UNIFIED IDEOGRAPH
+ {0xF17A, 0x99D4}, //19928 #CJK UNIFIED IDEOGRAPH
+ {0xF17B, 0x99D5}, //19929 #CJK UNIFIED IDEOGRAPH
+ {0xF17C, 0x99D6}, //19930 #CJK UNIFIED IDEOGRAPH
+ {0xF17D, 0x99D7}, //19931 #CJK UNIFIED IDEOGRAPH
+ {0xF17E, 0x99D8}, //19932 #CJK UNIFIED IDEOGRAPH
+ {0xF180, 0x99D9}, //19933 #CJK UNIFIED IDEOGRAPH
+ {0xF181, 0x99DA}, //19934 #CJK UNIFIED IDEOGRAPH
+ {0xF182, 0x99DB}, //19935 #CJK UNIFIED IDEOGRAPH
+ {0xF183, 0x99DC}, //19936 #CJK UNIFIED IDEOGRAPH
+ {0xF184, 0x99DD}, //19937 #CJK UNIFIED IDEOGRAPH
+ {0xF185, 0x99DE}, //19938 #CJK UNIFIED IDEOGRAPH
+ {0xF186, 0x99DF}, //19939 #CJK UNIFIED IDEOGRAPH
+ {0xF187, 0x99E0}, //19940 #CJK UNIFIED IDEOGRAPH
+ {0xF188, 0x99E1}, //19941 #CJK UNIFIED IDEOGRAPH
+ {0xF189, 0x99E2}, //19942 #CJK UNIFIED IDEOGRAPH
+ {0xF18A, 0x99E3}, //19943 #CJK UNIFIED IDEOGRAPH
+ {0xF18B, 0x99E4}, //19944 #CJK UNIFIED IDEOGRAPH
+ {0xF18C, 0x99E5}, //19945 #CJK UNIFIED IDEOGRAPH
+ {0xF18D, 0x99E6}, //19946 #CJK UNIFIED IDEOGRAPH
+ {0xF18E, 0x99E7}, //19947 #CJK UNIFIED IDEOGRAPH
+ {0xF18F, 0x99E8}, //19948 #CJK UNIFIED IDEOGRAPH
+ {0xF190, 0x99E9}, //19949 #CJK UNIFIED IDEOGRAPH
+ {0xF191, 0x99EA}, //19950 #CJK UNIFIED IDEOGRAPH
+ {0xF192, 0x99EB}, //19951 #CJK UNIFIED IDEOGRAPH
+ {0xF193, 0x99EC}, //19952 #CJK UNIFIED IDEOGRAPH
+ {0xF194, 0x99ED}, //19953 #CJK UNIFIED IDEOGRAPH
+ {0xF195, 0x99EE}, //19954 #CJK UNIFIED IDEOGRAPH
+ {0xF196, 0x99EF}, //19955 #CJK UNIFIED IDEOGRAPH
+ {0xF197, 0x99F0}, //19956 #CJK UNIFIED IDEOGRAPH
+ {0xF198, 0x99F1}, //19957 #CJK UNIFIED IDEOGRAPH
+ {0xF199, 0x99F2}, //19958 #CJK UNIFIED IDEOGRAPH
+ {0xF19A, 0x99F3}, //19959 #CJK UNIFIED IDEOGRAPH
+ {0xF19B, 0x99F4}, //19960 #CJK UNIFIED IDEOGRAPH
+ {0xF19C, 0x99F5}, //19961 #CJK UNIFIED IDEOGRAPH
+ {0xF19D, 0x99F6}, //19962 #CJK UNIFIED IDEOGRAPH
+ {0xF19E, 0x99F7}, //19963 #CJK UNIFIED IDEOGRAPH
+ {0xF19F, 0x99F8}, //19964 #CJK UNIFIED IDEOGRAPH
+ {0xF1A0, 0x99F9}, //19965 #CJK UNIFIED IDEOGRAPH
+ {0xF1A1, 0x761B}, //19966 #CJK UNIFIED IDEOGRAPH
+ {0xF1A2, 0x763C}, //19967 #CJK UNIFIED IDEOGRAPH
+ {0xF1A3, 0x7622}, //19968 #CJK UNIFIED IDEOGRAPH
+ {0xF1A4, 0x7620}, //19969 #CJK UNIFIED IDEOGRAPH
+ {0xF1A5, 0x7640}, //19970 #CJK UNIFIED IDEOGRAPH
+ {0xF1A6, 0x762D}, //19971 #CJK UNIFIED IDEOGRAPH
+ {0xF1A7, 0x7630}, //19972 #CJK UNIFIED IDEOGRAPH
+ {0xF1A8, 0x763F}, //19973 #CJK UNIFIED IDEOGRAPH
+ {0xF1A9, 0x7635}, //19974 #CJK UNIFIED IDEOGRAPH
+ {0xF1AA, 0x7643}, //19975 #CJK UNIFIED IDEOGRAPH
+ {0xF1AB, 0x763E}, //19976 #CJK UNIFIED IDEOGRAPH
+ {0xF1AC, 0x7633}, //19977 #CJK UNIFIED IDEOGRAPH
+ {0xF1AD, 0x764D}, //19978 #CJK UNIFIED IDEOGRAPH
+ {0xF1AE, 0x765E}, //19979 #CJK UNIFIED IDEOGRAPH
+ {0xF1AF, 0x7654}, //19980 #CJK UNIFIED IDEOGRAPH
+ {0xF1B0, 0x765C}, //19981 #CJK UNIFIED IDEOGRAPH
+ {0xF1B1, 0x7656}, //19982 #CJK UNIFIED IDEOGRAPH
+ {0xF1B2, 0x766B}, //19983 #CJK UNIFIED IDEOGRAPH
+ {0xF1B3, 0x766F}, //19984 #CJK UNIFIED IDEOGRAPH
+ {0xF1B4, 0x7FCA}, //19985 #CJK UNIFIED IDEOGRAPH
+ {0xF1B5, 0x7AE6}, //19986 #CJK UNIFIED IDEOGRAPH
+ {0xF1B6, 0x7A78}, //19987 #CJK UNIFIED IDEOGRAPH
+ {0xF1B7, 0x7A79}, //19988 #CJK UNIFIED IDEOGRAPH
+ {0xF1B8, 0x7A80}, //19989 #CJK UNIFIED IDEOGRAPH
+ {0xF1B9, 0x7A86}, //19990 #CJK UNIFIED IDEOGRAPH
+ {0xF1BA, 0x7A88}, //19991 #CJK UNIFIED IDEOGRAPH
+ {0xF1BB, 0x7A95}, //19992 #CJK UNIFIED IDEOGRAPH
+ {0xF1BC, 0x7AA6}, //19993 #CJK UNIFIED IDEOGRAPH
+ {0xF1BD, 0x7AA0}, //19994 #CJK UNIFIED IDEOGRAPH
+ {0xF1BE, 0x7AAC}, //19995 #CJK UNIFIED IDEOGRAPH
+ {0xF1BF, 0x7AA8}, //19996 #CJK UNIFIED IDEOGRAPH
+ {0xF1C0, 0x7AAD}, //19997 #CJK UNIFIED IDEOGRAPH
+ {0xF1C1, 0x7AB3}, //19998 #CJK UNIFIED IDEOGRAPH
+ {0xF1C2, 0x8864}, //19999 #CJK UNIFIED IDEOGRAPH
+ {0xF1C3, 0x8869}, //20000 #CJK UNIFIED IDEOGRAPH
+ {0xF1C4, 0x8872}, //20001 #CJK UNIFIED IDEOGRAPH
+ {0xF1C5, 0x887D}, //20002 #CJK UNIFIED IDEOGRAPH
+ {0xF1C6, 0x887F}, //20003 #CJK UNIFIED IDEOGRAPH
+ {0xF1C7, 0x8882}, //20004 #CJK UNIFIED IDEOGRAPH
+ {0xF1C8, 0x88A2}, //20005 #CJK UNIFIED IDEOGRAPH
+ {0xF1C9, 0x88C6}, //20006 #CJK UNIFIED IDEOGRAPH
+ {0xF1CA, 0x88B7}, //20007 #CJK UNIFIED IDEOGRAPH
+ {0xF1CB, 0x88BC}, //20008 #CJK UNIFIED IDEOGRAPH
+ {0xF1CC, 0x88C9}, //20009 #CJK UNIFIED IDEOGRAPH
+ {0xF1CD, 0x88E2}, //20010 #CJK UNIFIED IDEOGRAPH
+ {0xF1CE, 0x88CE}, //20011 #CJK UNIFIED IDEOGRAPH
+ {0xF1CF, 0x88E3}, //20012 #CJK UNIFIED IDEOGRAPH
+ {0xF1D0, 0x88E5}, //20013 #CJK UNIFIED IDEOGRAPH
+ {0xF1D1, 0x88F1}, //20014 #CJK UNIFIED IDEOGRAPH
+ {0xF1D2, 0x891A}, //20015 #CJK UNIFIED IDEOGRAPH
+ {0xF1D3, 0x88FC}, //20016 #CJK UNIFIED IDEOGRAPH
+ {0xF1D4, 0x88E8}, //20017 #CJK UNIFIED IDEOGRAPH
+ {0xF1D5, 0x88FE}, //20018 #CJK UNIFIED IDEOGRAPH
+ {0xF1D6, 0x88F0}, //20019 #CJK UNIFIED IDEOGRAPH
+ {0xF1D7, 0x8921}, //20020 #CJK UNIFIED IDEOGRAPH
+ {0xF1D8, 0x8919}, //20021 #CJK UNIFIED IDEOGRAPH
+ {0xF1D9, 0x8913}, //20022 #CJK UNIFIED IDEOGRAPH
+ {0xF1DA, 0x891B}, //20023 #CJK UNIFIED IDEOGRAPH
+ {0xF1DB, 0x890A}, //20024 #CJK UNIFIED IDEOGRAPH
+ {0xF1DC, 0x8934}, //20025 #CJK UNIFIED IDEOGRAPH
+ {0xF1DD, 0x892B}, //20026 #CJK UNIFIED IDEOGRAPH
+ {0xF1DE, 0x8936}, //20027 #CJK UNIFIED IDEOGRAPH
+ {0xF1DF, 0x8941}, //20028 #CJK UNIFIED IDEOGRAPH
+ {0xF1E0, 0x8966}, //20029 #CJK UNIFIED IDEOGRAPH
+ {0xF1E1, 0x897B}, //20030 #CJK UNIFIED IDEOGRAPH
+ {0xF1E2, 0x758B}, //20031 #CJK UNIFIED IDEOGRAPH
+ {0xF1E3, 0x80E5}, //20032 #CJK UNIFIED IDEOGRAPH
+ {0xF1E4, 0x76B2}, //20033 #CJK UNIFIED IDEOGRAPH
+ {0xF1E5, 0x76B4}, //20034 #CJK UNIFIED IDEOGRAPH
+ {0xF1E6, 0x77DC}, //20035 #CJK UNIFIED IDEOGRAPH
+ {0xF1E7, 0x8012}, //20036 #CJK UNIFIED IDEOGRAPH
+ {0xF1E8, 0x8014}, //20037 #CJK UNIFIED IDEOGRAPH
+ {0xF1E9, 0x8016}, //20038 #CJK UNIFIED IDEOGRAPH
+ {0xF1EA, 0x801C}, //20039 #CJK UNIFIED IDEOGRAPH
+ {0xF1EB, 0x8020}, //20040 #CJK UNIFIED IDEOGRAPH
+ {0xF1EC, 0x8022}, //20041 #CJK UNIFIED IDEOGRAPH
+ {0xF1ED, 0x8025}, //20042 #CJK UNIFIED IDEOGRAPH
+ {0xF1EE, 0x8026}, //20043 #CJK UNIFIED IDEOGRAPH
+ {0xF1EF, 0x8027}, //20044 #CJK UNIFIED IDEOGRAPH
+ {0xF1F0, 0x8029}, //20045 #CJK UNIFIED IDEOGRAPH
+ {0xF1F1, 0x8028}, //20046 #CJK UNIFIED IDEOGRAPH
+ {0xF1F2, 0x8031}, //20047 #CJK UNIFIED IDEOGRAPH
+ {0xF1F3, 0x800B}, //20048 #CJK UNIFIED IDEOGRAPH
+ {0xF1F4, 0x8035}, //20049 #CJK UNIFIED IDEOGRAPH
+ {0xF1F5, 0x8043}, //20050 #CJK UNIFIED IDEOGRAPH
+ {0xF1F6, 0x8046}, //20051 #CJK UNIFIED IDEOGRAPH
+ {0xF1F7, 0x804D}, //20052 #CJK UNIFIED IDEOGRAPH
+ {0xF1F8, 0x8052}, //20053 #CJK UNIFIED IDEOGRAPH
+ {0xF1F9, 0x8069}, //20054 #CJK UNIFIED IDEOGRAPH
+ {0xF1FA, 0x8071}, //20055 #CJK UNIFIED IDEOGRAPH
+ {0xF1FB, 0x8983}, //20056 #CJK UNIFIED IDEOGRAPH
+ {0xF1FC, 0x9878}, //20057 #CJK UNIFIED IDEOGRAPH
+ {0xF1FD, 0x9880}, //20058 #CJK UNIFIED IDEOGRAPH
+ {0xF1FE, 0x9883}, //20059 #CJK UNIFIED IDEOGRAPH
+ {0xF240, 0x99FA}, //20060 #CJK UNIFIED IDEOGRAPH
+ {0xF241, 0x99FB}, //20061 #CJK UNIFIED IDEOGRAPH
+ {0xF242, 0x99FC}, //20062 #CJK UNIFIED IDEOGRAPH
+ {0xF243, 0x99FD}, //20063 #CJK UNIFIED IDEOGRAPH
+ {0xF244, 0x99FE}, //20064 #CJK UNIFIED IDEOGRAPH
+ {0xF245, 0x99FF}, //20065 #CJK UNIFIED IDEOGRAPH
+ {0xF246, 0x9A00}, //20066 #CJK UNIFIED IDEOGRAPH
+ {0xF247, 0x9A01}, //20067 #CJK UNIFIED IDEOGRAPH
+ {0xF248, 0x9A02}, //20068 #CJK UNIFIED IDEOGRAPH
+ {0xF249, 0x9A03}, //20069 #CJK UNIFIED IDEOGRAPH
+ {0xF24A, 0x9A04}, //20070 #CJK UNIFIED IDEOGRAPH
+ {0xF24B, 0x9A05}, //20071 #CJK UNIFIED IDEOGRAPH
+ {0xF24C, 0x9A06}, //20072 #CJK UNIFIED IDEOGRAPH
+ {0xF24D, 0x9A07}, //20073 #CJK UNIFIED IDEOGRAPH
+ {0xF24E, 0x9A08}, //20074 #CJK UNIFIED IDEOGRAPH
+ {0xF24F, 0x9A09}, //20075 #CJK UNIFIED IDEOGRAPH
+ {0xF250, 0x9A0A}, //20076 #CJK UNIFIED IDEOGRAPH
+ {0xF251, 0x9A0B}, //20077 #CJK UNIFIED IDEOGRAPH
+ {0xF252, 0x9A0C}, //20078 #CJK UNIFIED IDEOGRAPH
+ {0xF253, 0x9A0D}, //20079 #CJK UNIFIED IDEOGRAPH
+ {0xF254, 0x9A0E}, //20080 #CJK UNIFIED IDEOGRAPH
+ {0xF255, 0x9A0F}, //20081 #CJK UNIFIED IDEOGRAPH
+ {0xF256, 0x9A10}, //20082 #CJK UNIFIED IDEOGRAPH
+ {0xF257, 0x9A11}, //20083 #CJK UNIFIED IDEOGRAPH
+ {0xF258, 0x9A12}, //20084 #CJK UNIFIED IDEOGRAPH
+ {0xF259, 0x9A13}, //20085 #CJK UNIFIED IDEOGRAPH
+ {0xF25A, 0x9A14}, //20086 #CJK UNIFIED IDEOGRAPH
+ {0xF25B, 0x9A15}, //20087 #CJK UNIFIED IDEOGRAPH
+ {0xF25C, 0x9A16}, //20088 #CJK UNIFIED IDEOGRAPH
+ {0xF25D, 0x9A17}, //20089 #CJK UNIFIED IDEOGRAPH
+ {0xF25E, 0x9A18}, //20090 #CJK UNIFIED IDEOGRAPH
+ {0xF25F, 0x9A19}, //20091 #CJK UNIFIED IDEOGRAPH
+ {0xF260, 0x9A1A}, //20092 #CJK UNIFIED IDEOGRAPH
+ {0xF261, 0x9A1B}, //20093 #CJK UNIFIED IDEOGRAPH
+ {0xF262, 0x9A1C}, //20094 #CJK UNIFIED IDEOGRAPH
+ {0xF263, 0x9A1D}, //20095 #CJK UNIFIED IDEOGRAPH
+ {0xF264, 0x9A1E}, //20096 #CJK UNIFIED IDEOGRAPH
+ {0xF265, 0x9A1F}, //20097 #CJK UNIFIED IDEOGRAPH
+ {0xF266, 0x9A20}, //20098 #CJK UNIFIED IDEOGRAPH
+ {0xF267, 0x9A21}, //20099 #CJK UNIFIED IDEOGRAPH
+ {0xF268, 0x9A22}, //20100 #CJK UNIFIED IDEOGRAPH
+ {0xF269, 0x9A23}, //20101 #CJK UNIFIED IDEOGRAPH
+ {0xF26A, 0x9A24}, //20102 #CJK UNIFIED IDEOGRAPH
+ {0xF26B, 0x9A25}, //20103 #CJK UNIFIED IDEOGRAPH
+ {0xF26C, 0x9A26}, //20104 #CJK UNIFIED IDEOGRAPH
+ {0xF26D, 0x9A27}, //20105 #CJK UNIFIED IDEOGRAPH
+ {0xF26E, 0x9A28}, //20106 #CJK UNIFIED IDEOGRAPH
+ {0xF26F, 0x9A29}, //20107 #CJK UNIFIED IDEOGRAPH
+ {0xF270, 0x9A2A}, //20108 #CJK UNIFIED IDEOGRAPH
+ {0xF271, 0x9A2B}, //20109 #CJK UNIFIED IDEOGRAPH
+ {0xF272, 0x9A2C}, //20110 #CJK UNIFIED IDEOGRAPH
+ {0xF273, 0x9A2D}, //20111 #CJK UNIFIED IDEOGRAPH
+ {0xF274, 0x9A2E}, //20112 #CJK UNIFIED IDEOGRAPH
+ {0xF275, 0x9A2F}, //20113 #CJK UNIFIED IDEOGRAPH
+ {0xF276, 0x9A30}, //20114 #CJK UNIFIED IDEOGRAPH
+ {0xF277, 0x9A31}, //20115 #CJK UNIFIED IDEOGRAPH
+ {0xF278, 0x9A32}, //20116 #CJK UNIFIED IDEOGRAPH
+ {0xF279, 0x9A33}, //20117 #CJK UNIFIED IDEOGRAPH
+ {0xF27A, 0x9A34}, //20118 #CJK UNIFIED IDEOGRAPH
+ {0xF27B, 0x9A35}, //20119 #CJK UNIFIED IDEOGRAPH
+ {0xF27C, 0x9A36}, //20120 #CJK UNIFIED IDEOGRAPH
+ {0xF27D, 0x9A37}, //20121 #CJK UNIFIED IDEOGRAPH
+ {0xF27E, 0x9A38}, //20122 #CJK UNIFIED IDEOGRAPH
+ {0xF280, 0x9A39}, //20123 #CJK UNIFIED IDEOGRAPH
+ {0xF281, 0x9A3A}, //20124 #CJK UNIFIED IDEOGRAPH
+ {0xF282, 0x9A3B}, //20125 #CJK UNIFIED IDEOGRAPH
+ {0xF283, 0x9A3C}, //20126 #CJK UNIFIED IDEOGRAPH
+ {0xF284, 0x9A3D}, //20127 #CJK UNIFIED IDEOGRAPH
+ {0xF285, 0x9A3E}, //20128 #CJK UNIFIED IDEOGRAPH
+ {0xF286, 0x9A3F}, //20129 #CJK UNIFIED IDEOGRAPH
+ {0xF287, 0x9A40}, //20130 #CJK UNIFIED IDEOGRAPH
+ {0xF288, 0x9A41}, //20131 #CJK UNIFIED IDEOGRAPH
+ {0xF289, 0x9A42}, //20132 #CJK UNIFIED IDEOGRAPH
+ {0xF28A, 0x9A43}, //20133 #CJK UNIFIED IDEOGRAPH
+ {0xF28B, 0x9A44}, //20134 #CJK UNIFIED IDEOGRAPH
+ {0xF28C, 0x9A45}, //20135 #CJK UNIFIED IDEOGRAPH
+ {0xF28D, 0x9A46}, //20136 #CJK UNIFIED IDEOGRAPH
+ {0xF28E, 0x9A47}, //20137 #CJK UNIFIED IDEOGRAPH
+ {0xF28F, 0x9A48}, //20138 #CJK UNIFIED IDEOGRAPH
+ {0xF290, 0x9A49}, //20139 #CJK UNIFIED IDEOGRAPH
+ {0xF291, 0x9A4A}, //20140 #CJK UNIFIED IDEOGRAPH
+ {0xF292, 0x9A4B}, //20141 #CJK UNIFIED IDEOGRAPH
+ {0xF293, 0x9A4C}, //20142 #CJK UNIFIED IDEOGRAPH
+ {0xF294, 0x9A4D}, //20143 #CJK UNIFIED IDEOGRAPH
+ {0xF295, 0x9A4E}, //20144 #CJK UNIFIED IDEOGRAPH
+ {0xF296, 0x9A4F}, //20145 #CJK UNIFIED IDEOGRAPH
+ {0xF297, 0x9A50}, //20146 #CJK UNIFIED IDEOGRAPH
+ {0xF298, 0x9A51}, //20147 #CJK UNIFIED IDEOGRAPH
+ {0xF299, 0x9A52}, //20148 #CJK UNIFIED IDEOGRAPH
+ {0xF29A, 0x9A53}, //20149 #CJK UNIFIED IDEOGRAPH
+ {0xF29B, 0x9A54}, //20150 #CJK UNIFIED IDEOGRAPH
+ {0xF29C, 0x9A55}, //20151 #CJK UNIFIED IDEOGRAPH
+ {0xF29D, 0x9A56}, //20152 #CJK UNIFIED IDEOGRAPH
+ {0xF29E, 0x9A57}, //20153 #CJK UNIFIED IDEOGRAPH
+ {0xF29F, 0x9A58}, //20154 #CJK UNIFIED IDEOGRAPH
+ {0xF2A0, 0x9A59}, //20155 #CJK UNIFIED IDEOGRAPH
+ {0xF2A1, 0x9889}, //20156 #CJK UNIFIED IDEOGRAPH
+ {0xF2A2, 0x988C}, //20157 #CJK UNIFIED IDEOGRAPH
+ {0xF2A3, 0x988D}, //20158 #CJK UNIFIED IDEOGRAPH
+ {0xF2A4, 0x988F}, //20159 #CJK UNIFIED IDEOGRAPH
+ {0xF2A5, 0x9894}, //20160 #CJK UNIFIED IDEOGRAPH
+ {0xF2A6, 0x989A}, //20161 #CJK UNIFIED IDEOGRAPH
+ {0xF2A7, 0x989B}, //20162 #CJK UNIFIED IDEOGRAPH
+ {0xF2A8, 0x989E}, //20163 #CJK UNIFIED IDEOGRAPH
+ {0xF2A9, 0x989F}, //20164 #CJK UNIFIED IDEOGRAPH
+ {0xF2AA, 0x98A1}, //20165 #CJK UNIFIED IDEOGRAPH
+ {0xF2AB, 0x98A2}, //20166 #CJK UNIFIED IDEOGRAPH
+ {0xF2AC, 0x98A5}, //20167 #CJK UNIFIED IDEOGRAPH
+ {0xF2AD, 0x98A6}, //20168 #CJK UNIFIED IDEOGRAPH
+ {0xF2AE, 0x864D}, //20169 #CJK UNIFIED IDEOGRAPH
+ {0xF2AF, 0x8654}, //20170 #CJK UNIFIED IDEOGRAPH
+ {0xF2B0, 0x866C}, //20171 #CJK UNIFIED IDEOGRAPH
+ {0xF2B1, 0x866E}, //20172 #CJK UNIFIED IDEOGRAPH
+ {0xF2B2, 0x867F}, //20173 #CJK UNIFIED IDEOGRAPH
+ {0xF2B3, 0x867A}, //20174 #CJK UNIFIED IDEOGRAPH
+ {0xF2B4, 0x867C}, //20175 #CJK UNIFIED IDEOGRAPH
+ {0xF2B5, 0x867B}, //20176 #CJK UNIFIED IDEOGRAPH
+ {0xF2B6, 0x86A8}, //20177 #CJK UNIFIED IDEOGRAPH
+ {0xF2B7, 0x868D}, //20178 #CJK UNIFIED IDEOGRAPH
+ {0xF2B8, 0x868B}, //20179 #CJK UNIFIED IDEOGRAPH
+ {0xF2B9, 0x86AC}, //20180 #CJK UNIFIED IDEOGRAPH
+ {0xF2BA, 0x869D}, //20181 #CJK UNIFIED IDEOGRAPH
+ {0xF2BB, 0x86A7}, //20182 #CJK UNIFIED IDEOGRAPH
+ {0xF2BC, 0x86A3}, //20183 #CJK UNIFIED IDEOGRAPH
+ {0xF2BD, 0x86AA}, //20184 #CJK UNIFIED IDEOGRAPH
+ {0xF2BE, 0x8693}, //20185 #CJK UNIFIED IDEOGRAPH
+ {0xF2BF, 0x86A9}, //20186 #CJK UNIFIED IDEOGRAPH
+ {0xF2C0, 0x86B6}, //20187 #CJK UNIFIED IDEOGRAPH
+ {0xF2C1, 0x86C4}, //20188 #CJK UNIFIED IDEOGRAPH
+ {0xF2C2, 0x86B5}, //20189 #CJK UNIFIED IDEOGRAPH
+ {0xF2C3, 0x86CE}, //20190 #CJK UNIFIED IDEOGRAPH
+ {0xF2C4, 0x86B0}, //20191 #CJK UNIFIED IDEOGRAPH
+ {0xF2C5, 0x86BA}, //20192 #CJK UNIFIED IDEOGRAPH
+ {0xF2C6, 0x86B1}, //20193 #CJK UNIFIED IDEOGRAPH
+ {0xF2C7, 0x86AF}, //20194 #CJK UNIFIED IDEOGRAPH
+ {0xF2C8, 0x86C9}, //20195 #CJK UNIFIED IDEOGRAPH
+ {0xF2C9, 0x86CF}, //20196 #CJK UNIFIED IDEOGRAPH
+ {0xF2CA, 0x86B4}, //20197 #CJK UNIFIED IDEOGRAPH
+ {0xF2CB, 0x86E9}, //20198 #CJK UNIFIED IDEOGRAPH
+ {0xF2CC, 0x86F1}, //20199 #CJK UNIFIED IDEOGRAPH
+ {0xF2CD, 0x86F2}, //20200 #CJK UNIFIED IDEOGRAPH
+ {0xF2CE, 0x86ED}, //20201 #CJK UNIFIED IDEOGRAPH
+ {0xF2CF, 0x86F3}, //20202 #CJK UNIFIED IDEOGRAPH
+ {0xF2D0, 0x86D0}, //20203 #CJK UNIFIED IDEOGRAPH
+ {0xF2D1, 0x8713}, //20204 #CJK UNIFIED IDEOGRAPH
+ {0xF2D2, 0x86DE}, //20205 #CJK UNIFIED IDEOGRAPH
+ {0xF2D3, 0x86F4}, //20206 #CJK UNIFIED IDEOGRAPH
+ {0xF2D4, 0x86DF}, //20207 #CJK UNIFIED IDEOGRAPH
+ {0xF2D5, 0x86D8}, //20208 #CJK UNIFIED IDEOGRAPH
+ {0xF2D6, 0x86D1}, //20209 #CJK UNIFIED IDEOGRAPH
+ {0xF2D7, 0x8703}, //20210 #CJK UNIFIED IDEOGRAPH
+ {0xF2D8, 0x8707}, //20211 #CJK UNIFIED IDEOGRAPH
+ {0xF2D9, 0x86F8}, //20212 #CJK UNIFIED IDEOGRAPH
+ {0xF2DA, 0x8708}, //20213 #CJK UNIFIED IDEOGRAPH
+ {0xF2DB, 0x870A}, //20214 #CJK UNIFIED IDEOGRAPH
+ {0xF2DC, 0x870D}, //20215 #CJK UNIFIED IDEOGRAPH
+ {0xF2DD, 0x8709}, //20216 #CJK UNIFIED IDEOGRAPH
+ {0xF2DE, 0x8723}, //20217 #CJK UNIFIED IDEOGRAPH
+ {0xF2DF, 0x873B}, //20218 #CJK UNIFIED IDEOGRAPH
+ {0xF2E0, 0x871E}, //20219 #CJK UNIFIED IDEOGRAPH
+ {0xF2E1, 0x8725}, //20220 #CJK UNIFIED IDEOGRAPH
+ {0xF2E2, 0x872E}, //20221 #CJK UNIFIED IDEOGRAPH
+ {0xF2E3, 0x871A}, //20222 #CJK UNIFIED IDEOGRAPH
+ {0xF2E4, 0x873E}, //20223 #CJK UNIFIED IDEOGRAPH
+ {0xF2E5, 0x8748}, //20224 #CJK UNIFIED IDEOGRAPH
+ {0xF2E6, 0x8734}, //20225 #CJK UNIFIED IDEOGRAPH
+ {0xF2E7, 0x8731}, //20226 #CJK UNIFIED IDEOGRAPH
+ {0xF2E8, 0x8729}, //20227 #CJK UNIFIED IDEOGRAPH
+ {0xF2E9, 0x8737}, //20228 #CJK UNIFIED IDEOGRAPH
+ {0xF2EA, 0x873F}, //20229 #CJK UNIFIED IDEOGRAPH
+ {0xF2EB, 0x8782}, //20230 #CJK UNIFIED IDEOGRAPH
+ {0xF2EC, 0x8722}, //20231 #CJK UNIFIED IDEOGRAPH
+ {0xF2ED, 0x877D}, //20232 #CJK UNIFIED IDEOGRAPH
+ {0xF2EE, 0x877E}, //20233 #CJK UNIFIED IDEOGRAPH
+ {0xF2EF, 0x877B}, //20234 #CJK UNIFIED IDEOGRAPH
+ {0xF2F0, 0x8760}, //20235 #CJK UNIFIED IDEOGRAPH
+ {0xF2F1, 0x8770}, //20236 #CJK UNIFIED IDEOGRAPH
+ {0xF2F2, 0x874C}, //20237 #CJK UNIFIED IDEOGRAPH
+ {0xF2F3, 0x876E}, //20238 #CJK UNIFIED IDEOGRAPH
+ {0xF2F4, 0x878B}, //20239 #CJK UNIFIED IDEOGRAPH
+ {0xF2F5, 0x8753}, //20240 #CJK UNIFIED IDEOGRAPH
+ {0xF2F6, 0x8763}, //20241 #CJK UNIFIED IDEOGRAPH
+ {0xF2F7, 0x877C}, //20242 #CJK UNIFIED IDEOGRAPH
+ {0xF2F8, 0x8764}, //20243 #CJK UNIFIED IDEOGRAPH
+ {0xF2F9, 0x8759}, //20244 #CJK UNIFIED IDEOGRAPH
+ {0xF2FA, 0x8765}, //20245 #CJK UNIFIED IDEOGRAPH
+ {0xF2FB, 0x8793}, //20246 #CJK UNIFIED IDEOGRAPH
+ {0xF2FC, 0x87AF}, //20247 #CJK UNIFIED IDEOGRAPH
+ {0xF2FD, 0x87A8}, //20248 #CJK UNIFIED IDEOGRAPH
+ {0xF2FE, 0x87D2}, //20249 #CJK UNIFIED IDEOGRAPH
+ {0xF340, 0x9A5A}, //20250 #CJK UNIFIED IDEOGRAPH
+ {0xF341, 0x9A5B}, //20251 #CJK UNIFIED IDEOGRAPH
+ {0xF342, 0x9A5C}, //20252 #CJK UNIFIED IDEOGRAPH
+ {0xF343, 0x9A5D}, //20253 #CJK UNIFIED IDEOGRAPH
+ {0xF344, 0x9A5E}, //20254 #CJK UNIFIED IDEOGRAPH
+ {0xF345, 0x9A5F}, //20255 #CJK UNIFIED IDEOGRAPH
+ {0xF346, 0x9A60}, //20256 #CJK UNIFIED IDEOGRAPH
+ {0xF347, 0x9A61}, //20257 #CJK UNIFIED IDEOGRAPH
+ {0xF348, 0x9A62}, //20258 #CJK UNIFIED IDEOGRAPH
+ {0xF349, 0x9A63}, //20259 #CJK UNIFIED IDEOGRAPH
+ {0xF34A, 0x9A64}, //20260 #CJK UNIFIED IDEOGRAPH
+ {0xF34B, 0x9A65}, //20261 #CJK UNIFIED IDEOGRAPH
+ {0xF34C, 0x9A66}, //20262 #CJK UNIFIED IDEOGRAPH
+ {0xF34D, 0x9A67}, //20263 #CJK UNIFIED IDEOGRAPH
+ {0xF34E, 0x9A68}, //20264 #CJK UNIFIED IDEOGRAPH
+ {0xF34F, 0x9A69}, //20265 #CJK UNIFIED IDEOGRAPH
+ {0xF350, 0x9A6A}, //20266 #CJK UNIFIED IDEOGRAPH
+ {0xF351, 0x9A6B}, //20267 #CJK UNIFIED IDEOGRAPH
+ {0xF352, 0x9A72}, //20268 #CJK UNIFIED IDEOGRAPH
+ {0xF353, 0x9A83}, //20269 #CJK UNIFIED IDEOGRAPH
+ {0xF354, 0x9A89}, //20270 #CJK UNIFIED IDEOGRAPH
+ {0xF355, 0x9A8D}, //20271 #CJK UNIFIED IDEOGRAPH
+ {0xF356, 0x9A8E}, //20272 #CJK UNIFIED IDEOGRAPH
+ {0xF357, 0x9A94}, //20273 #CJK UNIFIED IDEOGRAPH
+ {0xF358, 0x9A95}, //20274 #CJK UNIFIED IDEOGRAPH
+ {0xF359, 0x9A99}, //20275 #CJK UNIFIED IDEOGRAPH
+ {0xF35A, 0x9AA6}, //20276 #CJK UNIFIED IDEOGRAPH
+ {0xF35B, 0x9AA9}, //20277 #CJK UNIFIED IDEOGRAPH
+ {0xF35C, 0x9AAA}, //20278 #CJK UNIFIED IDEOGRAPH
+ {0xF35D, 0x9AAB}, //20279 #CJK UNIFIED IDEOGRAPH
+ {0xF35E, 0x9AAC}, //20280 #CJK UNIFIED IDEOGRAPH
+ {0xF35F, 0x9AAD}, //20281 #CJK UNIFIED IDEOGRAPH
+ {0xF360, 0x9AAE}, //20282 #CJK UNIFIED IDEOGRAPH
+ {0xF361, 0x9AAF}, //20283 #CJK UNIFIED IDEOGRAPH
+ {0xF362, 0x9AB2}, //20284 #CJK UNIFIED IDEOGRAPH
+ {0xF363, 0x9AB3}, //20285 #CJK UNIFIED IDEOGRAPH
+ {0xF364, 0x9AB4}, //20286 #CJK UNIFIED IDEOGRAPH
+ {0xF365, 0x9AB5}, //20287 #CJK UNIFIED IDEOGRAPH
+ {0xF366, 0x9AB9}, //20288 #CJK UNIFIED IDEOGRAPH
+ {0xF367, 0x9ABB}, //20289 #CJK UNIFIED IDEOGRAPH
+ {0xF368, 0x9ABD}, //20290 #CJK UNIFIED IDEOGRAPH
+ {0xF369, 0x9ABE}, //20291 #CJK UNIFIED IDEOGRAPH
+ {0xF36A, 0x9ABF}, //20292 #CJK UNIFIED IDEOGRAPH
+ {0xF36B, 0x9AC3}, //20293 #CJK UNIFIED IDEOGRAPH
+ {0xF36C, 0x9AC4}, //20294 #CJK UNIFIED IDEOGRAPH
+ {0xF36D, 0x9AC6}, //20295 #CJK UNIFIED IDEOGRAPH
+ {0xF36E, 0x9AC7}, //20296 #CJK UNIFIED IDEOGRAPH
+ {0xF36F, 0x9AC8}, //20297 #CJK UNIFIED IDEOGRAPH
+ {0xF370, 0x9AC9}, //20298 #CJK UNIFIED IDEOGRAPH
+ {0xF371, 0x9ACA}, //20299 #CJK UNIFIED IDEOGRAPH
+ {0xF372, 0x9ACD}, //20300 #CJK UNIFIED IDEOGRAPH
+ {0xF373, 0x9ACE}, //20301 #CJK UNIFIED IDEOGRAPH
+ {0xF374, 0x9ACF}, //20302 #CJK UNIFIED IDEOGRAPH
+ {0xF375, 0x9AD0}, //20303 #CJK UNIFIED IDEOGRAPH
+ {0xF376, 0x9AD2}, //20304 #CJK UNIFIED IDEOGRAPH
+ {0xF377, 0x9AD4}, //20305 #CJK UNIFIED IDEOGRAPH
+ {0xF378, 0x9AD5}, //20306 #CJK UNIFIED IDEOGRAPH
+ {0xF379, 0x9AD6}, //20307 #CJK UNIFIED IDEOGRAPH
+ {0xF37A, 0x9AD7}, //20308 #CJK UNIFIED IDEOGRAPH
+ {0xF37B, 0x9AD9}, //20309 #CJK UNIFIED IDEOGRAPH
+ {0xF37C, 0x9ADA}, //20310 #CJK UNIFIED IDEOGRAPH
+ {0xF37D, 0x9ADB}, //20311 #CJK UNIFIED IDEOGRAPH
+ {0xF37E, 0x9ADC}, //20312 #CJK UNIFIED IDEOGRAPH
+ {0xF380, 0x9ADD}, //20313 #CJK UNIFIED IDEOGRAPH
+ {0xF381, 0x9ADE}, //20314 #CJK UNIFIED IDEOGRAPH
+ {0xF382, 0x9AE0}, //20315 #CJK UNIFIED IDEOGRAPH
+ {0xF383, 0x9AE2}, //20316 #CJK UNIFIED IDEOGRAPH
+ {0xF384, 0x9AE3}, //20317 #CJK UNIFIED IDEOGRAPH
+ {0xF385, 0x9AE4}, //20318 #CJK UNIFIED IDEOGRAPH
+ {0xF386, 0x9AE5}, //20319 #CJK UNIFIED IDEOGRAPH
+ {0xF387, 0x9AE7}, //20320 #CJK UNIFIED IDEOGRAPH
+ {0xF388, 0x9AE8}, //20321 #CJK UNIFIED IDEOGRAPH
+ {0xF389, 0x9AE9}, //20322 #CJK UNIFIED IDEOGRAPH
+ {0xF38A, 0x9AEA}, //20323 #CJK UNIFIED IDEOGRAPH
+ {0xF38B, 0x9AEC}, //20324 #CJK UNIFIED IDEOGRAPH
+ {0xF38C, 0x9AEE}, //20325 #CJK UNIFIED IDEOGRAPH
+ {0xF38D, 0x9AF0}, //20326 #CJK UNIFIED IDEOGRAPH
+ {0xF38E, 0x9AF1}, //20327 #CJK UNIFIED IDEOGRAPH
+ {0xF38F, 0x9AF2}, //20328 #CJK UNIFIED IDEOGRAPH
+ {0xF390, 0x9AF3}, //20329 #CJK UNIFIED IDEOGRAPH
+ {0xF391, 0x9AF4}, //20330 #CJK UNIFIED IDEOGRAPH
+ {0xF392, 0x9AF5}, //20331 #CJK UNIFIED IDEOGRAPH
+ {0xF393, 0x9AF6}, //20332 #CJK UNIFIED IDEOGRAPH
+ {0xF394, 0x9AF7}, //20333 #CJK UNIFIED IDEOGRAPH
+ {0xF395, 0x9AF8}, //20334 #CJK UNIFIED IDEOGRAPH
+ {0xF396, 0x9AFA}, //20335 #CJK UNIFIED IDEOGRAPH
+ {0xF397, 0x9AFC}, //20336 #CJK UNIFIED IDEOGRAPH
+ {0xF398, 0x9AFD}, //20337 #CJK UNIFIED IDEOGRAPH
+ {0xF399, 0x9AFE}, //20338 #CJK UNIFIED IDEOGRAPH
+ {0xF39A, 0x9AFF}, //20339 #CJK UNIFIED IDEOGRAPH
+ {0xF39B, 0x9B00}, //20340 #CJK UNIFIED IDEOGRAPH
+ {0xF39C, 0x9B01}, //20341 #CJK UNIFIED IDEOGRAPH
+ {0xF39D, 0x9B02}, //20342 #CJK UNIFIED IDEOGRAPH
+ {0xF39E, 0x9B04}, //20343 #CJK UNIFIED IDEOGRAPH
+ {0xF39F, 0x9B05}, //20344 #CJK UNIFIED IDEOGRAPH
+ {0xF3A0, 0x9B06}, //20345 #CJK UNIFIED IDEOGRAPH
+ {0xF3A1, 0x87C6}, //20346 #CJK UNIFIED IDEOGRAPH
+ {0xF3A2, 0x8788}, //20347 #CJK UNIFIED IDEOGRAPH
+ {0xF3A3, 0x8785}, //20348 #CJK UNIFIED IDEOGRAPH
+ {0xF3A4, 0x87AD}, //20349 #CJK UNIFIED IDEOGRAPH
+ {0xF3A5, 0x8797}, //20350 #CJK UNIFIED IDEOGRAPH
+ {0xF3A6, 0x8783}, //20351 #CJK UNIFIED IDEOGRAPH
+ {0xF3A7, 0x87AB}, //20352 #CJK UNIFIED IDEOGRAPH
+ {0xF3A8, 0x87E5}, //20353 #CJK UNIFIED IDEOGRAPH
+ {0xF3A9, 0x87AC}, //20354 #CJK UNIFIED IDEOGRAPH
+ {0xF3AA, 0x87B5}, //20355 #CJK UNIFIED IDEOGRAPH
+ {0xF3AB, 0x87B3}, //20356 #CJK UNIFIED IDEOGRAPH
+ {0xF3AC, 0x87CB}, //20357 #CJK UNIFIED IDEOGRAPH
+ {0xF3AD, 0x87D3}, //20358 #CJK UNIFIED IDEOGRAPH
+ {0xF3AE, 0x87BD}, //20359 #CJK UNIFIED IDEOGRAPH
+ {0xF3AF, 0x87D1}, //20360 #CJK UNIFIED IDEOGRAPH
+ {0xF3B0, 0x87C0}, //20361 #CJK UNIFIED IDEOGRAPH
+ {0xF3B1, 0x87CA}, //20362 #CJK UNIFIED IDEOGRAPH
+ {0xF3B2, 0x87DB}, //20363 #CJK UNIFIED IDEOGRAPH
+ {0xF3B3, 0x87EA}, //20364 #CJK UNIFIED IDEOGRAPH
+ {0xF3B4, 0x87E0}, //20365 #CJK UNIFIED IDEOGRAPH
+ {0xF3B5, 0x87EE}, //20366 #CJK UNIFIED IDEOGRAPH
+ {0xF3B6, 0x8816}, //20367 #CJK UNIFIED IDEOGRAPH
+ {0xF3B7, 0x8813}, //20368 #CJK UNIFIED IDEOGRAPH
+ {0xF3B8, 0x87FE}, //20369 #CJK UNIFIED IDEOGRAPH
+ {0xF3B9, 0x880A}, //20370 #CJK UNIFIED IDEOGRAPH
+ {0xF3BA, 0x881B}, //20371 #CJK UNIFIED IDEOGRAPH
+ {0xF3BB, 0x8821}, //20372 #CJK UNIFIED IDEOGRAPH
+ {0xF3BC, 0x8839}, //20373 #CJK UNIFIED IDEOGRAPH
+ {0xF3BD, 0x883C}, //20374 #CJK UNIFIED IDEOGRAPH
+ {0xF3BE, 0x7F36}, //20375 #CJK UNIFIED IDEOGRAPH
+ {0xF3BF, 0x7F42}, //20376 #CJK UNIFIED IDEOGRAPH
+ {0xF3C0, 0x7F44}, //20377 #CJK UNIFIED IDEOGRAPH
+ {0xF3C1, 0x7F45}, //20378 #CJK UNIFIED IDEOGRAPH
+ {0xF3C2, 0x8210}, //20379 #CJK UNIFIED IDEOGRAPH
+ {0xF3C3, 0x7AFA}, //20380 #CJK UNIFIED IDEOGRAPH
+ {0xF3C4, 0x7AFD}, //20381 #CJK UNIFIED IDEOGRAPH
+ {0xF3C5, 0x7B08}, //20382 #CJK UNIFIED IDEOGRAPH
+ {0xF3C6, 0x7B03}, //20383 #CJK UNIFIED IDEOGRAPH
+ {0xF3C7, 0x7B04}, //20384 #CJK UNIFIED IDEOGRAPH
+ {0xF3C8, 0x7B15}, //20385 #CJK UNIFIED IDEOGRAPH
+ {0xF3C9, 0x7B0A}, //20386 #CJK UNIFIED IDEOGRAPH
+ {0xF3CA, 0x7B2B}, //20387 #CJK UNIFIED IDEOGRAPH
+ {0xF3CB, 0x7B0F}, //20388 #CJK UNIFIED IDEOGRAPH
+ {0xF3CC, 0x7B47}, //20389 #CJK UNIFIED IDEOGRAPH
+ {0xF3CD, 0x7B38}, //20390 #CJK UNIFIED IDEOGRAPH
+ {0xF3CE, 0x7B2A}, //20391 #CJK UNIFIED IDEOGRAPH
+ {0xF3CF, 0x7B19}, //20392 #CJK UNIFIED IDEOGRAPH
+ {0xF3D0, 0x7B2E}, //20393 #CJK UNIFIED IDEOGRAPH
+ {0xF3D1, 0x7B31}, //20394 #CJK UNIFIED IDEOGRAPH
+ {0xF3D2, 0x7B20}, //20395 #CJK UNIFIED IDEOGRAPH
+ {0xF3D3, 0x7B25}, //20396 #CJK UNIFIED IDEOGRAPH
+ {0xF3D4, 0x7B24}, //20397 #CJK UNIFIED IDEOGRAPH
+ {0xF3D5, 0x7B33}, //20398 #CJK UNIFIED IDEOGRAPH
+ {0xF3D6, 0x7B3E}, //20399 #CJK UNIFIED IDEOGRAPH
+ {0xF3D7, 0x7B1E}, //20400 #CJK UNIFIED IDEOGRAPH
+ {0xF3D8, 0x7B58}, //20401 #CJK UNIFIED IDEOGRAPH
+ {0xF3D9, 0x7B5A}, //20402 #CJK UNIFIED IDEOGRAPH
+ {0xF3DA, 0x7B45}, //20403 #CJK UNIFIED IDEOGRAPH
+ {0xF3DB, 0x7B75}, //20404 #CJK UNIFIED IDEOGRAPH
+ {0xF3DC, 0x7B4C}, //20405 #CJK UNIFIED IDEOGRAPH
+ {0xF3DD, 0x7B5D}, //20406 #CJK UNIFIED IDEOGRAPH
+ {0xF3DE, 0x7B60}, //20407 #CJK UNIFIED IDEOGRAPH
+ {0xF3DF, 0x7B6E}, //20408 #CJK UNIFIED IDEOGRAPH
+ {0xF3E0, 0x7B7B}, //20409 #CJK UNIFIED IDEOGRAPH
+ {0xF3E1, 0x7B62}, //20410 #CJK UNIFIED IDEOGRAPH
+ {0xF3E2, 0x7B72}, //20411 #CJK UNIFIED IDEOGRAPH
+ {0xF3E3, 0x7B71}, //20412 #CJK UNIFIED IDEOGRAPH
+ {0xF3E4, 0x7B90}, //20413 #CJK UNIFIED IDEOGRAPH
+ {0xF3E5, 0x7BA6}, //20414 #CJK UNIFIED IDEOGRAPH
+ {0xF3E6, 0x7BA7}, //20415 #CJK UNIFIED IDEOGRAPH
+ {0xF3E7, 0x7BB8}, //20416 #CJK UNIFIED IDEOGRAPH
+ {0xF3E8, 0x7BAC}, //20417 #CJK UNIFIED IDEOGRAPH
+ {0xF3E9, 0x7B9D}, //20418 #CJK UNIFIED IDEOGRAPH
+ {0xF3EA, 0x7BA8}, //20419 #CJK UNIFIED IDEOGRAPH
+ {0xF3EB, 0x7B85}, //20420 #CJK UNIFIED IDEOGRAPH
+ {0xF3EC, 0x7BAA}, //20421 #CJK UNIFIED IDEOGRAPH
+ {0xF3ED, 0x7B9C}, //20422 #CJK UNIFIED IDEOGRAPH
+ {0xF3EE, 0x7BA2}, //20423 #CJK UNIFIED IDEOGRAPH
+ {0xF3EF, 0x7BAB}, //20424 #CJK UNIFIED IDEOGRAPH
+ {0xF3F0, 0x7BB4}, //20425 #CJK UNIFIED IDEOGRAPH
+ {0xF3F1, 0x7BD1}, //20426 #CJK UNIFIED IDEOGRAPH
+ {0xF3F2, 0x7BC1}, //20427 #CJK UNIFIED IDEOGRAPH
+ {0xF3F3, 0x7BCC}, //20428 #CJK UNIFIED IDEOGRAPH
+ {0xF3F4, 0x7BDD}, //20429 #CJK UNIFIED IDEOGRAPH
+ {0xF3F5, 0x7BDA}, //20430 #CJK UNIFIED IDEOGRAPH
+ {0xF3F6, 0x7BE5}, //20431 #CJK UNIFIED IDEOGRAPH
+ {0xF3F7, 0x7BE6}, //20432 #CJK UNIFIED IDEOGRAPH
+ {0xF3F8, 0x7BEA}, //20433 #CJK UNIFIED IDEOGRAPH
+ {0xF3F9, 0x7C0C}, //20434 #CJK UNIFIED IDEOGRAPH
+ {0xF3FA, 0x7BFE}, //20435 #CJK UNIFIED IDEOGRAPH
+ {0xF3FB, 0x7BFC}, //20436 #CJK UNIFIED IDEOGRAPH
+ {0xF3FC, 0x7C0F}, //20437 #CJK UNIFIED IDEOGRAPH
+ {0xF3FD, 0x7C16}, //20438 #CJK UNIFIED IDEOGRAPH
+ {0xF3FE, 0x7C0B}, //20439 #CJK UNIFIED IDEOGRAPH
+ {0xF440, 0x9B07}, //20440 #CJK UNIFIED IDEOGRAPH
+ {0xF441, 0x9B09}, //20441 #CJK UNIFIED IDEOGRAPH
+ {0xF442, 0x9B0A}, //20442 #CJK UNIFIED IDEOGRAPH
+ {0xF443, 0x9B0B}, //20443 #CJK UNIFIED IDEOGRAPH
+ {0xF444, 0x9B0C}, //20444 #CJK UNIFIED IDEOGRAPH
+ {0xF445, 0x9B0D}, //20445 #CJK UNIFIED IDEOGRAPH
+ {0xF446, 0x9B0E}, //20446 #CJK UNIFIED IDEOGRAPH
+ {0xF447, 0x9B10}, //20447 #CJK UNIFIED IDEOGRAPH
+ {0xF448, 0x9B11}, //20448 #CJK UNIFIED IDEOGRAPH
+ {0xF449, 0x9B12}, //20449 #CJK UNIFIED IDEOGRAPH
+ {0xF44A, 0x9B14}, //20450 #CJK UNIFIED IDEOGRAPH
+ {0xF44B, 0x9B15}, //20451 #CJK UNIFIED IDEOGRAPH
+ {0xF44C, 0x9B16}, //20452 #CJK UNIFIED IDEOGRAPH
+ {0xF44D, 0x9B17}, //20453 #CJK UNIFIED IDEOGRAPH
+ {0xF44E, 0x9B18}, //20454 #CJK UNIFIED IDEOGRAPH
+ {0xF44F, 0x9B19}, //20455 #CJK UNIFIED IDEOGRAPH
+ {0xF450, 0x9B1A}, //20456 #CJK UNIFIED IDEOGRAPH
+ {0xF451, 0x9B1B}, //20457 #CJK UNIFIED IDEOGRAPH
+ {0xF452, 0x9B1C}, //20458 #CJK UNIFIED IDEOGRAPH
+ {0xF453, 0x9B1D}, //20459 #CJK UNIFIED IDEOGRAPH
+ {0xF454, 0x9B1E}, //20460 #CJK UNIFIED IDEOGRAPH
+ {0xF455, 0x9B20}, //20461 #CJK UNIFIED IDEOGRAPH
+ {0xF456, 0x9B21}, //20462 #CJK UNIFIED IDEOGRAPH
+ {0xF457, 0x9B22}, //20463 #CJK UNIFIED IDEOGRAPH
+ {0xF458, 0x9B24}, //20464 #CJK UNIFIED IDEOGRAPH
+ {0xF459, 0x9B25}, //20465 #CJK UNIFIED IDEOGRAPH
+ {0xF45A, 0x9B26}, //20466 #CJK UNIFIED IDEOGRAPH
+ {0xF45B, 0x9B27}, //20467 #CJK UNIFIED IDEOGRAPH
+ {0xF45C, 0x9B28}, //20468 #CJK UNIFIED IDEOGRAPH
+ {0xF45D, 0x9B29}, //20469 #CJK UNIFIED IDEOGRAPH
+ {0xF45E, 0x9B2A}, //20470 #CJK UNIFIED IDEOGRAPH
+ {0xF45F, 0x9B2B}, //20471 #CJK UNIFIED IDEOGRAPH
+ {0xF460, 0x9B2C}, //20472 #CJK UNIFIED IDEOGRAPH
+ {0xF461, 0x9B2D}, //20473 #CJK UNIFIED IDEOGRAPH
+ {0xF462, 0x9B2E}, //20474 #CJK UNIFIED IDEOGRAPH
+ {0xF463, 0x9B30}, //20475 #CJK UNIFIED IDEOGRAPH
+ {0xF464, 0x9B31}, //20476 #CJK UNIFIED IDEOGRAPH
+ {0xF465, 0x9B33}, //20477 #CJK UNIFIED IDEOGRAPH
+ {0xF466, 0x9B34}, //20478 #CJK UNIFIED IDEOGRAPH
+ {0xF467, 0x9B35}, //20479 #CJK UNIFIED IDEOGRAPH
+ {0xF468, 0x9B36}, //20480 #CJK UNIFIED IDEOGRAPH
+ {0xF469, 0x9B37}, //20481 #CJK UNIFIED IDEOGRAPH
+ {0xF46A, 0x9B38}, //20482 #CJK UNIFIED IDEOGRAPH
+ {0xF46B, 0x9B39}, //20483 #CJK UNIFIED IDEOGRAPH
+ {0xF46C, 0x9B3A}, //20484 #CJK UNIFIED IDEOGRAPH
+ {0xF46D, 0x9B3D}, //20485 #CJK UNIFIED IDEOGRAPH
+ {0xF46E, 0x9B3E}, //20486 #CJK UNIFIED IDEOGRAPH
+ {0xF46F, 0x9B3F}, //20487 #CJK UNIFIED IDEOGRAPH
+ {0xF470, 0x9B40}, //20488 #CJK UNIFIED IDEOGRAPH
+ {0xF471, 0x9B46}, //20489 #CJK UNIFIED IDEOGRAPH
+ {0xF472, 0x9B4A}, //20490 #CJK UNIFIED IDEOGRAPH
+ {0xF473, 0x9B4B}, //20491 #CJK UNIFIED IDEOGRAPH
+ {0xF474, 0x9B4C}, //20492 #CJK UNIFIED IDEOGRAPH
+ {0xF475, 0x9B4E}, //20493 #CJK UNIFIED IDEOGRAPH
+ {0xF476, 0x9B50}, //20494 #CJK UNIFIED IDEOGRAPH
+ {0xF477, 0x9B52}, //20495 #CJK UNIFIED IDEOGRAPH
+ {0xF478, 0x9B53}, //20496 #CJK UNIFIED IDEOGRAPH
+ {0xF479, 0x9B55}, //20497 #CJK UNIFIED IDEOGRAPH
+ {0xF47A, 0x9B56}, //20498 #CJK UNIFIED IDEOGRAPH
+ {0xF47B, 0x9B57}, //20499 #CJK UNIFIED IDEOGRAPH
+ {0xF47C, 0x9B58}, //20500 #CJK UNIFIED IDEOGRAPH
+ {0xF47D, 0x9B59}, //20501 #CJK UNIFIED IDEOGRAPH
+ {0xF47E, 0x9B5A}, //20502 #CJK UNIFIED IDEOGRAPH
+ {0xF480, 0x9B5B}, //20503 #CJK UNIFIED IDEOGRAPH
+ {0xF481, 0x9B5C}, //20504 #CJK UNIFIED IDEOGRAPH
+ {0xF482, 0x9B5D}, //20505 #CJK UNIFIED IDEOGRAPH
+ {0xF483, 0x9B5E}, //20506 #CJK UNIFIED IDEOGRAPH
+ {0xF484, 0x9B5F}, //20507 #CJK UNIFIED IDEOGRAPH
+ {0xF485, 0x9B60}, //20508 #CJK UNIFIED IDEOGRAPH
+ {0xF486, 0x9B61}, //20509 #CJK UNIFIED IDEOGRAPH
+ {0xF487, 0x9B62}, //20510 #CJK UNIFIED IDEOGRAPH
+ {0xF488, 0x9B63}, //20511 #CJK UNIFIED IDEOGRAPH
+ {0xF489, 0x9B64}, //20512 #CJK UNIFIED IDEOGRAPH
+ {0xF48A, 0x9B65}, //20513 #CJK UNIFIED IDEOGRAPH
+ {0xF48B, 0x9B66}, //20514 #CJK UNIFIED IDEOGRAPH
+ {0xF48C, 0x9B67}, //20515 #CJK UNIFIED IDEOGRAPH
+ {0xF48D, 0x9B68}, //20516 #CJK UNIFIED IDEOGRAPH
+ {0xF48E, 0x9B69}, //20517 #CJK UNIFIED IDEOGRAPH
+ {0xF48F, 0x9B6A}, //20518 #CJK UNIFIED IDEOGRAPH
+ {0xF490, 0x9B6B}, //20519 #CJK UNIFIED IDEOGRAPH
+ {0xF491, 0x9B6C}, //20520 #CJK UNIFIED IDEOGRAPH
+ {0xF492, 0x9B6D}, //20521 #CJK UNIFIED IDEOGRAPH
+ {0xF493, 0x9B6E}, //20522 #CJK UNIFIED IDEOGRAPH
+ {0xF494, 0x9B6F}, //20523 #CJK UNIFIED IDEOGRAPH
+ {0xF495, 0x9B70}, //20524 #CJK UNIFIED IDEOGRAPH
+ {0xF496, 0x9B71}, //20525 #CJK UNIFIED IDEOGRAPH
+ {0xF497, 0x9B72}, //20526 #CJK UNIFIED IDEOGRAPH
+ {0xF498, 0x9B73}, //20527 #CJK UNIFIED IDEOGRAPH
+ {0xF499, 0x9B74}, //20528 #CJK UNIFIED IDEOGRAPH
+ {0xF49A, 0x9B75}, //20529 #CJK UNIFIED IDEOGRAPH
+ {0xF49B, 0x9B76}, //20530 #CJK UNIFIED IDEOGRAPH
+ {0xF49C, 0x9B77}, //20531 #CJK UNIFIED IDEOGRAPH
+ {0xF49D, 0x9B78}, //20532 #CJK UNIFIED IDEOGRAPH
+ {0xF49E, 0x9B79}, //20533 #CJK UNIFIED IDEOGRAPH
+ {0xF49F, 0x9B7A}, //20534 #CJK UNIFIED IDEOGRAPH
+ {0xF4A0, 0x9B7B}, //20535 #CJK UNIFIED IDEOGRAPH
+ {0xF4A1, 0x7C1F}, //20536 #CJK UNIFIED IDEOGRAPH
+ {0xF4A2, 0x7C2A}, //20537 #CJK UNIFIED IDEOGRAPH
+ {0xF4A3, 0x7C26}, //20538 #CJK UNIFIED IDEOGRAPH
+ {0xF4A4, 0x7C38}, //20539 #CJK UNIFIED IDEOGRAPH
+ {0xF4A5, 0x7C41}, //20540 #CJK UNIFIED IDEOGRAPH
+ {0xF4A6, 0x7C40}, //20541 #CJK UNIFIED IDEOGRAPH
+ {0xF4A7, 0x81FE}, //20542 #CJK UNIFIED IDEOGRAPH
+ {0xF4A8, 0x8201}, //20543 #CJK UNIFIED IDEOGRAPH
+ {0xF4A9, 0x8202}, //20544 #CJK UNIFIED IDEOGRAPH
+ {0xF4AA, 0x8204}, //20545 #CJK UNIFIED IDEOGRAPH
+ {0xF4AB, 0x81EC}, //20546 #CJK UNIFIED IDEOGRAPH
+ {0xF4AC, 0x8844}, //20547 #CJK UNIFIED IDEOGRAPH
+ {0xF4AD, 0x8221}, //20548 #CJK UNIFIED IDEOGRAPH
+ {0xF4AE, 0x8222}, //20549 #CJK UNIFIED IDEOGRAPH
+ {0xF4AF, 0x8223}, //20550 #CJK UNIFIED IDEOGRAPH
+ {0xF4B0, 0x822D}, //20551 #CJK UNIFIED IDEOGRAPH
+ {0xF4B1, 0x822F}, //20552 #CJK UNIFIED IDEOGRAPH
+ {0xF4B2, 0x8228}, //20553 #CJK UNIFIED IDEOGRAPH
+ {0xF4B3, 0x822B}, //20554 #CJK UNIFIED IDEOGRAPH
+ {0xF4B4, 0x8238}, //20555 #CJK UNIFIED IDEOGRAPH
+ {0xF4B5, 0x823B}, //20556 #CJK UNIFIED IDEOGRAPH
+ {0xF4B6, 0x8233}, //20557 #CJK UNIFIED IDEOGRAPH
+ {0xF4B7, 0x8234}, //20558 #CJK UNIFIED IDEOGRAPH
+ {0xF4B8, 0x823E}, //20559 #CJK UNIFIED IDEOGRAPH
+ {0xF4B9, 0x8244}, //20560 #CJK UNIFIED IDEOGRAPH
+ {0xF4BA, 0x8249}, //20561 #CJK UNIFIED IDEOGRAPH
+ {0xF4BB, 0x824B}, //20562 #CJK UNIFIED IDEOGRAPH
+ {0xF4BC, 0x824F}, //20563 #CJK UNIFIED IDEOGRAPH
+ {0xF4BD, 0x825A}, //20564 #CJK UNIFIED IDEOGRAPH
+ {0xF4BE, 0x825F}, //20565 #CJK UNIFIED IDEOGRAPH
+ {0xF4BF, 0x8268}, //20566 #CJK UNIFIED IDEOGRAPH
+ {0xF4C0, 0x887E}, //20567 #CJK UNIFIED IDEOGRAPH
+ {0xF4C1, 0x8885}, //20568 #CJK UNIFIED IDEOGRAPH
+ {0xF4C2, 0x8888}, //20569 #CJK UNIFIED IDEOGRAPH
+ {0xF4C3, 0x88D8}, //20570 #CJK UNIFIED IDEOGRAPH
+ {0xF4C4, 0x88DF}, //20571 #CJK UNIFIED IDEOGRAPH
+ {0xF4C5, 0x895E}, //20572 #CJK UNIFIED IDEOGRAPH
+ {0xF4C6, 0x7F9D}, //20573 #CJK UNIFIED IDEOGRAPH
+ {0xF4C7, 0x7F9F}, //20574 #CJK UNIFIED IDEOGRAPH
+ {0xF4C8, 0x7FA7}, //20575 #CJK UNIFIED IDEOGRAPH
+ {0xF4C9, 0x7FAF}, //20576 #CJK UNIFIED IDEOGRAPH
+ {0xF4CA, 0x7FB0}, //20577 #CJK UNIFIED IDEOGRAPH
+ {0xF4CB, 0x7FB2}, //20578 #CJK UNIFIED IDEOGRAPH
+ {0xF4CC, 0x7C7C}, //20579 #CJK UNIFIED IDEOGRAPH
+ {0xF4CD, 0x6549}, //20580 #CJK UNIFIED IDEOGRAPH
+ {0xF4CE, 0x7C91}, //20581 #CJK UNIFIED IDEOGRAPH
+ {0xF4CF, 0x7C9D}, //20582 #CJK UNIFIED IDEOGRAPH
+ {0xF4D0, 0x7C9C}, //20583 #CJK UNIFIED IDEOGRAPH
+ {0xF4D1, 0x7C9E}, //20584 #CJK UNIFIED IDEOGRAPH
+ {0xF4D2, 0x7CA2}, //20585 #CJK UNIFIED IDEOGRAPH
+ {0xF4D3, 0x7CB2}, //20586 #CJK UNIFIED IDEOGRAPH
+ {0xF4D4, 0x7CBC}, //20587 #CJK UNIFIED IDEOGRAPH
+ {0xF4D5, 0x7CBD}, //20588 #CJK UNIFIED IDEOGRAPH
+ {0xF4D6, 0x7CC1}, //20589 #CJK UNIFIED IDEOGRAPH
+ {0xF4D7, 0x7CC7}, //20590 #CJK UNIFIED IDEOGRAPH
+ {0xF4D8, 0x7CCC}, //20591 #CJK UNIFIED IDEOGRAPH
+ {0xF4D9, 0x7CCD}, //20592 #CJK UNIFIED IDEOGRAPH
+ {0xF4DA, 0x7CC8}, //20593 #CJK UNIFIED IDEOGRAPH
+ {0xF4DB, 0x7CC5}, //20594 #CJK UNIFIED IDEOGRAPH
+ {0xF4DC, 0x7CD7}, //20595 #CJK UNIFIED IDEOGRAPH
+ {0xF4DD, 0x7CE8}, //20596 #CJK UNIFIED IDEOGRAPH
+ {0xF4DE, 0x826E}, //20597 #CJK UNIFIED IDEOGRAPH
+ {0xF4DF, 0x66A8}, //20598 #CJK UNIFIED IDEOGRAPH
+ {0xF4E0, 0x7FBF}, //20599 #CJK UNIFIED IDEOGRAPH
+ {0xF4E1, 0x7FCE}, //20600 #CJK UNIFIED IDEOGRAPH
+ {0xF4E2, 0x7FD5}, //20601 #CJK UNIFIED IDEOGRAPH
+ {0xF4E3, 0x7FE5}, //20602 #CJK UNIFIED IDEOGRAPH
+ {0xF4E4, 0x7FE1}, //20603 #CJK UNIFIED IDEOGRAPH
+ {0xF4E5, 0x7FE6}, //20604 #CJK UNIFIED IDEOGRAPH
+ {0xF4E6, 0x7FE9}, //20605 #CJK UNIFIED IDEOGRAPH
+ {0xF4E7, 0x7FEE}, //20606 #CJK UNIFIED IDEOGRAPH
+ {0xF4E8, 0x7FF3}, //20607 #CJK UNIFIED IDEOGRAPH
+ {0xF4E9, 0x7CF8}, //20608 #CJK UNIFIED IDEOGRAPH
+ {0xF4EA, 0x7D77}, //20609 #CJK UNIFIED IDEOGRAPH
+ {0xF4EB, 0x7DA6}, //20610 #CJK UNIFIED IDEOGRAPH
+ {0xF4EC, 0x7DAE}, //20611 #CJK UNIFIED IDEOGRAPH
+ {0xF4ED, 0x7E47}, //20612 #CJK UNIFIED IDEOGRAPH
+ {0xF4EE, 0x7E9B}, //20613 #CJK UNIFIED IDEOGRAPH
+ {0xF4EF, 0x9EB8}, //20614 #CJK UNIFIED IDEOGRAPH
+ {0xF4F0, 0x9EB4}, //20615 #CJK UNIFIED IDEOGRAPH
+ {0xF4F1, 0x8D73}, //20616 #CJK UNIFIED IDEOGRAPH
+ {0xF4F2, 0x8D84}, //20617 #CJK UNIFIED IDEOGRAPH
+ {0xF4F3, 0x8D94}, //20618 #CJK UNIFIED IDEOGRAPH
+ {0xF4F4, 0x8D91}, //20619 #CJK UNIFIED IDEOGRAPH
+ {0xF4F5, 0x8DB1}, //20620 #CJK UNIFIED IDEOGRAPH
+ {0xF4F6, 0x8D67}, //20621 #CJK UNIFIED IDEOGRAPH
+ {0xF4F7, 0x8D6D}, //20622 #CJK UNIFIED IDEOGRAPH
+ {0xF4F8, 0x8C47}, //20623 #CJK UNIFIED IDEOGRAPH
+ {0xF4F9, 0x8C49}, //20624 #CJK UNIFIED IDEOGRAPH
+ {0xF4FA, 0x914A}, //20625 #CJK UNIFIED IDEOGRAPH
+ {0xF4FB, 0x9150}, //20626 #CJK UNIFIED IDEOGRAPH
+ {0xF4FC, 0x914E}, //20627 #CJK UNIFIED IDEOGRAPH
+ {0xF4FD, 0x914F}, //20628 #CJK UNIFIED IDEOGRAPH
+ {0xF4FE, 0x9164}, //20629 #CJK UNIFIED IDEOGRAPH
+ {0xF540, 0x9B7C}, //20630 #CJK UNIFIED IDEOGRAPH
+ {0xF541, 0x9B7D}, //20631 #CJK UNIFIED IDEOGRAPH
+ {0xF542, 0x9B7E}, //20632 #CJK UNIFIED IDEOGRAPH
+ {0xF543, 0x9B7F}, //20633 #CJK UNIFIED IDEOGRAPH
+ {0xF544, 0x9B80}, //20634 #CJK UNIFIED IDEOGRAPH
+ {0xF545, 0x9B81}, //20635 #CJK UNIFIED IDEOGRAPH
+ {0xF546, 0x9B82}, //20636 #CJK UNIFIED IDEOGRAPH
+ {0xF547, 0x9B83}, //20637 #CJK UNIFIED IDEOGRAPH
+ {0xF548, 0x9B84}, //20638 #CJK UNIFIED IDEOGRAPH
+ {0xF549, 0x9B85}, //20639 #CJK UNIFIED IDEOGRAPH
+ {0xF54A, 0x9B86}, //20640 #CJK UNIFIED IDEOGRAPH
+ {0xF54B, 0x9B87}, //20641 #CJK UNIFIED IDEOGRAPH
+ {0xF54C, 0x9B88}, //20642 #CJK UNIFIED IDEOGRAPH
+ {0xF54D, 0x9B89}, //20643 #CJK UNIFIED IDEOGRAPH
+ {0xF54E, 0x9B8A}, //20644 #CJK UNIFIED IDEOGRAPH
+ {0xF54F, 0x9B8B}, //20645 #CJK UNIFIED IDEOGRAPH
+ {0xF550, 0x9B8C}, //20646 #CJK UNIFIED IDEOGRAPH
+ {0xF551, 0x9B8D}, //20647 #CJK UNIFIED IDEOGRAPH
+ {0xF552, 0x9B8E}, //20648 #CJK UNIFIED IDEOGRAPH
+ {0xF553, 0x9B8F}, //20649 #CJK UNIFIED IDEOGRAPH
+ {0xF554, 0x9B90}, //20650 #CJK UNIFIED IDEOGRAPH
+ {0xF555, 0x9B91}, //20651 #CJK UNIFIED IDEOGRAPH
+ {0xF556, 0x9B92}, //20652 #CJK UNIFIED IDEOGRAPH
+ {0xF557, 0x9B93}, //20653 #CJK UNIFIED IDEOGRAPH
+ {0xF558, 0x9B94}, //20654 #CJK UNIFIED IDEOGRAPH
+ {0xF559, 0x9B95}, //20655 #CJK UNIFIED IDEOGRAPH
+ {0xF55A, 0x9B96}, //20656 #CJK UNIFIED IDEOGRAPH
+ {0xF55B, 0x9B97}, //20657 #CJK UNIFIED IDEOGRAPH
+ {0xF55C, 0x9B98}, //20658 #CJK UNIFIED IDEOGRAPH
+ {0xF55D, 0x9B99}, //20659 #CJK UNIFIED IDEOGRAPH
+ {0xF55E, 0x9B9A}, //20660 #CJK UNIFIED IDEOGRAPH
+ {0xF55F, 0x9B9B}, //20661 #CJK UNIFIED IDEOGRAPH
+ {0xF560, 0x9B9C}, //20662 #CJK UNIFIED IDEOGRAPH
+ {0xF561, 0x9B9D}, //20663 #CJK UNIFIED IDEOGRAPH
+ {0xF562, 0x9B9E}, //20664 #CJK UNIFIED IDEOGRAPH
+ {0xF563, 0x9B9F}, //20665 #CJK UNIFIED IDEOGRAPH
+ {0xF564, 0x9BA0}, //20666 #CJK UNIFIED IDEOGRAPH
+ {0xF565, 0x9BA1}, //20667 #CJK UNIFIED IDEOGRAPH
+ {0xF566, 0x9BA2}, //20668 #CJK UNIFIED IDEOGRAPH
+ {0xF567, 0x9BA3}, //20669 #CJK UNIFIED IDEOGRAPH
+ {0xF568, 0x9BA4}, //20670 #CJK UNIFIED IDEOGRAPH
+ {0xF569, 0x9BA5}, //20671 #CJK UNIFIED IDEOGRAPH
+ {0xF56A, 0x9BA6}, //20672 #CJK UNIFIED IDEOGRAPH
+ {0xF56B, 0x9BA7}, //20673 #CJK UNIFIED IDEOGRAPH
+ {0xF56C, 0x9BA8}, //20674 #CJK UNIFIED IDEOGRAPH
+ {0xF56D, 0x9BA9}, //20675 #CJK UNIFIED IDEOGRAPH
+ {0xF56E, 0x9BAA}, //20676 #CJK UNIFIED IDEOGRAPH
+ {0xF56F, 0x9BAB}, //20677 #CJK UNIFIED IDEOGRAPH
+ {0xF570, 0x9BAC}, //20678 #CJK UNIFIED IDEOGRAPH
+ {0xF571, 0x9BAD}, //20679 #CJK UNIFIED IDEOGRAPH
+ {0xF572, 0x9BAE}, //20680 #CJK UNIFIED IDEOGRAPH
+ {0xF573, 0x9BAF}, //20681 #CJK UNIFIED IDEOGRAPH
+ {0xF574, 0x9BB0}, //20682 #CJK UNIFIED IDEOGRAPH
+ {0xF575, 0x9BB1}, //20683 #CJK UNIFIED IDEOGRAPH
+ {0xF576, 0x9BB2}, //20684 #CJK UNIFIED IDEOGRAPH
+ {0xF577, 0x9BB3}, //20685 #CJK UNIFIED IDEOGRAPH
+ {0xF578, 0x9BB4}, //20686 #CJK UNIFIED IDEOGRAPH
+ {0xF579, 0x9BB5}, //20687 #CJK UNIFIED IDEOGRAPH
+ {0xF57A, 0x9BB6}, //20688 #CJK UNIFIED IDEOGRAPH
+ {0xF57B, 0x9BB7}, //20689 #CJK UNIFIED IDEOGRAPH
+ {0xF57C, 0x9BB8}, //20690 #CJK UNIFIED IDEOGRAPH
+ {0xF57D, 0x9BB9}, //20691 #CJK UNIFIED IDEOGRAPH
+ {0xF57E, 0x9BBA}, //20692 #CJK UNIFIED IDEOGRAPH
+ {0xF580, 0x9BBB}, //20693 #CJK UNIFIED IDEOGRAPH
+ {0xF581, 0x9BBC}, //20694 #CJK UNIFIED IDEOGRAPH
+ {0xF582, 0x9BBD}, //20695 #CJK UNIFIED IDEOGRAPH
+ {0xF583, 0x9BBE}, //20696 #CJK UNIFIED IDEOGRAPH
+ {0xF584, 0x9BBF}, //20697 #CJK UNIFIED IDEOGRAPH
+ {0xF585, 0x9BC0}, //20698 #CJK UNIFIED IDEOGRAPH
+ {0xF586, 0x9BC1}, //20699 #CJK UNIFIED IDEOGRAPH
+ {0xF587, 0x9BC2}, //20700 #CJK UNIFIED IDEOGRAPH
+ {0xF588, 0x9BC3}, //20701 #CJK UNIFIED IDEOGRAPH
+ {0xF589, 0x9BC4}, //20702 #CJK UNIFIED IDEOGRAPH
+ {0xF58A, 0x9BC5}, //20703 #CJK UNIFIED IDEOGRAPH
+ {0xF58B, 0x9BC6}, //20704 #CJK UNIFIED IDEOGRAPH
+ {0xF58C, 0x9BC7}, //20705 #CJK UNIFIED IDEOGRAPH
+ {0xF58D, 0x9BC8}, //20706 #CJK UNIFIED IDEOGRAPH
+ {0xF58E, 0x9BC9}, //20707 #CJK UNIFIED IDEOGRAPH
+ {0xF58F, 0x9BCA}, //20708 #CJK UNIFIED IDEOGRAPH
+ {0xF590, 0x9BCB}, //20709 #CJK UNIFIED IDEOGRAPH
+ {0xF591, 0x9BCC}, //20710 #CJK UNIFIED IDEOGRAPH
+ {0xF592, 0x9BCD}, //20711 #CJK UNIFIED IDEOGRAPH
+ {0xF593, 0x9BCE}, //20712 #CJK UNIFIED IDEOGRAPH
+ {0xF594, 0x9BCF}, //20713 #CJK UNIFIED IDEOGRAPH
+ {0xF595, 0x9BD0}, //20714 #CJK UNIFIED IDEOGRAPH
+ {0xF596, 0x9BD1}, //20715 #CJK UNIFIED IDEOGRAPH
+ {0xF597, 0x9BD2}, //20716 #CJK UNIFIED IDEOGRAPH
+ {0xF598, 0x9BD3}, //20717 #CJK UNIFIED IDEOGRAPH
+ {0xF599, 0x9BD4}, //20718 #CJK UNIFIED IDEOGRAPH
+ {0xF59A, 0x9BD5}, //20719 #CJK UNIFIED IDEOGRAPH
+ {0xF59B, 0x9BD6}, //20720 #CJK UNIFIED IDEOGRAPH
+ {0xF59C, 0x9BD7}, //20721 #CJK UNIFIED IDEOGRAPH
+ {0xF59D, 0x9BD8}, //20722 #CJK UNIFIED IDEOGRAPH
+ {0xF59E, 0x9BD9}, //20723 #CJK UNIFIED IDEOGRAPH
+ {0xF59F, 0x9BDA}, //20724 #CJK UNIFIED IDEOGRAPH
+ {0xF5A0, 0x9BDB}, //20725 #CJK UNIFIED IDEOGRAPH
+ {0xF5A1, 0x9162}, //20726 #CJK UNIFIED IDEOGRAPH
+ {0xF5A2, 0x9161}, //20727 #CJK UNIFIED IDEOGRAPH
+ {0xF5A3, 0x9170}, //20728 #CJK UNIFIED IDEOGRAPH
+ {0xF5A4, 0x9169}, //20729 #CJK UNIFIED IDEOGRAPH
+ {0xF5A5, 0x916F}, //20730 #CJK UNIFIED IDEOGRAPH
+ {0xF5A6, 0x917D}, //20731 #CJK UNIFIED IDEOGRAPH
+ {0xF5A7, 0x917E}, //20732 #CJK UNIFIED IDEOGRAPH
+ {0xF5A8, 0x9172}, //20733 #CJK UNIFIED IDEOGRAPH
+ {0xF5A9, 0x9174}, //20734 #CJK UNIFIED IDEOGRAPH
+ {0xF5AA, 0x9179}, //20735 #CJK UNIFIED IDEOGRAPH
+ {0xF5AB, 0x918C}, //20736 #CJK UNIFIED IDEOGRAPH
+ {0xF5AC, 0x9185}, //20737 #CJK UNIFIED IDEOGRAPH
+ {0xF5AD, 0x9190}, //20738 #CJK UNIFIED IDEOGRAPH
+ {0xF5AE, 0x918D}, //20739 #CJK UNIFIED IDEOGRAPH
+ {0xF5AF, 0x9191}, //20740 #CJK UNIFIED IDEOGRAPH
+ {0xF5B0, 0x91A2}, //20741 #CJK UNIFIED IDEOGRAPH
+ {0xF5B1, 0x91A3}, //20742 #CJK UNIFIED IDEOGRAPH
+ {0xF5B2, 0x91AA}, //20743 #CJK UNIFIED IDEOGRAPH
+ {0xF5B3, 0x91AD}, //20744 #CJK UNIFIED IDEOGRAPH
+ {0xF5B4, 0x91AE}, //20745 #CJK UNIFIED IDEOGRAPH
+ {0xF5B5, 0x91AF}, //20746 #CJK UNIFIED IDEOGRAPH
+ {0xF5B6, 0x91B5}, //20747 #CJK UNIFIED IDEOGRAPH
+ {0xF5B7, 0x91B4}, //20748 #CJK UNIFIED IDEOGRAPH
+ {0xF5B8, 0x91BA}, //20749 #CJK UNIFIED IDEOGRAPH
+ {0xF5B9, 0x8C55}, //20750 #CJK UNIFIED IDEOGRAPH
+ {0xF5BA, 0x9E7E}, //20751 #CJK UNIFIED IDEOGRAPH
+ {0xF5BB, 0x8DB8}, //20752 #CJK UNIFIED IDEOGRAPH
+ {0xF5BC, 0x8DEB}, //20753 #CJK UNIFIED IDEOGRAPH
+ {0xF5BD, 0x8E05}, //20754 #CJK UNIFIED IDEOGRAPH
+ {0xF5BE, 0x8E59}, //20755 #CJK UNIFIED IDEOGRAPH
+ {0xF5BF, 0x8E69}, //20756 #CJK UNIFIED IDEOGRAPH
+ {0xF5C0, 0x8DB5}, //20757 #CJK UNIFIED IDEOGRAPH
+ {0xF5C1, 0x8DBF}, //20758 #CJK UNIFIED IDEOGRAPH
+ {0xF5C2, 0x8DBC}, //20759 #CJK UNIFIED IDEOGRAPH
+ {0xF5C3, 0x8DBA}, //20760 #CJK UNIFIED IDEOGRAPH
+ {0xF5C4, 0x8DC4}, //20761 #CJK UNIFIED IDEOGRAPH
+ {0xF5C5, 0x8DD6}, //20762 #CJK UNIFIED IDEOGRAPH
+ {0xF5C6, 0x8DD7}, //20763 #CJK UNIFIED IDEOGRAPH
+ {0xF5C7, 0x8DDA}, //20764 #CJK UNIFIED IDEOGRAPH
+ {0xF5C8, 0x8DDE}, //20765 #CJK UNIFIED IDEOGRAPH
+ {0xF5C9, 0x8DCE}, //20766 #CJK UNIFIED IDEOGRAPH
+ {0xF5CA, 0x8DCF}, //20767 #CJK UNIFIED IDEOGRAPH
+ {0xF5CB, 0x8DDB}, //20768 #CJK UNIFIED IDEOGRAPH
+ {0xF5CC, 0x8DC6}, //20769 #CJK UNIFIED IDEOGRAPH
+ {0xF5CD, 0x8DEC}, //20770 #CJK UNIFIED IDEOGRAPH
+ {0xF5CE, 0x8DF7}, //20771 #CJK UNIFIED IDEOGRAPH
+ {0xF5CF, 0x8DF8}, //20772 #CJK UNIFIED IDEOGRAPH
+ {0xF5D0, 0x8DE3}, //20773 #CJK UNIFIED IDEOGRAPH
+ {0xF5D1, 0x8DF9}, //20774 #CJK UNIFIED IDEOGRAPH
+ {0xF5D2, 0x8DFB}, //20775 #CJK UNIFIED IDEOGRAPH
+ {0xF5D3, 0x8DE4}, //20776 #CJK UNIFIED IDEOGRAPH
+ {0xF5D4, 0x8E09}, //20777 #CJK UNIFIED IDEOGRAPH
+ {0xF5D5, 0x8DFD}, //20778 #CJK UNIFIED IDEOGRAPH
+ {0xF5D6, 0x8E14}, //20779 #CJK UNIFIED IDEOGRAPH
+ {0xF5D7, 0x8E1D}, //20780 #CJK UNIFIED IDEOGRAPH
+ {0xF5D8, 0x8E1F}, //20781 #CJK UNIFIED IDEOGRAPH
+ {0xF5D9, 0x8E2C}, //20782 #CJK UNIFIED IDEOGRAPH
+ {0xF5DA, 0x8E2E}, //20783 #CJK UNIFIED IDEOGRAPH
+ {0xF5DB, 0x8E23}, //20784 #CJK UNIFIED IDEOGRAPH
+ {0xF5DC, 0x8E2F}, //20785 #CJK UNIFIED IDEOGRAPH
+ {0xF5DD, 0x8E3A}, //20786 #CJK UNIFIED IDEOGRAPH
+ {0xF5DE, 0x8E40}, //20787 #CJK UNIFIED IDEOGRAPH
+ {0xF5DF, 0x8E39}, //20788 #CJK UNIFIED IDEOGRAPH
+ {0xF5E0, 0x8E35}, //20789 #CJK UNIFIED IDEOGRAPH
+ {0xF5E1, 0x8E3D}, //20790 #CJK UNIFIED IDEOGRAPH
+ {0xF5E2, 0x8E31}, //20791 #CJK UNIFIED IDEOGRAPH
+ {0xF5E3, 0x8E49}, //20792 #CJK UNIFIED IDEOGRAPH
+ {0xF5E4, 0x8E41}, //20793 #CJK UNIFIED IDEOGRAPH
+ {0xF5E5, 0x8E42}, //20794 #CJK UNIFIED IDEOGRAPH
+ {0xF5E6, 0x8E51}, //20795 #CJK UNIFIED IDEOGRAPH
+ {0xF5E7, 0x8E52}, //20796 #CJK UNIFIED IDEOGRAPH
+ {0xF5E8, 0x8E4A}, //20797 #CJK UNIFIED IDEOGRAPH
+ {0xF5E9, 0x8E70}, //20798 #CJK UNIFIED IDEOGRAPH
+ {0xF5EA, 0x8E76}, //20799 #CJK UNIFIED IDEOGRAPH
+ {0xF5EB, 0x8E7C}, //20800 #CJK UNIFIED IDEOGRAPH
+ {0xF5EC, 0x8E6F}, //20801 #CJK UNIFIED IDEOGRAPH
+ {0xF5ED, 0x8E74}, //20802 #CJK UNIFIED IDEOGRAPH
+ {0xF5EE, 0x8E85}, //20803 #CJK UNIFIED IDEOGRAPH
+ {0xF5EF, 0x8E8F}, //20804 #CJK UNIFIED IDEOGRAPH
+ {0xF5F0, 0x8E94}, //20805 #CJK UNIFIED IDEOGRAPH
+ {0xF5F1, 0x8E90}, //20806 #CJK UNIFIED IDEOGRAPH
+ {0xF5F2, 0x8E9C}, //20807 #CJK UNIFIED IDEOGRAPH
+ {0xF5F3, 0x8E9E}, //20808 #CJK UNIFIED IDEOGRAPH
+ {0xF5F4, 0x8C78}, //20809 #CJK UNIFIED IDEOGRAPH
+ {0xF5F5, 0x8C82}, //20810 #CJK UNIFIED IDEOGRAPH
+ {0xF5F6, 0x8C8A}, //20811 #CJK UNIFIED IDEOGRAPH
+ {0xF5F7, 0x8C85}, //20812 #CJK UNIFIED IDEOGRAPH
+ {0xF5F8, 0x8C98}, //20813 #CJK UNIFIED IDEOGRAPH
+ {0xF5F9, 0x8C94}, //20814 #CJK UNIFIED IDEOGRAPH
+ {0xF5FA, 0x659B}, //20815 #CJK UNIFIED IDEOGRAPH
+ {0xF5FB, 0x89D6}, //20816 #CJK UNIFIED IDEOGRAPH
+ {0xF5FC, 0x89DE}, //20817 #CJK UNIFIED IDEOGRAPH
+ {0xF5FD, 0x89DA}, //20818 #CJK UNIFIED IDEOGRAPH
+ {0xF5FE, 0x89DC}, //20819 #CJK UNIFIED IDEOGRAPH
+ {0xF640, 0x9BDC}, //20820 #CJK UNIFIED IDEOGRAPH
+ {0xF641, 0x9BDD}, //20821 #CJK UNIFIED IDEOGRAPH
+ {0xF642, 0x9BDE}, //20822 #CJK UNIFIED IDEOGRAPH
+ {0xF643, 0x9BDF}, //20823 #CJK UNIFIED IDEOGRAPH
+ {0xF644, 0x9BE0}, //20824 #CJK UNIFIED IDEOGRAPH
+ {0xF645, 0x9BE1}, //20825 #CJK UNIFIED IDEOGRAPH
+ {0xF646, 0x9BE2}, //20826 #CJK UNIFIED IDEOGRAPH
+ {0xF647, 0x9BE3}, //20827 #CJK UNIFIED IDEOGRAPH
+ {0xF648, 0x9BE4}, //20828 #CJK UNIFIED IDEOGRAPH
+ {0xF649, 0x9BE5}, //20829 #CJK UNIFIED IDEOGRAPH
+ {0xF64A, 0x9BE6}, //20830 #CJK UNIFIED IDEOGRAPH
+ {0xF64B, 0x9BE7}, //20831 #CJK UNIFIED IDEOGRAPH
+ {0xF64C, 0x9BE8}, //20832 #CJK UNIFIED IDEOGRAPH
+ {0xF64D, 0x9BE9}, //20833 #CJK UNIFIED IDEOGRAPH
+ {0xF64E, 0x9BEA}, //20834 #CJK UNIFIED IDEOGRAPH
+ {0xF64F, 0x9BEB}, //20835 #CJK UNIFIED IDEOGRAPH
+ {0xF650, 0x9BEC}, //20836 #CJK UNIFIED IDEOGRAPH
+ {0xF651, 0x9BED}, //20837 #CJK UNIFIED IDEOGRAPH
+ {0xF652, 0x9BEE}, //20838 #CJK UNIFIED IDEOGRAPH
+ {0xF653, 0x9BEF}, //20839 #CJK UNIFIED IDEOGRAPH
+ {0xF654, 0x9BF0}, //20840 #CJK UNIFIED IDEOGRAPH
+ {0xF655, 0x9BF1}, //20841 #CJK UNIFIED IDEOGRAPH
+ {0xF656, 0x9BF2}, //20842 #CJK UNIFIED IDEOGRAPH
+ {0xF657, 0x9BF3}, //20843 #CJK UNIFIED IDEOGRAPH
+ {0xF658, 0x9BF4}, //20844 #CJK UNIFIED IDEOGRAPH
+ {0xF659, 0x9BF5}, //20845 #CJK UNIFIED IDEOGRAPH
+ {0xF65A, 0x9BF6}, //20846 #CJK UNIFIED IDEOGRAPH
+ {0xF65B, 0x9BF7}, //20847 #CJK UNIFIED IDEOGRAPH
+ {0xF65C, 0x9BF8}, //20848 #CJK UNIFIED IDEOGRAPH
+ {0xF65D, 0x9BF9}, //20849 #CJK UNIFIED IDEOGRAPH
+ {0xF65E, 0x9BFA}, //20850 #CJK UNIFIED IDEOGRAPH
+ {0xF65F, 0x9BFB}, //20851 #CJK UNIFIED IDEOGRAPH
+ {0xF660, 0x9BFC}, //20852 #CJK UNIFIED IDEOGRAPH
+ {0xF661, 0x9BFD}, //20853 #CJK UNIFIED IDEOGRAPH
+ {0xF662, 0x9BFE}, //20854 #CJK UNIFIED IDEOGRAPH
+ {0xF663, 0x9BFF}, //20855 #CJK UNIFIED IDEOGRAPH
+ {0xF664, 0x9C00}, //20856 #CJK UNIFIED IDEOGRAPH
+ {0xF665, 0x9C01}, //20857 #CJK UNIFIED IDEOGRAPH
+ {0xF666, 0x9C02}, //20858 #CJK UNIFIED IDEOGRAPH
+ {0xF667, 0x9C03}, //20859 #CJK UNIFIED IDEOGRAPH
+ {0xF668, 0x9C04}, //20860 #CJK UNIFIED IDEOGRAPH
+ {0xF669, 0x9C05}, //20861 #CJK UNIFIED IDEOGRAPH
+ {0xF66A, 0x9C06}, //20862 #CJK UNIFIED IDEOGRAPH
+ {0xF66B, 0x9C07}, //20863 #CJK UNIFIED IDEOGRAPH
+ {0xF66C, 0x9C08}, //20864 #CJK UNIFIED IDEOGRAPH
+ {0xF66D, 0x9C09}, //20865 #CJK UNIFIED IDEOGRAPH
+ {0xF66E, 0x9C0A}, //20866 #CJK UNIFIED IDEOGRAPH
+ {0xF66F, 0x9C0B}, //20867 #CJK UNIFIED IDEOGRAPH
+ {0xF670, 0x9C0C}, //20868 #CJK UNIFIED IDEOGRAPH
+ {0xF671, 0x9C0D}, //20869 #CJK UNIFIED IDEOGRAPH
+ {0xF672, 0x9C0E}, //20870 #CJK UNIFIED IDEOGRAPH
+ {0xF673, 0x9C0F}, //20871 #CJK UNIFIED IDEOGRAPH
+ {0xF674, 0x9C10}, //20872 #CJK UNIFIED IDEOGRAPH
+ {0xF675, 0x9C11}, //20873 #CJK UNIFIED IDEOGRAPH
+ {0xF676, 0x9C12}, //20874 #CJK UNIFIED IDEOGRAPH
+ {0xF677, 0x9C13}, //20875 #CJK UNIFIED IDEOGRAPH
+ {0xF678, 0x9C14}, //20876 #CJK UNIFIED IDEOGRAPH
+ {0xF679, 0x9C15}, //20877 #CJK UNIFIED IDEOGRAPH
+ {0xF67A, 0x9C16}, //20878 #CJK UNIFIED IDEOGRAPH
+ {0xF67B, 0x9C17}, //20879 #CJK UNIFIED IDEOGRAPH
+ {0xF67C, 0x9C18}, //20880 #CJK UNIFIED IDEOGRAPH
+ {0xF67D, 0x9C19}, //20881 #CJK UNIFIED IDEOGRAPH
+ {0xF67E, 0x9C1A}, //20882 #CJK UNIFIED IDEOGRAPH
+ {0xF680, 0x9C1B}, //20883 #CJK UNIFIED IDEOGRAPH
+ {0xF681, 0x9C1C}, //20884 #CJK UNIFIED IDEOGRAPH
+ {0xF682, 0x9C1D}, //20885 #CJK UNIFIED IDEOGRAPH
+ {0xF683, 0x9C1E}, //20886 #CJK UNIFIED IDEOGRAPH
+ {0xF684, 0x9C1F}, //20887 #CJK UNIFIED IDEOGRAPH
+ {0xF685, 0x9C20}, //20888 #CJK UNIFIED IDEOGRAPH
+ {0xF686, 0x9C21}, //20889 #CJK UNIFIED IDEOGRAPH
+ {0xF687, 0x9C22}, //20890 #CJK UNIFIED IDEOGRAPH
+ {0xF688, 0x9C23}, //20891 #CJK UNIFIED IDEOGRAPH
+ {0xF689, 0x9C24}, //20892 #CJK UNIFIED IDEOGRAPH
+ {0xF68A, 0x9C25}, //20893 #CJK UNIFIED IDEOGRAPH
+ {0xF68B, 0x9C26}, //20894 #CJK UNIFIED IDEOGRAPH
+ {0xF68C, 0x9C27}, //20895 #CJK UNIFIED IDEOGRAPH
+ {0xF68D, 0x9C28}, //20896 #CJK UNIFIED IDEOGRAPH
+ {0xF68E, 0x9C29}, //20897 #CJK UNIFIED IDEOGRAPH
+ {0xF68F, 0x9C2A}, //20898 #CJK UNIFIED IDEOGRAPH
+ {0xF690, 0x9C2B}, //20899 #CJK UNIFIED IDEOGRAPH
+ {0xF691, 0x9C2C}, //20900 #CJK UNIFIED IDEOGRAPH
+ {0xF692, 0x9C2D}, //20901 #CJK UNIFIED IDEOGRAPH
+ {0xF693, 0x9C2E}, //20902 #CJK UNIFIED IDEOGRAPH
+ {0xF694, 0x9C2F}, //20903 #CJK UNIFIED IDEOGRAPH
+ {0xF695, 0x9C30}, //20904 #CJK UNIFIED IDEOGRAPH
+ {0xF696, 0x9C31}, //20905 #CJK UNIFIED IDEOGRAPH
+ {0xF697, 0x9C32}, //20906 #CJK UNIFIED IDEOGRAPH
+ {0xF698, 0x9C33}, //20907 #CJK UNIFIED IDEOGRAPH
+ {0xF699, 0x9C34}, //20908 #CJK UNIFIED IDEOGRAPH
+ {0xF69A, 0x9C35}, //20909 #CJK UNIFIED IDEOGRAPH
+ {0xF69B, 0x9C36}, //20910 #CJK UNIFIED IDEOGRAPH
+ {0xF69C, 0x9C37}, //20911 #CJK UNIFIED IDEOGRAPH
+ {0xF69D, 0x9C38}, //20912 #CJK UNIFIED IDEOGRAPH
+ {0xF69E, 0x9C39}, //20913 #CJK UNIFIED IDEOGRAPH
+ {0xF69F, 0x9C3A}, //20914 #CJK UNIFIED IDEOGRAPH
+ {0xF6A0, 0x9C3B}, //20915 #CJK UNIFIED IDEOGRAPH
+ {0xF6A1, 0x89E5}, //20916 #CJK UNIFIED IDEOGRAPH
+ {0xF6A2, 0x89EB}, //20917 #CJK UNIFIED IDEOGRAPH
+ {0xF6A3, 0x89EF}, //20918 #CJK UNIFIED IDEOGRAPH
+ {0xF6A4, 0x8A3E}, //20919 #CJK UNIFIED IDEOGRAPH
+ {0xF6A5, 0x8B26}, //20920 #CJK UNIFIED IDEOGRAPH
+ {0xF6A6, 0x9753}, //20921 #CJK UNIFIED IDEOGRAPH
+ {0xF6A7, 0x96E9}, //20922 #CJK UNIFIED IDEOGRAPH
+ {0xF6A8, 0x96F3}, //20923 #CJK UNIFIED IDEOGRAPH
+ {0xF6A9, 0x96EF}, //20924 #CJK UNIFIED IDEOGRAPH
+ {0xF6AA, 0x9706}, //20925 #CJK UNIFIED IDEOGRAPH
+ {0xF6AB, 0x9701}, //20926 #CJK UNIFIED IDEOGRAPH
+ {0xF6AC, 0x9708}, //20927 #CJK UNIFIED IDEOGRAPH
+ {0xF6AD, 0x970F}, //20928 #CJK UNIFIED IDEOGRAPH
+ {0xF6AE, 0x970E}, //20929 #CJK UNIFIED IDEOGRAPH
+ {0xF6AF, 0x972A}, //20930 #CJK UNIFIED IDEOGRAPH
+ {0xF6B0, 0x972D}, //20931 #CJK UNIFIED IDEOGRAPH
+ {0xF6B1, 0x9730}, //20932 #CJK UNIFIED IDEOGRAPH
+ {0xF6B2, 0x973E}, //20933 #CJK UNIFIED IDEOGRAPH
+ {0xF6B3, 0x9F80}, //20934 #CJK UNIFIED IDEOGRAPH
+ {0xF6B4, 0x9F83}, //20935 #CJK UNIFIED IDEOGRAPH
+ {0xF6B5, 0x9F85}, //20936 #CJK UNIFIED IDEOGRAPH
+ {0xF6B6, 0x9F86}, //20937 #CJK UNIFIED IDEOGRAPH
+ {0xF6B7, 0x9F87}, //20938 #CJK UNIFIED IDEOGRAPH
+ {0xF6B8, 0x9F88}, //20939 #CJK UNIFIED IDEOGRAPH
+ {0xF6B9, 0x9F89}, //20940 #CJK UNIFIED IDEOGRAPH
+ {0xF6BA, 0x9F8A}, //20941 #CJK UNIFIED IDEOGRAPH
+ {0xF6BB, 0x9F8C}, //20942 #CJK UNIFIED IDEOGRAPH
+ {0xF6BC, 0x9EFE}, //20943 #CJK UNIFIED IDEOGRAPH
+ {0xF6BD, 0x9F0B}, //20944 #CJK UNIFIED IDEOGRAPH
+ {0xF6BE, 0x9F0D}, //20945 #CJK UNIFIED IDEOGRAPH
+ {0xF6BF, 0x96B9}, //20946 #CJK UNIFIED IDEOGRAPH
+ {0xF6C0, 0x96BC}, //20947 #CJK UNIFIED IDEOGRAPH
+ {0xF6C1, 0x96BD}, //20948 #CJK UNIFIED IDEOGRAPH
+ {0xF6C2, 0x96CE}, //20949 #CJK UNIFIED IDEOGRAPH
+ {0xF6C3, 0x96D2}, //20950 #CJK UNIFIED IDEOGRAPH
+ {0xF6C4, 0x77BF}, //20951 #CJK UNIFIED IDEOGRAPH
+ {0xF6C5, 0x96E0}, //20952 #CJK UNIFIED IDEOGRAPH
+ {0xF6C6, 0x928E}, //20953 #CJK UNIFIED IDEOGRAPH
+ {0xF6C7, 0x92AE}, //20954 #CJK UNIFIED IDEOGRAPH
+ {0xF6C8, 0x92C8}, //20955 #CJK UNIFIED IDEOGRAPH
+ {0xF6C9, 0x933E}, //20956 #CJK UNIFIED IDEOGRAPH
+ {0xF6CA, 0x936A}, //20957 #CJK UNIFIED IDEOGRAPH
+ {0xF6CB, 0x93CA}, //20958 #CJK UNIFIED IDEOGRAPH
+ {0xF6CC, 0x938F}, //20959 #CJK UNIFIED IDEOGRAPH
+ {0xF6CD, 0x943E}, //20960 #CJK UNIFIED IDEOGRAPH
+ {0xF6CE, 0x946B}, //20961 #CJK UNIFIED IDEOGRAPH
+ {0xF6CF, 0x9C7F}, //20962 #CJK UNIFIED IDEOGRAPH
+ {0xF6D0, 0x9C82}, //20963 #CJK UNIFIED IDEOGRAPH
+ {0xF6D1, 0x9C85}, //20964 #CJK UNIFIED IDEOGRAPH
+ {0xF6D2, 0x9C86}, //20965 #CJK UNIFIED IDEOGRAPH
+ {0xF6D3, 0x9C87}, //20966 #CJK UNIFIED IDEOGRAPH
+ {0xF6D4, 0x9C88}, //20967 #CJK UNIFIED IDEOGRAPH
+ {0xF6D5, 0x7A23}, //20968 #CJK UNIFIED IDEOGRAPH
+ {0xF6D6, 0x9C8B}, //20969 #CJK UNIFIED IDEOGRAPH
+ {0xF6D7, 0x9C8E}, //20970 #CJK UNIFIED IDEOGRAPH
+ {0xF6D8, 0x9C90}, //20971 #CJK UNIFIED IDEOGRAPH
+ {0xF6D9, 0x9C91}, //20972 #CJK UNIFIED IDEOGRAPH
+ {0xF6DA, 0x9C92}, //20973 #CJK UNIFIED IDEOGRAPH
+ {0xF6DB, 0x9C94}, //20974 #CJK UNIFIED IDEOGRAPH
+ {0xF6DC, 0x9C95}, //20975 #CJK UNIFIED IDEOGRAPH
+ {0xF6DD, 0x9C9A}, //20976 #CJK UNIFIED IDEOGRAPH
+ {0xF6DE, 0x9C9B}, //20977 #CJK UNIFIED IDEOGRAPH
+ {0xF6DF, 0x9C9E}, //20978 #CJK UNIFIED IDEOGRAPH
+ {0xF6E0, 0x9C9F}, //20979 #CJK UNIFIED IDEOGRAPH
+ {0xF6E1, 0x9CA0}, //20980 #CJK UNIFIED IDEOGRAPH
+ {0xF6E2, 0x9CA1}, //20981 #CJK UNIFIED IDEOGRAPH
+ {0xF6E3, 0x9CA2}, //20982 #CJK UNIFIED IDEOGRAPH
+ {0xF6E4, 0x9CA3}, //20983 #CJK UNIFIED IDEOGRAPH
+ {0xF6E5, 0x9CA5}, //20984 #CJK UNIFIED IDEOGRAPH
+ {0xF6E6, 0x9CA6}, //20985 #CJK UNIFIED IDEOGRAPH
+ {0xF6E7, 0x9CA7}, //20986 #CJK UNIFIED IDEOGRAPH
+ {0xF6E8, 0x9CA8}, //20987 #CJK UNIFIED IDEOGRAPH
+ {0xF6E9, 0x9CA9}, //20988 #CJK UNIFIED IDEOGRAPH
+ {0xF6EA, 0x9CAB}, //20989 #CJK UNIFIED IDEOGRAPH
+ {0xF6EB, 0x9CAD}, //20990 #CJK UNIFIED IDEOGRAPH
+ {0xF6EC, 0x9CAE}, //20991 #CJK UNIFIED IDEOGRAPH
+ {0xF6ED, 0x9CB0}, //20992 #CJK UNIFIED IDEOGRAPH
+ {0xF6EE, 0x9CB1}, //20993 #CJK UNIFIED IDEOGRAPH
+ {0xF6EF, 0x9CB2}, //20994 #CJK UNIFIED IDEOGRAPH
+ {0xF6F0, 0x9CB3}, //20995 #CJK UNIFIED IDEOGRAPH
+ {0xF6F1, 0x9CB4}, //20996 #CJK UNIFIED IDEOGRAPH
+ {0xF6F2, 0x9CB5}, //20997 #CJK UNIFIED IDEOGRAPH
+ {0xF6F3, 0x9CB6}, //20998 #CJK UNIFIED IDEOGRAPH
+ {0xF6F4, 0x9CB7}, //20999 #CJK UNIFIED IDEOGRAPH
+ {0xF6F5, 0x9CBA}, //21000 #CJK UNIFIED IDEOGRAPH
+ {0xF6F6, 0x9CBB}, //21001 #CJK UNIFIED IDEOGRAPH
+ {0xF6F7, 0x9CBC}, //21002 #CJK UNIFIED IDEOGRAPH
+ {0xF6F8, 0x9CBD}, //21003 #CJK UNIFIED IDEOGRAPH
+ {0xF6F9, 0x9CC4}, //21004 #CJK UNIFIED IDEOGRAPH
+ {0xF6FA, 0x9CC5}, //21005 #CJK UNIFIED IDEOGRAPH
+ {0xF6FB, 0x9CC6}, //21006 #CJK UNIFIED IDEOGRAPH
+ {0xF6FC, 0x9CC7}, //21007 #CJK UNIFIED IDEOGRAPH
+ {0xF6FD, 0x9CCA}, //21008 #CJK UNIFIED IDEOGRAPH
+ {0xF6FE, 0x9CCB}, //21009 #CJK UNIFIED IDEOGRAPH
+ {0xF740, 0x9C3C}, //21010 #CJK UNIFIED IDEOGRAPH
+ {0xF741, 0x9C3D}, //21011 #CJK UNIFIED IDEOGRAPH
+ {0xF742, 0x9C3E}, //21012 #CJK UNIFIED IDEOGRAPH
+ {0xF743, 0x9C3F}, //21013 #CJK UNIFIED IDEOGRAPH
+ {0xF744, 0x9C40}, //21014 #CJK UNIFIED IDEOGRAPH
+ {0xF745, 0x9C41}, //21015 #CJK UNIFIED IDEOGRAPH
+ {0xF746, 0x9C42}, //21016 #CJK UNIFIED IDEOGRAPH
+ {0xF747, 0x9C43}, //21017 #CJK UNIFIED IDEOGRAPH
+ {0xF748, 0x9C44}, //21018 #CJK UNIFIED IDEOGRAPH
+ {0xF749, 0x9C45}, //21019 #CJK UNIFIED IDEOGRAPH
+ {0xF74A, 0x9C46}, //21020 #CJK UNIFIED IDEOGRAPH
+ {0xF74B, 0x9C47}, //21021 #CJK UNIFIED IDEOGRAPH
+ {0xF74C, 0x9C48}, //21022 #CJK UNIFIED IDEOGRAPH
+ {0xF74D, 0x9C49}, //21023 #CJK UNIFIED IDEOGRAPH
+ {0xF74E, 0x9C4A}, //21024 #CJK UNIFIED IDEOGRAPH
+ {0xF74F, 0x9C4B}, //21025 #CJK UNIFIED IDEOGRAPH
+ {0xF750, 0x9C4C}, //21026 #CJK UNIFIED IDEOGRAPH
+ {0xF751, 0x9C4D}, //21027 #CJK UNIFIED IDEOGRAPH
+ {0xF752, 0x9C4E}, //21028 #CJK UNIFIED IDEOGRAPH
+ {0xF753, 0x9C4F}, //21029 #CJK UNIFIED IDEOGRAPH
+ {0xF754, 0x9C50}, //21030 #CJK UNIFIED IDEOGRAPH
+ {0xF755, 0x9C51}, //21031 #CJK UNIFIED IDEOGRAPH
+ {0xF756, 0x9C52}, //21032 #CJK UNIFIED IDEOGRAPH
+ {0xF757, 0x9C53}, //21033 #CJK UNIFIED IDEOGRAPH
+ {0xF758, 0x9C54}, //21034 #CJK UNIFIED IDEOGRAPH
+ {0xF759, 0x9C55}, //21035 #CJK UNIFIED IDEOGRAPH
+ {0xF75A, 0x9C56}, //21036 #CJK UNIFIED IDEOGRAPH
+ {0xF75B, 0x9C57}, //21037 #CJK UNIFIED IDEOGRAPH
+ {0xF75C, 0x9C58}, //21038 #CJK UNIFIED IDEOGRAPH
+ {0xF75D, 0x9C59}, //21039 #CJK UNIFIED IDEOGRAPH
+ {0xF75E, 0x9C5A}, //21040 #CJK UNIFIED IDEOGRAPH
+ {0xF75F, 0x9C5B}, //21041 #CJK UNIFIED IDEOGRAPH
+ {0xF760, 0x9C5C}, //21042 #CJK UNIFIED IDEOGRAPH
+ {0xF761, 0x9C5D}, //21043 #CJK UNIFIED IDEOGRAPH
+ {0xF762, 0x9C5E}, //21044 #CJK UNIFIED IDEOGRAPH
+ {0xF763, 0x9C5F}, //21045 #CJK UNIFIED IDEOGRAPH
+ {0xF764, 0x9C60}, //21046 #CJK UNIFIED IDEOGRAPH
+ {0xF765, 0x9C61}, //21047 #CJK UNIFIED IDEOGRAPH
+ {0xF766, 0x9C62}, //21048 #CJK UNIFIED IDEOGRAPH
+ {0xF767, 0x9C63}, //21049 #CJK UNIFIED IDEOGRAPH
+ {0xF768, 0x9C64}, //21050 #CJK UNIFIED IDEOGRAPH
+ {0xF769, 0x9C65}, //21051 #CJK UNIFIED IDEOGRAPH
+ {0xF76A, 0x9C66}, //21052 #CJK UNIFIED IDEOGRAPH
+ {0xF76B, 0x9C67}, //21053 #CJK UNIFIED IDEOGRAPH
+ {0xF76C, 0x9C68}, //21054 #CJK UNIFIED IDEOGRAPH
+ {0xF76D, 0x9C69}, //21055 #CJK UNIFIED IDEOGRAPH
+ {0xF76E, 0x9C6A}, //21056 #CJK UNIFIED IDEOGRAPH
+ {0xF76F, 0x9C6B}, //21057 #CJK UNIFIED IDEOGRAPH
+ {0xF770, 0x9C6C}, //21058 #CJK UNIFIED IDEOGRAPH
+ {0xF771, 0x9C6D}, //21059 #CJK UNIFIED IDEOGRAPH
+ {0xF772, 0x9C6E}, //21060 #CJK UNIFIED IDEOGRAPH
+ {0xF773, 0x9C6F}, //21061 #CJK UNIFIED IDEOGRAPH
+ {0xF774, 0x9C70}, //21062 #CJK UNIFIED IDEOGRAPH
+ {0xF775, 0x9C71}, //21063 #CJK UNIFIED IDEOGRAPH
+ {0xF776, 0x9C72}, //21064 #CJK UNIFIED IDEOGRAPH
+ {0xF777, 0x9C73}, //21065 #CJK UNIFIED IDEOGRAPH
+ {0xF778, 0x9C74}, //21066 #CJK UNIFIED IDEOGRAPH
+ {0xF779, 0x9C75}, //21067 #CJK UNIFIED IDEOGRAPH
+ {0xF77A, 0x9C76}, //21068 #CJK UNIFIED IDEOGRAPH
+ {0xF77B, 0x9C77}, //21069 #CJK UNIFIED IDEOGRAPH
+ {0xF77C, 0x9C78}, //21070 #CJK UNIFIED IDEOGRAPH
+ {0xF77D, 0x9C79}, //21071 #CJK UNIFIED IDEOGRAPH
+ {0xF77E, 0x9C7A}, //21072 #CJK UNIFIED IDEOGRAPH
+ {0xF780, 0x9C7B}, //21073 #CJK UNIFIED IDEOGRAPH
+ {0xF781, 0x9C7D}, //21074 #CJK UNIFIED IDEOGRAPH
+ {0xF782, 0x9C7E}, //21075 #CJK UNIFIED IDEOGRAPH
+ {0xF783, 0x9C80}, //21076 #CJK UNIFIED IDEOGRAPH
+ {0xF784, 0x9C83}, //21077 #CJK UNIFIED IDEOGRAPH
+ {0xF785, 0x9C84}, //21078 #CJK UNIFIED IDEOGRAPH
+ {0xF786, 0x9C89}, //21079 #CJK UNIFIED IDEOGRAPH
+ {0xF787, 0x9C8A}, //21080 #CJK UNIFIED IDEOGRAPH
+ {0xF788, 0x9C8C}, //21081 #CJK UNIFIED IDEOGRAPH
+ {0xF789, 0x9C8F}, //21082 #CJK UNIFIED IDEOGRAPH
+ {0xF78A, 0x9C93}, //21083 #CJK UNIFIED IDEOGRAPH
+ {0xF78B, 0x9C96}, //21084 #CJK UNIFIED IDEOGRAPH
+ {0xF78C, 0x9C97}, //21085 #CJK UNIFIED IDEOGRAPH
+ {0xF78D, 0x9C98}, //21086 #CJK UNIFIED IDEOGRAPH
+ {0xF78E, 0x9C99}, //21087 #CJK UNIFIED IDEOGRAPH
+ {0xF78F, 0x9C9D}, //21088 #CJK UNIFIED IDEOGRAPH
+ {0xF790, 0x9CAA}, //21089 #CJK UNIFIED IDEOGRAPH
+ {0xF791, 0x9CAC}, //21090 #CJK UNIFIED IDEOGRAPH
+ {0xF792, 0x9CAF}, //21091 #CJK UNIFIED IDEOGRAPH
+ {0xF793, 0x9CB9}, //21092 #CJK UNIFIED IDEOGRAPH
+ {0xF794, 0x9CBE}, //21093 #CJK UNIFIED IDEOGRAPH
+ {0xF795, 0x9CBF}, //21094 #CJK UNIFIED IDEOGRAPH
+ {0xF796, 0x9CC0}, //21095 #CJK UNIFIED IDEOGRAPH
+ {0xF797, 0x9CC1}, //21096 #CJK UNIFIED IDEOGRAPH
+ {0xF798, 0x9CC2}, //21097 #CJK UNIFIED IDEOGRAPH
+ {0xF799, 0x9CC8}, //21098 #CJK UNIFIED IDEOGRAPH
+ {0xF79A, 0x9CC9}, //21099 #CJK UNIFIED IDEOGRAPH
+ {0xF79B, 0x9CD1}, //21100 #CJK UNIFIED IDEOGRAPH
+ {0xF79C, 0x9CD2}, //21101 #CJK UNIFIED IDEOGRAPH
+ {0xF79D, 0x9CDA}, //21102 #CJK UNIFIED IDEOGRAPH
+ {0xF79E, 0x9CDB}, //21103 #CJK UNIFIED IDEOGRAPH
+ {0xF79F, 0x9CE0}, //21104 #CJK UNIFIED IDEOGRAPH
+ {0xF7A0, 0x9CE1}, //21105 #CJK UNIFIED IDEOGRAPH
+ {0xF7A1, 0x9CCC}, //21106 #CJK UNIFIED IDEOGRAPH
+ {0xF7A2, 0x9CCD}, //21107 #CJK UNIFIED IDEOGRAPH
+ {0xF7A3, 0x9CCE}, //21108 #CJK UNIFIED IDEOGRAPH
+ {0xF7A4, 0x9CCF}, //21109 #CJK UNIFIED IDEOGRAPH
+ {0xF7A5, 0x9CD0}, //21110 #CJK UNIFIED IDEOGRAPH
+ {0xF7A6, 0x9CD3}, //21111 #CJK UNIFIED IDEOGRAPH
+ {0xF7A7, 0x9CD4}, //21112 #CJK UNIFIED IDEOGRAPH
+ {0xF7A8, 0x9CD5}, //21113 #CJK UNIFIED IDEOGRAPH
+ {0xF7A9, 0x9CD7}, //21114 #CJK UNIFIED IDEOGRAPH
+ {0xF7AA, 0x9CD8}, //21115 #CJK UNIFIED IDEOGRAPH
+ {0xF7AB, 0x9CD9}, //21116 #CJK UNIFIED IDEOGRAPH
+ {0xF7AC, 0x9CDC}, //21117 #CJK UNIFIED IDEOGRAPH
+ {0xF7AD, 0x9CDD}, //21118 #CJK UNIFIED IDEOGRAPH
+ {0xF7AE, 0x9CDF}, //21119 #CJK UNIFIED IDEOGRAPH
+ {0xF7AF, 0x9CE2}, //21120 #CJK UNIFIED IDEOGRAPH
+ {0xF7B0, 0x977C}, //21121 #CJK UNIFIED IDEOGRAPH
+ {0xF7B1, 0x9785}, //21122 #CJK UNIFIED IDEOGRAPH
+ {0xF7B2, 0x9791}, //21123 #CJK UNIFIED IDEOGRAPH
+ {0xF7B3, 0x9792}, //21124 #CJK UNIFIED IDEOGRAPH
+ {0xF7B4, 0x9794}, //21125 #CJK UNIFIED IDEOGRAPH
+ {0xF7B5, 0x97AF}, //21126 #CJK UNIFIED IDEOGRAPH
+ {0xF7B6, 0x97AB}, //21127 #CJK UNIFIED IDEOGRAPH
+ {0xF7B7, 0x97A3}, //21128 #CJK UNIFIED IDEOGRAPH
+ {0xF7B8, 0x97B2}, //21129 #CJK UNIFIED IDEOGRAPH
+ {0xF7B9, 0x97B4}, //21130 #CJK UNIFIED IDEOGRAPH
+ {0xF7BA, 0x9AB1}, //21131 #CJK UNIFIED IDEOGRAPH
+ {0xF7BB, 0x9AB0}, //21132 #CJK UNIFIED IDEOGRAPH
+ {0xF7BC, 0x9AB7}, //21133 #CJK UNIFIED IDEOGRAPH
+ {0xF7BD, 0x9E58}, //21134 #CJK UNIFIED IDEOGRAPH
+ {0xF7BE, 0x9AB6}, //21135 #CJK UNIFIED IDEOGRAPH
+ {0xF7BF, 0x9ABA}, //21136 #CJK UNIFIED IDEOGRAPH
+ {0xF7C0, 0x9ABC}, //21137 #CJK UNIFIED IDEOGRAPH
+ {0xF7C1, 0x9AC1}, //21138 #CJK UNIFIED IDEOGRAPH
+ {0xF7C2, 0x9AC0}, //21139 #CJK UNIFIED IDEOGRAPH
+ {0xF7C3, 0x9AC5}, //21140 #CJK UNIFIED IDEOGRAPH
+ {0xF7C4, 0x9AC2}, //21141 #CJK UNIFIED IDEOGRAPH
+ {0xF7C5, 0x9ACB}, //21142 #CJK UNIFIED IDEOGRAPH
+ {0xF7C6, 0x9ACC}, //21143 #CJK UNIFIED IDEOGRAPH
+ {0xF7C7, 0x9AD1}, //21144 #CJK UNIFIED IDEOGRAPH
+ {0xF7C8, 0x9B45}, //21145 #CJK UNIFIED IDEOGRAPH
+ {0xF7C9, 0x9B43}, //21146 #CJK UNIFIED IDEOGRAPH
+ {0xF7CA, 0x9B47}, //21147 #CJK UNIFIED IDEOGRAPH
+ {0xF7CB, 0x9B49}, //21148 #CJK UNIFIED IDEOGRAPH
+ {0xF7CC, 0x9B48}, //21149 #CJK UNIFIED IDEOGRAPH
+ {0xF7CD, 0x9B4D}, //21150 #CJK UNIFIED IDEOGRAPH
+ {0xF7CE, 0x9B51}, //21151 #CJK UNIFIED IDEOGRAPH
+ {0xF7CF, 0x98E8}, //21152 #CJK UNIFIED IDEOGRAPH
+ {0xF7D0, 0x990D}, //21153 #CJK UNIFIED IDEOGRAPH
+ {0xF7D1, 0x992E}, //21154 #CJK UNIFIED IDEOGRAPH
+ {0xF7D2, 0x9955}, //21155 #CJK UNIFIED IDEOGRAPH
+ {0xF7D3, 0x9954}, //21156 #CJK UNIFIED IDEOGRAPH
+ {0xF7D4, 0x9ADF}, //21157 #CJK UNIFIED IDEOGRAPH
+ {0xF7D5, 0x9AE1}, //21158 #CJK UNIFIED IDEOGRAPH
+ {0xF7D6, 0x9AE6}, //21159 #CJK UNIFIED IDEOGRAPH
+ {0xF7D7, 0x9AEF}, //21160 #CJK UNIFIED IDEOGRAPH
+ {0xF7D8, 0x9AEB}, //21161 #CJK UNIFIED IDEOGRAPH
+ {0xF7D9, 0x9AFB}, //21162 #CJK UNIFIED IDEOGRAPH
+ {0xF7DA, 0x9AED}, //21163 #CJK UNIFIED IDEOGRAPH
+ {0xF7DB, 0x9AF9}, //21164 #CJK UNIFIED IDEOGRAPH
+ {0xF7DC, 0x9B08}, //21165 #CJK UNIFIED IDEOGRAPH
+ {0xF7DD, 0x9B0F}, //21166 #CJK UNIFIED IDEOGRAPH
+ {0xF7DE, 0x9B13}, //21167 #CJK UNIFIED IDEOGRAPH
+ {0xF7DF, 0x9B1F}, //21168 #CJK UNIFIED IDEOGRAPH
+ {0xF7E0, 0x9B23}, //21169 #CJK UNIFIED IDEOGRAPH
+ {0xF7E1, 0x9EBD}, //21170 #CJK UNIFIED IDEOGRAPH
+ {0xF7E2, 0x9EBE}, //21171 #CJK UNIFIED IDEOGRAPH
+ {0xF7E3, 0x7E3B}, //21172 #CJK UNIFIED IDEOGRAPH
+ {0xF7E4, 0x9E82}, //21173 #CJK UNIFIED IDEOGRAPH
+ {0xF7E5, 0x9E87}, //21174 #CJK UNIFIED IDEOGRAPH
+ {0xF7E6, 0x9E88}, //21175 #CJK UNIFIED IDEOGRAPH
+ {0xF7E7, 0x9E8B}, //21176 #CJK UNIFIED IDEOGRAPH
+ {0xF7E8, 0x9E92}, //21177 #CJK UNIFIED IDEOGRAPH
+ {0xF7E9, 0x93D6}, //21178 #CJK UNIFIED IDEOGRAPH
+ {0xF7EA, 0x9E9D}, //21179 #CJK UNIFIED IDEOGRAPH
+ {0xF7EB, 0x9E9F}, //21180 #CJK UNIFIED IDEOGRAPH
+ {0xF7EC, 0x9EDB}, //21181 #CJK UNIFIED IDEOGRAPH
+ {0xF7ED, 0x9EDC}, //21182 #CJK UNIFIED IDEOGRAPH
+ {0xF7EE, 0x9EDD}, //21183 #CJK UNIFIED IDEOGRAPH
+ {0xF7EF, 0x9EE0}, //21184 #CJK UNIFIED IDEOGRAPH
+ {0xF7F0, 0x9EDF}, //21185 #CJK UNIFIED IDEOGRAPH
+ {0xF7F1, 0x9EE2}, //21186 #CJK UNIFIED IDEOGRAPH
+ {0xF7F2, 0x9EE9}, //21187 #CJK UNIFIED IDEOGRAPH
+ {0xF7F3, 0x9EE7}, //21188 #CJK UNIFIED IDEOGRAPH
+ {0xF7F4, 0x9EE5}, //21189 #CJK UNIFIED IDEOGRAPH
+ {0xF7F5, 0x9EEA}, //21190 #CJK UNIFIED IDEOGRAPH
+ {0xF7F6, 0x9EEF}, //21191 #CJK UNIFIED IDEOGRAPH
+ {0xF7F7, 0x9F22}, //21192 #CJK UNIFIED IDEOGRAPH
+ {0xF7F8, 0x9F2C}, //21193 #CJK UNIFIED IDEOGRAPH
+ {0xF7F9, 0x9F2F}, //21194 #CJK UNIFIED IDEOGRAPH
+ {0xF7FA, 0x9F39}, //21195 #CJK UNIFIED IDEOGRAPH
+ {0xF7FB, 0x9F37}, //21196 #CJK UNIFIED IDEOGRAPH
+ {0xF7FC, 0x9F3D}, //21197 #CJK UNIFIED IDEOGRAPH
+ {0xF7FD, 0x9F3E}, //21198 #CJK UNIFIED IDEOGRAPH
+ {0xF7FE, 0x9F44}, //21199 #CJK UNIFIED IDEOGRAPH
+ {0xF840, 0x9CE3}, //21200 #CJK UNIFIED IDEOGRAPH
+ {0xF841, 0x9CE4}, //21201 #CJK UNIFIED IDEOGRAPH
+ {0xF842, 0x9CE5}, //21202 #CJK UNIFIED IDEOGRAPH
+ {0xF843, 0x9CE6}, //21203 #CJK UNIFIED IDEOGRAPH
+ {0xF844, 0x9CE7}, //21204 #CJK UNIFIED IDEOGRAPH
+ {0xF845, 0x9CE8}, //21205 #CJK UNIFIED IDEOGRAPH
+ {0xF846, 0x9CE9}, //21206 #CJK UNIFIED IDEOGRAPH
+ {0xF847, 0x9CEA}, //21207 #CJK UNIFIED IDEOGRAPH
+ {0xF848, 0x9CEB}, //21208 #CJK UNIFIED IDEOGRAPH
+ {0xF849, 0x9CEC}, //21209 #CJK UNIFIED IDEOGRAPH
+ {0xF84A, 0x9CED}, //21210 #CJK UNIFIED IDEOGRAPH
+ {0xF84B, 0x9CEE}, //21211 #CJK UNIFIED IDEOGRAPH
+ {0xF84C, 0x9CEF}, //21212 #CJK UNIFIED IDEOGRAPH
+ {0xF84D, 0x9CF0}, //21213 #CJK UNIFIED IDEOGRAPH
+ {0xF84E, 0x9CF1}, //21214 #CJK UNIFIED IDEOGRAPH
+ {0xF84F, 0x9CF2}, //21215 #CJK UNIFIED IDEOGRAPH
+ {0xF850, 0x9CF3}, //21216 #CJK UNIFIED IDEOGRAPH
+ {0xF851, 0x9CF4}, //21217 #CJK UNIFIED IDEOGRAPH
+ {0xF852, 0x9CF5}, //21218 #CJK UNIFIED IDEOGRAPH
+ {0xF853, 0x9CF6}, //21219 #CJK UNIFIED IDEOGRAPH
+ {0xF854, 0x9CF7}, //21220 #CJK UNIFIED IDEOGRAPH
+ {0xF855, 0x9CF8}, //21221 #CJK UNIFIED IDEOGRAPH
+ {0xF856, 0x9CF9}, //21222 #CJK UNIFIED IDEOGRAPH
+ {0xF857, 0x9CFA}, //21223 #CJK UNIFIED IDEOGRAPH
+ {0xF858, 0x9CFB}, //21224 #CJK UNIFIED IDEOGRAPH
+ {0xF859, 0x9CFC}, //21225 #CJK UNIFIED IDEOGRAPH
+ {0xF85A, 0x9CFD}, //21226 #CJK UNIFIED IDEOGRAPH
+ {0xF85B, 0x9CFE}, //21227 #CJK UNIFIED IDEOGRAPH
+ {0xF85C, 0x9CFF}, //21228 #CJK UNIFIED IDEOGRAPH
+ {0xF85D, 0x9D00}, //21229 #CJK UNIFIED IDEOGRAPH
+ {0xF85E, 0x9D01}, //21230 #CJK UNIFIED IDEOGRAPH
+ {0xF85F, 0x9D02}, //21231 #CJK UNIFIED IDEOGRAPH
+ {0xF860, 0x9D03}, //21232 #CJK UNIFIED IDEOGRAPH
+ {0xF861, 0x9D04}, //21233 #CJK UNIFIED IDEOGRAPH
+ {0xF862, 0x9D05}, //21234 #CJK UNIFIED IDEOGRAPH
+ {0xF863, 0x9D06}, //21235 #CJK UNIFIED IDEOGRAPH
+ {0xF864, 0x9D07}, //21236 #CJK UNIFIED IDEOGRAPH
+ {0xF865, 0x9D08}, //21237 #CJK UNIFIED IDEOGRAPH
+ {0xF866, 0x9D09}, //21238 #CJK UNIFIED IDEOGRAPH
+ {0xF867, 0x9D0A}, //21239 #CJK UNIFIED IDEOGRAPH
+ {0xF868, 0x9D0B}, //21240 #CJK UNIFIED IDEOGRAPH
+ {0xF869, 0x9D0C}, //21241 #CJK UNIFIED IDEOGRAPH
+ {0xF86A, 0x9D0D}, //21242 #CJK UNIFIED IDEOGRAPH
+ {0xF86B, 0x9D0E}, //21243 #CJK UNIFIED IDEOGRAPH
+ {0xF86C, 0x9D0F}, //21244 #CJK UNIFIED IDEOGRAPH
+ {0xF86D, 0x9D10}, //21245 #CJK UNIFIED IDEOGRAPH
+ {0xF86E, 0x9D11}, //21246 #CJK UNIFIED IDEOGRAPH
+ {0xF86F, 0x9D12}, //21247 #CJK UNIFIED IDEOGRAPH
+ {0xF870, 0x9D13}, //21248 #CJK UNIFIED IDEOGRAPH
+ {0xF871, 0x9D14}, //21249 #CJK UNIFIED IDEOGRAPH
+ {0xF872, 0x9D15}, //21250 #CJK UNIFIED IDEOGRAPH
+ {0xF873, 0x9D16}, //21251 #CJK UNIFIED IDEOGRAPH
+ {0xF874, 0x9D17}, //21252 #CJK UNIFIED IDEOGRAPH
+ {0xF875, 0x9D18}, //21253 #CJK UNIFIED IDEOGRAPH
+ {0xF876, 0x9D19}, //21254 #CJK UNIFIED IDEOGRAPH
+ {0xF877, 0x9D1A}, //21255 #CJK UNIFIED IDEOGRAPH
+ {0xF878, 0x9D1B}, //21256 #CJK UNIFIED IDEOGRAPH
+ {0xF879, 0x9D1C}, //21257 #CJK UNIFIED IDEOGRAPH
+ {0xF87A, 0x9D1D}, //21258 #CJK UNIFIED IDEOGRAPH
+ {0xF87B, 0x9D1E}, //21259 #CJK UNIFIED IDEOGRAPH
+ {0xF87C, 0x9D1F}, //21260 #CJK UNIFIED IDEOGRAPH
+ {0xF87D, 0x9D20}, //21261 #CJK UNIFIED IDEOGRAPH
+ {0xF87E, 0x9D21}, //21262 #CJK UNIFIED IDEOGRAPH
+ {0xF880, 0x9D22}, //21263 #CJK UNIFIED IDEOGRAPH
+ {0xF881, 0x9D23}, //21264 #CJK UNIFIED IDEOGRAPH
+ {0xF882, 0x9D24}, //21265 #CJK UNIFIED IDEOGRAPH
+ {0xF883, 0x9D25}, //21266 #CJK UNIFIED IDEOGRAPH
+ {0xF884, 0x9D26}, //21267 #CJK UNIFIED IDEOGRAPH
+ {0xF885, 0x9D27}, //21268 #CJK UNIFIED IDEOGRAPH
+ {0xF886, 0x9D28}, //21269 #CJK UNIFIED IDEOGRAPH
+ {0xF887, 0x9D29}, //21270 #CJK UNIFIED IDEOGRAPH
+ {0xF888, 0x9D2A}, //21271 #CJK UNIFIED IDEOGRAPH
+ {0xF889, 0x9D2B}, //21272 #CJK UNIFIED IDEOGRAPH
+ {0xF88A, 0x9D2C}, //21273 #CJK UNIFIED IDEOGRAPH
+ {0xF88B, 0x9D2D}, //21274 #CJK UNIFIED IDEOGRAPH
+ {0xF88C, 0x9D2E}, //21275 #CJK UNIFIED IDEOGRAPH
+ {0xF88D, 0x9D2F}, //21276 #CJK UNIFIED IDEOGRAPH
+ {0xF88E, 0x9D30}, //21277 #CJK UNIFIED IDEOGRAPH
+ {0xF88F, 0x9D31}, //21278 #CJK UNIFIED IDEOGRAPH
+ {0xF890, 0x9D32}, //21279 #CJK UNIFIED IDEOGRAPH
+ {0xF891, 0x9D33}, //21280 #CJK UNIFIED IDEOGRAPH
+ {0xF892, 0x9D34}, //21281 #CJK UNIFIED IDEOGRAPH
+ {0xF893, 0x9D35}, //21282 #CJK UNIFIED IDEOGRAPH
+ {0xF894, 0x9D36}, //21283 #CJK UNIFIED IDEOGRAPH
+ {0xF895, 0x9D37}, //21284 #CJK UNIFIED IDEOGRAPH
+ {0xF896, 0x9D38}, //21285 #CJK UNIFIED IDEOGRAPH
+ {0xF897, 0x9D39}, //21286 #CJK UNIFIED IDEOGRAPH
+ {0xF898, 0x9D3A}, //21287 #CJK UNIFIED IDEOGRAPH
+ {0xF899, 0x9D3B}, //21288 #CJK UNIFIED IDEOGRAPH
+ {0xF89A, 0x9D3C}, //21289 #CJK UNIFIED IDEOGRAPH
+ {0xF89B, 0x9D3D}, //21290 #CJK UNIFIED IDEOGRAPH
+ {0xF89C, 0x9D3E}, //21291 #CJK UNIFIED IDEOGRAPH
+ {0xF89D, 0x9D3F}, //21292 #CJK UNIFIED IDEOGRAPH
+ {0xF89E, 0x9D40}, //21293 #CJK UNIFIED IDEOGRAPH
+ {0xF89F, 0x9D41}, //21294 #CJK UNIFIED IDEOGRAPH
+ {0xF8A0, 0x9D42}, //21295 #CJK UNIFIED IDEOGRAPH
+ {0xF940, 0x9D43}, //21296 #CJK UNIFIED IDEOGRAPH
+ {0xF941, 0x9D44}, //21297 #CJK UNIFIED IDEOGRAPH
+ {0xF942, 0x9D45}, //21298 #CJK UNIFIED IDEOGRAPH
+ {0xF943, 0x9D46}, //21299 #CJK UNIFIED IDEOGRAPH
+ {0xF944, 0x9D47}, //21300 #CJK UNIFIED IDEOGRAPH
+ {0xF945, 0x9D48}, //21301 #CJK UNIFIED IDEOGRAPH
+ {0xF946, 0x9D49}, //21302 #CJK UNIFIED IDEOGRAPH
+ {0xF947, 0x9D4A}, //21303 #CJK UNIFIED IDEOGRAPH
+ {0xF948, 0x9D4B}, //21304 #CJK UNIFIED IDEOGRAPH
+ {0xF949, 0x9D4C}, //21305 #CJK UNIFIED IDEOGRAPH
+ {0xF94A, 0x9D4D}, //21306 #CJK UNIFIED IDEOGRAPH
+ {0xF94B, 0x9D4E}, //21307 #CJK UNIFIED IDEOGRAPH
+ {0xF94C, 0x9D4F}, //21308 #CJK UNIFIED IDEOGRAPH
+ {0xF94D, 0x9D50}, //21309 #CJK UNIFIED IDEOGRAPH
+ {0xF94E, 0x9D51}, //21310 #CJK UNIFIED IDEOGRAPH
+ {0xF94F, 0x9D52}, //21311 #CJK UNIFIED IDEOGRAPH
+ {0xF950, 0x9D53}, //21312 #CJK UNIFIED IDEOGRAPH
+ {0xF951, 0x9D54}, //21313 #CJK UNIFIED IDEOGRAPH
+ {0xF952, 0x9D55}, //21314 #CJK UNIFIED IDEOGRAPH
+ {0xF953, 0x9D56}, //21315 #CJK UNIFIED IDEOGRAPH
+ {0xF954, 0x9D57}, //21316 #CJK UNIFIED IDEOGRAPH
+ {0xF955, 0x9D58}, //21317 #CJK UNIFIED IDEOGRAPH
+ {0xF956, 0x9D59}, //21318 #CJK UNIFIED IDEOGRAPH
+ {0xF957, 0x9D5A}, //21319 #CJK UNIFIED IDEOGRAPH
+ {0xF958, 0x9D5B}, //21320 #CJK UNIFIED IDEOGRAPH
+ {0xF959, 0x9D5C}, //21321 #CJK UNIFIED IDEOGRAPH
+ {0xF95A, 0x9D5D}, //21322 #CJK UNIFIED IDEOGRAPH
+ {0xF95B, 0x9D5E}, //21323 #CJK UNIFIED IDEOGRAPH
+ {0xF95C, 0x9D5F}, //21324 #CJK UNIFIED IDEOGRAPH
+ {0xF95D, 0x9D60}, //21325 #CJK UNIFIED IDEOGRAPH
+ {0xF95E, 0x9D61}, //21326 #CJK UNIFIED IDEOGRAPH
+ {0xF95F, 0x9D62}, //21327 #CJK UNIFIED IDEOGRAPH
+ {0xF960, 0x9D63}, //21328 #CJK UNIFIED IDEOGRAPH
+ {0xF961, 0x9D64}, //21329 #CJK UNIFIED IDEOGRAPH
+ {0xF962, 0x9D65}, //21330 #CJK UNIFIED IDEOGRAPH
+ {0xF963, 0x9D66}, //21331 #CJK UNIFIED IDEOGRAPH
+ {0xF964, 0x9D67}, //21332 #CJK UNIFIED IDEOGRAPH
+ {0xF965, 0x9D68}, //21333 #CJK UNIFIED IDEOGRAPH
+ {0xF966, 0x9D69}, //21334 #CJK UNIFIED IDEOGRAPH
+ {0xF967, 0x9D6A}, //21335 #CJK UNIFIED IDEOGRAPH
+ {0xF968, 0x9D6B}, //21336 #CJK UNIFIED IDEOGRAPH
+ {0xF969, 0x9D6C}, //21337 #CJK UNIFIED IDEOGRAPH
+ {0xF96A, 0x9D6D}, //21338 #CJK UNIFIED IDEOGRAPH
+ {0xF96B, 0x9D6E}, //21339 #CJK UNIFIED IDEOGRAPH
+ {0xF96C, 0x9D6F}, //21340 #CJK UNIFIED IDEOGRAPH
+ {0xF96D, 0x9D70}, //21341 #CJK UNIFIED IDEOGRAPH
+ {0xF96E, 0x9D71}, //21342 #CJK UNIFIED IDEOGRAPH
+ {0xF96F, 0x9D72}, //21343 #CJK UNIFIED IDEOGRAPH
+ {0xF970, 0x9D73}, //21344 #CJK UNIFIED IDEOGRAPH
+ {0xF971, 0x9D74}, //21345 #CJK UNIFIED IDEOGRAPH
+ {0xF972, 0x9D75}, //21346 #CJK UNIFIED IDEOGRAPH
+ {0xF973, 0x9D76}, //21347 #CJK UNIFIED IDEOGRAPH
+ {0xF974, 0x9D77}, //21348 #CJK UNIFIED IDEOGRAPH
+ {0xF975, 0x9D78}, //21349 #CJK UNIFIED IDEOGRAPH
+ {0xF976, 0x9D79}, //21350 #CJK UNIFIED IDEOGRAPH
+ {0xF977, 0x9D7A}, //21351 #CJK UNIFIED IDEOGRAPH
+ {0xF978, 0x9D7B}, //21352 #CJK UNIFIED IDEOGRAPH
+ {0xF979, 0x9D7C}, //21353 #CJK UNIFIED IDEOGRAPH
+ {0xF97A, 0x9D7D}, //21354 #CJK UNIFIED IDEOGRAPH
+ {0xF97B, 0x9D7E}, //21355 #CJK UNIFIED IDEOGRAPH
+ {0xF97C, 0x9D7F}, //21356 #CJK UNIFIED IDEOGRAPH
+ {0xF97D, 0x9D80}, //21357 #CJK UNIFIED IDEOGRAPH
+ {0xF97E, 0x9D81}, //21358 #CJK UNIFIED IDEOGRAPH
+ {0xF980, 0x9D82}, //21359 #CJK UNIFIED IDEOGRAPH
+ {0xF981, 0x9D83}, //21360 #CJK UNIFIED IDEOGRAPH
+ {0xF982, 0x9D84}, //21361 #CJK UNIFIED IDEOGRAPH
+ {0xF983, 0x9D85}, //21362 #CJK UNIFIED IDEOGRAPH
+ {0xF984, 0x9D86}, //21363 #CJK UNIFIED IDEOGRAPH
+ {0xF985, 0x9D87}, //21364 #CJK UNIFIED IDEOGRAPH
+ {0xF986, 0x9D88}, //21365 #CJK UNIFIED IDEOGRAPH
+ {0xF987, 0x9D89}, //21366 #CJK UNIFIED IDEOGRAPH
+ {0xF988, 0x9D8A}, //21367 #CJK UNIFIED IDEOGRAPH
+ {0xF989, 0x9D8B}, //21368 #CJK UNIFIED IDEOGRAPH
+ {0xF98A, 0x9D8C}, //21369 #CJK UNIFIED IDEOGRAPH
+ {0xF98B, 0x9D8D}, //21370 #CJK UNIFIED IDEOGRAPH
+ {0xF98C, 0x9D8E}, //21371 #CJK UNIFIED IDEOGRAPH
+ {0xF98D, 0x9D8F}, //21372 #CJK UNIFIED IDEOGRAPH
+ {0xF98E, 0x9D90}, //21373 #CJK UNIFIED IDEOGRAPH
+ {0xF98F, 0x9D91}, //21374 #CJK UNIFIED IDEOGRAPH
+ {0xF990, 0x9D92}, //21375 #CJK UNIFIED IDEOGRAPH
+ {0xF991, 0x9D93}, //21376 #CJK UNIFIED IDEOGRAPH
+ {0xF992, 0x9D94}, //21377 #CJK UNIFIED IDEOGRAPH
+ {0xF993, 0x9D95}, //21378 #CJK UNIFIED IDEOGRAPH
+ {0xF994, 0x9D96}, //21379 #CJK UNIFIED IDEOGRAPH
+ {0xF995, 0x9D97}, //21380 #CJK UNIFIED IDEOGRAPH
+ {0xF996, 0x9D98}, //21381 #CJK UNIFIED IDEOGRAPH
+ {0xF997, 0x9D99}, //21382 #CJK UNIFIED IDEOGRAPH
+ {0xF998, 0x9D9A}, //21383 #CJK UNIFIED IDEOGRAPH
+ {0xF999, 0x9D9B}, //21384 #CJK UNIFIED IDEOGRAPH
+ {0xF99A, 0x9D9C}, //21385 #CJK UNIFIED IDEOGRAPH
+ {0xF99B, 0x9D9D}, //21386 #CJK UNIFIED IDEOGRAPH
+ {0xF99C, 0x9D9E}, //21387 #CJK UNIFIED IDEOGRAPH
+ {0xF99D, 0x9D9F}, //21388 #CJK UNIFIED IDEOGRAPH
+ {0xF99E, 0x9DA0}, //21389 #CJK UNIFIED IDEOGRAPH
+ {0xF99F, 0x9DA1}, //21390 #CJK UNIFIED IDEOGRAPH
+ {0xF9A0, 0x9DA2}, //21391 #CJK UNIFIED IDEOGRAPH
+ {0xFA40, 0x9DA3}, //21392 #CJK UNIFIED IDEOGRAPH
+ {0xFA41, 0x9DA4}, //21393 #CJK UNIFIED IDEOGRAPH
+ {0xFA42, 0x9DA5}, //21394 #CJK UNIFIED IDEOGRAPH
+ {0xFA43, 0x9DA6}, //21395 #CJK UNIFIED IDEOGRAPH
+ {0xFA44, 0x9DA7}, //21396 #CJK UNIFIED IDEOGRAPH
+ {0xFA45, 0x9DA8}, //21397 #CJK UNIFIED IDEOGRAPH
+ {0xFA46, 0x9DA9}, //21398 #CJK UNIFIED IDEOGRAPH
+ {0xFA47, 0x9DAA}, //21399 #CJK UNIFIED IDEOGRAPH
+ {0xFA48, 0x9DAB}, //21400 #CJK UNIFIED IDEOGRAPH
+ {0xFA49, 0x9DAC}, //21401 #CJK UNIFIED IDEOGRAPH
+ {0xFA4A, 0x9DAD}, //21402 #CJK UNIFIED IDEOGRAPH
+ {0xFA4B, 0x9DAE}, //21403 #CJK UNIFIED IDEOGRAPH
+ {0xFA4C, 0x9DAF}, //21404 #CJK UNIFIED IDEOGRAPH
+ {0xFA4D, 0x9DB0}, //21405 #CJK UNIFIED IDEOGRAPH
+ {0xFA4E, 0x9DB1}, //21406 #CJK UNIFIED IDEOGRAPH
+ {0xFA4F, 0x9DB2}, //21407 #CJK UNIFIED IDEOGRAPH
+ {0xFA50, 0x9DB3}, //21408 #CJK UNIFIED IDEOGRAPH
+ {0xFA51, 0x9DB4}, //21409 #CJK UNIFIED IDEOGRAPH
+ {0xFA52, 0x9DB5}, //21410 #CJK UNIFIED IDEOGRAPH
+ {0xFA53, 0x9DB6}, //21411 #CJK UNIFIED IDEOGRAPH
+ {0xFA54, 0x9DB7}, //21412 #CJK UNIFIED IDEOGRAPH
+ {0xFA55, 0x9DB8}, //21413 #CJK UNIFIED IDEOGRAPH
+ {0xFA56, 0x9DB9}, //21414 #CJK UNIFIED IDEOGRAPH
+ {0xFA57, 0x9DBA}, //21415 #CJK UNIFIED IDEOGRAPH
+ {0xFA58, 0x9DBB}, //21416 #CJK UNIFIED IDEOGRAPH
+ {0xFA59, 0x9DBC}, //21417 #CJK UNIFIED IDEOGRAPH
+ {0xFA5A, 0x9DBD}, //21418 #CJK UNIFIED IDEOGRAPH
+ {0xFA5B, 0x9DBE}, //21419 #CJK UNIFIED IDEOGRAPH
+ {0xFA5C, 0x9DBF}, //21420 #CJK UNIFIED IDEOGRAPH
+ {0xFA5D, 0x9DC0}, //21421 #CJK UNIFIED IDEOGRAPH
+ {0xFA5E, 0x9DC1}, //21422 #CJK UNIFIED IDEOGRAPH
+ {0xFA5F, 0x9DC2}, //21423 #CJK UNIFIED IDEOGRAPH
+ {0xFA60, 0x9DC3}, //21424 #CJK UNIFIED IDEOGRAPH
+ {0xFA61, 0x9DC4}, //21425 #CJK UNIFIED IDEOGRAPH
+ {0xFA62, 0x9DC5}, //21426 #CJK UNIFIED IDEOGRAPH
+ {0xFA63, 0x9DC6}, //21427 #CJK UNIFIED IDEOGRAPH
+ {0xFA64, 0x9DC7}, //21428 #CJK UNIFIED IDEOGRAPH
+ {0xFA65, 0x9DC8}, //21429 #CJK UNIFIED IDEOGRAPH
+ {0xFA66, 0x9DC9}, //21430 #CJK UNIFIED IDEOGRAPH
+ {0xFA67, 0x9DCA}, //21431 #CJK UNIFIED IDEOGRAPH
+ {0xFA68, 0x9DCB}, //21432 #CJK UNIFIED IDEOGRAPH
+ {0xFA69, 0x9DCC}, //21433 #CJK UNIFIED IDEOGRAPH
+ {0xFA6A, 0x9DCD}, //21434 #CJK UNIFIED IDEOGRAPH
+ {0xFA6B, 0x9DCE}, //21435 #CJK UNIFIED IDEOGRAPH
+ {0xFA6C, 0x9DCF}, //21436 #CJK UNIFIED IDEOGRAPH
+ {0xFA6D, 0x9DD0}, //21437 #CJK UNIFIED IDEOGRAPH
+ {0xFA6E, 0x9DD1}, //21438 #CJK UNIFIED IDEOGRAPH
+ {0xFA6F, 0x9DD2}, //21439 #CJK UNIFIED IDEOGRAPH
+ {0xFA70, 0x9DD3}, //21440 #CJK UNIFIED IDEOGRAPH
+ {0xFA71, 0x9DD4}, //21441 #CJK UNIFIED IDEOGRAPH
+ {0xFA72, 0x9DD5}, //21442 #CJK UNIFIED IDEOGRAPH
+ {0xFA73, 0x9DD6}, //21443 #CJK UNIFIED IDEOGRAPH
+ {0xFA74, 0x9DD7}, //21444 #CJK UNIFIED IDEOGRAPH
+ {0xFA75, 0x9DD8}, //21445 #CJK UNIFIED IDEOGRAPH
+ {0xFA76, 0x9DD9}, //21446 #CJK UNIFIED IDEOGRAPH
+ {0xFA77, 0x9DDA}, //21447 #CJK UNIFIED IDEOGRAPH
+ {0xFA78, 0x9DDB}, //21448 #CJK UNIFIED IDEOGRAPH
+ {0xFA79, 0x9DDC}, //21449 #CJK UNIFIED IDEOGRAPH
+ {0xFA7A, 0x9DDD}, //21450 #CJK UNIFIED IDEOGRAPH
+ {0xFA7B, 0x9DDE}, //21451 #CJK UNIFIED IDEOGRAPH
+ {0xFA7C, 0x9DDF}, //21452 #CJK UNIFIED IDEOGRAPH
+ {0xFA7D, 0x9DE0}, //21453 #CJK UNIFIED IDEOGRAPH
+ {0xFA7E, 0x9DE1}, //21454 #CJK UNIFIED IDEOGRAPH
+ {0xFA80, 0x9DE2}, //21455 #CJK UNIFIED IDEOGRAPH
+ {0xFA81, 0x9DE3}, //21456 #CJK UNIFIED IDEOGRAPH
+ {0xFA82, 0x9DE4}, //21457 #CJK UNIFIED IDEOGRAPH
+ {0xFA83, 0x9DE5}, //21458 #CJK UNIFIED IDEOGRAPH
+ {0xFA84, 0x9DE6}, //21459 #CJK UNIFIED IDEOGRAPH
+ {0xFA85, 0x9DE7}, //21460 #CJK UNIFIED IDEOGRAPH
+ {0xFA86, 0x9DE8}, //21461 #CJK UNIFIED IDEOGRAPH
+ {0xFA87, 0x9DE9}, //21462 #CJK UNIFIED IDEOGRAPH
+ {0xFA88, 0x9DEA}, //21463 #CJK UNIFIED IDEOGRAPH
+ {0xFA89, 0x9DEB}, //21464 #CJK UNIFIED IDEOGRAPH
+ {0xFA8A, 0x9DEC}, //21465 #CJK UNIFIED IDEOGRAPH
+ {0xFA8B, 0x9DED}, //21466 #CJK UNIFIED IDEOGRAPH
+ {0xFA8C, 0x9DEE}, //21467 #CJK UNIFIED IDEOGRAPH
+ {0xFA8D, 0x9DEF}, //21468 #CJK UNIFIED IDEOGRAPH
+ {0xFA8E, 0x9DF0}, //21469 #CJK UNIFIED IDEOGRAPH
+ {0xFA8F, 0x9DF1}, //21470 #CJK UNIFIED IDEOGRAPH
+ {0xFA90, 0x9DF2}, //21471 #CJK UNIFIED IDEOGRAPH
+ {0xFA91, 0x9DF3}, //21472 #CJK UNIFIED IDEOGRAPH
+ {0xFA92, 0x9DF4}, //21473 #CJK UNIFIED IDEOGRAPH
+ {0xFA93, 0x9DF5}, //21474 #CJK UNIFIED IDEOGRAPH
+ {0xFA94, 0x9DF6}, //21475 #CJK UNIFIED IDEOGRAPH
+ {0xFA95, 0x9DF7}, //21476 #CJK UNIFIED IDEOGRAPH
+ {0xFA96, 0x9DF8}, //21477 #CJK UNIFIED IDEOGRAPH
+ {0xFA97, 0x9DF9}, //21478 #CJK UNIFIED IDEOGRAPH
+ {0xFA98, 0x9DFA}, //21479 #CJK UNIFIED IDEOGRAPH
+ {0xFA99, 0x9DFB}, //21480 #CJK UNIFIED IDEOGRAPH
+ {0xFA9A, 0x9DFC}, //21481 #CJK UNIFIED IDEOGRAPH
+ {0xFA9B, 0x9DFD}, //21482 #CJK UNIFIED IDEOGRAPH
+ {0xFA9C, 0x9DFE}, //21483 #CJK UNIFIED IDEOGRAPH
+ {0xFA9D, 0x9DFF}, //21484 #CJK UNIFIED IDEOGRAPH
+ {0xFA9E, 0x9E00}, //21485 #CJK UNIFIED IDEOGRAPH
+ {0xFA9F, 0x9E01}, //21486 #CJK UNIFIED IDEOGRAPH
+ {0xFAA0, 0x9E02}, //21487 #CJK UNIFIED IDEOGRAPH
+ {0xFB40, 0x9E03}, //21488 #CJK UNIFIED IDEOGRAPH
+ {0xFB41, 0x9E04}, //21489 #CJK UNIFIED IDEOGRAPH
+ {0xFB42, 0x9E05}, //21490 #CJK UNIFIED IDEOGRAPH
+ {0xFB43, 0x9E06}, //21491 #CJK UNIFIED IDEOGRAPH
+ {0xFB44, 0x9E07}, //21492 #CJK UNIFIED IDEOGRAPH
+ {0xFB45, 0x9E08}, //21493 #CJK UNIFIED IDEOGRAPH
+ {0xFB46, 0x9E09}, //21494 #CJK UNIFIED IDEOGRAPH
+ {0xFB47, 0x9E0A}, //21495 #CJK UNIFIED IDEOGRAPH
+ {0xFB48, 0x9E0B}, //21496 #CJK UNIFIED IDEOGRAPH
+ {0xFB49, 0x9E0C}, //21497 #CJK UNIFIED IDEOGRAPH
+ {0xFB4A, 0x9E0D}, //21498 #CJK UNIFIED IDEOGRAPH
+ {0xFB4B, 0x9E0E}, //21499 #CJK UNIFIED IDEOGRAPH
+ {0xFB4C, 0x9E0F}, //21500 #CJK UNIFIED IDEOGRAPH
+ {0xFB4D, 0x9E10}, //21501 #CJK UNIFIED IDEOGRAPH
+ {0xFB4E, 0x9E11}, //21502 #CJK UNIFIED IDEOGRAPH
+ {0xFB4F, 0x9E12}, //21503 #CJK UNIFIED IDEOGRAPH
+ {0xFB50, 0x9E13}, //21504 #CJK UNIFIED IDEOGRAPH
+ {0xFB51, 0x9E14}, //21505 #CJK UNIFIED IDEOGRAPH
+ {0xFB52, 0x9E15}, //21506 #CJK UNIFIED IDEOGRAPH
+ {0xFB53, 0x9E16}, //21507 #CJK UNIFIED IDEOGRAPH
+ {0xFB54, 0x9E17}, //21508 #CJK UNIFIED IDEOGRAPH
+ {0xFB55, 0x9E18}, //21509 #CJK UNIFIED IDEOGRAPH
+ {0xFB56, 0x9E19}, //21510 #CJK UNIFIED IDEOGRAPH
+ {0xFB57, 0x9E1A}, //21511 #CJK UNIFIED IDEOGRAPH
+ {0xFB58, 0x9E1B}, //21512 #CJK UNIFIED IDEOGRAPH
+ {0xFB59, 0x9E1C}, //21513 #CJK UNIFIED IDEOGRAPH
+ {0xFB5A, 0x9E1D}, //21514 #CJK UNIFIED IDEOGRAPH
+ {0xFB5B, 0x9E1E}, //21515 #CJK UNIFIED IDEOGRAPH
+ {0xFB5C, 0x9E24}, //21516 #CJK UNIFIED IDEOGRAPH
+ {0xFB5D, 0x9E27}, //21517 #CJK UNIFIED IDEOGRAPH
+ {0xFB5E, 0x9E2E}, //21518 #CJK UNIFIED IDEOGRAPH
+ {0xFB5F, 0x9E30}, //21519 #CJK UNIFIED IDEOGRAPH
+ {0xFB60, 0x9E34}, //21520 #CJK UNIFIED IDEOGRAPH
+ {0xFB61, 0x9E3B}, //21521 #CJK UNIFIED IDEOGRAPH
+ {0xFB62, 0x9E3C}, //21522 #CJK UNIFIED IDEOGRAPH
+ {0xFB63, 0x9E40}, //21523 #CJK UNIFIED IDEOGRAPH
+ {0xFB64, 0x9E4D}, //21524 #CJK UNIFIED IDEOGRAPH
+ {0xFB65, 0x9E50}, //21525 #CJK UNIFIED IDEOGRAPH
+ {0xFB66, 0x9E52}, //21526 #CJK UNIFIED IDEOGRAPH
+ {0xFB67, 0x9E53}, //21527 #CJK UNIFIED IDEOGRAPH
+ {0xFB68, 0x9E54}, //21528 #CJK UNIFIED IDEOGRAPH
+ {0xFB69, 0x9E56}, //21529 #CJK UNIFIED IDEOGRAPH
+ {0xFB6A, 0x9E59}, //21530 #CJK UNIFIED IDEOGRAPH
+ {0xFB6B, 0x9E5D}, //21531 #CJK UNIFIED IDEOGRAPH
+ {0xFB6C, 0x9E5F}, //21532 #CJK UNIFIED IDEOGRAPH
+ {0xFB6D, 0x9E60}, //21533 #CJK UNIFIED IDEOGRAPH
+ {0xFB6E, 0x9E61}, //21534 #CJK UNIFIED IDEOGRAPH
+ {0xFB6F, 0x9E62}, //21535 #CJK UNIFIED IDEOGRAPH
+ {0xFB70, 0x9E65}, //21536 #CJK UNIFIED IDEOGRAPH
+ {0xFB71, 0x9E6E}, //21537 #CJK UNIFIED IDEOGRAPH
+ {0xFB72, 0x9E6F}, //21538 #CJK UNIFIED IDEOGRAPH
+ {0xFB73, 0x9E72}, //21539 #CJK UNIFIED IDEOGRAPH
+ {0xFB74, 0x9E74}, //21540 #CJK UNIFIED IDEOGRAPH
+ {0xFB75, 0x9E75}, //21541 #CJK UNIFIED IDEOGRAPH
+ {0xFB76, 0x9E76}, //21542 #CJK UNIFIED IDEOGRAPH
+ {0xFB77, 0x9E77}, //21543 #CJK UNIFIED IDEOGRAPH
+ {0xFB78, 0x9E78}, //21544 #CJK UNIFIED IDEOGRAPH
+ {0xFB79, 0x9E79}, //21545 #CJK UNIFIED IDEOGRAPH
+ {0xFB7A, 0x9E7A}, //21546 #CJK UNIFIED IDEOGRAPH
+ {0xFB7B, 0x9E7B}, //21547 #CJK UNIFIED IDEOGRAPH
+ {0xFB7C, 0x9E7C}, //21548 #CJK UNIFIED IDEOGRAPH
+ {0xFB7D, 0x9E7D}, //21549 #CJK UNIFIED IDEOGRAPH
+ {0xFB7E, 0x9E80}, //21550 #CJK UNIFIED IDEOGRAPH
+ {0xFB80, 0x9E81}, //21551 #CJK UNIFIED IDEOGRAPH
+ {0xFB81, 0x9E83}, //21552 #CJK UNIFIED IDEOGRAPH
+ {0xFB82, 0x9E84}, //21553 #CJK UNIFIED IDEOGRAPH
+ {0xFB83, 0x9E85}, //21554 #CJK UNIFIED IDEOGRAPH
+ {0xFB84, 0x9E86}, //21555 #CJK UNIFIED IDEOGRAPH
+ {0xFB85, 0x9E89}, //21556 #CJK UNIFIED IDEOGRAPH
+ {0xFB86, 0x9E8A}, //21557 #CJK UNIFIED IDEOGRAPH
+ {0xFB87, 0x9E8C}, //21558 #CJK UNIFIED IDEOGRAPH
+ {0xFB88, 0x9E8D}, //21559 #CJK UNIFIED IDEOGRAPH
+ {0xFB89, 0x9E8E}, //21560 #CJK UNIFIED IDEOGRAPH
+ {0xFB8A, 0x9E8F}, //21561 #CJK UNIFIED IDEOGRAPH
+ {0xFB8B, 0x9E90}, //21562 #CJK UNIFIED IDEOGRAPH
+ {0xFB8C, 0x9E91}, //21563 #CJK UNIFIED IDEOGRAPH
+ {0xFB8D, 0x9E94}, //21564 #CJK UNIFIED IDEOGRAPH
+ {0xFB8E, 0x9E95}, //21565 #CJK UNIFIED IDEOGRAPH
+ {0xFB8F, 0x9E96}, //21566 #CJK UNIFIED IDEOGRAPH
+ {0xFB90, 0x9E97}, //21567 #CJK UNIFIED IDEOGRAPH
+ {0xFB91, 0x9E98}, //21568 #CJK UNIFIED IDEOGRAPH
+ {0xFB92, 0x9E99}, //21569 #CJK UNIFIED IDEOGRAPH
+ {0xFB93, 0x9E9A}, //21570 #CJK UNIFIED IDEOGRAPH
+ {0xFB94, 0x9E9B}, //21571 #CJK UNIFIED IDEOGRAPH
+ {0xFB95, 0x9E9C}, //21572 #CJK UNIFIED IDEOGRAPH
+ {0xFB96, 0x9E9E}, //21573 #CJK UNIFIED IDEOGRAPH
+ {0xFB97, 0x9EA0}, //21574 #CJK UNIFIED IDEOGRAPH
+ {0xFB98, 0x9EA1}, //21575 #CJK UNIFIED IDEOGRAPH
+ {0xFB99, 0x9EA2}, //21576 #CJK UNIFIED IDEOGRAPH
+ {0xFB9A, 0x9EA3}, //21577 #CJK UNIFIED IDEOGRAPH
+ {0xFB9B, 0x9EA4}, //21578 #CJK UNIFIED IDEOGRAPH
+ {0xFB9C, 0x9EA5}, //21579 #CJK UNIFIED IDEOGRAPH
+ {0xFB9D, 0x9EA7}, //21580 #CJK UNIFIED IDEOGRAPH
+ {0xFB9E, 0x9EA8}, //21581 #CJK UNIFIED IDEOGRAPH
+ {0xFB9F, 0x9EA9}, //21582 #CJK UNIFIED IDEOGRAPH
+ {0xFBA0, 0x9EAA}, //21583 #CJK UNIFIED IDEOGRAPH
+ {0xFC40, 0x9EAB}, //21584 #CJK UNIFIED IDEOGRAPH
+ {0xFC41, 0x9EAC}, //21585 #CJK UNIFIED IDEOGRAPH
+ {0xFC42, 0x9EAD}, //21586 #CJK UNIFIED IDEOGRAPH
+ {0xFC43, 0x9EAE}, //21587 #CJK UNIFIED IDEOGRAPH
+ {0xFC44, 0x9EAF}, //21588 #CJK UNIFIED IDEOGRAPH
+ {0xFC45, 0x9EB0}, //21589 #CJK UNIFIED IDEOGRAPH
+ {0xFC46, 0x9EB1}, //21590 #CJK UNIFIED IDEOGRAPH
+ {0xFC47, 0x9EB2}, //21591 #CJK UNIFIED IDEOGRAPH
+ {0xFC48, 0x9EB3}, //21592 #CJK UNIFIED IDEOGRAPH
+ {0xFC49, 0x9EB5}, //21593 #CJK UNIFIED IDEOGRAPH
+ {0xFC4A, 0x9EB6}, //21594 #CJK UNIFIED IDEOGRAPH
+ {0xFC4B, 0x9EB7}, //21595 #CJK UNIFIED IDEOGRAPH
+ {0xFC4C, 0x9EB9}, //21596 #CJK UNIFIED IDEOGRAPH
+ {0xFC4D, 0x9EBA}, //21597 #CJK UNIFIED IDEOGRAPH
+ {0xFC4E, 0x9EBC}, //21598 #CJK UNIFIED IDEOGRAPH
+ {0xFC4F, 0x9EBF}, //21599 #CJK UNIFIED IDEOGRAPH
+ {0xFC50, 0x9EC0}, //21600 #CJK UNIFIED IDEOGRAPH
+ {0xFC51, 0x9EC1}, //21601 #CJK UNIFIED IDEOGRAPH
+ {0xFC52, 0x9EC2}, //21602 #CJK UNIFIED IDEOGRAPH
+ {0xFC53, 0x9EC3}, //21603 #CJK UNIFIED IDEOGRAPH
+ {0xFC54, 0x9EC5}, //21604 #CJK UNIFIED IDEOGRAPH
+ {0xFC55, 0x9EC6}, //21605 #CJK UNIFIED IDEOGRAPH
+ {0xFC56, 0x9EC7}, //21606 #CJK UNIFIED IDEOGRAPH
+ {0xFC57, 0x9EC8}, //21607 #CJK UNIFIED IDEOGRAPH
+ {0xFC58, 0x9ECA}, //21608 #CJK UNIFIED IDEOGRAPH
+ {0xFC59, 0x9ECB}, //21609 #CJK UNIFIED IDEOGRAPH
+ {0xFC5A, 0x9ECC}, //21610 #CJK UNIFIED IDEOGRAPH
+ {0xFC5B, 0x9ED0}, //21611 #CJK UNIFIED IDEOGRAPH
+ {0xFC5C, 0x9ED2}, //21612 #CJK UNIFIED IDEOGRAPH
+ {0xFC5D, 0x9ED3}, //21613 #CJK UNIFIED IDEOGRAPH
+ {0xFC5E, 0x9ED5}, //21614 #CJK UNIFIED IDEOGRAPH
+ {0xFC5F, 0x9ED6}, //21615 #CJK UNIFIED IDEOGRAPH
+ {0xFC60, 0x9ED7}, //21616 #CJK UNIFIED IDEOGRAPH
+ {0xFC61, 0x9ED9}, //21617 #CJK UNIFIED IDEOGRAPH
+ {0xFC62, 0x9EDA}, //21618 #CJK UNIFIED IDEOGRAPH
+ {0xFC63, 0x9EDE}, //21619 #CJK UNIFIED IDEOGRAPH
+ {0xFC64, 0x9EE1}, //21620 #CJK UNIFIED IDEOGRAPH
+ {0xFC65, 0x9EE3}, //21621 #CJK UNIFIED IDEOGRAPH
+ {0xFC66, 0x9EE4}, //21622 #CJK UNIFIED IDEOGRAPH
+ {0xFC67, 0x9EE6}, //21623 #CJK UNIFIED IDEOGRAPH
+ {0xFC68, 0x9EE8}, //21624 #CJK UNIFIED IDEOGRAPH
+ {0xFC69, 0x9EEB}, //21625 #CJK UNIFIED IDEOGRAPH
+ {0xFC6A, 0x9EEC}, //21626 #CJK UNIFIED IDEOGRAPH
+ {0xFC6B, 0x9EED}, //21627 #CJK UNIFIED IDEOGRAPH
+ {0xFC6C, 0x9EEE}, //21628 #CJK UNIFIED IDEOGRAPH
+ {0xFC6D, 0x9EF0}, //21629 #CJK UNIFIED IDEOGRAPH
+ {0xFC6E, 0x9EF1}, //21630 #CJK UNIFIED IDEOGRAPH
+ {0xFC6F, 0x9EF2}, //21631 #CJK UNIFIED IDEOGRAPH
+ {0xFC70, 0x9EF3}, //21632 #CJK UNIFIED IDEOGRAPH
+ {0xFC71, 0x9EF4}, //21633 #CJK UNIFIED IDEOGRAPH
+ {0xFC72, 0x9EF5}, //21634 #CJK UNIFIED IDEOGRAPH
+ {0xFC73, 0x9EF6}, //21635 #CJK UNIFIED IDEOGRAPH
+ {0xFC74, 0x9EF7}, //21636 #CJK UNIFIED IDEOGRAPH
+ {0xFC75, 0x9EF8}, //21637 #CJK UNIFIED IDEOGRAPH
+ {0xFC76, 0x9EFA}, //21638 #CJK UNIFIED IDEOGRAPH
+ {0xFC77, 0x9EFD}, //21639 #CJK UNIFIED IDEOGRAPH
+ {0xFC78, 0x9EFF}, //21640 #CJK UNIFIED IDEOGRAPH
+ {0xFC79, 0x9F00}, //21641 #CJK UNIFIED IDEOGRAPH
+ {0xFC7A, 0x9F01}, //21642 #CJK UNIFIED IDEOGRAPH
+ {0xFC7B, 0x9F02}, //21643 #CJK UNIFIED IDEOGRAPH
+ {0xFC7C, 0x9F03}, //21644 #CJK UNIFIED IDEOGRAPH
+ {0xFC7D, 0x9F04}, //21645 #CJK UNIFIED IDEOGRAPH
+ {0xFC7E, 0x9F05}, //21646 #CJK UNIFIED IDEOGRAPH
+ {0xFC80, 0x9F06}, //21647 #CJK UNIFIED IDEOGRAPH
+ {0xFC81, 0x9F07}, //21648 #CJK UNIFIED IDEOGRAPH
+ {0xFC82, 0x9F08}, //21649 #CJK UNIFIED IDEOGRAPH
+ {0xFC83, 0x9F09}, //21650 #CJK UNIFIED IDEOGRAPH
+ {0xFC84, 0x9F0A}, //21651 #CJK UNIFIED IDEOGRAPH
+ {0xFC85, 0x9F0C}, //21652 #CJK UNIFIED IDEOGRAPH
+ {0xFC86, 0x9F0F}, //21653 #CJK UNIFIED IDEOGRAPH
+ {0xFC87, 0x9F11}, //21654 #CJK UNIFIED IDEOGRAPH
+ {0xFC88, 0x9F12}, //21655 #CJK UNIFIED IDEOGRAPH
+ {0xFC89, 0x9F14}, //21656 #CJK UNIFIED IDEOGRAPH
+ {0xFC8A, 0x9F15}, //21657 #CJK UNIFIED IDEOGRAPH
+ {0xFC8B, 0x9F16}, //21658 #CJK UNIFIED IDEOGRAPH
+ {0xFC8C, 0x9F18}, //21659 #CJK UNIFIED IDEOGRAPH
+ {0xFC8D, 0x9F1A}, //21660 #CJK UNIFIED IDEOGRAPH
+ {0xFC8E, 0x9F1B}, //21661 #CJK UNIFIED IDEOGRAPH
+ {0xFC8F, 0x9F1C}, //21662 #CJK UNIFIED IDEOGRAPH
+ {0xFC90, 0x9F1D}, //21663 #CJK UNIFIED IDEOGRAPH
+ {0xFC91, 0x9F1E}, //21664 #CJK UNIFIED IDEOGRAPH
+ {0xFC92, 0x9F1F}, //21665 #CJK UNIFIED IDEOGRAPH
+ {0xFC93, 0x9F21}, //21666 #CJK UNIFIED IDEOGRAPH
+ {0xFC94, 0x9F23}, //21667 #CJK UNIFIED IDEOGRAPH
+ {0xFC95, 0x9F24}, //21668 #CJK UNIFIED IDEOGRAPH
+ {0xFC96, 0x9F25}, //21669 #CJK UNIFIED IDEOGRAPH
+ {0xFC97, 0x9F26}, //21670 #CJK UNIFIED IDEOGRAPH
+ {0xFC98, 0x9F27}, //21671 #CJK UNIFIED IDEOGRAPH
+ {0xFC99, 0x9F28}, //21672 #CJK UNIFIED IDEOGRAPH
+ {0xFC9A, 0x9F29}, //21673 #CJK UNIFIED IDEOGRAPH
+ {0xFC9B, 0x9F2A}, //21674 #CJK UNIFIED IDEOGRAPH
+ {0xFC9C, 0x9F2B}, //21675 #CJK UNIFIED IDEOGRAPH
+ {0xFC9D, 0x9F2D}, //21676 #CJK UNIFIED IDEOGRAPH
+ {0xFC9E, 0x9F2E}, //21677 #CJK UNIFIED IDEOGRAPH
+ {0xFC9F, 0x9F30}, //21678 #CJK UNIFIED IDEOGRAPH
+ {0xFCA0, 0x9F31}, //21679 #CJK UNIFIED IDEOGRAPH
+ {0xFD40, 0x9F32}, //21680 #CJK UNIFIED IDEOGRAPH
+ {0xFD41, 0x9F33}, //21681 #CJK UNIFIED IDEOGRAPH
+ {0xFD42, 0x9F34}, //21682 #CJK UNIFIED IDEOGRAPH
+ {0xFD43, 0x9F35}, //21683 #CJK UNIFIED IDEOGRAPH
+ {0xFD44, 0x9F36}, //21684 #CJK UNIFIED IDEOGRAPH
+ {0xFD45, 0x9F38}, //21685 #CJK UNIFIED IDEOGRAPH
+ {0xFD46, 0x9F3A}, //21686 #CJK UNIFIED IDEOGRAPH
+ {0xFD47, 0x9F3C}, //21687 #CJK UNIFIED IDEOGRAPH
+ {0xFD48, 0x9F3F}, //21688 #CJK UNIFIED IDEOGRAPH
+ {0xFD49, 0x9F40}, //21689 #CJK UNIFIED IDEOGRAPH
+ {0xFD4A, 0x9F41}, //21690 #CJK UNIFIED IDEOGRAPH
+ {0xFD4B, 0x9F42}, //21691 #CJK UNIFIED IDEOGRAPH
+ {0xFD4C, 0x9F43}, //21692 #CJK UNIFIED IDEOGRAPH
+ {0xFD4D, 0x9F45}, //21693 #CJK UNIFIED IDEOGRAPH
+ {0xFD4E, 0x9F46}, //21694 #CJK UNIFIED IDEOGRAPH
+ {0xFD4F, 0x9F47}, //21695 #CJK UNIFIED IDEOGRAPH
+ {0xFD50, 0x9F48}, //21696 #CJK UNIFIED IDEOGRAPH
+ {0xFD51, 0x9F49}, //21697 #CJK UNIFIED IDEOGRAPH
+ {0xFD52, 0x9F4A}, //21698 #CJK UNIFIED IDEOGRAPH
+ {0xFD53, 0x9F4B}, //21699 #CJK UNIFIED IDEOGRAPH
+ {0xFD54, 0x9F4C}, //21700 #CJK UNIFIED IDEOGRAPH
+ {0xFD55, 0x9F4D}, //21701 #CJK UNIFIED IDEOGRAPH
+ {0xFD56, 0x9F4E}, //21702 #CJK UNIFIED IDEOGRAPH
+ {0xFD57, 0x9F4F}, //21703 #CJK UNIFIED IDEOGRAPH
+ {0xFD58, 0x9F52}, //21704 #CJK UNIFIED IDEOGRAPH
+ {0xFD59, 0x9F53}, //21705 #CJK UNIFIED IDEOGRAPH
+ {0xFD5A, 0x9F54}, //21706 #CJK UNIFIED IDEOGRAPH
+ {0xFD5B, 0x9F55}, //21707 #CJK UNIFIED IDEOGRAPH
+ {0xFD5C, 0x9F56}, //21708 #CJK UNIFIED IDEOGRAPH
+ {0xFD5D, 0x9F57}, //21709 #CJK UNIFIED IDEOGRAPH
+ {0xFD5E, 0x9F58}, //21710 #CJK UNIFIED IDEOGRAPH
+ {0xFD5F, 0x9F59}, //21711 #CJK UNIFIED IDEOGRAPH
+ {0xFD60, 0x9F5A}, //21712 #CJK UNIFIED IDEOGRAPH
+ {0xFD61, 0x9F5B}, //21713 #CJK UNIFIED IDEOGRAPH
+ {0xFD62, 0x9F5C}, //21714 #CJK UNIFIED IDEOGRAPH
+ {0xFD63, 0x9F5D}, //21715 #CJK UNIFIED IDEOGRAPH
+ {0xFD64, 0x9F5E}, //21716 #CJK UNIFIED IDEOGRAPH
+ {0xFD65, 0x9F5F}, //21717 #CJK UNIFIED IDEOGRAPH
+ {0xFD66, 0x9F60}, //21718 #CJK UNIFIED IDEOGRAPH
+ {0xFD67, 0x9F61}, //21719 #CJK UNIFIED IDEOGRAPH
+ {0xFD68, 0x9F62}, //21720 #CJK UNIFIED IDEOGRAPH
+ {0xFD69, 0x9F63}, //21721 #CJK UNIFIED IDEOGRAPH
+ {0xFD6A, 0x9F64}, //21722 #CJK UNIFIED IDEOGRAPH
+ {0xFD6B, 0x9F65}, //21723 #CJK UNIFIED IDEOGRAPH
+ {0xFD6C, 0x9F66}, //21724 #CJK UNIFIED IDEOGRAPH
+ {0xFD6D, 0x9F67}, //21725 #CJK UNIFIED IDEOGRAPH
+ {0xFD6E, 0x9F68}, //21726 #CJK UNIFIED IDEOGRAPH
+ {0xFD6F, 0x9F69}, //21727 #CJK UNIFIED IDEOGRAPH
+ {0xFD70, 0x9F6A}, //21728 #CJK UNIFIED IDEOGRAPH
+ {0xFD71, 0x9F6B}, //21729 #CJK UNIFIED IDEOGRAPH
+ {0xFD72, 0x9F6C}, //21730 #CJK UNIFIED IDEOGRAPH
+ {0xFD73, 0x9F6D}, //21731 #CJK UNIFIED IDEOGRAPH
+ {0xFD74, 0x9F6E}, //21732 #CJK UNIFIED IDEOGRAPH
+ {0xFD75, 0x9F6F}, //21733 #CJK UNIFIED IDEOGRAPH
+ {0xFD76, 0x9F70}, //21734 #CJK UNIFIED IDEOGRAPH
+ {0xFD77, 0x9F71}, //21735 #CJK UNIFIED IDEOGRAPH
+ {0xFD78, 0x9F72}, //21736 #CJK UNIFIED IDEOGRAPH
+ {0xFD79, 0x9F73}, //21737 #CJK UNIFIED IDEOGRAPH
+ {0xFD7A, 0x9F74}, //21738 #CJK UNIFIED IDEOGRAPH
+ {0xFD7B, 0x9F75}, //21739 #CJK UNIFIED IDEOGRAPH
+ {0xFD7C, 0x9F76}, //21740 #CJK UNIFIED IDEOGRAPH
+ {0xFD7D, 0x9F77}, //21741 #CJK UNIFIED IDEOGRAPH
+ {0xFD7E, 0x9F78}, //21742 #CJK UNIFIED IDEOGRAPH
+ {0xFD80, 0x9F79}, //21743 #CJK UNIFIED IDEOGRAPH
+ {0xFD81, 0x9F7A}, //21744 #CJK UNIFIED IDEOGRAPH
+ {0xFD82, 0x9F7B}, //21745 #CJK UNIFIED IDEOGRAPH
+ {0xFD83, 0x9F7C}, //21746 #CJK UNIFIED IDEOGRAPH
+ {0xFD84, 0x9F7D}, //21747 #CJK UNIFIED IDEOGRAPH
+ {0xFD85, 0x9F7E}, //21748 #CJK UNIFIED IDEOGRAPH
+ {0xFD86, 0x9F81}, //21749 #CJK UNIFIED IDEOGRAPH
+ {0xFD87, 0x9F82}, //21750 #CJK UNIFIED IDEOGRAPH
+ {0xFD88, 0x9F8D}, //21751 #CJK UNIFIED IDEOGRAPH
+ {0xFD89, 0x9F8E}, //21752 #CJK UNIFIED IDEOGRAPH
+ {0xFD8A, 0x9F8F}, //21753 #CJK UNIFIED IDEOGRAPH
+ {0xFD8B, 0x9F90}, //21754 #CJK UNIFIED IDEOGRAPH
+ {0xFD8C, 0x9F91}, //21755 #CJK UNIFIED IDEOGRAPH
+ {0xFD8D, 0x9F92}, //21756 #CJK UNIFIED IDEOGRAPH
+ {0xFD8E, 0x9F93}, //21757 #CJK UNIFIED IDEOGRAPH
+ {0xFD8F, 0x9F94}, //21758 #CJK UNIFIED IDEOGRAPH
+ {0xFD90, 0x9F95}, //21759 #CJK UNIFIED IDEOGRAPH
+ {0xFD91, 0x9F96}, //21760 #CJK UNIFIED IDEOGRAPH
+ {0xFD92, 0x9F97}, //21761 #CJK UNIFIED IDEOGRAPH
+ {0xFD93, 0x9F98}, //21762 #CJK UNIFIED IDEOGRAPH
+ {0xFD94, 0x9F9C}, //21763 #CJK UNIFIED IDEOGRAPH
+ {0xFD95, 0x9F9D}, //21764 #CJK UNIFIED IDEOGRAPH
+ {0xFD96, 0x9F9E}, //21765 #CJK UNIFIED IDEOGRAPH
+ {0xFD97, 0x9FA1}, //21766 #CJK UNIFIED IDEOGRAPH
+ {0xFD98, 0x9FA2}, //21767 #CJK UNIFIED IDEOGRAPH
+ {0xFD99, 0x9FA3}, //21768 #CJK UNIFIED IDEOGRAPH
+ {0xFD9A, 0x9FA4}, //21769 #CJK UNIFIED IDEOGRAPH
+ {0xFD9B, 0x9FA5}, //21770 #CJK UNIFIED IDEOGRAPH
+ {0xFD9C, 0xF92C}, //21771 #CJK COMPATIBILITY IDEOGRAPH
+ {0xFD9D, 0xF979}, //21772 #CJK COMPATIBILITY IDEOGRAPH
+ {0xFD9E, 0xF995}, //21773 #CJK COMPATIBILITY IDEOGRAPH
+ {0xFD9F, 0xF9E7}, //21774 #CJK COMPATIBILITY IDEOGRAPH
+ {0xFDA0, 0xF9F1}, //21775 #CJK COMPATIBILITY IDEOGRAPH
+ {0xFE40, 0xFA0C}, //21776 #CJK COMPATIBILITY IDEOGRAPH
+ {0xFE41, 0xFA0D}, //21777 #CJK COMPATIBILITY IDEOGRAPH
+ {0xFE42, 0xFA0E}, //21778 #CJK COMPATIBILITY IDEOGRAPH
+ {0xFE43, 0xFA0F}, //21779 #CJK COMPATIBILITY IDEOGRAPH
+ {0xFE44, 0xFA11}, //21780 #CJK COMPATIBILITY IDEOGRAPH
+ {0xFE45, 0xFA13}, //21781 #CJK COMPATIBILITY IDEOGRAPH
+ {0xFE46, 0xFA14}, //21782 #CJK COMPATIBILITY IDEOGRAPH
+ {0xFE47, 0xFA18}, //21783 #CJK COMPATIBILITY IDEOGRAPH
+ {0xFE48, 0xFA1F}, //21784 #CJK COMPATIBILITY IDEOGRAPH
+ {0xFE49, 0xFA20}, //21785 #CJK COMPATIBILITY IDEOGRAPH
+ {0xFE4A, 0xFA21}, //21786 #CJK COMPATIBILITY IDEOGRAPH
+ {0xFE4B, 0xFA23}, //21787 #CJK COMPATIBILITY IDEOGRAPH
+ {0xFE4C, 0xFA24}, //21788 #CJK COMPATIBILITY IDEOGRAPH
+ {0xFE4D, 0xFA27}, //21789 #CJK COMPATIBILITY IDEOGRAPH
+ {0xFE4E, 0xFA28}, //21790 #CJK COMPATIBILITY IDEOGRAPH
+ {0xFE4F, 0xFA29} //21791 #CJK COMPATIBILITY IDEOGRAPH
+};
+
+#endif // DRW_CPTABLE936_H
--- /dev/null
+#ifndef DRW_CPTABLE949_H
+#define DRW_CPTABLE949_H
+
+//Korean Extended Wansung
+
+//first entry in this table are 0x80
+#define CPOFFSET949 0x80
+#define CPLENGHT949 17048
+#define NOTFOUND949 0x003F
+
+//Table 949 one byte
+static const int DRW_Table949[1] = {
+};
+
+//Table 949 lead byte
+//pairs of start/end in DRW_DoubleTable949
+static const int DRW_LeadTable949[] = {
+ 0, //1#DBCS LEAD BYTE 0x81
+ 178, //2#DBCS LEAD BYTE 0x82
+ 356, //3#DBCS LEAD BYTE 0x83
+ 564, //4#DBCS LEAD BYTE 0x84
+ 712, //5#DBCS LEAD BYTE 0x85
+ 890, //6#DBCS LEAD BYTE 0x86
+ 1068, //7#DBCS LEAD BYTE 0x87
+ 1246, //8#DBCS LEAD BYTE 0x88
+ 1424, //9#DBCS LEAD BYTE 0x89
+ 1602, //10#DBCS LEAD BYTE 0x8A
+ 1780, //11#DBCS LEAD BYTE 0x8B
+ 1958, //12#DBCS LEAD BYTE 0x8C
+ 2136, //13#DBCS LEAD BYTE 0x8D
+ 2314, //14#DBCS LEAD BYTE 0x8E
+ 2492, //15#DBCS LEAD BYTE 0x8F
+ 2670, //16#DBCS LEAD BYTE 0x90
+ 2848, //17#DBCS LEAD BYTE 0x91
+ 3026, //18#DBCS LEAD BYTE 0x92
+ 3204, //19#DBCS LEAD BYTE 0x93
+ 3382, //20#DBCS LEAD BYTE 0x94
+ 3560, //21#DBCS LEAD BYTE 0x95
+ 3738, //22#DBCS LEAD BYTE 0x96
+ 3916, //23#DBCS LEAD BYTE 0x97
+ 4094, //24#DBCS LEAD BYTE 0x98
+ 4272, //25#DBCS LEAD BYTE 0x99
+ 4450, //26#DBCS LEAD BYTE 0x9A
+ 4628, //27#DBCS LEAD BYTE 0x9B
+ 4806, //28#DBCS LEAD BYTE 0x9C
+ 4984, //29#DBCS LEAD BYTE 0x9D
+ 5162, //30#DBCS LEAD BYTE 0x9E
+ 5340, //31#DBCS LEAD BYTE 0x9F
+ 5518, //32#DBCS LEAD BYTE 0xA0
+ 5696, //33#DBCS LEAD BYTE 0xA1
+ 5874, //34#DBCS LEAD BYTE 0xA2
+ 6029, //35#DBCS LEAD BYTE 0xA3
+ 6207, //36#DBCS LEAD BYTE 0xA4
+ 6385, //37#DBCS LEAD BYTE 0xA5
+ 6537, //38#DBCS LEAD BYTE 0xA6
+ 6689, //39#DBCS LEAD BYTE 0xA7
+ 6852, //40#DBCS LEAD BYTE 0xA8
+ 7027, //41#DBCS LEAD BYTE 0xA9
+ 7205, //42#DBCS LEAD BYTE 0xAA
+ 7372, //43#DBCS LEAD BYTE 0xAB
+ 7542, //44#DBCS LEAD BYTE 0xAC
+ 7692, //45#DBCS LEAD BYTE 0xAD
+ 7776, //46#DBCS LEAD BYTE 0xAE
+ 7860, //47#DBCS LEAD BYTE 0xAF
+ 7944, //48#DBCS LEAD BYTE 0xB0
+ 8122, //49#DBCS LEAD BYTE 0xB1
+ 8300, //50#DBCS LEAD BYTE 0xB2
+ 8478, //51#DBCS LEAD BYTE 0xB3
+ 8656, //52#DBCS LEAD BYTE 0xB4
+ 8834, //53#DBCS LEAD BYTE 0xB5
+ 9012, //54#DBCS LEAD BYTE 0xB6
+ 9190, //55#DBCS LEAD BYTE 0xB7
+ 9368, //56#DBCS LEAD BYTE 0xB8
+ 9546, //57#DBCS LEAD BYTE 0xB9
+ 9724, //58#DBCS LEAD BYTE 0xBA
+ 9902, //59#DBCS LEAD BYTE 0xBB
+ 10080, //60#DBCS LEAD BYTE 0xBC
+ 10258, //61#DBCS LEAD BYTE 0xBD
+ 10436, //62#DBCS LEAD BYTE 0xBE
+ 10614, //63#DBCS LEAD BYTE 0xBF
+ 10792, //64#DBCS LEAD BYTE 0xC0
+ 10970, //65#DBCS LEAD BYTE 0xC1
+ 11148, //66#DBCS LEAD BYTE 0xC2
+ 11326, //67#DBCS LEAD BYTE 0xC3
+ 11504, //68#DBCS LEAD BYTE 0xC4
+ 11682, //69#DBCS LEAD BYTE 0xC5
+ 11860, //70#DBCS LEAD BYTE 0xC6
+ 11972, //71#DBCS LEAD BYTE 0xC7
+ 12066, //72#DBCS LEAD BYTE 0xC8
+ 12160, //73#DBCS LEAD BYTE 0xC9, empty
+ 12160, //74#DBCS LEAD BYTE 0xCA
+ 12254, //75#DBCS LEAD BYTE 0xCB
+ 12348, //76#DBCS LEAD BYTE 0xCC
+ 12442, //77#DBCS LEAD BYTE 0xCD
+ 12536, //78#DBCS LEAD BYTE 0xCE
+ 12630, //79#DBCS LEAD BYTE 0xCF
+ 12724, //80#DBCS LEAD BYTE 0xD0
+ 12818, //81#DBCS LEAD BYTE 0xD1
+ 12912, //82#DBCS LEAD BYTE 0xD2
+ 13006, //83#DBCS LEAD BYTE 0xD3
+ 13100, //84#DBCS LEAD BYTE 0xD4
+ 13194, //85#DBCS LEAD BYTE 0xD5
+ 13288, //86#DBCS LEAD BYTE 0xD6
+ 13382, //87#DBCS LEAD BYTE 0xD7
+ 13476, //88#DBCS LEAD BYTE 0xD8
+ 13570, //89#DBCS LEAD BYTE 0xD9
+ 13664, //90#DBCS LEAD BYTE 0xDA
+ 13758, //91#DBCS LEAD BYTE 0xDB
+ 13852, //92#DBCS LEAD BYTE 0xDC
+ 13946, //93#DBCS LEAD BYTE 0xDD
+ 14040, //94#DBCS LEAD BYTE 0xDE
+ 14134, //95#DBCS LEAD BYTE 0xDF
+ 14228, //96#DBCS LEAD BYTE 0xE0
+ 14322, //97#DBCS LEAD BYTE 0xE1
+ 14416, //98#DBCS LEAD BYTE 0xE2
+ 14510, //99#DBCS LEAD BYTE 0xE3
+ 14604, //100#DBCS LEAD BYTE 0xE4
+ 14698, //101#DBCS LEAD BYTE 0xE5
+ 14792, //102#DBCS LEAD BYTE 0xE6
+ 14886, //103#DBCS LEAD BYTE 0xE7
+ 14980, //104#DBCS LEAD BYTE 0xE8
+ 15074, //105#DBCS LEAD BYTE 0xE9
+ 15168, //106#DBCS LEAD BYTE 0xEA
+ 15262, //107#DBCS LEAD BYTE 0xEB
+ 15356, //108#DBCS LEAD BYTE 0xEC
+ 15450, //109#DBCS LEAD BYTE 0xED
+ 15544, //110#DBCS LEAD BYTE 0xEE
+ 15638, //111#DBCS LEAD BYTE 0xEF
+ 15732, //112#DBCS LEAD BYTE 0xF0
+ 15826, //113#DBCS LEAD BYTE 0xF1
+ 15920, //114#DBCS LEAD BYTE 0xF2
+ 16014, //115#DBCS LEAD BYTE 0xF3
+ 16108, //116#DBCS LEAD BYTE 0xF4
+ 16202, //117#DBCS LEAD BYTE 0xF5
+ 16296, //118#DBCS LEAD BYTE 0xF6
+ 16390, //119#DBCS LEAD BYTE 0xF7
+ 16484, //120#DBCS LEAD BYTE 0xF8
+ 16578, //121#DBCS LEAD BYTE 0xF9
+ 16672, //122#DBCS LEAD BYTE 0xFA
+ 16766, //123#DBCS LEAD BYTE 0xFB
+ 16860, //124#DBCS LEAD BYTE 0xFC
+ 16954, //125#DBCS LEAD BYTE 0xFD
+ 17047, //126#DBCS LEAD BYTE 0xFE, empty
+ 17047, //127#UNDEFINED 0xFF, END OF TABLE
+};
+
+//Table 949 tail byte
+static const int DRW_DoubleTable949[][2] = {
+ {0x8141, 0xAC02}, //1 #HANGUL SYLLABLE KIYEOK A SSANGKIYEOK
+ {0x8142, 0xAC03}, //2 #HANGUL SYLLABLE KIYEOK A KIYEOKSIOS
+ {0x8143, 0xAC05}, //3 #HANGUL SYLLABLE KIYEOK A NIEUNCIEUC
+ {0x8144, 0xAC06}, //4 #HANGUL SYLLABLE KIYEOK A NIEUNHIEUH
+ {0x8145, 0xAC0B}, //5 #HANGUL SYLLABLE KIYEOK A RIEULPIEUP
+ {0x8146, 0xAC0C}, //6 #HANGUL SYLLABLE KIYEOK A RIEULSIOS
+ {0x8147, 0xAC0D}, //7 #HANGUL SYLLABLE KIYEOK A RIEULTHIEUTH
+ {0x8148, 0xAC0E}, //8 #HANGUL SYLLABLE KIYEOK A RIEULPHIEUPH
+ {0x8149, 0xAC0F}, //9 #HANGUL SYLLABLE KIYEOK A RIEULHIEUH
+ {0x814A, 0xAC18}, //10 #HANGUL SYLLABLE KIYEOK A KHIEUKH
+ {0x814B, 0xAC1E}, //11 #HANGUL SYLLABLE KIYEOK AE SSANGKIYEOK
+ {0x814C, 0xAC1F}, //12 #HANGUL SYLLABLE KIYEOK AE KIYEOKSIOS
+ {0x814D, 0xAC21}, //13 #HANGUL SYLLABLE KIYEOK AE NIEUNCIEUC
+ {0x814E, 0xAC22}, //14 #HANGUL SYLLABLE KIYEOK AE NIEUNHIEUH
+ {0x814F, 0xAC23}, //15 #HANGUL SYLLABLE KIYEOK AE TIKEUT
+ {0x8150, 0xAC25}, //16 #HANGUL SYLLABLE KIYEOK AE RIEULKIYEOK
+ {0x8151, 0xAC26}, //17 #HANGUL SYLLABLE KIYEOK AE RIEULMIEUM
+ {0x8152, 0xAC27}, //18 #HANGUL SYLLABLE KIYEOK AE RIEULPIEUP
+ {0x8153, 0xAC28}, //19 #HANGUL SYLLABLE KIYEOK AE RIEULSIOS
+ {0x8154, 0xAC29}, //20 #HANGUL SYLLABLE KIYEOK AE RIEULTHIEUTH
+ {0x8155, 0xAC2A}, //21 #HANGUL SYLLABLE KIYEOK AE RIEULPHIEUPH
+ {0x8156, 0xAC2B}, //22 #HANGUL SYLLABLE KIYEOK AE RIEULHIEUH
+ {0x8157, 0xAC2E}, //23 #HANGUL SYLLABLE KIYEOK AE PIEUPSIOS
+ {0x8158, 0xAC32}, //24 #HANGUL SYLLABLE KIYEOK AE CIEUC
+ {0x8159, 0xAC33}, //25 #HANGUL SYLLABLE KIYEOK AE CHIEUCH
+ {0x815A, 0xAC34}, //26 #HANGUL SYLLABLE KIYEOK AE KHIEUKH
+ {0x8161, 0xAC35}, //27 #HANGUL SYLLABLE KIYEOK AE THIEUTH
+ {0x8162, 0xAC36}, //28 #HANGUL SYLLABLE KIYEOK AE PHIEUPH
+ {0x8163, 0xAC37}, //29 #HANGUL SYLLABLE KIYEOK AE HIEUH
+ {0x8164, 0xAC3A}, //30 #HANGUL SYLLABLE KIYEOK YA SSANGKIYEOK
+ {0x8165, 0xAC3B}, //31 #HANGUL SYLLABLE KIYEOK YA KIYEOKSIOS
+ {0x8166, 0xAC3D}, //32 #HANGUL SYLLABLE KIYEOK YA NIEUNCIEUC
+ {0x8167, 0xAC3E}, //33 #HANGUL SYLLABLE KIYEOK YA NIEUNHIEUH
+ {0x8168, 0xAC3F}, //34 #HANGUL SYLLABLE KIYEOK YA TIKEUT
+ {0x8169, 0xAC41}, //35 #HANGUL SYLLABLE KIYEOK YA RIEULKIYEOK
+ {0x816A, 0xAC42}, //36 #HANGUL SYLLABLE KIYEOK YA RIEULMIEUM
+ {0x816B, 0xAC43}, //37 #HANGUL SYLLABLE KIYEOK YA RIEULPIEUP
+ {0x816C, 0xAC44}, //38 #HANGUL SYLLABLE KIYEOK YA RIEULSIOS
+ {0x816D, 0xAC45}, //39 #HANGUL SYLLABLE KIYEOK YA RIEULTHIEUTH
+ {0x816E, 0xAC46}, //40 #HANGUL SYLLABLE KIYEOK YA RIEULPHIEUPH
+ {0x816F, 0xAC47}, //41 #HANGUL SYLLABLE KIYEOK YA RIEULHIEUH
+ {0x8170, 0xAC48}, //42 #HANGUL SYLLABLE KIYEOK YA MIEUM
+ {0x8171, 0xAC49}, //43 #HANGUL SYLLABLE KIYEOK YA PIEUP
+ {0x8172, 0xAC4A}, //44 #HANGUL SYLLABLE KIYEOK YA PIEUPSIOS
+ {0x8173, 0xAC4C}, //45 #HANGUL SYLLABLE KIYEOK YA SSANGSIOS
+ {0x8174, 0xAC4E}, //46 #HANGUL SYLLABLE KIYEOK YA CIEUC
+ {0x8175, 0xAC4F}, //47 #HANGUL SYLLABLE KIYEOK YA CHIEUCH
+ {0x8176, 0xAC50}, //48 #HANGUL SYLLABLE KIYEOK YA KHIEUKH
+ {0x8177, 0xAC51}, //49 #HANGUL SYLLABLE KIYEOK YA THIEUTH
+ {0x8178, 0xAC52}, //50 #HANGUL SYLLABLE KIYEOK YA PHIEUPH
+ {0x8179, 0xAC53}, //51 #HANGUL SYLLABLE KIYEOK YA HIEUH
+ {0x817A, 0xAC55}, //52 #HANGUL SYLLABLE KIYEOK YAE KIYEOK
+ {0x8181, 0xAC56}, //53 #HANGUL SYLLABLE KIYEOK YAE SSANGKIYEOK
+ {0x8182, 0xAC57}, //54 #HANGUL SYLLABLE KIYEOK YAE KIYEOKSIOS
+ {0x8183, 0xAC59}, //55 #HANGUL SYLLABLE KIYEOK YAE NIEUNCIEUC
+ {0x8184, 0xAC5A}, //56 #HANGUL SYLLABLE KIYEOK YAE NIEUNHIEUH
+ {0x8185, 0xAC5B}, //57 #HANGUL SYLLABLE KIYEOK YAE TIKEUT
+ {0x8186, 0xAC5D}, //58 #HANGUL SYLLABLE KIYEOK YAE RIEULKIYEOK
+ {0x8187, 0xAC5E}, //59 #HANGUL SYLLABLE KIYEOK YAE RIEULMIEUM
+ {0x8188, 0xAC5F}, //60 #HANGUL SYLLABLE KIYEOK YAE RIEULPIEUP
+ {0x8189, 0xAC60}, //61 #HANGUL SYLLABLE KIYEOK YAE RIEULSIOS
+ {0x818A, 0xAC61}, //62 #HANGUL SYLLABLE KIYEOK YAE RIEULTHIEUTH
+ {0x818B, 0xAC62}, //63 #HANGUL SYLLABLE KIYEOK YAE RIEULPHIEUPH
+ {0x818C, 0xAC63}, //64 #HANGUL SYLLABLE KIYEOK YAE RIEULHIEUH
+ {0x818D, 0xAC64}, //65 #HANGUL SYLLABLE KIYEOK YAE MIEUM
+ {0x818E, 0xAC65}, //66 #HANGUL SYLLABLE KIYEOK YAE PIEUP
+ {0x818F, 0xAC66}, //67 #HANGUL SYLLABLE KIYEOK YAE PIEUPSIOS
+ {0x8190, 0xAC67}, //68 #HANGUL SYLLABLE KIYEOK YAE SIOS
+ {0x8191, 0xAC68}, //69 #HANGUL SYLLABLE KIYEOK YAE SSANGSIOS
+ {0x8192, 0xAC69}, //70 #HANGUL SYLLABLE KIYEOK YAE IEUNG
+ {0x8193, 0xAC6A}, //71 #HANGUL SYLLABLE KIYEOK YAE CIEUC
+ {0x8194, 0xAC6B}, //72 #HANGUL SYLLABLE KIYEOK YAE CHIEUCH
+ {0x8195, 0xAC6C}, //73 #HANGUL SYLLABLE KIYEOK YAE KHIEUKH
+ {0x8196, 0xAC6D}, //74 #HANGUL SYLLABLE KIYEOK YAE THIEUTH
+ {0x8197, 0xAC6E}, //75 #HANGUL SYLLABLE KIYEOK YAE PHIEUPH
+ {0x8198, 0xAC6F}, //76 #HANGUL SYLLABLE KIYEOK YAE HIEUH
+ {0x8199, 0xAC72}, //77 #HANGUL SYLLABLE KIYEOK EO SSANGKIYEOK
+ {0x819A, 0xAC73}, //78 #HANGUL SYLLABLE KIYEOK EO KIYEOKSIOS
+ {0x819B, 0xAC75}, //79 #HANGUL SYLLABLE KIYEOK EO NIEUNCIEUC
+ {0x819C, 0xAC76}, //80 #HANGUL SYLLABLE KIYEOK EO NIEUNHIEUH
+ {0x819D, 0xAC79}, //81 #HANGUL SYLLABLE KIYEOK EO RIEULKIYEOK
+ {0x819E, 0xAC7B}, //82 #HANGUL SYLLABLE KIYEOK EO RIEULPIEUP
+ {0x819F, 0xAC7C}, //83 #HANGUL SYLLABLE KIYEOK EO RIEULSIOS
+ {0x81A0, 0xAC7D}, //84 #HANGUL SYLLABLE KIYEOK EO RIEULTHIEUTH
+ {0x81A1, 0xAC7E}, //85 #HANGUL SYLLABLE KIYEOK EO RIEULPHIEUPH
+ {0x81A2, 0xAC7F}, //86 #HANGUL SYLLABLE KIYEOK EO RIEULHIEUH
+ {0x81A3, 0xAC82}, //87 #HANGUL SYLLABLE KIYEOK EO PIEUPSIOS
+ {0x81A4, 0xAC87}, //88 #HANGUL SYLLABLE KIYEOK EO CHIEUCH
+ {0x81A5, 0xAC88}, //89 #HANGUL SYLLABLE KIYEOK EO KHIEUKH
+ {0x81A6, 0xAC8D}, //90 #HANGUL SYLLABLE KIYEOK E KIYEOK
+ {0x81A7, 0xAC8E}, //91 #HANGUL SYLLABLE KIYEOK E SSANGKIYEOK
+ {0x81A8, 0xAC8F}, //92 #HANGUL SYLLABLE KIYEOK E KIYEOKSIOS
+ {0x81A9, 0xAC91}, //93 #HANGUL SYLLABLE KIYEOK E NIEUNCIEUC
+ {0x81AA, 0xAC92}, //94 #HANGUL SYLLABLE KIYEOK E NIEUNHIEUH
+ {0x81AB, 0xAC93}, //95 #HANGUL SYLLABLE KIYEOK E TIKEUT
+ {0x81AC, 0xAC95}, //96 #HANGUL SYLLABLE KIYEOK E RIEULKIYEOK
+ {0x81AD, 0xAC96}, //97 #HANGUL SYLLABLE KIYEOK E RIEULMIEUM
+ {0x81AE, 0xAC97}, //98 #HANGUL SYLLABLE KIYEOK E RIEULPIEUP
+ {0x81AF, 0xAC98}, //99 #HANGUL SYLLABLE KIYEOK E RIEULSIOS
+ {0x81B0, 0xAC99}, //100 #HANGUL SYLLABLE KIYEOK E RIEULTHIEUTH
+ {0x81B1, 0xAC9A}, //101 #HANGUL SYLLABLE KIYEOK E RIEULPHIEUPH
+ {0x81B2, 0xAC9B}, //102 #HANGUL SYLLABLE KIYEOK E RIEULHIEUH
+ {0x81B3, 0xAC9E}, //103 #HANGUL SYLLABLE KIYEOK E PIEUPSIOS
+ {0x81B4, 0xACA2}, //104 #HANGUL SYLLABLE KIYEOK E CIEUC
+ {0x81B5, 0xACA3}, //105 #HANGUL SYLLABLE KIYEOK E CHIEUCH
+ {0x81B6, 0xACA4}, //106 #HANGUL SYLLABLE KIYEOK E KHIEUKH
+ {0x81B7, 0xACA5}, //107 #HANGUL SYLLABLE KIYEOK E THIEUTH
+ {0x81B8, 0xACA6}, //108 #HANGUL SYLLABLE KIYEOK E PHIEUPH
+ {0x81B9, 0xACA7}, //109 #HANGUL SYLLABLE KIYEOK E HIEUH
+ {0x81BA, 0xACAB}, //110 #HANGUL SYLLABLE KIYEOK YEO KIYEOKSIOS
+ {0x81BB, 0xACAD}, //111 #HANGUL SYLLABLE KIYEOK YEO NIEUNCIEUC
+ {0x81BC, 0xACAE}, //112 #HANGUL SYLLABLE KIYEOK YEO NIEUNHIEUH
+ {0x81BD, 0xACB1}, //113 #HANGUL SYLLABLE KIYEOK YEO RIEULKIYEOK
+ {0x81BE, 0xACB2}, //114 #HANGUL SYLLABLE KIYEOK YEO RIEULMIEUM
+ {0x81BF, 0xACB3}, //115 #HANGUL SYLLABLE KIYEOK YEO RIEULPIEUP
+ {0x81C0, 0xACB4}, //116 #HANGUL SYLLABLE KIYEOK YEO RIEULSIOS
+ {0x81C1, 0xACB5}, //117 #HANGUL SYLLABLE KIYEOK YEO RIEULTHIEUTH
+ {0x81C2, 0xACB6}, //118 #HANGUL SYLLABLE KIYEOK YEO RIEULPHIEUPH
+ {0x81C3, 0xACB7}, //119 #HANGUL SYLLABLE KIYEOK YEO RIEULHIEUH
+ {0x81C4, 0xACBA}, //120 #HANGUL SYLLABLE KIYEOK YEO PIEUPSIOS
+ {0x81C5, 0xACBE}, //121 #HANGUL SYLLABLE KIYEOK YEO CIEUC
+ {0x81C6, 0xACBF}, //122 #HANGUL SYLLABLE KIYEOK YEO CHIEUCH
+ {0x81C7, 0xACC0}, //123 #HANGUL SYLLABLE KIYEOK YEO KHIEUKH
+ {0x81C8, 0xACC2}, //124 #HANGUL SYLLABLE KIYEOK YEO PHIEUPH
+ {0x81C9, 0xACC3}, //125 #HANGUL SYLLABLE KIYEOK YEO HIEUH
+ {0x81CA, 0xACC5}, //126 #HANGUL SYLLABLE KIYEOK YE KIYEOK
+ {0x81CB, 0xACC6}, //127 #HANGUL SYLLABLE KIYEOK YE SSANGKIYEOK
+ {0x81CC, 0xACC7}, //128 #HANGUL SYLLABLE KIYEOK YE KIYEOKSIOS
+ {0x81CD, 0xACC9}, //129 #HANGUL SYLLABLE KIYEOK YE NIEUNCIEUC
+ {0x81CE, 0xACCA}, //130 #HANGUL SYLLABLE KIYEOK YE NIEUNHIEUH
+ {0x81CF, 0xACCB}, //131 #HANGUL SYLLABLE KIYEOK YE TIKEUT
+ {0x81D0, 0xACCD}, //132 #HANGUL SYLLABLE KIYEOK YE RIEULKIYEOK
+ {0x81D1, 0xACCE}, //133 #HANGUL SYLLABLE KIYEOK YE RIEULMIEUM
+ {0x81D2, 0xACCF}, //134 #HANGUL SYLLABLE KIYEOK YE RIEULPIEUP
+ {0x81D3, 0xACD0}, //135 #HANGUL SYLLABLE KIYEOK YE RIEULSIOS
+ {0x81D4, 0xACD1}, //136 #HANGUL SYLLABLE KIYEOK YE RIEULTHIEUTH
+ {0x81D5, 0xACD2}, //137 #HANGUL SYLLABLE KIYEOK YE RIEULPHIEUPH
+ {0x81D6, 0xACD3}, //138 #HANGUL SYLLABLE KIYEOK YE RIEULHIEUH
+ {0x81D7, 0xACD4}, //139 #HANGUL SYLLABLE KIYEOK YE MIEUM
+ {0x81D8, 0xACD6}, //140 #HANGUL SYLLABLE KIYEOK YE PIEUPSIOS
+ {0x81D9, 0xACD8}, //141 #HANGUL SYLLABLE KIYEOK YE SSANGSIOS
+ {0x81DA, 0xACD9}, //142 #HANGUL SYLLABLE KIYEOK YE IEUNG
+ {0x81DB, 0xACDA}, //143 #HANGUL SYLLABLE KIYEOK YE CIEUC
+ {0x81DC, 0xACDB}, //144 #HANGUL SYLLABLE KIYEOK YE CHIEUCH
+ {0x81DD, 0xACDC}, //145 #HANGUL SYLLABLE KIYEOK YE KHIEUKH
+ {0x81DE, 0xACDD}, //146 #HANGUL SYLLABLE KIYEOK YE THIEUTH
+ {0x81DF, 0xACDE}, //147 #HANGUL SYLLABLE KIYEOK YE PHIEUPH
+ {0x81E0, 0xACDF}, //148 #HANGUL SYLLABLE KIYEOK YE HIEUH
+ {0x81E1, 0xACE2}, //149 #HANGUL SYLLABLE KIYEOK O SSANGKIYEOK
+ {0x81E2, 0xACE3}, //150 #HANGUL SYLLABLE KIYEOK O KIYEOKSIOS
+ {0x81E3, 0xACE5}, //151 #HANGUL SYLLABLE KIYEOK O NIEUNCIEUC
+ {0x81E4, 0xACE6}, //152 #HANGUL SYLLABLE KIYEOK O NIEUNHIEUH
+ {0x81E5, 0xACE9}, //153 #HANGUL SYLLABLE KIYEOK O RIEULKIYEOK
+ {0x81E6, 0xACEB}, //154 #HANGUL SYLLABLE KIYEOK O RIEULPIEUP
+ {0x81E7, 0xACED}, //155 #HANGUL SYLLABLE KIYEOK O RIEULTHIEUTH
+ {0x81E8, 0xACEE}, //156 #HANGUL SYLLABLE KIYEOK O RIEULPHIEUPH
+ {0x81E9, 0xACF2}, //157 #HANGUL SYLLABLE KIYEOK O PIEUPSIOS
+ {0x81EA, 0xACF4}, //158 #HANGUL SYLLABLE KIYEOK O SSANGSIOS
+ {0x81EB, 0xACF7}, //159 #HANGUL SYLLABLE KIYEOK O CHIEUCH
+ {0x81EC, 0xACF8}, //160 #HANGUL SYLLABLE KIYEOK O KHIEUKH
+ {0x81ED, 0xACF9}, //161 #HANGUL SYLLABLE KIYEOK O THIEUTH
+ {0x81EE, 0xACFA}, //162 #HANGUL SYLLABLE KIYEOK O PHIEUPH
+ {0x81EF, 0xACFB}, //163 #HANGUL SYLLABLE KIYEOK O HIEUH
+ {0x81F0, 0xACFE}, //164 #HANGUL SYLLABLE KIYEOK WA SSANGKIYEOK
+ {0x81F1, 0xACFF}, //165 #HANGUL SYLLABLE KIYEOK WA KIYEOKSIOS
+ {0x81F2, 0xAD01}, //166 #HANGUL SYLLABLE KIYEOK WA NIEUNCIEUC
+ {0x81F3, 0xAD02}, //167 #HANGUL SYLLABLE KIYEOK WA NIEUNHIEUH
+ {0x81F4, 0xAD03}, //168 #HANGUL SYLLABLE KIYEOK WA TIKEUT
+ {0x81F5, 0xAD05}, //169 #HANGUL SYLLABLE KIYEOK WA RIEULKIYEOK
+ {0x81F6, 0xAD07}, //170 #HANGUL SYLLABLE KIYEOK WA RIEULPIEUP
+ {0x81F7, 0xAD08}, //171 #HANGUL SYLLABLE KIYEOK WA RIEULSIOS
+ {0x81F8, 0xAD09}, //172 #HANGUL SYLLABLE KIYEOK WA RIEULTHIEUTH
+ {0x81F9, 0xAD0A}, //173 #HANGUL SYLLABLE KIYEOK WA RIEULPHIEUPH
+ {0x81FA, 0xAD0B}, //174 #HANGUL SYLLABLE KIYEOK WA RIEULHIEUH
+ {0x81FB, 0xAD0E}, //175 #HANGUL SYLLABLE KIYEOK WA PIEUPSIOS
+ {0x81FC, 0xAD10}, //176 #HANGUL SYLLABLE KIYEOK WA SSANGSIOS
+ {0x81FD, 0xAD12}, //177 #HANGUL SYLLABLE KIYEOK WA CIEUC
+ {0x81FE, 0xAD13}, //178 #HANGUL SYLLABLE KIYEOK WA CHIEUCH
+ {0x8241, 0xAD14}, //179 #HANGUL SYLLABLE KIYEOK WA KHIEUKH
+ {0x8242, 0xAD15}, //180 #HANGUL SYLLABLE KIYEOK WA THIEUTH
+ {0x8243, 0xAD16}, //181 #HANGUL SYLLABLE KIYEOK WA PHIEUPH
+ {0x8244, 0xAD17}, //182 #HANGUL SYLLABLE KIYEOK WA HIEUH
+ {0x8245, 0xAD19}, //183 #HANGUL SYLLABLE KIYEOK WAE KIYEOK
+ {0x8246, 0xAD1A}, //184 #HANGUL SYLLABLE KIYEOK WAE SSANGKIYEOK
+ {0x8247, 0xAD1B}, //185 #HANGUL SYLLABLE KIYEOK WAE KIYEOKSIOS
+ {0x8248, 0xAD1D}, //186 #HANGUL SYLLABLE KIYEOK WAE NIEUNCIEUC
+ {0x8249, 0xAD1E}, //187 #HANGUL SYLLABLE KIYEOK WAE NIEUNHIEUH
+ {0x824A, 0xAD1F}, //188 #HANGUL SYLLABLE KIYEOK WAE TIKEUT
+ {0x824B, 0xAD21}, //189 #HANGUL SYLLABLE KIYEOK WAE RIEULKIYEOK
+ {0x824C, 0xAD22}, //190 #HANGUL SYLLABLE KIYEOK WAE RIEULMIEUM
+ {0x824D, 0xAD23}, //191 #HANGUL SYLLABLE KIYEOK WAE RIEULPIEUP
+ {0x824E, 0xAD24}, //192 #HANGUL SYLLABLE KIYEOK WAE RIEULSIOS
+ {0x824F, 0xAD25}, //193 #HANGUL SYLLABLE KIYEOK WAE RIEULTHIEUTH
+ {0x8250, 0xAD26}, //194 #HANGUL SYLLABLE KIYEOK WAE RIEULPHIEUPH
+ {0x8251, 0xAD27}, //195 #HANGUL SYLLABLE KIYEOK WAE RIEULHIEUH
+ {0x8252, 0xAD28}, //196 #HANGUL SYLLABLE KIYEOK WAE MIEUM
+ {0x8253, 0xAD2A}, //197 #HANGUL SYLLABLE KIYEOK WAE PIEUPSIOS
+ {0x8254, 0xAD2B}, //198 #HANGUL SYLLABLE KIYEOK WAE SIOS
+ {0x8255, 0xAD2E}, //199 #HANGUL SYLLABLE KIYEOK WAE CIEUC
+ {0x8256, 0xAD2F}, //200 #HANGUL SYLLABLE KIYEOK WAE CHIEUCH
+ {0x8257, 0xAD30}, //201 #HANGUL SYLLABLE KIYEOK WAE KHIEUKH
+ {0x8258, 0xAD31}, //202 #HANGUL SYLLABLE KIYEOK WAE THIEUTH
+ {0x8259, 0xAD32}, //203 #HANGUL SYLLABLE KIYEOK WAE PHIEUPH
+ {0x825A, 0xAD33}, //204 #HANGUL SYLLABLE KIYEOK WAE HIEUH
+ {0x8261, 0xAD36}, //205 #HANGUL SYLLABLE KIYEOK OE SSANGKIYEOK
+ {0x8262, 0xAD37}, //206 #HANGUL SYLLABLE KIYEOK OE KIYEOKSIOS
+ {0x8263, 0xAD39}, //207 #HANGUL SYLLABLE KIYEOK OE NIEUNCIEUC
+ {0x8264, 0xAD3A}, //208 #HANGUL SYLLABLE KIYEOK OE NIEUNHIEUH
+ {0x8265, 0xAD3B}, //209 #HANGUL SYLLABLE KIYEOK OE TIKEUT
+ {0x8266, 0xAD3D}, //210 #HANGUL SYLLABLE KIYEOK OE RIEULKIYEOK
+ {0x8267, 0xAD3E}, //211 #HANGUL SYLLABLE KIYEOK OE RIEULMIEUM
+ {0x8268, 0xAD3F}, //212 #HANGUL SYLLABLE KIYEOK OE RIEULPIEUP
+ {0x8269, 0xAD40}, //213 #HANGUL SYLLABLE KIYEOK OE RIEULSIOS
+ {0x826A, 0xAD41}, //214 #HANGUL SYLLABLE KIYEOK OE RIEULTHIEUTH
+ {0x826B, 0xAD42}, //215 #HANGUL SYLLABLE KIYEOK OE RIEULPHIEUPH
+ {0x826C, 0xAD43}, //216 #HANGUL SYLLABLE KIYEOK OE RIEULHIEUH
+ {0x826D, 0xAD46}, //217 #HANGUL SYLLABLE KIYEOK OE PIEUPSIOS
+ {0x826E, 0xAD48}, //218 #HANGUL SYLLABLE KIYEOK OE SSANGSIOS
+ {0x826F, 0xAD4A}, //219 #HANGUL SYLLABLE KIYEOK OE CIEUC
+ {0x8270, 0xAD4B}, //220 #HANGUL SYLLABLE KIYEOK OE CHIEUCH
+ {0x8271, 0xAD4C}, //221 #HANGUL SYLLABLE KIYEOK OE KHIEUKH
+ {0x8272, 0xAD4D}, //222 #HANGUL SYLLABLE KIYEOK OE THIEUTH
+ {0x8273, 0xAD4E}, //223 #HANGUL SYLLABLE KIYEOK OE PHIEUPH
+ {0x8274, 0xAD4F}, //224 #HANGUL SYLLABLE KIYEOK OE HIEUH
+ {0x8275, 0xAD51}, //225 #HANGUL SYLLABLE KIYEOK YO KIYEOK
+ {0x8276, 0xAD52}, //226 #HANGUL SYLLABLE KIYEOK YO SSANGKIYEOK
+ {0x8277, 0xAD53}, //227 #HANGUL SYLLABLE KIYEOK YO KIYEOKSIOS
+ {0x8278, 0xAD55}, //228 #HANGUL SYLLABLE KIYEOK YO NIEUNCIEUC
+ {0x8279, 0xAD56}, //229 #HANGUL SYLLABLE KIYEOK YO NIEUNHIEUH
+ {0x827A, 0xAD57}, //230 #HANGUL SYLLABLE KIYEOK YO TIKEUT
+ {0x8281, 0xAD59}, //231 #HANGUL SYLLABLE KIYEOK YO RIEULKIYEOK
+ {0x8282, 0xAD5A}, //232 #HANGUL SYLLABLE KIYEOK YO RIEULMIEUM
+ {0x8283, 0xAD5B}, //233 #HANGUL SYLLABLE KIYEOK YO RIEULPIEUP
+ {0x8284, 0xAD5C}, //234 #HANGUL SYLLABLE KIYEOK YO RIEULSIOS
+ {0x8285, 0xAD5D}, //235 #HANGUL SYLLABLE KIYEOK YO RIEULTHIEUTH
+ {0x8286, 0xAD5E}, //236 #HANGUL SYLLABLE KIYEOK YO RIEULPHIEUPH
+ {0x8287, 0xAD5F}, //237 #HANGUL SYLLABLE KIYEOK YO RIEULHIEUH
+ {0x8288, 0xAD60}, //238 #HANGUL SYLLABLE KIYEOK YO MIEUM
+ {0x8289, 0xAD62}, //239 #HANGUL SYLLABLE KIYEOK YO PIEUPSIOS
+ {0x828A, 0xAD64}, //240 #HANGUL SYLLABLE KIYEOK YO SSANGSIOS
+ {0x828B, 0xAD65}, //241 #HANGUL SYLLABLE KIYEOK YO IEUNG
+ {0x828C, 0xAD66}, //242 #HANGUL SYLLABLE KIYEOK YO CIEUC
+ {0x828D, 0xAD67}, //243 #HANGUL SYLLABLE KIYEOK YO CHIEUCH
+ {0x828E, 0xAD68}, //244 #HANGUL SYLLABLE KIYEOK YO KHIEUKH
+ {0x828F, 0xAD69}, //245 #HANGUL SYLLABLE KIYEOK YO THIEUTH
+ {0x8290, 0xAD6A}, //246 #HANGUL SYLLABLE KIYEOK YO PHIEUPH
+ {0x8291, 0xAD6B}, //247 #HANGUL SYLLABLE KIYEOK YO HIEUH
+ {0x8292, 0xAD6E}, //248 #HANGUL SYLLABLE KIYEOK U SSANGKIYEOK
+ {0x8293, 0xAD6F}, //249 #HANGUL SYLLABLE KIYEOK U KIYEOKSIOS
+ {0x8294, 0xAD71}, //250 #HANGUL SYLLABLE KIYEOK U NIEUNCIEUC
+ {0x8295, 0xAD72}, //251 #HANGUL SYLLABLE KIYEOK U NIEUNHIEUH
+ {0x8296, 0xAD77}, //252 #HANGUL SYLLABLE KIYEOK U RIEULPIEUP
+ {0x8297, 0xAD78}, //253 #HANGUL SYLLABLE KIYEOK U RIEULSIOS
+ {0x8298, 0xAD79}, //254 #HANGUL SYLLABLE KIYEOK U RIEULTHIEUTH
+ {0x8299, 0xAD7A}, //255 #HANGUL SYLLABLE KIYEOK U RIEULPHIEUPH
+ {0x829A, 0xAD7E}, //256 #HANGUL SYLLABLE KIYEOK U PIEUPSIOS
+ {0x829B, 0xAD80}, //257 #HANGUL SYLLABLE KIYEOK U SSANGSIOS
+ {0x829C, 0xAD83}, //258 #HANGUL SYLLABLE KIYEOK U CHIEUCH
+ {0x829D, 0xAD84}, //259 #HANGUL SYLLABLE KIYEOK U KHIEUKH
+ {0x829E, 0xAD85}, //260 #HANGUL SYLLABLE KIYEOK U THIEUTH
+ {0x829F, 0xAD86}, //261 #HANGUL SYLLABLE KIYEOK U PHIEUPH
+ {0x82A0, 0xAD87}, //262 #HANGUL SYLLABLE KIYEOK U HIEUH
+ {0x82A1, 0xAD8A}, //263 #HANGUL SYLLABLE KIYEOK WEO SSANGKIYEOK
+ {0x82A2, 0xAD8B}, //264 #HANGUL SYLLABLE KIYEOK WEO KIYEOKSIOS
+ {0x82A3, 0xAD8D}, //265 #HANGUL SYLLABLE KIYEOK WEO NIEUNCIEUC
+ {0x82A4, 0xAD8E}, //266 #HANGUL SYLLABLE KIYEOK WEO NIEUNHIEUH
+ {0x82A5, 0xAD8F}, //267 #HANGUL SYLLABLE KIYEOK WEO TIKEUT
+ {0x82A6, 0xAD91}, //268 #HANGUL SYLLABLE KIYEOK WEO RIEULKIYEOK
+ {0x82A7, 0xAD92}, //269 #HANGUL SYLLABLE KIYEOK WEO RIEULMIEUM
+ {0x82A8, 0xAD93}, //270 #HANGUL SYLLABLE KIYEOK WEO RIEULPIEUP
+ {0x82A9, 0xAD94}, //271 #HANGUL SYLLABLE KIYEOK WEO RIEULSIOS
+ {0x82AA, 0xAD95}, //272 #HANGUL SYLLABLE KIYEOK WEO RIEULTHIEUTH
+ {0x82AB, 0xAD96}, //273 #HANGUL SYLLABLE KIYEOK WEO RIEULPHIEUPH
+ {0x82AC, 0xAD97}, //274 #HANGUL SYLLABLE KIYEOK WEO RIEULHIEUH
+ {0x82AD, 0xAD98}, //275 #HANGUL SYLLABLE KIYEOK WEO MIEUM
+ {0x82AE, 0xAD99}, //276 #HANGUL SYLLABLE KIYEOK WEO PIEUP
+ {0x82AF, 0xAD9A}, //277 #HANGUL SYLLABLE KIYEOK WEO PIEUPSIOS
+ {0x82B0, 0xAD9B}, //278 #HANGUL SYLLABLE KIYEOK WEO SIOS
+ {0x82B1, 0xAD9E}, //279 #HANGUL SYLLABLE KIYEOK WEO CIEUC
+ {0x82B2, 0xAD9F}, //280 #HANGUL SYLLABLE KIYEOK WEO CHIEUCH
+ {0x82B3, 0xADA0}, //281 #HANGUL SYLLABLE KIYEOK WEO KHIEUKH
+ {0x82B4, 0xADA1}, //282 #HANGUL SYLLABLE KIYEOK WEO THIEUTH
+ {0x82B5, 0xADA2}, //283 #HANGUL SYLLABLE KIYEOK WEO PHIEUPH
+ {0x82B6, 0xADA3}, //284 #HANGUL SYLLABLE KIYEOK WEO HIEUH
+ {0x82B7, 0xADA5}, //285 #HANGUL SYLLABLE KIYEOK WE KIYEOK
+ {0x82B8, 0xADA6}, //286 #HANGUL SYLLABLE KIYEOK WE SSANGKIYEOK
+ {0x82B9, 0xADA7}, //287 #HANGUL SYLLABLE KIYEOK WE KIYEOKSIOS
+ {0x82BA, 0xADA8}, //288 #HANGUL SYLLABLE KIYEOK WE NIEUN
+ {0x82BB, 0xADA9}, //289 #HANGUL SYLLABLE KIYEOK WE NIEUNCIEUC
+ {0x82BC, 0xADAA}, //290 #HANGUL SYLLABLE KIYEOK WE NIEUNHIEUH
+ {0x82BD, 0xADAB}, //291 #HANGUL SYLLABLE KIYEOK WE TIKEUT
+ {0x82BE, 0xADAC}, //292 #HANGUL SYLLABLE KIYEOK WE RIEUL
+ {0x82BF, 0xADAD}, //293 #HANGUL SYLLABLE KIYEOK WE RIEULKIYEOK
+ {0x82C0, 0xADAE}, //294 #HANGUL SYLLABLE KIYEOK WE RIEULMIEUM
+ {0x82C1, 0xADAF}, //295 #HANGUL SYLLABLE KIYEOK WE RIEULPIEUP
+ {0x82C2, 0xADB0}, //296 #HANGUL SYLLABLE KIYEOK WE RIEULSIOS
+ {0x82C3, 0xADB1}, //297 #HANGUL SYLLABLE KIYEOK WE RIEULTHIEUTH
+ {0x82C4, 0xADB2}, //298 #HANGUL SYLLABLE KIYEOK WE RIEULPHIEUPH
+ {0x82C5, 0xADB3}, //299 #HANGUL SYLLABLE KIYEOK WE RIEULHIEUH
+ {0x82C6, 0xADB4}, //300 #HANGUL SYLLABLE KIYEOK WE MIEUM
+ {0x82C7, 0xADB5}, //301 #HANGUL SYLLABLE KIYEOK WE PIEUP
+ {0x82C8, 0xADB6}, //302 #HANGUL SYLLABLE KIYEOK WE PIEUPSIOS
+ {0x82C9, 0xADB8}, //303 #HANGUL SYLLABLE KIYEOK WE SSANGSIOS
+ {0x82CA, 0xADB9}, //304 #HANGUL SYLLABLE KIYEOK WE IEUNG
+ {0x82CB, 0xADBA}, //305 #HANGUL SYLLABLE KIYEOK WE CIEUC
+ {0x82CC, 0xADBB}, //306 #HANGUL SYLLABLE KIYEOK WE CHIEUCH
+ {0x82CD, 0xADBC}, //307 #HANGUL SYLLABLE KIYEOK WE KHIEUKH
+ {0x82CE, 0xADBD}, //308 #HANGUL SYLLABLE KIYEOK WE THIEUTH
+ {0x82CF, 0xADBE}, //309 #HANGUL SYLLABLE KIYEOK WE PHIEUPH
+ {0x82D0, 0xADBF}, //310 #HANGUL SYLLABLE KIYEOK WE HIEUH
+ {0x82D1, 0xADC2}, //311 #HANGUL SYLLABLE KIYEOK WI SSANGKIYEOK
+ {0x82D2, 0xADC3}, //312 #HANGUL SYLLABLE KIYEOK WI KIYEOKSIOS
+ {0x82D3, 0xADC5}, //313 #HANGUL SYLLABLE KIYEOK WI NIEUNCIEUC
+ {0x82D4, 0xADC6}, //314 #HANGUL SYLLABLE KIYEOK WI NIEUNHIEUH
+ {0x82D5, 0xADC7}, //315 #HANGUL SYLLABLE KIYEOK WI TIKEUT
+ {0x82D6, 0xADC9}, //316 #HANGUL SYLLABLE KIYEOK WI RIEULKIYEOK
+ {0x82D7, 0xADCA}, //317 #HANGUL SYLLABLE KIYEOK WI RIEULMIEUM
+ {0x82D8, 0xADCB}, //318 #HANGUL SYLLABLE KIYEOK WI RIEULPIEUP
+ {0x82D9, 0xADCC}, //319 #HANGUL SYLLABLE KIYEOK WI RIEULSIOS
+ {0x82DA, 0xADCD}, //320 #HANGUL SYLLABLE KIYEOK WI RIEULTHIEUTH
+ {0x82DB, 0xADCE}, //321 #HANGUL SYLLABLE KIYEOK WI RIEULPHIEUPH
+ {0x82DC, 0xADCF}, //322 #HANGUL SYLLABLE KIYEOK WI RIEULHIEUH
+ {0x82DD, 0xADD2}, //323 #HANGUL SYLLABLE KIYEOK WI PIEUPSIOS
+ {0x82DE, 0xADD4}, //324 #HANGUL SYLLABLE KIYEOK WI SSANGSIOS
+ {0x82DF, 0xADD5}, //325 #HANGUL SYLLABLE KIYEOK WI IEUNG
+ {0x82E0, 0xADD6}, //326 #HANGUL SYLLABLE KIYEOK WI CIEUC
+ {0x82E1, 0xADD7}, //327 #HANGUL SYLLABLE KIYEOK WI CHIEUCH
+ {0x82E2, 0xADD8}, //328 #HANGUL SYLLABLE KIYEOK WI KHIEUKH
+ {0x82E3, 0xADD9}, //329 #HANGUL SYLLABLE KIYEOK WI THIEUTH
+ {0x82E4, 0xADDA}, //330 #HANGUL SYLLABLE KIYEOK WI PHIEUPH
+ {0x82E5, 0xADDB}, //331 #HANGUL SYLLABLE KIYEOK WI HIEUH
+ {0x82E6, 0xADDD}, //332 #HANGUL SYLLABLE KIYEOK YU KIYEOK
+ {0x82E7, 0xADDE}, //333 #HANGUL SYLLABLE KIYEOK YU SSANGKIYEOK
+ {0x82E8, 0xADDF}, //334 #HANGUL SYLLABLE KIYEOK YU KIYEOKSIOS
+ {0x82E9, 0xADE1}, //335 #HANGUL SYLLABLE KIYEOK YU NIEUNCIEUC
+ {0x82EA, 0xADE2}, //336 #HANGUL SYLLABLE KIYEOK YU NIEUNHIEUH
+ {0x82EB, 0xADE3}, //337 #HANGUL SYLLABLE KIYEOK YU TIKEUT
+ {0x82EC, 0xADE5}, //338 #HANGUL SYLLABLE KIYEOK YU RIEULKIYEOK
+ {0x82ED, 0xADE6}, //339 #HANGUL SYLLABLE KIYEOK YU RIEULMIEUM
+ {0x82EE, 0xADE7}, //340 #HANGUL SYLLABLE KIYEOK YU RIEULPIEUP
+ {0x82EF, 0xADE8}, //341 #HANGUL SYLLABLE KIYEOK YU RIEULSIOS
+ {0x82F0, 0xADE9}, //342 #HANGUL SYLLABLE KIYEOK YU RIEULTHIEUTH
+ {0x82F1, 0xADEA}, //343 #HANGUL SYLLABLE KIYEOK YU RIEULPHIEUPH
+ {0x82F2, 0xADEB}, //344 #HANGUL SYLLABLE KIYEOK YU RIEULHIEUH
+ {0x82F3, 0xADEC}, //345 #HANGUL SYLLABLE KIYEOK YU MIEUM
+ {0x82F4, 0xADED}, //346 #HANGUL SYLLABLE KIYEOK YU PIEUP
+ {0x82F5, 0xADEE}, //347 #HANGUL SYLLABLE KIYEOK YU PIEUPSIOS
+ {0x82F6, 0xADEF}, //348 #HANGUL SYLLABLE KIYEOK YU SIOS
+ {0x82F7, 0xADF0}, //349 #HANGUL SYLLABLE KIYEOK YU SSANGSIOS
+ {0x82F8, 0xADF1}, //350 #HANGUL SYLLABLE KIYEOK YU IEUNG
+ {0x82F9, 0xADF2}, //351 #HANGUL SYLLABLE KIYEOK YU CIEUC
+ {0x82FA, 0xADF3}, //352 #HANGUL SYLLABLE KIYEOK YU CHIEUCH
+ {0x82FB, 0xADF4}, //353 #HANGUL SYLLABLE KIYEOK YU KHIEUKH
+ {0x82FC, 0xADF5}, //354 #HANGUL SYLLABLE KIYEOK YU THIEUTH
+ {0x82FD, 0xADF6}, //355 #HANGUL SYLLABLE KIYEOK YU PHIEUPH
+ {0x82FE, 0xADF7}, //356 #HANGUL SYLLABLE KIYEOK YU HIEUH
+ {0x8341, 0xADFA}, //357 #HANGUL SYLLABLE KIYEOK EU SSANGKIYEOK
+ {0x8342, 0xADFB}, //358 #HANGUL SYLLABLE KIYEOK EU KIYEOKSIOS
+ {0x8343, 0xADFD}, //359 #HANGUL SYLLABLE KIYEOK EU NIEUNCIEUC
+ {0x8344, 0xADFE}, //360 #HANGUL SYLLABLE KIYEOK EU NIEUNHIEUH
+ {0x8345, 0xAE02}, //361 #HANGUL SYLLABLE KIYEOK EU RIEULMIEUM
+ {0x8346, 0xAE03}, //362 #HANGUL SYLLABLE KIYEOK EU RIEULPIEUP
+ {0x8347, 0xAE04}, //363 #HANGUL SYLLABLE KIYEOK EU RIEULSIOS
+ {0x8348, 0xAE05}, //364 #HANGUL SYLLABLE KIYEOK EU RIEULTHIEUTH
+ {0x8349, 0xAE06}, //365 #HANGUL SYLLABLE KIYEOK EU RIEULPHIEUPH
+ {0x834A, 0xAE07}, //366 #HANGUL SYLLABLE KIYEOK EU RIEULHIEUH
+ {0x834B, 0xAE0A}, //367 #HANGUL SYLLABLE KIYEOK EU PIEUPSIOS
+ {0x834C, 0xAE0C}, //368 #HANGUL SYLLABLE KIYEOK EU SSANGSIOS
+ {0x834D, 0xAE0E}, //369 #HANGUL SYLLABLE KIYEOK EU CIEUC
+ {0x834E, 0xAE0F}, //370 #HANGUL SYLLABLE KIYEOK EU CHIEUCH
+ {0x834F, 0xAE10}, //371 #HANGUL SYLLABLE KIYEOK EU KHIEUKH
+ {0x8350, 0xAE11}, //372 #HANGUL SYLLABLE KIYEOK EU THIEUTH
+ {0x8351, 0xAE12}, //373 #HANGUL SYLLABLE KIYEOK EU PHIEUPH
+ {0x8352, 0xAE13}, //374 #HANGUL SYLLABLE KIYEOK EU HIEUH
+ {0x8353, 0xAE15}, //375 #HANGUL SYLLABLE KIYEOK YI KIYEOK
+ {0x8354, 0xAE16}, //376 #HANGUL SYLLABLE KIYEOK YI SSANGKIYEOK
+ {0x8355, 0xAE17}, //377 #HANGUL SYLLABLE KIYEOK YI KIYEOKSIOS
+ {0x8356, 0xAE18}, //378 #HANGUL SYLLABLE KIYEOK YI NIEUN
+ {0x8357, 0xAE19}, //379 #HANGUL SYLLABLE KIYEOK YI NIEUNCIEUC
+ {0x8358, 0xAE1A}, //380 #HANGUL SYLLABLE KIYEOK YI NIEUNHIEUH
+ {0x8359, 0xAE1B}, //381 #HANGUL SYLLABLE KIYEOK YI TIKEUT
+ {0x835A, 0xAE1C}, //382 #HANGUL SYLLABLE KIYEOK YI RIEUL
+ {0x8361, 0xAE1D}, //383 #HANGUL SYLLABLE KIYEOK YI RIEULKIYEOK
+ {0x8362, 0xAE1E}, //384 #HANGUL SYLLABLE KIYEOK YI RIEULMIEUM
+ {0x8363, 0xAE1F}, //385 #HANGUL SYLLABLE KIYEOK YI RIEULPIEUP
+ {0x8364, 0xAE20}, //386 #HANGUL SYLLABLE KIYEOK YI RIEULSIOS
+ {0x8365, 0xAE21}, //387 #HANGUL SYLLABLE KIYEOK YI RIEULTHIEUTH
+ {0x8366, 0xAE22}, //388 #HANGUL SYLLABLE KIYEOK YI RIEULPHIEUPH
+ {0x8367, 0xAE23}, //389 #HANGUL SYLLABLE KIYEOK YI RIEULHIEUH
+ {0x8368, 0xAE24}, //390 #HANGUL SYLLABLE KIYEOK YI MIEUM
+ {0x8369, 0xAE25}, //391 #HANGUL SYLLABLE KIYEOK YI PIEUP
+ {0x836A, 0xAE26}, //392 #HANGUL SYLLABLE KIYEOK YI PIEUPSIOS
+ {0x836B, 0xAE27}, //393 #HANGUL SYLLABLE KIYEOK YI SIOS
+ {0x836C, 0xAE28}, //394 #HANGUL SYLLABLE KIYEOK YI SSANGSIOS
+ {0x836D, 0xAE29}, //395 #HANGUL SYLLABLE KIYEOK YI IEUNG
+ {0x836E, 0xAE2A}, //396 #HANGUL SYLLABLE KIYEOK YI CIEUC
+ {0x836F, 0xAE2B}, //397 #HANGUL SYLLABLE KIYEOK YI CHIEUCH
+ {0x8370, 0xAE2C}, //398 #HANGUL SYLLABLE KIYEOK YI KHIEUKH
+ {0x8371, 0xAE2D}, //399 #HANGUL SYLLABLE KIYEOK YI THIEUTH
+ {0x8372, 0xAE2E}, //400 #HANGUL SYLLABLE KIYEOK YI PHIEUPH
+ {0x8373, 0xAE2F}, //401 #HANGUL SYLLABLE KIYEOK YI HIEUH
+ {0x8374, 0xAE32}, //402 #HANGUL SYLLABLE KIYEOK I SSANGKIYEOK
+ {0x8375, 0xAE33}, //403 #HANGUL SYLLABLE KIYEOK I KIYEOKSIOS
+ {0x8376, 0xAE35}, //404 #HANGUL SYLLABLE KIYEOK I NIEUNCIEUC
+ {0x8377, 0xAE36}, //405 #HANGUL SYLLABLE KIYEOK I NIEUNHIEUH
+ {0x8378, 0xAE39}, //406 #HANGUL SYLLABLE KIYEOK I RIEULKIYEOK
+ {0x8379, 0xAE3B}, //407 #HANGUL SYLLABLE KIYEOK I RIEULPIEUP
+ {0x837A, 0xAE3C}, //408 #HANGUL SYLLABLE KIYEOK I RIEULSIOS
+ {0x8381, 0xAE3D}, //409 #HANGUL SYLLABLE KIYEOK I RIEULTHIEUTH
+ {0x8382, 0xAE3E}, //410 #HANGUL SYLLABLE KIYEOK I RIEULPHIEUPH
+ {0x8383, 0xAE3F}, //411 #HANGUL SYLLABLE KIYEOK I RIEULHIEUH
+ {0x8384, 0xAE42}, //412 #HANGUL SYLLABLE KIYEOK I PIEUPSIOS
+ {0x8385, 0xAE44}, //413 #HANGUL SYLLABLE KIYEOK I SSANGSIOS
+ {0x8386, 0xAE47}, //414 #HANGUL SYLLABLE KIYEOK I CHIEUCH
+ {0x8387, 0xAE48}, //415 #HANGUL SYLLABLE KIYEOK I KHIEUKH
+ {0x8388, 0xAE49}, //416 #HANGUL SYLLABLE KIYEOK I THIEUTH
+ {0x8389, 0xAE4B}, //417 #HANGUL SYLLABLE KIYEOK I HIEUH
+ {0x838A, 0xAE4F}, //418 #HANGUL SYLLABLE SSANGKIYEOK A KIYEOKSIOS
+ {0x838B, 0xAE51}, //419 #HANGUL SYLLABLE SSANGKIYEOK A NIEUNCIEUC
+ {0x838C, 0xAE52}, //420 #HANGUL SYLLABLE SSANGKIYEOK A NIEUNHIEUH
+ {0x838D, 0xAE53}, //421 #HANGUL SYLLABLE SSANGKIYEOK A TIKEUT
+ {0x838E, 0xAE55}, //422 #HANGUL SYLLABLE SSANGKIYEOK A RIEULKIYEOK
+ {0x838F, 0xAE57}, //423 #HANGUL SYLLABLE SSANGKIYEOK A RIEULPIEUP
+ {0x8390, 0xAE58}, //424 #HANGUL SYLLABLE SSANGKIYEOK A RIEULSIOS
+ {0x8391, 0xAE59}, //425 #HANGUL SYLLABLE SSANGKIYEOK A RIEULTHIEUTH
+ {0x8392, 0xAE5A}, //426 #HANGUL SYLLABLE SSANGKIYEOK A RIEULPHIEUPH
+ {0x8393, 0xAE5B}, //427 #HANGUL SYLLABLE SSANGKIYEOK A RIEULHIEUH
+ {0x8394, 0xAE5E}, //428 #HANGUL SYLLABLE SSANGKIYEOK A PIEUPSIOS
+ {0x8395, 0xAE62}, //429 #HANGUL SYLLABLE SSANGKIYEOK A CIEUC
+ {0x8396, 0xAE63}, //430 #HANGUL SYLLABLE SSANGKIYEOK A CHIEUCH
+ {0x8397, 0xAE64}, //431 #HANGUL SYLLABLE SSANGKIYEOK A KHIEUKH
+ {0x8398, 0xAE66}, //432 #HANGUL SYLLABLE SSANGKIYEOK A PHIEUPH
+ {0x8399, 0xAE67}, //433 #HANGUL SYLLABLE SSANGKIYEOK A HIEUH
+ {0x839A, 0xAE6A}, //434 #HANGUL SYLLABLE SSANGKIYEOK AE SSANGKIYEOK
+ {0x839B, 0xAE6B}, //435 #HANGUL SYLLABLE SSANGKIYEOK AE KIYEOKSIOS
+ {0x839C, 0xAE6D}, //436 #HANGUL SYLLABLE SSANGKIYEOK AE NIEUNCIEUC
+ {0x839D, 0xAE6E}, //437 #HANGUL SYLLABLE SSANGKIYEOK AE NIEUNHIEUH
+ {0x839E, 0xAE6F}, //438 #HANGUL SYLLABLE SSANGKIYEOK AE TIKEUT
+ {0x839F, 0xAE71}, //439 #HANGUL SYLLABLE SSANGKIYEOK AE RIEULKIYEOK
+ {0x83A0, 0xAE72}, //440 #HANGUL SYLLABLE SSANGKIYEOK AE RIEULMIEUM
+ {0x83A1, 0xAE73}, //441 #HANGUL SYLLABLE SSANGKIYEOK AE RIEULPIEUP
+ {0x83A2, 0xAE74}, //442 #HANGUL SYLLABLE SSANGKIYEOK AE RIEULSIOS
+ {0x83A3, 0xAE75}, //443 #HANGUL SYLLABLE SSANGKIYEOK AE RIEULTHIEUTH
+ {0x83A4, 0xAE76}, //444 #HANGUL SYLLABLE SSANGKIYEOK AE RIEULPHIEUPH
+ {0x83A5, 0xAE77}, //445 #HANGUL SYLLABLE SSANGKIYEOK AE RIEULHIEUH
+ {0x83A6, 0xAE7A}, //446 #HANGUL SYLLABLE SSANGKIYEOK AE PIEUPSIOS
+ {0x83A7, 0xAE7E}, //447 #HANGUL SYLLABLE SSANGKIYEOK AE CIEUC
+ {0x83A8, 0xAE7F}, //448 #HANGUL SYLLABLE SSANGKIYEOK AE CHIEUCH
+ {0x83A9, 0xAE80}, //449 #HANGUL SYLLABLE SSANGKIYEOK AE KHIEUKH
+ {0x83AA, 0xAE81}, //450 #HANGUL SYLLABLE SSANGKIYEOK AE THIEUTH
+ {0x83AB, 0xAE82}, //451 #HANGUL SYLLABLE SSANGKIYEOK AE PHIEUPH
+ {0x83AC, 0xAE83}, //452 #HANGUL SYLLABLE SSANGKIYEOK AE HIEUH
+ {0x83AD, 0xAE86}, //453 #HANGUL SYLLABLE SSANGKIYEOK YA SSANGKIYEOK
+ {0x83AE, 0xAE87}, //454 #HANGUL SYLLABLE SSANGKIYEOK YA KIYEOKSIOS
+ {0x83AF, 0xAE88}, //455 #HANGUL SYLLABLE SSANGKIYEOK YA NIEUN
+ {0x83B0, 0xAE89}, //456 #HANGUL SYLLABLE SSANGKIYEOK YA NIEUNCIEUC
+ {0x83B1, 0xAE8A}, //457 #HANGUL SYLLABLE SSANGKIYEOK YA NIEUNHIEUH
+ {0x83B2, 0xAE8B}, //458 #HANGUL SYLLABLE SSANGKIYEOK YA TIKEUT
+ {0x83B3, 0xAE8D}, //459 #HANGUL SYLLABLE SSANGKIYEOK YA RIEULKIYEOK
+ {0x83B4, 0xAE8E}, //460 #HANGUL SYLLABLE SSANGKIYEOK YA RIEULMIEUM
+ {0x83B5, 0xAE8F}, //461 #HANGUL SYLLABLE SSANGKIYEOK YA RIEULPIEUP
+ {0x83B6, 0xAE90}, //462 #HANGUL SYLLABLE SSANGKIYEOK YA RIEULSIOS
+ {0x83B7, 0xAE91}, //463 #HANGUL SYLLABLE SSANGKIYEOK YA RIEULTHIEUTH
+ {0x83B8, 0xAE92}, //464 #HANGUL SYLLABLE SSANGKIYEOK YA RIEULPHIEUPH
+ {0x83B9, 0xAE93}, //465 #HANGUL SYLLABLE SSANGKIYEOK YA RIEULHIEUH
+ {0x83BA, 0xAE94}, //466 #HANGUL SYLLABLE SSANGKIYEOK YA MIEUM
+ {0x83BB, 0xAE95}, //467 #HANGUL SYLLABLE SSANGKIYEOK YA PIEUP
+ {0x83BC, 0xAE96}, //468 #HANGUL SYLLABLE SSANGKIYEOK YA PIEUPSIOS
+ {0x83BD, 0xAE97}, //469 #HANGUL SYLLABLE SSANGKIYEOK YA SIOS
+ {0x83BE, 0xAE98}, //470 #HANGUL SYLLABLE SSANGKIYEOK YA SSANGSIOS
+ {0x83BF, 0xAE99}, //471 #HANGUL SYLLABLE SSANGKIYEOK YA IEUNG
+ {0x83C0, 0xAE9A}, //472 #HANGUL SYLLABLE SSANGKIYEOK YA CIEUC
+ {0x83C1, 0xAE9B}, //473 #HANGUL SYLLABLE SSANGKIYEOK YA CHIEUCH
+ {0x83C2, 0xAE9C}, //474 #HANGUL SYLLABLE SSANGKIYEOK YA KHIEUKH
+ {0x83C3, 0xAE9D}, //475 #HANGUL SYLLABLE SSANGKIYEOK YA THIEUTH
+ {0x83C4, 0xAE9E}, //476 #HANGUL SYLLABLE SSANGKIYEOK YA PHIEUPH
+ {0x83C5, 0xAE9F}, //477 #HANGUL SYLLABLE SSANGKIYEOK YA HIEUH
+ {0x83C6, 0xAEA0}, //478 #HANGUL SYLLABLE SSANGKIYEOK YAE
+ {0x83C7, 0xAEA1}, //479 #HANGUL SYLLABLE SSANGKIYEOK YAE KIYEOK
+ {0x83C8, 0xAEA2}, //480 #HANGUL SYLLABLE SSANGKIYEOK YAE SSANGKIYEOK
+ {0x83C9, 0xAEA3}, //481 #HANGUL SYLLABLE SSANGKIYEOK YAE KIYEOKSIOS
+ {0x83CA, 0xAEA4}, //482 #HANGUL SYLLABLE SSANGKIYEOK YAE NIEUN
+ {0x83CB, 0xAEA5}, //483 #HANGUL SYLLABLE SSANGKIYEOK YAE NIEUNCIEUC
+ {0x83CC, 0xAEA6}, //484 #HANGUL SYLLABLE SSANGKIYEOK YAE NIEUNHIEUH
+ {0x83CD, 0xAEA7}, //485 #HANGUL SYLLABLE SSANGKIYEOK YAE TIKEUT
+ {0x83CE, 0xAEA8}, //486 #HANGUL SYLLABLE SSANGKIYEOK YAE RIEUL
+ {0x83CF, 0xAEA9}, //487 #HANGUL SYLLABLE SSANGKIYEOK YAE RIEULKIYEOK
+ {0x83D0, 0xAEAA}, //488 #HANGUL SYLLABLE SSANGKIYEOK YAE RIEULMIEUM
+ {0x83D1, 0xAEAB}, //489 #HANGUL SYLLABLE SSANGKIYEOK YAE RIEULPIEUP
+ {0x83D2, 0xAEAC}, //490 #HANGUL SYLLABLE SSANGKIYEOK YAE RIEULSIOS
+ {0x83D3, 0xAEAD}, //491 #HANGUL SYLLABLE SSANGKIYEOK YAE RIEULTHIEUTH
+ {0x83D4, 0xAEAE}, //492 #HANGUL SYLLABLE SSANGKIYEOK YAE RIEULPHIEUPH
+ {0x83D5, 0xAEAF}, //493 #HANGUL SYLLABLE SSANGKIYEOK YAE RIEULHIEUH
+ {0x83D6, 0xAEB0}, //494 #HANGUL SYLLABLE SSANGKIYEOK YAE MIEUM
+ {0x83D7, 0xAEB1}, //495 #HANGUL SYLLABLE SSANGKIYEOK YAE PIEUP
+ {0x83D8, 0xAEB2}, //496 #HANGUL SYLLABLE SSANGKIYEOK YAE PIEUPSIOS
+ {0x83D9, 0xAEB3}, //497 #HANGUL SYLLABLE SSANGKIYEOK YAE SIOS
+ {0x83DA, 0xAEB4}, //498 #HANGUL SYLLABLE SSANGKIYEOK YAE SSANGSIOS
+ {0x83DB, 0xAEB5}, //499 #HANGUL SYLLABLE SSANGKIYEOK YAE IEUNG
+ {0x83DC, 0xAEB6}, //500 #HANGUL SYLLABLE SSANGKIYEOK YAE CIEUC
+ {0x83DD, 0xAEB7}, //501 #HANGUL SYLLABLE SSANGKIYEOK YAE CHIEUCH
+ {0x83DE, 0xAEB8}, //502 #HANGUL SYLLABLE SSANGKIYEOK YAE KHIEUKH
+ {0x83DF, 0xAEB9}, //503 #HANGUL SYLLABLE SSANGKIYEOK YAE THIEUTH
+ {0x83E0, 0xAEBA}, //504 #HANGUL SYLLABLE SSANGKIYEOK YAE PHIEUPH
+ {0x83E1, 0xAEBB}, //505 #HANGUL SYLLABLE SSANGKIYEOK YAE HIEUH
+ {0x83E2, 0xAEBF}, //506 #HANGUL SYLLABLE SSANGKIYEOK EO KIYEOKSIOS
+ {0x83E3, 0xAEC1}, //507 #HANGUL SYLLABLE SSANGKIYEOK EO NIEUNCIEUC
+ {0x83E4, 0xAEC2}, //508 #HANGUL SYLLABLE SSANGKIYEOK EO NIEUNHIEUH
+ {0x83E5, 0xAEC3}, //509 #HANGUL SYLLABLE SSANGKIYEOK EO TIKEUT
+ {0x83E6, 0xAEC5}, //510 #HANGUL SYLLABLE SSANGKIYEOK EO RIEULKIYEOK
+ {0x83E7, 0xAEC6}, //511 #HANGUL SYLLABLE SSANGKIYEOK EO RIEULMIEUM
+ {0x83E8, 0xAEC7}, //512 #HANGUL SYLLABLE SSANGKIYEOK EO RIEULPIEUP
+ {0x83E9, 0xAEC8}, //513 #HANGUL SYLLABLE SSANGKIYEOK EO RIEULSIOS
+ {0x83EA, 0xAEC9}, //514 #HANGUL SYLLABLE SSANGKIYEOK EO RIEULTHIEUTH
+ {0x83EB, 0xAECA}, //515 #HANGUL SYLLABLE SSANGKIYEOK EO RIEULPHIEUPH
+ {0x83EC, 0xAECB}, //516 #HANGUL SYLLABLE SSANGKIYEOK EO RIEULHIEUH
+ {0x83ED, 0xAECE}, //517 #HANGUL SYLLABLE SSANGKIYEOK EO PIEUPSIOS
+ {0x83EE, 0xAED2}, //518 #HANGUL SYLLABLE SSANGKIYEOK EO CIEUC
+ {0x83EF, 0xAED3}, //519 #HANGUL SYLLABLE SSANGKIYEOK EO CHIEUCH
+ {0x83F0, 0xAED4}, //520 #HANGUL SYLLABLE SSANGKIYEOK EO KHIEUKH
+ {0x83F1, 0xAED5}, //521 #HANGUL SYLLABLE SSANGKIYEOK EO THIEUTH
+ {0x83F2, 0xAED6}, //522 #HANGUL SYLLABLE SSANGKIYEOK EO PHIEUPH
+ {0x83F3, 0xAED7}, //523 #HANGUL SYLLABLE SSANGKIYEOK EO HIEUH
+ {0x83F4, 0xAEDA}, //524 #HANGUL SYLLABLE SSANGKIYEOK E SSANGKIYEOK
+ {0x83F5, 0xAEDB}, //525 #HANGUL SYLLABLE SSANGKIYEOK E KIYEOKSIOS
+ {0x83F6, 0xAEDD}, //526 #HANGUL SYLLABLE SSANGKIYEOK E NIEUNCIEUC
+ {0x83F7, 0xAEDE}, //527 #HANGUL SYLLABLE SSANGKIYEOK E NIEUNHIEUH
+ {0x83F8, 0xAEDF}, //528 #HANGUL SYLLABLE SSANGKIYEOK E TIKEUT
+ {0x83F9, 0xAEE0}, //529 #HANGUL SYLLABLE SSANGKIYEOK E RIEUL
+ {0x83FA, 0xAEE1}, //530 #HANGUL SYLLABLE SSANGKIYEOK E RIEULKIYEOK
+ {0x83FB, 0xAEE2}, //531 #HANGUL SYLLABLE SSANGKIYEOK E RIEULMIEUM
+ {0x83FC, 0xAEE3}, //532 #HANGUL SYLLABLE SSANGKIYEOK E RIEULPIEUP
+ {0x83FD, 0xAEE4}, //533 #HANGUL SYLLABLE SSANGKIYEOK E RIEULSIOS
+ {0x83FE, 0xAEE5}, //534 #HANGUL SYLLABLE SSANGKIYEOK E RIEULTHIEUTH
+ {0x8441, 0xAEE6}, //535 #HANGUL SYLLABLE SSANGKIYEOK E RIEULPHIEUPH
+ {0x8442, 0xAEE7}, //536 #HANGUL SYLLABLE SSANGKIYEOK E RIEULHIEUH
+ {0x8443, 0xAEE9}, //537 #HANGUL SYLLABLE SSANGKIYEOK E PIEUP
+ {0x8444, 0xAEEA}, //538 #HANGUL SYLLABLE SSANGKIYEOK E PIEUPSIOS
+ {0x8445, 0xAEEC}, //539 #HANGUL SYLLABLE SSANGKIYEOK E SSANGSIOS
+ {0x8446, 0xAEEE}, //540 #HANGUL SYLLABLE SSANGKIYEOK E CIEUC
+ {0x8447, 0xAEEF}, //541 #HANGUL SYLLABLE SSANGKIYEOK E CHIEUCH
+ {0x8448, 0xAEF0}, //542 #HANGUL SYLLABLE SSANGKIYEOK E KHIEUKH
+ {0x8449, 0xAEF1}, //543 #HANGUL SYLLABLE SSANGKIYEOK E THIEUTH
+ {0x844A, 0xAEF2}, //544 #HANGUL SYLLABLE SSANGKIYEOK E PHIEUPH
+ {0x844B, 0xAEF3}, //545 #HANGUL SYLLABLE SSANGKIYEOK E HIEUH
+ {0x844C, 0xAEF5}, //546 #HANGUL SYLLABLE SSANGKIYEOK YEO KIYEOK
+ {0x844D, 0xAEF6}, //547 #HANGUL SYLLABLE SSANGKIYEOK YEO SSANGKIYEOK
+ {0x844E, 0xAEF7}, //548 #HANGUL SYLLABLE SSANGKIYEOK YEO KIYEOKSIOS
+ {0x844F, 0xAEF9}, //549 #HANGUL SYLLABLE SSANGKIYEOK YEO NIEUNCIEUC
+ {0x8450, 0xAEFA}, //550 #HANGUL SYLLABLE SSANGKIYEOK YEO NIEUNHIEUH
+ {0x8451, 0xAEFB}, //551 #HANGUL SYLLABLE SSANGKIYEOK YEO TIKEUT
+ {0x8452, 0xAEFD}, //552 #HANGUL SYLLABLE SSANGKIYEOK YEO RIEULKIYEOK
+ {0x8453, 0xAEFE}, //553 #HANGUL SYLLABLE SSANGKIYEOK YEO RIEULMIEUM
+ {0x8454, 0xAEFF}, //554 #HANGUL SYLLABLE SSANGKIYEOK YEO RIEULPIEUP
+ {0x8455, 0xAF00}, //555 #HANGUL SYLLABLE SSANGKIYEOK YEO RIEULSIOS
+ {0x8456, 0xAF01}, //556 #HANGUL SYLLABLE SSANGKIYEOK YEO RIEULTHIEUTH
+ {0x8457, 0xAF02}, //557 #HANGUL SYLLABLE SSANGKIYEOK YEO RIEULPHIEUPH
+ {0x8458, 0xAF03}, //558 #HANGUL SYLLABLE SSANGKIYEOK YEO RIEULHIEUH
+ {0x8459, 0xAF04}, //559 #HANGUL SYLLABLE SSANGKIYEOK YEO MIEUM
+ {0x845A, 0xAF05}, //560 #HANGUL SYLLABLE SSANGKIYEOK YEO PIEUP
+ {0x8461, 0xAF06}, //561 #HANGUL SYLLABLE SSANGKIYEOK YEO PIEUPSIOS
+ {0x8462, 0xAF09}, //562 #HANGUL SYLLABLE SSANGKIYEOK YEO IEUNG
+ {0x8463, 0xAF0A}, //563 #HANGUL SYLLABLE SSANGKIYEOK YEO CIEUC
+ {0x8464, 0xAF0B}, //564 #HANGUL SYLLABLE SSANGKIYEOK YEO CHIEUCH
+ {0x8465, 0xAF0C}, //565 #HANGUL SYLLABLE SSANGKIYEOK YEO KHIEUKH
+ {0x8466, 0xAF0E}, //566 #HANGUL SYLLABLE SSANGKIYEOK YEO PHIEUPH
+ {0x8467, 0xAF0F}, //567 #HANGUL SYLLABLE SSANGKIYEOK YEO HIEUH
+ {0x8468, 0xAF11}, //568 #HANGUL SYLLABLE SSANGKIYEOK YE KIYEOK
+ {0x8469, 0xAF12}, //569 #HANGUL SYLLABLE SSANGKIYEOK YE SSANGKIYEOK
+ {0x846A, 0xAF13}, //570 #HANGUL SYLLABLE SSANGKIYEOK YE KIYEOKSIOS
+ {0x846B, 0xAF14}, //571 #HANGUL SYLLABLE SSANGKIYEOK YE NIEUN
+ {0x846C, 0xAF15}, //572 #HANGUL SYLLABLE SSANGKIYEOK YE NIEUNCIEUC
+ {0x846D, 0xAF16}, //573 #HANGUL SYLLABLE SSANGKIYEOK YE NIEUNHIEUH
+ {0x846E, 0xAF17}, //574 #HANGUL SYLLABLE SSANGKIYEOK YE TIKEUT
+ {0x846F, 0xAF18}, //575 #HANGUL SYLLABLE SSANGKIYEOK YE RIEUL
+ {0x8470, 0xAF19}, //576 #HANGUL SYLLABLE SSANGKIYEOK YE RIEULKIYEOK
+ {0x8471, 0xAF1A}, //577 #HANGUL SYLLABLE SSANGKIYEOK YE RIEULMIEUM
+ {0x8472, 0xAF1B}, //578 #HANGUL SYLLABLE SSANGKIYEOK YE RIEULPIEUP
+ {0x8473, 0xAF1C}, //579 #HANGUL SYLLABLE SSANGKIYEOK YE RIEULSIOS
+ {0x8474, 0xAF1D}, //580 #HANGUL SYLLABLE SSANGKIYEOK YE RIEULTHIEUTH
+ {0x8475, 0xAF1E}, //581 #HANGUL SYLLABLE SSANGKIYEOK YE RIEULPHIEUPH
+ {0x8476, 0xAF1F}, //582 #HANGUL SYLLABLE SSANGKIYEOK YE RIEULHIEUH
+ {0x8477, 0xAF20}, //583 #HANGUL SYLLABLE SSANGKIYEOK YE MIEUM
+ {0x8478, 0xAF21}, //584 #HANGUL SYLLABLE SSANGKIYEOK YE PIEUP
+ {0x8479, 0xAF22}, //585 #HANGUL SYLLABLE SSANGKIYEOK YE PIEUPSIOS
+ {0x847A, 0xAF23}, //586 #HANGUL SYLLABLE SSANGKIYEOK YE SIOS
+ {0x8481, 0xAF24}, //587 #HANGUL SYLLABLE SSANGKIYEOK YE SSANGSIOS
+ {0x8482, 0xAF25}, //588 #HANGUL SYLLABLE SSANGKIYEOK YE IEUNG
+ {0x8483, 0xAF26}, //589 #HANGUL SYLLABLE SSANGKIYEOK YE CIEUC
+ {0x8484, 0xAF27}, //590 #HANGUL SYLLABLE SSANGKIYEOK YE CHIEUCH
+ {0x8485, 0xAF28}, //591 #HANGUL SYLLABLE SSANGKIYEOK YE KHIEUKH
+ {0x8486, 0xAF29}, //592 #HANGUL SYLLABLE SSANGKIYEOK YE THIEUTH
+ {0x8487, 0xAF2A}, //593 #HANGUL SYLLABLE SSANGKIYEOK YE PHIEUPH
+ {0x8488, 0xAF2B}, //594 #HANGUL SYLLABLE SSANGKIYEOK YE HIEUH
+ {0x8489, 0xAF2E}, //595 #HANGUL SYLLABLE SSANGKIYEOK O SSANGKIYEOK
+ {0x848A, 0xAF2F}, //596 #HANGUL SYLLABLE SSANGKIYEOK O KIYEOKSIOS
+ {0x848B, 0xAF31}, //597 #HANGUL SYLLABLE SSANGKIYEOK O NIEUNCIEUC
+ {0x848C, 0xAF33}, //598 #HANGUL SYLLABLE SSANGKIYEOK O TIKEUT
+ {0x848D, 0xAF35}, //599 #HANGUL SYLLABLE SSANGKIYEOK O RIEULKIYEOK
+ {0x848E, 0xAF36}, //600 #HANGUL SYLLABLE SSANGKIYEOK O RIEULMIEUM
+ {0x848F, 0xAF37}, //601 #HANGUL SYLLABLE SSANGKIYEOK O RIEULPIEUP
+ {0x8490, 0xAF38}, //602 #HANGUL SYLLABLE SSANGKIYEOK O RIEULSIOS
+ {0x8491, 0xAF39}, //603 #HANGUL SYLLABLE SSANGKIYEOK O RIEULTHIEUTH
+ {0x8492, 0xAF3A}, //604 #HANGUL SYLLABLE SSANGKIYEOK O RIEULPHIEUPH
+ {0x8493, 0xAF3B}, //605 #HANGUL SYLLABLE SSANGKIYEOK O RIEULHIEUH
+ {0x8494, 0xAF3E}, //606 #HANGUL SYLLABLE SSANGKIYEOK O PIEUPSIOS
+ {0x8495, 0xAF40}, //607 #HANGUL SYLLABLE SSANGKIYEOK O SSANGSIOS
+ {0x8496, 0xAF44}, //608 #HANGUL SYLLABLE SSANGKIYEOK O KHIEUKH
+ {0x8497, 0xAF45}, //609 #HANGUL SYLLABLE SSANGKIYEOK O THIEUTH
+ {0x8498, 0xAF46}, //610 #HANGUL SYLLABLE SSANGKIYEOK O PHIEUPH
+ {0x8499, 0xAF47}, //611 #HANGUL SYLLABLE SSANGKIYEOK O HIEUH
+ {0x849A, 0xAF4A}, //612 #HANGUL SYLLABLE SSANGKIYEOK WA SSANGKIYEOK
+ {0x849B, 0xAF4B}, //613 #HANGUL SYLLABLE SSANGKIYEOK WA KIYEOKSIOS
+ {0x849C, 0xAF4C}, //614 #HANGUL SYLLABLE SSANGKIYEOK WA NIEUN
+ {0x849D, 0xAF4D}, //615 #HANGUL SYLLABLE SSANGKIYEOK WA NIEUNCIEUC
+ {0x849E, 0xAF4E}, //616 #HANGUL SYLLABLE SSANGKIYEOK WA NIEUNHIEUH
+ {0x849F, 0xAF4F}, //617 #HANGUL SYLLABLE SSANGKIYEOK WA TIKEUT
+ {0x84A0, 0xAF51}, //618 #HANGUL SYLLABLE SSANGKIYEOK WA RIEULKIYEOK
+ {0x84A1, 0xAF52}, //619 #HANGUL SYLLABLE SSANGKIYEOK WA RIEULMIEUM
+ {0x84A2, 0xAF53}, //620 #HANGUL SYLLABLE SSANGKIYEOK WA RIEULPIEUP
+ {0x84A3, 0xAF54}, //621 #HANGUL SYLLABLE SSANGKIYEOK WA RIEULSIOS
+ {0x84A4, 0xAF55}, //622 #HANGUL SYLLABLE SSANGKIYEOK WA RIEULTHIEUTH
+ {0x84A5, 0xAF56}, //623 #HANGUL SYLLABLE SSANGKIYEOK WA RIEULPHIEUPH
+ {0x84A6, 0xAF57}, //624 #HANGUL SYLLABLE SSANGKIYEOK WA RIEULHIEUH
+ {0x84A7, 0xAF58}, //625 #HANGUL SYLLABLE SSANGKIYEOK WA MIEUM
+ {0x84A8, 0xAF59}, //626 #HANGUL SYLLABLE SSANGKIYEOK WA PIEUP
+ {0x84A9, 0xAF5A}, //627 #HANGUL SYLLABLE SSANGKIYEOK WA PIEUPSIOS
+ {0x84AA, 0xAF5B}, //628 #HANGUL SYLLABLE SSANGKIYEOK WA SIOS
+ {0x84AB, 0xAF5E}, //629 #HANGUL SYLLABLE SSANGKIYEOK WA CIEUC
+ {0x84AC, 0xAF5F}, //630 #HANGUL SYLLABLE SSANGKIYEOK WA CHIEUCH
+ {0x84AD, 0xAF60}, //631 #HANGUL SYLLABLE SSANGKIYEOK WA KHIEUKH
+ {0x84AE, 0xAF61}, //632 #HANGUL SYLLABLE SSANGKIYEOK WA THIEUTH
+ {0x84AF, 0xAF62}, //633 #HANGUL SYLLABLE SSANGKIYEOK WA PHIEUPH
+ {0x84B0, 0xAF63}, //634 #HANGUL SYLLABLE SSANGKIYEOK WA HIEUH
+ {0x84B1, 0xAF66}, //635 #HANGUL SYLLABLE SSANGKIYEOK WAE SSANGKIYEOK
+ {0x84B2, 0xAF67}, //636 #HANGUL SYLLABLE SSANGKIYEOK WAE KIYEOKSIOS
+ {0x84B3, 0xAF68}, //637 #HANGUL SYLLABLE SSANGKIYEOK WAE NIEUN
+ {0x84B4, 0xAF69}, //638 #HANGUL SYLLABLE SSANGKIYEOK WAE NIEUNCIEUC
+ {0x84B5, 0xAF6A}, //639 #HANGUL SYLLABLE SSANGKIYEOK WAE NIEUNHIEUH
+ {0x84B6, 0xAF6B}, //640 #HANGUL SYLLABLE SSANGKIYEOK WAE TIKEUT
+ {0x84B7, 0xAF6C}, //641 #HANGUL SYLLABLE SSANGKIYEOK WAE RIEUL
+ {0x84B8, 0xAF6D}, //642 #HANGUL SYLLABLE SSANGKIYEOK WAE RIEULKIYEOK
+ {0x84B9, 0xAF6E}, //643 #HANGUL SYLLABLE SSANGKIYEOK WAE RIEULMIEUM
+ {0x84BA, 0xAF6F}, //644 #HANGUL SYLLABLE SSANGKIYEOK WAE RIEULPIEUP
+ {0x84BB, 0xAF70}, //645 #HANGUL SYLLABLE SSANGKIYEOK WAE RIEULSIOS
+ {0x84BC, 0xAF71}, //646 #HANGUL SYLLABLE SSANGKIYEOK WAE RIEULTHIEUTH
+ {0x84BD, 0xAF72}, //647 #HANGUL SYLLABLE SSANGKIYEOK WAE RIEULPHIEUPH
+ {0x84BE, 0xAF73}, //648 #HANGUL SYLLABLE SSANGKIYEOK WAE RIEULHIEUH
+ {0x84BF, 0xAF74}, //649 #HANGUL SYLLABLE SSANGKIYEOK WAE MIEUM
+ {0x84C0, 0xAF75}, //650 #HANGUL SYLLABLE SSANGKIYEOK WAE PIEUP
+ {0x84C1, 0xAF76}, //651 #HANGUL SYLLABLE SSANGKIYEOK WAE PIEUPSIOS
+ {0x84C2, 0xAF77}, //652 #HANGUL SYLLABLE SSANGKIYEOK WAE SIOS
+ {0x84C3, 0xAF78}, //653 #HANGUL SYLLABLE SSANGKIYEOK WAE SSANGSIOS
+ {0x84C4, 0xAF7A}, //654 #HANGUL SYLLABLE SSANGKIYEOK WAE CIEUC
+ {0x84C5, 0xAF7B}, //655 #HANGUL SYLLABLE SSANGKIYEOK WAE CHIEUCH
+ {0x84C6, 0xAF7C}, //656 #HANGUL SYLLABLE SSANGKIYEOK WAE KHIEUKH
+ {0x84C7, 0xAF7D}, //657 #HANGUL SYLLABLE SSANGKIYEOK WAE THIEUTH
+ {0x84C8, 0xAF7E}, //658 #HANGUL SYLLABLE SSANGKIYEOK WAE PHIEUPH
+ {0x84C9, 0xAF7F}, //659 #HANGUL SYLLABLE SSANGKIYEOK WAE HIEUH
+ {0x84CA, 0xAF81}, //660 #HANGUL SYLLABLE SSANGKIYEOK OE KIYEOK
+ {0x84CB, 0xAF82}, //661 #HANGUL SYLLABLE SSANGKIYEOK OE SSANGKIYEOK
+ {0x84CC, 0xAF83}, //662 #HANGUL SYLLABLE SSANGKIYEOK OE KIYEOKSIOS
+ {0x84CD, 0xAF85}, //663 #HANGUL SYLLABLE SSANGKIYEOK OE NIEUNCIEUC
+ {0x84CE, 0xAF86}, //664 #HANGUL SYLLABLE SSANGKIYEOK OE NIEUNHIEUH
+ {0x84CF, 0xAF87}, //665 #HANGUL SYLLABLE SSANGKIYEOK OE TIKEUT
+ {0x84D0, 0xAF89}, //666 #HANGUL SYLLABLE SSANGKIYEOK OE RIEULKIYEOK
+ {0x84D1, 0xAF8A}, //667 #HANGUL SYLLABLE SSANGKIYEOK OE RIEULMIEUM
+ {0x84D2, 0xAF8B}, //668 #HANGUL SYLLABLE SSANGKIYEOK OE RIEULPIEUP
+ {0x84D3, 0xAF8C}, //669 #HANGUL SYLLABLE SSANGKIYEOK OE RIEULSIOS
+ {0x84D4, 0xAF8D}, //670 #HANGUL SYLLABLE SSANGKIYEOK OE RIEULTHIEUTH
+ {0x84D5, 0xAF8E}, //671 #HANGUL SYLLABLE SSANGKIYEOK OE RIEULPHIEUPH
+ {0x84D6, 0xAF8F}, //672 #HANGUL SYLLABLE SSANGKIYEOK OE RIEULHIEUH
+ {0x84D7, 0xAF92}, //673 #HANGUL SYLLABLE SSANGKIYEOK OE PIEUPSIOS
+ {0x84D8, 0xAF93}, //674 #HANGUL SYLLABLE SSANGKIYEOK OE SIOS
+ {0x84D9, 0xAF94}, //675 #HANGUL SYLLABLE SSANGKIYEOK OE SSANGSIOS
+ {0x84DA, 0xAF96}, //676 #HANGUL SYLLABLE SSANGKIYEOK OE CIEUC
+ {0x84DB, 0xAF97}, //677 #HANGUL SYLLABLE SSANGKIYEOK OE CHIEUCH
+ {0x84DC, 0xAF98}, //678 #HANGUL SYLLABLE SSANGKIYEOK OE KHIEUKH
+ {0x84DD, 0xAF99}, //679 #HANGUL SYLLABLE SSANGKIYEOK OE THIEUTH
+ {0x84DE, 0xAF9A}, //680 #HANGUL SYLLABLE SSANGKIYEOK OE PHIEUPH
+ {0x84DF, 0xAF9B}, //681 #HANGUL SYLLABLE SSANGKIYEOK OE HIEUH
+ {0x84E0, 0xAF9D}, //682 #HANGUL SYLLABLE SSANGKIYEOK YO KIYEOK
+ {0x84E1, 0xAF9E}, //683 #HANGUL SYLLABLE SSANGKIYEOK YO SSANGKIYEOK
+ {0x84E2, 0xAF9F}, //684 #HANGUL SYLLABLE SSANGKIYEOK YO KIYEOKSIOS
+ {0x84E3, 0xAFA0}, //685 #HANGUL SYLLABLE SSANGKIYEOK YO NIEUN
+ {0x84E4, 0xAFA1}, //686 #HANGUL SYLLABLE SSANGKIYEOK YO NIEUNCIEUC
+ {0x84E5, 0xAFA2}, //687 #HANGUL SYLLABLE SSANGKIYEOK YO NIEUNHIEUH
+ {0x84E6, 0xAFA3}, //688 #HANGUL SYLLABLE SSANGKIYEOK YO TIKEUT
+ {0x84E7, 0xAFA4}, //689 #HANGUL SYLLABLE SSANGKIYEOK YO RIEUL
+ {0x84E8, 0xAFA5}, //690 #HANGUL SYLLABLE SSANGKIYEOK YO RIEULKIYEOK
+ {0x84E9, 0xAFA6}, //691 #HANGUL SYLLABLE SSANGKIYEOK YO RIEULMIEUM
+ {0x84EA, 0xAFA7}, //692 #HANGUL SYLLABLE SSANGKIYEOK YO RIEULPIEUP
+ {0x84EB, 0xAFA8}, //693 #HANGUL SYLLABLE SSANGKIYEOK YO RIEULSIOS
+ {0x84EC, 0xAFA9}, //694 #HANGUL SYLLABLE SSANGKIYEOK YO RIEULTHIEUTH
+ {0x84ED, 0xAFAA}, //695 #HANGUL SYLLABLE SSANGKIYEOK YO RIEULPHIEUPH
+ {0x84EE, 0xAFAB}, //696 #HANGUL SYLLABLE SSANGKIYEOK YO RIEULHIEUH
+ {0x84EF, 0xAFAC}, //697 #HANGUL SYLLABLE SSANGKIYEOK YO MIEUM
+ {0x84F0, 0xAFAD}, //698 #HANGUL SYLLABLE SSANGKIYEOK YO PIEUP
+ {0x84F1, 0xAFAE}, //699 #HANGUL SYLLABLE SSANGKIYEOK YO PIEUPSIOS
+ {0x84F2, 0xAFAF}, //700 #HANGUL SYLLABLE SSANGKIYEOK YO SIOS
+ {0x84F3, 0xAFB0}, //701 #HANGUL SYLLABLE SSANGKIYEOK YO SSANGSIOS
+ {0x84F4, 0xAFB1}, //702 #HANGUL SYLLABLE SSANGKIYEOK YO IEUNG
+ {0x84F5, 0xAFB2}, //703 #HANGUL SYLLABLE SSANGKIYEOK YO CIEUC
+ {0x84F6, 0xAFB3}, //704 #HANGUL SYLLABLE SSANGKIYEOK YO CHIEUCH
+ {0x84F7, 0xAFB4}, //705 #HANGUL SYLLABLE SSANGKIYEOK YO KHIEUKH
+ {0x84F8, 0xAFB5}, //706 #HANGUL SYLLABLE SSANGKIYEOK YO THIEUTH
+ {0x84F9, 0xAFB6}, //707 #HANGUL SYLLABLE SSANGKIYEOK YO PHIEUPH
+ {0x84FA, 0xAFB7}, //708 #HANGUL SYLLABLE SSANGKIYEOK YO HIEUH
+ {0x84FB, 0xAFBA}, //709 #HANGUL SYLLABLE SSANGKIYEOK U SSANGKIYEOK
+ {0x84FC, 0xAFBB}, //710 #HANGUL SYLLABLE SSANGKIYEOK U KIYEOKSIOS
+ {0x84FD, 0xAFBD}, //711 #HANGUL SYLLABLE SSANGKIYEOK U NIEUNCIEUC
+ {0x84FE, 0xAFBE}, //712 #HANGUL SYLLABLE SSANGKIYEOK U NIEUNHIEUH
+ {0x8541, 0xAFBF}, //713 #HANGUL SYLLABLE SSANGKIYEOK U TIKEUT
+ {0x8542, 0xAFC1}, //714 #HANGUL SYLLABLE SSANGKIYEOK U RIEULKIYEOK
+ {0x8543, 0xAFC2}, //715 #HANGUL SYLLABLE SSANGKIYEOK U RIEULMIEUM
+ {0x8544, 0xAFC3}, //716 #HANGUL SYLLABLE SSANGKIYEOK U RIEULPIEUP
+ {0x8545, 0xAFC4}, //717 #HANGUL SYLLABLE SSANGKIYEOK U RIEULSIOS
+ {0x8546, 0xAFC5}, //718 #HANGUL SYLLABLE SSANGKIYEOK U RIEULTHIEUTH
+ {0x8547, 0xAFC6}, //719 #HANGUL SYLLABLE SSANGKIYEOK U RIEULPHIEUPH
+ {0x8548, 0xAFCA}, //720 #HANGUL SYLLABLE SSANGKIYEOK U PIEUPSIOS
+ {0x8549, 0xAFCC}, //721 #HANGUL SYLLABLE SSANGKIYEOK U SSANGSIOS
+ {0x854A, 0xAFCF}, //722 #HANGUL SYLLABLE SSANGKIYEOK U CHIEUCH
+ {0x854B, 0xAFD0}, //723 #HANGUL SYLLABLE SSANGKIYEOK U KHIEUKH
+ {0x854C, 0xAFD1}, //724 #HANGUL SYLLABLE SSANGKIYEOK U THIEUTH
+ {0x854D, 0xAFD2}, //725 #HANGUL SYLLABLE SSANGKIYEOK U PHIEUPH
+ {0x854E, 0xAFD3}, //726 #HANGUL SYLLABLE SSANGKIYEOK U HIEUH
+ {0x854F, 0xAFD5}, //727 #HANGUL SYLLABLE SSANGKIYEOK WEO KIYEOK
+ {0x8550, 0xAFD6}, //728 #HANGUL SYLLABLE SSANGKIYEOK WEO SSANGKIYEOK
+ {0x8551, 0xAFD7}, //729 #HANGUL SYLLABLE SSANGKIYEOK WEO KIYEOKSIOS
+ {0x8552, 0xAFD8}, //730 #HANGUL SYLLABLE SSANGKIYEOK WEO NIEUN
+ {0x8553, 0xAFD9}, //731 #HANGUL SYLLABLE SSANGKIYEOK WEO NIEUNCIEUC
+ {0x8554, 0xAFDA}, //732 #HANGUL SYLLABLE SSANGKIYEOK WEO NIEUNHIEUH
+ {0x8555, 0xAFDB}, //733 #HANGUL SYLLABLE SSANGKIYEOK WEO TIKEUT
+ {0x8556, 0xAFDD}, //734 #HANGUL SYLLABLE SSANGKIYEOK WEO RIEULKIYEOK
+ {0x8557, 0xAFDE}, //735 #HANGUL SYLLABLE SSANGKIYEOK WEO RIEULMIEUM
+ {0x8558, 0xAFDF}, //736 #HANGUL SYLLABLE SSANGKIYEOK WEO RIEULPIEUP
+ {0x8559, 0xAFE0}, //737 #HANGUL SYLLABLE SSANGKIYEOK WEO RIEULSIOS
+ {0x855A, 0xAFE1}, //738 #HANGUL SYLLABLE SSANGKIYEOK WEO RIEULTHIEUTH
+ {0x8561, 0xAFE2}, //739 #HANGUL SYLLABLE SSANGKIYEOK WEO RIEULPHIEUPH
+ {0x8562, 0xAFE3}, //740 #HANGUL SYLLABLE SSANGKIYEOK WEO RIEULHIEUH
+ {0x8563, 0xAFE4}, //741 #HANGUL SYLLABLE SSANGKIYEOK WEO MIEUM
+ {0x8564, 0xAFE5}, //742 #HANGUL SYLLABLE SSANGKIYEOK WEO PIEUP
+ {0x8565, 0xAFE6}, //743 #HANGUL SYLLABLE SSANGKIYEOK WEO PIEUPSIOS
+ {0x8566, 0xAFE7}, //744 #HANGUL SYLLABLE SSANGKIYEOK WEO SIOS
+ {0x8567, 0xAFEA}, //745 #HANGUL SYLLABLE SSANGKIYEOK WEO CIEUC
+ {0x8568, 0xAFEB}, //746 #HANGUL SYLLABLE SSANGKIYEOK WEO CHIEUCH
+ {0x8569, 0xAFEC}, //747 #HANGUL SYLLABLE SSANGKIYEOK WEO KHIEUKH
+ {0x856A, 0xAFED}, //748 #HANGUL SYLLABLE SSANGKIYEOK WEO THIEUTH
+ {0x856B, 0xAFEE}, //749 #HANGUL SYLLABLE SSANGKIYEOK WEO PHIEUPH
+ {0x856C, 0xAFEF}, //750 #HANGUL SYLLABLE SSANGKIYEOK WEO HIEUH
+ {0x856D, 0xAFF2}, //751 #HANGUL SYLLABLE SSANGKIYEOK WE SSANGKIYEOK
+ {0x856E, 0xAFF3}, //752 #HANGUL SYLLABLE SSANGKIYEOK WE KIYEOKSIOS
+ {0x856F, 0xAFF5}, //753 #HANGUL SYLLABLE SSANGKIYEOK WE NIEUNCIEUC
+ {0x8570, 0xAFF6}, //754 #HANGUL SYLLABLE SSANGKIYEOK WE NIEUNHIEUH
+ {0x8571, 0xAFF7}, //755 #HANGUL SYLLABLE SSANGKIYEOK WE TIKEUT
+ {0x8572, 0xAFF9}, //756 #HANGUL SYLLABLE SSANGKIYEOK WE RIEULKIYEOK
+ {0x8573, 0xAFFA}, //757 #HANGUL SYLLABLE SSANGKIYEOK WE RIEULMIEUM
+ {0x8574, 0xAFFB}, //758 #HANGUL SYLLABLE SSANGKIYEOK WE RIEULPIEUP
+ {0x8575, 0xAFFC}, //759 #HANGUL SYLLABLE SSANGKIYEOK WE RIEULSIOS
+ {0x8576, 0xAFFD}, //760 #HANGUL SYLLABLE SSANGKIYEOK WE RIEULTHIEUTH
+ {0x8577, 0xAFFE}, //761 #HANGUL SYLLABLE SSANGKIYEOK WE RIEULPHIEUPH
+ {0x8578, 0xAFFF}, //762 #HANGUL SYLLABLE SSANGKIYEOK WE RIEULHIEUH
+ {0x8579, 0xB002}, //763 #HANGUL SYLLABLE SSANGKIYEOK WE PIEUPSIOS
+ {0x857A, 0xB003}, //764 #HANGUL SYLLABLE SSANGKIYEOK WE SIOS
+ {0x8581, 0xB005}, //765 #HANGUL SYLLABLE SSANGKIYEOK WE IEUNG
+ {0x8582, 0xB006}, //766 #HANGUL SYLLABLE SSANGKIYEOK WE CIEUC
+ {0x8583, 0xB007}, //767 #HANGUL SYLLABLE SSANGKIYEOK WE CHIEUCH
+ {0x8584, 0xB008}, //768 #HANGUL SYLLABLE SSANGKIYEOK WE KHIEUKH
+ {0x8585, 0xB009}, //769 #HANGUL SYLLABLE SSANGKIYEOK WE THIEUTH
+ {0x8586, 0xB00A}, //770 #HANGUL SYLLABLE SSANGKIYEOK WE PHIEUPH
+ {0x8587, 0xB00B}, //771 #HANGUL SYLLABLE SSANGKIYEOK WE HIEUH
+ {0x8588, 0xB00D}, //772 #HANGUL SYLLABLE SSANGKIYEOK WI KIYEOK
+ {0x8589, 0xB00E}, //773 #HANGUL SYLLABLE SSANGKIYEOK WI SSANGKIYEOK
+ {0x858A, 0xB00F}, //774 #HANGUL SYLLABLE SSANGKIYEOK WI KIYEOKSIOS
+ {0x858B, 0xB011}, //775 #HANGUL SYLLABLE SSANGKIYEOK WI NIEUNCIEUC
+ {0x858C, 0xB012}, //776 #HANGUL SYLLABLE SSANGKIYEOK WI NIEUNHIEUH
+ {0x858D, 0xB013}, //777 #HANGUL SYLLABLE SSANGKIYEOK WI TIKEUT
+ {0x858E, 0xB015}, //778 #HANGUL SYLLABLE SSANGKIYEOK WI RIEULKIYEOK
+ {0x858F, 0xB016}, //779 #HANGUL SYLLABLE SSANGKIYEOK WI RIEULMIEUM
+ {0x8590, 0xB017}, //780 #HANGUL SYLLABLE SSANGKIYEOK WI RIEULPIEUP
+ {0x8591, 0xB018}, //781 #HANGUL SYLLABLE SSANGKIYEOK WI RIEULSIOS
+ {0x8592, 0xB019}, //782 #HANGUL SYLLABLE SSANGKIYEOK WI RIEULTHIEUTH
+ {0x8593, 0xB01A}, //783 #HANGUL SYLLABLE SSANGKIYEOK WI RIEULPHIEUPH
+ {0x8594, 0xB01B}, //784 #HANGUL SYLLABLE SSANGKIYEOK WI RIEULHIEUH
+ {0x8595, 0xB01E}, //785 #HANGUL SYLLABLE SSANGKIYEOK WI PIEUPSIOS
+ {0x8596, 0xB01F}, //786 #HANGUL SYLLABLE SSANGKIYEOK WI SIOS
+ {0x8597, 0xB020}, //787 #HANGUL SYLLABLE SSANGKIYEOK WI SSANGSIOS
+ {0x8598, 0xB021}, //788 #HANGUL SYLLABLE SSANGKIYEOK WI IEUNG
+ {0x8599, 0xB022}, //789 #HANGUL SYLLABLE SSANGKIYEOK WI CIEUC
+ {0x859A, 0xB023}, //790 #HANGUL SYLLABLE SSANGKIYEOK WI CHIEUCH
+ {0x859B, 0xB024}, //791 #HANGUL SYLLABLE SSANGKIYEOK WI KHIEUKH
+ {0x859C, 0xB025}, //792 #HANGUL SYLLABLE SSANGKIYEOK WI THIEUTH
+ {0x859D, 0xB026}, //793 #HANGUL SYLLABLE SSANGKIYEOK WI PHIEUPH
+ {0x859E, 0xB027}, //794 #HANGUL SYLLABLE SSANGKIYEOK WI HIEUH
+ {0x859F, 0xB029}, //795 #HANGUL SYLLABLE SSANGKIYEOK YU KIYEOK
+ {0x85A0, 0xB02A}, //796 #HANGUL SYLLABLE SSANGKIYEOK YU SSANGKIYEOK
+ {0x85A1, 0xB02B}, //797 #HANGUL SYLLABLE SSANGKIYEOK YU KIYEOKSIOS
+ {0x85A2, 0xB02C}, //798 #HANGUL SYLLABLE SSANGKIYEOK YU NIEUN
+ {0x85A3, 0xB02D}, //799 #HANGUL SYLLABLE SSANGKIYEOK YU NIEUNCIEUC
+ {0x85A4, 0xB02E}, //800 #HANGUL SYLLABLE SSANGKIYEOK YU NIEUNHIEUH
+ {0x85A5, 0xB02F}, //801 #HANGUL SYLLABLE SSANGKIYEOK YU TIKEUT
+ {0x85A6, 0xB030}, //802 #HANGUL SYLLABLE SSANGKIYEOK YU RIEUL
+ {0x85A7, 0xB031}, //803 #HANGUL SYLLABLE SSANGKIYEOK YU RIEULKIYEOK
+ {0x85A8, 0xB032}, //804 #HANGUL SYLLABLE SSANGKIYEOK YU RIEULMIEUM
+ {0x85A9, 0xB033}, //805 #HANGUL SYLLABLE SSANGKIYEOK YU RIEULPIEUP
+ {0x85AA, 0xB034}, //806 #HANGUL SYLLABLE SSANGKIYEOK YU RIEULSIOS
+ {0x85AB, 0xB035}, //807 #HANGUL SYLLABLE SSANGKIYEOK YU RIEULTHIEUTH
+ {0x85AC, 0xB036}, //808 #HANGUL SYLLABLE SSANGKIYEOK YU RIEULPHIEUPH
+ {0x85AD, 0xB037}, //809 #HANGUL SYLLABLE SSANGKIYEOK YU RIEULHIEUH
+ {0x85AE, 0xB038}, //810 #HANGUL SYLLABLE SSANGKIYEOK YU MIEUM
+ {0x85AF, 0xB039}, //811 #HANGUL SYLLABLE SSANGKIYEOK YU PIEUP
+ {0x85B0, 0xB03A}, //812 #HANGUL SYLLABLE SSANGKIYEOK YU PIEUPSIOS
+ {0x85B1, 0xB03B}, //813 #HANGUL SYLLABLE SSANGKIYEOK YU SIOS
+ {0x85B2, 0xB03C}, //814 #HANGUL SYLLABLE SSANGKIYEOK YU SSANGSIOS
+ {0x85B3, 0xB03D}, //815 #HANGUL SYLLABLE SSANGKIYEOK YU IEUNG
+ {0x85B4, 0xB03E}, //816 #HANGUL SYLLABLE SSANGKIYEOK YU CIEUC
+ {0x85B5, 0xB03F}, //817 #HANGUL SYLLABLE SSANGKIYEOK YU CHIEUCH
+ {0x85B6, 0xB040}, //818 #HANGUL SYLLABLE SSANGKIYEOK YU KHIEUKH
+ {0x85B7, 0xB041}, //819 #HANGUL SYLLABLE SSANGKIYEOK YU THIEUTH
+ {0x85B8, 0xB042}, //820 #HANGUL SYLLABLE SSANGKIYEOK YU PHIEUPH
+ {0x85B9, 0xB043}, //821 #HANGUL SYLLABLE SSANGKIYEOK YU HIEUH
+ {0x85BA, 0xB046}, //822 #HANGUL SYLLABLE SSANGKIYEOK EU SSANGKIYEOK
+ {0x85BB, 0xB047}, //823 #HANGUL SYLLABLE SSANGKIYEOK EU KIYEOKSIOS
+ {0x85BC, 0xB049}, //824 #HANGUL SYLLABLE SSANGKIYEOK EU NIEUNCIEUC
+ {0x85BD, 0xB04B}, //825 #HANGUL SYLLABLE SSANGKIYEOK EU TIKEUT
+ {0x85BE, 0xB04D}, //826 #HANGUL SYLLABLE SSANGKIYEOK EU RIEULKIYEOK
+ {0x85BF, 0xB04F}, //827 #HANGUL SYLLABLE SSANGKIYEOK EU RIEULPIEUP
+ {0x85C0, 0xB050}, //828 #HANGUL SYLLABLE SSANGKIYEOK EU RIEULSIOS
+ {0x85C1, 0xB051}, //829 #HANGUL SYLLABLE SSANGKIYEOK EU RIEULTHIEUTH
+ {0x85C2, 0xB052}, //830 #HANGUL SYLLABLE SSANGKIYEOK EU RIEULPHIEUPH
+ {0x85C3, 0xB056}, //831 #HANGUL SYLLABLE SSANGKIYEOK EU PIEUPSIOS
+ {0x85C4, 0xB058}, //832 #HANGUL SYLLABLE SSANGKIYEOK EU SSANGSIOS
+ {0x85C5, 0xB05A}, //833 #HANGUL SYLLABLE SSANGKIYEOK EU CIEUC
+ {0x85C6, 0xB05B}, //834 #HANGUL SYLLABLE SSANGKIYEOK EU CHIEUCH
+ {0x85C7, 0xB05C}, //835 #HANGUL SYLLABLE SSANGKIYEOK EU KHIEUKH
+ {0x85C8, 0xB05E}, //836 #HANGUL SYLLABLE SSANGKIYEOK EU PHIEUPH
+ {0x85C9, 0xB05F}, //837 #HANGUL SYLLABLE SSANGKIYEOK EU HIEUH
+ {0x85CA, 0xB060}, //838 #HANGUL SYLLABLE SSANGKIYEOK YI
+ {0x85CB, 0xB061}, //839 #HANGUL SYLLABLE SSANGKIYEOK YI KIYEOK
+ {0x85CC, 0xB062}, //840 #HANGUL SYLLABLE SSANGKIYEOK YI SSANGKIYEOK
+ {0x85CD, 0xB063}, //841 #HANGUL SYLLABLE SSANGKIYEOK YI KIYEOKSIOS
+ {0x85CE, 0xB064}, //842 #HANGUL SYLLABLE SSANGKIYEOK YI NIEUN
+ {0x85CF, 0xB065}, //843 #HANGUL SYLLABLE SSANGKIYEOK YI NIEUNCIEUC
+ {0x85D0, 0xB066}, //844 #HANGUL SYLLABLE SSANGKIYEOK YI NIEUNHIEUH
+ {0x85D1, 0xB067}, //845 #HANGUL SYLLABLE SSANGKIYEOK YI TIKEUT
+ {0x85D2, 0xB068}, //846 #HANGUL SYLLABLE SSANGKIYEOK YI RIEUL
+ {0x85D3, 0xB069}, //847 #HANGUL SYLLABLE SSANGKIYEOK YI RIEULKIYEOK
+ {0x85D4, 0xB06A}, //848 #HANGUL SYLLABLE SSANGKIYEOK YI RIEULMIEUM
+ {0x85D5, 0xB06B}, //849 #HANGUL SYLLABLE SSANGKIYEOK YI RIEULPIEUP
+ {0x85D6, 0xB06C}, //850 #HANGUL SYLLABLE SSANGKIYEOK YI RIEULSIOS
+ {0x85D7, 0xB06D}, //851 #HANGUL SYLLABLE SSANGKIYEOK YI RIEULTHIEUTH
+ {0x85D8, 0xB06E}, //852 #HANGUL SYLLABLE SSANGKIYEOK YI RIEULPHIEUPH
+ {0x85D9, 0xB06F}, //853 #HANGUL SYLLABLE SSANGKIYEOK YI RIEULHIEUH
+ {0x85DA, 0xB070}, //854 #HANGUL SYLLABLE SSANGKIYEOK YI MIEUM
+ {0x85DB, 0xB071}, //855 #HANGUL SYLLABLE SSANGKIYEOK YI PIEUP
+ {0x85DC, 0xB072}, //856 #HANGUL SYLLABLE SSANGKIYEOK YI PIEUPSIOS
+ {0x85DD, 0xB073}, //857 #HANGUL SYLLABLE SSANGKIYEOK YI SIOS
+ {0x85DE, 0xB074}, //858 #HANGUL SYLLABLE SSANGKIYEOK YI SSANGSIOS
+ {0x85DF, 0xB075}, //859 #HANGUL SYLLABLE SSANGKIYEOK YI IEUNG
+ {0x85E0, 0xB076}, //860 #HANGUL SYLLABLE SSANGKIYEOK YI CIEUC
+ {0x85E1, 0xB077}, //861 #HANGUL SYLLABLE SSANGKIYEOK YI CHIEUCH
+ {0x85E2, 0xB078}, //862 #HANGUL SYLLABLE SSANGKIYEOK YI KHIEUKH
+ {0x85E3, 0xB079}, //863 #HANGUL SYLLABLE SSANGKIYEOK YI THIEUTH
+ {0x85E4, 0xB07A}, //864 #HANGUL SYLLABLE SSANGKIYEOK YI PHIEUPH
+ {0x85E5, 0xB07B}, //865 #HANGUL SYLLABLE SSANGKIYEOK YI HIEUH
+ {0x85E6, 0xB07E}, //866 #HANGUL SYLLABLE SSANGKIYEOK I SSANGKIYEOK
+ {0x85E7, 0xB07F}, //867 #HANGUL SYLLABLE SSANGKIYEOK I KIYEOKSIOS
+ {0x85E8, 0xB081}, //868 #HANGUL SYLLABLE SSANGKIYEOK I NIEUNCIEUC
+ {0x85E9, 0xB082}, //869 #HANGUL SYLLABLE SSANGKIYEOK I NIEUNHIEUH
+ {0x85EA, 0xB083}, //870 #HANGUL SYLLABLE SSANGKIYEOK I TIKEUT
+ {0x85EB, 0xB085}, //871 #HANGUL SYLLABLE SSANGKIYEOK I RIEULKIYEOK
+ {0x85EC, 0xB086}, //872 #HANGUL SYLLABLE SSANGKIYEOK I RIEULMIEUM
+ {0x85ED, 0xB087}, //873 #HANGUL SYLLABLE SSANGKIYEOK I RIEULPIEUP
+ {0x85EE, 0xB088}, //874 #HANGUL SYLLABLE SSANGKIYEOK I RIEULSIOS
+ {0x85EF, 0xB089}, //875 #HANGUL SYLLABLE SSANGKIYEOK I RIEULTHIEUTH
+ {0x85F0, 0xB08A}, //876 #HANGUL SYLLABLE SSANGKIYEOK I RIEULPHIEUPH
+ {0x85F1, 0xB08B}, //877 #HANGUL SYLLABLE SSANGKIYEOK I RIEULHIEUH
+ {0x85F2, 0xB08E}, //878 #HANGUL SYLLABLE SSANGKIYEOK I PIEUPSIOS
+ {0x85F3, 0xB090}, //879 #HANGUL SYLLABLE SSANGKIYEOK I SSANGSIOS
+ {0x85F4, 0xB092}, //880 #HANGUL SYLLABLE SSANGKIYEOK I CIEUC
+ {0x85F5, 0xB093}, //881 #HANGUL SYLLABLE SSANGKIYEOK I CHIEUCH
+ {0x85F6, 0xB094}, //882 #HANGUL SYLLABLE SSANGKIYEOK I KHIEUKH
+ {0x85F7, 0xB095}, //883 #HANGUL SYLLABLE SSANGKIYEOK I THIEUTH
+ {0x85F8, 0xB096}, //884 #HANGUL SYLLABLE SSANGKIYEOK I PHIEUPH
+ {0x85F9, 0xB097}, //885 #HANGUL SYLLABLE SSANGKIYEOK I HIEUH
+ {0x85FA, 0xB09B}, //886 #HANGUL SYLLABLE NIEUN A KIYEOKSIOS
+ {0x85FB, 0xB09D}, //887 #HANGUL SYLLABLE NIEUN A NIEUNCIEUC
+ {0x85FC, 0xB09E}, //888 #HANGUL SYLLABLE NIEUN A NIEUNHIEUH
+ {0x85FD, 0xB0A3}, //889 #HANGUL SYLLABLE NIEUN A RIEULPIEUP
+ {0x85FE, 0xB0A4}, //890 #HANGUL SYLLABLE NIEUN A RIEULSIOS
+ {0x8641, 0xB0A5}, //891 #HANGUL SYLLABLE NIEUN A RIEULTHIEUTH
+ {0x8642, 0xB0A6}, //892 #HANGUL SYLLABLE NIEUN A RIEULPHIEUPH
+ {0x8643, 0xB0A7}, //893 #HANGUL SYLLABLE NIEUN A RIEULHIEUH
+ {0x8644, 0xB0AA}, //894 #HANGUL SYLLABLE NIEUN A PIEUPSIOS
+ {0x8645, 0xB0B0}, //895 #HANGUL SYLLABLE NIEUN A KHIEUKH
+ {0x8646, 0xB0B2}, //896 #HANGUL SYLLABLE NIEUN A PHIEUPH
+ {0x8647, 0xB0B6}, //897 #HANGUL SYLLABLE NIEUN AE SSANGKIYEOK
+ {0x8648, 0xB0B7}, //898 #HANGUL SYLLABLE NIEUN AE KIYEOKSIOS
+ {0x8649, 0xB0B9}, //899 #HANGUL SYLLABLE NIEUN AE NIEUNCIEUC
+ {0x864A, 0xB0BA}, //900 #HANGUL SYLLABLE NIEUN AE NIEUNHIEUH
+ {0x864B, 0xB0BB}, //901 #HANGUL SYLLABLE NIEUN AE TIKEUT
+ {0x864C, 0xB0BD}, //902 #HANGUL SYLLABLE NIEUN AE RIEULKIYEOK
+ {0x864D, 0xB0BE}, //903 #HANGUL SYLLABLE NIEUN AE RIEULMIEUM
+ {0x864E, 0xB0BF}, //904 #HANGUL SYLLABLE NIEUN AE RIEULPIEUP
+ {0x864F, 0xB0C0}, //905 #HANGUL SYLLABLE NIEUN AE RIEULSIOS
+ {0x8650, 0xB0C1}, //906 #HANGUL SYLLABLE NIEUN AE RIEULTHIEUTH
+ {0x8651, 0xB0C2}, //907 #HANGUL SYLLABLE NIEUN AE RIEULPHIEUPH
+ {0x8652, 0xB0C3}, //908 #HANGUL SYLLABLE NIEUN AE RIEULHIEUH
+ {0x8653, 0xB0C6}, //909 #HANGUL SYLLABLE NIEUN AE PIEUPSIOS
+ {0x8654, 0xB0CA}, //910 #HANGUL SYLLABLE NIEUN AE CIEUC
+ {0x8655, 0xB0CB}, //911 #HANGUL SYLLABLE NIEUN AE CHIEUCH
+ {0x8656, 0xB0CC}, //912 #HANGUL SYLLABLE NIEUN AE KHIEUKH
+ {0x8657, 0xB0CD}, //913 #HANGUL SYLLABLE NIEUN AE THIEUTH
+ {0x8658, 0xB0CE}, //914 #HANGUL SYLLABLE NIEUN AE PHIEUPH
+ {0x8659, 0xB0CF}, //915 #HANGUL SYLLABLE NIEUN AE HIEUH
+ {0x865A, 0xB0D2}, //916 #HANGUL SYLLABLE NIEUN YA SSANGKIYEOK
+ {0x8661, 0xB0D3}, //917 #HANGUL SYLLABLE NIEUN YA KIYEOKSIOS
+ {0x8662, 0xB0D5}, //918 #HANGUL SYLLABLE NIEUN YA NIEUNCIEUC
+ {0x8663, 0xB0D6}, //919 #HANGUL SYLLABLE NIEUN YA NIEUNHIEUH
+ {0x8664, 0xB0D7}, //920 #HANGUL SYLLABLE NIEUN YA TIKEUT
+ {0x8665, 0xB0D9}, //921 #HANGUL SYLLABLE NIEUN YA RIEULKIYEOK
+ {0x8666, 0xB0DA}, //922 #HANGUL SYLLABLE NIEUN YA RIEULMIEUM
+ {0x8667, 0xB0DB}, //923 #HANGUL SYLLABLE NIEUN YA RIEULPIEUP
+ {0x8668, 0xB0DC}, //924 #HANGUL SYLLABLE NIEUN YA RIEULSIOS
+ {0x8669, 0xB0DD}, //925 #HANGUL SYLLABLE NIEUN YA RIEULTHIEUTH
+ {0x866A, 0xB0DE}, //926 #HANGUL SYLLABLE NIEUN YA RIEULPHIEUPH
+ {0x866B, 0xB0DF}, //927 #HANGUL SYLLABLE NIEUN YA RIEULHIEUH
+ {0x866C, 0xB0E1}, //928 #HANGUL SYLLABLE NIEUN YA PIEUP
+ {0x866D, 0xB0E2}, //929 #HANGUL SYLLABLE NIEUN YA PIEUPSIOS
+ {0x866E, 0xB0E3}, //930 #HANGUL SYLLABLE NIEUN YA SIOS
+ {0x866F, 0xB0E4}, //931 #HANGUL SYLLABLE NIEUN YA SSANGSIOS
+ {0x8670, 0xB0E6}, //932 #HANGUL SYLLABLE NIEUN YA CIEUC
+ {0x8671, 0xB0E7}, //933 #HANGUL SYLLABLE NIEUN YA CHIEUCH
+ {0x8672, 0xB0E8}, //934 #HANGUL SYLLABLE NIEUN YA KHIEUKH
+ {0x8673, 0xB0E9}, //935 #HANGUL SYLLABLE NIEUN YA THIEUTH
+ {0x8674, 0xB0EA}, //936 #HANGUL SYLLABLE NIEUN YA PHIEUPH
+ {0x8675, 0xB0EB}, //937 #HANGUL SYLLABLE NIEUN YA HIEUH
+ {0x8676, 0xB0EC}, //938 #HANGUL SYLLABLE NIEUN YAE
+ {0x8677, 0xB0ED}, //939 #HANGUL SYLLABLE NIEUN YAE KIYEOK
+ {0x8678, 0xB0EE}, //940 #HANGUL SYLLABLE NIEUN YAE SSANGKIYEOK
+ {0x8679, 0xB0EF}, //941 #HANGUL SYLLABLE NIEUN YAE KIYEOKSIOS
+ {0x867A, 0xB0F0}, //942 #HANGUL SYLLABLE NIEUN YAE NIEUN
+ {0x8681, 0xB0F1}, //943 #HANGUL SYLLABLE NIEUN YAE NIEUNCIEUC
+ {0x8682, 0xB0F2}, //944 #HANGUL SYLLABLE NIEUN YAE NIEUNHIEUH
+ {0x8683, 0xB0F3}, //945 #HANGUL SYLLABLE NIEUN YAE TIKEUT
+ {0x8684, 0xB0F4}, //946 #HANGUL SYLLABLE NIEUN YAE RIEUL
+ {0x8685, 0xB0F5}, //947 #HANGUL SYLLABLE NIEUN YAE RIEULKIYEOK
+ {0x8686, 0xB0F6}, //948 #HANGUL SYLLABLE NIEUN YAE RIEULMIEUM
+ {0x8687, 0xB0F7}, //949 #HANGUL SYLLABLE NIEUN YAE RIEULPIEUP
+ {0x8688, 0xB0F8}, //950 #HANGUL SYLLABLE NIEUN YAE RIEULSIOS
+ {0x8689, 0xB0F9}, //951 #HANGUL SYLLABLE NIEUN YAE RIEULTHIEUTH
+ {0x868A, 0xB0FA}, //952 #HANGUL SYLLABLE NIEUN YAE RIEULPHIEUPH
+ {0x868B, 0xB0FB}, //953 #HANGUL SYLLABLE NIEUN YAE RIEULHIEUH
+ {0x868C, 0xB0FC}, //954 #HANGUL SYLLABLE NIEUN YAE MIEUM
+ {0x868D, 0xB0FD}, //955 #HANGUL SYLLABLE NIEUN YAE PIEUP
+ {0x868E, 0xB0FE}, //956 #HANGUL SYLLABLE NIEUN YAE PIEUPSIOS
+ {0x868F, 0xB0FF}, //957 #HANGUL SYLLABLE NIEUN YAE SIOS
+ {0x8690, 0xB100}, //958 #HANGUL SYLLABLE NIEUN YAE SSANGSIOS
+ {0x8691, 0xB101}, //959 #HANGUL SYLLABLE NIEUN YAE IEUNG
+ {0x8692, 0xB102}, //960 #HANGUL SYLLABLE NIEUN YAE CIEUC
+ {0x8693, 0xB103}, //961 #HANGUL SYLLABLE NIEUN YAE CHIEUCH
+ {0x8694, 0xB104}, //962 #HANGUL SYLLABLE NIEUN YAE KHIEUKH
+ {0x8695, 0xB105}, //963 #HANGUL SYLLABLE NIEUN YAE THIEUTH
+ {0x8696, 0xB106}, //964 #HANGUL SYLLABLE NIEUN YAE PHIEUPH
+ {0x8697, 0xB107}, //965 #HANGUL SYLLABLE NIEUN YAE HIEUH
+ {0x8698, 0xB10A}, //966 #HANGUL SYLLABLE NIEUN EO SSANGKIYEOK
+ {0x8699, 0xB10D}, //967 #HANGUL SYLLABLE NIEUN EO NIEUNCIEUC
+ {0x869A, 0xB10E}, //968 #HANGUL SYLLABLE NIEUN EO NIEUNHIEUH
+ {0x869B, 0xB10F}, //969 #HANGUL SYLLABLE NIEUN EO TIKEUT
+ {0x869C, 0xB111}, //970 #HANGUL SYLLABLE NIEUN EO RIEULKIYEOK
+ {0x869D, 0xB114}, //971 #HANGUL SYLLABLE NIEUN EO RIEULSIOS
+ {0x869E, 0xB115}, //972 #HANGUL SYLLABLE NIEUN EO RIEULTHIEUTH
+ {0x869F, 0xB116}, //973 #HANGUL SYLLABLE NIEUN EO RIEULPHIEUPH
+ {0x86A0, 0xB117}, //974 #HANGUL SYLLABLE NIEUN EO RIEULHIEUH
+ {0x86A1, 0xB11A}, //975 #HANGUL SYLLABLE NIEUN EO PIEUPSIOS
+ {0x86A2, 0xB11E}, //976 #HANGUL SYLLABLE NIEUN EO CIEUC
+ {0x86A3, 0xB11F}, //977 #HANGUL SYLLABLE NIEUN EO CHIEUCH
+ {0x86A4, 0xB120}, //978 #HANGUL SYLLABLE NIEUN EO KHIEUKH
+ {0x86A5, 0xB121}, //979 #HANGUL SYLLABLE NIEUN EO THIEUTH
+ {0x86A6, 0xB122}, //980 #HANGUL SYLLABLE NIEUN EO PHIEUPH
+ {0x86A7, 0xB126}, //981 #HANGUL SYLLABLE NIEUN E SSANGKIYEOK
+ {0x86A8, 0xB127}, //982 #HANGUL SYLLABLE NIEUN E KIYEOKSIOS
+ {0x86A9, 0xB129}, //983 #HANGUL SYLLABLE NIEUN E NIEUNCIEUC
+ {0x86AA, 0xB12A}, //984 #HANGUL SYLLABLE NIEUN E NIEUNHIEUH
+ {0x86AB, 0xB12B}, //985 #HANGUL SYLLABLE NIEUN E TIKEUT
+ {0x86AC, 0xB12D}, //986 #HANGUL SYLLABLE NIEUN E RIEULKIYEOK
+ {0x86AD, 0xB12E}, //987 #HANGUL SYLLABLE NIEUN E RIEULMIEUM
+ {0x86AE, 0xB12F}, //988 #HANGUL SYLLABLE NIEUN E RIEULPIEUP
+ {0x86AF, 0xB130}, //989 #HANGUL SYLLABLE NIEUN E RIEULSIOS
+ {0x86B0, 0xB131}, //990 #HANGUL SYLLABLE NIEUN E RIEULTHIEUTH
+ {0x86B1, 0xB132}, //991 #HANGUL SYLLABLE NIEUN E RIEULPHIEUPH
+ {0x86B2, 0xB133}, //992 #HANGUL SYLLABLE NIEUN E RIEULHIEUH
+ {0x86B3, 0xB136}, //993 #HANGUL SYLLABLE NIEUN E PIEUPSIOS
+ {0x86B4, 0xB13A}, //994 #HANGUL SYLLABLE NIEUN E CIEUC
+ {0x86B5, 0xB13B}, //995 #HANGUL SYLLABLE NIEUN E CHIEUCH
+ {0x86B6, 0xB13C}, //996 #HANGUL SYLLABLE NIEUN E KHIEUKH
+ {0x86B7, 0xB13D}, //997 #HANGUL SYLLABLE NIEUN E THIEUTH
+ {0x86B8, 0xB13E}, //998 #HANGUL SYLLABLE NIEUN E PHIEUPH
+ {0x86B9, 0xB13F}, //999 #HANGUL SYLLABLE NIEUN E HIEUH
+ {0x86BA, 0xB142}, //1000 #HANGUL SYLLABLE NIEUN YEO SSANGKIYEOK
+ {0x86BB, 0xB143}, //1001 #HANGUL SYLLABLE NIEUN YEO KIYEOKSIOS
+ {0x86BC, 0xB145}, //1002 #HANGUL SYLLABLE NIEUN YEO NIEUNCIEUC
+ {0x86BD, 0xB146}, //1003 #HANGUL SYLLABLE NIEUN YEO NIEUNHIEUH
+ {0x86BE, 0xB147}, //1004 #HANGUL SYLLABLE NIEUN YEO TIKEUT
+ {0x86BF, 0xB149}, //1005 #HANGUL SYLLABLE NIEUN YEO RIEULKIYEOK
+ {0x86C0, 0xB14A}, //1006 #HANGUL SYLLABLE NIEUN YEO RIEULMIEUM
+ {0x86C1, 0xB14B}, //1007 #HANGUL SYLLABLE NIEUN YEO RIEULPIEUP
+ {0x86C2, 0xB14C}, //1008 #HANGUL SYLLABLE NIEUN YEO RIEULSIOS
+ {0x86C3, 0xB14D}, //1009 #HANGUL SYLLABLE NIEUN YEO RIEULTHIEUTH
+ {0x86C4, 0xB14E}, //1010 #HANGUL SYLLABLE NIEUN YEO RIEULPHIEUPH
+ {0x86C5, 0xB14F}, //1011 #HANGUL SYLLABLE NIEUN YEO RIEULHIEUH
+ {0x86C6, 0xB152}, //1012 #HANGUL SYLLABLE NIEUN YEO PIEUPSIOS
+ {0x86C7, 0xB153}, //1013 #HANGUL SYLLABLE NIEUN YEO SIOS
+ {0x86C8, 0xB156}, //1014 #HANGUL SYLLABLE NIEUN YEO CIEUC
+ {0x86C9, 0xB157}, //1015 #HANGUL SYLLABLE NIEUN YEO CHIEUCH
+ {0x86CA, 0xB159}, //1016 #HANGUL SYLLABLE NIEUN YEO THIEUTH
+ {0x86CB, 0xB15A}, //1017 #HANGUL SYLLABLE NIEUN YEO PHIEUPH
+ {0x86CC, 0xB15B}, //1018 #HANGUL SYLLABLE NIEUN YEO HIEUH
+ {0x86CD, 0xB15D}, //1019 #HANGUL SYLLABLE NIEUN YE KIYEOK
+ {0x86CE, 0xB15E}, //1020 #HANGUL SYLLABLE NIEUN YE SSANGKIYEOK
+ {0x86CF, 0xB15F}, //1021 #HANGUL SYLLABLE NIEUN YE KIYEOKSIOS
+ {0x86D0, 0xB161}, //1022 #HANGUL SYLLABLE NIEUN YE NIEUNCIEUC
+ {0x86D1, 0xB162}, //1023 #HANGUL SYLLABLE NIEUN YE NIEUNHIEUH
+ {0x86D2, 0xB163}, //1024 #HANGUL SYLLABLE NIEUN YE TIKEUT
+ {0x86D3, 0xB164}, //1025 #HANGUL SYLLABLE NIEUN YE RIEUL
+ {0x86D4, 0xB165}, //1026 #HANGUL SYLLABLE NIEUN YE RIEULKIYEOK
+ {0x86D5, 0xB166}, //1027 #HANGUL SYLLABLE NIEUN YE RIEULMIEUM
+ {0x86D6, 0xB167}, //1028 #HANGUL SYLLABLE NIEUN YE RIEULPIEUP
+ {0x86D7, 0xB168}, //1029 #HANGUL SYLLABLE NIEUN YE RIEULSIOS
+ {0x86D8, 0xB169}, //1030 #HANGUL SYLLABLE NIEUN YE RIEULTHIEUTH
+ {0x86D9, 0xB16A}, //1031 #HANGUL SYLLABLE NIEUN YE RIEULPHIEUPH
+ {0x86DA, 0xB16B}, //1032 #HANGUL SYLLABLE NIEUN YE RIEULHIEUH
+ {0x86DB, 0xB16C}, //1033 #HANGUL SYLLABLE NIEUN YE MIEUM
+ {0x86DC, 0xB16D}, //1034 #HANGUL SYLLABLE NIEUN YE PIEUP
+ {0x86DD, 0xB16E}, //1035 #HANGUL SYLLABLE NIEUN YE PIEUPSIOS
+ {0x86DE, 0xB16F}, //1036 #HANGUL SYLLABLE NIEUN YE SIOS
+ {0x86DF, 0xB170}, //1037 #HANGUL SYLLABLE NIEUN YE SSANGSIOS
+ {0x86E0, 0xB171}, //1038 #HANGUL SYLLABLE NIEUN YE IEUNG
+ {0x86E1, 0xB172}, //1039 #HANGUL SYLLABLE NIEUN YE CIEUC
+ {0x86E2, 0xB173}, //1040 #HANGUL SYLLABLE NIEUN YE CHIEUCH
+ {0x86E3, 0xB174}, //1041 #HANGUL SYLLABLE NIEUN YE KHIEUKH
+ {0x86E4, 0xB175}, //1042 #HANGUL SYLLABLE NIEUN YE THIEUTH
+ {0x86E5, 0xB176}, //1043 #HANGUL SYLLABLE NIEUN YE PHIEUPH
+ {0x86E6, 0xB177}, //1044 #HANGUL SYLLABLE NIEUN YE HIEUH
+ {0x86E7, 0xB17A}, //1045 #HANGUL SYLLABLE NIEUN O SSANGKIYEOK
+ {0x86E8, 0xB17B}, //1046 #HANGUL SYLLABLE NIEUN O KIYEOKSIOS
+ {0x86E9, 0xB17D}, //1047 #HANGUL SYLLABLE NIEUN O NIEUNCIEUC
+ {0x86EA, 0xB17E}, //1048 #HANGUL SYLLABLE NIEUN O NIEUNHIEUH
+ {0x86EB, 0xB17F}, //1049 #HANGUL SYLLABLE NIEUN O TIKEUT
+ {0x86EC, 0xB181}, //1050 #HANGUL SYLLABLE NIEUN O RIEULKIYEOK
+ {0x86ED, 0xB183}, //1051 #HANGUL SYLLABLE NIEUN O RIEULPIEUP
+ {0x86EE, 0xB184}, //1052 #HANGUL SYLLABLE NIEUN O RIEULSIOS
+ {0x86EF, 0xB185}, //1053 #HANGUL SYLLABLE NIEUN O RIEULTHIEUTH
+ {0x86F0, 0xB186}, //1054 #HANGUL SYLLABLE NIEUN O RIEULPHIEUPH
+ {0x86F1, 0xB187}, //1055 #HANGUL SYLLABLE NIEUN O RIEULHIEUH
+ {0x86F2, 0xB18A}, //1056 #HANGUL SYLLABLE NIEUN O PIEUPSIOS
+ {0x86F3, 0xB18C}, //1057 #HANGUL SYLLABLE NIEUN O SSANGSIOS
+ {0x86F4, 0xB18E}, //1058 #HANGUL SYLLABLE NIEUN O CIEUC
+ {0x86F5, 0xB18F}, //1059 #HANGUL SYLLABLE NIEUN O CHIEUCH
+ {0x86F6, 0xB190}, //1060 #HANGUL SYLLABLE NIEUN O KHIEUKH
+ {0x86F7, 0xB191}, //1061 #HANGUL SYLLABLE NIEUN O THIEUTH
+ {0x86F8, 0xB195}, //1062 #HANGUL SYLLABLE NIEUN WA KIYEOK
+ {0x86F9, 0xB196}, //1063 #HANGUL SYLLABLE NIEUN WA SSANGKIYEOK
+ {0x86FA, 0xB197}, //1064 #HANGUL SYLLABLE NIEUN WA KIYEOKSIOS
+ {0x86FB, 0xB199}, //1065 #HANGUL SYLLABLE NIEUN WA NIEUNCIEUC
+ {0x86FC, 0xB19A}, //1066 #HANGUL SYLLABLE NIEUN WA NIEUNHIEUH
+ {0x86FD, 0xB19B}, //1067 #HANGUL SYLLABLE NIEUN WA TIKEUT
+ {0x86FE, 0xB19D}, //1068 #HANGUL SYLLABLE NIEUN WA RIEULKIYEOK
+ {0x8741, 0xB19E}, //1069 #HANGUL SYLLABLE NIEUN WA RIEULMIEUM
+ {0x8742, 0xB19F}, //1070 #HANGUL SYLLABLE NIEUN WA RIEULPIEUP
+ {0x8743, 0xB1A0}, //1071 #HANGUL SYLLABLE NIEUN WA RIEULSIOS
+ {0x8744, 0xB1A1}, //1072 #HANGUL SYLLABLE NIEUN WA RIEULTHIEUTH
+ {0x8745, 0xB1A2}, //1073 #HANGUL SYLLABLE NIEUN WA RIEULPHIEUPH
+ {0x8746, 0xB1A3}, //1074 #HANGUL SYLLABLE NIEUN WA RIEULHIEUH
+ {0x8747, 0xB1A4}, //1075 #HANGUL SYLLABLE NIEUN WA MIEUM
+ {0x8748, 0xB1A5}, //1076 #HANGUL SYLLABLE NIEUN WA PIEUP
+ {0x8749, 0xB1A6}, //1077 #HANGUL SYLLABLE NIEUN WA PIEUPSIOS
+ {0x874A, 0xB1A7}, //1078 #HANGUL SYLLABLE NIEUN WA SIOS
+ {0x874B, 0xB1A9}, //1079 #HANGUL SYLLABLE NIEUN WA IEUNG
+ {0x874C, 0xB1AA}, //1080 #HANGUL SYLLABLE NIEUN WA CIEUC
+ {0x874D, 0xB1AB}, //1081 #HANGUL SYLLABLE NIEUN WA CHIEUCH
+ {0x874E, 0xB1AC}, //1082 #HANGUL SYLLABLE NIEUN WA KHIEUKH
+ {0x874F, 0xB1AD}, //1083 #HANGUL SYLLABLE NIEUN WA THIEUTH
+ {0x8750, 0xB1AE}, //1084 #HANGUL SYLLABLE NIEUN WA PHIEUPH
+ {0x8751, 0xB1AF}, //1085 #HANGUL SYLLABLE NIEUN WA HIEUH
+ {0x8752, 0xB1B0}, //1086 #HANGUL SYLLABLE NIEUN WAE
+ {0x8753, 0xB1B1}, //1087 #HANGUL SYLLABLE NIEUN WAE KIYEOK
+ {0x8754, 0xB1B2}, //1088 #HANGUL SYLLABLE NIEUN WAE SSANGKIYEOK
+ {0x8755, 0xB1B3}, //1089 #HANGUL SYLLABLE NIEUN WAE KIYEOKSIOS
+ {0x8756, 0xB1B4}, //1090 #HANGUL SYLLABLE NIEUN WAE NIEUN
+ {0x8757, 0xB1B5}, //1091 #HANGUL SYLLABLE NIEUN WAE NIEUNCIEUC
+ {0x8758, 0xB1B6}, //1092 #HANGUL SYLLABLE NIEUN WAE NIEUNHIEUH
+ {0x8759, 0xB1B7}, //1093 #HANGUL SYLLABLE NIEUN WAE TIKEUT
+ {0x875A, 0xB1B8}, //1094 #HANGUL SYLLABLE NIEUN WAE RIEUL
+ {0x8761, 0xB1B9}, //1095 #HANGUL SYLLABLE NIEUN WAE RIEULKIYEOK
+ {0x8762, 0xB1BA}, //1096 #HANGUL SYLLABLE NIEUN WAE RIEULMIEUM
+ {0x8763, 0xB1BB}, //1097 #HANGUL SYLLABLE NIEUN WAE RIEULPIEUP
+ {0x8764, 0xB1BC}, //1098 #HANGUL SYLLABLE NIEUN WAE RIEULSIOS
+ {0x8765, 0xB1BD}, //1099 #HANGUL SYLLABLE NIEUN WAE RIEULTHIEUTH
+ {0x8766, 0xB1BE}, //1100 #HANGUL SYLLABLE NIEUN WAE RIEULPHIEUPH
+ {0x8767, 0xB1BF}, //1101 #HANGUL SYLLABLE NIEUN WAE RIEULHIEUH
+ {0x8768, 0xB1C0}, //1102 #HANGUL SYLLABLE NIEUN WAE MIEUM
+ {0x8769, 0xB1C1}, //1103 #HANGUL SYLLABLE NIEUN WAE PIEUP
+ {0x876A, 0xB1C2}, //1104 #HANGUL SYLLABLE NIEUN WAE PIEUPSIOS
+ {0x876B, 0xB1C3}, //1105 #HANGUL SYLLABLE NIEUN WAE SIOS
+ {0x876C, 0xB1C4}, //1106 #HANGUL SYLLABLE NIEUN WAE SSANGSIOS
+ {0x876D, 0xB1C5}, //1107 #HANGUL SYLLABLE NIEUN WAE IEUNG
+ {0x876E, 0xB1C6}, //1108 #HANGUL SYLLABLE NIEUN WAE CIEUC
+ {0x876F, 0xB1C7}, //1109 #HANGUL SYLLABLE NIEUN WAE CHIEUCH
+ {0x8770, 0xB1C8}, //1110 #HANGUL SYLLABLE NIEUN WAE KHIEUKH
+ {0x8771, 0xB1C9}, //1111 #HANGUL SYLLABLE NIEUN WAE THIEUTH
+ {0x8772, 0xB1CA}, //1112 #HANGUL SYLLABLE NIEUN WAE PHIEUPH
+ {0x8773, 0xB1CB}, //1113 #HANGUL SYLLABLE NIEUN WAE HIEUH
+ {0x8774, 0xB1CD}, //1114 #HANGUL SYLLABLE NIEUN OE KIYEOK
+ {0x8775, 0xB1CE}, //1115 #HANGUL SYLLABLE NIEUN OE SSANGKIYEOK
+ {0x8776, 0xB1CF}, //1116 #HANGUL SYLLABLE NIEUN OE KIYEOKSIOS
+ {0x8777, 0xB1D1}, //1117 #HANGUL SYLLABLE NIEUN OE NIEUNCIEUC
+ {0x8778, 0xB1D2}, //1118 #HANGUL SYLLABLE NIEUN OE NIEUNHIEUH
+ {0x8779, 0xB1D3}, //1119 #HANGUL SYLLABLE NIEUN OE TIKEUT
+ {0x877A, 0xB1D5}, //1120 #HANGUL SYLLABLE NIEUN OE RIEULKIYEOK
+ {0x8781, 0xB1D6}, //1121 #HANGUL SYLLABLE NIEUN OE RIEULMIEUM
+ {0x8782, 0xB1D7}, //1122 #HANGUL SYLLABLE NIEUN OE RIEULPIEUP
+ {0x8783, 0xB1D8}, //1123 #HANGUL SYLLABLE NIEUN OE RIEULSIOS
+ {0x8784, 0xB1D9}, //1124 #HANGUL SYLLABLE NIEUN OE RIEULTHIEUTH
+ {0x8785, 0xB1DA}, //1125 #HANGUL SYLLABLE NIEUN OE RIEULPHIEUPH
+ {0x8786, 0xB1DB}, //1126 #HANGUL SYLLABLE NIEUN OE RIEULHIEUH
+ {0x8787, 0xB1DE}, //1127 #HANGUL SYLLABLE NIEUN OE PIEUPSIOS
+ {0x8788, 0xB1E0}, //1128 #HANGUL SYLLABLE NIEUN OE SSANGSIOS
+ {0x8789, 0xB1E1}, //1129 #HANGUL SYLLABLE NIEUN OE IEUNG
+ {0x878A, 0xB1E2}, //1130 #HANGUL SYLLABLE NIEUN OE CIEUC
+ {0x878B, 0xB1E3}, //1131 #HANGUL SYLLABLE NIEUN OE CHIEUCH
+ {0x878C, 0xB1E4}, //1132 #HANGUL SYLLABLE NIEUN OE KHIEUKH
+ {0x878D, 0xB1E5}, //1133 #HANGUL SYLLABLE NIEUN OE THIEUTH
+ {0x878E, 0xB1E6}, //1134 #HANGUL SYLLABLE NIEUN OE PHIEUPH
+ {0x878F, 0xB1E7}, //1135 #HANGUL SYLLABLE NIEUN OE HIEUH
+ {0x8790, 0xB1EA}, //1136 #HANGUL SYLLABLE NIEUN YO SSANGKIYEOK
+ {0x8791, 0xB1EB}, //1137 #HANGUL SYLLABLE NIEUN YO KIYEOKSIOS
+ {0x8792, 0xB1ED}, //1138 #HANGUL SYLLABLE NIEUN YO NIEUNCIEUC
+ {0x8793, 0xB1EE}, //1139 #HANGUL SYLLABLE NIEUN YO NIEUNHIEUH
+ {0x8794, 0xB1EF}, //1140 #HANGUL SYLLABLE NIEUN YO TIKEUT
+ {0x8795, 0xB1F1}, //1141 #HANGUL SYLLABLE NIEUN YO RIEULKIYEOK
+ {0x8796, 0xB1F2}, //1142 #HANGUL SYLLABLE NIEUN YO RIEULMIEUM
+ {0x8797, 0xB1F3}, //1143 #HANGUL SYLLABLE NIEUN YO RIEULPIEUP
+ {0x8798, 0xB1F4}, //1144 #HANGUL SYLLABLE NIEUN YO RIEULSIOS
+ {0x8799, 0xB1F5}, //1145 #HANGUL SYLLABLE NIEUN YO RIEULTHIEUTH
+ {0x879A, 0xB1F6}, //1146 #HANGUL SYLLABLE NIEUN YO RIEULPHIEUPH
+ {0x879B, 0xB1F7}, //1147 #HANGUL SYLLABLE NIEUN YO RIEULHIEUH
+ {0x879C, 0xB1F8}, //1148 #HANGUL SYLLABLE NIEUN YO MIEUM
+ {0x879D, 0xB1FA}, //1149 #HANGUL SYLLABLE NIEUN YO PIEUPSIOS
+ {0x879E, 0xB1FC}, //1150 #HANGUL SYLLABLE NIEUN YO SSANGSIOS
+ {0x879F, 0xB1FE}, //1151 #HANGUL SYLLABLE NIEUN YO CIEUC
+ {0x87A0, 0xB1FF}, //1152 #HANGUL SYLLABLE NIEUN YO CHIEUCH
+ {0x87A1, 0xB200}, //1153 #HANGUL SYLLABLE NIEUN YO KHIEUKH
+ {0x87A2, 0xB201}, //1154 #HANGUL SYLLABLE NIEUN YO THIEUTH
+ {0x87A3, 0xB202}, //1155 #HANGUL SYLLABLE NIEUN YO PHIEUPH
+ {0x87A4, 0xB203}, //1156 #HANGUL SYLLABLE NIEUN YO HIEUH
+ {0x87A5, 0xB206}, //1157 #HANGUL SYLLABLE NIEUN U SSANGKIYEOK
+ {0x87A6, 0xB207}, //1158 #HANGUL SYLLABLE NIEUN U KIYEOKSIOS
+ {0x87A7, 0xB209}, //1159 #HANGUL SYLLABLE NIEUN U NIEUNCIEUC
+ {0x87A8, 0xB20A}, //1160 #HANGUL SYLLABLE NIEUN U NIEUNHIEUH
+ {0x87A9, 0xB20D}, //1161 #HANGUL SYLLABLE NIEUN U RIEULKIYEOK
+ {0x87AA, 0xB20E}, //1162 #HANGUL SYLLABLE NIEUN U RIEULMIEUM
+ {0x87AB, 0xB20F}, //1163 #HANGUL SYLLABLE NIEUN U RIEULPIEUP
+ {0x87AC, 0xB210}, //1164 #HANGUL SYLLABLE NIEUN U RIEULSIOS
+ {0x87AD, 0xB211}, //1165 #HANGUL SYLLABLE NIEUN U RIEULTHIEUTH
+ {0x87AE, 0xB212}, //1166 #HANGUL SYLLABLE NIEUN U RIEULPHIEUPH
+ {0x87AF, 0xB213}, //1167 #HANGUL SYLLABLE NIEUN U RIEULHIEUH
+ {0x87B0, 0xB216}, //1168 #HANGUL SYLLABLE NIEUN U PIEUPSIOS
+ {0x87B1, 0xB218}, //1169 #HANGUL SYLLABLE NIEUN U SSANGSIOS
+ {0x87B2, 0xB21A}, //1170 #HANGUL SYLLABLE NIEUN U CIEUC
+ {0x87B3, 0xB21B}, //1171 #HANGUL SYLLABLE NIEUN U CHIEUCH
+ {0x87B4, 0xB21C}, //1172 #HANGUL SYLLABLE NIEUN U KHIEUKH
+ {0x87B5, 0xB21D}, //1173 #HANGUL SYLLABLE NIEUN U THIEUTH
+ {0x87B6, 0xB21E}, //1174 #HANGUL SYLLABLE NIEUN U PHIEUPH
+ {0x87B7, 0xB21F}, //1175 #HANGUL SYLLABLE NIEUN U HIEUH
+ {0x87B8, 0xB221}, //1176 #HANGUL SYLLABLE NIEUN WEO KIYEOK
+ {0x87B9, 0xB222}, //1177 #HANGUL SYLLABLE NIEUN WEO SSANGKIYEOK
+ {0x87BA, 0xB223}, //1178 #HANGUL SYLLABLE NIEUN WEO KIYEOKSIOS
+ {0x87BB, 0xB224}, //1179 #HANGUL SYLLABLE NIEUN WEO NIEUN
+ {0x87BC, 0xB225}, //1180 #HANGUL SYLLABLE NIEUN WEO NIEUNCIEUC
+ {0x87BD, 0xB226}, //1181 #HANGUL SYLLABLE NIEUN WEO NIEUNHIEUH
+ {0x87BE, 0xB227}, //1182 #HANGUL SYLLABLE NIEUN WEO TIKEUT
+ {0x87BF, 0xB228}, //1183 #HANGUL SYLLABLE NIEUN WEO RIEUL
+ {0x87C0, 0xB229}, //1184 #HANGUL SYLLABLE NIEUN WEO RIEULKIYEOK
+ {0x87C1, 0xB22A}, //1185 #HANGUL SYLLABLE NIEUN WEO RIEULMIEUM
+ {0x87C2, 0xB22B}, //1186 #HANGUL SYLLABLE NIEUN WEO RIEULPIEUP
+ {0x87C3, 0xB22C}, //1187 #HANGUL SYLLABLE NIEUN WEO RIEULSIOS
+ {0x87C4, 0xB22D}, //1188 #HANGUL SYLLABLE NIEUN WEO RIEULTHIEUTH
+ {0x87C5, 0xB22E}, //1189 #HANGUL SYLLABLE NIEUN WEO RIEULPHIEUPH
+ {0x87C6, 0xB22F}, //1190 #HANGUL SYLLABLE NIEUN WEO RIEULHIEUH
+ {0x87C7, 0xB230}, //1191 #HANGUL SYLLABLE NIEUN WEO MIEUM
+ {0x87C8, 0xB231}, //1192 #HANGUL SYLLABLE NIEUN WEO PIEUP
+ {0x87C9, 0xB232}, //1193 #HANGUL SYLLABLE NIEUN WEO PIEUPSIOS
+ {0x87CA, 0xB233}, //1194 #HANGUL SYLLABLE NIEUN WEO SIOS
+ {0x87CB, 0xB235}, //1195 #HANGUL SYLLABLE NIEUN WEO IEUNG
+ {0x87CC, 0xB236}, //1196 #HANGUL SYLLABLE NIEUN WEO CIEUC
+ {0x87CD, 0xB237}, //1197 #HANGUL SYLLABLE NIEUN WEO CHIEUCH
+ {0x87CE, 0xB238}, //1198 #HANGUL SYLLABLE NIEUN WEO KHIEUKH
+ {0x87CF, 0xB239}, //1199 #HANGUL SYLLABLE NIEUN WEO THIEUTH
+ {0x87D0, 0xB23A}, //1200 #HANGUL SYLLABLE NIEUN WEO PHIEUPH
+ {0x87D1, 0xB23B}, //1201 #HANGUL SYLLABLE NIEUN WEO HIEUH
+ {0x87D2, 0xB23D}, //1202 #HANGUL SYLLABLE NIEUN WE KIYEOK
+ {0x87D3, 0xB23E}, //1203 #HANGUL SYLLABLE NIEUN WE SSANGKIYEOK
+ {0x87D4, 0xB23F}, //1204 #HANGUL SYLLABLE NIEUN WE KIYEOKSIOS
+ {0x87D5, 0xB240}, //1205 #HANGUL SYLLABLE NIEUN WE NIEUN
+ {0x87D6, 0xB241}, //1206 #HANGUL SYLLABLE NIEUN WE NIEUNCIEUC
+ {0x87D7, 0xB242}, //1207 #HANGUL SYLLABLE NIEUN WE NIEUNHIEUH
+ {0x87D8, 0xB243}, //1208 #HANGUL SYLLABLE NIEUN WE TIKEUT
+ {0x87D9, 0xB244}, //1209 #HANGUL SYLLABLE NIEUN WE RIEUL
+ {0x87DA, 0xB245}, //1210 #HANGUL SYLLABLE NIEUN WE RIEULKIYEOK
+ {0x87DB, 0xB246}, //1211 #HANGUL SYLLABLE NIEUN WE RIEULMIEUM
+ {0x87DC, 0xB247}, //1212 #HANGUL SYLLABLE NIEUN WE RIEULPIEUP
+ {0x87DD, 0xB248}, //1213 #HANGUL SYLLABLE NIEUN WE RIEULSIOS
+ {0x87DE, 0xB249}, //1214 #HANGUL SYLLABLE NIEUN WE RIEULTHIEUTH
+ {0x87DF, 0xB24A}, //1215 #HANGUL SYLLABLE NIEUN WE RIEULPHIEUPH
+ {0x87E0, 0xB24B}, //1216 #HANGUL SYLLABLE NIEUN WE RIEULHIEUH
+ {0x87E1, 0xB24C}, //1217 #HANGUL SYLLABLE NIEUN WE MIEUM
+ {0x87E2, 0xB24D}, //1218 #HANGUL SYLLABLE NIEUN WE PIEUP
+ {0x87E3, 0xB24E}, //1219 #HANGUL SYLLABLE NIEUN WE PIEUPSIOS
+ {0x87E4, 0xB24F}, //1220 #HANGUL SYLLABLE NIEUN WE SIOS
+ {0x87E5, 0xB250}, //1221 #HANGUL SYLLABLE NIEUN WE SSANGSIOS
+ {0x87E6, 0xB251}, //1222 #HANGUL SYLLABLE NIEUN WE IEUNG
+ {0x87E7, 0xB252}, //1223 #HANGUL SYLLABLE NIEUN WE CIEUC
+ {0x87E8, 0xB253}, //1224 #HANGUL SYLLABLE NIEUN WE CHIEUCH
+ {0x87E9, 0xB254}, //1225 #HANGUL SYLLABLE NIEUN WE KHIEUKH
+ {0x87EA, 0xB255}, //1226 #HANGUL SYLLABLE NIEUN WE THIEUTH
+ {0x87EB, 0xB256}, //1227 #HANGUL SYLLABLE NIEUN WE PHIEUPH
+ {0x87EC, 0xB257}, //1228 #HANGUL SYLLABLE NIEUN WE HIEUH
+ {0x87ED, 0xB259}, //1229 #HANGUL SYLLABLE NIEUN WI KIYEOK
+ {0x87EE, 0xB25A}, //1230 #HANGUL SYLLABLE NIEUN WI SSANGKIYEOK
+ {0x87EF, 0xB25B}, //1231 #HANGUL SYLLABLE NIEUN WI KIYEOKSIOS
+ {0x87F0, 0xB25D}, //1232 #HANGUL SYLLABLE NIEUN WI NIEUNCIEUC
+ {0x87F1, 0xB25E}, //1233 #HANGUL SYLLABLE NIEUN WI NIEUNHIEUH
+ {0x87F2, 0xB25F}, //1234 #HANGUL SYLLABLE NIEUN WI TIKEUT
+ {0x87F3, 0xB261}, //1235 #HANGUL SYLLABLE NIEUN WI RIEULKIYEOK
+ {0x87F4, 0xB262}, //1236 #HANGUL SYLLABLE NIEUN WI RIEULMIEUM
+ {0x87F5, 0xB263}, //1237 #HANGUL SYLLABLE NIEUN WI RIEULPIEUP
+ {0x87F6, 0xB264}, //1238 #HANGUL SYLLABLE NIEUN WI RIEULSIOS
+ {0x87F7, 0xB265}, //1239 #HANGUL SYLLABLE NIEUN WI RIEULTHIEUTH
+ {0x87F8, 0xB266}, //1240 #HANGUL SYLLABLE NIEUN WI RIEULPHIEUPH
+ {0x87F9, 0xB267}, //1241 #HANGUL SYLLABLE NIEUN WI RIEULHIEUH
+ {0x87FA, 0xB26A}, //1242 #HANGUL SYLLABLE NIEUN WI PIEUPSIOS
+ {0x87FB, 0xB26B}, //1243 #HANGUL SYLLABLE NIEUN WI SIOS
+ {0x87FC, 0xB26C}, //1244 #HANGUL SYLLABLE NIEUN WI SSANGSIOS
+ {0x87FD, 0xB26D}, //1245 #HANGUL SYLLABLE NIEUN WI IEUNG
+ {0x87FE, 0xB26E}, //1246 #HANGUL SYLLABLE NIEUN WI CIEUC
+ {0x8841, 0xB26F}, //1247 #HANGUL SYLLABLE NIEUN WI CHIEUCH
+ {0x8842, 0xB270}, //1248 #HANGUL SYLLABLE NIEUN WI KHIEUKH
+ {0x8843, 0xB271}, //1249 #HANGUL SYLLABLE NIEUN WI THIEUTH
+ {0x8844, 0xB272}, //1250 #HANGUL SYLLABLE NIEUN WI PHIEUPH
+ {0x8845, 0xB273}, //1251 #HANGUL SYLLABLE NIEUN WI HIEUH
+ {0x8846, 0xB276}, //1252 #HANGUL SYLLABLE NIEUN YU SSANGKIYEOK
+ {0x8847, 0xB277}, //1253 #HANGUL SYLLABLE NIEUN YU KIYEOKSIOS
+ {0x8848, 0xB278}, //1254 #HANGUL SYLLABLE NIEUN YU NIEUN
+ {0x8849, 0xB279}, //1255 #HANGUL SYLLABLE NIEUN YU NIEUNCIEUC
+ {0x884A, 0xB27A}, //1256 #HANGUL SYLLABLE NIEUN YU NIEUNHIEUH
+ {0x884B, 0xB27B}, //1257 #HANGUL SYLLABLE NIEUN YU TIKEUT
+ {0x884C, 0xB27D}, //1258 #HANGUL SYLLABLE NIEUN YU RIEULKIYEOK
+ {0x884D, 0xB27E}, //1259 #HANGUL SYLLABLE NIEUN YU RIEULMIEUM
+ {0x884E, 0xB27F}, //1260 #HANGUL SYLLABLE NIEUN YU RIEULPIEUP
+ {0x884F, 0xB280}, //1261 #HANGUL SYLLABLE NIEUN YU RIEULSIOS
+ {0x8850, 0xB281}, //1262 #HANGUL SYLLABLE NIEUN YU RIEULTHIEUTH
+ {0x8851, 0xB282}, //1263 #HANGUL SYLLABLE NIEUN YU RIEULPHIEUPH
+ {0x8852, 0xB283}, //1264 #HANGUL SYLLABLE NIEUN YU RIEULHIEUH
+ {0x8853, 0xB286}, //1265 #HANGUL SYLLABLE NIEUN YU PIEUPSIOS
+ {0x8854, 0xB287}, //1266 #HANGUL SYLLABLE NIEUN YU SIOS
+ {0x8855, 0xB288}, //1267 #HANGUL SYLLABLE NIEUN YU SSANGSIOS
+ {0x8856, 0xB28A}, //1268 #HANGUL SYLLABLE NIEUN YU CIEUC
+ {0x8857, 0xB28B}, //1269 #HANGUL SYLLABLE NIEUN YU CHIEUCH
+ {0x8858, 0xB28C}, //1270 #HANGUL SYLLABLE NIEUN YU KHIEUKH
+ {0x8859, 0xB28D}, //1271 #HANGUL SYLLABLE NIEUN YU THIEUTH
+ {0x885A, 0xB28E}, //1272 #HANGUL SYLLABLE NIEUN YU PHIEUPH
+ {0x8861, 0xB28F}, //1273 #HANGUL SYLLABLE NIEUN YU HIEUH
+ {0x8862, 0xB292}, //1274 #HANGUL SYLLABLE NIEUN EU SSANGKIYEOK
+ {0x8863, 0xB293}, //1275 #HANGUL SYLLABLE NIEUN EU KIYEOKSIOS
+ {0x8864, 0xB295}, //1276 #HANGUL SYLLABLE NIEUN EU NIEUNCIEUC
+ {0x8865, 0xB296}, //1277 #HANGUL SYLLABLE NIEUN EU NIEUNHIEUH
+ {0x8866, 0xB297}, //1278 #HANGUL SYLLABLE NIEUN EU TIKEUT
+ {0x8867, 0xB29B}, //1279 #HANGUL SYLLABLE NIEUN EU RIEULPIEUP
+ {0x8868, 0xB29C}, //1280 #HANGUL SYLLABLE NIEUN EU RIEULSIOS
+ {0x8869, 0xB29D}, //1281 #HANGUL SYLLABLE NIEUN EU RIEULTHIEUTH
+ {0x886A, 0xB29E}, //1282 #HANGUL SYLLABLE NIEUN EU RIEULPHIEUPH
+ {0x886B, 0xB29F}, //1283 #HANGUL SYLLABLE NIEUN EU RIEULHIEUH
+ {0x886C, 0xB2A2}, //1284 #HANGUL SYLLABLE NIEUN EU PIEUPSIOS
+ {0x886D, 0xB2A4}, //1285 #HANGUL SYLLABLE NIEUN EU SSANGSIOS
+ {0x886E, 0xB2A7}, //1286 #HANGUL SYLLABLE NIEUN EU CHIEUCH
+ {0x886F, 0xB2A8}, //1287 #HANGUL SYLLABLE NIEUN EU KHIEUKH
+ {0x8870, 0xB2A9}, //1288 #HANGUL SYLLABLE NIEUN EU THIEUTH
+ {0x8871, 0xB2AB}, //1289 #HANGUL SYLLABLE NIEUN EU HIEUH
+ {0x8872, 0xB2AD}, //1290 #HANGUL SYLLABLE NIEUN YI KIYEOK
+ {0x8873, 0xB2AE}, //1291 #HANGUL SYLLABLE NIEUN YI SSANGKIYEOK
+ {0x8874, 0xB2AF}, //1292 #HANGUL SYLLABLE NIEUN YI KIYEOKSIOS
+ {0x8875, 0xB2B1}, //1293 #HANGUL SYLLABLE NIEUN YI NIEUNCIEUC
+ {0x8876, 0xB2B2}, //1294 #HANGUL SYLLABLE NIEUN YI NIEUNHIEUH
+ {0x8877, 0xB2B3}, //1295 #HANGUL SYLLABLE NIEUN YI TIKEUT
+ {0x8878, 0xB2B5}, //1296 #HANGUL SYLLABLE NIEUN YI RIEULKIYEOK
+ {0x8879, 0xB2B6}, //1297 #HANGUL SYLLABLE NIEUN YI RIEULMIEUM
+ {0x887A, 0xB2B7}, //1298 #HANGUL SYLLABLE NIEUN YI RIEULPIEUP
+ {0x8881, 0xB2B8}, //1299 #HANGUL SYLLABLE NIEUN YI RIEULSIOS
+ {0x8882, 0xB2B9}, //1300 #HANGUL SYLLABLE NIEUN YI RIEULTHIEUTH
+ {0x8883, 0xB2BA}, //1301 #HANGUL SYLLABLE NIEUN YI RIEULPHIEUPH
+ {0x8884, 0xB2BB}, //1302 #HANGUL SYLLABLE NIEUN YI RIEULHIEUH
+ {0x8885, 0xB2BC}, //1303 #HANGUL SYLLABLE NIEUN YI MIEUM
+ {0x8886, 0xB2BD}, //1304 #HANGUL SYLLABLE NIEUN YI PIEUP
+ {0x8887, 0xB2BE}, //1305 #HANGUL SYLLABLE NIEUN YI PIEUPSIOS
+ {0x8888, 0xB2BF}, //1306 #HANGUL SYLLABLE NIEUN YI SIOS
+ {0x8889, 0xB2C0}, //1307 #HANGUL SYLLABLE NIEUN YI SSANGSIOS
+ {0x888A, 0xB2C1}, //1308 #HANGUL SYLLABLE NIEUN YI IEUNG
+ {0x888B, 0xB2C2}, //1309 #HANGUL SYLLABLE NIEUN YI CIEUC
+ {0x888C, 0xB2C3}, //1310 #HANGUL SYLLABLE NIEUN YI CHIEUCH
+ {0x888D, 0xB2C4}, //1311 #HANGUL SYLLABLE NIEUN YI KHIEUKH
+ {0x888E, 0xB2C5}, //1312 #HANGUL SYLLABLE NIEUN YI THIEUTH
+ {0x888F, 0xB2C6}, //1313 #HANGUL SYLLABLE NIEUN YI PHIEUPH
+ {0x8890, 0xB2C7}, //1314 #HANGUL SYLLABLE NIEUN YI HIEUH
+ {0x8891, 0xB2CA}, //1315 #HANGUL SYLLABLE NIEUN I SSANGKIYEOK
+ {0x8892, 0xB2CB}, //1316 #HANGUL SYLLABLE NIEUN I KIYEOKSIOS
+ {0x8893, 0xB2CD}, //1317 #HANGUL SYLLABLE NIEUN I NIEUNCIEUC
+ {0x8894, 0xB2CE}, //1318 #HANGUL SYLLABLE NIEUN I NIEUNHIEUH
+ {0x8895, 0xB2CF}, //1319 #HANGUL SYLLABLE NIEUN I TIKEUT
+ {0x8896, 0xB2D1}, //1320 #HANGUL SYLLABLE NIEUN I RIEULKIYEOK
+ {0x8897, 0xB2D3}, //1321 #HANGUL SYLLABLE NIEUN I RIEULPIEUP
+ {0x8898, 0xB2D4}, //1322 #HANGUL SYLLABLE NIEUN I RIEULSIOS
+ {0x8899, 0xB2D5}, //1323 #HANGUL SYLLABLE NIEUN I RIEULTHIEUTH
+ {0x889A, 0xB2D6}, //1324 #HANGUL SYLLABLE NIEUN I RIEULPHIEUPH
+ {0x889B, 0xB2D7}, //1325 #HANGUL SYLLABLE NIEUN I RIEULHIEUH
+ {0x889C, 0xB2DA}, //1326 #HANGUL SYLLABLE NIEUN I PIEUPSIOS
+ {0x889D, 0xB2DC}, //1327 #HANGUL SYLLABLE NIEUN I SSANGSIOS
+ {0x889E, 0xB2DE}, //1328 #HANGUL SYLLABLE NIEUN I CIEUC
+ {0x889F, 0xB2DF}, //1329 #HANGUL SYLLABLE NIEUN I CHIEUCH
+ {0x88A0, 0xB2E0}, //1330 #HANGUL SYLLABLE NIEUN I KHIEUKH
+ {0x88A1, 0xB2E1}, //1331 #HANGUL SYLLABLE NIEUN I THIEUTH
+ {0x88A2, 0xB2E3}, //1332 #HANGUL SYLLABLE NIEUN I HIEUH
+ {0x88A3, 0xB2E7}, //1333 #HANGUL SYLLABLE TIKEUT A KIYEOKSIOS
+ {0x88A4, 0xB2E9}, //1334 #HANGUL SYLLABLE TIKEUT A NIEUNCIEUC
+ {0x88A5, 0xB2EA}, //1335 #HANGUL SYLLABLE TIKEUT A NIEUNHIEUH
+ {0x88A6, 0xB2F0}, //1336 #HANGUL SYLLABLE TIKEUT A RIEULSIOS
+ {0x88A7, 0xB2F1}, //1337 #HANGUL SYLLABLE TIKEUT A RIEULTHIEUTH
+ {0x88A8, 0xB2F2}, //1338 #HANGUL SYLLABLE TIKEUT A RIEULPHIEUPH
+ {0x88A9, 0xB2F6}, //1339 #HANGUL SYLLABLE TIKEUT A PIEUPSIOS
+ {0x88AA, 0xB2FC}, //1340 #HANGUL SYLLABLE TIKEUT A KHIEUKH
+ {0x88AB, 0xB2FD}, //1341 #HANGUL SYLLABLE TIKEUT A THIEUTH
+ {0x88AC, 0xB2FE}, //1342 #HANGUL SYLLABLE TIKEUT A PHIEUPH
+ {0x88AD, 0xB302}, //1343 #HANGUL SYLLABLE TIKEUT AE SSANGKIYEOK
+ {0x88AE, 0xB303}, //1344 #HANGUL SYLLABLE TIKEUT AE KIYEOKSIOS
+ {0x88AF, 0xB305}, //1345 #HANGUL SYLLABLE TIKEUT AE NIEUNCIEUC
+ {0x88B0, 0xB306}, //1346 #HANGUL SYLLABLE TIKEUT AE NIEUNHIEUH
+ {0x88B1, 0xB307}, //1347 #HANGUL SYLLABLE TIKEUT AE TIKEUT
+ {0x88B2, 0xB309}, //1348 #HANGUL SYLLABLE TIKEUT AE RIEULKIYEOK
+ {0x88B3, 0xB30A}, //1349 #HANGUL SYLLABLE TIKEUT AE RIEULMIEUM
+ {0x88B4, 0xB30B}, //1350 #HANGUL SYLLABLE TIKEUT AE RIEULPIEUP
+ {0x88B5, 0xB30C}, //1351 #HANGUL SYLLABLE TIKEUT AE RIEULSIOS
+ {0x88B6, 0xB30D}, //1352 #HANGUL SYLLABLE TIKEUT AE RIEULTHIEUTH
+ {0x88B7, 0xB30E}, //1353 #HANGUL SYLLABLE TIKEUT AE RIEULPHIEUPH
+ {0x88B8, 0xB30F}, //1354 #HANGUL SYLLABLE TIKEUT AE RIEULHIEUH
+ {0x88B9, 0xB312}, //1355 #HANGUL SYLLABLE TIKEUT AE PIEUPSIOS
+ {0x88BA, 0xB316}, //1356 #HANGUL SYLLABLE TIKEUT AE CIEUC
+ {0x88BB, 0xB317}, //1357 #HANGUL SYLLABLE TIKEUT AE CHIEUCH
+ {0x88BC, 0xB318}, //1358 #HANGUL SYLLABLE TIKEUT AE KHIEUKH
+ {0x88BD, 0xB319}, //1359 #HANGUL SYLLABLE TIKEUT AE THIEUTH
+ {0x88BE, 0xB31A}, //1360 #HANGUL SYLLABLE TIKEUT AE PHIEUPH
+ {0x88BF, 0xB31B}, //1361 #HANGUL SYLLABLE TIKEUT AE HIEUH
+ {0x88C0, 0xB31D}, //1362 #HANGUL SYLLABLE TIKEUT YA KIYEOK
+ {0x88C1, 0xB31E}, //1363 #HANGUL SYLLABLE TIKEUT YA SSANGKIYEOK
+ {0x88C2, 0xB31F}, //1364 #HANGUL SYLLABLE TIKEUT YA KIYEOKSIOS
+ {0x88C3, 0xB320}, //1365 #HANGUL SYLLABLE TIKEUT YA NIEUN
+ {0x88C4, 0xB321}, //1366 #HANGUL SYLLABLE TIKEUT YA NIEUNCIEUC
+ {0x88C5, 0xB322}, //1367 #HANGUL SYLLABLE TIKEUT YA NIEUNHIEUH
+ {0x88C6, 0xB323}, //1368 #HANGUL SYLLABLE TIKEUT YA TIKEUT
+ {0x88C7, 0xB324}, //1369 #HANGUL SYLLABLE TIKEUT YA RIEUL
+ {0x88C8, 0xB325}, //1370 #HANGUL SYLLABLE TIKEUT YA RIEULKIYEOK
+ {0x88C9, 0xB326}, //1371 #HANGUL SYLLABLE TIKEUT YA RIEULMIEUM
+ {0x88CA, 0xB327}, //1372 #HANGUL SYLLABLE TIKEUT YA RIEULPIEUP
+ {0x88CB, 0xB328}, //1373 #HANGUL SYLLABLE TIKEUT YA RIEULSIOS
+ {0x88CC, 0xB329}, //1374 #HANGUL SYLLABLE TIKEUT YA RIEULTHIEUTH
+ {0x88CD, 0xB32A}, //1375 #HANGUL SYLLABLE TIKEUT YA RIEULPHIEUPH
+ {0x88CE, 0xB32B}, //1376 #HANGUL SYLLABLE TIKEUT YA RIEULHIEUH
+ {0x88CF, 0xB32C}, //1377 #HANGUL SYLLABLE TIKEUT YA MIEUM
+ {0x88D0, 0xB32D}, //1378 #HANGUL SYLLABLE TIKEUT YA PIEUP
+ {0x88D1, 0xB32E}, //1379 #HANGUL SYLLABLE TIKEUT YA PIEUPSIOS
+ {0x88D2, 0xB32F}, //1380 #HANGUL SYLLABLE TIKEUT YA SIOS
+ {0x88D3, 0xB330}, //1381 #HANGUL SYLLABLE TIKEUT YA SSANGSIOS
+ {0x88D4, 0xB331}, //1382 #HANGUL SYLLABLE TIKEUT YA IEUNG
+ {0x88D5, 0xB332}, //1383 #HANGUL SYLLABLE TIKEUT YA CIEUC
+ {0x88D6, 0xB333}, //1384 #HANGUL SYLLABLE TIKEUT YA CHIEUCH
+ {0x88D7, 0xB334}, //1385 #HANGUL SYLLABLE TIKEUT YA KHIEUKH
+ {0x88D8, 0xB335}, //1386 #HANGUL SYLLABLE TIKEUT YA THIEUTH
+ {0x88D9, 0xB336}, //1387 #HANGUL SYLLABLE TIKEUT YA PHIEUPH
+ {0x88DA, 0xB337}, //1388 #HANGUL SYLLABLE TIKEUT YA HIEUH
+ {0x88DB, 0xB338}, //1389 #HANGUL SYLLABLE TIKEUT YAE
+ {0x88DC, 0xB339}, //1390 #HANGUL SYLLABLE TIKEUT YAE KIYEOK
+ {0x88DD, 0xB33A}, //1391 #HANGUL SYLLABLE TIKEUT YAE SSANGKIYEOK
+ {0x88DE, 0xB33B}, //1392 #HANGUL SYLLABLE TIKEUT YAE KIYEOKSIOS
+ {0x88DF, 0xB33C}, //1393 #HANGUL SYLLABLE TIKEUT YAE NIEUN
+ {0x88E0, 0xB33D}, //1394 #HANGUL SYLLABLE TIKEUT YAE NIEUNCIEUC
+ {0x88E1, 0xB33E}, //1395 #HANGUL SYLLABLE TIKEUT YAE NIEUNHIEUH
+ {0x88E2, 0xB33F}, //1396 #HANGUL SYLLABLE TIKEUT YAE TIKEUT
+ {0x88E3, 0xB340}, //1397 #HANGUL SYLLABLE TIKEUT YAE RIEUL
+ {0x88E4, 0xB341}, //1398 #HANGUL SYLLABLE TIKEUT YAE RIEULKIYEOK
+ {0x88E5, 0xB342}, //1399 #HANGUL SYLLABLE TIKEUT YAE RIEULMIEUM
+ {0x88E6, 0xB343}, //1400 #HANGUL SYLLABLE TIKEUT YAE RIEULPIEUP
+ {0x88E7, 0xB344}, //1401 #HANGUL SYLLABLE TIKEUT YAE RIEULSIOS
+ {0x88E8, 0xB345}, //1402 #HANGUL SYLLABLE TIKEUT YAE RIEULTHIEUTH
+ {0x88E9, 0xB346}, //1403 #HANGUL SYLLABLE TIKEUT YAE RIEULPHIEUPH
+ {0x88EA, 0xB347}, //1404 #HANGUL SYLLABLE TIKEUT YAE RIEULHIEUH
+ {0x88EB, 0xB348}, //1405 #HANGUL SYLLABLE TIKEUT YAE MIEUM
+ {0x88EC, 0xB349}, //1406 #HANGUL SYLLABLE TIKEUT YAE PIEUP
+ {0x88ED, 0xB34A}, //1407 #HANGUL SYLLABLE TIKEUT YAE PIEUPSIOS
+ {0x88EE, 0xB34B}, //1408 #HANGUL SYLLABLE TIKEUT YAE SIOS
+ {0x88EF, 0xB34C}, //1409 #HANGUL SYLLABLE TIKEUT YAE SSANGSIOS
+ {0x88F0, 0xB34D}, //1410 #HANGUL SYLLABLE TIKEUT YAE IEUNG
+ {0x88F1, 0xB34E}, //1411 #HANGUL SYLLABLE TIKEUT YAE CIEUC
+ {0x88F2, 0xB34F}, //1412 #HANGUL SYLLABLE TIKEUT YAE CHIEUCH
+ {0x88F3, 0xB350}, //1413 #HANGUL SYLLABLE TIKEUT YAE KHIEUKH
+ {0x88F4, 0xB351}, //1414 #HANGUL SYLLABLE TIKEUT YAE THIEUTH
+ {0x88F5, 0xB352}, //1415 #HANGUL SYLLABLE TIKEUT YAE PHIEUPH
+ {0x88F6, 0xB353}, //1416 #HANGUL SYLLABLE TIKEUT YAE HIEUH
+ {0x88F7, 0xB357}, //1417 #HANGUL SYLLABLE TIKEUT EO KIYEOKSIOS
+ {0x88F8, 0xB359}, //1418 #HANGUL SYLLABLE TIKEUT EO NIEUNCIEUC
+ {0x88F9, 0xB35A}, //1419 #HANGUL SYLLABLE TIKEUT EO NIEUNHIEUH
+ {0x88FA, 0xB35D}, //1420 #HANGUL SYLLABLE TIKEUT EO RIEULKIYEOK
+ {0x88FB, 0xB360}, //1421 #HANGUL SYLLABLE TIKEUT EO RIEULSIOS
+ {0x88FC, 0xB361}, //1422 #HANGUL SYLLABLE TIKEUT EO RIEULTHIEUTH
+ {0x88FD, 0xB362}, //1423 #HANGUL SYLLABLE TIKEUT EO RIEULPHIEUPH
+ {0x88FE, 0xB363}, //1424 #HANGUL SYLLABLE TIKEUT EO RIEULHIEUH
+ {0x8941, 0xB366}, //1425 #HANGUL SYLLABLE TIKEUT EO PIEUPSIOS
+ {0x8942, 0xB368}, //1426 #HANGUL SYLLABLE TIKEUT EO SSANGSIOS
+ {0x8943, 0xB36A}, //1427 #HANGUL SYLLABLE TIKEUT EO CIEUC
+ {0x8944, 0xB36C}, //1428 #HANGUL SYLLABLE TIKEUT EO KHIEUKH
+ {0x8945, 0xB36D}, //1429 #HANGUL SYLLABLE TIKEUT EO THIEUTH
+ {0x8946, 0xB36F}, //1430 #HANGUL SYLLABLE TIKEUT EO HIEUH
+ {0x8947, 0xB372}, //1431 #HANGUL SYLLABLE TIKEUT E SSANGKIYEOK
+ {0x8948, 0xB373}, //1432 #HANGUL SYLLABLE TIKEUT E KIYEOKSIOS
+ {0x8949, 0xB375}, //1433 #HANGUL SYLLABLE TIKEUT E NIEUNCIEUC
+ {0x894A, 0xB376}, //1434 #HANGUL SYLLABLE TIKEUT E NIEUNHIEUH
+ {0x894B, 0xB377}, //1435 #HANGUL SYLLABLE TIKEUT E TIKEUT
+ {0x894C, 0xB379}, //1436 #HANGUL SYLLABLE TIKEUT E RIEULKIYEOK
+ {0x894D, 0xB37A}, //1437 #HANGUL SYLLABLE TIKEUT E RIEULMIEUM
+ {0x894E, 0xB37B}, //1438 #HANGUL SYLLABLE TIKEUT E RIEULPIEUP
+ {0x894F, 0xB37C}, //1439 #HANGUL SYLLABLE TIKEUT E RIEULSIOS
+ {0x8950, 0xB37D}, //1440 #HANGUL SYLLABLE TIKEUT E RIEULTHIEUTH
+ {0x8951, 0xB37E}, //1441 #HANGUL SYLLABLE TIKEUT E RIEULPHIEUPH
+ {0x8952, 0xB37F}, //1442 #HANGUL SYLLABLE TIKEUT E RIEULHIEUH
+ {0x8953, 0xB382}, //1443 #HANGUL SYLLABLE TIKEUT E PIEUPSIOS
+ {0x8954, 0xB386}, //1444 #HANGUL SYLLABLE TIKEUT E CIEUC
+ {0x8955, 0xB387}, //1445 #HANGUL SYLLABLE TIKEUT E CHIEUCH
+ {0x8956, 0xB388}, //1446 #HANGUL SYLLABLE TIKEUT E KHIEUKH
+ {0x8957, 0xB389}, //1447 #HANGUL SYLLABLE TIKEUT E THIEUTH
+ {0x8958, 0xB38A}, //1448 #HANGUL SYLLABLE TIKEUT E PHIEUPH
+ {0x8959, 0xB38B}, //1449 #HANGUL SYLLABLE TIKEUT E HIEUH
+ {0x895A, 0xB38D}, //1450 #HANGUL SYLLABLE TIKEUT YEO KIYEOK
+ {0x8961, 0xB38E}, //1451 #HANGUL SYLLABLE TIKEUT YEO SSANGKIYEOK
+ {0x8962, 0xB38F}, //1452 #HANGUL SYLLABLE TIKEUT YEO KIYEOKSIOS
+ {0x8963, 0xB391}, //1453 #HANGUL SYLLABLE TIKEUT YEO NIEUNCIEUC
+ {0x8964, 0xB392}, //1454 #HANGUL SYLLABLE TIKEUT YEO NIEUNHIEUH
+ {0x8965, 0xB393}, //1455 #HANGUL SYLLABLE TIKEUT YEO TIKEUT
+ {0x8966, 0xB395}, //1456 #HANGUL SYLLABLE TIKEUT YEO RIEULKIYEOK
+ {0x8967, 0xB396}, //1457 #HANGUL SYLLABLE TIKEUT YEO RIEULMIEUM
+ {0x8968, 0xB397}, //1458 #HANGUL SYLLABLE TIKEUT YEO RIEULPIEUP
+ {0x8969, 0xB398}, //1459 #HANGUL SYLLABLE TIKEUT YEO RIEULSIOS
+ {0x896A, 0xB399}, //1460 #HANGUL SYLLABLE TIKEUT YEO RIEULTHIEUTH
+ {0x896B, 0xB39A}, //1461 #HANGUL SYLLABLE TIKEUT YEO RIEULPHIEUPH
+ {0x896C, 0xB39B}, //1462 #HANGUL SYLLABLE TIKEUT YEO RIEULHIEUH
+ {0x896D, 0xB39C}, //1463 #HANGUL SYLLABLE TIKEUT YEO MIEUM
+ {0x896E, 0xB39D}, //1464 #HANGUL SYLLABLE TIKEUT YEO PIEUP
+ {0x896F, 0xB39E}, //1465 #HANGUL SYLLABLE TIKEUT YEO PIEUPSIOS
+ {0x8970, 0xB39F}, //1466 #HANGUL SYLLABLE TIKEUT YEO SIOS
+ {0x8971, 0xB3A2}, //1467 #HANGUL SYLLABLE TIKEUT YEO CIEUC
+ {0x8972, 0xB3A3}, //1468 #HANGUL SYLLABLE TIKEUT YEO CHIEUCH
+ {0x8973, 0xB3A4}, //1469 #HANGUL SYLLABLE TIKEUT YEO KHIEUKH
+ {0x8974, 0xB3A5}, //1470 #HANGUL SYLLABLE TIKEUT YEO THIEUTH
+ {0x8975, 0xB3A6}, //1471 #HANGUL SYLLABLE TIKEUT YEO PHIEUPH
+ {0x8976, 0xB3A7}, //1472 #HANGUL SYLLABLE TIKEUT YEO HIEUH
+ {0x8977, 0xB3A9}, //1473 #HANGUL SYLLABLE TIKEUT YE KIYEOK
+ {0x8978, 0xB3AA}, //1474 #HANGUL SYLLABLE TIKEUT YE SSANGKIYEOK
+ {0x8979, 0xB3AB}, //1475 #HANGUL SYLLABLE TIKEUT YE KIYEOKSIOS
+ {0x897A, 0xB3AD}, //1476 #HANGUL SYLLABLE TIKEUT YE NIEUNCIEUC
+ {0x8981, 0xB3AE}, //1477 #HANGUL SYLLABLE TIKEUT YE NIEUNHIEUH
+ {0x8982, 0xB3AF}, //1478 #HANGUL SYLLABLE TIKEUT YE TIKEUT
+ {0x8983, 0xB3B0}, //1479 #HANGUL SYLLABLE TIKEUT YE RIEUL
+ {0x8984, 0xB3B1}, //1480 #HANGUL SYLLABLE TIKEUT YE RIEULKIYEOK
+ {0x8985, 0xB3B2}, //1481 #HANGUL SYLLABLE TIKEUT YE RIEULMIEUM
+ {0x8986, 0xB3B3}, //1482 #HANGUL SYLLABLE TIKEUT YE RIEULPIEUP
+ {0x8987, 0xB3B4}, //1483 #HANGUL SYLLABLE TIKEUT YE RIEULSIOS
+ {0x8988, 0xB3B5}, //1484 #HANGUL SYLLABLE TIKEUT YE RIEULTHIEUTH
+ {0x8989, 0xB3B6}, //1485 #HANGUL SYLLABLE TIKEUT YE RIEULPHIEUPH
+ {0x898A, 0xB3B7}, //1486 #HANGUL SYLLABLE TIKEUT YE RIEULHIEUH
+ {0x898B, 0xB3B8}, //1487 #HANGUL SYLLABLE TIKEUT YE MIEUM
+ {0x898C, 0xB3B9}, //1488 #HANGUL SYLLABLE TIKEUT YE PIEUP
+ {0x898D, 0xB3BA}, //1489 #HANGUL SYLLABLE TIKEUT YE PIEUPSIOS
+ {0x898E, 0xB3BB}, //1490 #HANGUL SYLLABLE TIKEUT YE SIOS
+ {0x898F, 0xB3BC}, //1491 #HANGUL SYLLABLE TIKEUT YE SSANGSIOS
+ {0x8990, 0xB3BD}, //1492 #HANGUL SYLLABLE TIKEUT YE IEUNG
+ {0x8991, 0xB3BE}, //1493 #HANGUL SYLLABLE TIKEUT YE CIEUC
+ {0x8992, 0xB3BF}, //1494 #HANGUL SYLLABLE TIKEUT YE CHIEUCH
+ {0x8993, 0xB3C0}, //1495 #HANGUL SYLLABLE TIKEUT YE KHIEUKH
+ {0x8994, 0xB3C1}, //1496 #HANGUL SYLLABLE TIKEUT YE THIEUTH
+ {0x8995, 0xB3C2}, //1497 #HANGUL SYLLABLE TIKEUT YE PHIEUPH
+ {0x8996, 0xB3C3}, //1498 #HANGUL SYLLABLE TIKEUT YE HIEUH
+ {0x8997, 0xB3C6}, //1499 #HANGUL SYLLABLE TIKEUT O SSANGKIYEOK
+ {0x8998, 0xB3C7}, //1500 #HANGUL SYLLABLE TIKEUT O KIYEOKSIOS
+ {0x8999, 0xB3C9}, //1501 #HANGUL SYLLABLE TIKEUT O NIEUNCIEUC
+ {0x899A, 0xB3CA}, //1502 #HANGUL SYLLABLE TIKEUT O NIEUNHIEUH
+ {0x899B, 0xB3CD}, //1503 #HANGUL SYLLABLE TIKEUT O RIEULKIYEOK
+ {0x899C, 0xB3CF}, //1504 #HANGUL SYLLABLE TIKEUT O RIEULPIEUP
+ {0x899D, 0xB3D1}, //1505 #HANGUL SYLLABLE TIKEUT O RIEULTHIEUTH
+ {0x899E, 0xB3D2}, //1506 #HANGUL SYLLABLE TIKEUT O RIEULPHIEUPH
+ {0x899F, 0xB3D3}, //1507 #HANGUL SYLLABLE TIKEUT O RIEULHIEUH
+ {0x89A0, 0xB3D6}, //1508 #HANGUL SYLLABLE TIKEUT O PIEUPSIOS
+ {0x89A1, 0xB3D8}, //1509 #HANGUL SYLLABLE TIKEUT O SSANGSIOS
+ {0x89A2, 0xB3DA}, //1510 #HANGUL SYLLABLE TIKEUT O CIEUC
+ {0x89A3, 0xB3DC}, //1511 #HANGUL SYLLABLE TIKEUT O KHIEUKH
+ {0x89A4, 0xB3DE}, //1512 #HANGUL SYLLABLE TIKEUT O PHIEUPH
+ {0x89A5, 0xB3DF}, //1513 #HANGUL SYLLABLE TIKEUT O HIEUH
+ {0x89A6, 0xB3E1}, //1514 #HANGUL SYLLABLE TIKEUT WA KIYEOK
+ {0x89A7, 0xB3E2}, //1515 #HANGUL SYLLABLE TIKEUT WA SSANGKIYEOK
+ {0x89A8, 0xB3E3}, //1516 #HANGUL SYLLABLE TIKEUT WA KIYEOKSIOS
+ {0x89A9, 0xB3E5}, //1517 #HANGUL SYLLABLE TIKEUT WA NIEUNCIEUC
+ {0x89AA, 0xB3E6}, //1518 #HANGUL SYLLABLE TIKEUT WA NIEUNHIEUH
+ {0x89AB, 0xB3E7}, //1519 #HANGUL SYLLABLE TIKEUT WA TIKEUT
+ {0x89AC, 0xB3E9}, //1520 #HANGUL SYLLABLE TIKEUT WA RIEULKIYEOK
+ {0x89AD, 0xB3EA}, //1521 #HANGUL SYLLABLE TIKEUT WA RIEULMIEUM
+ {0x89AE, 0xB3EB}, //1522 #HANGUL SYLLABLE TIKEUT WA RIEULPIEUP
+ {0x89AF, 0xB3EC}, //1523 #HANGUL SYLLABLE TIKEUT WA RIEULSIOS
+ {0x89B0, 0xB3ED}, //1524 #HANGUL SYLLABLE TIKEUT WA RIEULTHIEUTH
+ {0x89B1, 0xB3EE}, //1525 #HANGUL SYLLABLE TIKEUT WA RIEULPHIEUPH
+ {0x89B2, 0xB3EF}, //1526 #HANGUL SYLLABLE TIKEUT WA RIEULHIEUH
+ {0x89B3, 0xB3F0}, //1527 #HANGUL SYLLABLE TIKEUT WA MIEUM
+ {0x89B4, 0xB3F1}, //1528 #HANGUL SYLLABLE TIKEUT WA PIEUP
+ {0x89B5, 0xB3F2}, //1529 #HANGUL SYLLABLE TIKEUT WA PIEUPSIOS
+ {0x89B6, 0xB3F3}, //1530 #HANGUL SYLLABLE TIKEUT WA SIOS
+ {0x89B7, 0xB3F4}, //1531 #HANGUL SYLLABLE TIKEUT WA SSANGSIOS
+ {0x89B8, 0xB3F5}, //1532 #HANGUL SYLLABLE TIKEUT WA IEUNG
+ {0x89B9, 0xB3F6}, //1533 #HANGUL SYLLABLE TIKEUT WA CIEUC
+ {0x89BA, 0xB3F7}, //1534 #HANGUL SYLLABLE TIKEUT WA CHIEUCH
+ {0x89BB, 0xB3F8}, //1535 #HANGUL SYLLABLE TIKEUT WA KHIEUKH
+ {0x89BC, 0xB3F9}, //1536 #HANGUL SYLLABLE TIKEUT WA THIEUTH
+ {0x89BD, 0xB3FA}, //1537 #HANGUL SYLLABLE TIKEUT WA PHIEUPH
+ {0x89BE, 0xB3FB}, //1538 #HANGUL SYLLABLE TIKEUT WA HIEUH
+ {0x89BF, 0xB3FD}, //1539 #HANGUL SYLLABLE TIKEUT WAE KIYEOK
+ {0x89C0, 0xB3FE}, //1540 #HANGUL SYLLABLE TIKEUT WAE SSANGKIYEOK
+ {0x89C1, 0xB3FF}, //1541 #HANGUL SYLLABLE TIKEUT WAE KIYEOKSIOS
+ {0x89C2, 0xB400}, //1542 #HANGUL SYLLABLE TIKEUT WAE NIEUN
+ {0x89C3, 0xB401}, //1543 #HANGUL SYLLABLE TIKEUT WAE NIEUNCIEUC
+ {0x89C4, 0xB402}, //1544 #HANGUL SYLLABLE TIKEUT WAE NIEUNHIEUH
+ {0x89C5, 0xB403}, //1545 #HANGUL SYLLABLE TIKEUT WAE TIKEUT
+ {0x89C6, 0xB404}, //1546 #HANGUL SYLLABLE TIKEUT WAE RIEUL
+ {0x89C7, 0xB405}, //1547 #HANGUL SYLLABLE TIKEUT WAE RIEULKIYEOK
+ {0x89C8, 0xB406}, //1548 #HANGUL SYLLABLE TIKEUT WAE RIEULMIEUM
+ {0x89C9, 0xB407}, //1549 #HANGUL SYLLABLE TIKEUT WAE RIEULPIEUP
+ {0x89CA, 0xB408}, //1550 #HANGUL SYLLABLE TIKEUT WAE RIEULSIOS
+ {0x89CB, 0xB409}, //1551 #HANGUL SYLLABLE TIKEUT WAE RIEULTHIEUTH
+ {0x89CC, 0xB40A}, //1552 #HANGUL SYLLABLE TIKEUT WAE RIEULPHIEUPH
+ {0x89CD, 0xB40B}, //1553 #HANGUL SYLLABLE TIKEUT WAE RIEULHIEUH
+ {0x89CE, 0xB40C}, //1554 #HANGUL SYLLABLE TIKEUT WAE MIEUM
+ {0x89CF, 0xB40D}, //1555 #HANGUL SYLLABLE TIKEUT WAE PIEUP
+ {0x89D0, 0xB40E}, //1556 #HANGUL SYLLABLE TIKEUT WAE PIEUPSIOS
+ {0x89D1, 0xB40F}, //1557 #HANGUL SYLLABLE TIKEUT WAE SIOS
+ {0x89D2, 0xB411}, //1558 #HANGUL SYLLABLE TIKEUT WAE IEUNG
+ {0x89D3, 0xB412}, //1559 #HANGUL SYLLABLE TIKEUT WAE CIEUC
+ {0x89D4, 0xB413}, //1560 #HANGUL SYLLABLE TIKEUT WAE CHIEUCH
+ {0x89D5, 0xB414}, //1561 #HANGUL SYLLABLE TIKEUT WAE KHIEUKH
+ {0x89D6, 0xB415}, //1562 #HANGUL SYLLABLE TIKEUT WAE THIEUTH
+ {0x89D7, 0xB416}, //1563 #HANGUL SYLLABLE TIKEUT WAE PHIEUPH
+ {0x89D8, 0xB417}, //1564 #HANGUL SYLLABLE TIKEUT WAE HIEUH
+ {0x89D9, 0xB419}, //1565 #HANGUL SYLLABLE TIKEUT OE KIYEOK
+ {0x89DA, 0xB41A}, //1566 #HANGUL SYLLABLE TIKEUT OE SSANGKIYEOK
+ {0x89DB, 0xB41B}, //1567 #HANGUL SYLLABLE TIKEUT OE KIYEOKSIOS
+ {0x89DC, 0xB41D}, //1568 #HANGUL SYLLABLE TIKEUT OE NIEUNCIEUC
+ {0x89DD, 0xB41E}, //1569 #HANGUL SYLLABLE TIKEUT OE NIEUNHIEUH
+ {0x89DE, 0xB41F}, //1570 #HANGUL SYLLABLE TIKEUT OE TIKEUT
+ {0x89DF, 0xB421}, //1571 #HANGUL SYLLABLE TIKEUT OE RIEULKIYEOK
+ {0x89E0, 0xB422}, //1572 #HANGUL SYLLABLE TIKEUT OE RIEULMIEUM
+ {0x89E1, 0xB423}, //1573 #HANGUL SYLLABLE TIKEUT OE RIEULPIEUP
+ {0x89E2, 0xB424}, //1574 #HANGUL SYLLABLE TIKEUT OE RIEULSIOS
+ {0x89E3, 0xB425}, //1575 #HANGUL SYLLABLE TIKEUT OE RIEULTHIEUTH
+ {0x89E4, 0xB426}, //1576 #HANGUL SYLLABLE TIKEUT OE RIEULPHIEUPH
+ {0x89E5, 0xB427}, //1577 #HANGUL SYLLABLE TIKEUT OE RIEULHIEUH
+ {0x89E6, 0xB42A}, //1578 #HANGUL SYLLABLE TIKEUT OE PIEUPSIOS
+ {0x89E7, 0xB42C}, //1579 #HANGUL SYLLABLE TIKEUT OE SSANGSIOS
+ {0x89E8, 0xB42D}, //1580 #HANGUL SYLLABLE TIKEUT OE IEUNG
+ {0x89E9, 0xB42E}, //1581 #HANGUL SYLLABLE TIKEUT OE CIEUC
+ {0x89EA, 0xB42F}, //1582 #HANGUL SYLLABLE TIKEUT OE CHIEUCH
+ {0x89EB, 0xB430}, //1583 #HANGUL SYLLABLE TIKEUT OE KHIEUKH
+ {0x89EC, 0xB431}, //1584 #HANGUL SYLLABLE TIKEUT OE THIEUTH
+ {0x89ED, 0xB432}, //1585 #HANGUL SYLLABLE TIKEUT OE PHIEUPH
+ {0x89EE, 0xB433}, //1586 #HANGUL SYLLABLE TIKEUT OE HIEUH
+ {0x89EF, 0xB435}, //1587 #HANGUL SYLLABLE TIKEUT YO KIYEOK
+ {0x89F0, 0xB436}, //1588 #HANGUL SYLLABLE TIKEUT YO SSANGKIYEOK
+ {0x89F1, 0xB437}, //1589 #HANGUL SYLLABLE TIKEUT YO KIYEOKSIOS
+ {0x89F2, 0xB438}, //1590 #HANGUL SYLLABLE TIKEUT YO NIEUN
+ {0x89F3, 0xB439}, //1591 #HANGUL SYLLABLE TIKEUT YO NIEUNCIEUC
+ {0x89F4, 0xB43A}, //1592 #HANGUL SYLLABLE TIKEUT YO NIEUNHIEUH
+ {0x89F5, 0xB43B}, //1593 #HANGUL SYLLABLE TIKEUT YO TIKEUT
+ {0x89F6, 0xB43C}, //1594 #HANGUL SYLLABLE TIKEUT YO RIEUL
+ {0x89F7, 0xB43D}, //1595 #HANGUL SYLLABLE TIKEUT YO RIEULKIYEOK
+ {0x89F8, 0xB43E}, //1596 #HANGUL SYLLABLE TIKEUT YO RIEULMIEUM
+ {0x89F9, 0xB43F}, //1597 #HANGUL SYLLABLE TIKEUT YO RIEULPIEUP
+ {0x89FA, 0xB440}, //1598 #HANGUL SYLLABLE TIKEUT YO RIEULSIOS
+ {0x89FB, 0xB441}, //1599 #HANGUL SYLLABLE TIKEUT YO RIEULTHIEUTH
+ {0x89FC, 0xB442}, //1600 #HANGUL SYLLABLE TIKEUT YO RIEULPHIEUPH
+ {0x89FD, 0xB443}, //1601 #HANGUL SYLLABLE TIKEUT YO RIEULHIEUH
+ {0x89FE, 0xB444}, //1602 #HANGUL SYLLABLE TIKEUT YO MIEUM
+ {0x8A41, 0xB445}, //1603 #HANGUL SYLLABLE TIKEUT YO PIEUP
+ {0x8A42, 0xB446}, //1604 #HANGUL SYLLABLE TIKEUT YO PIEUPSIOS
+ {0x8A43, 0xB447}, //1605 #HANGUL SYLLABLE TIKEUT YO SIOS
+ {0x8A44, 0xB448}, //1606 #HANGUL SYLLABLE TIKEUT YO SSANGSIOS
+ {0x8A45, 0xB449}, //1607 #HANGUL SYLLABLE TIKEUT YO IEUNG
+ {0x8A46, 0xB44A}, //1608 #HANGUL SYLLABLE TIKEUT YO CIEUC
+ {0x8A47, 0xB44B}, //1609 #HANGUL SYLLABLE TIKEUT YO CHIEUCH
+ {0x8A48, 0xB44C}, //1610 #HANGUL SYLLABLE TIKEUT YO KHIEUKH
+ {0x8A49, 0xB44D}, //1611 #HANGUL SYLLABLE TIKEUT YO THIEUTH
+ {0x8A4A, 0xB44E}, //1612 #HANGUL SYLLABLE TIKEUT YO PHIEUPH
+ {0x8A4B, 0xB44F}, //1613 #HANGUL SYLLABLE TIKEUT YO HIEUH
+ {0x8A4C, 0xB452}, //1614 #HANGUL SYLLABLE TIKEUT U SSANGKIYEOK
+ {0x8A4D, 0xB453}, //1615 #HANGUL SYLLABLE TIKEUT U KIYEOKSIOS
+ {0x8A4E, 0xB455}, //1616 #HANGUL SYLLABLE TIKEUT U NIEUNCIEUC
+ {0x8A4F, 0xB456}, //1617 #HANGUL SYLLABLE TIKEUT U NIEUNHIEUH
+ {0x8A50, 0xB457}, //1618 #HANGUL SYLLABLE TIKEUT U TIKEUT
+ {0x8A51, 0xB459}, //1619 #HANGUL SYLLABLE TIKEUT U RIEULKIYEOK
+ {0x8A52, 0xB45A}, //1620 #HANGUL SYLLABLE TIKEUT U RIEULMIEUM
+ {0x8A53, 0xB45B}, //1621 #HANGUL SYLLABLE TIKEUT U RIEULPIEUP
+ {0x8A54, 0xB45C}, //1622 #HANGUL SYLLABLE TIKEUT U RIEULSIOS
+ {0x8A55, 0xB45D}, //1623 #HANGUL SYLLABLE TIKEUT U RIEULTHIEUTH
+ {0x8A56, 0xB45E}, //1624 #HANGUL SYLLABLE TIKEUT U RIEULPHIEUPH
+ {0x8A57, 0xB45F}, //1625 #HANGUL SYLLABLE TIKEUT U RIEULHIEUH
+ {0x8A58, 0xB462}, //1626 #HANGUL SYLLABLE TIKEUT U PIEUPSIOS
+ {0x8A59, 0xB464}, //1627 #HANGUL SYLLABLE TIKEUT U SSANGSIOS
+ {0x8A5A, 0xB466}, //1628 #HANGUL SYLLABLE TIKEUT U CIEUC
+ {0x8A61, 0xB467}, //1629 #HANGUL SYLLABLE TIKEUT U CHIEUCH
+ {0x8A62, 0xB468}, //1630 #HANGUL SYLLABLE TIKEUT U KHIEUKH
+ {0x8A63, 0xB469}, //1631 #HANGUL SYLLABLE TIKEUT U THIEUTH
+ {0x8A64, 0xB46A}, //1632 #HANGUL SYLLABLE TIKEUT U PHIEUPH
+ {0x8A65, 0xB46B}, //1633 #HANGUL SYLLABLE TIKEUT U HIEUH
+ {0x8A66, 0xB46D}, //1634 #HANGUL SYLLABLE TIKEUT WEO KIYEOK
+ {0x8A67, 0xB46E}, //1635 #HANGUL SYLLABLE TIKEUT WEO SSANGKIYEOK
+ {0x8A68, 0xB46F}, //1636 #HANGUL SYLLABLE TIKEUT WEO KIYEOKSIOS
+ {0x8A69, 0xB470}, //1637 #HANGUL SYLLABLE TIKEUT WEO NIEUN
+ {0x8A6A, 0xB471}, //1638 #HANGUL SYLLABLE TIKEUT WEO NIEUNCIEUC
+ {0x8A6B, 0xB472}, //1639 #HANGUL SYLLABLE TIKEUT WEO NIEUNHIEUH
+ {0x8A6C, 0xB473}, //1640 #HANGUL SYLLABLE TIKEUT WEO TIKEUT
+ {0x8A6D, 0xB474}, //1641 #HANGUL SYLLABLE TIKEUT WEO RIEUL
+ {0x8A6E, 0xB475}, //1642 #HANGUL SYLLABLE TIKEUT WEO RIEULKIYEOK
+ {0x8A6F, 0xB476}, //1643 #HANGUL SYLLABLE TIKEUT WEO RIEULMIEUM
+ {0x8A70, 0xB477}, //1644 #HANGUL SYLLABLE TIKEUT WEO RIEULPIEUP
+ {0x8A71, 0xB478}, //1645 #HANGUL SYLLABLE TIKEUT WEO RIEULSIOS
+ {0x8A72, 0xB479}, //1646 #HANGUL SYLLABLE TIKEUT WEO RIEULTHIEUTH
+ {0x8A73, 0xB47A}, //1647 #HANGUL SYLLABLE TIKEUT WEO RIEULPHIEUPH
+ {0x8A74, 0xB47B}, //1648 #HANGUL SYLLABLE TIKEUT WEO RIEULHIEUH
+ {0x8A75, 0xB47C}, //1649 #HANGUL SYLLABLE TIKEUT WEO MIEUM
+ {0x8A76, 0xB47D}, //1650 #HANGUL SYLLABLE TIKEUT WEO PIEUP
+ {0x8A77, 0xB47E}, //1651 #HANGUL SYLLABLE TIKEUT WEO PIEUPSIOS
+ {0x8A78, 0xB47F}, //1652 #HANGUL SYLLABLE TIKEUT WEO SIOS
+ {0x8A79, 0xB481}, //1653 #HANGUL SYLLABLE TIKEUT WEO IEUNG
+ {0x8A7A, 0xB482}, //1654 #HANGUL SYLLABLE TIKEUT WEO CIEUC
+ {0x8A81, 0xB483}, //1655 #HANGUL SYLLABLE TIKEUT WEO CHIEUCH
+ {0x8A82, 0xB484}, //1656 #HANGUL SYLLABLE TIKEUT WEO KHIEUKH
+ {0x8A83, 0xB485}, //1657 #HANGUL SYLLABLE TIKEUT WEO THIEUTH
+ {0x8A84, 0xB486}, //1658 #HANGUL SYLLABLE TIKEUT WEO PHIEUPH
+ {0x8A85, 0xB487}, //1659 #HANGUL SYLLABLE TIKEUT WEO HIEUH
+ {0x8A86, 0xB489}, //1660 #HANGUL SYLLABLE TIKEUT WE KIYEOK
+ {0x8A87, 0xB48A}, //1661 #HANGUL SYLLABLE TIKEUT WE SSANGKIYEOK
+ {0x8A88, 0xB48B}, //1662 #HANGUL SYLLABLE TIKEUT WE KIYEOKSIOS
+ {0x8A89, 0xB48C}, //1663 #HANGUL SYLLABLE TIKEUT WE NIEUN
+ {0x8A8A, 0xB48D}, //1664 #HANGUL SYLLABLE TIKEUT WE NIEUNCIEUC
+ {0x8A8B, 0xB48E}, //1665 #HANGUL SYLLABLE TIKEUT WE NIEUNHIEUH
+ {0x8A8C, 0xB48F}, //1666 #HANGUL SYLLABLE TIKEUT WE TIKEUT
+ {0x8A8D, 0xB490}, //1667 #HANGUL SYLLABLE TIKEUT WE RIEUL
+ {0x8A8E, 0xB491}, //1668 #HANGUL SYLLABLE TIKEUT WE RIEULKIYEOK
+ {0x8A8F, 0xB492}, //1669 #HANGUL SYLLABLE TIKEUT WE RIEULMIEUM
+ {0x8A90, 0xB493}, //1670 #HANGUL SYLLABLE TIKEUT WE RIEULPIEUP
+ {0x8A91, 0xB494}, //1671 #HANGUL SYLLABLE TIKEUT WE RIEULSIOS
+ {0x8A92, 0xB495}, //1672 #HANGUL SYLLABLE TIKEUT WE RIEULTHIEUTH
+ {0x8A93, 0xB496}, //1673 #HANGUL SYLLABLE TIKEUT WE RIEULPHIEUPH
+ {0x8A94, 0xB497}, //1674 #HANGUL SYLLABLE TIKEUT WE RIEULHIEUH
+ {0x8A95, 0xB498}, //1675 #HANGUL SYLLABLE TIKEUT WE MIEUM
+ {0x8A96, 0xB499}, //1676 #HANGUL SYLLABLE TIKEUT WE PIEUP
+ {0x8A97, 0xB49A}, //1677 #HANGUL SYLLABLE TIKEUT WE PIEUPSIOS
+ {0x8A98, 0xB49B}, //1678 #HANGUL SYLLABLE TIKEUT WE SIOS
+ {0x8A99, 0xB49C}, //1679 #HANGUL SYLLABLE TIKEUT WE SSANGSIOS
+ {0x8A9A, 0xB49E}, //1680 #HANGUL SYLLABLE TIKEUT WE CIEUC
+ {0x8A9B, 0xB49F}, //1681 #HANGUL SYLLABLE TIKEUT WE CHIEUCH
+ {0x8A9C, 0xB4A0}, //1682 #HANGUL SYLLABLE TIKEUT WE KHIEUKH
+ {0x8A9D, 0xB4A1}, //1683 #HANGUL SYLLABLE TIKEUT WE THIEUTH
+ {0x8A9E, 0xB4A2}, //1684 #HANGUL SYLLABLE TIKEUT WE PHIEUPH
+ {0x8A9F, 0xB4A3}, //1685 #HANGUL SYLLABLE TIKEUT WE HIEUH
+ {0x8AA0, 0xB4A5}, //1686 #HANGUL SYLLABLE TIKEUT WI KIYEOK
+ {0x8AA1, 0xB4A6}, //1687 #HANGUL SYLLABLE TIKEUT WI SSANGKIYEOK
+ {0x8AA2, 0xB4A7}, //1688 #HANGUL SYLLABLE TIKEUT WI KIYEOKSIOS
+ {0x8AA3, 0xB4A9}, //1689 #HANGUL SYLLABLE TIKEUT WI NIEUNCIEUC
+ {0x8AA4, 0xB4AA}, //1690 #HANGUL SYLLABLE TIKEUT WI NIEUNHIEUH
+ {0x8AA5, 0xB4AB}, //1691 #HANGUL SYLLABLE TIKEUT WI TIKEUT
+ {0x8AA6, 0xB4AD}, //1692 #HANGUL SYLLABLE TIKEUT WI RIEULKIYEOK
+ {0x8AA7, 0xB4AE}, //1693 #HANGUL SYLLABLE TIKEUT WI RIEULMIEUM
+ {0x8AA8, 0xB4AF}, //1694 #HANGUL SYLLABLE TIKEUT WI RIEULPIEUP
+ {0x8AA9, 0xB4B0}, //1695 #HANGUL SYLLABLE TIKEUT WI RIEULSIOS
+ {0x8AAA, 0xB4B1}, //1696 #HANGUL SYLLABLE TIKEUT WI RIEULTHIEUTH
+ {0x8AAB, 0xB4B2}, //1697 #HANGUL SYLLABLE TIKEUT WI RIEULPHIEUPH
+ {0x8AAC, 0xB4B3}, //1698 #HANGUL SYLLABLE TIKEUT WI RIEULHIEUH
+ {0x8AAD, 0xB4B4}, //1699 #HANGUL SYLLABLE TIKEUT WI MIEUM
+ {0x8AAE, 0xB4B6}, //1700 #HANGUL SYLLABLE TIKEUT WI PIEUPSIOS
+ {0x8AAF, 0xB4B8}, //1701 #HANGUL SYLLABLE TIKEUT WI SSANGSIOS
+ {0x8AB0, 0xB4BA}, //1702 #HANGUL SYLLABLE TIKEUT WI CIEUC
+ {0x8AB1, 0xB4BB}, //1703 #HANGUL SYLLABLE TIKEUT WI CHIEUCH
+ {0x8AB2, 0xB4BC}, //1704 #HANGUL SYLLABLE TIKEUT WI KHIEUKH
+ {0x8AB3, 0xB4BD}, //1705 #HANGUL SYLLABLE TIKEUT WI THIEUTH
+ {0x8AB4, 0xB4BE}, //1706 #HANGUL SYLLABLE TIKEUT WI PHIEUPH
+ {0x8AB5, 0xB4BF}, //1707 #HANGUL SYLLABLE TIKEUT WI HIEUH
+ {0x8AB6, 0xB4C1}, //1708 #HANGUL SYLLABLE TIKEUT YU KIYEOK
+ {0x8AB7, 0xB4C2}, //1709 #HANGUL SYLLABLE TIKEUT YU SSANGKIYEOK
+ {0x8AB8, 0xB4C3}, //1710 #HANGUL SYLLABLE TIKEUT YU KIYEOKSIOS
+ {0x8AB9, 0xB4C5}, //1711 #HANGUL SYLLABLE TIKEUT YU NIEUNCIEUC
+ {0x8ABA, 0xB4C6}, //1712 #HANGUL SYLLABLE TIKEUT YU NIEUNHIEUH
+ {0x8ABB, 0xB4C7}, //1713 #HANGUL SYLLABLE TIKEUT YU TIKEUT
+ {0x8ABC, 0xB4C9}, //1714 #HANGUL SYLLABLE TIKEUT YU RIEULKIYEOK
+ {0x8ABD, 0xB4CA}, //1715 #HANGUL SYLLABLE TIKEUT YU RIEULMIEUM
+ {0x8ABE, 0xB4CB}, //1716 #HANGUL SYLLABLE TIKEUT YU RIEULPIEUP
+ {0x8ABF, 0xB4CC}, //1717 #HANGUL SYLLABLE TIKEUT YU RIEULSIOS
+ {0x8AC0, 0xB4CD}, //1718 #HANGUL SYLLABLE TIKEUT YU RIEULTHIEUTH
+ {0x8AC1, 0xB4CE}, //1719 #HANGUL SYLLABLE TIKEUT YU RIEULPHIEUPH
+ {0x8AC2, 0xB4CF}, //1720 #HANGUL SYLLABLE TIKEUT YU RIEULHIEUH
+ {0x8AC3, 0xB4D1}, //1721 #HANGUL SYLLABLE TIKEUT YU PIEUP
+ {0x8AC4, 0xB4D2}, //1722 #HANGUL SYLLABLE TIKEUT YU PIEUPSIOS
+ {0x8AC5, 0xB4D3}, //1723 #HANGUL SYLLABLE TIKEUT YU SIOS
+ {0x8AC6, 0xB4D4}, //1724 #HANGUL SYLLABLE TIKEUT YU SSANGSIOS
+ {0x8AC7, 0xB4D6}, //1725 #HANGUL SYLLABLE TIKEUT YU CIEUC
+ {0x8AC8, 0xB4D7}, //1726 #HANGUL SYLLABLE TIKEUT YU CHIEUCH
+ {0x8AC9, 0xB4D8}, //1727 #HANGUL SYLLABLE TIKEUT YU KHIEUKH
+ {0x8ACA, 0xB4D9}, //1728 #HANGUL SYLLABLE TIKEUT YU THIEUTH
+ {0x8ACB, 0xB4DA}, //1729 #HANGUL SYLLABLE TIKEUT YU PHIEUPH
+ {0x8ACC, 0xB4DB}, //1730 #HANGUL SYLLABLE TIKEUT YU HIEUH
+ {0x8ACD, 0xB4DE}, //1731 #HANGUL SYLLABLE TIKEUT EU SSANGKIYEOK
+ {0x8ACE, 0xB4DF}, //1732 #HANGUL SYLLABLE TIKEUT EU KIYEOKSIOS
+ {0x8ACF, 0xB4E1}, //1733 #HANGUL SYLLABLE TIKEUT EU NIEUNCIEUC
+ {0x8AD0, 0xB4E2}, //1734 #HANGUL SYLLABLE TIKEUT EU NIEUNHIEUH
+ {0x8AD1, 0xB4E5}, //1735 #HANGUL SYLLABLE TIKEUT EU RIEULKIYEOK
+ {0x8AD2, 0xB4E7}, //1736 #HANGUL SYLLABLE TIKEUT EU RIEULPIEUP
+ {0x8AD3, 0xB4E8}, //1737 #HANGUL SYLLABLE TIKEUT EU RIEULSIOS
+ {0x8AD4, 0xB4E9}, //1738 #HANGUL SYLLABLE TIKEUT EU RIEULTHIEUTH
+ {0x8AD5, 0xB4EA}, //1739 #HANGUL SYLLABLE TIKEUT EU RIEULPHIEUPH
+ {0x8AD6, 0xB4EB}, //1740 #HANGUL SYLLABLE TIKEUT EU RIEULHIEUH
+ {0x8AD7, 0xB4EE}, //1741 #HANGUL SYLLABLE TIKEUT EU PIEUPSIOS
+ {0x8AD8, 0xB4F0}, //1742 #HANGUL SYLLABLE TIKEUT EU SSANGSIOS
+ {0x8AD9, 0xB4F2}, //1743 #HANGUL SYLLABLE TIKEUT EU CIEUC
+ {0x8ADA, 0xB4F3}, //1744 #HANGUL SYLLABLE TIKEUT EU CHIEUCH
+ {0x8ADB, 0xB4F4}, //1745 #HANGUL SYLLABLE TIKEUT EU KHIEUKH
+ {0x8ADC, 0xB4F5}, //1746 #HANGUL SYLLABLE TIKEUT EU THIEUTH
+ {0x8ADD, 0xB4F6}, //1747 #HANGUL SYLLABLE TIKEUT EU PHIEUPH
+ {0x8ADE, 0xB4F7}, //1748 #HANGUL SYLLABLE TIKEUT EU HIEUH
+ {0x8ADF, 0xB4F9}, //1749 #HANGUL SYLLABLE TIKEUT YI KIYEOK
+ {0x8AE0, 0xB4FA}, //1750 #HANGUL SYLLABLE TIKEUT YI SSANGKIYEOK
+ {0x8AE1, 0xB4FB}, //1751 #HANGUL SYLLABLE TIKEUT YI KIYEOKSIOS
+ {0x8AE2, 0xB4FC}, //1752 #HANGUL SYLLABLE TIKEUT YI NIEUN
+ {0x8AE3, 0xB4FD}, //1753 #HANGUL SYLLABLE TIKEUT YI NIEUNCIEUC
+ {0x8AE4, 0xB4FE}, //1754 #HANGUL SYLLABLE TIKEUT YI NIEUNHIEUH
+ {0x8AE5, 0xB4FF}, //1755 #HANGUL SYLLABLE TIKEUT YI TIKEUT
+ {0x8AE6, 0xB500}, //1756 #HANGUL SYLLABLE TIKEUT YI RIEUL
+ {0x8AE7, 0xB501}, //1757 #HANGUL SYLLABLE TIKEUT YI RIEULKIYEOK
+ {0x8AE8, 0xB502}, //1758 #HANGUL SYLLABLE TIKEUT YI RIEULMIEUM
+ {0x8AE9, 0xB503}, //1759 #HANGUL SYLLABLE TIKEUT YI RIEULPIEUP
+ {0x8AEA, 0xB504}, //1760 #HANGUL SYLLABLE TIKEUT YI RIEULSIOS
+ {0x8AEB, 0xB505}, //1761 #HANGUL SYLLABLE TIKEUT YI RIEULTHIEUTH
+ {0x8AEC, 0xB506}, //1762 #HANGUL SYLLABLE TIKEUT YI RIEULPHIEUPH
+ {0x8AED, 0xB507}, //1763 #HANGUL SYLLABLE TIKEUT YI RIEULHIEUH
+ {0x8AEE, 0xB508}, //1764 #HANGUL SYLLABLE TIKEUT YI MIEUM
+ {0x8AEF, 0xB509}, //1765 #HANGUL SYLLABLE TIKEUT YI PIEUP
+ {0x8AF0, 0xB50A}, //1766 #HANGUL SYLLABLE TIKEUT YI PIEUPSIOS
+ {0x8AF1, 0xB50B}, //1767 #HANGUL SYLLABLE TIKEUT YI SIOS
+ {0x8AF2, 0xB50C}, //1768 #HANGUL SYLLABLE TIKEUT YI SSANGSIOS
+ {0x8AF3, 0xB50D}, //1769 #HANGUL SYLLABLE TIKEUT YI IEUNG
+ {0x8AF4, 0xB50E}, //1770 #HANGUL SYLLABLE TIKEUT YI CIEUC
+ {0x8AF5, 0xB50F}, //1771 #HANGUL SYLLABLE TIKEUT YI CHIEUCH
+ {0x8AF6, 0xB510}, //1772 #HANGUL SYLLABLE TIKEUT YI KHIEUKH
+ {0x8AF7, 0xB511}, //1773 #HANGUL SYLLABLE TIKEUT YI THIEUTH
+ {0x8AF8, 0xB512}, //1774 #HANGUL SYLLABLE TIKEUT YI PHIEUPH
+ {0x8AF9, 0xB513}, //1775 #HANGUL SYLLABLE TIKEUT YI HIEUH
+ {0x8AFA, 0xB516}, //1776 #HANGUL SYLLABLE TIKEUT I SSANGKIYEOK
+ {0x8AFB, 0xB517}, //1777 #HANGUL SYLLABLE TIKEUT I KIYEOKSIOS
+ {0x8AFC, 0xB519}, //1778 #HANGUL SYLLABLE TIKEUT I NIEUNCIEUC
+ {0x8AFD, 0xB51A}, //1779 #HANGUL SYLLABLE TIKEUT I NIEUNHIEUH
+ {0x8AFE, 0xB51D}, //1780 #HANGUL SYLLABLE TIKEUT I RIEULKIYEOK
+ {0x8B41, 0xB51E}, //1781 #HANGUL SYLLABLE TIKEUT I RIEULMIEUM
+ {0x8B42, 0xB51F}, //1782 #HANGUL SYLLABLE TIKEUT I RIEULPIEUP
+ {0x8B43, 0xB520}, //1783 #HANGUL SYLLABLE TIKEUT I RIEULSIOS
+ {0x8B44, 0xB521}, //1784 #HANGUL SYLLABLE TIKEUT I RIEULTHIEUTH
+ {0x8B45, 0xB522}, //1785 #HANGUL SYLLABLE TIKEUT I RIEULPHIEUPH
+ {0x8B46, 0xB523}, //1786 #HANGUL SYLLABLE TIKEUT I RIEULHIEUH
+ {0x8B47, 0xB526}, //1787 #HANGUL SYLLABLE TIKEUT I PIEUPSIOS
+ {0x8B48, 0xB52B}, //1788 #HANGUL SYLLABLE TIKEUT I CHIEUCH
+ {0x8B49, 0xB52C}, //1789 #HANGUL SYLLABLE TIKEUT I KHIEUKH
+ {0x8B4A, 0xB52D}, //1790 #HANGUL SYLLABLE TIKEUT I THIEUTH
+ {0x8B4B, 0xB52E}, //1791 #HANGUL SYLLABLE TIKEUT I PHIEUPH
+ {0x8B4C, 0xB52F}, //1792 #HANGUL SYLLABLE TIKEUT I HIEUH
+ {0x8B4D, 0xB532}, //1793 #HANGUL SYLLABLE SSANGTIKEUT A SSANGKIYEOK
+ {0x8B4E, 0xB533}, //1794 #HANGUL SYLLABLE SSANGTIKEUT A KIYEOKSIOS
+ {0x8B4F, 0xB535}, //1795 #HANGUL SYLLABLE SSANGTIKEUT A NIEUNCIEUC
+ {0x8B50, 0xB536}, //1796 #HANGUL SYLLABLE SSANGTIKEUT A NIEUNHIEUH
+ {0x8B51, 0xB537}, //1797 #HANGUL SYLLABLE SSANGTIKEUT A TIKEUT
+ {0x8B52, 0xB539}, //1798 #HANGUL SYLLABLE SSANGTIKEUT A RIEULKIYEOK
+ {0x8B53, 0xB53A}, //1799 #HANGUL SYLLABLE SSANGTIKEUT A RIEULMIEUM
+ {0x8B54, 0xB53B}, //1800 #HANGUL SYLLABLE SSANGTIKEUT A RIEULPIEUP
+ {0x8B55, 0xB53C}, //1801 #HANGUL SYLLABLE SSANGTIKEUT A RIEULSIOS
+ {0x8B56, 0xB53D}, //1802 #HANGUL SYLLABLE SSANGTIKEUT A RIEULTHIEUTH
+ {0x8B57, 0xB53E}, //1803 #HANGUL SYLLABLE SSANGTIKEUT A RIEULPHIEUPH
+ {0x8B58, 0xB53F}, //1804 #HANGUL SYLLABLE SSANGTIKEUT A RIEULHIEUH
+ {0x8B59, 0xB542}, //1805 #HANGUL SYLLABLE SSANGTIKEUT A PIEUPSIOS
+ {0x8B5A, 0xB546}, //1806 #HANGUL SYLLABLE SSANGTIKEUT A CIEUC
+ {0x8B61, 0xB547}, //1807 #HANGUL SYLLABLE SSANGTIKEUT A CHIEUCH
+ {0x8B62, 0xB548}, //1808 #HANGUL SYLLABLE SSANGTIKEUT A KHIEUKH
+ {0x8B63, 0xB549}, //1809 #HANGUL SYLLABLE SSANGTIKEUT A THIEUTH
+ {0x8B64, 0xB54A}, //1810 #HANGUL SYLLABLE SSANGTIKEUT A PHIEUPH
+ {0x8B65, 0xB54E}, //1811 #HANGUL SYLLABLE SSANGTIKEUT AE SSANGKIYEOK
+ {0x8B66, 0xB54F}, //1812 #HANGUL SYLLABLE SSANGTIKEUT AE KIYEOKSIOS
+ {0x8B67, 0xB551}, //1813 #HANGUL SYLLABLE SSANGTIKEUT AE NIEUNCIEUC
+ {0x8B68, 0xB552}, //1814 #HANGUL SYLLABLE SSANGTIKEUT AE NIEUNHIEUH
+ {0x8B69, 0xB553}, //1815 #HANGUL SYLLABLE SSANGTIKEUT AE TIKEUT
+ {0x8B6A, 0xB555}, //1816 #HANGUL SYLLABLE SSANGTIKEUT AE RIEULKIYEOK
+ {0x8B6B, 0xB556}, //1817 #HANGUL SYLLABLE SSANGTIKEUT AE RIEULMIEUM
+ {0x8B6C, 0xB557}, //1818 #HANGUL SYLLABLE SSANGTIKEUT AE RIEULPIEUP
+ {0x8B6D, 0xB558}, //1819 #HANGUL SYLLABLE SSANGTIKEUT AE RIEULSIOS
+ {0x8B6E, 0xB559}, //1820 #HANGUL SYLLABLE SSANGTIKEUT AE RIEULTHIEUTH
+ {0x8B6F, 0xB55A}, //1821 #HANGUL SYLLABLE SSANGTIKEUT AE RIEULPHIEUPH
+ {0x8B70, 0xB55B}, //1822 #HANGUL SYLLABLE SSANGTIKEUT AE RIEULHIEUH
+ {0x8B71, 0xB55E}, //1823 #HANGUL SYLLABLE SSANGTIKEUT AE PIEUPSIOS
+ {0x8B72, 0xB562}, //1824 #HANGUL SYLLABLE SSANGTIKEUT AE CIEUC
+ {0x8B73, 0xB563}, //1825 #HANGUL SYLLABLE SSANGTIKEUT AE CHIEUCH
+ {0x8B74, 0xB564}, //1826 #HANGUL SYLLABLE SSANGTIKEUT AE KHIEUKH
+ {0x8B75, 0xB565}, //1827 #HANGUL SYLLABLE SSANGTIKEUT AE THIEUTH
+ {0x8B76, 0xB566}, //1828 #HANGUL SYLLABLE SSANGTIKEUT AE PHIEUPH
+ {0x8B77, 0xB567}, //1829 #HANGUL SYLLABLE SSANGTIKEUT AE HIEUH
+ {0x8B78, 0xB568}, //1830 #HANGUL SYLLABLE SSANGTIKEUT YA
+ {0x8B79, 0xB569}, //1831 #HANGUL SYLLABLE SSANGTIKEUT YA KIYEOK
+ {0x8B7A, 0xB56A}, //1832 #HANGUL SYLLABLE SSANGTIKEUT YA SSANGKIYEOK
+ {0x8B81, 0xB56B}, //1833 #HANGUL SYLLABLE SSANGTIKEUT YA KIYEOKSIOS
+ {0x8B82, 0xB56C}, //1834 #HANGUL SYLLABLE SSANGTIKEUT YA NIEUN
+ {0x8B83, 0xB56D}, //1835 #HANGUL SYLLABLE SSANGTIKEUT YA NIEUNCIEUC
+ {0x8B84, 0xB56E}, //1836 #HANGUL SYLLABLE SSANGTIKEUT YA NIEUNHIEUH
+ {0x8B85, 0xB56F}, //1837 #HANGUL SYLLABLE SSANGTIKEUT YA TIKEUT
+ {0x8B86, 0xB570}, //1838 #HANGUL SYLLABLE SSANGTIKEUT YA RIEUL
+ {0x8B87, 0xB571}, //1839 #HANGUL SYLLABLE SSANGTIKEUT YA RIEULKIYEOK
+ {0x8B88, 0xB572}, //1840 #HANGUL SYLLABLE SSANGTIKEUT YA RIEULMIEUM
+ {0x8B89, 0xB573}, //1841 #HANGUL SYLLABLE SSANGTIKEUT YA RIEULPIEUP
+ {0x8B8A, 0xB574}, //1842 #HANGUL SYLLABLE SSANGTIKEUT YA RIEULSIOS
+ {0x8B8B, 0xB575}, //1843 #HANGUL SYLLABLE SSANGTIKEUT YA RIEULTHIEUTH
+ {0x8B8C, 0xB576}, //1844 #HANGUL SYLLABLE SSANGTIKEUT YA RIEULPHIEUPH
+ {0x8B8D, 0xB577}, //1845 #HANGUL SYLLABLE SSANGTIKEUT YA RIEULHIEUH
+ {0x8B8E, 0xB578}, //1846 #HANGUL SYLLABLE SSANGTIKEUT YA MIEUM
+ {0x8B8F, 0xB579}, //1847 #HANGUL SYLLABLE SSANGTIKEUT YA PIEUP
+ {0x8B90, 0xB57A}, //1848 #HANGUL SYLLABLE SSANGTIKEUT YA PIEUPSIOS
+ {0x8B91, 0xB57B}, //1849 #HANGUL SYLLABLE SSANGTIKEUT YA SIOS
+ {0x8B92, 0xB57C}, //1850 #HANGUL SYLLABLE SSANGTIKEUT YA SSANGSIOS
+ {0x8B93, 0xB57D}, //1851 #HANGUL SYLLABLE SSANGTIKEUT YA IEUNG
+ {0x8B94, 0xB57E}, //1852 #HANGUL SYLLABLE SSANGTIKEUT YA CIEUC
+ {0x8B95, 0xB57F}, //1853 #HANGUL SYLLABLE SSANGTIKEUT YA CHIEUCH
+ {0x8B96, 0xB580}, //1854 #HANGUL SYLLABLE SSANGTIKEUT YA KHIEUKH
+ {0x8B97, 0xB581}, //1855 #HANGUL SYLLABLE SSANGTIKEUT YA THIEUTH
+ {0x8B98, 0xB582}, //1856 #HANGUL SYLLABLE SSANGTIKEUT YA PHIEUPH
+ {0x8B99, 0xB583}, //1857 #HANGUL SYLLABLE SSANGTIKEUT YA HIEUH
+ {0x8B9A, 0xB584}, //1858 #HANGUL SYLLABLE SSANGTIKEUT YAE
+ {0x8B9B, 0xB585}, //1859 #HANGUL SYLLABLE SSANGTIKEUT YAE KIYEOK
+ {0x8B9C, 0xB586}, //1860 #HANGUL SYLLABLE SSANGTIKEUT YAE SSANGKIYEOK
+ {0x8B9D, 0xB587}, //1861 #HANGUL SYLLABLE SSANGTIKEUT YAE KIYEOKSIOS
+ {0x8B9E, 0xB588}, //1862 #HANGUL SYLLABLE SSANGTIKEUT YAE NIEUN
+ {0x8B9F, 0xB589}, //1863 #HANGUL SYLLABLE SSANGTIKEUT YAE NIEUNCIEUC
+ {0x8BA0, 0xB58A}, //1864 #HANGUL SYLLABLE SSANGTIKEUT YAE NIEUNHIEUH
+ {0x8BA1, 0xB58B}, //1865 #HANGUL SYLLABLE SSANGTIKEUT YAE TIKEUT
+ {0x8BA2, 0xB58C}, //1866 #HANGUL SYLLABLE SSANGTIKEUT YAE RIEUL
+ {0x8BA3, 0xB58D}, //1867 #HANGUL SYLLABLE SSANGTIKEUT YAE RIEULKIYEOK
+ {0x8BA4, 0xB58E}, //1868 #HANGUL SYLLABLE SSANGTIKEUT YAE RIEULMIEUM
+ {0x8BA5, 0xB58F}, //1869 #HANGUL SYLLABLE SSANGTIKEUT YAE RIEULPIEUP
+ {0x8BA6, 0xB590}, //1870 #HANGUL SYLLABLE SSANGTIKEUT YAE RIEULSIOS
+ {0x8BA7, 0xB591}, //1871 #HANGUL SYLLABLE SSANGTIKEUT YAE RIEULTHIEUTH
+ {0x8BA8, 0xB592}, //1872 #HANGUL SYLLABLE SSANGTIKEUT YAE RIEULPHIEUPH
+ {0x8BA9, 0xB593}, //1873 #HANGUL SYLLABLE SSANGTIKEUT YAE RIEULHIEUH
+ {0x8BAA, 0xB594}, //1874 #HANGUL SYLLABLE SSANGTIKEUT YAE MIEUM
+ {0x8BAB, 0xB595}, //1875 #HANGUL SYLLABLE SSANGTIKEUT YAE PIEUP
+ {0x8BAC, 0xB596}, //1876 #HANGUL SYLLABLE SSANGTIKEUT YAE PIEUPSIOS
+ {0x8BAD, 0xB597}, //1877 #HANGUL SYLLABLE SSANGTIKEUT YAE SIOS
+ {0x8BAE, 0xB598}, //1878 #HANGUL SYLLABLE SSANGTIKEUT YAE SSANGSIOS
+ {0x8BAF, 0xB599}, //1879 #HANGUL SYLLABLE SSANGTIKEUT YAE IEUNG
+ {0x8BB0, 0xB59A}, //1880 #HANGUL SYLLABLE SSANGTIKEUT YAE CIEUC
+ {0x8BB1, 0xB59B}, //1881 #HANGUL SYLLABLE SSANGTIKEUT YAE CHIEUCH
+ {0x8BB2, 0xB59C}, //1882 #HANGUL SYLLABLE SSANGTIKEUT YAE KHIEUKH
+ {0x8BB3, 0xB59D}, //1883 #HANGUL SYLLABLE SSANGTIKEUT YAE THIEUTH
+ {0x8BB4, 0xB59E}, //1884 #HANGUL SYLLABLE SSANGTIKEUT YAE PHIEUPH
+ {0x8BB5, 0xB59F}, //1885 #HANGUL SYLLABLE SSANGTIKEUT YAE HIEUH
+ {0x8BB6, 0xB5A2}, //1886 #HANGUL SYLLABLE SSANGTIKEUT EO SSANGKIYEOK
+ {0x8BB7, 0xB5A3}, //1887 #HANGUL SYLLABLE SSANGTIKEUT EO KIYEOKSIOS
+ {0x8BB8, 0xB5A5}, //1888 #HANGUL SYLLABLE SSANGTIKEUT EO NIEUNCIEUC
+ {0x8BB9, 0xB5A6}, //1889 #HANGUL SYLLABLE SSANGTIKEUT EO NIEUNHIEUH
+ {0x8BBA, 0xB5A7}, //1890 #HANGUL SYLLABLE SSANGTIKEUT EO TIKEUT
+ {0x8BBB, 0xB5A9}, //1891 #HANGUL SYLLABLE SSANGTIKEUT EO RIEULKIYEOK
+ {0x8BBC, 0xB5AC}, //1892 #HANGUL SYLLABLE SSANGTIKEUT EO RIEULSIOS
+ {0x8BBD, 0xB5AD}, //1893 #HANGUL SYLLABLE SSANGTIKEUT EO RIEULTHIEUTH
+ {0x8BBE, 0xB5AE}, //1894 #HANGUL SYLLABLE SSANGTIKEUT EO RIEULPHIEUPH
+ {0x8BBF, 0xB5AF}, //1895 #HANGUL SYLLABLE SSANGTIKEUT EO RIEULHIEUH
+ {0x8BC0, 0xB5B2}, //1896 #HANGUL SYLLABLE SSANGTIKEUT EO PIEUPSIOS
+ {0x8BC1, 0xB5B6}, //1897 #HANGUL SYLLABLE SSANGTIKEUT EO CIEUC
+ {0x8BC2, 0xB5B7}, //1898 #HANGUL SYLLABLE SSANGTIKEUT EO CHIEUCH
+ {0x8BC3, 0xB5B8}, //1899 #HANGUL SYLLABLE SSANGTIKEUT EO KHIEUKH
+ {0x8BC4, 0xB5B9}, //1900 #HANGUL SYLLABLE SSANGTIKEUT EO THIEUTH
+ {0x8BC5, 0xB5BA}, //1901 #HANGUL SYLLABLE SSANGTIKEUT EO PHIEUPH
+ {0x8BC6, 0xB5BE}, //1902 #HANGUL SYLLABLE SSANGTIKEUT E SSANGKIYEOK
+ {0x8BC7, 0xB5BF}, //1903 #HANGUL SYLLABLE SSANGTIKEUT E KIYEOKSIOS
+ {0x8BC8, 0xB5C1}, //1904 #HANGUL SYLLABLE SSANGTIKEUT E NIEUNCIEUC
+ {0x8BC9, 0xB5C2}, //1905 #HANGUL SYLLABLE SSANGTIKEUT E NIEUNHIEUH
+ {0x8BCA, 0xB5C3}, //1906 #HANGUL SYLLABLE SSANGTIKEUT E TIKEUT
+ {0x8BCB, 0xB5C5}, //1907 #HANGUL SYLLABLE SSANGTIKEUT E RIEULKIYEOK
+ {0x8BCC, 0xB5C6}, //1908 #HANGUL SYLLABLE SSANGTIKEUT E RIEULMIEUM
+ {0x8BCD, 0xB5C7}, //1909 #HANGUL SYLLABLE SSANGTIKEUT E RIEULPIEUP
+ {0x8BCE, 0xB5C8}, //1910 #HANGUL SYLLABLE SSANGTIKEUT E RIEULSIOS
+ {0x8BCF, 0xB5C9}, //1911 #HANGUL SYLLABLE SSANGTIKEUT E RIEULTHIEUTH
+ {0x8BD0, 0xB5CA}, //1912 #HANGUL SYLLABLE SSANGTIKEUT E RIEULPHIEUPH
+ {0x8BD1, 0xB5CB}, //1913 #HANGUL SYLLABLE SSANGTIKEUT E RIEULHIEUH
+ {0x8BD2, 0xB5CE}, //1914 #HANGUL SYLLABLE SSANGTIKEUT E PIEUPSIOS
+ {0x8BD3, 0xB5D2}, //1915 #HANGUL SYLLABLE SSANGTIKEUT E CIEUC
+ {0x8BD4, 0xB5D3}, //1916 #HANGUL SYLLABLE SSANGTIKEUT E CHIEUCH
+ {0x8BD5, 0xB5D4}, //1917 #HANGUL SYLLABLE SSANGTIKEUT E KHIEUKH
+ {0x8BD6, 0xB5D5}, //1918 #HANGUL SYLLABLE SSANGTIKEUT E THIEUTH
+ {0x8BD7, 0xB5D6}, //1919 #HANGUL SYLLABLE SSANGTIKEUT E PHIEUPH
+ {0x8BD8, 0xB5D7}, //1920 #HANGUL SYLLABLE SSANGTIKEUT E HIEUH
+ {0x8BD9, 0xB5D9}, //1921 #HANGUL SYLLABLE SSANGTIKEUT YEO KIYEOK
+ {0x8BDA, 0xB5DA}, //1922 #HANGUL SYLLABLE SSANGTIKEUT YEO SSANGKIYEOK
+ {0x8BDB, 0xB5DB}, //1923 #HANGUL SYLLABLE SSANGTIKEUT YEO KIYEOKSIOS
+ {0x8BDC, 0xB5DC}, //1924 #HANGUL SYLLABLE SSANGTIKEUT YEO NIEUN
+ {0x8BDD, 0xB5DD}, //1925 #HANGUL SYLLABLE SSANGTIKEUT YEO NIEUNCIEUC
+ {0x8BDE, 0xB5DE}, //1926 #HANGUL SYLLABLE SSANGTIKEUT YEO NIEUNHIEUH
+ {0x8BDF, 0xB5DF}, //1927 #HANGUL SYLLABLE SSANGTIKEUT YEO TIKEUT
+ {0x8BE0, 0xB5E0}, //1928 #HANGUL SYLLABLE SSANGTIKEUT YEO RIEUL
+ {0x8BE1, 0xB5E1}, //1929 #HANGUL SYLLABLE SSANGTIKEUT YEO RIEULKIYEOK
+ {0x8BE2, 0xB5E2}, //1930 #HANGUL SYLLABLE SSANGTIKEUT YEO RIEULMIEUM
+ {0x8BE3, 0xB5E3}, //1931 #HANGUL SYLLABLE SSANGTIKEUT YEO RIEULPIEUP
+ {0x8BE4, 0xB5E4}, //1932 #HANGUL SYLLABLE SSANGTIKEUT YEO RIEULSIOS
+ {0x8BE5, 0xB5E5}, //1933 #HANGUL SYLLABLE SSANGTIKEUT YEO RIEULTHIEUTH
+ {0x8BE6, 0xB5E6}, //1934 #HANGUL SYLLABLE SSANGTIKEUT YEO RIEULPHIEUPH
+ {0x8BE7, 0xB5E7}, //1935 #HANGUL SYLLABLE SSANGTIKEUT YEO RIEULHIEUH
+ {0x8BE8, 0xB5E8}, //1936 #HANGUL SYLLABLE SSANGTIKEUT YEO MIEUM
+ {0x8BE9, 0xB5E9}, //1937 #HANGUL SYLLABLE SSANGTIKEUT YEO PIEUP
+ {0x8BEA, 0xB5EA}, //1938 #HANGUL SYLLABLE SSANGTIKEUT YEO PIEUPSIOS
+ {0x8BEB, 0xB5EB}, //1939 #HANGUL SYLLABLE SSANGTIKEUT YEO SIOS
+ {0x8BEC, 0xB5ED}, //1940 #HANGUL SYLLABLE SSANGTIKEUT YEO IEUNG
+ {0x8BED, 0xB5EE}, //1941 #HANGUL SYLLABLE SSANGTIKEUT YEO CIEUC
+ {0x8BEE, 0xB5EF}, //1942 #HANGUL SYLLABLE SSANGTIKEUT YEO CHIEUCH
+ {0x8BEF, 0xB5F0}, //1943 #HANGUL SYLLABLE SSANGTIKEUT YEO KHIEUKH
+ {0x8BF0, 0xB5F1}, //1944 #HANGUL SYLLABLE SSANGTIKEUT YEO THIEUTH
+ {0x8BF1, 0xB5F2}, //1945 #HANGUL SYLLABLE SSANGTIKEUT YEO PHIEUPH
+ {0x8BF2, 0xB5F3}, //1946 #HANGUL SYLLABLE SSANGTIKEUT YEO HIEUH
+ {0x8BF3, 0xB5F4}, //1947 #HANGUL SYLLABLE SSANGTIKEUT YE
+ {0x8BF4, 0xB5F5}, //1948 #HANGUL SYLLABLE SSANGTIKEUT YE KIYEOK
+ {0x8BF5, 0xB5F6}, //1949 #HANGUL SYLLABLE SSANGTIKEUT YE SSANGKIYEOK
+ {0x8BF6, 0xB5F7}, //1950 #HANGUL SYLLABLE SSANGTIKEUT YE KIYEOKSIOS
+ {0x8BF7, 0xB5F8}, //1951 #HANGUL SYLLABLE SSANGTIKEUT YE NIEUN
+ {0x8BF8, 0xB5F9}, //1952 #HANGUL SYLLABLE SSANGTIKEUT YE NIEUNCIEUC
+ {0x8BF9, 0xB5FA}, //1953 #HANGUL SYLLABLE SSANGTIKEUT YE NIEUNHIEUH
+ {0x8BFA, 0xB5FB}, //1954 #HANGUL SYLLABLE SSANGTIKEUT YE TIKEUT
+ {0x8BFB, 0xB5FC}, //1955 #HANGUL SYLLABLE SSANGTIKEUT YE RIEUL
+ {0x8BFC, 0xB5FD}, //1956 #HANGUL SYLLABLE SSANGTIKEUT YE RIEULKIYEOK
+ {0x8BFD, 0xB5FE}, //1957 #HANGUL SYLLABLE SSANGTIKEUT YE RIEULMIEUM
+ {0x8BFE, 0xB5FF}, //1958 #HANGUL SYLLABLE SSANGTIKEUT YE RIEULPIEUP
+ {0x8C41, 0xB600}, //1959 #HANGUL SYLLABLE SSANGTIKEUT YE RIEULSIOS
+ {0x8C42, 0xB601}, //1960 #HANGUL SYLLABLE SSANGTIKEUT YE RIEULTHIEUTH
+ {0x8C43, 0xB602}, //1961 #HANGUL SYLLABLE SSANGTIKEUT YE RIEULPHIEUPH
+ {0x8C44, 0xB603}, //1962 #HANGUL SYLLABLE SSANGTIKEUT YE RIEULHIEUH
+ {0x8C45, 0xB604}, //1963 #HANGUL SYLLABLE SSANGTIKEUT YE MIEUM
+ {0x8C46, 0xB605}, //1964 #HANGUL SYLLABLE SSANGTIKEUT YE PIEUP
+ {0x8C47, 0xB606}, //1965 #HANGUL SYLLABLE SSANGTIKEUT YE PIEUPSIOS
+ {0x8C48, 0xB607}, //1966 #HANGUL SYLLABLE SSANGTIKEUT YE SIOS
+ {0x8C49, 0xB608}, //1967 #HANGUL SYLLABLE SSANGTIKEUT YE SSANGSIOS
+ {0x8C4A, 0xB609}, //1968 #HANGUL SYLLABLE SSANGTIKEUT YE IEUNG
+ {0x8C4B, 0xB60A}, //1969 #HANGUL SYLLABLE SSANGTIKEUT YE CIEUC
+ {0x8C4C, 0xB60B}, //1970 #HANGUL SYLLABLE SSANGTIKEUT YE CHIEUCH
+ {0x8C4D, 0xB60C}, //1971 #HANGUL SYLLABLE SSANGTIKEUT YE KHIEUKH
+ {0x8C4E, 0xB60D}, //1972 #HANGUL SYLLABLE SSANGTIKEUT YE THIEUTH
+ {0x8C4F, 0xB60E}, //1973 #HANGUL SYLLABLE SSANGTIKEUT YE PHIEUPH
+ {0x8C50, 0xB60F}, //1974 #HANGUL SYLLABLE SSANGTIKEUT YE HIEUH
+ {0x8C51, 0xB612}, //1975 #HANGUL SYLLABLE SSANGTIKEUT O SSANGKIYEOK
+ {0x8C52, 0xB613}, //1976 #HANGUL SYLLABLE SSANGTIKEUT O KIYEOKSIOS
+ {0x8C53, 0xB615}, //1977 #HANGUL SYLLABLE SSANGTIKEUT O NIEUNCIEUC
+ {0x8C54, 0xB616}, //1978 #HANGUL SYLLABLE SSANGTIKEUT O NIEUNHIEUH
+ {0x8C55, 0xB617}, //1979 #HANGUL SYLLABLE SSANGTIKEUT O TIKEUT
+ {0x8C56, 0xB619}, //1980 #HANGUL SYLLABLE SSANGTIKEUT O RIEULKIYEOK
+ {0x8C57, 0xB61A}, //1981 #HANGUL SYLLABLE SSANGTIKEUT O RIEULMIEUM
+ {0x8C58, 0xB61B}, //1982 #HANGUL SYLLABLE SSANGTIKEUT O RIEULPIEUP
+ {0x8C59, 0xB61C}, //1983 #HANGUL SYLLABLE SSANGTIKEUT O RIEULSIOS
+ {0x8C5A, 0xB61D}, //1984 #HANGUL SYLLABLE SSANGTIKEUT O RIEULTHIEUTH
+ {0x8C61, 0xB61E}, //1985 #HANGUL SYLLABLE SSANGTIKEUT O RIEULPHIEUPH
+ {0x8C62, 0xB61F}, //1986 #HANGUL SYLLABLE SSANGTIKEUT O RIEULHIEUH
+ {0x8C63, 0xB620}, //1987 #HANGUL SYLLABLE SSANGTIKEUT O MIEUM
+ {0x8C64, 0xB621}, //1988 #HANGUL SYLLABLE SSANGTIKEUT O PIEUP
+ {0x8C65, 0xB622}, //1989 #HANGUL SYLLABLE SSANGTIKEUT O PIEUPSIOS
+ {0x8C66, 0xB623}, //1990 #HANGUL SYLLABLE SSANGTIKEUT O SIOS
+ {0x8C67, 0xB624}, //1991 #HANGUL SYLLABLE SSANGTIKEUT O SSANGSIOS
+ {0x8C68, 0xB626}, //1992 #HANGUL SYLLABLE SSANGTIKEUT O CIEUC
+ {0x8C69, 0xB627}, //1993 #HANGUL SYLLABLE SSANGTIKEUT O CHIEUCH
+ {0x8C6A, 0xB628}, //1994 #HANGUL SYLLABLE SSANGTIKEUT O KHIEUKH
+ {0x8C6B, 0xB629}, //1995 #HANGUL SYLLABLE SSANGTIKEUT O THIEUTH
+ {0x8C6C, 0xB62A}, //1996 #HANGUL SYLLABLE SSANGTIKEUT O PHIEUPH
+ {0x8C6D, 0xB62B}, //1997 #HANGUL SYLLABLE SSANGTIKEUT O HIEUH
+ {0x8C6E, 0xB62D}, //1998 #HANGUL SYLLABLE SSANGTIKEUT WA KIYEOK
+ {0x8C6F, 0xB62E}, //1999 #HANGUL SYLLABLE SSANGTIKEUT WA SSANGKIYEOK
+ {0x8C70, 0xB62F}, //2000 #HANGUL SYLLABLE SSANGTIKEUT WA KIYEOKSIOS
+ {0x8C71, 0xB630}, //2001 #HANGUL SYLLABLE SSANGTIKEUT WA NIEUN
+ {0x8C72, 0xB631}, //2002 #HANGUL SYLLABLE SSANGTIKEUT WA NIEUNCIEUC
+ {0x8C73, 0xB632}, //2003 #HANGUL SYLLABLE SSANGTIKEUT WA NIEUNHIEUH
+ {0x8C74, 0xB633}, //2004 #HANGUL SYLLABLE SSANGTIKEUT WA TIKEUT
+ {0x8C75, 0xB635}, //2005 #HANGUL SYLLABLE SSANGTIKEUT WA RIEULKIYEOK
+ {0x8C76, 0xB636}, //2006 #HANGUL SYLLABLE SSANGTIKEUT WA RIEULMIEUM
+ {0x8C77, 0xB637}, //2007 #HANGUL SYLLABLE SSANGTIKEUT WA RIEULPIEUP
+ {0x8C78, 0xB638}, //2008 #HANGUL SYLLABLE SSANGTIKEUT WA RIEULSIOS
+ {0x8C79, 0xB639}, //2009 #HANGUL SYLLABLE SSANGTIKEUT WA RIEULTHIEUTH
+ {0x8C7A, 0xB63A}, //2010 #HANGUL SYLLABLE SSANGTIKEUT WA RIEULPHIEUPH
+ {0x8C81, 0xB63B}, //2011 #HANGUL SYLLABLE SSANGTIKEUT WA RIEULHIEUH
+ {0x8C82, 0xB63C}, //2012 #HANGUL SYLLABLE SSANGTIKEUT WA MIEUM
+ {0x8C83, 0xB63D}, //2013 #HANGUL SYLLABLE SSANGTIKEUT WA PIEUP
+ {0x8C84, 0xB63E}, //2014 #HANGUL SYLLABLE SSANGTIKEUT WA PIEUPSIOS
+ {0x8C85, 0xB63F}, //2015 #HANGUL SYLLABLE SSANGTIKEUT WA SIOS
+ {0x8C86, 0xB640}, //2016 #HANGUL SYLLABLE SSANGTIKEUT WA SSANGSIOS
+ {0x8C87, 0xB641}, //2017 #HANGUL SYLLABLE SSANGTIKEUT WA IEUNG
+ {0x8C88, 0xB642}, //2018 #HANGUL SYLLABLE SSANGTIKEUT WA CIEUC
+ {0x8C89, 0xB643}, //2019 #HANGUL SYLLABLE SSANGTIKEUT WA CHIEUCH
+ {0x8C8A, 0xB644}, //2020 #HANGUL SYLLABLE SSANGTIKEUT WA KHIEUKH
+ {0x8C8B, 0xB645}, //2021 #HANGUL SYLLABLE SSANGTIKEUT WA THIEUTH
+ {0x8C8C, 0xB646}, //2022 #HANGUL SYLLABLE SSANGTIKEUT WA PHIEUPH
+ {0x8C8D, 0xB647}, //2023 #HANGUL SYLLABLE SSANGTIKEUT WA HIEUH
+ {0x8C8E, 0xB649}, //2024 #HANGUL SYLLABLE SSANGTIKEUT WAE KIYEOK
+ {0x8C8F, 0xB64A}, //2025 #HANGUL SYLLABLE SSANGTIKEUT WAE SSANGKIYEOK
+ {0x8C90, 0xB64B}, //2026 #HANGUL SYLLABLE SSANGTIKEUT WAE KIYEOKSIOS
+ {0x8C91, 0xB64C}, //2027 #HANGUL SYLLABLE SSANGTIKEUT WAE NIEUN
+ {0x8C92, 0xB64D}, //2028 #HANGUL SYLLABLE SSANGTIKEUT WAE NIEUNCIEUC
+ {0x8C93, 0xB64E}, //2029 #HANGUL SYLLABLE SSANGTIKEUT WAE NIEUNHIEUH
+ {0x8C94, 0xB64F}, //2030 #HANGUL SYLLABLE SSANGTIKEUT WAE TIKEUT
+ {0x8C95, 0xB650}, //2031 #HANGUL SYLLABLE SSANGTIKEUT WAE RIEUL
+ {0x8C96, 0xB651}, //2032 #HANGUL SYLLABLE SSANGTIKEUT WAE RIEULKIYEOK
+ {0x8C97, 0xB652}, //2033 #HANGUL SYLLABLE SSANGTIKEUT WAE RIEULMIEUM
+ {0x8C98, 0xB653}, //2034 #HANGUL SYLLABLE SSANGTIKEUT WAE RIEULPIEUP
+ {0x8C99, 0xB654}, //2035 #HANGUL SYLLABLE SSANGTIKEUT WAE RIEULSIOS
+ {0x8C9A, 0xB655}, //2036 #HANGUL SYLLABLE SSANGTIKEUT WAE RIEULTHIEUTH
+ {0x8C9B, 0xB656}, //2037 #HANGUL SYLLABLE SSANGTIKEUT WAE RIEULPHIEUPH
+ {0x8C9C, 0xB657}, //2038 #HANGUL SYLLABLE SSANGTIKEUT WAE RIEULHIEUH
+ {0x8C9D, 0xB658}, //2039 #HANGUL SYLLABLE SSANGTIKEUT WAE MIEUM
+ {0x8C9E, 0xB659}, //2040 #HANGUL SYLLABLE SSANGTIKEUT WAE PIEUP
+ {0x8C9F, 0xB65A}, //2041 #HANGUL SYLLABLE SSANGTIKEUT WAE PIEUPSIOS
+ {0x8CA0, 0xB65B}, //2042 #HANGUL SYLLABLE SSANGTIKEUT WAE SIOS
+ {0x8CA1, 0xB65C}, //2043 #HANGUL SYLLABLE SSANGTIKEUT WAE SSANGSIOS
+ {0x8CA2, 0xB65D}, //2044 #HANGUL SYLLABLE SSANGTIKEUT WAE IEUNG
+ {0x8CA3, 0xB65E}, //2045 #HANGUL SYLLABLE SSANGTIKEUT WAE CIEUC
+ {0x8CA4, 0xB65F}, //2046 #HANGUL SYLLABLE SSANGTIKEUT WAE CHIEUCH
+ {0x8CA5, 0xB660}, //2047 #HANGUL SYLLABLE SSANGTIKEUT WAE KHIEUKH
+ {0x8CA6, 0xB661}, //2048 #HANGUL SYLLABLE SSANGTIKEUT WAE THIEUTH
+ {0x8CA7, 0xB662}, //2049 #HANGUL SYLLABLE SSANGTIKEUT WAE PHIEUPH
+ {0x8CA8, 0xB663}, //2050 #HANGUL SYLLABLE SSANGTIKEUT WAE HIEUH
+ {0x8CA9, 0xB665}, //2051 #HANGUL SYLLABLE SSANGTIKEUT OE KIYEOK
+ {0x8CAA, 0xB666}, //2052 #HANGUL SYLLABLE SSANGTIKEUT OE SSANGKIYEOK
+ {0x8CAB, 0xB667}, //2053 #HANGUL SYLLABLE SSANGTIKEUT OE KIYEOKSIOS
+ {0x8CAC, 0xB669}, //2054 #HANGUL SYLLABLE SSANGTIKEUT OE NIEUNCIEUC
+ {0x8CAD, 0xB66A}, //2055 #HANGUL SYLLABLE SSANGTIKEUT OE NIEUNHIEUH
+ {0x8CAE, 0xB66B}, //2056 #HANGUL SYLLABLE SSANGTIKEUT OE TIKEUT
+ {0x8CAF, 0xB66C}, //2057 #HANGUL SYLLABLE SSANGTIKEUT OE RIEUL
+ {0x8CB0, 0xB66D}, //2058 #HANGUL SYLLABLE SSANGTIKEUT OE RIEULKIYEOK
+ {0x8CB1, 0xB66E}, //2059 #HANGUL SYLLABLE SSANGTIKEUT OE RIEULMIEUM
+ {0x8CB2, 0xB66F}, //2060 #HANGUL SYLLABLE SSANGTIKEUT OE RIEULPIEUP
+ {0x8CB3, 0xB670}, //2061 #HANGUL SYLLABLE SSANGTIKEUT OE RIEULSIOS
+ {0x8CB4, 0xB671}, //2062 #HANGUL SYLLABLE SSANGTIKEUT OE RIEULTHIEUTH
+ {0x8CB5, 0xB672}, //2063 #HANGUL SYLLABLE SSANGTIKEUT OE RIEULPHIEUPH
+ {0x8CB6, 0xB673}, //2064 #HANGUL SYLLABLE SSANGTIKEUT OE RIEULHIEUH
+ {0x8CB7, 0xB674}, //2065 #HANGUL SYLLABLE SSANGTIKEUT OE MIEUM
+ {0x8CB8, 0xB675}, //2066 #HANGUL SYLLABLE SSANGTIKEUT OE PIEUP
+ {0x8CB9, 0xB676}, //2067 #HANGUL SYLLABLE SSANGTIKEUT OE PIEUPSIOS
+ {0x8CBA, 0xB677}, //2068 #HANGUL SYLLABLE SSANGTIKEUT OE SIOS
+ {0x8CBB, 0xB678}, //2069 #HANGUL SYLLABLE SSANGTIKEUT OE SSANGSIOS
+ {0x8CBC, 0xB679}, //2070 #HANGUL SYLLABLE SSANGTIKEUT OE IEUNG
+ {0x8CBD, 0xB67A}, //2071 #HANGUL SYLLABLE SSANGTIKEUT OE CIEUC
+ {0x8CBE, 0xB67B}, //2072 #HANGUL SYLLABLE SSANGTIKEUT OE CHIEUCH
+ {0x8CBF, 0xB67C}, //2073 #HANGUL SYLLABLE SSANGTIKEUT OE KHIEUKH
+ {0x8CC0, 0xB67D}, //2074 #HANGUL SYLLABLE SSANGTIKEUT OE THIEUTH
+ {0x8CC1, 0xB67E}, //2075 #HANGUL SYLLABLE SSANGTIKEUT OE PHIEUPH
+ {0x8CC2, 0xB67F}, //2076 #HANGUL SYLLABLE SSANGTIKEUT OE HIEUH
+ {0x8CC3, 0xB680}, //2077 #HANGUL SYLLABLE SSANGTIKEUT YO
+ {0x8CC4, 0xB681}, //2078 #HANGUL SYLLABLE SSANGTIKEUT YO KIYEOK
+ {0x8CC5, 0xB682}, //2079 #HANGUL SYLLABLE SSANGTIKEUT YO SSANGKIYEOK
+ {0x8CC6, 0xB683}, //2080 #HANGUL SYLLABLE SSANGTIKEUT YO KIYEOKSIOS
+ {0x8CC7, 0xB684}, //2081 #HANGUL SYLLABLE SSANGTIKEUT YO NIEUN
+ {0x8CC8, 0xB685}, //2082 #HANGUL SYLLABLE SSANGTIKEUT YO NIEUNCIEUC
+ {0x8CC9, 0xB686}, //2083 #HANGUL SYLLABLE SSANGTIKEUT YO NIEUNHIEUH
+ {0x8CCA, 0xB687}, //2084 #HANGUL SYLLABLE SSANGTIKEUT YO TIKEUT
+ {0x8CCB, 0xB688}, //2085 #HANGUL SYLLABLE SSANGTIKEUT YO RIEUL
+ {0x8CCC, 0xB689}, //2086 #HANGUL SYLLABLE SSANGTIKEUT YO RIEULKIYEOK
+ {0x8CCD, 0xB68A}, //2087 #HANGUL SYLLABLE SSANGTIKEUT YO RIEULMIEUM
+ {0x8CCE, 0xB68B}, //2088 #HANGUL SYLLABLE SSANGTIKEUT YO RIEULPIEUP
+ {0x8CCF, 0xB68C}, //2089 #HANGUL SYLLABLE SSANGTIKEUT YO RIEULSIOS
+ {0x8CD0, 0xB68D}, //2090 #HANGUL SYLLABLE SSANGTIKEUT YO RIEULTHIEUTH
+ {0x8CD1, 0xB68E}, //2091 #HANGUL SYLLABLE SSANGTIKEUT YO RIEULPHIEUPH
+ {0x8CD2, 0xB68F}, //2092 #HANGUL SYLLABLE SSANGTIKEUT YO RIEULHIEUH
+ {0x8CD3, 0xB690}, //2093 #HANGUL SYLLABLE SSANGTIKEUT YO MIEUM
+ {0x8CD4, 0xB691}, //2094 #HANGUL SYLLABLE SSANGTIKEUT YO PIEUP
+ {0x8CD5, 0xB692}, //2095 #HANGUL SYLLABLE SSANGTIKEUT YO PIEUPSIOS
+ {0x8CD6, 0xB693}, //2096 #HANGUL SYLLABLE SSANGTIKEUT YO SIOS
+ {0x8CD7, 0xB694}, //2097 #HANGUL SYLLABLE SSANGTIKEUT YO SSANGSIOS
+ {0x8CD8, 0xB695}, //2098 #HANGUL SYLLABLE SSANGTIKEUT YO IEUNG
+ {0x8CD9, 0xB696}, //2099 #HANGUL SYLLABLE SSANGTIKEUT YO CIEUC
+ {0x8CDA, 0xB697}, //2100 #HANGUL SYLLABLE SSANGTIKEUT YO CHIEUCH
+ {0x8CDB, 0xB698}, //2101 #HANGUL SYLLABLE SSANGTIKEUT YO KHIEUKH
+ {0x8CDC, 0xB699}, //2102 #HANGUL SYLLABLE SSANGTIKEUT YO THIEUTH
+ {0x8CDD, 0xB69A}, //2103 #HANGUL SYLLABLE SSANGTIKEUT YO PHIEUPH
+ {0x8CDE, 0xB69B}, //2104 #HANGUL SYLLABLE SSANGTIKEUT YO HIEUH
+ {0x8CDF, 0xB69E}, //2105 #HANGUL SYLLABLE SSANGTIKEUT U SSANGKIYEOK
+ {0x8CE0, 0xB69F}, //2106 #HANGUL SYLLABLE SSANGTIKEUT U KIYEOKSIOS
+ {0x8CE1, 0xB6A1}, //2107 #HANGUL SYLLABLE SSANGTIKEUT U NIEUNCIEUC
+ {0x8CE2, 0xB6A2}, //2108 #HANGUL SYLLABLE SSANGTIKEUT U NIEUNHIEUH
+ {0x8CE3, 0xB6A3}, //2109 #HANGUL SYLLABLE SSANGTIKEUT U TIKEUT
+ {0x8CE4, 0xB6A5}, //2110 #HANGUL SYLLABLE SSANGTIKEUT U RIEULKIYEOK
+ {0x8CE5, 0xB6A6}, //2111 #HANGUL SYLLABLE SSANGTIKEUT U RIEULMIEUM
+ {0x8CE6, 0xB6A7}, //2112 #HANGUL SYLLABLE SSANGTIKEUT U RIEULPIEUP
+ {0x8CE7, 0xB6A8}, //2113 #HANGUL SYLLABLE SSANGTIKEUT U RIEULSIOS
+ {0x8CE8, 0xB6A9}, //2114 #HANGUL SYLLABLE SSANGTIKEUT U RIEULTHIEUTH
+ {0x8CE9, 0xB6AA}, //2115 #HANGUL SYLLABLE SSANGTIKEUT U RIEULPHIEUPH
+ {0x8CEA, 0xB6AD}, //2116 #HANGUL SYLLABLE SSANGTIKEUT U PIEUP
+ {0x8CEB, 0xB6AE}, //2117 #HANGUL SYLLABLE SSANGTIKEUT U PIEUPSIOS
+ {0x8CEC, 0xB6AF}, //2118 #HANGUL SYLLABLE SSANGTIKEUT U SIOS
+ {0x8CED, 0xB6B0}, //2119 #HANGUL SYLLABLE SSANGTIKEUT U SSANGSIOS
+ {0x8CEE, 0xB6B2}, //2120 #HANGUL SYLLABLE SSANGTIKEUT U CIEUC
+ {0x8CEF, 0xB6B3}, //2121 #HANGUL SYLLABLE SSANGTIKEUT U CHIEUCH
+ {0x8CF0, 0xB6B4}, //2122 #HANGUL SYLLABLE SSANGTIKEUT U KHIEUKH
+ {0x8CF1, 0xB6B5}, //2123 #HANGUL SYLLABLE SSANGTIKEUT U THIEUTH
+ {0x8CF2, 0xB6B6}, //2124 #HANGUL SYLLABLE SSANGTIKEUT U PHIEUPH
+ {0x8CF3, 0xB6B7}, //2125 #HANGUL SYLLABLE SSANGTIKEUT U HIEUH
+ {0x8CF4, 0xB6B8}, //2126 #HANGUL SYLLABLE SSANGTIKEUT WEO
+ {0x8CF5, 0xB6B9}, //2127 #HANGUL SYLLABLE SSANGTIKEUT WEO KIYEOK
+ {0x8CF6, 0xB6BA}, //2128 #HANGUL SYLLABLE SSANGTIKEUT WEO SSANGKIYEOK
+ {0x8CF7, 0xB6BB}, //2129 #HANGUL SYLLABLE SSANGTIKEUT WEO KIYEOKSIOS
+ {0x8CF8, 0xB6BC}, //2130 #HANGUL SYLLABLE SSANGTIKEUT WEO NIEUN
+ {0x8CF9, 0xB6BD}, //2131 #HANGUL SYLLABLE SSANGTIKEUT WEO NIEUNCIEUC
+ {0x8CFA, 0xB6BE}, //2132 #HANGUL SYLLABLE SSANGTIKEUT WEO NIEUNHIEUH
+ {0x8CFB, 0xB6BF}, //2133 #HANGUL SYLLABLE SSANGTIKEUT WEO TIKEUT
+ {0x8CFC, 0xB6C0}, //2134 #HANGUL SYLLABLE SSANGTIKEUT WEO RIEUL
+ {0x8CFD, 0xB6C1}, //2135 #HANGUL SYLLABLE SSANGTIKEUT WEO RIEULKIYEOK
+ {0x8CFE, 0xB6C2}, //2136 #HANGUL SYLLABLE SSANGTIKEUT WEO RIEULMIEUM
+ {0x8D41, 0xB6C3}, //2137 #HANGUL SYLLABLE SSANGTIKEUT WEO RIEULPIEUP
+ {0x8D42, 0xB6C4}, //2138 #HANGUL SYLLABLE SSANGTIKEUT WEO RIEULSIOS
+ {0x8D43, 0xB6C5}, //2139 #HANGUL SYLLABLE SSANGTIKEUT WEO RIEULTHIEUTH
+ {0x8D44, 0xB6C6}, //2140 #HANGUL SYLLABLE SSANGTIKEUT WEO RIEULPHIEUPH
+ {0x8D45, 0xB6C7}, //2141 #HANGUL SYLLABLE SSANGTIKEUT WEO RIEULHIEUH
+ {0x8D46, 0xB6C8}, //2142 #HANGUL SYLLABLE SSANGTIKEUT WEO MIEUM
+ {0x8D47, 0xB6C9}, //2143 #HANGUL SYLLABLE SSANGTIKEUT WEO PIEUP
+ {0x8D48, 0xB6CA}, //2144 #HANGUL SYLLABLE SSANGTIKEUT WEO PIEUPSIOS
+ {0x8D49, 0xB6CB}, //2145 #HANGUL SYLLABLE SSANGTIKEUT WEO SIOS
+ {0x8D4A, 0xB6CC}, //2146 #HANGUL SYLLABLE SSANGTIKEUT WEO SSANGSIOS
+ {0x8D4B, 0xB6CD}, //2147 #HANGUL SYLLABLE SSANGTIKEUT WEO IEUNG
+ {0x8D4C, 0xB6CE}, //2148 #HANGUL SYLLABLE SSANGTIKEUT WEO CIEUC
+ {0x8D4D, 0xB6CF}, //2149 #HANGUL SYLLABLE SSANGTIKEUT WEO CHIEUCH
+ {0x8D4E, 0xB6D0}, //2150 #HANGUL SYLLABLE SSANGTIKEUT WEO KHIEUKH
+ {0x8D4F, 0xB6D1}, //2151 #HANGUL SYLLABLE SSANGTIKEUT WEO THIEUTH
+ {0x8D50, 0xB6D2}, //2152 #HANGUL SYLLABLE SSANGTIKEUT WEO PHIEUPH
+ {0x8D51, 0xB6D3}, //2153 #HANGUL SYLLABLE SSANGTIKEUT WEO HIEUH
+ {0x8D52, 0xB6D5}, //2154 #HANGUL SYLLABLE SSANGTIKEUT WE KIYEOK
+ {0x8D53, 0xB6D6}, //2155 #HANGUL SYLLABLE SSANGTIKEUT WE SSANGKIYEOK
+ {0x8D54, 0xB6D7}, //2156 #HANGUL SYLLABLE SSANGTIKEUT WE KIYEOKSIOS
+ {0x8D55, 0xB6D8}, //2157 #HANGUL SYLLABLE SSANGTIKEUT WE NIEUN
+ {0x8D56, 0xB6D9}, //2158 #HANGUL SYLLABLE SSANGTIKEUT WE NIEUNCIEUC
+ {0x8D57, 0xB6DA}, //2159 #HANGUL SYLLABLE SSANGTIKEUT WE NIEUNHIEUH
+ {0x8D58, 0xB6DB}, //2160 #HANGUL SYLLABLE SSANGTIKEUT WE TIKEUT
+ {0x8D59, 0xB6DC}, //2161 #HANGUL SYLLABLE SSANGTIKEUT WE RIEUL
+ {0x8D5A, 0xB6DD}, //2162 #HANGUL SYLLABLE SSANGTIKEUT WE RIEULKIYEOK
+ {0x8D61, 0xB6DE}, //2163 #HANGUL SYLLABLE SSANGTIKEUT WE RIEULMIEUM
+ {0x8D62, 0xB6DF}, //2164 #HANGUL SYLLABLE SSANGTIKEUT WE RIEULPIEUP
+ {0x8D63, 0xB6E0}, //2165 #HANGUL SYLLABLE SSANGTIKEUT WE RIEULSIOS
+ {0x8D64, 0xB6E1}, //2166 #HANGUL SYLLABLE SSANGTIKEUT WE RIEULTHIEUTH
+ {0x8D65, 0xB6E2}, //2167 #HANGUL SYLLABLE SSANGTIKEUT WE RIEULPHIEUPH
+ {0x8D66, 0xB6E3}, //2168 #HANGUL SYLLABLE SSANGTIKEUT WE RIEULHIEUH
+ {0x8D67, 0xB6E4}, //2169 #HANGUL SYLLABLE SSANGTIKEUT WE MIEUM
+ {0x8D68, 0xB6E5}, //2170 #HANGUL SYLLABLE SSANGTIKEUT WE PIEUP
+ {0x8D69, 0xB6E6}, //2171 #HANGUL SYLLABLE SSANGTIKEUT WE PIEUPSIOS
+ {0x8D6A, 0xB6E7}, //2172 #HANGUL SYLLABLE SSANGTIKEUT WE SIOS
+ {0x8D6B, 0xB6E8}, //2173 #HANGUL SYLLABLE SSANGTIKEUT WE SSANGSIOS
+ {0x8D6C, 0xB6E9}, //2174 #HANGUL SYLLABLE SSANGTIKEUT WE IEUNG
+ {0x8D6D, 0xB6EA}, //2175 #HANGUL SYLLABLE SSANGTIKEUT WE CIEUC
+ {0x8D6E, 0xB6EB}, //2176 #HANGUL SYLLABLE SSANGTIKEUT WE CHIEUCH
+ {0x8D6F, 0xB6EC}, //2177 #HANGUL SYLLABLE SSANGTIKEUT WE KHIEUKH
+ {0x8D70, 0xB6ED}, //2178 #HANGUL SYLLABLE SSANGTIKEUT WE THIEUTH
+ {0x8D71, 0xB6EE}, //2179 #HANGUL SYLLABLE SSANGTIKEUT WE PHIEUPH
+ {0x8D72, 0xB6EF}, //2180 #HANGUL SYLLABLE SSANGTIKEUT WE HIEUH
+ {0x8D73, 0xB6F1}, //2181 #HANGUL SYLLABLE SSANGTIKEUT WI KIYEOK
+ {0x8D74, 0xB6F2}, //2182 #HANGUL SYLLABLE SSANGTIKEUT WI SSANGKIYEOK
+ {0x8D75, 0xB6F3}, //2183 #HANGUL SYLLABLE SSANGTIKEUT WI KIYEOKSIOS
+ {0x8D76, 0xB6F5}, //2184 #HANGUL SYLLABLE SSANGTIKEUT WI NIEUNCIEUC
+ {0x8D77, 0xB6F6}, //2185 #HANGUL SYLLABLE SSANGTIKEUT WI NIEUNHIEUH
+ {0x8D78, 0xB6F7}, //2186 #HANGUL SYLLABLE SSANGTIKEUT WI TIKEUT
+ {0x8D79, 0xB6F9}, //2187 #HANGUL SYLLABLE SSANGTIKEUT WI RIEULKIYEOK
+ {0x8D7A, 0xB6FA}, //2188 #HANGUL SYLLABLE SSANGTIKEUT WI RIEULMIEUM
+ {0x8D81, 0xB6FB}, //2189 #HANGUL SYLLABLE SSANGTIKEUT WI RIEULPIEUP
+ {0x8D82, 0xB6FC}, //2190 #HANGUL SYLLABLE SSANGTIKEUT WI RIEULSIOS
+ {0x8D83, 0xB6FD}, //2191 #HANGUL SYLLABLE SSANGTIKEUT WI RIEULTHIEUTH
+ {0x8D84, 0xB6FE}, //2192 #HANGUL SYLLABLE SSANGTIKEUT WI RIEULPHIEUPH
+ {0x8D85, 0xB6FF}, //2193 #HANGUL SYLLABLE SSANGTIKEUT WI RIEULHIEUH
+ {0x8D86, 0xB702}, //2194 #HANGUL SYLLABLE SSANGTIKEUT WI PIEUPSIOS
+ {0x8D87, 0xB703}, //2195 #HANGUL SYLLABLE SSANGTIKEUT WI SIOS
+ {0x8D88, 0xB704}, //2196 #HANGUL SYLLABLE SSANGTIKEUT WI SSANGSIOS
+ {0x8D89, 0xB706}, //2197 #HANGUL SYLLABLE SSANGTIKEUT WI CIEUC
+ {0x8D8A, 0xB707}, //2198 #HANGUL SYLLABLE SSANGTIKEUT WI CHIEUCH
+ {0x8D8B, 0xB708}, //2199 #HANGUL SYLLABLE SSANGTIKEUT WI KHIEUKH
+ {0x8D8C, 0xB709}, //2200 #HANGUL SYLLABLE SSANGTIKEUT WI THIEUTH
+ {0x8D8D, 0xB70A}, //2201 #HANGUL SYLLABLE SSANGTIKEUT WI PHIEUPH
+ {0x8D8E, 0xB70B}, //2202 #HANGUL SYLLABLE SSANGTIKEUT WI HIEUH
+ {0x8D8F, 0xB70C}, //2203 #HANGUL SYLLABLE SSANGTIKEUT YU
+ {0x8D90, 0xB70D}, //2204 #HANGUL SYLLABLE SSANGTIKEUT YU KIYEOK
+ {0x8D91, 0xB70E}, //2205 #HANGUL SYLLABLE SSANGTIKEUT YU SSANGKIYEOK
+ {0x8D92, 0xB70F}, //2206 #HANGUL SYLLABLE SSANGTIKEUT YU KIYEOKSIOS
+ {0x8D93, 0xB710}, //2207 #HANGUL SYLLABLE SSANGTIKEUT YU NIEUN
+ {0x8D94, 0xB711}, //2208 #HANGUL SYLLABLE SSANGTIKEUT YU NIEUNCIEUC
+ {0x8D95, 0xB712}, //2209 #HANGUL SYLLABLE SSANGTIKEUT YU NIEUNHIEUH
+ {0x8D96, 0xB713}, //2210 #HANGUL SYLLABLE SSANGTIKEUT YU TIKEUT
+ {0x8D97, 0xB714}, //2211 #HANGUL SYLLABLE SSANGTIKEUT YU RIEUL
+ {0x8D98, 0xB715}, //2212 #HANGUL SYLLABLE SSANGTIKEUT YU RIEULKIYEOK
+ {0x8D99, 0xB716}, //2213 #HANGUL SYLLABLE SSANGTIKEUT YU RIEULMIEUM
+ {0x8D9A, 0xB717}, //2214 #HANGUL SYLLABLE SSANGTIKEUT YU RIEULPIEUP
+ {0x8D9B, 0xB718}, //2215 #HANGUL SYLLABLE SSANGTIKEUT YU RIEULSIOS
+ {0x8D9C, 0xB719}, //2216 #HANGUL SYLLABLE SSANGTIKEUT YU RIEULTHIEUTH
+ {0x8D9D, 0xB71A}, //2217 #HANGUL SYLLABLE SSANGTIKEUT YU RIEULPHIEUPH
+ {0x8D9E, 0xB71B}, //2218 #HANGUL SYLLABLE SSANGTIKEUT YU RIEULHIEUH
+ {0x8D9F, 0xB71C}, //2219 #HANGUL SYLLABLE SSANGTIKEUT YU MIEUM
+ {0x8DA0, 0xB71D}, //2220 #HANGUL SYLLABLE SSANGTIKEUT YU PIEUP
+ {0x8DA1, 0xB71E}, //2221 #HANGUL SYLLABLE SSANGTIKEUT YU PIEUPSIOS
+ {0x8DA2, 0xB71F}, //2222 #HANGUL SYLLABLE SSANGTIKEUT YU SIOS
+ {0x8DA3, 0xB720}, //2223 #HANGUL SYLLABLE SSANGTIKEUT YU SSANGSIOS
+ {0x8DA4, 0xB721}, //2224 #HANGUL SYLLABLE SSANGTIKEUT YU IEUNG
+ {0x8DA5, 0xB722}, //2225 #HANGUL SYLLABLE SSANGTIKEUT YU CIEUC
+ {0x8DA6, 0xB723}, //2226 #HANGUL SYLLABLE SSANGTIKEUT YU CHIEUCH
+ {0x8DA7, 0xB724}, //2227 #HANGUL SYLLABLE SSANGTIKEUT YU KHIEUKH
+ {0x8DA8, 0xB725}, //2228 #HANGUL SYLLABLE SSANGTIKEUT YU THIEUTH
+ {0x8DA9, 0xB726}, //2229 #HANGUL SYLLABLE SSANGTIKEUT YU PHIEUPH
+ {0x8DAA, 0xB727}, //2230 #HANGUL SYLLABLE SSANGTIKEUT YU HIEUH
+ {0x8DAB, 0xB72A}, //2231 #HANGUL SYLLABLE SSANGTIKEUT EU SSANGKIYEOK
+ {0x8DAC, 0xB72B}, //2232 #HANGUL SYLLABLE SSANGTIKEUT EU KIYEOKSIOS
+ {0x8DAD, 0xB72D}, //2233 #HANGUL SYLLABLE SSANGTIKEUT EU NIEUNCIEUC
+ {0x8DAE, 0xB72E}, //2234 #HANGUL SYLLABLE SSANGTIKEUT EU NIEUNHIEUH
+ {0x8DAF, 0xB731}, //2235 #HANGUL SYLLABLE SSANGTIKEUT EU RIEULKIYEOK
+ {0x8DB0, 0xB732}, //2236 #HANGUL SYLLABLE SSANGTIKEUT EU RIEULMIEUM
+ {0x8DB1, 0xB733}, //2237 #HANGUL SYLLABLE SSANGTIKEUT EU RIEULPIEUP
+ {0x8DB2, 0xB734}, //2238 #HANGUL SYLLABLE SSANGTIKEUT EU RIEULSIOS
+ {0x8DB3, 0xB735}, //2239 #HANGUL SYLLABLE SSANGTIKEUT EU RIEULTHIEUTH
+ {0x8DB4, 0xB736}, //2240 #HANGUL SYLLABLE SSANGTIKEUT EU RIEULPHIEUPH
+ {0x8DB5, 0xB737}, //2241 #HANGUL SYLLABLE SSANGTIKEUT EU RIEULHIEUH
+ {0x8DB6, 0xB73A}, //2242 #HANGUL SYLLABLE SSANGTIKEUT EU PIEUPSIOS
+ {0x8DB7, 0xB73C}, //2243 #HANGUL SYLLABLE SSANGTIKEUT EU SSANGSIOS
+ {0x8DB8, 0xB73D}, //2244 #HANGUL SYLLABLE SSANGTIKEUT EU IEUNG
+ {0x8DB9, 0xB73E}, //2245 #HANGUL SYLLABLE SSANGTIKEUT EU CIEUC
+ {0x8DBA, 0xB73F}, //2246 #HANGUL SYLLABLE SSANGTIKEUT EU CHIEUCH
+ {0x8DBB, 0xB740}, //2247 #HANGUL SYLLABLE SSANGTIKEUT EU KHIEUKH
+ {0x8DBC, 0xB741}, //2248 #HANGUL SYLLABLE SSANGTIKEUT EU THIEUTH
+ {0x8DBD, 0xB742}, //2249 #HANGUL SYLLABLE SSANGTIKEUT EU PHIEUPH
+ {0x8DBE, 0xB743}, //2250 #HANGUL SYLLABLE SSANGTIKEUT EU HIEUH
+ {0x8DBF, 0xB745}, //2251 #HANGUL SYLLABLE SSANGTIKEUT YI KIYEOK
+ {0x8DC0, 0xB746}, //2252 #HANGUL SYLLABLE SSANGTIKEUT YI SSANGKIYEOK
+ {0x8DC1, 0xB747}, //2253 #HANGUL SYLLABLE SSANGTIKEUT YI KIYEOKSIOS
+ {0x8DC2, 0xB749}, //2254 #HANGUL SYLLABLE SSANGTIKEUT YI NIEUNCIEUC
+ {0x8DC3, 0xB74A}, //2255 #HANGUL SYLLABLE SSANGTIKEUT YI NIEUNHIEUH
+ {0x8DC4, 0xB74B}, //2256 #HANGUL SYLLABLE SSANGTIKEUT YI TIKEUT
+ {0x8DC5, 0xB74D}, //2257 #HANGUL SYLLABLE SSANGTIKEUT YI RIEULKIYEOK
+ {0x8DC6, 0xB74E}, //2258 #HANGUL SYLLABLE SSANGTIKEUT YI RIEULMIEUM
+ {0x8DC7, 0xB74F}, //2259 #HANGUL SYLLABLE SSANGTIKEUT YI RIEULPIEUP
+ {0x8DC8, 0xB750}, //2260 #HANGUL SYLLABLE SSANGTIKEUT YI RIEULSIOS
+ {0x8DC9, 0xB751}, //2261 #HANGUL SYLLABLE SSANGTIKEUT YI RIEULTHIEUTH
+ {0x8DCA, 0xB752}, //2262 #HANGUL SYLLABLE SSANGTIKEUT YI RIEULPHIEUPH
+ {0x8DCB, 0xB753}, //2263 #HANGUL SYLLABLE SSANGTIKEUT YI RIEULHIEUH
+ {0x8DCC, 0xB756}, //2264 #HANGUL SYLLABLE SSANGTIKEUT YI PIEUPSIOS
+ {0x8DCD, 0xB757}, //2265 #HANGUL SYLLABLE SSANGTIKEUT YI SIOS
+ {0x8DCE, 0xB758}, //2266 #HANGUL SYLLABLE SSANGTIKEUT YI SSANGSIOS
+ {0x8DCF, 0xB759}, //2267 #HANGUL SYLLABLE SSANGTIKEUT YI IEUNG
+ {0x8DD0, 0xB75A}, //2268 #HANGUL SYLLABLE SSANGTIKEUT YI CIEUC
+ {0x8DD1, 0xB75B}, //2269 #HANGUL SYLLABLE SSANGTIKEUT YI CHIEUCH
+ {0x8DD2, 0xB75C}, //2270 #HANGUL SYLLABLE SSANGTIKEUT YI KHIEUKH
+ {0x8DD3, 0xB75D}, //2271 #HANGUL SYLLABLE SSANGTIKEUT YI THIEUTH
+ {0x8DD4, 0xB75E}, //2272 #HANGUL SYLLABLE SSANGTIKEUT YI PHIEUPH
+ {0x8DD5, 0xB75F}, //2273 #HANGUL SYLLABLE SSANGTIKEUT YI HIEUH
+ {0x8DD6, 0xB761}, //2274 #HANGUL SYLLABLE SSANGTIKEUT I KIYEOK
+ {0x8DD7, 0xB762}, //2275 #HANGUL SYLLABLE SSANGTIKEUT I SSANGKIYEOK
+ {0x8DD8, 0xB763}, //2276 #HANGUL SYLLABLE SSANGTIKEUT I KIYEOKSIOS
+ {0x8DD9, 0xB765}, //2277 #HANGUL SYLLABLE SSANGTIKEUT I NIEUNCIEUC
+ {0x8DDA, 0xB766}, //2278 #HANGUL SYLLABLE SSANGTIKEUT I NIEUNHIEUH
+ {0x8DDB, 0xB767}, //2279 #HANGUL SYLLABLE SSANGTIKEUT I TIKEUT
+ {0x8DDC, 0xB769}, //2280 #HANGUL SYLLABLE SSANGTIKEUT I RIEULKIYEOK
+ {0x8DDD, 0xB76A}, //2281 #HANGUL SYLLABLE SSANGTIKEUT I RIEULMIEUM
+ {0x8DDE, 0xB76B}, //2282 #HANGUL SYLLABLE SSANGTIKEUT I RIEULPIEUP
+ {0x8DDF, 0xB76C}, //2283 #HANGUL SYLLABLE SSANGTIKEUT I RIEULSIOS
+ {0x8DE0, 0xB76D}, //2284 #HANGUL SYLLABLE SSANGTIKEUT I RIEULTHIEUTH
+ {0x8DE1, 0xB76E}, //2285 #HANGUL SYLLABLE SSANGTIKEUT I RIEULPHIEUPH
+ {0x8DE2, 0xB76F}, //2286 #HANGUL SYLLABLE SSANGTIKEUT I RIEULHIEUH
+ {0x8DE3, 0xB772}, //2287 #HANGUL SYLLABLE SSANGTIKEUT I PIEUPSIOS
+ {0x8DE4, 0xB774}, //2288 #HANGUL SYLLABLE SSANGTIKEUT I SSANGSIOS
+ {0x8DE5, 0xB776}, //2289 #HANGUL SYLLABLE SSANGTIKEUT I CIEUC
+ {0x8DE6, 0xB777}, //2290 #HANGUL SYLLABLE SSANGTIKEUT I CHIEUCH
+ {0x8DE7, 0xB778}, //2291 #HANGUL SYLLABLE SSANGTIKEUT I KHIEUKH
+ {0x8DE8, 0xB779}, //2292 #HANGUL SYLLABLE SSANGTIKEUT I THIEUTH
+ {0x8DE9, 0xB77A}, //2293 #HANGUL SYLLABLE SSANGTIKEUT I PHIEUPH
+ {0x8DEA, 0xB77B}, //2294 #HANGUL SYLLABLE SSANGTIKEUT I HIEUH
+ {0x8DEB, 0xB77E}, //2295 #HANGUL SYLLABLE RIEUL A SSANGKIYEOK
+ {0x8DEC, 0xB77F}, //2296 #HANGUL SYLLABLE RIEUL A KIYEOKSIOS
+ {0x8DED, 0xB781}, //2297 #HANGUL SYLLABLE RIEUL A NIEUNCIEUC
+ {0x8DEE, 0xB782}, //2298 #HANGUL SYLLABLE RIEUL A NIEUNHIEUH
+ {0x8DEF, 0xB783}, //2299 #HANGUL SYLLABLE RIEUL A TIKEUT
+ {0x8DF0, 0xB785}, //2300 #HANGUL SYLLABLE RIEUL A RIEULKIYEOK
+ {0x8DF1, 0xB786}, //2301 #HANGUL SYLLABLE RIEUL A RIEULMIEUM
+ {0x8DF2, 0xB787}, //2302 #HANGUL SYLLABLE RIEUL A RIEULPIEUP
+ {0x8DF3, 0xB788}, //2303 #HANGUL SYLLABLE RIEUL A RIEULSIOS
+ {0x8DF4, 0xB789}, //2304 #HANGUL SYLLABLE RIEUL A RIEULTHIEUTH
+ {0x8DF5, 0xB78A}, //2305 #HANGUL SYLLABLE RIEUL A RIEULPHIEUPH
+ {0x8DF6, 0xB78B}, //2306 #HANGUL SYLLABLE RIEUL A RIEULHIEUH
+ {0x8DF7, 0xB78E}, //2307 #HANGUL SYLLABLE RIEUL A PIEUPSIOS
+ {0x8DF8, 0xB793}, //2308 #HANGUL SYLLABLE RIEUL A CHIEUCH
+ {0x8DF9, 0xB794}, //2309 #HANGUL SYLLABLE RIEUL A KHIEUKH
+ {0x8DFA, 0xB795}, //2310 #HANGUL SYLLABLE RIEUL A THIEUTH
+ {0x8DFB, 0xB79A}, //2311 #HANGUL SYLLABLE RIEUL AE SSANGKIYEOK
+ {0x8DFC, 0xB79B}, //2312 #HANGUL SYLLABLE RIEUL AE KIYEOKSIOS
+ {0x8DFD, 0xB79D}, //2313 #HANGUL SYLLABLE RIEUL AE NIEUNCIEUC
+ {0x8DFE, 0xB79E}, //2314 #HANGUL SYLLABLE RIEUL AE NIEUNHIEUH
+ {0x8E41, 0xB79F}, //2315 #HANGUL SYLLABLE RIEUL AE TIKEUT
+ {0x8E42, 0xB7A1}, //2316 #HANGUL SYLLABLE RIEUL AE RIEULKIYEOK
+ {0x8E43, 0xB7A2}, //2317 #HANGUL SYLLABLE RIEUL AE RIEULMIEUM
+ {0x8E44, 0xB7A3}, //2318 #HANGUL SYLLABLE RIEUL AE RIEULPIEUP
+ {0x8E45, 0xB7A4}, //2319 #HANGUL SYLLABLE RIEUL AE RIEULSIOS
+ {0x8E46, 0xB7A5}, //2320 #HANGUL SYLLABLE RIEUL AE RIEULTHIEUTH
+ {0x8E47, 0xB7A6}, //2321 #HANGUL SYLLABLE RIEUL AE RIEULPHIEUPH
+ {0x8E48, 0xB7A7}, //2322 #HANGUL SYLLABLE RIEUL AE RIEULHIEUH
+ {0x8E49, 0xB7AA}, //2323 #HANGUL SYLLABLE RIEUL AE PIEUPSIOS
+ {0x8E4A, 0xB7AE}, //2324 #HANGUL SYLLABLE RIEUL AE CIEUC
+ {0x8E4B, 0xB7AF}, //2325 #HANGUL SYLLABLE RIEUL AE CHIEUCH
+ {0x8E4C, 0xB7B0}, //2326 #HANGUL SYLLABLE RIEUL AE KHIEUKH
+ {0x8E4D, 0xB7B1}, //2327 #HANGUL SYLLABLE RIEUL AE THIEUTH
+ {0x8E4E, 0xB7B2}, //2328 #HANGUL SYLLABLE RIEUL AE PHIEUPH
+ {0x8E4F, 0xB7B3}, //2329 #HANGUL SYLLABLE RIEUL AE HIEUH
+ {0x8E50, 0xB7B6}, //2330 #HANGUL SYLLABLE RIEUL YA SSANGKIYEOK
+ {0x8E51, 0xB7B7}, //2331 #HANGUL SYLLABLE RIEUL YA KIYEOKSIOS
+ {0x8E52, 0xB7B9}, //2332 #HANGUL SYLLABLE RIEUL YA NIEUNCIEUC
+ {0x8E53, 0xB7BA}, //2333 #HANGUL SYLLABLE RIEUL YA NIEUNHIEUH
+ {0x8E54, 0xB7BB}, //2334 #HANGUL SYLLABLE RIEUL YA TIKEUT
+ {0x8E55, 0xB7BC}, //2335 #HANGUL SYLLABLE RIEUL YA RIEUL
+ {0x8E56, 0xB7BD}, //2336 #HANGUL SYLLABLE RIEUL YA RIEULKIYEOK
+ {0x8E57, 0xB7BE}, //2337 #HANGUL SYLLABLE RIEUL YA RIEULMIEUM
+ {0x8E58, 0xB7BF}, //2338 #HANGUL SYLLABLE RIEUL YA RIEULPIEUP
+ {0x8E59, 0xB7C0}, //2339 #HANGUL SYLLABLE RIEUL YA RIEULSIOS
+ {0x8E5A, 0xB7C1}, //2340 #HANGUL SYLLABLE RIEUL YA RIEULTHIEUTH
+ {0x8E61, 0xB7C2}, //2341 #HANGUL SYLLABLE RIEUL YA RIEULPHIEUPH
+ {0x8E62, 0xB7C3}, //2342 #HANGUL SYLLABLE RIEUL YA RIEULHIEUH
+ {0x8E63, 0xB7C4}, //2343 #HANGUL SYLLABLE RIEUL YA MIEUM
+ {0x8E64, 0xB7C5}, //2344 #HANGUL SYLLABLE RIEUL YA PIEUP
+ {0x8E65, 0xB7C6}, //2345 #HANGUL SYLLABLE RIEUL YA PIEUPSIOS
+ {0x8E66, 0xB7C8}, //2346 #HANGUL SYLLABLE RIEUL YA SSANGSIOS
+ {0x8E67, 0xB7CA}, //2347 #HANGUL SYLLABLE RIEUL YA CIEUC
+ {0x8E68, 0xB7CB}, //2348 #HANGUL SYLLABLE RIEUL YA CHIEUCH
+ {0x8E69, 0xB7CC}, //2349 #HANGUL SYLLABLE RIEUL YA KHIEUKH
+ {0x8E6A, 0xB7CD}, //2350 #HANGUL SYLLABLE RIEUL YA THIEUTH
+ {0x8E6B, 0xB7CE}, //2351 #HANGUL SYLLABLE RIEUL YA PHIEUPH
+ {0x8E6C, 0xB7CF}, //2352 #HANGUL SYLLABLE RIEUL YA HIEUH
+ {0x8E6D, 0xB7D0}, //2353 #HANGUL SYLLABLE RIEUL YAE
+ {0x8E6E, 0xB7D1}, //2354 #HANGUL SYLLABLE RIEUL YAE KIYEOK
+ {0x8E6F, 0xB7D2}, //2355 #HANGUL SYLLABLE RIEUL YAE SSANGKIYEOK
+ {0x8E70, 0xB7D3}, //2356 #HANGUL SYLLABLE RIEUL YAE KIYEOKSIOS
+ {0x8E71, 0xB7D4}, //2357 #HANGUL SYLLABLE RIEUL YAE NIEUN
+ {0x8E72, 0xB7D5}, //2358 #HANGUL SYLLABLE RIEUL YAE NIEUNCIEUC
+ {0x8E73, 0xB7D6}, //2359 #HANGUL SYLLABLE RIEUL YAE NIEUNHIEUH
+ {0x8E74, 0xB7D7}, //2360 #HANGUL SYLLABLE RIEUL YAE TIKEUT
+ {0x8E75, 0xB7D8}, //2361 #HANGUL SYLLABLE RIEUL YAE RIEUL
+ {0x8E76, 0xB7D9}, //2362 #HANGUL SYLLABLE RIEUL YAE RIEULKIYEOK
+ {0x8E77, 0xB7DA}, //2363 #HANGUL SYLLABLE RIEUL YAE RIEULMIEUM
+ {0x8E78, 0xB7DB}, //2364 #HANGUL SYLLABLE RIEUL YAE RIEULPIEUP
+ {0x8E79, 0xB7DC}, //2365 #HANGUL SYLLABLE RIEUL YAE RIEULSIOS
+ {0x8E7A, 0xB7DD}, //2366 #HANGUL SYLLABLE RIEUL YAE RIEULTHIEUTH
+ {0x8E81, 0xB7DE}, //2367 #HANGUL SYLLABLE RIEUL YAE RIEULPHIEUPH
+ {0x8E82, 0xB7DF}, //2368 #HANGUL SYLLABLE RIEUL YAE RIEULHIEUH
+ {0x8E83, 0xB7E0}, //2369 #HANGUL SYLLABLE RIEUL YAE MIEUM
+ {0x8E84, 0xB7E1}, //2370 #HANGUL SYLLABLE RIEUL YAE PIEUP
+ {0x8E85, 0xB7E2}, //2371 #HANGUL SYLLABLE RIEUL YAE PIEUPSIOS
+ {0x8E86, 0xB7E3}, //2372 #HANGUL SYLLABLE RIEUL YAE SIOS
+ {0x8E87, 0xB7E4}, //2373 #HANGUL SYLLABLE RIEUL YAE SSANGSIOS
+ {0x8E88, 0xB7E5}, //2374 #HANGUL SYLLABLE RIEUL YAE IEUNG
+ {0x8E89, 0xB7E6}, //2375 #HANGUL SYLLABLE RIEUL YAE CIEUC
+ {0x8E8A, 0xB7E7}, //2376 #HANGUL SYLLABLE RIEUL YAE CHIEUCH
+ {0x8E8B, 0xB7E8}, //2377 #HANGUL SYLLABLE RIEUL YAE KHIEUKH
+ {0x8E8C, 0xB7E9}, //2378 #HANGUL SYLLABLE RIEUL YAE THIEUTH
+ {0x8E8D, 0xB7EA}, //2379 #HANGUL SYLLABLE RIEUL YAE PHIEUPH
+ {0x8E8E, 0xB7EB}, //2380 #HANGUL SYLLABLE RIEUL YAE HIEUH
+ {0x8E8F, 0xB7EE}, //2381 #HANGUL SYLLABLE RIEUL EO SSANGKIYEOK
+ {0x8E90, 0xB7EF}, //2382 #HANGUL SYLLABLE RIEUL EO KIYEOKSIOS
+ {0x8E91, 0xB7F1}, //2383 #HANGUL SYLLABLE RIEUL EO NIEUNCIEUC
+ {0x8E92, 0xB7F2}, //2384 #HANGUL SYLLABLE RIEUL EO NIEUNHIEUH
+ {0x8E93, 0xB7F3}, //2385 #HANGUL SYLLABLE RIEUL EO TIKEUT
+ {0x8E94, 0xB7F5}, //2386 #HANGUL SYLLABLE RIEUL EO RIEULKIYEOK
+ {0x8E95, 0xB7F6}, //2387 #HANGUL SYLLABLE RIEUL EO RIEULMIEUM
+ {0x8E96, 0xB7F7}, //2388 #HANGUL SYLLABLE RIEUL EO RIEULPIEUP
+ {0x8E97, 0xB7F8}, //2389 #HANGUL SYLLABLE RIEUL EO RIEULSIOS
+ {0x8E98, 0xB7F9}, //2390 #HANGUL SYLLABLE RIEUL EO RIEULTHIEUTH
+ {0x8E99, 0xB7FA}, //2391 #HANGUL SYLLABLE RIEUL EO RIEULPHIEUPH
+ {0x8E9A, 0xB7FB}, //2392 #HANGUL SYLLABLE RIEUL EO RIEULHIEUH
+ {0x8E9B, 0xB7FE}, //2393 #HANGUL SYLLABLE RIEUL EO PIEUPSIOS
+ {0x8E9C, 0xB802}, //2394 #HANGUL SYLLABLE RIEUL EO CIEUC
+ {0x8E9D, 0xB803}, //2395 #HANGUL SYLLABLE RIEUL EO CHIEUCH
+ {0x8E9E, 0xB804}, //2396 #HANGUL SYLLABLE RIEUL EO KHIEUKH
+ {0x8E9F, 0xB805}, //2397 #HANGUL SYLLABLE RIEUL EO THIEUTH
+ {0x8EA0, 0xB806}, //2398 #HANGUL SYLLABLE RIEUL EO PHIEUPH
+ {0x8EA1, 0xB80A}, //2399 #HANGUL SYLLABLE RIEUL E SSANGKIYEOK
+ {0x8EA2, 0xB80B}, //2400 #HANGUL SYLLABLE RIEUL E KIYEOKSIOS
+ {0x8EA3, 0xB80D}, //2401 #HANGUL SYLLABLE RIEUL E NIEUNCIEUC
+ {0x8EA4, 0xB80E}, //2402 #HANGUL SYLLABLE RIEUL E NIEUNHIEUH
+ {0x8EA5, 0xB80F}, //2403 #HANGUL SYLLABLE RIEUL E TIKEUT
+ {0x8EA6, 0xB811}, //2404 #HANGUL SYLLABLE RIEUL E RIEULKIYEOK
+ {0x8EA7, 0xB812}, //2405 #HANGUL SYLLABLE RIEUL E RIEULMIEUM
+ {0x8EA8, 0xB813}, //2406 #HANGUL SYLLABLE RIEUL E RIEULPIEUP
+ {0x8EA9, 0xB814}, //2407 #HANGUL SYLLABLE RIEUL E RIEULSIOS
+ {0x8EAA, 0xB815}, //2408 #HANGUL SYLLABLE RIEUL E RIEULTHIEUTH
+ {0x8EAB, 0xB816}, //2409 #HANGUL SYLLABLE RIEUL E RIEULPHIEUPH
+ {0x8EAC, 0xB817}, //2410 #HANGUL SYLLABLE RIEUL E RIEULHIEUH
+ {0x8EAD, 0xB81A}, //2411 #HANGUL SYLLABLE RIEUL E PIEUPSIOS
+ {0x8EAE, 0xB81C}, //2412 #HANGUL SYLLABLE RIEUL E SSANGSIOS
+ {0x8EAF, 0xB81E}, //2413 #HANGUL SYLLABLE RIEUL E CIEUC
+ {0x8EB0, 0xB81F}, //2414 #HANGUL SYLLABLE RIEUL E CHIEUCH
+ {0x8EB1, 0xB820}, //2415 #HANGUL SYLLABLE RIEUL E KHIEUKH
+ {0x8EB2, 0xB821}, //2416 #HANGUL SYLLABLE RIEUL E THIEUTH
+ {0x8EB3, 0xB822}, //2417 #HANGUL SYLLABLE RIEUL E PHIEUPH
+ {0x8EB4, 0xB823}, //2418 #HANGUL SYLLABLE RIEUL E HIEUH
+ {0x8EB5, 0xB826}, //2419 #HANGUL SYLLABLE RIEUL YEO SSANGKIYEOK
+ {0x8EB6, 0xB827}, //2420 #HANGUL SYLLABLE RIEUL YEO KIYEOKSIOS
+ {0x8EB7, 0xB829}, //2421 #HANGUL SYLLABLE RIEUL YEO NIEUNCIEUC
+ {0x8EB8, 0xB82A}, //2422 #HANGUL SYLLABLE RIEUL YEO NIEUNHIEUH
+ {0x8EB9, 0xB82B}, //2423 #HANGUL SYLLABLE RIEUL YEO TIKEUT
+ {0x8EBA, 0xB82D}, //2424 #HANGUL SYLLABLE RIEUL YEO RIEULKIYEOK
+ {0x8EBB, 0xB82E}, //2425 #HANGUL SYLLABLE RIEUL YEO RIEULMIEUM
+ {0x8EBC, 0xB82F}, //2426 #HANGUL SYLLABLE RIEUL YEO RIEULPIEUP
+ {0x8EBD, 0xB830}, //2427 #HANGUL SYLLABLE RIEUL YEO RIEULSIOS
+ {0x8EBE, 0xB831}, //2428 #HANGUL SYLLABLE RIEUL YEO RIEULTHIEUTH
+ {0x8EBF, 0xB832}, //2429 #HANGUL SYLLABLE RIEUL YEO RIEULPHIEUPH
+ {0x8EC0, 0xB833}, //2430 #HANGUL SYLLABLE RIEUL YEO RIEULHIEUH
+ {0x8EC1, 0xB836}, //2431 #HANGUL SYLLABLE RIEUL YEO PIEUPSIOS
+ {0x8EC2, 0xB83A}, //2432 #HANGUL SYLLABLE RIEUL YEO CIEUC
+ {0x8EC3, 0xB83B}, //2433 #HANGUL SYLLABLE RIEUL YEO CHIEUCH
+ {0x8EC4, 0xB83C}, //2434 #HANGUL SYLLABLE RIEUL YEO KHIEUKH
+ {0x8EC5, 0xB83D}, //2435 #HANGUL SYLLABLE RIEUL YEO THIEUTH
+ {0x8EC6, 0xB83E}, //2436 #HANGUL SYLLABLE RIEUL YEO PHIEUPH
+ {0x8EC7, 0xB83F}, //2437 #HANGUL SYLLABLE RIEUL YEO HIEUH
+ {0x8EC8, 0xB841}, //2438 #HANGUL SYLLABLE RIEUL YE KIYEOK
+ {0x8EC9, 0xB842}, //2439 #HANGUL SYLLABLE RIEUL YE SSANGKIYEOK
+ {0x8ECA, 0xB843}, //2440 #HANGUL SYLLABLE RIEUL YE KIYEOKSIOS
+ {0x8ECB, 0xB845}, //2441 #HANGUL SYLLABLE RIEUL YE NIEUNCIEUC
+ {0x8ECC, 0xB846}, //2442 #HANGUL SYLLABLE RIEUL YE NIEUNHIEUH
+ {0x8ECD, 0xB847}, //2443 #HANGUL SYLLABLE RIEUL YE TIKEUT
+ {0x8ECE, 0xB848}, //2444 #HANGUL SYLLABLE RIEUL YE RIEUL
+ {0x8ECF, 0xB849}, //2445 #HANGUL SYLLABLE RIEUL YE RIEULKIYEOK
+ {0x8ED0, 0xB84A}, //2446 #HANGUL SYLLABLE RIEUL YE RIEULMIEUM
+ {0x8ED1, 0xB84B}, //2447 #HANGUL SYLLABLE RIEUL YE RIEULPIEUP
+ {0x8ED2, 0xB84C}, //2448 #HANGUL SYLLABLE RIEUL YE RIEULSIOS
+ {0x8ED3, 0xB84D}, //2449 #HANGUL SYLLABLE RIEUL YE RIEULTHIEUTH
+ {0x8ED4, 0xB84E}, //2450 #HANGUL SYLLABLE RIEUL YE RIEULPHIEUPH
+ {0x8ED5, 0xB84F}, //2451 #HANGUL SYLLABLE RIEUL YE RIEULHIEUH
+ {0x8ED6, 0xB850}, //2452 #HANGUL SYLLABLE RIEUL YE MIEUM
+ {0x8ED7, 0xB852}, //2453 #HANGUL SYLLABLE RIEUL YE PIEUPSIOS
+ {0x8ED8, 0xB854}, //2454 #HANGUL SYLLABLE RIEUL YE SSANGSIOS
+ {0x8ED9, 0xB855}, //2455 #HANGUL SYLLABLE RIEUL YE IEUNG
+ {0x8EDA, 0xB856}, //2456 #HANGUL SYLLABLE RIEUL YE CIEUC
+ {0x8EDB, 0xB857}, //2457 #HANGUL SYLLABLE RIEUL YE CHIEUCH
+ {0x8EDC, 0xB858}, //2458 #HANGUL SYLLABLE RIEUL YE KHIEUKH
+ {0x8EDD, 0xB859}, //2459 #HANGUL SYLLABLE RIEUL YE THIEUTH
+ {0x8EDE, 0xB85A}, //2460 #HANGUL SYLLABLE RIEUL YE PHIEUPH
+ {0x8EDF, 0xB85B}, //2461 #HANGUL SYLLABLE RIEUL YE HIEUH
+ {0x8EE0, 0xB85E}, //2462 #HANGUL SYLLABLE RIEUL O SSANGKIYEOK
+ {0x8EE1, 0xB85F}, //2463 #HANGUL SYLLABLE RIEUL O KIYEOKSIOS
+ {0x8EE2, 0xB861}, //2464 #HANGUL SYLLABLE RIEUL O NIEUNCIEUC
+ {0x8EE3, 0xB862}, //2465 #HANGUL SYLLABLE RIEUL O NIEUNHIEUH
+ {0x8EE4, 0xB863}, //2466 #HANGUL SYLLABLE RIEUL O TIKEUT
+ {0x8EE5, 0xB865}, //2467 #HANGUL SYLLABLE RIEUL O RIEULKIYEOK
+ {0x8EE6, 0xB866}, //2468 #HANGUL SYLLABLE RIEUL O RIEULMIEUM
+ {0x8EE7, 0xB867}, //2469 #HANGUL SYLLABLE RIEUL O RIEULPIEUP
+ {0x8EE8, 0xB868}, //2470 #HANGUL SYLLABLE RIEUL O RIEULSIOS
+ {0x8EE9, 0xB869}, //2471 #HANGUL SYLLABLE RIEUL O RIEULTHIEUTH
+ {0x8EEA, 0xB86A}, //2472 #HANGUL SYLLABLE RIEUL O RIEULPHIEUPH
+ {0x8EEB, 0xB86B}, //2473 #HANGUL SYLLABLE RIEUL O RIEULHIEUH
+ {0x8EEC, 0xB86E}, //2474 #HANGUL SYLLABLE RIEUL O PIEUPSIOS
+ {0x8EED, 0xB870}, //2475 #HANGUL SYLLABLE RIEUL O SSANGSIOS
+ {0x8EEE, 0xB872}, //2476 #HANGUL SYLLABLE RIEUL O CIEUC
+ {0x8EEF, 0xB873}, //2477 #HANGUL SYLLABLE RIEUL O CHIEUCH
+ {0x8EF0, 0xB874}, //2478 #HANGUL SYLLABLE RIEUL O KHIEUKH
+ {0x8EF1, 0xB875}, //2479 #HANGUL SYLLABLE RIEUL O THIEUTH
+ {0x8EF2, 0xB876}, //2480 #HANGUL SYLLABLE RIEUL O PHIEUPH
+ {0x8EF3, 0xB877}, //2481 #HANGUL SYLLABLE RIEUL O HIEUH
+ {0x8EF4, 0xB879}, //2482 #HANGUL SYLLABLE RIEUL WA KIYEOK
+ {0x8EF5, 0xB87A}, //2483 #HANGUL SYLLABLE RIEUL WA SSANGKIYEOK
+ {0x8EF6, 0xB87B}, //2484 #HANGUL SYLLABLE RIEUL WA KIYEOKSIOS
+ {0x8EF7, 0xB87D}, //2485 #HANGUL SYLLABLE RIEUL WA NIEUNCIEUC
+ {0x8EF8, 0xB87E}, //2486 #HANGUL SYLLABLE RIEUL WA NIEUNHIEUH
+ {0x8EF9, 0xB87F}, //2487 #HANGUL SYLLABLE RIEUL WA TIKEUT
+ {0x8EFA, 0xB880}, //2488 #HANGUL SYLLABLE RIEUL WA RIEUL
+ {0x8EFB, 0xB881}, //2489 #HANGUL SYLLABLE RIEUL WA RIEULKIYEOK
+ {0x8EFC, 0xB882}, //2490 #HANGUL SYLLABLE RIEUL WA RIEULMIEUM
+ {0x8EFD, 0xB883}, //2491 #HANGUL SYLLABLE RIEUL WA RIEULPIEUP
+ {0x8EFE, 0xB884}, //2492 #HANGUL SYLLABLE RIEUL WA RIEULSIOS
+ {0x8F41, 0xB885}, //2493 #HANGUL SYLLABLE RIEUL WA RIEULTHIEUTH
+ {0x8F42, 0xB886}, //2494 #HANGUL SYLLABLE RIEUL WA RIEULPHIEUPH
+ {0x8F43, 0xB887}, //2495 #HANGUL SYLLABLE RIEUL WA RIEULHIEUH
+ {0x8F44, 0xB888}, //2496 #HANGUL SYLLABLE RIEUL WA MIEUM
+ {0x8F45, 0xB889}, //2497 #HANGUL SYLLABLE RIEUL WA PIEUP
+ {0x8F46, 0xB88A}, //2498 #HANGUL SYLLABLE RIEUL WA PIEUPSIOS
+ {0x8F47, 0xB88B}, //2499 #HANGUL SYLLABLE RIEUL WA SIOS
+ {0x8F48, 0xB88C}, //2500 #HANGUL SYLLABLE RIEUL WA SSANGSIOS
+ {0x8F49, 0xB88E}, //2501 #HANGUL SYLLABLE RIEUL WA CIEUC
+ {0x8F4A, 0xB88F}, //2502 #HANGUL SYLLABLE RIEUL WA CHIEUCH
+ {0x8F4B, 0xB890}, //2503 #HANGUL SYLLABLE RIEUL WA KHIEUKH
+ {0x8F4C, 0xB891}, //2504 #HANGUL SYLLABLE RIEUL WA THIEUTH
+ {0x8F4D, 0xB892}, //2505 #HANGUL SYLLABLE RIEUL WA PHIEUPH
+ {0x8F4E, 0xB893}, //2506 #HANGUL SYLLABLE RIEUL WA HIEUH
+ {0x8F4F, 0xB894}, //2507 #HANGUL SYLLABLE RIEUL WAE
+ {0x8F50, 0xB895}, //2508 #HANGUL SYLLABLE RIEUL WAE KIYEOK
+ {0x8F51, 0xB896}, //2509 #HANGUL SYLLABLE RIEUL WAE SSANGKIYEOK
+ {0x8F52, 0xB897}, //2510 #HANGUL SYLLABLE RIEUL WAE KIYEOKSIOS
+ {0x8F53, 0xB898}, //2511 #HANGUL SYLLABLE RIEUL WAE NIEUN
+ {0x8F54, 0xB899}, //2512 #HANGUL SYLLABLE RIEUL WAE NIEUNCIEUC
+ {0x8F55, 0xB89A}, //2513 #HANGUL SYLLABLE RIEUL WAE NIEUNHIEUH
+ {0x8F56, 0xB89B}, //2514 #HANGUL SYLLABLE RIEUL WAE TIKEUT
+ {0x8F57, 0xB89C}, //2515 #HANGUL SYLLABLE RIEUL WAE RIEUL
+ {0x8F58, 0xB89D}, //2516 #HANGUL SYLLABLE RIEUL WAE RIEULKIYEOK
+ {0x8F59, 0xB89E}, //2517 #HANGUL SYLLABLE RIEUL WAE RIEULMIEUM
+ {0x8F5A, 0xB89F}, //2518 #HANGUL SYLLABLE RIEUL WAE RIEULPIEUP
+ {0x8F61, 0xB8A0}, //2519 #HANGUL SYLLABLE RIEUL WAE RIEULSIOS
+ {0x8F62, 0xB8A1}, //2520 #HANGUL SYLLABLE RIEUL WAE RIEULTHIEUTH
+ {0x8F63, 0xB8A2}, //2521 #HANGUL SYLLABLE RIEUL WAE RIEULPHIEUPH
+ {0x8F64, 0xB8A3}, //2522 #HANGUL SYLLABLE RIEUL WAE RIEULHIEUH
+ {0x8F65, 0xB8A4}, //2523 #HANGUL SYLLABLE RIEUL WAE MIEUM
+ {0x8F66, 0xB8A5}, //2524 #HANGUL SYLLABLE RIEUL WAE PIEUP
+ {0x8F67, 0xB8A6}, //2525 #HANGUL SYLLABLE RIEUL WAE PIEUPSIOS
+ {0x8F68, 0xB8A7}, //2526 #HANGUL SYLLABLE RIEUL WAE SIOS
+ {0x8F69, 0xB8A9}, //2527 #HANGUL SYLLABLE RIEUL WAE IEUNG
+ {0x8F6A, 0xB8AA}, //2528 #HANGUL SYLLABLE RIEUL WAE CIEUC
+ {0x8F6B, 0xB8AB}, //2529 #HANGUL SYLLABLE RIEUL WAE CHIEUCH
+ {0x8F6C, 0xB8AC}, //2530 #HANGUL SYLLABLE RIEUL WAE KHIEUKH
+ {0x8F6D, 0xB8AD}, //2531 #HANGUL SYLLABLE RIEUL WAE THIEUTH
+ {0x8F6E, 0xB8AE}, //2532 #HANGUL SYLLABLE RIEUL WAE PHIEUPH
+ {0x8F6F, 0xB8AF}, //2533 #HANGUL SYLLABLE RIEUL WAE HIEUH
+ {0x8F70, 0xB8B1}, //2534 #HANGUL SYLLABLE RIEUL OE KIYEOK
+ {0x8F71, 0xB8B2}, //2535 #HANGUL SYLLABLE RIEUL OE SSANGKIYEOK
+ {0x8F72, 0xB8B3}, //2536 #HANGUL SYLLABLE RIEUL OE KIYEOKSIOS
+ {0x8F73, 0xB8B5}, //2537 #HANGUL SYLLABLE RIEUL OE NIEUNCIEUC
+ {0x8F74, 0xB8B6}, //2538 #HANGUL SYLLABLE RIEUL OE NIEUNHIEUH
+ {0x8F75, 0xB8B7}, //2539 #HANGUL SYLLABLE RIEUL OE TIKEUT
+ {0x8F76, 0xB8B9}, //2540 #HANGUL SYLLABLE RIEUL OE RIEULKIYEOK
+ {0x8F77, 0xB8BA}, //2541 #HANGUL SYLLABLE RIEUL OE RIEULMIEUM
+ {0x8F78, 0xB8BB}, //2542 #HANGUL SYLLABLE RIEUL OE RIEULPIEUP
+ {0x8F79, 0xB8BC}, //2543 #HANGUL SYLLABLE RIEUL OE RIEULSIOS
+ {0x8F7A, 0xB8BD}, //2544 #HANGUL SYLLABLE RIEUL OE RIEULTHIEUTH
+ {0x8F81, 0xB8BE}, //2545 #HANGUL SYLLABLE RIEUL OE RIEULPHIEUPH
+ {0x8F82, 0xB8BF}, //2546 #HANGUL SYLLABLE RIEUL OE RIEULHIEUH
+ {0x8F83, 0xB8C2}, //2547 #HANGUL SYLLABLE RIEUL OE PIEUPSIOS
+ {0x8F84, 0xB8C4}, //2548 #HANGUL SYLLABLE RIEUL OE SSANGSIOS
+ {0x8F85, 0xB8C6}, //2549 #HANGUL SYLLABLE RIEUL OE CIEUC
+ {0x8F86, 0xB8C7}, //2550 #HANGUL SYLLABLE RIEUL OE CHIEUCH
+ {0x8F87, 0xB8C8}, //2551 #HANGUL SYLLABLE RIEUL OE KHIEUKH
+ {0x8F88, 0xB8C9}, //2552 #HANGUL SYLLABLE RIEUL OE THIEUTH
+ {0x8F89, 0xB8CA}, //2553 #HANGUL SYLLABLE RIEUL OE PHIEUPH
+ {0x8F8A, 0xB8CB}, //2554 #HANGUL SYLLABLE RIEUL OE HIEUH
+ {0x8F8B, 0xB8CD}, //2555 #HANGUL SYLLABLE RIEUL YO KIYEOK
+ {0x8F8C, 0xB8CE}, //2556 #HANGUL SYLLABLE RIEUL YO SSANGKIYEOK
+ {0x8F8D, 0xB8CF}, //2557 #HANGUL SYLLABLE RIEUL YO KIYEOKSIOS
+ {0x8F8E, 0xB8D1}, //2558 #HANGUL SYLLABLE RIEUL YO NIEUNCIEUC
+ {0x8F8F, 0xB8D2}, //2559 #HANGUL SYLLABLE RIEUL YO NIEUNHIEUH
+ {0x8F90, 0xB8D3}, //2560 #HANGUL SYLLABLE RIEUL YO TIKEUT
+ {0x8F91, 0xB8D5}, //2561 #HANGUL SYLLABLE RIEUL YO RIEULKIYEOK
+ {0x8F92, 0xB8D6}, //2562 #HANGUL SYLLABLE RIEUL YO RIEULMIEUM
+ {0x8F93, 0xB8D7}, //2563 #HANGUL SYLLABLE RIEUL YO RIEULPIEUP
+ {0x8F94, 0xB8D8}, //2564 #HANGUL SYLLABLE RIEUL YO RIEULSIOS
+ {0x8F95, 0xB8D9}, //2565 #HANGUL SYLLABLE RIEUL YO RIEULTHIEUTH
+ {0x8F96, 0xB8DA}, //2566 #HANGUL SYLLABLE RIEUL YO RIEULPHIEUPH
+ {0x8F97, 0xB8DB}, //2567 #HANGUL SYLLABLE RIEUL YO RIEULHIEUH
+ {0x8F98, 0xB8DC}, //2568 #HANGUL SYLLABLE RIEUL YO MIEUM
+ {0x8F99, 0xB8DE}, //2569 #HANGUL SYLLABLE RIEUL YO PIEUPSIOS
+ {0x8F9A, 0xB8E0}, //2570 #HANGUL SYLLABLE RIEUL YO SSANGSIOS
+ {0x8F9B, 0xB8E2}, //2571 #HANGUL SYLLABLE RIEUL YO CIEUC
+ {0x8F9C, 0xB8E3}, //2572 #HANGUL SYLLABLE RIEUL YO CHIEUCH
+ {0x8F9D, 0xB8E4}, //2573 #HANGUL SYLLABLE RIEUL YO KHIEUKH
+ {0x8F9E, 0xB8E5}, //2574 #HANGUL SYLLABLE RIEUL YO THIEUTH
+ {0x8F9F, 0xB8E6}, //2575 #HANGUL SYLLABLE RIEUL YO PHIEUPH
+ {0x8FA0, 0xB8E7}, //2576 #HANGUL SYLLABLE RIEUL YO HIEUH
+ {0x8FA1, 0xB8EA}, //2577 #HANGUL SYLLABLE RIEUL U SSANGKIYEOK
+ {0x8FA2, 0xB8EB}, //2578 #HANGUL SYLLABLE RIEUL U KIYEOKSIOS
+ {0x8FA3, 0xB8ED}, //2579 #HANGUL SYLLABLE RIEUL U NIEUNCIEUC
+ {0x8FA4, 0xB8EE}, //2580 #HANGUL SYLLABLE RIEUL U NIEUNHIEUH
+ {0x8FA5, 0xB8EF}, //2581 #HANGUL SYLLABLE RIEUL U TIKEUT
+ {0x8FA6, 0xB8F1}, //2582 #HANGUL SYLLABLE RIEUL U RIEULKIYEOK
+ {0x8FA7, 0xB8F2}, //2583 #HANGUL SYLLABLE RIEUL U RIEULMIEUM
+ {0x8FA8, 0xB8F3}, //2584 #HANGUL SYLLABLE RIEUL U RIEULPIEUP
+ {0x8FA9, 0xB8F4}, //2585 #HANGUL SYLLABLE RIEUL U RIEULSIOS
+ {0x8FAA, 0xB8F5}, //2586 #HANGUL SYLLABLE RIEUL U RIEULTHIEUTH
+ {0x8FAB, 0xB8F6}, //2587 #HANGUL SYLLABLE RIEUL U RIEULPHIEUPH
+ {0x8FAC, 0xB8F7}, //2588 #HANGUL SYLLABLE RIEUL U RIEULHIEUH
+ {0x8FAD, 0xB8FA}, //2589 #HANGUL SYLLABLE RIEUL U PIEUPSIOS
+ {0x8FAE, 0xB8FC}, //2590 #HANGUL SYLLABLE RIEUL U SSANGSIOS
+ {0x8FAF, 0xB8FE}, //2591 #HANGUL SYLLABLE RIEUL U CIEUC
+ {0x8FB0, 0xB8FF}, //2592 #HANGUL SYLLABLE RIEUL U CHIEUCH
+ {0x8FB1, 0xB900}, //2593 #HANGUL SYLLABLE RIEUL U KHIEUKH
+ {0x8FB2, 0xB901}, //2594 #HANGUL SYLLABLE RIEUL U THIEUTH
+ {0x8FB3, 0xB902}, //2595 #HANGUL SYLLABLE RIEUL U PHIEUPH
+ {0x8FB4, 0xB903}, //2596 #HANGUL SYLLABLE RIEUL U HIEUH
+ {0x8FB5, 0xB905}, //2597 #HANGUL SYLLABLE RIEUL WEO KIYEOK
+ {0x8FB6, 0xB906}, //2598 #HANGUL SYLLABLE RIEUL WEO SSANGKIYEOK
+ {0x8FB7, 0xB907}, //2599 #HANGUL SYLLABLE RIEUL WEO KIYEOKSIOS
+ {0x8FB8, 0xB908}, //2600 #HANGUL SYLLABLE RIEUL WEO NIEUN
+ {0x8FB9, 0xB909}, //2601 #HANGUL SYLLABLE RIEUL WEO NIEUNCIEUC
+ {0x8FBA, 0xB90A}, //2602 #HANGUL SYLLABLE RIEUL WEO NIEUNHIEUH
+ {0x8FBB, 0xB90B}, //2603 #HANGUL SYLLABLE RIEUL WEO TIKEUT
+ {0x8FBC, 0xB90C}, //2604 #HANGUL SYLLABLE RIEUL WEO RIEUL
+ {0x8FBD, 0xB90D}, //2605 #HANGUL SYLLABLE RIEUL WEO RIEULKIYEOK
+ {0x8FBE, 0xB90E}, //2606 #HANGUL SYLLABLE RIEUL WEO RIEULMIEUM
+ {0x8FBF, 0xB90F}, //2607 #HANGUL SYLLABLE RIEUL WEO RIEULPIEUP
+ {0x8FC0, 0xB910}, //2608 #HANGUL SYLLABLE RIEUL WEO RIEULSIOS
+ {0x8FC1, 0xB911}, //2609 #HANGUL SYLLABLE RIEUL WEO RIEULTHIEUTH
+ {0x8FC2, 0xB912}, //2610 #HANGUL SYLLABLE RIEUL WEO RIEULPHIEUPH
+ {0x8FC3, 0xB913}, //2611 #HANGUL SYLLABLE RIEUL WEO RIEULHIEUH
+ {0x8FC4, 0xB914}, //2612 #HANGUL SYLLABLE RIEUL WEO MIEUM
+ {0x8FC5, 0xB915}, //2613 #HANGUL SYLLABLE RIEUL WEO PIEUP
+ {0x8FC6, 0xB916}, //2614 #HANGUL SYLLABLE RIEUL WEO PIEUPSIOS
+ {0x8FC7, 0xB917}, //2615 #HANGUL SYLLABLE RIEUL WEO SIOS
+ {0x8FC8, 0xB919}, //2616 #HANGUL SYLLABLE RIEUL WEO IEUNG
+ {0x8FC9, 0xB91A}, //2617 #HANGUL SYLLABLE RIEUL WEO CIEUC
+ {0x8FCA, 0xB91B}, //2618 #HANGUL SYLLABLE RIEUL WEO CHIEUCH
+ {0x8FCB, 0xB91C}, //2619 #HANGUL SYLLABLE RIEUL WEO KHIEUKH
+ {0x8FCC, 0xB91D}, //2620 #HANGUL SYLLABLE RIEUL WEO THIEUTH
+ {0x8FCD, 0xB91E}, //2621 #HANGUL SYLLABLE RIEUL WEO PHIEUPH
+ {0x8FCE, 0xB91F}, //2622 #HANGUL SYLLABLE RIEUL WEO HIEUH
+ {0x8FCF, 0xB921}, //2623 #HANGUL SYLLABLE RIEUL WE KIYEOK
+ {0x8FD0, 0xB922}, //2624 #HANGUL SYLLABLE RIEUL WE SSANGKIYEOK
+ {0x8FD1, 0xB923}, //2625 #HANGUL SYLLABLE RIEUL WE KIYEOKSIOS
+ {0x8FD2, 0xB924}, //2626 #HANGUL SYLLABLE RIEUL WE NIEUN
+ {0x8FD3, 0xB925}, //2627 #HANGUL SYLLABLE RIEUL WE NIEUNCIEUC
+ {0x8FD4, 0xB926}, //2628 #HANGUL SYLLABLE RIEUL WE NIEUNHIEUH
+ {0x8FD5, 0xB927}, //2629 #HANGUL SYLLABLE RIEUL WE TIKEUT
+ {0x8FD6, 0xB928}, //2630 #HANGUL SYLLABLE RIEUL WE RIEUL
+ {0x8FD7, 0xB929}, //2631 #HANGUL SYLLABLE RIEUL WE RIEULKIYEOK
+ {0x8FD8, 0xB92A}, //2632 #HANGUL SYLLABLE RIEUL WE RIEULMIEUM
+ {0x8FD9, 0xB92B}, //2633 #HANGUL SYLLABLE RIEUL WE RIEULPIEUP
+ {0x8FDA, 0xB92C}, //2634 #HANGUL SYLLABLE RIEUL WE RIEULSIOS
+ {0x8FDB, 0xB92D}, //2635 #HANGUL SYLLABLE RIEUL WE RIEULTHIEUTH
+ {0x8FDC, 0xB92E}, //2636 #HANGUL SYLLABLE RIEUL WE RIEULPHIEUPH
+ {0x8FDD, 0xB92F}, //2637 #HANGUL SYLLABLE RIEUL WE RIEULHIEUH
+ {0x8FDE, 0xB930}, //2638 #HANGUL SYLLABLE RIEUL WE MIEUM
+ {0x8FDF, 0xB931}, //2639 #HANGUL SYLLABLE RIEUL WE PIEUP
+ {0x8FE0, 0xB932}, //2640 #HANGUL SYLLABLE RIEUL WE PIEUPSIOS
+ {0x8FE1, 0xB933}, //2641 #HANGUL SYLLABLE RIEUL WE SIOS
+ {0x8FE2, 0xB934}, //2642 #HANGUL SYLLABLE RIEUL WE SSANGSIOS
+ {0x8FE3, 0xB935}, //2643 #HANGUL SYLLABLE RIEUL WE IEUNG
+ {0x8FE4, 0xB936}, //2644 #HANGUL SYLLABLE RIEUL WE CIEUC
+ {0x8FE5, 0xB937}, //2645 #HANGUL SYLLABLE RIEUL WE CHIEUCH
+ {0x8FE6, 0xB938}, //2646 #HANGUL SYLLABLE RIEUL WE KHIEUKH
+ {0x8FE7, 0xB939}, //2647 #HANGUL SYLLABLE RIEUL WE THIEUTH
+ {0x8FE8, 0xB93A}, //2648 #HANGUL SYLLABLE RIEUL WE PHIEUPH
+ {0x8FE9, 0xB93B}, //2649 #HANGUL SYLLABLE RIEUL WE HIEUH
+ {0x8FEA, 0xB93E}, //2650 #HANGUL SYLLABLE RIEUL WI SSANGKIYEOK
+ {0x8FEB, 0xB93F}, //2651 #HANGUL SYLLABLE RIEUL WI KIYEOKSIOS
+ {0x8FEC, 0xB941}, //2652 #HANGUL SYLLABLE RIEUL WI NIEUNCIEUC
+ {0x8FED, 0xB942}, //2653 #HANGUL SYLLABLE RIEUL WI NIEUNHIEUH
+ {0x8FEE, 0xB943}, //2654 #HANGUL SYLLABLE RIEUL WI TIKEUT
+ {0x8FEF, 0xB945}, //2655 #HANGUL SYLLABLE RIEUL WI RIEULKIYEOK
+ {0x8FF0, 0xB946}, //2656 #HANGUL SYLLABLE RIEUL WI RIEULMIEUM
+ {0x8FF1, 0xB947}, //2657 #HANGUL SYLLABLE RIEUL WI RIEULPIEUP
+ {0x8FF2, 0xB948}, //2658 #HANGUL SYLLABLE RIEUL WI RIEULSIOS
+ {0x8FF3, 0xB949}, //2659 #HANGUL SYLLABLE RIEUL WI RIEULTHIEUTH
+ {0x8FF4, 0xB94A}, //2660 #HANGUL SYLLABLE RIEUL WI RIEULPHIEUPH
+ {0x8FF5, 0xB94B}, //2661 #HANGUL SYLLABLE RIEUL WI RIEULHIEUH
+ {0x8FF6, 0xB94D}, //2662 #HANGUL SYLLABLE RIEUL WI PIEUP
+ {0x8FF7, 0xB94E}, //2663 #HANGUL SYLLABLE RIEUL WI PIEUPSIOS
+ {0x8FF8, 0xB950}, //2664 #HANGUL SYLLABLE RIEUL WI SSANGSIOS
+ {0x8FF9, 0xB952}, //2665 #HANGUL SYLLABLE RIEUL WI CIEUC
+ {0x8FFA, 0xB953}, //2666 #HANGUL SYLLABLE RIEUL WI CHIEUCH
+ {0x8FFB, 0xB954}, //2667 #HANGUL SYLLABLE RIEUL WI KHIEUKH
+ {0x8FFC, 0xB955}, //2668 #HANGUL SYLLABLE RIEUL WI THIEUTH
+ {0x8FFD, 0xB956}, //2669 #HANGUL SYLLABLE RIEUL WI PHIEUPH
+ {0x8FFE, 0xB957}, //2670 #HANGUL SYLLABLE RIEUL WI HIEUH
+ {0x9041, 0xB95A}, //2671 #HANGUL SYLLABLE RIEUL YU SSANGKIYEOK
+ {0x9042, 0xB95B}, //2672 #HANGUL SYLLABLE RIEUL YU KIYEOKSIOS
+ {0x9043, 0xB95D}, //2673 #HANGUL SYLLABLE RIEUL YU NIEUNCIEUC
+ {0x9044, 0xB95E}, //2674 #HANGUL SYLLABLE RIEUL YU NIEUNHIEUH
+ {0x9045, 0xB95F}, //2675 #HANGUL SYLLABLE RIEUL YU TIKEUT
+ {0x9046, 0xB961}, //2676 #HANGUL SYLLABLE RIEUL YU RIEULKIYEOK
+ {0x9047, 0xB962}, //2677 #HANGUL SYLLABLE RIEUL YU RIEULMIEUM
+ {0x9048, 0xB963}, //2678 #HANGUL SYLLABLE RIEUL YU RIEULPIEUP
+ {0x9049, 0xB964}, //2679 #HANGUL SYLLABLE RIEUL YU RIEULSIOS
+ {0x904A, 0xB965}, //2680 #HANGUL SYLLABLE RIEUL YU RIEULTHIEUTH
+ {0x904B, 0xB966}, //2681 #HANGUL SYLLABLE RIEUL YU RIEULPHIEUPH
+ {0x904C, 0xB967}, //2682 #HANGUL SYLLABLE RIEUL YU RIEULHIEUH
+ {0x904D, 0xB96A}, //2683 #HANGUL SYLLABLE RIEUL YU PIEUPSIOS
+ {0x904E, 0xB96C}, //2684 #HANGUL SYLLABLE RIEUL YU SSANGSIOS
+ {0x904F, 0xB96E}, //2685 #HANGUL SYLLABLE RIEUL YU CIEUC
+ {0x9050, 0xB96F}, //2686 #HANGUL SYLLABLE RIEUL YU CHIEUCH
+ {0x9051, 0xB970}, //2687 #HANGUL SYLLABLE RIEUL YU KHIEUKH
+ {0x9052, 0xB971}, //2688 #HANGUL SYLLABLE RIEUL YU THIEUTH
+ {0x9053, 0xB972}, //2689 #HANGUL SYLLABLE RIEUL YU PHIEUPH
+ {0x9054, 0xB973}, //2690 #HANGUL SYLLABLE RIEUL YU HIEUH
+ {0x9055, 0xB976}, //2691 #HANGUL SYLLABLE RIEUL EU SSANGKIYEOK
+ {0x9056, 0xB977}, //2692 #HANGUL SYLLABLE RIEUL EU KIYEOKSIOS
+ {0x9057, 0xB979}, //2693 #HANGUL SYLLABLE RIEUL EU NIEUNCIEUC
+ {0x9058, 0xB97A}, //2694 #HANGUL SYLLABLE RIEUL EU NIEUNHIEUH
+ {0x9059, 0xB97B}, //2695 #HANGUL SYLLABLE RIEUL EU TIKEUT
+ {0x905A, 0xB97D}, //2696 #HANGUL SYLLABLE RIEUL EU RIEULKIYEOK
+ {0x9061, 0xB97E}, //2697 #HANGUL SYLLABLE RIEUL EU RIEULMIEUM
+ {0x9062, 0xB97F}, //2698 #HANGUL SYLLABLE RIEUL EU RIEULPIEUP
+ {0x9063, 0xB980}, //2699 #HANGUL SYLLABLE RIEUL EU RIEULSIOS
+ {0x9064, 0xB981}, //2700 #HANGUL SYLLABLE RIEUL EU RIEULTHIEUTH
+ {0x9065, 0xB982}, //2701 #HANGUL SYLLABLE RIEUL EU RIEULPHIEUPH
+ {0x9066, 0xB983}, //2702 #HANGUL SYLLABLE RIEUL EU RIEULHIEUH
+ {0x9067, 0xB986}, //2703 #HANGUL SYLLABLE RIEUL EU PIEUPSIOS
+ {0x9068, 0xB988}, //2704 #HANGUL SYLLABLE RIEUL EU SSANGSIOS
+ {0x9069, 0xB98B}, //2705 #HANGUL SYLLABLE RIEUL EU CHIEUCH
+ {0x906A, 0xB98C}, //2706 #HANGUL SYLLABLE RIEUL EU KHIEUKH
+ {0x906B, 0xB98F}, //2707 #HANGUL SYLLABLE RIEUL EU HIEUH
+ {0x906C, 0xB990}, //2708 #HANGUL SYLLABLE RIEUL YI
+ {0x906D, 0xB991}, //2709 #HANGUL SYLLABLE RIEUL YI KIYEOK
+ {0x906E, 0xB992}, //2710 #HANGUL SYLLABLE RIEUL YI SSANGKIYEOK
+ {0x906F, 0xB993}, //2711 #HANGUL SYLLABLE RIEUL YI KIYEOKSIOS
+ {0x9070, 0xB994}, //2712 #HANGUL SYLLABLE RIEUL YI NIEUN
+ {0x9071, 0xB995}, //2713 #HANGUL SYLLABLE RIEUL YI NIEUNCIEUC
+ {0x9072, 0xB996}, //2714 #HANGUL SYLLABLE RIEUL YI NIEUNHIEUH
+ {0x9073, 0xB997}, //2715 #HANGUL SYLLABLE RIEUL YI TIKEUT
+ {0x9074, 0xB998}, //2716 #HANGUL SYLLABLE RIEUL YI RIEUL
+ {0x9075, 0xB999}, //2717 #HANGUL SYLLABLE RIEUL YI RIEULKIYEOK
+ {0x9076, 0xB99A}, //2718 #HANGUL SYLLABLE RIEUL YI RIEULMIEUM
+ {0x9077, 0xB99B}, //2719 #HANGUL SYLLABLE RIEUL YI RIEULPIEUP
+ {0x9078, 0xB99C}, //2720 #HANGUL SYLLABLE RIEUL YI RIEULSIOS
+ {0x9079, 0xB99D}, //2721 #HANGUL SYLLABLE RIEUL YI RIEULTHIEUTH
+ {0x907A, 0xB99E}, //2722 #HANGUL SYLLABLE RIEUL YI RIEULPHIEUPH
+ {0x9081, 0xB99F}, //2723 #HANGUL SYLLABLE RIEUL YI RIEULHIEUH
+ {0x9082, 0xB9A0}, //2724 #HANGUL SYLLABLE RIEUL YI MIEUM
+ {0x9083, 0xB9A1}, //2725 #HANGUL SYLLABLE RIEUL YI PIEUP
+ {0x9084, 0xB9A2}, //2726 #HANGUL SYLLABLE RIEUL YI PIEUPSIOS
+ {0x9085, 0xB9A3}, //2727 #HANGUL SYLLABLE RIEUL YI SIOS
+ {0x9086, 0xB9A4}, //2728 #HANGUL SYLLABLE RIEUL YI SSANGSIOS
+ {0x9087, 0xB9A5}, //2729 #HANGUL SYLLABLE RIEUL YI IEUNG
+ {0x9088, 0xB9A6}, //2730 #HANGUL SYLLABLE RIEUL YI CIEUC
+ {0x9089, 0xB9A7}, //2731 #HANGUL SYLLABLE RIEUL YI CHIEUCH
+ {0x908A, 0xB9A8}, //2732 #HANGUL SYLLABLE RIEUL YI KHIEUKH
+ {0x908B, 0xB9A9}, //2733 #HANGUL SYLLABLE RIEUL YI THIEUTH
+ {0x908C, 0xB9AA}, //2734 #HANGUL SYLLABLE RIEUL YI PHIEUPH
+ {0x908D, 0xB9AB}, //2735 #HANGUL SYLLABLE RIEUL YI HIEUH
+ {0x908E, 0xB9AE}, //2736 #HANGUL SYLLABLE RIEUL I SSANGKIYEOK
+ {0x908F, 0xB9AF}, //2737 #HANGUL SYLLABLE RIEUL I KIYEOKSIOS
+ {0x9090, 0xB9B1}, //2738 #HANGUL SYLLABLE RIEUL I NIEUNCIEUC
+ {0x9091, 0xB9B2}, //2739 #HANGUL SYLLABLE RIEUL I NIEUNHIEUH
+ {0x9092, 0xB9B3}, //2740 #HANGUL SYLLABLE RIEUL I TIKEUT
+ {0x9093, 0xB9B5}, //2741 #HANGUL SYLLABLE RIEUL I RIEULKIYEOK
+ {0x9094, 0xB9B6}, //2742 #HANGUL SYLLABLE RIEUL I RIEULMIEUM
+ {0x9095, 0xB9B7}, //2743 #HANGUL SYLLABLE RIEUL I RIEULPIEUP
+ {0x9096, 0xB9B8}, //2744 #HANGUL SYLLABLE RIEUL I RIEULSIOS
+ {0x9097, 0xB9B9}, //2745 #HANGUL SYLLABLE RIEUL I RIEULTHIEUTH
+ {0x9098, 0xB9BA}, //2746 #HANGUL SYLLABLE RIEUL I RIEULPHIEUPH
+ {0x9099, 0xB9BB}, //2747 #HANGUL SYLLABLE RIEUL I RIEULHIEUH
+ {0x909A, 0xB9BE}, //2748 #HANGUL SYLLABLE RIEUL I PIEUPSIOS
+ {0x909B, 0xB9C0}, //2749 #HANGUL SYLLABLE RIEUL I SSANGSIOS
+ {0x909C, 0xB9C2}, //2750 #HANGUL SYLLABLE RIEUL I CIEUC
+ {0x909D, 0xB9C3}, //2751 #HANGUL SYLLABLE RIEUL I CHIEUCH
+ {0x909E, 0xB9C4}, //2752 #HANGUL SYLLABLE RIEUL I KHIEUKH
+ {0x909F, 0xB9C5}, //2753 #HANGUL SYLLABLE RIEUL I THIEUTH
+ {0x90A0, 0xB9C6}, //2754 #HANGUL SYLLABLE RIEUL I PHIEUPH
+ {0x90A1, 0xB9C7}, //2755 #HANGUL SYLLABLE RIEUL I HIEUH
+ {0x90A2, 0xB9CA}, //2756 #HANGUL SYLLABLE MIEUM A SSANGKIYEOK
+ {0x90A3, 0xB9CB}, //2757 #HANGUL SYLLABLE MIEUM A KIYEOKSIOS
+ {0x90A4, 0xB9CD}, //2758 #HANGUL SYLLABLE MIEUM A NIEUNCIEUC
+ {0x90A5, 0xB9D3}, //2759 #HANGUL SYLLABLE MIEUM A RIEULPIEUP
+ {0x90A6, 0xB9D4}, //2760 #HANGUL SYLLABLE MIEUM A RIEULSIOS
+ {0x90A7, 0xB9D5}, //2761 #HANGUL SYLLABLE MIEUM A RIEULTHIEUTH
+ {0x90A8, 0xB9D6}, //2762 #HANGUL SYLLABLE MIEUM A RIEULPHIEUPH
+ {0x90A9, 0xB9D7}, //2763 #HANGUL SYLLABLE MIEUM A RIEULHIEUH
+ {0x90AA, 0xB9DA}, //2764 #HANGUL SYLLABLE MIEUM A PIEUPSIOS
+ {0x90AB, 0xB9DC}, //2765 #HANGUL SYLLABLE MIEUM A SSANGSIOS
+ {0x90AC, 0xB9DF}, //2766 #HANGUL SYLLABLE MIEUM A CHIEUCH
+ {0x90AD, 0xB9E0}, //2767 #HANGUL SYLLABLE MIEUM A KHIEUKH
+ {0x90AE, 0xB9E2}, //2768 #HANGUL SYLLABLE MIEUM A PHIEUPH
+ {0x90AF, 0xB9E6}, //2769 #HANGUL SYLLABLE MIEUM AE SSANGKIYEOK
+ {0x90B0, 0xB9E7}, //2770 #HANGUL SYLLABLE MIEUM AE KIYEOKSIOS
+ {0x90B1, 0xB9E9}, //2771 #HANGUL SYLLABLE MIEUM AE NIEUNCIEUC
+ {0x90B2, 0xB9EA}, //2772 #HANGUL SYLLABLE MIEUM AE NIEUNHIEUH
+ {0x90B3, 0xB9EB}, //2773 #HANGUL SYLLABLE MIEUM AE TIKEUT
+ {0x90B4, 0xB9ED}, //2774 #HANGUL SYLLABLE MIEUM AE RIEULKIYEOK
+ {0x90B5, 0xB9EE}, //2775 #HANGUL SYLLABLE MIEUM AE RIEULMIEUM
+ {0x90B6, 0xB9EF}, //2776 #HANGUL SYLLABLE MIEUM AE RIEULPIEUP
+ {0x90B7, 0xB9F0}, //2777 #HANGUL SYLLABLE MIEUM AE RIEULSIOS
+ {0x90B8, 0xB9F1}, //2778 #HANGUL SYLLABLE MIEUM AE RIEULTHIEUTH
+ {0x90B9, 0xB9F2}, //2779 #HANGUL SYLLABLE MIEUM AE RIEULPHIEUPH
+ {0x90BA, 0xB9F3}, //2780 #HANGUL SYLLABLE MIEUM AE RIEULHIEUH
+ {0x90BB, 0xB9F6}, //2781 #HANGUL SYLLABLE MIEUM AE PIEUPSIOS
+ {0x90BC, 0xB9FB}, //2782 #HANGUL SYLLABLE MIEUM AE CHIEUCH
+ {0x90BD, 0xB9FC}, //2783 #HANGUL SYLLABLE MIEUM AE KHIEUKH
+ {0x90BE, 0xB9FD}, //2784 #HANGUL SYLLABLE MIEUM AE THIEUTH
+ {0x90BF, 0xB9FE}, //2785 #HANGUL SYLLABLE MIEUM AE PHIEUPH
+ {0x90C0, 0xB9FF}, //2786 #HANGUL SYLLABLE MIEUM AE HIEUH
+ {0x90C1, 0xBA02}, //2787 #HANGUL SYLLABLE MIEUM YA SSANGKIYEOK
+ {0x90C2, 0xBA03}, //2788 #HANGUL SYLLABLE MIEUM YA KIYEOKSIOS
+ {0x90C3, 0xBA04}, //2789 #HANGUL SYLLABLE MIEUM YA NIEUN
+ {0x90C4, 0xBA05}, //2790 #HANGUL SYLLABLE MIEUM YA NIEUNCIEUC
+ {0x90C5, 0xBA06}, //2791 #HANGUL SYLLABLE MIEUM YA NIEUNHIEUH
+ {0x90C6, 0xBA07}, //2792 #HANGUL SYLLABLE MIEUM YA TIKEUT
+ {0x90C7, 0xBA09}, //2793 #HANGUL SYLLABLE MIEUM YA RIEULKIYEOK
+ {0x90C8, 0xBA0A}, //2794 #HANGUL SYLLABLE MIEUM YA RIEULMIEUM
+ {0x90C9, 0xBA0B}, //2795 #HANGUL SYLLABLE MIEUM YA RIEULPIEUP
+ {0x90CA, 0xBA0C}, //2796 #HANGUL SYLLABLE MIEUM YA RIEULSIOS
+ {0x90CB, 0xBA0D}, //2797 #HANGUL SYLLABLE MIEUM YA RIEULTHIEUTH
+ {0x90CC, 0xBA0E}, //2798 #HANGUL SYLLABLE MIEUM YA RIEULPHIEUPH
+ {0x90CD, 0xBA0F}, //2799 #HANGUL SYLLABLE MIEUM YA RIEULHIEUH
+ {0x90CE, 0xBA10}, //2800 #HANGUL SYLLABLE MIEUM YA MIEUM
+ {0x90CF, 0xBA11}, //2801 #HANGUL SYLLABLE MIEUM YA PIEUP
+ {0x90D0, 0xBA12}, //2802 #HANGUL SYLLABLE MIEUM YA PIEUPSIOS
+ {0x90D1, 0xBA13}, //2803 #HANGUL SYLLABLE MIEUM YA SIOS
+ {0x90D2, 0xBA14}, //2804 #HANGUL SYLLABLE MIEUM YA SSANGSIOS
+ {0x90D3, 0xBA16}, //2805 #HANGUL SYLLABLE MIEUM YA CIEUC
+ {0x90D4, 0xBA17}, //2806 #HANGUL SYLLABLE MIEUM YA CHIEUCH
+ {0x90D5, 0xBA18}, //2807 #HANGUL SYLLABLE MIEUM YA KHIEUKH
+ {0x90D6, 0xBA19}, //2808 #HANGUL SYLLABLE MIEUM YA THIEUTH
+ {0x90D7, 0xBA1A}, //2809 #HANGUL SYLLABLE MIEUM YA PHIEUPH
+ {0x90D8, 0xBA1B}, //2810 #HANGUL SYLLABLE MIEUM YA HIEUH
+ {0x90D9, 0xBA1C}, //2811 #HANGUL SYLLABLE MIEUM YAE
+ {0x90DA, 0xBA1D}, //2812 #HANGUL SYLLABLE MIEUM YAE KIYEOK
+ {0x90DB, 0xBA1E}, //2813 #HANGUL SYLLABLE MIEUM YAE SSANGKIYEOK
+ {0x90DC, 0xBA1F}, //2814 #HANGUL SYLLABLE MIEUM YAE KIYEOKSIOS
+ {0x90DD, 0xBA20}, //2815 #HANGUL SYLLABLE MIEUM YAE NIEUN
+ {0x90DE, 0xBA21}, //2816 #HANGUL SYLLABLE MIEUM YAE NIEUNCIEUC
+ {0x90DF, 0xBA22}, //2817 #HANGUL SYLLABLE MIEUM YAE NIEUNHIEUH
+ {0x90E0, 0xBA23}, //2818 #HANGUL SYLLABLE MIEUM YAE TIKEUT
+ {0x90E1, 0xBA24}, //2819 #HANGUL SYLLABLE MIEUM YAE RIEUL
+ {0x90E2, 0xBA25}, //2820 #HANGUL SYLLABLE MIEUM YAE RIEULKIYEOK
+ {0x90E3, 0xBA26}, //2821 #HANGUL SYLLABLE MIEUM YAE RIEULMIEUM
+ {0x90E4, 0xBA27}, //2822 #HANGUL SYLLABLE MIEUM YAE RIEULPIEUP
+ {0x90E5, 0xBA28}, //2823 #HANGUL SYLLABLE MIEUM YAE RIEULSIOS
+ {0x90E6, 0xBA29}, //2824 #HANGUL SYLLABLE MIEUM YAE RIEULTHIEUTH
+ {0x90E7, 0xBA2A}, //2825 #HANGUL SYLLABLE MIEUM YAE RIEULPHIEUPH
+ {0x90E8, 0xBA2B}, //2826 #HANGUL SYLLABLE MIEUM YAE RIEULHIEUH
+ {0x90E9, 0xBA2C}, //2827 #HANGUL SYLLABLE MIEUM YAE MIEUM
+ {0x90EA, 0xBA2D}, //2828 #HANGUL SYLLABLE MIEUM YAE PIEUP
+ {0x90EB, 0xBA2E}, //2829 #HANGUL SYLLABLE MIEUM YAE PIEUPSIOS
+ {0x90EC, 0xBA2F}, //2830 #HANGUL SYLLABLE MIEUM YAE SIOS
+ {0x90ED, 0xBA30}, //2831 #HANGUL SYLLABLE MIEUM YAE SSANGSIOS
+ {0x90EE, 0xBA31}, //2832 #HANGUL SYLLABLE MIEUM YAE IEUNG
+ {0x90EF, 0xBA32}, //2833 #HANGUL SYLLABLE MIEUM YAE CIEUC
+ {0x90F0, 0xBA33}, //2834 #HANGUL SYLLABLE MIEUM YAE CHIEUCH
+ {0x90F1, 0xBA34}, //2835 #HANGUL SYLLABLE MIEUM YAE KHIEUKH
+ {0x90F2, 0xBA35}, //2836 #HANGUL SYLLABLE MIEUM YAE THIEUTH
+ {0x90F3, 0xBA36}, //2837 #HANGUL SYLLABLE MIEUM YAE PHIEUPH
+ {0x90F4, 0xBA37}, //2838 #HANGUL SYLLABLE MIEUM YAE HIEUH
+ {0x90F5, 0xBA3A}, //2839 #HANGUL SYLLABLE MIEUM EO SSANGKIYEOK
+ {0x90F6, 0xBA3B}, //2840 #HANGUL SYLLABLE MIEUM EO KIYEOKSIOS
+ {0x90F7, 0xBA3D}, //2841 #HANGUL SYLLABLE MIEUM EO NIEUNCIEUC
+ {0x90F8, 0xBA3E}, //2842 #HANGUL SYLLABLE MIEUM EO NIEUNHIEUH
+ {0x90F9, 0xBA3F}, //2843 #HANGUL SYLLABLE MIEUM EO TIKEUT
+ {0x90FA, 0xBA41}, //2844 #HANGUL SYLLABLE MIEUM EO RIEULKIYEOK
+ {0x90FB, 0xBA43}, //2845 #HANGUL SYLLABLE MIEUM EO RIEULPIEUP
+ {0x90FC, 0xBA44}, //2846 #HANGUL SYLLABLE MIEUM EO RIEULSIOS
+ {0x90FD, 0xBA45}, //2847 #HANGUL SYLLABLE MIEUM EO RIEULTHIEUTH
+ {0x90FE, 0xBA46}, //2848 #HANGUL SYLLABLE MIEUM EO RIEULPHIEUPH
+ {0x9141, 0xBA47}, //2849 #HANGUL SYLLABLE MIEUM EO RIEULHIEUH
+ {0x9142, 0xBA4A}, //2850 #HANGUL SYLLABLE MIEUM EO PIEUPSIOS
+ {0x9143, 0xBA4C}, //2851 #HANGUL SYLLABLE MIEUM EO SSANGSIOS
+ {0x9144, 0xBA4F}, //2852 #HANGUL SYLLABLE MIEUM EO CHIEUCH
+ {0x9145, 0xBA50}, //2853 #HANGUL SYLLABLE MIEUM EO KHIEUKH
+ {0x9146, 0xBA51}, //2854 #HANGUL SYLLABLE MIEUM EO THIEUTH
+ {0x9147, 0xBA52}, //2855 #HANGUL SYLLABLE MIEUM EO PHIEUPH
+ {0x9148, 0xBA56}, //2856 #HANGUL SYLLABLE MIEUM E SSANGKIYEOK
+ {0x9149, 0xBA57}, //2857 #HANGUL SYLLABLE MIEUM E KIYEOKSIOS
+ {0x914A, 0xBA59}, //2858 #HANGUL SYLLABLE MIEUM E NIEUNCIEUC
+ {0x914B, 0xBA5A}, //2859 #HANGUL SYLLABLE MIEUM E NIEUNHIEUH
+ {0x914C, 0xBA5B}, //2860 #HANGUL SYLLABLE MIEUM E TIKEUT
+ {0x914D, 0xBA5D}, //2861 #HANGUL SYLLABLE MIEUM E RIEULKIYEOK
+ {0x914E, 0xBA5E}, //2862 #HANGUL SYLLABLE MIEUM E RIEULMIEUM
+ {0x914F, 0xBA5F}, //2863 #HANGUL SYLLABLE MIEUM E RIEULPIEUP
+ {0x9150, 0xBA60}, //2864 #HANGUL SYLLABLE MIEUM E RIEULSIOS
+ {0x9151, 0xBA61}, //2865 #HANGUL SYLLABLE MIEUM E RIEULTHIEUTH
+ {0x9152, 0xBA62}, //2866 #HANGUL SYLLABLE MIEUM E RIEULPHIEUPH
+ {0x9153, 0xBA63}, //2867 #HANGUL SYLLABLE MIEUM E RIEULHIEUH
+ {0x9154, 0xBA66}, //2868 #HANGUL SYLLABLE MIEUM E PIEUPSIOS
+ {0x9155, 0xBA6A}, //2869 #HANGUL SYLLABLE MIEUM E CIEUC
+ {0x9156, 0xBA6B}, //2870 #HANGUL SYLLABLE MIEUM E CHIEUCH
+ {0x9157, 0xBA6C}, //2871 #HANGUL SYLLABLE MIEUM E KHIEUKH
+ {0x9158, 0xBA6D}, //2872 #HANGUL SYLLABLE MIEUM E THIEUTH
+ {0x9159, 0xBA6E}, //2873 #HANGUL SYLLABLE MIEUM E PHIEUPH
+ {0x915A, 0xBA6F}, //2874 #HANGUL SYLLABLE MIEUM E HIEUH
+ {0x9161, 0xBA72}, //2875 #HANGUL SYLLABLE MIEUM YEO SSANGKIYEOK
+ {0x9162, 0xBA73}, //2876 #HANGUL SYLLABLE MIEUM YEO KIYEOKSIOS
+ {0x9163, 0xBA75}, //2877 #HANGUL SYLLABLE MIEUM YEO NIEUNCIEUC
+ {0x9164, 0xBA76}, //2878 #HANGUL SYLLABLE MIEUM YEO NIEUNHIEUH
+ {0x9165, 0xBA77}, //2879 #HANGUL SYLLABLE MIEUM YEO TIKEUT
+ {0x9166, 0xBA79}, //2880 #HANGUL SYLLABLE MIEUM YEO RIEULKIYEOK
+ {0x9167, 0xBA7A}, //2881 #HANGUL SYLLABLE MIEUM YEO RIEULMIEUM
+ {0x9168, 0xBA7B}, //2882 #HANGUL SYLLABLE MIEUM YEO RIEULPIEUP
+ {0x9169, 0xBA7C}, //2883 #HANGUL SYLLABLE MIEUM YEO RIEULSIOS
+ {0x916A, 0xBA7D}, //2884 #HANGUL SYLLABLE MIEUM YEO RIEULTHIEUTH
+ {0x916B, 0xBA7E}, //2885 #HANGUL SYLLABLE MIEUM YEO RIEULPHIEUPH
+ {0x916C, 0xBA7F}, //2886 #HANGUL SYLLABLE MIEUM YEO RIEULHIEUH
+ {0x916D, 0xBA80}, //2887 #HANGUL SYLLABLE MIEUM YEO MIEUM
+ {0x916E, 0xBA81}, //2888 #HANGUL SYLLABLE MIEUM YEO PIEUP
+ {0x916F, 0xBA82}, //2889 #HANGUL SYLLABLE MIEUM YEO PIEUPSIOS
+ {0x9170, 0xBA86}, //2890 #HANGUL SYLLABLE MIEUM YEO CIEUC
+ {0x9171, 0xBA88}, //2891 #HANGUL SYLLABLE MIEUM YEO KHIEUKH
+ {0x9172, 0xBA89}, //2892 #HANGUL SYLLABLE MIEUM YEO THIEUTH
+ {0x9173, 0xBA8A}, //2893 #HANGUL SYLLABLE MIEUM YEO PHIEUPH
+ {0x9174, 0xBA8B}, //2894 #HANGUL SYLLABLE MIEUM YEO HIEUH
+ {0x9175, 0xBA8D}, //2895 #HANGUL SYLLABLE MIEUM YE KIYEOK
+ {0x9176, 0xBA8E}, //2896 #HANGUL SYLLABLE MIEUM YE SSANGKIYEOK
+ {0x9177, 0xBA8F}, //2897 #HANGUL SYLLABLE MIEUM YE KIYEOKSIOS
+ {0x9178, 0xBA90}, //2898 #HANGUL SYLLABLE MIEUM YE NIEUN
+ {0x9179, 0xBA91}, //2899 #HANGUL SYLLABLE MIEUM YE NIEUNCIEUC
+ {0x917A, 0xBA92}, //2900 #HANGUL SYLLABLE MIEUM YE NIEUNHIEUH
+ {0x9181, 0xBA93}, //2901 #HANGUL SYLLABLE MIEUM YE TIKEUT
+ {0x9182, 0xBA94}, //2902 #HANGUL SYLLABLE MIEUM YE RIEUL
+ {0x9183, 0xBA95}, //2903 #HANGUL SYLLABLE MIEUM YE RIEULKIYEOK
+ {0x9184, 0xBA96}, //2904 #HANGUL SYLLABLE MIEUM YE RIEULMIEUM
+ {0x9185, 0xBA97}, //2905 #HANGUL SYLLABLE MIEUM YE RIEULPIEUP
+ {0x9186, 0xBA98}, //2906 #HANGUL SYLLABLE MIEUM YE RIEULSIOS
+ {0x9187, 0xBA99}, //2907 #HANGUL SYLLABLE MIEUM YE RIEULTHIEUTH
+ {0x9188, 0xBA9A}, //2908 #HANGUL SYLLABLE MIEUM YE RIEULPHIEUPH
+ {0x9189, 0xBA9B}, //2909 #HANGUL SYLLABLE MIEUM YE RIEULHIEUH
+ {0x918A, 0xBA9C}, //2910 #HANGUL SYLLABLE MIEUM YE MIEUM
+ {0x918B, 0xBA9D}, //2911 #HANGUL SYLLABLE MIEUM YE PIEUP
+ {0x918C, 0xBA9E}, //2912 #HANGUL SYLLABLE MIEUM YE PIEUPSIOS
+ {0x918D, 0xBA9F}, //2913 #HANGUL SYLLABLE MIEUM YE SIOS
+ {0x918E, 0xBAA0}, //2914 #HANGUL SYLLABLE MIEUM YE SSANGSIOS
+ {0x918F, 0xBAA1}, //2915 #HANGUL SYLLABLE MIEUM YE IEUNG
+ {0x9190, 0xBAA2}, //2916 #HANGUL SYLLABLE MIEUM YE CIEUC
+ {0x9191, 0xBAA3}, //2917 #HANGUL SYLLABLE MIEUM YE CHIEUCH
+ {0x9192, 0xBAA4}, //2918 #HANGUL SYLLABLE MIEUM YE KHIEUKH
+ {0x9193, 0xBAA5}, //2919 #HANGUL SYLLABLE MIEUM YE THIEUTH
+ {0x9194, 0xBAA6}, //2920 #HANGUL SYLLABLE MIEUM YE PHIEUPH
+ {0x9195, 0xBAA7}, //2921 #HANGUL SYLLABLE MIEUM YE HIEUH
+ {0x9196, 0xBAAA}, //2922 #HANGUL SYLLABLE MIEUM O SSANGKIYEOK
+ {0x9197, 0xBAAD}, //2923 #HANGUL SYLLABLE MIEUM O NIEUNCIEUC
+ {0x9198, 0xBAAE}, //2924 #HANGUL SYLLABLE MIEUM O NIEUNHIEUH
+ {0x9199, 0xBAAF}, //2925 #HANGUL SYLLABLE MIEUM O TIKEUT
+ {0x919A, 0xBAB1}, //2926 #HANGUL SYLLABLE MIEUM O RIEULKIYEOK
+ {0x919B, 0xBAB3}, //2927 #HANGUL SYLLABLE MIEUM O RIEULPIEUP
+ {0x919C, 0xBAB4}, //2928 #HANGUL SYLLABLE MIEUM O RIEULSIOS
+ {0x919D, 0xBAB5}, //2929 #HANGUL SYLLABLE MIEUM O RIEULTHIEUTH
+ {0x919E, 0xBAB6}, //2930 #HANGUL SYLLABLE MIEUM O RIEULPHIEUPH
+ {0x919F, 0xBAB7}, //2931 #HANGUL SYLLABLE MIEUM O RIEULHIEUH
+ {0x91A0, 0xBABA}, //2932 #HANGUL SYLLABLE MIEUM O PIEUPSIOS
+ {0x91A1, 0xBABC}, //2933 #HANGUL SYLLABLE MIEUM O SSANGSIOS
+ {0x91A2, 0xBABE}, //2934 #HANGUL SYLLABLE MIEUM O CIEUC
+ {0x91A3, 0xBABF}, //2935 #HANGUL SYLLABLE MIEUM O CHIEUCH
+ {0x91A4, 0xBAC0}, //2936 #HANGUL SYLLABLE MIEUM O KHIEUKH
+ {0x91A5, 0xBAC1}, //2937 #HANGUL SYLLABLE MIEUM O THIEUTH
+ {0x91A6, 0xBAC2}, //2938 #HANGUL SYLLABLE MIEUM O PHIEUPH
+ {0x91A7, 0xBAC3}, //2939 #HANGUL SYLLABLE MIEUM O HIEUH
+ {0x91A8, 0xBAC5}, //2940 #HANGUL SYLLABLE MIEUM WA KIYEOK
+ {0x91A9, 0xBAC6}, //2941 #HANGUL SYLLABLE MIEUM WA SSANGKIYEOK
+ {0x91AA, 0xBAC7}, //2942 #HANGUL SYLLABLE MIEUM WA KIYEOKSIOS
+ {0x91AB, 0xBAC9}, //2943 #HANGUL SYLLABLE MIEUM WA NIEUNCIEUC
+ {0x91AC, 0xBACA}, //2944 #HANGUL SYLLABLE MIEUM WA NIEUNHIEUH
+ {0x91AD, 0xBACB}, //2945 #HANGUL SYLLABLE MIEUM WA TIKEUT
+ {0x91AE, 0xBACC}, //2946 #HANGUL SYLLABLE MIEUM WA RIEUL
+ {0x91AF, 0xBACD}, //2947 #HANGUL SYLLABLE MIEUM WA RIEULKIYEOK
+ {0x91B0, 0xBACE}, //2948 #HANGUL SYLLABLE MIEUM WA RIEULMIEUM
+ {0x91B1, 0xBACF}, //2949 #HANGUL SYLLABLE MIEUM WA RIEULPIEUP
+ {0x91B2, 0xBAD0}, //2950 #HANGUL SYLLABLE MIEUM WA RIEULSIOS
+ {0x91B3, 0xBAD1}, //2951 #HANGUL SYLLABLE MIEUM WA RIEULTHIEUTH
+ {0x91B4, 0xBAD2}, //2952 #HANGUL SYLLABLE MIEUM WA RIEULPHIEUPH
+ {0x91B5, 0xBAD3}, //2953 #HANGUL SYLLABLE MIEUM WA RIEULHIEUH
+ {0x91B6, 0xBAD4}, //2954 #HANGUL SYLLABLE MIEUM WA MIEUM
+ {0x91B7, 0xBAD5}, //2955 #HANGUL SYLLABLE MIEUM WA PIEUP
+ {0x91B8, 0xBAD6}, //2956 #HANGUL SYLLABLE MIEUM WA PIEUPSIOS
+ {0x91B9, 0xBAD7}, //2957 #HANGUL SYLLABLE MIEUM WA SIOS
+ {0x91BA, 0xBADA}, //2958 #HANGUL SYLLABLE MIEUM WA CIEUC
+ {0x91BB, 0xBADB}, //2959 #HANGUL SYLLABLE MIEUM WA CHIEUCH
+ {0x91BC, 0xBADC}, //2960 #HANGUL SYLLABLE MIEUM WA KHIEUKH
+ {0x91BD, 0xBADD}, //2961 #HANGUL SYLLABLE MIEUM WA THIEUTH
+ {0x91BE, 0xBADE}, //2962 #HANGUL SYLLABLE MIEUM WA PHIEUPH
+ {0x91BF, 0xBADF}, //2963 #HANGUL SYLLABLE MIEUM WA HIEUH
+ {0x91C0, 0xBAE0}, //2964 #HANGUL SYLLABLE MIEUM WAE
+ {0x91C1, 0xBAE1}, //2965 #HANGUL SYLLABLE MIEUM WAE KIYEOK
+ {0x91C2, 0xBAE2}, //2966 #HANGUL SYLLABLE MIEUM WAE SSANGKIYEOK
+ {0x91C3, 0xBAE3}, //2967 #HANGUL SYLLABLE MIEUM WAE KIYEOKSIOS
+ {0x91C4, 0xBAE4}, //2968 #HANGUL SYLLABLE MIEUM WAE NIEUN
+ {0x91C5, 0xBAE5}, //2969 #HANGUL SYLLABLE MIEUM WAE NIEUNCIEUC
+ {0x91C6, 0xBAE6}, //2970 #HANGUL SYLLABLE MIEUM WAE NIEUNHIEUH
+ {0x91C7, 0xBAE7}, //2971 #HANGUL SYLLABLE MIEUM WAE TIKEUT
+ {0x91C8, 0xBAE8}, //2972 #HANGUL SYLLABLE MIEUM WAE RIEUL
+ {0x91C9, 0xBAE9}, //2973 #HANGUL SYLLABLE MIEUM WAE RIEULKIYEOK
+ {0x91CA, 0xBAEA}, //2974 #HANGUL SYLLABLE MIEUM WAE RIEULMIEUM
+ {0x91CB, 0xBAEB}, //2975 #HANGUL SYLLABLE MIEUM WAE RIEULPIEUP
+ {0x91CC, 0xBAEC}, //2976 #HANGUL SYLLABLE MIEUM WAE RIEULSIOS
+ {0x91CD, 0xBAED}, //2977 #HANGUL SYLLABLE MIEUM WAE RIEULTHIEUTH
+ {0x91CE, 0xBAEE}, //2978 #HANGUL SYLLABLE MIEUM WAE RIEULPHIEUPH
+ {0x91CF, 0xBAEF}, //2979 #HANGUL SYLLABLE MIEUM WAE RIEULHIEUH
+ {0x91D0, 0xBAF0}, //2980 #HANGUL SYLLABLE MIEUM WAE MIEUM
+ {0x91D1, 0xBAF1}, //2981 #HANGUL SYLLABLE MIEUM WAE PIEUP
+ {0x91D2, 0xBAF2}, //2982 #HANGUL SYLLABLE MIEUM WAE PIEUPSIOS
+ {0x91D3, 0xBAF3}, //2983 #HANGUL SYLLABLE MIEUM WAE SIOS
+ {0x91D4, 0xBAF4}, //2984 #HANGUL SYLLABLE MIEUM WAE SSANGSIOS
+ {0x91D5, 0xBAF5}, //2985 #HANGUL SYLLABLE MIEUM WAE IEUNG
+ {0x91D6, 0xBAF6}, //2986 #HANGUL SYLLABLE MIEUM WAE CIEUC
+ {0x91D7, 0xBAF7}, //2987 #HANGUL SYLLABLE MIEUM WAE CHIEUCH
+ {0x91D8, 0xBAF8}, //2988 #HANGUL SYLLABLE MIEUM WAE KHIEUKH
+ {0x91D9, 0xBAF9}, //2989 #HANGUL SYLLABLE MIEUM WAE THIEUTH
+ {0x91DA, 0xBAFA}, //2990 #HANGUL SYLLABLE MIEUM WAE PHIEUPH
+ {0x91DB, 0xBAFB}, //2991 #HANGUL SYLLABLE MIEUM WAE HIEUH
+ {0x91DC, 0xBAFD}, //2992 #HANGUL SYLLABLE MIEUM OE KIYEOK
+ {0x91DD, 0xBAFE}, //2993 #HANGUL SYLLABLE MIEUM OE SSANGKIYEOK
+ {0x91DE, 0xBAFF}, //2994 #HANGUL SYLLABLE MIEUM OE KIYEOKSIOS
+ {0x91DF, 0xBB01}, //2995 #HANGUL SYLLABLE MIEUM OE NIEUNCIEUC
+ {0x91E0, 0xBB02}, //2996 #HANGUL SYLLABLE MIEUM OE NIEUNHIEUH
+ {0x91E1, 0xBB03}, //2997 #HANGUL SYLLABLE MIEUM OE TIKEUT
+ {0x91E2, 0xBB05}, //2998 #HANGUL SYLLABLE MIEUM OE RIEULKIYEOK
+ {0x91E3, 0xBB06}, //2999 #HANGUL SYLLABLE MIEUM OE RIEULMIEUM
+ {0x91E4, 0xBB07}, //3000 #HANGUL SYLLABLE MIEUM OE RIEULPIEUP
+ {0x91E5, 0xBB08}, //3001 #HANGUL SYLLABLE MIEUM OE RIEULSIOS
+ {0x91E6, 0xBB09}, //3002 #HANGUL SYLLABLE MIEUM OE RIEULTHIEUTH
+ {0x91E7, 0xBB0A}, //3003 #HANGUL SYLLABLE MIEUM OE RIEULPHIEUPH
+ {0x91E8, 0xBB0B}, //3004 #HANGUL SYLLABLE MIEUM OE RIEULHIEUH
+ {0x91E9, 0xBB0C}, //3005 #HANGUL SYLLABLE MIEUM OE MIEUM
+ {0x91EA, 0xBB0E}, //3006 #HANGUL SYLLABLE MIEUM OE PIEUPSIOS
+ {0x91EB, 0xBB10}, //3007 #HANGUL SYLLABLE MIEUM OE SSANGSIOS
+ {0x91EC, 0xBB12}, //3008 #HANGUL SYLLABLE MIEUM OE CIEUC
+ {0x91ED, 0xBB13}, //3009 #HANGUL SYLLABLE MIEUM OE CHIEUCH
+ {0x91EE, 0xBB14}, //3010 #HANGUL SYLLABLE MIEUM OE KHIEUKH
+ {0x91EF, 0xBB15}, //3011 #HANGUL SYLLABLE MIEUM OE THIEUTH
+ {0x91F0, 0xBB16}, //3012 #HANGUL SYLLABLE MIEUM OE PHIEUPH
+ {0x91F1, 0xBB17}, //3013 #HANGUL SYLLABLE MIEUM OE HIEUH
+ {0x91F2, 0xBB19}, //3014 #HANGUL SYLLABLE MIEUM YO KIYEOK
+ {0x91F3, 0xBB1A}, //3015 #HANGUL SYLLABLE MIEUM YO SSANGKIYEOK
+ {0x91F4, 0xBB1B}, //3016 #HANGUL SYLLABLE MIEUM YO KIYEOKSIOS
+ {0x91F5, 0xBB1D}, //3017 #HANGUL SYLLABLE MIEUM YO NIEUNCIEUC
+ {0x91F6, 0xBB1E}, //3018 #HANGUL SYLLABLE MIEUM YO NIEUNHIEUH
+ {0x91F7, 0xBB1F}, //3019 #HANGUL SYLLABLE MIEUM YO TIKEUT
+ {0x91F8, 0xBB21}, //3020 #HANGUL SYLLABLE MIEUM YO RIEULKIYEOK
+ {0x91F9, 0xBB22}, //3021 #HANGUL SYLLABLE MIEUM YO RIEULMIEUM
+ {0x91FA, 0xBB23}, //3022 #HANGUL SYLLABLE MIEUM YO RIEULPIEUP
+ {0x91FB, 0xBB24}, //3023 #HANGUL SYLLABLE MIEUM YO RIEULSIOS
+ {0x91FC, 0xBB25}, //3024 #HANGUL SYLLABLE MIEUM YO RIEULTHIEUTH
+ {0x91FD, 0xBB26}, //3025 #HANGUL SYLLABLE MIEUM YO RIEULPHIEUPH
+ {0x91FE, 0xBB27}, //3026 #HANGUL SYLLABLE MIEUM YO RIEULHIEUH
+ {0x9241, 0xBB28}, //3027 #HANGUL SYLLABLE MIEUM YO MIEUM
+ {0x9242, 0xBB2A}, //3028 #HANGUL SYLLABLE MIEUM YO PIEUPSIOS
+ {0x9243, 0xBB2C}, //3029 #HANGUL SYLLABLE MIEUM YO SSANGSIOS
+ {0x9244, 0xBB2D}, //3030 #HANGUL SYLLABLE MIEUM YO IEUNG
+ {0x9245, 0xBB2E}, //3031 #HANGUL SYLLABLE MIEUM YO CIEUC
+ {0x9246, 0xBB2F}, //3032 #HANGUL SYLLABLE MIEUM YO CHIEUCH
+ {0x9247, 0xBB30}, //3033 #HANGUL SYLLABLE MIEUM YO KHIEUKH
+ {0x9248, 0xBB31}, //3034 #HANGUL SYLLABLE MIEUM YO THIEUTH
+ {0x9249, 0xBB32}, //3035 #HANGUL SYLLABLE MIEUM YO PHIEUPH
+ {0x924A, 0xBB33}, //3036 #HANGUL SYLLABLE MIEUM YO HIEUH
+ {0x924B, 0xBB37}, //3037 #HANGUL SYLLABLE MIEUM U KIYEOKSIOS
+ {0x924C, 0xBB39}, //3038 #HANGUL SYLLABLE MIEUM U NIEUNCIEUC
+ {0x924D, 0xBB3A}, //3039 #HANGUL SYLLABLE MIEUM U NIEUNHIEUH
+ {0x924E, 0xBB3F}, //3040 #HANGUL SYLLABLE MIEUM U RIEULPIEUP
+ {0x924F, 0xBB40}, //3041 #HANGUL SYLLABLE MIEUM U RIEULSIOS
+ {0x9250, 0xBB41}, //3042 #HANGUL SYLLABLE MIEUM U RIEULTHIEUTH
+ {0x9251, 0xBB42}, //3043 #HANGUL SYLLABLE MIEUM U RIEULPHIEUPH
+ {0x9252, 0xBB43}, //3044 #HANGUL SYLLABLE MIEUM U RIEULHIEUH
+ {0x9253, 0xBB46}, //3045 #HANGUL SYLLABLE MIEUM U PIEUPSIOS
+ {0x9254, 0xBB48}, //3046 #HANGUL SYLLABLE MIEUM U SSANGSIOS
+ {0x9255, 0xBB4A}, //3047 #HANGUL SYLLABLE MIEUM U CIEUC
+ {0x9256, 0xBB4B}, //3048 #HANGUL SYLLABLE MIEUM U CHIEUCH
+ {0x9257, 0xBB4C}, //3049 #HANGUL SYLLABLE MIEUM U KHIEUKH
+ {0x9258, 0xBB4E}, //3050 #HANGUL SYLLABLE MIEUM U PHIEUPH
+ {0x9259, 0xBB51}, //3051 #HANGUL SYLLABLE MIEUM WEO KIYEOK
+ {0x925A, 0xBB52}, //3052 #HANGUL SYLLABLE MIEUM WEO SSANGKIYEOK
+ {0x9261, 0xBB53}, //3053 #HANGUL SYLLABLE MIEUM WEO KIYEOKSIOS
+ {0x9262, 0xBB55}, //3054 #HANGUL SYLLABLE MIEUM WEO NIEUNCIEUC
+ {0x9263, 0xBB56}, //3055 #HANGUL SYLLABLE MIEUM WEO NIEUNHIEUH
+ {0x9264, 0xBB57}, //3056 #HANGUL SYLLABLE MIEUM WEO TIKEUT
+ {0x9265, 0xBB59}, //3057 #HANGUL SYLLABLE MIEUM WEO RIEULKIYEOK
+ {0x9266, 0xBB5A}, //3058 #HANGUL SYLLABLE MIEUM WEO RIEULMIEUM
+ {0x9267, 0xBB5B}, //3059 #HANGUL SYLLABLE MIEUM WEO RIEULPIEUP
+ {0x9268, 0xBB5C}, //3060 #HANGUL SYLLABLE MIEUM WEO RIEULSIOS
+ {0x9269, 0xBB5D}, //3061 #HANGUL SYLLABLE MIEUM WEO RIEULTHIEUTH
+ {0x926A, 0xBB5E}, //3062 #HANGUL SYLLABLE MIEUM WEO RIEULPHIEUPH
+ {0x926B, 0xBB5F}, //3063 #HANGUL SYLLABLE MIEUM WEO RIEULHIEUH
+ {0x926C, 0xBB60}, //3064 #HANGUL SYLLABLE MIEUM WEO MIEUM
+ {0x926D, 0xBB62}, //3065 #HANGUL SYLLABLE MIEUM WEO PIEUPSIOS
+ {0x926E, 0xBB64}, //3066 #HANGUL SYLLABLE MIEUM WEO SSANGSIOS
+ {0x926F, 0xBB65}, //3067 #HANGUL SYLLABLE MIEUM WEO IEUNG
+ {0x9270, 0xBB66}, //3068 #HANGUL SYLLABLE MIEUM WEO CIEUC
+ {0x9271, 0xBB67}, //3069 #HANGUL SYLLABLE MIEUM WEO CHIEUCH
+ {0x9272, 0xBB68}, //3070 #HANGUL SYLLABLE MIEUM WEO KHIEUKH
+ {0x9273, 0xBB69}, //3071 #HANGUL SYLLABLE MIEUM WEO THIEUTH
+ {0x9274, 0xBB6A}, //3072 #HANGUL SYLLABLE MIEUM WEO PHIEUPH
+ {0x9275, 0xBB6B}, //3073 #HANGUL SYLLABLE MIEUM WEO HIEUH
+ {0x9276, 0xBB6D}, //3074 #HANGUL SYLLABLE MIEUM WE KIYEOK
+ {0x9277, 0xBB6E}, //3075 #HANGUL SYLLABLE MIEUM WE SSANGKIYEOK
+ {0x9278, 0xBB6F}, //3076 #HANGUL SYLLABLE MIEUM WE KIYEOKSIOS
+ {0x9279, 0xBB70}, //3077 #HANGUL SYLLABLE MIEUM WE NIEUN
+ {0x927A, 0xBB71}, //3078 #HANGUL SYLLABLE MIEUM WE NIEUNCIEUC
+ {0x9281, 0xBB72}, //3079 #HANGUL SYLLABLE MIEUM WE NIEUNHIEUH
+ {0x9282, 0xBB73}, //3080 #HANGUL SYLLABLE MIEUM WE TIKEUT
+ {0x9283, 0xBB74}, //3081 #HANGUL SYLLABLE MIEUM WE RIEUL
+ {0x9284, 0xBB75}, //3082 #HANGUL SYLLABLE MIEUM WE RIEULKIYEOK
+ {0x9285, 0xBB76}, //3083 #HANGUL SYLLABLE MIEUM WE RIEULMIEUM
+ {0x9286, 0xBB77}, //3084 #HANGUL SYLLABLE MIEUM WE RIEULPIEUP
+ {0x9287, 0xBB78}, //3085 #HANGUL SYLLABLE MIEUM WE RIEULSIOS
+ {0x9288, 0xBB79}, //3086 #HANGUL SYLLABLE MIEUM WE RIEULTHIEUTH
+ {0x9289, 0xBB7A}, //3087 #HANGUL SYLLABLE MIEUM WE RIEULPHIEUPH
+ {0x928A, 0xBB7B}, //3088 #HANGUL SYLLABLE MIEUM WE RIEULHIEUH
+ {0x928B, 0xBB7C}, //3089 #HANGUL SYLLABLE MIEUM WE MIEUM
+ {0x928C, 0xBB7D}, //3090 #HANGUL SYLLABLE MIEUM WE PIEUP
+ {0x928D, 0xBB7E}, //3091 #HANGUL SYLLABLE MIEUM WE PIEUPSIOS
+ {0x928E, 0xBB7F}, //3092 #HANGUL SYLLABLE MIEUM WE SIOS
+ {0x928F, 0xBB80}, //3093 #HANGUL SYLLABLE MIEUM WE SSANGSIOS
+ {0x9290, 0xBB81}, //3094 #HANGUL SYLLABLE MIEUM WE IEUNG
+ {0x9291, 0xBB82}, //3095 #HANGUL SYLLABLE MIEUM WE CIEUC
+ {0x9292, 0xBB83}, //3096 #HANGUL SYLLABLE MIEUM WE CHIEUCH
+ {0x9293, 0xBB84}, //3097 #HANGUL SYLLABLE MIEUM WE KHIEUKH
+ {0x9294, 0xBB85}, //3098 #HANGUL SYLLABLE MIEUM WE THIEUTH
+ {0x9295, 0xBB86}, //3099 #HANGUL SYLLABLE MIEUM WE PHIEUPH
+ {0x9296, 0xBB87}, //3100 #HANGUL SYLLABLE MIEUM WE HIEUH
+ {0x9297, 0xBB89}, //3101 #HANGUL SYLLABLE MIEUM WI KIYEOK
+ {0x9298, 0xBB8A}, //3102 #HANGUL SYLLABLE MIEUM WI SSANGKIYEOK
+ {0x9299, 0xBB8B}, //3103 #HANGUL SYLLABLE MIEUM WI KIYEOKSIOS
+ {0x929A, 0xBB8D}, //3104 #HANGUL SYLLABLE MIEUM WI NIEUNCIEUC
+ {0x929B, 0xBB8E}, //3105 #HANGUL SYLLABLE MIEUM WI NIEUNHIEUH
+ {0x929C, 0xBB8F}, //3106 #HANGUL SYLLABLE MIEUM WI TIKEUT
+ {0x929D, 0xBB91}, //3107 #HANGUL SYLLABLE MIEUM WI RIEULKIYEOK
+ {0x929E, 0xBB92}, //3108 #HANGUL SYLLABLE MIEUM WI RIEULMIEUM
+ {0x929F, 0xBB93}, //3109 #HANGUL SYLLABLE MIEUM WI RIEULPIEUP
+ {0x92A0, 0xBB94}, //3110 #HANGUL SYLLABLE MIEUM WI RIEULSIOS
+ {0x92A1, 0xBB95}, //3111 #HANGUL SYLLABLE MIEUM WI RIEULTHIEUTH
+ {0x92A2, 0xBB96}, //3112 #HANGUL SYLLABLE MIEUM WI RIEULPHIEUPH
+ {0x92A3, 0xBB97}, //3113 #HANGUL SYLLABLE MIEUM WI RIEULHIEUH
+ {0x92A4, 0xBB98}, //3114 #HANGUL SYLLABLE MIEUM WI MIEUM
+ {0x92A5, 0xBB99}, //3115 #HANGUL SYLLABLE MIEUM WI PIEUP
+ {0x92A6, 0xBB9A}, //3116 #HANGUL SYLLABLE MIEUM WI PIEUPSIOS
+ {0x92A7, 0xBB9B}, //3117 #HANGUL SYLLABLE MIEUM WI SIOS
+ {0x92A8, 0xBB9C}, //3118 #HANGUL SYLLABLE MIEUM WI SSANGSIOS
+ {0x92A9, 0xBB9D}, //3119 #HANGUL SYLLABLE MIEUM WI IEUNG
+ {0x92AA, 0xBB9E}, //3120 #HANGUL SYLLABLE MIEUM WI CIEUC
+ {0x92AB, 0xBB9F}, //3121 #HANGUL SYLLABLE MIEUM WI CHIEUCH
+ {0x92AC, 0xBBA0}, //3122 #HANGUL SYLLABLE MIEUM WI KHIEUKH
+ {0x92AD, 0xBBA1}, //3123 #HANGUL SYLLABLE MIEUM WI THIEUTH
+ {0x92AE, 0xBBA2}, //3124 #HANGUL SYLLABLE MIEUM WI PHIEUPH
+ {0x92AF, 0xBBA3}, //3125 #HANGUL SYLLABLE MIEUM WI HIEUH
+ {0x92B0, 0xBBA5}, //3126 #HANGUL SYLLABLE MIEUM YU KIYEOK
+ {0x92B1, 0xBBA6}, //3127 #HANGUL SYLLABLE MIEUM YU SSANGKIYEOK
+ {0x92B2, 0xBBA7}, //3128 #HANGUL SYLLABLE MIEUM YU KIYEOKSIOS
+ {0x92B3, 0xBBA9}, //3129 #HANGUL SYLLABLE MIEUM YU NIEUNCIEUC
+ {0x92B4, 0xBBAA}, //3130 #HANGUL SYLLABLE MIEUM YU NIEUNHIEUH
+ {0x92B5, 0xBBAB}, //3131 #HANGUL SYLLABLE MIEUM YU TIKEUT
+ {0x92B6, 0xBBAD}, //3132 #HANGUL SYLLABLE MIEUM YU RIEULKIYEOK
+ {0x92B7, 0xBBAE}, //3133 #HANGUL SYLLABLE MIEUM YU RIEULMIEUM
+ {0x92B8, 0xBBAF}, //3134 #HANGUL SYLLABLE MIEUM YU RIEULPIEUP
+ {0x92B9, 0xBBB0}, //3135 #HANGUL SYLLABLE MIEUM YU RIEULSIOS
+ {0x92BA, 0xBBB1}, //3136 #HANGUL SYLLABLE MIEUM YU RIEULTHIEUTH
+ {0x92BB, 0xBBB2}, //3137 #HANGUL SYLLABLE MIEUM YU RIEULPHIEUPH
+ {0x92BC, 0xBBB3}, //3138 #HANGUL SYLLABLE MIEUM YU RIEULHIEUH
+ {0x92BD, 0xBBB5}, //3139 #HANGUL SYLLABLE MIEUM YU PIEUP
+ {0x92BE, 0xBBB6}, //3140 #HANGUL SYLLABLE MIEUM YU PIEUPSIOS
+ {0x92BF, 0xBBB8}, //3141 #HANGUL SYLLABLE MIEUM YU SSANGSIOS
+ {0x92C0, 0xBBB9}, //3142 #HANGUL SYLLABLE MIEUM YU IEUNG
+ {0x92C1, 0xBBBA}, //3143 #HANGUL SYLLABLE MIEUM YU CIEUC
+ {0x92C2, 0xBBBB}, //3144 #HANGUL SYLLABLE MIEUM YU CHIEUCH
+ {0x92C3, 0xBBBC}, //3145 #HANGUL SYLLABLE MIEUM YU KHIEUKH
+ {0x92C4, 0xBBBD}, //3146 #HANGUL SYLLABLE MIEUM YU THIEUTH
+ {0x92C5, 0xBBBE}, //3147 #HANGUL SYLLABLE MIEUM YU PHIEUPH
+ {0x92C6, 0xBBBF}, //3148 #HANGUL SYLLABLE MIEUM YU HIEUH
+ {0x92C7, 0xBBC1}, //3149 #HANGUL SYLLABLE MIEUM EU KIYEOK
+ {0x92C8, 0xBBC2}, //3150 #HANGUL SYLLABLE MIEUM EU SSANGKIYEOK
+ {0x92C9, 0xBBC3}, //3151 #HANGUL SYLLABLE MIEUM EU KIYEOKSIOS
+ {0x92CA, 0xBBC5}, //3152 #HANGUL SYLLABLE MIEUM EU NIEUNCIEUC
+ {0x92CB, 0xBBC6}, //3153 #HANGUL SYLLABLE MIEUM EU NIEUNHIEUH
+ {0x92CC, 0xBBC7}, //3154 #HANGUL SYLLABLE MIEUM EU TIKEUT
+ {0x92CD, 0xBBC9}, //3155 #HANGUL SYLLABLE MIEUM EU RIEULKIYEOK
+ {0x92CE, 0xBBCA}, //3156 #HANGUL SYLLABLE MIEUM EU RIEULMIEUM
+ {0x92CF, 0xBBCB}, //3157 #HANGUL SYLLABLE MIEUM EU RIEULPIEUP
+ {0x92D0, 0xBBCC}, //3158 #HANGUL SYLLABLE MIEUM EU RIEULSIOS
+ {0x92D1, 0xBBCD}, //3159 #HANGUL SYLLABLE MIEUM EU RIEULTHIEUTH
+ {0x92D2, 0xBBCE}, //3160 #HANGUL SYLLABLE MIEUM EU RIEULPHIEUPH
+ {0x92D3, 0xBBCF}, //3161 #HANGUL SYLLABLE MIEUM EU RIEULHIEUH
+ {0x92D4, 0xBBD1}, //3162 #HANGUL SYLLABLE MIEUM EU PIEUP
+ {0x92D5, 0xBBD2}, //3163 #HANGUL SYLLABLE MIEUM EU PIEUPSIOS
+ {0x92D6, 0xBBD4}, //3164 #HANGUL SYLLABLE MIEUM EU SSANGSIOS
+ {0x92D7, 0xBBD5}, //3165 #HANGUL SYLLABLE MIEUM EU IEUNG
+ {0x92D8, 0xBBD6}, //3166 #HANGUL SYLLABLE MIEUM EU CIEUC
+ {0x92D9, 0xBBD7}, //3167 #HANGUL SYLLABLE MIEUM EU CHIEUCH
+ {0x92DA, 0xBBD8}, //3168 #HANGUL SYLLABLE MIEUM EU KHIEUKH
+ {0x92DB, 0xBBD9}, //3169 #HANGUL SYLLABLE MIEUM EU THIEUTH
+ {0x92DC, 0xBBDA}, //3170 #HANGUL SYLLABLE MIEUM EU PHIEUPH
+ {0x92DD, 0xBBDB}, //3171 #HANGUL SYLLABLE MIEUM EU HIEUH
+ {0x92DE, 0xBBDC}, //3172 #HANGUL SYLLABLE MIEUM YI
+ {0x92DF, 0xBBDD}, //3173 #HANGUL SYLLABLE MIEUM YI KIYEOK
+ {0x92E0, 0xBBDE}, //3174 #HANGUL SYLLABLE MIEUM YI SSANGKIYEOK
+ {0x92E1, 0xBBDF}, //3175 #HANGUL SYLLABLE MIEUM YI KIYEOKSIOS
+ {0x92E2, 0xBBE0}, //3176 #HANGUL SYLLABLE MIEUM YI NIEUN
+ {0x92E3, 0xBBE1}, //3177 #HANGUL SYLLABLE MIEUM YI NIEUNCIEUC
+ {0x92E4, 0xBBE2}, //3178 #HANGUL SYLLABLE MIEUM YI NIEUNHIEUH
+ {0x92E5, 0xBBE3}, //3179 #HANGUL SYLLABLE MIEUM YI TIKEUT
+ {0x92E6, 0xBBE4}, //3180 #HANGUL SYLLABLE MIEUM YI RIEUL
+ {0x92E7, 0xBBE5}, //3181 #HANGUL SYLLABLE MIEUM YI RIEULKIYEOK
+ {0x92E8, 0xBBE6}, //3182 #HANGUL SYLLABLE MIEUM YI RIEULMIEUM
+ {0x92E9, 0xBBE7}, //3183 #HANGUL SYLLABLE MIEUM YI RIEULPIEUP
+ {0x92EA, 0xBBE8}, //3184 #HANGUL SYLLABLE MIEUM YI RIEULSIOS
+ {0x92EB, 0xBBE9}, //3185 #HANGUL SYLLABLE MIEUM YI RIEULTHIEUTH
+ {0x92EC, 0xBBEA}, //3186 #HANGUL SYLLABLE MIEUM YI RIEULPHIEUPH
+ {0x92ED, 0xBBEB}, //3187 #HANGUL SYLLABLE MIEUM YI RIEULHIEUH
+ {0x92EE, 0xBBEC}, //3188 #HANGUL SYLLABLE MIEUM YI MIEUM
+ {0x92EF, 0xBBED}, //3189 #HANGUL SYLLABLE MIEUM YI PIEUP
+ {0x92F0, 0xBBEE}, //3190 #HANGUL SYLLABLE MIEUM YI PIEUPSIOS
+ {0x92F1, 0xBBEF}, //3191 #HANGUL SYLLABLE MIEUM YI SIOS
+ {0x92F2, 0xBBF0}, //3192 #HANGUL SYLLABLE MIEUM YI SSANGSIOS
+ {0x92F3, 0xBBF1}, //3193 #HANGUL SYLLABLE MIEUM YI IEUNG
+ {0x92F4, 0xBBF2}, //3194 #HANGUL SYLLABLE MIEUM YI CIEUC
+ {0x92F5, 0xBBF3}, //3195 #HANGUL SYLLABLE MIEUM YI CHIEUCH
+ {0x92F6, 0xBBF4}, //3196 #HANGUL SYLLABLE MIEUM YI KHIEUKH
+ {0x92F7, 0xBBF5}, //3197 #HANGUL SYLLABLE MIEUM YI THIEUTH
+ {0x92F8, 0xBBF6}, //3198 #HANGUL SYLLABLE MIEUM YI PHIEUPH
+ {0x92F9, 0xBBF7}, //3199 #HANGUL SYLLABLE MIEUM YI HIEUH
+ {0x92FA, 0xBBFA}, //3200 #HANGUL SYLLABLE MIEUM I SSANGKIYEOK
+ {0x92FB, 0xBBFB}, //3201 #HANGUL SYLLABLE MIEUM I KIYEOKSIOS
+ {0x92FC, 0xBBFD}, //3202 #HANGUL SYLLABLE MIEUM I NIEUNCIEUC
+ {0x92FD, 0xBBFE}, //3203 #HANGUL SYLLABLE MIEUM I NIEUNHIEUH
+ {0x92FE, 0xBC01}, //3204 #HANGUL SYLLABLE MIEUM I RIEULKIYEOK
+ {0x9341, 0xBC03}, //3205 #HANGUL SYLLABLE MIEUM I RIEULPIEUP
+ {0x9342, 0xBC04}, //3206 #HANGUL SYLLABLE MIEUM I RIEULSIOS
+ {0x9343, 0xBC05}, //3207 #HANGUL SYLLABLE MIEUM I RIEULTHIEUTH
+ {0x9344, 0xBC06}, //3208 #HANGUL SYLLABLE MIEUM I RIEULPHIEUPH
+ {0x9345, 0xBC07}, //3209 #HANGUL SYLLABLE MIEUM I RIEULHIEUH
+ {0x9346, 0xBC0A}, //3210 #HANGUL SYLLABLE MIEUM I PIEUPSIOS
+ {0x9347, 0xBC0E}, //3211 #HANGUL SYLLABLE MIEUM I CIEUC
+ {0x9348, 0xBC10}, //3212 #HANGUL SYLLABLE MIEUM I KHIEUKH
+ {0x9349, 0xBC12}, //3213 #HANGUL SYLLABLE MIEUM I PHIEUPH
+ {0x934A, 0xBC13}, //3214 #HANGUL SYLLABLE MIEUM I HIEUH
+ {0x934B, 0xBC19}, //3215 #HANGUL SYLLABLE PIEUP A NIEUNCIEUC
+ {0x934C, 0xBC1A}, //3216 #HANGUL SYLLABLE PIEUP A NIEUNHIEUH
+ {0x934D, 0xBC20}, //3217 #HANGUL SYLLABLE PIEUP A RIEULSIOS
+ {0x934E, 0xBC21}, //3218 #HANGUL SYLLABLE PIEUP A RIEULTHIEUTH
+ {0x934F, 0xBC22}, //3219 #HANGUL SYLLABLE PIEUP A RIEULPHIEUPH
+ {0x9350, 0xBC23}, //3220 #HANGUL SYLLABLE PIEUP A RIEULHIEUH
+ {0x9351, 0xBC26}, //3221 #HANGUL SYLLABLE PIEUP A PIEUPSIOS
+ {0x9352, 0xBC28}, //3222 #HANGUL SYLLABLE PIEUP A SSANGSIOS
+ {0x9353, 0xBC2A}, //3223 #HANGUL SYLLABLE PIEUP A CIEUC
+ {0x9354, 0xBC2B}, //3224 #HANGUL SYLLABLE PIEUP A CHIEUCH
+ {0x9355, 0xBC2C}, //3225 #HANGUL SYLLABLE PIEUP A KHIEUKH
+ {0x9356, 0xBC2E}, //3226 #HANGUL SYLLABLE PIEUP A PHIEUPH
+ {0x9357, 0xBC2F}, //3227 #HANGUL SYLLABLE PIEUP A HIEUH
+ {0x9358, 0xBC32}, //3228 #HANGUL SYLLABLE PIEUP AE SSANGKIYEOK
+ {0x9359, 0xBC33}, //3229 #HANGUL SYLLABLE PIEUP AE KIYEOKSIOS
+ {0x935A, 0xBC35}, //3230 #HANGUL SYLLABLE PIEUP AE NIEUNCIEUC
+ {0x9361, 0xBC36}, //3231 #HANGUL SYLLABLE PIEUP AE NIEUNHIEUH
+ {0x9362, 0xBC37}, //3232 #HANGUL SYLLABLE PIEUP AE TIKEUT
+ {0x9363, 0xBC39}, //3233 #HANGUL SYLLABLE PIEUP AE RIEULKIYEOK
+ {0x9364, 0xBC3A}, //3234 #HANGUL SYLLABLE PIEUP AE RIEULMIEUM
+ {0x9365, 0xBC3B}, //3235 #HANGUL SYLLABLE PIEUP AE RIEULPIEUP
+ {0x9366, 0xBC3C}, //3236 #HANGUL SYLLABLE PIEUP AE RIEULSIOS
+ {0x9367, 0xBC3D}, //3237 #HANGUL SYLLABLE PIEUP AE RIEULTHIEUTH
+ {0x9368, 0xBC3E}, //3238 #HANGUL SYLLABLE PIEUP AE RIEULPHIEUPH
+ {0x9369, 0xBC3F}, //3239 #HANGUL SYLLABLE PIEUP AE RIEULHIEUH
+ {0x936A, 0xBC42}, //3240 #HANGUL SYLLABLE PIEUP AE PIEUPSIOS
+ {0x936B, 0xBC46}, //3241 #HANGUL SYLLABLE PIEUP AE CIEUC
+ {0x936C, 0xBC47}, //3242 #HANGUL SYLLABLE PIEUP AE CHIEUCH
+ {0x936D, 0xBC48}, //3243 #HANGUL SYLLABLE PIEUP AE KHIEUKH
+ {0x936E, 0xBC4A}, //3244 #HANGUL SYLLABLE PIEUP AE PHIEUPH
+ {0x936F, 0xBC4B}, //3245 #HANGUL SYLLABLE PIEUP AE HIEUH
+ {0x9370, 0xBC4E}, //3246 #HANGUL SYLLABLE PIEUP YA SSANGKIYEOK
+ {0x9371, 0xBC4F}, //3247 #HANGUL SYLLABLE PIEUP YA KIYEOKSIOS
+ {0x9372, 0xBC51}, //3248 #HANGUL SYLLABLE PIEUP YA NIEUNCIEUC
+ {0x9373, 0xBC52}, //3249 #HANGUL SYLLABLE PIEUP YA NIEUNHIEUH
+ {0x9374, 0xBC53}, //3250 #HANGUL SYLLABLE PIEUP YA TIKEUT
+ {0x9375, 0xBC54}, //3251 #HANGUL SYLLABLE PIEUP YA RIEUL
+ {0x9376, 0xBC55}, //3252 #HANGUL SYLLABLE PIEUP YA RIEULKIYEOK
+ {0x9377, 0xBC56}, //3253 #HANGUL SYLLABLE PIEUP YA RIEULMIEUM
+ {0x9378, 0xBC57}, //3254 #HANGUL SYLLABLE PIEUP YA RIEULPIEUP
+ {0x9379, 0xBC58}, //3255 #HANGUL SYLLABLE PIEUP YA RIEULSIOS
+ {0x937A, 0xBC59}, //3256 #HANGUL SYLLABLE PIEUP YA RIEULTHIEUTH
+ {0x9381, 0xBC5A}, //3257 #HANGUL SYLLABLE PIEUP YA RIEULPHIEUPH
+ {0x9382, 0xBC5B}, //3258 #HANGUL SYLLABLE PIEUP YA RIEULHIEUH
+ {0x9383, 0xBC5C}, //3259 #HANGUL SYLLABLE PIEUP YA MIEUM
+ {0x9384, 0xBC5E}, //3260 #HANGUL SYLLABLE PIEUP YA PIEUPSIOS
+ {0x9385, 0xBC5F}, //3261 #HANGUL SYLLABLE PIEUP YA SIOS
+ {0x9386, 0xBC60}, //3262 #HANGUL SYLLABLE PIEUP YA SSANGSIOS
+ {0x9387, 0xBC61}, //3263 #HANGUL SYLLABLE PIEUP YA IEUNG
+ {0x9388, 0xBC62}, //3264 #HANGUL SYLLABLE PIEUP YA CIEUC
+ {0x9389, 0xBC63}, //3265 #HANGUL SYLLABLE PIEUP YA CHIEUCH
+ {0x938A, 0xBC64}, //3266 #HANGUL SYLLABLE PIEUP YA KHIEUKH
+ {0x938B, 0xBC65}, //3267 #HANGUL SYLLABLE PIEUP YA THIEUTH
+ {0x938C, 0xBC66}, //3268 #HANGUL SYLLABLE PIEUP YA PHIEUPH
+ {0x938D, 0xBC67}, //3269 #HANGUL SYLLABLE PIEUP YA HIEUH
+ {0x938E, 0xBC68}, //3270 #HANGUL SYLLABLE PIEUP YAE
+ {0x938F, 0xBC69}, //3271 #HANGUL SYLLABLE PIEUP YAE KIYEOK
+ {0x9390, 0xBC6A}, //3272 #HANGUL SYLLABLE PIEUP YAE SSANGKIYEOK
+ {0x9391, 0xBC6B}, //3273 #HANGUL SYLLABLE PIEUP YAE KIYEOKSIOS
+ {0x9392, 0xBC6C}, //3274 #HANGUL SYLLABLE PIEUP YAE NIEUN
+ {0x9393, 0xBC6D}, //3275 #HANGUL SYLLABLE PIEUP YAE NIEUNCIEUC
+ {0x9394, 0xBC6E}, //3276 #HANGUL SYLLABLE PIEUP YAE NIEUNHIEUH
+ {0x9395, 0xBC6F}, //3277 #HANGUL SYLLABLE PIEUP YAE TIKEUT
+ {0x9396, 0xBC70}, //3278 #HANGUL SYLLABLE PIEUP YAE RIEUL
+ {0x9397, 0xBC71}, //3279 #HANGUL SYLLABLE PIEUP YAE RIEULKIYEOK
+ {0x9398, 0xBC72}, //3280 #HANGUL SYLLABLE PIEUP YAE RIEULMIEUM
+ {0x9399, 0xBC73}, //3281 #HANGUL SYLLABLE PIEUP YAE RIEULPIEUP
+ {0x939A, 0xBC74}, //3282 #HANGUL SYLLABLE PIEUP YAE RIEULSIOS
+ {0x939B, 0xBC75}, //3283 #HANGUL SYLLABLE PIEUP YAE RIEULTHIEUTH
+ {0x939C, 0xBC76}, //3284 #HANGUL SYLLABLE PIEUP YAE RIEULPHIEUPH
+ {0x939D, 0xBC77}, //3285 #HANGUL SYLLABLE PIEUP YAE RIEULHIEUH
+ {0x939E, 0xBC78}, //3286 #HANGUL SYLLABLE PIEUP YAE MIEUM
+ {0x939F, 0xBC79}, //3287 #HANGUL SYLLABLE PIEUP YAE PIEUP
+ {0x93A0, 0xBC7A}, //3288 #HANGUL SYLLABLE PIEUP YAE PIEUPSIOS
+ {0x93A1, 0xBC7B}, //3289 #HANGUL SYLLABLE PIEUP YAE SIOS
+ {0x93A2, 0xBC7C}, //3290 #HANGUL SYLLABLE PIEUP YAE SSANGSIOS
+ {0x93A3, 0xBC7D}, //3291 #HANGUL SYLLABLE PIEUP YAE IEUNG
+ {0x93A4, 0xBC7E}, //3292 #HANGUL SYLLABLE PIEUP YAE CIEUC
+ {0x93A5, 0xBC7F}, //3293 #HANGUL SYLLABLE PIEUP YAE CHIEUCH
+ {0x93A6, 0xBC80}, //3294 #HANGUL SYLLABLE PIEUP YAE KHIEUKH
+ {0x93A7, 0xBC81}, //3295 #HANGUL SYLLABLE PIEUP YAE THIEUTH
+ {0x93A8, 0xBC82}, //3296 #HANGUL SYLLABLE PIEUP YAE PHIEUPH
+ {0x93A9, 0xBC83}, //3297 #HANGUL SYLLABLE PIEUP YAE HIEUH
+ {0x93AA, 0xBC86}, //3298 #HANGUL SYLLABLE PIEUP EO SSANGKIYEOK
+ {0x93AB, 0xBC87}, //3299 #HANGUL SYLLABLE PIEUP EO KIYEOKSIOS
+ {0x93AC, 0xBC89}, //3300 #HANGUL SYLLABLE PIEUP EO NIEUNCIEUC
+ {0x93AD, 0xBC8A}, //3301 #HANGUL SYLLABLE PIEUP EO NIEUNHIEUH
+ {0x93AE, 0xBC8D}, //3302 #HANGUL SYLLABLE PIEUP EO RIEULKIYEOK
+ {0x93AF, 0xBC8F}, //3303 #HANGUL SYLLABLE PIEUP EO RIEULPIEUP
+ {0x93B0, 0xBC90}, //3304 #HANGUL SYLLABLE PIEUP EO RIEULSIOS
+ {0x93B1, 0xBC91}, //3305 #HANGUL SYLLABLE PIEUP EO RIEULTHIEUTH
+ {0x93B2, 0xBC92}, //3306 #HANGUL SYLLABLE PIEUP EO RIEULPHIEUPH
+ {0x93B3, 0xBC93}, //3307 #HANGUL SYLLABLE PIEUP EO RIEULHIEUH
+ {0x93B4, 0xBC96}, //3308 #HANGUL SYLLABLE PIEUP EO PIEUPSIOS
+ {0x93B5, 0xBC98}, //3309 #HANGUL SYLLABLE PIEUP EO SSANGSIOS
+ {0x93B6, 0xBC9B}, //3310 #HANGUL SYLLABLE PIEUP EO CHIEUCH
+ {0x93B7, 0xBC9C}, //3311 #HANGUL SYLLABLE PIEUP EO KHIEUKH
+ {0x93B8, 0xBC9D}, //3312 #HANGUL SYLLABLE PIEUP EO THIEUTH
+ {0x93B9, 0xBC9E}, //3313 #HANGUL SYLLABLE PIEUP EO PHIEUPH
+ {0x93BA, 0xBC9F}, //3314 #HANGUL SYLLABLE PIEUP EO HIEUH
+ {0x93BB, 0xBCA2}, //3315 #HANGUL SYLLABLE PIEUP E SSANGKIYEOK
+ {0x93BC, 0xBCA3}, //3316 #HANGUL SYLLABLE PIEUP E KIYEOKSIOS
+ {0x93BD, 0xBCA5}, //3317 #HANGUL SYLLABLE PIEUP E NIEUNCIEUC
+ {0x93BE, 0xBCA6}, //3318 #HANGUL SYLLABLE PIEUP E NIEUNHIEUH
+ {0x93BF, 0xBCA9}, //3319 #HANGUL SYLLABLE PIEUP E RIEULKIYEOK
+ {0x93C0, 0xBCAA}, //3320 #HANGUL SYLLABLE PIEUP E RIEULMIEUM
+ {0x93C1, 0xBCAB}, //3321 #HANGUL SYLLABLE PIEUP E RIEULPIEUP
+ {0x93C2, 0xBCAC}, //3322 #HANGUL SYLLABLE PIEUP E RIEULSIOS
+ {0x93C3, 0xBCAD}, //3323 #HANGUL SYLLABLE PIEUP E RIEULTHIEUTH
+ {0x93C4, 0xBCAE}, //3324 #HANGUL SYLLABLE PIEUP E RIEULPHIEUPH
+ {0x93C5, 0xBCAF}, //3325 #HANGUL SYLLABLE PIEUP E RIEULHIEUH
+ {0x93C6, 0xBCB2}, //3326 #HANGUL SYLLABLE PIEUP E PIEUPSIOS
+ {0x93C7, 0xBCB6}, //3327 #HANGUL SYLLABLE PIEUP E CIEUC
+ {0x93C8, 0xBCB7}, //3328 #HANGUL SYLLABLE PIEUP E CHIEUCH
+ {0x93C9, 0xBCB8}, //3329 #HANGUL SYLLABLE PIEUP E KHIEUKH
+ {0x93CA, 0xBCB9}, //3330 #HANGUL SYLLABLE PIEUP E THIEUTH
+ {0x93CB, 0xBCBA}, //3331 #HANGUL SYLLABLE PIEUP E PHIEUPH
+ {0x93CC, 0xBCBB}, //3332 #HANGUL SYLLABLE PIEUP E HIEUH
+ {0x93CD, 0xBCBE}, //3333 #HANGUL SYLLABLE PIEUP YEO SSANGKIYEOK
+ {0x93CE, 0xBCBF}, //3334 #HANGUL SYLLABLE PIEUP YEO KIYEOKSIOS
+ {0x93CF, 0xBCC1}, //3335 #HANGUL SYLLABLE PIEUP YEO NIEUNCIEUC
+ {0x93D0, 0xBCC2}, //3336 #HANGUL SYLLABLE PIEUP YEO NIEUNHIEUH
+ {0x93D1, 0xBCC3}, //3337 #HANGUL SYLLABLE PIEUP YEO TIKEUT
+ {0x93D2, 0xBCC5}, //3338 #HANGUL SYLLABLE PIEUP YEO RIEULKIYEOK
+ {0x93D3, 0xBCC6}, //3339 #HANGUL SYLLABLE PIEUP YEO RIEULMIEUM
+ {0x93D4, 0xBCC7}, //3340 #HANGUL SYLLABLE PIEUP YEO RIEULPIEUP
+ {0x93D5, 0xBCC8}, //3341 #HANGUL SYLLABLE PIEUP YEO RIEULSIOS
+ {0x93D6, 0xBCC9}, //3342 #HANGUL SYLLABLE PIEUP YEO RIEULTHIEUTH
+ {0x93D7, 0xBCCA}, //3343 #HANGUL SYLLABLE PIEUP YEO RIEULPHIEUPH
+ {0x93D8, 0xBCCB}, //3344 #HANGUL SYLLABLE PIEUP YEO RIEULHIEUH
+ {0x93D9, 0xBCCC}, //3345 #HANGUL SYLLABLE PIEUP YEO MIEUM
+ {0x93DA, 0xBCCE}, //3346 #HANGUL SYLLABLE PIEUP YEO PIEUPSIOS
+ {0x93DB, 0xBCD2}, //3347 #HANGUL SYLLABLE PIEUP YEO CIEUC
+ {0x93DC, 0xBCD3}, //3348 #HANGUL SYLLABLE PIEUP YEO CHIEUCH
+ {0x93DD, 0xBCD4}, //3349 #HANGUL SYLLABLE PIEUP YEO KHIEUKH
+ {0x93DE, 0xBCD6}, //3350 #HANGUL SYLLABLE PIEUP YEO PHIEUPH
+ {0x93DF, 0xBCD7}, //3351 #HANGUL SYLLABLE PIEUP YEO HIEUH
+ {0x93E0, 0xBCD9}, //3352 #HANGUL SYLLABLE PIEUP YE KIYEOK
+ {0x93E1, 0xBCDA}, //3353 #HANGUL SYLLABLE PIEUP YE SSANGKIYEOK
+ {0x93E2, 0xBCDB}, //3354 #HANGUL SYLLABLE PIEUP YE KIYEOKSIOS
+ {0x93E3, 0xBCDD}, //3355 #HANGUL SYLLABLE PIEUP YE NIEUNCIEUC
+ {0x93E4, 0xBCDE}, //3356 #HANGUL SYLLABLE PIEUP YE NIEUNHIEUH
+ {0x93E5, 0xBCDF}, //3357 #HANGUL SYLLABLE PIEUP YE TIKEUT
+ {0x93E6, 0xBCE0}, //3358 #HANGUL SYLLABLE PIEUP YE RIEUL
+ {0x93E7, 0xBCE1}, //3359 #HANGUL SYLLABLE PIEUP YE RIEULKIYEOK
+ {0x93E8, 0xBCE2}, //3360 #HANGUL SYLLABLE PIEUP YE RIEULMIEUM
+ {0x93E9, 0xBCE3}, //3361 #HANGUL SYLLABLE PIEUP YE RIEULPIEUP
+ {0x93EA, 0xBCE4}, //3362 #HANGUL SYLLABLE PIEUP YE RIEULSIOS
+ {0x93EB, 0xBCE5}, //3363 #HANGUL SYLLABLE PIEUP YE RIEULTHIEUTH
+ {0x93EC, 0xBCE6}, //3364 #HANGUL SYLLABLE PIEUP YE RIEULPHIEUPH
+ {0x93ED, 0xBCE7}, //3365 #HANGUL SYLLABLE PIEUP YE RIEULHIEUH
+ {0x93EE, 0xBCE8}, //3366 #HANGUL SYLLABLE PIEUP YE MIEUM
+ {0x93EF, 0xBCE9}, //3367 #HANGUL SYLLABLE PIEUP YE PIEUP
+ {0x93F0, 0xBCEA}, //3368 #HANGUL SYLLABLE PIEUP YE PIEUPSIOS
+ {0x93F1, 0xBCEB}, //3369 #HANGUL SYLLABLE PIEUP YE SIOS
+ {0x93F2, 0xBCEC}, //3370 #HANGUL SYLLABLE PIEUP YE SSANGSIOS
+ {0x93F3, 0xBCED}, //3371 #HANGUL SYLLABLE PIEUP YE IEUNG
+ {0x93F4, 0xBCEE}, //3372 #HANGUL SYLLABLE PIEUP YE CIEUC
+ {0x93F5, 0xBCEF}, //3373 #HANGUL SYLLABLE PIEUP YE CHIEUCH
+ {0x93F6, 0xBCF0}, //3374 #HANGUL SYLLABLE PIEUP YE KHIEUKH
+ {0x93F7, 0xBCF1}, //3375 #HANGUL SYLLABLE PIEUP YE THIEUTH
+ {0x93F8, 0xBCF2}, //3376 #HANGUL SYLLABLE PIEUP YE PHIEUPH
+ {0x93F9, 0xBCF3}, //3377 #HANGUL SYLLABLE PIEUP YE HIEUH
+ {0x93FA, 0xBCF7}, //3378 #HANGUL SYLLABLE PIEUP O KIYEOKSIOS
+ {0x93FB, 0xBCF9}, //3379 #HANGUL SYLLABLE PIEUP O NIEUNCIEUC
+ {0x93FC, 0xBCFA}, //3380 #HANGUL SYLLABLE PIEUP O NIEUNHIEUH
+ {0x93FD, 0xBCFB}, //3381 #HANGUL SYLLABLE PIEUP O TIKEUT
+ {0x93FE, 0xBCFD}, //3382 #HANGUL SYLLABLE PIEUP O RIEULKIYEOK
+ {0x9441, 0xBCFE}, //3383 #HANGUL SYLLABLE PIEUP O RIEULMIEUM
+ {0x9442, 0xBCFF}, //3384 #HANGUL SYLLABLE PIEUP O RIEULPIEUP
+ {0x9443, 0xBD00}, //3385 #HANGUL SYLLABLE PIEUP O RIEULSIOS
+ {0x9444, 0xBD01}, //3386 #HANGUL SYLLABLE PIEUP O RIEULTHIEUTH
+ {0x9445, 0xBD02}, //3387 #HANGUL SYLLABLE PIEUP O RIEULPHIEUPH
+ {0x9446, 0xBD03}, //3388 #HANGUL SYLLABLE PIEUP O RIEULHIEUH
+ {0x9447, 0xBD06}, //3389 #HANGUL SYLLABLE PIEUP O PIEUPSIOS
+ {0x9448, 0xBD08}, //3390 #HANGUL SYLLABLE PIEUP O SSANGSIOS
+ {0x9449, 0xBD0A}, //3391 #HANGUL SYLLABLE PIEUP O CIEUC
+ {0x944A, 0xBD0B}, //3392 #HANGUL SYLLABLE PIEUP O CHIEUCH
+ {0x944B, 0xBD0C}, //3393 #HANGUL SYLLABLE PIEUP O KHIEUKH
+ {0x944C, 0xBD0D}, //3394 #HANGUL SYLLABLE PIEUP O THIEUTH
+ {0x944D, 0xBD0E}, //3395 #HANGUL SYLLABLE PIEUP O PHIEUPH
+ {0x944E, 0xBD0F}, //3396 #HANGUL SYLLABLE PIEUP O HIEUH
+ {0x944F, 0xBD11}, //3397 #HANGUL SYLLABLE PIEUP WA KIYEOK
+ {0x9450, 0xBD12}, //3398 #HANGUL SYLLABLE PIEUP WA SSANGKIYEOK
+ {0x9451, 0xBD13}, //3399 #HANGUL SYLLABLE PIEUP WA KIYEOKSIOS
+ {0x9452, 0xBD15}, //3400 #HANGUL SYLLABLE PIEUP WA NIEUNCIEUC
+ {0x9453, 0xBD16}, //3401 #HANGUL SYLLABLE PIEUP WA NIEUNHIEUH
+ {0x9454, 0xBD17}, //3402 #HANGUL SYLLABLE PIEUP WA TIKEUT
+ {0x9455, 0xBD18}, //3403 #HANGUL SYLLABLE PIEUP WA RIEUL
+ {0x9456, 0xBD19}, //3404 #HANGUL SYLLABLE PIEUP WA RIEULKIYEOK
+ {0x9457, 0xBD1A}, //3405 #HANGUL SYLLABLE PIEUP WA RIEULMIEUM
+ {0x9458, 0xBD1B}, //3406 #HANGUL SYLLABLE PIEUP WA RIEULPIEUP
+ {0x9459, 0xBD1C}, //3407 #HANGUL SYLLABLE PIEUP WA RIEULSIOS
+ {0x945A, 0xBD1D}, //3408 #HANGUL SYLLABLE PIEUP WA RIEULTHIEUTH
+ {0x9461, 0xBD1E}, //3409 #HANGUL SYLLABLE PIEUP WA RIEULPHIEUPH
+ {0x9462, 0xBD1F}, //3410 #HANGUL SYLLABLE PIEUP WA RIEULHIEUH
+ {0x9463, 0xBD20}, //3411 #HANGUL SYLLABLE PIEUP WA MIEUM
+ {0x9464, 0xBD21}, //3412 #HANGUL SYLLABLE PIEUP WA PIEUP
+ {0x9465, 0xBD22}, //3413 #HANGUL SYLLABLE PIEUP WA PIEUPSIOS
+ {0x9466, 0xBD23}, //3414 #HANGUL SYLLABLE PIEUP WA SIOS
+ {0x9467, 0xBD25}, //3415 #HANGUL SYLLABLE PIEUP WA IEUNG
+ {0x9468, 0xBD26}, //3416 #HANGUL SYLLABLE PIEUP WA CIEUC
+ {0x9469, 0xBD27}, //3417 #HANGUL SYLLABLE PIEUP WA CHIEUCH
+ {0x946A, 0xBD28}, //3418 #HANGUL SYLLABLE PIEUP WA KHIEUKH
+ {0x946B, 0xBD29}, //3419 #HANGUL SYLLABLE PIEUP WA THIEUTH
+ {0x946C, 0xBD2A}, //3420 #HANGUL SYLLABLE PIEUP WA PHIEUPH
+ {0x946D, 0xBD2B}, //3421 #HANGUL SYLLABLE PIEUP WA HIEUH
+ {0x946E, 0xBD2D}, //3422 #HANGUL SYLLABLE PIEUP WAE KIYEOK
+ {0x946F, 0xBD2E}, //3423 #HANGUL SYLLABLE PIEUP WAE SSANGKIYEOK
+ {0x9470, 0xBD2F}, //3424 #HANGUL SYLLABLE PIEUP WAE KIYEOKSIOS
+ {0x9471, 0xBD30}, //3425 #HANGUL SYLLABLE PIEUP WAE NIEUN
+ {0x9472, 0xBD31}, //3426 #HANGUL SYLLABLE PIEUP WAE NIEUNCIEUC
+ {0x9473, 0xBD32}, //3427 #HANGUL SYLLABLE PIEUP WAE NIEUNHIEUH
+ {0x9474, 0xBD33}, //3428 #HANGUL SYLLABLE PIEUP WAE TIKEUT
+ {0x9475, 0xBD34}, //3429 #HANGUL SYLLABLE PIEUP WAE RIEUL
+ {0x9476, 0xBD35}, //3430 #HANGUL SYLLABLE PIEUP WAE RIEULKIYEOK
+ {0x9477, 0xBD36}, //3431 #HANGUL SYLLABLE PIEUP WAE RIEULMIEUM
+ {0x9478, 0xBD37}, //3432 #HANGUL SYLLABLE PIEUP WAE RIEULPIEUP
+ {0x9479, 0xBD38}, //3433 #HANGUL SYLLABLE PIEUP WAE RIEULSIOS
+ {0x947A, 0xBD39}, //3434 #HANGUL SYLLABLE PIEUP WAE RIEULTHIEUTH
+ {0x9481, 0xBD3A}, //3435 #HANGUL SYLLABLE PIEUP WAE RIEULPHIEUPH
+ {0x9482, 0xBD3B}, //3436 #HANGUL SYLLABLE PIEUP WAE RIEULHIEUH
+ {0x9483, 0xBD3C}, //3437 #HANGUL SYLLABLE PIEUP WAE MIEUM
+ {0x9484, 0xBD3D}, //3438 #HANGUL SYLLABLE PIEUP WAE PIEUP
+ {0x9485, 0xBD3E}, //3439 #HANGUL SYLLABLE PIEUP WAE PIEUPSIOS
+ {0x9486, 0xBD3F}, //3440 #HANGUL SYLLABLE PIEUP WAE SIOS
+ {0x9487, 0xBD41}, //3441 #HANGUL SYLLABLE PIEUP WAE IEUNG
+ {0x9488, 0xBD42}, //3442 #HANGUL SYLLABLE PIEUP WAE CIEUC
+ {0x9489, 0xBD43}, //3443 #HANGUL SYLLABLE PIEUP WAE CHIEUCH
+ {0x948A, 0xBD44}, //3444 #HANGUL SYLLABLE PIEUP WAE KHIEUKH
+ {0x948B, 0xBD45}, //3445 #HANGUL SYLLABLE PIEUP WAE THIEUTH
+ {0x948C, 0xBD46}, //3446 #HANGUL SYLLABLE PIEUP WAE PHIEUPH
+ {0x948D, 0xBD47}, //3447 #HANGUL SYLLABLE PIEUP WAE HIEUH
+ {0x948E, 0xBD4A}, //3448 #HANGUL SYLLABLE PIEUP OE SSANGKIYEOK
+ {0x948F, 0xBD4B}, //3449 #HANGUL SYLLABLE PIEUP OE KIYEOKSIOS
+ {0x9490, 0xBD4D}, //3450 #HANGUL SYLLABLE PIEUP OE NIEUNCIEUC
+ {0x9491, 0xBD4E}, //3451 #HANGUL SYLLABLE PIEUP OE NIEUNHIEUH
+ {0x9492, 0xBD4F}, //3452 #HANGUL SYLLABLE PIEUP OE TIKEUT
+ {0x9493, 0xBD51}, //3453 #HANGUL SYLLABLE PIEUP OE RIEULKIYEOK
+ {0x9494, 0xBD52}, //3454 #HANGUL SYLLABLE PIEUP OE RIEULMIEUM
+ {0x9495, 0xBD53}, //3455 #HANGUL SYLLABLE PIEUP OE RIEULPIEUP
+ {0x9496, 0xBD54}, //3456 #HANGUL SYLLABLE PIEUP OE RIEULSIOS
+ {0x9497, 0xBD55}, //3457 #HANGUL SYLLABLE PIEUP OE RIEULTHIEUTH
+ {0x9498, 0xBD56}, //3458 #HANGUL SYLLABLE PIEUP OE RIEULPHIEUPH
+ {0x9499, 0xBD57}, //3459 #HANGUL SYLLABLE PIEUP OE RIEULHIEUH
+ {0x949A, 0xBD5A}, //3460 #HANGUL SYLLABLE PIEUP OE PIEUPSIOS
+ {0x949B, 0xBD5B}, //3461 #HANGUL SYLLABLE PIEUP OE SIOS
+ {0x949C, 0xBD5C}, //3462 #HANGUL SYLLABLE PIEUP OE SSANGSIOS
+ {0x949D, 0xBD5D}, //3463 #HANGUL SYLLABLE PIEUP OE IEUNG
+ {0x949E, 0xBD5E}, //3464 #HANGUL SYLLABLE PIEUP OE CIEUC
+ {0x949F, 0xBD5F}, //3465 #HANGUL SYLLABLE PIEUP OE CHIEUCH
+ {0x94A0, 0xBD60}, //3466 #HANGUL SYLLABLE PIEUP OE KHIEUKH
+ {0x94A1, 0xBD61}, //3467 #HANGUL SYLLABLE PIEUP OE THIEUTH
+ {0x94A2, 0xBD62}, //3468 #HANGUL SYLLABLE PIEUP OE PHIEUPH
+ {0x94A3, 0xBD63}, //3469 #HANGUL SYLLABLE PIEUP OE HIEUH
+ {0x94A4, 0xBD65}, //3470 #HANGUL SYLLABLE PIEUP YO KIYEOK
+ {0x94A5, 0xBD66}, //3471 #HANGUL SYLLABLE PIEUP YO SSANGKIYEOK
+ {0x94A6, 0xBD67}, //3472 #HANGUL SYLLABLE PIEUP YO KIYEOKSIOS
+ {0x94A7, 0xBD69}, //3473 #HANGUL SYLLABLE PIEUP YO NIEUNCIEUC
+ {0x94A8, 0xBD6A}, //3474 #HANGUL SYLLABLE PIEUP YO NIEUNHIEUH
+ {0x94A9, 0xBD6B}, //3475 #HANGUL SYLLABLE PIEUP YO TIKEUT
+ {0x94AA, 0xBD6C}, //3476 #HANGUL SYLLABLE PIEUP YO RIEUL
+ {0x94AB, 0xBD6D}, //3477 #HANGUL SYLLABLE PIEUP YO RIEULKIYEOK
+ {0x94AC, 0xBD6E}, //3478 #HANGUL SYLLABLE PIEUP YO RIEULMIEUM
+ {0x94AD, 0xBD6F}, //3479 #HANGUL SYLLABLE PIEUP YO RIEULPIEUP
+ {0x94AE, 0xBD70}, //3480 #HANGUL SYLLABLE PIEUP YO RIEULSIOS
+ {0x94AF, 0xBD71}, //3481 #HANGUL SYLLABLE PIEUP YO RIEULTHIEUTH
+ {0x94B0, 0xBD72}, //3482 #HANGUL SYLLABLE PIEUP YO RIEULPHIEUPH
+ {0x94B1, 0xBD73}, //3483 #HANGUL SYLLABLE PIEUP YO RIEULHIEUH
+ {0x94B2, 0xBD74}, //3484 #HANGUL SYLLABLE PIEUP YO MIEUM
+ {0x94B3, 0xBD75}, //3485 #HANGUL SYLLABLE PIEUP YO PIEUP
+ {0x94B4, 0xBD76}, //3486 #HANGUL SYLLABLE PIEUP YO PIEUPSIOS
+ {0x94B5, 0xBD77}, //3487 #HANGUL SYLLABLE PIEUP YO SIOS
+ {0x94B6, 0xBD78}, //3488 #HANGUL SYLLABLE PIEUP YO SSANGSIOS
+ {0x94B7, 0xBD79}, //3489 #HANGUL SYLLABLE PIEUP YO IEUNG
+ {0x94B8, 0xBD7A}, //3490 #HANGUL SYLLABLE PIEUP YO CIEUC
+ {0x94B9, 0xBD7B}, //3491 #HANGUL SYLLABLE PIEUP YO CHIEUCH
+ {0x94BA, 0xBD7C}, //3492 #HANGUL SYLLABLE PIEUP YO KHIEUKH
+ {0x94BB, 0xBD7D}, //3493 #HANGUL SYLLABLE PIEUP YO THIEUTH
+ {0x94BC, 0xBD7E}, //3494 #HANGUL SYLLABLE PIEUP YO PHIEUPH
+ {0x94BD, 0xBD7F}, //3495 #HANGUL SYLLABLE PIEUP YO HIEUH
+ {0x94BE, 0xBD82}, //3496 #HANGUL SYLLABLE PIEUP U SSANGKIYEOK
+ {0x94BF, 0xBD83}, //3497 #HANGUL SYLLABLE PIEUP U KIYEOKSIOS
+ {0x94C0, 0xBD85}, //3498 #HANGUL SYLLABLE PIEUP U NIEUNCIEUC
+ {0x94C1, 0xBD86}, //3499 #HANGUL SYLLABLE PIEUP U NIEUNHIEUH
+ {0x94C2, 0xBD8B}, //3500 #HANGUL SYLLABLE PIEUP U RIEULPIEUP
+ {0x94C3, 0xBD8C}, //3501 #HANGUL SYLLABLE PIEUP U RIEULSIOS
+ {0x94C4, 0xBD8D}, //3502 #HANGUL SYLLABLE PIEUP U RIEULTHIEUTH
+ {0x94C5, 0xBD8E}, //3503 #HANGUL SYLLABLE PIEUP U RIEULPHIEUPH
+ {0x94C6, 0xBD8F}, //3504 #HANGUL SYLLABLE PIEUP U RIEULHIEUH
+ {0x94C7, 0xBD92}, //3505 #HANGUL SYLLABLE PIEUP U PIEUPSIOS
+ {0x94C8, 0xBD94}, //3506 #HANGUL SYLLABLE PIEUP U SSANGSIOS
+ {0x94C9, 0xBD96}, //3507 #HANGUL SYLLABLE PIEUP U CIEUC
+ {0x94CA, 0xBD97}, //3508 #HANGUL SYLLABLE PIEUP U CHIEUCH
+ {0x94CB, 0xBD98}, //3509 #HANGUL SYLLABLE PIEUP U KHIEUKH
+ {0x94CC, 0xBD9B}, //3510 #HANGUL SYLLABLE PIEUP U HIEUH
+ {0x94CD, 0xBD9D}, //3511 #HANGUL SYLLABLE PIEUP WEO KIYEOK
+ {0x94CE, 0xBD9E}, //3512 #HANGUL SYLLABLE PIEUP WEO SSANGKIYEOK
+ {0x94CF, 0xBD9F}, //3513 #HANGUL SYLLABLE PIEUP WEO KIYEOKSIOS
+ {0x94D0, 0xBDA0}, //3514 #HANGUL SYLLABLE PIEUP WEO NIEUN
+ {0x94D1, 0xBDA1}, //3515 #HANGUL SYLLABLE PIEUP WEO NIEUNCIEUC
+ {0x94D2, 0xBDA2}, //3516 #HANGUL SYLLABLE PIEUP WEO NIEUNHIEUH
+ {0x94D3, 0xBDA3}, //3517 #HANGUL SYLLABLE PIEUP WEO TIKEUT
+ {0x94D4, 0xBDA5}, //3518 #HANGUL SYLLABLE PIEUP WEO RIEULKIYEOK
+ {0x94D5, 0xBDA6}, //3519 #HANGUL SYLLABLE PIEUP WEO RIEULMIEUM
+ {0x94D6, 0xBDA7}, //3520 #HANGUL SYLLABLE PIEUP WEO RIEULPIEUP
+ {0x94D7, 0xBDA8}, //3521 #HANGUL SYLLABLE PIEUP WEO RIEULSIOS
+ {0x94D8, 0xBDA9}, //3522 #HANGUL SYLLABLE PIEUP WEO RIEULTHIEUTH
+ {0x94D9, 0xBDAA}, //3523 #HANGUL SYLLABLE PIEUP WEO RIEULPHIEUPH
+ {0x94DA, 0xBDAB}, //3524 #HANGUL SYLLABLE PIEUP WEO RIEULHIEUH
+ {0x94DB, 0xBDAC}, //3525 #HANGUL SYLLABLE PIEUP WEO MIEUM
+ {0x94DC, 0xBDAD}, //3526 #HANGUL SYLLABLE PIEUP WEO PIEUP
+ {0x94DD, 0xBDAE}, //3527 #HANGUL SYLLABLE PIEUP WEO PIEUPSIOS
+ {0x94DE, 0xBDAF}, //3528 #HANGUL SYLLABLE PIEUP WEO SIOS
+ {0x94DF, 0xBDB1}, //3529 #HANGUL SYLLABLE PIEUP WEO IEUNG
+ {0x94E0, 0xBDB2}, //3530 #HANGUL SYLLABLE PIEUP WEO CIEUC
+ {0x94E1, 0xBDB3}, //3531 #HANGUL SYLLABLE PIEUP WEO CHIEUCH
+ {0x94E2, 0xBDB4}, //3532 #HANGUL SYLLABLE PIEUP WEO KHIEUKH
+ {0x94E3, 0xBDB5}, //3533 #HANGUL SYLLABLE PIEUP WEO THIEUTH
+ {0x94E4, 0xBDB6}, //3534 #HANGUL SYLLABLE PIEUP WEO PHIEUPH
+ {0x94E5, 0xBDB7}, //3535 #HANGUL SYLLABLE PIEUP WEO HIEUH
+ {0x94E6, 0xBDB9}, //3536 #HANGUL SYLLABLE PIEUP WE KIYEOK
+ {0x94E7, 0xBDBA}, //3537 #HANGUL SYLLABLE PIEUP WE SSANGKIYEOK
+ {0x94E8, 0xBDBB}, //3538 #HANGUL SYLLABLE PIEUP WE KIYEOKSIOS
+ {0x94E9, 0xBDBC}, //3539 #HANGUL SYLLABLE PIEUP WE NIEUN
+ {0x94EA, 0xBDBD}, //3540 #HANGUL SYLLABLE PIEUP WE NIEUNCIEUC
+ {0x94EB, 0xBDBE}, //3541 #HANGUL SYLLABLE PIEUP WE NIEUNHIEUH
+ {0x94EC, 0xBDBF}, //3542 #HANGUL SYLLABLE PIEUP WE TIKEUT
+ {0x94ED, 0xBDC0}, //3543 #HANGUL SYLLABLE PIEUP WE RIEUL
+ {0x94EE, 0xBDC1}, //3544 #HANGUL SYLLABLE PIEUP WE RIEULKIYEOK
+ {0x94EF, 0xBDC2}, //3545 #HANGUL SYLLABLE PIEUP WE RIEULMIEUM
+ {0x94F0, 0xBDC3}, //3546 #HANGUL SYLLABLE PIEUP WE RIEULPIEUP
+ {0x94F1, 0xBDC4}, //3547 #HANGUL SYLLABLE PIEUP WE RIEULSIOS
+ {0x94F2, 0xBDC5}, //3548 #HANGUL SYLLABLE PIEUP WE RIEULTHIEUTH
+ {0x94F3, 0xBDC6}, //3549 #HANGUL SYLLABLE PIEUP WE RIEULPHIEUPH
+ {0x94F4, 0xBDC7}, //3550 #HANGUL SYLLABLE PIEUP WE RIEULHIEUH
+ {0x94F5, 0xBDC8}, //3551 #HANGUL SYLLABLE PIEUP WE MIEUM
+ {0x94F6, 0xBDC9}, //3552 #HANGUL SYLLABLE PIEUP WE PIEUP
+ {0x94F7, 0xBDCA}, //3553 #HANGUL SYLLABLE PIEUP WE PIEUPSIOS
+ {0x94F8, 0xBDCB}, //3554 #HANGUL SYLLABLE PIEUP WE SIOS
+ {0x94F9, 0xBDCC}, //3555 #HANGUL SYLLABLE PIEUP WE SSANGSIOS
+ {0x94FA, 0xBDCD}, //3556 #HANGUL SYLLABLE PIEUP WE IEUNG
+ {0x94FB, 0xBDCE}, //3557 #HANGUL SYLLABLE PIEUP WE CIEUC
+ {0x94FC, 0xBDCF}, //3558 #HANGUL SYLLABLE PIEUP WE CHIEUCH
+ {0x94FD, 0xBDD0}, //3559 #HANGUL SYLLABLE PIEUP WE KHIEUKH
+ {0x94FE, 0xBDD1}, //3560 #HANGUL SYLLABLE PIEUP WE THIEUTH
+ {0x9541, 0xBDD2}, //3561 #HANGUL SYLLABLE PIEUP WE PHIEUPH
+ {0x9542, 0xBDD3}, //3562 #HANGUL SYLLABLE PIEUP WE HIEUH
+ {0x9543, 0xBDD6}, //3563 #HANGUL SYLLABLE PIEUP WI SSANGKIYEOK
+ {0x9544, 0xBDD7}, //3564 #HANGUL SYLLABLE PIEUP WI KIYEOKSIOS
+ {0x9545, 0xBDD9}, //3565 #HANGUL SYLLABLE PIEUP WI NIEUNCIEUC
+ {0x9546, 0xBDDA}, //3566 #HANGUL SYLLABLE PIEUP WI NIEUNHIEUH
+ {0x9547, 0xBDDB}, //3567 #HANGUL SYLLABLE PIEUP WI TIKEUT
+ {0x9548, 0xBDDD}, //3568 #HANGUL SYLLABLE PIEUP WI RIEULKIYEOK
+ {0x9549, 0xBDDE}, //3569 #HANGUL SYLLABLE PIEUP WI RIEULMIEUM
+ {0x954A, 0xBDDF}, //3570 #HANGUL SYLLABLE PIEUP WI RIEULPIEUP
+ {0x954B, 0xBDE0}, //3571 #HANGUL SYLLABLE PIEUP WI RIEULSIOS
+ {0x954C, 0xBDE1}, //3572 #HANGUL SYLLABLE PIEUP WI RIEULTHIEUTH
+ {0x954D, 0xBDE2}, //3573 #HANGUL SYLLABLE PIEUP WI RIEULPHIEUPH
+ {0x954E, 0xBDE3}, //3574 #HANGUL SYLLABLE PIEUP WI RIEULHIEUH
+ {0x954F, 0xBDE4}, //3575 #HANGUL SYLLABLE PIEUP WI MIEUM
+ {0x9550, 0xBDE5}, //3576 #HANGUL SYLLABLE PIEUP WI PIEUP
+ {0x9551, 0xBDE6}, //3577 #HANGUL SYLLABLE PIEUP WI PIEUPSIOS
+ {0x9552, 0xBDE7}, //3578 #HANGUL SYLLABLE PIEUP WI SIOS
+ {0x9553, 0xBDE8}, //3579 #HANGUL SYLLABLE PIEUP WI SSANGSIOS
+ {0x9554, 0xBDEA}, //3580 #HANGUL SYLLABLE PIEUP WI CIEUC
+ {0x9555, 0xBDEB}, //3581 #HANGUL SYLLABLE PIEUP WI CHIEUCH
+ {0x9556, 0xBDEC}, //3582 #HANGUL SYLLABLE PIEUP WI KHIEUKH
+ {0x9557, 0xBDED}, //3583 #HANGUL SYLLABLE PIEUP WI THIEUTH
+ {0x9558, 0xBDEE}, //3584 #HANGUL SYLLABLE PIEUP WI PHIEUPH
+ {0x9559, 0xBDEF}, //3585 #HANGUL SYLLABLE PIEUP WI HIEUH
+ {0x955A, 0xBDF1}, //3586 #HANGUL SYLLABLE PIEUP YU KIYEOK
+ {0x9561, 0xBDF2}, //3587 #HANGUL SYLLABLE PIEUP YU SSANGKIYEOK
+ {0x9562, 0xBDF3}, //3588 #HANGUL SYLLABLE PIEUP YU KIYEOKSIOS
+ {0x9563, 0xBDF5}, //3589 #HANGUL SYLLABLE PIEUP YU NIEUNCIEUC
+ {0x9564, 0xBDF6}, //3590 #HANGUL SYLLABLE PIEUP YU NIEUNHIEUH
+ {0x9565, 0xBDF7}, //3591 #HANGUL SYLLABLE PIEUP YU TIKEUT
+ {0x9566, 0xBDF9}, //3592 #HANGUL SYLLABLE PIEUP YU RIEULKIYEOK
+ {0x9567, 0xBDFA}, //3593 #HANGUL SYLLABLE PIEUP YU RIEULMIEUM
+ {0x9568, 0xBDFB}, //3594 #HANGUL SYLLABLE PIEUP YU RIEULPIEUP
+ {0x9569, 0xBDFC}, //3595 #HANGUL SYLLABLE PIEUP YU RIEULSIOS
+ {0x956A, 0xBDFD}, //3596 #HANGUL SYLLABLE PIEUP YU RIEULTHIEUTH
+ {0x956B, 0xBDFE}, //3597 #HANGUL SYLLABLE PIEUP YU RIEULPHIEUPH
+ {0x956C, 0xBDFF}, //3598 #HANGUL SYLLABLE PIEUP YU RIEULHIEUH
+ {0x956D, 0xBE01}, //3599 #HANGUL SYLLABLE PIEUP YU PIEUP
+ {0x956E, 0xBE02}, //3600 #HANGUL SYLLABLE PIEUP YU PIEUPSIOS
+ {0x956F, 0xBE04}, //3601 #HANGUL SYLLABLE PIEUP YU SSANGSIOS
+ {0x9570, 0xBE06}, //3602 #HANGUL SYLLABLE PIEUP YU CIEUC
+ {0x9571, 0xBE07}, //3603 #HANGUL SYLLABLE PIEUP YU CHIEUCH
+ {0x9572, 0xBE08}, //3604 #HANGUL SYLLABLE PIEUP YU KHIEUKH
+ {0x9573, 0xBE09}, //3605 #HANGUL SYLLABLE PIEUP YU THIEUTH
+ {0x9574, 0xBE0A}, //3606 #HANGUL SYLLABLE PIEUP YU PHIEUPH
+ {0x9575, 0xBE0B}, //3607 #HANGUL SYLLABLE PIEUP YU HIEUH
+ {0x9576, 0xBE0E}, //3608 #HANGUL SYLLABLE PIEUP EU SSANGKIYEOK
+ {0x9577, 0xBE0F}, //3609 #HANGUL SYLLABLE PIEUP EU KIYEOKSIOS
+ {0x9578, 0xBE11}, //3610 #HANGUL SYLLABLE PIEUP EU NIEUNCIEUC
+ {0x9579, 0xBE12}, //3611 #HANGUL SYLLABLE PIEUP EU NIEUNHIEUH
+ {0x957A, 0xBE13}, //3612 #HANGUL SYLLABLE PIEUP EU TIKEUT
+ {0x9581, 0xBE15}, //3613 #HANGUL SYLLABLE PIEUP EU RIEULKIYEOK
+ {0x9582, 0xBE16}, //3614 #HANGUL SYLLABLE PIEUP EU RIEULMIEUM
+ {0x9583, 0xBE17}, //3615 #HANGUL SYLLABLE PIEUP EU RIEULPIEUP
+ {0x9584, 0xBE18}, //3616 #HANGUL SYLLABLE PIEUP EU RIEULSIOS
+ {0x9585, 0xBE19}, //3617 #HANGUL SYLLABLE PIEUP EU RIEULTHIEUTH
+ {0x9586, 0xBE1A}, //3618 #HANGUL SYLLABLE PIEUP EU RIEULPHIEUPH
+ {0x9587, 0xBE1B}, //3619 #HANGUL SYLLABLE PIEUP EU RIEULHIEUH
+ {0x9588, 0xBE1E}, //3620 #HANGUL SYLLABLE PIEUP EU PIEUPSIOS
+ {0x9589, 0xBE20}, //3621 #HANGUL SYLLABLE PIEUP EU SSANGSIOS
+ {0x958A, 0xBE21}, //3622 #HANGUL SYLLABLE PIEUP EU IEUNG
+ {0x958B, 0xBE22}, //3623 #HANGUL SYLLABLE PIEUP EU CIEUC
+ {0x958C, 0xBE23}, //3624 #HANGUL SYLLABLE PIEUP EU CHIEUCH
+ {0x958D, 0xBE24}, //3625 #HANGUL SYLLABLE PIEUP EU KHIEUKH
+ {0x958E, 0xBE25}, //3626 #HANGUL SYLLABLE PIEUP EU THIEUTH
+ {0x958F, 0xBE26}, //3627 #HANGUL SYLLABLE PIEUP EU PHIEUPH
+ {0x9590, 0xBE27}, //3628 #HANGUL SYLLABLE PIEUP EU HIEUH
+ {0x9591, 0xBE28}, //3629 #HANGUL SYLLABLE PIEUP YI
+ {0x9592, 0xBE29}, //3630 #HANGUL SYLLABLE PIEUP YI KIYEOK
+ {0x9593, 0xBE2A}, //3631 #HANGUL SYLLABLE PIEUP YI SSANGKIYEOK
+ {0x9594, 0xBE2B}, //3632 #HANGUL SYLLABLE PIEUP YI KIYEOKSIOS
+ {0x9595, 0xBE2C}, //3633 #HANGUL SYLLABLE PIEUP YI NIEUN
+ {0x9596, 0xBE2D}, //3634 #HANGUL SYLLABLE PIEUP YI NIEUNCIEUC
+ {0x9597, 0xBE2E}, //3635 #HANGUL SYLLABLE PIEUP YI NIEUNHIEUH
+ {0x9598, 0xBE2F}, //3636 #HANGUL SYLLABLE PIEUP YI TIKEUT
+ {0x9599, 0xBE30}, //3637 #HANGUL SYLLABLE PIEUP YI RIEUL
+ {0x959A, 0xBE31}, //3638 #HANGUL SYLLABLE PIEUP YI RIEULKIYEOK
+ {0x959B, 0xBE32}, //3639 #HANGUL SYLLABLE PIEUP YI RIEULMIEUM
+ {0x959C, 0xBE33}, //3640 #HANGUL SYLLABLE PIEUP YI RIEULPIEUP
+ {0x959D, 0xBE34}, //3641 #HANGUL SYLLABLE PIEUP YI RIEULSIOS
+ {0x959E, 0xBE35}, //3642 #HANGUL SYLLABLE PIEUP YI RIEULTHIEUTH
+ {0x959F, 0xBE36}, //3643 #HANGUL SYLLABLE PIEUP YI RIEULPHIEUPH
+ {0x95A0, 0xBE37}, //3644 #HANGUL SYLLABLE PIEUP YI RIEULHIEUH
+ {0x95A1, 0xBE38}, //3645 #HANGUL SYLLABLE PIEUP YI MIEUM
+ {0x95A2, 0xBE39}, //3646 #HANGUL SYLLABLE PIEUP YI PIEUP
+ {0x95A3, 0xBE3A}, //3647 #HANGUL SYLLABLE PIEUP YI PIEUPSIOS
+ {0x95A4, 0xBE3B}, //3648 #HANGUL SYLLABLE PIEUP YI SIOS
+ {0x95A5, 0xBE3C}, //3649 #HANGUL SYLLABLE PIEUP YI SSANGSIOS
+ {0x95A6, 0xBE3D}, //3650 #HANGUL SYLLABLE PIEUP YI IEUNG
+ {0x95A7, 0xBE3E}, //3651 #HANGUL SYLLABLE PIEUP YI CIEUC
+ {0x95A8, 0xBE3F}, //3652 #HANGUL SYLLABLE PIEUP YI CHIEUCH
+ {0x95A9, 0xBE40}, //3653 #HANGUL SYLLABLE PIEUP YI KHIEUKH
+ {0x95AA, 0xBE41}, //3654 #HANGUL SYLLABLE PIEUP YI THIEUTH
+ {0x95AB, 0xBE42}, //3655 #HANGUL SYLLABLE PIEUP YI PHIEUPH
+ {0x95AC, 0xBE43}, //3656 #HANGUL SYLLABLE PIEUP YI HIEUH
+ {0x95AD, 0xBE46}, //3657 #HANGUL SYLLABLE PIEUP I SSANGKIYEOK
+ {0x95AE, 0xBE47}, //3658 #HANGUL SYLLABLE PIEUP I KIYEOKSIOS
+ {0x95AF, 0xBE49}, //3659 #HANGUL SYLLABLE PIEUP I NIEUNCIEUC
+ {0x95B0, 0xBE4A}, //3660 #HANGUL SYLLABLE PIEUP I NIEUNHIEUH
+ {0x95B1, 0xBE4B}, //3661 #HANGUL SYLLABLE PIEUP I TIKEUT
+ {0x95B2, 0xBE4D}, //3662 #HANGUL SYLLABLE PIEUP I RIEULKIYEOK
+ {0x95B3, 0xBE4F}, //3663 #HANGUL SYLLABLE PIEUP I RIEULPIEUP
+ {0x95B4, 0xBE50}, //3664 #HANGUL SYLLABLE PIEUP I RIEULSIOS
+ {0x95B5, 0xBE51}, //3665 #HANGUL SYLLABLE PIEUP I RIEULTHIEUTH
+ {0x95B6, 0xBE52}, //3666 #HANGUL SYLLABLE PIEUP I RIEULPHIEUPH
+ {0x95B7, 0xBE53}, //3667 #HANGUL SYLLABLE PIEUP I RIEULHIEUH
+ {0x95B8, 0xBE56}, //3668 #HANGUL SYLLABLE PIEUP I PIEUPSIOS
+ {0x95B9, 0xBE58}, //3669 #HANGUL SYLLABLE PIEUP I SSANGSIOS
+ {0x95BA, 0xBE5C}, //3670 #HANGUL SYLLABLE PIEUP I KHIEUKH
+ {0x95BB, 0xBE5D}, //3671 #HANGUL SYLLABLE PIEUP I THIEUTH
+ {0x95BC, 0xBE5E}, //3672 #HANGUL SYLLABLE PIEUP I PHIEUPH
+ {0x95BD, 0xBE5F}, //3673 #HANGUL SYLLABLE PIEUP I HIEUH
+ {0x95BE, 0xBE62}, //3674 #HANGUL SYLLABLE SSANGPIEUP A SSANGKIYEOK
+ {0x95BF, 0xBE63}, //3675 #HANGUL SYLLABLE SSANGPIEUP A KIYEOKSIOS
+ {0x95C0, 0xBE65}, //3676 #HANGUL SYLLABLE SSANGPIEUP A NIEUNCIEUC
+ {0x95C1, 0xBE66}, //3677 #HANGUL SYLLABLE SSANGPIEUP A NIEUNHIEUH
+ {0x95C2, 0xBE67}, //3678 #HANGUL SYLLABLE SSANGPIEUP A TIKEUT
+ {0x95C3, 0xBE69}, //3679 #HANGUL SYLLABLE SSANGPIEUP A RIEULKIYEOK
+ {0x95C4, 0xBE6B}, //3680 #HANGUL SYLLABLE SSANGPIEUP A RIEULPIEUP
+ {0x95C5, 0xBE6C}, //3681 #HANGUL SYLLABLE SSANGPIEUP A RIEULSIOS
+ {0x95C6, 0xBE6D}, //3682 #HANGUL SYLLABLE SSANGPIEUP A RIEULTHIEUTH
+ {0x95C7, 0xBE6E}, //3683 #HANGUL SYLLABLE SSANGPIEUP A RIEULPHIEUPH
+ {0x95C8, 0xBE6F}, //3684 #HANGUL SYLLABLE SSANGPIEUP A RIEULHIEUH
+ {0x95C9, 0xBE72}, //3685 #HANGUL SYLLABLE SSANGPIEUP A PIEUPSIOS
+ {0x95CA, 0xBE76}, //3686 #HANGUL SYLLABLE SSANGPIEUP A CIEUC
+ {0x95CB, 0xBE77}, //3687 #HANGUL SYLLABLE SSANGPIEUP A CHIEUCH
+ {0x95CC, 0xBE78}, //3688 #HANGUL SYLLABLE SSANGPIEUP A KHIEUKH
+ {0x95CD, 0xBE79}, //3689 #HANGUL SYLLABLE SSANGPIEUP A THIEUTH
+ {0x95CE, 0xBE7A}, //3690 #HANGUL SYLLABLE SSANGPIEUP A PHIEUPH
+ {0x95CF, 0xBE7E}, //3691 #HANGUL SYLLABLE SSANGPIEUP AE SSANGKIYEOK
+ {0x95D0, 0xBE7F}, //3692 #HANGUL SYLLABLE SSANGPIEUP AE KIYEOKSIOS
+ {0x95D1, 0xBE81}, //3693 #HANGUL SYLLABLE SSANGPIEUP AE NIEUNCIEUC
+ {0x95D2, 0xBE82}, //3694 #HANGUL SYLLABLE SSANGPIEUP AE NIEUNHIEUH
+ {0x95D3, 0xBE83}, //3695 #HANGUL SYLLABLE SSANGPIEUP AE TIKEUT
+ {0x95D4, 0xBE85}, //3696 #HANGUL SYLLABLE SSANGPIEUP AE RIEULKIYEOK
+ {0x95D5, 0xBE86}, //3697 #HANGUL SYLLABLE SSANGPIEUP AE RIEULMIEUM
+ {0x95D6, 0xBE87}, //3698 #HANGUL SYLLABLE SSANGPIEUP AE RIEULPIEUP
+ {0x95D7, 0xBE88}, //3699 #HANGUL SYLLABLE SSANGPIEUP AE RIEULSIOS
+ {0x95D8, 0xBE89}, //3700 #HANGUL SYLLABLE SSANGPIEUP AE RIEULTHIEUTH
+ {0x95D9, 0xBE8A}, //3701 #HANGUL SYLLABLE SSANGPIEUP AE RIEULPHIEUPH
+ {0x95DA, 0xBE8B}, //3702 #HANGUL SYLLABLE SSANGPIEUP AE RIEULHIEUH
+ {0x95DB, 0xBE8E}, //3703 #HANGUL SYLLABLE SSANGPIEUP AE PIEUPSIOS
+ {0x95DC, 0xBE92}, //3704 #HANGUL SYLLABLE SSANGPIEUP AE CIEUC
+ {0x95DD, 0xBE93}, //3705 #HANGUL SYLLABLE SSANGPIEUP AE CHIEUCH
+ {0x95DE, 0xBE94}, //3706 #HANGUL SYLLABLE SSANGPIEUP AE KHIEUKH
+ {0x95DF, 0xBE95}, //3707 #HANGUL SYLLABLE SSANGPIEUP AE THIEUTH
+ {0x95E0, 0xBE96}, //3708 #HANGUL SYLLABLE SSANGPIEUP AE PHIEUPH
+ {0x95E1, 0xBE97}, //3709 #HANGUL SYLLABLE SSANGPIEUP AE HIEUH
+ {0x95E2, 0xBE9A}, //3710 #HANGUL SYLLABLE SSANGPIEUP YA SSANGKIYEOK
+ {0x95E3, 0xBE9B}, //3711 #HANGUL SYLLABLE SSANGPIEUP YA KIYEOKSIOS
+ {0x95E4, 0xBE9C}, //3712 #HANGUL SYLLABLE SSANGPIEUP YA NIEUN
+ {0x95E5, 0xBE9D}, //3713 #HANGUL SYLLABLE SSANGPIEUP YA NIEUNCIEUC
+ {0x95E6, 0xBE9E}, //3714 #HANGUL SYLLABLE SSANGPIEUP YA NIEUNHIEUH
+ {0x95E7, 0xBE9F}, //3715 #HANGUL SYLLABLE SSANGPIEUP YA TIKEUT
+ {0x95E8, 0xBEA0}, //3716 #HANGUL SYLLABLE SSANGPIEUP YA RIEUL
+ {0x95E9, 0xBEA1}, //3717 #HANGUL SYLLABLE SSANGPIEUP YA RIEULKIYEOK
+ {0x95EA, 0xBEA2}, //3718 #HANGUL SYLLABLE SSANGPIEUP YA RIEULMIEUM
+ {0x95EB, 0xBEA3}, //3719 #HANGUL SYLLABLE SSANGPIEUP YA RIEULPIEUP
+ {0x95EC, 0xBEA4}, //3720 #HANGUL SYLLABLE SSANGPIEUP YA RIEULSIOS
+ {0x95ED, 0xBEA5}, //3721 #HANGUL SYLLABLE SSANGPIEUP YA RIEULTHIEUTH
+ {0x95EE, 0xBEA6}, //3722 #HANGUL SYLLABLE SSANGPIEUP YA RIEULPHIEUPH
+ {0x95EF, 0xBEA7}, //3723 #HANGUL SYLLABLE SSANGPIEUP YA RIEULHIEUH
+ {0x95F0, 0xBEA9}, //3724 #HANGUL SYLLABLE SSANGPIEUP YA PIEUP
+ {0x95F1, 0xBEAA}, //3725 #HANGUL SYLLABLE SSANGPIEUP YA PIEUPSIOS
+ {0x95F2, 0xBEAB}, //3726 #HANGUL SYLLABLE SSANGPIEUP YA SIOS
+ {0x95F3, 0xBEAC}, //3727 #HANGUL SYLLABLE SSANGPIEUP YA SSANGSIOS
+ {0x95F4, 0xBEAD}, //3728 #HANGUL SYLLABLE SSANGPIEUP YA IEUNG
+ {0x95F5, 0xBEAE}, //3729 #HANGUL SYLLABLE SSANGPIEUP YA CIEUC
+ {0x95F6, 0xBEAF}, //3730 #HANGUL SYLLABLE SSANGPIEUP YA CHIEUCH
+ {0x95F7, 0xBEB0}, //3731 #HANGUL SYLLABLE SSANGPIEUP YA KHIEUKH
+ {0x95F8, 0xBEB1}, //3732 #HANGUL SYLLABLE SSANGPIEUP YA THIEUTH
+ {0x95F9, 0xBEB2}, //3733 #HANGUL SYLLABLE SSANGPIEUP YA PHIEUPH
+ {0x95FA, 0xBEB3}, //3734 #HANGUL SYLLABLE SSANGPIEUP YA HIEUH
+ {0x95FB, 0xBEB4}, //3735 #HANGUL SYLLABLE SSANGPIEUP YAE
+ {0x95FC, 0xBEB5}, //3736 #HANGUL SYLLABLE SSANGPIEUP YAE KIYEOK
+ {0x95FD, 0xBEB6}, //3737 #HANGUL SYLLABLE SSANGPIEUP YAE SSANGKIYEOK
+ {0x95FE, 0xBEB7}, //3738 #HANGUL SYLLABLE SSANGPIEUP YAE KIYEOKSIOS
+ {0x9641, 0xBEB8}, //3739 #HANGUL SYLLABLE SSANGPIEUP YAE NIEUN
+ {0x9642, 0xBEB9}, //3740 #HANGUL SYLLABLE SSANGPIEUP YAE NIEUNCIEUC
+ {0x9643, 0xBEBA}, //3741 #HANGUL SYLLABLE SSANGPIEUP YAE NIEUNHIEUH
+ {0x9644, 0xBEBB}, //3742 #HANGUL SYLLABLE SSANGPIEUP YAE TIKEUT
+ {0x9645, 0xBEBC}, //3743 #HANGUL SYLLABLE SSANGPIEUP YAE RIEUL
+ {0x9646, 0xBEBD}, //3744 #HANGUL SYLLABLE SSANGPIEUP YAE RIEULKIYEOK
+ {0x9647, 0xBEBE}, //3745 #HANGUL SYLLABLE SSANGPIEUP YAE RIEULMIEUM
+ {0x9648, 0xBEBF}, //3746 #HANGUL SYLLABLE SSANGPIEUP YAE RIEULPIEUP
+ {0x9649, 0xBEC0}, //3747 #HANGUL SYLLABLE SSANGPIEUP YAE RIEULSIOS
+ {0x964A, 0xBEC1}, //3748 #HANGUL SYLLABLE SSANGPIEUP YAE RIEULTHIEUTH
+ {0x964B, 0xBEC2}, //3749 #HANGUL SYLLABLE SSANGPIEUP YAE RIEULPHIEUPH
+ {0x964C, 0xBEC3}, //3750 #HANGUL SYLLABLE SSANGPIEUP YAE RIEULHIEUH
+ {0x964D, 0xBEC4}, //3751 #HANGUL SYLLABLE SSANGPIEUP YAE MIEUM
+ {0x964E, 0xBEC5}, //3752 #HANGUL SYLLABLE SSANGPIEUP YAE PIEUP
+ {0x964F, 0xBEC6}, //3753 #HANGUL SYLLABLE SSANGPIEUP YAE PIEUPSIOS
+ {0x9650, 0xBEC7}, //3754 #HANGUL SYLLABLE SSANGPIEUP YAE SIOS
+ {0x9651, 0xBEC8}, //3755 #HANGUL SYLLABLE SSANGPIEUP YAE SSANGSIOS
+ {0x9652, 0xBEC9}, //3756 #HANGUL SYLLABLE SSANGPIEUP YAE IEUNG
+ {0x9653, 0xBECA}, //3757 #HANGUL SYLLABLE SSANGPIEUP YAE CIEUC
+ {0x9654, 0xBECB}, //3758 #HANGUL SYLLABLE SSANGPIEUP YAE CHIEUCH
+ {0x9655, 0xBECC}, //3759 #HANGUL SYLLABLE SSANGPIEUP YAE KHIEUKH
+ {0x9656, 0xBECD}, //3760 #HANGUL SYLLABLE SSANGPIEUP YAE THIEUTH
+ {0x9657, 0xBECE}, //3761 #HANGUL SYLLABLE SSANGPIEUP YAE PHIEUPH
+ {0x9658, 0xBECF}, //3762 #HANGUL SYLLABLE SSANGPIEUP YAE HIEUH
+ {0x9659, 0xBED2}, //3763 #HANGUL SYLLABLE SSANGPIEUP EO SSANGKIYEOK
+ {0x965A, 0xBED3}, //3764 #HANGUL SYLLABLE SSANGPIEUP EO KIYEOKSIOS
+ {0x9661, 0xBED5}, //3765 #HANGUL SYLLABLE SSANGPIEUP EO NIEUNCIEUC
+ {0x9662, 0xBED6}, //3766 #HANGUL SYLLABLE SSANGPIEUP EO NIEUNHIEUH
+ {0x9663, 0xBED9}, //3767 #HANGUL SYLLABLE SSANGPIEUP EO RIEULKIYEOK
+ {0x9664, 0xBEDA}, //3768 #HANGUL SYLLABLE SSANGPIEUP EO RIEULMIEUM
+ {0x9665, 0xBEDB}, //3769 #HANGUL SYLLABLE SSANGPIEUP EO RIEULPIEUP
+ {0x9666, 0xBEDC}, //3770 #HANGUL SYLLABLE SSANGPIEUP EO RIEULSIOS
+ {0x9667, 0xBEDD}, //3771 #HANGUL SYLLABLE SSANGPIEUP EO RIEULTHIEUTH
+ {0x9668, 0xBEDE}, //3772 #HANGUL SYLLABLE SSANGPIEUP EO RIEULPHIEUPH
+ {0x9669, 0xBEDF}, //3773 #HANGUL SYLLABLE SSANGPIEUP EO RIEULHIEUH
+ {0x966A, 0xBEE1}, //3774 #HANGUL SYLLABLE SSANGPIEUP EO PIEUP
+ {0x966B, 0xBEE2}, //3775 #HANGUL SYLLABLE SSANGPIEUP EO PIEUPSIOS
+ {0x966C, 0xBEE6}, //3776 #HANGUL SYLLABLE SSANGPIEUP EO CIEUC
+ {0x966D, 0xBEE7}, //3777 #HANGUL SYLLABLE SSANGPIEUP EO CHIEUCH
+ {0x966E, 0xBEE8}, //3778 #HANGUL SYLLABLE SSANGPIEUP EO KHIEUKH
+ {0x966F, 0xBEE9}, //3779 #HANGUL SYLLABLE SSANGPIEUP EO THIEUTH
+ {0x9670, 0xBEEA}, //3780 #HANGUL SYLLABLE SSANGPIEUP EO PHIEUPH
+ {0x9671, 0xBEEB}, //3781 #HANGUL SYLLABLE SSANGPIEUP EO HIEUH
+ {0x9672, 0xBEED}, //3782 #HANGUL SYLLABLE SSANGPIEUP E KIYEOK
+ {0x9673, 0xBEEE}, //3783 #HANGUL SYLLABLE SSANGPIEUP E SSANGKIYEOK
+ {0x9674, 0xBEEF}, //3784 #HANGUL SYLLABLE SSANGPIEUP E KIYEOKSIOS
+ {0x9675, 0xBEF0}, //3785 #HANGUL SYLLABLE SSANGPIEUP E NIEUN
+ {0x9676, 0xBEF1}, //3786 #HANGUL SYLLABLE SSANGPIEUP E NIEUNCIEUC
+ {0x9677, 0xBEF2}, //3787 #HANGUL SYLLABLE SSANGPIEUP E NIEUNHIEUH
+ {0x9678, 0xBEF3}, //3788 #HANGUL SYLLABLE SSANGPIEUP E TIKEUT
+ {0x9679, 0xBEF4}, //3789 #HANGUL SYLLABLE SSANGPIEUP E RIEUL
+ {0x967A, 0xBEF5}, //3790 #HANGUL SYLLABLE SSANGPIEUP E RIEULKIYEOK
+ {0x9681, 0xBEF6}, //3791 #HANGUL SYLLABLE SSANGPIEUP E RIEULMIEUM
+ {0x9682, 0xBEF7}, //3792 #HANGUL SYLLABLE SSANGPIEUP E RIEULPIEUP
+ {0x9683, 0xBEF8}, //3793 #HANGUL SYLLABLE SSANGPIEUP E RIEULSIOS
+ {0x9684, 0xBEF9}, //3794 #HANGUL SYLLABLE SSANGPIEUP E RIEULTHIEUTH
+ {0x9685, 0xBEFA}, //3795 #HANGUL SYLLABLE SSANGPIEUP E RIEULPHIEUPH
+ {0x9686, 0xBEFB}, //3796 #HANGUL SYLLABLE SSANGPIEUP E RIEULHIEUH
+ {0x9687, 0xBEFC}, //3797 #HANGUL SYLLABLE SSANGPIEUP E MIEUM
+ {0x9688, 0xBEFD}, //3798 #HANGUL SYLLABLE SSANGPIEUP E PIEUP
+ {0x9689, 0xBEFE}, //3799 #HANGUL SYLLABLE SSANGPIEUP E PIEUPSIOS
+ {0x968A, 0xBEFF}, //3800 #HANGUL SYLLABLE SSANGPIEUP E SIOS
+ {0x968B, 0xBF00}, //3801 #HANGUL SYLLABLE SSANGPIEUP E SSANGSIOS
+ {0x968C, 0xBF02}, //3802 #HANGUL SYLLABLE SSANGPIEUP E CIEUC
+ {0x968D, 0xBF03}, //3803 #HANGUL SYLLABLE SSANGPIEUP E CHIEUCH
+ {0x968E, 0xBF04}, //3804 #HANGUL SYLLABLE SSANGPIEUP E KHIEUKH
+ {0x968F, 0xBF05}, //3805 #HANGUL SYLLABLE SSANGPIEUP E THIEUTH
+ {0x9690, 0xBF06}, //3806 #HANGUL SYLLABLE SSANGPIEUP E PHIEUPH
+ {0x9691, 0xBF07}, //3807 #HANGUL SYLLABLE SSANGPIEUP E HIEUH
+ {0x9692, 0xBF0A}, //3808 #HANGUL SYLLABLE SSANGPIEUP YEO SSANGKIYEOK
+ {0x9693, 0xBF0B}, //3809 #HANGUL SYLLABLE SSANGPIEUP YEO KIYEOKSIOS
+ {0x9694, 0xBF0C}, //3810 #HANGUL SYLLABLE SSANGPIEUP YEO NIEUN
+ {0x9695, 0xBF0D}, //3811 #HANGUL SYLLABLE SSANGPIEUP YEO NIEUNCIEUC
+ {0x9696, 0xBF0E}, //3812 #HANGUL SYLLABLE SSANGPIEUP YEO NIEUNHIEUH
+ {0x9697, 0xBF0F}, //3813 #HANGUL SYLLABLE SSANGPIEUP YEO TIKEUT
+ {0x9698, 0xBF10}, //3814 #HANGUL SYLLABLE SSANGPIEUP YEO RIEUL
+ {0x9699, 0xBF11}, //3815 #HANGUL SYLLABLE SSANGPIEUP YEO RIEULKIYEOK
+ {0x969A, 0xBF12}, //3816 #HANGUL SYLLABLE SSANGPIEUP YEO RIEULMIEUM
+ {0x969B, 0xBF13}, //3817 #HANGUL SYLLABLE SSANGPIEUP YEO RIEULPIEUP
+ {0x969C, 0xBF14}, //3818 #HANGUL SYLLABLE SSANGPIEUP YEO RIEULSIOS
+ {0x969D, 0xBF15}, //3819 #HANGUL SYLLABLE SSANGPIEUP YEO RIEULTHIEUTH
+ {0x969E, 0xBF16}, //3820 #HANGUL SYLLABLE SSANGPIEUP YEO RIEULPHIEUPH
+ {0x969F, 0xBF17}, //3821 #HANGUL SYLLABLE SSANGPIEUP YEO RIEULHIEUH
+ {0x96A0, 0xBF1A}, //3822 #HANGUL SYLLABLE SSANGPIEUP YEO PIEUPSIOS
+ {0x96A1, 0xBF1E}, //3823 #HANGUL SYLLABLE SSANGPIEUP YEO CIEUC
+ {0x96A2, 0xBF1F}, //3824 #HANGUL SYLLABLE SSANGPIEUP YEO CHIEUCH
+ {0x96A3, 0xBF20}, //3825 #HANGUL SYLLABLE SSANGPIEUP YEO KHIEUKH
+ {0x96A4, 0xBF21}, //3826 #HANGUL SYLLABLE SSANGPIEUP YEO THIEUTH
+ {0x96A5, 0xBF22}, //3827 #HANGUL SYLLABLE SSANGPIEUP YEO PHIEUPH
+ {0x96A6, 0xBF23}, //3828 #HANGUL SYLLABLE SSANGPIEUP YEO HIEUH
+ {0x96A7, 0xBF24}, //3829 #HANGUL SYLLABLE SSANGPIEUP YE
+ {0x96A8, 0xBF25}, //3830 #HANGUL SYLLABLE SSANGPIEUP YE KIYEOK
+ {0x96A9, 0xBF26}, //3831 #HANGUL SYLLABLE SSANGPIEUP YE SSANGKIYEOK
+ {0x96AA, 0xBF27}, //3832 #HANGUL SYLLABLE SSANGPIEUP YE KIYEOKSIOS
+ {0x96AB, 0xBF28}, //3833 #HANGUL SYLLABLE SSANGPIEUP YE NIEUN
+ {0x96AC, 0xBF29}, //3834 #HANGUL SYLLABLE SSANGPIEUP YE NIEUNCIEUC
+ {0x96AD, 0xBF2A}, //3835 #HANGUL SYLLABLE SSANGPIEUP YE NIEUNHIEUH
+ {0x96AE, 0xBF2B}, //3836 #HANGUL SYLLABLE SSANGPIEUP YE TIKEUT
+ {0x96AF, 0xBF2C}, //3837 #HANGUL SYLLABLE SSANGPIEUP YE RIEUL
+ {0x96B0, 0xBF2D}, //3838 #HANGUL SYLLABLE SSANGPIEUP YE RIEULKIYEOK
+ {0x96B1, 0xBF2E}, //3839 #HANGUL SYLLABLE SSANGPIEUP YE RIEULMIEUM
+ {0x96B2, 0xBF2F}, //3840 #HANGUL SYLLABLE SSANGPIEUP YE RIEULPIEUP
+ {0x96B3, 0xBF30}, //3841 #HANGUL SYLLABLE SSANGPIEUP YE RIEULSIOS
+ {0x96B4, 0xBF31}, //3842 #HANGUL SYLLABLE SSANGPIEUP YE RIEULTHIEUTH
+ {0x96B5, 0xBF32}, //3843 #HANGUL SYLLABLE SSANGPIEUP YE RIEULPHIEUPH
+ {0x96B6, 0xBF33}, //3844 #HANGUL SYLLABLE SSANGPIEUP YE RIEULHIEUH
+ {0x96B7, 0xBF34}, //3845 #HANGUL SYLLABLE SSANGPIEUP YE MIEUM
+ {0x96B8, 0xBF35}, //3846 #HANGUL SYLLABLE SSANGPIEUP YE PIEUP
+ {0x96B9, 0xBF36}, //3847 #HANGUL SYLLABLE SSANGPIEUP YE PIEUPSIOS
+ {0x96BA, 0xBF37}, //3848 #HANGUL SYLLABLE SSANGPIEUP YE SIOS
+ {0x96BB, 0xBF38}, //3849 #HANGUL SYLLABLE SSANGPIEUP YE SSANGSIOS
+ {0x96BC, 0xBF39}, //3850 #HANGUL SYLLABLE SSANGPIEUP YE IEUNG
+ {0x96BD, 0xBF3A}, //3851 #HANGUL SYLLABLE SSANGPIEUP YE CIEUC
+ {0x96BE, 0xBF3B}, //3852 #HANGUL SYLLABLE SSANGPIEUP YE CHIEUCH
+ {0x96BF, 0xBF3C}, //3853 #HANGUL SYLLABLE SSANGPIEUP YE KHIEUKH
+ {0x96C0, 0xBF3D}, //3854 #HANGUL SYLLABLE SSANGPIEUP YE THIEUTH
+ {0x96C1, 0xBF3E}, //3855 #HANGUL SYLLABLE SSANGPIEUP YE PHIEUPH
+ {0x96C2, 0xBF3F}, //3856 #HANGUL SYLLABLE SSANGPIEUP YE HIEUH
+ {0x96C3, 0xBF42}, //3857 #HANGUL SYLLABLE SSANGPIEUP O SSANGKIYEOK
+ {0x96C4, 0xBF43}, //3858 #HANGUL SYLLABLE SSANGPIEUP O KIYEOKSIOS
+ {0x96C5, 0xBF45}, //3859 #HANGUL SYLLABLE SSANGPIEUP O NIEUNCIEUC
+ {0x96C6, 0xBF46}, //3860 #HANGUL SYLLABLE SSANGPIEUP O NIEUNHIEUH
+ {0x96C7, 0xBF47}, //3861 #HANGUL SYLLABLE SSANGPIEUP O TIKEUT
+ {0x96C8, 0xBF49}, //3862 #HANGUL SYLLABLE SSANGPIEUP O RIEULKIYEOK
+ {0x96C9, 0xBF4A}, //3863 #HANGUL SYLLABLE SSANGPIEUP O RIEULMIEUM
+ {0x96CA, 0xBF4B}, //3864 #HANGUL SYLLABLE SSANGPIEUP O RIEULPIEUP
+ {0x96CB, 0xBF4C}, //3865 #HANGUL SYLLABLE SSANGPIEUP O RIEULSIOS
+ {0x96CC, 0xBF4D}, //3866 #HANGUL SYLLABLE SSANGPIEUP O RIEULTHIEUTH
+ {0x96CD, 0xBF4E}, //3867 #HANGUL SYLLABLE SSANGPIEUP O RIEULPHIEUPH
+ {0x96CE, 0xBF4F}, //3868 #HANGUL SYLLABLE SSANGPIEUP O RIEULHIEUH
+ {0x96CF, 0xBF52}, //3869 #HANGUL SYLLABLE SSANGPIEUP O PIEUPSIOS
+ {0x96D0, 0xBF53}, //3870 #HANGUL SYLLABLE SSANGPIEUP O SIOS
+ {0x96D1, 0xBF54}, //3871 #HANGUL SYLLABLE SSANGPIEUP O SSANGSIOS
+ {0x96D2, 0xBF56}, //3872 #HANGUL SYLLABLE SSANGPIEUP O CIEUC
+ {0x96D3, 0xBF57}, //3873 #HANGUL SYLLABLE SSANGPIEUP O CHIEUCH
+ {0x96D4, 0xBF58}, //3874 #HANGUL SYLLABLE SSANGPIEUP O KHIEUKH
+ {0x96D5, 0xBF59}, //3875 #HANGUL SYLLABLE SSANGPIEUP O THIEUTH
+ {0x96D6, 0xBF5A}, //3876 #HANGUL SYLLABLE SSANGPIEUP O PHIEUPH
+ {0x96D7, 0xBF5B}, //3877 #HANGUL SYLLABLE SSANGPIEUP O HIEUH
+ {0x96D8, 0xBF5C}, //3878 #HANGUL SYLLABLE SSANGPIEUP WA
+ {0x96D9, 0xBF5D}, //3879 #HANGUL SYLLABLE SSANGPIEUP WA KIYEOK
+ {0x96DA, 0xBF5E}, //3880 #HANGUL SYLLABLE SSANGPIEUP WA SSANGKIYEOK
+ {0x96DB, 0xBF5F}, //3881 #HANGUL SYLLABLE SSANGPIEUP WA KIYEOKSIOS
+ {0x96DC, 0xBF60}, //3882 #HANGUL SYLLABLE SSANGPIEUP WA NIEUN
+ {0x96DD, 0xBF61}, //3883 #HANGUL SYLLABLE SSANGPIEUP WA NIEUNCIEUC
+ {0x96DE, 0xBF62}, //3884 #HANGUL SYLLABLE SSANGPIEUP WA NIEUNHIEUH
+ {0x96DF, 0xBF63}, //3885 #HANGUL SYLLABLE SSANGPIEUP WA TIKEUT
+ {0x96E0, 0xBF64}, //3886 #HANGUL SYLLABLE SSANGPIEUP WA RIEUL
+ {0x96E1, 0xBF65}, //3887 #HANGUL SYLLABLE SSANGPIEUP WA RIEULKIYEOK
+ {0x96E2, 0xBF66}, //3888 #HANGUL SYLLABLE SSANGPIEUP WA RIEULMIEUM
+ {0x96E3, 0xBF67}, //3889 #HANGUL SYLLABLE SSANGPIEUP WA RIEULPIEUP
+ {0x96E4, 0xBF68}, //3890 #HANGUL SYLLABLE SSANGPIEUP WA RIEULSIOS
+ {0x96E5, 0xBF69}, //3891 #HANGUL SYLLABLE SSANGPIEUP WA RIEULTHIEUTH
+ {0x96E6, 0xBF6A}, //3892 #HANGUL SYLLABLE SSANGPIEUP WA RIEULPHIEUPH
+ {0x96E7, 0xBF6B}, //3893 #HANGUL SYLLABLE SSANGPIEUP WA RIEULHIEUH
+ {0x96E8, 0xBF6C}, //3894 #HANGUL SYLLABLE SSANGPIEUP WA MIEUM
+ {0x96E9, 0xBF6D}, //3895 #HANGUL SYLLABLE SSANGPIEUP WA PIEUP
+ {0x96EA, 0xBF6E}, //3896 #HANGUL SYLLABLE SSANGPIEUP WA PIEUPSIOS
+ {0x96EB, 0xBF6F}, //3897 #HANGUL SYLLABLE SSANGPIEUP WA SIOS
+ {0x96EC, 0xBF70}, //3898 #HANGUL SYLLABLE SSANGPIEUP WA SSANGSIOS
+ {0x96ED, 0xBF71}, //3899 #HANGUL SYLLABLE SSANGPIEUP WA IEUNG
+ {0x96EE, 0xBF72}, //3900 #HANGUL SYLLABLE SSANGPIEUP WA CIEUC
+ {0x96EF, 0xBF73}, //3901 #HANGUL SYLLABLE SSANGPIEUP WA CHIEUCH
+ {0x96F0, 0xBF74}, //3902 #HANGUL SYLLABLE SSANGPIEUP WA KHIEUKH
+ {0x96F1, 0xBF75}, //3903 #HANGUL SYLLABLE SSANGPIEUP WA THIEUTH
+ {0x96F2, 0xBF76}, //3904 #HANGUL SYLLABLE SSANGPIEUP WA PHIEUPH
+ {0x96F3, 0xBF77}, //3905 #HANGUL SYLLABLE SSANGPIEUP WA HIEUH
+ {0x96F4, 0xBF78}, //3906 #HANGUL SYLLABLE SSANGPIEUP WAE
+ {0x96F5, 0xBF79}, //3907 #HANGUL SYLLABLE SSANGPIEUP WAE KIYEOK
+ {0x96F6, 0xBF7A}, //3908 #HANGUL SYLLABLE SSANGPIEUP WAE SSANGKIYEOK
+ {0x96F7, 0xBF7B}, //3909 #HANGUL SYLLABLE SSANGPIEUP WAE KIYEOKSIOS
+ {0x96F8, 0xBF7C}, //3910 #HANGUL SYLLABLE SSANGPIEUP WAE NIEUN
+ {0x96F9, 0xBF7D}, //3911 #HANGUL SYLLABLE SSANGPIEUP WAE NIEUNCIEUC
+ {0x96FA, 0xBF7E}, //3912 #HANGUL SYLLABLE SSANGPIEUP WAE NIEUNHIEUH
+ {0x96FB, 0xBF7F}, //3913 #HANGUL SYLLABLE SSANGPIEUP WAE TIKEUT
+ {0x96FC, 0xBF80}, //3914 #HANGUL SYLLABLE SSANGPIEUP WAE RIEUL
+ {0x96FD, 0xBF81}, //3915 #HANGUL SYLLABLE SSANGPIEUP WAE RIEULKIYEOK
+ {0x96FE, 0xBF82}, //3916 #HANGUL SYLLABLE SSANGPIEUP WAE RIEULMIEUM
+ {0x9741, 0xBF83}, //3917 #HANGUL SYLLABLE SSANGPIEUP WAE RIEULPIEUP
+ {0x9742, 0xBF84}, //3918 #HANGUL SYLLABLE SSANGPIEUP WAE RIEULSIOS
+ {0x9743, 0xBF85}, //3919 #HANGUL SYLLABLE SSANGPIEUP WAE RIEULTHIEUTH
+ {0x9744, 0xBF86}, //3920 #HANGUL SYLLABLE SSANGPIEUP WAE RIEULPHIEUPH
+ {0x9745, 0xBF87}, //3921 #HANGUL SYLLABLE SSANGPIEUP WAE RIEULHIEUH
+ {0x9746, 0xBF88}, //3922 #HANGUL SYLLABLE SSANGPIEUP WAE MIEUM
+ {0x9747, 0xBF89}, //3923 #HANGUL SYLLABLE SSANGPIEUP WAE PIEUP
+ {0x9748, 0xBF8A}, //3924 #HANGUL SYLLABLE SSANGPIEUP WAE PIEUPSIOS
+ {0x9749, 0xBF8B}, //3925 #HANGUL SYLLABLE SSANGPIEUP WAE SIOS
+ {0x974A, 0xBF8C}, //3926 #HANGUL SYLLABLE SSANGPIEUP WAE SSANGSIOS
+ {0x974B, 0xBF8D}, //3927 #HANGUL SYLLABLE SSANGPIEUP WAE IEUNG
+ {0x974C, 0xBF8E}, //3928 #HANGUL SYLLABLE SSANGPIEUP WAE CIEUC
+ {0x974D, 0xBF8F}, //3929 #HANGUL SYLLABLE SSANGPIEUP WAE CHIEUCH
+ {0x974E, 0xBF90}, //3930 #HANGUL SYLLABLE SSANGPIEUP WAE KHIEUKH
+ {0x974F, 0xBF91}, //3931 #HANGUL SYLLABLE SSANGPIEUP WAE THIEUTH
+ {0x9750, 0xBF92}, //3932 #HANGUL SYLLABLE SSANGPIEUP WAE PHIEUPH
+ {0x9751, 0xBF93}, //3933 #HANGUL SYLLABLE SSANGPIEUP WAE HIEUH
+ {0x9752, 0xBF95}, //3934 #HANGUL SYLLABLE SSANGPIEUP OE KIYEOK
+ {0x9753, 0xBF96}, //3935 #HANGUL SYLLABLE SSANGPIEUP OE SSANGKIYEOK
+ {0x9754, 0xBF97}, //3936 #HANGUL SYLLABLE SSANGPIEUP OE KIYEOKSIOS
+ {0x9755, 0xBF98}, //3937 #HANGUL SYLLABLE SSANGPIEUP OE NIEUN
+ {0x9756, 0xBF99}, //3938 #HANGUL SYLLABLE SSANGPIEUP OE NIEUNCIEUC
+ {0x9757, 0xBF9A}, //3939 #HANGUL SYLLABLE SSANGPIEUP OE NIEUNHIEUH
+ {0x9758, 0xBF9B}, //3940 #HANGUL SYLLABLE SSANGPIEUP OE TIKEUT
+ {0x9759, 0xBF9C}, //3941 #HANGUL SYLLABLE SSANGPIEUP OE RIEUL
+ {0x975A, 0xBF9D}, //3942 #HANGUL SYLLABLE SSANGPIEUP OE RIEULKIYEOK
+ {0x9761, 0xBF9E}, //3943 #HANGUL SYLLABLE SSANGPIEUP OE RIEULMIEUM
+ {0x9762, 0xBF9F}, //3944 #HANGUL SYLLABLE SSANGPIEUP OE RIEULPIEUP
+ {0x9763, 0xBFA0}, //3945 #HANGUL SYLLABLE SSANGPIEUP OE RIEULSIOS
+ {0x9764, 0xBFA1}, //3946 #HANGUL SYLLABLE SSANGPIEUP OE RIEULTHIEUTH
+ {0x9765, 0xBFA2}, //3947 #HANGUL SYLLABLE SSANGPIEUP OE RIEULPHIEUPH
+ {0x9766, 0xBFA3}, //3948 #HANGUL SYLLABLE SSANGPIEUP OE RIEULHIEUH
+ {0x9767, 0xBFA4}, //3949 #HANGUL SYLLABLE SSANGPIEUP OE MIEUM
+ {0x9768, 0xBFA5}, //3950 #HANGUL SYLLABLE SSANGPIEUP OE PIEUP
+ {0x9769, 0xBFA6}, //3951 #HANGUL SYLLABLE SSANGPIEUP OE PIEUPSIOS
+ {0x976A, 0xBFA7}, //3952 #HANGUL SYLLABLE SSANGPIEUP OE SIOS
+ {0x976B, 0xBFA8}, //3953 #HANGUL SYLLABLE SSANGPIEUP OE SSANGSIOS
+ {0x976C, 0xBFA9}, //3954 #HANGUL SYLLABLE SSANGPIEUP OE IEUNG
+ {0x976D, 0xBFAA}, //3955 #HANGUL SYLLABLE SSANGPIEUP OE CIEUC
+ {0x976E, 0xBFAB}, //3956 #HANGUL SYLLABLE SSANGPIEUP OE CHIEUCH
+ {0x976F, 0xBFAC}, //3957 #HANGUL SYLLABLE SSANGPIEUP OE KHIEUKH
+ {0x9770, 0xBFAD}, //3958 #HANGUL SYLLABLE SSANGPIEUP OE THIEUTH
+ {0x9771, 0xBFAE}, //3959 #HANGUL SYLLABLE SSANGPIEUP OE PHIEUPH
+ {0x9772, 0xBFAF}, //3960 #HANGUL SYLLABLE SSANGPIEUP OE HIEUH
+ {0x9773, 0xBFB1}, //3961 #HANGUL SYLLABLE SSANGPIEUP YO KIYEOK
+ {0x9774, 0xBFB2}, //3962 #HANGUL SYLLABLE SSANGPIEUP YO SSANGKIYEOK
+ {0x9775, 0xBFB3}, //3963 #HANGUL SYLLABLE SSANGPIEUP YO KIYEOKSIOS
+ {0x9776, 0xBFB4}, //3964 #HANGUL SYLLABLE SSANGPIEUP YO NIEUN
+ {0x9777, 0xBFB5}, //3965 #HANGUL SYLLABLE SSANGPIEUP YO NIEUNCIEUC
+ {0x9778, 0xBFB6}, //3966 #HANGUL SYLLABLE SSANGPIEUP YO NIEUNHIEUH
+ {0x9779, 0xBFB7}, //3967 #HANGUL SYLLABLE SSANGPIEUP YO TIKEUT
+ {0x977A, 0xBFB8}, //3968 #HANGUL SYLLABLE SSANGPIEUP YO RIEUL
+ {0x9781, 0xBFB9}, //3969 #HANGUL SYLLABLE SSANGPIEUP YO RIEULKIYEOK
+ {0x9782, 0xBFBA}, //3970 #HANGUL SYLLABLE SSANGPIEUP YO RIEULMIEUM
+ {0x9783, 0xBFBB}, //3971 #HANGUL SYLLABLE SSANGPIEUP YO RIEULPIEUP
+ {0x9784, 0xBFBC}, //3972 #HANGUL SYLLABLE SSANGPIEUP YO RIEULSIOS
+ {0x9785, 0xBFBD}, //3973 #HANGUL SYLLABLE SSANGPIEUP YO RIEULTHIEUTH
+ {0x9786, 0xBFBE}, //3974 #HANGUL SYLLABLE SSANGPIEUP YO RIEULPHIEUPH
+ {0x9787, 0xBFBF}, //3975 #HANGUL SYLLABLE SSANGPIEUP YO RIEULHIEUH
+ {0x9788, 0xBFC0}, //3976 #HANGUL SYLLABLE SSANGPIEUP YO MIEUM
+ {0x9789, 0xBFC1}, //3977 #HANGUL SYLLABLE SSANGPIEUP YO PIEUP
+ {0x978A, 0xBFC2}, //3978 #HANGUL SYLLABLE SSANGPIEUP YO PIEUPSIOS
+ {0x978B, 0xBFC3}, //3979 #HANGUL SYLLABLE SSANGPIEUP YO SIOS
+ {0x978C, 0xBFC4}, //3980 #HANGUL SYLLABLE SSANGPIEUP YO SSANGSIOS
+ {0x978D, 0xBFC6}, //3981 #HANGUL SYLLABLE SSANGPIEUP YO CIEUC
+ {0x978E, 0xBFC7}, //3982 #HANGUL SYLLABLE SSANGPIEUP YO CHIEUCH
+ {0x978F, 0xBFC8}, //3983 #HANGUL SYLLABLE SSANGPIEUP YO KHIEUKH
+ {0x9790, 0xBFC9}, //3984 #HANGUL SYLLABLE SSANGPIEUP YO THIEUTH
+ {0x9791, 0xBFCA}, //3985 #HANGUL SYLLABLE SSANGPIEUP YO PHIEUPH
+ {0x9792, 0xBFCB}, //3986 #HANGUL SYLLABLE SSANGPIEUP YO HIEUH
+ {0x9793, 0xBFCE}, //3987 #HANGUL SYLLABLE SSANGPIEUP U SSANGKIYEOK
+ {0x9794, 0xBFCF}, //3988 #HANGUL SYLLABLE SSANGPIEUP U KIYEOKSIOS
+ {0x9795, 0xBFD1}, //3989 #HANGUL SYLLABLE SSANGPIEUP U NIEUNCIEUC
+ {0x9796, 0xBFD2}, //3990 #HANGUL SYLLABLE SSANGPIEUP U NIEUNHIEUH
+ {0x9797, 0xBFD3}, //3991 #HANGUL SYLLABLE SSANGPIEUP U TIKEUT
+ {0x9798, 0xBFD5}, //3992 #HANGUL SYLLABLE SSANGPIEUP U RIEULKIYEOK
+ {0x9799, 0xBFD6}, //3993 #HANGUL SYLLABLE SSANGPIEUP U RIEULMIEUM
+ {0x979A, 0xBFD7}, //3994 #HANGUL SYLLABLE SSANGPIEUP U RIEULPIEUP
+ {0x979B, 0xBFD8}, //3995 #HANGUL SYLLABLE SSANGPIEUP U RIEULSIOS
+ {0x979C, 0xBFD9}, //3996 #HANGUL SYLLABLE SSANGPIEUP U RIEULTHIEUTH
+ {0x979D, 0xBFDA}, //3997 #HANGUL SYLLABLE SSANGPIEUP U RIEULPHIEUPH
+ {0x979E, 0xBFDB}, //3998 #HANGUL SYLLABLE SSANGPIEUP U RIEULHIEUH
+ {0x979F, 0xBFDD}, //3999 #HANGUL SYLLABLE SSANGPIEUP U PIEUP
+ {0x97A0, 0xBFDE}, //4000 #HANGUL SYLLABLE SSANGPIEUP U PIEUPSIOS
+ {0x97A1, 0xBFE0}, //4001 #HANGUL SYLLABLE SSANGPIEUP U SSANGSIOS
+ {0x97A2, 0xBFE2}, //4002 #HANGUL SYLLABLE SSANGPIEUP U CIEUC
+ {0x97A3, 0xBFE3}, //4003 #HANGUL SYLLABLE SSANGPIEUP U CHIEUCH
+ {0x97A4, 0xBFE4}, //4004 #HANGUL SYLLABLE SSANGPIEUP U KHIEUKH
+ {0x97A5, 0xBFE5}, //4005 #HANGUL SYLLABLE SSANGPIEUP U THIEUTH
+ {0x97A6, 0xBFE6}, //4006 #HANGUL SYLLABLE SSANGPIEUP U PHIEUPH
+ {0x97A7, 0xBFE7}, //4007 #HANGUL SYLLABLE SSANGPIEUP U HIEUH
+ {0x97A8, 0xBFE8}, //4008 #HANGUL SYLLABLE SSANGPIEUP WEO
+ {0x97A9, 0xBFE9}, //4009 #HANGUL SYLLABLE SSANGPIEUP WEO KIYEOK
+ {0x97AA, 0xBFEA}, //4010 #HANGUL SYLLABLE SSANGPIEUP WEO SSANGKIYEOK
+ {0x97AB, 0xBFEB}, //4011 #HANGUL SYLLABLE SSANGPIEUP WEO KIYEOKSIOS
+ {0x97AC, 0xBFEC}, //4012 #HANGUL SYLLABLE SSANGPIEUP WEO NIEUN
+ {0x97AD, 0xBFED}, //4013 #HANGUL SYLLABLE SSANGPIEUP WEO NIEUNCIEUC
+ {0x97AE, 0xBFEE}, //4014 #HANGUL SYLLABLE SSANGPIEUP WEO NIEUNHIEUH
+ {0x97AF, 0xBFEF}, //4015 #HANGUL SYLLABLE SSANGPIEUP WEO TIKEUT
+ {0x97B0, 0xBFF0}, //4016 #HANGUL SYLLABLE SSANGPIEUP WEO RIEUL
+ {0x97B1, 0xBFF1}, //4017 #HANGUL SYLLABLE SSANGPIEUP WEO RIEULKIYEOK
+ {0x97B2, 0xBFF2}, //4018 #HANGUL SYLLABLE SSANGPIEUP WEO RIEULMIEUM
+ {0x97B3, 0xBFF3}, //4019 #HANGUL SYLLABLE SSANGPIEUP WEO RIEULPIEUP
+ {0x97B4, 0xBFF4}, //4020 #HANGUL SYLLABLE SSANGPIEUP WEO RIEULSIOS
+ {0x97B5, 0xBFF5}, //4021 #HANGUL SYLLABLE SSANGPIEUP WEO RIEULTHIEUTH
+ {0x97B6, 0xBFF6}, //4022 #HANGUL SYLLABLE SSANGPIEUP WEO RIEULPHIEUPH
+ {0x97B7, 0xBFF7}, //4023 #HANGUL SYLLABLE SSANGPIEUP WEO RIEULHIEUH
+ {0x97B8, 0xBFF8}, //4024 #HANGUL SYLLABLE SSANGPIEUP WEO MIEUM
+ {0x97B9, 0xBFF9}, //4025 #HANGUL SYLLABLE SSANGPIEUP WEO PIEUP
+ {0x97BA, 0xBFFA}, //4026 #HANGUL SYLLABLE SSANGPIEUP WEO PIEUPSIOS
+ {0x97BB, 0xBFFB}, //4027 #HANGUL SYLLABLE SSANGPIEUP WEO SIOS
+ {0x97BC, 0xBFFC}, //4028 #HANGUL SYLLABLE SSANGPIEUP WEO SSANGSIOS
+ {0x97BD, 0xBFFD}, //4029 #HANGUL SYLLABLE SSANGPIEUP WEO IEUNG
+ {0x97BE, 0xBFFE}, //4030 #HANGUL SYLLABLE SSANGPIEUP WEO CIEUC
+ {0x97BF, 0xBFFF}, //4031 #HANGUL SYLLABLE SSANGPIEUP WEO CHIEUCH
+ {0x97C0, 0xC000}, //4032 #HANGUL SYLLABLE SSANGPIEUP WEO KHIEUKH
+ {0x97C1, 0xC001}, //4033 #HANGUL SYLLABLE SSANGPIEUP WEO THIEUTH
+ {0x97C2, 0xC002}, //4034 #HANGUL SYLLABLE SSANGPIEUP WEO PHIEUPH
+ {0x97C3, 0xC003}, //4035 #HANGUL SYLLABLE SSANGPIEUP WEO HIEUH
+ {0x97C4, 0xC004}, //4036 #HANGUL SYLLABLE SSANGPIEUP WE
+ {0x97C5, 0xC005}, //4037 #HANGUL SYLLABLE SSANGPIEUP WE KIYEOK
+ {0x97C6, 0xC006}, //4038 #HANGUL SYLLABLE SSANGPIEUP WE SSANGKIYEOK
+ {0x97C7, 0xC007}, //4039 #HANGUL SYLLABLE SSANGPIEUP WE KIYEOKSIOS
+ {0x97C8, 0xC008}, //4040 #HANGUL SYLLABLE SSANGPIEUP WE NIEUN
+ {0x97C9, 0xC009}, //4041 #HANGUL SYLLABLE SSANGPIEUP WE NIEUNCIEUC
+ {0x97CA, 0xC00A}, //4042 #HANGUL SYLLABLE SSANGPIEUP WE NIEUNHIEUH
+ {0x97CB, 0xC00B}, //4043 #HANGUL SYLLABLE SSANGPIEUP WE TIKEUT
+ {0x97CC, 0xC00C}, //4044 #HANGUL SYLLABLE SSANGPIEUP WE RIEUL
+ {0x97CD, 0xC00D}, //4045 #HANGUL SYLLABLE SSANGPIEUP WE RIEULKIYEOK
+ {0x97CE, 0xC00E}, //4046 #HANGUL SYLLABLE SSANGPIEUP WE RIEULMIEUM
+ {0x97CF, 0xC00F}, //4047 #HANGUL SYLLABLE SSANGPIEUP WE RIEULPIEUP
+ {0x97D0, 0xC010}, //4048 #HANGUL SYLLABLE SSANGPIEUP WE RIEULSIOS
+ {0x97D1, 0xC011}, //4049 #HANGUL SYLLABLE SSANGPIEUP WE RIEULTHIEUTH
+ {0x97D2, 0xC012}, //4050 #HANGUL SYLLABLE SSANGPIEUP WE RIEULPHIEUPH
+ {0x97D3, 0xC013}, //4051 #HANGUL SYLLABLE SSANGPIEUP WE RIEULHIEUH
+ {0x97D4, 0xC014}, //4052 #HANGUL SYLLABLE SSANGPIEUP WE MIEUM
+ {0x97D5, 0xC015}, //4053 #HANGUL SYLLABLE SSANGPIEUP WE PIEUP
+ {0x97D6, 0xC016}, //4054 #HANGUL SYLLABLE SSANGPIEUP WE PIEUPSIOS
+ {0x97D7, 0xC017}, //4055 #HANGUL SYLLABLE SSANGPIEUP WE SIOS
+ {0x97D8, 0xC018}, //4056 #HANGUL SYLLABLE SSANGPIEUP WE SSANGSIOS
+ {0x97D9, 0xC019}, //4057 #HANGUL SYLLABLE SSANGPIEUP WE IEUNG
+ {0x97DA, 0xC01A}, //4058 #HANGUL SYLLABLE SSANGPIEUP WE CIEUC
+ {0x97DB, 0xC01B}, //4059 #HANGUL SYLLABLE SSANGPIEUP WE CHIEUCH
+ {0x97DC, 0xC01C}, //4060 #HANGUL SYLLABLE SSANGPIEUP WE KHIEUKH
+ {0x97DD, 0xC01D}, //4061 #HANGUL SYLLABLE SSANGPIEUP WE THIEUTH
+ {0x97DE, 0xC01E}, //4062 #HANGUL SYLLABLE SSANGPIEUP WE PHIEUPH
+ {0x97DF, 0xC01F}, //4063 #HANGUL SYLLABLE SSANGPIEUP WE HIEUH
+ {0x97E0, 0xC020}, //4064 #HANGUL SYLLABLE SSANGPIEUP WI
+ {0x97E1, 0xC021}, //4065 #HANGUL SYLLABLE SSANGPIEUP WI KIYEOK
+ {0x97E2, 0xC022}, //4066 #HANGUL SYLLABLE SSANGPIEUP WI SSANGKIYEOK
+ {0x97E3, 0xC023}, //4067 #HANGUL SYLLABLE SSANGPIEUP WI KIYEOKSIOS
+ {0x97E4, 0xC024}, //4068 #HANGUL SYLLABLE SSANGPIEUP WI NIEUN
+ {0x97E5, 0xC025}, //4069 #HANGUL SYLLABLE SSANGPIEUP WI NIEUNCIEUC
+ {0x97E6, 0xC026}, //4070 #HANGUL SYLLABLE SSANGPIEUP WI NIEUNHIEUH
+ {0x97E7, 0xC027}, //4071 #HANGUL SYLLABLE SSANGPIEUP WI TIKEUT
+ {0x97E8, 0xC028}, //4072 #HANGUL SYLLABLE SSANGPIEUP WI RIEUL
+ {0x97E9, 0xC029}, //4073 #HANGUL SYLLABLE SSANGPIEUP WI RIEULKIYEOK
+ {0x97EA, 0xC02A}, //4074 #HANGUL SYLLABLE SSANGPIEUP WI RIEULMIEUM
+ {0x97EB, 0xC02B}, //4075 #HANGUL SYLLABLE SSANGPIEUP WI RIEULPIEUP
+ {0x97EC, 0xC02C}, //4076 #HANGUL SYLLABLE SSANGPIEUP WI RIEULSIOS
+ {0x97ED, 0xC02D}, //4077 #HANGUL SYLLABLE SSANGPIEUP WI RIEULTHIEUTH
+ {0x97EE, 0xC02E}, //4078 #HANGUL SYLLABLE SSANGPIEUP WI RIEULPHIEUPH
+ {0x97EF, 0xC02F}, //4079 #HANGUL SYLLABLE SSANGPIEUP WI RIEULHIEUH
+ {0x97F0, 0xC030}, //4080 #HANGUL SYLLABLE SSANGPIEUP WI MIEUM
+ {0x97F1, 0xC031}, //4081 #HANGUL SYLLABLE SSANGPIEUP WI PIEUP
+ {0x97F2, 0xC032}, //4082 #HANGUL SYLLABLE SSANGPIEUP WI PIEUPSIOS
+ {0x97F3, 0xC033}, //4083 #HANGUL SYLLABLE SSANGPIEUP WI SIOS
+ {0x97F4, 0xC034}, //4084 #HANGUL SYLLABLE SSANGPIEUP WI SSANGSIOS
+ {0x97F5, 0xC035}, //4085 #HANGUL SYLLABLE SSANGPIEUP WI IEUNG
+ {0x97F6, 0xC036}, //4086 #HANGUL SYLLABLE SSANGPIEUP WI CIEUC
+ {0x97F7, 0xC037}, //4087 #HANGUL SYLLABLE SSANGPIEUP WI CHIEUCH
+ {0x97F8, 0xC038}, //4088 #HANGUL SYLLABLE SSANGPIEUP WI KHIEUKH
+ {0x97F9, 0xC039}, //4089 #HANGUL SYLLABLE SSANGPIEUP WI THIEUTH
+ {0x97FA, 0xC03A}, //4090 #HANGUL SYLLABLE SSANGPIEUP WI PHIEUPH
+ {0x97FB, 0xC03B}, //4091 #HANGUL SYLLABLE SSANGPIEUP WI HIEUH
+ {0x97FC, 0xC03D}, //4092 #HANGUL SYLLABLE SSANGPIEUP YU KIYEOK
+ {0x97FD, 0xC03E}, //4093 #HANGUL SYLLABLE SSANGPIEUP YU SSANGKIYEOK
+ {0x97FE, 0xC03F}, //4094 #HANGUL SYLLABLE SSANGPIEUP YU KIYEOKSIOS
+ {0x9841, 0xC040}, //4095 #HANGUL SYLLABLE SSANGPIEUP YU NIEUN
+ {0x9842, 0xC041}, //4096 #HANGUL SYLLABLE SSANGPIEUP YU NIEUNCIEUC
+ {0x9843, 0xC042}, //4097 #HANGUL SYLLABLE SSANGPIEUP YU NIEUNHIEUH
+ {0x9844, 0xC043}, //4098 #HANGUL SYLLABLE SSANGPIEUP YU TIKEUT
+ {0x9845, 0xC044}, //4099 #HANGUL SYLLABLE SSANGPIEUP YU RIEUL
+ {0x9846, 0xC045}, //4100 #HANGUL SYLLABLE SSANGPIEUP YU RIEULKIYEOK
+ {0x9847, 0xC046}, //4101 #HANGUL SYLLABLE SSANGPIEUP YU RIEULMIEUM
+ {0x9848, 0xC047}, //4102 #HANGUL SYLLABLE SSANGPIEUP YU RIEULPIEUP
+ {0x9849, 0xC048}, //4103 #HANGUL SYLLABLE SSANGPIEUP YU RIEULSIOS
+ {0x984A, 0xC049}, //4104 #HANGUL SYLLABLE SSANGPIEUP YU RIEULTHIEUTH
+ {0x984B, 0xC04A}, //4105 #HANGUL SYLLABLE SSANGPIEUP YU RIEULPHIEUPH
+ {0x984C, 0xC04B}, //4106 #HANGUL SYLLABLE SSANGPIEUP YU RIEULHIEUH
+ {0x984D, 0xC04C}, //4107 #HANGUL SYLLABLE SSANGPIEUP YU MIEUM
+ {0x984E, 0xC04D}, //4108 #HANGUL SYLLABLE SSANGPIEUP YU PIEUP
+ {0x984F, 0xC04E}, //4109 #HANGUL SYLLABLE SSANGPIEUP YU PIEUPSIOS
+ {0x9850, 0xC04F}, //4110 #HANGUL SYLLABLE SSANGPIEUP YU SIOS
+ {0x9851, 0xC050}, //4111 #HANGUL SYLLABLE SSANGPIEUP YU SSANGSIOS
+ {0x9852, 0xC052}, //4112 #HANGUL SYLLABLE SSANGPIEUP YU CIEUC
+ {0x9853, 0xC053}, //4113 #HANGUL SYLLABLE SSANGPIEUP YU CHIEUCH
+ {0x9854, 0xC054}, //4114 #HANGUL SYLLABLE SSANGPIEUP YU KHIEUKH
+ {0x9855, 0xC055}, //4115 #HANGUL SYLLABLE SSANGPIEUP YU THIEUTH
+ {0x9856, 0xC056}, //4116 #HANGUL SYLLABLE SSANGPIEUP YU PHIEUPH
+ {0x9857, 0xC057}, //4117 #HANGUL SYLLABLE SSANGPIEUP YU HIEUH
+ {0x9858, 0xC059}, //4118 #HANGUL SYLLABLE SSANGPIEUP EU KIYEOK
+ {0x9859, 0xC05A}, //4119 #HANGUL SYLLABLE SSANGPIEUP EU SSANGKIYEOK
+ {0x985A, 0xC05B}, //4120 #HANGUL SYLLABLE SSANGPIEUP EU KIYEOKSIOS
+ {0x9861, 0xC05D}, //4121 #HANGUL SYLLABLE SSANGPIEUP EU NIEUNCIEUC
+ {0x9862, 0xC05E}, //4122 #HANGUL SYLLABLE SSANGPIEUP EU NIEUNHIEUH
+ {0x9863, 0xC05F}, //4123 #HANGUL SYLLABLE SSANGPIEUP EU TIKEUT
+ {0x9864, 0xC061}, //4124 #HANGUL SYLLABLE SSANGPIEUP EU RIEULKIYEOK
+ {0x9865, 0xC062}, //4125 #HANGUL SYLLABLE SSANGPIEUP EU RIEULMIEUM
+ {0x9866, 0xC063}, //4126 #HANGUL SYLLABLE SSANGPIEUP EU RIEULPIEUP
+ {0x9867, 0xC064}, //4127 #HANGUL SYLLABLE SSANGPIEUP EU RIEULSIOS
+ {0x9868, 0xC065}, //4128 #HANGUL SYLLABLE SSANGPIEUP EU RIEULTHIEUTH
+ {0x9869, 0xC066}, //4129 #HANGUL SYLLABLE SSANGPIEUP EU RIEULPHIEUPH
+ {0x986A, 0xC067}, //4130 #HANGUL SYLLABLE SSANGPIEUP EU RIEULHIEUH
+ {0x986B, 0xC06A}, //4131 #HANGUL SYLLABLE SSANGPIEUP EU PIEUPSIOS
+ {0x986C, 0xC06B}, //4132 #HANGUL SYLLABLE SSANGPIEUP EU SIOS
+ {0x986D, 0xC06C}, //4133 #HANGUL SYLLABLE SSANGPIEUP EU SSANGSIOS
+ {0x986E, 0xC06D}, //4134 #HANGUL SYLLABLE SSANGPIEUP EU IEUNG
+ {0x986F, 0xC06E}, //4135 #HANGUL SYLLABLE SSANGPIEUP EU CIEUC
+ {0x9870, 0xC06F}, //4136 #HANGUL SYLLABLE SSANGPIEUP EU CHIEUCH
+ {0x9871, 0xC070}, //4137 #HANGUL SYLLABLE SSANGPIEUP EU KHIEUKH
+ {0x9872, 0xC071}, //4138 #HANGUL SYLLABLE SSANGPIEUP EU THIEUTH
+ {0x9873, 0xC072}, //4139 #HANGUL SYLLABLE SSANGPIEUP EU PHIEUPH
+ {0x9874, 0xC073}, //4140 #HANGUL SYLLABLE SSANGPIEUP EU HIEUH
+ {0x9875, 0xC074}, //4141 #HANGUL SYLLABLE SSANGPIEUP YI
+ {0x9876, 0xC075}, //4142 #HANGUL SYLLABLE SSANGPIEUP YI KIYEOK
+ {0x9877, 0xC076}, //4143 #HANGUL SYLLABLE SSANGPIEUP YI SSANGKIYEOK
+ {0x9878, 0xC077}, //4144 #HANGUL SYLLABLE SSANGPIEUP YI KIYEOKSIOS
+ {0x9879, 0xC078}, //4145 #HANGUL SYLLABLE SSANGPIEUP YI NIEUN
+ {0x987A, 0xC079}, //4146 #HANGUL SYLLABLE SSANGPIEUP YI NIEUNCIEUC
+ {0x9881, 0xC07A}, //4147 #HANGUL SYLLABLE SSANGPIEUP YI NIEUNHIEUH
+ {0x9882, 0xC07B}, //4148 #HANGUL SYLLABLE SSANGPIEUP YI TIKEUT
+ {0x9883, 0xC07C}, //4149 #HANGUL SYLLABLE SSANGPIEUP YI RIEUL
+ {0x9884, 0xC07D}, //4150 #HANGUL SYLLABLE SSANGPIEUP YI RIEULKIYEOK
+ {0x9885, 0xC07E}, //4151 #HANGUL SYLLABLE SSANGPIEUP YI RIEULMIEUM
+ {0x9886, 0xC07F}, //4152 #HANGUL SYLLABLE SSANGPIEUP YI RIEULPIEUP
+ {0x9887, 0xC080}, //4153 #HANGUL SYLLABLE SSANGPIEUP YI RIEULSIOS
+ {0x9888, 0xC081}, //4154 #HANGUL SYLLABLE SSANGPIEUP YI RIEULTHIEUTH
+ {0x9889, 0xC082}, //4155 #HANGUL SYLLABLE SSANGPIEUP YI RIEULPHIEUPH
+ {0x988A, 0xC083}, //4156 #HANGUL SYLLABLE SSANGPIEUP YI RIEULHIEUH
+ {0x988B, 0xC084}, //4157 #HANGUL SYLLABLE SSANGPIEUP YI MIEUM
+ {0x988C, 0xC085}, //4158 #HANGUL SYLLABLE SSANGPIEUP YI PIEUP
+ {0x988D, 0xC086}, //4159 #HANGUL SYLLABLE SSANGPIEUP YI PIEUPSIOS
+ {0x988E, 0xC087}, //4160 #HANGUL SYLLABLE SSANGPIEUP YI SIOS
+ {0x988F, 0xC088}, //4161 #HANGUL SYLLABLE SSANGPIEUP YI SSANGSIOS
+ {0x9890, 0xC089}, //4162 #HANGUL SYLLABLE SSANGPIEUP YI IEUNG
+ {0x9891, 0xC08A}, //4163 #HANGUL SYLLABLE SSANGPIEUP YI CIEUC
+ {0x9892, 0xC08B}, //4164 #HANGUL SYLLABLE SSANGPIEUP YI CHIEUCH
+ {0x9893, 0xC08C}, //4165 #HANGUL SYLLABLE SSANGPIEUP YI KHIEUKH
+ {0x9894, 0xC08D}, //4166 #HANGUL SYLLABLE SSANGPIEUP YI THIEUTH
+ {0x9895, 0xC08E}, //4167 #HANGUL SYLLABLE SSANGPIEUP YI PHIEUPH
+ {0x9896, 0xC08F}, //4168 #HANGUL SYLLABLE SSANGPIEUP YI HIEUH
+ {0x9897, 0xC092}, //4169 #HANGUL SYLLABLE SSANGPIEUP I SSANGKIYEOK
+ {0x9898, 0xC093}, //4170 #HANGUL SYLLABLE SSANGPIEUP I KIYEOKSIOS
+ {0x9899, 0xC095}, //4171 #HANGUL SYLLABLE SSANGPIEUP I NIEUNCIEUC
+ {0x989A, 0xC096}, //4172 #HANGUL SYLLABLE SSANGPIEUP I NIEUNHIEUH
+ {0x989B, 0xC097}, //4173 #HANGUL SYLLABLE SSANGPIEUP I TIKEUT
+ {0x989C, 0xC099}, //4174 #HANGUL SYLLABLE SSANGPIEUP I RIEULKIYEOK
+ {0x989D, 0xC09A}, //4175 #HANGUL SYLLABLE SSANGPIEUP I RIEULMIEUM
+ {0x989E, 0xC09B}, //4176 #HANGUL SYLLABLE SSANGPIEUP I RIEULPIEUP
+ {0x989F, 0xC09C}, //4177 #HANGUL SYLLABLE SSANGPIEUP I RIEULSIOS
+ {0x98A0, 0xC09D}, //4178 #HANGUL SYLLABLE SSANGPIEUP I RIEULTHIEUTH
+ {0x98A1, 0xC09E}, //4179 #HANGUL SYLLABLE SSANGPIEUP I RIEULPHIEUPH
+ {0x98A2, 0xC09F}, //4180 #HANGUL SYLLABLE SSANGPIEUP I RIEULHIEUH
+ {0x98A3, 0xC0A2}, //4181 #HANGUL SYLLABLE SSANGPIEUP I PIEUPSIOS
+ {0x98A4, 0xC0A4}, //4182 #HANGUL SYLLABLE SSANGPIEUP I SSANGSIOS
+ {0x98A5, 0xC0A6}, //4183 #HANGUL SYLLABLE SSANGPIEUP I CIEUC
+ {0x98A6, 0xC0A7}, //4184 #HANGUL SYLLABLE SSANGPIEUP I CHIEUCH
+ {0x98A7, 0xC0A8}, //4185 #HANGUL SYLLABLE SSANGPIEUP I KHIEUKH
+ {0x98A8, 0xC0A9}, //4186 #HANGUL SYLLABLE SSANGPIEUP I THIEUTH
+ {0x98A9, 0xC0AA}, //4187 #HANGUL SYLLABLE SSANGPIEUP I PHIEUPH
+ {0x98AA, 0xC0AB}, //4188 #HANGUL SYLLABLE SSANGPIEUP I HIEUH
+ {0x98AB, 0xC0AE}, //4189 #HANGUL SYLLABLE SIOS A SSANGKIYEOK
+ {0x98AC, 0xC0B1}, //4190 #HANGUL SYLLABLE SIOS A NIEUNCIEUC
+ {0x98AD, 0xC0B2}, //4191 #HANGUL SYLLABLE SIOS A NIEUNHIEUH
+ {0x98AE, 0xC0B7}, //4192 #HANGUL SYLLABLE SIOS A RIEULPIEUP
+ {0x98AF, 0xC0B8}, //4193 #HANGUL SYLLABLE SIOS A RIEULSIOS
+ {0x98B0, 0xC0B9}, //4194 #HANGUL SYLLABLE SIOS A RIEULTHIEUTH
+ {0x98B1, 0xC0BA}, //4195 #HANGUL SYLLABLE SIOS A RIEULPHIEUPH
+ {0x98B2, 0xC0BB}, //4196 #HANGUL SYLLABLE SIOS A RIEULHIEUH
+ {0x98B3, 0xC0BE}, //4197 #HANGUL SYLLABLE SIOS A PIEUPSIOS
+ {0x98B4, 0xC0C2}, //4198 #HANGUL SYLLABLE SIOS A CIEUC
+ {0x98B5, 0xC0C3}, //4199 #HANGUL SYLLABLE SIOS A CHIEUCH
+ {0x98B6, 0xC0C4}, //4200 #HANGUL SYLLABLE SIOS A KHIEUKH
+ {0x98B7, 0xC0C6}, //4201 #HANGUL SYLLABLE SIOS A PHIEUPH
+ {0x98B8, 0xC0C7}, //4202 #HANGUL SYLLABLE SIOS A HIEUH
+ {0x98B9, 0xC0CA}, //4203 #HANGUL SYLLABLE SIOS AE SSANGKIYEOK
+ {0x98BA, 0xC0CB}, //4204 #HANGUL SYLLABLE SIOS AE KIYEOKSIOS
+ {0x98BB, 0xC0CD}, //4205 #HANGUL SYLLABLE SIOS AE NIEUNCIEUC
+ {0x98BC, 0xC0CE}, //4206 #HANGUL SYLLABLE SIOS AE NIEUNHIEUH
+ {0x98BD, 0xC0CF}, //4207 #HANGUL SYLLABLE SIOS AE TIKEUT
+ {0x98BE, 0xC0D1}, //4208 #HANGUL SYLLABLE SIOS AE RIEULKIYEOK
+ {0x98BF, 0xC0D2}, //4209 #HANGUL SYLLABLE SIOS AE RIEULMIEUM
+ {0x98C0, 0xC0D3}, //4210 #HANGUL SYLLABLE SIOS AE RIEULPIEUP
+ {0x98C1, 0xC0D4}, //4211 #HANGUL SYLLABLE SIOS AE RIEULSIOS
+ {0x98C2, 0xC0D5}, //4212 #HANGUL SYLLABLE SIOS AE RIEULTHIEUTH
+ {0x98C3, 0xC0D6}, //4213 #HANGUL SYLLABLE SIOS AE RIEULPHIEUPH
+ {0x98C4, 0xC0D7}, //4214 #HANGUL SYLLABLE SIOS AE RIEULHIEUH
+ {0x98C5, 0xC0DA}, //4215 #HANGUL SYLLABLE SIOS AE PIEUPSIOS
+ {0x98C6, 0xC0DE}, //4216 #HANGUL SYLLABLE SIOS AE CIEUC
+ {0x98C7, 0xC0DF}, //4217 #HANGUL SYLLABLE SIOS AE CHIEUCH
+ {0x98C8, 0xC0E0}, //4218 #HANGUL SYLLABLE SIOS AE KHIEUKH
+ {0x98C9, 0xC0E1}, //4219 #HANGUL SYLLABLE SIOS AE THIEUTH
+ {0x98CA, 0xC0E2}, //4220 #HANGUL SYLLABLE SIOS AE PHIEUPH
+ {0x98CB, 0xC0E3}, //4221 #HANGUL SYLLABLE SIOS AE HIEUH
+ {0x98CC, 0xC0E6}, //4222 #HANGUL SYLLABLE SIOS YA SSANGKIYEOK
+ {0x98CD, 0xC0E7}, //4223 #HANGUL SYLLABLE SIOS YA KIYEOKSIOS
+ {0x98CE, 0xC0E9}, //4224 #HANGUL SYLLABLE SIOS YA NIEUNCIEUC
+ {0x98CF, 0xC0EA}, //4225 #HANGUL SYLLABLE SIOS YA NIEUNHIEUH
+ {0x98D0, 0xC0EB}, //4226 #HANGUL SYLLABLE SIOS YA TIKEUT
+ {0x98D1, 0xC0ED}, //4227 #HANGUL SYLLABLE SIOS YA RIEULKIYEOK
+ {0x98D2, 0xC0EE}, //4228 #HANGUL SYLLABLE SIOS YA RIEULMIEUM
+ {0x98D3, 0xC0EF}, //4229 #HANGUL SYLLABLE SIOS YA RIEULPIEUP
+ {0x98D4, 0xC0F0}, //4230 #HANGUL SYLLABLE SIOS YA RIEULSIOS
+ {0x98D5, 0xC0F1}, //4231 #HANGUL SYLLABLE SIOS YA RIEULTHIEUTH
+ {0x98D6, 0xC0F2}, //4232 #HANGUL SYLLABLE SIOS YA RIEULPHIEUPH
+ {0x98D7, 0xC0F3}, //4233 #HANGUL SYLLABLE SIOS YA RIEULHIEUH
+ {0x98D8, 0xC0F6}, //4234 #HANGUL SYLLABLE SIOS YA PIEUPSIOS
+ {0x98D9, 0xC0F8}, //4235 #HANGUL SYLLABLE SIOS YA SSANGSIOS
+ {0x98DA, 0xC0FA}, //4236 #HANGUL SYLLABLE SIOS YA CIEUC
+ {0x98DB, 0xC0FB}, //4237 #HANGUL SYLLABLE SIOS YA CHIEUCH
+ {0x98DC, 0xC0FC}, //4238 #HANGUL SYLLABLE SIOS YA KHIEUKH
+ {0x98DD, 0xC0FD}, //4239 #HANGUL SYLLABLE SIOS YA THIEUTH
+ {0x98DE, 0xC0FE}, //4240 #HANGUL SYLLABLE SIOS YA PHIEUPH
+ {0x98DF, 0xC0FF}, //4241 #HANGUL SYLLABLE SIOS YA HIEUH
+ {0x98E0, 0xC101}, //4242 #HANGUL SYLLABLE SIOS YAE KIYEOK
+ {0x98E1, 0xC102}, //4243 #HANGUL SYLLABLE SIOS YAE SSANGKIYEOK
+ {0x98E2, 0xC103}, //4244 #HANGUL SYLLABLE SIOS YAE KIYEOKSIOS
+ {0x98E3, 0xC105}, //4245 #HANGUL SYLLABLE SIOS YAE NIEUNCIEUC
+ {0x98E4, 0xC106}, //4246 #HANGUL SYLLABLE SIOS YAE NIEUNHIEUH
+ {0x98E5, 0xC107}, //4247 #HANGUL SYLLABLE SIOS YAE TIKEUT
+ {0x98E6, 0xC109}, //4248 #HANGUL SYLLABLE SIOS YAE RIEULKIYEOK
+ {0x98E7, 0xC10A}, //4249 #HANGUL SYLLABLE SIOS YAE RIEULMIEUM
+ {0x98E8, 0xC10B}, //4250 #HANGUL SYLLABLE SIOS YAE RIEULPIEUP
+ {0x98E9, 0xC10C}, //4251 #HANGUL SYLLABLE SIOS YAE RIEULSIOS
+ {0x98EA, 0xC10D}, //4252 #HANGUL SYLLABLE SIOS YAE RIEULTHIEUTH
+ {0x98EB, 0xC10E}, //4253 #HANGUL SYLLABLE SIOS YAE RIEULPHIEUPH
+ {0x98EC, 0xC10F}, //4254 #HANGUL SYLLABLE SIOS YAE RIEULHIEUH
+ {0x98ED, 0xC111}, //4255 #HANGUL SYLLABLE SIOS YAE PIEUP
+ {0x98EE, 0xC112}, //4256 #HANGUL SYLLABLE SIOS YAE PIEUPSIOS
+ {0x98EF, 0xC113}, //4257 #HANGUL SYLLABLE SIOS YAE SIOS
+ {0x98F0, 0xC114}, //4258 #HANGUL SYLLABLE SIOS YAE SSANGSIOS
+ {0x98F1, 0xC116}, //4259 #HANGUL SYLLABLE SIOS YAE CIEUC
+ {0x98F2, 0xC117}, //4260 #HANGUL SYLLABLE SIOS YAE CHIEUCH
+ {0x98F3, 0xC118}, //4261 #HANGUL SYLLABLE SIOS YAE KHIEUKH
+ {0x98F4, 0xC119}, //4262 #HANGUL SYLLABLE SIOS YAE THIEUTH
+ {0x98F5, 0xC11A}, //4263 #HANGUL SYLLABLE SIOS YAE PHIEUPH
+ {0x98F6, 0xC11B}, //4264 #HANGUL SYLLABLE SIOS YAE HIEUH
+ {0x98F7, 0xC121}, //4265 #HANGUL SYLLABLE SIOS EO NIEUNCIEUC
+ {0x98F8, 0xC122}, //4266 #HANGUL SYLLABLE SIOS EO NIEUNHIEUH
+ {0x98F9, 0xC125}, //4267 #HANGUL SYLLABLE SIOS EO RIEULKIYEOK
+ {0x98FA, 0xC128}, //4268 #HANGUL SYLLABLE SIOS EO RIEULSIOS
+ {0x98FB, 0xC129}, //4269 #HANGUL SYLLABLE SIOS EO RIEULTHIEUTH
+ {0x98FC, 0xC12A}, //4270 #HANGUL SYLLABLE SIOS EO RIEULPHIEUPH
+ {0x98FD, 0xC12B}, //4271 #HANGUL SYLLABLE SIOS EO RIEULHIEUH
+ {0x98FE, 0xC12E}, //4272 #HANGUL SYLLABLE SIOS EO PIEUPSIOS
+ {0x9941, 0xC132}, //4273 #HANGUL SYLLABLE SIOS EO CIEUC
+ {0x9942, 0xC133}, //4274 #HANGUL SYLLABLE SIOS EO CHIEUCH
+ {0x9943, 0xC134}, //4275 #HANGUL SYLLABLE SIOS EO KHIEUKH
+ {0x9944, 0xC135}, //4276 #HANGUL SYLLABLE SIOS EO THIEUTH
+ {0x9945, 0xC137}, //4277 #HANGUL SYLLABLE SIOS EO HIEUH
+ {0x9946, 0xC13A}, //4278 #HANGUL SYLLABLE SIOS E SSANGKIYEOK
+ {0x9947, 0xC13B}, //4279 #HANGUL SYLLABLE SIOS E KIYEOKSIOS
+ {0x9948, 0xC13D}, //4280 #HANGUL SYLLABLE SIOS E NIEUNCIEUC
+ {0x9949, 0xC13E}, //4281 #HANGUL SYLLABLE SIOS E NIEUNHIEUH
+ {0x994A, 0xC13F}, //4282 #HANGUL SYLLABLE SIOS E TIKEUT
+ {0x994B, 0xC141}, //4283 #HANGUL SYLLABLE SIOS E RIEULKIYEOK
+ {0x994C, 0xC142}, //4284 #HANGUL SYLLABLE SIOS E RIEULMIEUM
+ {0x994D, 0xC143}, //4285 #HANGUL SYLLABLE SIOS E RIEULPIEUP
+ {0x994E, 0xC144}, //4286 #HANGUL SYLLABLE SIOS E RIEULSIOS
+ {0x994F, 0xC145}, //4287 #HANGUL SYLLABLE SIOS E RIEULTHIEUTH
+ {0x9950, 0xC146}, //4288 #HANGUL SYLLABLE SIOS E RIEULPHIEUPH
+ {0x9951, 0xC147}, //4289 #HANGUL SYLLABLE SIOS E RIEULHIEUH
+ {0x9952, 0xC14A}, //4290 #HANGUL SYLLABLE SIOS E PIEUPSIOS
+ {0x9953, 0xC14E}, //4291 #HANGUL SYLLABLE SIOS E CIEUC
+ {0x9954, 0xC14F}, //4292 #HANGUL SYLLABLE SIOS E CHIEUCH
+ {0x9955, 0xC150}, //4293 #HANGUL SYLLABLE SIOS E KHIEUKH
+ {0x9956, 0xC151}, //4294 #HANGUL SYLLABLE SIOS E THIEUTH
+ {0x9957, 0xC152}, //4295 #HANGUL SYLLABLE SIOS E PHIEUPH
+ {0x9958, 0xC153}, //4296 #HANGUL SYLLABLE SIOS E HIEUH
+ {0x9959, 0xC156}, //4297 #HANGUL SYLLABLE SIOS YEO SSANGKIYEOK
+ {0x995A, 0xC157}, //4298 #HANGUL SYLLABLE SIOS YEO KIYEOKSIOS
+ {0x9961, 0xC159}, //4299 #HANGUL SYLLABLE SIOS YEO NIEUNCIEUC
+ {0x9962, 0xC15A}, //4300 #HANGUL SYLLABLE SIOS YEO NIEUNHIEUH
+ {0x9963, 0xC15B}, //4301 #HANGUL SYLLABLE SIOS YEO TIKEUT
+ {0x9964, 0xC15D}, //4302 #HANGUL SYLLABLE SIOS YEO RIEULKIYEOK
+ {0x9965, 0xC15E}, //4303 #HANGUL SYLLABLE SIOS YEO RIEULMIEUM
+ {0x9966, 0xC15F}, //4304 #HANGUL SYLLABLE SIOS YEO RIEULPIEUP
+ {0x9967, 0xC160}, //4305 #HANGUL SYLLABLE SIOS YEO RIEULSIOS
+ {0x9968, 0xC161}, //4306 #HANGUL SYLLABLE SIOS YEO RIEULTHIEUTH
+ {0x9969, 0xC162}, //4307 #HANGUL SYLLABLE SIOS YEO RIEULPHIEUPH
+ {0x996A, 0xC163}, //4308 #HANGUL SYLLABLE SIOS YEO RIEULHIEUH
+ {0x996B, 0xC166}, //4309 #HANGUL SYLLABLE SIOS YEO PIEUPSIOS
+ {0x996C, 0xC16A}, //4310 #HANGUL SYLLABLE SIOS YEO CIEUC
+ {0x996D, 0xC16B}, //4311 #HANGUL SYLLABLE SIOS YEO CHIEUCH
+ {0x996E, 0xC16C}, //4312 #HANGUL SYLLABLE SIOS YEO KHIEUKH
+ {0x996F, 0xC16D}, //4313 #HANGUL SYLLABLE SIOS YEO THIEUTH
+ {0x9970, 0xC16E}, //4314 #HANGUL SYLLABLE SIOS YEO PHIEUPH
+ {0x9971, 0xC16F}, //4315 #HANGUL SYLLABLE SIOS YEO HIEUH
+ {0x9972, 0xC171}, //4316 #HANGUL SYLLABLE SIOS YE KIYEOK
+ {0x9973, 0xC172}, //4317 #HANGUL SYLLABLE SIOS YE SSANGKIYEOK
+ {0x9974, 0xC173}, //4318 #HANGUL SYLLABLE SIOS YE KIYEOKSIOS
+ {0x9975, 0xC175}, //4319 #HANGUL SYLLABLE SIOS YE NIEUNCIEUC
+ {0x9976, 0xC176}, //4320 #HANGUL SYLLABLE SIOS YE NIEUNHIEUH
+ {0x9977, 0xC177}, //4321 #HANGUL SYLLABLE SIOS YE TIKEUT
+ {0x9978, 0xC179}, //4322 #HANGUL SYLLABLE SIOS YE RIEULKIYEOK
+ {0x9979, 0xC17A}, //4323 #HANGUL SYLLABLE SIOS YE RIEULMIEUM
+ {0x997A, 0xC17B}, //4324 #HANGUL SYLLABLE SIOS YE RIEULPIEUP
+ {0x9981, 0xC17C}, //4325 #HANGUL SYLLABLE SIOS YE RIEULSIOS
+ {0x9982, 0xC17D}, //4326 #HANGUL SYLLABLE SIOS YE RIEULTHIEUTH
+ {0x9983, 0xC17E}, //4327 #HANGUL SYLLABLE SIOS YE RIEULPHIEUPH
+ {0x9984, 0xC17F}, //4328 #HANGUL SYLLABLE SIOS YE RIEULHIEUH
+ {0x9985, 0xC180}, //4329 #HANGUL SYLLABLE SIOS YE MIEUM
+ {0x9986, 0xC181}, //4330 #HANGUL SYLLABLE SIOS YE PIEUP
+ {0x9987, 0xC182}, //4331 #HANGUL SYLLABLE SIOS YE PIEUPSIOS
+ {0x9988, 0xC183}, //4332 #HANGUL SYLLABLE SIOS YE SIOS
+ {0x9989, 0xC184}, //4333 #HANGUL SYLLABLE SIOS YE SSANGSIOS
+ {0x998A, 0xC186}, //4334 #HANGUL SYLLABLE SIOS YE CIEUC
+ {0x998B, 0xC187}, //4335 #HANGUL SYLLABLE SIOS YE CHIEUCH
+ {0x998C, 0xC188}, //4336 #HANGUL SYLLABLE SIOS YE KHIEUKH
+ {0x998D, 0xC189}, //4337 #HANGUL SYLLABLE SIOS YE THIEUTH
+ {0x998E, 0xC18A}, //4338 #HANGUL SYLLABLE SIOS YE PHIEUPH
+ {0x998F, 0xC18B}, //4339 #HANGUL SYLLABLE SIOS YE HIEUH
+ {0x9990, 0xC18F}, //4340 #HANGUL SYLLABLE SIOS O KIYEOKSIOS
+ {0x9991, 0xC191}, //4341 #HANGUL SYLLABLE SIOS O NIEUNCIEUC
+ {0x9992, 0xC192}, //4342 #HANGUL SYLLABLE SIOS O NIEUNHIEUH
+ {0x9993, 0xC193}, //4343 #HANGUL SYLLABLE SIOS O TIKEUT
+ {0x9994, 0xC195}, //4344 #HANGUL SYLLABLE SIOS O RIEULKIYEOK
+ {0x9995, 0xC197}, //4345 #HANGUL SYLLABLE SIOS O RIEULPIEUP
+ {0x9996, 0xC198}, //4346 #HANGUL SYLLABLE SIOS O RIEULSIOS
+ {0x9997, 0xC199}, //4347 #HANGUL SYLLABLE SIOS O RIEULTHIEUTH
+ {0x9998, 0xC19A}, //4348 #HANGUL SYLLABLE SIOS O RIEULPHIEUPH
+ {0x9999, 0xC19B}, //4349 #HANGUL SYLLABLE SIOS O RIEULHIEUH
+ {0x999A, 0xC19E}, //4350 #HANGUL SYLLABLE SIOS O PIEUPSIOS
+ {0x999B, 0xC1A0}, //4351 #HANGUL SYLLABLE SIOS O SSANGSIOS
+ {0x999C, 0xC1A2}, //4352 #HANGUL SYLLABLE SIOS O CIEUC
+ {0x999D, 0xC1A3}, //4353 #HANGUL SYLLABLE SIOS O CHIEUCH
+ {0x999E, 0xC1A4}, //4354 #HANGUL SYLLABLE SIOS O KHIEUKH
+ {0x999F, 0xC1A6}, //4355 #HANGUL SYLLABLE SIOS O PHIEUPH
+ {0x99A0, 0xC1A7}, //4356 #HANGUL SYLLABLE SIOS O HIEUH
+ {0x99A1, 0xC1AA}, //4357 #HANGUL SYLLABLE SIOS WA SSANGKIYEOK
+ {0x99A2, 0xC1AB}, //4358 #HANGUL SYLLABLE SIOS WA KIYEOKSIOS
+ {0x99A3, 0xC1AD}, //4359 #HANGUL SYLLABLE SIOS WA NIEUNCIEUC
+ {0x99A4, 0xC1AE}, //4360 #HANGUL SYLLABLE SIOS WA NIEUNHIEUH
+ {0x99A5, 0xC1AF}, //4361 #HANGUL SYLLABLE SIOS WA TIKEUT
+ {0x99A6, 0xC1B1}, //4362 #HANGUL SYLLABLE SIOS WA RIEULKIYEOK
+ {0x99A7, 0xC1B2}, //4363 #HANGUL SYLLABLE SIOS WA RIEULMIEUM
+ {0x99A8, 0xC1B3}, //4364 #HANGUL SYLLABLE SIOS WA RIEULPIEUP
+ {0x99A9, 0xC1B4}, //4365 #HANGUL SYLLABLE SIOS WA RIEULSIOS
+ {0x99AA, 0xC1B5}, //4366 #HANGUL SYLLABLE SIOS WA RIEULTHIEUTH
+ {0x99AB, 0xC1B6}, //4367 #HANGUL SYLLABLE SIOS WA RIEULPHIEUPH
+ {0x99AC, 0xC1B7}, //4368 #HANGUL SYLLABLE SIOS WA RIEULHIEUH
+ {0x99AD, 0xC1B8}, //4369 #HANGUL SYLLABLE SIOS WA MIEUM
+ {0x99AE, 0xC1B9}, //4370 #HANGUL SYLLABLE SIOS WA PIEUP
+ {0x99AF, 0xC1BA}, //4371 #HANGUL SYLLABLE SIOS WA PIEUPSIOS
+ {0x99B0, 0xC1BB}, //4372 #HANGUL SYLLABLE SIOS WA SIOS
+ {0x99B1, 0xC1BC}, //4373 #HANGUL SYLLABLE SIOS WA SSANGSIOS
+ {0x99B2, 0xC1BE}, //4374 #HANGUL SYLLABLE SIOS WA CIEUC
+ {0x99B3, 0xC1BF}, //4375 #HANGUL SYLLABLE SIOS WA CHIEUCH
+ {0x99B4, 0xC1C0}, //4376 #HANGUL SYLLABLE SIOS WA KHIEUKH
+ {0x99B5, 0xC1C1}, //4377 #HANGUL SYLLABLE SIOS WA THIEUTH
+ {0x99B6, 0xC1C2}, //4378 #HANGUL SYLLABLE SIOS WA PHIEUPH
+ {0x99B7, 0xC1C3}, //4379 #HANGUL SYLLABLE SIOS WA HIEUH
+ {0x99B8, 0xC1C5}, //4380 #HANGUL SYLLABLE SIOS WAE KIYEOK
+ {0x99B9, 0xC1C6}, //4381 #HANGUL SYLLABLE SIOS WAE SSANGKIYEOK
+ {0x99BA, 0xC1C7}, //4382 #HANGUL SYLLABLE SIOS WAE KIYEOKSIOS
+ {0x99BB, 0xC1C9}, //4383 #HANGUL SYLLABLE SIOS WAE NIEUNCIEUC
+ {0x99BC, 0xC1CA}, //4384 #HANGUL SYLLABLE SIOS WAE NIEUNHIEUH
+ {0x99BD, 0xC1CB}, //4385 #HANGUL SYLLABLE SIOS WAE TIKEUT
+ {0x99BE, 0xC1CD}, //4386 #HANGUL SYLLABLE SIOS WAE RIEULKIYEOK
+ {0x99BF, 0xC1CE}, //4387 #HANGUL SYLLABLE SIOS WAE RIEULMIEUM
+ {0x99C0, 0xC1CF}, //4388 #HANGUL SYLLABLE SIOS WAE RIEULPIEUP
+ {0x99C1, 0xC1D0}, //4389 #HANGUL SYLLABLE SIOS WAE RIEULSIOS
+ {0x99C2, 0xC1D1}, //4390 #HANGUL SYLLABLE SIOS WAE RIEULTHIEUTH
+ {0x99C3, 0xC1D2}, //4391 #HANGUL SYLLABLE SIOS WAE RIEULPHIEUPH
+ {0x99C4, 0xC1D3}, //4392 #HANGUL SYLLABLE SIOS WAE RIEULHIEUH
+ {0x99C5, 0xC1D5}, //4393 #HANGUL SYLLABLE SIOS WAE PIEUP
+ {0x99C6, 0xC1D6}, //4394 #HANGUL SYLLABLE SIOS WAE PIEUPSIOS
+ {0x99C7, 0xC1D9}, //4395 #HANGUL SYLLABLE SIOS WAE IEUNG
+ {0x99C8, 0xC1DA}, //4396 #HANGUL SYLLABLE SIOS WAE CIEUC
+ {0x99C9, 0xC1DB}, //4397 #HANGUL SYLLABLE SIOS WAE CHIEUCH
+ {0x99CA, 0xC1DC}, //4398 #HANGUL SYLLABLE SIOS WAE KHIEUKH
+ {0x99CB, 0xC1DD}, //4399 #HANGUL SYLLABLE SIOS WAE THIEUTH
+ {0x99CC, 0xC1DE}, //4400 #HANGUL SYLLABLE SIOS WAE PHIEUPH
+ {0x99CD, 0xC1DF}, //4401 #HANGUL SYLLABLE SIOS WAE HIEUH
+ {0x99CE, 0xC1E1}, //4402 #HANGUL SYLLABLE SIOS OE KIYEOK
+ {0x99CF, 0xC1E2}, //4403 #HANGUL SYLLABLE SIOS OE SSANGKIYEOK
+ {0x99D0, 0xC1E3}, //4404 #HANGUL SYLLABLE SIOS OE KIYEOKSIOS
+ {0x99D1, 0xC1E5}, //4405 #HANGUL SYLLABLE SIOS OE NIEUNCIEUC
+ {0x99D2, 0xC1E6}, //4406 #HANGUL SYLLABLE SIOS OE NIEUNHIEUH
+ {0x99D3, 0xC1E7}, //4407 #HANGUL SYLLABLE SIOS OE TIKEUT
+ {0x99D4, 0xC1E9}, //4408 #HANGUL SYLLABLE SIOS OE RIEULKIYEOK
+ {0x99D5, 0xC1EA}, //4409 #HANGUL SYLLABLE SIOS OE RIEULMIEUM
+ {0x99D6, 0xC1EB}, //4410 #HANGUL SYLLABLE SIOS OE RIEULPIEUP
+ {0x99D7, 0xC1EC}, //4411 #HANGUL SYLLABLE SIOS OE RIEULSIOS
+ {0x99D8, 0xC1ED}, //4412 #HANGUL SYLLABLE SIOS OE RIEULTHIEUTH
+ {0x99D9, 0xC1EE}, //4413 #HANGUL SYLLABLE SIOS OE RIEULPHIEUPH
+ {0x99DA, 0xC1EF}, //4414 #HANGUL SYLLABLE SIOS OE RIEULHIEUH
+ {0x99DB, 0xC1F2}, //4415 #HANGUL SYLLABLE SIOS OE PIEUPSIOS
+ {0x99DC, 0xC1F4}, //4416 #HANGUL SYLLABLE SIOS OE SSANGSIOS
+ {0x99DD, 0xC1F5}, //4417 #HANGUL SYLLABLE SIOS OE IEUNG
+ {0x99DE, 0xC1F6}, //4418 #HANGUL SYLLABLE SIOS OE CIEUC
+ {0x99DF, 0xC1F7}, //4419 #HANGUL SYLLABLE SIOS OE CHIEUCH
+ {0x99E0, 0xC1F8}, //4420 #HANGUL SYLLABLE SIOS OE KHIEUKH
+ {0x99E1, 0xC1F9}, //4421 #HANGUL SYLLABLE SIOS OE THIEUTH
+ {0x99E2, 0xC1FA}, //4422 #HANGUL SYLLABLE SIOS OE PHIEUPH
+ {0x99E3, 0xC1FB}, //4423 #HANGUL SYLLABLE SIOS OE HIEUH
+ {0x99E4, 0xC1FE}, //4424 #HANGUL SYLLABLE SIOS YO SSANGKIYEOK
+ {0x99E5, 0xC1FF}, //4425 #HANGUL SYLLABLE SIOS YO KIYEOKSIOS
+ {0x99E6, 0xC201}, //4426 #HANGUL SYLLABLE SIOS YO NIEUNCIEUC
+ {0x99E7, 0xC202}, //4427 #HANGUL SYLLABLE SIOS YO NIEUNHIEUH
+ {0x99E8, 0xC203}, //4428 #HANGUL SYLLABLE SIOS YO TIKEUT
+ {0x99E9, 0xC205}, //4429 #HANGUL SYLLABLE SIOS YO RIEULKIYEOK
+ {0x99EA, 0xC206}, //4430 #HANGUL SYLLABLE SIOS YO RIEULMIEUM
+ {0x99EB, 0xC207}, //4431 #HANGUL SYLLABLE SIOS YO RIEULPIEUP
+ {0x99EC, 0xC208}, //4432 #HANGUL SYLLABLE SIOS YO RIEULSIOS
+ {0x99ED, 0xC209}, //4433 #HANGUL SYLLABLE SIOS YO RIEULTHIEUTH
+ {0x99EE, 0xC20A}, //4434 #HANGUL SYLLABLE SIOS YO RIEULPHIEUPH
+ {0x99EF, 0xC20B}, //4435 #HANGUL SYLLABLE SIOS YO RIEULHIEUH
+ {0x99F0, 0xC20E}, //4436 #HANGUL SYLLABLE SIOS YO PIEUPSIOS
+ {0x99F1, 0xC210}, //4437 #HANGUL SYLLABLE SIOS YO SSANGSIOS
+ {0x99F2, 0xC212}, //4438 #HANGUL SYLLABLE SIOS YO CIEUC
+ {0x99F3, 0xC213}, //4439 #HANGUL SYLLABLE SIOS YO CHIEUCH
+ {0x99F4, 0xC214}, //4440 #HANGUL SYLLABLE SIOS YO KHIEUKH
+ {0x99F5, 0xC215}, //4441 #HANGUL SYLLABLE SIOS YO THIEUTH
+ {0x99F6, 0xC216}, //4442 #HANGUL SYLLABLE SIOS YO PHIEUPH
+ {0x99F7, 0xC217}, //4443 #HANGUL SYLLABLE SIOS YO HIEUH
+ {0x99F8, 0xC21A}, //4444 #HANGUL SYLLABLE SIOS U SSANGKIYEOK
+ {0x99F9, 0xC21B}, //4445 #HANGUL SYLLABLE SIOS U KIYEOKSIOS
+ {0x99FA, 0xC21D}, //4446 #HANGUL SYLLABLE SIOS U NIEUNCIEUC
+ {0x99FB, 0xC21E}, //4447 #HANGUL SYLLABLE SIOS U NIEUNHIEUH
+ {0x99FC, 0xC221}, //4448 #HANGUL SYLLABLE SIOS U RIEULKIYEOK
+ {0x99FD, 0xC222}, //4449 #HANGUL SYLLABLE SIOS U RIEULMIEUM
+ {0x99FE, 0xC223}, //4450 #HANGUL SYLLABLE SIOS U RIEULPIEUP
+ {0x9A41, 0xC224}, //4451 #HANGUL SYLLABLE SIOS U RIEULSIOS
+ {0x9A42, 0xC225}, //4452 #HANGUL SYLLABLE SIOS U RIEULTHIEUTH
+ {0x9A43, 0xC226}, //4453 #HANGUL SYLLABLE SIOS U RIEULPHIEUPH
+ {0x9A44, 0xC227}, //4454 #HANGUL SYLLABLE SIOS U RIEULHIEUH
+ {0x9A45, 0xC22A}, //4455 #HANGUL SYLLABLE SIOS U PIEUPSIOS
+ {0x9A46, 0xC22C}, //4456 #HANGUL SYLLABLE SIOS U SSANGSIOS
+ {0x9A47, 0xC22E}, //4457 #HANGUL SYLLABLE SIOS U CIEUC
+ {0x9A48, 0xC230}, //4458 #HANGUL SYLLABLE SIOS U KHIEUKH
+ {0x9A49, 0xC233}, //4459 #HANGUL SYLLABLE SIOS U HIEUH
+ {0x9A4A, 0xC235}, //4460 #HANGUL SYLLABLE SIOS WEO KIYEOK
+ {0x9A4B, 0xC236}, //4461 #HANGUL SYLLABLE SIOS WEO SSANGKIYEOK
+ {0x9A4C, 0xC237}, //4462 #HANGUL SYLLABLE SIOS WEO KIYEOKSIOS
+ {0x9A4D, 0xC238}, //4463 #HANGUL SYLLABLE SIOS WEO NIEUN
+ {0x9A4E, 0xC239}, //4464 #HANGUL SYLLABLE SIOS WEO NIEUNCIEUC
+ {0x9A4F, 0xC23A}, //4465 #HANGUL SYLLABLE SIOS WEO NIEUNHIEUH
+ {0x9A50, 0xC23B}, //4466 #HANGUL SYLLABLE SIOS WEO TIKEUT
+ {0x9A51, 0xC23C}, //4467 #HANGUL SYLLABLE SIOS WEO RIEUL
+ {0x9A52, 0xC23D}, //4468 #HANGUL SYLLABLE SIOS WEO RIEULKIYEOK
+ {0x9A53, 0xC23E}, //4469 #HANGUL SYLLABLE SIOS WEO RIEULMIEUM
+ {0x9A54, 0xC23F}, //4470 #HANGUL SYLLABLE SIOS WEO RIEULPIEUP
+ {0x9A55, 0xC240}, //4471 #HANGUL SYLLABLE SIOS WEO RIEULSIOS
+ {0x9A56, 0xC241}, //4472 #HANGUL SYLLABLE SIOS WEO RIEULTHIEUTH
+ {0x9A57, 0xC242}, //4473 #HANGUL SYLLABLE SIOS WEO RIEULPHIEUPH
+ {0x9A58, 0xC243}, //4474 #HANGUL SYLLABLE SIOS WEO RIEULHIEUH
+ {0x9A59, 0xC244}, //4475 #HANGUL SYLLABLE SIOS WEO MIEUM
+ {0x9A5A, 0xC245}, //4476 #HANGUL SYLLABLE SIOS WEO PIEUP
+ {0x9A61, 0xC246}, //4477 #HANGUL SYLLABLE SIOS WEO PIEUPSIOS
+ {0x9A62, 0xC247}, //4478 #HANGUL SYLLABLE SIOS WEO SIOS
+ {0x9A63, 0xC249}, //4479 #HANGUL SYLLABLE SIOS WEO IEUNG
+ {0x9A64, 0xC24A}, //4480 #HANGUL SYLLABLE SIOS WEO CIEUC
+ {0x9A65, 0xC24B}, //4481 #HANGUL SYLLABLE SIOS WEO CHIEUCH
+ {0x9A66, 0xC24C}, //4482 #HANGUL SYLLABLE SIOS WEO KHIEUKH
+ {0x9A67, 0xC24D}, //4483 #HANGUL SYLLABLE SIOS WEO THIEUTH
+ {0x9A68, 0xC24E}, //4484 #HANGUL SYLLABLE SIOS WEO PHIEUPH
+ {0x9A69, 0xC24F}, //4485 #HANGUL SYLLABLE SIOS WEO HIEUH
+ {0x9A6A, 0xC252}, //4486 #HANGUL SYLLABLE SIOS WE SSANGKIYEOK
+ {0x9A6B, 0xC253}, //4487 #HANGUL SYLLABLE SIOS WE KIYEOKSIOS
+ {0x9A6C, 0xC255}, //4488 #HANGUL SYLLABLE SIOS WE NIEUNCIEUC
+ {0x9A6D, 0xC256}, //4489 #HANGUL SYLLABLE SIOS WE NIEUNHIEUH
+ {0x9A6E, 0xC257}, //4490 #HANGUL SYLLABLE SIOS WE TIKEUT
+ {0x9A6F, 0xC259}, //4491 #HANGUL SYLLABLE SIOS WE RIEULKIYEOK
+ {0x9A70, 0xC25A}, //4492 #HANGUL SYLLABLE SIOS WE RIEULMIEUM
+ {0x9A71, 0xC25B}, //4493 #HANGUL SYLLABLE SIOS WE RIEULPIEUP
+ {0x9A72, 0xC25C}, //4494 #HANGUL SYLLABLE SIOS WE RIEULSIOS
+ {0x9A73, 0xC25D}, //4495 #HANGUL SYLLABLE SIOS WE RIEULTHIEUTH
+ {0x9A74, 0xC25E}, //4496 #HANGUL SYLLABLE SIOS WE RIEULPHIEUPH
+ {0x9A75, 0xC25F}, //4497 #HANGUL SYLLABLE SIOS WE RIEULHIEUH
+ {0x9A76, 0xC261}, //4498 #HANGUL SYLLABLE SIOS WE PIEUP
+ {0x9A77, 0xC262}, //4499 #HANGUL SYLLABLE SIOS WE PIEUPSIOS
+ {0x9A78, 0xC263}, //4500 #HANGUL SYLLABLE SIOS WE SIOS
+ {0x9A79, 0xC264}, //4501 #HANGUL SYLLABLE SIOS WE SSANGSIOS
+ {0x9A7A, 0xC266}, //4502 #HANGUL SYLLABLE SIOS WE CIEUC
+ {0x9A81, 0xC267}, //4503 #HANGUL SYLLABLE SIOS WE CHIEUCH
+ {0x9A82, 0xC268}, //4504 #HANGUL SYLLABLE SIOS WE KHIEUKH
+ {0x9A83, 0xC269}, //4505 #HANGUL SYLLABLE SIOS WE THIEUTH
+ {0x9A84, 0xC26A}, //4506 #HANGUL SYLLABLE SIOS WE PHIEUPH
+ {0x9A85, 0xC26B}, //4507 #HANGUL SYLLABLE SIOS WE HIEUH
+ {0x9A86, 0xC26E}, //4508 #HANGUL SYLLABLE SIOS WI SSANGKIYEOK
+ {0x9A87, 0xC26F}, //4509 #HANGUL SYLLABLE SIOS WI KIYEOKSIOS
+ {0x9A88, 0xC271}, //4510 #HANGUL SYLLABLE SIOS WI NIEUNCIEUC
+ {0x9A89, 0xC272}, //4511 #HANGUL SYLLABLE SIOS WI NIEUNHIEUH
+ {0x9A8A, 0xC273}, //4512 #HANGUL SYLLABLE SIOS WI TIKEUT
+ {0x9A8B, 0xC275}, //4513 #HANGUL SYLLABLE SIOS WI RIEULKIYEOK
+ {0x9A8C, 0xC276}, //4514 #HANGUL SYLLABLE SIOS WI RIEULMIEUM
+ {0x9A8D, 0xC277}, //4515 #HANGUL SYLLABLE SIOS WI RIEULPIEUP
+ {0x9A8E, 0xC278}, //4516 #HANGUL SYLLABLE SIOS WI RIEULSIOS
+ {0x9A8F, 0xC279}, //4517 #HANGUL SYLLABLE SIOS WI RIEULTHIEUTH
+ {0x9A90, 0xC27A}, //4518 #HANGUL SYLLABLE SIOS WI RIEULPHIEUPH
+ {0x9A91, 0xC27B}, //4519 #HANGUL SYLLABLE SIOS WI RIEULHIEUH
+ {0x9A92, 0xC27E}, //4520 #HANGUL SYLLABLE SIOS WI PIEUPSIOS
+ {0x9A93, 0xC280}, //4521 #HANGUL SYLLABLE SIOS WI SSANGSIOS
+ {0x9A94, 0xC282}, //4522 #HANGUL SYLLABLE SIOS WI CIEUC
+ {0x9A95, 0xC283}, //4523 #HANGUL SYLLABLE SIOS WI CHIEUCH
+ {0x9A96, 0xC284}, //4524 #HANGUL SYLLABLE SIOS WI KHIEUKH
+ {0x9A97, 0xC285}, //4525 #HANGUL SYLLABLE SIOS WI THIEUTH
+ {0x9A98, 0xC286}, //4526 #HANGUL SYLLABLE SIOS WI PHIEUPH
+ {0x9A99, 0xC287}, //4527 #HANGUL SYLLABLE SIOS WI HIEUH
+ {0x9A9A, 0xC28A}, //4528 #HANGUL SYLLABLE SIOS YU SSANGKIYEOK
+ {0x9A9B, 0xC28B}, //4529 #HANGUL SYLLABLE SIOS YU KIYEOKSIOS
+ {0x9A9C, 0xC28C}, //4530 #HANGUL SYLLABLE SIOS YU NIEUN
+ {0x9A9D, 0xC28D}, //4531 #HANGUL SYLLABLE SIOS YU NIEUNCIEUC
+ {0x9A9E, 0xC28E}, //4532 #HANGUL SYLLABLE SIOS YU NIEUNHIEUH
+ {0x9A9F, 0xC28F}, //4533 #HANGUL SYLLABLE SIOS YU TIKEUT
+ {0x9AA0, 0xC291}, //4534 #HANGUL SYLLABLE SIOS YU RIEULKIYEOK
+ {0x9AA1, 0xC292}, //4535 #HANGUL SYLLABLE SIOS YU RIEULMIEUM
+ {0x9AA2, 0xC293}, //4536 #HANGUL SYLLABLE SIOS YU RIEULPIEUP
+ {0x9AA3, 0xC294}, //4537 #HANGUL SYLLABLE SIOS YU RIEULSIOS
+ {0x9AA4, 0xC295}, //4538 #HANGUL SYLLABLE SIOS YU RIEULTHIEUTH
+ {0x9AA5, 0xC296}, //4539 #HANGUL SYLLABLE SIOS YU RIEULPHIEUPH
+ {0x9AA6, 0xC297}, //4540 #HANGUL SYLLABLE SIOS YU RIEULHIEUH
+ {0x9AA7, 0xC299}, //4541 #HANGUL SYLLABLE SIOS YU PIEUP
+ {0x9AA8, 0xC29A}, //4542 #HANGUL SYLLABLE SIOS YU PIEUPSIOS
+ {0x9AA9, 0xC29C}, //4543 #HANGUL SYLLABLE SIOS YU SSANGSIOS
+ {0x9AAA, 0xC29E}, //4544 #HANGUL SYLLABLE SIOS YU CIEUC
+ {0x9AAB, 0xC29F}, //4545 #HANGUL SYLLABLE SIOS YU CHIEUCH
+ {0x9AAC, 0xC2A0}, //4546 #HANGUL SYLLABLE SIOS YU KHIEUKH
+ {0x9AAD, 0xC2A1}, //4547 #HANGUL SYLLABLE SIOS YU THIEUTH
+ {0x9AAE, 0xC2A2}, //4548 #HANGUL SYLLABLE SIOS YU PHIEUPH
+ {0x9AAF, 0xC2A3}, //4549 #HANGUL SYLLABLE SIOS YU HIEUH
+ {0x9AB0, 0xC2A6}, //4550 #HANGUL SYLLABLE SIOS EU SSANGKIYEOK
+ {0x9AB1, 0xC2A7}, //4551 #HANGUL SYLLABLE SIOS EU KIYEOKSIOS
+ {0x9AB2, 0xC2A9}, //4552 #HANGUL SYLLABLE SIOS EU NIEUNCIEUC
+ {0x9AB3, 0xC2AA}, //4553 #HANGUL SYLLABLE SIOS EU NIEUNHIEUH
+ {0x9AB4, 0xC2AB}, //4554 #HANGUL SYLLABLE SIOS EU TIKEUT
+ {0x9AB5, 0xC2AE}, //4555 #HANGUL SYLLABLE SIOS EU RIEULMIEUM
+ {0x9AB6, 0xC2AF}, //4556 #HANGUL SYLLABLE SIOS EU RIEULPIEUP
+ {0x9AB7, 0xC2B0}, //4557 #HANGUL SYLLABLE SIOS EU RIEULSIOS
+ {0x9AB8, 0xC2B1}, //4558 #HANGUL SYLLABLE SIOS EU RIEULTHIEUTH
+ {0x9AB9, 0xC2B2}, //4559 #HANGUL SYLLABLE SIOS EU RIEULPHIEUPH
+ {0x9ABA, 0xC2B3}, //4560 #HANGUL SYLLABLE SIOS EU RIEULHIEUH
+ {0x9ABB, 0xC2B6}, //4561 #HANGUL SYLLABLE SIOS EU PIEUPSIOS
+ {0x9ABC, 0xC2B8}, //4562 #HANGUL SYLLABLE SIOS EU SSANGSIOS
+ {0x9ABD, 0xC2BA}, //4563 #HANGUL SYLLABLE SIOS EU CIEUC
+ {0x9ABE, 0xC2BB}, //4564 #HANGUL SYLLABLE SIOS EU CHIEUCH
+ {0x9ABF, 0xC2BC}, //4565 #HANGUL SYLLABLE SIOS EU KHIEUKH
+ {0x9AC0, 0xC2BD}, //4566 #HANGUL SYLLABLE SIOS EU THIEUTH
+ {0x9AC1, 0xC2BE}, //4567 #HANGUL SYLLABLE SIOS EU PHIEUPH
+ {0x9AC2, 0xC2BF}, //4568 #HANGUL SYLLABLE SIOS EU HIEUH
+ {0x9AC3, 0xC2C0}, //4569 #HANGUL SYLLABLE SIOS YI
+ {0x9AC4, 0xC2C1}, //4570 #HANGUL SYLLABLE SIOS YI KIYEOK
+ {0x9AC5, 0xC2C2}, //4571 #HANGUL SYLLABLE SIOS YI SSANGKIYEOK
+ {0x9AC6, 0xC2C3}, //4572 #HANGUL SYLLABLE SIOS YI KIYEOKSIOS
+ {0x9AC7, 0xC2C4}, //4573 #HANGUL SYLLABLE SIOS YI NIEUN
+ {0x9AC8, 0xC2C5}, //4574 #HANGUL SYLLABLE SIOS YI NIEUNCIEUC
+ {0x9AC9, 0xC2C6}, //4575 #HANGUL SYLLABLE SIOS YI NIEUNHIEUH
+ {0x9ACA, 0xC2C7}, //4576 #HANGUL SYLLABLE SIOS YI TIKEUT
+ {0x9ACB, 0xC2C8}, //4577 #HANGUL SYLLABLE SIOS YI RIEUL
+ {0x9ACC, 0xC2C9}, //4578 #HANGUL SYLLABLE SIOS YI RIEULKIYEOK
+ {0x9ACD, 0xC2CA}, //4579 #HANGUL SYLLABLE SIOS YI RIEULMIEUM
+ {0x9ACE, 0xC2CB}, //4580 #HANGUL SYLLABLE SIOS YI RIEULPIEUP
+ {0x9ACF, 0xC2CC}, //4581 #HANGUL SYLLABLE SIOS YI RIEULSIOS
+ {0x9AD0, 0xC2CD}, //4582 #HANGUL SYLLABLE SIOS YI RIEULTHIEUTH
+ {0x9AD1, 0xC2CE}, //4583 #HANGUL SYLLABLE SIOS YI RIEULPHIEUPH
+ {0x9AD2, 0xC2CF}, //4584 #HANGUL SYLLABLE SIOS YI RIEULHIEUH
+ {0x9AD3, 0xC2D0}, //4585 #HANGUL SYLLABLE SIOS YI MIEUM
+ {0x9AD4, 0xC2D1}, //4586 #HANGUL SYLLABLE SIOS YI PIEUP
+ {0x9AD5, 0xC2D2}, //4587 #HANGUL SYLLABLE SIOS YI PIEUPSIOS
+ {0x9AD6, 0xC2D3}, //4588 #HANGUL SYLLABLE SIOS YI SIOS
+ {0x9AD7, 0xC2D4}, //4589 #HANGUL SYLLABLE SIOS YI SSANGSIOS
+ {0x9AD8, 0xC2D5}, //4590 #HANGUL SYLLABLE SIOS YI IEUNG
+ {0x9AD9, 0xC2D6}, //4591 #HANGUL SYLLABLE SIOS YI CIEUC
+ {0x9ADA, 0xC2D7}, //4592 #HANGUL SYLLABLE SIOS YI CHIEUCH
+ {0x9ADB, 0xC2D8}, //4593 #HANGUL SYLLABLE SIOS YI KHIEUKH
+ {0x9ADC, 0xC2D9}, //4594 #HANGUL SYLLABLE SIOS YI THIEUTH
+ {0x9ADD, 0xC2DA}, //4595 #HANGUL SYLLABLE SIOS YI PHIEUPH
+ {0x9ADE, 0xC2DB}, //4596 #HANGUL SYLLABLE SIOS YI HIEUH
+ {0x9ADF, 0xC2DE}, //4597 #HANGUL SYLLABLE SIOS I SSANGKIYEOK
+ {0x9AE0, 0xC2DF}, //4598 #HANGUL SYLLABLE SIOS I KIYEOKSIOS
+ {0x9AE1, 0xC2E1}, //4599 #HANGUL SYLLABLE SIOS I NIEUNCIEUC
+ {0x9AE2, 0xC2E2}, //4600 #HANGUL SYLLABLE SIOS I NIEUNHIEUH
+ {0x9AE3, 0xC2E5}, //4601 #HANGUL SYLLABLE SIOS I RIEULKIYEOK
+ {0x9AE4, 0xC2E6}, //4602 #HANGUL SYLLABLE SIOS I RIEULMIEUM
+ {0x9AE5, 0xC2E7}, //4603 #HANGUL SYLLABLE SIOS I RIEULPIEUP
+ {0x9AE6, 0xC2E8}, //4604 #HANGUL SYLLABLE SIOS I RIEULSIOS
+ {0x9AE7, 0xC2E9}, //4605 #HANGUL SYLLABLE SIOS I RIEULTHIEUTH
+ {0x9AE8, 0xC2EA}, //4606 #HANGUL SYLLABLE SIOS I RIEULPHIEUPH
+ {0x9AE9, 0xC2EE}, //4607 #HANGUL SYLLABLE SIOS I PIEUPSIOS
+ {0x9AEA, 0xC2F0}, //4608 #HANGUL SYLLABLE SIOS I SSANGSIOS
+ {0x9AEB, 0xC2F2}, //4609 #HANGUL SYLLABLE SIOS I CIEUC
+ {0x9AEC, 0xC2F3}, //4610 #HANGUL SYLLABLE SIOS I CHIEUCH
+ {0x9AED, 0xC2F4}, //4611 #HANGUL SYLLABLE SIOS I KHIEUKH
+ {0x9AEE, 0xC2F5}, //4612 #HANGUL SYLLABLE SIOS I THIEUTH
+ {0x9AEF, 0xC2F7}, //4613 #HANGUL SYLLABLE SIOS I HIEUH
+ {0x9AF0, 0xC2FA}, //4614 #HANGUL SYLLABLE SSANGSIOS A SSANGKIYEOK
+ {0x9AF1, 0xC2FD}, //4615 #HANGUL SYLLABLE SSANGSIOS A NIEUNCIEUC
+ {0x9AF2, 0xC2FE}, //4616 #HANGUL SYLLABLE SSANGSIOS A NIEUNHIEUH
+ {0x9AF3, 0xC2FF}, //4617 #HANGUL SYLLABLE SSANGSIOS A TIKEUT
+ {0x9AF4, 0xC301}, //4618 #HANGUL SYLLABLE SSANGSIOS A RIEULKIYEOK
+ {0x9AF5, 0xC302}, //4619 #HANGUL SYLLABLE SSANGSIOS A RIEULMIEUM
+ {0x9AF6, 0xC303}, //4620 #HANGUL SYLLABLE SSANGSIOS A RIEULPIEUP
+ {0x9AF7, 0xC304}, //4621 #HANGUL SYLLABLE SSANGSIOS A RIEULSIOS
+ {0x9AF8, 0xC305}, //4622 #HANGUL SYLLABLE SSANGSIOS A RIEULTHIEUTH
+ {0x9AF9, 0xC306}, //4623 #HANGUL SYLLABLE SSANGSIOS A RIEULPHIEUPH
+ {0x9AFA, 0xC307}, //4624 #HANGUL SYLLABLE SSANGSIOS A RIEULHIEUH
+ {0x9AFB, 0xC30A}, //4625 #HANGUL SYLLABLE SSANGSIOS A PIEUPSIOS
+ {0x9AFC, 0xC30B}, //4626 #HANGUL SYLLABLE SSANGSIOS A SIOS
+ {0x9AFD, 0xC30E}, //4627 #HANGUL SYLLABLE SSANGSIOS A CIEUC
+ {0x9AFE, 0xC30F}, //4628 #HANGUL SYLLABLE SSANGSIOS A CHIEUCH
+ {0x9B41, 0xC310}, //4629 #HANGUL SYLLABLE SSANGSIOS A KHIEUKH
+ {0x9B42, 0xC311}, //4630 #HANGUL SYLLABLE SSANGSIOS A THIEUTH
+ {0x9B43, 0xC312}, //4631 #HANGUL SYLLABLE SSANGSIOS A PHIEUPH
+ {0x9B44, 0xC316}, //4632 #HANGUL SYLLABLE SSANGSIOS AE SSANGKIYEOK
+ {0x9B45, 0xC317}, //4633 #HANGUL SYLLABLE SSANGSIOS AE KIYEOKSIOS
+ {0x9B46, 0xC319}, //4634 #HANGUL SYLLABLE SSANGSIOS AE NIEUNCIEUC
+ {0x9B47, 0xC31A}, //4635 #HANGUL SYLLABLE SSANGSIOS AE NIEUNHIEUH
+ {0x9B48, 0xC31B}, //4636 #HANGUL SYLLABLE SSANGSIOS AE TIKEUT
+ {0x9B49, 0xC31D}, //4637 #HANGUL SYLLABLE SSANGSIOS AE RIEULKIYEOK
+ {0x9B4A, 0xC31E}, //4638 #HANGUL SYLLABLE SSANGSIOS AE RIEULMIEUM
+ {0x9B4B, 0xC31F}, //4639 #HANGUL SYLLABLE SSANGSIOS AE RIEULPIEUP
+ {0x9B4C, 0xC320}, //4640 #HANGUL SYLLABLE SSANGSIOS AE RIEULSIOS
+ {0x9B4D, 0xC321}, //4641 #HANGUL SYLLABLE SSANGSIOS AE RIEULTHIEUTH
+ {0x9B4E, 0xC322}, //4642 #HANGUL SYLLABLE SSANGSIOS AE RIEULPHIEUPH
+ {0x9B4F, 0xC323}, //4643 #HANGUL SYLLABLE SSANGSIOS AE RIEULHIEUH
+ {0x9B50, 0xC326}, //4644 #HANGUL SYLLABLE SSANGSIOS AE PIEUPSIOS
+ {0x9B51, 0xC327}, //4645 #HANGUL SYLLABLE SSANGSIOS AE SIOS
+ {0x9B52, 0xC32A}, //4646 #HANGUL SYLLABLE SSANGSIOS AE CIEUC
+ {0x9B53, 0xC32B}, //4647 #HANGUL SYLLABLE SSANGSIOS AE CHIEUCH
+ {0x9B54, 0xC32C}, //4648 #HANGUL SYLLABLE SSANGSIOS AE KHIEUKH
+ {0x9B55, 0xC32D}, //4649 #HANGUL SYLLABLE SSANGSIOS AE THIEUTH
+ {0x9B56, 0xC32E}, //4650 #HANGUL SYLLABLE SSANGSIOS AE PHIEUPH
+ {0x9B57, 0xC32F}, //4651 #HANGUL SYLLABLE SSANGSIOS AE HIEUH
+ {0x9B58, 0xC330}, //4652 #HANGUL SYLLABLE SSANGSIOS YA
+ {0x9B59, 0xC331}, //4653 #HANGUL SYLLABLE SSANGSIOS YA KIYEOK
+ {0x9B5A, 0xC332}, //4654 #HANGUL SYLLABLE SSANGSIOS YA SSANGKIYEOK
+ {0x9B61, 0xC333}, //4655 #HANGUL SYLLABLE SSANGSIOS YA KIYEOKSIOS
+ {0x9B62, 0xC334}, //4656 #HANGUL SYLLABLE SSANGSIOS YA NIEUN
+ {0x9B63, 0xC335}, //4657 #HANGUL SYLLABLE SSANGSIOS YA NIEUNCIEUC
+ {0x9B64, 0xC336}, //4658 #HANGUL SYLLABLE SSANGSIOS YA NIEUNHIEUH
+ {0x9B65, 0xC337}, //4659 #HANGUL SYLLABLE SSANGSIOS YA TIKEUT
+ {0x9B66, 0xC338}, //4660 #HANGUL SYLLABLE SSANGSIOS YA RIEUL
+ {0x9B67, 0xC339}, //4661 #HANGUL SYLLABLE SSANGSIOS YA RIEULKIYEOK
+ {0x9B68, 0xC33A}, //4662 #HANGUL SYLLABLE SSANGSIOS YA RIEULMIEUM
+ {0x9B69, 0xC33B}, //4663 #HANGUL SYLLABLE SSANGSIOS YA RIEULPIEUP
+ {0x9B6A, 0xC33C}, //4664 #HANGUL SYLLABLE SSANGSIOS YA RIEULSIOS
+ {0x9B6B, 0xC33D}, //4665 #HANGUL SYLLABLE SSANGSIOS YA RIEULTHIEUTH
+ {0x9B6C, 0xC33E}, //4666 #HANGUL SYLLABLE SSANGSIOS YA RIEULPHIEUPH
+ {0x9B6D, 0xC33F}, //4667 #HANGUL SYLLABLE SSANGSIOS YA RIEULHIEUH
+ {0x9B6E, 0xC340}, //4668 #HANGUL SYLLABLE SSANGSIOS YA MIEUM
+ {0x9B6F, 0xC341}, //4669 #HANGUL SYLLABLE SSANGSIOS YA PIEUP
+ {0x9B70, 0xC342}, //4670 #HANGUL SYLLABLE SSANGSIOS YA PIEUPSIOS
+ {0x9B71, 0xC343}, //4671 #HANGUL SYLLABLE SSANGSIOS YA SIOS
+ {0x9B72, 0xC344}, //4672 #HANGUL SYLLABLE SSANGSIOS YA SSANGSIOS
+ {0x9B73, 0xC346}, //4673 #HANGUL SYLLABLE SSANGSIOS YA CIEUC
+ {0x9B74, 0xC347}, //4674 #HANGUL SYLLABLE SSANGSIOS YA CHIEUCH
+ {0x9B75, 0xC348}, //4675 #HANGUL SYLLABLE SSANGSIOS YA KHIEUKH
+ {0x9B76, 0xC349}, //4676 #HANGUL SYLLABLE SSANGSIOS YA THIEUTH
+ {0x9B77, 0xC34A}, //4677 #HANGUL SYLLABLE SSANGSIOS YA PHIEUPH
+ {0x9B78, 0xC34B}, //4678 #HANGUL SYLLABLE SSANGSIOS YA HIEUH
+ {0x9B79, 0xC34C}, //4679 #HANGUL SYLLABLE SSANGSIOS YAE
+ {0x9B7A, 0xC34D}, //4680 #HANGUL SYLLABLE SSANGSIOS YAE KIYEOK
+ {0x9B81, 0xC34E}, //4681 #HANGUL SYLLABLE SSANGSIOS YAE SSANGKIYEOK
+ {0x9B82, 0xC34F}, //4682 #HANGUL SYLLABLE SSANGSIOS YAE KIYEOKSIOS
+ {0x9B83, 0xC350}, //4683 #HANGUL SYLLABLE SSANGSIOS YAE NIEUN
+ {0x9B84, 0xC351}, //4684 #HANGUL SYLLABLE SSANGSIOS YAE NIEUNCIEUC
+ {0x9B85, 0xC352}, //4685 #HANGUL SYLLABLE SSANGSIOS YAE NIEUNHIEUH
+ {0x9B86, 0xC353}, //4686 #HANGUL SYLLABLE SSANGSIOS YAE TIKEUT
+ {0x9B87, 0xC354}, //4687 #HANGUL SYLLABLE SSANGSIOS YAE RIEUL
+ {0x9B88, 0xC355}, //4688 #HANGUL SYLLABLE SSANGSIOS YAE RIEULKIYEOK
+ {0x9B89, 0xC356}, //4689 #HANGUL SYLLABLE SSANGSIOS YAE RIEULMIEUM
+ {0x9B8A, 0xC357}, //4690 #HANGUL SYLLABLE SSANGSIOS YAE RIEULPIEUP
+ {0x9B8B, 0xC358}, //4691 #HANGUL SYLLABLE SSANGSIOS YAE RIEULSIOS
+ {0x9B8C, 0xC359}, //4692 #HANGUL SYLLABLE SSANGSIOS YAE RIEULTHIEUTH
+ {0x9B8D, 0xC35A}, //4693 #HANGUL SYLLABLE SSANGSIOS YAE RIEULPHIEUPH
+ {0x9B8E, 0xC35B}, //4694 #HANGUL SYLLABLE SSANGSIOS YAE RIEULHIEUH
+ {0x9B8F, 0xC35C}, //4695 #HANGUL SYLLABLE SSANGSIOS YAE MIEUM
+ {0x9B90, 0xC35D}, //4696 #HANGUL SYLLABLE SSANGSIOS YAE PIEUP
+ {0x9B91, 0xC35E}, //4697 #HANGUL SYLLABLE SSANGSIOS YAE PIEUPSIOS
+ {0x9B92, 0xC35F}, //4698 #HANGUL SYLLABLE SSANGSIOS YAE SIOS
+ {0x9B93, 0xC360}, //4699 #HANGUL SYLLABLE SSANGSIOS YAE SSANGSIOS
+ {0x9B94, 0xC361}, //4700 #HANGUL SYLLABLE SSANGSIOS YAE IEUNG
+ {0x9B95, 0xC362}, //4701 #HANGUL SYLLABLE SSANGSIOS YAE CIEUC
+ {0x9B96, 0xC363}, //4702 #HANGUL SYLLABLE SSANGSIOS YAE CHIEUCH
+ {0x9B97, 0xC364}, //4703 #HANGUL SYLLABLE SSANGSIOS YAE KHIEUKH
+ {0x9B98, 0xC365}, //4704 #HANGUL SYLLABLE SSANGSIOS YAE THIEUTH
+ {0x9B99, 0xC366}, //4705 #HANGUL SYLLABLE SSANGSIOS YAE PHIEUPH
+ {0x9B9A, 0xC367}, //4706 #HANGUL SYLLABLE SSANGSIOS YAE HIEUH
+ {0x9B9B, 0xC36A}, //4707 #HANGUL SYLLABLE SSANGSIOS EO SSANGKIYEOK
+ {0x9B9C, 0xC36B}, //4708 #HANGUL SYLLABLE SSANGSIOS EO KIYEOKSIOS
+ {0x9B9D, 0xC36D}, //4709 #HANGUL SYLLABLE SSANGSIOS EO NIEUNCIEUC
+ {0x9B9E, 0xC36E}, //4710 #HANGUL SYLLABLE SSANGSIOS EO NIEUNHIEUH
+ {0x9B9F, 0xC36F}, //4711 #HANGUL SYLLABLE SSANGSIOS EO TIKEUT
+ {0x9BA0, 0xC371}, //4712 #HANGUL SYLLABLE SSANGSIOS EO RIEULKIYEOK
+ {0x9BA1, 0xC373}, //4713 #HANGUL SYLLABLE SSANGSIOS EO RIEULPIEUP
+ {0x9BA2, 0xC374}, //4714 #HANGUL SYLLABLE SSANGSIOS EO RIEULSIOS
+ {0x9BA3, 0xC375}, //4715 #HANGUL SYLLABLE SSANGSIOS EO RIEULTHIEUTH
+ {0x9BA4, 0xC376}, //4716 #HANGUL SYLLABLE SSANGSIOS EO RIEULPHIEUPH
+ {0x9BA5, 0xC377}, //4717 #HANGUL SYLLABLE SSANGSIOS EO RIEULHIEUH
+ {0x9BA6, 0xC37A}, //4718 #HANGUL SYLLABLE SSANGSIOS EO PIEUPSIOS
+ {0x9BA7, 0xC37B}, //4719 #HANGUL SYLLABLE SSANGSIOS EO SIOS
+ {0x9BA8, 0xC37E}, //4720 #HANGUL SYLLABLE SSANGSIOS EO CIEUC
+ {0x9BA9, 0xC37F}, //4721 #HANGUL SYLLABLE SSANGSIOS EO CHIEUCH
+ {0x9BAA, 0xC380}, //4722 #HANGUL SYLLABLE SSANGSIOS EO KHIEUKH
+ {0x9BAB, 0xC381}, //4723 #HANGUL SYLLABLE SSANGSIOS EO THIEUTH
+ {0x9BAC, 0xC382}, //4724 #HANGUL SYLLABLE SSANGSIOS EO PHIEUPH
+ {0x9BAD, 0xC383}, //4725 #HANGUL SYLLABLE SSANGSIOS EO HIEUH
+ {0x9BAE, 0xC385}, //4726 #HANGUL SYLLABLE SSANGSIOS E KIYEOK
+ {0x9BAF, 0xC386}, //4727 #HANGUL SYLLABLE SSANGSIOS E SSANGKIYEOK
+ {0x9BB0, 0xC387}, //4728 #HANGUL SYLLABLE SSANGSIOS E KIYEOKSIOS
+ {0x9BB1, 0xC389}, //4729 #HANGUL SYLLABLE SSANGSIOS E NIEUNCIEUC
+ {0x9BB2, 0xC38A}, //4730 #HANGUL SYLLABLE SSANGSIOS E NIEUNHIEUH
+ {0x9BB3, 0xC38B}, //4731 #HANGUL SYLLABLE SSANGSIOS E TIKEUT
+ {0x9BB4, 0xC38D}, //4732 #HANGUL SYLLABLE SSANGSIOS E RIEULKIYEOK
+ {0x9BB5, 0xC38E}, //4733 #HANGUL SYLLABLE SSANGSIOS E RIEULMIEUM
+ {0x9BB6, 0xC38F}, //4734 #HANGUL SYLLABLE SSANGSIOS E RIEULPIEUP
+ {0x9BB7, 0xC390}, //4735 #HANGUL SYLLABLE SSANGSIOS E RIEULSIOS
+ {0x9BB8, 0xC391}, //4736 #HANGUL SYLLABLE SSANGSIOS E RIEULTHIEUTH
+ {0x9BB9, 0xC392}, //4737 #HANGUL SYLLABLE SSANGSIOS E RIEULPHIEUPH
+ {0x9BBA, 0xC393}, //4738 #HANGUL SYLLABLE SSANGSIOS E RIEULHIEUH
+ {0x9BBB, 0xC394}, //4739 #HANGUL SYLLABLE SSANGSIOS E MIEUM
+ {0x9BBC, 0xC395}, //4740 #HANGUL SYLLABLE SSANGSIOS E PIEUP
+ {0x9BBD, 0xC396}, //4741 #HANGUL SYLLABLE SSANGSIOS E PIEUPSIOS
+ {0x9BBE, 0xC397}, //4742 #HANGUL SYLLABLE SSANGSIOS E SIOS
+ {0x9BBF, 0xC398}, //4743 #HANGUL SYLLABLE SSANGSIOS E SSANGSIOS
+ {0x9BC0, 0xC399}, //4744 #HANGUL SYLLABLE SSANGSIOS E IEUNG
+ {0x9BC1, 0xC39A}, //4745 #HANGUL SYLLABLE SSANGSIOS E CIEUC
+ {0x9BC2, 0xC39B}, //4746 #HANGUL SYLLABLE SSANGSIOS E CHIEUCH
+ {0x9BC3, 0xC39C}, //4747 #HANGUL SYLLABLE SSANGSIOS E KHIEUKH
+ {0x9BC4, 0xC39D}, //4748 #HANGUL SYLLABLE SSANGSIOS E THIEUTH
+ {0x9BC5, 0xC39E}, //4749 #HANGUL SYLLABLE SSANGSIOS E PHIEUPH
+ {0x9BC6, 0xC39F}, //4750 #HANGUL SYLLABLE SSANGSIOS E HIEUH
+ {0x9BC7, 0xC3A0}, //4751 #HANGUL SYLLABLE SSANGSIOS YEO
+ {0x9BC8, 0xC3A1}, //4752 #HANGUL SYLLABLE SSANGSIOS YEO KIYEOK
+ {0x9BC9, 0xC3A2}, //4753 #HANGUL SYLLABLE SSANGSIOS YEO SSANGKIYEOK
+ {0x9BCA, 0xC3A3}, //4754 #HANGUL SYLLABLE SSANGSIOS YEO KIYEOKSIOS
+ {0x9BCB, 0xC3A4}, //4755 #HANGUL SYLLABLE SSANGSIOS YEO NIEUN
+ {0x9BCC, 0xC3A5}, //4756 #HANGUL SYLLABLE SSANGSIOS YEO NIEUNCIEUC
+ {0x9BCD, 0xC3A6}, //4757 #HANGUL SYLLABLE SSANGSIOS YEO NIEUNHIEUH
+ {0x9BCE, 0xC3A7}, //4758 #HANGUL SYLLABLE SSANGSIOS YEO TIKEUT
+ {0x9BCF, 0xC3A8}, //4759 #HANGUL SYLLABLE SSANGSIOS YEO RIEUL
+ {0x9BD0, 0xC3A9}, //4760 #HANGUL SYLLABLE SSANGSIOS YEO RIEULKIYEOK
+ {0x9BD1, 0xC3AA}, //4761 #HANGUL SYLLABLE SSANGSIOS YEO RIEULMIEUM
+ {0x9BD2, 0xC3AB}, //4762 #HANGUL SYLLABLE SSANGSIOS YEO RIEULPIEUP
+ {0x9BD3, 0xC3AC}, //4763 #HANGUL SYLLABLE SSANGSIOS YEO RIEULSIOS
+ {0x9BD4, 0xC3AD}, //4764 #HANGUL SYLLABLE SSANGSIOS YEO RIEULTHIEUTH
+ {0x9BD5, 0xC3AE}, //4765 #HANGUL SYLLABLE SSANGSIOS YEO RIEULPHIEUPH
+ {0x9BD6, 0xC3AF}, //4766 #HANGUL SYLLABLE SSANGSIOS YEO RIEULHIEUH
+ {0x9BD7, 0xC3B0}, //4767 #HANGUL SYLLABLE SSANGSIOS YEO MIEUM
+ {0x9BD8, 0xC3B1}, //4768 #HANGUL SYLLABLE SSANGSIOS YEO PIEUP
+ {0x9BD9, 0xC3B2}, //4769 #HANGUL SYLLABLE SSANGSIOS YEO PIEUPSIOS
+ {0x9BDA, 0xC3B3}, //4770 #HANGUL SYLLABLE SSANGSIOS YEO SIOS
+ {0x9BDB, 0xC3B4}, //4771 #HANGUL SYLLABLE SSANGSIOS YEO SSANGSIOS
+ {0x9BDC, 0xC3B5}, //4772 #HANGUL SYLLABLE SSANGSIOS YEO IEUNG
+ {0x9BDD, 0xC3B6}, //4773 #HANGUL SYLLABLE SSANGSIOS YEO CIEUC
+ {0x9BDE, 0xC3B7}, //4774 #HANGUL SYLLABLE SSANGSIOS YEO CHIEUCH
+ {0x9BDF, 0xC3B8}, //4775 #HANGUL SYLLABLE SSANGSIOS YEO KHIEUKH
+ {0x9BE0, 0xC3B9}, //4776 #HANGUL SYLLABLE SSANGSIOS YEO THIEUTH
+ {0x9BE1, 0xC3BA}, //4777 #HANGUL SYLLABLE SSANGSIOS YEO PHIEUPH
+ {0x9BE2, 0xC3BB}, //4778 #HANGUL SYLLABLE SSANGSIOS YEO HIEUH
+ {0x9BE3, 0xC3BC}, //4779 #HANGUL SYLLABLE SSANGSIOS YE
+ {0x9BE4, 0xC3BD}, //4780 #HANGUL SYLLABLE SSANGSIOS YE KIYEOK
+ {0x9BE5, 0xC3BE}, //4781 #HANGUL SYLLABLE SSANGSIOS YE SSANGKIYEOK
+ {0x9BE6, 0xC3BF}, //4782 #HANGUL SYLLABLE SSANGSIOS YE KIYEOKSIOS
+ {0x9BE7, 0xC3C1}, //4783 #HANGUL SYLLABLE SSANGSIOS YE NIEUNCIEUC
+ {0x9BE8, 0xC3C2}, //4784 #HANGUL SYLLABLE SSANGSIOS YE NIEUNHIEUH
+ {0x9BE9, 0xC3C3}, //4785 #HANGUL SYLLABLE SSANGSIOS YE TIKEUT
+ {0x9BEA, 0xC3C4}, //4786 #HANGUL SYLLABLE SSANGSIOS YE RIEUL
+ {0x9BEB, 0xC3C5}, //4787 #HANGUL SYLLABLE SSANGSIOS YE RIEULKIYEOK
+ {0x9BEC, 0xC3C6}, //4788 #HANGUL SYLLABLE SSANGSIOS YE RIEULMIEUM
+ {0x9BED, 0xC3C7}, //4789 #HANGUL SYLLABLE SSANGSIOS YE RIEULPIEUP
+ {0x9BEE, 0xC3C8}, //4790 #HANGUL SYLLABLE SSANGSIOS YE RIEULSIOS
+ {0x9BEF, 0xC3C9}, //4791 #HANGUL SYLLABLE SSANGSIOS YE RIEULTHIEUTH
+ {0x9BF0, 0xC3CA}, //4792 #HANGUL SYLLABLE SSANGSIOS YE RIEULPHIEUPH
+ {0x9BF1, 0xC3CB}, //4793 #HANGUL SYLLABLE SSANGSIOS YE RIEULHIEUH
+ {0x9BF2, 0xC3CC}, //4794 #HANGUL SYLLABLE SSANGSIOS YE MIEUM
+ {0x9BF3, 0xC3CD}, //4795 #HANGUL SYLLABLE SSANGSIOS YE PIEUP
+ {0x9BF4, 0xC3CE}, //4796 #HANGUL SYLLABLE SSANGSIOS YE PIEUPSIOS
+ {0x9BF5, 0xC3CF}, //4797 #HANGUL SYLLABLE SSANGSIOS YE SIOS
+ {0x9BF6, 0xC3D0}, //4798 #HANGUL SYLLABLE SSANGSIOS YE SSANGSIOS
+ {0x9BF7, 0xC3D1}, //4799 #HANGUL SYLLABLE SSANGSIOS YE IEUNG
+ {0x9BF8, 0xC3D2}, //4800 #HANGUL SYLLABLE SSANGSIOS YE CIEUC
+ {0x9BF9, 0xC3D3}, //4801 #HANGUL SYLLABLE SSANGSIOS YE CHIEUCH
+ {0x9BFA, 0xC3D4}, //4802 #HANGUL SYLLABLE SSANGSIOS YE KHIEUKH
+ {0x9BFB, 0xC3D5}, //4803 #HANGUL SYLLABLE SSANGSIOS YE THIEUTH
+ {0x9BFC, 0xC3D6}, //4804 #HANGUL SYLLABLE SSANGSIOS YE PHIEUPH
+ {0x9BFD, 0xC3D7}, //4805 #HANGUL SYLLABLE SSANGSIOS YE HIEUH
+ {0x9BFE, 0xC3DA}, //4806 #HANGUL SYLLABLE SSANGSIOS O SSANGKIYEOK
+ {0x9C41, 0xC3DB}, //4807 #HANGUL SYLLABLE SSANGSIOS O KIYEOKSIOS
+ {0x9C42, 0xC3DD}, //4808 #HANGUL SYLLABLE SSANGSIOS O NIEUNCIEUC
+ {0x9C43, 0xC3DE}, //4809 #HANGUL SYLLABLE SSANGSIOS O NIEUNHIEUH
+ {0x9C44, 0xC3E1}, //4810 #HANGUL SYLLABLE SSANGSIOS O RIEULKIYEOK
+ {0x9C45, 0xC3E3}, //4811 #HANGUL SYLLABLE SSANGSIOS O RIEULPIEUP
+ {0x9C46, 0xC3E4}, //4812 #HANGUL SYLLABLE SSANGSIOS O RIEULSIOS
+ {0x9C47, 0xC3E5}, //4813 #HANGUL SYLLABLE SSANGSIOS O RIEULTHIEUTH
+ {0x9C48, 0xC3E6}, //4814 #HANGUL SYLLABLE SSANGSIOS O RIEULPHIEUPH
+ {0x9C49, 0xC3E7}, //4815 #HANGUL SYLLABLE SSANGSIOS O RIEULHIEUH
+ {0x9C4A, 0xC3EA}, //4816 #HANGUL SYLLABLE SSANGSIOS O PIEUPSIOS
+ {0x9C4B, 0xC3EB}, //4817 #HANGUL SYLLABLE SSANGSIOS O SIOS
+ {0x9C4C, 0xC3EC}, //4818 #HANGUL SYLLABLE SSANGSIOS O SSANGSIOS
+ {0x9C4D, 0xC3EE}, //4819 #HANGUL SYLLABLE SSANGSIOS O CIEUC
+ {0x9C4E, 0xC3EF}, //4820 #HANGUL SYLLABLE SSANGSIOS O CHIEUCH
+ {0x9C4F, 0xC3F0}, //4821 #HANGUL SYLLABLE SSANGSIOS O KHIEUKH
+ {0x9C50, 0xC3F1}, //4822 #HANGUL SYLLABLE SSANGSIOS O THIEUTH
+ {0x9C51, 0xC3F2}, //4823 #HANGUL SYLLABLE SSANGSIOS O PHIEUPH
+ {0x9C52, 0xC3F3}, //4824 #HANGUL SYLLABLE SSANGSIOS O HIEUH
+ {0x9C53, 0xC3F6}, //4825 #HANGUL SYLLABLE SSANGSIOS WA SSANGKIYEOK
+ {0x9C54, 0xC3F7}, //4826 #HANGUL SYLLABLE SSANGSIOS WA KIYEOKSIOS
+ {0x9C55, 0xC3F9}, //4827 #HANGUL SYLLABLE SSANGSIOS WA NIEUNCIEUC
+ {0x9C56, 0xC3FA}, //4828 #HANGUL SYLLABLE SSANGSIOS WA NIEUNHIEUH
+ {0x9C57, 0xC3FB}, //4829 #HANGUL SYLLABLE SSANGSIOS WA TIKEUT
+ {0x9C58, 0xC3FC}, //4830 #HANGUL SYLLABLE SSANGSIOS WA RIEUL
+ {0x9C59, 0xC3FD}, //4831 #HANGUL SYLLABLE SSANGSIOS WA RIEULKIYEOK
+ {0x9C5A, 0xC3FE}, //4832 #HANGUL SYLLABLE SSANGSIOS WA RIEULMIEUM
+ {0x9C61, 0xC3FF}, //4833 #HANGUL SYLLABLE SSANGSIOS WA RIEULPIEUP
+ {0x9C62, 0xC400}, //4834 #HANGUL SYLLABLE SSANGSIOS WA RIEULSIOS
+ {0x9C63, 0xC401}, //4835 #HANGUL SYLLABLE SSANGSIOS WA RIEULTHIEUTH
+ {0x9C64, 0xC402}, //4836 #HANGUL SYLLABLE SSANGSIOS WA RIEULPHIEUPH
+ {0x9C65, 0xC403}, //4837 #HANGUL SYLLABLE SSANGSIOS WA RIEULHIEUH
+ {0x9C66, 0xC404}, //4838 #HANGUL SYLLABLE SSANGSIOS WA MIEUM
+ {0x9C67, 0xC405}, //4839 #HANGUL SYLLABLE SSANGSIOS WA PIEUP
+ {0x9C68, 0xC406}, //4840 #HANGUL SYLLABLE SSANGSIOS WA PIEUPSIOS
+ {0x9C69, 0xC407}, //4841 #HANGUL SYLLABLE SSANGSIOS WA SIOS
+ {0x9C6A, 0xC409}, //4842 #HANGUL SYLLABLE SSANGSIOS WA IEUNG
+ {0x9C6B, 0xC40A}, //4843 #HANGUL SYLLABLE SSANGSIOS WA CIEUC
+ {0x9C6C, 0xC40B}, //4844 #HANGUL SYLLABLE SSANGSIOS WA CHIEUCH
+ {0x9C6D, 0xC40C}, //4845 #HANGUL SYLLABLE SSANGSIOS WA KHIEUKH
+ {0x9C6E, 0xC40D}, //4846 #HANGUL SYLLABLE SSANGSIOS WA THIEUTH
+ {0x9C6F, 0xC40E}, //4847 #HANGUL SYLLABLE SSANGSIOS WA PHIEUPH
+ {0x9C70, 0xC40F}, //4848 #HANGUL SYLLABLE SSANGSIOS WA HIEUH
+ {0x9C71, 0xC411}, //4849 #HANGUL SYLLABLE SSANGSIOS WAE KIYEOK
+ {0x9C72, 0xC412}, //4850 #HANGUL SYLLABLE SSANGSIOS WAE SSANGKIYEOK
+ {0x9C73, 0xC413}, //4851 #HANGUL SYLLABLE SSANGSIOS WAE KIYEOKSIOS
+ {0x9C74, 0xC414}, //4852 #HANGUL SYLLABLE SSANGSIOS WAE NIEUN
+ {0x9C75, 0xC415}, //4853 #HANGUL SYLLABLE SSANGSIOS WAE NIEUNCIEUC
+ {0x9C76, 0xC416}, //4854 #HANGUL SYLLABLE SSANGSIOS WAE NIEUNHIEUH
+ {0x9C77, 0xC417}, //4855 #HANGUL SYLLABLE SSANGSIOS WAE TIKEUT
+ {0x9C78, 0xC418}, //4856 #HANGUL SYLLABLE SSANGSIOS WAE RIEUL
+ {0x9C79, 0xC419}, //4857 #HANGUL SYLLABLE SSANGSIOS WAE RIEULKIYEOK
+ {0x9C7A, 0xC41A}, //4858 #HANGUL SYLLABLE SSANGSIOS WAE RIEULMIEUM
+ {0x9C81, 0xC41B}, //4859 #HANGUL SYLLABLE SSANGSIOS WAE RIEULPIEUP
+ {0x9C82, 0xC41C}, //4860 #HANGUL SYLLABLE SSANGSIOS WAE RIEULSIOS
+ {0x9C83, 0xC41D}, //4861 #HANGUL SYLLABLE SSANGSIOS WAE RIEULTHIEUTH
+ {0x9C84, 0xC41E}, //4862 #HANGUL SYLLABLE SSANGSIOS WAE RIEULPHIEUPH
+ {0x9C85, 0xC41F}, //4863 #HANGUL SYLLABLE SSANGSIOS WAE RIEULHIEUH
+ {0x9C86, 0xC420}, //4864 #HANGUL SYLLABLE SSANGSIOS WAE MIEUM
+ {0x9C87, 0xC421}, //4865 #HANGUL SYLLABLE SSANGSIOS WAE PIEUP
+ {0x9C88, 0xC422}, //4866 #HANGUL SYLLABLE SSANGSIOS WAE PIEUPSIOS
+ {0x9C89, 0xC423}, //4867 #HANGUL SYLLABLE SSANGSIOS WAE SIOS
+ {0x9C8A, 0xC425}, //4868 #HANGUL SYLLABLE SSANGSIOS WAE IEUNG
+ {0x9C8B, 0xC426}, //4869 #HANGUL SYLLABLE SSANGSIOS WAE CIEUC
+ {0x9C8C, 0xC427}, //4870 #HANGUL SYLLABLE SSANGSIOS WAE CHIEUCH
+ {0x9C8D, 0xC428}, //4871 #HANGUL SYLLABLE SSANGSIOS WAE KHIEUKH
+ {0x9C8E, 0xC429}, //4872 #HANGUL SYLLABLE SSANGSIOS WAE THIEUTH
+ {0x9C8F, 0xC42A}, //4873 #HANGUL SYLLABLE SSANGSIOS WAE PHIEUPH
+ {0x9C90, 0xC42B}, //4874 #HANGUL SYLLABLE SSANGSIOS WAE HIEUH
+ {0x9C91, 0xC42D}, //4875 #HANGUL SYLLABLE SSANGSIOS OE KIYEOK
+ {0x9C92, 0xC42E}, //4876 #HANGUL SYLLABLE SSANGSIOS OE SSANGKIYEOK
+ {0x9C93, 0xC42F}, //4877 #HANGUL SYLLABLE SSANGSIOS OE KIYEOKSIOS
+ {0x9C94, 0xC431}, //4878 #HANGUL SYLLABLE SSANGSIOS OE NIEUNCIEUC
+ {0x9C95, 0xC432}, //4879 #HANGUL SYLLABLE SSANGSIOS OE NIEUNHIEUH
+ {0x9C96, 0xC433}, //4880 #HANGUL SYLLABLE SSANGSIOS OE TIKEUT
+ {0x9C97, 0xC435}, //4881 #HANGUL SYLLABLE SSANGSIOS OE RIEULKIYEOK
+ {0x9C98, 0xC436}, //4882 #HANGUL SYLLABLE SSANGSIOS OE RIEULMIEUM
+ {0x9C99, 0xC437}, //4883 #HANGUL SYLLABLE SSANGSIOS OE RIEULPIEUP
+ {0x9C9A, 0xC438}, //4884 #HANGUL SYLLABLE SSANGSIOS OE RIEULSIOS
+ {0x9C9B, 0xC439}, //4885 #HANGUL SYLLABLE SSANGSIOS OE RIEULTHIEUTH
+ {0x9C9C, 0xC43A}, //4886 #HANGUL SYLLABLE SSANGSIOS OE RIEULPHIEUPH
+ {0x9C9D, 0xC43B}, //4887 #HANGUL SYLLABLE SSANGSIOS OE RIEULHIEUH
+ {0x9C9E, 0xC43E}, //4888 #HANGUL SYLLABLE SSANGSIOS OE PIEUPSIOS
+ {0x9C9F, 0xC43F}, //4889 #HANGUL SYLLABLE SSANGSIOS OE SIOS
+ {0x9CA0, 0xC440}, //4890 #HANGUL SYLLABLE SSANGSIOS OE SSANGSIOS
+ {0x9CA1, 0xC441}, //4891 #HANGUL SYLLABLE SSANGSIOS OE IEUNG
+ {0x9CA2, 0xC442}, //4892 #HANGUL SYLLABLE SSANGSIOS OE CIEUC
+ {0x9CA3, 0xC443}, //4893 #HANGUL SYLLABLE SSANGSIOS OE CHIEUCH
+ {0x9CA4, 0xC444}, //4894 #HANGUL SYLLABLE SSANGSIOS OE KHIEUKH
+ {0x9CA5, 0xC445}, //4895 #HANGUL SYLLABLE SSANGSIOS OE THIEUTH
+ {0x9CA6, 0xC446}, //4896 #HANGUL SYLLABLE SSANGSIOS OE PHIEUPH
+ {0x9CA7, 0xC447}, //4897 #HANGUL SYLLABLE SSANGSIOS OE HIEUH
+ {0x9CA8, 0xC449}, //4898 #HANGUL SYLLABLE SSANGSIOS YO KIYEOK
+ {0x9CA9, 0xC44A}, //4899 #HANGUL SYLLABLE SSANGSIOS YO SSANGKIYEOK
+ {0x9CAA, 0xC44B}, //4900 #HANGUL SYLLABLE SSANGSIOS YO KIYEOKSIOS
+ {0x9CAB, 0xC44C}, //4901 #HANGUL SYLLABLE SSANGSIOS YO NIEUN
+ {0x9CAC, 0xC44D}, //4902 #HANGUL SYLLABLE SSANGSIOS YO NIEUNCIEUC
+ {0x9CAD, 0xC44E}, //4903 #HANGUL SYLLABLE SSANGSIOS YO NIEUNHIEUH
+ {0x9CAE, 0xC44F}, //4904 #HANGUL SYLLABLE SSANGSIOS YO TIKEUT
+ {0x9CAF, 0xC450}, //4905 #HANGUL SYLLABLE SSANGSIOS YO RIEUL
+ {0x9CB0, 0xC451}, //4906 #HANGUL SYLLABLE SSANGSIOS YO RIEULKIYEOK
+ {0x9CB1, 0xC452}, //4907 #HANGUL SYLLABLE SSANGSIOS YO RIEULMIEUM
+ {0x9CB2, 0xC453}, //4908 #HANGUL SYLLABLE SSANGSIOS YO RIEULPIEUP
+ {0x9CB3, 0xC454}, //4909 #HANGUL SYLLABLE SSANGSIOS YO RIEULSIOS
+ {0x9CB4, 0xC455}, //4910 #HANGUL SYLLABLE SSANGSIOS YO RIEULTHIEUTH
+ {0x9CB5, 0xC456}, //4911 #HANGUL SYLLABLE SSANGSIOS YO RIEULPHIEUPH
+ {0x9CB6, 0xC457}, //4912 #HANGUL SYLLABLE SSANGSIOS YO RIEULHIEUH
+ {0x9CB7, 0xC458}, //4913 #HANGUL SYLLABLE SSANGSIOS YO MIEUM
+ {0x9CB8, 0xC459}, //4914 #HANGUL SYLLABLE SSANGSIOS YO PIEUP
+ {0x9CB9, 0xC45A}, //4915 #HANGUL SYLLABLE SSANGSIOS YO PIEUPSIOS
+ {0x9CBA, 0xC45B}, //4916 #HANGUL SYLLABLE SSANGSIOS YO SIOS
+ {0x9CBB, 0xC45C}, //4917 #HANGUL SYLLABLE SSANGSIOS YO SSANGSIOS
+ {0x9CBC, 0xC45D}, //4918 #HANGUL SYLLABLE SSANGSIOS YO IEUNG
+ {0x9CBD, 0xC45E}, //4919 #HANGUL SYLLABLE SSANGSIOS YO CIEUC
+ {0x9CBE, 0xC45F}, //4920 #HANGUL SYLLABLE SSANGSIOS YO CHIEUCH
+ {0x9CBF, 0xC460}, //4921 #HANGUL SYLLABLE SSANGSIOS YO KHIEUKH
+ {0x9CC0, 0xC461}, //4922 #HANGUL SYLLABLE SSANGSIOS YO THIEUTH
+ {0x9CC1, 0xC462}, //4923 #HANGUL SYLLABLE SSANGSIOS YO PHIEUPH
+ {0x9CC2, 0xC463}, //4924 #HANGUL SYLLABLE SSANGSIOS YO HIEUH
+ {0x9CC3, 0xC466}, //4925 #HANGUL SYLLABLE SSANGSIOS U SSANGKIYEOK
+ {0x9CC4, 0xC467}, //4926 #HANGUL SYLLABLE SSANGSIOS U KIYEOKSIOS
+ {0x9CC5, 0xC469}, //4927 #HANGUL SYLLABLE SSANGSIOS U NIEUNCIEUC
+ {0x9CC6, 0xC46A}, //4928 #HANGUL SYLLABLE SSANGSIOS U NIEUNHIEUH
+ {0x9CC7, 0xC46B}, //4929 #HANGUL SYLLABLE SSANGSIOS U TIKEUT
+ {0x9CC8, 0xC46D}, //4930 #HANGUL SYLLABLE SSANGSIOS U RIEULKIYEOK
+ {0x9CC9, 0xC46E}, //4931 #HANGUL SYLLABLE SSANGSIOS U RIEULMIEUM
+ {0x9CCA, 0xC46F}, //4932 #HANGUL SYLLABLE SSANGSIOS U RIEULPIEUP
+ {0x9CCB, 0xC470}, //4933 #HANGUL SYLLABLE SSANGSIOS U RIEULSIOS
+ {0x9CCC, 0xC471}, //4934 #HANGUL SYLLABLE SSANGSIOS U RIEULTHIEUTH
+ {0x9CCD, 0xC472}, //4935 #HANGUL SYLLABLE SSANGSIOS U RIEULPHIEUPH
+ {0x9CCE, 0xC473}, //4936 #HANGUL SYLLABLE SSANGSIOS U RIEULHIEUH
+ {0x9CCF, 0xC476}, //4937 #HANGUL SYLLABLE SSANGSIOS U PIEUPSIOS
+ {0x9CD0, 0xC477}, //4938 #HANGUL SYLLABLE SSANGSIOS U SIOS
+ {0x9CD1, 0xC478}, //4939 #HANGUL SYLLABLE SSANGSIOS U SSANGSIOS
+ {0x9CD2, 0xC47A}, //4940 #HANGUL SYLLABLE SSANGSIOS U CIEUC
+ {0x9CD3, 0xC47B}, //4941 #HANGUL SYLLABLE SSANGSIOS U CHIEUCH
+ {0x9CD4, 0xC47C}, //4942 #HANGUL SYLLABLE SSANGSIOS U KHIEUKH
+ {0x9CD5, 0xC47D}, //4943 #HANGUL SYLLABLE SSANGSIOS U THIEUTH
+ {0x9CD6, 0xC47E}, //4944 #HANGUL SYLLABLE SSANGSIOS U PHIEUPH
+ {0x9CD7, 0xC47F}, //4945 #HANGUL SYLLABLE SSANGSIOS U HIEUH
+ {0x9CD8, 0xC481}, //4946 #HANGUL SYLLABLE SSANGSIOS WEO KIYEOK
+ {0x9CD9, 0xC482}, //4947 #HANGUL SYLLABLE SSANGSIOS WEO SSANGKIYEOK
+ {0x9CDA, 0xC483}, //4948 #HANGUL SYLLABLE SSANGSIOS WEO KIYEOKSIOS
+ {0x9CDB, 0xC484}, //4949 #HANGUL SYLLABLE SSANGSIOS WEO NIEUN
+ {0x9CDC, 0xC485}, //4950 #HANGUL SYLLABLE SSANGSIOS WEO NIEUNCIEUC
+ {0x9CDD, 0xC486}, //4951 #HANGUL SYLLABLE SSANGSIOS WEO NIEUNHIEUH
+ {0x9CDE, 0xC487}, //4952 #HANGUL SYLLABLE SSANGSIOS WEO TIKEUT
+ {0x9CDF, 0xC488}, //4953 #HANGUL SYLLABLE SSANGSIOS WEO RIEUL
+ {0x9CE0, 0xC489}, //4954 #HANGUL SYLLABLE SSANGSIOS WEO RIEULKIYEOK
+ {0x9CE1, 0xC48A}, //4955 #HANGUL SYLLABLE SSANGSIOS WEO RIEULMIEUM
+ {0x9CE2, 0xC48B}, //4956 #HANGUL SYLLABLE SSANGSIOS WEO RIEULPIEUP
+ {0x9CE3, 0xC48C}, //4957 #HANGUL SYLLABLE SSANGSIOS WEO RIEULSIOS
+ {0x9CE4, 0xC48D}, //4958 #HANGUL SYLLABLE SSANGSIOS WEO RIEULTHIEUTH
+ {0x9CE5, 0xC48E}, //4959 #HANGUL SYLLABLE SSANGSIOS WEO RIEULPHIEUPH
+ {0x9CE6, 0xC48F}, //4960 #HANGUL SYLLABLE SSANGSIOS WEO RIEULHIEUH
+ {0x9CE7, 0xC490}, //4961 #HANGUL SYLLABLE SSANGSIOS WEO MIEUM
+ {0x9CE8, 0xC491}, //4962 #HANGUL SYLLABLE SSANGSIOS WEO PIEUP
+ {0x9CE9, 0xC492}, //4963 #HANGUL SYLLABLE SSANGSIOS WEO PIEUPSIOS
+ {0x9CEA, 0xC493}, //4964 #HANGUL SYLLABLE SSANGSIOS WEO SIOS
+ {0x9CEB, 0xC495}, //4965 #HANGUL SYLLABLE SSANGSIOS WEO IEUNG
+ {0x9CEC, 0xC496}, //4966 #HANGUL SYLLABLE SSANGSIOS WEO CIEUC
+ {0x9CED, 0xC497}, //4967 #HANGUL SYLLABLE SSANGSIOS WEO CHIEUCH
+ {0x9CEE, 0xC498}, //4968 #HANGUL SYLLABLE SSANGSIOS WEO KHIEUKH
+ {0x9CEF, 0xC499}, //4969 #HANGUL SYLLABLE SSANGSIOS WEO THIEUTH
+ {0x9CF0, 0xC49A}, //4970 #HANGUL SYLLABLE SSANGSIOS WEO PHIEUPH
+ {0x9CF1, 0xC49B}, //4971 #HANGUL SYLLABLE SSANGSIOS WEO HIEUH
+ {0x9CF2, 0xC49D}, //4972 #HANGUL SYLLABLE SSANGSIOS WE KIYEOK
+ {0x9CF3, 0xC49E}, //4973 #HANGUL SYLLABLE SSANGSIOS WE SSANGKIYEOK
+ {0x9CF4, 0xC49F}, //4974 #HANGUL SYLLABLE SSANGSIOS WE KIYEOKSIOS
+ {0x9CF5, 0xC4A0}, //4975 #HANGUL SYLLABLE SSANGSIOS WE NIEUN
+ {0x9CF6, 0xC4A1}, //4976 #HANGUL SYLLABLE SSANGSIOS WE NIEUNCIEUC
+ {0x9CF7, 0xC4A2}, //4977 #HANGUL SYLLABLE SSANGSIOS WE NIEUNHIEUH
+ {0x9CF8, 0xC4A3}, //4978 #HANGUL SYLLABLE SSANGSIOS WE TIKEUT
+ {0x9CF9, 0xC4A4}, //4979 #HANGUL SYLLABLE SSANGSIOS WE RIEUL
+ {0x9CFA, 0xC4A5}, //4980 #HANGUL SYLLABLE SSANGSIOS WE RIEULKIYEOK
+ {0x9CFB, 0xC4A6}, //4981 #HANGUL SYLLABLE SSANGSIOS WE RIEULMIEUM
+ {0x9CFC, 0xC4A7}, //4982 #HANGUL SYLLABLE SSANGSIOS WE RIEULPIEUP
+ {0x9CFD, 0xC4A8}, //4983 #HANGUL SYLLABLE SSANGSIOS WE RIEULSIOS
+ {0x9CFE, 0xC4A9}, //4984 #HANGUL SYLLABLE SSANGSIOS WE RIEULTHIEUTH
+ {0x9D41, 0xC4AA}, //4985 #HANGUL SYLLABLE SSANGSIOS WE RIEULPHIEUPH
+ {0x9D42, 0xC4AB}, //4986 #HANGUL SYLLABLE SSANGSIOS WE RIEULHIEUH
+ {0x9D43, 0xC4AC}, //4987 #HANGUL SYLLABLE SSANGSIOS WE MIEUM
+ {0x9D44, 0xC4AD}, //4988 #HANGUL SYLLABLE SSANGSIOS WE PIEUP
+ {0x9D45, 0xC4AE}, //4989 #HANGUL SYLLABLE SSANGSIOS WE PIEUPSIOS
+ {0x9D46, 0xC4AF}, //4990 #HANGUL SYLLABLE SSANGSIOS WE SIOS
+ {0x9D47, 0xC4B0}, //4991 #HANGUL SYLLABLE SSANGSIOS WE SSANGSIOS
+ {0x9D48, 0xC4B1}, //4992 #HANGUL SYLLABLE SSANGSIOS WE IEUNG
+ {0x9D49, 0xC4B2}, //4993 #HANGUL SYLLABLE SSANGSIOS WE CIEUC
+ {0x9D4A, 0xC4B3}, //4994 #HANGUL SYLLABLE SSANGSIOS WE CHIEUCH
+ {0x9D4B, 0xC4B4}, //4995 #HANGUL SYLLABLE SSANGSIOS WE KHIEUKH
+ {0x9D4C, 0xC4B5}, //4996 #HANGUL SYLLABLE SSANGSIOS WE THIEUTH
+ {0x9D4D, 0xC4B6}, //4997 #HANGUL SYLLABLE SSANGSIOS WE PHIEUPH
+ {0x9D4E, 0xC4B7}, //4998 #HANGUL SYLLABLE SSANGSIOS WE HIEUH
+ {0x9D4F, 0xC4B9}, //4999 #HANGUL SYLLABLE SSANGSIOS WI KIYEOK
+ {0x9D50, 0xC4BA}, //5000 #HANGUL SYLLABLE SSANGSIOS WI SSANGKIYEOK
+ {0x9D51, 0xC4BB}, //5001 #HANGUL SYLLABLE SSANGSIOS WI KIYEOKSIOS
+ {0x9D52, 0xC4BD}, //5002 #HANGUL SYLLABLE SSANGSIOS WI NIEUNCIEUC
+ {0x9D53, 0xC4BE}, //5003 #HANGUL SYLLABLE SSANGSIOS WI NIEUNHIEUH
+ {0x9D54, 0xC4BF}, //5004 #HANGUL SYLLABLE SSANGSIOS WI TIKEUT
+ {0x9D55, 0xC4C0}, //5005 #HANGUL SYLLABLE SSANGSIOS WI RIEUL
+ {0x9D56, 0xC4C1}, //5006 #HANGUL SYLLABLE SSANGSIOS WI RIEULKIYEOK
+ {0x9D57, 0xC4C2}, //5007 #HANGUL SYLLABLE SSANGSIOS WI RIEULMIEUM
+ {0x9D58, 0xC4C3}, //5008 #HANGUL SYLLABLE SSANGSIOS WI RIEULPIEUP
+ {0x9D59, 0xC4C4}, //5009 #HANGUL SYLLABLE SSANGSIOS WI RIEULSIOS
+ {0x9D5A, 0xC4C5}, //5010 #HANGUL SYLLABLE SSANGSIOS WI RIEULTHIEUTH
+ {0x9D61, 0xC4C6}, //5011 #HANGUL SYLLABLE SSANGSIOS WI RIEULPHIEUPH
+ {0x9D62, 0xC4C7}, //5012 #HANGUL SYLLABLE SSANGSIOS WI RIEULHIEUH
+ {0x9D63, 0xC4C8}, //5013 #HANGUL SYLLABLE SSANGSIOS WI MIEUM
+ {0x9D64, 0xC4C9}, //5014 #HANGUL SYLLABLE SSANGSIOS WI PIEUP
+ {0x9D65, 0xC4CA}, //5015 #HANGUL SYLLABLE SSANGSIOS WI PIEUPSIOS
+ {0x9D66, 0xC4CB}, //5016 #HANGUL SYLLABLE SSANGSIOS WI SIOS
+ {0x9D67, 0xC4CC}, //5017 #HANGUL SYLLABLE SSANGSIOS WI SSANGSIOS
+ {0x9D68, 0xC4CD}, //5018 #HANGUL SYLLABLE SSANGSIOS WI IEUNG
+ {0x9D69, 0xC4CE}, //5019 #HANGUL SYLLABLE SSANGSIOS WI CIEUC
+ {0x9D6A, 0xC4CF}, //5020 #HANGUL SYLLABLE SSANGSIOS WI CHIEUCH
+ {0x9D6B, 0xC4D0}, //5021 #HANGUL SYLLABLE SSANGSIOS WI KHIEUKH
+ {0x9D6C, 0xC4D1}, //5022 #HANGUL SYLLABLE SSANGSIOS WI THIEUTH
+ {0x9D6D, 0xC4D2}, //5023 #HANGUL SYLLABLE SSANGSIOS WI PHIEUPH
+ {0x9D6E, 0xC4D3}, //5024 #HANGUL SYLLABLE SSANGSIOS WI HIEUH
+ {0x9D6F, 0xC4D4}, //5025 #HANGUL SYLLABLE SSANGSIOS YU
+ {0x9D70, 0xC4D5}, //5026 #HANGUL SYLLABLE SSANGSIOS YU KIYEOK
+ {0x9D71, 0xC4D6}, //5027 #HANGUL SYLLABLE SSANGSIOS YU SSANGKIYEOK
+ {0x9D72, 0xC4D7}, //5028 #HANGUL SYLLABLE SSANGSIOS YU KIYEOKSIOS
+ {0x9D73, 0xC4D8}, //5029 #HANGUL SYLLABLE SSANGSIOS YU NIEUN
+ {0x9D74, 0xC4D9}, //5030 #HANGUL SYLLABLE SSANGSIOS YU NIEUNCIEUC
+ {0x9D75, 0xC4DA}, //5031 #HANGUL SYLLABLE SSANGSIOS YU NIEUNHIEUH
+ {0x9D76, 0xC4DB}, //5032 #HANGUL SYLLABLE SSANGSIOS YU TIKEUT
+ {0x9D77, 0xC4DC}, //5033 #HANGUL SYLLABLE SSANGSIOS YU RIEUL
+ {0x9D78, 0xC4DD}, //5034 #HANGUL SYLLABLE SSANGSIOS YU RIEULKIYEOK
+ {0x9D79, 0xC4DE}, //5035 #HANGUL SYLLABLE SSANGSIOS YU RIEULMIEUM
+ {0x9D7A, 0xC4DF}, //5036 #HANGUL SYLLABLE SSANGSIOS YU RIEULPIEUP
+ {0x9D81, 0xC4E0}, //5037 #HANGUL SYLLABLE SSANGSIOS YU RIEULSIOS
+ {0x9D82, 0xC4E1}, //5038 #HANGUL SYLLABLE SSANGSIOS YU RIEULTHIEUTH
+ {0x9D83, 0xC4E2}, //5039 #HANGUL SYLLABLE SSANGSIOS YU RIEULPHIEUPH
+ {0x9D84, 0xC4E3}, //5040 #HANGUL SYLLABLE SSANGSIOS YU RIEULHIEUH
+ {0x9D85, 0xC4E4}, //5041 #HANGUL SYLLABLE SSANGSIOS YU MIEUM
+ {0x9D86, 0xC4E5}, //5042 #HANGUL SYLLABLE SSANGSIOS YU PIEUP
+ {0x9D87, 0xC4E6}, //5043 #HANGUL SYLLABLE SSANGSIOS YU PIEUPSIOS
+ {0x9D88, 0xC4E7}, //5044 #HANGUL SYLLABLE SSANGSIOS YU SIOS
+ {0x9D89, 0xC4E8}, //5045 #HANGUL SYLLABLE SSANGSIOS YU SSANGSIOS
+ {0x9D8A, 0xC4EA}, //5046 #HANGUL SYLLABLE SSANGSIOS YU CIEUC
+ {0x9D8B, 0xC4EB}, //5047 #HANGUL SYLLABLE SSANGSIOS YU CHIEUCH
+ {0x9D8C, 0xC4EC}, //5048 #HANGUL SYLLABLE SSANGSIOS YU KHIEUKH
+ {0x9D8D, 0xC4ED}, //5049 #HANGUL SYLLABLE SSANGSIOS YU THIEUTH
+ {0x9D8E, 0xC4EE}, //5050 #HANGUL SYLLABLE SSANGSIOS YU PHIEUPH
+ {0x9D8F, 0xC4EF}, //5051 #HANGUL SYLLABLE SSANGSIOS YU HIEUH
+ {0x9D90, 0xC4F2}, //5052 #HANGUL SYLLABLE SSANGSIOS EU SSANGKIYEOK
+ {0x9D91, 0xC4F3}, //5053 #HANGUL SYLLABLE SSANGSIOS EU KIYEOKSIOS
+ {0x9D92, 0xC4F5}, //5054 #HANGUL SYLLABLE SSANGSIOS EU NIEUNCIEUC
+ {0x9D93, 0xC4F6}, //5055 #HANGUL SYLLABLE SSANGSIOS EU NIEUNHIEUH
+ {0x9D94, 0xC4F7}, //5056 #HANGUL SYLLABLE SSANGSIOS EU TIKEUT
+ {0x9D95, 0xC4F9}, //5057 #HANGUL SYLLABLE SSANGSIOS EU RIEULKIYEOK
+ {0x9D96, 0xC4FB}, //5058 #HANGUL SYLLABLE SSANGSIOS EU RIEULPIEUP
+ {0x9D97, 0xC4FC}, //5059 #HANGUL SYLLABLE SSANGSIOS EU RIEULSIOS
+ {0x9D98, 0xC4FD}, //5060 #HANGUL SYLLABLE SSANGSIOS EU RIEULTHIEUTH
+ {0x9D99, 0xC4FE}, //5061 #HANGUL SYLLABLE SSANGSIOS EU RIEULPHIEUPH
+ {0x9D9A, 0xC502}, //5062 #HANGUL SYLLABLE SSANGSIOS EU PIEUPSIOS
+ {0x9D9B, 0xC503}, //5063 #HANGUL SYLLABLE SSANGSIOS EU SIOS
+ {0x9D9C, 0xC504}, //5064 #HANGUL SYLLABLE SSANGSIOS EU SSANGSIOS
+ {0x9D9D, 0xC505}, //5065 #HANGUL SYLLABLE SSANGSIOS EU IEUNG
+ {0x9D9E, 0xC506}, //5066 #HANGUL SYLLABLE SSANGSIOS EU CIEUC
+ {0x9D9F, 0xC507}, //5067 #HANGUL SYLLABLE SSANGSIOS EU CHIEUCH
+ {0x9DA0, 0xC508}, //5068 #HANGUL SYLLABLE SSANGSIOS EU KHIEUKH
+ {0x9DA1, 0xC509}, //5069 #HANGUL SYLLABLE SSANGSIOS EU THIEUTH
+ {0x9DA2, 0xC50A}, //5070 #HANGUL SYLLABLE SSANGSIOS EU PHIEUPH
+ {0x9DA3, 0xC50B}, //5071 #HANGUL SYLLABLE SSANGSIOS EU HIEUH
+ {0x9DA4, 0xC50D}, //5072 #HANGUL SYLLABLE SSANGSIOS YI KIYEOK
+ {0x9DA5, 0xC50E}, //5073 #HANGUL SYLLABLE SSANGSIOS YI SSANGKIYEOK
+ {0x9DA6, 0xC50F}, //5074 #HANGUL SYLLABLE SSANGSIOS YI KIYEOKSIOS
+ {0x9DA7, 0xC511}, //5075 #HANGUL SYLLABLE SSANGSIOS YI NIEUNCIEUC
+ {0x9DA8, 0xC512}, //5076 #HANGUL SYLLABLE SSANGSIOS YI NIEUNHIEUH
+ {0x9DA9, 0xC513}, //5077 #HANGUL SYLLABLE SSANGSIOS YI TIKEUT
+ {0x9DAA, 0xC515}, //5078 #HANGUL SYLLABLE SSANGSIOS YI RIEULKIYEOK
+ {0x9DAB, 0xC516}, //5079 #HANGUL SYLLABLE SSANGSIOS YI RIEULMIEUM
+ {0x9DAC, 0xC517}, //5080 #HANGUL SYLLABLE SSANGSIOS YI RIEULPIEUP
+ {0x9DAD, 0xC518}, //5081 #HANGUL SYLLABLE SSANGSIOS YI RIEULSIOS
+ {0x9DAE, 0xC519}, //5082 #HANGUL SYLLABLE SSANGSIOS YI RIEULTHIEUTH
+ {0x9DAF, 0xC51A}, //5083 #HANGUL SYLLABLE SSANGSIOS YI RIEULPHIEUPH
+ {0x9DB0, 0xC51B}, //5084 #HANGUL SYLLABLE SSANGSIOS YI RIEULHIEUH
+ {0x9DB1, 0xC51D}, //5085 #HANGUL SYLLABLE SSANGSIOS YI PIEUP
+ {0x9DB2, 0xC51E}, //5086 #HANGUL SYLLABLE SSANGSIOS YI PIEUPSIOS
+ {0x9DB3, 0xC51F}, //5087 #HANGUL SYLLABLE SSANGSIOS YI SIOS
+ {0x9DB4, 0xC520}, //5088 #HANGUL SYLLABLE SSANGSIOS YI SSANGSIOS
+ {0x9DB5, 0xC521}, //5089 #HANGUL SYLLABLE SSANGSIOS YI IEUNG
+ {0x9DB6, 0xC522}, //5090 #HANGUL SYLLABLE SSANGSIOS YI CIEUC
+ {0x9DB7, 0xC523}, //5091 #HANGUL SYLLABLE SSANGSIOS YI CHIEUCH
+ {0x9DB8, 0xC524}, //5092 #HANGUL SYLLABLE SSANGSIOS YI KHIEUKH
+ {0x9DB9, 0xC525}, //5093 #HANGUL SYLLABLE SSANGSIOS YI THIEUTH
+ {0x9DBA, 0xC526}, //5094 #HANGUL SYLLABLE SSANGSIOS YI PHIEUPH
+ {0x9DBB, 0xC527}, //5095 #HANGUL SYLLABLE SSANGSIOS YI HIEUH
+ {0x9DBC, 0xC52A}, //5096 #HANGUL SYLLABLE SSANGSIOS I SSANGKIYEOK
+ {0x9DBD, 0xC52B}, //5097 #HANGUL SYLLABLE SSANGSIOS I KIYEOKSIOS
+ {0x9DBE, 0xC52D}, //5098 #HANGUL SYLLABLE SSANGSIOS I NIEUNCIEUC
+ {0x9DBF, 0xC52E}, //5099 #HANGUL SYLLABLE SSANGSIOS I NIEUNHIEUH
+ {0x9DC0, 0xC52F}, //5100 #HANGUL SYLLABLE SSANGSIOS I TIKEUT
+ {0x9DC1, 0xC531}, //5101 #HANGUL SYLLABLE SSANGSIOS I RIEULKIYEOK
+ {0x9DC2, 0xC532}, //5102 #HANGUL SYLLABLE SSANGSIOS I RIEULMIEUM
+ {0x9DC3, 0xC533}, //5103 #HANGUL SYLLABLE SSANGSIOS I RIEULPIEUP
+ {0x9DC4, 0xC534}, //5104 #HANGUL SYLLABLE SSANGSIOS I RIEULSIOS
+ {0x9DC5, 0xC535}, //5105 #HANGUL SYLLABLE SSANGSIOS I RIEULTHIEUTH
+ {0x9DC6, 0xC536}, //5106 #HANGUL SYLLABLE SSANGSIOS I RIEULPHIEUPH
+ {0x9DC7, 0xC537}, //5107 #HANGUL SYLLABLE SSANGSIOS I RIEULHIEUH
+ {0x9DC8, 0xC53A}, //5108 #HANGUL SYLLABLE SSANGSIOS I PIEUPSIOS
+ {0x9DC9, 0xC53C}, //5109 #HANGUL SYLLABLE SSANGSIOS I SSANGSIOS
+ {0x9DCA, 0xC53E}, //5110 #HANGUL SYLLABLE SSANGSIOS I CIEUC
+ {0x9DCB, 0xC53F}, //5111 #HANGUL SYLLABLE SSANGSIOS I CHIEUCH
+ {0x9DCC, 0xC540}, //5112 #HANGUL SYLLABLE SSANGSIOS I KHIEUKH
+ {0x9DCD, 0xC541}, //5113 #HANGUL SYLLABLE SSANGSIOS I THIEUTH
+ {0x9DCE, 0xC542}, //5114 #HANGUL SYLLABLE SSANGSIOS I PHIEUPH
+ {0x9DCF, 0xC543}, //5115 #HANGUL SYLLABLE SSANGSIOS I HIEUH
+ {0x9DD0, 0xC546}, //5116 #HANGUL SYLLABLE IEUNG A SSANGKIYEOK
+ {0x9DD1, 0xC547}, //5117 #HANGUL SYLLABLE IEUNG A KIYEOKSIOS
+ {0x9DD2, 0xC54B}, //5118 #HANGUL SYLLABLE IEUNG A TIKEUT
+ {0x9DD3, 0xC54F}, //5119 #HANGUL SYLLABLE IEUNG A RIEULPIEUP
+ {0x9DD4, 0xC550}, //5120 #HANGUL SYLLABLE IEUNG A RIEULSIOS
+ {0x9DD5, 0xC551}, //5121 #HANGUL SYLLABLE IEUNG A RIEULTHIEUTH
+ {0x9DD6, 0xC552}, //5122 #HANGUL SYLLABLE IEUNG A RIEULPHIEUPH
+ {0x9DD7, 0xC556}, //5123 #HANGUL SYLLABLE IEUNG A PIEUPSIOS
+ {0x9DD8, 0xC55A}, //5124 #HANGUL SYLLABLE IEUNG A CIEUC
+ {0x9DD9, 0xC55B}, //5125 #HANGUL SYLLABLE IEUNG A CHIEUCH
+ {0x9DDA, 0xC55C}, //5126 #HANGUL SYLLABLE IEUNG A KHIEUKH
+ {0x9DDB, 0xC55F}, //5127 #HANGUL SYLLABLE IEUNG A HIEUH
+ {0x9DDC, 0xC562}, //5128 #HANGUL SYLLABLE IEUNG AE SSANGKIYEOK
+ {0x9DDD, 0xC563}, //5129 #HANGUL SYLLABLE IEUNG AE KIYEOKSIOS
+ {0x9DDE, 0xC565}, //5130 #HANGUL SYLLABLE IEUNG AE NIEUNCIEUC
+ {0x9DDF, 0xC566}, //5131 #HANGUL SYLLABLE IEUNG AE NIEUNHIEUH
+ {0x9DE0, 0xC567}, //5132 #HANGUL SYLLABLE IEUNG AE TIKEUT
+ {0x9DE1, 0xC569}, //5133 #HANGUL SYLLABLE IEUNG AE RIEULKIYEOK
+ {0x9DE2, 0xC56A}, //5134 #HANGUL SYLLABLE IEUNG AE RIEULMIEUM
+ {0x9DE3, 0xC56B}, //5135 #HANGUL SYLLABLE IEUNG AE RIEULPIEUP
+ {0x9DE4, 0xC56C}, //5136 #HANGUL SYLLABLE IEUNG AE RIEULSIOS
+ {0x9DE5, 0xC56D}, //5137 #HANGUL SYLLABLE IEUNG AE RIEULTHIEUTH
+ {0x9DE6, 0xC56E}, //5138 #HANGUL SYLLABLE IEUNG AE RIEULPHIEUPH
+ {0x9DE7, 0xC56F}, //5139 #HANGUL SYLLABLE IEUNG AE RIEULHIEUH
+ {0x9DE8, 0xC572}, //5140 #HANGUL SYLLABLE IEUNG AE PIEUPSIOS
+ {0x9DE9, 0xC576}, //5141 #HANGUL SYLLABLE IEUNG AE CIEUC
+ {0x9DEA, 0xC577}, //5142 #HANGUL SYLLABLE IEUNG AE CHIEUCH
+ {0x9DEB, 0xC578}, //5143 #HANGUL SYLLABLE IEUNG AE KHIEUKH
+ {0x9DEC, 0xC579}, //5144 #HANGUL SYLLABLE IEUNG AE THIEUTH
+ {0x9DED, 0xC57A}, //5145 #HANGUL SYLLABLE IEUNG AE PHIEUPH
+ {0x9DEE, 0xC57B}, //5146 #HANGUL SYLLABLE IEUNG AE HIEUH
+ {0x9DEF, 0xC57E}, //5147 #HANGUL SYLLABLE IEUNG YA SSANGKIYEOK
+ {0x9DF0, 0xC57F}, //5148 #HANGUL SYLLABLE IEUNG YA KIYEOKSIOS
+ {0x9DF1, 0xC581}, //5149 #HANGUL SYLLABLE IEUNG YA NIEUNCIEUC
+ {0x9DF2, 0xC582}, //5150 #HANGUL SYLLABLE IEUNG YA NIEUNHIEUH
+ {0x9DF3, 0xC583}, //5151 #HANGUL SYLLABLE IEUNG YA TIKEUT
+ {0x9DF4, 0xC585}, //5152 #HANGUL SYLLABLE IEUNG YA RIEULKIYEOK
+ {0x9DF5, 0xC586}, //5153 #HANGUL SYLLABLE IEUNG YA RIEULMIEUM
+ {0x9DF6, 0xC588}, //5154 #HANGUL SYLLABLE IEUNG YA RIEULSIOS
+ {0x9DF7, 0xC589}, //5155 #HANGUL SYLLABLE IEUNG YA RIEULTHIEUTH
+ {0x9DF8, 0xC58A}, //5156 #HANGUL SYLLABLE IEUNG YA RIEULPHIEUPH
+ {0x9DF9, 0xC58B}, //5157 #HANGUL SYLLABLE IEUNG YA RIEULHIEUH
+ {0x9DFA, 0xC58E}, //5158 #HANGUL SYLLABLE IEUNG YA PIEUPSIOS
+ {0x9DFB, 0xC590}, //5159 #HANGUL SYLLABLE IEUNG YA SSANGSIOS
+ {0x9DFC, 0xC592}, //5160 #HANGUL SYLLABLE IEUNG YA CIEUC
+ {0x9DFD, 0xC593}, //5161 #HANGUL SYLLABLE IEUNG YA CHIEUCH
+ {0x9DFE, 0xC594}, //5162 #HANGUL SYLLABLE IEUNG YA KHIEUKH
+ {0x9E41, 0xC596}, //5163 #HANGUL SYLLABLE IEUNG YA PHIEUPH
+ {0x9E42, 0xC599}, //5164 #HANGUL SYLLABLE IEUNG YAE KIYEOK
+ {0x9E43, 0xC59A}, //5165 #HANGUL SYLLABLE IEUNG YAE SSANGKIYEOK
+ {0x9E44, 0xC59B}, //5166 #HANGUL SYLLABLE IEUNG YAE KIYEOKSIOS
+ {0x9E45, 0xC59D}, //5167 #HANGUL SYLLABLE IEUNG YAE NIEUNCIEUC
+ {0x9E46, 0xC59E}, //5168 #HANGUL SYLLABLE IEUNG YAE NIEUNHIEUH
+ {0x9E47, 0xC59F}, //5169 #HANGUL SYLLABLE IEUNG YAE TIKEUT
+ {0x9E48, 0xC5A1}, //5170 #HANGUL SYLLABLE IEUNG YAE RIEULKIYEOK
+ {0x9E49, 0xC5A2}, //5171 #HANGUL SYLLABLE IEUNG YAE RIEULMIEUM
+ {0x9E4A, 0xC5A3}, //5172 #HANGUL SYLLABLE IEUNG YAE RIEULPIEUP
+ {0x9E4B, 0xC5A4}, //5173 #HANGUL SYLLABLE IEUNG YAE RIEULSIOS
+ {0x9E4C, 0xC5A5}, //5174 #HANGUL SYLLABLE IEUNG YAE RIEULTHIEUTH
+ {0x9E4D, 0xC5A6}, //5175 #HANGUL SYLLABLE IEUNG YAE RIEULPHIEUPH
+ {0x9E4E, 0xC5A7}, //5176 #HANGUL SYLLABLE IEUNG YAE RIEULHIEUH
+ {0x9E4F, 0xC5A8}, //5177 #HANGUL SYLLABLE IEUNG YAE MIEUM
+ {0x9E50, 0xC5AA}, //5178 #HANGUL SYLLABLE IEUNG YAE PIEUPSIOS
+ {0x9E51, 0xC5AB}, //5179 #HANGUL SYLLABLE IEUNG YAE SIOS
+ {0x9E52, 0xC5AC}, //5180 #HANGUL SYLLABLE IEUNG YAE SSANGSIOS
+ {0x9E53, 0xC5AD}, //5181 #HANGUL SYLLABLE IEUNG YAE IEUNG
+ {0x9E54, 0xC5AE}, //5182 #HANGUL SYLLABLE IEUNG YAE CIEUC
+ {0x9E55, 0xC5AF}, //5183 #HANGUL SYLLABLE IEUNG YAE CHIEUCH
+ {0x9E56, 0xC5B0}, //5184 #HANGUL SYLLABLE IEUNG YAE KHIEUKH
+ {0x9E57, 0xC5B1}, //5185 #HANGUL SYLLABLE IEUNG YAE THIEUTH
+ {0x9E58, 0xC5B2}, //5186 #HANGUL SYLLABLE IEUNG YAE PHIEUPH
+ {0x9E59, 0xC5B3}, //5187 #HANGUL SYLLABLE IEUNG YAE HIEUH
+ {0x9E5A, 0xC5B6}, //5188 #HANGUL SYLLABLE IEUNG EO SSANGKIYEOK
+ {0x9E61, 0xC5B7}, //5189 #HANGUL SYLLABLE IEUNG EO KIYEOKSIOS
+ {0x9E62, 0xC5BA}, //5190 #HANGUL SYLLABLE IEUNG EO NIEUNHIEUH
+ {0x9E63, 0xC5BF}, //5191 #HANGUL SYLLABLE IEUNG EO RIEULPIEUP
+ {0x9E64, 0xC5C0}, //5192 #HANGUL SYLLABLE IEUNG EO RIEULSIOS
+ {0x9E65, 0xC5C1}, //5193 #HANGUL SYLLABLE IEUNG EO RIEULTHIEUTH
+ {0x9E66, 0xC5C2}, //5194 #HANGUL SYLLABLE IEUNG EO RIEULPHIEUPH
+ {0x9E67, 0xC5C3}, //5195 #HANGUL SYLLABLE IEUNG EO RIEULHIEUH
+ {0x9E68, 0xC5CB}, //5196 #HANGUL SYLLABLE IEUNG EO CHIEUCH
+ {0x9E69, 0xC5CD}, //5197 #HANGUL SYLLABLE IEUNG EO THIEUTH
+ {0x9E6A, 0xC5CF}, //5198 #HANGUL SYLLABLE IEUNG EO HIEUH
+ {0x9E6B, 0xC5D2}, //5199 #HANGUL SYLLABLE IEUNG E SSANGKIYEOK
+ {0x9E6C, 0xC5D3}, //5200 #HANGUL SYLLABLE IEUNG E KIYEOKSIOS
+ {0x9E6D, 0xC5D5}, //5201 #HANGUL SYLLABLE IEUNG E NIEUNCIEUC
+ {0x9E6E, 0xC5D6}, //5202 #HANGUL SYLLABLE IEUNG E NIEUNHIEUH
+ {0x9E6F, 0xC5D7}, //5203 #HANGUL SYLLABLE IEUNG E TIKEUT
+ {0x9E70, 0xC5D9}, //5204 #HANGUL SYLLABLE IEUNG E RIEULKIYEOK
+ {0x9E71, 0xC5DA}, //5205 #HANGUL SYLLABLE IEUNG E RIEULMIEUM
+ {0x9E72, 0xC5DB}, //5206 #HANGUL SYLLABLE IEUNG E RIEULPIEUP
+ {0x9E73, 0xC5DC}, //5207 #HANGUL SYLLABLE IEUNG E RIEULSIOS
+ {0x9E74, 0xC5DD}, //5208 #HANGUL SYLLABLE IEUNG E RIEULTHIEUTH
+ {0x9E75, 0xC5DE}, //5209 #HANGUL SYLLABLE IEUNG E RIEULPHIEUPH
+ {0x9E76, 0xC5DF}, //5210 #HANGUL SYLLABLE IEUNG E RIEULHIEUH
+ {0x9E77, 0xC5E2}, //5211 #HANGUL SYLLABLE IEUNG E PIEUPSIOS
+ {0x9E78, 0xC5E4}, //5212 #HANGUL SYLLABLE IEUNG E SSANGSIOS
+ {0x9E79, 0xC5E6}, //5213 #HANGUL SYLLABLE IEUNG E CIEUC
+ {0x9E7A, 0xC5E7}, //5214 #HANGUL SYLLABLE IEUNG E CHIEUCH
+ {0x9E81, 0xC5E8}, //5215 #HANGUL SYLLABLE IEUNG E KHIEUKH
+ {0x9E82, 0xC5E9}, //5216 #HANGUL SYLLABLE IEUNG E THIEUTH
+ {0x9E83, 0xC5EA}, //5217 #HANGUL SYLLABLE IEUNG E PHIEUPH
+ {0x9E84, 0xC5EB}, //5218 #HANGUL SYLLABLE IEUNG E HIEUH
+ {0x9E85, 0xC5EF}, //5219 #HANGUL SYLLABLE IEUNG YEO KIYEOKSIOS
+ {0x9E86, 0xC5F1}, //5220 #HANGUL SYLLABLE IEUNG YEO NIEUNCIEUC
+ {0x9E87, 0xC5F2}, //5221 #HANGUL SYLLABLE IEUNG YEO NIEUNHIEUH
+ {0x9E88, 0xC5F3}, //5222 #HANGUL SYLLABLE IEUNG YEO TIKEUT
+ {0x9E89, 0xC5F5}, //5223 #HANGUL SYLLABLE IEUNG YEO RIEULKIYEOK
+ {0x9E8A, 0xC5F8}, //5224 #HANGUL SYLLABLE IEUNG YEO RIEULSIOS
+ {0x9E8B, 0xC5F9}, //5225 #HANGUL SYLLABLE IEUNG YEO RIEULTHIEUTH
+ {0x9E8C, 0xC5FA}, //5226 #HANGUL SYLLABLE IEUNG YEO RIEULPHIEUPH
+ {0x9E8D, 0xC5FB}, //5227 #HANGUL SYLLABLE IEUNG YEO RIEULHIEUH
+ {0x9E8E, 0xC602}, //5228 #HANGUL SYLLABLE IEUNG YEO CIEUC
+ {0x9E8F, 0xC603}, //5229 #HANGUL SYLLABLE IEUNG YEO CHIEUCH
+ {0x9E90, 0xC604}, //5230 #HANGUL SYLLABLE IEUNG YEO KHIEUKH
+ {0x9E91, 0xC609}, //5231 #HANGUL SYLLABLE IEUNG YE KIYEOK
+ {0x9E92, 0xC60A}, //5232 #HANGUL SYLLABLE IEUNG YE SSANGKIYEOK
+ {0x9E93, 0xC60B}, //5233 #HANGUL SYLLABLE IEUNG YE KIYEOKSIOS
+ {0x9E94, 0xC60D}, //5234 #HANGUL SYLLABLE IEUNG YE NIEUNCIEUC
+ {0x9E95, 0xC60E}, //5235 #HANGUL SYLLABLE IEUNG YE NIEUNHIEUH
+ {0x9E96, 0xC60F}, //5236 #HANGUL SYLLABLE IEUNG YE TIKEUT
+ {0x9E97, 0xC611}, //5237 #HANGUL SYLLABLE IEUNG YE RIEULKIYEOK
+ {0x9E98, 0xC612}, //5238 #HANGUL SYLLABLE IEUNG YE RIEULMIEUM
+ {0x9E99, 0xC613}, //5239 #HANGUL SYLLABLE IEUNG YE RIEULPIEUP
+ {0x9E9A, 0xC614}, //5240 #HANGUL SYLLABLE IEUNG YE RIEULSIOS
+ {0x9E9B, 0xC615}, //5241 #HANGUL SYLLABLE IEUNG YE RIEULTHIEUTH
+ {0x9E9C, 0xC616}, //5242 #HANGUL SYLLABLE IEUNG YE RIEULPHIEUPH
+ {0x9E9D, 0xC617}, //5243 #HANGUL SYLLABLE IEUNG YE RIEULHIEUH
+ {0x9E9E, 0xC61A}, //5244 #HANGUL SYLLABLE IEUNG YE PIEUPSIOS
+ {0x9E9F, 0xC61D}, //5245 #HANGUL SYLLABLE IEUNG YE IEUNG
+ {0x9EA0, 0xC61E}, //5246 #HANGUL SYLLABLE IEUNG YE CIEUC
+ {0x9EA1, 0xC61F}, //5247 #HANGUL SYLLABLE IEUNG YE CHIEUCH
+ {0x9EA2, 0xC620}, //5248 #HANGUL SYLLABLE IEUNG YE KHIEUKH
+ {0x9EA3, 0xC621}, //5249 #HANGUL SYLLABLE IEUNG YE THIEUTH
+ {0x9EA4, 0xC622}, //5250 #HANGUL SYLLABLE IEUNG YE PHIEUPH
+ {0x9EA5, 0xC623}, //5251 #HANGUL SYLLABLE IEUNG YE HIEUH
+ {0x9EA6, 0xC626}, //5252 #HANGUL SYLLABLE IEUNG O SSANGKIYEOK
+ {0x9EA7, 0xC627}, //5253 #HANGUL SYLLABLE IEUNG O KIYEOKSIOS
+ {0x9EA8, 0xC629}, //5254 #HANGUL SYLLABLE IEUNG O NIEUNCIEUC
+ {0x9EA9, 0xC62A}, //5255 #HANGUL SYLLABLE IEUNG O NIEUNHIEUH
+ {0x9EAA, 0xC62B}, //5256 #HANGUL SYLLABLE IEUNG O TIKEUT
+ {0x9EAB, 0xC62F}, //5257 #HANGUL SYLLABLE IEUNG O RIEULPIEUP
+ {0x9EAC, 0xC631}, //5258 #HANGUL SYLLABLE IEUNG O RIEULTHIEUTH
+ {0x9EAD, 0xC632}, //5259 #HANGUL SYLLABLE IEUNG O RIEULPHIEUPH
+ {0x9EAE, 0xC636}, //5260 #HANGUL SYLLABLE IEUNG O PIEUPSIOS
+ {0x9EAF, 0xC638}, //5261 #HANGUL SYLLABLE IEUNG O SSANGSIOS
+ {0x9EB0, 0xC63A}, //5262 #HANGUL SYLLABLE IEUNG O CIEUC
+ {0x9EB1, 0xC63C}, //5263 #HANGUL SYLLABLE IEUNG O KHIEUKH
+ {0x9EB2, 0xC63D}, //5264 #HANGUL SYLLABLE IEUNG O THIEUTH
+ {0x9EB3, 0xC63E}, //5265 #HANGUL SYLLABLE IEUNG O PHIEUPH
+ {0x9EB4, 0xC63F}, //5266 #HANGUL SYLLABLE IEUNG O HIEUH
+ {0x9EB5, 0xC642}, //5267 #HANGUL SYLLABLE IEUNG WA SSANGKIYEOK
+ {0x9EB6, 0xC643}, //5268 #HANGUL SYLLABLE IEUNG WA KIYEOKSIOS
+ {0x9EB7, 0xC645}, //5269 #HANGUL SYLLABLE IEUNG WA NIEUNCIEUC
+ {0x9EB8, 0xC646}, //5270 #HANGUL SYLLABLE IEUNG WA NIEUNHIEUH
+ {0x9EB9, 0xC647}, //5271 #HANGUL SYLLABLE IEUNG WA TIKEUT
+ {0x9EBA, 0xC649}, //5272 #HANGUL SYLLABLE IEUNG WA RIEULKIYEOK
+ {0x9EBB, 0xC64A}, //5273 #HANGUL SYLLABLE IEUNG WA RIEULMIEUM
+ {0x9EBC, 0xC64B}, //5274 #HANGUL SYLLABLE IEUNG WA RIEULPIEUP
+ {0x9EBD, 0xC64C}, //5275 #HANGUL SYLLABLE IEUNG WA RIEULSIOS
+ {0x9EBE, 0xC64D}, //5276 #HANGUL SYLLABLE IEUNG WA RIEULTHIEUTH
+ {0x9EBF, 0xC64E}, //5277 #HANGUL SYLLABLE IEUNG WA RIEULPHIEUPH
+ {0x9EC0, 0xC64F}, //5278 #HANGUL SYLLABLE IEUNG WA RIEULHIEUH
+ {0x9EC1, 0xC652}, //5279 #HANGUL SYLLABLE IEUNG WA PIEUPSIOS
+ {0x9EC2, 0xC656}, //5280 #HANGUL SYLLABLE IEUNG WA CIEUC
+ {0x9EC3, 0xC657}, //5281 #HANGUL SYLLABLE IEUNG WA CHIEUCH
+ {0x9EC4, 0xC658}, //5282 #HANGUL SYLLABLE IEUNG WA KHIEUKH
+ {0x9EC5, 0xC659}, //5283 #HANGUL SYLLABLE IEUNG WA THIEUTH
+ {0x9EC6, 0xC65A}, //5284 #HANGUL SYLLABLE IEUNG WA PHIEUPH
+ {0x9EC7, 0xC65B}, //5285 #HANGUL SYLLABLE IEUNG WA HIEUH
+ {0x9EC8, 0xC65E}, //5286 #HANGUL SYLLABLE IEUNG WAE SSANGKIYEOK
+ {0x9EC9, 0xC65F}, //5287 #HANGUL SYLLABLE IEUNG WAE KIYEOKSIOS
+ {0x9ECA, 0xC661}, //5288 #HANGUL SYLLABLE IEUNG WAE NIEUNCIEUC
+ {0x9ECB, 0xC662}, //5289 #HANGUL SYLLABLE IEUNG WAE NIEUNHIEUH
+ {0x9ECC, 0xC663}, //5290 #HANGUL SYLLABLE IEUNG WAE TIKEUT
+ {0x9ECD, 0xC664}, //5291 #HANGUL SYLLABLE IEUNG WAE RIEUL
+ {0x9ECE, 0xC665}, //5292 #HANGUL SYLLABLE IEUNG WAE RIEULKIYEOK
+ {0x9ECF, 0xC666}, //5293 #HANGUL SYLLABLE IEUNG WAE RIEULMIEUM
+ {0x9ED0, 0xC667}, //5294 #HANGUL SYLLABLE IEUNG WAE RIEULPIEUP
+ {0x9ED1, 0xC668}, //5295 #HANGUL SYLLABLE IEUNG WAE RIEULSIOS
+ {0x9ED2, 0xC669}, //5296 #HANGUL SYLLABLE IEUNG WAE RIEULTHIEUTH
+ {0x9ED3, 0xC66A}, //5297 #HANGUL SYLLABLE IEUNG WAE RIEULPHIEUPH
+ {0x9ED4, 0xC66B}, //5298 #HANGUL SYLLABLE IEUNG WAE RIEULHIEUH
+ {0x9ED5, 0xC66D}, //5299 #HANGUL SYLLABLE IEUNG WAE PIEUP
+ {0x9ED6, 0xC66E}, //5300 #HANGUL SYLLABLE IEUNG WAE PIEUPSIOS
+ {0x9ED7, 0xC670}, //5301 #HANGUL SYLLABLE IEUNG WAE SSANGSIOS
+ {0x9ED8, 0xC672}, //5302 #HANGUL SYLLABLE IEUNG WAE CIEUC
+ {0x9ED9, 0xC673}, //5303 #HANGUL SYLLABLE IEUNG WAE CHIEUCH
+ {0x9EDA, 0xC674}, //5304 #HANGUL SYLLABLE IEUNG WAE KHIEUKH
+ {0x9EDB, 0xC675}, //5305 #HANGUL SYLLABLE IEUNG WAE THIEUTH
+ {0x9EDC, 0xC676}, //5306 #HANGUL SYLLABLE IEUNG WAE PHIEUPH
+ {0x9EDD, 0xC677}, //5307 #HANGUL SYLLABLE IEUNG WAE HIEUH
+ {0x9EDE, 0xC67A}, //5308 #HANGUL SYLLABLE IEUNG OE SSANGKIYEOK
+ {0x9EDF, 0xC67B}, //5309 #HANGUL SYLLABLE IEUNG OE KIYEOKSIOS
+ {0x9EE0, 0xC67D}, //5310 #HANGUL SYLLABLE IEUNG OE NIEUNCIEUC
+ {0x9EE1, 0xC67E}, //5311 #HANGUL SYLLABLE IEUNG OE NIEUNHIEUH
+ {0x9EE2, 0xC67F}, //5312 #HANGUL SYLLABLE IEUNG OE TIKEUT
+ {0x9EE3, 0xC681}, //5313 #HANGUL SYLLABLE IEUNG OE RIEULKIYEOK
+ {0x9EE4, 0xC682}, //5314 #HANGUL SYLLABLE IEUNG OE RIEULMIEUM
+ {0x9EE5, 0xC683}, //5315 #HANGUL SYLLABLE IEUNG OE RIEULPIEUP
+ {0x9EE6, 0xC684}, //5316 #HANGUL SYLLABLE IEUNG OE RIEULSIOS
+ {0x9EE7, 0xC685}, //5317 #HANGUL SYLLABLE IEUNG OE RIEULTHIEUTH
+ {0x9EE8, 0xC686}, //5318 #HANGUL SYLLABLE IEUNG OE RIEULPHIEUPH
+ {0x9EE9, 0xC687}, //5319 #HANGUL SYLLABLE IEUNG OE RIEULHIEUH
+ {0x9EEA, 0xC68A}, //5320 #HANGUL SYLLABLE IEUNG OE PIEUPSIOS
+ {0x9EEB, 0xC68C}, //5321 #HANGUL SYLLABLE IEUNG OE SSANGSIOS
+ {0x9EEC, 0xC68E}, //5322 #HANGUL SYLLABLE IEUNG OE CIEUC
+ {0x9EED, 0xC68F}, //5323 #HANGUL SYLLABLE IEUNG OE CHIEUCH
+ {0x9EEE, 0xC690}, //5324 #HANGUL SYLLABLE IEUNG OE KHIEUKH
+ {0x9EEF, 0xC691}, //5325 #HANGUL SYLLABLE IEUNG OE THIEUTH
+ {0x9EF0, 0xC692}, //5326 #HANGUL SYLLABLE IEUNG OE PHIEUPH
+ {0x9EF1, 0xC693}, //5327 #HANGUL SYLLABLE IEUNG OE HIEUH
+ {0x9EF2, 0xC696}, //5328 #HANGUL SYLLABLE IEUNG YO SSANGKIYEOK
+ {0x9EF3, 0xC697}, //5329 #HANGUL SYLLABLE IEUNG YO KIYEOKSIOS
+ {0x9EF4, 0xC699}, //5330 #HANGUL SYLLABLE IEUNG YO NIEUNCIEUC
+ {0x9EF5, 0xC69A}, //5331 #HANGUL SYLLABLE IEUNG YO NIEUNHIEUH
+ {0x9EF6, 0xC69B}, //5332 #HANGUL SYLLABLE IEUNG YO TIKEUT
+ {0x9EF7, 0xC69D}, //5333 #HANGUL SYLLABLE IEUNG YO RIEULKIYEOK
+ {0x9EF8, 0xC69E}, //5334 #HANGUL SYLLABLE IEUNG YO RIEULMIEUM
+ {0x9EF9, 0xC69F}, //5335 #HANGUL SYLLABLE IEUNG YO RIEULPIEUP
+ {0x9EFA, 0xC6A0}, //5336 #HANGUL SYLLABLE IEUNG YO RIEULSIOS
+ {0x9EFB, 0xC6A1}, //5337 #HANGUL SYLLABLE IEUNG YO RIEULTHIEUTH
+ {0x9EFC, 0xC6A2}, //5338 #HANGUL SYLLABLE IEUNG YO RIEULPHIEUPH
+ {0x9EFD, 0xC6A3}, //5339 #HANGUL SYLLABLE IEUNG YO RIEULHIEUH
+ {0x9EFE, 0xC6A6}, //5340 #HANGUL SYLLABLE IEUNG YO PIEUPSIOS
+ {0x9F41, 0xC6A8}, //5341 #HANGUL SYLLABLE IEUNG YO SSANGSIOS
+ {0x9F42, 0xC6AA}, //5342 #HANGUL SYLLABLE IEUNG YO CIEUC
+ {0x9F43, 0xC6AB}, //5343 #HANGUL SYLLABLE IEUNG YO CHIEUCH
+ {0x9F44, 0xC6AC}, //5344 #HANGUL SYLLABLE IEUNG YO KHIEUKH
+ {0x9F45, 0xC6AD}, //5345 #HANGUL SYLLABLE IEUNG YO THIEUTH
+ {0x9F46, 0xC6AE}, //5346 #HANGUL SYLLABLE IEUNG YO PHIEUPH
+ {0x9F47, 0xC6AF}, //5347 #HANGUL SYLLABLE IEUNG YO HIEUH
+ {0x9F48, 0xC6B2}, //5348 #HANGUL SYLLABLE IEUNG U SSANGKIYEOK
+ {0x9F49, 0xC6B3}, //5349 #HANGUL SYLLABLE IEUNG U KIYEOKSIOS
+ {0x9F4A, 0xC6B5}, //5350 #HANGUL SYLLABLE IEUNG U NIEUNCIEUC
+ {0x9F4B, 0xC6B6}, //5351 #HANGUL SYLLABLE IEUNG U NIEUNHIEUH
+ {0x9F4C, 0xC6B7}, //5352 #HANGUL SYLLABLE IEUNG U TIKEUT
+ {0x9F4D, 0xC6BB}, //5353 #HANGUL SYLLABLE IEUNG U RIEULPIEUP
+ {0x9F4E, 0xC6BC}, //5354 #HANGUL SYLLABLE IEUNG U RIEULSIOS
+ {0x9F4F, 0xC6BD}, //5355 #HANGUL SYLLABLE IEUNG U RIEULTHIEUTH
+ {0x9F50, 0xC6BE}, //5356 #HANGUL SYLLABLE IEUNG U RIEULPHIEUPH
+ {0x9F51, 0xC6BF}, //5357 #HANGUL SYLLABLE IEUNG U RIEULHIEUH
+ {0x9F52, 0xC6C2}, //5358 #HANGUL SYLLABLE IEUNG U PIEUPSIOS
+ {0x9F53, 0xC6C4}, //5359 #HANGUL SYLLABLE IEUNG U SSANGSIOS
+ {0x9F54, 0xC6C6}, //5360 #HANGUL SYLLABLE IEUNG U CIEUC
+ {0x9F55, 0xC6C7}, //5361 #HANGUL SYLLABLE IEUNG U CHIEUCH
+ {0x9F56, 0xC6C8}, //5362 #HANGUL SYLLABLE IEUNG U KHIEUKH
+ {0x9F57, 0xC6C9}, //5363 #HANGUL SYLLABLE IEUNG U THIEUTH
+ {0x9F58, 0xC6CA}, //5364 #HANGUL SYLLABLE IEUNG U PHIEUPH
+ {0x9F59, 0xC6CB}, //5365 #HANGUL SYLLABLE IEUNG U HIEUH
+ {0x9F5A, 0xC6CE}, //5366 #HANGUL SYLLABLE IEUNG WEO SSANGKIYEOK
+ {0x9F61, 0xC6CF}, //5367 #HANGUL SYLLABLE IEUNG WEO KIYEOKSIOS
+ {0x9F62, 0xC6D1}, //5368 #HANGUL SYLLABLE IEUNG WEO NIEUNCIEUC
+ {0x9F63, 0xC6D2}, //5369 #HANGUL SYLLABLE IEUNG WEO NIEUNHIEUH
+ {0x9F64, 0xC6D3}, //5370 #HANGUL SYLLABLE IEUNG WEO TIKEUT
+ {0x9F65, 0xC6D5}, //5371 #HANGUL SYLLABLE IEUNG WEO RIEULKIYEOK
+ {0x9F66, 0xC6D6}, //5372 #HANGUL SYLLABLE IEUNG WEO RIEULMIEUM
+ {0x9F67, 0xC6D7}, //5373 #HANGUL SYLLABLE IEUNG WEO RIEULPIEUP
+ {0x9F68, 0xC6D8}, //5374 #HANGUL SYLLABLE IEUNG WEO RIEULSIOS
+ {0x9F69, 0xC6D9}, //5375 #HANGUL SYLLABLE IEUNG WEO RIEULTHIEUTH
+ {0x9F6A, 0xC6DA}, //5376 #HANGUL SYLLABLE IEUNG WEO RIEULPHIEUPH
+ {0x9F6B, 0xC6DB}, //5377 #HANGUL SYLLABLE IEUNG WEO RIEULHIEUH
+ {0x9F6C, 0xC6DE}, //5378 #HANGUL SYLLABLE IEUNG WEO PIEUPSIOS
+ {0x9F6D, 0xC6DF}, //5379 #HANGUL SYLLABLE IEUNG WEO SIOS
+ {0x9F6E, 0xC6E2}, //5380 #HANGUL SYLLABLE IEUNG WEO CIEUC
+ {0x9F6F, 0xC6E3}, //5381 #HANGUL SYLLABLE IEUNG WEO CHIEUCH
+ {0x9F70, 0xC6E4}, //5382 #HANGUL SYLLABLE IEUNG WEO KHIEUKH
+ {0x9F71, 0xC6E5}, //5383 #HANGUL SYLLABLE IEUNG WEO THIEUTH
+ {0x9F72, 0xC6E6}, //5384 #HANGUL SYLLABLE IEUNG WEO PHIEUPH
+ {0x9F73, 0xC6E7}, //5385 #HANGUL SYLLABLE IEUNG WEO HIEUH
+ {0x9F74, 0xC6EA}, //5386 #HANGUL SYLLABLE IEUNG WE SSANGKIYEOK
+ {0x9F75, 0xC6EB}, //5387 #HANGUL SYLLABLE IEUNG WE KIYEOKSIOS
+ {0x9F76, 0xC6ED}, //5388 #HANGUL SYLLABLE IEUNG WE NIEUNCIEUC
+ {0x9F77, 0xC6EE}, //5389 #HANGUL SYLLABLE IEUNG WE NIEUNHIEUH
+ {0x9F78, 0xC6EF}, //5390 #HANGUL SYLLABLE IEUNG WE TIKEUT
+ {0x9F79, 0xC6F1}, //5391 #HANGUL SYLLABLE IEUNG WE RIEULKIYEOK
+ {0x9F7A, 0xC6F2}, //5392 #HANGUL SYLLABLE IEUNG WE RIEULMIEUM
+ {0x9F81, 0xC6F3}, //5393 #HANGUL SYLLABLE IEUNG WE RIEULPIEUP
+ {0x9F82, 0xC6F4}, //5394 #HANGUL SYLLABLE IEUNG WE RIEULSIOS
+ {0x9F83, 0xC6F5}, //5395 #HANGUL SYLLABLE IEUNG WE RIEULTHIEUTH
+ {0x9F84, 0xC6F6}, //5396 #HANGUL SYLLABLE IEUNG WE RIEULPHIEUPH
+ {0x9F85, 0xC6F7}, //5397 #HANGUL SYLLABLE IEUNG WE RIEULHIEUH
+ {0x9F86, 0xC6FA}, //5398 #HANGUL SYLLABLE IEUNG WE PIEUPSIOS
+ {0x9F87, 0xC6FB}, //5399 #HANGUL SYLLABLE IEUNG WE SIOS
+ {0x9F88, 0xC6FC}, //5400 #HANGUL SYLLABLE IEUNG WE SSANGSIOS
+ {0x9F89, 0xC6FE}, //5401 #HANGUL SYLLABLE IEUNG WE CIEUC
+ {0x9F8A, 0xC6FF}, //5402 #HANGUL SYLLABLE IEUNG WE CHIEUCH
+ {0x9F8B, 0xC700}, //5403 #HANGUL SYLLABLE IEUNG WE KHIEUKH
+ {0x9F8C, 0xC701}, //5404 #HANGUL SYLLABLE IEUNG WE THIEUTH
+ {0x9F8D, 0xC702}, //5405 #HANGUL SYLLABLE IEUNG WE PHIEUPH
+ {0x9F8E, 0xC703}, //5406 #HANGUL SYLLABLE IEUNG WE HIEUH
+ {0x9F8F, 0xC706}, //5407 #HANGUL SYLLABLE IEUNG WI SSANGKIYEOK
+ {0x9F90, 0xC707}, //5408 #HANGUL SYLLABLE IEUNG WI KIYEOKSIOS
+ {0x9F91, 0xC709}, //5409 #HANGUL SYLLABLE IEUNG WI NIEUNCIEUC
+ {0x9F92, 0xC70A}, //5410 #HANGUL SYLLABLE IEUNG WI NIEUNHIEUH
+ {0x9F93, 0xC70B}, //5411 #HANGUL SYLLABLE IEUNG WI TIKEUT
+ {0x9F94, 0xC70D}, //5412 #HANGUL SYLLABLE IEUNG WI RIEULKIYEOK
+ {0x9F95, 0xC70E}, //5413 #HANGUL SYLLABLE IEUNG WI RIEULMIEUM
+ {0x9F96, 0xC70F}, //5414 #HANGUL SYLLABLE IEUNG WI RIEULPIEUP
+ {0x9F97, 0xC710}, //5415 #HANGUL SYLLABLE IEUNG WI RIEULSIOS
+ {0x9F98, 0xC711}, //5416 #HANGUL SYLLABLE IEUNG WI RIEULTHIEUTH
+ {0x9F99, 0xC712}, //5417 #HANGUL SYLLABLE IEUNG WI RIEULPHIEUPH
+ {0x9F9A, 0xC713}, //5418 #HANGUL SYLLABLE IEUNG WI RIEULHIEUH
+ {0x9F9B, 0xC716}, //5419 #HANGUL SYLLABLE IEUNG WI PIEUPSIOS
+ {0x9F9C, 0xC718}, //5420 #HANGUL SYLLABLE IEUNG WI SSANGSIOS
+ {0x9F9D, 0xC71A}, //5421 #HANGUL SYLLABLE IEUNG WI CIEUC
+ {0x9F9E, 0xC71B}, //5422 #HANGUL SYLLABLE IEUNG WI CHIEUCH
+ {0x9F9F, 0xC71C}, //5423 #HANGUL SYLLABLE IEUNG WI KHIEUKH
+ {0x9FA0, 0xC71D}, //5424 #HANGUL SYLLABLE IEUNG WI THIEUTH
+ {0x9FA1, 0xC71E}, //5425 #HANGUL SYLLABLE IEUNG WI PHIEUPH
+ {0x9FA2, 0xC71F}, //5426 #HANGUL SYLLABLE IEUNG WI HIEUH
+ {0x9FA3, 0xC722}, //5427 #HANGUL SYLLABLE IEUNG YU SSANGKIYEOK
+ {0x9FA4, 0xC723}, //5428 #HANGUL SYLLABLE IEUNG YU KIYEOKSIOS
+ {0x9FA5, 0xC725}, //5429 #HANGUL SYLLABLE IEUNG YU NIEUNCIEUC
+ {0x9FA6, 0xC726}, //5430 #HANGUL SYLLABLE IEUNG YU NIEUNHIEUH
+ {0x9FA7, 0xC727}, //5431 #HANGUL SYLLABLE IEUNG YU TIKEUT
+ {0x9FA8, 0xC729}, //5432 #HANGUL SYLLABLE IEUNG YU RIEULKIYEOK
+ {0x9FA9, 0xC72A}, //5433 #HANGUL SYLLABLE IEUNG YU RIEULMIEUM
+ {0x9FAA, 0xC72B}, //5434 #HANGUL SYLLABLE IEUNG YU RIEULPIEUP
+ {0x9FAB, 0xC72C}, //5435 #HANGUL SYLLABLE IEUNG YU RIEULSIOS
+ {0x9FAC, 0xC72D}, //5436 #HANGUL SYLLABLE IEUNG YU RIEULTHIEUTH
+ {0x9FAD, 0xC72E}, //5437 #HANGUL SYLLABLE IEUNG YU RIEULPHIEUPH
+ {0x9FAE, 0xC72F}, //5438 #HANGUL SYLLABLE IEUNG YU RIEULHIEUH
+ {0x9FAF, 0xC732}, //5439 #HANGUL SYLLABLE IEUNG YU PIEUPSIOS
+ {0x9FB0, 0xC734}, //5440 #HANGUL SYLLABLE IEUNG YU SSANGSIOS
+ {0x9FB1, 0xC736}, //5441 #HANGUL SYLLABLE IEUNG YU CIEUC
+ {0x9FB2, 0xC738}, //5442 #HANGUL SYLLABLE IEUNG YU KHIEUKH
+ {0x9FB3, 0xC739}, //5443 #HANGUL SYLLABLE IEUNG YU THIEUTH
+ {0x9FB4, 0xC73A}, //5444 #HANGUL SYLLABLE IEUNG YU PHIEUPH
+ {0x9FB5, 0xC73B}, //5445 #HANGUL SYLLABLE IEUNG YU HIEUH
+ {0x9FB6, 0xC73E}, //5446 #HANGUL SYLLABLE IEUNG EU SSANGKIYEOK
+ {0x9FB7, 0xC73F}, //5447 #HANGUL SYLLABLE IEUNG EU KIYEOKSIOS
+ {0x9FB8, 0xC741}, //5448 #HANGUL SYLLABLE IEUNG EU NIEUNCIEUC
+ {0x9FB9, 0xC742}, //5449 #HANGUL SYLLABLE IEUNG EU NIEUNHIEUH
+ {0x9FBA, 0xC743}, //5450 #HANGUL SYLLABLE IEUNG EU TIKEUT
+ {0x9FBB, 0xC745}, //5451 #HANGUL SYLLABLE IEUNG EU RIEULKIYEOK
+ {0x9FBC, 0xC746}, //5452 #HANGUL SYLLABLE IEUNG EU RIEULMIEUM
+ {0x9FBD, 0xC747}, //5453 #HANGUL SYLLABLE IEUNG EU RIEULPIEUP
+ {0x9FBE, 0xC748}, //5454 #HANGUL SYLLABLE IEUNG EU RIEULSIOS
+ {0x9FBF, 0xC749}, //5455 #HANGUL SYLLABLE IEUNG EU RIEULTHIEUTH
+ {0x9FC0, 0xC74B}, //5456 #HANGUL SYLLABLE IEUNG EU RIEULHIEUH
+ {0x9FC1, 0xC74E}, //5457 #HANGUL SYLLABLE IEUNG EU PIEUPSIOS
+ {0x9FC2, 0xC750}, //5458 #HANGUL SYLLABLE IEUNG EU SSANGSIOS
+ {0x9FC3, 0xC759}, //5459 #HANGUL SYLLABLE IEUNG YI KIYEOK
+ {0x9FC4, 0xC75A}, //5460 #HANGUL SYLLABLE IEUNG YI SSANGKIYEOK
+ {0x9FC5, 0xC75B}, //5461 #HANGUL SYLLABLE IEUNG YI KIYEOKSIOS
+ {0x9FC6, 0xC75D}, //5462 #HANGUL SYLLABLE IEUNG YI NIEUNCIEUC
+ {0x9FC7, 0xC75E}, //5463 #HANGUL SYLLABLE IEUNG YI NIEUNHIEUH
+ {0x9FC8, 0xC75F}, //5464 #HANGUL SYLLABLE IEUNG YI TIKEUT
+ {0x9FC9, 0xC761}, //5465 #HANGUL SYLLABLE IEUNG YI RIEULKIYEOK
+ {0x9FCA, 0xC762}, //5466 #HANGUL SYLLABLE IEUNG YI RIEULMIEUM
+ {0x9FCB, 0xC763}, //5467 #HANGUL SYLLABLE IEUNG YI RIEULPIEUP
+ {0x9FCC, 0xC764}, //5468 #HANGUL SYLLABLE IEUNG YI RIEULSIOS
+ {0x9FCD, 0xC765}, //5469 #HANGUL SYLLABLE IEUNG YI RIEULTHIEUTH
+ {0x9FCE, 0xC766}, //5470 #HANGUL SYLLABLE IEUNG YI RIEULPHIEUPH
+ {0x9FCF, 0xC767}, //5471 #HANGUL SYLLABLE IEUNG YI RIEULHIEUH
+ {0x9FD0, 0xC769}, //5472 #HANGUL SYLLABLE IEUNG YI PIEUP
+ {0x9FD1, 0xC76A}, //5473 #HANGUL SYLLABLE IEUNG YI PIEUPSIOS
+ {0x9FD2, 0xC76C}, //5474 #HANGUL SYLLABLE IEUNG YI SSANGSIOS
+ {0x9FD3, 0xC76D}, //5475 #HANGUL SYLLABLE IEUNG YI IEUNG
+ {0x9FD4, 0xC76E}, //5476 #HANGUL SYLLABLE IEUNG YI CIEUC
+ {0x9FD5, 0xC76F}, //5477 #HANGUL SYLLABLE IEUNG YI CHIEUCH
+ {0x9FD6, 0xC770}, //5478 #HANGUL SYLLABLE IEUNG YI KHIEUKH
+ {0x9FD7, 0xC771}, //5479 #HANGUL SYLLABLE IEUNG YI THIEUTH
+ {0x9FD8, 0xC772}, //5480 #HANGUL SYLLABLE IEUNG YI PHIEUPH
+ {0x9FD9, 0xC773}, //5481 #HANGUL SYLLABLE IEUNG YI HIEUH
+ {0x9FDA, 0xC776}, //5482 #HANGUL SYLLABLE IEUNG I SSANGKIYEOK
+ {0x9FDB, 0xC777}, //5483 #HANGUL SYLLABLE IEUNG I KIYEOKSIOS
+ {0x9FDC, 0xC779}, //5484 #HANGUL SYLLABLE IEUNG I NIEUNCIEUC
+ {0x9FDD, 0xC77A}, //5485 #HANGUL SYLLABLE IEUNG I NIEUNHIEUH
+ {0x9FDE, 0xC77B}, //5486 #HANGUL SYLLABLE IEUNG I TIKEUT
+ {0x9FDF, 0xC77F}, //5487 #HANGUL SYLLABLE IEUNG I RIEULPIEUP
+ {0x9FE0, 0xC780}, //5488 #HANGUL SYLLABLE IEUNG I RIEULSIOS
+ {0x9FE1, 0xC781}, //5489 #HANGUL SYLLABLE IEUNG I RIEULTHIEUTH
+ {0x9FE2, 0xC782}, //5490 #HANGUL SYLLABLE IEUNG I RIEULPHIEUPH
+ {0x9FE3, 0xC786}, //5491 #HANGUL SYLLABLE IEUNG I PIEUPSIOS
+ {0x9FE4, 0xC78B}, //5492 #HANGUL SYLLABLE IEUNG I CHIEUCH
+ {0x9FE5, 0xC78C}, //5493 #HANGUL SYLLABLE IEUNG I KHIEUKH
+ {0x9FE6, 0xC78D}, //5494 #HANGUL SYLLABLE IEUNG I THIEUTH
+ {0x9FE7, 0xC78F}, //5495 #HANGUL SYLLABLE IEUNG I HIEUH
+ {0x9FE8, 0xC792}, //5496 #HANGUL SYLLABLE CIEUC A SSANGKIYEOK
+ {0x9FE9, 0xC793}, //5497 #HANGUL SYLLABLE CIEUC A KIYEOKSIOS
+ {0x9FEA, 0xC795}, //5498 #HANGUL SYLLABLE CIEUC A NIEUNCIEUC
+ {0x9FEB, 0xC799}, //5499 #HANGUL SYLLABLE CIEUC A RIEULKIYEOK
+ {0x9FEC, 0xC79B}, //5500 #HANGUL SYLLABLE CIEUC A RIEULPIEUP
+ {0x9FED, 0xC79C}, //5501 #HANGUL SYLLABLE CIEUC A RIEULSIOS
+ {0x9FEE, 0xC79D}, //5502 #HANGUL SYLLABLE CIEUC A RIEULTHIEUTH
+ {0x9FEF, 0xC79E}, //5503 #HANGUL SYLLABLE CIEUC A RIEULPHIEUPH
+ {0x9FF0, 0xC79F}, //5504 #HANGUL SYLLABLE CIEUC A RIEULHIEUH
+ {0x9FF1, 0xC7A2}, //5505 #HANGUL SYLLABLE CIEUC A PIEUPSIOS
+ {0x9FF2, 0xC7A7}, //5506 #HANGUL SYLLABLE CIEUC A CHIEUCH
+ {0x9FF3, 0xC7A8}, //5507 #HANGUL SYLLABLE CIEUC A KHIEUKH
+ {0x9FF4, 0xC7A9}, //5508 #HANGUL SYLLABLE CIEUC A THIEUTH
+ {0x9FF5, 0xC7AA}, //5509 #HANGUL SYLLABLE CIEUC A PHIEUPH
+ {0x9FF6, 0xC7AB}, //5510 #HANGUL SYLLABLE CIEUC A HIEUH
+ {0x9FF7, 0xC7AE}, //5511 #HANGUL SYLLABLE CIEUC AE SSANGKIYEOK
+ {0x9FF8, 0xC7AF}, //5512 #HANGUL SYLLABLE CIEUC AE KIYEOKSIOS
+ {0x9FF9, 0xC7B1}, //5513 #HANGUL SYLLABLE CIEUC AE NIEUNCIEUC
+ {0x9FFA, 0xC7B2}, //5514 #HANGUL SYLLABLE CIEUC AE NIEUNHIEUH
+ {0x9FFB, 0xC7B3}, //5515 #HANGUL SYLLABLE CIEUC AE TIKEUT
+ {0x9FFC, 0xC7B5}, //5516 #HANGUL SYLLABLE CIEUC AE RIEULKIYEOK
+ {0x9FFD, 0xC7B6}, //5517 #HANGUL SYLLABLE CIEUC AE RIEULMIEUM
+ {0x9FFE, 0xC7B7}, //5518 #HANGUL SYLLABLE CIEUC AE RIEULPIEUP
+ {0xA041, 0xC7B8}, //5519 #HANGUL SYLLABLE CIEUC AE RIEULSIOS
+ {0xA042, 0xC7B9}, //5520 #HANGUL SYLLABLE CIEUC AE RIEULTHIEUTH
+ {0xA043, 0xC7BA}, //5521 #HANGUL SYLLABLE CIEUC AE RIEULPHIEUPH
+ {0xA044, 0xC7BB}, //5522 #HANGUL SYLLABLE CIEUC AE RIEULHIEUH
+ {0xA045, 0xC7BE}, //5523 #HANGUL SYLLABLE CIEUC AE PIEUPSIOS
+ {0xA046, 0xC7C2}, //5524 #HANGUL SYLLABLE CIEUC AE CIEUC
+ {0xA047, 0xC7C3}, //5525 #HANGUL SYLLABLE CIEUC AE CHIEUCH
+ {0xA048, 0xC7C4}, //5526 #HANGUL SYLLABLE CIEUC AE KHIEUKH
+ {0xA049, 0xC7C5}, //5527 #HANGUL SYLLABLE CIEUC AE THIEUTH
+ {0xA04A, 0xC7C6}, //5528 #HANGUL SYLLABLE CIEUC AE PHIEUPH
+ {0xA04B, 0xC7C7}, //5529 #HANGUL SYLLABLE CIEUC AE HIEUH
+ {0xA04C, 0xC7CA}, //5530 #HANGUL SYLLABLE CIEUC YA SSANGKIYEOK
+ {0xA04D, 0xC7CB}, //5531 #HANGUL SYLLABLE CIEUC YA KIYEOKSIOS
+ {0xA04E, 0xC7CD}, //5532 #HANGUL SYLLABLE CIEUC YA NIEUNCIEUC
+ {0xA04F, 0xC7CF}, //5533 #HANGUL SYLLABLE CIEUC YA TIKEUT
+ {0xA050, 0xC7D1}, //5534 #HANGUL SYLLABLE CIEUC YA RIEULKIYEOK
+ {0xA051, 0xC7D2}, //5535 #HANGUL SYLLABLE CIEUC YA RIEULMIEUM
+ {0xA052, 0xC7D3}, //5536 #HANGUL SYLLABLE CIEUC YA RIEULPIEUP
+ {0xA053, 0xC7D4}, //5537 #HANGUL SYLLABLE CIEUC YA RIEULSIOS
+ {0xA054, 0xC7D5}, //5538 #HANGUL SYLLABLE CIEUC YA RIEULTHIEUTH
+ {0xA055, 0xC7D6}, //5539 #HANGUL SYLLABLE CIEUC YA RIEULPHIEUPH
+ {0xA056, 0xC7D7}, //5540 #HANGUL SYLLABLE CIEUC YA RIEULHIEUH
+ {0xA057, 0xC7D9}, //5541 #HANGUL SYLLABLE CIEUC YA PIEUP
+ {0xA058, 0xC7DA}, //5542 #HANGUL SYLLABLE CIEUC YA PIEUPSIOS
+ {0xA059, 0xC7DB}, //5543 #HANGUL SYLLABLE CIEUC YA SIOS
+ {0xA05A, 0xC7DC}, //5544 #HANGUL SYLLABLE CIEUC YA SSANGSIOS
+ {0xA061, 0xC7DE}, //5545 #HANGUL SYLLABLE CIEUC YA CIEUC
+ {0xA062, 0xC7DF}, //5546 #HANGUL SYLLABLE CIEUC YA CHIEUCH
+ {0xA063, 0xC7E0}, //5547 #HANGUL SYLLABLE CIEUC YA KHIEUKH
+ {0xA064, 0xC7E1}, //5548 #HANGUL SYLLABLE CIEUC YA THIEUTH
+ {0xA065, 0xC7E2}, //5549 #HANGUL SYLLABLE CIEUC YA PHIEUPH
+ {0xA066, 0xC7E3}, //5550 #HANGUL SYLLABLE CIEUC YA HIEUH
+ {0xA067, 0xC7E5}, //5551 #HANGUL SYLLABLE CIEUC YAE KIYEOK
+ {0xA068, 0xC7E6}, //5552 #HANGUL SYLLABLE CIEUC YAE SSANGKIYEOK
+ {0xA069, 0xC7E7}, //5553 #HANGUL SYLLABLE CIEUC YAE KIYEOKSIOS
+ {0xA06A, 0xC7E9}, //5554 #HANGUL SYLLABLE CIEUC YAE NIEUNCIEUC
+ {0xA06B, 0xC7EA}, //5555 #HANGUL SYLLABLE CIEUC YAE NIEUNHIEUH
+ {0xA06C, 0xC7EB}, //5556 #HANGUL SYLLABLE CIEUC YAE TIKEUT
+ {0xA06D, 0xC7ED}, //5557 #HANGUL SYLLABLE CIEUC YAE RIEULKIYEOK
+ {0xA06E, 0xC7EE}, //5558 #HANGUL SYLLABLE CIEUC YAE RIEULMIEUM
+ {0xA06F, 0xC7EF}, //5559 #HANGUL SYLLABLE CIEUC YAE RIEULPIEUP
+ {0xA070, 0xC7F0}, //5560 #HANGUL SYLLABLE CIEUC YAE RIEULSIOS
+ {0xA071, 0xC7F1}, //5561 #HANGUL SYLLABLE CIEUC YAE RIEULTHIEUTH
+ {0xA072, 0xC7F2}, //5562 #HANGUL SYLLABLE CIEUC YAE RIEULPHIEUPH
+ {0xA073, 0xC7F3}, //5563 #HANGUL SYLLABLE CIEUC YAE RIEULHIEUH
+ {0xA074, 0xC7F4}, //5564 #HANGUL SYLLABLE CIEUC YAE MIEUM
+ {0xA075, 0xC7F5}, //5565 #HANGUL SYLLABLE CIEUC YAE PIEUP
+ {0xA076, 0xC7F6}, //5566 #HANGUL SYLLABLE CIEUC YAE PIEUPSIOS
+ {0xA077, 0xC7F7}, //5567 #HANGUL SYLLABLE CIEUC YAE SIOS
+ {0xA078, 0xC7F8}, //5568 #HANGUL SYLLABLE CIEUC YAE SSANGSIOS
+ {0xA079, 0xC7F9}, //5569 #HANGUL SYLLABLE CIEUC YAE IEUNG
+ {0xA07A, 0xC7FA}, //5570 #HANGUL SYLLABLE CIEUC YAE CIEUC
+ {0xA081, 0xC7FB}, //5571 #HANGUL SYLLABLE CIEUC YAE CHIEUCH
+ {0xA082, 0xC7FC}, //5572 #HANGUL SYLLABLE CIEUC YAE KHIEUKH
+ {0xA083, 0xC7FD}, //5573 #HANGUL SYLLABLE CIEUC YAE THIEUTH
+ {0xA084, 0xC7FE}, //5574 #HANGUL SYLLABLE CIEUC YAE PHIEUPH
+ {0xA085, 0xC7FF}, //5575 #HANGUL SYLLABLE CIEUC YAE HIEUH
+ {0xA086, 0xC802}, //5576 #HANGUL SYLLABLE CIEUC EO SSANGKIYEOK
+ {0xA087, 0xC803}, //5577 #HANGUL SYLLABLE CIEUC EO KIYEOKSIOS
+ {0xA088, 0xC805}, //5578 #HANGUL SYLLABLE CIEUC EO NIEUNCIEUC
+ {0xA089, 0xC806}, //5579 #HANGUL SYLLABLE CIEUC EO NIEUNHIEUH
+ {0xA08A, 0xC807}, //5580 #HANGUL SYLLABLE CIEUC EO TIKEUT
+ {0xA08B, 0xC809}, //5581 #HANGUL SYLLABLE CIEUC EO RIEULKIYEOK
+ {0xA08C, 0xC80B}, //5582 #HANGUL SYLLABLE CIEUC EO RIEULPIEUP
+ {0xA08D, 0xC80C}, //5583 #HANGUL SYLLABLE CIEUC EO RIEULSIOS
+ {0xA08E, 0xC80D}, //5584 #HANGUL SYLLABLE CIEUC EO RIEULTHIEUTH
+ {0xA08F, 0xC80E}, //5585 #HANGUL SYLLABLE CIEUC EO RIEULPHIEUPH
+ {0xA090, 0xC80F}, //5586 #HANGUL SYLLABLE CIEUC EO RIEULHIEUH
+ {0xA091, 0xC812}, //5587 #HANGUL SYLLABLE CIEUC EO PIEUPSIOS
+ {0xA092, 0xC814}, //5588 #HANGUL SYLLABLE CIEUC EO SSANGSIOS
+ {0xA093, 0xC817}, //5589 #HANGUL SYLLABLE CIEUC EO CHIEUCH
+ {0xA094, 0xC818}, //5590 #HANGUL SYLLABLE CIEUC EO KHIEUKH
+ {0xA095, 0xC819}, //5591 #HANGUL SYLLABLE CIEUC EO THIEUTH
+ {0xA096, 0xC81A}, //5592 #HANGUL SYLLABLE CIEUC EO PHIEUPH
+ {0xA097, 0xC81B}, //5593 #HANGUL SYLLABLE CIEUC EO HIEUH
+ {0xA098, 0xC81E}, //5594 #HANGUL SYLLABLE CIEUC E SSANGKIYEOK
+ {0xA099, 0xC81F}, //5595 #HANGUL SYLLABLE CIEUC E KIYEOKSIOS
+ {0xA09A, 0xC821}, //5596 #HANGUL SYLLABLE CIEUC E NIEUNCIEUC
+ {0xA09B, 0xC822}, //5597 #HANGUL SYLLABLE CIEUC E NIEUNHIEUH
+ {0xA09C, 0xC823}, //5598 #HANGUL SYLLABLE CIEUC E TIKEUT
+ {0xA09D, 0xC825}, //5599 #HANGUL SYLLABLE CIEUC E RIEULKIYEOK
+ {0xA09E, 0xC826}, //5600 #HANGUL SYLLABLE CIEUC E RIEULMIEUM
+ {0xA09F, 0xC827}, //5601 #HANGUL SYLLABLE CIEUC E RIEULPIEUP
+ {0xA0A0, 0xC828}, //5602 #HANGUL SYLLABLE CIEUC E RIEULSIOS
+ {0xA0A1, 0xC829}, //5603 #HANGUL SYLLABLE CIEUC E RIEULTHIEUTH
+ {0xA0A2, 0xC82A}, //5604 #HANGUL SYLLABLE CIEUC E RIEULPHIEUPH
+ {0xA0A3, 0xC82B}, //5605 #HANGUL SYLLABLE CIEUC E RIEULHIEUH
+ {0xA0A4, 0xC82E}, //5606 #HANGUL SYLLABLE CIEUC E PIEUPSIOS
+ {0xA0A5, 0xC830}, //5607 #HANGUL SYLLABLE CIEUC E SSANGSIOS
+ {0xA0A6, 0xC832}, //5608 #HANGUL SYLLABLE CIEUC E CIEUC
+ {0xA0A7, 0xC833}, //5609 #HANGUL SYLLABLE CIEUC E CHIEUCH
+ {0xA0A8, 0xC834}, //5610 #HANGUL SYLLABLE CIEUC E KHIEUKH
+ {0xA0A9, 0xC835}, //5611 #HANGUL SYLLABLE CIEUC E THIEUTH
+ {0xA0AA, 0xC836}, //5612 #HANGUL SYLLABLE CIEUC E PHIEUPH
+ {0xA0AB, 0xC837}, //5613 #HANGUL SYLLABLE CIEUC E HIEUH
+ {0xA0AC, 0xC839}, //5614 #HANGUL SYLLABLE CIEUC YEO KIYEOK
+ {0xA0AD, 0xC83A}, //5615 #HANGUL SYLLABLE CIEUC YEO SSANGKIYEOK
+ {0xA0AE, 0xC83B}, //5616 #HANGUL SYLLABLE CIEUC YEO KIYEOKSIOS
+ {0xA0AF, 0xC83D}, //5617 #HANGUL SYLLABLE CIEUC YEO NIEUNCIEUC
+ {0xA0B0, 0xC83E}, //5618 #HANGUL SYLLABLE CIEUC YEO NIEUNHIEUH
+ {0xA0B1, 0xC83F}, //5619 #HANGUL SYLLABLE CIEUC YEO TIKEUT
+ {0xA0B2, 0xC841}, //5620 #HANGUL SYLLABLE CIEUC YEO RIEULKIYEOK
+ {0xA0B3, 0xC842}, //5621 #HANGUL SYLLABLE CIEUC YEO RIEULMIEUM
+ {0xA0B4, 0xC843}, //5622 #HANGUL SYLLABLE CIEUC YEO RIEULPIEUP
+ {0xA0B5, 0xC844}, //5623 #HANGUL SYLLABLE CIEUC YEO RIEULSIOS
+ {0xA0B6, 0xC845}, //5624 #HANGUL SYLLABLE CIEUC YEO RIEULTHIEUTH
+ {0xA0B7, 0xC846}, //5625 #HANGUL SYLLABLE CIEUC YEO RIEULPHIEUPH
+ {0xA0B8, 0xC847}, //5626 #HANGUL SYLLABLE CIEUC YEO RIEULHIEUH
+ {0xA0B9, 0xC84A}, //5627 #HANGUL SYLLABLE CIEUC YEO PIEUPSIOS
+ {0xA0BA, 0xC84B}, //5628 #HANGUL SYLLABLE CIEUC YEO SIOS
+ {0xA0BB, 0xC84E}, //5629 #HANGUL SYLLABLE CIEUC YEO CIEUC
+ {0xA0BC, 0xC84F}, //5630 #HANGUL SYLLABLE CIEUC YEO CHIEUCH
+ {0xA0BD, 0xC850}, //5631 #HANGUL SYLLABLE CIEUC YEO KHIEUKH
+ {0xA0BE, 0xC851}, //5632 #HANGUL SYLLABLE CIEUC YEO THIEUTH
+ {0xA0BF, 0xC852}, //5633 #HANGUL SYLLABLE CIEUC YEO PHIEUPH
+ {0xA0C0, 0xC853}, //5634 #HANGUL SYLLABLE CIEUC YEO HIEUH
+ {0xA0C1, 0xC855}, //5635 #HANGUL SYLLABLE CIEUC YE KIYEOK
+ {0xA0C2, 0xC856}, //5636 #HANGUL SYLLABLE CIEUC YE SSANGKIYEOK
+ {0xA0C3, 0xC857}, //5637 #HANGUL SYLLABLE CIEUC YE KIYEOKSIOS
+ {0xA0C4, 0xC858}, //5638 #HANGUL SYLLABLE CIEUC YE NIEUN
+ {0xA0C5, 0xC859}, //5639 #HANGUL SYLLABLE CIEUC YE NIEUNCIEUC
+ {0xA0C6, 0xC85A}, //5640 #HANGUL SYLLABLE CIEUC YE NIEUNHIEUH
+ {0xA0C7, 0xC85B}, //5641 #HANGUL SYLLABLE CIEUC YE TIKEUT
+ {0xA0C8, 0xC85C}, //5642 #HANGUL SYLLABLE CIEUC YE RIEUL
+ {0xA0C9, 0xC85D}, //5643 #HANGUL SYLLABLE CIEUC YE RIEULKIYEOK
+ {0xA0CA, 0xC85E}, //5644 #HANGUL SYLLABLE CIEUC YE RIEULMIEUM
+ {0xA0CB, 0xC85F}, //5645 #HANGUL SYLLABLE CIEUC YE RIEULPIEUP
+ {0xA0CC, 0xC860}, //5646 #HANGUL SYLLABLE CIEUC YE RIEULSIOS
+ {0xA0CD, 0xC861}, //5647 #HANGUL SYLLABLE CIEUC YE RIEULTHIEUTH
+ {0xA0CE, 0xC862}, //5648 #HANGUL SYLLABLE CIEUC YE RIEULPHIEUPH
+ {0xA0CF, 0xC863}, //5649 #HANGUL SYLLABLE CIEUC YE RIEULHIEUH
+ {0xA0D0, 0xC864}, //5650 #HANGUL SYLLABLE CIEUC YE MIEUM
+ {0xA0D1, 0xC865}, //5651 #HANGUL SYLLABLE CIEUC YE PIEUP
+ {0xA0D2, 0xC866}, //5652 #HANGUL SYLLABLE CIEUC YE PIEUPSIOS
+ {0xA0D3, 0xC867}, //5653 #HANGUL SYLLABLE CIEUC YE SIOS
+ {0xA0D4, 0xC868}, //5654 #HANGUL SYLLABLE CIEUC YE SSANGSIOS
+ {0xA0D5, 0xC869}, //5655 #HANGUL SYLLABLE CIEUC YE IEUNG
+ {0xA0D6, 0xC86A}, //5656 #HANGUL SYLLABLE CIEUC YE CIEUC
+ {0xA0D7, 0xC86B}, //5657 #HANGUL SYLLABLE CIEUC YE CHIEUCH
+ {0xA0D8, 0xC86C}, //5658 #HANGUL SYLLABLE CIEUC YE KHIEUKH
+ {0xA0D9, 0xC86D}, //5659 #HANGUL SYLLABLE CIEUC YE THIEUTH
+ {0xA0DA, 0xC86E}, //5660 #HANGUL SYLLABLE CIEUC YE PHIEUPH
+ {0xA0DB, 0xC86F}, //5661 #HANGUL SYLLABLE CIEUC YE HIEUH
+ {0xA0DC, 0xC872}, //5662 #HANGUL SYLLABLE CIEUC O SSANGKIYEOK
+ {0xA0DD, 0xC873}, //5663 #HANGUL SYLLABLE CIEUC O KIYEOKSIOS
+ {0xA0DE, 0xC875}, //5664 #HANGUL SYLLABLE CIEUC O NIEUNCIEUC
+ {0xA0DF, 0xC876}, //5665 #HANGUL SYLLABLE CIEUC O NIEUNHIEUH
+ {0xA0E0, 0xC877}, //5666 #HANGUL SYLLABLE CIEUC O TIKEUT
+ {0xA0E1, 0xC879}, //5667 #HANGUL SYLLABLE CIEUC O RIEULKIYEOK
+ {0xA0E2, 0xC87B}, //5668 #HANGUL SYLLABLE CIEUC O RIEULPIEUP
+ {0xA0E3, 0xC87C}, //5669 #HANGUL SYLLABLE CIEUC O RIEULSIOS
+ {0xA0E4, 0xC87D}, //5670 #HANGUL SYLLABLE CIEUC O RIEULTHIEUTH
+ {0xA0E5, 0xC87E}, //5671 #HANGUL SYLLABLE CIEUC O RIEULPHIEUPH
+ {0xA0E6, 0xC87F}, //5672 #HANGUL SYLLABLE CIEUC O RIEULHIEUH
+ {0xA0E7, 0xC882}, //5673 #HANGUL SYLLABLE CIEUC O PIEUPSIOS
+ {0xA0E8, 0xC884}, //5674 #HANGUL SYLLABLE CIEUC O SSANGSIOS
+ {0xA0E9, 0xC888}, //5675 #HANGUL SYLLABLE CIEUC O KHIEUKH
+ {0xA0EA, 0xC889}, //5676 #HANGUL SYLLABLE CIEUC O THIEUTH
+ {0xA0EB, 0xC88A}, //5677 #HANGUL SYLLABLE CIEUC O PHIEUPH
+ {0xA0EC, 0xC88E}, //5678 #HANGUL SYLLABLE CIEUC WA SSANGKIYEOK
+ {0xA0ED, 0xC88F}, //5679 #HANGUL SYLLABLE CIEUC WA KIYEOKSIOS
+ {0xA0EE, 0xC890}, //5680 #HANGUL SYLLABLE CIEUC WA NIEUN
+ {0xA0EF, 0xC891}, //5681 #HANGUL SYLLABLE CIEUC WA NIEUNCIEUC
+ {0xA0F0, 0xC892}, //5682 #HANGUL SYLLABLE CIEUC WA NIEUNHIEUH
+ {0xA0F1, 0xC893}, //5683 #HANGUL SYLLABLE CIEUC WA TIKEUT
+ {0xA0F2, 0xC895}, //5684 #HANGUL SYLLABLE CIEUC WA RIEULKIYEOK
+ {0xA0F3, 0xC896}, //5685 #HANGUL SYLLABLE CIEUC WA RIEULMIEUM
+ {0xA0F4, 0xC897}, //5686 #HANGUL SYLLABLE CIEUC WA RIEULPIEUP
+ {0xA0F5, 0xC898}, //5687 #HANGUL SYLLABLE CIEUC WA RIEULSIOS
+ {0xA0F6, 0xC899}, //5688 #HANGUL SYLLABLE CIEUC WA RIEULTHIEUTH
+ {0xA0F7, 0xC89A}, //5689 #HANGUL SYLLABLE CIEUC WA RIEULPHIEUPH
+ {0xA0F8, 0xC89B}, //5690 #HANGUL SYLLABLE CIEUC WA RIEULHIEUH
+ {0xA0F9, 0xC89C}, //5691 #HANGUL SYLLABLE CIEUC WA MIEUM
+ {0xA0FA, 0xC89E}, //5692 #HANGUL SYLLABLE CIEUC WA PIEUPSIOS
+ {0xA0FB, 0xC8A0}, //5693 #HANGUL SYLLABLE CIEUC WA SSANGSIOS
+ {0xA0FC, 0xC8A2}, //5694 #HANGUL SYLLABLE CIEUC WA CIEUC
+ {0xA0FD, 0xC8A3}, //5695 #HANGUL SYLLABLE CIEUC WA CHIEUCH
+ {0xA0FE, 0xC8A4}, //5696 #HANGUL SYLLABLE CIEUC WA KHIEUKH
+ {0xA141, 0xC8A5}, //5697 #HANGUL SYLLABLE CIEUC WA THIEUTH
+ {0xA142, 0xC8A6}, //5698 #HANGUL SYLLABLE CIEUC WA PHIEUPH
+ {0xA143, 0xC8A7}, //5699 #HANGUL SYLLABLE CIEUC WA HIEUH
+ {0xA144, 0xC8A9}, //5700 #HANGUL SYLLABLE CIEUC WAE KIYEOK
+ {0xA145, 0xC8AA}, //5701 #HANGUL SYLLABLE CIEUC WAE SSANGKIYEOK
+ {0xA146, 0xC8AB}, //5702 #HANGUL SYLLABLE CIEUC WAE KIYEOKSIOS
+ {0xA147, 0xC8AC}, //5703 #HANGUL SYLLABLE CIEUC WAE NIEUN
+ {0xA148, 0xC8AD}, //5704 #HANGUL SYLLABLE CIEUC WAE NIEUNCIEUC
+ {0xA149, 0xC8AE}, //5705 #HANGUL SYLLABLE CIEUC WAE NIEUNHIEUH
+ {0xA14A, 0xC8AF}, //5706 #HANGUL SYLLABLE CIEUC WAE TIKEUT
+ {0xA14B, 0xC8B0}, //5707 #HANGUL SYLLABLE CIEUC WAE RIEUL
+ {0xA14C, 0xC8B1}, //5708 #HANGUL SYLLABLE CIEUC WAE RIEULKIYEOK
+ {0xA14D, 0xC8B2}, //5709 #HANGUL SYLLABLE CIEUC WAE RIEULMIEUM
+ {0xA14E, 0xC8B3}, //5710 #HANGUL SYLLABLE CIEUC WAE RIEULPIEUP
+ {0xA14F, 0xC8B4}, //5711 #HANGUL SYLLABLE CIEUC WAE RIEULSIOS
+ {0xA150, 0xC8B5}, //5712 #HANGUL SYLLABLE CIEUC WAE RIEULTHIEUTH
+ {0xA151, 0xC8B6}, //5713 #HANGUL SYLLABLE CIEUC WAE RIEULPHIEUPH
+ {0xA152, 0xC8B7}, //5714 #HANGUL SYLLABLE CIEUC WAE RIEULHIEUH
+ {0xA153, 0xC8B8}, //5715 #HANGUL SYLLABLE CIEUC WAE MIEUM
+ {0xA154, 0xC8B9}, //5716 #HANGUL SYLLABLE CIEUC WAE PIEUP
+ {0xA155, 0xC8BA}, //5717 #HANGUL SYLLABLE CIEUC WAE PIEUPSIOS
+ {0xA156, 0xC8BB}, //5718 #HANGUL SYLLABLE CIEUC WAE SIOS
+ {0xA157, 0xC8BE}, //5719 #HANGUL SYLLABLE CIEUC WAE CIEUC
+ {0xA158, 0xC8BF}, //5720 #HANGUL SYLLABLE CIEUC WAE CHIEUCH
+ {0xA159, 0xC8C0}, //5721 #HANGUL SYLLABLE CIEUC WAE KHIEUKH
+ {0xA15A, 0xC8C1}, //5722 #HANGUL SYLLABLE CIEUC WAE THIEUTH
+ {0xA161, 0xC8C2}, //5723 #HANGUL SYLLABLE CIEUC WAE PHIEUPH
+ {0xA162, 0xC8C3}, //5724 #HANGUL SYLLABLE CIEUC WAE HIEUH
+ {0xA163, 0xC8C5}, //5725 #HANGUL SYLLABLE CIEUC OE KIYEOK
+ {0xA164, 0xC8C6}, //5726 #HANGUL SYLLABLE CIEUC OE SSANGKIYEOK
+ {0xA165, 0xC8C7}, //5727 #HANGUL SYLLABLE CIEUC OE KIYEOKSIOS
+ {0xA166, 0xC8C9}, //5728 #HANGUL SYLLABLE CIEUC OE NIEUNCIEUC
+ {0xA167, 0xC8CA}, //5729 #HANGUL SYLLABLE CIEUC OE NIEUNHIEUH
+ {0xA168, 0xC8CB}, //5730 #HANGUL SYLLABLE CIEUC OE TIKEUT
+ {0xA169, 0xC8CD}, //5731 #HANGUL SYLLABLE CIEUC OE RIEULKIYEOK
+ {0xA16A, 0xC8CE}, //5732 #HANGUL SYLLABLE CIEUC OE RIEULMIEUM
+ {0xA16B, 0xC8CF}, //5733 #HANGUL SYLLABLE CIEUC OE RIEULPIEUP
+ {0xA16C, 0xC8D0}, //5734 #HANGUL SYLLABLE CIEUC OE RIEULSIOS
+ {0xA16D, 0xC8D1}, //5735 #HANGUL SYLLABLE CIEUC OE RIEULTHIEUTH
+ {0xA16E, 0xC8D2}, //5736 #HANGUL SYLLABLE CIEUC OE RIEULPHIEUPH
+ {0xA16F, 0xC8D3}, //5737 #HANGUL SYLLABLE CIEUC OE RIEULHIEUH
+ {0xA170, 0xC8D6}, //5738 #HANGUL SYLLABLE CIEUC OE PIEUPSIOS
+ {0xA171, 0xC8D8}, //5739 #HANGUL SYLLABLE CIEUC OE SSANGSIOS
+ {0xA172, 0xC8DA}, //5740 #HANGUL SYLLABLE CIEUC OE CIEUC
+ {0xA173, 0xC8DB}, //5741 #HANGUL SYLLABLE CIEUC OE CHIEUCH
+ {0xA174, 0xC8DC}, //5742 #HANGUL SYLLABLE CIEUC OE KHIEUKH
+ {0xA175, 0xC8DD}, //5743 #HANGUL SYLLABLE CIEUC OE THIEUTH
+ {0xA176, 0xC8DE}, //5744 #HANGUL SYLLABLE CIEUC OE PHIEUPH
+ {0xA177, 0xC8DF}, //5745 #HANGUL SYLLABLE CIEUC OE HIEUH
+ {0xA178, 0xC8E2}, //5746 #HANGUL SYLLABLE CIEUC YO SSANGKIYEOK
+ {0xA179, 0xC8E3}, //5747 #HANGUL SYLLABLE CIEUC YO KIYEOKSIOS
+ {0xA17A, 0xC8E5}, //5748 #HANGUL SYLLABLE CIEUC YO NIEUNCIEUC
+ {0xA181, 0xC8E6}, //5749 #HANGUL SYLLABLE CIEUC YO NIEUNHIEUH
+ {0xA182, 0xC8E7}, //5750 #HANGUL SYLLABLE CIEUC YO TIKEUT
+ {0xA183, 0xC8E8}, //5751 #HANGUL SYLLABLE CIEUC YO RIEUL
+ {0xA184, 0xC8E9}, //5752 #HANGUL SYLLABLE CIEUC YO RIEULKIYEOK
+ {0xA185, 0xC8EA}, //5753 #HANGUL SYLLABLE CIEUC YO RIEULMIEUM
+ {0xA186, 0xC8EB}, //5754 #HANGUL SYLLABLE CIEUC YO RIEULPIEUP
+ {0xA187, 0xC8EC}, //5755 #HANGUL SYLLABLE CIEUC YO RIEULSIOS
+ {0xA188, 0xC8ED}, //5756 #HANGUL SYLLABLE CIEUC YO RIEULTHIEUTH
+ {0xA189, 0xC8EE}, //5757 #HANGUL SYLLABLE CIEUC YO RIEULPHIEUPH
+ {0xA18A, 0xC8EF}, //5758 #HANGUL SYLLABLE CIEUC YO RIEULHIEUH
+ {0xA18B, 0xC8F0}, //5759 #HANGUL SYLLABLE CIEUC YO MIEUM
+ {0xA18C, 0xC8F1}, //5760 #HANGUL SYLLABLE CIEUC YO PIEUP
+ {0xA18D, 0xC8F2}, //5761 #HANGUL SYLLABLE CIEUC YO PIEUPSIOS
+ {0xA18E, 0xC8F3}, //5762 #HANGUL SYLLABLE CIEUC YO SIOS
+ {0xA18F, 0xC8F4}, //5763 #HANGUL SYLLABLE CIEUC YO SSANGSIOS
+ {0xA190, 0xC8F6}, //5764 #HANGUL SYLLABLE CIEUC YO CIEUC
+ {0xA191, 0xC8F7}, //5765 #HANGUL SYLLABLE CIEUC YO CHIEUCH
+ {0xA192, 0xC8F8}, //5766 #HANGUL SYLLABLE CIEUC YO KHIEUKH
+ {0xA193, 0xC8F9}, //5767 #HANGUL SYLLABLE CIEUC YO THIEUTH
+ {0xA194, 0xC8FA}, //5768 #HANGUL SYLLABLE CIEUC YO PHIEUPH
+ {0xA195, 0xC8FB}, //5769 #HANGUL SYLLABLE CIEUC YO HIEUH
+ {0xA196, 0xC8FE}, //5770 #HANGUL SYLLABLE CIEUC U SSANGKIYEOK
+ {0xA197, 0xC8FF}, //5771 #HANGUL SYLLABLE CIEUC U KIYEOKSIOS
+ {0xA198, 0xC901}, //5772 #HANGUL SYLLABLE CIEUC U NIEUNCIEUC
+ {0xA199, 0xC902}, //5773 #HANGUL SYLLABLE CIEUC U NIEUNHIEUH
+ {0xA19A, 0xC903}, //5774 #HANGUL SYLLABLE CIEUC U TIKEUT
+ {0xA19B, 0xC907}, //5775 #HANGUL SYLLABLE CIEUC U RIEULPIEUP
+ {0xA19C, 0xC908}, //5776 #HANGUL SYLLABLE CIEUC U RIEULSIOS
+ {0xA19D, 0xC909}, //5777 #HANGUL SYLLABLE CIEUC U RIEULTHIEUTH
+ {0xA19E, 0xC90A}, //5778 #HANGUL SYLLABLE CIEUC U RIEULPHIEUPH
+ {0xA19F, 0xC90B}, //5779 #HANGUL SYLLABLE CIEUC U RIEULHIEUH
+ {0xA1A0, 0xC90E}, //5780 #HANGUL SYLLABLE CIEUC U PIEUPSIOS
+ {0xA1A1, 0x3000}, //5781 #IDEOGRAPHIC SPACE
+ {0xA1A2, 0x3001}, //5782 #IDEOGRAPHIC COMMA
+ {0xA1A3, 0x3002}, //5783 #IDEOGRAPHIC FULL STOP
+ {0xA1A4, 0x00B7}, //5784 #MIDDLE DOT
+ {0xA1A5, 0x2025}, //5785 #TWO DOT LEADER
+ {0xA1A6, 0x2026}, //5786 #HORIZONTAL ELLIPSIS
+ {0xA1A7, 0x00A8}, //5787 #DIAERESIS
+ {0xA1A8, 0x3003}, //5788 #DITTO MARK
+ {0xA1A9, 0x00AD}, //5789 #SOFT HYPHEN
+ {0xA1AA, 0x2015}, //5790 #HORIZONTAL BAR
+ {0xA1AB, 0x2225}, //5791 #PARALLEL TO
+ {0xA1AC, 0xFF3C}, //5792 #FULLWIDTH REVERSE SOLIDUS
+ {0xA1AD, 0x223C}, //5793 #TILDE OPERATOR
+ {0xA1AE, 0x2018}, //5794 #LEFT SINGLE QUOTATION MARK
+ {0xA1AF, 0x2019}, //5795 #RIGHT SINGLE QUOTATION MARK
+ {0xA1B0, 0x201C}, //5796 #LEFT DOUBLE QUOTATION MARK
+ {0xA1B1, 0x201D}, //5797 #RIGHT DOUBLE QUOTATION MARK
+ {0xA1B2, 0x3014}, //5798 #LEFT TORTOISE SHELL BRACKET
+ {0xA1B3, 0x3015}, //5799 #RIGHT TORTOISE SHELL BRACKET
+ {0xA1B4, 0x3008}, //5800 #LEFT ANGLE BRACKET
+ {0xA1B5, 0x3009}, //5801 #RIGHT ANGLE BRACKET
+ {0xA1B6, 0x300A}, //5802 #LEFT DOUBLE ANGLE BRACKET
+ {0xA1B7, 0x300B}, //5803 #RIGHT DOUBLE ANGLE BRACKET
+ {0xA1B8, 0x300C}, //5804 #LEFT CORNER BRACKET
+ {0xA1B9, 0x300D}, //5805 #RIGHT CORNER BRACKET
+ {0xA1BA, 0x300E}, //5806 #LEFT WHITE CORNER BRACKET
+ {0xA1BB, 0x300F}, //5807 #RIGHT WHITE CORNER BRACKET
+ {0xA1BC, 0x3010}, //5808 #LEFT BLACK LENTICULAR BRACKET
+ {0xA1BD, 0x3011}, //5809 #RIGHT BLACK LENTICULAR BRACKET
+ {0xA1BE, 0x00B1}, //5810 #PLUS-MINUS SIGN
+ {0xA1BF, 0x00D7}, //5811 #MULTIPLICATION SIGN
+ {0xA1C0, 0x00F7}, //5812 #DIVISION SIGN
+ {0xA1C1, 0x2260}, //5813 #NOT EQUAL TO
+ {0xA1C2, 0x2264}, //5814 #LESS-THAN OR EQUAL TO
+ {0xA1C3, 0x2265}, //5815 #GREATER-THAN OR EQUAL TO
+ {0xA1C4, 0x221E}, //5816 #INFINITY
+ {0xA1C5, 0x2234}, //5817 #THEREFORE
+ {0xA1C6, 0x00B0}, //5818 #DEGREE SIGN
+ {0xA1C7, 0x2032}, //5819 #PRIME
+ {0xA1C8, 0x2033}, //5820 #DOUBLE PRIME
+ {0xA1C9, 0x2103}, //5821 #DEGREE CELSIUS
+ {0xA1CA, 0x212B}, //5822 #ANGSTROM SIGN
+ {0xA1CB, 0xFFE0}, //5823 #FULLWIDTH CENT SIGN
+ {0xA1CC, 0xFFE1}, //5824 #FULLWIDTH POUND SIGN
+ {0xA1CD, 0xFFE5}, //5825 #FULLWIDTH YEN SIGN
+ {0xA1CE, 0x2642}, //5826 #MALE SIGN
+ {0xA1CF, 0x2640}, //5827 #FEMALE SIGN
+ {0xA1D0, 0x2220}, //5828 #ANGLE
+ {0xA1D1, 0x22A5}, //5829 #UP TACK
+ {0xA1D2, 0x2312}, //5830 #ARC
+ {0xA1D3, 0x2202}, //5831 #PARTIAL DIFFERENTIAL
+ {0xA1D4, 0x2207}, //5832 #NABLA
+ {0xA1D5, 0x2261}, //5833 #IDENTICAL TO
+ {0xA1D6, 0x2252}, //5834 #APPROXIMATELY EQUAL TO OR THE IMAGE OF
+ {0xA1D7, 0x00A7}, //5835 #SECTION SIGN
+ {0xA1D8, 0x203B}, //5836 #REFERENCE MARK
+ {0xA1D9, 0x2606}, //5837 #WHITE STAR
+ {0xA1DA, 0x2605}, //5838 #BLACK STAR
+ {0xA1DB, 0x25CB}, //5839 #WHITE CIRCLE
+ {0xA1DC, 0x25CF}, //5840 #BLACK CIRCLE
+ {0xA1DD, 0x25CE}, //5841 #BULLSEYE
+ {0xA1DE, 0x25C7}, //5842 #WHITE DIAMOND
+ {0xA1DF, 0x25C6}, //5843 #BLACK DIAMOND
+ {0xA1E0, 0x25A1}, //5844 #WHITE SQUARE
+ {0xA1E1, 0x25A0}, //5845 #BLACK SQUARE
+ {0xA1E2, 0x25B3}, //5846 #WHITE UP-POINTING TRIANGLE
+ {0xA1E3, 0x25B2}, //5847 #BLACK UP-POINTING TRIANGLE
+ {0xA1E4, 0x25BD}, //5848 #WHITE DOWN-POINTING TRIANGLE
+ {0xA1E5, 0x25BC}, //5849 #BLACK DOWN-POINTING TRIANGLE
+ {0xA1E6, 0x2192}, //5850 #RIGHTWARDS ARROW
+ {0xA1E7, 0x2190}, //5851 #LEFTWARDS ARROW
+ {0xA1E8, 0x2191}, //5852 #UPWARDS ARROW
+ {0xA1E9, 0x2193}, //5853 #DOWNWARDS ARROW
+ {0xA1EA, 0x2194}, //5854 #LEFT RIGHT ARROW
+ {0xA1EB, 0x3013}, //5855 #GETA MARK
+ {0xA1EC, 0x226A}, //5856 #MUCH LESS-THAN
+ {0xA1ED, 0x226B}, //5857 #MUCH GREATER-THAN
+ {0xA1EE, 0x221A}, //5858 #SQUARE ROOT
+ {0xA1EF, 0x223D}, //5859 #REVERSED TILDE
+ {0xA1F0, 0x221D}, //5860 #PROPORTIONAL TO
+ {0xA1F1, 0x2235}, //5861 #BECAUSE
+ {0xA1F2, 0x222B}, //5862 #INTEGRAL
+ {0xA1F3, 0x222C}, //5863 #DOUBLE INTEGRAL
+ {0xA1F4, 0x2208}, //5864 #ELEMENT OF
+ {0xA1F5, 0x220B}, //5865 #CONTAINS AS MEMBER
+ {0xA1F6, 0x2286}, //5866 #SUBSET OF OR EQUAL TO
+ {0xA1F7, 0x2287}, //5867 #SUPERSET OF OR EQUAL TO
+ {0xA1F8, 0x2282}, //5868 #SUBSET OF
+ {0xA1F9, 0x2283}, //5869 #SUPERSET OF
+ {0xA1FA, 0x222A}, //5870 #UNION
+ {0xA1FB, 0x2229}, //5871 #INTERSECTION
+ {0xA1FC, 0x2227}, //5872 #LOGICAL AND
+ {0xA1FD, 0x2228}, //5873 #LOGICAL OR
+ {0xA1FE, 0xFFE2}, //5874 #FULLWIDTH NOT SIGN
+ {0xA241, 0xC910}, //5875 #HANGUL SYLLABLE CIEUC U SSANGSIOS
+ {0xA242, 0xC912}, //5876 #HANGUL SYLLABLE CIEUC U CIEUC
+ {0xA243, 0xC913}, //5877 #HANGUL SYLLABLE CIEUC U CHIEUCH
+ {0xA244, 0xC914}, //5878 #HANGUL SYLLABLE CIEUC U KHIEUKH
+ {0xA245, 0xC915}, //5879 #HANGUL SYLLABLE CIEUC U THIEUTH
+ {0xA246, 0xC916}, //5880 #HANGUL SYLLABLE CIEUC U PHIEUPH
+ {0xA247, 0xC917}, //5881 #HANGUL SYLLABLE CIEUC U HIEUH
+ {0xA248, 0xC919}, //5882 #HANGUL SYLLABLE CIEUC WEO KIYEOK
+ {0xA249, 0xC91A}, //5883 #HANGUL SYLLABLE CIEUC WEO SSANGKIYEOK
+ {0xA24A, 0xC91B}, //5884 #HANGUL SYLLABLE CIEUC WEO KIYEOKSIOS
+ {0xA24B, 0xC91C}, //5885 #HANGUL SYLLABLE CIEUC WEO NIEUN
+ {0xA24C, 0xC91D}, //5886 #HANGUL SYLLABLE CIEUC WEO NIEUNCIEUC
+ {0xA24D, 0xC91E}, //5887 #HANGUL SYLLABLE CIEUC WEO NIEUNHIEUH
+ {0xA24E, 0xC91F}, //5888 #HANGUL SYLLABLE CIEUC WEO TIKEUT
+ {0xA24F, 0xC920}, //5889 #HANGUL SYLLABLE CIEUC WEO RIEUL
+ {0xA250, 0xC921}, //5890 #HANGUL SYLLABLE CIEUC WEO RIEULKIYEOK
+ {0xA251, 0xC922}, //5891 #HANGUL SYLLABLE CIEUC WEO RIEULMIEUM
+ {0xA252, 0xC923}, //5892 #HANGUL SYLLABLE CIEUC WEO RIEULPIEUP
+ {0xA253, 0xC924}, //5893 #HANGUL SYLLABLE CIEUC WEO RIEULSIOS
+ {0xA254, 0xC925}, //5894 #HANGUL SYLLABLE CIEUC WEO RIEULTHIEUTH
+ {0xA255, 0xC926}, //5895 #HANGUL SYLLABLE CIEUC WEO RIEULPHIEUPH
+ {0xA256, 0xC927}, //5896 #HANGUL SYLLABLE CIEUC WEO RIEULHIEUH
+ {0xA257, 0xC928}, //5897 #HANGUL SYLLABLE CIEUC WEO MIEUM
+ {0xA258, 0xC929}, //5898 #HANGUL SYLLABLE CIEUC WEO PIEUP
+ {0xA259, 0xC92A}, //5899 #HANGUL SYLLABLE CIEUC WEO PIEUPSIOS
+ {0xA25A, 0xC92B}, //5900 #HANGUL SYLLABLE CIEUC WEO SIOS
+ {0xA261, 0xC92D}, //5901 #HANGUL SYLLABLE CIEUC WEO IEUNG
+ {0xA262, 0xC92E}, //5902 #HANGUL SYLLABLE CIEUC WEO CIEUC
+ {0xA263, 0xC92F}, //5903 #HANGUL SYLLABLE CIEUC WEO CHIEUCH
+ {0xA264, 0xC930}, //5904 #HANGUL SYLLABLE CIEUC WEO KHIEUKH
+ {0xA265, 0xC931}, //5905 #HANGUL SYLLABLE CIEUC WEO THIEUTH
+ {0xA266, 0xC932}, //5906 #HANGUL SYLLABLE CIEUC WEO PHIEUPH
+ {0xA267, 0xC933}, //5907 #HANGUL SYLLABLE CIEUC WEO HIEUH
+ {0xA268, 0xC935}, //5908 #HANGUL SYLLABLE CIEUC WE KIYEOK
+ {0xA269, 0xC936}, //5909 #HANGUL SYLLABLE CIEUC WE SSANGKIYEOK
+ {0xA26A, 0xC937}, //5910 #HANGUL SYLLABLE CIEUC WE KIYEOKSIOS
+ {0xA26B, 0xC938}, //5911 #HANGUL SYLLABLE CIEUC WE NIEUN
+ {0xA26C, 0xC939}, //5912 #HANGUL SYLLABLE CIEUC WE NIEUNCIEUC
+ {0xA26D, 0xC93A}, //5913 #HANGUL SYLLABLE CIEUC WE NIEUNHIEUH
+ {0xA26E, 0xC93B}, //5914 #HANGUL SYLLABLE CIEUC WE TIKEUT
+ {0xA26F, 0xC93C}, //5915 #HANGUL SYLLABLE CIEUC WE RIEUL
+ {0xA270, 0xC93D}, //5916 #HANGUL SYLLABLE CIEUC WE RIEULKIYEOK
+ {0xA271, 0xC93E}, //5917 #HANGUL SYLLABLE CIEUC WE RIEULMIEUM
+ {0xA272, 0xC93F}, //5918 #HANGUL SYLLABLE CIEUC WE RIEULPIEUP
+ {0xA273, 0xC940}, //5919 #HANGUL SYLLABLE CIEUC WE RIEULSIOS
+ {0xA274, 0xC941}, //5920 #HANGUL SYLLABLE CIEUC WE RIEULTHIEUTH
+ {0xA275, 0xC942}, //5921 #HANGUL SYLLABLE CIEUC WE RIEULPHIEUPH
+ {0xA276, 0xC943}, //5922 #HANGUL SYLLABLE CIEUC WE RIEULHIEUH
+ {0xA277, 0xC944}, //5923 #HANGUL SYLLABLE CIEUC WE MIEUM
+ {0xA278, 0xC945}, //5924 #HANGUL SYLLABLE CIEUC WE PIEUP
+ {0xA279, 0xC946}, //5925 #HANGUL SYLLABLE CIEUC WE PIEUPSIOS
+ {0xA27A, 0xC947}, //5926 #HANGUL SYLLABLE CIEUC WE SIOS
+ {0xA281, 0xC948}, //5927 #HANGUL SYLLABLE CIEUC WE SSANGSIOS
+ {0xA282, 0xC949}, //5928 #HANGUL SYLLABLE CIEUC WE IEUNG
+ {0xA283, 0xC94A}, //5929 #HANGUL SYLLABLE CIEUC WE CIEUC
+ {0xA284, 0xC94B}, //5930 #HANGUL SYLLABLE CIEUC WE CHIEUCH
+ {0xA285, 0xC94C}, //5931 #HANGUL SYLLABLE CIEUC WE KHIEUKH
+ {0xA286, 0xC94D}, //5932 #HANGUL SYLLABLE CIEUC WE THIEUTH
+ {0xA287, 0xC94E}, //5933 #HANGUL SYLLABLE CIEUC WE PHIEUPH
+ {0xA288, 0xC94F}, //5934 #HANGUL SYLLABLE CIEUC WE HIEUH
+ {0xA289, 0xC952}, //5935 #HANGUL SYLLABLE CIEUC WI SSANGKIYEOK
+ {0xA28A, 0xC953}, //5936 #HANGUL SYLLABLE CIEUC WI KIYEOKSIOS
+ {0xA28B, 0xC955}, //5937 #HANGUL SYLLABLE CIEUC WI NIEUNCIEUC
+ {0xA28C, 0xC956}, //5938 #HANGUL SYLLABLE CIEUC WI NIEUNHIEUH
+ {0xA28D, 0xC957}, //5939 #HANGUL SYLLABLE CIEUC WI TIKEUT
+ {0xA28E, 0xC959}, //5940 #HANGUL SYLLABLE CIEUC WI RIEULKIYEOK
+ {0xA28F, 0xC95A}, //5941 #HANGUL SYLLABLE CIEUC WI RIEULMIEUM
+ {0xA290, 0xC95B}, //5942 #HANGUL SYLLABLE CIEUC WI RIEULPIEUP
+ {0xA291, 0xC95C}, //5943 #HANGUL SYLLABLE CIEUC WI RIEULSIOS
+ {0xA292, 0xC95D}, //5944 #HANGUL SYLLABLE CIEUC WI RIEULTHIEUTH
+ {0xA293, 0xC95E}, //5945 #HANGUL SYLLABLE CIEUC WI RIEULPHIEUPH
+ {0xA294, 0xC95F}, //5946 #HANGUL SYLLABLE CIEUC WI RIEULHIEUH
+ {0xA295, 0xC962}, //5947 #HANGUL SYLLABLE CIEUC WI PIEUPSIOS
+ {0xA296, 0xC964}, //5948 #HANGUL SYLLABLE CIEUC WI SSANGSIOS
+ {0xA297, 0xC965}, //5949 #HANGUL SYLLABLE CIEUC WI IEUNG
+ {0xA298, 0xC966}, //5950 #HANGUL SYLLABLE CIEUC WI CIEUC
+ {0xA299, 0xC967}, //5951 #HANGUL SYLLABLE CIEUC WI CHIEUCH
+ {0xA29A, 0xC968}, //5952 #HANGUL SYLLABLE CIEUC WI KHIEUKH
+ {0xA29B, 0xC969}, //5953 #HANGUL SYLLABLE CIEUC WI THIEUTH
+ {0xA29C, 0xC96A}, //5954 #HANGUL SYLLABLE CIEUC WI PHIEUPH
+ {0xA29D, 0xC96B}, //5955 #HANGUL SYLLABLE CIEUC WI HIEUH
+ {0xA29E, 0xC96D}, //5956 #HANGUL SYLLABLE CIEUC YU KIYEOK
+ {0xA29F, 0xC96E}, //5957 #HANGUL SYLLABLE CIEUC YU SSANGKIYEOK
+ {0xA2A0, 0xC96F}, //5958 #HANGUL SYLLABLE CIEUC YU KIYEOKSIOS
+ {0xA2A1, 0x21D2}, //5959 #RIGHTWARDS DOUBLE ARROW
+ {0xA2A2, 0x21D4}, //5960 #LEFT RIGHT DOUBLE ARROW
+ {0xA2A3, 0x2200}, //5961 #FOR ALL
+ {0xA2A4, 0x2203}, //5962 #THERE EXISTS
+ {0xA2A5, 0x00B4}, //5963 #ACUTE ACCENT
+ {0xA2A6, 0xFF5E}, //5964 #FULLWIDTH TILDE
+ {0xA2A7, 0x02C7}, //5965 #CARON
+ {0xA2A8, 0x02D8}, //5966 #BREVE
+ {0xA2A9, 0x02DD}, //5967 #DOUBLE ACUTE ACCENT
+ {0xA2AA, 0x02DA}, //5968 #RING ABOVE
+ {0xA2AB, 0x02D9}, //5969 #DOT ABOVE
+ {0xA2AC, 0x00B8}, //5970 #CEDILLA
+ {0xA2AD, 0x02DB}, //5971 #OGONEK
+ {0xA2AE, 0x00A1}, //5972 #INVERTED EXCLAMATION MARK
+ {0xA2AF, 0x00BF}, //5973 #INVERTED QUESTION MARK
+ {0xA2B0, 0x02D0}, //5974 #MODIFIER LETTER TRIANGULAR COLON
+ {0xA2B1, 0x222E}, //5975 #CONTOUR INTEGRAL
+ {0xA2B2, 0x2211}, //5976 #N-ARY SUMMATION
+ {0xA2B3, 0x220F}, //5977 #N-ARY PRODUCT
+ {0xA2B4, 0x00A4}, //5978 #CURRENCY SIGN
+ {0xA2B5, 0x2109}, //5979 #DEGREE FAHRENHEIT
+ {0xA2B6, 0x2030}, //5980 #PER MILLE SIGN
+ {0xA2B7, 0x25C1}, //5981 #WHITE LEFT-POINTING TRIANGLE
+ {0xA2B8, 0x25C0}, //5982 #BLACK LEFT-POINTING TRIANGLE
+ {0xA2B9, 0x25B7}, //5983 #WHITE RIGHT-POINTING TRIANGLE
+ {0xA2BA, 0x25B6}, //5984 #BLACK RIGHT-POINTING TRIANGLE
+ {0xA2BB, 0x2664}, //5985 #WHITE SPADE SUIT
+ {0xA2BC, 0x2660}, //5986 #BLACK SPADE SUIT
+ {0xA2BD, 0x2661}, //5987 #WHITE HEART SUIT
+ {0xA2BE, 0x2665}, //5988 #BLACK HEART SUIT
+ {0xA2BF, 0x2667}, //5989 #WHITE CLUB SUIT
+ {0xA2C0, 0x2663}, //5990 #BLACK CLUB SUIT
+ {0xA2C1, 0x2299}, //5991 #CIRCLED DOT OPERATOR
+ {0xA2C2, 0x25C8}, //5992 #WHITE DIAMOND CONTAINING BLACK SMALL DIAMOND
+ {0xA2C3, 0x25A3}, //5993 #WHITE SQUARE CONTAINING BLACK SMALL SQUARE
+ {0xA2C4, 0x25D0}, //5994 #CIRCLE WITH LEFT HALF BLACK
+ {0xA2C5, 0x25D1}, //5995 #CIRCLE WITH RIGHT HALF BLACK
+ {0xA2C6, 0x2592}, //5996 #MEDIUM SHADE
+ {0xA2C7, 0x25A4}, //5997 #SQUARE WITH HORIZONTAL FILL
+ {0xA2C8, 0x25A5}, //5998 #SQUARE WITH VERTICAL FILL
+ {0xA2C9, 0x25A8}, //5999 #SQUARE WITH UPPER RIGHT TO LOWER LEFT FILL
+ {0xA2CA, 0x25A7}, //6000 #SQUARE WITH UPPER LEFT TO LOWER RIGHT FILL
+ {0xA2CB, 0x25A6}, //6001 #SQUARE WITH ORTHOGONAL CROSSHATCH FILL
+ {0xA2CC, 0x25A9}, //6002 #SQUARE WITH DIAGONAL CROSSHATCH FILL
+ {0xA2CD, 0x2668}, //6003 #HOT SPRINGS
+ {0xA2CE, 0x260F}, //6004 #WHITE TELEPHONE
+ {0xA2CF, 0x260E}, //6005 #BLACK TELEPHONE
+ {0xA2D0, 0x261C}, //6006 #WHITE LEFT POINTING INDEX
+ {0xA2D1, 0x261E}, //6007 #WHITE RIGHT POINTING INDEX
+ {0xA2D2, 0x00B6}, //6008 #PILCROW SIGN
+ {0xA2D3, 0x2020}, //6009 #DAGGER
+ {0xA2D4, 0x2021}, //6010 #DOUBLE DAGGER
+ {0xA2D5, 0x2195}, //6011 #UP DOWN ARROW
+ {0xA2D6, 0x2197}, //6012 #NORTH EAST ARROW
+ {0xA2D7, 0x2199}, //6013 #SOUTH WEST ARROW
+ {0xA2D8, 0x2196}, //6014 #NORTH WEST ARROW
+ {0xA2D9, 0x2198}, //6015 #SOUTH EAST ARROW
+ {0xA2DA, 0x266D}, //6016 #MUSIC FLAT SIGN
+ {0xA2DB, 0x2669}, //6017 #QUARTER NOTE
+ {0xA2DC, 0x266A}, //6018 #EIGHTH NOTE
+ {0xA2DD, 0x266C}, //6019 #BEAMED SIXTEENTH NOTES
+ {0xA2DE, 0x327F}, //6020 #KOREAN STANDARD SYMBOL
+ {0xA2DF, 0x321C}, //6021 #PARENTHESIZED HANGUL CIEUC U
+ {0xA2E0, 0x2116}, //6022 #NUMERO SIGN
+ {0xA2E1, 0x33C7}, //6023 #SQUARE CO
+ {0xA2E2, 0x2122}, //6024 #TRADE MARK SIGN
+ {0xA2E3, 0x33C2}, //6025 #SQUARE AM
+ {0xA2E4, 0x33D8}, //6026 #SQUARE PM
+ {0xA2E5, 0x2121}, //6027 #TELEPHONE SIGN
+ {0xA2E6, 0x20AC}, //6028 #EURO SIGN
+ {0xA2E7, 0x00AE}, //6029 #REGISTERED SIGN
+ {0xA341, 0xC971}, //6030 #HANGUL SYLLABLE CIEUC YU NIEUNCIEUC
+ {0xA342, 0xC972}, //6031 #HANGUL SYLLABLE CIEUC YU NIEUNHIEUH
+ {0xA343, 0xC973}, //6032 #HANGUL SYLLABLE CIEUC YU TIKEUT
+ {0xA344, 0xC975}, //6033 #HANGUL SYLLABLE CIEUC YU RIEULKIYEOK
+ {0xA345, 0xC976}, //6034 #HANGUL SYLLABLE CIEUC YU RIEULMIEUM
+ {0xA346, 0xC977}, //6035 #HANGUL SYLLABLE CIEUC YU RIEULPIEUP
+ {0xA347, 0xC978}, //6036 #HANGUL SYLLABLE CIEUC YU RIEULSIOS
+ {0xA348, 0xC979}, //6037 #HANGUL SYLLABLE CIEUC YU RIEULTHIEUTH
+ {0xA349, 0xC97A}, //6038 #HANGUL SYLLABLE CIEUC YU RIEULPHIEUPH
+ {0xA34A, 0xC97B}, //6039 #HANGUL SYLLABLE CIEUC YU RIEULHIEUH
+ {0xA34B, 0xC97D}, //6040 #HANGUL SYLLABLE CIEUC YU PIEUP
+ {0xA34C, 0xC97E}, //6041 #HANGUL SYLLABLE CIEUC YU PIEUPSIOS
+ {0xA34D, 0xC97F}, //6042 #HANGUL SYLLABLE CIEUC YU SIOS
+ {0xA34E, 0xC980}, //6043 #HANGUL SYLLABLE CIEUC YU SSANGSIOS
+ {0xA34F, 0xC981}, //6044 #HANGUL SYLLABLE CIEUC YU IEUNG
+ {0xA350, 0xC982}, //6045 #HANGUL SYLLABLE CIEUC YU CIEUC
+ {0xA351, 0xC983}, //6046 #HANGUL SYLLABLE CIEUC YU CHIEUCH
+ {0xA352, 0xC984}, //6047 #HANGUL SYLLABLE CIEUC YU KHIEUKH
+ {0xA353, 0xC985}, //6048 #HANGUL SYLLABLE CIEUC YU THIEUTH
+ {0xA354, 0xC986}, //6049 #HANGUL SYLLABLE CIEUC YU PHIEUPH
+ {0xA355, 0xC987}, //6050 #HANGUL SYLLABLE CIEUC YU HIEUH
+ {0xA356, 0xC98A}, //6051 #HANGUL SYLLABLE CIEUC EU SSANGKIYEOK
+ {0xA357, 0xC98B}, //6052 #HANGUL SYLLABLE CIEUC EU KIYEOKSIOS
+ {0xA358, 0xC98D}, //6053 #HANGUL SYLLABLE CIEUC EU NIEUNCIEUC
+ {0xA359, 0xC98E}, //6054 #HANGUL SYLLABLE CIEUC EU NIEUNHIEUH
+ {0xA35A, 0xC98F}, //6055 #HANGUL SYLLABLE CIEUC EU TIKEUT
+ {0xA361, 0xC991}, //6056 #HANGUL SYLLABLE CIEUC EU RIEULKIYEOK
+ {0xA362, 0xC992}, //6057 #HANGUL SYLLABLE CIEUC EU RIEULMIEUM
+ {0xA363, 0xC993}, //6058 #HANGUL SYLLABLE CIEUC EU RIEULPIEUP
+ {0xA364, 0xC994}, //6059 #HANGUL SYLLABLE CIEUC EU RIEULSIOS
+ {0xA365, 0xC995}, //6060 #HANGUL SYLLABLE CIEUC EU RIEULTHIEUTH
+ {0xA366, 0xC996}, //6061 #HANGUL SYLLABLE CIEUC EU RIEULPHIEUPH
+ {0xA367, 0xC997}, //6062 #HANGUL SYLLABLE CIEUC EU RIEULHIEUH
+ {0xA368, 0xC99A}, //6063 #HANGUL SYLLABLE CIEUC EU PIEUPSIOS
+ {0xA369, 0xC99C}, //6064 #HANGUL SYLLABLE CIEUC EU SSANGSIOS
+ {0xA36A, 0xC99E}, //6065 #HANGUL SYLLABLE CIEUC EU CIEUC
+ {0xA36B, 0xC99F}, //6066 #HANGUL SYLLABLE CIEUC EU CHIEUCH
+ {0xA36C, 0xC9A0}, //6067 #HANGUL SYLLABLE CIEUC EU KHIEUKH
+ {0xA36D, 0xC9A1}, //6068 #HANGUL SYLLABLE CIEUC EU THIEUTH
+ {0xA36E, 0xC9A2}, //6069 #HANGUL SYLLABLE CIEUC EU PHIEUPH
+ {0xA36F, 0xC9A3}, //6070 #HANGUL SYLLABLE CIEUC EU HIEUH
+ {0xA370, 0xC9A4}, //6071 #HANGUL SYLLABLE CIEUC YI
+ {0xA371, 0xC9A5}, //6072 #HANGUL SYLLABLE CIEUC YI KIYEOK
+ {0xA372, 0xC9A6}, //6073 #HANGUL SYLLABLE CIEUC YI SSANGKIYEOK
+ {0xA373, 0xC9A7}, //6074 #HANGUL SYLLABLE CIEUC YI KIYEOKSIOS
+ {0xA374, 0xC9A8}, //6075 #HANGUL SYLLABLE CIEUC YI NIEUN
+ {0xA375, 0xC9A9}, //6076 #HANGUL SYLLABLE CIEUC YI NIEUNCIEUC
+ {0xA376, 0xC9AA}, //6077 #HANGUL SYLLABLE CIEUC YI NIEUNHIEUH
+ {0xA377, 0xC9AB}, //6078 #HANGUL SYLLABLE CIEUC YI TIKEUT
+ {0xA378, 0xC9AC}, //6079 #HANGUL SYLLABLE CIEUC YI RIEUL
+ {0xA379, 0xC9AD}, //6080 #HANGUL SYLLABLE CIEUC YI RIEULKIYEOK
+ {0xA37A, 0xC9AE}, //6081 #HANGUL SYLLABLE CIEUC YI RIEULMIEUM
+ {0xA381, 0xC9AF}, //6082 #HANGUL SYLLABLE CIEUC YI RIEULPIEUP
+ {0xA382, 0xC9B0}, //6083 #HANGUL SYLLABLE CIEUC YI RIEULSIOS
+ {0xA383, 0xC9B1}, //6084 #HANGUL SYLLABLE CIEUC YI RIEULTHIEUTH
+ {0xA384, 0xC9B2}, //6085 #HANGUL SYLLABLE CIEUC YI RIEULPHIEUPH
+ {0xA385, 0xC9B3}, //6086 #HANGUL SYLLABLE CIEUC YI RIEULHIEUH
+ {0xA386, 0xC9B4}, //6087 #HANGUL SYLLABLE CIEUC YI MIEUM
+ {0xA387, 0xC9B5}, //6088 #HANGUL SYLLABLE CIEUC YI PIEUP
+ {0xA388, 0xC9B6}, //6089 #HANGUL SYLLABLE CIEUC YI PIEUPSIOS
+ {0xA389, 0xC9B7}, //6090 #HANGUL SYLLABLE CIEUC YI SIOS
+ {0xA38A, 0xC9B8}, //6091 #HANGUL SYLLABLE CIEUC YI SSANGSIOS
+ {0xA38B, 0xC9B9}, //6092 #HANGUL SYLLABLE CIEUC YI IEUNG
+ {0xA38C, 0xC9BA}, //6093 #HANGUL SYLLABLE CIEUC YI CIEUC
+ {0xA38D, 0xC9BB}, //6094 #HANGUL SYLLABLE CIEUC YI CHIEUCH
+ {0xA38E, 0xC9BC}, //6095 #HANGUL SYLLABLE CIEUC YI KHIEUKH
+ {0xA38F, 0xC9BD}, //6096 #HANGUL SYLLABLE CIEUC YI THIEUTH
+ {0xA390, 0xC9BE}, //6097 #HANGUL SYLLABLE CIEUC YI PHIEUPH
+ {0xA391, 0xC9BF}, //6098 #HANGUL SYLLABLE CIEUC YI HIEUH
+ {0xA392, 0xC9C2}, //6099 #HANGUL SYLLABLE CIEUC I SSANGKIYEOK
+ {0xA393, 0xC9C3}, //6100 #HANGUL SYLLABLE CIEUC I KIYEOKSIOS
+ {0xA394, 0xC9C5}, //6101 #HANGUL SYLLABLE CIEUC I NIEUNCIEUC
+ {0xA395, 0xC9C6}, //6102 #HANGUL SYLLABLE CIEUC I NIEUNHIEUH
+ {0xA396, 0xC9C9}, //6103 #HANGUL SYLLABLE CIEUC I RIEULKIYEOK
+ {0xA397, 0xC9CB}, //6104 #HANGUL SYLLABLE CIEUC I RIEULPIEUP
+ {0xA398, 0xC9CC}, //6105 #HANGUL SYLLABLE CIEUC I RIEULSIOS
+ {0xA399, 0xC9CD}, //6106 #HANGUL SYLLABLE CIEUC I RIEULTHIEUTH
+ {0xA39A, 0xC9CE}, //6107 #HANGUL SYLLABLE CIEUC I RIEULPHIEUPH
+ {0xA39B, 0xC9CF}, //6108 #HANGUL SYLLABLE CIEUC I RIEULHIEUH
+ {0xA39C, 0xC9D2}, //6109 #HANGUL SYLLABLE CIEUC I PIEUPSIOS
+ {0xA39D, 0xC9D4}, //6110 #HANGUL SYLLABLE CIEUC I SSANGSIOS
+ {0xA39E, 0xC9D7}, //6111 #HANGUL SYLLABLE CIEUC I CHIEUCH
+ {0xA39F, 0xC9D8}, //6112 #HANGUL SYLLABLE CIEUC I KHIEUKH
+ {0xA3A0, 0xC9DB}, //6113 #HANGUL SYLLABLE CIEUC I HIEUH
+ {0xA3A1, 0xFF01}, //6114 #FULLWIDTH EXCLAMATION MARK
+ {0xA3A2, 0xFF02}, //6115 #FULLWIDTH QUOTATION MARK
+ {0xA3A3, 0xFF03}, //6116 #FULLWIDTH NUMBER SIGN
+ {0xA3A4, 0xFF04}, //6117 #FULLWIDTH DOLLAR SIGN
+ {0xA3A5, 0xFF05}, //6118 #FULLWIDTH PERCENT SIGN
+ {0xA3A6, 0xFF06}, //6119 #FULLWIDTH AMPERSAND
+ {0xA3A7, 0xFF07}, //6120 #FULLWIDTH APOSTROPHE
+ {0xA3A8, 0xFF08}, //6121 #FULLWIDTH LEFT PARENTHESIS
+ {0xA3A9, 0xFF09}, //6122 #FULLWIDTH RIGHT PARENTHESIS
+ {0xA3AA, 0xFF0A}, //6123 #FULLWIDTH ASTERISK
+ {0xA3AB, 0xFF0B}, //6124 #FULLWIDTH PLUS SIGN
+ {0xA3AC, 0xFF0C}, //6125 #FULLWIDTH COMMA
+ {0xA3AD, 0xFF0D}, //6126 #FULLWIDTH HYPHEN-MINUS
+ {0xA3AE, 0xFF0E}, //6127 #FULLWIDTH FULL STOP
+ {0xA3AF, 0xFF0F}, //6128 #FULLWIDTH SOLIDUS
+ {0xA3B0, 0xFF10}, //6129 #FULLWIDTH DIGIT ZERO
+ {0xA3B1, 0xFF11}, //6130 #FULLWIDTH DIGIT ONE
+ {0xA3B2, 0xFF12}, //6131 #FULLWIDTH DIGIT TWO
+ {0xA3B3, 0xFF13}, //6132 #FULLWIDTH DIGIT THREE
+ {0xA3B4, 0xFF14}, //6133 #FULLWIDTH DIGIT FOUR
+ {0xA3B5, 0xFF15}, //6134 #FULLWIDTH DIGIT FIVE
+ {0xA3B6, 0xFF16}, //6135 #FULLWIDTH DIGIT SIX
+ {0xA3B7, 0xFF17}, //6136 #FULLWIDTH DIGIT SEVEN
+ {0xA3B8, 0xFF18}, //6137 #FULLWIDTH DIGIT EIGHT
+ {0xA3B9, 0xFF19}, //6138 #FULLWIDTH DIGIT NINE
+ {0xA3BA, 0xFF1A}, //6139 #FULLWIDTH COLON
+ {0xA3BB, 0xFF1B}, //6140 #FULLWIDTH SEMICOLON
+ {0xA3BC, 0xFF1C}, //6141 #FULLWIDTH LESS-THAN SIGN
+ {0xA3BD, 0xFF1D}, //6142 #FULLWIDTH EQUALS SIGN
+ {0xA3BE, 0xFF1E}, //6143 #FULLWIDTH GREATER-THAN SIGN
+ {0xA3BF, 0xFF1F}, //6144 #FULLWIDTH QUESTION MARK
+ {0xA3C0, 0xFF20}, //6145 #FULLWIDTH COMMERCIAL AT
+ {0xA3C1, 0xFF21}, //6146 #FULLWIDTH LATIN CAPITAL LETTER A
+ {0xA3C2, 0xFF22}, //6147 #FULLWIDTH LATIN CAPITAL LETTER B
+ {0xA3C3, 0xFF23}, //6148 #FULLWIDTH LATIN CAPITAL LETTER C
+ {0xA3C4, 0xFF24}, //6149 #FULLWIDTH LATIN CAPITAL LETTER D
+ {0xA3C5, 0xFF25}, //6150 #FULLWIDTH LATIN CAPITAL LETTER E
+ {0xA3C6, 0xFF26}, //6151 #FULLWIDTH LATIN CAPITAL LETTER F
+ {0xA3C7, 0xFF27}, //6152 #FULLWIDTH LATIN CAPITAL LETTER G
+ {0xA3C8, 0xFF28}, //6153 #FULLWIDTH LATIN CAPITAL LETTER H
+ {0xA3C9, 0xFF29}, //6154 #FULLWIDTH LATIN CAPITAL LETTER I
+ {0xA3CA, 0xFF2A}, //6155 #FULLWIDTH LATIN CAPITAL LETTER J
+ {0xA3CB, 0xFF2B}, //6156 #FULLWIDTH LATIN CAPITAL LETTER K
+ {0xA3CC, 0xFF2C}, //6157 #FULLWIDTH LATIN CAPITAL LETTER L
+ {0xA3CD, 0xFF2D}, //6158 #FULLWIDTH LATIN CAPITAL LETTER M
+ {0xA3CE, 0xFF2E}, //6159 #FULLWIDTH LATIN CAPITAL LETTER N
+ {0xA3CF, 0xFF2F}, //6160 #FULLWIDTH LATIN CAPITAL LETTER O
+ {0xA3D0, 0xFF30}, //6161 #FULLWIDTH LATIN CAPITAL LETTER P
+ {0xA3D1, 0xFF31}, //6162 #FULLWIDTH LATIN CAPITAL LETTER Q
+ {0xA3D2, 0xFF32}, //6163 #FULLWIDTH LATIN CAPITAL LETTER R
+ {0xA3D3, 0xFF33}, //6164 #FULLWIDTH LATIN CAPITAL LETTER S
+ {0xA3D4, 0xFF34}, //6165 #FULLWIDTH LATIN CAPITAL LETTER T
+ {0xA3D5, 0xFF35}, //6166 #FULLWIDTH LATIN CAPITAL LETTER U
+ {0xA3D6, 0xFF36}, //6167 #FULLWIDTH LATIN CAPITAL LETTER V
+ {0xA3D7, 0xFF37}, //6168 #FULLWIDTH LATIN CAPITAL LETTER W
+ {0xA3D8, 0xFF38}, //6169 #FULLWIDTH LATIN CAPITAL LETTER X
+ {0xA3D9, 0xFF39}, //6170 #FULLWIDTH LATIN CAPITAL LETTER Y
+ {0xA3DA, 0xFF3A}, //6171 #FULLWIDTH LATIN CAPITAL LETTER Z
+ {0xA3DB, 0xFF3B}, //6172 #FULLWIDTH LEFT SQUARE BRACKET
+ {0xA3DC, 0xFFE6}, //6173 #FULLWIDTH WON SIGN
+ {0xA3DD, 0xFF3D}, //6174 #FULLWIDTH RIGHT SQUARE BRACKET
+ {0xA3DE, 0xFF3E}, //6175 #FULLWIDTH CIRCUMFLEX ACCENT
+ {0xA3DF, 0xFF3F}, //6176 #FULLWIDTH LOW LINE
+ {0xA3E0, 0xFF40}, //6177 #FULLWIDTH GRAVE ACCENT
+ {0xA3E1, 0xFF41}, //6178 #FULLWIDTH LATIN SMALL LETTER A
+ {0xA3E2, 0xFF42}, //6179 #FULLWIDTH LATIN SMALL LETTER B
+ {0xA3E3, 0xFF43}, //6180 #FULLWIDTH LATIN SMALL LETTER C
+ {0xA3E4, 0xFF44}, //6181 #FULLWIDTH LATIN SMALL LETTER D
+ {0xA3E5, 0xFF45}, //6182 #FULLWIDTH LATIN SMALL LETTER E
+ {0xA3E6, 0xFF46}, //6183 #FULLWIDTH LATIN SMALL LETTER F
+ {0xA3E7, 0xFF47}, //6184 #FULLWIDTH LATIN SMALL LETTER G
+ {0xA3E8, 0xFF48}, //6185 #FULLWIDTH LATIN SMALL LETTER H
+ {0xA3E9, 0xFF49}, //6186 #FULLWIDTH LATIN SMALL LETTER I
+ {0xA3EA, 0xFF4A}, //6187 #FULLWIDTH LATIN SMALL LETTER J
+ {0xA3EB, 0xFF4B}, //6188 #FULLWIDTH LATIN SMALL LETTER K
+ {0xA3EC, 0xFF4C}, //6189 #FULLWIDTH LATIN SMALL LETTER L
+ {0xA3ED, 0xFF4D}, //6190 #FULLWIDTH LATIN SMALL LETTER M
+ {0xA3EE, 0xFF4E}, //6191 #FULLWIDTH LATIN SMALL LETTER N
+ {0xA3EF, 0xFF4F}, //6192 #FULLWIDTH LATIN SMALL LETTER O
+ {0xA3F0, 0xFF50}, //6193 #FULLWIDTH LATIN SMALL LETTER P
+ {0xA3F1, 0xFF51}, //6194 #FULLWIDTH LATIN SMALL LETTER Q
+ {0xA3F2, 0xFF52}, //6195 #FULLWIDTH LATIN SMALL LETTER R
+ {0xA3F3, 0xFF53}, //6196 #FULLWIDTH LATIN SMALL LETTER S
+ {0xA3F4, 0xFF54}, //6197 #FULLWIDTH LATIN SMALL LETTER T
+ {0xA3F5, 0xFF55}, //6198 #FULLWIDTH LATIN SMALL LETTER U
+ {0xA3F6, 0xFF56}, //6199 #FULLWIDTH LATIN SMALL LETTER V
+ {0xA3F7, 0xFF57}, //6200 #FULLWIDTH LATIN SMALL LETTER W
+ {0xA3F8, 0xFF58}, //6201 #FULLWIDTH LATIN SMALL LETTER X
+ {0xA3F9, 0xFF59}, //6202 #FULLWIDTH LATIN SMALL LETTER Y
+ {0xA3FA, 0xFF5A}, //6203 #FULLWIDTH LATIN SMALL LETTER Z
+ {0xA3FB, 0xFF5B}, //6204 #FULLWIDTH LEFT CURLY BRACKET
+ {0xA3FC, 0xFF5C}, //6205 #FULLWIDTH VERTICAL LINE
+ {0xA3FD, 0xFF5D}, //6206 #FULLWIDTH RIGHT CURLY BRACKET
+ {0xA3FE, 0xFFE3}, //6207 #FULLWIDTH MACRON
+ {0xA441, 0xC9DE}, //6208 #HANGUL SYLLABLE SSANGCIEUC A SSANGKIYEOK
+ {0xA442, 0xC9DF}, //6209 #HANGUL SYLLABLE SSANGCIEUC A KIYEOKSIOS
+ {0xA443, 0xC9E1}, //6210 #HANGUL SYLLABLE SSANGCIEUC A NIEUNCIEUC
+ {0xA444, 0xC9E3}, //6211 #HANGUL SYLLABLE SSANGCIEUC A TIKEUT
+ {0xA445, 0xC9E5}, //6212 #HANGUL SYLLABLE SSANGCIEUC A RIEULKIYEOK
+ {0xA446, 0xC9E6}, //6213 #HANGUL SYLLABLE SSANGCIEUC A RIEULMIEUM
+ {0xA447, 0xC9E8}, //6214 #HANGUL SYLLABLE SSANGCIEUC A RIEULSIOS
+ {0xA448, 0xC9E9}, //6215 #HANGUL SYLLABLE SSANGCIEUC A RIEULTHIEUTH
+ {0xA449, 0xC9EA}, //6216 #HANGUL SYLLABLE SSANGCIEUC A RIEULPHIEUPH
+ {0xA44A, 0xC9EB}, //6217 #HANGUL SYLLABLE SSANGCIEUC A RIEULHIEUH
+ {0xA44B, 0xC9EE}, //6218 #HANGUL SYLLABLE SSANGCIEUC A PIEUPSIOS
+ {0xA44C, 0xC9F2}, //6219 #HANGUL SYLLABLE SSANGCIEUC A CIEUC
+ {0xA44D, 0xC9F3}, //6220 #HANGUL SYLLABLE SSANGCIEUC A CHIEUCH
+ {0xA44E, 0xC9F4}, //6221 #HANGUL SYLLABLE SSANGCIEUC A KHIEUKH
+ {0xA44F, 0xC9F5}, //6222 #HANGUL SYLLABLE SSANGCIEUC A THIEUTH
+ {0xA450, 0xC9F6}, //6223 #HANGUL SYLLABLE SSANGCIEUC A PHIEUPH
+ {0xA451, 0xC9F7}, //6224 #HANGUL SYLLABLE SSANGCIEUC A HIEUH
+ {0xA452, 0xC9FA}, //6225 #HANGUL SYLLABLE SSANGCIEUC AE SSANGKIYEOK
+ {0xA453, 0xC9FB}, //6226 #HANGUL SYLLABLE SSANGCIEUC AE KIYEOKSIOS
+ {0xA454, 0xC9FD}, //6227 #HANGUL SYLLABLE SSANGCIEUC AE NIEUNCIEUC
+ {0xA455, 0xC9FE}, //6228 #HANGUL SYLLABLE SSANGCIEUC AE NIEUNHIEUH
+ {0xA456, 0xC9FF}, //6229 #HANGUL SYLLABLE SSANGCIEUC AE TIKEUT
+ {0xA457, 0xCA01}, //6230 #HANGUL SYLLABLE SSANGCIEUC AE RIEULKIYEOK
+ {0xA458, 0xCA02}, //6231 #HANGUL SYLLABLE SSANGCIEUC AE RIEULMIEUM
+ {0xA459, 0xCA03}, //6232 #HANGUL SYLLABLE SSANGCIEUC AE RIEULPIEUP
+ {0xA45A, 0xCA04}, //6233 #HANGUL SYLLABLE SSANGCIEUC AE RIEULSIOS
+ {0xA461, 0xCA05}, //6234 #HANGUL SYLLABLE SSANGCIEUC AE RIEULTHIEUTH
+ {0xA462, 0xCA06}, //6235 #HANGUL SYLLABLE SSANGCIEUC AE RIEULPHIEUPH
+ {0xA463, 0xCA07}, //6236 #HANGUL SYLLABLE SSANGCIEUC AE RIEULHIEUH
+ {0xA464, 0xCA0A}, //6237 #HANGUL SYLLABLE SSANGCIEUC AE PIEUPSIOS
+ {0xA465, 0xCA0E}, //6238 #HANGUL SYLLABLE SSANGCIEUC AE CIEUC
+ {0xA466, 0xCA0F}, //6239 #HANGUL SYLLABLE SSANGCIEUC AE CHIEUCH
+ {0xA467, 0xCA10}, //6240 #HANGUL SYLLABLE SSANGCIEUC AE KHIEUKH
+ {0xA468, 0xCA11}, //6241 #HANGUL SYLLABLE SSANGCIEUC AE THIEUTH
+ {0xA469, 0xCA12}, //6242 #HANGUL SYLLABLE SSANGCIEUC AE PHIEUPH
+ {0xA46A, 0xCA13}, //6243 #HANGUL SYLLABLE SSANGCIEUC AE HIEUH
+ {0xA46B, 0xCA15}, //6244 #HANGUL SYLLABLE SSANGCIEUC YA KIYEOK
+ {0xA46C, 0xCA16}, //6245 #HANGUL SYLLABLE SSANGCIEUC YA SSANGKIYEOK
+ {0xA46D, 0xCA17}, //6246 #HANGUL SYLLABLE SSANGCIEUC YA KIYEOKSIOS
+ {0xA46E, 0xCA19}, //6247 #HANGUL SYLLABLE SSANGCIEUC YA NIEUNCIEUC
+ {0xA46F, 0xCA1A}, //6248 #HANGUL SYLLABLE SSANGCIEUC YA NIEUNHIEUH
+ {0xA470, 0xCA1B}, //6249 #HANGUL SYLLABLE SSANGCIEUC YA TIKEUT
+ {0xA471, 0xCA1C}, //6250 #HANGUL SYLLABLE SSANGCIEUC YA RIEUL
+ {0xA472, 0xCA1D}, //6251 #HANGUL SYLLABLE SSANGCIEUC YA RIEULKIYEOK
+ {0xA473, 0xCA1E}, //6252 #HANGUL SYLLABLE SSANGCIEUC YA RIEULMIEUM
+ {0xA474, 0xCA1F}, //6253 #HANGUL SYLLABLE SSANGCIEUC YA RIEULPIEUP
+ {0xA475, 0xCA20}, //6254 #HANGUL SYLLABLE SSANGCIEUC YA RIEULSIOS
+ {0xA476, 0xCA21}, //6255 #HANGUL SYLLABLE SSANGCIEUC YA RIEULTHIEUTH
+ {0xA477, 0xCA22}, //6256 #HANGUL SYLLABLE SSANGCIEUC YA RIEULPHIEUPH
+ {0xA478, 0xCA23}, //6257 #HANGUL SYLLABLE SSANGCIEUC YA RIEULHIEUH
+ {0xA479, 0xCA24}, //6258 #HANGUL SYLLABLE SSANGCIEUC YA MIEUM
+ {0xA47A, 0xCA25}, //6259 #HANGUL SYLLABLE SSANGCIEUC YA PIEUP
+ {0xA481, 0xCA26}, //6260 #HANGUL SYLLABLE SSANGCIEUC YA PIEUPSIOS
+ {0xA482, 0xCA27}, //6261 #HANGUL SYLLABLE SSANGCIEUC YA SIOS
+ {0xA483, 0xCA28}, //6262 #HANGUL SYLLABLE SSANGCIEUC YA SSANGSIOS
+ {0xA484, 0xCA2A}, //6263 #HANGUL SYLLABLE SSANGCIEUC YA CIEUC
+ {0xA485, 0xCA2B}, //6264 #HANGUL SYLLABLE SSANGCIEUC YA CHIEUCH
+ {0xA486, 0xCA2C}, //6265 #HANGUL SYLLABLE SSANGCIEUC YA KHIEUKH
+ {0xA487, 0xCA2D}, //6266 #HANGUL SYLLABLE SSANGCIEUC YA THIEUTH
+ {0xA488, 0xCA2E}, //6267 #HANGUL SYLLABLE SSANGCIEUC YA PHIEUPH
+ {0xA489, 0xCA2F}, //6268 #HANGUL SYLLABLE SSANGCIEUC YA HIEUH
+ {0xA48A, 0xCA30}, //6269 #HANGUL SYLLABLE SSANGCIEUC YAE
+ {0xA48B, 0xCA31}, //6270 #HANGUL SYLLABLE SSANGCIEUC YAE KIYEOK
+ {0xA48C, 0xCA32}, //6271 #HANGUL SYLLABLE SSANGCIEUC YAE SSANGKIYEOK
+ {0xA48D, 0xCA33}, //6272 #HANGUL SYLLABLE SSANGCIEUC YAE KIYEOKSIOS
+ {0xA48E, 0xCA34}, //6273 #HANGUL SYLLABLE SSANGCIEUC YAE NIEUN
+ {0xA48F, 0xCA35}, //6274 #HANGUL SYLLABLE SSANGCIEUC YAE NIEUNCIEUC
+ {0xA490, 0xCA36}, //6275 #HANGUL SYLLABLE SSANGCIEUC YAE NIEUNHIEUH
+ {0xA491, 0xCA37}, //6276 #HANGUL SYLLABLE SSANGCIEUC YAE TIKEUT
+ {0xA492, 0xCA38}, //6277 #HANGUL SYLLABLE SSANGCIEUC YAE RIEUL
+ {0xA493, 0xCA39}, //6278 #HANGUL SYLLABLE SSANGCIEUC YAE RIEULKIYEOK
+ {0xA494, 0xCA3A}, //6279 #HANGUL SYLLABLE SSANGCIEUC YAE RIEULMIEUM
+ {0xA495, 0xCA3B}, //6280 #HANGUL SYLLABLE SSANGCIEUC YAE RIEULPIEUP
+ {0xA496, 0xCA3C}, //6281 #HANGUL SYLLABLE SSANGCIEUC YAE RIEULSIOS
+ {0xA497, 0xCA3D}, //6282 #HANGUL SYLLABLE SSANGCIEUC YAE RIEULTHIEUTH
+ {0xA498, 0xCA3E}, //6283 #HANGUL SYLLABLE SSANGCIEUC YAE RIEULPHIEUPH
+ {0xA499, 0xCA3F}, //6284 #HANGUL SYLLABLE SSANGCIEUC YAE RIEULHIEUH
+ {0xA49A, 0xCA40}, //6285 #HANGUL SYLLABLE SSANGCIEUC YAE MIEUM
+ {0xA49B, 0xCA41}, //6286 #HANGUL SYLLABLE SSANGCIEUC YAE PIEUP
+ {0xA49C, 0xCA42}, //6287 #HANGUL SYLLABLE SSANGCIEUC YAE PIEUPSIOS
+ {0xA49D, 0xCA43}, //6288 #HANGUL SYLLABLE SSANGCIEUC YAE SIOS
+ {0xA49E, 0xCA44}, //6289 #HANGUL SYLLABLE SSANGCIEUC YAE SSANGSIOS
+ {0xA49F, 0xCA45}, //6290 #HANGUL SYLLABLE SSANGCIEUC YAE IEUNG
+ {0xA4A0, 0xCA46}, //6291 #HANGUL SYLLABLE SSANGCIEUC YAE CIEUC
+ {0xA4A1, 0x3131}, //6292 #HANGUL LETTER KIYEOK
+ {0xA4A2, 0x3132}, //6293 #HANGUL LETTER SSANGKIYEOK
+ {0xA4A3, 0x3133}, //6294 #HANGUL LETTER KIYEOK-SIOS
+ {0xA4A4, 0x3134}, //6295 #HANGUL LETTER NIEUN
+ {0xA4A5, 0x3135}, //6296 #HANGUL LETTER NIEUN-CIEUC
+ {0xA4A6, 0x3136}, //6297 #HANGUL LETTER NIEUN-HIEUH
+ {0xA4A7, 0x3137}, //6298 #HANGUL LETTER TIKEUT
+ {0xA4A8, 0x3138}, //6299 #HANGUL LETTER SSANGTIKEUT
+ {0xA4A9, 0x3139}, //6300 #HANGUL LETTER RIEUL
+ {0xA4AA, 0x313A}, //6301 #HANGUL LETTER RIEUL-KIYEOK
+ {0xA4AB, 0x313B}, //6302 #HANGUL LETTER RIEUL-MIEUM
+ {0xA4AC, 0x313C}, //6303 #HANGUL LETTER RIEUL-PIEUP
+ {0xA4AD, 0x313D}, //6304 #HANGUL LETTER RIEUL-SIOS
+ {0xA4AE, 0x313E}, //6305 #HANGUL LETTER RIEUL-THIEUTH
+ {0xA4AF, 0x313F}, //6306 #HANGUL LETTER RIEUL-PHIEUPH
+ {0xA4B0, 0x3140}, //6307 #HANGUL LETTER RIEUL-HIEUH
+ {0xA4B1, 0x3141}, //6308 #HANGUL LETTER MIEUM
+ {0xA4B2, 0x3142}, //6309 #HANGUL LETTER PIEUP
+ {0xA4B3, 0x3143}, //6310 #HANGUL LETTER SSANGPIEUP
+ {0xA4B4, 0x3144}, //6311 #HANGUL LETTER PIEUP-SIOS
+ {0xA4B5, 0x3145}, //6312 #HANGUL LETTER SIOS
+ {0xA4B6, 0x3146}, //6313 #HANGUL LETTER SSANGSIOS
+ {0xA4B7, 0x3147}, //6314 #HANGUL LETTER IEUNG
+ {0xA4B8, 0x3148}, //6315 #HANGUL LETTER CIEUC
+ {0xA4B9, 0x3149}, //6316 #HANGUL LETTER SSANGCIEUC
+ {0xA4BA, 0x314A}, //6317 #HANGUL LETTER CHIEUCH
+ {0xA4BB, 0x314B}, //6318 #HANGUL LETTER KHIEUKH
+ {0xA4BC, 0x314C}, //6319 #HANGUL LETTER THIEUTH
+ {0xA4BD, 0x314D}, //6320 #HANGUL LETTER PHIEUPH
+ {0xA4BE, 0x314E}, //6321 #HANGUL LETTER HIEUH
+ {0xA4BF, 0x314F}, //6322 #HANGUL LETTER A
+ {0xA4C0, 0x3150}, //6323 #HANGUL LETTER AE
+ {0xA4C1, 0x3151}, //6324 #HANGUL LETTER YA
+ {0xA4C2, 0x3152}, //6325 #HANGUL LETTER YAE
+ {0xA4C3, 0x3153}, //6326 #HANGUL LETTER EO
+ {0xA4C4, 0x3154}, //6327 #HANGUL LETTER E
+ {0xA4C5, 0x3155}, //6328 #HANGUL LETTER YEO
+ {0xA4C6, 0x3156}, //6329 #HANGUL LETTER YE
+ {0xA4C7, 0x3157}, //6330 #HANGUL LETTER O
+ {0xA4C8, 0x3158}, //6331 #HANGUL LETTER WA
+ {0xA4C9, 0x3159}, //6332 #HANGUL LETTER WAE
+ {0xA4CA, 0x315A}, //6333 #HANGUL LETTER OE
+ {0xA4CB, 0x315B}, //6334 #HANGUL LETTER YO
+ {0xA4CC, 0x315C}, //6335 #HANGUL LETTER U
+ {0xA4CD, 0x315D}, //6336 #HANGUL LETTER WEO
+ {0xA4CE, 0x315E}, //6337 #HANGUL LETTER WE
+ {0xA4CF, 0x315F}, //6338 #HANGUL LETTER WI
+ {0xA4D0, 0x3160}, //6339 #HANGUL LETTER YU
+ {0xA4D1, 0x3161}, //6340 #HANGUL LETTER EU
+ {0xA4D2, 0x3162}, //6341 #HANGUL LETTER YI
+ {0xA4D3, 0x3163}, //6342 #HANGUL LETTER I
+ {0xA4D4, 0x3164}, //6343 #HANGUL FILLER
+ {0xA4D5, 0x3165}, //6344 #HANGUL LETTER SSANGNIEUN
+ {0xA4D6, 0x3166}, //6345 #HANGUL LETTER NIEUN-TIKEUT
+ {0xA4D7, 0x3167}, //6346 #HANGUL LETTER NIEUN-SIOS
+ {0xA4D8, 0x3168}, //6347 #HANGUL LETTER NIEUN-PANSIOS
+ {0xA4D9, 0x3169}, //6348 #HANGUL LETTER RIEUL-KIYEOK-SIOS
+ {0xA4DA, 0x316A}, //6349 #HANGUL LETTER RIEUL-TIKEUT
+ {0xA4DB, 0x316B}, //6350 #HANGUL LETTER RIEUL-PIEUP-SIOS
+ {0xA4DC, 0x316C}, //6351 #HANGUL LETTER RIEUL-PANSIOS
+ {0xA4DD, 0x316D}, //6352 #HANGUL LETTER RIEUL-YEORINHIEUH
+ {0xA4DE, 0x316E}, //6353 #HANGUL LETTER MIEUM-PIEUP
+ {0xA4DF, 0x316F}, //6354 #HANGUL LETTER MIEUM-SIOS
+ {0xA4E0, 0x3170}, //6355 #HANGUL LETTER MIEUM-PANSIOS
+ {0xA4E1, 0x3171}, //6356 #HANGUL LETTER KAPYEOUNMIEUM
+ {0xA4E2, 0x3172}, //6357 #HANGUL LETTER PIEUP-KIYEOK
+ {0xA4E3, 0x3173}, //6358 #HANGUL LETTER PIEUP-TIKEUT
+ {0xA4E4, 0x3174}, //6359 #HANGUL LETTER PIEUP-SIOS-KIYEOK
+ {0xA4E5, 0x3175}, //6360 #HANGUL LETTER PIEUP-SIOS-TIKEUT
+ {0xA4E6, 0x3176}, //6361 #HANGUL LETTER PIEUP-CIEUC
+ {0xA4E7, 0x3177}, //6362 #HANGUL LETTER PIEUP-THIEUTH
+ {0xA4E8, 0x3178}, //6363 #HANGUL LETTER KAPYEOUNPIEUP
+ {0xA4E9, 0x3179}, //6364 #HANGUL LETTER KAPYEOUNSSANGPIEUP
+ {0xA4EA, 0x317A}, //6365 #HANGUL LETTER SIOS-KIYEOK
+ {0xA4EB, 0x317B}, //6366 #HANGUL LETTER SIOS-NIEUN
+ {0xA4EC, 0x317C}, //6367 #HANGUL LETTER SIOS-TIKEUT
+ {0xA4ED, 0x317D}, //6368 #HANGUL LETTER SIOS-PIEUP
+ {0xA4EE, 0x317E}, //6369 #HANGUL LETTER SIOS-CIEUC
+ {0xA4EF, 0x317F}, //6370 #HANGUL LETTER PANSIOS
+ {0xA4F0, 0x3180}, //6371 #HANGUL LETTER SSANGIEUNG
+ {0xA4F1, 0x3181}, //6372 #HANGUL LETTER YESIEUNG
+ {0xA4F2, 0x3182}, //6373 #HANGUL LETTER YESIEUNG-SIOS
+ {0xA4F3, 0x3183}, //6374 #HANGUL LETTER YESIEUNG-PANSIOS
+ {0xA4F4, 0x3184}, //6375 #HANGUL LETTER KAPYEOUNPHIEUPH
+ {0xA4F5, 0x3185}, //6376 #HANGUL LETTER SSANGHIEUH
+ {0xA4F6, 0x3186}, //6377 #HANGUL LETTER YEORINHIEUH
+ {0xA4F7, 0x3187}, //6378 #HANGUL LETTER YO-YA
+ {0xA4F8, 0x3188}, //6379 #HANGUL LETTER YO-YAE
+ {0xA4F9, 0x3189}, //6380 #HANGUL LETTER YO-I
+ {0xA4FA, 0x318A}, //6381 #HANGUL LETTER YU-YEO
+ {0xA4FB, 0x318B}, //6382 #HANGUL LETTER YU-YE
+ {0xA4FC, 0x318C}, //6383 #HANGUL LETTER YU-I
+ {0xA4FD, 0x318D}, //6384 #HANGUL LETTER ARAEA
+ {0xA4FE, 0x318E}, //6385 #HANGUL LETTER ARAEAE
+ {0xA541, 0xCA47}, //6386 #HANGUL SYLLABLE SSANGCIEUC YAE CHIEUCH
+ {0xA542, 0xCA48}, //6387 #HANGUL SYLLABLE SSANGCIEUC YAE KHIEUKH
+ {0xA543, 0xCA49}, //6388 #HANGUL SYLLABLE SSANGCIEUC YAE THIEUTH
+ {0xA544, 0xCA4A}, //6389 #HANGUL SYLLABLE SSANGCIEUC YAE PHIEUPH
+ {0xA545, 0xCA4B}, //6390 #HANGUL SYLLABLE SSANGCIEUC YAE HIEUH
+ {0xA546, 0xCA4E}, //6391 #HANGUL SYLLABLE SSANGCIEUC EO SSANGKIYEOK
+ {0xA547, 0xCA4F}, //6392 #HANGUL SYLLABLE SSANGCIEUC EO KIYEOKSIOS
+ {0xA548, 0xCA51}, //6393 #HANGUL SYLLABLE SSANGCIEUC EO NIEUNCIEUC
+ {0xA549, 0xCA52}, //6394 #HANGUL SYLLABLE SSANGCIEUC EO NIEUNHIEUH
+ {0xA54A, 0xCA53}, //6395 #HANGUL SYLLABLE SSANGCIEUC EO TIKEUT
+ {0xA54B, 0xCA55}, //6396 #HANGUL SYLLABLE SSANGCIEUC EO RIEULKIYEOK
+ {0xA54C, 0xCA56}, //6397 #HANGUL SYLLABLE SSANGCIEUC EO RIEULMIEUM
+ {0xA54D, 0xCA57}, //6398 #HANGUL SYLLABLE SSANGCIEUC EO RIEULPIEUP
+ {0xA54E, 0xCA58}, //6399 #HANGUL SYLLABLE SSANGCIEUC EO RIEULSIOS
+ {0xA54F, 0xCA59}, //6400 #HANGUL SYLLABLE SSANGCIEUC EO RIEULTHIEUTH
+ {0xA550, 0xCA5A}, //6401 #HANGUL SYLLABLE SSANGCIEUC EO RIEULPHIEUPH
+ {0xA551, 0xCA5B}, //6402 #HANGUL SYLLABLE SSANGCIEUC EO RIEULHIEUH
+ {0xA552, 0xCA5E}, //6403 #HANGUL SYLLABLE SSANGCIEUC EO PIEUPSIOS
+ {0xA553, 0xCA62}, //6404 #HANGUL SYLLABLE SSANGCIEUC EO CIEUC
+ {0xA554, 0xCA63}, //6405 #HANGUL SYLLABLE SSANGCIEUC EO CHIEUCH
+ {0xA555, 0xCA64}, //6406 #HANGUL SYLLABLE SSANGCIEUC EO KHIEUKH
+ {0xA556, 0xCA65}, //6407 #HANGUL SYLLABLE SSANGCIEUC EO THIEUTH
+ {0xA557, 0xCA66}, //6408 #HANGUL SYLLABLE SSANGCIEUC EO PHIEUPH
+ {0xA558, 0xCA67}, //6409 #HANGUL SYLLABLE SSANGCIEUC EO HIEUH
+ {0xA559, 0xCA69}, //6410 #HANGUL SYLLABLE SSANGCIEUC E KIYEOK
+ {0xA55A, 0xCA6A}, //6411 #HANGUL SYLLABLE SSANGCIEUC E SSANGKIYEOK
+ {0xA561, 0xCA6B}, //6412 #HANGUL SYLLABLE SSANGCIEUC E KIYEOKSIOS
+ {0xA562, 0xCA6C}, //6413 #HANGUL SYLLABLE SSANGCIEUC E NIEUN
+ {0xA563, 0xCA6D}, //6414 #HANGUL SYLLABLE SSANGCIEUC E NIEUNCIEUC
+ {0xA564, 0xCA6E}, //6415 #HANGUL SYLLABLE SSANGCIEUC E NIEUNHIEUH
+ {0xA565, 0xCA6F}, //6416 #HANGUL SYLLABLE SSANGCIEUC E TIKEUT
+ {0xA566, 0xCA70}, //6417 #HANGUL SYLLABLE SSANGCIEUC E RIEUL
+ {0xA567, 0xCA71}, //6418 #HANGUL SYLLABLE SSANGCIEUC E RIEULKIYEOK
+ {0xA568, 0xCA72}, //6419 #HANGUL SYLLABLE SSANGCIEUC E RIEULMIEUM
+ {0xA569, 0xCA73}, //6420 #HANGUL SYLLABLE SSANGCIEUC E RIEULPIEUP
+ {0xA56A, 0xCA74}, //6421 #HANGUL SYLLABLE SSANGCIEUC E RIEULSIOS
+ {0xA56B, 0xCA75}, //6422 #HANGUL SYLLABLE SSANGCIEUC E RIEULTHIEUTH
+ {0xA56C, 0xCA76}, //6423 #HANGUL SYLLABLE SSANGCIEUC E RIEULPHIEUPH
+ {0xA56D, 0xCA77}, //6424 #HANGUL SYLLABLE SSANGCIEUC E RIEULHIEUH
+ {0xA56E, 0xCA78}, //6425 #HANGUL SYLLABLE SSANGCIEUC E MIEUM
+ {0xA56F, 0xCA79}, //6426 #HANGUL SYLLABLE SSANGCIEUC E PIEUP
+ {0xA570, 0xCA7A}, //6427 #HANGUL SYLLABLE SSANGCIEUC E PIEUPSIOS
+ {0xA571, 0xCA7B}, //6428 #HANGUL SYLLABLE SSANGCIEUC E SIOS
+ {0xA572, 0xCA7C}, //6429 #HANGUL SYLLABLE SSANGCIEUC E SSANGSIOS
+ {0xA573, 0xCA7E}, //6430 #HANGUL SYLLABLE SSANGCIEUC E CIEUC
+ {0xA574, 0xCA7F}, //6431 #HANGUL SYLLABLE SSANGCIEUC E CHIEUCH
+ {0xA575, 0xCA80}, //6432 #HANGUL SYLLABLE SSANGCIEUC E KHIEUKH
+ {0xA576, 0xCA81}, //6433 #HANGUL SYLLABLE SSANGCIEUC E THIEUTH
+ {0xA577, 0xCA82}, //6434 #HANGUL SYLLABLE SSANGCIEUC E PHIEUPH
+ {0xA578, 0xCA83}, //6435 #HANGUL SYLLABLE SSANGCIEUC E HIEUH
+ {0xA579, 0xCA85}, //6436 #HANGUL SYLLABLE SSANGCIEUC YEO KIYEOK
+ {0xA57A, 0xCA86}, //6437 #HANGUL SYLLABLE SSANGCIEUC YEO SSANGKIYEOK
+ {0xA581, 0xCA87}, //6438 #HANGUL SYLLABLE SSANGCIEUC YEO KIYEOKSIOS
+ {0xA582, 0xCA88}, //6439 #HANGUL SYLLABLE SSANGCIEUC YEO NIEUN
+ {0xA583, 0xCA89}, //6440 #HANGUL SYLLABLE SSANGCIEUC YEO NIEUNCIEUC
+ {0xA584, 0xCA8A}, //6441 #HANGUL SYLLABLE SSANGCIEUC YEO NIEUNHIEUH
+ {0xA585, 0xCA8B}, //6442 #HANGUL SYLLABLE SSANGCIEUC YEO TIKEUT
+ {0xA586, 0xCA8C}, //6443 #HANGUL SYLLABLE SSANGCIEUC YEO RIEUL
+ {0xA587, 0xCA8D}, //6444 #HANGUL SYLLABLE SSANGCIEUC YEO RIEULKIYEOK
+ {0xA588, 0xCA8E}, //6445 #HANGUL SYLLABLE SSANGCIEUC YEO RIEULMIEUM
+ {0xA589, 0xCA8F}, //6446 #HANGUL SYLLABLE SSANGCIEUC YEO RIEULPIEUP
+ {0xA58A, 0xCA90}, //6447 #HANGUL SYLLABLE SSANGCIEUC YEO RIEULSIOS
+ {0xA58B, 0xCA91}, //6448 #HANGUL SYLLABLE SSANGCIEUC YEO RIEULTHIEUTH
+ {0xA58C, 0xCA92}, //6449 #HANGUL SYLLABLE SSANGCIEUC YEO RIEULPHIEUPH
+ {0xA58D, 0xCA93}, //6450 #HANGUL SYLLABLE SSANGCIEUC YEO RIEULHIEUH
+ {0xA58E, 0xCA94}, //6451 #HANGUL SYLLABLE SSANGCIEUC YEO MIEUM
+ {0xA58F, 0xCA95}, //6452 #HANGUL SYLLABLE SSANGCIEUC YEO PIEUP
+ {0xA590, 0xCA96}, //6453 #HANGUL SYLLABLE SSANGCIEUC YEO PIEUPSIOS
+ {0xA591, 0xCA97}, //6454 #HANGUL SYLLABLE SSANGCIEUC YEO SIOS
+ {0xA592, 0xCA99}, //6455 #HANGUL SYLLABLE SSANGCIEUC YEO IEUNG
+ {0xA593, 0xCA9A}, //6456 #HANGUL SYLLABLE SSANGCIEUC YEO CIEUC
+ {0xA594, 0xCA9B}, //6457 #HANGUL SYLLABLE SSANGCIEUC YEO CHIEUCH
+ {0xA595, 0xCA9C}, //6458 #HANGUL SYLLABLE SSANGCIEUC YEO KHIEUKH
+ {0xA596, 0xCA9D}, //6459 #HANGUL SYLLABLE SSANGCIEUC YEO THIEUTH
+ {0xA597, 0xCA9E}, //6460 #HANGUL SYLLABLE SSANGCIEUC YEO PHIEUPH
+ {0xA598, 0xCA9F}, //6461 #HANGUL SYLLABLE SSANGCIEUC YEO HIEUH
+ {0xA599, 0xCAA0}, //6462 #HANGUL SYLLABLE SSANGCIEUC YE
+ {0xA59A, 0xCAA1}, //6463 #HANGUL SYLLABLE SSANGCIEUC YE KIYEOK
+ {0xA59B, 0xCAA2}, //6464 #HANGUL SYLLABLE SSANGCIEUC YE SSANGKIYEOK
+ {0xA59C, 0xCAA3}, //6465 #HANGUL SYLLABLE SSANGCIEUC YE KIYEOKSIOS
+ {0xA59D, 0xCAA4}, //6466 #HANGUL SYLLABLE SSANGCIEUC YE NIEUN
+ {0xA59E, 0xCAA5}, //6467 #HANGUL SYLLABLE SSANGCIEUC YE NIEUNCIEUC
+ {0xA59F, 0xCAA6}, //6468 #HANGUL SYLLABLE SSANGCIEUC YE NIEUNHIEUH
+ {0xA5A0, 0xCAA7}, //6469 #HANGUL SYLLABLE SSANGCIEUC YE TIKEUT
+ {0xA5A1, 0x2170}, //6470 #SMALL ROMAN NUMERAL ONE
+ {0xA5A2, 0x2171}, //6471 #SMALL ROMAN NUMERAL TWO
+ {0xA5A3, 0x2172}, //6472 #SMALL ROMAN NUMERAL THREE
+ {0xA5A4, 0x2173}, //6473 #SMALL ROMAN NUMERAL FOUR
+ {0xA5A5, 0x2174}, //6474 #SMALL ROMAN NUMERAL FIVE
+ {0xA5A6, 0x2175}, //6475 #SMALL ROMAN NUMERAL SIX
+ {0xA5A7, 0x2176}, //6476 #SMALL ROMAN NUMERAL SEVEN
+ {0xA5A8, 0x2177}, //6477 #SMALL ROMAN NUMERAL EIGHT
+ {0xA5A9, 0x2178}, //6478 #SMALL ROMAN NUMERAL NINE
+ {0xA5AA, 0x2179}, //6479 #SMALL ROMAN NUMERAL TEN
+ {0xA5B0, 0x2160}, //6480 #ROMAN NUMERAL ONE
+ {0xA5B1, 0x2161}, //6481 #ROMAN NUMERAL TWO
+ {0xA5B2, 0x2162}, //6482 #ROMAN NUMERAL THREE
+ {0xA5B3, 0x2163}, //6483 #ROMAN NUMERAL FOUR
+ {0xA5B4, 0x2164}, //6484 #ROMAN NUMERAL FIVE
+ {0xA5B5, 0x2165}, //6485 #ROMAN NUMERAL SIX
+ {0xA5B6, 0x2166}, //6486 #ROMAN NUMERAL SEVEN
+ {0xA5B7, 0x2167}, //6487 #ROMAN NUMERAL EIGHT
+ {0xA5B8, 0x2168}, //6488 #ROMAN NUMERAL NINE
+ {0xA5B9, 0x2169}, //6489 #ROMAN NUMERAL TEN
+ {0xA5C1, 0x0391}, //6490 #GREEK CAPITAL LETTER ALPHA
+ {0xA5C2, 0x0392}, //6491 #GREEK CAPITAL LETTER BETA
+ {0xA5C3, 0x0393}, //6492 #GREEK CAPITAL LETTER GAMMA
+ {0xA5C4, 0x0394}, //6493 #GREEK CAPITAL LETTER DELTA
+ {0xA5C5, 0x0395}, //6494 #GREEK CAPITAL LETTER EPSILON
+ {0xA5C6, 0x0396}, //6495 #GREEK CAPITAL LETTER ZETA
+ {0xA5C7, 0x0397}, //6496 #GREEK CAPITAL LETTER ETA
+ {0xA5C8, 0x0398}, //6497 #GREEK CAPITAL LETTER THETA
+ {0xA5C9, 0x0399}, //6498 #GREEK CAPITAL LETTER IOTA
+ {0xA5CA, 0x039A}, //6499 #GREEK CAPITAL LETTER KAPPA
+ {0xA5CB, 0x039B}, //6500 #GREEK CAPITAL LETTER LAMDA
+ {0xA5CC, 0x039C}, //6501 #GREEK CAPITAL LETTER MU
+ {0xA5CD, 0x039D}, //6502 #GREEK CAPITAL LETTER NU
+ {0xA5CE, 0x039E}, //6503 #GREEK CAPITAL LETTER XI
+ {0xA5CF, 0x039F}, //6504 #GREEK CAPITAL LETTER OMICRON
+ {0xA5D0, 0x03A0}, //6505 #GREEK CAPITAL LETTER PI
+ {0xA5D1, 0x03A1}, //6506 #GREEK CAPITAL LETTER RHO
+ {0xA5D2, 0x03A3}, //6507 #GREEK CAPITAL LETTER SIGMA
+ {0xA5D3, 0x03A4}, //6508 #GREEK CAPITAL LETTER TAU
+ {0xA5D4, 0x03A5}, //6509 #GREEK CAPITAL LETTER UPSILON
+ {0xA5D5, 0x03A6}, //6510 #GREEK CAPITAL LETTER PHI
+ {0xA5D6, 0x03A7}, //6511 #GREEK CAPITAL LETTER CHI
+ {0xA5D7, 0x03A8}, //6512 #GREEK CAPITAL LETTER PSI
+ {0xA5D8, 0x03A9}, //6513 #GREEK CAPITAL LETTER OMEGA
+ {0xA5E1, 0x03B1}, //6514 #GREEK SMALL LETTER ALPHA
+ {0xA5E2, 0x03B2}, //6515 #GREEK SMALL LETTER BETA
+ {0xA5E3, 0x03B3}, //6516 #GREEK SMALL LETTER GAMMA
+ {0xA5E4, 0x03B4}, //6517 #GREEK SMALL LETTER DELTA
+ {0xA5E5, 0x03B5}, //6518 #GREEK SMALL LETTER EPSILON
+ {0xA5E6, 0x03B6}, //6519 #GREEK SMALL LETTER ZETA
+ {0xA5E7, 0x03B7}, //6520 #GREEK SMALL LETTER ETA
+ {0xA5E8, 0x03B8}, //6521 #GREEK SMALL LETTER THETA
+ {0xA5E9, 0x03B9}, //6522 #GREEK SMALL LETTER IOTA
+ {0xA5EA, 0x03BA}, //6523 #GREEK SMALL LETTER KAPPA
+ {0xA5EB, 0x03BB}, //6524 #GREEK SMALL LETTER LAMDA
+ {0xA5EC, 0x03BC}, //6525 #GREEK SMALL LETTER MU
+ {0xA5ED, 0x03BD}, //6526 #GREEK SMALL LETTER NU
+ {0xA5EE, 0x03BE}, //6527 #GREEK SMALL LETTER XI
+ {0xA5EF, 0x03BF}, //6528 #GREEK SMALL LETTER OMICRON
+ {0xA5F0, 0x03C0}, //6529 #GREEK SMALL LETTER PI
+ {0xA5F1, 0x03C1}, //6530 #GREEK SMALL LETTER RHO
+ {0xA5F2, 0x03C3}, //6531 #GREEK SMALL LETTER SIGMA
+ {0xA5F3, 0x03C4}, //6532 #GREEK SMALL LETTER TAU
+ {0xA5F4, 0x03C5}, //6533 #GREEK SMALL LETTER UPSILON
+ {0xA5F5, 0x03C6}, //6534 #GREEK SMALL LETTER PHI
+ {0xA5F6, 0x03C7}, //6535 #GREEK SMALL LETTER CHI
+ {0xA5F7, 0x03C8}, //6536 #GREEK SMALL LETTER PSI
+ {0xA5F8, 0x03C9}, //6537 #GREEK SMALL LETTER OMEGA
+ {0xA641, 0xCAA8}, //6538 #HANGUL SYLLABLE SSANGCIEUC YE RIEUL
+ {0xA642, 0xCAA9}, //6539 #HANGUL SYLLABLE SSANGCIEUC YE RIEULKIYEOK
+ {0xA643, 0xCAAA}, //6540 #HANGUL SYLLABLE SSANGCIEUC YE RIEULMIEUM
+ {0xA644, 0xCAAB}, //6541 #HANGUL SYLLABLE SSANGCIEUC YE RIEULPIEUP
+ {0xA645, 0xCAAC}, //6542 #HANGUL SYLLABLE SSANGCIEUC YE RIEULSIOS
+ {0xA646, 0xCAAD}, //6543 #HANGUL SYLLABLE SSANGCIEUC YE RIEULTHIEUTH
+ {0xA647, 0xCAAE}, //6544 #HANGUL SYLLABLE SSANGCIEUC YE RIEULPHIEUPH
+ {0xA648, 0xCAAF}, //6545 #HANGUL SYLLABLE SSANGCIEUC YE RIEULHIEUH
+ {0xA649, 0xCAB0}, //6546 #HANGUL SYLLABLE SSANGCIEUC YE MIEUM
+ {0xA64A, 0xCAB1}, //6547 #HANGUL SYLLABLE SSANGCIEUC YE PIEUP
+ {0xA64B, 0xCAB2}, //6548 #HANGUL SYLLABLE SSANGCIEUC YE PIEUPSIOS
+ {0xA64C, 0xCAB3}, //6549 #HANGUL SYLLABLE SSANGCIEUC YE SIOS
+ {0xA64D, 0xCAB4}, //6550 #HANGUL SYLLABLE SSANGCIEUC YE SSANGSIOS
+ {0xA64E, 0xCAB5}, //6551 #HANGUL SYLLABLE SSANGCIEUC YE IEUNG
+ {0xA64F, 0xCAB6}, //6552 #HANGUL SYLLABLE SSANGCIEUC YE CIEUC
+ {0xA650, 0xCAB7}, //6553 #HANGUL SYLLABLE SSANGCIEUC YE CHIEUCH
+ {0xA651, 0xCAB8}, //6554 #HANGUL SYLLABLE SSANGCIEUC YE KHIEUKH
+ {0xA652, 0xCAB9}, //6555 #HANGUL SYLLABLE SSANGCIEUC YE THIEUTH
+ {0xA653, 0xCABA}, //6556 #HANGUL SYLLABLE SSANGCIEUC YE PHIEUPH
+ {0xA654, 0xCABB}, //6557 #HANGUL SYLLABLE SSANGCIEUC YE HIEUH
+ {0xA655, 0xCABE}, //6558 #HANGUL SYLLABLE SSANGCIEUC O SSANGKIYEOK
+ {0xA656, 0xCABF}, //6559 #HANGUL SYLLABLE SSANGCIEUC O KIYEOKSIOS
+ {0xA657, 0xCAC1}, //6560 #HANGUL SYLLABLE SSANGCIEUC O NIEUNCIEUC
+ {0xA658, 0xCAC2}, //6561 #HANGUL SYLLABLE SSANGCIEUC O NIEUNHIEUH
+ {0xA659, 0xCAC3}, //6562 #HANGUL SYLLABLE SSANGCIEUC O TIKEUT
+ {0xA65A, 0xCAC5}, //6563 #HANGUL SYLLABLE SSANGCIEUC O RIEULKIYEOK
+ {0xA661, 0xCAC6}, //6564 #HANGUL SYLLABLE SSANGCIEUC O RIEULMIEUM
+ {0xA662, 0xCAC7}, //6565 #HANGUL SYLLABLE SSANGCIEUC O RIEULPIEUP
+ {0xA663, 0xCAC8}, //6566 #HANGUL SYLLABLE SSANGCIEUC O RIEULSIOS
+ {0xA664, 0xCAC9}, //6567 #HANGUL SYLLABLE SSANGCIEUC O RIEULTHIEUTH
+ {0xA665, 0xCACA}, //6568 #HANGUL SYLLABLE SSANGCIEUC O RIEULPHIEUPH
+ {0xA666, 0xCACB}, //6569 #HANGUL SYLLABLE SSANGCIEUC O RIEULHIEUH
+ {0xA667, 0xCACE}, //6570 #HANGUL SYLLABLE SSANGCIEUC O PIEUPSIOS
+ {0xA668, 0xCAD0}, //6571 #HANGUL SYLLABLE SSANGCIEUC O SSANGSIOS
+ {0xA669, 0xCAD2}, //6572 #HANGUL SYLLABLE SSANGCIEUC O CIEUC
+ {0xA66A, 0xCAD4}, //6573 #HANGUL SYLLABLE SSANGCIEUC O KHIEUKH
+ {0xA66B, 0xCAD5}, //6574 #HANGUL SYLLABLE SSANGCIEUC O THIEUTH
+ {0xA66C, 0xCAD6}, //6575 #HANGUL SYLLABLE SSANGCIEUC O PHIEUPH
+ {0xA66D, 0xCAD7}, //6576 #HANGUL SYLLABLE SSANGCIEUC O HIEUH
+ {0xA66E, 0xCADA}, //6577 #HANGUL SYLLABLE SSANGCIEUC WA SSANGKIYEOK
+ {0xA66F, 0xCADB}, //6578 #HANGUL SYLLABLE SSANGCIEUC WA KIYEOKSIOS
+ {0xA670, 0xCADC}, //6579 #HANGUL SYLLABLE SSANGCIEUC WA NIEUN
+ {0xA671, 0xCADD}, //6580 #HANGUL SYLLABLE SSANGCIEUC WA NIEUNCIEUC
+ {0xA672, 0xCADE}, //6581 #HANGUL SYLLABLE SSANGCIEUC WA NIEUNHIEUH
+ {0xA673, 0xCADF}, //6582 #HANGUL SYLLABLE SSANGCIEUC WA TIKEUT
+ {0xA674, 0xCAE1}, //6583 #HANGUL SYLLABLE SSANGCIEUC WA RIEULKIYEOK
+ {0xA675, 0xCAE2}, //6584 #HANGUL SYLLABLE SSANGCIEUC WA RIEULMIEUM
+ {0xA676, 0xCAE3}, //6585 #HANGUL SYLLABLE SSANGCIEUC WA RIEULPIEUP
+ {0xA677, 0xCAE4}, //6586 #HANGUL SYLLABLE SSANGCIEUC WA RIEULSIOS
+ {0xA678, 0xCAE5}, //6587 #HANGUL SYLLABLE SSANGCIEUC WA RIEULTHIEUTH
+ {0xA679, 0xCAE6}, //6588 #HANGUL SYLLABLE SSANGCIEUC WA RIEULPHIEUPH
+ {0xA67A, 0xCAE7}, //6589 #HANGUL SYLLABLE SSANGCIEUC WA RIEULHIEUH
+ {0xA681, 0xCAE8}, //6590 #HANGUL SYLLABLE SSANGCIEUC WA MIEUM
+ {0xA682, 0xCAE9}, //6591 #HANGUL SYLLABLE SSANGCIEUC WA PIEUP
+ {0xA683, 0xCAEA}, //6592 #HANGUL SYLLABLE SSANGCIEUC WA PIEUPSIOS
+ {0xA684, 0xCAEB}, //6593 #HANGUL SYLLABLE SSANGCIEUC WA SIOS
+ {0xA685, 0xCAED}, //6594 #HANGUL SYLLABLE SSANGCIEUC WA IEUNG
+ {0xA686, 0xCAEE}, //6595 #HANGUL SYLLABLE SSANGCIEUC WA CIEUC
+ {0xA687, 0xCAEF}, //6596 #HANGUL SYLLABLE SSANGCIEUC WA CHIEUCH
+ {0xA688, 0xCAF0}, //6597 #HANGUL SYLLABLE SSANGCIEUC WA KHIEUKH
+ {0xA689, 0xCAF1}, //6598 #HANGUL SYLLABLE SSANGCIEUC WA THIEUTH
+ {0xA68A, 0xCAF2}, //6599 #HANGUL SYLLABLE SSANGCIEUC WA PHIEUPH
+ {0xA68B, 0xCAF3}, //6600 #HANGUL SYLLABLE SSANGCIEUC WA HIEUH
+ {0xA68C, 0xCAF5}, //6601 #HANGUL SYLLABLE SSANGCIEUC WAE KIYEOK
+ {0xA68D, 0xCAF6}, //6602 #HANGUL SYLLABLE SSANGCIEUC WAE SSANGKIYEOK
+ {0xA68E, 0xCAF7}, //6603 #HANGUL SYLLABLE SSANGCIEUC WAE KIYEOKSIOS
+ {0xA68F, 0xCAF8}, //6604 #HANGUL SYLLABLE SSANGCIEUC WAE NIEUN
+ {0xA690, 0xCAF9}, //6605 #HANGUL SYLLABLE SSANGCIEUC WAE NIEUNCIEUC
+ {0xA691, 0xCAFA}, //6606 #HANGUL SYLLABLE SSANGCIEUC WAE NIEUNHIEUH
+ {0xA692, 0xCAFB}, //6607 #HANGUL SYLLABLE SSANGCIEUC WAE TIKEUT
+ {0xA693, 0xCAFC}, //6608 #HANGUL SYLLABLE SSANGCIEUC WAE RIEUL
+ {0xA694, 0xCAFD}, //6609 #HANGUL SYLLABLE SSANGCIEUC WAE RIEULKIYEOK
+ {0xA695, 0xCAFE}, //6610 #HANGUL SYLLABLE SSANGCIEUC WAE RIEULMIEUM
+ {0xA696, 0xCAFF}, //6611 #HANGUL SYLLABLE SSANGCIEUC WAE RIEULPIEUP
+ {0xA697, 0xCB00}, //6612 #HANGUL SYLLABLE SSANGCIEUC WAE RIEULSIOS
+ {0xA698, 0xCB01}, //6613 #HANGUL SYLLABLE SSANGCIEUC WAE RIEULTHIEUTH
+ {0xA699, 0xCB02}, //6614 #HANGUL SYLLABLE SSANGCIEUC WAE RIEULPHIEUPH
+ {0xA69A, 0xCB03}, //6615 #HANGUL SYLLABLE SSANGCIEUC WAE RIEULHIEUH
+ {0xA69B, 0xCB04}, //6616 #HANGUL SYLLABLE SSANGCIEUC WAE MIEUM
+ {0xA69C, 0xCB05}, //6617 #HANGUL SYLLABLE SSANGCIEUC WAE PIEUP
+ {0xA69D, 0xCB06}, //6618 #HANGUL SYLLABLE SSANGCIEUC WAE PIEUPSIOS
+ {0xA69E, 0xCB07}, //6619 #HANGUL SYLLABLE SSANGCIEUC WAE SIOS
+ {0xA69F, 0xCB09}, //6620 #HANGUL SYLLABLE SSANGCIEUC WAE IEUNG
+ {0xA6A0, 0xCB0A}, //6621 #HANGUL SYLLABLE SSANGCIEUC WAE CIEUC
+ {0xA6A1, 0x2500}, //6622 #BOX DRAWINGS LIGHT HORIZONTAL
+ {0xA6A2, 0x2502}, //6623 #BOX DRAWINGS LIGHT VERTICAL
+ {0xA6A3, 0x250C}, //6624 #BOX DRAWINGS LIGHT DOWN AND RIGHT
+ {0xA6A4, 0x2510}, //6625 #BOX DRAWINGS LIGHT DOWN AND LEFT
+ {0xA6A5, 0x2518}, //6626 #BOX DRAWINGS LIGHT UP AND LEFT
+ {0xA6A6, 0x2514}, //6627 #BOX DRAWINGS LIGHT UP AND RIGHT
+ {0xA6A7, 0x251C}, //6628 #BOX DRAWINGS LIGHT VERTICAL AND RIGHT
+ {0xA6A8, 0x252C}, //6629 #BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
+ {0xA6A9, 0x2524}, //6630 #BOX DRAWINGS LIGHT VERTICAL AND LEFT
+ {0xA6AA, 0x2534}, //6631 #BOX DRAWINGS LIGHT UP AND HORIZONTAL
+ {0xA6AB, 0x253C}, //6632 #BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
+ {0xA6AC, 0x2501}, //6633 #BOX DRAWINGS HEAVY HORIZONTAL
+ {0xA6AD, 0x2503}, //6634 #BOX DRAWINGS HEAVY VERTICAL
+ {0xA6AE, 0x250F}, //6635 #BOX DRAWINGS HEAVY DOWN AND RIGHT
+ {0xA6AF, 0x2513}, //6636 #BOX DRAWINGS HEAVY DOWN AND LEFT
+ {0xA6B0, 0x251B}, //6637 #BOX DRAWINGS HEAVY UP AND LEFT
+ {0xA6B1, 0x2517}, //6638 #BOX DRAWINGS HEAVY UP AND RIGHT
+ {0xA6B2, 0x2523}, //6639 #BOX DRAWINGS HEAVY VERTICAL AND RIGHT
+ {0xA6B3, 0x2533}, //6640 #BOX DRAWINGS HEAVY DOWN AND HORIZONTAL
+ {0xA6B4, 0x252B}, //6641 #BOX DRAWINGS HEAVY VERTICAL AND LEFT
+ {0xA6B5, 0x253B}, //6642 #BOX DRAWINGS HEAVY UP AND HORIZONTAL
+ {0xA6B6, 0x254B}, //6643 #BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL
+ {0xA6B7, 0x2520}, //6644 #BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT
+ {0xA6B8, 0x252F}, //6645 #BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY
+ {0xA6B9, 0x2528}, //6646 #BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT
+ {0xA6BA, 0x2537}, //6647 #BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY
+ {0xA6BB, 0x253F}, //6648 #BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY
+ {0xA6BC, 0x251D}, //6649 #BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY
+ {0xA6BD, 0x2530}, //6650 #BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT
+ {0xA6BE, 0x2525}, //6651 #BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY
+ {0xA6BF, 0x2538}, //6652 #BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT
+ {0xA6C0, 0x2542}, //6653 #BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT
+ {0xA6C1, 0x2512}, //6654 #BOX DRAWINGS DOWN HEAVY AND LEFT LIGHT
+ {0xA6C2, 0x2511}, //6655 #BOX DRAWINGS DOWN LIGHT AND LEFT HEAVY
+ {0xA6C3, 0x251A}, //6656 #BOX DRAWINGS UP HEAVY AND LEFT LIGHT
+ {0xA6C4, 0x2519}, //6657 #BOX DRAWINGS UP LIGHT AND LEFT HEAVY
+ {0xA6C5, 0x2516}, //6658 #BOX DRAWINGS UP HEAVY AND RIGHT LIGHT
+ {0xA6C6, 0x2515}, //6659 #BOX DRAWINGS UP LIGHT AND RIGHT HEAVY
+ {0xA6C7, 0x250E}, //6660 #BOX DRAWINGS DOWN HEAVY AND RIGHT LIGHT
+ {0xA6C8, 0x250D}, //6661 #BOX DRAWINGS DOWN LIGHT AND RIGHT HEAVY
+ {0xA6C9, 0x251E}, //6662 #BOX DRAWINGS UP HEAVY AND RIGHT DOWN LIGHT
+ {0xA6CA, 0x251F}, //6663 #BOX DRAWINGS DOWN HEAVY AND RIGHT UP LIGHT
+ {0xA6CB, 0x2521}, //6664 #BOX DRAWINGS DOWN LIGHT AND RIGHT UP HEAVY
+ {0xA6CC, 0x2522}, //6665 #BOX DRAWINGS UP LIGHT AND RIGHT DOWN HEAVY
+ {0xA6CD, 0x2526}, //6666 #BOX DRAWINGS UP HEAVY AND LEFT DOWN LIGHT
+ {0xA6CE, 0x2527}, //6667 #BOX DRAWINGS DOWN HEAVY AND LEFT UP LIGHT
+ {0xA6CF, 0x2529}, //6668 #BOX DRAWINGS DOWN LIGHT AND LEFT UP HEAVY
+ {0xA6D0, 0x252A}, //6669 #BOX DRAWINGS UP LIGHT AND LEFT DOWN HEAVY
+ {0xA6D1, 0x252D}, //6670 #BOX DRAWINGS LEFT HEAVY AND RIGHT DOWN LIGHT
+ {0xA6D2, 0x252E}, //6671 #BOX DRAWINGS RIGHT HEAVY AND LEFT DOWN LIGHT
+ {0xA6D3, 0x2531}, //6672 #BOX DRAWINGS RIGHT LIGHT AND LEFT DOWN HEAVY
+ {0xA6D4, 0x2532}, //6673 #BOX DRAWINGS LEFT LIGHT AND RIGHT DOWN HEAVY
+ {0xA6D5, 0x2535}, //6674 #BOX DRAWINGS LEFT HEAVY AND RIGHT UP LIGHT
+ {0xA6D6, 0x2536}, //6675 #BOX DRAWINGS RIGHT HEAVY AND LEFT UP LIGHT
+ {0xA6D7, 0x2539}, //6676 #BOX DRAWINGS RIGHT LIGHT AND LEFT UP HEAVY
+ {0xA6D8, 0x253A}, //6677 #BOX DRAWINGS LEFT LIGHT AND RIGHT UP HEAVY
+ {0xA6D9, 0x253D}, //6678 #BOX DRAWINGS LEFT HEAVY AND RIGHT VERTICAL LIGHT
+ {0xA6DA, 0x253E}, //6679 #BOX DRAWINGS RIGHT HEAVY AND LEFT VERTICAL LIGHT
+ {0xA6DB, 0x2540}, //6680 #BOX DRAWINGS UP HEAVY AND DOWN HORIZONTAL LIGHT
+ {0xA6DC, 0x2541}, //6681 #BOX DRAWINGS DOWN HEAVY AND UP HORIZONTAL LIGHT
+ {0xA6DD, 0x2543}, //6682 #BOX DRAWINGS LEFT UP HEAVY AND RIGHT DOWN LIGHT
+ {0xA6DE, 0x2544}, //6683 #BOX DRAWINGS RIGHT UP HEAVY AND LEFT DOWN LIGHT
+ {0xA6DF, 0x2545}, //6684 #BOX DRAWINGS LEFT DOWN HEAVY AND RIGHT UP LIGHT
+ {0xA6E0, 0x2546}, //6685 #BOX DRAWINGS RIGHT DOWN HEAVY AND LEFT UP LIGHT
+ {0xA6E1, 0x2547}, //6686 #BOX DRAWINGS DOWN LIGHT AND UP HORIZONTAL HEAVY
+ {0xA6E2, 0x2548}, //6687 #BOX DRAWINGS UP LIGHT AND DOWN HORIZONTAL HEAVY
+ {0xA6E3, 0x2549}, //6688 #BOX DRAWINGS RIGHT LIGHT AND LEFT VERTICAL HEAVY
+ {0xA6E4, 0x254A}, //6689 #BOX DRAWINGS LEFT LIGHT AND RIGHT VERTICAL HEAVY
+ {0xA741, 0xCB0B}, //6690 #HANGUL SYLLABLE SSANGCIEUC WAE CHIEUCH
+ {0xA742, 0xCB0C}, //6691 #HANGUL SYLLABLE SSANGCIEUC WAE KHIEUKH
+ {0xA743, 0xCB0D}, //6692 #HANGUL SYLLABLE SSANGCIEUC WAE THIEUTH
+ {0xA744, 0xCB0E}, //6693 #HANGUL SYLLABLE SSANGCIEUC WAE PHIEUPH
+ {0xA745, 0xCB0F}, //6694 #HANGUL SYLLABLE SSANGCIEUC WAE HIEUH
+ {0xA746, 0xCB11}, //6695 #HANGUL SYLLABLE SSANGCIEUC OE KIYEOK
+ {0xA747, 0xCB12}, //6696 #HANGUL SYLLABLE SSANGCIEUC OE SSANGKIYEOK
+ {0xA748, 0xCB13}, //6697 #HANGUL SYLLABLE SSANGCIEUC OE KIYEOKSIOS
+ {0xA749, 0xCB15}, //6698 #HANGUL SYLLABLE SSANGCIEUC OE NIEUNCIEUC
+ {0xA74A, 0xCB16}, //6699 #HANGUL SYLLABLE SSANGCIEUC OE NIEUNHIEUH
+ {0xA74B, 0xCB17}, //6700 #HANGUL SYLLABLE SSANGCIEUC OE TIKEUT
+ {0xA74C, 0xCB19}, //6701 #HANGUL SYLLABLE SSANGCIEUC OE RIEULKIYEOK
+ {0xA74D, 0xCB1A}, //6702 #HANGUL SYLLABLE SSANGCIEUC OE RIEULMIEUM
+ {0xA74E, 0xCB1B}, //6703 #HANGUL SYLLABLE SSANGCIEUC OE RIEULPIEUP
+ {0xA74F, 0xCB1C}, //6704 #HANGUL SYLLABLE SSANGCIEUC OE RIEULSIOS
+ {0xA750, 0xCB1D}, //6705 #HANGUL SYLLABLE SSANGCIEUC OE RIEULTHIEUTH
+ {0xA751, 0xCB1E}, //6706 #HANGUL SYLLABLE SSANGCIEUC OE RIEULPHIEUPH
+ {0xA752, 0xCB1F}, //6707 #HANGUL SYLLABLE SSANGCIEUC OE RIEULHIEUH
+ {0xA753, 0xCB22}, //6708 #HANGUL SYLLABLE SSANGCIEUC OE PIEUPSIOS
+ {0xA754, 0xCB23}, //6709 #HANGUL SYLLABLE SSANGCIEUC OE SIOS
+ {0xA755, 0xCB24}, //6710 #HANGUL SYLLABLE SSANGCIEUC OE SSANGSIOS
+ {0xA756, 0xCB25}, //6711 #HANGUL SYLLABLE SSANGCIEUC OE IEUNG
+ {0xA757, 0xCB26}, //6712 #HANGUL SYLLABLE SSANGCIEUC OE CIEUC
+ {0xA758, 0xCB27}, //6713 #HANGUL SYLLABLE SSANGCIEUC OE CHIEUCH
+ {0xA759, 0xCB28}, //6714 #HANGUL SYLLABLE SSANGCIEUC OE KHIEUKH
+ {0xA75A, 0xCB29}, //6715 #HANGUL SYLLABLE SSANGCIEUC OE THIEUTH
+ {0xA761, 0xCB2A}, //6716 #HANGUL SYLLABLE SSANGCIEUC OE PHIEUPH
+ {0xA762, 0xCB2B}, //6717 #HANGUL SYLLABLE SSANGCIEUC OE HIEUH
+ {0xA763, 0xCB2C}, //6718 #HANGUL SYLLABLE SSANGCIEUC YO
+ {0xA764, 0xCB2D}, //6719 #HANGUL SYLLABLE SSANGCIEUC YO KIYEOK
+ {0xA765, 0xCB2E}, //6720 #HANGUL SYLLABLE SSANGCIEUC YO SSANGKIYEOK
+ {0xA766, 0xCB2F}, //6721 #HANGUL SYLLABLE SSANGCIEUC YO KIYEOKSIOS
+ {0xA767, 0xCB30}, //6722 #HANGUL SYLLABLE SSANGCIEUC YO NIEUN
+ {0xA768, 0xCB31}, //6723 #HANGUL SYLLABLE SSANGCIEUC YO NIEUNCIEUC
+ {0xA769, 0xCB32}, //6724 #HANGUL SYLLABLE SSANGCIEUC YO NIEUNHIEUH
+ {0xA76A, 0xCB33}, //6725 #HANGUL SYLLABLE SSANGCIEUC YO TIKEUT
+ {0xA76B, 0xCB34}, //6726 #HANGUL SYLLABLE SSANGCIEUC YO RIEUL
+ {0xA76C, 0xCB35}, //6727 #HANGUL SYLLABLE SSANGCIEUC YO RIEULKIYEOK
+ {0xA76D, 0xCB36}, //6728 #HANGUL SYLLABLE SSANGCIEUC YO RIEULMIEUM
+ {0xA76E, 0xCB37}, //6729 #HANGUL SYLLABLE SSANGCIEUC YO RIEULPIEUP
+ {0xA76F, 0xCB38}, //6730 #HANGUL SYLLABLE SSANGCIEUC YO RIEULSIOS
+ {0xA770, 0xCB39}, //6731 #HANGUL SYLLABLE SSANGCIEUC YO RIEULTHIEUTH
+ {0xA771, 0xCB3A}, //6732 #HANGUL SYLLABLE SSANGCIEUC YO RIEULPHIEUPH
+ {0xA772, 0xCB3B}, //6733 #HANGUL SYLLABLE SSANGCIEUC YO RIEULHIEUH
+ {0xA773, 0xCB3C}, //6734 #HANGUL SYLLABLE SSANGCIEUC YO MIEUM
+ {0xA774, 0xCB3D}, //6735 #HANGUL SYLLABLE SSANGCIEUC YO PIEUP
+ {0xA775, 0xCB3E}, //6736 #HANGUL SYLLABLE SSANGCIEUC YO PIEUPSIOS
+ {0xA776, 0xCB3F}, //6737 #HANGUL SYLLABLE SSANGCIEUC YO SIOS
+ {0xA777, 0xCB40}, //6738 #HANGUL SYLLABLE SSANGCIEUC YO SSANGSIOS
+ {0xA778, 0xCB42}, //6739 #HANGUL SYLLABLE SSANGCIEUC YO CIEUC
+ {0xA779, 0xCB43}, //6740 #HANGUL SYLLABLE SSANGCIEUC YO CHIEUCH
+ {0xA77A, 0xCB44}, //6741 #HANGUL SYLLABLE SSANGCIEUC YO KHIEUKH
+ {0xA781, 0xCB45}, //6742 #HANGUL SYLLABLE SSANGCIEUC YO THIEUTH
+ {0xA782, 0xCB46}, //6743 #HANGUL SYLLABLE SSANGCIEUC YO PHIEUPH
+ {0xA783, 0xCB47}, //6744 #HANGUL SYLLABLE SSANGCIEUC YO HIEUH
+ {0xA784, 0xCB4A}, //6745 #HANGUL SYLLABLE SSANGCIEUC U SSANGKIYEOK
+ {0xA785, 0xCB4B}, //6746 #HANGUL SYLLABLE SSANGCIEUC U KIYEOKSIOS
+ {0xA786, 0xCB4D}, //6747 #HANGUL SYLLABLE SSANGCIEUC U NIEUNCIEUC
+ {0xA787, 0xCB4E}, //6748 #HANGUL SYLLABLE SSANGCIEUC U NIEUNHIEUH
+ {0xA788, 0xCB4F}, //6749 #HANGUL SYLLABLE SSANGCIEUC U TIKEUT
+ {0xA789, 0xCB51}, //6750 #HANGUL SYLLABLE SSANGCIEUC U RIEULKIYEOK
+ {0xA78A, 0xCB52}, //6751 #HANGUL SYLLABLE SSANGCIEUC U RIEULMIEUM
+ {0xA78B, 0xCB53}, //6752 #HANGUL SYLLABLE SSANGCIEUC U RIEULPIEUP
+ {0xA78C, 0xCB54}, //6753 #HANGUL SYLLABLE SSANGCIEUC U RIEULSIOS
+ {0xA78D, 0xCB55}, //6754 #HANGUL SYLLABLE SSANGCIEUC U RIEULTHIEUTH
+ {0xA78E, 0xCB56}, //6755 #HANGUL SYLLABLE SSANGCIEUC U RIEULPHIEUPH
+ {0xA78F, 0xCB57}, //6756 #HANGUL SYLLABLE SSANGCIEUC U RIEULHIEUH
+ {0xA790, 0xCB5A}, //6757 #HANGUL SYLLABLE SSANGCIEUC U PIEUPSIOS
+ {0xA791, 0xCB5B}, //6758 #HANGUL SYLLABLE SSANGCIEUC U SIOS
+ {0xA792, 0xCB5C}, //6759 #HANGUL SYLLABLE SSANGCIEUC U SSANGSIOS
+ {0xA793, 0xCB5E}, //6760 #HANGUL SYLLABLE SSANGCIEUC U CIEUC
+ {0xA794, 0xCB5F}, //6761 #HANGUL SYLLABLE SSANGCIEUC U CHIEUCH
+ {0xA795, 0xCB60}, //6762 #HANGUL SYLLABLE SSANGCIEUC U KHIEUKH
+ {0xA796, 0xCB61}, //6763 #HANGUL SYLLABLE SSANGCIEUC U THIEUTH
+ {0xA797, 0xCB62}, //6764 #HANGUL SYLLABLE SSANGCIEUC U PHIEUPH
+ {0xA798, 0xCB63}, //6765 #HANGUL SYLLABLE SSANGCIEUC U HIEUH
+ {0xA799, 0xCB65}, //6766 #HANGUL SYLLABLE SSANGCIEUC WEO KIYEOK
+ {0xA79A, 0xCB66}, //6767 #HANGUL SYLLABLE SSANGCIEUC WEO SSANGKIYEOK
+ {0xA79B, 0xCB67}, //6768 #HANGUL SYLLABLE SSANGCIEUC WEO KIYEOKSIOS
+ {0xA79C, 0xCB68}, //6769 #HANGUL SYLLABLE SSANGCIEUC WEO NIEUN
+ {0xA79D, 0xCB69}, //6770 #HANGUL SYLLABLE SSANGCIEUC WEO NIEUNCIEUC
+ {0xA79E, 0xCB6A}, //6771 #HANGUL SYLLABLE SSANGCIEUC WEO NIEUNHIEUH
+ {0xA79F, 0xCB6B}, //6772 #HANGUL SYLLABLE SSANGCIEUC WEO TIKEUT
+ {0xA7A0, 0xCB6C}, //6773 #HANGUL SYLLABLE SSANGCIEUC WEO RIEUL
+ {0xA7A1, 0x3395}, //6774 #SQUARE MU L
+ {0xA7A2, 0x3396}, //6775 #SQUARE ML
+ {0xA7A3, 0x3397}, //6776 #SQUARE DL
+ {0xA7A4, 0x2113}, //6777 #SCRIPT SMALL L
+ {0xA7A5, 0x3398}, //6778 #SQUARE KL
+ {0xA7A6, 0x33C4}, //6779 #SQUARE CC
+ {0xA7A7, 0x33A3}, //6780 #SQUARE MM CUBED
+ {0xA7A8, 0x33A4}, //6781 #SQUARE CM CUBED
+ {0xA7A9, 0x33A5}, //6782 #SQUARE M CUBED
+ {0xA7AA, 0x33A6}, //6783 #SQUARE KM CUBED
+ {0xA7AB, 0x3399}, //6784 #SQUARE FM
+ {0xA7AC, 0x339A}, //6785 #SQUARE NM
+ {0xA7AD, 0x339B}, //6786 #SQUARE MU M
+ {0xA7AE, 0x339C}, //6787 #SQUARE MM
+ {0xA7AF, 0x339D}, //6788 #SQUARE CM
+ {0xA7B0, 0x339E}, //6789 #SQUARE KM
+ {0xA7B1, 0x339F}, //6790 #SQUARE MM SQUARED
+ {0xA7B2, 0x33A0}, //6791 #SQUARE CM SQUARED
+ {0xA7B3, 0x33A1}, //6792 #SQUARE M SQUARED
+ {0xA7B4, 0x33A2}, //6793 #SQUARE KM SQUARED
+ {0xA7B5, 0x33CA}, //6794 #SQUARE HA
+ {0xA7B6, 0x338D}, //6795 #SQUARE MU G
+ {0xA7B7, 0x338E}, //6796 #SQUARE MG
+ {0xA7B8, 0x338F}, //6797 #SQUARE KG
+ {0xA7B9, 0x33CF}, //6798 #SQUARE KT
+ {0xA7BA, 0x3388}, //6799 #SQUARE CAL
+ {0xA7BB, 0x3389}, //6800 #SQUARE KCAL
+ {0xA7BC, 0x33C8}, //6801 #SQUARE DB
+ {0xA7BD, 0x33A7}, //6802 #SQUARE M OVER S
+ {0xA7BE, 0x33A8}, //6803 #SQUARE M OVER S SQUARED
+ {0xA7BF, 0x33B0}, //6804 #SQUARE PS
+ {0xA7C0, 0x33B1}, //6805 #SQUARE NS
+ {0xA7C1, 0x33B2}, //6806 #SQUARE MU S
+ {0xA7C2, 0x33B3}, //6807 #SQUARE MS
+ {0xA7C3, 0x33B4}, //6808 #SQUARE PV
+ {0xA7C4, 0x33B5}, //6809 #SQUARE NV
+ {0xA7C5, 0x33B6}, //6810 #SQUARE MU V
+ {0xA7C6, 0x33B7}, //6811 #SQUARE MV
+ {0xA7C7, 0x33B8}, //6812 #SQUARE KV
+ {0xA7C8, 0x33B9}, //6813 #SQUARE MV MEGA
+ {0xA7C9, 0x3380}, //6814 #SQUARE PA AMPS
+ {0xA7CA, 0x3381}, //6815 #SQUARE NA
+ {0xA7CB, 0x3382}, //6816 #SQUARE MU A
+ {0xA7CC, 0x3383}, //6817 #SQUARE MA
+ {0xA7CD, 0x3384}, //6818 #SQUARE KA
+ {0xA7CE, 0x33BA}, //6819 #SQUARE PW
+ {0xA7CF, 0x33BB}, //6820 #SQUARE NW
+ {0xA7D0, 0x33BC}, //6821 #SQUARE MU W
+ {0xA7D1, 0x33BD}, //6822 #SQUARE MW
+ {0xA7D2, 0x33BE}, //6823 #SQUARE KW
+ {0xA7D3, 0x33BF}, //6824 #SQUARE MW MEGA
+ {0xA7D4, 0x3390}, //6825 #SQUARE HZ
+ {0xA7D5, 0x3391}, //6826 #SQUARE KHZ
+ {0xA7D6, 0x3392}, //6827 #SQUARE MHZ
+ {0xA7D7, 0x3393}, //6828 #SQUARE GHZ
+ {0xA7D8, 0x3394}, //6829 #SQUARE THZ
+ {0xA7D9, 0x2126}, //6830 #OHM SIGN
+ {0xA7DA, 0x33C0}, //6831 #SQUARE K OHM
+ {0xA7DB, 0x33C1}, //6832 #SQUARE M OHM
+ {0xA7DC, 0x338A}, //6833 #SQUARE PF
+ {0xA7DD, 0x338B}, //6834 #SQUARE NF
+ {0xA7DE, 0x338C}, //6835 #SQUARE MU F
+ {0xA7DF, 0x33D6}, //6836 #SQUARE MOL
+ {0xA7E0, 0x33C5}, //6837 #SQUARE CD
+ {0xA7E1, 0x33AD}, //6838 #SQUARE RAD
+ {0xA7E2, 0x33AE}, //6839 #SQUARE RAD OVER S
+ {0xA7E3, 0x33AF}, //6840 #SQUARE RAD OVER S SQUARED
+ {0xA7E4, 0x33DB}, //6841 #SQUARE SR
+ {0xA7E5, 0x33A9}, //6842 #SQUARE PA
+ {0xA7E6, 0x33AA}, //6843 #SQUARE KPA
+ {0xA7E7, 0x33AB}, //6844 #SQUARE MPA
+ {0xA7E8, 0x33AC}, //6845 #SQUARE GPA
+ {0xA7E9, 0x33DD}, //6846 #SQUARE WB
+ {0xA7EA, 0x33D0}, //6847 #SQUARE LM
+ {0xA7EB, 0x33D3}, //6848 #SQUARE LX
+ {0xA7EC, 0x33C3}, //6849 #SQUARE BQ
+ {0xA7ED, 0x33C9}, //6850 #SQUARE GY
+ {0xA7EE, 0x33DC}, //6851 #SQUARE SV
+ {0xA7EF, 0x33C6}, //6852 #SQUARE C OVER KG
+ {0xA841, 0xCB6D}, //6853 #HANGUL SYLLABLE SSANGCIEUC WEO RIEULKIYEOK
+ {0xA842, 0xCB6E}, //6854 #HANGUL SYLLABLE SSANGCIEUC WEO RIEULMIEUM
+ {0xA843, 0xCB6F}, //6855 #HANGUL SYLLABLE SSANGCIEUC WEO RIEULPIEUP
+ {0xA844, 0xCB70}, //6856 #HANGUL SYLLABLE SSANGCIEUC WEO RIEULSIOS
+ {0xA845, 0xCB71}, //6857 #HANGUL SYLLABLE SSANGCIEUC WEO RIEULTHIEUTH
+ {0xA846, 0xCB72}, //6858 #HANGUL SYLLABLE SSANGCIEUC WEO RIEULPHIEUPH
+ {0xA847, 0xCB73}, //6859 #HANGUL SYLLABLE SSANGCIEUC WEO RIEULHIEUH
+ {0xA848, 0xCB74}, //6860 #HANGUL SYLLABLE SSANGCIEUC WEO MIEUM
+ {0xA849, 0xCB75}, //6861 #HANGUL SYLLABLE SSANGCIEUC WEO PIEUP
+ {0xA84A, 0xCB76}, //6862 #HANGUL SYLLABLE SSANGCIEUC WEO PIEUPSIOS
+ {0xA84B, 0xCB77}, //6863 #HANGUL SYLLABLE SSANGCIEUC WEO SIOS
+ {0xA84C, 0xCB7A}, //6864 #HANGUL SYLLABLE SSANGCIEUC WEO CIEUC
+ {0xA84D, 0xCB7B}, //6865 #HANGUL SYLLABLE SSANGCIEUC WEO CHIEUCH
+ {0xA84E, 0xCB7C}, //6866 #HANGUL SYLLABLE SSANGCIEUC WEO KHIEUKH
+ {0xA84F, 0xCB7D}, //6867 #HANGUL SYLLABLE SSANGCIEUC WEO THIEUTH
+ {0xA850, 0xCB7E}, //6868 #HANGUL SYLLABLE SSANGCIEUC WEO PHIEUPH
+ {0xA851, 0xCB7F}, //6869 #HANGUL SYLLABLE SSANGCIEUC WEO HIEUH
+ {0xA852, 0xCB80}, //6870 #HANGUL SYLLABLE SSANGCIEUC WE
+ {0xA853, 0xCB81}, //6871 #HANGUL SYLLABLE SSANGCIEUC WE KIYEOK
+ {0xA854, 0xCB82}, //6872 #HANGUL SYLLABLE SSANGCIEUC WE SSANGKIYEOK
+ {0xA855, 0xCB83}, //6873 #HANGUL SYLLABLE SSANGCIEUC WE KIYEOKSIOS
+ {0xA856, 0xCB84}, //6874 #HANGUL SYLLABLE SSANGCIEUC WE NIEUN
+ {0xA857, 0xCB85}, //6875 #HANGUL SYLLABLE SSANGCIEUC WE NIEUNCIEUC
+ {0xA858, 0xCB86}, //6876 #HANGUL SYLLABLE SSANGCIEUC WE NIEUNHIEUH
+ {0xA859, 0xCB87}, //6877 #HANGUL SYLLABLE SSANGCIEUC WE TIKEUT
+ {0xA85A, 0xCB88}, //6878 #HANGUL SYLLABLE SSANGCIEUC WE RIEUL
+ {0xA861, 0xCB89}, //6879 #HANGUL SYLLABLE SSANGCIEUC WE RIEULKIYEOK
+ {0xA862, 0xCB8A}, //6880 #HANGUL SYLLABLE SSANGCIEUC WE RIEULMIEUM
+ {0xA863, 0xCB8B}, //6881 #HANGUL SYLLABLE SSANGCIEUC WE RIEULPIEUP
+ {0xA864, 0xCB8C}, //6882 #HANGUL SYLLABLE SSANGCIEUC WE RIEULSIOS
+ {0xA865, 0xCB8D}, //6883 #HANGUL SYLLABLE SSANGCIEUC WE RIEULTHIEUTH
+ {0xA866, 0xCB8E}, //6884 #HANGUL SYLLABLE SSANGCIEUC WE RIEULPHIEUPH
+ {0xA867, 0xCB8F}, //6885 #HANGUL SYLLABLE SSANGCIEUC WE RIEULHIEUH
+ {0xA868, 0xCB90}, //6886 #HANGUL SYLLABLE SSANGCIEUC WE MIEUM
+ {0xA869, 0xCB91}, //6887 #HANGUL SYLLABLE SSANGCIEUC WE PIEUP
+ {0xA86A, 0xCB92}, //6888 #HANGUL SYLLABLE SSANGCIEUC WE PIEUPSIOS
+ {0xA86B, 0xCB93}, //6889 #HANGUL SYLLABLE SSANGCIEUC WE SIOS
+ {0xA86C, 0xCB94}, //6890 #HANGUL SYLLABLE SSANGCIEUC WE SSANGSIOS
+ {0xA86D, 0xCB95}, //6891 #HANGUL SYLLABLE SSANGCIEUC WE IEUNG
+ {0xA86E, 0xCB96}, //6892 #HANGUL SYLLABLE SSANGCIEUC WE CIEUC
+ {0xA86F, 0xCB97}, //6893 #HANGUL SYLLABLE SSANGCIEUC WE CHIEUCH
+ {0xA870, 0xCB98}, //6894 #HANGUL SYLLABLE SSANGCIEUC WE KHIEUKH
+ {0xA871, 0xCB99}, //6895 #HANGUL SYLLABLE SSANGCIEUC WE THIEUTH
+ {0xA872, 0xCB9A}, //6896 #HANGUL SYLLABLE SSANGCIEUC WE PHIEUPH
+ {0xA873, 0xCB9B}, //6897 #HANGUL SYLLABLE SSANGCIEUC WE HIEUH
+ {0xA874, 0xCB9D}, //6898 #HANGUL SYLLABLE SSANGCIEUC WI KIYEOK
+ {0xA875, 0xCB9E}, //6899 #HANGUL SYLLABLE SSANGCIEUC WI SSANGKIYEOK
+ {0xA876, 0xCB9F}, //6900 #HANGUL SYLLABLE SSANGCIEUC WI KIYEOKSIOS
+ {0xA877, 0xCBA0}, //6901 #HANGUL SYLLABLE SSANGCIEUC WI NIEUN
+ {0xA878, 0xCBA1}, //6902 #HANGUL SYLLABLE SSANGCIEUC WI NIEUNCIEUC
+ {0xA879, 0xCBA2}, //6903 #HANGUL SYLLABLE SSANGCIEUC WI NIEUNHIEUH
+ {0xA87A, 0xCBA3}, //6904 #HANGUL SYLLABLE SSANGCIEUC WI TIKEUT
+ {0xA881, 0xCBA4}, //6905 #HANGUL SYLLABLE SSANGCIEUC WI RIEUL
+ {0xA882, 0xCBA5}, //6906 #HANGUL SYLLABLE SSANGCIEUC WI RIEULKIYEOK
+ {0xA883, 0xCBA6}, //6907 #HANGUL SYLLABLE SSANGCIEUC WI RIEULMIEUM
+ {0xA884, 0xCBA7}, //6908 #HANGUL SYLLABLE SSANGCIEUC WI RIEULPIEUP
+ {0xA885, 0xCBA8}, //6909 #HANGUL SYLLABLE SSANGCIEUC WI RIEULSIOS
+ {0xA886, 0xCBA9}, //6910 #HANGUL SYLLABLE SSANGCIEUC WI RIEULTHIEUTH
+ {0xA887, 0xCBAA}, //6911 #HANGUL SYLLABLE SSANGCIEUC WI RIEULPHIEUPH
+ {0xA888, 0xCBAB}, //6912 #HANGUL SYLLABLE SSANGCIEUC WI RIEULHIEUH
+ {0xA889, 0xCBAC}, //6913 #HANGUL SYLLABLE SSANGCIEUC WI MIEUM
+ {0xA88A, 0xCBAD}, //6914 #HANGUL SYLLABLE SSANGCIEUC WI PIEUP
+ {0xA88B, 0xCBAE}, //6915 #HANGUL SYLLABLE SSANGCIEUC WI PIEUPSIOS
+ {0xA88C, 0xCBAF}, //6916 #HANGUL SYLLABLE SSANGCIEUC WI SIOS
+ {0xA88D, 0xCBB0}, //6917 #HANGUL SYLLABLE SSANGCIEUC WI SSANGSIOS
+ {0xA88E, 0xCBB1}, //6918 #HANGUL SYLLABLE SSANGCIEUC WI IEUNG
+ {0xA88F, 0xCBB2}, //6919 #HANGUL SYLLABLE SSANGCIEUC WI CIEUC
+ {0xA890, 0xCBB3}, //6920 #HANGUL SYLLABLE SSANGCIEUC WI CHIEUCH
+ {0xA891, 0xCBB4}, //6921 #HANGUL SYLLABLE SSANGCIEUC WI KHIEUKH
+ {0xA892, 0xCBB5}, //6922 #HANGUL SYLLABLE SSANGCIEUC WI THIEUTH
+ {0xA893, 0xCBB6}, //6923 #HANGUL SYLLABLE SSANGCIEUC WI PHIEUPH
+ {0xA894, 0xCBB7}, //6924 #HANGUL SYLLABLE SSANGCIEUC WI HIEUH
+ {0xA895, 0xCBB9}, //6925 #HANGUL SYLLABLE SSANGCIEUC YU KIYEOK
+ {0xA896, 0xCBBA}, //6926 #HANGUL SYLLABLE SSANGCIEUC YU SSANGKIYEOK
+ {0xA897, 0xCBBB}, //6927 #HANGUL SYLLABLE SSANGCIEUC YU KIYEOKSIOS
+ {0xA898, 0xCBBC}, //6928 #HANGUL SYLLABLE SSANGCIEUC YU NIEUN
+ {0xA899, 0xCBBD}, //6929 #HANGUL SYLLABLE SSANGCIEUC YU NIEUNCIEUC
+ {0xA89A, 0xCBBE}, //6930 #HANGUL SYLLABLE SSANGCIEUC YU NIEUNHIEUH
+ {0xA89B, 0xCBBF}, //6931 #HANGUL SYLLABLE SSANGCIEUC YU TIKEUT
+ {0xA89C, 0xCBC0}, //6932 #HANGUL SYLLABLE SSANGCIEUC YU RIEUL
+ {0xA89D, 0xCBC1}, //6933 #HANGUL SYLLABLE SSANGCIEUC YU RIEULKIYEOK
+ {0xA89E, 0xCBC2}, //6934 #HANGUL SYLLABLE SSANGCIEUC YU RIEULMIEUM
+ {0xA89F, 0xCBC3}, //6935 #HANGUL SYLLABLE SSANGCIEUC YU RIEULPIEUP
+ {0xA8A0, 0xCBC4}, //6936 #HANGUL SYLLABLE SSANGCIEUC YU RIEULSIOS
+ {0xA8A1, 0x00C6}, //6937 #LATIN CAPITAL LETTER AE
+ {0xA8A2, 0x00D0}, //6938 #LATIN CAPITAL LETTER ETH
+ {0xA8A3, 0x00AA}, //6939 #FEMININE ORDINAL INDICATOR
+ {0xA8A4, 0x0126}, //6940 #LATIN CAPITAL LETTER H WITH STROKE
+ {0xA8A6, 0x0132}, //6941 #LATIN CAPITAL LIGATURE IJ
+ {0xA8A8, 0x013F}, //6942 #LATIN CAPITAL LETTER L WITH MIDDLE DOT
+ {0xA8A9, 0x0141}, //6943 #LATIN CAPITAL LETTER L WITH STROKE
+ {0xA8AA, 0x00D8}, //6944 #LATIN CAPITAL LETTER O WITH STROKE
+ {0xA8AB, 0x0152}, //6945 #LATIN CAPITAL LIGATURE OE
+ {0xA8AC, 0x00BA}, //6946 #MASCULINE ORDINAL INDICATOR
+ {0xA8AD, 0x00DE}, //6947 #LATIN CAPITAL LETTER THORN
+ {0xA8AE, 0x0166}, //6948 #LATIN CAPITAL LETTER T WITH STROKE
+ {0xA8AF, 0x014A}, //6949 #LATIN CAPITAL LETTER ENG
+ {0xA8B1, 0x3260}, //6950 #CIRCLED HANGUL KIYEOK
+ {0xA8B2, 0x3261}, //6951 #CIRCLED HANGUL NIEUN
+ {0xA8B3, 0x3262}, //6952 #CIRCLED HANGUL TIKEUT
+ {0xA8B4, 0x3263}, //6953 #CIRCLED HANGUL RIEUL
+ {0xA8B5, 0x3264}, //6954 #CIRCLED HANGUL MIEUM
+ {0xA8B6, 0x3265}, //6955 #CIRCLED HANGUL PIEUP
+ {0xA8B7, 0x3266}, //6956 #CIRCLED HANGUL SIOS
+ {0xA8B8, 0x3267}, //6957 #CIRCLED HANGUL IEUNG
+ {0xA8B9, 0x3268}, //6958 #CIRCLED HANGUL CIEUC
+ {0xA8BA, 0x3269}, //6959 #CIRCLED HANGUL CHIEUCH
+ {0xA8BB, 0x326A}, //6960 #CIRCLED HANGUL KHIEUKH
+ {0xA8BC, 0x326B}, //6961 #CIRCLED HANGUL THIEUTH
+ {0xA8BD, 0x326C}, //6962 #CIRCLED HANGUL PHIEUPH
+ {0xA8BE, 0x326D}, //6963 #CIRCLED HANGUL HIEUH
+ {0xA8BF, 0x326E}, //6964 #CIRCLED HANGUL KIYEOK A
+ {0xA8C0, 0x326F}, //6965 #CIRCLED HANGUL NIEUN A
+ {0xA8C1, 0x3270}, //6966 #CIRCLED HANGUL TIKEUT A
+ {0xA8C2, 0x3271}, //6967 #CIRCLED HANGUL RIEUL A
+ {0xA8C3, 0x3272}, //6968 #CIRCLED HANGUL MIEUM A
+ {0xA8C4, 0x3273}, //6969 #CIRCLED HANGUL PIEUP A
+ {0xA8C5, 0x3274}, //6970 #CIRCLED HANGUL SIOS A
+ {0xA8C6, 0x3275}, //6971 #CIRCLED HANGUL IEUNG A
+ {0xA8C7, 0x3276}, //6972 #CIRCLED HANGUL CIEUC A
+ {0xA8C8, 0x3277}, //6973 #CIRCLED HANGUL CHIEUCH A
+ {0xA8C9, 0x3278}, //6974 #CIRCLED HANGUL KHIEUKH A
+ {0xA8CA, 0x3279}, //6975 #CIRCLED HANGUL THIEUTH A
+ {0xA8CB, 0x327A}, //6976 #CIRCLED HANGUL PHIEUPH A
+ {0xA8CC, 0x327B}, //6977 #CIRCLED HANGUL HIEUH A
+ {0xA8CD, 0x24D0}, //6978 #CIRCLED LATIN SMALL LETTER A
+ {0xA8CE, 0x24D1}, //6979 #CIRCLED LATIN SMALL LETTER B
+ {0xA8CF, 0x24D2}, //6980 #CIRCLED LATIN SMALL LETTER C
+ {0xA8D0, 0x24D3}, //6981 #CIRCLED LATIN SMALL LETTER D
+ {0xA8D1, 0x24D4}, //6982 #CIRCLED LATIN SMALL LETTER E
+ {0xA8D2, 0x24D5}, //6983 #CIRCLED LATIN SMALL LETTER F
+ {0xA8D3, 0x24D6}, //6984 #CIRCLED LATIN SMALL LETTER G
+ {0xA8D4, 0x24D7}, //6985 #CIRCLED LATIN SMALL LETTER H
+ {0xA8D5, 0x24D8}, //6986 #CIRCLED LATIN SMALL LETTER I
+ {0xA8D6, 0x24D9}, //6987 #CIRCLED LATIN SMALL LETTER J
+ {0xA8D7, 0x24DA}, //6988 #CIRCLED LATIN SMALL LETTER K
+ {0xA8D8, 0x24DB}, //6989 #CIRCLED LATIN SMALL LETTER L
+ {0xA8D9, 0x24DC}, //6990 #CIRCLED LATIN SMALL LETTER M
+ {0xA8DA, 0x24DD}, //6991 #CIRCLED LATIN SMALL LETTER N
+ {0xA8DB, 0x24DE}, //6992 #CIRCLED LATIN SMALL LETTER O
+ {0xA8DC, 0x24DF}, //6993 #CIRCLED LATIN SMALL LETTER P
+ {0xA8DD, 0x24E0}, //6994 #CIRCLED LATIN SMALL LETTER Q
+ {0xA8DE, 0x24E1}, //6995 #CIRCLED LATIN SMALL LETTER R
+ {0xA8DF, 0x24E2}, //6996 #CIRCLED LATIN SMALL LETTER S
+ {0xA8E0, 0x24E3}, //6997 #CIRCLED LATIN SMALL LETTER T
+ {0xA8E1, 0x24E4}, //6998 #CIRCLED LATIN SMALL LETTER U
+ {0xA8E2, 0x24E5}, //6999 #CIRCLED LATIN SMALL LETTER V
+ {0xA8E3, 0x24E6}, //7000 #CIRCLED LATIN SMALL LETTER W
+ {0xA8E4, 0x24E7}, //7001 #CIRCLED LATIN SMALL LETTER X
+ {0xA8E5, 0x24E8}, //7002 #CIRCLED LATIN SMALL LETTER Y
+ {0xA8E6, 0x24E9}, //7003 #CIRCLED LATIN SMALL LETTER Z
+ {0xA8E7, 0x2460}, //7004 #CIRCLED DIGIT ONE
+ {0xA8E8, 0x2461}, //7005 #CIRCLED DIGIT TWO
+ {0xA8E9, 0x2462}, //7006 #CIRCLED DIGIT THREE
+ {0xA8EA, 0x2463}, //7007 #CIRCLED DIGIT FOUR
+ {0xA8EB, 0x2464}, //7008 #CIRCLED DIGIT FIVE
+ {0xA8EC, 0x2465}, //7009 #CIRCLED DIGIT SIX
+ {0xA8ED, 0x2466}, //7010 #CIRCLED DIGIT SEVEN
+ {0xA8EE, 0x2467}, //7011 #CIRCLED DIGIT EIGHT
+ {0xA8EF, 0x2468}, //7012 #CIRCLED DIGIT NINE
+ {0xA8F0, 0x2469}, //7013 #CIRCLED NUMBER TEN
+ {0xA8F1, 0x246A}, //7014 #CIRCLED NUMBER ELEVEN
+ {0xA8F2, 0x246B}, //7015 #CIRCLED NUMBER TWELVE
+ {0xA8F3, 0x246C}, //7016 #CIRCLED NUMBER THIRTEEN
+ {0xA8F4, 0x246D}, //7017 #CIRCLED NUMBER FOURTEEN
+ {0xA8F5, 0x246E}, //7018 #CIRCLED NUMBER FIFTEEN
+ {0xA8F6, 0x00BD}, //7019 #VULGAR FRACTION ONE HALF
+ {0xA8F7, 0x2153}, //7020 #VULGAR FRACTION ONE THIRD
+ {0xA8F8, 0x2154}, //7021 #VULGAR FRACTION TWO THIRDS
+ {0xA8F9, 0x00BC}, //7022 #VULGAR FRACTION ONE QUARTER
+ {0xA8FA, 0x00BE}, //7023 #VULGAR FRACTION THREE QUARTERS
+ {0xA8FB, 0x215B}, //7024 #VULGAR FRACTION ONE EIGHTH
+ {0xA8FC, 0x215C}, //7025 #VULGAR FRACTION THREE EIGHTHS
+ {0xA8FD, 0x215D}, //7026 #VULGAR FRACTION FIVE EIGHTHS
+ {0xA8FE, 0x215E}, //7027 #VULGAR FRACTION SEVEN EIGHTHS
+ {0xA941, 0xCBC5}, //7028 #HANGUL SYLLABLE SSANGCIEUC YU RIEULTHIEUTH
+ {0xA942, 0xCBC6}, //7029 #HANGUL SYLLABLE SSANGCIEUC YU RIEULPHIEUPH
+ {0xA943, 0xCBC7}, //7030 #HANGUL SYLLABLE SSANGCIEUC YU RIEULHIEUH
+ {0xA944, 0xCBC8}, //7031 #HANGUL SYLLABLE SSANGCIEUC YU MIEUM
+ {0xA945, 0xCBC9}, //7032 #HANGUL SYLLABLE SSANGCIEUC YU PIEUP
+ {0xA946, 0xCBCA}, //7033 #HANGUL SYLLABLE SSANGCIEUC YU PIEUPSIOS
+ {0xA947, 0xCBCB}, //7034 #HANGUL SYLLABLE SSANGCIEUC YU SIOS
+ {0xA948, 0xCBCC}, //7035 #HANGUL SYLLABLE SSANGCIEUC YU SSANGSIOS
+ {0xA949, 0xCBCD}, //7036 #HANGUL SYLLABLE SSANGCIEUC YU IEUNG
+ {0xA94A, 0xCBCE}, //7037 #HANGUL SYLLABLE SSANGCIEUC YU CIEUC
+ {0xA94B, 0xCBCF}, //7038 #HANGUL SYLLABLE SSANGCIEUC YU CHIEUCH
+ {0xA94C, 0xCBD0}, //7039 #HANGUL SYLLABLE SSANGCIEUC YU KHIEUKH
+ {0xA94D, 0xCBD1}, //7040 #HANGUL SYLLABLE SSANGCIEUC YU THIEUTH
+ {0xA94E, 0xCBD2}, //7041 #HANGUL SYLLABLE SSANGCIEUC YU PHIEUPH
+ {0xA94F, 0xCBD3}, //7042 #HANGUL SYLLABLE SSANGCIEUC YU HIEUH
+ {0xA950, 0xCBD5}, //7043 #HANGUL SYLLABLE SSANGCIEUC EU KIYEOK
+ {0xA951, 0xCBD6}, //7044 #HANGUL SYLLABLE SSANGCIEUC EU SSANGKIYEOK
+ {0xA952, 0xCBD7}, //7045 #HANGUL SYLLABLE SSANGCIEUC EU KIYEOKSIOS
+ {0xA953, 0xCBD8}, //7046 #HANGUL SYLLABLE SSANGCIEUC EU NIEUN
+ {0xA954, 0xCBD9}, //7047 #HANGUL SYLLABLE SSANGCIEUC EU NIEUNCIEUC
+ {0xA955, 0xCBDA}, //7048 #HANGUL SYLLABLE SSANGCIEUC EU NIEUNHIEUH
+ {0xA956, 0xCBDB}, //7049 #HANGUL SYLLABLE SSANGCIEUC EU TIKEUT
+ {0xA957, 0xCBDC}, //7050 #HANGUL SYLLABLE SSANGCIEUC EU RIEUL
+ {0xA958, 0xCBDD}, //7051 #HANGUL SYLLABLE SSANGCIEUC EU RIEULKIYEOK
+ {0xA959, 0xCBDE}, //7052 #HANGUL SYLLABLE SSANGCIEUC EU RIEULMIEUM
+ {0xA95A, 0xCBDF}, //7053 #HANGUL SYLLABLE SSANGCIEUC EU RIEULPIEUP
+ {0xA961, 0xCBE0}, //7054 #HANGUL SYLLABLE SSANGCIEUC EU RIEULSIOS
+ {0xA962, 0xCBE1}, //7055 #HANGUL SYLLABLE SSANGCIEUC EU RIEULTHIEUTH
+ {0xA963, 0xCBE2}, //7056 #HANGUL SYLLABLE SSANGCIEUC EU RIEULPHIEUPH
+ {0xA964, 0xCBE3}, //7057 #HANGUL SYLLABLE SSANGCIEUC EU RIEULHIEUH
+ {0xA965, 0xCBE5}, //7058 #HANGUL SYLLABLE SSANGCIEUC EU PIEUP
+ {0xA966, 0xCBE6}, //7059 #HANGUL SYLLABLE SSANGCIEUC EU PIEUPSIOS
+ {0xA967, 0xCBE8}, //7060 #HANGUL SYLLABLE SSANGCIEUC EU SSANGSIOS
+ {0xA968, 0xCBEA}, //7061 #HANGUL SYLLABLE SSANGCIEUC EU CIEUC
+ {0xA969, 0xCBEB}, //7062 #HANGUL SYLLABLE SSANGCIEUC EU CHIEUCH
+ {0xA96A, 0xCBEC}, //7063 #HANGUL SYLLABLE SSANGCIEUC EU KHIEUKH
+ {0xA96B, 0xCBED}, //7064 #HANGUL SYLLABLE SSANGCIEUC EU THIEUTH
+ {0xA96C, 0xCBEE}, //7065 #HANGUL SYLLABLE SSANGCIEUC EU PHIEUPH
+ {0xA96D, 0xCBEF}, //7066 #HANGUL SYLLABLE SSANGCIEUC EU HIEUH
+ {0xA96E, 0xCBF0}, //7067 #HANGUL SYLLABLE SSANGCIEUC YI
+ {0xA96F, 0xCBF1}, //7068 #HANGUL SYLLABLE SSANGCIEUC YI KIYEOK
+ {0xA970, 0xCBF2}, //7069 #HANGUL SYLLABLE SSANGCIEUC YI SSANGKIYEOK
+ {0xA971, 0xCBF3}, //7070 #HANGUL SYLLABLE SSANGCIEUC YI KIYEOKSIOS
+ {0xA972, 0xCBF4}, //7071 #HANGUL SYLLABLE SSANGCIEUC YI NIEUN
+ {0xA973, 0xCBF5}, //7072 #HANGUL SYLLABLE SSANGCIEUC YI NIEUNCIEUC
+ {0xA974, 0xCBF6}, //7073 #HANGUL SYLLABLE SSANGCIEUC YI NIEUNHIEUH
+ {0xA975, 0xCBF7}, //7074 #HANGUL SYLLABLE SSANGCIEUC YI TIKEUT
+ {0xA976, 0xCBF8}, //7075 #HANGUL SYLLABLE SSANGCIEUC YI RIEUL
+ {0xA977, 0xCBF9}, //7076 #HANGUL SYLLABLE SSANGCIEUC YI RIEULKIYEOK
+ {0xA978, 0xCBFA}, //7077 #HANGUL SYLLABLE SSANGCIEUC YI RIEULMIEUM
+ {0xA979, 0xCBFB}, //7078 #HANGUL SYLLABLE SSANGCIEUC YI RIEULPIEUP
+ {0xA97A, 0xCBFC}, //7079 #HANGUL SYLLABLE SSANGCIEUC YI RIEULSIOS
+ {0xA981, 0xCBFD}, //7080 #HANGUL SYLLABLE SSANGCIEUC YI RIEULTHIEUTH
+ {0xA982, 0xCBFE}, //7081 #HANGUL SYLLABLE SSANGCIEUC YI RIEULPHIEUPH
+ {0xA983, 0xCBFF}, //7082 #HANGUL SYLLABLE SSANGCIEUC YI RIEULHIEUH
+ {0xA984, 0xCC00}, //7083 #HANGUL SYLLABLE SSANGCIEUC YI MIEUM
+ {0xA985, 0xCC01}, //7084 #HANGUL SYLLABLE SSANGCIEUC YI PIEUP
+ {0xA986, 0xCC02}, //7085 #HANGUL SYLLABLE SSANGCIEUC YI PIEUPSIOS
+ {0xA987, 0xCC03}, //7086 #HANGUL SYLLABLE SSANGCIEUC YI SIOS
+ {0xA988, 0xCC04}, //7087 #HANGUL SYLLABLE SSANGCIEUC YI SSANGSIOS
+ {0xA989, 0xCC05}, //7088 #HANGUL SYLLABLE SSANGCIEUC YI IEUNG
+ {0xA98A, 0xCC06}, //7089 #HANGUL SYLLABLE SSANGCIEUC YI CIEUC
+ {0xA98B, 0xCC07}, //7090 #HANGUL SYLLABLE SSANGCIEUC YI CHIEUCH
+ {0xA98C, 0xCC08}, //7091 #HANGUL SYLLABLE SSANGCIEUC YI KHIEUKH
+ {0xA98D, 0xCC09}, //7092 #HANGUL SYLLABLE SSANGCIEUC YI THIEUTH
+ {0xA98E, 0xCC0A}, //7093 #HANGUL SYLLABLE SSANGCIEUC YI PHIEUPH
+ {0xA98F, 0xCC0B}, //7094 #HANGUL SYLLABLE SSANGCIEUC YI HIEUH
+ {0xA990, 0xCC0E}, //7095 #HANGUL SYLLABLE SSANGCIEUC I SSANGKIYEOK
+ {0xA991, 0xCC0F}, //7096 #HANGUL SYLLABLE SSANGCIEUC I KIYEOKSIOS
+ {0xA992, 0xCC11}, //7097 #HANGUL SYLLABLE SSANGCIEUC I NIEUNCIEUC
+ {0xA993, 0xCC12}, //7098 #HANGUL SYLLABLE SSANGCIEUC I NIEUNHIEUH
+ {0xA994, 0xCC13}, //7099 #HANGUL SYLLABLE SSANGCIEUC I TIKEUT
+ {0xA995, 0xCC15}, //7100 #HANGUL SYLLABLE SSANGCIEUC I RIEULKIYEOK
+ {0xA996, 0xCC16}, //7101 #HANGUL SYLLABLE SSANGCIEUC I RIEULMIEUM
+ {0xA997, 0xCC17}, //7102 #HANGUL SYLLABLE SSANGCIEUC I RIEULPIEUP
+ {0xA998, 0xCC18}, //7103 #HANGUL SYLLABLE SSANGCIEUC I RIEULSIOS
+ {0xA999, 0xCC19}, //7104 #HANGUL SYLLABLE SSANGCIEUC I RIEULTHIEUTH
+ {0xA99A, 0xCC1A}, //7105 #HANGUL SYLLABLE SSANGCIEUC I RIEULPHIEUPH
+ {0xA99B, 0xCC1B}, //7106 #HANGUL SYLLABLE SSANGCIEUC I RIEULHIEUH
+ {0xA99C, 0xCC1E}, //7107 #HANGUL SYLLABLE SSANGCIEUC I PIEUPSIOS
+ {0xA99D, 0xCC1F}, //7108 #HANGUL SYLLABLE SSANGCIEUC I SIOS
+ {0xA99E, 0xCC20}, //7109 #HANGUL SYLLABLE SSANGCIEUC I SSANGSIOS
+ {0xA99F, 0xCC23}, //7110 #HANGUL SYLLABLE SSANGCIEUC I CHIEUCH
+ {0xA9A0, 0xCC24}, //7111 #HANGUL SYLLABLE SSANGCIEUC I KHIEUKH
+ {0xA9A1, 0x00E6}, //7112 #LATIN SMALL LETTER AE
+ {0xA9A2, 0x0111}, //7113 #LATIN SMALL LETTER D WITH STROKE
+ {0xA9A3, 0x00F0}, //7114 #LATIN SMALL LETTER ETH
+ {0xA9A4, 0x0127}, //7115 #LATIN SMALL LETTER H WITH STROKE
+ {0xA9A5, 0x0131}, //7116 #LATIN SMALL LETTER DOTLESS I
+ {0xA9A6, 0x0133}, //7117 #LATIN SMALL LIGATURE IJ
+ {0xA9A7, 0x0138}, //7118 #LATIN SMALL LETTER KRA
+ {0xA9A8, 0x0140}, //7119 #LATIN SMALL LETTER L WITH MIDDLE DOT
+ {0xA9A9, 0x0142}, //7120 #LATIN SMALL LETTER L WITH STROKE
+ {0xA9AA, 0x00F8}, //7121 #LATIN SMALL LETTER O WITH STROKE
+ {0xA9AB, 0x0153}, //7122 #LATIN SMALL LIGATURE OE
+ {0xA9AC, 0x00DF}, //7123 #LATIN SMALL LETTER SHARP S
+ {0xA9AD, 0x00FE}, //7124 #LATIN SMALL LETTER THORN
+ {0xA9AE, 0x0167}, //7125 #LATIN SMALL LETTER T WITH STROKE
+ {0xA9AF, 0x014B}, //7126 #LATIN SMALL LETTER ENG
+ {0xA9B0, 0x0149}, //7127 #LATIN SMALL LETTER N PRECEDED BY APOSTROPHE
+ {0xA9B1, 0x3200}, //7128 #PARENTHESIZED HANGUL KIYEOK
+ {0xA9B2, 0x3201}, //7129 #PARENTHESIZED HANGUL NIEUN
+ {0xA9B3, 0x3202}, //7130 #PARENTHESIZED HANGUL TIKEUT
+ {0xA9B4, 0x3203}, //7131 #PARENTHESIZED HANGUL RIEUL
+ {0xA9B5, 0x3204}, //7132 #PARENTHESIZED HANGUL MIEUM
+ {0xA9B6, 0x3205}, //7133 #PARENTHESIZED HANGUL PIEUP
+ {0xA9B7, 0x3206}, //7134 #PARENTHESIZED HANGUL SIOS
+ {0xA9B8, 0x3207}, //7135 #PARENTHESIZED HANGUL IEUNG
+ {0xA9B9, 0x3208}, //7136 #PARENTHESIZED HANGUL CIEUC
+ {0xA9BA, 0x3209}, //7137 #PARENTHESIZED HANGUL CHIEUCH
+ {0xA9BB, 0x320A}, //7138 #PARENTHESIZED HANGUL KHIEUKH
+ {0xA9BC, 0x320B}, //7139 #PARENTHESIZED HANGUL THIEUTH
+ {0xA9BD, 0x320C}, //7140 #PARENTHESIZED HANGUL PHIEUPH
+ {0xA9BE, 0x320D}, //7141 #PARENTHESIZED HANGUL HIEUH
+ {0xA9BF, 0x320E}, //7142 #PARENTHESIZED HANGUL KIYEOK A
+ {0xA9C0, 0x320F}, //7143 #PARENTHESIZED HANGUL NIEUN A
+ {0xA9C1, 0x3210}, //7144 #PARENTHESIZED HANGUL TIKEUT A
+ {0xA9C2, 0x3211}, //7145 #PARENTHESIZED HANGUL RIEUL A
+ {0xA9C3, 0x3212}, //7146 #PARENTHESIZED HANGUL MIEUM A
+ {0xA9C4, 0x3213}, //7147 #PARENTHESIZED HANGUL PIEUP A
+ {0xA9C5, 0x3214}, //7148 #PARENTHESIZED HANGUL SIOS A
+ {0xA9C6, 0x3215}, //7149 #PARENTHESIZED HANGUL IEUNG A
+ {0xA9C7, 0x3216}, //7150 #PARENTHESIZED HANGUL CIEUC A
+ {0xA9C8, 0x3217}, //7151 #PARENTHESIZED HANGUL CHIEUCH A
+ {0xA9C9, 0x3218}, //7152 #PARENTHESIZED HANGUL KHIEUKH A
+ {0xA9CA, 0x3219}, //7153 #PARENTHESIZED HANGUL THIEUTH A
+ {0xA9CB, 0x321A}, //7154 #PARENTHESIZED HANGUL PHIEUPH A
+ {0xA9CC, 0x321B}, //7155 #PARENTHESIZED HANGUL HIEUH A
+ {0xA9CD, 0x249C}, //7156 #PARENTHESIZED LATIN SMALL LETTER A
+ {0xA9CE, 0x249D}, //7157 #PARENTHESIZED LATIN SMALL LETTER B
+ {0xA9CF, 0x249E}, //7158 #PARENTHESIZED LATIN SMALL LETTER C
+ {0xA9D0, 0x249F}, //7159 #PARENTHESIZED LATIN SMALL LETTER D
+ {0xA9D1, 0x24A0}, //7160 #PARENTHESIZED LATIN SMALL LETTER E
+ {0xA9D2, 0x24A1}, //7161 #PARENTHESIZED LATIN SMALL LETTER F
+ {0xA9D3, 0x24A2}, //7162 #PARENTHESIZED LATIN SMALL LETTER G
+ {0xA9D4, 0x24A3}, //7163 #PARENTHESIZED LATIN SMALL LETTER H
+ {0xA9D5, 0x24A4}, //7164 #PARENTHESIZED LATIN SMALL LETTER I
+ {0xA9D6, 0x24A5}, //7165 #PARENTHESIZED LATIN SMALL LETTER J
+ {0xA9D7, 0x24A6}, //7166 #PARENTHESIZED LATIN SMALL LETTER K
+ {0xA9D8, 0x24A7}, //7167 #PARENTHESIZED LATIN SMALL LETTER L
+ {0xA9D9, 0x24A8}, //7168 #PARENTHESIZED LATIN SMALL LETTER M
+ {0xA9DA, 0x24A9}, //7169 #PARENTHESIZED LATIN SMALL LETTER N
+ {0xA9DB, 0x24AA}, //7170 #PARENTHESIZED LATIN SMALL LETTER O
+ {0xA9DC, 0x24AB}, //7171 #PARENTHESIZED LATIN SMALL LETTER P
+ {0xA9DD, 0x24AC}, //7172 #PARENTHESIZED LATIN SMALL LETTER Q
+ {0xA9DE, 0x24AD}, //7173 #PARENTHESIZED LATIN SMALL LETTER R
+ {0xA9DF, 0x24AE}, //7174 #PARENTHESIZED LATIN SMALL LETTER S
+ {0xA9E0, 0x24AF}, //7175 #PARENTHESIZED LATIN SMALL LETTER T
+ {0xA9E1, 0x24B0}, //7176 #PARENTHESIZED LATIN SMALL LETTER U
+ {0xA9E2, 0x24B1}, //7177 #PARENTHESIZED LATIN SMALL LETTER V
+ {0xA9E3, 0x24B2}, //7178 #PARENTHESIZED LATIN SMALL LETTER W
+ {0xA9E4, 0x24B3}, //7179 #PARENTHESIZED LATIN SMALL LETTER X
+ {0xA9E5, 0x24B4}, //7180 #PARENTHESIZED LATIN SMALL LETTER Y
+ {0xA9E6, 0x24B5}, //7181 #PARENTHESIZED LATIN SMALL LETTER Z
+ {0xA9E7, 0x2474}, //7182 #PARENTHESIZED DIGIT ONE
+ {0xA9E8, 0x2475}, //7183 #PARENTHESIZED DIGIT TWO
+ {0xA9E9, 0x2476}, //7184 #PARENTHESIZED DIGIT THREE
+ {0xA9EA, 0x2477}, //7185 #PARENTHESIZED DIGIT FOUR
+ {0xA9EB, 0x2478}, //7186 #PARENTHESIZED DIGIT FIVE
+ {0xA9EC, 0x2479}, //7187 #PARENTHESIZED DIGIT SIX
+ {0xA9ED, 0x247A}, //7188 #PARENTHESIZED DIGIT SEVEN
+ {0xA9EE, 0x247B}, //7189 #PARENTHESIZED DIGIT EIGHT
+ {0xA9EF, 0x247C}, //7190 #PARENTHESIZED DIGIT NINE
+ {0xA9F0, 0x247D}, //7191 #PARENTHESIZED NUMBER TEN
+ {0xA9F1, 0x247E}, //7192 #PARENTHESIZED NUMBER ELEVEN
+ {0xA9F2, 0x247F}, //7193 #PARENTHESIZED NUMBER TWELVE
+ {0xA9F3, 0x2480}, //7194 #PARENTHESIZED NUMBER THIRTEEN
+ {0xA9F4, 0x2481}, //7195 #PARENTHESIZED NUMBER FOURTEEN
+ {0xA9F5, 0x2482}, //7196 #PARENTHESIZED NUMBER FIFTEEN
+ {0xA9F6, 0x00B9}, //7197 #SUPERSCRIPT ONE
+ {0xA9F7, 0x00B2}, //7198 #SUPERSCRIPT TWO
+ {0xA9F8, 0x00B3}, //7199 #SUPERSCRIPT THREE
+ {0xA9F9, 0x2074}, //7200 #SUPERSCRIPT FOUR
+ {0xA9FA, 0x207F}, //7201 #SUPERSCRIPT LATIN SMALL LETTER N
+ {0xA9FB, 0x2081}, //7202 #SUBSCRIPT ONE
+ {0xA9FC, 0x2082}, //7203 #SUBSCRIPT TWO
+ {0xA9FD, 0x2083}, //7204 #SUBSCRIPT THREE
+ {0xA9FE, 0x2084}, //7205 #SUBSCRIPT FOUR
+ {0xAA41, 0xCC25}, //7206 #HANGUL SYLLABLE SSANGCIEUC I THIEUTH
+ {0xAA42, 0xCC26}, //7207 #HANGUL SYLLABLE SSANGCIEUC I PHIEUPH
+ {0xAA43, 0xCC2A}, //7208 #HANGUL SYLLABLE CHIEUCH A SSANGKIYEOK
+ {0xAA44, 0xCC2B}, //7209 #HANGUL SYLLABLE CHIEUCH A KIYEOKSIOS
+ {0xAA45, 0xCC2D}, //7210 #HANGUL SYLLABLE CHIEUCH A NIEUNCIEUC
+ {0xAA46, 0xCC2F}, //7211 #HANGUL SYLLABLE CHIEUCH A TIKEUT
+ {0xAA47, 0xCC31}, //7212 #HANGUL SYLLABLE CHIEUCH A RIEULKIYEOK
+ {0xAA48, 0xCC32}, //7213 #HANGUL SYLLABLE CHIEUCH A RIEULMIEUM
+ {0xAA49, 0xCC33}, //7214 #HANGUL SYLLABLE CHIEUCH A RIEULPIEUP
+ {0xAA4A, 0xCC34}, //7215 #HANGUL SYLLABLE CHIEUCH A RIEULSIOS
+ {0xAA4B, 0xCC35}, //7216 #HANGUL SYLLABLE CHIEUCH A RIEULTHIEUTH
+ {0xAA4C, 0xCC36}, //7217 #HANGUL SYLLABLE CHIEUCH A RIEULPHIEUPH
+ {0xAA4D, 0xCC37}, //7218 #HANGUL SYLLABLE CHIEUCH A RIEULHIEUH
+ {0xAA4E, 0xCC3A}, //7219 #HANGUL SYLLABLE CHIEUCH A PIEUPSIOS
+ {0xAA4F, 0xCC3F}, //7220 #HANGUL SYLLABLE CHIEUCH A CHIEUCH
+ {0xAA50, 0xCC40}, //7221 #HANGUL SYLLABLE CHIEUCH A KHIEUKH
+ {0xAA51, 0xCC41}, //7222 #HANGUL SYLLABLE CHIEUCH A THIEUTH
+ {0xAA52, 0xCC42}, //7223 #HANGUL SYLLABLE CHIEUCH A PHIEUPH
+ {0xAA53, 0xCC43}, //7224 #HANGUL SYLLABLE CHIEUCH A HIEUH
+ {0xAA54, 0xCC46}, //7225 #HANGUL SYLLABLE CHIEUCH AE SSANGKIYEOK
+ {0xAA55, 0xCC47}, //7226 #HANGUL SYLLABLE CHIEUCH AE KIYEOKSIOS
+ {0xAA56, 0xCC49}, //7227 #HANGUL SYLLABLE CHIEUCH AE NIEUNCIEUC
+ {0xAA57, 0xCC4A}, //7228 #HANGUL SYLLABLE CHIEUCH AE NIEUNHIEUH
+ {0xAA58, 0xCC4B}, //7229 #HANGUL SYLLABLE CHIEUCH AE TIKEUT
+ {0xAA59, 0xCC4D}, //7230 #HANGUL SYLLABLE CHIEUCH AE RIEULKIYEOK
+ {0xAA5A, 0xCC4E}, //7231 #HANGUL SYLLABLE CHIEUCH AE RIEULMIEUM
+ {0xAA61, 0xCC4F}, //7232 #HANGUL SYLLABLE CHIEUCH AE RIEULPIEUP
+ {0xAA62, 0xCC50}, //7233 #HANGUL SYLLABLE CHIEUCH AE RIEULSIOS
+ {0xAA63, 0xCC51}, //7234 #HANGUL SYLLABLE CHIEUCH AE RIEULTHIEUTH
+ {0xAA64, 0xCC52}, //7235 #HANGUL SYLLABLE CHIEUCH AE RIEULPHIEUPH
+ {0xAA65, 0xCC53}, //7236 #HANGUL SYLLABLE CHIEUCH AE RIEULHIEUH
+ {0xAA66, 0xCC56}, //7237 #HANGUL SYLLABLE CHIEUCH AE PIEUPSIOS
+ {0xAA67, 0xCC5A}, //7238 #HANGUL SYLLABLE CHIEUCH AE CIEUC
+ {0xAA68, 0xCC5B}, //7239 #HANGUL SYLLABLE CHIEUCH AE CHIEUCH
+ {0xAA69, 0xCC5C}, //7240 #HANGUL SYLLABLE CHIEUCH AE KHIEUKH
+ {0xAA6A, 0xCC5D}, //7241 #HANGUL SYLLABLE CHIEUCH AE THIEUTH
+ {0xAA6B, 0xCC5E}, //7242 #HANGUL SYLLABLE CHIEUCH AE PHIEUPH
+ {0xAA6C, 0xCC5F}, //7243 #HANGUL SYLLABLE CHIEUCH AE HIEUH
+ {0xAA6D, 0xCC61}, //7244 #HANGUL SYLLABLE CHIEUCH YA KIYEOK
+ {0xAA6E, 0xCC62}, //7245 #HANGUL SYLLABLE CHIEUCH YA SSANGKIYEOK
+ {0xAA6F, 0xCC63}, //7246 #HANGUL SYLLABLE CHIEUCH YA KIYEOKSIOS
+ {0xAA70, 0xCC65}, //7247 #HANGUL SYLLABLE CHIEUCH YA NIEUNCIEUC
+ {0xAA71, 0xCC67}, //7248 #HANGUL SYLLABLE CHIEUCH YA TIKEUT
+ {0xAA72, 0xCC69}, //7249 #HANGUL SYLLABLE CHIEUCH YA RIEULKIYEOK
+ {0xAA73, 0xCC6A}, //7250 #HANGUL SYLLABLE CHIEUCH YA RIEULMIEUM
+ {0xAA74, 0xCC6B}, //7251 #HANGUL SYLLABLE CHIEUCH YA RIEULPIEUP
+ {0xAA75, 0xCC6C}, //7252 #HANGUL SYLLABLE CHIEUCH YA RIEULSIOS
+ {0xAA76, 0xCC6D}, //7253 #HANGUL SYLLABLE CHIEUCH YA RIEULTHIEUTH
+ {0xAA77, 0xCC6E}, //7254 #HANGUL SYLLABLE CHIEUCH YA RIEULPHIEUPH
+ {0xAA78, 0xCC6F}, //7255 #HANGUL SYLLABLE CHIEUCH YA RIEULHIEUH
+ {0xAA79, 0xCC71}, //7256 #HANGUL SYLLABLE CHIEUCH YA PIEUP
+ {0xAA7A, 0xCC72}, //7257 #HANGUL SYLLABLE CHIEUCH YA PIEUPSIOS
+ {0xAA81, 0xCC73}, //7258 #HANGUL SYLLABLE CHIEUCH YA SIOS
+ {0xAA82, 0xCC74}, //7259 #HANGUL SYLLABLE CHIEUCH YA SSANGSIOS
+ {0xAA83, 0xCC76}, //7260 #HANGUL SYLLABLE CHIEUCH YA CIEUC
+ {0xAA84, 0xCC77}, //7261 #HANGUL SYLLABLE CHIEUCH YA CHIEUCH
+ {0xAA85, 0xCC78}, //7262 #HANGUL SYLLABLE CHIEUCH YA KHIEUKH
+ {0xAA86, 0xCC79}, //7263 #HANGUL SYLLABLE CHIEUCH YA THIEUTH
+ {0xAA87, 0xCC7A}, //7264 #HANGUL SYLLABLE CHIEUCH YA PHIEUPH
+ {0xAA88, 0xCC7B}, //7265 #HANGUL SYLLABLE CHIEUCH YA HIEUH
+ {0xAA89, 0xCC7C}, //7266 #HANGUL SYLLABLE CHIEUCH YAE
+ {0xAA8A, 0xCC7D}, //7267 #HANGUL SYLLABLE CHIEUCH YAE KIYEOK
+ {0xAA8B, 0xCC7E}, //7268 #HANGUL SYLLABLE CHIEUCH YAE SSANGKIYEOK
+ {0xAA8C, 0xCC7F}, //7269 #HANGUL SYLLABLE CHIEUCH YAE KIYEOKSIOS
+ {0xAA8D, 0xCC80}, //7270 #HANGUL SYLLABLE CHIEUCH YAE NIEUN
+ {0xAA8E, 0xCC81}, //7271 #HANGUL SYLLABLE CHIEUCH YAE NIEUNCIEUC
+ {0xAA8F, 0xCC82}, //7272 #HANGUL SYLLABLE CHIEUCH YAE NIEUNHIEUH
+ {0xAA90, 0xCC83}, //7273 #HANGUL SYLLABLE CHIEUCH YAE TIKEUT
+ {0xAA91, 0xCC84}, //7274 #HANGUL SYLLABLE CHIEUCH YAE RIEUL
+ {0xAA92, 0xCC85}, //7275 #HANGUL SYLLABLE CHIEUCH YAE RIEULKIYEOK
+ {0xAA93, 0xCC86}, //7276 #HANGUL SYLLABLE CHIEUCH YAE RIEULMIEUM
+ {0xAA94, 0xCC87}, //7277 #HANGUL SYLLABLE CHIEUCH YAE RIEULPIEUP
+ {0xAA95, 0xCC88}, //7278 #HANGUL SYLLABLE CHIEUCH YAE RIEULSIOS
+ {0xAA96, 0xCC89}, //7279 #HANGUL SYLLABLE CHIEUCH YAE RIEULTHIEUTH
+ {0xAA97, 0xCC8A}, //7280 #HANGUL SYLLABLE CHIEUCH YAE RIEULPHIEUPH
+ {0xAA98, 0xCC8B}, //7281 #HANGUL SYLLABLE CHIEUCH YAE RIEULHIEUH
+ {0xAA99, 0xCC8C}, //7282 #HANGUL SYLLABLE CHIEUCH YAE MIEUM
+ {0xAA9A, 0xCC8D}, //7283 #HANGUL SYLLABLE CHIEUCH YAE PIEUP
+ {0xAA9B, 0xCC8E}, //7284 #HANGUL SYLLABLE CHIEUCH YAE PIEUPSIOS
+ {0xAA9C, 0xCC8F}, //7285 #HANGUL SYLLABLE CHIEUCH YAE SIOS
+ {0xAA9D, 0xCC90}, //7286 #HANGUL SYLLABLE CHIEUCH YAE SSANGSIOS
+ {0xAA9E, 0xCC91}, //7287 #HANGUL SYLLABLE CHIEUCH YAE IEUNG
+ {0xAA9F, 0xCC92}, //7288 #HANGUL SYLLABLE CHIEUCH YAE CIEUC
+ {0xAAA0, 0xCC93}, //7289 #HANGUL SYLLABLE CHIEUCH YAE CHIEUCH
+ {0xAAA1, 0x3041}, //7290 #HIRAGANA LETTER SMALL A
+ {0xAAA2, 0x3042}, //7291 #HIRAGANA LETTER A
+ {0xAAA3, 0x3043}, //7292 #HIRAGANA LETTER SMALL I
+ {0xAAA4, 0x3044}, //7293 #HIRAGANA LETTER I
+ {0xAAA5, 0x3045}, //7294 #HIRAGANA LETTER SMALL U
+ {0xAAA6, 0x3046}, //7295 #HIRAGANA LETTER U
+ {0xAAA7, 0x3047}, //7296 #HIRAGANA LETTER SMALL E
+ {0xAAA8, 0x3048}, //7297 #HIRAGANA LETTER E
+ {0xAAA9, 0x3049}, //7298 #HIRAGANA LETTER SMALL O
+ {0xAAAA, 0x304A}, //7299 #HIRAGANA LETTER O
+ {0xAAAB, 0x304B}, //7300 #HIRAGANA LETTER KA
+ {0xAAAC, 0x304C}, //7301 #HIRAGANA LETTER GA
+ {0xAAAD, 0x304D}, //7302 #HIRAGANA LETTER KI
+ {0xAAAE, 0x304E}, //7303 #HIRAGANA LETTER GI
+ {0xAAAF, 0x304F}, //7304 #HIRAGANA LETTER KU
+ {0xAAB0, 0x3050}, //7305 #HIRAGANA LETTER GU
+ {0xAAB1, 0x3051}, //7306 #HIRAGANA LETTER KE
+ {0xAAB2, 0x3052}, //7307 #HIRAGANA LETTER GE
+ {0xAAB3, 0x3053}, //7308 #HIRAGANA LETTER KO
+ {0xAAB4, 0x3054}, //7309 #HIRAGANA LETTER GO
+ {0xAAB5, 0x3055}, //7310 #HIRAGANA LETTER SA
+ {0xAAB6, 0x3056}, //7311 #HIRAGANA LETTER ZA
+ {0xAAB7, 0x3057}, //7312 #HIRAGANA LETTER SI
+ {0xAAB8, 0x3058}, //7313 #HIRAGANA LETTER ZI
+ {0xAAB9, 0x3059}, //7314 #HIRAGANA LETTER SU
+ {0xAABA, 0x305A}, //7315 #HIRAGANA LETTER ZU
+ {0xAABB, 0x305B}, //7316 #HIRAGANA LETTER SE
+ {0xAABC, 0x305C}, //7317 #HIRAGANA LETTER ZE
+ {0xAABD, 0x305D}, //7318 #HIRAGANA LETTER SO
+ {0xAABE, 0x305E}, //7319 #HIRAGANA LETTER ZO
+ {0xAABF, 0x305F}, //7320 #HIRAGANA LETTER TA
+ {0xAAC0, 0x3060}, //7321 #HIRAGANA LETTER DA
+ {0xAAC1, 0x3061}, //7322 #HIRAGANA LETTER TI
+ {0xAAC2, 0x3062}, //7323 #HIRAGANA LETTER DI
+ {0xAAC3, 0x3063}, //7324 #HIRAGANA LETTER SMALL TU
+ {0xAAC4, 0x3064}, //7325 #HIRAGANA LETTER TU
+ {0xAAC5, 0x3065}, //7326 #HIRAGANA LETTER DU
+ {0xAAC6, 0x3066}, //7327 #HIRAGANA LETTER TE
+ {0xAAC7, 0x3067}, //7328 #HIRAGANA LETTER DE
+ {0xAAC8, 0x3068}, //7329 #HIRAGANA LETTER TO
+ {0xAAC9, 0x3069}, //7330 #HIRAGANA LETTER DO
+ {0xAACA, 0x306A}, //7331 #HIRAGANA LETTER NA
+ {0xAACB, 0x306B}, //7332 #HIRAGANA LETTER NI
+ {0xAACC, 0x306C}, //7333 #HIRAGANA LETTER NU
+ {0xAACD, 0x306D}, //7334 #HIRAGANA LETTER NE
+ {0xAACE, 0x306E}, //7335 #HIRAGANA LETTER NO
+ {0xAACF, 0x306F}, //7336 #HIRAGANA LETTER HA
+ {0xAAD0, 0x3070}, //7337 #HIRAGANA LETTER BA
+ {0xAAD1, 0x3071}, //7338 #HIRAGANA LETTER PA
+ {0xAAD2, 0x3072}, //7339 #HIRAGANA LETTER HI
+ {0xAAD3, 0x3073}, //7340 #HIRAGANA LETTER BI
+ {0xAAD4, 0x3074}, //7341 #HIRAGANA LETTER PI
+ {0xAAD5, 0x3075}, //7342 #HIRAGANA LETTER HU
+ {0xAAD6, 0x3076}, //7343 #HIRAGANA LETTER BU
+ {0xAAD7, 0x3077}, //7344 #HIRAGANA LETTER PU
+ {0xAAD8, 0x3078}, //7345 #HIRAGANA LETTER HE
+ {0xAAD9, 0x3079}, //7346 #HIRAGANA LETTER BE
+ {0xAADA, 0x307A}, //7347 #HIRAGANA LETTER PE
+ {0xAADB, 0x307B}, //7348 #HIRAGANA LETTER HO
+ {0xAADC, 0x307C}, //7349 #HIRAGANA LETTER BO
+ {0xAADD, 0x307D}, //7350 #HIRAGANA LETTER PO
+ {0xAADE, 0x307E}, //7351 #HIRAGANA LETTER MA
+ {0xAADF, 0x307F}, //7352 #HIRAGANA LETTER MI
+ {0xAAE0, 0x3080}, //7353 #HIRAGANA LETTER MU
+ {0xAAE1, 0x3081}, //7354 #HIRAGANA LETTER ME
+ {0xAAE2, 0x3082}, //7355 #HIRAGANA LETTER MO
+ {0xAAE3, 0x3083}, //7356 #HIRAGANA LETTER SMALL YA
+ {0xAAE4, 0x3084}, //7357 #HIRAGANA LETTER YA
+ {0xAAE5, 0x3085}, //7358 #HIRAGANA LETTER SMALL YU
+ {0xAAE6, 0x3086}, //7359 #HIRAGANA LETTER YU
+ {0xAAE7, 0x3087}, //7360 #HIRAGANA LETTER SMALL YO
+ {0xAAE8, 0x3088}, //7361 #HIRAGANA LETTER YO
+ {0xAAE9, 0x3089}, //7362 #HIRAGANA LETTER RA
+ {0xAAEA, 0x308A}, //7363 #HIRAGANA LETTER RI
+ {0xAAEB, 0x308B}, //7364 #HIRAGANA LETTER RU
+ {0xAAEC, 0x308C}, //7365 #HIRAGANA LETTER RE
+ {0xAAED, 0x308D}, //7366 #HIRAGANA LETTER RO
+ {0xAAEE, 0x308E}, //7367 #HIRAGANA LETTER SMALL WA
+ {0xAAEF, 0x308F}, //7368 #HIRAGANA LETTER WA
+ {0xAAF0, 0x3090}, //7369 #HIRAGANA LETTER WI
+ {0xAAF1, 0x3091}, //7370 #HIRAGANA LETTER WE
+ {0xAAF2, 0x3092}, //7371 #HIRAGANA LETTER WO
+ {0xAAF3, 0x3093}, //7372 #HIRAGANA LETTER N
+ {0xAB41, 0xCC94}, //7373 #HANGUL SYLLABLE CHIEUCH YAE KHIEUKH
+ {0xAB42, 0xCC95}, //7374 #HANGUL SYLLABLE CHIEUCH YAE THIEUTH
+ {0xAB43, 0xCC96}, //7375 #HANGUL SYLLABLE CHIEUCH YAE PHIEUPH
+ {0xAB44, 0xCC97}, //7376 #HANGUL SYLLABLE CHIEUCH YAE HIEUH
+ {0xAB45, 0xCC9A}, //7377 #HANGUL SYLLABLE CHIEUCH EO SSANGKIYEOK
+ {0xAB46, 0xCC9B}, //7378 #HANGUL SYLLABLE CHIEUCH EO KIYEOKSIOS
+ {0xAB47, 0xCC9D}, //7379 #HANGUL SYLLABLE CHIEUCH EO NIEUNCIEUC
+ {0xAB48, 0xCC9E}, //7380 #HANGUL SYLLABLE CHIEUCH EO NIEUNHIEUH
+ {0xAB49, 0xCC9F}, //7381 #HANGUL SYLLABLE CHIEUCH EO TIKEUT
+ {0xAB4A, 0xCCA1}, //7382 #HANGUL SYLLABLE CHIEUCH EO RIEULKIYEOK
+ {0xAB4B, 0xCCA2}, //7383 #HANGUL SYLLABLE CHIEUCH EO RIEULMIEUM
+ {0xAB4C, 0xCCA3}, //7384 #HANGUL SYLLABLE CHIEUCH EO RIEULPIEUP
+ {0xAB4D, 0xCCA4}, //7385 #HANGUL SYLLABLE CHIEUCH EO RIEULSIOS
+ {0xAB4E, 0xCCA5}, //7386 #HANGUL SYLLABLE CHIEUCH EO RIEULTHIEUTH
+ {0xAB4F, 0xCCA6}, //7387 #HANGUL SYLLABLE CHIEUCH EO RIEULPHIEUPH
+ {0xAB50, 0xCCA7}, //7388 #HANGUL SYLLABLE CHIEUCH EO RIEULHIEUH
+ {0xAB51, 0xCCAA}, //7389 #HANGUL SYLLABLE CHIEUCH EO PIEUPSIOS
+ {0xAB52, 0xCCAE}, //7390 #HANGUL SYLLABLE CHIEUCH EO CIEUC
+ {0xAB53, 0xCCAF}, //7391 #HANGUL SYLLABLE CHIEUCH EO CHIEUCH
+ {0xAB54, 0xCCB0}, //7392 #HANGUL SYLLABLE CHIEUCH EO KHIEUKH
+ {0xAB55, 0xCCB1}, //7393 #HANGUL SYLLABLE CHIEUCH EO THIEUTH
+ {0xAB56, 0xCCB2}, //7394 #HANGUL SYLLABLE CHIEUCH EO PHIEUPH
+ {0xAB57, 0xCCB3}, //7395 #HANGUL SYLLABLE CHIEUCH EO HIEUH
+ {0xAB58, 0xCCB6}, //7396 #HANGUL SYLLABLE CHIEUCH E SSANGKIYEOK
+ {0xAB59, 0xCCB7}, //7397 #HANGUL SYLLABLE CHIEUCH E KIYEOKSIOS
+ {0xAB5A, 0xCCB9}, //7398 #HANGUL SYLLABLE CHIEUCH E NIEUNCIEUC
+ {0xAB61, 0xCCBA}, //7399 #HANGUL SYLLABLE CHIEUCH E NIEUNHIEUH
+ {0xAB62, 0xCCBB}, //7400 #HANGUL SYLLABLE CHIEUCH E TIKEUT
+ {0xAB63, 0xCCBD}, //7401 #HANGUL SYLLABLE CHIEUCH E RIEULKIYEOK
+ {0xAB64, 0xCCBE}, //7402 #HANGUL SYLLABLE CHIEUCH E RIEULMIEUM
+ {0xAB65, 0xCCBF}, //7403 #HANGUL SYLLABLE CHIEUCH E RIEULPIEUP
+ {0xAB66, 0xCCC0}, //7404 #HANGUL SYLLABLE CHIEUCH E RIEULSIOS
+ {0xAB67, 0xCCC1}, //7405 #HANGUL SYLLABLE CHIEUCH E RIEULTHIEUTH
+ {0xAB68, 0xCCC2}, //7406 #HANGUL SYLLABLE CHIEUCH E RIEULPHIEUPH
+ {0xAB69, 0xCCC3}, //7407 #HANGUL SYLLABLE CHIEUCH E RIEULHIEUH
+ {0xAB6A, 0xCCC6}, //7408 #HANGUL SYLLABLE CHIEUCH E PIEUPSIOS
+ {0xAB6B, 0xCCC8}, //7409 #HANGUL SYLLABLE CHIEUCH E SSANGSIOS
+ {0xAB6C, 0xCCCA}, //7410 #HANGUL SYLLABLE CHIEUCH E CIEUC
+ {0xAB6D, 0xCCCB}, //7411 #HANGUL SYLLABLE CHIEUCH E CHIEUCH
+ {0xAB6E, 0xCCCC}, //7412 #HANGUL SYLLABLE CHIEUCH E KHIEUKH
+ {0xAB6F, 0xCCCD}, //7413 #HANGUL SYLLABLE CHIEUCH E THIEUTH
+ {0xAB70, 0xCCCE}, //7414 #HANGUL SYLLABLE CHIEUCH E PHIEUPH
+ {0xAB71, 0xCCCF}, //7415 #HANGUL SYLLABLE CHIEUCH E HIEUH
+ {0xAB72, 0xCCD1}, //7416 #HANGUL SYLLABLE CHIEUCH YEO KIYEOK
+ {0xAB73, 0xCCD2}, //7417 #HANGUL SYLLABLE CHIEUCH YEO SSANGKIYEOK
+ {0xAB74, 0xCCD3}, //7418 #HANGUL SYLLABLE CHIEUCH YEO KIYEOKSIOS
+ {0xAB75, 0xCCD5}, //7419 #HANGUL SYLLABLE CHIEUCH YEO NIEUNCIEUC
+ {0xAB76, 0xCCD6}, //7420 #HANGUL SYLLABLE CHIEUCH YEO NIEUNHIEUH
+ {0xAB77, 0xCCD7}, //7421 #HANGUL SYLLABLE CHIEUCH YEO TIKEUT
+ {0xAB78, 0xCCD8}, //7422 #HANGUL SYLLABLE CHIEUCH YEO RIEUL
+ {0xAB79, 0xCCD9}, //7423 #HANGUL SYLLABLE CHIEUCH YEO RIEULKIYEOK
+ {0xAB7A, 0xCCDA}, //7424 #HANGUL SYLLABLE CHIEUCH YEO RIEULMIEUM
+ {0xAB81, 0xCCDB}, //7425 #HANGUL SYLLABLE CHIEUCH YEO RIEULPIEUP
+ {0xAB82, 0xCCDC}, //7426 #HANGUL SYLLABLE CHIEUCH YEO RIEULSIOS
+ {0xAB83, 0xCCDD}, //7427 #HANGUL SYLLABLE CHIEUCH YEO RIEULTHIEUTH
+ {0xAB84, 0xCCDE}, //7428 #HANGUL SYLLABLE CHIEUCH YEO RIEULPHIEUPH
+ {0xAB85, 0xCCDF}, //7429 #HANGUL SYLLABLE CHIEUCH YEO RIEULHIEUH
+ {0xAB86, 0xCCE0}, //7430 #HANGUL SYLLABLE CHIEUCH YEO MIEUM
+ {0xAB87, 0xCCE1}, //7431 #HANGUL SYLLABLE CHIEUCH YEO PIEUP
+ {0xAB88, 0xCCE2}, //7432 #HANGUL SYLLABLE CHIEUCH YEO PIEUPSIOS
+ {0xAB89, 0xCCE3}, //7433 #HANGUL SYLLABLE CHIEUCH YEO SIOS
+ {0xAB8A, 0xCCE5}, //7434 #HANGUL SYLLABLE CHIEUCH YEO IEUNG
+ {0xAB8B, 0xCCE6}, //7435 #HANGUL SYLLABLE CHIEUCH YEO CIEUC
+ {0xAB8C, 0xCCE7}, //7436 #HANGUL SYLLABLE CHIEUCH YEO CHIEUCH
+ {0xAB8D, 0xCCE8}, //7437 #HANGUL SYLLABLE CHIEUCH YEO KHIEUKH
+ {0xAB8E, 0xCCE9}, //7438 #HANGUL SYLLABLE CHIEUCH YEO THIEUTH
+ {0xAB8F, 0xCCEA}, //7439 #HANGUL SYLLABLE CHIEUCH YEO PHIEUPH
+ {0xAB90, 0xCCEB}, //7440 #HANGUL SYLLABLE CHIEUCH YEO HIEUH
+ {0xAB91, 0xCCED}, //7441 #HANGUL SYLLABLE CHIEUCH YE KIYEOK
+ {0xAB92, 0xCCEE}, //7442 #HANGUL SYLLABLE CHIEUCH YE SSANGKIYEOK
+ {0xAB93, 0xCCEF}, //7443 #HANGUL SYLLABLE CHIEUCH YE KIYEOKSIOS
+ {0xAB94, 0xCCF1}, //7444 #HANGUL SYLLABLE CHIEUCH YE NIEUNCIEUC
+ {0xAB95, 0xCCF2}, //7445 #HANGUL SYLLABLE CHIEUCH YE NIEUNHIEUH
+ {0xAB96, 0xCCF3}, //7446 #HANGUL SYLLABLE CHIEUCH YE TIKEUT
+ {0xAB97, 0xCCF4}, //7447 #HANGUL SYLLABLE CHIEUCH YE RIEUL
+ {0xAB98, 0xCCF5}, //7448 #HANGUL SYLLABLE CHIEUCH YE RIEULKIYEOK
+ {0xAB99, 0xCCF6}, //7449 #HANGUL SYLLABLE CHIEUCH YE RIEULMIEUM
+ {0xAB9A, 0xCCF7}, //7450 #HANGUL SYLLABLE CHIEUCH YE RIEULPIEUP
+ {0xAB9B, 0xCCF8}, //7451 #HANGUL SYLLABLE CHIEUCH YE RIEULSIOS
+ {0xAB9C, 0xCCF9}, //7452 #HANGUL SYLLABLE CHIEUCH YE RIEULTHIEUTH
+ {0xAB9D, 0xCCFA}, //7453 #HANGUL SYLLABLE CHIEUCH YE RIEULPHIEUPH
+ {0xAB9E, 0xCCFB}, //7454 #HANGUL SYLLABLE CHIEUCH YE RIEULHIEUH
+ {0xAB9F, 0xCCFC}, //7455 #HANGUL SYLLABLE CHIEUCH YE MIEUM
+ {0xABA0, 0xCCFD}, //7456 #HANGUL SYLLABLE CHIEUCH YE PIEUP
+ {0xABA1, 0x30A1}, //7457 #KATAKANA LETTER SMALL A
+ {0xABA2, 0x30A2}, //7458 #KATAKANA LETTER A
+ {0xABA3, 0x30A3}, //7459 #KATAKANA LETTER SMALL I
+ {0xABA4, 0x30A4}, //7460 #KATAKANA LETTER I
+ {0xABA5, 0x30A5}, //7461 #KATAKANA LETTER SMALL U
+ {0xABA6, 0x30A6}, //7462 #KATAKANA LETTER U
+ {0xABA7, 0x30A7}, //7463 #KATAKANA LETTER SMALL E
+ {0xABA8, 0x30A8}, //7464 #KATAKANA LETTER E
+ {0xABA9, 0x30A9}, //7465 #KATAKANA LETTER SMALL O
+ {0xABAA, 0x30AA}, //7466 #KATAKANA LETTER O
+ {0xABAB, 0x30AB}, //7467 #KATAKANA LETTER KA
+ {0xABAC, 0x30AC}, //7468 #KATAKANA LETTER GA
+ {0xABAD, 0x30AD}, //7469 #KATAKANA LETTER KI
+ {0xABAE, 0x30AE}, //7470 #KATAKANA LETTER GI
+ {0xABAF, 0x30AF}, //7471 #KATAKANA LETTER KU
+ {0xABB0, 0x30B0}, //7472 #KATAKANA LETTER GU
+ {0xABB1, 0x30B1}, //7473 #KATAKANA LETTER KE
+ {0xABB2, 0x30B2}, //7474 #KATAKANA LETTER GE
+ {0xABB3, 0x30B3}, //7475 #KATAKANA LETTER KO
+ {0xABB4, 0x30B4}, //7476 #KATAKANA LETTER GO
+ {0xABB5, 0x30B5}, //7477 #KATAKANA LETTER SA
+ {0xABB6, 0x30B6}, //7478 #KATAKANA LETTER ZA
+ {0xABB7, 0x30B7}, //7479 #KATAKANA LETTER SI
+ {0xABB8, 0x30B8}, //7480 #KATAKANA LETTER ZI
+ {0xABB9, 0x30B9}, //7481 #KATAKANA LETTER SU
+ {0xABBA, 0x30BA}, //7482 #KATAKANA LETTER ZU
+ {0xABBB, 0x30BB}, //7483 #KATAKANA LETTER SE
+ {0xABBC, 0x30BC}, //7484 #KATAKANA LETTER ZE
+ {0xABBD, 0x30BD}, //7485 #KATAKANA LETTER SO
+ {0xABBE, 0x30BE}, //7486 #KATAKANA LETTER ZO
+ {0xABBF, 0x30BF}, //7487 #KATAKANA LETTER TA
+ {0xABC0, 0x30C0}, //7488 #KATAKANA LETTER DA
+ {0xABC1, 0x30C1}, //7489 #KATAKANA LETTER TI
+ {0xABC2, 0x30C2}, //7490 #KATAKANA LETTER DI
+ {0xABC3, 0x30C3}, //7491 #KATAKANA LETTER SMALL TU
+ {0xABC4, 0x30C4}, //7492 #KATAKANA LETTER TU
+ {0xABC5, 0x30C5}, //7493 #KATAKANA LETTER DU
+ {0xABC6, 0x30C6}, //7494 #KATAKANA LETTER TE
+ {0xABC7, 0x30C7}, //7495 #KATAKANA LETTER DE
+ {0xABC8, 0x30C8}, //7496 #KATAKANA LETTER TO
+ {0xABC9, 0x30C9}, //7497 #KATAKANA LETTER DO
+ {0xABCA, 0x30CA}, //7498 #KATAKANA LETTER NA
+ {0xABCB, 0x30CB}, //7499 #KATAKANA LETTER NI
+ {0xABCC, 0x30CC}, //7500 #KATAKANA LETTER NU
+ {0xABCD, 0x30CD}, //7501 #KATAKANA LETTER NE
+ {0xABCE, 0x30CE}, //7502 #KATAKANA LETTER NO
+ {0xABCF, 0x30CF}, //7503 #KATAKANA LETTER HA
+ {0xABD0, 0x30D0}, //7504 #KATAKANA LETTER BA
+ {0xABD1, 0x30D1}, //7505 #KATAKANA LETTER PA
+ {0xABD2, 0x30D2}, //7506 #KATAKANA LETTER HI
+ {0xABD3, 0x30D3}, //7507 #KATAKANA LETTER BI
+ {0xABD4, 0x30D4}, //7508 #KATAKANA LETTER PI
+ {0xABD5, 0x30D5}, //7509 #KATAKANA LETTER HU
+ {0xABD6, 0x30D6}, //7510 #KATAKANA LETTER BU
+ {0xABD7, 0x30D7}, //7511 #KATAKANA LETTER PU
+ {0xABD8, 0x30D8}, //7512 #KATAKANA LETTER HE
+ {0xABD9, 0x30D9}, //7513 #KATAKANA LETTER BE
+ {0xABDA, 0x30DA}, //7514 #KATAKANA LETTER PE
+ {0xABDB, 0x30DB}, //7515 #KATAKANA LETTER HO
+ {0xABDC, 0x30DC}, //7516 #KATAKANA LETTER BO
+ {0xABDD, 0x30DD}, //7517 #KATAKANA LETTER PO
+ {0xABDE, 0x30DE}, //7518 #KATAKANA LETTER MA
+ {0xABDF, 0x30DF}, //7519 #KATAKANA LETTER MI
+ {0xABE0, 0x30E0}, //7520 #KATAKANA LETTER MU
+ {0xABE1, 0x30E1}, //7521 #KATAKANA LETTER ME
+ {0xABE2, 0x30E2}, //7522 #KATAKANA LETTER MO
+ {0xABE3, 0x30E3}, //7523 #KATAKANA LETTER SMALL YA
+ {0xABE4, 0x30E4}, //7524 #KATAKANA LETTER YA
+ {0xABE5, 0x30E5}, //7525 #KATAKANA LETTER SMALL YU
+ {0xABE6, 0x30E6}, //7526 #KATAKANA LETTER YU
+ {0xABE7, 0x30E7}, //7527 #KATAKANA LETTER SMALL YO
+ {0xABE8, 0x30E8}, //7528 #KATAKANA LETTER YO
+ {0xABE9, 0x30E9}, //7529 #KATAKANA LETTER RA
+ {0xABEA, 0x30EA}, //7530 #KATAKANA LETTER RI
+ {0xABEB, 0x30EB}, //7531 #KATAKANA LETTER RU
+ {0xABEC, 0x30EC}, //7532 #KATAKANA LETTER RE
+ {0xABED, 0x30ED}, //7533 #KATAKANA LETTER RO
+ {0xABEE, 0x30EE}, //7534 #KATAKANA LETTER SMALL WA
+ {0xABEF, 0x30EF}, //7535 #KATAKANA LETTER WA
+ {0xABF0, 0x30F0}, //7536 #KATAKANA LETTER WI
+ {0xABF1, 0x30F1}, //7537 #KATAKANA LETTER WE
+ {0xABF2, 0x30F2}, //7538 #KATAKANA LETTER WO
+ {0xABF3, 0x30F3}, //7539 #KATAKANA LETTER N
+ {0xABF4, 0x30F4}, //7540 #KATAKANA LETTER VU
+ {0xABF5, 0x30F5}, //7541 #KATAKANA LETTER SMALL KA
+ {0xABF6, 0x30F6}, //7542 #KATAKANA LETTER SMALL KE
+ {0xAC41, 0xCCFE}, //7543 #HANGUL SYLLABLE CHIEUCH YE PIEUPSIOS
+ {0xAC42, 0xCCFF}, //7544 #HANGUL SYLLABLE CHIEUCH YE SIOS
+ {0xAC43, 0xCD00}, //7545 #HANGUL SYLLABLE CHIEUCH YE SSANGSIOS
+ {0xAC44, 0xCD02}, //7546 #HANGUL SYLLABLE CHIEUCH YE CIEUC
+ {0xAC45, 0xCD03}, //7547 #HANGUL SYLLABLE CHIEUCH YE CHIEUCH
+ {0xAC46, 0xCD04}, //7548 #HANGUL SYLLABLE CHIEUCH YE KHIEUKH
+ {0xAC47, 0xCD05}, //7549 #HANGUL SYLLABLE CHIEUCH YE THIEUTH
+ {0xAC48, 0xCD06}, //7550 #HANGUL SYLLABLE CHIEUCH YE PHIEUPH
+ {0xAC49, 0xCD07}, //7551 #HANGUL SYLLABLE CHIEUCH YE HIEUH
+ {0xAC4A, 0xCD0A}, //7552 #HANGUL SYLLABLE CHIEUCH O SSANGKIYEOK
+ {0xAC4B, 0xCD0B}, //7553 #HANGUL SYLLABLE CHIEUCH O KIYEOKSIOS
+ {0xAC4C, 0xCD0D}, //7554 #HANGUL SYLLABLE CHIEUCH O NIEUNCIEUC
+ {0xAC4D, 0xCD0E}, //7555 #HANGUL SYLLABLE CHIEUCH O NIEUNHIEUH
+ {0xAC4E, 0xCD0F}, //7556 #HANGUL SYLLABLE CHIEUCH O TIKEUT
+ {0xAC4F, 0xCD11}, //7557 #HANGUL SYLLABLE CHIEUCH O RIEULKIYEOK
+ {0xAC50, 0xCD12}, //7558 #HANGUL SYLLABLE CHIEUCH O RIEULMIEUM
+ {0xAC51, 0xCD13}, //7559 #HANGUL SYLLABLE CHIEUCH O RIEULPIEUP
+ {0xAC52, 0xCD14}, //7560 #HANGUL SYLLABLE CHIEUCH O RIEULSIOS
+ {0xAC53, 0xCD15}, //7561 #HANGUL SYLLABLE CHIEUCH O RIEULTHIEUTH
+ {0xAC54, 0xCD16}, //7562 #HANGUL SYLLABLE CHIEUCH O RIEULPHIEUPH
+ {0xAC55, 0xCD17}, //7563 #HANGUL SYLLABLE CHIEUCH O RIEULHIEUH
+ {0xAC56, 0xCD1A}, //7564 #HANGUL SYLLABLE CHIEUCH O PIEUPSIOS
+ {0xAC57, 0xCD1C}, //7565 #HANGUL SYLLABLE CHIEUCH O SSANGSIOS
+ {0xAC58, 0xCD1E}, //7566 #HANGUL SYLLABLE CHIEUCH O CIEUC
+ {0xAC59, 0xCD1F}, //7567 #HANGUL SYLLABLE CHIEUCH O CHIEUCH
+ {0xAC5A, 0xCD20}, //7568 #HANGUL SYLLABLE CHIEUCH O KHIEUKH
+ {0xAC61, 0xCD21}, //7569 #HANGUL SYLLABLE CHIEUCH O THIEUTH
+ {0xAC62, 0xCD22}, //7570 #HANGUL SYLLABLE CHIEUCH O PHIEUPH
+ {0xAC63, 0xCD23}, //7571 #HANGUL SYLLABLE CHIEUCH O HIEUH
+ {0xAC64, 0xCD25}, //7572 #HANGUL SYLLABLE CHIEUCH WA KIYEOK
+ {0xAC65, 0xCD26}, //7573 #HANGUL SYLLABLE CHIEUCH WA SSANGKIYEOK
+ {0xAC66, 0xCD27}, //7574 #HANGUL SYLLABLE CHIEUCH WA KIYEOKSIOS
+ {0xAC67, 0xCD29}, //7575 #HANGUL SYLLABLE CHIEUCH WA NIEUNCIEUC
+ {0xAC68, 0xCD2A}, //7576 #HANGUL SYLLABLE CHIEUCH WA NIEUNHIEUH
+ {0xAC69, 0xCD2B}, //7577 #HANGUL SYLLABLE CHIEUCH WA TIKEUT
+ {0xAC6A, 0xCD2D}, //7578 #HANGUL SYLLABLE CHIEUCH WA RIEULKIYEOK
+ {0xAC6B, 0xCD2E}, //7579 #HANGUL SYLLABLE CHIEUCH WA RIEULMIEUM
+ {0xAC6C, 0xCD2F}, //7580 #HANGUL SYLLABLE CHIEUCH WA RIEULPIEUP
+ {0xAC6D, 0xCD30}, //7581 #HANGUL SYLLABLE CHIEUCH WA RIEULSIOS
+ {0xAC6E, 0xCD31}, //7582 #HANGUL SYLLABLE CHIEUCH WA RIEULTHIEUTH
+ {0xAC6F, 0xCD32}, //7583 #HANGUL SYLLABLE CHIEUCH WA RIEULPHIEUPH
+ {0xAC70, 0xCD33}, //7584 #HANGUL SYLLABLE CHIEUCH WA RIEULHIEUH
+ {0xAC71, 0xCD34}, //7585 #HANGUL SYLLABLE CHIEUCH WA MIEUM
+ {0xAC72, 0xCD35}, //7586 #HANGUL SYLLABLE CHIEUCH WA PIEUP
+ {0xAC73, 0xCD36}, //7587 #HANGUL SYLLABLE CHIEUCH WA PIEUPSIOS
+ {0xAC74, 0xCD37}, //7588 #HANGUL SYLLABLE CHIEUCH WA SIOS
+ {0xAC75, 0xCD38}, //7589 #HANGUL SYLLABLE CHIEUCH WA SSANGSIOS
+ {0xAC76, 0xCD3A}, //7590 #HANGUL SYLLABLE CHIEUCH WA CIEUC
+ {0xAC77, 0xCD3B}, //7591 #HANGUL SYLLABLE CHIEUCH WA CHIEUCH
+ {0xAC78, 0xCD3C}, //7592 #HANGUL SYLLABLE CHIEUCH WA KHIEUKH
+ {0xAC79, 0xCD3D}, //7593 #HANGUL SYLLABLE CHIEUCH WA THIEUTH
+ {0xAC7A, 0xCD3E}, //7594 #HANGUL SYLLABLE CHIEUCH WA PHIEUPH
+ {0xAC81, 0xCD3F}, //7595 #HANGUL SYLLABLE CHIEUCH WA HIEUH
+ {0xAC82, 0xCD40}, //7596 #HANGUL SYLLABLE CHIEUCH WAE
+ {0xAC83, 0xCD41}, //7597 #HANGUL SYLLABLE CHIEUCH WAE KIYEOK
+ {0xAC84, 0xCD42}, //7598 #HANGUL SYLLABLE CHIEUCH WAE SSANGKIYEOK
+ {0xAC85, 0xCD43}, //7599 #HANGUL SYLLABLE CHIEUCH WAE KIYEOKSIOS
+ {0xAC86, 0xCD44}, //7600 #HANGUL SYLLABLE CHIEUCH WAE NIEUN
+ {0xAC87, 0xCD45}, //7601 #HANGUL SYLLABLE CHIEUCH WAE NIEUNCIEUC
+ {0xAC88, 0xCD46}, //7602 #HANGUL SYLLABLE CHIEUCH WAE NIEUNHIEUH
+ {0xAC89, 0xCD47}, //7603 #HANGUL SYLLABLE CHIEUCH WAE TIKEUT
+ {0xAC8A, 0xCD48}, //7604 #HANGUL SYLLABLE CHIEUCH WAE RIEUL
+ {0xAC8B, 0xCD49}, //7605 #HANGUL SYLLABLE CHIEUCH WAE RIEULKIYEOK
+ {0xAC8C, 0xCD4A}, //7606 #HANGUL SYLLABLE CHIEUCH WAE RIEULMIEUM
+ {0xAC8D, 0xCD4B}, //7607 #HANGUL SYLLABLE CHIEUCH WAE RIEULPIEUP
+ {0xAC8E, 0xCD4C}, //7608 #HANGUL SYLLABLE CHIEUCH WAE RIEULSIOS
+ {0xAC8F, 0xCD4D}, //7609 #HANGUL SYLLABLE CHIEUCH WAE RIEULTHIEUTH
+ {0xAC90, 0xCD4E}, //7610 #HANGUL SYLLABLE CHIEUCH WAE RIEULPHIEUPH
+ {0xAC91, 0xCD4F}, //7611 #HANGUL SYLLABLE CHIEUCH WAE RIEULHIEUH
+ {0xAC92, 0xCD50}, //7612 #HANGUL SYLLABLE CHIEUCH WAE MIEUM
+ {0xAC93, 0xCD51}, //7613 #HANGUL SYLLABLE CHIEUCH WAE PIEUP
+ {0xAC94, 0xCD52}, //7614 #HANGUL SYLLABLE CHIEUCH WAE PIEUPSIOS
+ {0xAC95, 0xCD53}, //7615 #HANGUL SYLLABLE CHIEUCH WAE SIOS
+ {0xAC96, 0xCD54}, //7616 #HANGUL SYLLABLE CHIEUCH WAE SSANGSIOS
+ {0xAC97, 0xCD55}, //7617 #HANGUL SYLLABLE CHIEUCH WAE IEUNG
+ {0xAC98, 0xCD56}, //7618 #HANGUL SYLLABLE CHIEUCH WAE CIEUC
+ {0xAC99, 0xCD57}, //7619 #HANGUL SYLLABLE CHIEUCH WAE CHIEUCH
+ {0xAC9A, 0xCD58}, //7620 #HANGUL SYLLABLE CHIEUCH WAE KHIEUKH
+ {0xAC9B, 0xCD59}, //7621 #HANGUL SYLLABLE CHIEUCH WAE THIEUTH
+ {0xAC9C, 0xCD5A}, //7622 #HANGUL SYLLABLE CHIEUCH WAE PHIEUPH
+ {0xAC9D, 0xCD5B}, //7623 #HANGUL SYLLABLE CHIEUCH WAE HIEUH
+ {0xAC9E, 0xCD5D}, //7624 #HANGUL SYLLABLE CHIEUCH OE KIYEOK
+ {0xAC9F, 0xCD5E}, //7625 #HANGUL SYLLABLE CHIEUCH OE SSANGKIYEOK
+ {0xACA0, 0xCD5F}, //7626 #HANGUL SYLLABLE CHIEUCH OE KIYEOKSIOS
+ {0xACA1, 0x0410}, //7627 #CYRILLIC CAPITAL LETTER A
+ {0xACA2, 0x0411}, //7628 #CYRILLIC CAPITAL LETTER BE
+ {0xACA3, 0x0412}, //7629 #CYRILLIC CAPITAL LETTER VE
+ {0xACA4, 0x0413}, //7630 #CYRILLIC CAPITAL LETTER GHE
+ {0xACA5, 0x0414}, //7631 #CYRILLIC CAPITAL LETTER DE
+ {0xACA6, 0x0415}, //7632 #CYRILLIC CAPITAL LETTER IE
+ {0xACA7, 0x0401}, //7633 #CYRILLIC CAPITAL LETTER IO
+ {0xACA8, 0x0416}, //7634 #CYRILLIC CAPITAL LETTER ZHE
+ {0xACA9, 0x0417}, //7635 #CYRILLIC CAPITAL LETTER ZE
+ {0xACAA, 0x0418}, //7636 #CYRILLIC CAPITAL LETTER I
+ {0xACAB, 0x0419}, //7637 #CYRILLIC CAPITAL LETTER SHORT I
+ {0xACAC, 0x041A}, //7638 #CYRILLIC CAPITAL LETTER KA
+ {0xACAD, 0x041B}, //7639 #CYRILLIC CAPITAL LETTER EL
+ {0xACAE, 0x041C}, //7640 #CYRILLIC CAPITAL LETTER EM
+ {0xACAF, 0x041D}, //7641 #CYRILLIC CAPITAL LETTER EN
+ {0xACB0, 0x041E}, //7642 #CYRILLIC CAPITAL LETTER O
+ {0xACB1, 0x041F}, //7643 #CYRILLIC CAPITAL LETTER PE
+ {0xACB2, 0x0420}, //7644 #CYRILLIC CAPITAL LETTER ER
+ {0xACB3, 0x0421}, //7645 #CYRILLIC CAPITAL LETTER ES
+ {0xACB4, 0x0422}, //7646 #CYRILLIC CAPITAL LETTER TE
+ {0xACB5, 0x0423}, //7647 #CYRILLIC CAPITAL LETTER U
+ {0xACB6, 0x0424}, //7648 #CYRILLIC CAPITAL LETTER EF
+ {0xACB7, 0x0425}, //7649 #CYRILLIC CAPITAL LETTER HA
+ {0xACB8, 0x0426}, //7650 #CYRILLIC CAPITAL LETTER TSE
+ {0xACB9, 0x0427}, //7651 #CYRILLIC CAPITAL LETTER CHE
+ {0xACBA, 0x0428}, //7652 #CYRILLIC CAPITAL LETTER SHA
+ {0xACBB, 0x0429}, //7653 #CYRILLIC CAPITAL LETTER SHCHA
+ {0xACBC, 0x042A}, //7654 #CYRILLIC CAPITAL LETTER HARD SIGN
+ {0xACBD, 0x042B}, //7655 #CYRILLIC CAPITAL LETTER YERU
+ {0xACBE, 0x042C}, //7656 #CYRILLIC CAPITAL LETTER SOFT SIGN
+ {0xACBF, 0x042D}, //7657 #CYRILLIC CAPITAL LETTER E
+ {0xACC0, 0x042E}, //7658 #CYRILLIC CAPITAL LETTER YU
+ {0xACC1, 0x042F}, //7659 #CYRILLIC CAPITAL LETTER YA
+ {0xACD1, 0x0430}, //7660 #CYRILLIC SMALL LETTER A
+ {0xACD2, 0x0431}, //7661 #CYRILLIC SMALL LETTER BE
+ {0xACD3, 0x0432}, //7662 #CYRILLIC SMALL LETTER VE
+ {0xACD4, 0x0433}, //7663 #CYRILLIC SMALL LETTER GHE
+ {0xACD5, 0x0434}, //7664 #CYRILLIC SMALL LETTER DE
+ {0xACD6, 0x0435}, //7665 #CYRILLIC SMALL LETTER IE
+ {0xACD7, 0x0451}, //7666 #CYRILLIC SMALL LETTER IO
+ {0xACD8, 0x0436}, //7667 #CYRILLIC SMALL LETTER ZHE
+ {0xACD9, 0x0437}, //7668 #CYRILLIC SMALL LETTER ZE
+ {0xACDA, 0x0438}, //7669 #CYRILLIC SMALL LETTER I
+ {0xACDB, 0x0439}, //7670 #CYRILLIC SMALL LETTER SHORT I
+ {0xACDC, 0x043A}, //7671 #CYRILLIC SMALL LETTER KA
+ {0xACDD, 0x043B}, //7672 #CYRILLIC SMALL LETTER EL
+ {0xACDE, 0x043C}, //7673 #CYRILLIC SMALL LETTER EM
+ {0xACDF, 0x043D}, //7674 #CYRILLIC SMALL LETTER EN
+ {0xACE0, 0x043E}, //7675 #CYRILLIC SMALL LETTER O
+ {0xACE1, 0x043F}, //7676 #CYRILLIC SMALL LETTER PE
+ {0xACE2, 0x0440}, //7677 #CYRILLIC SMALL LETTER ER
+ {0xACE3, 0x0441}, //7678 #CYRILLIC SMALL LETTER ES
+ {0xACE4, 0x0442}, //7679 #CYRILLIC SMALL LETTER TE
+ {0xACE5, 0x0443}, //7680 #CYRILLIC SMALL LETTER U
+ {0xACE6, 0x0444}, //7681 #CYRILLIC SMALL LETTER EF
+ {0xACE7, 0x0445}, //7682 #CYRILLIC SMALL LETTER HA
+ {0xACE8, 0x0446}, //7683 #CYRILLIC SMALL LETTER TSE
+ {0xACE9, 0x0447}, //7684 #CYRILLIC SMALL LETTER CHE
+ {0xACEA, 0x0448}, //7685 #CYRILLIC SMALL LETTER SHA
+ {0xACEB, 0x0449}, //7686 #CYRILLIC SMALL LETTER SHCHA
+ {0xACEC, 0x044A}, //7687 #CYRILLIC SMALL LETTER HARD SIGN
+ {0xACED, 0x044B}, //7688 #CYRILLIC SMALL LETTER YERU
+ {0xACEE, 0x044C}, //7689 #CYRILLIC SMALL LETTER SOFT SIGN
+ {0xACEF, 0x044D}, //7690 #CYRILLIC SMALL LETTER E
+ {0xACF0, 0x044E}, //7691 #CYRILLIC SMALL LETTER YU
+ {0xACF1, 0x044F}, //7692 #CYRILLIC SMALL LETTER YA
+ {0xAD41, 0xCD61}, //7693 #HANGUL SYLLABLE CHIEUCH OE NIEUNCIEUC
+ {0xAD42, 0xCD62}, //7694 #HANGUL SYLLABLE CHIEUCH OE NIEUNHIEUH
+ {0xAD43, 0xCD63}, //7695 #HANGUL SYLLABLE CHIEUCH OE TIKEUT
+ {0xAD44, 0xCD65}, //7696 #HANGUL SYLLABLE CHIEUCH OE RIEULKIYEOK
+ {0xAD45, 0xCD66}, //7697 #HANGUL SYLLABLE CHIEUCH OE RIEULMIEUM
+ {0xAD46, 0xCD67}, //7698 #HANGUL SYLLABLE CHIEUCH OE RIEULPIEUP
+ {0xAD47, 0xCD68}, //7699 #HANGUL SYLLABLE CHIEUCH OE RIEULSIOS
+ {0xAD48, 0xCD69}, //7700 #HANGUL SYLLABLE CHIEUCH OE RIEULTHIEUTH
+ {0xAD49, 0xCD6A}, //7701 #HANGUL SYLLABLE CHIEUCH OE RIEULPHIEUPH
+ {0xAD4A, 0xCD6B}, //7702 #HANGUL SYLLABLE CHIEUCH OE RIEULHIEUH
+ {0xAD4B, 0xCD6E}, //7703 #HANGUL SYLLABLE CHIEUCH OE PIEUPSIOS
+ {0xAD4C, 0xCD70}, //7704 #HANGUL SYLLABLE CHIEUCH OE SSANGSIOS
+ {0xAD4D, 0xCD72}, //7705 #HANGUL SYLLABLE CHIEUCH OE CIEUC
+ {0xAD4E, 0xCD73}, //7706 #HANGUL SYLLABLE CHIEUCH OE CHIEUCH
+ {0xAD4F, 0xCD74}, //7707 #HANGUL SYLLABLE CHIEUCH OE KHIEUKH
+ {0xAD50, 0xCD75}, //7708 #HANGUL SYLLABLE CHIEUCH OE THIEUTH
+ {0xAD51, 0xCD76}, //7709 #HANGUL SYLLABLE CHIEUCH OE PHIEUPH
+ {0xAD52, 0xCD77}, //7710 #HANGUL SYLLABLE CHIEUCH OE HIEUH
+ {0xAD53, 0xCD79}, //7711 #HANGUL SYLLABLE CHIEUCH YO KIYEOK
+ {0xAD54, 0xCD7A}, //7712 #HANGUL SYLLABLE CHIEUCH YO SSANGKIYEOK
+ {0xAD55, 0xCD7B}, //7713 #HANGUL SYLLABLE CHIEUCH YO KIYEOKSIOS
+ {0xAD56, 0xCD7C}, //7714 #HANGUL SYLLABLE CHIEUCH YO NIEUN
+ {0xAD57, 0xCD7D}, //7715 #HANGUL SYLLABLE CHIEUCH YO NIEUNCIEUC
+ {0xAD58, 0xCD7E}, //7716 #HANGUL SYLLABLE CHIEUCH YO NIEUNHIEUH
+ {0xAD59, 0xCD7F}, //7717 #HANGUL SYLLABLE CHIEUCH YO TIKEUT
+ {0xAD5A, 0xCD80}, //7718 #HANGUL SYLLABLE CHIEUCH YO RIEUL
+ {0xAD61, 0xCD81}, //7719 #HANGUL SYLLABLE CHIEUCH YO RIEULKIYEOK
+ {0xAD62, 0xCD82}, //7720 #HANGUL SYLLABLE CHIEUCH YO RIEULMIEUM
+ {0xAD63, 0xCD83}, //7721 #HANGUL SYLLABLE CHIEUCH YO RIEULPIEUP
+ {0xAD64, 0xCD84}, //7722 #HANGUL SYLLABLE CHIEUCH YO RIEULSIOS
+ {0xAD65, 0xCD85}, //7723 #HANGUL SYLLABLE CHIEUCH YO RIEULTHIEUTH
+ {0xAD66, 0xCD86}, //7724 #HANGUL SYLLABLE CHIEUCH YO RIEULPHIEUPH
+ {0xAD67, 0xCD87}, //7725 #HANGUL SYLLABLE CHIEUCH YO RIEULHIEUH
+ {0xAD68, 0xCD89}, //7726 #HANGUL SYLLABLE CHIEUCH YO PIEUP
+ {0xAD69, 0xCD8A}, //7727 #HANGUL SYLLABLE CHIEUCH YO PIEUPSIOS
+ {0xAD6A, 0xCD8B}, //7728 #HANGUL SYLLABLE CHIEUCH YO SIOS
+ {0xAD6B, 0xCD8C}, //7729 #HANGUL SYLLABLE CHIEUCH YO SSANGSIOS
+ {0xAD6C, 0xCD8D}, //7730 #HANGUL SYLLABLE CHIEUCH YO IEUNG
+ {0xAD6D, 0xCD8E}, //7731 #HANGUL SYLLABLE CHIEUCH YO CIEUC
+ {0xAD6E, 0xCD8F}, //7732 #HANGUL SYLLABLE CHIEUCH YO CHIEUCH
+ {0xAD6F, 0xCD90}, //7733 #HANGUL SYLLABLE CHIEUCH YO KHIEUKH
+ {0xAD70, 0xCD91}, //7734 #HANGUL SYLLABLE CHIEUCH YO THIEUTH
+ {0xAD71, 0xCD92}, //7735 #HANGUL SYLLABLE CHIEUCH YO PHIEUPH
+ {0xAD72, 0xCD93}, //7736 #HANGUL SYLLABLE CHIEUCH YO HIEUH
+ {0xAD73, 0xCD96}, //7737 #HANGUL SYLLABLE CHIEUCH U SSANGKIYEOK
+ {0xAD74, 0xCD97}, //7738 #HANGUL SYLLABLE CHIEUCH U KIYEOKSIOS
+ {0xAD75, 0xCD99}, //7739 #HANGUL SYLLABLE CHIEUCH U NIEUNCIEUC
+ {0xAD76, 0xCD9A}, //7740 #HANGUL SYLLABLE CHIEUCH U NIEUNHIEUH
+ {0xAD77, 0xCD9B}, //7741 #HANGUL SYLLABLE CHIEUCH U TIKEUT
+ {0xAD78, 0xCD9D}, //7742 #HANGUL SYLLABLE CHIEUCH U RIEULKIYEOK
+ {0xAD79, 0xCD9E}, //7743 #HANGUL SYLLABLE CHIEUCH U RIEULMIEUM
+ {0xAD7A, 0xCD9F}, //7744 #HANGUL SYLLABLE CHIEUCH U RIEULPIEUP
+ {0xAD81, 0xCDA0}, //7745 #HANGUL SYLLABLE CHIEUCH U RIEULSIOS
+ {0xAD82, 0xCDA1}, //7746 #HANGUL SYLLABLE CHIEUCH U RIEULTHIEUTH
+ {0xAD83, 0xCDA2}, //7747 #HANGUL SYLLABLE CHIEUCH U RIEULPHIEUPH
+ {0xAD84, 0xCDA3}, //7748 #HANGUL SYLLABLE CHIEUCH U RIEULHIEUH
+ {0xAD85, 0xCDA6}, //7749 #HANGUL SYLLABLE CHIEUCH U PIEUPSIOS
+ {0xAD86, 0xCDA8}, //7750 #HANGUL SYLLABLE CHIEUCH U SSANGSIOS
+ {0xAD87, 0xCDAA}, //7751 #HANGUL SYLLABLE CHIEUCH U CIEUC
+ {0xAD88, 0xCDAB}, //7752 #HANGUL SYLLABLE CHIEUCH U CHIEUCH
+ {0xAD89, 0xCDAC}, //7753 #HANGUL SYLLABLE CHIEUCH U KHIEUKH
+ {0xAD8A, 0xCDAD}, //7754 #HANGUL SYLLABLE CHIEUCH U THIEUTH
+ {0xAD8B, 0xCDAE}, //7755 #HANGUL SYLLABLE CHIEUCH U PHIEUPH
+ {0xAD8C, 0xCDAF}, //7756 #HANGUL SYLLABLE CHIEUCH U HIEUH
+ {0xAD8D, 0xCDB1}, //7757 #HANGUL SYLLABLE CHIEUCH WEO KIYEOK
+ {0xAD8E, 0xCDB2}, //7758 #HANGUL SYLLABLE CHIEUCH WEO SSANGKIYEOK
+ {0xAD8F, 0xCDB3}, //7759 #HANGUL SYLLABLE CHIEUCH WEO KIYEOKSIOS
+ {0xAD90, 0xCDB4}, //7760 #HANGUL SYLLABLE CHIEUCH WEO NIEUN
+ {0xAD91, 0xCDB5}, //7761 #HANGUL SYLLABLE CHIEUCH WEO NIEUNCIEUC
+ {0xAD92, 0xCDB6}, //7762 #HANGUL SYLLABLE CHIEUCH WEO NIEUNHIEUH
+ {0xAD93, 0xCDB7}, //7763 #HANGUL SYLLABLE CHIEUCH WEO TIKEUT
+ {0xAD94, 0xCDB8}, //7764 #HANGUL SYLLABLE CHIEUCH WEO RIEUL
+ {0xAD95, 0xCDB9}, //7765 #HANGUL SYLLABLE CHIEUCH WEO RIEULKIYEOK
+ {0xAD96, 0xCDBA}, //7766 #HANGUL SYLLABLE CHIEUCH WEO RIEULMIEUM
+ {0xAD97, 0xCDBB}, //7767 #HANGUL SYLLABLE CHIEUCH WEO RIEULPIEUP
+ {0xAD98, 0xCDBC}, //7768 #HANGUL SYLLABLE CHIEUCH WEO RIEULSIOS
+ {0xAD99, 0xCDBD}, //7769 #HANGUL SYLLABLE CHIEUCH WEO RIEULTHIEUTH
+ {0xAD9A, 0xCDBE}, //7770 #HANGUL SYLLABLE CHIEUCH WEO RIEULPHIEUPH
+ {0xAD9B, 0xCDBF}, //7771 #HANGUL SYLLABLE CHIEUCH WEO RIEULHIEUH
+ {0xAD9C, 0xCDC0}, //7772 #HANGUL SYLLABLE CHIEUCH WEO MIEUM
+ {0xAD9D, 0xCDC1}, //7773 #HANGUL SYLLABLE CHIEUCH WEO PIEUP
+ {0xAD9E, 0xCDC2}, //7774 #HANGUL SYLLABLE CHIEUCH WEO PIEUPSIOS
+ {0xAD9F, 0xCDC3}, //7775 #HANGUL SYLLABLE CHIEUCH WEO SIOS
+ {0xADA0, 0xCDC5}, //7776 #HANGUL SYLLABLE CHIEUCH WEO IEUNG
+ {0xAE41, 0xCDC6}, //7777 #HANGUL SYLLABLE CHIEUCH WEO CIEUC
+ {0xAE42, 0xCDC7}, //7778 #HANGUL SYLLABLE CHIEUCH WEO CHIEUCH
+ {0xAE43, 0xCDC8}, //7779 #HANGUL SYLLABLE CHIEUCH WEO KHIEUKH
+ {0xAE44, 0xCDC9}, //7780 #HANGUL SYLLABLE CHIEUCH WEO THIEUTH
+ {0xAE45, 0xCDCA}, //7781 #HANGUL SYLLABLE CHIEUCH WEO PHIEUPH
+ {0xAE46, 0xCDCB}, //7782 #HANGUL SYLLABLE CHIEUCH WEO HIEUH
+ {0xAE47, 0xCDCD}, //7783 #HANGUL SYLLABLE CHIEUCH WE KIYEOK
+ {0xAE48, 0xCDCE}, //7784 #HANGUL SYLLABLE CHIEUCH WE SSANGKIYEOK
+ {0xAE49, 0xCDCF}, //7785 #HANGUL SYLLABLE CHIEUCH WE KIYEOKSIOS
+ {0xAE4A, 0xCDD1}, //7786 #HANGUL SYLLABLE CHIEUCH WE NIEUNCIEUC
+ {0xAE4B, 0xCDD2}, //7787 #HANGUL SYLLABLE CHIEUCH WE NIEUNHIEUH
+ {0xAE4C, 0xCDD3}, //7788 #HANGUL SYLLABLE CHIEUCH WE TIKEUT
+ {0xAE4D, 0xCDD4}, //7789 #HANGUL SYLLABLE CHIEUCH WE RIEUL
+ {0xAE4E, 0xCDD5}, //7790 #HANGUL SYLLABLE CHIEUCH WE RIEULKIYEOK
+ {0xAE4F, 0xCDD6}, //7791 #HANGUL SYLLABLE CHIEUCH WE RIEULMIEUM
+ {0xAE50, 0xCDD7}, //7792 #HANGUL SYLLABLE CHIEUCH WE RIEULPIEUP
+ {0xAE51, 0xCDD8}, //7793 #HANGUL SYLLABLE CHIEUCH WE RIEULSIOS
+ {0xAE52, 0xCDD9}, //7794 #HANGUL SYLLABLE CHIEUCH WE RIEULTHIEUTH
+ {0xAE53, 0xCDDA}, //7795 #HANGUL SYLLABLE CHIEUCH WE RIEULPHIEUPH
+ {0xAE54, 0xCDDB}, //7796 #HANGUL SYLLABLE CHIEUCH WE RIEULHIEUH
+ {0xAE55, 0xCDDC}, //7797 #HANGUL SYLLABLE CHIEUCH WE MIEUM
+ {0xAE56, 0xCDDD}, //7798 #HANGUL SYLLABLE CHIEUCH WE PIEUP
+ {0xAE57, 0xCDDE}, //7799 #HANGUL SYLLABLE CHIEUCH WE PIEUPSIOS
+ {0xAE58, 0xCDDF}, //7800 #HANGUL SYLLABLE CHIEUCH WE SIOS
+ {0xAE59, 0xCDE0}, //7801 #HANGUL SYLLABLE CHIEUCH WE SSANGSIOS
+ {0xAE5A, 0xCDE1}, //7802 #HANGUL SYLLABLE CHIEUCH WE IEUNG
+ {0xAE61, 0xCDE2}, //7803 #HANGUL SYLLABLE CHIEUCH WE CIEUC
+ {0xAE62, 0xCDE3}, //7804 #HANGUL SYLLABLE CHIEUCH WE CHIEUCH
+ {0xAE63, 0xCDE4}, //7805 #HANGUL SYLLABLE CHIEUCH WE KHIEUKH
+ {0xAE64, 0xCDE5}, //7806 #HANGUL SYLLABLE CHIEUCH WE THIEUTH
+ {0xAE65, 0xCDE6}, //7807 #HANGUL SYLLABLE CHIEUCH WE PHIEUPH
+ {0xAE66, 0xCDE7}, //7808 #HANGUL SYLLABLE CHIEUCH WE HIEUH
+ {0xAE67, 0xCDE9}, //7809 #HANGUL SYLLABLE CHIEUCH WI KIYEOK
+ {0xAE68, 0xCDEA}, //7810 #HANGUL SYLLABLE CHIEUCH WI SSANGKIYEOK
+ {0xAE69, 0xCDEB}, //7811 #HANGUL SYLLABLE CHIEUCH WI KIYEOKSIOS
+ {0xAE6A, 0xCDED}, //7812 #HANGUL SYLLABLE CHIEUCH WI NIEUNCIEUC
+ {0xAE6B, 0xCDEE}, //7813 #HANGUL SYLLABLE CHIEUCH WI NIEUNHIEUH
+ {0xAE6C, 0xCDEF}, //7814 #HANGUL SYLLABLE CHIEUCH WI TIKEUT
+ {0xAE6D, 0xCDF1}, //7815 #HANGUL SYLLABLE CHIEUCH WI RIEULKIYEOK
+ {0xAE6E, 0xCDF2}, //7816 #HANGUL SYLLABLE CHIEUCH WI RIEULMIEUM
+ {0xAE6F, 0xCDF3}, //7817 #HANGUL SYLLABLE CHIEUCH WI RIEULPIEUP
+ {0xAE70, 0xCDF4}, //7818 #HANGUL SYLLABLE CHIEUCH WI RIEULSIOS
+ {0xAE71, 0xCDF5}, //7819 #HANGUL SYLLABLE CHIEUCH WI RIEULTHIEUTH
+ {0xAE72, 0xCDF6}, //7820 #HANGUL SYLLABLE CHIEUCH WI RIEULPHIEUPH
+ {0xAE73, 0xCDF7}, //7821 #HANGUL SYLLABLE CHIEUCH WI RIEULHIEUH
+ {0xAE74, 0xCDFA}, //7822 #HANGUL SYLLABLE CHIEUCH WI PIEUPSIOS
+ {0xAE75, 0xCDFC}, //7823 #HANGUL SYLLABLE CHIEUCH WI SSANGSIOS
+ {0xAE76, 0xCDFE}, //7824 #HANGUL SYLLABLE CHIEUCH WI CIEUC
+ {0xAE77, 0xCDFF}, //7825 #HANGUL SYLLABLE CHIEUCH WI CHIEUCH
+ {0xAE78, 0xCE00}, //7826 #HANGUL SYLLABLE CHIEUCH WI KHIEUKH
+ {0xAE79, 0xCE01}, //7827 #HANGUL SYLLABLE CHIEUCH WI THIEUTH
+ {0xAE7A, 0xCE02}, //7828 #HANGUL SYLLABLE CHIEUCH WI PHIEUPH
+ {0xAE81, 0xCE03}, //7829 #HANGUL SYLLABLE CHIEUCH WI HIEUH
+ {0xAE82, 0xCE05}, //7830 #HANGUL SYLLABLE CHIEUCH YU KIYEOK
+ {0xAE83, 0xCE06}, //7831 #HANGUL SYLLABLE CHIEUCH YU SSANGKIYEOK
+ {0xAE84, 0xCE07}, //7832 #HANGUL SYLLABLE CHIEUCH YU KIYEOKSIOS
+ {0xAE85, 0xCE09}, //7833 #HANGUL SYLLABLE CHIEUCH YU NIEUNCIEUC
+ {0xAE86, 0xCE0A}, //7834 #HANGUL SYLLABLE CHIEUCH YU NIEUNHIEUH
+ {0xAE87, 0xCE0B}, //7835 #HANGUL SYLLABLE CHIEUCH YU TIKEUT
+ {0xAE88, 0xCE0D}, //7836 #HANGUL SYLLABLE CHIEUCH YU RIEULKIYEOK
+ {0xAE89, 0xCE0E}, //7837 #HANGUL SYLLABLE CHIEUCH YU RIEULMIEUM
+ {0xAE8A, 0xCE0F}, //7838 #HANGUL SYLLABLE CHIEUCH YU RIEULPIEUP
+ {0xAE8B, 0xCE10}, //7839 #HANGUL SYLLABLE CHIEUCH YU RIEULSIOS
+ {0xAE8C, 0xCE11}, //7840 #HANGUL SYLLABLE CHIEUCH YU RIEULTHIEUTH
+ {0xAE8D, 0xCE12}, //7841 #HANGUL SYLLABLE CHIEUCH YU RIEULPHIEUPH
+ {0xAE8E, 0xCE13}, //7842 #HANGUL SYLLABLE CHIEUCH YU RIEULHIEUH
+ {0xAE8F, 0xCE15}, //7843 #HANGUL SYLLABLE CHIEUCH YU PIEUP
+ {0xAE90, 0xCE16}, //7844 #HANGUL SYLLABLE CHIEUCH YU PIEUPSIOS
+ {0xAE91, 0xCE17}, //7845 #HANGUL SYLLABLE CHIEUCH YU SIOS
+ {0xAE92, 0xCE18}, //7846 #HANGUL SYLLABLE CHIEUCH YU SSANGSIOS
+ {0xAE93, 0xCE1A}, //7847 #HANGUL SYLLABLE CHIEUCH YU CIEUC
+ {0xAE94, 0xCE1B}, //7848 #HANGUL SYLLABLE CHIEUCH YU CHIEUCH
+ {0xAE95, 0xCE1C}, //7849 #HANGUL SYLLABLE CHIEUCH YU KHIEUKH
+ {0xAE96, 0xCE1D}, //7850 #HANGUL SYLLABLE CHIEUCH YU THIEUTH
+ {0xAE97, 0xCE1E}, //7851 #HANGUL SYLLABLE CHIEUCH YU PHIEUPH
+ {0xAE98, 0xCE1F}, //7852 #HANGUL SYLLABLE CHIEUCH YU HIEUH
+ {0xAE99, 0xCE22}, //7853 #HANGUL SYLLABLE CHIEUCH EU SSANGKIYEOK
+ {0xAE9A, 0xCE23}, //7854 #HANGUL SYLLABLE CHIEUCH EU KIYEOKSIOS
+ {0xAE9B, 0xCE25}, //7855 #HANGUL SYLLABLE CHIEUCH EU NIEUNCIEUC
+ {0xAE9C, 0xCE26}, //7856 #HANGUL SYLLABLE CHIEUCH EU NIEUNHIEUH
+ {0xAE9D, 0xCE27}, //7857 #HANGUL SYLLABLE CHIEUCH EU TIKEUT
+ {0xAE9E, 0xCE29}, //7858 #HANGUL SYLLABLE CHIEUCH EU RIEULKIYEOK
+ {0xAE9F, 0xCE2A}, //7859 #HANGUL SYLLABLE CHIEUCH EU RIEULMIEUM
+ {0xAEA0, 0xCE2B}, //7860 #HANGUL SYLLABLE CHIEUCH EU RIEULPIEUP
+ {0xAF41, 0xCE2C}, //7861 #HANGUL SYLLABLE CHIEUCH EU RIEULSIOS
+ {0xAF42, 0xCE2D}, //7862 #HANGUL SYLLABLE CHIEUCH EU RIEULTHIEUTH
+ {0xAF43, 0xCE2E}, //7863 #HANGUL SYLLABLE CHIEUCH EU RIEULPHIEUPH
+ {0xAF44, 0xCE2F}, //7864 #HANGUL SYLLABLE CHIEUCH EU RIEULHIEUH
+ {0xAF45, 0xCE32}, //7865 #HANGUL SYLLABLE CHIEUCH EU PIEUPSIOS
+ {0xAF46, 0xCE34}, //7866 #HANGUL SYLLABLE CHIEUCH EU SSANGSIOS
+ {0xAF47, 0xCE36}, //7867 #HANGUL SYLLABLE CHIEUCH EU CIEUC
+ {0xAF48, 0xCE37}, //7868 #HANGUL SYLLABLE CHIEUCH EU CHIEUCH
+ {0xAF49, 0xCE38}, //7869 #HANGUL SYLLABLE CHIEUCH EU KHIEUKH
+ {0xAF4A, 0xCE39}, //7870 #HANGUL SYLLABLE CHIEUCH EU THIEUTH
+ {0xAF4B, 0xCE3A}, //7871 #HANGUL SYLLABLE CHIEUCH EU PHIEUPH
+ {0xAF4C, 0xCE3B}, //7872 #HANGUL SYLLABLE CHIEUCH EU HIEUH
+ {0xAF4D, 0xCE3C}, //7873 #HANGUL SYLLABLE CHIEUCH YI
+ {0xAF4E, 0xCE3D}, //7874 #HANGUL SYLLABLE CHIEUCH YI KIYEOK
+ {0xAF4F, 0xCE3E}, //7875 #HANGUL SYLLABLE CHIEUCH YI SSANGKIYEOK
+ {0xAF50, 0xCE3F}, //7876 #HANGUL SYLLABLE CHIEUCH YI KIYEOKSIOS
+ {0xAF51, 0xCE40}, //7877 #HANGUL SYLLABLE CHIEUCH YI NIEUN
+ {0xAF52, 0xCE41}, //7878 #HANGUL SYLLABLE CHIEUCH YI NIEUNCIEUC
+ {0xAF53, 0xCE42}, //7879 #HANGUL SYLLABLE CHIEUCH YI NIEUNHIEUH
+ {0xAF54, 0xCE43}, //7880 #HANGUL SYLLABLE CHIEUCH YI TIKEUT
+ {0xAF55, 0xCE44}, //7881 #HANGUL SYLLABLE CHIEUCH YI RIEUL
+ {0xAF56, 0xCE45}, //7882 #HANGUL SYLLABLE CHIEUCH YI RIEULKIYEOK
+ {0xAF57, 0xCE46}, //7883 #HANGUL SYLLABLE CHIEUCH YI RIEULMIEUM
+ {0xAF58, 0xCE47}, //7884 #HANGUL SYLLABLE CHIEUCH YI RIEULPIEUP
+ {0xAF59, 0xCE48}, //7885 #HANGUL SYLLABLE CHIEUCH YI RIEULSIOS
+ {0xAF5A, 0xCE49}, //7886 #HANGUL SYLLABLE CHIEUCH YI RIEULTHIEUTH
+ {0xAF61, 0xCE4A}, //7887 #HANGUL SYLLABLE CHIEUCH YI RIEULPHIEUPH
+ {0xAF62, 0xCE4B}, //7888 #HANGUL SYLLABLE CHIEUCH YI RIEULHIEUH
+ {0xAF63, 0xCE4C}, //7889 #HANGUL SYLLABLE CHIEUCH YI MIEUM
+ {0xAF64, 0xCE4D}, //7890 #HANGUL SYLLABLE CHIEUCH YI PIEUP
+ {0xAF65, 0xCE4E}, //7891 #HANGUL SYLLABLE CHIEUCH YI PIEUPSIOS
+ {0xAF66, 0xCE4F}, //7892 #HANGUL SYLLABLE CHIEUCH YI SIOS
+ {0xAF67, 0xCE50}, //7893 #HANGUL SYLLABLE CHIEUCH YI SSANGSIOS
+ {0xAF68, 0xCE51}, //7894 #HANGUL SYLLABLE CHIEUCH YI IEUNG
+ {0xAF69, 0xCE52}, //7895 #HANGUL SYLLABLE CHIEUCH YI CIEUC
+ {0xAF6A, 0xCE53}, //7896 #HANGUL SYLLABLE CHIEUCH YI CHIEUCH
+ {0xAF6B, 0xCE54}, //7897 #HANGUL SYLLABLE CHIEUCH YI KHIEUKH
+ {0xAF6C, 0xCE55}, //7898 #HANGUL SYLLABLE CHIEUCH YI THIEUTH
+ {0xAF6D, 0xCE56}, //7899 #HANGUL SYLLABLE CHIEUCH YI PHIEUPH
+ {0xAF6E, 0xCE57}, //7900 #HANGUL SYLLABLE CHIEUCH YI HIEUH
+ {0xAF6F, 0xCE5A}, //7901 #HANGUL SYLLABLE CHIEUCH I SSANGKIYEOK
+ {0xAF70, 0xCE5B}, //7902 #HANGUL SYLLABLE CHIEUCH I KIYEOKSIOS
+ {0xAF71, 0xCE5D}, //7903 #HANGUL SYLLABLE CHIEUCH I NIEUNCIEUC
+ {0xAF72, 0xCE5E}, //7904 #HANGUL SYLLABLE CHIEUCH I NIEUNHIEUH
+ {0xAF73, 0xCE62}, //7905 #HANGUL SYLLABLE CHIEUCH I RIEULMIEUM
+ {0xAF74, 0xCE63}, //7906 #HANGUL SYLLABLE CHIEUCH I RIEULPIEUP
+ {0xAF75, 0xCE64}, //7907 #HANGUL SYLLABLE CHIEUCH I RIEULSIOS
+ {0xAF76, 0xCE65}, //7908 #HANGUL SYLLABLE CHIEUCH I RIEULTHIEUTH
+ {0xAF77, 0xCE66}, //7909 #HANGUL SYLLABLE CHIEUCH I RIEULPHIEUPH
+ {0xAF78, 0xCE67}, //7910 #HANGUL SYLLABLE CHIEUCH I RIEULHIEUH
+ {0xAF79, 0xCE6A}, //7911 #HANGUL SYLLABLE CHIEUCH I PIEUPSIOS
+ {0xAF7A, 0xCE6C}, //7912 #HANGUL SYLLABLE CHIEUCH I SSANGSIOS
+ {0xAF81, 0xCE6E}, //7913 #HANGUL SYLLABLE CHIEUCH I CIEUC
+ {0xAF82, 0xCE6F}, //7914 #HANGUL SYLLABLE CHIEUCH I CHIEUCH
+ {0xAF83, 0xCE70}, //7915 #HANGUL SYLLABLE CHIEUCH I KHIEUKH
+ {0xAF84, 0xCE71}, //7916 #HANGUL SYLLABLE CHIEUCH I THIEUTH
+ {0xAF85, 0xCE72}, //7917 #HANGUL SYLLABLE CHIEUCH I PHIEUPH
+ {0xAF86, 0xCE73}, //7918 #HANGUL SYLLABLE CHIEUCH I HIEUH
+ {0xAF87, 0xCE76}, //7919 #HANGUL SYLLABLE KHIEUKH A SSANGKIYEOK
+ {0xAF88, 0xCE77}, //7920 #HANGUL SYLLABLE KHIEUKH A KIYEOKSIOS
+ {0xAF89, 0xCE79}, //7921 #HANGUL SYLLABLE KHIEUKH A NIEUNCIEUC
+ {0xAF8A, 0xCE7A}, //7922 #HANGUL SYLLABLE KHIEUKH A NIEUNHIEUH
+ {0xAF8B, 0xCE7B}, //7923 #HANGUL SYLLABLE KHIEUKH A TIKEUT
+ {0xAF8C, 0xCE7D}, //7924 #HANGUL SYLLABLE KHIEUKH A RIEULKIYEOK
+ {0xAF8D, 0xCE7E}, //7925 #HANGUL SYLLABLE KHIEUKH A RIEULMIEUM
+ {0xAF8E, 0xCE7F}, //7926 #HANGUL SYLLABLE KHIEUKH A RIEULPIEUP
+ {0xAF8F, 0xCE80}, //7927 #HANGUL SYLLABLE KHIEUKH A RIEULSIOS
+ {0xAF90, 0xCE81}, //7928 #HANGUL SYLLABLE KHIEUKH A RIEULTHIEUTH
+ {0xAF91, 0xCE82}, //7929 #HANGUL SYLLABLE KHIEUKH A RIEULPHIEUPH
+ {0xAF92, 0xCE83}, //7930 #HANGUL SYLLABLE KHIEUKH A RIEULHIEUH
+ {0xAF93, 0xCE86}, //7931 #HANGUL SYLLABLE KHIEUKH A PIEUPSIOS
+ {0xAF94, 0xCE88}, //7932 #HANGUL SYLLABLE KHIEUKH A SSANGSIOS
+ {0xAF95, 0xCE8A}, //7933 #HANGUL SYLLABLE KHIEUKH A CIEUC
+ {0xAF96, 0xCE8B}, //7934 #HANGUL SYLLABLE KHIEUKH A CHIEUCH
+ {0xAF97, 0xCE8C}, //7935 #HANGUL SYLLABLE KHIEUKH A KHIEUKH
+ {0xAF98, 0xCE8D}, //7936 #HANGUL SYLLABLE KHIEUKH A THIEUTH
+ {0xAF99, 0xCE8E}, //7937 #HANGUL SYLLABLE KHIEUKH A PHIEUPH
+ {0xAF9A, 0xCE8F}, //7938 #HANGUL SYLLABLE KHIEUKH A HIEUH
+ {0xAF9B, 0xCE92}, //7939 #HANGUL SYLLABLE KHIEUKH AE SSANGKIYEOK
+ {0xAF9C, 0xCE93}, //7940 #HANGUL SYLLABLE KHIEUKH AE KIYEOKSIOS
+ {0xAF9D, 0xCE95}, //7941 #HANGUL SYLLABLE KHIEUKH AE NIEUNCIEUC
+ {0xAF9E, 0xCE96}, //7942 #HANGUL SYLLABLE KHIEUKH AE NIEUNHIEUH
+ {0xAF9F, 0xCE97}, //7943 #HANGUL SYLLABLE KHIEUKH AE TIKEUT
+ {0xAFA0, 0xCE99}, //7944 #HANGUL SYLLABLE KHIEUKH AE RIEULKIYEOK
+ {0xB041, 0xCE9A}, //7945 #HANGUL SYLLABLE KHIEUKH AE RIEULMIEUM
+ {0xB042, 0xCE9B}, //7946 #HANGUL SYLLABLE KHIEUKH AE RIEULPIEUP
+ {0xB043, 0xCE9C}, //7947 #HANGUL SYLLABLE KHIEUKH AE RIEULSIOS
+ {0xB044, 0xCE9D}, //7948 #HANGUL SYLLABLE KHIEUKH AE RIEULTHIEUTH
+ {0xB045, 0xCE9E}, //7949 #HANGUL SYLLABLE KHIEUKH AE RIEULPHIEUPH
+ {0xB046, 0xCE9F}, //7950 #HANGUL SYLLABLE KHIEUKH AE RIEULHIEUH
+ {0xB047, 0xCEA2}, //7951 #HANGUL SYLLABLE KHIEUKH AE PIEUPSIOS
+ {0xB048, 0xCEA6}, //7952 #HANGUL SYLLABLE KHIEUKH AE CIEUC
+ {0xB049, 0xCEA7}, //7953 #HANGUL SYLLABLE KHIEUKH AE CHIEUCH
+ {0xB04A, 0xCEA8}, //7954 #HANGUL SYLLABLE KHIEUKH AE KHIEUKH
+ {0xB04B, 0xCEA9}, //7955 #HANGUL SYLLABLE KHIEUKH AE THIEUTH
+ {0xB04C, 0xCEAA}, //7956 #HANGUL SYLLABLE KHIEUKH AE PHIEUPH
+ {0xB04D, 0xCEAB}, //7957 #HANGUL SYLLABLE KHIEUKH AE HIEUH
+ {0xB04E, 0xCEAE}, //7958 #HANGUL SYLLABLE KHIEUKH YA SSANGKIYEOK
+ {0xB04F, 0xCEAF}, //7959 #HANGUL SYLLABLE KHIEUKH YA KIYEOKSIOS
+ {0xB050, 0xCEB0}, //7960 #HANGUL SYLLABLE KHIEUKH YA NIEUN
+ {0xB051, 0xCEB1}, //7961 #HANGUL SYLLABLE KHIEUKH YA NIEUNCIEUC
+ {0xB052, 0xCEB2}, //7962 #HANGUL SYLLABLE KHIEUKH YA NIEUNHIEUH
+ {0xB053, 0xCEB3}, //7963 #HANGUL SYLLABLE KHIEUKH YA TIKEUT
+ {0xB054, 0xCEB4}, //7964 #HANGUL SYLLABLE KHIEUKH YA RIEUL
+ {0xB055, 0xCEB5}, //7965 #HANGUL SYLLABLE KHIEUKH YA RIEULKIYEOK
+ {0xB056, 0xCEB6}, //7966 #HANGUL SYLLABLE KHIEUKH YA RIEULMIEUM
+ {0xB057, 0xCEB7}, //7967 #HANGUL SYLLABLE KHIEUKH YA RIEULPIEUP
+ {0xB058, 0xCEB8}, //7968 #HANGUL SYLLABLE KHIEUKH YA RIEULSIOS
+ {0xB059, 0xCEB9}, //7969 #HANGUL SYLLABLE KHIEUKH YA RIEULTHIEUTH
+ {0xB05A, 0xCEBA}, //7970 #HANGUL SYLLABLE KHIEUKH YA RIEULPHIEUPH
+ {0xB061, 0xCEBB}, //7971 #HANGUL SYLLABLE KHIEUKH YA RIEULHIEUH
+ {0xB062, 0xCEBC}, //7972 #HANGUL SYLLABLE KHIEUKH YA MIEUM
+ {0xB063, 0xCEBD}, //7973 #HANGUL SYLLABLE KHIEUKH YA PIEUP
+ {0xB064, 0xCEBE}, //7974 #HANGUL SYLLABLE KHIEUKH YA PIEUPSIOS
+ {0xB065, 0xCEBF}, //7975 #HANGUL SYLLABLE KHIEUKH YA SIOS
+ {0xB066, 0xCEC0}, //7976 #HANGUL SYLLABLE KHIEUKH YA SSANGSIOS
+ {0xB067, 0xCEC2}, //7977 #HANGUL SYLLABLE KHIEUKH YA CIEUC
+ {0xB068, 0xCEC3}, //7978 #HANGUL SYLLABLE KHIEUKH YA CHIEUCH
+ {0xB069, 0xCEC4}, //7979 #HANGUL SYLLABLE KHIEUKH YA KHIEUKH
+ {0xB06A, 0xCEC5}, //7980 #HANGUL SYLLABLE KHIEUKH YA THIEUTH
+ {0xB06B, 0xCEC6}, //7981 #HANGUL SYLLABLE KHIEUKH YA PHIEUPH
+ {0xB06C, 0xCEC7}, //7982 #HANGUL SYLLABLE KHIEUKH YA HIEUH
+ {0xB06D, 0xCEC8}, //7983 #HANGUL SYLLABLE KHIEUKH YAE
+ {0xB06E, 0xCEC9}, //7984 #HANGUL SYLLABLE KHIEUKH YAE KIYEOK
+ {0xB06F, 0xCECA}, //7985 #HANGUL SYLLABLE KHIEUKH YAE SSANGKIYEOK
+ {0xB070, 0xCECB}, //7986 #HANGUL SYLLABLE KHIEUKH YAE KIYEOKSIOS
+ {0xB071, 0xCECC}, //7987 #HANGUL SYLLABLE KHIEUKH YAE NIEUN
+ {0xB072, 0xCECD}, //7988 #HANGUL SYLLABLE KHIEUKH YAE NIEUNCIEUC
+ {0xB073, 0xCECE}, //7989 #HANGUL SYLLABLE KHIEUKH YAE NIEUNHIEUH
+ {0xB074, 0xCECF}, //7990 #HANGUL SYLLABLE KHIEUKH YAE TIKEUT
+ {0xB075, 0xCED0}, //7991 #HANGUL SYLLABLE KHIEUKH YAE RIEUL
+ {0xB076, 0xCED1}, //7992 #HANGUL SYLLABLE KHIEUKH YAE RIEULKIYEOK
+ {0xB077, 0xCED2}, //7993 #HANGUL SYLLABLE KHIEUKH YAE RIEULMIEUM
+ {0xB078, 0xCED3}, //7994 #HANGUL SYLLABLE KHIEUKH YAE RIEULPIEUP
+ {0xB079, 0xCED4}, //7995 #HANGUL SYLLABLE KHIEUKH YAE RIEULSIOS
+ {0xB07A, 0xCED5}, //7996 #HANGUL SYLLABLE KHIEUKH YAE RIEULTHIEUTH
+ {0xB081, 0xCED6}, //7997 #HANGUL SYLLABLE KHIEUKH YAE RIEULPHIEUPH
+ {0xB082, 0xCED7}, //7998 #HANGUL SYLLABLE KHIEUKH YAE RIEULHIEUH
+ {0xB083, 0xCED8}, //7999 #HANGUL SYLLABLE KHIEUKH YAE MIEUM
+ {0xB084, 0xCED9}, //8000 #HANGUL SYLLABLE KHIEUKH YAE PIEUP
+ {0xB085, 0xCEDA}, //8001 #HANGUL SYLLABLE KHIEUKH YAE PIEUPSIOS
+ {0xB086, 0xCEDB}, //8002 #HANGUL SYLLABLE KHIEUKH YAE SIOS
+ {0xB087, 0xCEDC}, //8003 #HANGUL SYLLABLE KHIEUKH YAE SSANGSIOS
+ {0xB088, 0xCEDD}, //8004 #HANGUL SYLLABLE KHIEUKH YAE IEUNG
+ {0xB089, 0xCEDE}, //8005 #HANGUL SYLLABLE KHIEUKH YAE CIEUC
+ {0xB08A, 0xCEDF}, //8006 #HANGUL SYLLABLE KHIEUKH YAE CHIEUCH
+ {0xB08B, 0xCEE0}, //8007 #HANGUL SYLLABLE KHIEUKH YAE KHIEUKH
+ {0xB08C, 0xCEE1}, //8008 #HANGUL SYLLABLE KHIEUKH YAE THIEUTH
+ {0xB08D, 0xCEE2}, //8009 #HANGUL SYLLABLE KHIEUKH YAE PHIEUPH
+ {0xB08E, 0xCEE3}, //8010 #HANGUL SYLLABLE KHIEUKH YAE HIEUH
+ {0xB08F, 0xCEE6}, //8011 #HANGUL SYLLABLE KHIEUKH EO SSANGKIYEOK
+ {0xB090, 0xCEE7}, //8012 #HANGUL SYLLABLE KHIEUKH EO KIYEOKSIOS
+ {0xB091, 0xCEE9}, //8013 #HANGUL SYLLABLE KHIEUKH EO NIEUNCIEUC
+ {0xB092, 0xCEEA}, //8014 #HANGUL SYLLABLE KHIEUKH EO NIEUNHIEUH
+ {0xB093, 0xCEED}, //8015 #HANGUL SYLLABLE KHIEUKH EO RIEULKIYEOK
+ {0xB094, 0xCEEE}, //8016 #HANGUL SYLLABLE KHIEUKH EO RIEULMIEUM
+ {0xB095, 0xCEEF}, //8017 #HANGUL SYLLABLE KHIEUKH EO RIEULPIEUP
+ {0xB096, 0xCEF0}, //8018 #HANGUL SYLLABLE KHIEUKH EO RIEULSIOS
+ {0xB097, 0xCEF1}, //8019 #HANGUL SYLLABLE KHIEUKH EO RIEULTHIEUTH
+ {0xB098, 0xCEF2}, //8020 #HANGUL SYLLABLE KHIEUKH EO RIEULPHIEUPH
+ {0xB099, 0xCEF3}, //8021 #HANGUL SYLLABLE KHIEUKH EO RIEULHIEUH
+ {0xB09A, 0xCEF6}, //8022 #HANGUL SYLLABLE KHIEUKH EO PIEUPSIOS
+ {0xB09B, 0xCEFA}, //8023 #HANGUL SYLLABLE KHIEUKH EO CIEUC
+ {0xB09C, 0xCEFB}, //8024 #HANGUL SYLLABLE KHIEUKH EO CHIEUCH
+ {0xB09D, 0xCEFC}, //8025 #HANGUL SYLLABLE KHIEUKH EO KHIEUKH
+ {0xB09E, 0xCEFD}, //8026 #HANGUL SYLLABLE KHIEUKH EO THIEUTH
+ {0xB09F, 0xCEFE}, //8027 #HANGUL SYLLABLE KHIEUKH EO PHIEUPH
+ {0xB0A0, 0xCEFF}, //8028 #HANGUL SYLLABLE KHIEUKH EO HIEUH
+ {0xB0A1, 0xAC00}, //8029 #HANGUL SYLLABLE KIYEOK A
+ {0xB0A2, 0xAC01}, //8030 #HANGUL SYLLABLE KIYEOK A KIYEOK
+ {0xB0A3, 0xAC04}, //8031 #HANGUL SYLLABLE KIYEOK A NIEUN
+ {0xB0A4, 0xAC07}, //8032 #HANGUL SYLLABLE KIYEOK A TIKEUT
+ {0xB0A5, 0xAC08}, //8033 #HANGUL SYLLABLE KIYEOK A RIEUL
+ {0xB0A6, 0xAC09}, //8034 #HANGUL SYLLABLE KIYEOK A RIEULKIYEOK
+ {0xB0A7, 0xAC0A}, //8035 #HANGUL SYLLABLE KIYEOK A RIEULMIEUM
+ {0xB0A8, 0xAC10}, //8036 #HANGUL SYLLABLE KIYEOK A MIEUM
+ {0xB0A9, 0xAC11}, //8037 #HANGUL SYLLABLE KIYEOK A PIEUP
+ {0xB0AA, 0xAC12}, //8038 #HANGUL SYLLABLE KIYEOK A PIEUPSIOS
+ {0xB0AB, 0xAC13}, //8039 #HANGUL SYLLABLE KIYEOK A SIOS
+ {0xB0AC, 0xAC14}, //8040 #HANGUL SYLLABLE KIYEOK A SSANGSIOS
+ {0xB0AD, 0xAC15}, //8041 #HANGUL SYLLABLE KIYEOK A IEUNG
+ {0xB0AE, 0xAC16}, //8042 #HANGUL SYLLABLE KIYEOK A CIEUC
+ {0xB0AF, 0xAC17}, //8043 #HANGUL SYLLABLE KIYEOK A CHIEUCH
+ {0xB0B0, 0xAC19}, //8044 #HANGUL SYLLABLE KIYEOK A THIEUTH
+ {0xB0B1, 0xAC1A}, //8045 #HANGUL SYLLABLE KIYEOK A PHIEUPH
+ {0xB0B2, 0xAC1B}, //8046 #HANGUL SYLLABLE KIYEOK A HIEUH
+ {0xB0B3, 0xAC1C}, //8047 #HANGUL SYLLABLE KIYEOK AE
+ {0xB0B4, 0xAC1D}, //8048 #HANGUL SYLLABLE KIYEOK AE KIYEOK
+ {0xB0B5, 0xAC20}, //8049 #HANGUL SYLLABLE KIYEOK AE NIEUN
+ {0xB0B6, 0xAC24}, //8050 #HANGUL SYLLABLE KIYEOK AE RIEUL
+ {0xB0B7, 0xAC2C}, //8051 #HANGUL SYLLABLE KIYEOK AE MIEUM
+ {0xB0B8, 0xAC2D}, //8052 #HANGUL SYLLABLE KIYEOK AE PIEUP
+ {0xB0B9, 0xAC2F}, //8053 #HANGUL SYLLABLE KIYEOK AE SIOS
+ {0xB0BA, 0xAC30}, //8054 #HANGUL SYLLABLE KIYEOK AE SSANGSIOS
+ {0xB0BB, 0xAC31}, //8055 #HANGUL SYLLABLE KIYEOK AE IEUNG
+ {0xB0BC, 0xAC38}, //8056 #HANGUL SYLLABLE KIYEOK YA
+ {0xB0BD, 0xAC39}, //8057 #HANGUL SYLLABLE KIYEOK YA KIYEOK
+ {0xB0BE, 0xAC3C}, //8058 #HANGUL SYLLABLE KIYEOK YA NIEUN
+ {0xB0BF, 0xAC40}, //8059 #HANGUL SYLLABLE KIYEOK YA RIEUL
+ {0xB0C0, 0xAC4B}, //8060 #HANGUL SYLLABLE KIYEOK YA SIOS
+ {0xB0C1, 0xAC4D}, //8061 #HANGUL SYLLABLE KIYEOK YA IEUNG
+ {0xB0C2, 0xAC54}, //8062 #HANGUL SYLLABLE KIYEOK YAE
+ {0xB0C3, 0xAC58}, //8063 #HANGUL SYLLABLE KIYEOK YAE NIEUN
+ {0xB0C4, 0xAC5C}, //8064 #HANGUL SYLLABLE KIYEOK YAE RIEUL
+ {0xB0C5, 0xAC70}, //8065 #HANGUL SYLLABLE KIYEOK EO
+ {0xB0C6, 0xAC71}, //8066 #HANGUL SYLLABLE KIYEOK EO KIYEOK
+ {0xB0C7, 0xAC74}, //8067 #HANGUL SYLLABLE KIYEOK EO NIEUN
+ {0xB0C8, 0xAC77}, //8068 #HANGUL SYLLABLE KIYEOK EO TIKEUT
+ {0xB0C9, 0xAC78}, //8069 #HANGUL SYLLABLE KIYEOK EO RIEUL
+ {0xB0CA, 0xAC7A}, //8070 #HANGUL SYLLABLE KIYEOK EO RIEULMIEUM
+ {0xB0CB, 0xAC80}, //8071 #HANGUL SYLLABLE KIYEOK EO MIEUM
+ {0xB0CC, 0xAC81}, //8072 #HANGUL SYLLABLE KIYEOK EO PIEUP
+ {0xB0CD, 0xAC83}, //8073 #HANGUL SYLLABLE KIYEOK EO SIOS
+ {0xB0CE, 0xAC84}, //8074 #HANGUL SYLLABLE KIYEOK EO SSANGSIOS
+ {0xB0CF, 0xAC85}, //8075 #HANGUL SYLLABLE KIYEOK EO IEUNG
+ {0xB0D0, 0xAC86}, //8076 #HANGUL SYLLABLE KIYEOK EO CIEUC
+ {0xB0D1, 0xAC89}, //8077 #HANGUL SYLLABLE KIYEOK EO THIEUTH
+ {0xB0D2, 0xAC8A}, //8078 #HANGUL SYLLABLE KIYEOK EO PHIEUPH
+ {0xB0D3, 0xAC8B}, //8079 #HANGUL SYLLABLE KIYEOK EO HIEUH
+ {0xB0D4, 0xAC8C}, //8080 #HANGUL SYLLABLE KIYEOK E
+ {0xB0D5, 0xAC90}, //8081 #HANGUL SYLLABLE KIYEOK E NIEUN
+ {0xB0D6, 0xAC94}, //8082 #HANGUL SYLLABLE KIYEOK E RIEUL
+ {0xB0D7, 0xAC9C}, //8083 #HANGUL SYLLABLE KIYEOK E MIEUM
+ {0xB0D8, 0xAC9D}, //8084 #HANGUL SYLLABLE KIYEOK E PIEUP
+ {0xB0D9, 0xAC9F}, //8085 #HANGUL SYLLABLE KIYEOK E SIOS
+ {0xB0DA, 0xACA0}, //8086 #HANGUL SYLLABLE KIYEOK E SSANGSIOS
+ {0xB0DB, 0xACA1}, //8087 #HANGUL SYLLABLE KIYEOK E IEUNG
+ {0xB0DC, 0xACA8}, //8088 #HANGUL SYLLABLE KIYEOK YEO
+ {0xB0DD, 0xACA9}, //8089 #HANGUL SYLLABLE KIYEOK YEO KIYEOK
+ {0xB0DE, 0xACAA}, //8090 #HANGUL SYLLABLE KIYEOK YEO SSANGKIYEOK
+ {0xB0DF, 0xACAC}, //8091 #HANGUL SYLLABLE KIYEOK YEO NIEUN
+ {0xB0E0, 0xACAF}, //8092 #HANGUL SYLLABLE KIYEOK YEO TIKEUT
+ {0xB0E1, 0xACB0}, //8093 #HANGUL SYLLABLE KIYEOK YEO RIEUL
+ {0xB0E2, 0xACB8}, //8094 #HANGUL SYLLABLE KIYEOK YEO MIEUM
+ {0xB0E3, 0xACB9}, //8095 #HANGUL SYLLABLE KIYEOK YEO PIEUP
+ {0xB0E4, 0xACBB}, //8096 #HANGUL SYLLABLE KIYEOK YEO SIOS
+ {0xB0E5, 0xACBC}, //8097 #HANGUL SYLLABLE KIYEOK YEO SSANGSIOS
+ {0xB0E6, 0xACBD}, //8098 #HANGUL SYLLABLE KIYEOK YEO IEUNG
+ {0xB0E7, 0xACC1}, //8099 #HANGUL SYLLABLE KIYEOK YEO THIEUTH
+ {0xB0E8, 0xACC4}, //8100 #HANGUL SYLLABLE KIYEOK YE
+ {0xB0E9, 0xACC8}, //8101 #HANGUL SYLLABLE KIYEOK YE NIEUN
+ {0xB0EA, 0xACCC}, //8102 #HANGUL SYLLABLE KIYEOK YE RIEUL
+ {0xB0EB, 0xACD5}, //8103 #HANGUL SYLLABLE KIYEOK YE PIEUP
+ {0xB0EC, 0xACD7}, //8104 #HANGUL SYLLABLE KIYEOK YE SIOS
+ {0xB0ED, 0xACE0}, //8105 #HANGUL SYLLABLE KIYEOK O
+ {0xB0EE, 0xACE1}, //8106 #HANGUL SYLLABLE KIYEOK O KIYEOK
+ {0xB0EF, 0xACE4}, //8107 #HANGUL SYLLABLE KIYEOK O NIEUN
+ {0xB0F0, 0xACE7}, //8108 #HANGUL SYLLABLE KIYEOK O TIKEUT
+ {0xB0F1, 0xACE8}, //8109 #HANGUL SYLLABLE KIYEOK O RIEUL
+ {0xB0F2, 0xACEA}, //8110 #HANGUL SYLLABLE KIYEOK O RIEULMIEUM
+ {0xB0F3, 0xACEC}, //8111 #HANGUL SYLLABLE KIYEOK O RIEULSIOS
+ {0xB0F4, 0xACEF}, //8112 #HANGUL SYLLABLE KIYEOK O RIEULHIEUH
+ {0xB0F5, 0xACF0}, //8113 #HANGUL SYLLABLE KIYEOK O MIEUM
+ {0xB0F6, 0xACF1}, //8114 #HANGUL SYLLABLE KIYEOK O PIEUP
+ {0xB0F7, 0xACF3}, //8115 #HANGUL SYLLABLE KIYEOK O SIOS
+ {0xB0F8, 0xACF5}, //8116 #HANGUL SYLLABLE KIYEOK O IEUNG
+ {0xB0F9, 0xACF6}, //8117 #HANGUL SYLLABLE KIYEOK O CIEUC
+ {0xB0FA, 0xACFC}, //8118 #HANGUL SYLLABLE KIYEOK WA
+ {0xB0FB, 0xACFD}, //8119 #HANGUL SYLLABLE KIYEOK WA KIYEOK
+ {0xB0FC, 0xAD00}, //8120 #HANGUL SYLLABLE KIYEOK WA NIEUN
+ {0xB0FD, 0xAD04}, //8121 #HANGUL SYLLABLE KIYEOK WA RIEUL
+ {0xB0FE, 0xAD06}, //8122 #HANGUL SYLLABLE KIYEOK WA RIEULMIEUM
+ {0xB141, 0xCF02}, //8123 #HANGUL SYLLABLE KHIEUKH E SSANGKIYEOK
+ {0xB142, 0xCF03}, //8124 #HANGUL SYLLABLE KHIEUKH E KIYEOKSIOS
+ {0xB143, 0xCF05}, //8125 #HANGUL SYLLABLE KHIEUKH E NIEUNCIEUC
+ {0xB144, 0xCF06}, //8126 #HANGUL SYLLABLE KHIEUKH E NIEUNHIEUH
+ {0xB145, 0xCF07}, //8127 #HANGUL SYLLABLE KHIEUKH E TIKEUT
+ {0xB146, 0xCF09}, //8128 #HANGUL SYLLABLE KHIEUKH E RIEULKIYEOK
+ {0xB147, 0xCF0A}, //8129 #HANGUL SYLLABLE KHIEUKH E RIEULMIEUM
+ {0xB148, 0xCF0B}, //8130 #HANGUL SYLLABLE KHIEUKH E RIEULPIEUP
+ {0xB149, 0xCF0C}, //8131 #HANGUL SYLLABLE KHIEUKH E RIEULSIOS
+ {0xB14A, 0xCF0D}, //8132 #HANGUL SYLLABLE KHIEUKH E RIEULTHIEUTH
+ {0xB14B, 0xCF0E}, //8133 #HANGUL SYLLABLE KHIEUKH E RIEULPHIEUPH
+ {0xB14C, 0xCF0F}, //8134 #HANGUL SYLLABLE KHIEUKH E RIEULHIEUH
+ {0xB14D, 0xCF12}, //8135 #HANGUL SYLLABLE KHIEUKH E PIEUPSIOS
+ {0xB14E, 0xCF14}, //8136 #HANGUL SYLLABLE KHIEUKH E SSANGSIOS
+ {0xB14F, 0xCF16}, //8137 #HANGUL SYLLABLE KHIEUKH E CIEUC
+ {0xB150, 0xCF17}, //8138 #HANGUL SYLLABLE KHIEUKH E CHIEUCH
+ {0xB151, 0xCF18}, //8139 #HANGUL SYLLABLE KHIEUKH E KHIEUKH
+ {0xB152, 0xCF19}, //8140 #HANGUL SYLLABLE KHIEUKH E THIEUTH
+ {0xB153, 0xCF1A}, //8141 #HANGUL SYLLABLE KHIEUKH E PHIEUPH
+ {0xB154, 0xCF1B}, //8142 #HANGUL SYLLABLE KHIEUKH E HIEUH
+ {0xB155, 0xCF1D}, //8143 #HANGUL SYLLABLE KHIEUKH YEO KIYEOK
+ {0xB156, 0xCF1E}, //8144 #HANGUL SYLLABLE KHIEUKH YEO SSANGKIYEOK
+ {0xB157, 0xCF1F}, //8145 #HANGUL SYLLABLE KHIEUKH YEO KIYEOKSIOS
+ {0xB158, 0xCF21}, //8146 #HANGUL SYLLABLE KHIEUKH YEO NIEUNCIEUC
+ {0xB159, 0xCF22}, //8147 #HANGUL SYLLABLE KHIEUKH YEO NIEUNHIEUH
+ {0xB15A, 0xCF23}, //8148 #HANGUL SYLLABLE KHIEUKH YEO TIKEUT
+ {0xB161, 0xCF25}, //8149 #HANGUL SYLLABLE KHIEUKH YEO RIEULKIYEOK
+ {0xB162, 0xCF26}, //8150 #HANGUL SYLLABLE KHIEUKH YEO RIEULMIEUM
+ {0xB163, 0xCF27}, //8151 #HANGUL SYLLABLE KHIEUKH YEO RIEULPIEUP
+ {0xB164, 0xCF28}, //8152 #HANGUL SYLLABLE KHIEUKH YEO RIEULSIOS
+ {0xB165, 0xCF29}, //8153 #HANGUL SYLLABLE KHIEUKH YEO RIEULTHIEUTH
+ {0xB166, 0xCF2A}, //8154 #HANGUL SYLLABLE KHIEUKH YEO RIEULPHIEUPH
+ {0xB167, 0xCF2B}, //8155 #HANGUL SYLLABLE KHIEUKH YEO RIEULHIEUH
+ {0xB168, 0xCF2E}, //8156 #HANGUL SYLLABLE KHIEUKH YEO PIEUPSIOS
+ {0xB169, 0xCF32}, //8157 #HANGUL SYLLABLE KHIEUKH YEO CIEUC
+ {0xB16A, 0xCF33}, //8158 #HANGUL SYLLABLE KHIEUKH YEO CHIEUCH
+ {0xB16B, 0xCF34}, //8159 #HANGUL SYLLABLE KHIEUKH YEO KHIEUKH
+ {0xB16C, 0xCF35}, //8160 #HANGUL SYLLABLE KHIEUKH YEO THIEUTH
+ {0xB16D, 0xCF36}, //8161 #HANGUL SYLLABLE KHIEUKH YEO PHIEUPH
+ {0xB16E, 0xCF37}, //8162 #HANGUL SYLLABLE KHIEUKH YEO HIEUH
+ {0xB16F, 0xCF39}, //8163 #HANGUL SYLLABLE KHIEUKH YE KIYEOK
+ {0xB170, 0xCF3A}, //8164 #HANGUL SYLLABLE KHIEUKH YE SSANGKIYEOK
+ {0xB171, 0xCF3B}, //8165 #HANGUL SYLLABLE KHIEUKH YE KIYEOKSIOS
+ {0xB172, 0xCF3C}, //8166 #HANGUL SYLLABLE KHIEUKH YE NIEUN
+ {0xB173, 0xCF3D}, //8167 #HANGUL SYLLABLE KHIEUKH YE NIEUNCIEUC
+ {0xB174, 0xCF3E}, //8168 #HANGUL SYLLABLE KHIEUKH YE NIEUNHIEUH
+ {0xB175, 0xCF3F}, //8169 #HANGUL SYLLABLE KHIEUKH YE TIKEUT
+ {0xB176, 0xCF40}, //8170 #HANGUL SYLLABLE KHIEUKH YE RIEUL
+ {0xB177, 0xCF41}, //8171 #HANGUL SYLLABLE KHIEUKH YE RIEULKIYEOK
+ {0xB178, 0xCF42}, //8172 #HANGUL SYLLABLE KHIEUKH YE RIEULMIEUM
+ {0xB179, 0xCF43}, //8173 #HANGUL SYLLABLE KHIEUKH YE RIEULPIEUP
+ {0xB17A, 0xCF44}, //8174 #HANGUL SYLLABLE KHIEUKH YE RIEULSIOS
+ {0xB181, 0xCF45}, //8175 #HANGUL SYLLABLE KHIEUKH YE RIEULTHIEUTH
+ {0xB182, 0xCF46}, //8176 #HANGUL SYLLABLE KHIEUKH YE RIEULPHIEUPH
+ {0xB183, 0xCF47}, //8177 #HANGUL SYLLABLE KHIEUKH YE RIEULHIEUH
+ {0xB184, 0xCF48}, //8178 #HANGUL SYLLABLE KHIEUKH YE MIEUM
+ {0xB185, 0xCF49}, //8179 #HANGUL SYLLABLE KHIEUKH YE PIEUP
+ {0xB186, 0xCF4A}, //8180 #HANGUL SYLLABLE KHIEUKH YE PIEUPSIOS
+ {0xB187, 0xCF4B}, //8181 #HANGUL SYLLABLE KHIEUKH YE SIOS
+ {0xB188, 0xCF4C}, //8182 #HANGUL SYLLABLE KHIEUKH YE SSANGSIOS
+ {0xB189, 0xCF4D}, //8183 #HANGUL SYLLABLE KHIEUKH YE IEUNG
+ {0xB18A, 0xCF4E}, //8184 #HANGUL SYLLABLE KHIEUKH YE CIEUC
+ {0xB18B, 0xCF4F}, //8185 #HANGUL SYLLABLE KHIEUKH YE CHIEUCH
+ {0xB18C, 0xCF50}, //8186 #HANGUL SYLLABLE KHIEUKH YE KHIEUKH
+ {0xB18D, 0xCF51}, //8187 #HANGUL SYLLABLE KHIEUKH YE THIEUTH
+ {0xB18E, 0xCF52}, //8188 #HANGUL SYLLABLE KHIEUKH YE PHIEUPH
+ {0xB18F, 0xCF53}, //8189 #HANGUL SYLLABLE KHIEUKH YE HIEUH
+ {0xB190, 0xCF56}, //8190 #HANGUL SYLLABLE KHIEUKH O SSANGKIYEOK
+ {0xB191, 0xCF57}, //8191 #HANGUL SYLLABLE KHIEUKH O KIYEOKSIOS
+ {0xB192, 0xCF59}, //8192 #HANGUL SYLLABLE KHIEUKH O NIEUNCIEUC
+ {0xB193, 0xCF5A}, //8193 #HANGUL SYLLABLE KHIEUKH O NIEUNHIEUH
+ {0xB194, 0xCF5B}, //8194 #HANGUL SYLLABLE KHIEUKH O TIKEUT
+ {0xB195, 0xCF5D}, //8195 #HANGUL SYLLABLE KHIEUKH O RIEULKIYEOK
+ {0xB196, 0xCF5E}, //8196 #HANGUL SYLLABLE KHIEUKH O RIEULMIEUM
+ {0xB197, 0xCF5F}, //8197 #HANGUL SYLLABLE KHIEUKH O RIEULPIEUP
+ {0xB198, 0xCF60}, //8198 #HANGUL SYLLABLE KHIEUKH O RIEULSIOS
+ {0xB199, 0xCF61}, //8199 #HANGUL SYLLABLE KHIEUKH O RIEULTHIEUTH
+ {0xB19A, 0xCF62}, //8200 #HANGUL SYLLABLE KHIEUKH O RIEULPHIEUPH
+ {0xB19B, 0xCF63}, //8201 #HANGUL SYLLABLE KHIEUKH O RIEULHIEUH
+ {0xB19C, 0xCF66}, //8202 #HANGUL SYLLABLE KHIEUKH O PIEUPSIOS
+ {0xB19D, 0xCF68}, //8203 #HANGUL SYLLABLE KHIEUKH O SSANGSIOS
+ {0xB19E, 0xCF6A}, //8204 #HANGUL SYLLABLE KHIEUKH O CIEUC
+ {0xB19F, 0xCF6B}, //8205 #HANGUL SYLLABLE KHIEUKH O CHIEUCH
+ {0xB1A0, 0xCF6C}, //8206 #HANGUL SYLLABLE KHIEUKH O KHIEUKH
+ {0xB1A1, 0xAD0C}, //8207 #HANGUL SYLLABLE KIYEOK WA MIEUM
+ {0xB1A2, 0xAD0D}, //8208 #HANGUL SYLLABLE KIYEOK WA PIEUP
+ {0xB1A3, 0xAD0F}, //8209 #HANGUL SYLLABLE KIYEOK WA SIOS
+ {0xB1A4, 0xAD11}, //8210 #HANGUL SYLLABLE KIYEOK WA IEUNG
+ {0xB1A5, 0xAD18}, //8211 #HANGUL SYLLABLE KIYEOK WAE
+ {0xB1A6, 0xAD1C}, //8212 #HANGUL SYLLABLE KIYEOK WAE NIEUN
+ {0xB1A7, 0xAD20}, //8213 #HANGUL SYLLABLE KIYEOK WAE RIEUL
+ {0xB1A8, 0xAD29}, //8214 #HANGUL SYLLABLE KIYEOK WAE PIEUP
+ {0xB1A9, 0xAD2C}, //8215 #HANGUL SYLLABLE KIYEOK WAE SSANGSIOS
+ {0xB1AA, 0xAD2D}, //8216 #HANGUL SYLLABLE KIYEOK WAE IEUNG
+ {0xB1AB, 0xAD34}, //8217 #HANGUL SYLLABLE KIYEOK OE
+ {0xB1AC, 0xAD35}, //8218 #HANGUL SYLLABLE KIYEOK OE KIYEOK
+ {0xB1AD, 0xAD38}, //8219 #HANGUL SYLLABLE KIYEOK OE NIEUN
+ {0xB1AE, 0xAD3C}, //8220 #HANGUL SYLLABLE KIYEOK OE RIEUL
+ {0xB1AF, 0xAD44}, //8221 #HANGUL SYLLABLE KIYEOK OE MIEUM
+ {0xB1B0, 0xAD45}, //8222 #HANGUL SYLLABLE KIYEOK OE PIEUP
+ {0xB1B1, 0xAD47}, //8223 #HANGUL SYLLABLE KIYEOK OE SIOS
+ {0xB1B2, 0xAD49}, //8224 #HANGUL SYLLABLE KIYEOK OE IEUNG
+ {0xB1B3, 0xAD50}, //8225 #HANGUL SYLLABLE KIYEOK YO
+ {0xB1B4, 0xAD54}, //8226 #HANGUL SYLLABLE KIYEOK YO NIEUN
+ {0xB1B5, 0xAD58}, //8227 #HANGUL SYLLABLE KIYEOK YO RIEUL
+ {0xB1B6, 0xAD61}, //8228 #HANGUL SYLLABLE KIYEOK YO PIEUP
+ {0xB1B7, 0xAD63}, //8229 #HANGUL SYLLABLE KIYEOK YO SIOS
+ {0xB1B8, 0xAD6C}, //8230 #HANGUL SYLLABLE KIYEOK U
+ {0xB1B9, 0xAD6D}, //8231 #HANGUL SYLLABLE KIYEOK U KIYEOK
+ {0xB1BA, 0xAD70}, //8232 #HANGUL SYLLABLE KIYEOK U NIEUN
+ {0xB1BB, 0xAD73}, //8233 #HANGUL SYLLABLE KIYEOK U TIKEUT
+ {0xB1BC, 0xAD74}, //8234 #HANGUL SYLLABLE KIYEOK U RIEUL
+ {0xB1BD, 0xAD75}, //8235 #HANGUL SYLLABLE KIYEOK U RIEULKIYEOK
+ {0xB1BE, 0xAD76}, //8236 #HANGUL SYLLABLE KIYEOK U RIEULMIEUM
+ {0xB1BF, 0xAD7B}, //8237 #HANGUL SYLLABLE KIYEOK U RIEULHIEUH
+ {0xB1C0, 0xAD7C}, //8238 #HANGUL SYLLABLE KIYEOK U MIEUM
+ {0xB1C1, 0xAD7D}, //8239 #HANGUL SYLLABLE KIYEOK U PIEUP
+ {0xB1C2, 0xAD7F}, //8240 #HANGUL SYLLABLE KIYEOK U SIOS
+ {0xB1C3, 0xAD81}, //8241 #HANGUL SYLLABLE KIYEOK U IEUNG
+ {0xB1C4, 0xAD82}, //8242 #HANGUL SYLLABLE KIYEOK U CIEUC
+ {0xB1C5, 0xAD88}, //8243 #HANGUL SYLLABLE KIYEOK WEO
+ {0xB1C6, 0xAD89}, //8244 #HANGUL SYLLABLE KIYEOK WEO KIYEOK
+ {0xB1C7, 0xAD8C}, //8245 #HANGUL SYLLABLE KIYEOK WEO NIEUN
+ {0xB1C8, 0xAD90}, //8246 #HANGUL SYLLABLE KIYEOK WEO RIEUL
+ {0xB1C9, 0xAD9C}, //8247 #HANGUL SYLLABLE KIYEOK WEO SSANGSIOS
+ {0xB1CA, 0xAD9D}, //8248 #HANGUL SYLLABLE KIYEOK WEO IEUNG
+ {0xB1CB, 0xADA4}, //8249 #HANGUL SYLLABLE KIYEOK WE
+ {0xB1CC, 0xADB7}, //8250 #HANGUL SYLLABLE KIYEOK WE SIOS
+ {0xB1CD, 0xADC0}, //8251 #HANGUL SYLLABLE KIYEOK WI
+ {0xB1CE, 0xADC1}, //8252 #HANGUL SYLLABLE KIYEOK WI KIYEOK
+ {0xB1CF, 0xADC4}, //8253 #HANGUL SYLLABLE KIYEOK WI NIEUN
+ {0xB1D0, 0xADC8}, //8254 #HANGUL SYLLABLE KIYEOK WI RIEUL
+ {0xB1D1, 0xADD0}, //8255 #HANGUL SYLLABLE KIYEOK WI MIEUM
+ {0xB1D2, 0xADD1}, //8256 #HANGUL SYLLABLE KIYEOK WI PIEUP
+ {0xB1D3, 0xADD3}, //8257 #HANGUL SYLLABLE KIYEOK WI SIOS
+ {0xB1D4, 0xADDC}, //8258 #HANGUL SYLLABLE KIYEOK YU
+ {0xB1D5, 0xADE0}, //8259 #HANGUL SYLLABLE KIYEOK YU NIEUN
+ {0xB1D6, 0xADE4}, //8260 #HANGUL SYLLABLE KIYEOK YU RIEUL
+ {0xB1D7, 0xADF8}, //8261 #HANGUL SYLLABLE KIYEOK EU
+ {0xB1D8, 0xADF9}, //8262 #HANGUL SYLLABLE KIYEOK EU KIYEOK
+ {0xB1D9, 0xADFC}, //8263 #HANGUL SYLLABLE KIYEOK EU NIEUN
+ {0xB1DA, 0xADFF}, //8264 #HANGUL SYLLABLE KIYEOK EU TIKEUT
+ {0xB1DB, 0xAE00}, //8265 #HANGUL SYLLABLE KIYEOK EU RIEUL
+ {0xB1DC, 0xAE01}, //8266 #HANGUL SYLLABLE KIYEOK EU RIEULKIYEOK
+ {0xB1DD, 0xAE08}, //8267 #HANGUL SYLLABLE KIYEOK EU MIEUM
+ {0xB1DE, 0xAE09}, //8268 #HANGUL SYLLABLE KIYEOK EU PIEUP
+ {0xB1DF, 0xAE0B}, //8269 #HANGUL SYLLABLE KIYEOK EU SIOS
+ {0xB1E0, 0xAE0D}, //8270 #HANGUL SYLLABLE KIYEOK EU IEUNG
+ {0xB1E1, 0xAE14}, //8271 #HANGUL SYLLABLE KIYEOK YI
+ {0xB1E2, 0xAE30}, //8272 #HANGUL SYLLABLE KIYEOK I
+ {0xB1E3, 0xAE31}, //8273 #HANGUL SYLLABLE KIYEOK I KIYEOK
+ {0xB1E4, 0xAE34}, //8274 #HANGUL SYLLABLE KIYEOK I NIEUN
+ {0xB1E5, 0xAE37}, //8275 #HANGUL SYLLABLE KIYEOK I TIKEUT
+ {0xB1E6, 0xAE38}, //8276 #HANGUL SYLLABLE KIYEOK I RIEUL
+ {0xB1E7, 0xAE3A}, //8277 #HANGUL SYLLABLE KIYEOK I RIEULMIEUM
+ {0xB1E8, 0xAE40}, //8278 #HANGUL SYLLABLE KIYEOK I MIEUM
+ {0xB1E9, 0xAE41}, //8279 #HANGUL SYLLABLE KIYEOK I PIEUP
+ {0xB1EA, 0xAE43}, //8280 #HANGUL SYLLABLE KIYEOK I SIOS
+ {0xB1EB, 0xAE45}, //8281 #HANGUL SYLLABLE KIYEOK I IEUNG
+ {0xB1EC, 0xAE46}, //8282 #HANGUL SYLLABLE KIYEOK I CIEUC
+ {0xB1ED, 0xAE4A}, //8283 #HANGUL SYLLABLE KIYEOK I PHIEUPH
+ {0xB1EE, 0xAE4C}, //8284 #HANGUL SYLLABLE SSANGKIYEOK A
+ {0xB1EF, 0xAE4D}, //8285 #HANGUL SYLLABLE SSANGKIYEOK A KIYEOK
+ {0xB1F0, 0xAE4E}, //8286 #HANGUL SYLLABLE SSANGKIYEOK A SSANGKIYEOK
+ {0xB1F1, 0xAE50}, //8287 #HANGUL SYLLABLE SSANGKIYEOK A NIEUN
+ {0xB1F2, 0xAE54}, //8288 #HANGUL SYLLABLE SSANGKIYEOK A RIEUL
+ {0xB1F3, 0xAE56}, //8289 #HANGUL SYLLABLE SSANGKIYEOK A RIEULMIEUM
+ {0xB1F4, 0xAE5C}, //8290 #HANGUL SYLLABLE SSANGKIYEOK A MIEUM
+ {0xB1F5, 0xAE5D}, //8291 #HANGUL SYLLABLE SSANGKIYEOK A PIEUP
+ {0xB1F6, 0xAE5F}, //8292 #HANGUL SYLLABLE SSANGKIYEOK A SIOS
+ {0xB1F7, 0xAE60}, //8293 #HANGUL SYLLABLE SSANGKIYEOK A SSANGSIOS
+ {0xB1F8, 0xAE61}, //8294 #HANGUL SYLLABLE SSANGKIYEOK A IEUNG
+ {0xB1F9, 0xAE65}, //8295 #HANGUL SYLLABLE SSANGKIYEOK A THIEUTH
+ {0xB1FA, 0xAE68}, //8296 #HANGUL SYLLABLE SSANGKIYEOK AE
+ {0xB1FB, 0xAE69}, //8297 #HANGUL SYLLABLE SSANGKIYEOK AE KIYEOK
+ {0xB1FC, 0xAE6C}, //8298 #HANGUL SYLLABLE SSANGKIYEOK AE NIEUN
+ {0xB1FD, 0xAE70}, //8299 #HANGUL SYLLABLE SSANGKIYEOK AE RIEUL
+ {0xB1FE, 0xAE78}, //8300 #HANGUL SYLLABLE SSANGKIYEOK AE MIEUM
+ {0xB241, 0xCF6D}, //8301 #HANGUL SYLLABLE KHIEUKH O THIEUTH
+ {0xB242, 0xCF6E}, //8302 #HANGUL SYLLABLE KHIEUKH O PHIEUPH
+ {0xB243, 0xCF6F}, //8303 #HANGUL SYLLABLE KHIEUKH O HIEUH
+ {0xB244, 0xCF72}, //8304 #HANGUL SYLLABLE KHIEUKH WA SSANGKIYEOK
+ {0xB245, 0xCF73}, //8305 #HANGUL SYLLABLE KHIEUKH WA KIYEOKSIOS
+ {0xB246, 0xCF75}, //8306 #HANGUL SYLLABLE KHIEUKH WA NIEUNCIEUC
+ {0xB247, 0xCF76}, //8307 #HANGUL SYLLABLE KHIEUKH WA NIEUNHIEUH
+ {0xB248, 0xCF77}, //8308 #HANGUL SYLLABLE KHIEUKH WA TIKEUT
+ {0xB249, 0xCF79}, //8309 #HANGUL SYLLABLE KHIEUKH WA RIEULKIYEOK
+ {0xB24A, 0xCF7A}, //8310 #HANGUL SYLLABLE KHIEUKH WA RIEULMIEUM
+ {0xB24B, 0xCF7B}, //8311 #HANGUL SYLLABLE KHIEUKH WA RIEULPIEUP
+ {0xB24C, 0xCF7C}, //8312 #HANGUL SYLLABLE KHIEUKH WA RIEULSIOS
+ {0xB24D, 0xCF7D}, //8313 #HANGUL SYLLABLE KHIEUKH WA RIEULTHIEUTH
+ {0xB24E, 0xCF7E}, //8314 #HANGUL SYLLABLE KHIEUKH WA RIEULPHIEUPH
+ {0xB24F, 0xCF7F}, //8315 #HANGUL SYLLABLE KHIEUKH WA RIEULHIEUH
+ {0xB250, 0xCF81}, //8316 #HANGUL SYLLABLE KHIEUKH WA PIEUP
+ {0xB251, 0xCF82}, //8317 #HANGUL SYLLABLE KHIEUKH WA PIEUPSIOS
+ {0xB252, 0xCF83}, //8318 #HANGUL SYLLABLE KHIEUKH WA SIOS
+ {0xB253, 0xCF84}, //8319 #HANGUL SYLLABLE KHIEUKH WA SSANGSIOS
+ {0xB254, 0xCF86}, //8320 #HANGUL SYLLABLE KHIEUKH WA CIEUC
+ {0xB255, 0xCF87}, //8321 #HANGUL SYLLABLE KHIEUKH WA CHIEUCH
+ {0xB256, 0xCF88}, //8322 #HANGUL SYLLABLE KHIEUKH WA KHIEUKH
+ {0xB257, 0xCF89}, //8323 #HANGUL SYLLABLE KHIEUKH WA THIEUTH
+ {0xB258, 0xCF8A}, //8324 #HANGUL SYLLABLE KHIEUKH WA PHIEUPH
+ {0xB259, 0xCF8B}, //8325 #HANGUL SYLLABLE KHIEUKH WA HIEUH
+ {0xB25A, 0xCF8D}, //8326 #HANGUL SYLLABLE KHIEUKH WAE KIYEOK
+ {0xB261, 0xCF8E}, //8327 #HANGUL SYLLABLE KHIEUKH WAE SSANGKIYEOK
+ {0xB262, 0xCF8F}, //8328 #HANGUL SYLLABLE KHIEUKH WAE KIYEOKSIOS
+ {0xB263, 0xCF90}, //8329 #HANGUL SYLLABLE KHIEUKH WAE NIEUN
+ {0xB264, 0xCF91}, //8330 #HANGUL SYLLABLE KHIEUKH WAE NIEUNCIEUC
+ {0xB265, 0xCF92}, //8331 #HANGUL SYLLABLE KHIEUKH WAE NIEUNHIEUH
+ {0xB266, 0xCF93}, //8332 #HANGUL SYLLABLE KHIEUKH WAE TIKEUT
+ {0xB267, 0xCF94}, //8333 #HANGUL SYLLABLE KHIEUKH WAE RIEUL
+ {0xB268, 0xCF95}, //8334 #HANGUL SYLLABLE KHIEUKH WAE RIEULKIYEOK
+ {0xB269, 0xCF96}, //8335 #HANGUL SYLLABLE KHIEUKH WAE RIEULMIEUM
+ {0xB26A, 0xCF97}, //8336 #HANGUL SYLLABLE KHIEUKH WAE RIEULPIEUP
+ {0xB26B, 0xCF98}, //8337 #HANGUL SYLLABLE KHIEUKH WAE RIEULSIOS
+ {0xB26C, 0xCF99}, //8338 #HANGUL SYLLABLE KHIEUKH WAE RIEULTHIEUTH
+ {0xB26D, 0xCF9A}, //8339 #HANGUL SYLLABLE KHIEUKH WAE RIEULPHIEUPH
+ {0xB26E, 0xCF9B}, //8340 #HANGUL SYLLABLE KHIEUKH WAE RIEULHIEUH
+ {0xB26F, 0xCF9C}, //8341 #HANGUL SYLLABLE KHIEUKH WAE MIEUM
+ {0xB270, 0xCF9D}, //8342 #HANGUL SYLLABLE KHIEUKH WAE PIEUP
+ {0xB271, 0xCF9E}, //8343 #HANGUL SYLLABLE KHIEUKH WAE PIEUPSIOS
+ {0xB272, 0xCF9F}, //8344 #HANGUL SYLLABLE KHIEUKH WAE SIOS
+ {0xB273, 0xCFA0}, //8345 #HANGUL SYLLABLE KHIEUKH WAE SSANGSIOS
+ {0xB274, 0xCFA2}, //8346 #HANGUL SYLLABLE KHIEUKH WAE CIEUC
+ {0xB275, 0xCFA3}, //8347 #HANGUL SYLLABLE KHIEUKH WAE CHIEUCH
+ {0xB276, 0xCFA4}, //8348 #HANGUL SYLLABLE KHIEUKH WAE KHIEUKH
+ {0xB277, 0xCFA5}, //8349 #HANGUL SYLLABLE KHIEUKH WAE THIEUTH
+ {0xB278, 0xCFA6}, //8350 #HANGUL SYLLABLE KHIEUKH WAE PHIEUPH
+ {0xB279, 0xCFA7}, //8351 #HANGUL SYLLABLE KHIEUKH WAE HIEUH
+ {0xB27A, 0xCFA9}, //8352 #HANGUL SYLLABLE KHIEUKH OE KIYEOK
+ {0xB281, 0xCFAA}, //8353 #HANGUL SYLLABLE KHIEUKH OE SSANGKIYEOK
+ {0xB282, 0xCFAB}, //8354 #HANGUL SYLLABLE KHIEUKH OE KIYEOKSIOS
+ {0xB283, 0xCFAC}, //8355 #HANGUL SYLLABLE KHIEUKH OE NIEUN
+ {0xB284, 0xCFAD}, //8356 #HANGUL SYLLABLE KHIEUKH OE NIEUNCIEUC
+ {0xB285, 0xCFAE}, //8357 #HANGUL SYLLABLE KHIEUKH OE NIEUNHIEUH
+ {0xB286, 0xCFAF}, //8358 #HANGUL SYLLABLE KHIEUKH OE TIKEUT
+ {0xB287, 0xCFB1}, //8359 #HANGUL SYLLABLE KHIEUKH OE RIEULKIYEOK
+ {0xB288, 0xCFB2}, //8360 #HANGUL SYLLABLE KHIEUKH OE RIEULMIEUM
+ {0xB289, 0xCFB3}, //8361 #HANGUL SYLLABLE KHIEUKH OE RIEULPIEUP
+ {0xB28A, 0xCFB4}, //8362 #HANGUL SYLLABLE KHIEUKH OE RIEULSIOS
+ {0xB28B, 0xCFB5}, //8363 #HANGUL SYLLABLE KHIEUKH OE RIEULTHIEUTH
+ {0xB28C, 0xCFB6}, //8364 #HANGUL SYLLABLE KHIEUKH OE RIEULPHIEUPH
+ {0xB28D, 0xCFB7}, //8365 #HANGUL SYLLABLE KHIEUKH OE RIEULHIEUH
+ {0xB28E, 0xCFB8}, //8366 #HANGUL SYLLABLE KHIEUKH OE MIEUM
+ {0xB28F, 0xCFB9}, //8367 #HANGUL SYLLABLE KHIEUKH OE PIEUP
+ {0xB290, 0xCFBA}, //8368 #HANGUL SYLLABLE KHIEUKH OE PIEUPSIOS
+ {0xB291, 0xCFBB}, //8369 #HANGUL SYLLABLE KHIEUKH OE SIOS
+ {0xB292, 0xCFBC}, //8370 #HANGUL SYLLABLE KHIEUKH OE SSANGSIOS
+ {0xB293, 0xCFBD}, //8371 #HANGUL SYLLABLE KHIEUKH OE IEUNG
+ {0xB294, 0xCFBE}, //8372 #HANGUL SYLLABLE KHIEUKH OE CIEUC
+ {0xB295, 0xCFBF}, //8373 #HANGUL SYLLABLE KHIEUKH OE CHIEUCH
+ {0xB296, 0xCFC0}, //8374 #HANGUL SYLLABLE KHIEUKH OE KHIEUKH
+ {0xB297, 0xCFC1}, //8375 #HANGUL SYLLABLE KHIEUKH OE THIEUTH
+ {0xB298, 0xCFC2}, //8376 #HANGUL SYLLABLE KHIEUKH OE PHIEUPH
+ {0xB299, 0xCFC3}, //8377 #HANGUL SYLLABLE KHIEUKH OE HIEUH
+ {0xB29A, 0xCFC5}, //8378 #HANGUL SYLLABLE KHIEUKH YO KIYEOK
+ {0xB29B, 0xCFC6}, //8379 #HANGUL SYLLABLE KHIEUKH YO SSANGKIYEOK
+ {0xB29C, 0xCFC7}, //8380 #HANGUL SYLLABLE KHIEUKH YO KIYEOKSIOS
+ {0xB29D, 0xCFC8}, //8381 #HANGUL SYLLABLE KHIEUKH YO NIEUN
+ {0xB29E, 0xCFC9}, //8382 #HANGUL SYLLABLE KHIEUKH YO NIEUNCIEUC
+ {0xB29F, 0xCFCA}, //8383 #HANGUL SYLLABLE KHIEUKH YO NIEUNHIEUH
+ {0xB2A0, 0xCFCB}, //8384 #HANGUL SYLLABLE KHIEUKH YO TIKEUT
+ {0xB2A1, 0xAE79}, //8385 #HANGUL SYLLABLE SSANGKIYEOK AE PIEUP
+ {0xB2A2, 0xAE7B}, //8386 #HANGUL SYLLABLE SSANGKIYEOK AE SIOS
+ {0xB2A3, 0xAE7C}, //8387 #HANGUL SYLLABLE SSANGKIYEOK AE SSANGSIOS
+ {0xB2A4, 0xAE7D}, //8388 #HANGUL SYLLABLE SSANGKIYEOK AE IEUNG
+ {0xB2A5, 0xAE84}, //8389 #HANGUL SYLLABLE SSANGKIYEOK YA
+ {0xB2A6, 0xAE85}, //8390 #HANGUL SYLLABLE SSANGKIYEOK YA KIYEOK
+ {0xB2A7, 0xAE8C}, //8391 #HANGUL SYLLABLE SSANGKIYEOK YA RIEUL
+ {0xB2A8, 0xAEBC}, //8392 #HANGUL SYLLABLE SSANGKIYEOK EO
+ {0xB2A9, 0xAEBD}, //8393 #HANGUL SYLLABLE SSANGKIYEOK EO KIYEOK
+ {0xB2AA, 0xAEBE}, //8394 #HANGUL SYLLABLE SSANGKIYEOK EO SSANGKIYEOK
+ {0xB2AB, 0xAEC0}, //8395 #HANGUL SYLLABLE SSANGKIYEOK EO NIEUN
+ {0xB2AC, 0xAEC4}, //8396 #HANGUL SYLLABLE SSANGKIYEOK EO RIEUL
+ {0xB2AD, 0xAECC}, //8397 #HANGUL SYLLABLE SSANGKIYEOK EO MIEUM
+ {0xB2AE, 0xAECD}, //8398 #HANGUL SYLLABLE SSANGKIYEOK EO PIEUP
+ {0xB2AF, 0xAECF}, //8399 #HANGUL SYLLABLE SSANGKIYEOK EO SIOS
+ {0xB2B0, 0xAED0}, //8400 #HANGUL SYLLABLE SSANGKIYEOK EO SSANGSIOS
+ {0xB2B1, 0xAED1}, //8401 #HANGUL SYLLABLE SSANGKIYEOK EO IEUNG
+ {0xB2B2, 0xAED8}, //8402 #HANGUL SYLLABLE SSANGKIYEOK E
+ {0xB2B3, 0xAED9}, //8403 #HANGUL SYLLABLE SSANGKIYEOK E KIYEOK
+ {0xB2B4, 0xAEDC}, //8404 #HANGUL SYLLABLE SSANGKIYEOK E NIEUN
+ {0xB2B5, 0xAEE8}, //8405 #HANGUL SYLLABLE SSANGKIYEOK E MIEUM
+ {0xB2B6, 0xAEEB}, //8406 #HANGUL SYLLABLE SSANGKIYEOK E SIOS
+ {0xB2B7, 0xAEED}, //8407 #HANGUL SYLLABLE SSANGKIYEOK E IEUNG
+ {0xB2B8, 0xAEF4}, //8408 #HANGUL SYLLABLE SSANGKIYEOK YEO
+ {0xB2B9, 0xAEF8}, //8409 #HANGUL SYLLABLE SSANGKIYEOK YEO NIEUN
+ {0xB2BA, 0xAEFC}, //8410 #HANGUL SYLLABLE SSANGKIYEOK YEO RIEUL
+ {0xB2BB, 0xAF07}, //8411 #HANGUL SYLLABLE SSANGKIYEOK YEO SIOS
+ {0xB2BC, 0xAF08}, //8412 #HANGUL SYLLABLE SSANGKIYEOK YEO SSANGSIOS
+ {0xB2BD, 0xAF0D}, //8413 #HANGUL SYLLABLE SSANGKIYEOK YEO THIEUTH
+ {0xB2BE, 0xAF10}, //8414 #HANGUL SYLLABLE SSANGKIYEOK YE
+ {0xB2BF, 0xAF2C}, //8415 #HANGUL SYLLABLE SSANGKIYEOK O
+ {0xB2C0, 0xAF2D}, //8416 #HANGUL SYLLABLE SSANGKIYEOK O KIYEOK
+ {0xB2C1, 0xAF30}, //8417 #HANGUL SYLLABLE SSANGKIYEOK O NIEUN
+ {0xB2C2, 0xAF32}, //8418 #HANGUL SYLLABLE SSANGKIYEOK O NIEUNHIEUH
+ {0xB2C3, 0xAF34}, //8419 #HANGUL SYLLABLE SSANGKIYEOK O RIEUL
+ {0xB2C4, 0xAF3C}, //8420 #HANGUL SYLLABLE SSANGKIYEOK O MIEUM
+ {0xB2C5, 0xAF3D}, //8421 #HANGUL SYLLABLE SSANGKIYEOK O PIEUP
+ {0xB2C6, 0xAF3F}, //8422 #HANGUL SYLLABLE SSANGKIYEOK O SIOS
+ {0xB2C7, 0xAF41}, //8423 #HANGUL SYLLABLE SSANGKIYEOK O IEUNG
+ {0xB2C8, 0xAF42}, //8424 #HANGUL SYLLABLE SSANGKIYEOK O CIEUC
+ {0xB2C9, 0xAF43}, //8425 #HANGUL SYLLABLE SSANGKIYEOK O CHIEUCH
+ {0xB2CA, 0xAF48}, //8426 #HANGUL SYLLABLE SSANGKIYEOK WA
+ {0xB2CB, 0xAF49}, //8427 #HANGUL SYLLABLE SSANGKIYEOK WA KIYEOK
+ {0xB2CC, 0xAF50}, //8428 #HANGUL SYLLABLE SSANGKIYEOK WA RIEUL
+ {0xB2CD, 0xAF5C}, //8429 #HANGUL SYLLABLE SSANGKIYEOK WA SSANGSIOS
+ {0xB2CE, 0xAF5D}, //8430 #HANGUL SYLLABLE SSANGKIYEOK WA IEUNG
+ {0xB2CF, 0xAF64}, //8431 #HANGUL SYLLABLE SSANGKIYEOK WAE
+ {0xB2D0, 0xAF65}, //8432 #HANGUL SYLLABLE SSANGKIYEOK WAE KIYEOK
+ {0xB2D1, 0xAF79}, //8433 #HANGUL SYLLABLE SSANGKIYEOK WAE IEUNG
+ {0xB2D2, 0xAF80}, //8434 #HANGUL SYLLABLE SSANGKIYEOK OE
+ {0xB2D3, 0xAF84}, //8435 #HANGUL SYLLABLE SSANGKIYEOK OE NIEUN
+ {0xB2D4, 0xAF88}, //8436 #HANGUL SYLLABLE SSANGKIYEOK OE RIEUL
+ {0xB2D5, 0xAF90}, //8437 #HANGUL SYLLABLE SSANGKIYEOK OE MIEUM
+ {0xB2D6, 0xAF91}, //8438 #HANGUL SYLLABLE SSANGKIYEOK OE PIEUP
+ {0xB2D7, 0xAF95}, //8439 #HANGUL SYLLABLE SSANGKIYEOK OE IEUNG
+ {0xB2D8, 0xAF9C}, //8440 #HANGUL SYLLABLE SSANGKIYEOK YO
+ {0xB2D9, 0xAFB8}, //8441 #HANGUL SYLLABLE SSANGKIYEOK U
+ {0xB2DA, 0xAFB9}, //8442 #HANGUL SYLLABLE SSANGKIYEOK U KIYEOK
+ {0xB2DB, 0xAFBC}, //8443 #HANGUL SYLLABLE SSANGKIYEOK U NIEUN
+ {0xB2DC, 0xAFC0}, //8444 #HANGUL SYLLABLE SSANGKIYEOK U RIEUL
+ {0xB2DD, 0xAFC7}, //8445 #HANGUL SYLLABLE SSANGKIYEOK U RIEULHIEUH
+ {0xB2DE, 0xAFC8}, //8446 #HANGUL SYLLABLE SSANGKIYEOK U MIEUM
+ {0xB2DF, 0xAFC9}, //8447 #HANGUL SYLLABLE SSANGKIYEOK U PIEUP
+ {0xB2E0, 0xAFCB}, //8448 #HANGUL SYLLABLE SSANGKIYEOK U SIOS
+ {0xB2E1, 0xAFCD}, //8449 #HANGUL SYLLABLE SSANGKIYEOK U IEUNG
+ {0xB2E2, 0xAFCE}, //8450 #HANGUL SYLLABLE SSANGKIYEOK U CIEUC
+ {0xB2E3, 0xAFD4}, //8451 #HANGUL SYLLABLE SSANGKIYEOK WEO
+ {0xB2E4, 0xAFDC}, //8452 #HANGUL SYLLABLE SSANGKIYEOK WEO RIEUL
+ {0xB2E5, 0xAFE8}, //8453 #HANGUL SYLLABLE SSANGKIYEOK WEO SSANGSIOS
+ {0xB2E6, 0xAFE9}, //8454 #HANGUL SYLLABLE SSANGKIYEOK WEO IEUNG
+ {0xB2E7, 0xAFF0}, //8455 #HANGUL SYLLABLE SSANGKIYEOK WE
+ {0xB2E8, 0xAFF1}, //8456 #HANGUL SYLLABLE SSANGKIYEOK WE KIYEOK
+ {0xB2E9, 0xAFF4}, //8457 #HANGUL SYLLABLE SSANGKIYEOK WE NIEUN
+ {0xB2EA, 0xAFF8}, //8458 #HANGUL SYLLABLE SSANGKIYEOK WE RIEUL
+ {0xB2EB, 0xB000}, //8459 #HANGUL SYLLABLE SSANGKIYEOK WE MIEUM
+ {0xB2EC, 0xB001}, //8460 #HANGUL SYLLABLE SSANGKIYEOK WE PIEUP
+ {0xB2ED, 0xB004}, //8461 #HANGUL SYLLABLE SSANGKIYEOK WE SSANGSIOS
+ {0xB2EE, 0xB00C}, //8462 #HANGUL SYLLABLE SSANGKIYEOK WI
+ {0xB2EF, 0xB010}, //8463 #HANGUL SYLLABLE SSANGKIYEOK WI NIEUN
+ {0xB2F0, 0xB014}, //8464 #HANGUL SYLLABLE SSANGKIYEOK WI RIEUL
+ {0xB2F1, 0xB01C}, //8465 #HANGUL SYLLABLE SSANGKIYEOK WI MIEUM
+ {0xB2F2, 0xB01D}, //8466 #HANGUL SYLLABLE SSANGKIYEOK WI PIEUP
+ {0xB2F3, 0xB028}, //8467 #HANGUL SYLLABLE SSANGKIYEOK YU
+ {0xB2F4, 0xB044}, //8468 #HANGUL SYLLABLE SSANGKIYEOK EU
+ {0xB2F5, 0xB045}, //8469 #HANGUL SYLLABLE SSANGKIYEOK EU KIYEOK
+ {0xB2F6, 0xB048}, //8470 #HANGUL SYLLABLE SSANGKIYEOK EU NIEUN
+ {0xB2F7, 0xB04A}, //8471 #HANGUL SYLLABLE SSANGKIYEOK EU NIEUNHIEUH
+ {0xB2F8, 0xB04C}, //8472 #HANGUL SYLLABLE SSANGKIYEOK EU RIEUL
+ {0xB2F9, 0xB04E}, //8473 #HANGUL SYLLABLE SSANGKIYEOK EU RIEULMIEUM
+ {0xB2FA, 0xB053}, //8474 #HANGUL SYLLABLE SSANGKIYEOK EU RIEULHIEUH
+ {0xB2FB, 0xB054}, //8475 #HANGUL SYLLABLE SSANGKIYEOK EU MIEUM
+ {0xB2FC, 0xB055}, //8476 #HANGUL SYLLABLE SSANGKIYEOK EU PIEUP
+ {0xB2FD, 0xB057}, //8477 #HANGUL SYLLABLE SSANGKIYEOK EU SIOS
+ {0xB2FE, 0xB059}, //8478 #HANGUL SYLLABLE SSANGKIYEOK EU IEUNG
+ {0xB341, 0xCFCC}, //8479 #HANGUL SYLLABLE KHIEUKH YO RIEUL
+ {0xB342, 0xCFCD}, //8480 #HANGUL SYLLABLE KHIEUKH YO RIEULKIYEOK
+ {0xB343, 0xCFCE}, //8481 #HANGUL SYLLABLE KHIEUKH YO RIEULMIEUM
+ {0xB344, 0xCFCF}, //8482 #HANGUL SYLLABLE KHIEUKH YO RIEULPIEUP
+ {0xB345, 0xCFD0}, //8483 #HANGUL SYLLABLE KHIEUKH YO RIEULSIOS
+ {0xB346, 0xCFD1}, //8484 #HANGUL SYLLABLE KHIEUKH YO RIEULTHIEUTH
+ {0xB347, 0xCFD2}, //8485 #HANGUL SYLLABLE KHIEUKH YO RIEULPHIEUPH
+ {0xB348, 0xCFD3}, //8486 #HANGUL SYLLABLE KHIEUKH YO RIEULHIEUH
+ {0xB349, 0xCFD4}, //8487 #HANGUL SYLLABLE KHIEUKH YO MIEUM
+ {0xB34A, 0xCFD5}, //8488 #HANGUL SYLLABLE KHIEUKH YO PIEUP
+ {0xB34B, 0xCFD6}, //8489 #HANGUL SYLLABLE KHIEUKH YO PIEUPSIOS
+ {0xB34C, 0xCFD7}, //8490 #HANGUL SYLLABLE KHIEUKH YO SIOS
+ {0xB34D, 0xCFD8}, //8491 #HANGUL SYLLABLE KHIEUKH YO SSANGSIOS
+ {0xB34E, 0xCFD9}, //8492 #HANGUL SYLLABLE KHIEUKH YO IEUNG
+ {0xB34F, 0xCFDA}, //8493 #HANGUL SYLLABLE KHIEUKH YO CIEUC
+ {0xB350, 0xCFDB}, //8494 #HANGUL SYLLABLE KHIEUKH YO CHIEUCH
+ {0xB351, 0xCFDC}, //8495 #HANGUL SYLLABLE KHIEUKH YO KHIEUKH
+ {0xB352, 0xCFDD}, //8496 #HANGUL SYLLABLE KHIEUKH YO THIEUTH
+ {0xB353, 0xCFDE}, //8497 #HANGUL SYLLABLE KHIEUKH YO PHIEUPH
+ {0xB354, 0xCFDF}, //8498 #HANGUL SYLLABLE KHIEUKH YO HIEUH
+ {0xB355, 0xCFE2}, //8499 #HANGUL SYLLABLE KHIEUKH U SSANGKIYEOK
+ {0xB356, 0xCFE3}, //8500 #HANGUL SYLLABLE KHIEUKH U KIYEOKSIOS
+ {0xB357, 0xCFE5}, //8501 #HANGUL SYLLABLE KHIEUKH U NIEUNCIEUC
+ {0xB358, 0xCFE6}, //8502 #HANGUL SYLLABLE KHIEUKH U NIEUNHIEUH
+ {0xB359, 0xCFE7}, //8503 #HANGUL SYLLABLE KHIEUKH U TIKEUT
+ {0xB35A, 0xCFE9}, //8504 #HANGUL SYLLABLE KHIEUKH U RIEULKIYEOK
+ {0xB361, 0xCFEA}, //8505 #HANGUL SYLLABLE KHIEUKH U RIEULMIEUM
+ {0xB362, 0xCFEB}, //8506 #HANGUL SYLLABLE KHIEUKH U RIEULPIEUP
+ {0xB363, 0xCFEC}, //8507 #HANGUL SYLLABLE KHIEUKH U RIEULSIOS
+ {0xB364, 0xCFED}, //8508 #HANGUL SYLLABLE KHIEUKH U RIEULTHIEUTH
+ {0xB365, 0xCFEE}, //8509 #HANGUL SYLLABLE KHIEUKH U RIEULPHIEUPH
+ {0xB366, 0xCFEF}, //8510 #HANGUL SYLLABLE KHIEUKH U RIEULHIEUH
+ {0xB367, 0xCFF2}, //8511 #HANGUL SYLLABLE KHIEUKH U PIEUPSIOS
+ {0xB368, 0xCFF4}, //8512 #HANGUL SYLLABLE KHIEUKH U SSANGSIOS
+ {0xB369, 0xCFF6}, //8513 #HANGUL SYLLABLE KHIEUKH U CIEUC
+ {0xB36A, 0xCFF7}, //8514 #HANGUL SYLLABLE KHIEUKH U CHIEUCH
+ {0xB36B, 0xCFF8}, //8515 #HANGUL SYLLABLE KHIEUKH U KHIEUKH
+ {0xB36C, 0xCFF9}, //8516 #HANGUL SYLLABLE KHIEUKH U THIEUTH
+ {0xB36D, 0xCFFA}, //8517 #HANGUL SYLLABLE KHIEUKH U PHIEUPH
+ {0xB36E, 0xCFFB}, //8518 #HANGUL SYLLABLE KHIEUKH U HIEUH
+ {0xB36F, 0xCFFD}, //8519 #HANGUL SYLLABLE KHIEUKH WEO KIYEOK
+ {0xB370, 0xCFFE}, //8520 #HANGUL SYLLABLE KHIEUKH WEO SSANGKIYEOK
+ {0xB371, 0xCFFF}, //8521 #HANGUL SYLLABLE KHIEUKH WEO KIYEOKSIOS
+ {0xB372, 0xD001}, //8522 #HANGUL SYLLABLE KHIEUKH WEO NIEUNCIEUC
+ {0xB373, 0xD002}, //8523 #HANGUL SYLLABLE KHIEUKH WEO NIEUNHIEUH
+ {0xB374, 0xD003}, //8524 #HANGUL SYLLABLE KHIEUKH WEO TIKEUT
+ {0xB375, 0xD005}, //8525 #HANGUL SYLLABLE KHIEUKH WEO RIEULKIYEOK
+ {0xB376, 0xD006}, //8526 #HANGUL SYLLABLE KHIEUKH WEO RIEULMIEUM
+ {0xB377, 0xD007}, //8527 #HANGUL SYLLABLE KHIEUKH WEO RIEULPIEUP
+ {0xB378, 0xD008}, //8528 #HANGUL SYLLABLE KHIEUKH WEO RIEULSIOS
+ {0xB379, 0xD009}, //8529 #HANGUL SYLLABLE KHIEUKH WEO RIEULTHIEUTH
+ {0xB37A, 0xD00A}, //8530 #HANGUL SYLLABLE KHIEUKH WEO RIEULPHIEUPH
+ {0xB381, 0xD00B}, //8531 #HANGUL SYLLABLE KHIEUKH WEO RIEULHIEUH
+ {0xB382, 0xD00C}, //8532 #HANGUL SYLLABLE KHIEUKH WEO MIEUM
+ {0xB383, 0xD00D}, //8533 #HANGUL SYLLABLE KHIEUKH WEO PIEUP
+ {0xB384, 0xD00E}, //8534 #HANGUL SYLLABLE KHIEUKH WEO PIEUPSIOS
+ {0xB385, 0xD00F}, //8535 #HANGUL SYLLABLE KHIEUKH WEO SIOS
+ {0xB386, 0xD010}, //8536 #HANGUL SYLLABLE KHIEUKH WEO SSANGSIOS
+ {0xB387, 0xD012}, //8537 #HANGUL SYLLABLE KHIEUKH WEO CIEUC
+ {0xB388, 0xD013}, //8538 #HANGUL SYLLABLE KHIEUKH WEO CHIEUCH
+ {0xB389, 0xD014}, //8539 #HANGUL SYLLABLE KHIEUKH WEO KHIEUKH
+ {0xB38A, 0xD015}, //8540 #HANGUL SYLLABLE KHIEUKH WEO THIEUTH
+ {0xB38B, 0xD016}, //8541 #HANGUL SYLLABLE KHIEUKH WEO PHIEUPH
+ {0xB38C, 0xD017}, //8542 #HANGUL SYLLABLE KHIEUKH WEO HIEUH
+ {0xB38D, 0xD019}, //8543 #HANGUL SYLLABLE KHIEUKH WE KIYEOK
+ {0xB38E, 0xD01A}, //8544 #HANGUL SYLLABLE KHIEUKH WE SSANGKIYEOK
+ {0xB38F, 0xD01B}, //8545 #HANGUL SYLLABLE KHIEUKH WE KIYEOKSIOS
+ {0xB390, 0xD01C}, //8546 #HANGUL SYLLABLE KHIEUKH WE NIEUN
+ {0xB391, 0xD01D}, //8547 #HANGUL SYLLABLE KHIEUKH WE NIEUNCIEUC
+ {0xB392, 0xD01E}, //8548 #HANGUL SYLLABLE KHIEUKH WE NIEUNHIEUH
+ {0xB393, 0xD01F}, //8549 #HANGUL SYLLABLE KHIEUKH WE TIKEUT
+ {0xB394, 0xD020}, //8550 #HANGUL SYLLABLE KHIEUKH WE RIEUL
+ {0xB395, 0xD021}, //8551 #HANGUL SYLLABLE KHIEUKH WE RIEULKIYEOK
+ {0xB396, 0xD022}, //8552 #HANGUL SYLLABLE KHIEUKH WE RIEULMIEUM
+ {0xB397, 0xD023}, //8553 #HANGUL SYLLABLE KHIEUKH WE RIEULPIEUP
+ {0xB398, 0xD024}, //8554 #HANGUL SYLLABLE KHIEUKH WE RIEULSIOS
+ {0xB399, 0xD025}, //8555 #HANGUL SYLLABLE KHIEUKH WE RIEULTHIEUTH
+ {0xB39A, 0xD026}, //8556 #HANGUL SYLLABLE KHIEUKH WE RIEULPHIEUPH
+ {0xB39B, 0xD027}, //8557 #HANGUL SYLLABLE KHIEUKH WE RIEULHIEUH
+ {0xB39C, 0xD028}, //8558 #HANGUL SYLLABLE KHIEUKH WE MIEUM
+ {0xB39D, 0xD029}, //8559 #HANGUL SYLLABLE KHIEUKH WE PIEUP
+ {0xB39E, 0xD02A}, //8560 #HANGUL SYLLABLE KHIEUKH WE PIEUPSIOS
+ {0xB39F, 0xD02B}, //8561 #HANGUL SYLLABLE KHIEUKH WE SIOS
+ {0xB3A0, 0xD02C}, //8562 #HANGUL SYLLABLE KHIEUKH WE SSANGSIOS
+ {0xB3A1, 0xB05D}, //8563 #HANGUL SYLLABLE SSANGKIYEOK EU THIEUTH
+ {0xB3A2, 0xB07C}, //8564 #HANGUL SYLLABLE SSANGKIYEOK I
+ {0xB3A3, 0xB07D}, //8565 #HANGUL SYLLABLE SSANGKIYEOK I KIYEOK
+ {0xB3A4, 0xB080}, //8566 #HANGUL SYLLABLE SSANGKIYEOK I NIEUN
+ {0xB3A5, 0xB084}, //8567 #HANGUL SYLLABLE SSANGKIYEOK I RIEUL
+ {0xB3A6, 0xB08C}, //8568 #HANGUL SYLLABLE SSANGKIYEOK I MIEUM
+ {0xB3A7, 0xB08D}, //8569 #HANGUL SYLLABLE SSANGKIYEOK I PIEUP
+ {0xB3A8, 0xB08F}, //8570 #HANGUL SYLLABLE SSANGKIYEOK I SIOS
+ {0xB3A9, 0xB091}, //8571 #HANGUL SYLLABLE SSANGKIYEOK I IEUNG
+ {0xB3AA, 0xB098}, //8572 #HANGUL SYLLABLE NIEUN A
+ {0xB3AB, 0xB099}, //8573 #HANGUL SYLLABLE NIEUN A KIYEOK
+ {0xB3AC, 0xB09A}, //8574 #HANGUL SYLLABLE NIEUN A SSANGKIYEOK
+ {0xB3AD, 0xB09C}, //8575 #HANGUL SYLLABLE NIEUN A NIEUN
+ {0xB3AE, 0xB09F}, //8576 #HANGUL SYLLABLE NIEUN A TIKEUT
+ {0xB3AF, 0xB0A0}, //8577 #HANGUL SYLLABLE NIEUN A RIEUL
+ {0xB3B0, 0xB0A1}, //8578 #HANGUL SYLLABLE NIEUN A RIEULKIYEOK
+ {0xB3B1, 0xB0A2}, //8579 #HANGUL SYLLABLE NIEUN A RIEULMIEUM
+ {0xB3B2, 0xB0A8}, //8580 #HANGUL SYLLABLE NIEUN A MIEUM
+ {0xB3B3, 0xB0A9}, //8581 #HANGUL SYLLABLE NIEUN A PIEUP
+ {0xB3B4, 0xB0AB}, //8582 #HANGUL SYLLABLE NIEUN A SIOS
+ {0xB3B5, 0xB0AC}, //8583 #HANGUL SYLLABLE NIEUN A SSANGSIOS
+ {0xB3B6, 0xB0AD}, //8584 #HANGUL SYLLABLE NIEUN A IEUNG
+ {0xB3B7, 0xB0AE}, //8585 #HANGUL SYLLABLE NIEUN A CIEUC
+ {0xB3B8, 0xB0AF}, //8586 #HANGUL SYLLABLE NIEUN A CHIEUCH
+ {0xB3B9, 0xB0B1}, //8587 #HANGUL SYLLABLE NIEUN A THIEUTH
+ {0xB3BA, 0xB0B3}, //8588 #HANGUL SYLLABLE NIEUN A HIEUH
+ {0xB3BB, 0xB0B4}, //8589 #HANGUL SYLLABLE NIEUN AE
+ {0xB3BC, 0xB0B5}, //8590 #HANGUL SYLLABLE NIEUN AE KIYEOK
+ {0xB3BD, 0xB0B8}, //8591 #HANGUL SYLLABLE NIEUN AE NIEUN
+ {0xB3BE, 0xB0BC}, //8592 #HANGUL SYLLABLE NIEUN AE RIEUL
+ {0xB3BF, 0xB0C4}, //8593 #HANGUL SYLLABLE NIEUN AE MIEUM
+ {0xB3C0, 0xB0C5}, //8594 #HANGUL SYLLABLE NIEUN AE PIEUP
+ {0xB3C1, 0xB0C7}, //8595 #HANGUL SYLLABLE NIEUN AE SIOS
+ {0xB3C2, 0xB0C8}, //8596 #HANGUL SYLLABLE NIEUN AE SSANGSIOS
+ {0xB3C3, 0xB0C9}, //8597 #HANGUL SYLLABLE NIEUN AE IEUNG
+ {0xB3C4, 0xB0D0}, //8598 #HANGUL SYLLABLE NIEUN YA
+ {0xB3C5, 0xB0D1}, //8599 #HANGUL SYLLABLE NIEUN YA KIYEOK
+ {0xB3C6, 0xB0D4}, //8600 #HANGUL SYLLABLE NIEUN YA NIEUN
+ {0xB3C7, 0xB0D8}, //8601 #HANGUL SYLLABLE NIEUN YA RIEUL
+ {0xB3C8, 0xB0E0}, //8602 #HANGUL SYLLABLE NIEUN YA MIEUM
+ {0xB3C9, 0xB0E5}, //8603 #HANGUL SYLLABLE NIEUN YA IEUNG
+ {0xB3CA, 0xB108}, //8604 #HANGUL SYLLABLE NIEUN EO
+ {0xB3CB, 0xB109}, //8605 #HANGUL SYLLABLE NIEUN EO KIYEOK
+ {0xB3CC, 0xB10B}, //8606 #HANGUL SYLLABLE NIEUN EO KIYEOKSIOS
+ {0xB3CD, 0xB10C}, //8607 #HANGUL SYLLABLE NIEUN EO NIEUN
+ {0xB3CE, 0xB110}, //8608 #HANGUL SYLLABLE NIEUN EO RIEUL
+ {0xB3CF, 0xB112}, //8609 #HANGUL SYLLABLE NIEUN EO RIEULMIEUM
+ {0xB3D0, 0xB113}, //8610 #HANGUL SYLLABLE NIEUN EO RIEULPIEUP
+ {0xB3D1, 0xB118}, //8611 #HANGUL SYLLABLE NIEUN EO MIEUM
+ {0xB3D2, 0xB119}, //8612 #HANGUL SYLLABLE NIEUN EO PIEUP
+ {0xB3D3, 0xB11B}, //8613 #HANGUL SYLLABLE NIEUN EO SIOS
+ {0xB3D4, 0xB11C}, //8614 #HANGUL SYLLABLE NIEUN EO SSANGSIOS
+ {0xB3D5, 0xB11D}, //8615 #HANGUL SYLLABLE NIEUN EO IEUNG
+ {0xB3D6, 0xB123}, //8616 #HANGUL SYLLABLE NIEUN EO HIEUH
+ {0xB3D7, 0xB124}, //8617 #HANGUL SYLLABLE NIEUN E
+ {0xB3D8, 0xB125}, //8618 #HANGUL SYLLABLE NIEUN E KIYEOK
+ {0xB3D9, 0xB128}, //8619 #HANGUL SYLLABLE NIEUN E NIEUN
+ {0xB3DA, 0xB12C}, //8620 #HANGUL SYLLABLE NIEUN E RIEUL
+ {0xB3DB, 0xB134}, //8621 #HANGUL SYLLABLE NIEUN E MIEUM
+ {0xB3DC, 0xB135}, //8622 #HANGUL SYLLABLE NIEUN E PIEUP
+ {0xB3DD, 0xB137}, //8623 #HANGUL SYLLABLE NIEUN E SIOS
+ {0xB3DE, 0xB138}, //8624 #HANGUL SYLLABLE NIEUN E SSANGSIOS
+ {0xB3DF, 0xB139}, //8625 #HANGUL SYLLABLE NIEUN E IEUNG
+ {0xB3E0, 0xB140}, //8626 #HANGUL SYLLABLE NIEUN YEO
+ {0xB3E1, 0xB141}, //8627 #HANGUL SYLLABLE NIEUN YEO KIYEOK
+ {0xB3E2, 0xB144}, //8628 #HANGUL SYLLABLE NIEUN YEO NIEUN
+ {0xB3E3, 0xB148}, //8629 #HANGUL SYLLABLE NIEUN YEO RIEUL
+ {0xB3E4, 0xB150}, //8630 #HANGUL SYLLABLE NIEUN YEO MIEUM
+ {0xB3E5, 0xB151}, //8631 #HANGUL SYLLABLE NIEUN YEO PIEUP
+ {0xB3E6, 0xB154}, //8632 #HANGUL SYLLABLE NIEUN YEO SSANGSIOS
+ {0xB3E7, 0xB155}, //8633 #HANGUL SYLLABLE NIEUN YEO IEUNG
+ {0xB3E8, 0xB158}, //8634 #HANGUL SYLLABLE NIEUN YEO KHIEUKH
+ {0xB3E9, 0xB15C}, //8635 #HANGUL SYLLABLE NIEUN YE
+ {0xB3EA, 0xB160}, //8636 #HANGUL SYLLABLE NIEUN YE NIEUN
+ {0xB3EB, 0xB178}, //8637 #HANGUL SYLLABLE NIEUN O
+ {0xB3EC, 0xB179}, //8638 #HANGUL SYLLABLE NIEUN O KIYEOK
+ {0xB3ED, 0xB17C}, //8639 #HANGUL SYLLABLE NIEUN O NIEUN
+ {0xB3EE, 0xB180}, //8640 #HANGUL SYLLABLE NIEUN O RIEUL
+ {0xB3EF, 0xB182}, //8641 #HANGUL SYLLABLE NIEUN O RIEULMIEUM
+ {0xB3F0, 0xB188}, //8642 #HANGUL SYLLABLE NIEUN O MIEUM
+ {0xB3F1, 0xB189}, //8643 #HANGUL SYLLABLE NIEUN O PIEUP
+ {0xB3F2, 0xB18B}, //8644 #HANGUL SYLLABLE NIEUN O SIOS
+ {0xB3F3, 0xB18D}, //8645 #HANGUL SYLLABLE NIEUN O IEUNG
+ {0xB3F4, 0xB192}, //8646 #HANGUL SYLLABLE NIEUN O PHIEUPH
+ {0xB3F5, 0xB193}, //8647 #HANGUL SYLLABLE NIEUN O HIEUH
+ {0xB3F6, 0xB194}, //8648 #HANGUL SYLLABLE NIEUN WA
+ {0xB3F7, 0xB198}, //8649 #HANGUL SYLLABLE NIEUN WA NIEUN
+ {0xB3F8, 0xB19C}, //8650 #HANGUL SYLLABLE NIEUN WA RIEUL
+ {0xB3F9, 0xB1A8}, //8651 #HANGUL SYLLABLE NIEUN WA SSANGSIOS
+ {0xB3FA, 0xB1CC}, //8652 #HANGUL SYLLABLE NIEUN OE
+ {0xB3FB, 0xB1D0}, //8653 #HANGUL SYLLABLE NIEUN OE NIEUN
+ {0xB3FC, 0xB1D4}, //8654 #HANGUL SYLLABLE NIEUN OE RIEUL
+ {0xB3FD, 0xB1DC}, //8655 #HANGUL SYLLABLE NIEUN OE MIEUM
+ {0xB3FE, 0xB1DD}, //8656 #HANGUL SYLLABLE NIEUN OE PIEUP
+ {0xB441, 0xD02E}, //8657 #HANGUL SYLLABLE KHIEUKH WE CIEUC
+ {0xB442, 0xD02F}, //8658 #HANGUL SYLLABLE KHIEUKH WE CHIEUCH
+ {0xB443, 0xD030}, //8659 #HANGUL SYLLABLE KHIEUKH WE KHIEUKH
+ {0xB444, 0xD031}, //8660 #HANGUL SYLLABLE KHIEUKH WE THIEUTH
+ {0xB445, 0xD032}, //8661 #HANGUL SYLLABLE KHIEUKH WE PHIEUPH
+ {0xB446, 0xD033}, //8662 #HANGUL SYLLABLE KHIEUKH WE HIEUH
+ {0xB447, 0xD036}, //8663 #HANGUL SYLLABLE KHIEUKH WI SSANGKIYEOK
+ {0xB448, 0xD037}, //8664 #HANGUL SYLLABLE KHIEUKH WI KIYEOKSIOS
+ {0xB449, 0xD039}, //8665 #HANGUL SYLLABLE KHIEUKH WI NIEUNCIEUC
+ {0xB44A, 0xD03A}, //8666 #HANGUL SYLLABLE KHIEUKH WI NIEUNHIEUH
+ {0xB44B, 0xD03B}, //8667 #HANGUL SYLLABLE KHIEUKH WI TIKEUT
+ {0xB44C, 0xD03D}, //8668 #HANGUL SYLLABLE KHIEUKH WI RIEULKIYEOK
+ {0xB44D, 0xD03E}, //8669 #HANGUL SYLLABLE KHIEUKH WI RIEULMIEUM
+ {0xB44E, 0xD03F}, //8670 #HANGUL SYLLABLE KHIEUKH WI RIEULPIEUP
+ {0xB44F, 0xD040}, //8671 #HANGUL SYLLABLE KHIEUKH WI RIEULSIOS
+ {0xB450, 0xD041}, //8672 #HANGUL SYLLABLE KHIEUKH WI RIEULTHIEUTH
+ {0xB451, 0xD042}, //8673 #HANGUL SYLLABLE KHIEUKH WI RIEULPHIEUPH
+ {0xB452, 0xD043}, //8674 #HANGUL SYLLABLE KHIEUKH WI RIEULHIEUH
+ {0xB453, 0xD046}, //8675 #HANGUL SYLLABLE KHIEUKH WI PIEUPSIOS
+ {0xB454, 0xD048}, //8676 #HANGUL SYLLABLE KHIEUKH WI SSANGSIOS
+ {0xB455, 0xD04A}, //8677 #HANGUL SYLLABLE KHIEUKH WI CIEUC
+ {0xB456, 0xD04B}, //8678 #HANGUL SYLLABLE KHIEUKH WI CHIEUCH
+ {0xB457, 0xD04C}, //8679 #HANGUL SYLLABLE KHIEUKH WI KHIEUKH
+ {0xB458, 0xD04D}, //8680 #HANGUL SYLLABLE KHIEUKH WI THIEUTH
+ {0xB459, 0xD04E}, //8681 #HANGUL SYLLABLE KHIEUKH WI PHIEUPH
+ {0xB45A, 0xD04F}, //8682 #HANGUL SYLLABLE KHIEUKH WI HIEUH
+ {0xB461, 0xD051}, //8683 #HANGUL SYLLABLE KHIEUKH YU KIYEOK
+ {0xB462, 0xD052}, //8684 #HANGUL SYLLABLE KHIEUKH YU SSANGKIYEOK
+ {0xB463, 0xD053}, //8685 #HANGUL SYLLABLE KHIEUKH YU KIYEOKSIOS
+ {0xB464, 0xD055}, //8686 #HANGUL SYLLABLE KHIEUKH YU NIEUNCIEUC
+ {0xB465, 0xD056}, //8687 #HANGUL SYLLABLE KHIEUKH YU NIEUNHIEUH
+ {0xB466, 0xD057}, //8688 #HANGUL SYLLABLE KHIEUKH YU TIKEUT
+ {0xB467, 0xD059}, //8689 #HANGUL SYLLABLE KHIEUKH YU RIEULKIYEOK
+ {0xB468, 0xD05A}, //8690 #HANGUL SYLLABLE KHIEUKH YU RIEULMIEUM
+ {0xB469, 0xD05B}, //8691 #HANGUL SYLLABLE KHIEUKH YU RIEULPIEUP
+ {0xB46A, 0xD05C}, //8692 #HANGUL SYLLABLE KHIEUKH YU RIEULSIOS
+ {0xB46B, 0xD05D}, //8693 #HANGUL SYLLABLE KHIEUKH YU RIEULTHIEUTH
+ {0xB46C, 0xD05E}, //8694 #HANGUL SYLLABLE KHIEUKH YU RIEULPHIEUPH
+ {0xB46D, 0xD05F}, //8695 #HANGUL SYLLABLE KHIEUKH YU RIEULHIEUH
+ {0xB46E, 0xD061}, //8696 #HANGUL SYLLABLE KHIEUKH YU PIEUP
+ {0xB46F, 0xD062}, //8697 #HANGUL SYLLABLE KHIEUKH YU PIEUPSIOS
+ {0xB470, 0xD063}, //8698 #HANGUL SYLLABLE KHIEUKH YU SIOS
+ {0xB471, 0xD064}, //8699 #HANGUL SYLLABLE KHIEUKH YU SSANGSIOS
+ {0xB472, 0xD065}, //8700 #HANGUL SYLLABLE KHIEUKH YU IEUNG
+ {0xB473, 0xD066}, //8701 #HANGUL SYLLABLE KHIEUKH YU CIEUC
+ {0xB474, 0xD067}, //8702 #HANGUL SYLLABLE KHIEUKH YU CHIEUCH
+ {0xB475, 0xD068}, //8703 #HANGUL SYLLABLE KHIEUKH YU KHIEUKH
+ {0xB476, 0xD069}, //8704 #HANGUL SYLLABLE KHIEUKH YU THIEUTH
+ {0xB477, 0xD06A}, //8705 #HANGUL SYLLABLE KHIEUKH YU PHIEUPH
+ {0xB478, 0xD06B}, //8706 #HANGUL SYLLABLE KHIEUKH YU HIEUH
+ {0xB479, 0xD06E}, //8707 #HANGUL SYLLABLE KHIEUKH EU SSANGKIYEOK
+ {0xB47A, 0xD06F}, //8708 #HANGUL SYLLABLE KHIEUKH EU KIYEOKSIOS
+ {0xB481, 0xD071}, //8709 #HANGUL SYLLABLE KHIEUKH EU NIEUNCIEUC
+ {0xB482, 0xD072}, //8710 #HANGUL SYLLABLE KHIEUKH EU NIEUNHIEUH
+ {0xB483, 0xD073}, //8711 #HANGUL SYLLABLE KHIEUKH EU TIKEUT
+ {0xB484, 0xD075}, //8712 #HANGUL SYLLABLE KHIEUKH EU RIEULKIYEOK
+ {0xB485, 0xD076}, //8713 #HANGUL SYLLABLE KHIEUKH EU RIEULMIEUM
+ {0xB486, 0xD077}, //8714 #HANGUL SYLLABLE KHIEUKH EU RIEULPIEUP
+ {0xB487, 0xD078}, //8715 #HANGUL SYLLABLE KHIEUKH EU RIEULSIOS
+ {0xB488, 0xD079}, //8716 #HANGUL SYLLABLE KHIEUKH EU RIEULTHIEUTH
+ {0xB489, 0xD07A}, //8717 #HANGUL SYLLABLE KHIEUKH EU RIEULPHIEUPH
+ {0xB48A, 0xD07B}, //8718 #HANGUL SYLLABLE KHIEUKH EU RIEULHIEUH
+ {0xB48B, 0xD07E}, //8719 #HANGUL SYLLABLE KHIEUKH EU PIEUPSIOS
+ {0xB48C, 0xD07F}, //8720 #HANGUL SYLLABLE KHIEUKH EU SIOS
+ {0xB48D, 0xD080}, //8721 #HANGUL SYLLABLE KHIEUKH EU SSANGSIOS
+ {0xB48E, 0xD082}, //8722 #HANGUL SYLLABLE KHIEUKH EU CIEUC
+ {0xB48F, 0xD083}, //8723 #HANGUL SYLLABLE KHIEUKH EU CHIEUCH
+ {0xB490, 0xD084}, //8724 #HANGUL SYLLABLE KHIEUKH EU KHIEUKH
+ {0xB491, 0xD085}, //8725 #HANGUL SYLLABLE KHIEUKH EU THIEUTH
+ {0xB492, 0xD086}, //8726 #HANGUL SYLLABLE KHIEUKH EU PHIEUPH
+ {0xB493, 0xD087}, //8727 #HANGUL SYLLABLE KHIEUKH EU HIEUH
+ {0xB494, 0xD088}, //8728 #HANGUL SYLLABLE KHIEUKH YI
+ {0xB495, 0xD089}, //8729 #HANGUL SYLLABLE KHIEUKH YI KIYEOK
+ {0xB496, 0xD08A}, //8730 #HANGUL SYLLABLE KHIEUKH YI SSANGKIYEOK
+ {0xB497, 0xD08B}, //8731 #HANGUL SYLLABLE KHIEUKH YI KIYEOKSIOS
+ {0xB498, 0xD08C}, //8732 #HANGUL SYLLABLE KHIEUKH YI NIEUN
+ {0xB499, 0xD08D}, //8733 #HANGUL SYLLABLE KHIEUKH YI NIEUNCIEUC
+ {0xB49A, 0xD08E}, //8734 #HANGUL SYLLABLE KHIEUKH YI NIEUNHIEUH
+ {0xB49B, 0xD08F}, //8735 #HANGUL SYLLABLE KHIEUKH YI TIKEUT
+ {0xB49C, 0xD090}, //8736 #HANGUL SYLLABLE KHIEUKH YI RIEUL
+ {0xB49D, 0xD091}, //8737 #HANGUL SYLLABLE KHIEUKH YI RIEULKIYEOK
+ {0xB49E, 0xD092}, //8738 #HANGUL SYLLABLE KHIEUKH YI RIEULMIEUM
+ {0xB49F, 0xD093}, //8739 #HANGUL SYLLABLE KHIEUKH YI RIEULPIEUP
+ {0xB4A0, 0xD094}, //8740 #HANGUL SYLLABLE KHIEUKH YI RIEULSIOS
+ {0xB4A1, 0xB1DF}, //8741 #HANGUL SYLLABLE NIEUN OE SIOS
+ {0xB4A2, 0xB1E8}, //8742 #HANGUL SYLLABLE NIEUN YO
+ {0xB4A3, 0xB1E9}, //8743 #HANGUL SYLLABLE NIEUN YO KIYEOK
+ {0xB4A4, 0xB1EC}, //8744 #HANGUL SYLLABLE NIEUN YO NIEUN
+ {0xB4A5, 0xB1F0}, //8745 #HANGUL SYLLABLE NIEUN YO RIEUL
+ {0xB4A6, 0xB1F9}, //8746 #HANGUL SYLLABLE NIEUN YO PIEUP
+ {0xB4A7, 0xB1FB}, //8747 #HANGUL SYLLABLE NIEUN YO SIOS
+ {0xB4A8, 0xB1FD}, //8748 #HANGUL SYLLABLE NIEUN YO IEUNG
+ {0xB4A9, 0xB204}, //8749 #HANGUL SYLLABLE NIEUN U
+ {0xB4AA, 0xB205}, //8750 #HANGUL SYLLABLE NIEUN U KIYEOK
+ {0xB4AB, 0xB208}, //8751 #HANGUL SYLLABLE NIEUN U NIEUN
+ {0xB4AC, 0xB20B}, //8752 #HANGUL SYLLABLE NIEUN U TIKEUT
+ {0xB4AD, 0xB20C}, //8753 #HANGUL SYLLABLE NIEUN U RIEUL
+ {0xB4AE, 0xB214}, //8754 #HANGUL SYLLABLE NIEUN U MIEUM
+ {0xB4AF, 0xB215}, //8755 #HANGUL SYLLABLE NIEUN U PIEUP
+ {0xB4B0, 0xB217}, //8756 #HANGUL SYLLABLE NIEUN U SIOS
+ {0xB4B1, 0xB219}, //8757 #HANGUL SYLLABLE NIEUN U IEUNG
+ {0xB4B2, 0xB220}, //8758 #HANGUL SYLLABLE NIEUN WEO
+ {0xB4B3, 0xB234}, //8759 #HANGUL SYLLABLE NIEUN WEO SSANGSIOS
+ {0xB4B4, 0xB23C}, //8760 #HANGUL SYLLABLE NIEUN WE
+ {0xB4B5, 0xB258}, //8761 #HANGUL SYLLABLE NIEUN WI
+ {0xB4B6, 0xB25C}, //8762 #HANGUL SYLLABLE NIEUN WI NIEUN
+ {0xB4B7, 0xB260}, //8763 #HANGUL SYLLABLE NIEUN WI RIEUL
+ {0xB4B8, 0xB268}, //8764 #HANGUL SYLLABLE NIEUN WI MIEUM
+ {0xB4B9, 0xB269}, //8765 #HANGUL SYLLABLE NIEUN WI PIEUP
+ {0xB4BA, 0xB274}, //8766 #HANGUL SYLLABLE NIEUN YU
+ {0xB4BB, 0xB275}, //8767 #HANGUL SYLLABLE NIEUN YU KIYEOK
+ {0xB4BC, 0xB27C}, //8768 #HANGUL SYLLABLE NIEUN YU RIEUL
+ {0xB4BD, 0xB284}, //8769 #HANGUL SYLLABLE NIEUN YU MIEUM
+ {0xB4BE, 0xB285}, //8770 #HANGUL SYLLABLE NIEUN YU PIEUP
+ {0xB4BF, 0xB289}, //8771 #HANGUL SYLLABLE NIEUN YU IEUNG
+ {0xB4C0, 0xB290}, //8772 #HANGUL SYLLABLE NIEUN EU
+ {0xB4C1, 0xB291}, //8773 #HANGUL SYLLABLE NIEUN EU KIYEOK
+ {0xB4C2, 0xB294}, //8774 #HANGUL SYLLABLE NIEUN EU NIEUN
+ {0xB4C3, 0xB298}, //8775 #HANGUL SYLLABLE NIEUN EU RIEUL
+ {0xB4C4, 0xB299}, //8776 #HANGUL SYLLABLE NIEUN EU RIEULKIYEOK
+ {0xB4C5, 0xB29A}, //8777 #HANGUL SYLLABLE NIEUN EU RIEULMIEUM
+ {0xB4C6, 0xB2A0}, //8778 #HANGUL SYLLABLE NIEUN EU MIEUM
+ {0xB4C7, 0xB2A1}, //8779 #HANGUL SYLLABLE NIEUN EU PIEUP
+ {0xB4C8, 0xB2A3}, //8780 #HANGUL SYLLABLE NIEUN EU SIOS
+ {0xB4C9, 0xB2A5}, //8781 #HANGUL SYLLABLE NIEUN EU IEUNG
+ {0xB4CA, 0xB2A6}, //8782 #HANGUL SYLLABLE NIEUN EU CIEUC
+ {0xB4CB, 0xB2AA}, //8783 #HANGUL SYLLABLE NIEUN EU PHIEUPH
+ {0xB4CC, 0xB2AC}, //8784 #HANGUL SYLLABLE NIEUN YI
+ {0xB4CD, 0xB2B0}, //8785 #HANGUL SYLLABLE NIEUN YI NIEUN
+ {0xB4CE, 0xB2B4}, //8786 #HANGUL SYLLABLE NIEUN YI RIEUL
+ {0xB4CF, 0xB2C8}, //8787 #HANGUL SYLLABLE NIEUN I
+ {0xB4D0, 0xB2C9}, //8788 #HANGUL SYLLABLE NIEUN I KIYEOK
+ {0xB4D1, 0xB2CC}, //8789 #HANGUL SYLLABLE NIEUN I NIEUN
+ {0xB4D2, 0xB2D0}, //8790 #HANGUL SYLLABLE NIEUN I RIEUL
+ {0xB4D3, 0xB2D2}, //8791 #HANGUL SYLLABLE NIEUN I RIEULMIEUM
+ {0xB4D4, 0xB2D8}, //8792 #HANGUL SYLLABLE NIEUN I MIEUM
+ {0xB4D5, 0xB2D9}, //8793 #HANGUL SYLLABLE NIEUN I PIEUP
+ {0xB4D6, 0xB2DB}, //8794 #HANGUL SYLLABLE NIEUN I SIOS
+ {0xB4D7, 0xB2DD}, //8795 #HANGUL SYLLABLE NIEUN I IEUNG
+ {0xB4D8, 0xB2E2}, //8796 #HANGUL SYLLABLE NIEUN I PHIEUPH
+ {0xB4D9, 0xB2E4}, //8797 #HANGUL SYLLABLE TIKEUT A
+ {0xB4DA, 0xB2E5}, //8798 #HANGUL SYLLABLE TIKEUT A KIYEOK
+ {0xB4DB, 0xB2E6}, //8799 #HANGUL SYLLABLE TIKEUT A SSANGKIYEOK
+ {0xB4DC, 0xB2E8}, //8800 #HANGUL SYLLABLE TIKEUT A NIEUN
+ {0xB4DD, 0xB2EB}, //8801 #HANGUL SYLLABLE TIKEUT A TIKEUT
+ {0xB4DE, 0xB2EC}, //8802 #HANGUL SYLLABLE TIKEUT A RIEUL
+ {0xB4DF, 0xB2ED}, //8803 #HANGUL SYLLABLE TIKEUT A RIEULKIYEOK
+ {0xB4E0, 0xB2EE}, //8804 #HANGUL SYLLABLE TIKEUT A RIEULMIEUM
+ {0xB4E1, 0xB2EF}, //8805 #HANGUL SYLLABLE TIKEUT A RIEULPIEUP
+ {0xB4E2, 0xB2F3}, //8806 #HANGUL SYLLABLE TIKEUT A RIEULHIEUH
+ {0xB4E3, 0xB2F4}, //8807 #HANGUL SYLLABLE TIKEUT A MIEUM
+ {0xB4E4, 0xB2F5}, //8808 #HANGUL SYLLABLE TIKEUT A PIEUP
+ {0xB4E5, 0xB2F7}, //8809 #HANGUL SYLLABLE TIKEUT A SIOS
+ {0xB4E6, 0xB2F8}, //8810 #HANGUL SYLLABLE TIKEUT A SSANGSIOS
+ {0xB4E7, 0xB2F9}, //8811 #HANGUL SYLLABLE TIKEUT A IEUNG
+ {0xB4E8, 0xB2FA}, //8812 #HANGUL SYLLABLE TIKEUT A CIEUC
+ {0xB4E9, 0xB2FB}, //8813 #HANGUL SYLLABLE TIKEUT A CHIEUCH
+ {0xB4EA, 0xB2FF}, //8814 #HANGUL SYLLABLE TIKEUT A HIEUH
+ {0xB4EB, 0xB300}, //8815 #HANGUL SYLLABLE TIKEUT AE
+ {0xB4EC, 0xB301}, //8816 #HANGUL SYLLABLE TIKEUT AE KIYEOK
+ {0xB4ED, 0xB304}, //8817 #HANGUL SYLLABLE TIKEUT AE NIEUN
+ {0xB4EE, 0xB308}, //8818 #HANGUL SYLLABLE TIKEUT AE RIEUL
+ {0xB4EF, 0xB310}, //8819 #HANGUL SYLLABLE TIKEUT AE MIEUM
+ {0xB4F0, 0xB311}, //8820 #HANGUL SYLLABLE TIKEUT AE PIEUP
+ {0xB4F1, 0xB313}, //8821 #HANGUL SYLLABLE TIKEUT AE SIOS
+ {0xB4F2, 0xB314}, //8822 #HANGUL SYLLABLE TIKEUT AE SSANGSIOS
+ {0xB4F3, 0xB315}, //8823 #HANGUL SYLLABLE TIKEUT AE IEUNG
+ {0xB4F4, 0xB31C}, //8824 #HANGUL SYLLABLE TIKEUT YA
+ {0xB4F5, 0xB354}, //8825 #HANGUL SYLLABLE TIKEUT EO
+ {0xB4F6, 0xB355}, //8826 #HANGUL SYLLABLE TIKEUT EO KIYEOK
+ {0xB4F7, 0xB356}, //8827 #HANGUL SYLLABLE TIKEUT EO SSANGKIYEOK
+ {0xB4F8, 0xB358}, //8828 #HANGUL SYLLABLE TIKEUT EO NIEUN
+ {0xB4F9, 0xB35B}, //8829 #HANGUL SYLLABLE TIKEUT EO TIKEUT
+ {0xB4FA, 0xB35C}, //8830 #HANGUL SYLLABLE TIKEUT EO RIEUL
+ {0xB4FB, 0xB35E}, //8831 #HANGUL SYLLABLE TIKEUT EO RIEULMIEUM
+ {0xB4FC, 0xB35F}, //8832 #HANGUL SYLLABLE TIKEUT EO RIEULPIEUP
+ {0xB4FD, 0xB364}, //8833 #HANGUL SYLLABLE TIKEUT EO MIEUM
+ {0xB4FE, 0xB365}, //8834 #HANGUL SYLLABLE TIKEUT EO PIEUP
+ {0xB541, 0xD095}, //8835 #HANGUL SYLLABLE KHIEUKH YI RIEULTHIEUTH
+ {0xB542, 0xD096}, //8836 #HANGUL SYLLABLE KHIEUKH YI RIEULPHIEUPH
+ {0xB543, 0xD097}, //8837 #HANGUL SYLLABLE KHIEUKH YI RIEULHIEUH
+ {0xB544, 0xD098}, //8838 #HANGUL SYLLABLE KHIEUKH YI MIEUM
+ {0xB545, 0xD099}, //8839 #HANGUL SYLLABLE KHIEUKH YI PIEUP
+ {0xB546, 0xD09A}, //8840 #HANGUL SYLLABLE KHIEUKH YI PIEUPSIOS
+ {0xB547, 0xD09B}, //8841 #HANGUL SYLLABLE KHIEUKH YI SIOS
+ {0xB548, 0xD09C}, //8842 #HANGUL SYLLABLE KHIEUKH YI SSANGSIOS
+ {0xB549, 0xD09D}, //8843 #HANGUL SYLLABLE KHIEUKH YI IEUNG
+ {0xB54A, 0xD09E}, //8844 #HANGUL SYLLABLE KHIEUKH YI CIEUC
+ {0xB54B, 0xD09F}, //8845 #HANGUL SYLLABLE KHIEUKH YI CHIEUCH
+ {0xB54C, 0xD0A0}, //8846 #HANGUL SYLLABLE KHIEUKH YI KHIEUKH
+ {0xB54D, 0xD0A1}, //8847 #HANGUL SYLLABLE KHIEUKH YI THIEUTH
+ {0xB54E, 0xD0A2}, //8848 #HANGUL SYLLABLE KHIEUKH YI PHIEUPH
+ {0xB54F, 0xD0A3}, //8849 #HANGUL SYLLABLE KHIEUKH YI HIEUH
+ {0xB550, 0xD0A6}, //8850 #HANGUL SYLLABLE KHIEUKH I SSANGKIYEOK
+ {0xB551, 0xD0A7}, //8851 #HANGUL SYLLABLE KHIEUKH I KIYEOKSIOS
+ {0xB552, 0xD0A9}, //8852 #HANGUL SYLLABLE KHIEUKH I NIEUNCIEUC
+ {0xB553, 0xD0AA}, //8853 #HANGUL SYLLABLE KHIEUKH I NIEUNHIEUH
+ {0xB554, 0xD0AB}, //8854 #HANGUL SYLLABLE KHIEUKH I TIKEUT
+ {0xB555, 0xD0AD}, //8855 #HANGUL SYLLABLE KHIEUKH I RIEULKIYEOK
+ {0xB556, 0xD0AE}, //8856 #HANGUL SYLLABLE KHIEUKH I RIEULMIEUM
+ {0xB557, 0xD0AF}, //8857 #HANGUL SYLLABLE KHIEUKH I RIEULPIEUP
+ {0xB558, 0xD0B0}, //8858 #HANGUL SYLLABLE KHIEUKH I RIEULSIOS
+ {0xB559, 0xD0B1}, //8859 #HANGUL SYLLABLE KHIEUKH I RIEULTHIEUTH
+ {0xB55A, 0xD0B2}, //8860 #HANGUL SYLLABLE KHIEUKH I RIEULPHIEUPH
+ {0xB561, 0xD0B3}, //8861 #HANGUL SYLLABLE KHIEUKH I RIEULHIEUH
+ {0xB562, 0xD0B6}, //8862 #HANGUL SYLLABLE KHIEUKH I PIEUPSIOS
+ {0xB563, 0xD0B8}, //8863 #HANGUL SYLLABLE KHIEUKH I SSANGSIOS
+ {0xB564, 0xD0BA}, //8864 #HANGUL SYLLABLE KHIEUKH I CIEUC
+ {0xB565, 0xD0BB}, //8865 #HANGUL SYLLABLE KHIEUKH I CHIEUCH
+ {0xB566, 0xD0BC}, //8866 #HANGUL SYLLABLE KHIEUKH I KHIEUKH
+ {0xB567, 0xD0BD}, //8867 #HANGUL SYLLABLE KHIEUKH I THIEUTH
+ {0xB568, 0xD0BE}, //8868 #HANGUL SYLLABLE KHIEUKH I PHIEUPH
+ {0xB569, 0xD0BF}, //8869 #HANGUL SYLLABLE KHIEUKH I HIEUH
+ {0xB56A, 0xD0C2}, //8870 #HANGUL SYLLABLE THIEUTH A SSANGKIYEOK
+ {0xB56B, 0xD0C3}, //8871 #HANGUL SYLLABLE THIEUTH A KIYEOKSIOS
+ {0xB56C, 0xD0C5}, //8872 #HANGUL SYLLABLE THIEUTH A NIEUNCIEUC
+ {0xB56D, 0xD0C6}, //8873 #HANGUL SYLLABLE THIEUTH A NIEUNHIEUH
+ {0xB56E, 0xD0C7}, //8874 #HANGUL SYLLABLE THIEUTH A TIKEUT
+ {0xB56F, 0xD0CA}, //8875 #HANGUL SYLLABLE THIEUTH A RIEULMIEUM
+ {0xB570, 0xD0CB}, //8876 #HANGUL SYLLABLE THIEUTH A RIEULPIEUP
+ {0xB571, 0xD0CC}, //8877 #HANGUL SYLLABLE THIEUTH A RIEULSIOS
+ {0xB572, 0xD0CD}, //8878 #HANGUL SYLLABLE THIEUTH A RIEULTHIEUTH
+ {0xB573, 0xD0CE}, //8879 #HANGUL SYLLABLE THIEUTH A RIEULPHIEUPH
+ {0xB574, 0xD0CF}, //8880 #HANGUL SYLLABLE THIEUTH A RIEULHIEUH
+ {0xB575, 0xD0D2}, //8881 #HANGUL SYLLABLE THIEUTH A PIEUPSIOS
+ {0xB576, 0xD0D6}, //8882 #HANGUL SYLLABLE THIEUTH A CIEUC
+ {0xB577, 0xD0D7}, //8883 #HANGUL SYLLABLE THIEUTH A CHIEUCH
+ {0xB578, 0xD0D8}, //8884 #HANGUL SYLLABLE THIEUTH A KHIEUKH
+ {0xB579, 0xD0D9}, //8885 #HANGUL SYLLABLE THIEUTH A THIEUTH
+ {0xB57A, 0xD0DA}, //8886 #HANGUL SYLLABLE THIEUTH A PHIEUPH
+ {0xB581, 0xD0DB}, //8887 #HANGUL SYLLABLE THIEUTH A HIEUH
+ {0xB582, 0xD0DE}, //8888 #HANGUL SYLLABLE THIEUTH AE SSANGKIYEOK
+ {0xB583, 0xD0DF}, //8889 #HANGUL SYLLABLE THIEUTH AE KIYEOKSIOS
+ {0xB584, 0xD0E1}, //8890 #HANGUL SYLLABLE THIEUTH AE NIEUNCIEUC
+ {0xB585, 0xD0E2}, //8891 #HANGUL SYLLABLE THIEUTH AE NIEUNHIEUH
+ {0xB586, 0xD0E3}, //8892 #HANGUL SYLLABLE THIEUTH AE TIKEUT
+ {0xB587, 0xD0E5}, //8893 #HANGUL SYLLABLE THIEUTH AE RIEULKIYEOK
+ {0xB588, 0xD0E6}, //8894 #HANGUL SYLLABLE THIEUTH AE RIEULMIEUM
+ {0xB589, 0xD0E7}, //8895 #HANGUL SYLLABLE THIEUTH AE RIEULPIEUP
+ {0xB58A, 0xD0E8}, //8896 #HANGUL SYLLABLE THIEUTH AE RIEULSIOS
+ {0xB58B, 0xD0E9}, //8897 #HANGUL SYLLABLE THIEUTH AE RIEULTHIEUTH
+ {0xB58C, 0xD0EA}, //8898 #HANGUL SYLLABLE THIEUTH AE RIEULPHIEUPH
+ {0xB58D, 0xD0EB}, //8899 #HANGUL SYLLABLE THIEUTH AE RIEULHIEUH
+ {0xB58E, 0xD0EE}, //8900 #HANGUL SYLLABLE THIEUTH AE PIEUPSIOS
+ {0xB58F, 0xD0F2}, //8901 #HANGUL SYLLABLE THIEUTH AE CIEUC
+ {0xB590, 0xD0F3}, //8902 #HANGUL SYLLABLE THIEUTH AE CHIEUCH
+ {0xB591, 0xD0F4}, //8903 #HANGUL SYLLABLE THIEUTH AE KHIEUKH
+ {0xB592, 0xD0F5}, //8904 #HANGUL SYLLABLE THIEUTH AE THIEUTH
+ {0xB593, 0xD0F6}, //8905 #HANGUL SYLLABLE THIEUTH AE PHIEUPH
+ {0xB594, 0xD0F7}, //8906 #HANGUL SYLLABLE THIEUTH AE HIEUH
+ {0xB595, 0xD0F9}, //8907 #HANGUL SYLLABLE THIEUTH YA KIYEOK
+ {0xB596, 0xD0FA}, //8908 #HANGUL SYLLABLE THIEUTH YA SSANGKIYEOK
+ {0xB597, 0xD0FB}, //8909 #HANGUL SYLLABLE THIEUTH YA KIYEOKSIOS
+ {0xB598, 0xD0FC}, //8910 #HANGUL SYLLABLE THIEUTH YA NIEUN
+ {0xB599, 0xD0FD}, //8911 #HANGUL SYLLABLE THIEUTH YA NIEUNCIEUC
+ {0xB59A, 0xD0FE}, //8912 #HANGUL SYLLABLE THIEUTH YA NIEUNHIEUH
+ {0xB59B, 0xD0FF}, //8913 #HANGUL SYLLABLE THIEUTH YA TIKEUT
+ {0xB59C, 0xD100}, //8914 #HANGUL SYLLABLE THIEUTH YA RIEUL
+ {0xB59D, 0xD101}, //8915 #HANGUL SYLLABLE THIEUTH YA RIEULKIYEOK
+ {0xB59E, 0xD102}, //8916 #HANGUL SYLLABLE THIEUTH YA RIEULMIEUM
+ {0xB59F, 0xD103}, //8917 #HANGUL SYLLABLE THIEUTH YA RIEULPIEUP
+ {0xB5A0, 0xD104}, //8918 #HANGUL SYLLABLE THIEUTH YA RIEULSIOS
+ {0xB5A1, 0xB367}, //8919 #HANGUL SYLLABLE TIKEUT EO SIOS
+ {0xB5A2, 0xB369}, //8920 #HANGUL SYLLABLE TIKEUT EO IEUNG
+ {0xB5A3, 0xB36B}, //8921 #HANGUL SYLLABLE TIKEUT EO CHIEUCH
+ {0xB5A4, 0xB36E}, //8922 #HANGUL SYLLABLE TIKEUT EO PHIEUPH
+ {0xB5A5, 0xB370}, //8923 #HANGUL SYLLABLE TIKEUT E
+ {0xB5A6, 0xB371}, //8924 #HANGUL SYLLABLE TIKEUT E KIYEOK
+ {0xB5A7, 0xB374}, //8925 #HANGUL SYLLABLE TIKEUT E NIEUN
+ {0xB5A8, 0xB378}, //8926 #HANGUL SYLLABLE TIKEUT E RIEUL
+ {0xB5A9, 0xB380}, //8927 #HANGUL SYLLABLE TIKEUT E MIEUM
+ {0xB5AA, 0xB381}, //8928 #HANGUL SYLLABLE TIKEUT E PIEUP
+ {0xB5AB, 0xB383}, //8929 #HANGUL SYLLABLE TIKEUT E SIOS
+ {0xB5AC, 0xB384}, //8930 #HANGUL SYLLABLE TIKEUT E SSANGSIOS
+ {0xB5AD, 0xB385}, //8931 #HANGUL SYLLABLE TIKEUT E IEUNG
+ {0xB5AE, 0xB38C}, //8932 #HANGUL SYLLABLE TIKEUT YEO
+ {0xB5AF, 0xB390}, //8933 #HANGUL SYLLABLE TIKEUT YEO NIEUN
+ {0xB5B0, 0xB394}, //8934 #HANGUL SYLLABLE TIKEUT YEO RIEUL
+ {0xB5B1, 0xB3A0}, //8935 #HANGUL SYLLABLE TIKEUT YEO SSANGSIOS
+ {0xB5B2, 0xB3A1}, //8936 #HANGUL SYLLABLE TIKEUT YEO IEUNG
+ {0xB5B3, 0xB3A8}, //8937 #HANGUL SYLLABLE TIKEUT YE
+ {0xB5B4, 0xB3AC}, //8938 #HANGUL SYLLABLE TIKEUT YE NIEUN
+ {0xB5B5, 0xB3C4}, //8939 #HANGUL SYLLABLE TIKEUT O
+ {0xB5B6, 0xB3C5}, //8940 #HANGUL SYLLABLE TIKEUT O KIYEOK
+ {0xB5B7, 0xB3C8}, //8941 #HANGUL SYLLABLE TIKEUT O NIEUN
+ {0xB5B8, 0xB3CB}, //8942 #HANGUL SYLLABLE TIKEUT O TIKEUT
+ {0xB5B9, 0xB3CC}, //8943 #HANGUL SYLLABLE TIKEUT O RIEUL
+ {0xB5BA, 0xB3CE}, //8944 #HANGUL SYLLABLE TIKEUT O RIEULMIEUM
+ {0xB5BB, 0xB3D0}, //8945 #HANGUL SYLLABLE TIKEUT O RIEULSIOS
+ {0xB5BC, 0xB3D4}, //8946 #HANGUL SYLLABLE TIKEUT O MIEUM
+ {0xB5BD, 0xB3D5}, //8947 #HANGUL SYLLABLE TIKEUT O PIEUP
+ {0xB5BE, 0xB3D7}, //8948 #HANGUL SYLLABLE TIKEUT O SIOS
+ {0xB5BF, 0xB3D9}, //8949 #HANGUL SYLLABLE TIKEUT O IEUNG
+ {0xB5C0, 0xB3DB}, //8950 #HANGUL SYLLABLE TIKEUT O CHIEUCH
+ {0xB5C1, 0xB3DD}, //8951 #HANGUL SYLLABLE TIKEUT O THIEUTH
+ {0xB5C2, 0xB3E0}, //8952 #HANGUL SYLLABLE TIKEUT WA
+ {0xB5C3, 0xB3E4}, //8953 #HANGUL SYLLABLE TIKEUT WA NIEUN
+ {0xB5C4, 0xB3E8}, //8954 #HANGUL SYLLABLE TIKEUT WA RIEUL
+ {0xB5C5, 0xB3FC}, //8955 #HANGUL SYLLABLE TIKEUT WAE
+ {0xB5C6, 0xB410}, //8956 #HANGUL SYLLABLE TIKEUT WAE SSANGSIOS
+ {0xB5C7, 0xB418}, //8957 #HANGUL SYLLABLE TIKEUT OE
+ {0xB5C8, 0xB41C}, //8958 #HANGUL SYLLABLE TIKEUT OE NIEUN
+ {0xB5C9, 0xB420}, //8959 #HANGUL SYLLABLE TIKEUT OE RIEUL
+ {0xB5CA, 0xB428}, //8960 #HANGUL SYLLABLE TIKEUT OE MIEUM
+ {0xB5CB, 0xB429}, //8961 #HANGUL SYLLABLE TIKEUT OE PIEUP
+ {0xB5CC, 0xB42B}, //8962 #HANGUL SYLLABLE TIKEUT OE SIOS
+ {0xB5CD, 0xB434}, //8963 #HANGUL SYLLABLE TIKEUT YO
+ {0xB5CE, 0xB450}, //8964 #HANGUL SYLLABLE TIKEUT U
+ {0xB5CF, 0xB451}, //8965 #HANGUL SYLLABLE TIKEUT U KIYEOK
+ {0xB5D0, 0xB454}, //8966 #HANGUL SYLLABLE TIKEUT U NIEUN
+ {0xB5D1, 0xB458}, //8967 #HANGUL SYLLABLE TIKEUT U RIEUL
+ {0xB5D2, 0xB460}, //8968 #HANGUL SYLLABLE TIKEUT U MIEUM
+ {0xB5D3, 0xB461}, //8969 #HANGUL SYLLABLE TIKEUT U PIEUP
+ {0xB5D4, 0xB463}, //8970 #HANGUL SYLLABLE TIKEUT U SIOS
+ {0xB5D5, 0xB465}, //8971 #HANGUL SYLLABLE TIKEUT U IEUNG
+ {0xB5D6, 0xB46C}, //8972 #HANGUL SYLLABLE TIKEUT WEO
+ {0xB5D7, 0xB480}, //8973 #HANGUL SYLLABLE TIKEUT WEO SSANGSIOS
+ {0xB5D8, 0xB488}, //8974 #HANGUL SYLLABLE TIKEUT WE
+ {0xB5D9, 0xB49D}, //8975 #HANGUL SYLLABLE TIKEUT WE IEUNG
+ {0xB5DA, 0xB4A4}, //8976 #HANGUL SYLLABLE TIKEUT WI
+ {0xB5DB, 0xB4A8}, //8977 #HANGUL SYLLABLE TIKEUT WI NIEUN
+ {0xB5DC, 0xB4AC}, //8978 #HANGUL SYLLABLE TIKEUT WI RIEUL
+ {0xB5DD, 0xB4B5}, //8979 #HANGUL SYLLABLE TIKEUT WI PIEUP
+ {0xB5DE, 0xB4B7}, //8980 #HANGUL SYLLABLE TIKEUT WI SIOS
+ {0xB5DF, 0xB4B9}, //8981 #HANGUL SYLLABLE TIKEUT WI IEUNG
+ {0xB5E0, 0xB4C0}, //8982 #HANGUL SYLLABLE TIKEUT YU
+ {0xB5E1, 0xB4C4}, //8983 #HANGUL SYLLABLE TIKEUT YU NIEUN
+ {0xB5E2, 0xB4C8}, //8984 #HANGUL SYLLABLE TIKEUT YU RIEUL
+ {0xB5E3, 0xB4D0}, //8985 #HANGUL SYLLABLE TIKEUT YU MIEUM
+ {0xB5E4, 0xB4D5}, //8986 #HANGUL SYLLABLE TIKEUT YU IEUNG
+ {0xB5E5, 0xB4DC}, //8987 #HANGUL SYLLABLE TIKEUT EU
+ {0xB5E6, 0xB4DD}, //8988 #HANGUL SYLLABLE TIKEUT EU KIYEOK
+ {0xB5E7, 0xB4E0}, //8989 #HANGUL SYLLABLE TIKEUT EU NIEUN
+ {0xB5E8, 0xB4E3}, //8990 #HANGUL SYLLABLE TIKEUT EU TIKEUT
+ {0xB5E9, 0xB4E4}, //8991 #HANGUL SYLLABLE TIKEUT EU RIEUL
+ {0xB5EA, 0xB4E6}, //8992 #HANGUL SYLLABLE TIKEUT EU RIEULMIEUM
+ {0xB5EB, 0xB4EC}, //8993 #HANGUL SYLLABLE TIKEUT EU MIEUM
+ {0xB5EC, 0xB4ED}, //8994 #HANGUL SYLLABLE TIKEUT EU PIEUP
+ {0xB5ED, 0xB4EF}, //8995 #HANGUL SYLLABLE TIKEUT EU SIOS
+ {0xB5EE, 0xB4F1}, //8996 #HANGUL SYLLABLE TIKEUT EU IEUNG
+ {0xB5EF, 0xB4F8}, //8997 #HANGUL SYLLABLE TIKEUT YI
+ {0xB5F0, 0xB514}, //8998 #HANGUL SYLLABLE TIKEUT I
+ {0xB5F1, 0xB515}, //8999 #HANGUL SYLLABLE TIKEUT I KIYEOK
+ {0xB5F2, 0xB518}, //9000 #HANGUL SYLLABLE TIKEUT I NIEUN
+ {0xB5F3, 0xB51B}, //9001 #HANGUL SYLLABLE TIKEUT I TIKEUT
+ {0xB5F4, 0xB51C}, //9002 #HANGUL SYLLABLE TIKEUT I RIEUL
+ {0xB5F5, 0xB524}, //9003 #HANGUL SYLLABLE TIKEUT I MIEUM
+ {0xB5F6, 0xB525}, //9004 #HANGUL SYLLABLE TIKEUT I PIEUP
+ {0xB5F7, 0xB527}, //9005 #HANGUL SYLLABLE TIKEUT I SIOS
+ {0xB5F8, 0xB528}, //9006 #HANGUL SYLLABLE TIKEUT I SSANGSIOS
+ {0xB5F9, 0xB529}, //9007 #HANGUL SYLLABLE TIKEUT I IEUNG
+ {0xB5FA, 0xB52A}, //9008 #HANGUL SYLLABLE TIKEUT I CIEUC
+ {0xB5FB, 0xB530}, //9009 #HANGUL SYLLABLE SSANGTIKEUT A
+ {0xB5FC, 0xB531}, //9010 #HANGUL SYLLABLE SSANGTIKEUT A KIYEOK
+ {0xB5FD, 0xB534}, //9011 #HANGUL SYLLABLE SSANGTIKEUT A NIEUN
+ {0xB5FE, 0xB538}, //9012 #HANGUL SYLLABLE SSANGTIKEUT A RIEUL
+ {0xB641, 0xD105}, //9013 #HANGUL SYLLABLE THIEUTH YA RIEULTHIEUTH
+ {0xB642, 0xD106}, //9014 #HANGUL SYLLABLE THIEUTH YA RIEULPHIEUPH
+ {0xB643, 0xD107}, //9015 #HANGUL SYLLABLE THIEUTH YA RIEULHIEUH
+ {0xB644, 0xD108}, //9016 #HANGUL SYLLABLE THIEUTH YA MIEUM
+ {0xB645, 0xD109}, //9017 #HANGUL SYLLABLE THIEUTH YA PIEUP
+ {0xB646, 0xD10A}, //9018 #HANGUL SYLLABLE THIEUTH YA PIEUPSIOS
+ {0xB647, 0xD10B}, //9019 #HANGUL SYLLABLE THIEUTH YA SIOS
+ {0xB648, 0xD10C}, //9020 #HANGUL SYLLABLE THIEUTH YA SSANGSIOS
+ {0xB649, 0xD10E}, //9021 #HANGUL SYLLABLE THIEUTH YA CIEUC
+ {0xB64A, 0xD10F}, //9022 #HANGUL SYLLABLE THIEUTH YA CHIEUCH
+ {0xB64B, 0xD110}, //9023 #HANGUL SYLLABLE THIEUTH YA KHIEUKH
+ {0xB64C, 0xD111}, //9024 #HANGUL SYLLABLE THIEUTH YA THIEUTH
+ {0xB64D, 0xD112}, //9025 #HANGUL SYLLABLE THIEUTH YA PHIEUPH
+ {0xB64E, 0xD113}, //9026 #HANGUL SYLLABLE THIEUTH YA HIEUH
+ {0xB64F, 0xD114}, //9027 #HANGUL SYLLABLE THIEUTH YAE
+ {0xB650, 0xD115}, //9028 #HANGUL SYLLABLE THIEUTH YAE KIYEOK
+ {0xB651, 0xD116}, //9029 #HANGUL SYLLABLE THIEUTH YAE SSANGKIYEOK
+ {0xB652, 0xD117}, //9030 #HANGUL SYLLABLE THIEUTH YAE KIYEOKSIOS
+ {0xB653, 0xD118}, //9031 #HANGUL SYLLABLE THIEUTH YAE NIEUN
+ {0xB654, 0xD119}, //9032 #HANGUL SYLLABLE THIEUTH YAE NIEUNCIEUC
+ {0xB655, 0xD11A}, //9033 #HANGUL SYLLABLE THIEUTH YAE NIEUNHIEUH
+ {0xB656, 0xD11B}, //9034 #HANGUL SYLLABLE THIEUTH YAE TIKEUT
+ {0xB657, 0xD11C}, //9035 #HANGUL SYLLABLE THIEUTH YAE RIEUL
+ {0xB658, 0xD11D}, //9036 #HANGUL SYLLABLE THIEUTH YAE RIEULKIYEOK
+ {0xB659, 0xD11E}, //9037 #HANGUL SYLLABLE THIEUTH YAE RIEULMIEUM
+ {0xB65A, 0xD11F}, //9038 #HANGUL SYLLABLE THIEUTH YAE RIEULPIEUP
+ {0xB661, 0xD120}, //9039 #HANGUL SYLLABLE THIEUTH YAE RIEULSIOS
+ {0xB662, 0xD121}, //9040 #HANGUL SYLLABLE THIEUTH YAE RIEULTHIEUTH
+ {0xB663, 0xD122}, //9041 #HANGUL SYLLABLE THIEUTH YAE RIEULPHIEUPH
+ {0xB664, 0xD123}, //9042 #HANGUL SYLLABLE THIEUTH YAE RIEULHIEUH
+ {0xB665, 0xD124}, //9043 #HANGUL SYLLABLE THIEUTH YAE MIEUM
+ {0xB666, 0xD125}, //9044 #HANGUL SYLLABLE THIEUTH YAE PIEUP
+ {0xB667, 0xD126}, //9045 #HANGUL SYLLABLE THIEUTH YAE PIEUPSIOS
+ {0xB668, 0xD127}, //9046 #HANGUL SYLLABLE THIEUTH YAE SIOS
+ {0xB669, 0xD128}, //9047 #HANGUL SYLLABLE THIEUTH YAE SSANGSIOS
+ {0xB66A, 0xD129}, //9048 #HANGUL SYLLABLE THIEUTH YAE IEUNG
+ {0xB66B, 0xD12A}, //9049 #HANGUL SYLLABLE THIEUTH YAE CIEUC
+ {0xB66C, 0xD12B}, //9050 #HANGUL SYLLABLE THIEUTH YAE CHIEUCH
+ {0xB66D, 0xD12C}, //9051 #HANGUL SYLLABLE THIEUTH YAE KHIEUKH
+ {0xB66E, 0xD12D}, //9052 #HANGUL SYLLABLE THIEUTH YAE THIEUTH
+ {0xB66F, 0xD12E}, //9053 #HANGUL SYLLABLE THIEUTH YAE PHIEUPH
+ {0xB670, 0xD12F}, //9054 #HANGUL SYLLABLE THIEUTH YAE HIEUH
+ {0xB671, 0xD132}, //9055 #HANGUL SYLLABLE THIEUTH EO SSANGKIYEOK
+ {0xB672, 0xD133}, //9056 #HANGUL SYLLABLE THIEUTH EO KIYEOKSIOS
+ {0xB673, 0xD135}, //9057 #HANGUL SYLLABLE THIEUTH EO NIEUNCIEUC
+ {0xB674, 0xD136}, //9058 #HANGUL SYLLABLE THIEUTH EO NIEUNHIEUH
+ {0xB675, 0xD137}, //9059 #HANGUL SYLLABLE THIEUTH EO TIKEUT
+ {0xB676, 0xD139}, //9060 #HANGUL SYLLABLE THIEUTH EO RIEULKIYEOK
+ {0xB677, 0xD13B}, //9061 #HANGUL SYLLABLE THIEUTH EO RIEULPIEUP
+ {0xB678, 0xD13C}, //9062 #HANGUL SYLLABLE THIEUTH EO RIEULSIOS
+ {0xB679, 0xD13D}, //9063 #HANGUL SYLLABLE THIEUTH EO RIEULTHIEUTH
+ {0xB67A, 0xD13E}, //9064 #HANGUL SYLLABLE THIEUTH EO RIEULPHIEUPH
+ {0xB681, 0xD13F}, //9065 #HANGUL SYLLABLE THIEUTH EO RIEULHIEUH
+ {0xB682, 0xD142}, //9066 #HANGUL SYLLABLE THIEUTH EO PIEUPSIOS
+ {0xB683, 0xD146}, //9067 #HANGUL SYLLABLE THIEUTH EO CIEUC
+ {0xB684, 0xD147}, //9068 #HANGUL SYLLABLE THIEUTH EO CHIEUCH
+ {0xB685, 0xD148}, //9069 #HANGUL SYLLABLE THIEUTH EO KHIEUKH
+ {0xB686, 0xD149}, //9070 #HANGUL SYLLABLE THIEUTH EO THIEUTH
+ {0xB687, 0xD14A}, //9071 #HANGUL SYLLABLE THIEUTH EO PHIEUPH
+ {0xB688, 0xD14B}, //9072 #HANGUL SYLLABLE THIEUTH EO HIEUH
+ {0xB689, 0xD14E}, //9073 #HANGUL SYLLABLE THIEUTH E SSANGKIYEOK
+ {0xB68A, 0xD14F}, //9074 #HANGUL SYLLABLE THIEUTH E KIYEOKSIOS
+ {0xB68B, 0xD151}, //9075 #HANGUL SYLLABLE THIEUTH E NIEUNCIEUC
+ {0xB68C, 0xD152}, //9076 #HANGUL SYLLABLE THIEUTH E NIEUNHIEUH
+ {0xB68D, 0xD153}, //9077 #HANGUL SYLLABLE THIEUTH E TIKEUT
+ {0xB68E, 0xD155}, //9078 #HANGUL SYLLABLE THIEUTH E RIEULKIYEOK
+ {0xB68F, 0xD156}, //9079 #HANGUL SYLLABLE THIEUTH E RIEULMIEUM
+ {0xB690, 0xD157}, //9080 #HANGUL SYLLABLE THIEUTH E RIEULPIEUP
+ {0xB691, 0xD158}, //9081 #HANGUL SYLLABLE THIEUTH E RIEULSIOS
+ {0xB692, 0xD159}, //9082 #HANGUL SYLLABLE THIEUTH E RIEULTHIEUTH
+ {0xB693, 0xD15A}, //9083 #HANGUL SYLLABLE THIEUTH E RIEULPHIEUPH
+ {0xB694, 0xD15B}, //9084 #HANGUL SYLLABLE THIEUTH E RIEULHIEUH
+ {0xB695, 0xD15E}, //9085 #HANGUL SYLLABLE THIEUTH E PIEUPSIOS
+ {0xB696, 0xD160}, //9086 #HANGUL SYLLABLE THIEUTH E SSANGSIOS
+ {0xB697, 0xD162}, //9087 #HANGUL SYLLABLE THIEUTH E CIEUC
+ {0xB698, 0xD163}, //9088 #HANGUL SYLLABLE THIEUTH E CHIEUCH
+ {0xB699, 0xD164}, //9089 #HANGUL SYLLABLE THIEUTH E KHIEUKH
+ {0xB69A, 0xD165}, //9090 #HANGUL SYLLABLE THIEUTH E THIEUTH
+ {0xB69B, 0xD166}, //9091 #HANGUL SYLLABLE THIEUTH E PHIEUPH
+ {0xB69C, 0xD167}, //9092 #HANGUL SYLLABLE THIEUTH E HIEUH
+ {0xB69D, 0xD169}, //9093 #HANGUL SYLLABLE THIEUTH YEO KIYEOK
+ {0xB69E, 0xD16A}, //9094 #HANGUL SYLLABLE THIEUTH YEO SSANGKIYEOK
+ {0xB69F, 0xD16B}, //9095 #HANGUL SYLLABLE THIEUTH YEO KIYEOKSIOS
+ {0xB6A0, 0xD16D}, //9096 #HANGUL SYLLABLE THIEUTH YEO NIEUNCIEUC
+ {0xB6A1, 0xB540}, //9097 #HANGUL SYLLABLE SSANGTIKEUT A MIEUM
+ {0xB6A2, 0xB541}, //9098 #HANGUL SYLLABLE SSANGTIKEUT A PIEUP
+ {0xB6A3, 0xB543}, //9099 #HANGUL SYLLABLE SSANGTIKEUT A SIOS
+ {0xB6A4, 0xB544}, //9100 #HANGUL SYLLABLE SSANGTIKEUT A SSANGSIOS
+ {0xB6A5, 0xB545}, //9101 #HANGUL SYLLABLE SSANGTIKEUT A IEUNG
+ {0xB6A6, 0xB54B}, //9102 #HANGUL SYLLABLE SSANGTIKEUT A HIEUH
+ {0xB6A7, 0xB54C}, //9103 #HANGUL SYLLABLE SSANGTIKEUT AE
+ {0xB6A8, 0xB54D}, //9104 #HANGUL SYLLABLE SSANGTIKEUT AE KIYEOK
+ {0xB6A9, 0xB550}, //9105 #HANGUL SYLLABLE SSANGTIKEUT AE NIEUN
+ {0xB6AA, 0xB554}, //9106 #HANGUL SYLLABLE SSANGTIKEUT AE RIEUL
+ {0xB6AB, 0xB55C}, //9107 #HANGUL SYLLABLE SSANGTIKEUT AE MIEUM
+ {0xB6AC, 0xB55D}, //9108 #HANGUL SYLLABLE SSANGTIKEUT AE PIEUP
+ {0xB6AD, 0xB55F}, //9109 #HANGUL SYLLABLE SSANGTIKEUT AE SIOS
+ {0xB6AE, 0xB560}, //9110 #HANGUL SYLLABLE SSANGTIKEUT AE SSANGSIOS
+ {0xB6AF, 0xB561}, //9111 #HANGUL SYLLABLE SSANGTIKEUT AE IEUNG
+ {0xB6B0, 0xB5A0}, //9112 #HANGUL SYLLABLE SSANGTIKEUT EO
+ {0xB6B1, 0xB5A1}, //9113 #HANGUL SYLLABLE SSANGTIKEUT EO KIYEOK
+ {0xB6B2, 0xB5A4}, //9114 #HANGUL SYLLABLE SSANGTIKEUT EO NIEUN
+ {0xB6B3, 0xB5A8}, //9115 #HANGUL SYLLABLE SSANGTIKEUT EO RIEUL
+ {0xB6B4, 0xB5AA}, //9116 #HANGUL SYLLABLE SSANGTIKEUT EO RIEULMIEUM
+ {0xB6B5, 0xB5AB}, //9117 #HANGUL SYLLABLE SSANGTIKEUT EO RIEULPIEUP
+ {0xB6B6, 0xB5B0}, //9118 #HANGUL SYLLABLE SSANGTIKEUT EO MIEUM
+ {0xB6B7, 0xB5B1}, //9119 #HANGUL SYLLABLE SSANGTIKEUT EO PIEUP
+ {0xB6B8, 0xB5B3}, //9120 #HANGUL SYLLABLE SSANGTIKEUT EO SIOS
+ {0xB6B9, 0xB5B4}, //9121 #HANGUL SYLLABLE SSANGTIKEUT EO SSANGSIOS
+ {0xB6BA, 0xB5B5}, //9122 #HANGUL SYLLABLE SSANGTIKEUT EO IEUNG
+ {0xB6BB, 0xB5BB}, //9123 #HANGUL SYLLABLE SSANGTIKEUT EO HIEUH
+ {0xB6BC, 0xB5BC}, //9124 #HANGUL SYLLABLE SSANGTIKEUT E
+ {0xB6BD, 0xB5BD}, //9125 #HANGUL SYLLABLE SSANGTIKEUT E KIYEOK
+ {0xB6BE, 0xB5C0}, //9126 #HANGUL SYLLABLE SSANGTIKEUT E NIEUN
+ {0xB6BF, 0xB5C4}, //9127 #HANGUL SYLLABLE SSANGTIKEUT E RIEUL
+ {0xB6C0, 0xB5CC}, //9128 #HANGUL SYLLABLE SSANGTIKEUT E MIEUM
+ {0xB6C1, 0xB5CD}, //9129 #HANGUL SYLLABLE SSANGTIKEUT E PIEUP
+ {0xB6C2, 0xB5CF}, //9130 #HANGUL SYLLABLE SSANGTIKEUT E SIOS
+ {0xB6C3, 0xB5D0}, //9131 #HANGUL SYLLABLE SSANGTIKEUT E SSANGSIOS
+ {0xB6C4, 0xB5D1}, //9132 #HANGUL SYLLABLE SSANGTIKEUT E IEUNG
+ {0xB6C5, 0xB5D8}, //9133 #HANGUL SYLLABLE SSANGTIKEUT YEO
+ {0xB6C6, 0xB5EC}, //9134 #HANGUL SYLLABLE SSANGTIKEUT YEO SSANGSIOS
+ {0xB6C7, 0xB610}, //9135 #HANGUL SYLLABLE SSANGTIKEUT O
+ {0xB6C8, 0xB611}, //9136 #HANGUL SYLLABLE SSANGTIKEUT O KIYEOK
+ {0xB6C9, 0xB614}, //9137 #HANGUL SYLLABLE SSANGTIKEUT O NIEUN
+ {0xB6CA, 0xB618}, //9138 #HANGUL SYLLABLE SSANGTIKEUT O RIEUL
+ {0xB6CB, 0xB625}, //9139 #HANGUL SYLLABLE SSANGTIKEUT O IEUNG
+ {0xB6CC, 0xB62C}, //9140 #HANGUL SYLLABLE SSANGTIKEUT WA
+ {0xB6CD, 0xB634}, //9141 #HANGUL SYLLABLE SSANGTIKEUT WA RIEUL
+ {0xB6CE, 0xB648}, //9142 #HANGUL SYLLABLE SSANGTIKEUT WAE
+ {0xB6CF, 0xB664}, //9143 #HANGUL SYLLABLE SSANGTIKEUT OE
+ {0xB6D0, 0xB668}, //9144 #HANGUL SYLLABLE SSANGTIKEUT OE NIEUN
+ {0xB6D1, 0xB69C}, //9145 #HANGUL SYLLABLE SSANGTIKEUT U
+ {0xB6D2, 0xB69D}, //9146 #HANGUL SYLLABLE SSANGTIKEUT U KIYEOK
+ {0xB6D3, 0xB6A0}, //9147 #HANGUL SYLLABLE SSANGTIKEUT U NIEUN
+ {0xB6D4, 0xB6A4}, //9148 #HANGUL SYLLABLE SSANGTIKEUT U RIEUL
+ {0xB6D5, 0xB6AB}, //9149 #HANGUL SYLLABLE SSANGTIKEUT U RIEULHIEUH
+ {0xB6D6, 0xB6AC}, //9150 #HANGUL SYLLABLE SSANGTIKEUT U MIEUM
+ {0xB6D7, 0xB6B1}, //9151 #HANGUL SYLLABLE SSANGTIKEUT U IEUNG
+ {0xB6D8, 0xB6D4}, //9152 #HANGUL SYLLABLE SSANGTIKEUT WE
+ {0xB6D9, 0xB6F0}, //9153 #HANGUL SYLLABLE SSANGTIKEUT WI
+ {0xB6DA, 0xB6F4}, //9154 #HANGUL SYLLABLE SSANGTIKEUT WI NIEUN
+ {0xB6DB, 0xB6F8}, //9155 #HANGUL SYLLABLE SSANGTIKEUT WI RIEUL
+ {0xB6DC, 0xB700}, //9156 #HANGUL SYLLABLE SSANGTIKEUT WI MIEUM
+ {0xB6DD, 0xB701}, //9157 #HANGUL SYLLABLE SSANGTIKEUT WI PIEUP
+ {0xB6DE, 0xB705}, //9158 #HANGUL SYLLABLE SSANGTIKEUT WI IEUNG
+ {0xB6DF, 0xB728}, //9159 #HANGUL SYLLABLE SSANGTIKEUT EU
+ {0xB6E0, 0xB729}, //9160 #HANGUL SYLLABLE SSANGTIKEUT EU KIYEOK
+ {0xB6E1, 0xB72C}, //9161 #HANGUL SYLLABLE SSANGTIKEUT EU NIEUN
+ {0xB6E2, 0xB72F}, //9162 #HANGUL SYLLABLE SSANGTIKEUT EU TIKEUT
+ {0xB6E3, 0xB730}, //9163 #HANGUL SYLLABLE SSANGTIKEUT EU RIEUL
+ {0xB6E4, 0xB738}, //9164 #HANGUL SYLLABLE SSANGTIKEUT EU MIEUM
+ {0xB6E5, 0xB739}, //9165 #HANGUL SYLLABLE SSANGTIKEUT EU PIEUP
+ {0xB6E6, 0xB73B}, //9166 #HANGUL SYLLABLE SSANGTIKEUT EU SIOS
+ {0xB6E7, 0xB744}, //9167 #HANGUL SYLLABLE SSANGTIKEUT YI
+ {0xB6E8, 0xB748}, //9168 #HANGUL SYLLABLE SSANGTIKEUT YI NIEUN
+ {0xB6E9, 0xB74C}, //9169 #HANGUL SYLLABLE SSANGTIKEUT YI RIEUL
+ {0xB6EA, 0xB754}, //9170 #HANGUL SYLLABLE SSANGTIKEUT YI MIEUM
+ {0xB6EB, 0xB755}, //9171 #HANGUL SYLLABLE SSANGTIKEUT YI PIEUP
+ {0xB6EC, 0xB760}, //9172 #HANGUL SYLLABLE SSANGTIKEUT I
+ {0xB6ED, 0xB764}, //9173 #HANGUL SYLLABLE SSANGTIKEUT I NIEUN
+ {0xB6EE, 0xB768}, //9174 #HANGUL SYLLABLE SSANGTIKEUT I RIEUL
+ {0xB6EF, 0xB770}, //9175 #HANGUL SYLLABLE SSANGTIKEUT I MIEUM
+ {0xB6F0, 0xB771}, //9176 #HANGUL SYLLABLE SSANGTIKEUT I PIEUP
+ {0xB6F1, 0xB773}, //9177 #HANGUL SYLLABLE SSANGTIKEUT I SIOS
+ {0xB6F2, 0xB775}, //9178 #HANGUL SYLLABLE SSANGTIKEUT I IEUNG
+ {0xB6F3, 0xB77C}, //9179 #HANGUL SYLLABLE RIEUL A
+ {0xB6F4, 0xB77D}, //9180 #HANGUL SYLLABLE RIEUL A KIYEOK
+ {0xB6F5, 0xB780}, //9181 #HANGUL SYLLABLE RIEUL A NIEUN
+ {0xB6F6, 0xB784}, //9182 #HANGUL SYLLABLE RIEUL A RIEUL
+ {0xB6F7, 0xB78C}, //9183 #HANGUL SYLLABLE RIEUL A MIEUM
+ {0xB6F8, 0xB78D}, //9184 #HANGUL SYLLABLE RIEUL A PIEUP
+ {0xB6F9, 0xB78F}, //9185 #HANGUL SYLLABLE RIEUL A SIOS
+ {0xB6FA, 0xB790}, //9186 #HANGUL SYLLABLE RIEUL A SSANGSIOS
+ {0xB6FB, 0xB791}, //9187 #HANGUL SYLLABLE RIEUL A IEUNG
+ {0xB6FC, 0xB792}, //9188 #HANGUL SYLLABLE RIEUL A CIEUC
+ {0xB6FD, 0xB796}, //9189 #HANGUL SYLLABLE RIEUL A PHIEUPH
+ {0xB6FE, 0xB797}, //9190 #HANGUL SYLLABLE RIEUL A HIEUH
+ {0xB741, 0xD16E}, //9191 #HANGUL SYLLABLE THIEUTH YEO NIEUNHIEUH
+ {0xB742, 0xD16F}, //9192 #HANGUL SYLLABLE THIEUTH YEO TIKEUT
+ {0xB743, 0xD170}, //9193 #HANGUL SYLLABLE THIEUTH YEO RIEUL
+ {0xB744, 0xD171}, //9194 #HANGUL SYLLABLE THIEUTH YEO RIEULKIYEOK
+ {0xB745, 0xD172}, //9195 #HANGUL SYLLABLE THIEUTH YEO RIEULMIEUM
+ {0xB746, 0xD173}, //9196 #HANGUL SYLLABLE THIEUTH YEO RIEULPIEUP
+ {0xB747, 0xD174}, //9197 #HANGUL SYLLABLE THIEUTH YEO RIEULSIOS
+ {0xB748, 0xD175}, //9198 #HANGUL SYLLABLE THIEUTH YEO RIEULTHIEUTH
+ {0xB749, 0xD176}, //9199 #HANGUL SYLLABLE THIEUTH YEO RIEULPHIEUPH
+ {0xB74A, 0xD177}, //9200 #HANGUL SYLLABLE THIEUTH YEO RIEULHIEUH
+ {0xB74B, 0xD178}, //9201 #HANGUL SYLLABLE THIEUTH YEO MIEUM
+ {0xB74C, 0xD179}, //9202 #HANGUL SYLLABLE THIEUTH YEO PIEUP
+ {0xB74D, 0xD17A}, //9203 #HANGUL SYLLABLE THIEUTH YEO PIEUPSIOS
+ {0xB74E, 0xD17B}, //9204 #HANGUL SYLLABLE THIEUTH YEO SIOS
+ {0xB74F, 0xD17D}, //9205 #HANGUL SYLLABLE THIEUTH YEO IEUNG
+ {0xB750, 0xD17E}, //9206 #HANGUL SYLLABLE THIEUTH YEO CIEUC
+ {0xB751, 0xD17F}, //9207 #HANGUL SYLLABLE THIEUTH YEO CHIEUCH
+ {0xB752, 0xD180}, //9208 #HANGUL SYLLABLE THIEUTH YEO KHIEUKH
+ {0xB753, 0xD181}, //9209 #HANGUL SYLLABLE THIEUTH YEO THIEUTH
+ {0xB754, 0xD182}, //9210 #HANGUL SYLLABLE THIEUTH YEO PHIEUPH
+ {0xB755, 0xD183}, //9211 #HANGUL SYLLABLE THIEUTH YEO HIEUH
+ {0xB756, 0xD185}, //9212 #HANGUL SYLLABLE THIEUTH YE KIYEOK
+ {0xB757, 0xD186}, //9213 #HANGUL SYLLABLE THIEUTH YE SSANGKIYEOK
+ {0xB758, 0xD187}, //9214 #HANGUL SYLLABLE THIEUTH YE KIYEOKSIOS
+ {0xB759, 0xD189}, //9215 #HANGUL SYLLABLE THIEUTH YE NIEUNCIEUC
+ {0xB75A, 0xD18A}, //9216 #HANGUL SYLLABLE THIEUTH YE NIEUNHIEUH
+ {0xB761, 0xD18B}, //9217 #HANGUL SYLLABLE THIEUTH YE TIKEUT
+ {0xB762, 0xD18C}, //9218 #HANGUL SYLLABLE THIEUTH YE RIEUL
+ {0xB763, 0xD18D}, //9219 #HANGUL SYLLABLE THIEUTH YE RIEULKIYEOK
+ {0xB764, 0xD18E}, //9220 #HANGUL SYLLABLE THIEUTH YE RIEULMIEUM
+ {0xB765, 0xD18F}, //9221 #HANGUL SYLLABLE THIEUTH YE RIEULPIEUP
+ {0xB766, 0xD190}, //9222 #HANGUL SYLLABLE THIEUTH YE RIEULSIOS
+ {0xB767, 0xD191}, //9223 #HANGUL SYLLABLE THIEUTH YE RIEULTHIEUTH
+ {0xB768, 0xD192}, //9224 #HANGUL SYLLABLE THIEUTH YE RIEULPHIEUPH
+ {0xB769, 0xD193}, //9225 #HANGUL SYLLABLE THIEUTH YE RIEULHIEUH
+ {0xB76A, 0xD194}, //9226 #HANGUL SYLLABLE THIEUTH YE MIEUM
+ {0xB76B, 0xD195}, //9227 #HANGUL SYLLABLE THIEUTH YE PIEUP
+ {0xB76C, 0xD196}, //9228 #HANGUL SYLLABLE THIEUTH YE PIEUPSIOS
+ {0xB76D, 0xD197}, //9229 #HANGUL SYLLABLE THIEUTH YE SIOS
+ {0xB76E, 0xD198}, //9230 #HANGUL SYLLABLE THIEUTH YE SSANGSIOS
+ {0xB76F, 0xD199}, //9231 #HANGUL SYLLABLE THIEUTH YE IEUNG
+ {0xB770, 0xD19A}, //9232 #HANGUL SYLLABLE THIEUTH YE CIEUC
+ {0xB771, 0xD19B}, //9233 #HANGUL SYLLABLE THIEUTH YE CHIEUCH
+ {0xB772, 0xD19C}, //9234 #HANGUL SYLLABLE THIEUTH YE KHIEUKH
+ {0xB773, 0xD19D}, //9235 #HANGUL SYLLABLE THIEUTH YE THIEUTH
+ {0xB774, 0xD19E}, //9236 #HANGUL SYLLABLE THIEUTH YE PHIEUPH
+ {0xB775, 0xD19F}, //9237 #HANGUL SYLLABLE THIEUTH YE HIEUH
+ {0xB776, 0xD1A2}, //9238 #HANGUL SYLLABLE THIEUTH O SSANGKIYEOK
+ {0xB777, 0xD1A3}, //9239 #HANGUL SYLLABLE THIEUTH O KIYEOKSIOS
+ {0xB778, 0xD1A5}, //9240 #HANGUL SYLLABLE THIEUTH O NIEUNCIEUC
+ {0xB779, 0xD1A6}, //9241 #HANGUL SYLLABLE THIEUTH O NIEUNHIEUH
+ {0xB77A, 0xD1A7}, //9242 #HANGUL SYLLABLE THIEUTH O TIKEUT
+ {0xB781, 0xD1A9}, //9243 #HANGUL SYLLABLE THIEUTH O RIEULKIYEOK
+ {0xB782, 0xD1AA}, //9244 #HANGUL SYLLABLE THIEUTH O RIEULMIEUM
+ {0xB783, 0xD1AB}, //9245 #HANGUL SYLLABLE THIEUTH O RIEULPIEUP
+ {0xB784, 0xD1AC}, //9246 #HANGUL SYLLABLE THIEUTH O RIEULSIOS
+ {0xB785, 0xD1AD}, //9247 #HANGUL SYLLABLE THIEUTH O RIEULTHIEUTH
+ {0xB786, 0xD1AE}, //9248 #HANGUL SYLLABLE THIEUTH O RIEULPHIEUPH
+ {0xB787, 0xD1AF}, //9249 #HANGUL SYLLABLE THIEUTH O RIEULHIEUH
+ {0xB788, 0xD1B2}, //9250 #HANGUL SYLLABLE THIEUTH O PIEUPSIOS
+ {0xB789, 0xD1B4}, //9251 #HANGUL SYLLABLE THIEUTH O SSANGSIOS
+ {0xB78A, 0xD1B6}, //9252 #HANGUL SYLLABLE THIEUTH O CIEUC
+ {0xB78B, 0xD1B7}, //9253 #HANGUL SYLLABLE THIEUTH O CHIEUCH
+ {0xB78C, 0xD1B8}, //9254 #HANGUL SYLLABLE THIEUTH O KHIEUKH
+ {0xB78D, 0xD1B9}, //9255 #HANGUL SYLLABLE THIEUTH O THIEUTH
+ {0xB78E, 0xD1BB}, //9256 #HANGUL SYLLABLE THIEUTH O HIEUH
+ {0xB78F, 0xD1BD}, //9257 #HANGUL SYLLABLE THIEUTH WA KIYEOK
+ {0xB790, 0xD1BE}, //9258 #HANGUL SYLLABLE THIEUTH WA SSANGKIYEOK
+ {0xB791, 0xD1BF}, //9259 #HANGUL SYLLABLE THIEUTH WA KIYEOKSIOS
+ {0xB792, 0xD1C1}, //9260 #HANGUL SYLLABLE THIEUTH WA NIEUNCIEUC
+ {0xB793, 0xD1C2}, //9261 #HANGUL SYLLABLE THIEUTH WA NIEUNHIEUH
+ {0xB794, 0xD1C3}, //9262 #HANGUL SYLLABLE THIEUTH WA TIKEUT
+ {0xB795, 0xD1C4}, //9263 #HANGUL SYLLABLE THIEUTH WA RIEUL
+ {0xB796, 0xD1C5}, //9264 #HANGUL SYLLABLE THIEUTH WA RIEULKIYEOK
+ {0xB797, 0xD1C6}, //9265 #HANGUL SYLLABLE THIEUTH WA RIEULMIEUM
+ {0xB798, 0xD1C7}, //9266 #HANGUL SYLLABLE THIEUTH WA RIEULPIEUP
+ {0xB799, 0xD1C8}, //9267 #HANGUL SYLLABLE THIEUTH WA RIEULSIOS
+ {0xB79A, 0xD1C9}, //9268 #HANGUL SYLLABLE THIEUTH WA RIEULTHIEUTH
+ {0xB79B, 0xD1CA}, //9269 #HANGUL SYLLABLE THIEUTH WA RIEULPHIEUPH
+ {0xB79C, 0xD1CB}, //9270 #HANGUL SYLLABLE THIEUTH WA RIEULHIEUH
+ {0xB79D, 0xD1CC}, //9271 #HANGUL SYLLABLE THIEUTH WA MIEUM
+ {0xB79E, 0xD1CD}, //9272 #HANGUL SYLLABLE THIEUTH WA PIEUP
+ {0xB79F, 0xD1CE}, //9273 #HANGUL SYLLABLE THIEUTH WA PIEUPSIOS
+ {0xB7A0, 0xD1CF}, //9274 #HANGUL SYLLABLE THIEUTH WA SIOS
+ {0xB7A1, 0xB798}, //9275 #HANGUL SYLLABLE RIEUL AE
+ {0xB7A2, 0xB799}, //9276 #HANGUL SYLLABLE RIEUL AE KIYEOK
+ {0xB7A3, 0xB79C}, //9277 #HANGUL SYLLABLE RIEUL AE NIEUN
+ {0xB7A4, 0xB7A0}, //9278 #HANGUL SYLLABLE RIEUL AE RIEUL
+ {0xB7A5, 0xB7A8}, //9279 #HANGUL SYLLABLE RIEUL AE MIEUM
+ {0xB7A6, 0xB7A9}, //9280 #HANGUL SYLLABLE RIEUL AE PIEUP
+ {0xB7A7, 0xB7AB}, //9281 #HANGUL SYLLABLE RIEUL AE SIOS
+ {0xB7A8, 0xB7AC}, //9282 #HANGUL SYLLABLE RIEUL AE SSANGSIOS
+ {0xB7A9, 0xB7AD}, //9283 #HANGUL SYLLABLE RIEUL AE IEUNG
+ {0xB7AA, 0xB7B4}, //9284 #HANGUL SYLLABLE RIEUL YA
+ {0xB7AB, 0xB7B5}, //9285 #HANGUL SYLLABLE RIEUL YA KIYEOK
+ {0xB7AC, 0xB7B8}, //9286 #HANGUL SYLLABLE RIEUL YA NIEUN
+ {0xB7AD, 0xB7C7}, //9287 #HANGUL SYLLABLE RIEUL YA SIOS
+ {0xB7AE, 0xB7C9}, //9288 #HANGUL SYLLABLE RIEUL YA IEUNG
+ {0xB7AF, 0xB7EC}, //9289 #HANGUL SYLLABLE RIEUL EO
+ {0xB7B0, 0xB7ED}, //9290 #HANGUL SYLLABLE RIEUL EO KIYEOK
+ {0xB7B1, 0xB7F0}, //9291 #HANGUL SYLLABLE RIEUL EO NIEUN
+ {0xB7B2, 0xB7F4}, //9292 #HANGUL SYLLABLE RIEUL EO RIEUL
+ {0xB7B3, 0xB7FC}, //9293 #HANGUL SYLLABLE RIEUL EO MIEUM
+ {0xB7B4, 0xB7FD}, //9294 #HANGUL SYLLABLE RIEUL EO PIEUP
+ {0xB7B5, 0xB7FF}, //9295 #HANGUL SYLLABLE RIEUL EO SIOS
+ {0xB7B6, 0xB800}, //9296 #HANGUL SYLLABLE RIEUL EO SSANGSIOS
+ {0xB7B7, 0xB801}, //9297 #HANGUL SYLLABLE RIEUL EO IEUNG
+ {0xB7B8, 0xB807}, //9298 #HANGUL SYLLABLE RIEUL EO HIEUH
+ {0xB7B9, 0xB808}, //9299 #HANGUL SYLLABLE RIEUL E
+ {0xB7BA, 0xB809}, //9300 #HANGUL SYLLABLE RIEUL E KIYEOK
+ {0xB7BB, 0xB80C}, //9301 #HANGUL SYLLABLE RIEUL E NIEUN
+ {0xB7BC, 0xB810}, //9302 #HANGUL SYLLABLE RIEUL E RIEUL
+ {0xB7BD, 0xB818}, //9303 #HANGUL SYLLABLE RIEUL E MIEUM
+ {0xB7BE, 0xB819}, //9304 #HANGUL SYLLABLE RIEUL E PIEUP
+ {0xB7BF, 0xB81B}, //9305 #HANGUL SYLLABLE RIEUL E SIOS
+ {0xB7C0, 0xB81D}, //9306 #HANGUL SYLLABLE RIEUL E IEUNG
+ {0xB7C1, 0xB824}, //9307 #HANGUL SYLLABLE RIEUL YEO
+ {0xB7C2, 0xB825}, //9308 #HANGUL SYLLABLE RIEUL YEO KIYEOK
+ {0xB7C3, 0xB828}, //9309 #HANGUL SYLLABLE RIEUL YEO NIEUN
+ {0xB7C4, 0xB82C}, //9310 #HANGUL SYLLABLE RIEUL YEO RIEUL
+ {0xB7C5, 0xB834}, //9311 #HANGUL SYLLABLE RIEUL YEO MIEUM
+ {0xB7C6, 0xB835}, //9312 #HANGUL SYLLABLE RIEUL YEO PIEUP
+ {0xB7C7, 0xB837}, //9313 #HANGUL SYLLABLE RIEUL YEO SIOS
+ {0xB7C8, 0xB838}, //9314 #HANGUL SYLLABLE RIEUL YEO SSANGSIOS
+ {0xB7C9, 0xB839}, //9315 #HANGUL SYLLABLE RIEUL YEO IEUNG
+ {0xB7CA, 0xB840}, //9316 #HANGUL SYLLABLE RIEUL YE
+ {0xB7CB, 0xB844}, //9317 #HANGUL SYLLABLE RIEUL YE NIEUN
+ {0xB7CC, 0xB851}, //9318 #HANGUL SYLLABLE RIEUL YE PIEUP
+ {0xB7CD, 0xB853}, //9319 #HANGUL SYLLABLE RIEUL YE SIOS
+ {0xB7CE, 0xB85C}, //9320 #HANGUL SYLLABLE RIEUL O
+ {0xB7CF, 0xB85D}, //9321 #HANGUL SYLLABLE RIEUL O KIYEOK
+ {0xB7D0, 0xB860}, //9322 #HANGUL SYLLABLE RIEUL O NIEUN
+ {0xB7D1, 0xB864}, //9323 #HANGUL SYLLABLE RIEUL O RIEUL
+ {0xB7D2, 0xB86C}, //9324 #HANGUL SYLLABLE RIEUL O MIEUM
+ {0xB7D3, 0xB86D}, //9325 #HANGUL SYLLABLE RIEUL O PIEUP
+ {0xB7D4, 0xB86F}, //9326 #HANGUL SYLLABLE RIEUL O SIOS
+ {0xB7D5, 0xB871}, //9327 #HANGUL SYLLABLE RIEUL O IEUNG
+ {0xB7D6, 0xB878}, //9328 #HANGUL SYLLABLE RIEUL WA
+ {0xB7D7, 0xB87C}, //9329 #HANGUL SYLLABLE RIEUL WA NIEUN
+ {0xB7D8, 0xB88D}, //9330 #HANGUL SYLLABLE RIEUL WA IEUNG
+ {0xB7D9, 0xB8A8}, //9331 #HANGUL SYLLABLE RIEUL WAE SSANGSIOS
+ {0xB7DA, 0xB8B0}, //9332 #HANGUL SYLLABLE RIEUL OE
+ {0xB7DB, 0xB8B4}, //9333 #HANGUL SYLLABLE RIEUL OE NIEUN
+ {0xB7DC, 0xB8B8}, //9334 #HANGUL SYLLABLE RIEUL OE RIEUL
+ {0xB7DD, 0xB8C0}, //9335 #HANGUL SYLLABLE RIEUL OE MIEUM
+ {0xB7DE, 0xB8C1}, //9336 #HANGUL SYLLABLE RIEUL OE PIEUP
+ {0xB7DF, 0xB8C3}, //9337 #HANGUL SYLLABLE RIEUL OE SIOS
+ {0xB7E0, 0xB8C5}, //9338 #HANGUL SYLLABLE RIEUL OE IEUNG
+ {0xB7E1, 0xB8CC}, //9339 #HANGUL SYLLABLE RIEUL YO
+ {0xB7E2, 0xB8D0}, //9340 #HANGUL SYLLABLE RIEUL YO NIEUN
+ {0xB7E3, 0xB8D4}, //9341 #HANGUL SYLLABLE RIEUL YO RIEUL
+ {0xB7E4, 0xB8DD}, //9342 #HANGUL SYLLABLE RIEUL YO PIEUP
+ {0xB7E5, 0xB8DF}, //9343 #HANGUL SYLLABLE RIEUL YO SIOS
+ {0xB7E6, 0xB8E1}, //9344 #HANGUL SYLLABLE RIEUL YO IEUNG
+ {0xB7E7, 0xB8E8}, //9345 #HANGUL SYLLABLE RIEUL U
+ {0xB7E8, 0xB8E9}, //9346 #HANGUL SYLLABLE RIEUL U KIYEOK
+ {0xB7E9, 0xB8EC}, //9347 #HANGUL SYLLABLE RIEUL U NIEUN
+ {0xB7EA, 0xB8F0}, //9348 #HANGUL SYLLABLE RIEUL U RIEUL
+ {0xB7EB, 0xB8F8}, //9349 #HANGUL SYLLABLE RIEUL U MIEUM
+ {0xB7EC, 0xB8F9}, //9350 #HANGUL SYLLABLE RIEUL U PIEUP
+ {0xB7ED, 0xB8FB}, //9351 #HANGUL SYLLABLE RIEUL U SIOS
+ {0xB7EE, 0xB8FD}, //9352 #HANGUL SYLLABLE RIEUL U IEUNG
+ {0xB7EF, 0xB904}, //9353 #HANGUL SYLLABLE RIEUL WEO
+ {0xB7F0, 0xB918}, //9354 #HANGUL SYLLABLE RIEUL WEO SSANGSIOS
+ {0xB7F1, 0xB920}, //9355 #HANGUL SYLLABLE RIEUL WE
+ {0xB7F2, 0xB93C}, //9356 #HANGUL SYLLABLE RIEUL WI
+ {0xB7F3, 0xB93D}, //9357 #HANGUL SYLLABLE RIEUL WI KIYEOK
+ {0xB7F4, 0xB940}, //9358 #HANGUL SYLLABLE RIEUL WI NIEUN
+ {0xB7F5, 0xB944}, //9359 #HANGUL SYLLABLE RIEUL WI RIEUL
+ {0xB7F6, 0xB94C}, //9360 #HANGUL SYLLABLE RIEUL WI MIEUM
+ {0xB7F7, 0xB94F}, //9361 #HANGUL SYLLABLE RIEUL WI SIOS
+ {0xB7F8, 0xB951}, //9362 #HANGUL SYLLABLE RIEUL WI IEUNG
+ {0xB7F9, 0xB958}, //9363 #HANGUL SYLLABLE RIEUL YU
+ {0xB7FA, 0xB959}, //9364 #HANGUL SYLLABLE RIEUL YU KIYEOK
+ {0xB7FB, 0xB95C}, //9365 #HANGUL SYLLABLE RIEUL YU NIEUN
+ {0xB7FC, 0xB960}, //9366 #HANGUL SYLLABLE RIEUL YU RIEUL
+ {0xB7FD, 0xB968}, //9367 #HANGUL SYLLABLE RIEUL YU MIEUM
+ {0xB7FE, 0xB969}, //9368 #HANGUL SYLLABLE RIEUL YU PIEUP
+ {0xB841, 0xD1D0}, //9369 #HANGUL SYLLABLE THIEUTH WA SSANGSIOS
+ {0xB842, 0xD1D1}, //9370 #HANGUL SYLLABLE THIEUTH WA IEUNG
+ {0xB843, 0xD1D2}, //9371 #HANGUL SYLLABLE THIEUTH WA CIEUC
+ {0xB844, 0xD1D3}, //9372 #HANGUL SYLLABLE THIEUTH WA CHIEUCH
+ {0xB845, 0xD1D4}, //9373 #HANGUL SYLLABLE THIEUTH WA KHIEUKH
+ {0xB846, 0xD1D5}, //9374 #HANGUL SYLLABLE THIEUTH WA THIEUTH
+ {0xB847, 0xD1D6}, //9375 #HANGUL SYLLABLE THIEUTH WA PHIEUPH
+ {0xB848, 0xD1D7}, //9376 #HANGUL SYLLABLE THIEUTH WA HIEUH
+ {0xB849, 0xD1D9}, //9377 #HANGUL SYLLABLE THIEUTH WAE KIYEOK
+ {0xB84A, 0xD1DA}, //9378 #HANGUL SYLLABLE THIEUTH WAE SSANGKIYEOK
+ {0xB84B, 0xD1DB}, //9379 #HANGUL SYLLABLE THIEUTH WAE KIYEOKSIOS
+ {0xB84C, 0xD1DC}, //9380 #HANGUL SYLLABLE THIEUTH WAE NIEUN
+ {0xB84D, 0xD1DD}, //9381 #HANGUL SYLLABLE THIEUTH WAE NIEUNCIEUC
+ {0xB84E, 0xD1DE}, //9382 #HANGUL SYLLABLE THIEUTH WAE NIEUNHIEUH
+ {0xB84F, 0xD1DF}, //9383 #HANGUL SYLLABLE THIEUTH WAE TIKEUT
+ {0xB850, 0xD1E0}, //9384 #HANGUL SYLLABLE THIEUTH WAE RIEUL
+ {0xB851, 0xD1E1}, //9385 #HANGUL SYLLABLE THIEUTH WAE RIEULKIYEOK
+ {0xB852, 0xD1E2}, //9386 #HANGUL SYLLABLE THIEUTH WAE RIEULMIEUM
+ {0xB853, 0xD1E3}, //9387 #HANGUL SYLLABLE THIEUTH WAE RIEULPIEUP
+ {0xB854, 0xD1E4}, //9388 #HANGUL SYLLABLE THIEUTH WAE RIEULSIOS
+ {0xB855, 0xD1E5}, //9389 #HANGUL SYLLABLE THIEUTH WAE RIEULTHIEUTH
+ {0xB856, 0xD1E6}, //9390 #HANGUL SYLLABLE THIEUTH WAE RIEULPHIEUPH
+ {0xB857, 0xD1E7}, //9391 #HANGUL SYLLABLE THIEUTH WAE RIEULHIEUH
+ {0xB858, 0xD1E8}, //9392 #HANGUL SYLLABLE THIEUTH WAE MIEUM
+ {0xB859, 0xD1E9}, //9393 #HANGUL SYLLABLE THIEUTH WAE PIEUP
+ {0xB85A, 0xD1EA}, //9394 #HANGUL SYLLABLE THIEUTH WAE PIEUPSIOS
+ {0xB861, 0xD1EB}, //9395 #HANGUL SYLLABLE THIEUTH WAE SIOS
+ {0xB862, 0xD1EC}, //9396 #HANGUL SYLLABLE THIEUTH WAE SSANGSIOS
+ {0xB863, 0xD1ED}, //9397 #HANGUL SYLLABLE THIEUTH WAE IEUNG
+ {0xB864, 0xD1EE}, //9398 #HANGUL SYLLABLE THIEUTH WAE CIEUC
+ {0xB865, 0xD1EF}, //9399 #HANGUL SYLLABLE THIEUTH WAE CHIEUCH
+ {0xB866, 0xD1F0}, //9400 #HANGUL SYLLABLE THIEUTH WAE KHIEUKH
+ {0xB867, 0xD1F1}, //9401 #HANGUL SYLLABLE THIEUTH WAE THIEUTH
+ {0xB868, 0xD1F2}, //9402 #HANGUL SYLLABLE THIEUTH WAE PHIEUPH
+ {0xB869, 0xD1F3}, //9403 #HANGUL SYLLABLE THIEUTH WAE HIEUH
+ {0xB86A, 0xD1F5}, //9404 #HANGUL SYLLABLE THIEUTH OE KIYEOK
+ {0xB86B, 0xD1F6}, //9405 #HANGUL SYLLABLE THIEUTH OE SSANGKIYEOK
+ {0xB86C, 0xD1F7}, //9406 #HANGUL SYLLABLE THIEUTH OE KIYEOKSIOS
+ {0xB86D, 0xD1F9}, //9407 #HANGUL SYLLABLE THIEUTH OE NIEUNCIEUC
+ {0xB86E, 0xD1FA}, //9408 #HANGUL SYLLABLE THIEUTH OE NIEUNHIEUH
+ {0xB86F, 0xD1FB}, //9409 #HANGUL SYLLABLE THIEUTH OE TIKEUT
+ {0xB870, 0xD1FC}, //9410 #HANGUL SYLLABLE THIEUTH OE RIEUL
+ {0xB871, 0xD1FD}, //9411 #HANGUL SYLLABLE THIEUTH OE RIEULKIYEOK
+ {0xB872, 0xD1FE}, //9412 #HANGUL SYLLABLE THIEUTH OE RIEULMIEUM
+ {0xB873, 0xD1FF}, //9413 #HANGUL SYLLABLE THIEUTH OE RIEULPIEUP
+ {0xB874, 0xD200}, //9414 #HANGUL SYLLABLE THIEUTH OE RIEULSIOS
+ {0xB875, 0xD201}, //9415 #HANGUL SYLLABLE THIEUTH OE RIEULTHIEUTH
+ {0xB876, 0xD202}, //9416 #HANGUL SYLLABLE THIEUTH OE RIEULPHIEUPH
+ {0xB877, 0xD203}, //9417 #HANGUL SYLLABLE THIEUTH OE RIEULHIEUH
+ {0xB878, 0xD204}, //9418 #HANGUL SYLLABLE THIEUTH OE MIEUM
+ {0xB879, 0xD205}, //9419 #HANGUL SYLLABLE THIEUTH OE PIEUP
+ {0xB87A, 0xD206}, //9420 #HANGUL SYLLABLE THIEUTH OE PIEUPSIOS
+ {0xB881, 0xD208}, //9421 #HANGUL SYLLABLE THIEUTH OE SSANGSIOS
+ {0xB882, 0xD20A}, //9422 #HANGUL SYLLABLE THIEUTH OE CIEUC
+ {0xB883, 0xD20B}, //9423 #HANGUL SYLLABLE THIEUTH OE CHIEUCH
+ {0xB884, 0xD20C}, //9424 #HANGUL SYLLABLE THIEUTH OE KHIEUKH
+ {0xB885, 0xD20D}, //9425 #HANGUL SYLLABLE THIEUTH OE THIEUTH
+ {0xB886, 0xD20E}, //9426 #HANGUL SYLLABLE THIEUTH OE PHIEUPH
+ {0xB887, 0xD20F}, //9427 #HANGUL SYLLABLE THIEUTH OE HIEUH
+ {0xB888, 0xD211}, //9428 #HANGUL SYLLABLE THIEUTH YO KIYEOK
+ {0xB889, 0xD212}, //9429 #HANGUL SYLLABLE THIEUTH YO SSANGKIYEOK
+ {0xB88A, 0xD213}, //9430 #HANGUL SYLLABLE THIEUTH YO KIYEOKSIOS
+ {0xB88B, 0xD214}, //9431 #HANGUL SYLLABLE THIEUTH YO NIEUN
+ {0xB88C, 0xD215}, //9432 #HANGUL SYLLABLE THIEUTH YO NIEUNCIEUC
+ {0xB88D, 0xD216}, //9433 #HANGUL SYLLABLE THIEUTH YO NIEUNHIEUH
+ {0xB88E, 0xD217}, //9434 #HANGUL SYLLABLE THIEUTH YO TIKEUT
+ {0xB88F, 0xD218}, //9435 #HANGUL SYLLABLE THIEUTH YO RIEUL
+ {0xB890, 0xD219}, //9436 #HANGUL SYLLABLE THIEUTH YO RIEULKIYEOK
+ {0xB891, 0xD21A}, //9437 #HANGUL SYLLABLE THIEUTH YO RIEULMIEUM
+ {0xB892, 0xD21B}, //9438 #HANGUL SYLLABLE THIEUTH YO RIEULPIEUP
+ {0xB893, 0xD21C}, //9439 #HANGUL SYLLABLE THIEUTH YO RIEULSIOS
+ {0xB894, 0xD21D}, //9440 #HANGUL SYLLABLE THIEUTH YO RIEULTHIEUTH
+ {0xB895, 0xD21E}, //9441 #HANGUL SYLLABLE THIEUTH YO RIEULPHIEUPH
+ {0xB896, 0xD21F}, //9442 #HANGUL SYLLABLE THIEUTH YO RIEULHIEUH
+ {0xB897, 0xD220}, //9443 #HANGUL SYLLABLE THIEUTH YO MIEUM
+ {0xB898, 0xD221}, //9444 #HANGUL SYLLABLE THIEUTH YO PIEUP
+ {0xB899, 0xD222}, //9445 #HANGUL SYLLABLE THIEUTH YO PIEUPSIOS
+ {0xB89A, 0xD223}, //9446 #HANGUL SYLLABLE THIEUTH YO SIOS
+ {0xB89B, 0xD224}, //9447 #HANGUL SYLLABLE THIEUTH YO SSANGSIOS
+ {0xB89C, 0xD225}, //9448 #HANGUL SYLLABLE THIEUTH YO IEUNG
+ {0xB89D, 0xD226}, //9449 #HANGUL SYLLABLE THIEUTH YO CIEUC
+ {0xB89E, 0xD227}, //9450 #HANGUL SYLLABLE THIEUTH YO CHIEUCH
+ {0xB89F, 0xD228}, //9451 #HANGUL SYLLABLE THIEUTH YO KHIEUKH
+ {0xB8A0, 0xD229}, //9452 #HANGUL SYLLABLE THIEUTH YO THIEUTH
+ {0xB8A1, 0xB96B}, //9453 #HANGUL SYLLABLE RIEUL YU SIOS
+ {0xB8A2, 0xB96D}, //9454 #HANGUL SYLLABLE RIEUL YU IEUNG
+ {0xB8A3, 0xB974}, //9455 #HANGUL SYLLABLE RIEUL EU
+ {0xB8A4, 0xB975}, //9456 #HANGUL SYLLABLE RIEUL EU KIYEOK
+ {0xB8A5, 0xB978}, //9457 #HANGUL SYLLABLE RIEUL EU NIEUN
+ {0xB8A6, 0xB97C}, //9458 #HANGUL SYLLABLE RIEUL EU RIEUL
+ {0xB8A7, 0xB984}, //9459 #HANGUL SYLLABLE RIEUL EU MIEUM
+ {0xB8A8, 0xB985}, //9460 #HANGUL SYLLABLE RIEUL EU PIEUP
+ {0xB8A9, 0xB987}, //9461 #HANGUL SYLLABLE RIEUL EU SIOS
+ {0xB8AA, 0xB989}, //9462 #HANGUL SYLLABLE RIEUL EU IEUNG
+ {0xB8AB, 0xB98A}, //9463 #HANGUL SYLLABLE RIEUL EU CIEUC
+ {0xB8AC, 0xB98D}, //9464 #HANGUL SYLLABLE RIEUL EU THIEUTH
+ {0xB8AD, 0xB98E}, //9465 #HANGUL SYLLABLE RIEUL EU PHIEUPH
+ {0xB8AE, 0xB9AC}, //9466 #HANGUL SYLLABLE RIEUL I
+ {0xB8AF, 0xB9AD}, //9467 #HANGUL SYLLABLE RIEUL I KIYEOK
+ {0xB8B0, 0xB9B0}, //9468 #HANGUL SYLLABLE RIEUL I NIEUN
+ {0xB8B1, 0xB9B4}, //9469 #HANGUL SYLLABLE RIEUL I RIEUL
+ {0xB8B2, 0xB9BC}, //9470 #HANGUL SYLLABLE RIEUL I MIEUM
+ {0xB8B3, 0xB9BD}, //9471 #HANGUL SYLLABLE RIEUL I PIEUP
+ {0xB8B4, 0xB9BF}, //9472 #HANGUL SYLLABLE RIEUL I SIOS
+ {0xB8B5, 0xB9C1}, //9473 #HANGUL SYLLABLE RIEUL I IEUNG
+ {0xB8B6, 0xB9C8}, //9474 #HANGUL SYLLABLE MIEUM A
+ {0xB8B7, 0xB9C9}, //9475 #HANGUL SYLLABLE MIEUM A KIYEOK
+ {0xB8B8, 0xB9CC}, //9476 #HANGUL SYLLABLE MIEUM A NIEUN
+ {0xB8B9, 0xB9CE}, //9477 #HANGUL SYLLABLE MIEUM A NIEUNHIEUH
+ {0xB8BA, 0xB9CF}, //9478 #HANGUL SYLLABLE MIEUM A TIKEUT
+ {0xB8BB, 0xB9D0}, //9479 #HANGUL SYLLABLE MIEUM A RIEUL
+ {0xB8BC, 0xB9D1}, //9480 #HANGUL SYLLABLE MIEUM A RIEULKIYEOK
+ {0xB8BD, 0xB9D2}, //9481 #HANGUL SYLLABLE MIEUM A RIEULMIEUM
+ {0xB8BE, 0xB9D8}, //9482 #HANGUL SYLLABLE MIEUM A MIEUM
+ {0xB8BF, 0xB9D9}, //9483 #HANGUL SYLLABLE MIEUM A PIEUP
+ {0xB8C0, 0xB9DB}, //9484 #HANGUL SYLLABLE MIEUM A SIOS
+ {0xB8C1, 0xB9DD}, //9485 #HANGUL SYLLABLE MIEUM A IEUNG
+ {0xB8C2, 0xB9DE}, //9486 #HANGUL SYLLABLE MIEUM A CIEUC
+ {0xB8C3, 0xB9E1}, //9487 #HANGUL SYLLABLE MIEUM A THIEUTH
+ {0xB8C4, 0xB9E3}, //9488 #HANGUL SYLLABLE MIEUM A HIEUH
+ {0xB8C5, 0xB9E4}, //9489 #HANGUL SYLLABLE MIEUM AE
+ {0xB8C6, 0xB9E5}, //9490 #HANGUL SYLLABLE MIEUM AE KIYEOK
+ {0xB8C7, 0xB9E8}, //9491 #HANGUL SYLLABLE MIEUM AE NIEUN
+ {0xB8C8, 0xB9EC}, //9492 #HANGUL SYLLABLE MIEUM AE RIEUL
+ {0xB8C9, 0xB9F4}, //9493 #HANGUL SYLLABLE MIEUM AE MIEUM
+ {0xB8CA, 0xB9F5}, //9494 #HANGUL SYLLABLE MIEUM AE PIEUP
+ {0xB8CB, 0xB9F7}, //9495 #HANGUL SYLLABLE MIEUM AE SIOS
+ {0xB8CC, 0xB9F8}, //9496 #HANGUL SYLLABLE MIEUM AE SSANGSIOS
+ {0xB8CD, 0xB9F9}, //9497 #HANGUL SYLLABLE MIEUM AE IEUNG
+ {0xB8CE, 0xB9FA}, //9498 #HANGUL SYLLABLE MIEUM AE CIEUC
+ {0xB8CF, 0xBA00}, //9499 #HANGUL SYLLABLE MIEUM YA
+ {0xB8D0, 0xBA01}, //9500 #HANGUL SYLLABLE MIEUM YA KIYEOK
+ {0xB8D1, 0xBA08}, //9501 #HANGUL SYLLABLE MIEUM YA RIEUL
+ {0xB8D2, 0xBA15}, //9502 #HANGUL SYLLABLE MIEUM YA IEUNG
+ {0xB8D3, 0xBA38}, //9503 #HANGUL SYLLABLE MIEUM EO
+ {0xB8D4, 0xBA39}, //9504 #HANGUL SYLLABLE MIEUM EO KIYEOK
+ {0xB8D5, 0xBA3C}, //9505 #HANGUL SYLLABLE MIEUM EO NIEUN
+ {0xB8D6, 0xBA40}, //9506 #HANGUL SYLLABLE MIEUM EO RIEUL
+ {0xB8D7, 0xBA42}, //9507 #HANGUL SYLLABLE MIEUM EO RIEULMIEUM
+ {0xB8D8, 0xBA48}, //9508 #HANGUL SYLLABLE MIEUM EO MIEUM
+ {0xB8D9, 0xBA49}, //9509 #HANGUL SYLLABLE MIEUM EO PIEUP
+ {0xB8DA, 0xBA4B}, //9510 #HANGUL SYLLABLE MIEUM EO SIOS
+ {0xB8DB, 0xBA4D}, //9511 #HANGUL SYLLABLE MIEUM EO IEUNG
+ {0xB8DC, 0xBA4E}, //9512 #HANGUL SYLLABLE MIEUM EO CIEUC
+ {0xB8DD, 0xBA53}, //9513 #HANGUL SYLLABLE MIEUM EO HIEUH
+ {0xB8DE, 0xBA54}, //9514 #HANGUL SYLLABLE MIEUM E
+ {0xB8DF, 0xBA55}, //9515 #HANGUL SYLLABLE MIEUM E KIYEOK
+ {0xB8E0, 0xBA58}, //9516 #HANGUL SYLLABLE MIEUM E NIEUN
+ {0xB8E1, 0xBA5C}, //9517 #HANGUL SYLLABLE MIEUM E RIEUL
+ {0xB8E2, 0xBA64}, //9518 #HANGUL SYLLABLE MIEUM E MIEUM
+ {0xB8E3, 0xBA65}, //9519 #HANGUL SYLLABLE MIEUM E PIEUP
+ {0xB8E4, 0xBA67}, //9520 #HANGUL SYLLABLE MIEUM E SIOS
+ {0xB8E5, 0xBA68}, //9521 #HANGUL SYLLABLE MIEUM E SSANGSIOS
+ {0xB8E6, 0xBA69}, //9522 #HANGUL SYLLABLE MIEUM E IEUNG
+ {0xB8E7, 0xBA70}, //9523 #HANGUL SYLLABLE MIEUM YEO
+ {0xB8E8, 0xBA71}, //9524 #HANGUL SYLLABLE MIEUM YEO KIYEOK
+ {0xB8E9, 0xBA74}, //9525 #HANGUL SYLLABLE MIEUM YEO NIEUN
+ {0xB8EA, 0xBA78}, //9526 #HANGUL SYLLABLE MIEUM YEO RIEUL
+ {0xB8EB, 0xBA83}, //9527 #HANGUL SYLLABLE MIEUM YEO SIOS
+ {0xB8EC, 0xBA84}, //9528 #HANGUL SYLLABLE MIEUM YEO SSANGSIOS
+ {0xB8ED, 0xBA85}, //9529 #HANGUL SYLLABLE MIEUM YEO IEUNG
+ {0xB8EE, 0xBA87}, //9530 #HANGUL SYLLABLE MIEUM YEO CHIEUCH
+ {0xB8EF, 0xBA8C}, //9531 #HANGUL SYLLABLE MIEUM YE
+ {0xB8F0, 0xBAA8}, //9532 #HANGUL SYLLABLE MIEUM O
+ {0xB8F1, 0xBAA9}, //9533 #HANGUL SYLLABLE MIEUM O KIYEOK
+ {0xB8F2, 0xBAAB}, //9534 #HANGUL SYLLABLE MIEUM O KIYEOKSIOS
+ {0xB8F3, 0xBAAC}, //9535 #HANGUL SYLLABLE MIEUM O NIEUN
+ {0xB8F4, 0xBAB0}, //9536 #HANGUL SYLLABLE MIEUM O RIEUL
+ {0xB8F5, 0xBAB2}, //9537 #HANGUL SYLLABLE MIEUM O RIEULMIEUM
+ {0xB8F6, 0xBAB8}, //9538 #HANGUL SYLLABLE MIEUM O MIEUM
+ {0xB8F7, 0xBAB9}, //9539 #HANGUL SYLLABLE MIEUM O PIEUP
+ {0xB8F8, 0xBABB}, //9540 #HANGUL SYLLABLE MIEUM O SIOS
+ {0xB8F9, 0xBABD}, //9541 #HANGUL SYLLABLE MIEUM O IEUNG
+ {0xB8FA, 0xBAC4}, //9542 #HANGUL SYLLABLE MIEUM WA
+ {0xB8FB, 0xBAC8}, //9543 #HANGUL SYLLABLE MIEUM WA NIEUN
+ {0xB8FC, 0xBAD8}, //9544 #HANGUL SYLLABLE MIEUM WA SSANGSIOS
+ {0xB8FD, 0xBAD9}, //9545 #HANGUL SYLLABLE MIEUM WA IEUNG
+ {0xB8FE, 0xBAFC}, //9546 #HANGUL SYLLABLE MIEUM OE
+ {0xB941, 0xD22A}, //9547 #HANGUL SYLLABLE THIEUTH YO PHIEUPH
+ {0xB942, 0xD22B}, //9548 #HANGUL SYLLABLE THIEUTH YO HIEUH
+ {0xB943, 0xD22E}, //9549 #HANGUL SYLLABLE THIEUTH U SSANGKIYEOK
+ {0xB944, 0xD22F}, //9550 #HANGUL SYLLABLE THIEUTH U KIYEOKSIOS
+ {0xB945, 0xD231}, //9551 #HANGUL SYLLABLE THIEUTH U NIEUNCIEUC
+ {0xB946, 0xD232}, //9552 #HANGUL SYLLABLE THIEUTH U NIEUNHIEUH
+ {0xB947, 0xD233}, //9553 #HANGUL SYLLABLE THIEUTH U TIKEUT
+ {0xB948, 0xD235}, //9554 #HANGUL SYLLABLE THIEUTH U RIEULKIYEOK
+ {0xB949, 0xD236}, //9555 #HANGUL SYLLABLE THIEUTH U RIEULMIEUM
+ {0xB94A, 0xD237}, //9556 #HANGUL SYLLABLE THIEUTH U RIEULPIEUP
+ {0xB94B, 0xD238}, //9557 #HANGUL SYLLABLE THIEUTH U RIEULSIOS
+ {0xB94C, 0xD239}, //9558 #HANGUL SYLLABLE THIEUTH U RIEULTHIEUTH
+ {0xB94D, 0xD23A}, //9559 #HANGUL SYLLABLE THIEUTH U RIEULPHIEUPH
+ {0xB94E, 0xD23B}, //9560 #HANGUL SYLLABLE THIEUTH U RIEULHIEUH
+ {0xB94F, 0xD23E}, //9561 #HANGUL SYLLABLE THIEUTH U PIEUPSIOS
+ {0xB950, 0xD240}, //9562 #HANGUL SYLLABLE THIEUTH U SSANGSIOS
+ {0xB951, 0xD242}, //9563 #HANGUL SYLLABLE THIEUTH U CIEUC
+ {0xB952, 0xD243}, //9564 #HANGUL SYLLABLE THIEUTH U CHIEUCH
+ {0xB953, 0xD244}, //9565 #HANGUL SYLLABLE THIEUTH U KHIEUKH
+ {0xB954, 0xD245}, //9566 #HANGUL SYLLABLE THIEUTH U THIEUTH
+ {0xB955, 0xD246}, //9567 #HANGUL SYLLABLE THIEUTH U PHIEUPH
+ {0xB956, 0xD247}, //9568 #HANGUL SYLLABLE THIEUTH U HIEUH
+ {0xB957, 0xD249}, //9569 #HANGUL SYLLABLE THIEUTH WEO KIYEOK
+ {0xB958, 0xD24A}, //9570 #HANGUL SYLLABLE THIEUTH WEO SSANGKIYEOK
+ {0xB959, 0xD24B}, //9571 #HANGUL SYLLABLE THIEUTH WEO KIYEOKSIOS
+ {0xB95A, 0xD24C}, //9572 #HANGUL SYLLABLE THIEUTH WEO NIEUN
+ {0xB961, 0xD24D}, //9573 #HANGUL SYLLABLE THIEUTH WEO NIEUNCIEUC
+ {0xB962, 0xD24E}, //9574 #HANGUL SYLLABLE THIEUTH WEO NIEUNHIEUH
+ {0xB963, 0xD24F}, //9575 #HANGUL SYLLABLE THIEUTH WEO TIKEUT
+ {0xB964, 0xD250}, //9576 #HANGUL SYLLABLE THIEUTH WEO RIEUL
+ {0xB965, 0xD251}, //9577 #HANGUL SYLLABLE THIEUTH WEO RIEULKIYEOK
+ {0xB966, 0xD252}, //9578 #HANGUL SYLLABLE THIEUTH WEO RIEULMIEUM
+ {0xB967, 0xD253}, //9579 #HANGUL SYLLABLE THIEUTH WEO RIEULPIEUP
+ {0xB968, 0xD254}, //9580 #HANGUL SYLLABLE THIEUTH WEO RIEULSIOS
+ {0xB969, 0xD255}, //9581 #HANGUL SYLLABLE THIEUTH WEO RIEULTHIEUTH
+ {0xB96A, 0xD256}, //9582 #HANGUL SYLLABLE THIEUTH WEO RIEULPHIEUPH
+ {0xB96B, 0xD257}, //9583 #HANGUL SYLLABLE THIEUTH WEO RIEULHIEUH
+ {0xB96C, 0xD258}, //9584 #HANGUL SYLLABLE THIEUTH WEO MIEUM
+ {0xB96D, 0xD259}, //9585 #HANGUL SYLLABLE THIEUTH WEO PIEUP
+ {0xB96E, 0xD25A}, //9586 #HANGUL SYLLABLE THIEUTH WEO PIEUPSIOS
+ {0xB96F, 0xD25B}, //9587 #HANGUL SYLLABLE THIEUTH WEO SIOS
+ {0xB970, 0xD25D}, //9588 #HANGUL SYLLABLE THIEUTH WEO IEUNG
+ {0xB971, 0xD25E}, //9589 #HANGUL SYLLABLE THIEUTH WEO CIEUC
+ {0xB972, 0xD25F}, //9590 #HANGUL SYLLABLE THIEUTH WEO CHIEUCH
+ {0xB973, 0xD260}, //9591 #HANGUL SYLLABLE THIEUTH WEO KHIEUKH
+ {0xB974, 0xD261}, //9592 #HANGUL SYLLABLE THIEUTH WEO THIEUTH
+ {0xB975, 0xD262}, //9593 #HANGUL SYLLABLE THIEUTH WEO PHIEUPH
+ {0xB976, 0xD263}, //9594 #HANGUL SYLLABLE THIEUTH WEO HIEUH
+ {0xB977, 0xD265}, //9595 #HANGUL SYLLABLE THIEUTH WE KIYEOK
+ {0xB978, 0xD266}, //9596 #HANGUL SYLLABLE THIEUTH WE SSANGKIYEOK
+ {0xB979, 0xD267}, //9597 #HANGUL SYLLABLE THIEUTH WE KIYEOKSIOS
+ {0xB97A, 0xD268}, //9598 #HANGUL SYLLABLE THIEUTH WE NIEUN
+ {0xB981, 0xD269}, //9599 #HANGUL SYLLABLE THIEUTH WE NIEUNCIEUC
+ {0xB982, 0xD26A}, //9600 #HANGUL SYLLABLE THIEUTH WE NIEUNHIEUH
+ {0xB983, 0xD26B}, //9601 #HANGUL SYLLABLE THIEUTH WE TIKEUT
+ {0xB984, 0xD26C}, //9602 #HANGUL SYLLABLE THIEUTH WE RIEUL
+ {0xB985, 0xD26D}, //9603 #HANGUL SYLLABLE THIEUTH WE RIEULKIYEOK
+ {0xB986, 0xD26E}, //9604 #HANGUL SYLLABLE THIEUTH WE RIEULMIEUM
+ {0xB987, 0xD26F}, //9605 #HANGUL SYLLABLE THIEUTH WE RIEULPIEUP
+ {0xB988, 0xD270}, //9606 #HANGUL SYLLABLE THIEUTH WE RIEULSIOS
+ {0xB989, 0xD271}, //9607 #HANGUL SYLLABLE THIEUTH WE RIEULTHIEUTH
+ {0xB98A, 0xD272}, //9608 #HANGUL SYLLABLE THIEUTH WE RIEULPHIEUPH
+ {0xB98B, 0xD273}, //9609 #HANGUL SYLLABLE THIEUTH WE RIEULHIEUH
+ {0xB98C, 0xD274}, //9610 #HANGUL SYLLABLE THIEUTH WE MIEUM
+ {0xB98D, 0xD275}, //9611 #HANGUL SYLLABLE THIEUTH WE PIEUP
+ {0xB98E, 0xD276}, //9612 #HANGUL SYLLABLE THIEUTH WE PIEUPSIOS
+ {0xB98F, 0xD277}, //9613 #HANGUL SYLLABLE THIEUTH WE SIOS
+ {0xB990, 0xD278}, //9614 #HANGUL SYLLABLE THIEUTH WE SSANGSIOS
+ {0xB991, 0xD279}, //9615 #HANGUL SYLLABLE THIEUTH WE IEUNG
+ {0xB992, 0xD27A}, //9616 #HANGUL SYLLABLE THIEUTH WE CIEUC
+ {0xB993, 0xD27B}, //9617 #HANGUL SYLLABLE THIEUTH WE CHIEUCH
+ {0xB994, 0xD27C}, //9618 #HANGUL SYLLABLE THIEUTH WE KHIEUKH
+ {0xB995, 0xD27D}, //9619 #HANGUL SYLLABLE THIEUTH WE THIEUTH
+ {0xB996, 0xD27E}, //9620 #HANGUL SYLLABLE THIEUTH WE PHIEUPH
+ {0xB997, 0xD27F}, //9621 #HANGUL SYLLABLE THIEUTH WE HIEUH
+ {0xB998, 0xD282}, //9622 #HANGUL SYLLABLE THIEUTH WI SSANGKIYEOK
+ {0xB999, 0xD283}, //9623 #HANGUL SYLLABLE THIEUTH WI KIYEOKSIOS
+ {0xB99A, 0xD285}, //9624 #HANGUL SYLLABLE THIEUTH WI NIEUNCIEUC
+ {0xB99B, 0xD286}, //9625 #HANGUL SYLLABLE THIEUTH WI NIEUNHIEUH
+ {0xB99C, 0xD287}, //9626 #HANGUL SYLLABLE THIEUTH WI TIKEUT
+ {0xB99D, 0xD289}, //9627 #HANGUL SYLLABLE THIEUTH WI RIEULKIYEOK
+ {0xB99E, 0xD28A}, //9628 #HANGUL SYLLABLE THIEUTH WI RIEULMIEUM
+ {0xB99F, 0xD28B}, //9629 #HANGUL SYLLABLE THIEUTH WI RIEULPIEUP
+ {0xB9A0, 0xD28C}, //9630 #HANGUL SYLLABLE THIEUTH WI RIEULSIOS
+ {0xB9A1, 0xBB00}, //9631 #HANGUL SYLLABLE MIEUM OE NIEUN
+ {0xB9A2, 0xBB04}, //9632 #HANGUL SYLLABLE MIEUM OE RIEUL
+ {0xB9A3, 0xBB0D}, //9633 #HANGUL SYLLABLE MIEUM OE PIEUP
+ {0xB9A4, 0xBB0F}, //9634 #HANGUL SYLLABLE MIEUM OE SIOS
+ {0xB9A5, 0xBB11}, //9635 #HANGUL SYLLABLE MIEUM OE IEUNG
+ {0xB9A6, 0xBB18}, //9636 #HANGUL SYLLABLE MIEUM YO
+ {0xB9A7, 0xBB1C}, //9637 #HANGUL SYLLABLE MIEUM YO NIEUN
+ {0xB9A8, 0xBB20}, //9638 #HANGUL SYLLABLE MIEUM YO RIEUL
+ {0xB9A9, 0xBB29}, //9639 #HANGUL SYLLABLE MIEUM YO PIEUP
+ {0xB9AA, 0xBB2B}, //9640 #HANGUL SYLLABLE MIEUM YO SIOS
+ {0xB9AB, 0xBB34}, //9641 #HANGUL SYLLABLE MIEUM U
+ {0xB9AC, 0xBB35}, //9642 #HANGUL SYLLABLE MIEUM U KIYEOK
+ {0xB9AD, 0xBB36}, //9643 #HANGUL SYLLABLE MIEUM U SSANGKIYEOK
+ {0xB9AE, 0xBB38}, //9644 #HANGUL SYLLABLE MIEUM U NIEUN
+ {0xB9AF, 0xBB3B}, //9645 #HANGUL SYLLABLE MIEUM U TIKEUT
+ {0xB9B0, 0xBB3C}, //9646 #HANGUL SYLLABLE MIEUM U RIEUL
+ {0xB9B1, 0xBB3D}, //9647 #HANGUL SYLLABLE MIEUM U RIEULKIYEOK
+ {0xB9B2, 0xBB3E}, //9648 #HANGUL SYLLABLE MIEUM U RIEULMIEUM
+ {0xB9B3, 0xBB44}, //9649 #HANGUL SYLLABLE MIEUM U MIEUM
+ {0xB9B4, 0xBB45}, //9650 #HANGUL SYLLABLE MIEUM U PIEUP
+ {0xB9B5, 0xBB47}, //9651 #HANGUL SYLLABLE MIEUM U SIOS
+ {0xB9B6, 0xBB49}, //9652 #HANGUL SYLLABLE MIEUM U IEUNG
+ {0xB9B7, 0xBB4D}, //9653 #HANGUL SYLLABLE MIEUM U THIEUTH
+ {0xB9B8, 0xBB4F}, //9654 #HANGUL SYLLABLE MIEUM U HIEUH
+ {0xB9B9, 0xBB50}, //9655 #HANGUL SYLLABLE MIEUM WEO
+ {0xB9BA, 0xBB54}, //9656 #HANGUL SYLLABLE MIEUM WEO NIEUN
+ {0xB9BB, 0xBB58}, //9657 #HANGUL SYLLABLE MIEUM WEO RIEUL
+ {0xB9BC, 0xBB61}, //9658 #HANGUL SYLLABLE MIEUM WEO PIEUP
+ {0xB9BD, 0xBB63}, //9659 #HANGUL SYLLABLE MIEUM WEO SIOS
+ {0xB9BE, 0xBB6C}, //9660 #HANGUL SYLLABLE MIEUM WE
+ {0xB9BF, 0xBB88}, //9661 #HANGUL SYLLABLE MIEUM WI
+ {0xB9C0, 0xBB8C}, //9662 #HANGUL SYLLABLE MIEUM WI NIEUN
+ {0xB9C1, 0xBB90}, //9663 #HANGUL SYLLABLE MIEUM WI RIEUL
+ {0xB9C2, 0xBBA4}, //9664 #HANGUL SYLLABLE MIEUM YU
+ {0xB9C3, 0xBBA8}, //9665 #HANGUL SYLLABLE MIEUM YU NIEUN
+ {0xB9C4, 0xBBAC}, //9666 #HANGUL SYLLABLE MIEUM YU RIEUL
+ {0xB9C5, 0xBBB4}, //9667 #HANGUL SYLLABLE MIEUM YU MIEUM
+ {0xB9C6, 0xBBB7}, //9668 #HANGUL SYLLABLE MIEUM YU SIOS
+ {0xB9C7, 0xBBC0}, //9669 #HANGUL SYLLABLE MIEUM EU
+ {0xB9C8, 0xBBC4}, //9670 #HANGUL SYLLABLE MIEUM EU NIEUN
+ {0xB9C9, 0xBBC8}, //9671 #HANGUL SYLLABLE MIEUM EU RIEUL
+ {0xB9CA, 0xBBD0}, //9672 #HANGUL SYLLABLE MIEUM EU MIEUM
+ {0xB9CB, 0xBBD3}, //9673 #HANGUL SYLLABLE MIEUM EU SIOS
+ {0xB9CC, 0xBBF8}, //9674 #HANGUL SYLLABLE MIEUM I
+ {0xB9CD, 0xBBF9}, //9675 #HANGUL SYLLABLE MIEUM I KIYEOK
+ {0xB9CE, 0xBBFC}, //9676 #HANGUL SYLLABLE MIEUM I NIEUN
+ {0xB9CF, 0xBBFF}, //9677 #HANGUL SYLLABLE MIEUM I TIKEUT
+ {0xB9D0, 0xBC00}, //9678 #HANGUL SYLLABLE MIEUM I RIEUL
+ {0xB9D1, 0xBC02}, //9679 #HANGUL SYLLABLE MIEUM I RIEULMIEUM
+ {0xB9D2, 0xBC08}, //9680 #HANGUL SYLLABLE MIEUM I MIEUM
+ {0xB9D3, 0xBC09}, //9681 #HANGUL SYLLABLE MIEUM I PIEUP
+ {0xB9D4, 0xBC0B}, //9682 #HANGUL SYLLABLE MIEUM I SIOS
+ {0xB9D5, 0xBC0C}, //9683 #HANGUL SYLLABLE MIEUM I SSANGSIOS
+ {0xB9D6, 0xBC0D}, //9684 #HANGUL SYLLABLE MIEUM I IEUNG
+ {0xB9D7, 0xBC0F}, //9685 #HANGUL SYLLABLE MIEUM I CHIEUCH
+ {0xB9D8, 0xBC11}, //9686 #HANGUL SYLLABLE MIEUM I THIEUTH
+ {0xB9D9, 0xBC14}, //9687 #HANGUL SYLLABLE PIEUP A
+ {0xB9DA, 0xBC15}, //9688 #HANGUL SYLLABLE PIEUP A KIYEOK
+ {0xB9DB, 0xBC16}, //9689 #HANGUL SYLLABLE PIEUP A SSANGKIYEOK
+ {0xB9DC, 0xBC17}, //9690 #HANGUL SYLLABLE PIEUP A KIYEOKSIOS
+ {0xB9DD, 0xBC18}, //9691 #HANGUL SYLLABLE PIEUP A NIEUN
+ {0xB9DE, 0xBC1B}, //9692 #HANGUL SYLLABLE PIEUP A TIKEUT
+ {0xB9DF, 0xBC1C}, //9693 #HANGUL SYLLABLE PIEUP A RIEUL
+ {0xB9E0, 0xBC1D}, //9694 #HANGUL SYLLABLE PIEUP A RIEULKIYEOK
+ {0xB9E1, 0xBC1E}, //9695 #HANGUL SYLLABLE PIEUP A RIEULMIEUM
+ {0xB9E2, 0xBC1F}, //9696 #HANGUL SYLLABLE PIEUP A RIEULPIEUP
+ {0xB9E3, 0xBC24}, //9697 #HANGUL SYLLABLE PIEUP A MIEUM
+ {0xB9E4, 0xBC25}, //9698 #HANGUL SYLLABLE PIEUP A PIEUP
+ {0xB9E5, 0xBC27}, //9699 #HANGUL SYLLABLE PIEUP A SIOS
+ {0xB9E6, 0xBC29}, //9700 #HANGUL SYLLABLE PIEUP A IEUNG
+ {0xB9E7, 0xBC2D}, //9701 #HANGUL SYLLABLE PIEUP A THIEUTH
+ {0xB9E8, 0xBC30}, //9702 #HANGUL SYLLABLE PIEUP AE
+ {0xB9E9, 0xBC31}, //9703 #HANGUL SYLLABLE PIEUP AE KIYEOK
+ {0xB9EA, 0xBC34}, //9704 #HANGUL SYLLABLE PIEUP AE NIEUN
+ {0xB9EB, 0xBC38}, //9705 #HANGUL SYLLABLE PIEUP AE RIEUL
+ {0xB9EC, 0xBC40}, //9706 #HANGUL SYLLABLE PIEUP AE MIEUM
+ {0xB9ED, 0xBC41}, //9707 #HANGUL SYLLABLE PIEUP AE PIEUP
+ {0xB9EE, 0xBC43}, //9708 #HANGUL SYLLABLE PIEUP AE SIOS
+ {0xB9EF, 0xBC44}, //9709 #HANGUL SYLLABLE PIEUP AE SSANGSIOS
+ {0xB9F0, 0xBC45}, //9710 #HANGUL SYLLABLE PIEUP AE IEUNG
+ {0xB9F1, 0xBC49}, //9711 #HANGUL SYLLABLE PIEUP AE THIEUTH
+ {0xB9F2, 0xBC4C}, //9712 #HANGUL SYLLABLE PIEUP YA
+ {0xB9F3, 0xBC4D}, //9713 #HANGUL SYLLABLE PIEUP YA KIYEOK
+ {0xB9F4, 0xBC50}, //9714 #HANGUL SYLLABLE PIEUP YA NIEUN
+ {0xB9F5, 0xBC5D}, //9715 #HANGUL SYLLABLE PIEUP YA PIEUP
+ {0xB9F6, 0xBC84}, //9716 #HANGUL SYLLABLE PIEUP EO
+ {0xB9F7, 0xBC85}, //9717 #HANGUL SYLLABLE PIEUP EO KIYEOK
+ {0xB9F8, 0xBC88}, //9718 #HANGUL SYLLABLE PIEUP EO NIEUN
+ {0xB9F9, 0xBC8B}, //9719 #HANGUL SYLLABLE PIEUP EO TIKEUT
+ {0xB9FA, 0xBC8C}, //9720 #HANGUL SYLLABLE PIEUP EO RIEUL
+ {0xB9FB, 0xBC8E}, //9721 #HANGUL SYLLABLE PIEUP EO RIEULMIEUM
+ {0xB9FC, 0xBC94}, //9722 #HANGUL SYLLABLE PIEUP EO MIEUM
+ {0xB9FD, 0xBC95}, //9723 #HANGUL SYLLABLE PIEUP EO PIEUP
+ {0xB9FE, 0xBC97}, //9724 #HANGUL SYLLABLE PIEUP EO SIOS
+ {0xBA41, 0xD28D}, //9725 #HANGUL SYLLABLE THIEUTH WI RIEULTHIEUTH
+ {0xBA42, 0xD28E}, //9726 #HANGUL SYLLABLE THIEUTH WI RIEULPHIEUPH
+ {0xBA43, 0xD28F}, //9727 #HANGUL SYLLABLE THIEUTH WI RIEULHIEUH
+ {0xBA44, 0xD292}, //9728 #HANGUL SYLLABLE THIEUTH WI PIEUPSIOS
+ {0xBA45, 0xD293}, //9729 #HANGUL SYLLABLE THIEUTH WI SIOS
+ {0xBA46, 0xD294}, //9730 #HANGUL SYLLABLE THIEUTH WI SSANGSIOS
+ {0xBA47, 0xD296}, //9731 #HANGUL SYLLABLE THIEUTH WI CIEUC
+ {0xBA48, 0xD297}, //9732 #HANGUL SYLLABLE THIEUTH WI CHIEUCH
+ {0xBA49, 0xD298}, //9733 #HANGUL SYLLABLE THIEUTH WI KHIEUKH
+ {0xBA4A, 0xD299}, //9734 #HANGUL SYLLABLE THIEUTH WI THIEUTH
+ {0xBA4B, 0xD29A}, //9735 #HANGUL SYLLABLE THIEUTH WI PHIEUPH
+ {0xBA4C, 0xD29B}, //9736 #HANGUL SYLLABLE THIEUTH WI HIEUH
+ {0xBA4D, 0xD29D}, //9737 #HANGUL SYLLABLE THIEUTH YU KIYEOK
+ {0xBA4E, 0xD29E}, //9738 #HANGUL SYLLABLE THIEUTH YU SSANGKIYEOK
+ {0xBA4F, 0xD29F}, //9739 #HANGUL SYLLABLE THIEUTH YU KIYEOKSIOS
+ {0xBA50, 0xD2A1}, //9740 #HANGUL SYLLABLE THIEUTH YU NIEUNCIEUC
+ {0xBA51, 0xD2A2}, //9741 #HANGUL SYLLABLE THIEUTH YU NIEUNHIEUH
+ {0xBA52, 0xD2A3}, //9742 #HANGUL SYLLABLE THIEUTH YU TIKEUT
+ {0xBA53, 0xD2A5}, //9743 #HANGUL SYLLABLE THIEUTH YU RIEULKIYEOK
+ {0xBA54, 0xD2A6}, //9744 #HANGUL SYLLABLE THIEUTH YU RIEULMIEUM
+ {0xBA55, 0xD2A7}, //9745 #HANGUL SYLLABLE THIEUTH YU RIEULPIEUP
+ {0xBA56, 0xD2A8}, //9746 #HANGUL SYLLABLE THIEUTH YU RIEULSIOS
+ {0xBA57, 0xD2A9}, //9747 #HANGUL SYLLABLE THIEUTH YU RIEULTHIEUTH
+ {0xBA58, 0xD2AA}, //9748 #HANGUL SYLLABLE THIEUTH YU RIEULPHIEUPH
+ {0xBA59, 0xD2AB}, //9749 #HANGUL SYLLABLE THIEUTH YU RIEULHIEUH
+ {0xBA5A, 0xD2AD}, //9750 #HANGUL SYLLABLE THIEUTH YU PIEUP
+ {0xBA61, 0xD2AE}, //9751 #HANGUL SYLLABLE THIEUTH YU PIEUPSIOS
+ {0xBA62, 0xD2AF}, //9752 #HANGUL SYLLABLE THIEUTH YU SIOS
+ {0xBA63, 0xD2B0}, //9753 #HANGUL SYLLABLE THIEUTH YU SSANGSIOS
+ {0xBA64, 0xD2B2}, //9754 #HANGUL SYLLABLE THIEUTH YU CIEUC
+ {0xBA65, 0xD2B3}, //9755 #HANGUL SYLLABLE THIEUTH YU CHIEUCH
+ {0xBA66, 0xD2B4}, //9756 #HANGUL SYLLABLE THIEUTH YU KHIEUKH
+ {0xBA67, 0xD2B5}, //9757 #HANGUL SYLLABLE THIEUTH YU THIEUTH
+ {0xBA68, 0xD2B6}, //9758 #HANGUL SYLLABLE THIEUTH YU PHIEUPH
+ {0xBA69, 0xD2B7}, //9759 #HANGUL SYLLABLE THIEUTH YU HIEUH
+ {0xBA6A, 0xD2BA}, //9760 #HANGUL SYLLABLE THIEUTH EU SSANGKIYEOK
+ {0xBA6B, 0xD2BB}, //9761 #HANGUL SYLLABLE THIEUTH EU KIYEOKSIOS
+ {0xBA6C, 0xD2BD}, //9762 #HANGUL SYLLABLE THIEUTH EU NIEUNCIEUC
+ {0xBA6D, 0xD2BE}, //9763 #HANGUL SYLLABLE THIEUTH EU NIEUNHIEUH
+ {0xBA6E, 0xD2C1}, //9764 #HANGUL SYLLABLE THIEUTH EU RIEULKIYEOK
+ {0xBA6F, 0xD2C3}, //9765 #HANGUL SYLLABLE THIEUTH EU RIEULPIEUP
+ {0xBA70, 0xD2C4}, //9766 #HANGUL SYLLABLE THIEUTH EU RIEULSIOS
+ {0xBA71, 0xD2C5}, //9767 #HANGUL SYLLABLE THIEUTH EU RIEULTHIEUTH
+ {0xBA72, 0xD2C6}, //9768 #HANGUL SYLLABLE THIEUTH EU RIEULPHIEUPH
+ {0xBA73, 0xD2C7}, //9769 #HANGUL SYLLABLE THIEUTH EU RIEULHIEUH
+ {0xBA74, 0xD2CA}, //9770 #HANGUL SYLLABLE THIEUTH EU PIEUPSIOS
+ {0xBA75, 0xD2CC}, //9771 #HANGUL SYLLABLE THIEUTH EU SSANGSIOS
+ {0xBA76, 0xD2CD}, //9772 #HANGUL SYLLABLE THIEUTH EU IEUNG
+ {0xBA77, 0xD2CE}, //9773 #HANGUL SYLLABLE THIEUTH EU CIEUC
+ {0xBA78, 0xD2CF}, //9774 #HANGUL SYLLABLE THIEUTH EU CHIEUCH
+ {0xBA79, 0xD2D0}, //9775 #HANGUL SYLLABLE THIEUTH EU KHIEUKH
+ {0xBA7A, 0xD2D1}, //9776 #HANGUL SYLLABLE THIEUTH EU THIEUTH
+ {0xBA81, 0xD2D2}, //9777 #HANGUL SYLLABLE THIEUTH EU PHIEUPH
+ {0xBA82, 0xD2D3}, //9778 #HANGUL SYLLABLE THIEUTH EU HIEUH
+ {0xBA83, 0xD2D5}, //9779 #HANGUL SYLLABLE THIEUTH YI KIYEOK
+ {0xBA84, 0xD2D6}, //9780 #HANGUL SYLLABLE THIEUTH YI SSANGKIYEOK
+ {0xBA85, 0xD2D7}, //9781 #HANGUL SYLLABLE THIEUTH YI KIYEOKSIOS
+ {0xBA86, 0xD2D9}, //9782 #HANGUL SYLLABLE THIEUTH YI NIEUNCIEUC
+ {0xBA87, 0xD2DA}, //9783 #HANGUL SYLLABLE THIEUTH YI NIEUNHIEUH
+ {0xBA88, 0xD2DB}, //9784 #HANGUL SYLLABLE THIEUTH YI TIKEUT
+ {0xBA89, 0xD2DD}, //9785 #HANGUL SYLLABLE THIEUTH YI RIEULKIYEOK
+ {0xBA8A, 0xD2DE}, //9786 #HANGUL SYLLABLE THIEUTH YI RIEULMIEUM
+ {0xBA8B, 0xD2DF}, //9787 #HANGUL SYLLABLE THIEUTH YI RIEULPIEUP
+ {0xBA8C, 0xD2E0}, //9788 #HANGUL SYLLABLE THIEUTH YI RIEULSIOS
+ {0xBA8D, 0xD2E1}, //9789 #HANGUL SYLLABLE THIEUTH YI RIEULTHIEUTH
+ {0xBA8E, 0xD2E2}, //9790 #HANGUL SYLLABLE THIEUTH YI RIEULPHIEUPH
+ {0xBA8F, 0xD2E3}, //9791 #HANGUL SYLLABLE THIEUTH YI RIEULHIEUH
+ {0xBA90, 0xD2E6}, //9792 #HANGUL SYLLABLE THIEUTH YI PIEUPSIOS
+ {0xBA91, 0xD2E7}, //9793 #HANGUL SYLLABLE THIEUTH YI SIOS
+ {0xBA92, 0xD2E8}, //9794 #HANGUL SYLLABLE THIEUTH YI SSANGSIOS
+ {0xBA93, 0xD2E9}, //9795 #HANGUL SYLLABLE THIEUTH YI IEUNG
+ {0xBA94, 0xD2EA}, //9796 #HANGUL SYLLABLE THIEUTH YI CIEUC
+ {0xBA95, 0xD2EB}, //9797 #HANGUL SYLLABLE THIEUTH YI CHIEUCH
+ {0xBA96, 0xD2EC}, //9798 #HANGUL SYLLABLE THIEUTH YI KHIEUKH
+ {0xBA97, 0xD2ED}, //9799 #HANGUL SYLLABLE THIEUTH YI THIEUTH
+ {0xBA98, 0xD2EE}, //9800 #HANGUL SYLLABLE THIEUTH YI PHIEUPH
+ {0xBA99, 0xD2EF}, //9801 #HANGUL SYLLABLE THIEUTH YI HIEUH
+ {0xBA9A, 0xD2F2}, //9802 #HANGUL SYLLABLE THIEUTH I SSANGKIYEOK
+ {0xBA9B, 0xD2F3}, //9803 #HANGUL SYLLABLE THIEUTH I KIYEOKSIOS
+ {0xBA9C, 0xD2F5}, //9804 #HANGUL SYLLABLE THIEUTH I NIEUNCIEUC
+ {0xBA9D, 0xD2F6}, //9805 #HANGUL SYLLABLE THIEUTH I NIEUNHIEUH
+ {0xBA9E, 0xD2F7}, //9806 #HANGUL SYLLABLE THIEUTH I TIKEUT
+ {0xBA9F, 0xD2F9}, //9807 #HANGUL SYLLABLE THIEUTH I RIEULKIYEOK
+ {0xBAA0, 0xD2FA}, //9808 #HANGUL SYLLABLE THIEUTH I RIEULMIEUM
+ {0xBAA1, 0xBC99}, //9809 #HANGUL SYLLABLE PIEUP EO IEUNG
+ {0xBAA2, 0xBC9A}, //9810 #HANGUL SYLLABLE PIEUP EO CIEUC
+ {0xBAA3, 0xBCA0}, //9811 #HANGUL SYLLABLE PIEUP E
+ {0xBAA4, 0xBCA1}, //9812 #HANGUL SYLLABLE PIEUP E KIYEOK
+ {0xBAA5, 0xBCA4}, //9813 #HANGUL SYLLABLE PIEUP E NIEUN
+ {0xBAA6, 0xBCA7}, //9814 #HANGUL SYLLABLE PIEUP E TIKEUT
+ {0xBAA7, 0xBCA8}, //9815 #HANGUL SYLLABLE PIEUP E RIEUL
+ {0xBAA8, 0xBCB0}, //9816 #HANGUL SYLLABLE PIEUP E MIEUM
+ {0xBAA9, 0xBCB1}, //9817 #HANGUL SYLLABLE PIEUP E PIEUP
+ {0xBAAA, 0xBCB3}, //9818 #HANGUL SYLLABLE PIEUP E SIOS
+ {0xBAAB, 0xBCB4}, //9819 #HANGUL SYLLABLE PIEUP E SSANGSIOS
+ {0xBAAC, 0xBCB5}, //9820 #HANGUL SYLLABLE PIEUP E IEUNG
+ {0xBAAD, 0xBCBC}, //9821 #HANGUL SYLLABLE PIEUP YEO
+ {0xBAAE, 0xBCBD}, //9822 #HANGUL SYLLABLE PIEUP YEO KIYEOK
+ {0xBAAF, 0xBCC0}, //9823 #HANGUL SYLLABLE PIEUP YEO NIEUN
+ {0xBAB0, 0xBCC4}, //9824 #HANGUL SYLLABLE PIEUP YEO RIEUL
+ {0xBAB1, 0xBCCD}, //9825 #HANGUL SYLLABLE PIEUP YEO PIEUP
+ {0xBAB2, 0xBCCF}, //9826 #HANGUL SYLLABLE PIEUP YEO SIOS
+ {0xBAB3, 0xBCD0}, //9827 #HANGUL SYLLABLE PIEUP YEO SSANGSIOS
+ {0xBAB4, 0xBCD1}, //9828 #HANGUL SYLLABLE PIEUP YEO IEUNG
+ {0xBAB5, 0xBCD5}, //9829 #HANGUL SYLLABLE PIEUP YEO THIEUTH
+ {0xBAB6, 0xBCD8}, //9830 #HANGUL SYLLABLE PIEUP YE
+ {0xBAB7, 0xBCDC}, //9831 #HANGUL SYLLABLE PIEUP YE NIEUN
+ {0xBAB8, 0xBCF4}, //9832 #HANGUL SYLLABLE PIEUP O
+ {0xBAB9, 0xBCF5}, //9833 #HANGUL SYLLABLE PIEUP O KIYEOK
+ {0xBABA, 0xBCF6}, //9834 #HANGUL SYLLABLE PIEUP O SSANGKIYEOK
+ {0xBABB, 0xBCF8}, //9835 #HANGUL SYLLABLE PIEUP O NIEUN
+ {0xBABC, 0xBCFC}, //9836 #HANGUL SYLLABLE PIEUP O RIEUL
+ {0xBABD, 0xBD04}, //9837 #HANGUL SYLLABLE PIEUP O MIEUM
+ {0xBABE, 0xBD05}, //9838 #HANGUL SYLLABLE PIEUP O PIEUP
+ {0xBABF, 0xBD07}, //9839 #HANGUL SYLLABLE PIEUP O SIOS
+ {0xBAC0, 0xBD09}, //9840 #HANGUL SYLLABLE PIEUP O IEUNG
+ {0xBAC1, 0xBD10}, //9841 #HANGUL SYLLABLE PIEUP WA
+ {0xBAC2, 0xBD14}, //9842 #HANGUL SYLLABLE PIEUP WA NIEUN
+ {0xBAC3, 0xBD24}, //9843 #HANGUL SYLLABLE PIEUP WA SSANGSIOS
+ {0xBAC4, 0xBD2C}, //9844 #HANGUL SYLLABLE PIEUP WAE
+ {0xBAC5, 0xBD40}, //9845 #HANGUL SYLLABLE PIEUP WAE SSANGSIOS
+ {0xBAC6, 0xBD48}, //9846 #HANGUL SYLLABLE PIEUP OE
+ {0xBAC7, 0xBD49}, //9847 #HANGUL SYLLABLE PIEUP OE KIYEOK
+ {0xBAC8, 0xBD4C}, //9848 #HANGUL SYLLABLE PIEUP OE NIEUN
+ {0xBAC9, 0xBD50}, //9849 #HANGUL SYLLABLE PIEUP OE RIEUL
+ {0xBACA, 0xBD58}, //9850 #HANGUL SYLLABLE PIEUP OE MIEUM
+ {0xBACB, 0xBD59}, //9851 #HANGUL SYLLABLE PIEUP OE PIEUP
+ {0xBACC, 0xBD64}, //9852 #HANGUL SYLLABLE PIEUP YO
+ {0xBACD, 0xBD68}, //9853 #HANGUL SYLLABLE PIEUP YO NIEUN
+ {0xBACE, 0xBD80}, //9854 #HANGUL SYLLABLE PIEUP U
+ {0xBACF, 0xBD81}, //9855 #HANGUL SYLLABLE PIEUP U KIYEOK
+ {0xBAD0, 0xBD84}, //9856 #HANGUL SYLLABLE PIEUP U NIEUN
+ {0xBAD1, 0xBD87}, //9857 #HANGUL SYLLABLE PIEUP U TIKEUT
+ {0xBAD2, 0xBD88}, //9858 #HANGUL SYLLABLE PIEUP U RIEUL
+ {0xBAD3, 0xBD89}, //9859 #HANGUL SYLLABLE PIEUP U RIEULKIYEOK
+ {0xBAD4, 0xBD8A}, //9860 #HANGUL SYLLABLE PIEUP U RIEULMIEUM
+ {0xBAD5, 0xBD90}, //9861 #HANGUL SYLLABLE PIEUP U MIEUM
+ {0xBAD6, 0xBD91}, //9862 #HANGUL SYLLABLE PIEUP U PIEUP
+ {0xBAD7, 0xBD93}, //9863 #HANGUL SYLLABLE PIEUP U SIOS
+ {0xBAD8, 0xBD95}, //9864 #HANGUL SYLLABLE PIEUP U IEUNG
+ {0xBAD9, 0xBD99}, //9865 #HANGUL SYLLABLE PIEUP U THIEUTH
+ {0xBADA, 0xBD9A}, //9866 #HANGUL SYLLABLE PIEUP U PHIEUPH
+ {0xBADB, 0xBD9C}, //9867 #HANGUL SYLLABLE PIEUP WEO
+ {0xBADC, 0xBDA4}, //9868 #HANGUL SYLLABLE PIEUP WEO RIEUL
+ {0xBADD, 0xBDB0}, //9869 #HANGUL SYLLABLE PIEUP WEO SSANGSIOS
+ {0xBADE, 0xBDB8}, //9870 #HANGUL SYLLABLE PIEUP WE
+ {0xBADF, 0xBDD4}, //9871 #HANGUL SYLLABLE PIEUP WI
+ {0xBAE0, 0xBDD5}, //9872 #HANGUL SYLLABLE PIEUP WI KIYEOK
+ {0xBAE1, 0xBDD8}, //9873 #HANGUL SYLLABLE PIEUP WI NIEUN
+ {0xBAE2, 0xBDDC}, //9874 #HANGUL SYLLABLE PIEUP WI RIEUL
+ {0xBAE3, 0xBDE9}, //9875 #HANGUL SYLLABLE PIEUP WI IEUNG
+ {0xBAE4, 0xBDF0}, //9876 #HANGUL SYLLABLE PIEUP YU
+ {0xBAE5, 0xBDF4}, //9877 #HANGUL SYLLABLE PIEUP YU NIEUN
+ {0xBAE6, 0xBDF8}, //9878 #HANGUL SYLLABLE PIEUP YU RIEUL
+ {0xBAE7, 0xBE00}, //9879 #HANGUL SYLLABLE PIEUP YU MIEUM
+ {0xBAE8, 0xBE03}, //9880 #HANGUL SYLLABLE PIEUP YU SIOS
+ {0xBAE9, 0xBE05}, //9881 #HANGUL SYLLABLE PIEUP YU IEUNG
+ {0xBAEA, 0xBE0C}, //9882 #HANGUL SYLLABLE PIEUP EU
+ {0xBAEB, 0xBE0D}, //9883 #HANGUL SYLLABLE PIEUP EU KIYEOK
+ {0xBAEC, 0xBE10}, //9884 #HANGUL SYLLABLE PIEUP EU NIEUN
+ {0xBAED, 0xBE14}, //9885 #HANGUL SYLLABLE PIEUP EU RIEUL
+ {0xBAEE, 0xBE1C}, //9886 #HANGUL SYLLABLE PIEUP EU MIEUM
+ {0xBAEF, 0xBE1D}, //9887 #HANGUL SYLLABLE PIEUP EU PIEUP
+ {0xBAF0, 0xBE1F}, //9888 #HANGUL SYLLABLE PIEUP EU SIOS
+ {0xBAF1, 0xBE44}, //9889 #HANGUL SYLLABLE PIEUP I
+ {0xBAF2, 0xBE45}, //9890 #HANGUL SYLLABLE PIEUP I KIYEOK
+ {0xBAF3, 0xBE48}, //9891 #HANGUL SYLLABLE PIEUP I NIEUN
+ {0xBAF4, 0xBE4C}, //9892 #HANGUL SYLLABLE PIEUP I RIEUL
+ {0xBAF5, 0xBE4E}, //9893 #HANGUL SYLLABLE PIEUP I RIEULMIEUM
+ {0xBAF6, 0xBE54}, //9894 #HANGUL SYLLABLE PIEUP I MIEUM
+ {0xBAF7, 0xBE55}, //9895 #HANGUL SYLLABLE PIEUP I PIEUP
+ {0xBAF8, 0xBE57}, //9896 #HANGUL SYLLABLE PIEUP I SIOS
+ {0xBAF9, 0xBE59}, //9897 #HANGUL SYLLABLE PIEUP I IEUNG
+ {0xBAFA, 0xBE5A}, //9898 #HANGUL SYLLABLE PIEUP I CIEUC
+ {0xBAFB, 0xBE5B}, //9899 #HANGUL SYLLABLE PIEUP I CHIEUCH
+ {0xBAFC, 0xBE60}, //9900 #HANGUL SYLLABLE SSANGPIEUP A
+ {0xBAFD, 0xBE61}, //9901 #HANGUL SYLLABLE SSANGPIEUP A KIYEOK
+ {0xBAFE, 0xBE64}, //9902 #HANGUL SYLLABLE SSANGPIEUP A NIEUN
+ {0xBB41, 0xD2FB}, //9903 #HANGUL SYLLABLE THIEUTH I RIEULPIEUP
+ {0xBB42, 0xD2FC}, //9904 #HANGUL SYLLABLE THIEUTH I RIEULSIOS
+ {0xBB43, 0xD2FD}, //9905 #HANGUL SYLLABLE THIEUTH I RIEULTHIEUTH
+ {0xBB44, 0xD2FE}, //9906 #HANGUL SYLLABLE THIEUTH I RIEULPHIEUPH
+ {0xBB45, 0xD2FF}, //9907 #HANGUL SYLLABLE THIEUTH I RIEULHIEUH
+ {0xBB46, 0xD302}, //9908 #HANGUL SYLLABLE THIEUTH I PIEUPSIOS
+ {0xBB47, 0xD304}, //9909 #HANGUL SYLLABLE THIEUTH I SSANGSIOS
+ {0xBB48, 0xD306}, //9910 #HANGUL SYLLABLE THIEUTH I CIEUC
+ {0xBB49, 0xD307}, //9911 #HANGUL SYLLABLE THIEUTH I CHIEUCH
+ {0xBB4A, 0xD308}, //9912 #HANGUL SYLLABLE THIEUTH I KHIEUKH
+ {0xBB4B, 0xD309}, //9913 #HANGUL SYLLABLE THIEUTH I THIEUTH
+ {0xBB4C, 0xD30A}, //9914 #HANGUL SYLLABLE THIEUTH I PHIEUPH
+ {0xBB4D, 0xD30B}, //9915 #HANGUL SYLLABLE THIEUTH I HIEUH
+ {0xBB4E, 0xD30F}, //9916 #HANGUL SYLLABLE PHIEUPH A KIYEOKSIOS
+ {0xBB4F, 0xD311}, //9917 #HANGUL SYLLABLE PHIEUPH A NIEUNCIEUC
+ {0xBB50, 0xD312}, //9918 #HANGUL SYLLABLE PHIEUPH A NIEUNHIEUH
+ {0xBB51, 0xD313}, //9919 #HANGUL SYLLABLE PHIEUPH A TIKEUT
+ {0xBB52, 0xD315}, //9920 #HANGUL SYLLABLE PHIEUPH A RIEULKIYEOK
+ {0xBB53, 0xD317}, //9921 #HANGUL SYLLABLE PHIEUPH A RIEULPIEUP
+ {0xBB54, 0xD318}, //9922 #HANGUL SYLLABLE PHIEUPH A RIEULSIOS
+ {0xBB55, 0xD319}, //9923 #HANGUL SYLLABLE PHIEUPH A RIEULTHIEUTH
+ {0xBB56, 0xD31A}, //9924 #HANGUL SYLLABLE PHIEUPH A RIEULPHIEUPH
+ {0xBB57, 0xD31B}, //9925 #HANGUL SYLLABLE PHIEUPH A RIEULHIEUH
+ {0xBB58, 0xD31E}, //9926 #HANGUL SYLLABLE PHIEUPH A PIEUPSIOS
+ {0xBB59, 0xD322}, //9927 #HANGUL SYLLABLE PHIEUPH A CIEUC
+ {0xBB5A, 0xD323}, //9928 #HANGUL SYLLABLE PHIEUPH A CHIEUCH
+ {0xBB61, 0xD324}, //9929 #HANGUL SYLLABLE PHIEUPH A KHIEUKH
+ {0xBB62, 0xD326}, //9930 #HANGUL SYLLABLE PHIEUPH A PHIEUPH
+ {0xBB63, 0xD327}, //9931 #HANGUL SYLLABLE PHIEUPH A HIEUH
+ {0xBB64, 0xD32A}, //9932 #HANGUL SYLLABLE PHIEUPH AE SSANGKIYEOK
+ {0xBB65, 0xD32B}, //9933 #HANGUL SYLLABLE PHIEUPH AE KIYEOKSIOS
+ {0xBB66, 0xD32D}, //9934 #HANGUL SYLLABLE PHIEUPH AE NIEUNCIEUC
+ {0xBB67, 0xD32E}, //9935 #HANGUL SYLLABLE PHIEUPH AE NIEUNHIEUH
+ {0xBB68, 0xD32F}, //9936 #HANGUL SYLLABLE PHIEUPH AE TIKEUT
+ {0xBB69, 0xD331}, //9937 #HANGUL SYLLABLE PHIEUPH AE RIEULKIYEOK
+ {0xBB6A, 0xD332}, //9938 #HANGUL SYLLABLE PHIEUPH AE RIEULMIEUM
+ {0xBB6B, 0xD333}, //9939 #HANGUL SYLLABLE PHIEUPH AE RIEULPIEUP
+ {0xBB6C, 0xD334}, //9940 #HANGUL SYLLABLE PHIEUPH AE RIEULSIOS
+ {0xBB6D, 0xD335}, //9941 #HANGUL SYLLABLE PHIEUPH AE RIEULTHIEUTH
+ {0xBB6E, 0xD336}, //9942 #HANGUL SYLLABLE PHIEUPH AE RIEULPHIEUPH
+ {0xBB6F, 0xD337}, //9943 #HANGUL SYLLABLE PHIEUPH AE RIEULHIEUH
+ {0xBB70, 0xD33A}, //9944 #HANGUL SYLLABLE PHIEUPH AE PIEUPSIOS
+ {0xBB71, 0xD33E}, //9945 #HANGUL SYLLABLE PHIEUPH AE CIEUC
+ {0xBB72, 0xD33F}, //9946 #HANGUL SYLLABLE PHIEUPH AE CHIEUCH
+ {0xBB73, 0xD340}, //9947 #HANGUL SYLLABLE PHIEUPH AE KHIEUKH
+ {0xBB74, 0xD341}, //9948 #HANGUL SYLLABLE PHIEUPH AE THIEUTH
+ {0xBB75, 0xD342}, //9949 #HANGUL SYLLABLE PHIEUPH AE PHIEUPH
+ {0xBB76, 0xD343}, //9950 #HANGUL SYLLABLE PHIEUPH AE HIEUH
+ {0xBB77, 0xD346}, //9951 #HANGUL SYLLABLE PHIEUPH YA SSANGKIYEOK
+ {0xBB78, 0xD347}, //9952 #HANGUL SYLLABLE PHIEUPH YA KIYEOKSIOS
+ {0xBB79, 0xD348}, //9953 #HANGUL SYLLABLE PHIEUPH YA NIEUN
+ {0xBB7A, 0xD349}, //9954 #HANGUL SYLLABLE PHIEUPH YA NIEUNCIEUC
+ {0xBB81, 0xD34A}, //9955 #HANGUL SYLLABLE PHIEUPH YA NIEUNHIEUH
+ {0xBB82, 0xD34B}, //9956 #HANGUL SYLLABLE PHIEUPH YA TIKEUT
+ {0xBB83, 0xD34C}, //9957 #HANGUL SYLLABLE PHIEUPH YA RIEUL
+ {0xBB84, 0xD34D}, //9958 #HANGUL SYLLABLE PHIEUPH YA RIEULKIYEOK
+ {0xBB85, 0xD34E}, //9959 #HANGUL SYLLABLE PHIEUPH YA RIEULMIEUM
+ {0xBB86, 0xD34F}, //9960 #HANGUL SYLLABLE PHIEUPH YA RIEULPIEUP
+ {0xBB87, 0xD350}, //9961 #HANGUL SYLLABLE PHIEUPH YA RIEULSIOS
+ {0xBB88, 0xD351}, //9962 #HANGUL SYLLABLE PHIEUPH YA RIEULTHIEUTH
+ {0xBB89, 0xD352}, //9963 #HANGUL SYLLABLE PHIEUPH YA RIEULPHIEUPH
+ {0xBB8A, 0xD353}, //9964 #HANGUL SYLLABLE PHIEUPH YA RIEULHIEUH
+ {0xBB8B, 0xD354}, //9965 #HANGUL SYLLABLE PHIEUPH YA MIEUM
+ {0xBB8C, 0xD355}, //9966 #HANGUL SYLLABLE PHIEUPH YA PIEUP
+ {0xBB8D, 0xD356}, //9967 #HANGUL SYLLABLE PHIEUPH YA PIEUPSIOS
+ {0xBB8E, 0xD357}, //9968 #HANGUL SYLLABLE PHIEUPH YA SIOS
+ {0xBB8F, 0xD358}, //9969 #HANGUL SYLLABLE PHIEUPH YA SSANGSIOS
+ {0xBB90, 0xD359}, //9970 #HANGUL SYLLABLE PHIEUPH YA IEUNG
+ {0xBB91, 0xD35A}, //9971 #HANGUL SYLLABLE PHIEUPH YA CIEUC
+ {0xBB92, 0xD35B}, //9972 #HANGUL SYLLABLE PHIEUPH YA CHIEUCH
+ {0xBB93, 0xD35C}, //9973 #HANGUL SYLLABLE PHIEUPH YA KHIEUKH
+ {0xBB94, 0xD35D}, //9974 #HANGUL SYLLABLE PHIEUPH YA THIEUTH
+ {0xBB95, 0xD35E}, //9975 #HANGUL SYLLABLE PHIEUPH YA PHIEUPH
+ {0xBB96, 0xD35F}, //9976 #HANGUL SYLLABLE PHIEUPH YA HIEUH
+ {0xBB97, 0xD360}, //9977 #HANGUL SYLLABLE PHIEUPH YAE
+ {0xBB98, 0xD361}, //9978 #HANGUL SYLLABLE PHIEUPH YAE KIYEOK
+ {0xBB99, 0xD362}, //9979 #HANGUL SYLLABLE PHIEUPH YAE SSANGKIYEOK
+ {0xBB9A, 0xD363}, //9980 #HANGUL SYLLABLE PHIEUPH YAE KIYEOKSIOS
+ {0xBB9B, 0xD364}, //9981 #HANGUL SYLLABLE PHIEUPH YAE NIEUN
+ {0xBB9C, 0xD365}, //9982 #HANGUL SYLLABLE PHIEUPH YAE NIEUNCIEUC
+ {0xBB9D, 0xD366}, //9983 #HANGUL SYLLABLE PHIEUPH YAE NIEUNHIEUH
+ {0xBB9E, 0xD367}, //9984 #HANGUL SYLLABLE PHIEUPH YAE TIKEUT
+ {0xBB9F, 0xD368}, //9985 #HANGUL SYLLABLE PHIEUPH YAE RIEUL
+ {0xBBA0, 0xD369}, //9986 #HANGUL SYLLABLE PHIEUPH YAE RIEULKIYEOK
+ {0xBBA1, 0xBE68}, //9987 #HANGUL SYLLABLE SSANGPIEUP A RIEUL
+ {0xBBA2, 0xBE6A}, //9988 #HANGUL SYLLABLE SSANGPIEUP A RIEULMIEUM
+ {0xBBA3, 0xBE70}, //9989 #HANGUL SYLLABLE SSANGPIEUP A MIEUM
+ {0xBBA4, 0xBE71}, //9990 #HANGUL SYLLABLE SSANGPIEUP A PIEUP
+ {0xBBA5, 0xBE73}, //9991 #HANGUL SYLLABLE SSANGPIEUP A SIOS
+ {0xBBA6, 0xBE74}, //9992 #HANGUL SYLLABLE SSANGPIEUP A SSANGSIOS
+ {0xBBA7, 0xBE75}, //9993 #HANGUL SYLLABLE SSANGPIEUP A IEUNG
+ {0xBBA8, 0xBE7B}, //9994 #HANGUL SYLLABLE SSANGPIEUP A HIEUH
+ {0xBBA9, 0xBE7C}, //9995 #HANGUL SYLLABLE SSANGPIEUP AE
+ {0xBBAA, 0xBE7D}, //9996 #HANGUL SYLLABLE SSANGPIEUP AE KIYEOK
+ {0xBBAB, 0xBE80}, //9997 #HANGUL SYLLABLE SSANGPIEUP AE NIEUN
+ {0xBBAC, 0xBE84}, //9998 #HANGUL SYLLABLE SSANGPIEUP AE RIEUL
+ {0xBBAD, 0xBE8C}, //9999 #HANGUL SYLLABLE SSANGPIEUP AE MIEUM
+ {0xBBAE, 0xBE8D}, //10000 #HANGUL SYLLABLE SSANGPIEUP AE PIEUP
+ {0xBBAF, 0xBE8F}, //10001 #HANGUL SYLLABLE SSANGPIEUP AE SIOS
+ {0xBBB0, 0xBE90}, //10002 #HANGUL SYLLABLE SSANGPIEUP AE SSANGSIOS
+ {0xBBB1, 0xBE91}, //10003 #HANGUL SYLLABLE SSANGPIEUP AE IEUNG
+ {0xBBB2, 0xBE98}, //10004 #HANGUL SYLLABLE SSANGPIEUP YA
+ {0xBBB3, 0xBE99}, //10005 #HANGUL SYLLABLE SSANGPIEUP YA KIYEOK
+ {0xBBB4, 0xBEA8}, //10006 #HANGUL SYLLABLE SSANGPIEUP YA MIEUM
+ {0xBBB5, 0xBED0}, //10007 #HANGUL SYLLABLE SSANGPIEUP EO
+ {0xBBB6, 0xBED1}, //10008 #HANGUL SYLLABLE SSANGPIEUP EO KIYEOK
+ {0xBBB7, 0xBED4}, //10009 #HANGUL SYLLABLE SSANGPIEUP EO NIEUN
+ {0xBBB8, 0xBED7}, //10010 #HANGUL SYLLABLE SSANGPIEUP EO TIKEUT
+ {0xBBB9, 0xBED8}, //10011 #HANGUL SYLLABLE SSANGPIEUP EO RIEUL
+ {0xBBBA, 0xBEE0}, //10012 #HANGUL SYLLABLE SSANGPIEUP EO MIEUM
+ {0xBBBB, 0xBEE3}, //10013 #HANGUL SYLLABLE SSANGPIEUP EO SIOS
+ {0xBBBC, 0xBEE4}, //10014 #HANGUL SYLLABLE SSANGPIEUP EO SSANGSIOS
+ {0xBBBD, 0xBEE5}, //10015 #HANGUL SYLLABLE SSANGPIEUP EO IEUNG
+ {0xBBBE, 0xBEEC}, //10016 #HANGUL SYLLABLE SSANGPIEUP E
+ {0xBBBF, 0xBF01}, //10017 #HANGUL SYLLABLE SSANGPIEUP E IEUNG
+ {0xBBC0, 0xBF08}, //10018 #HANGUL SYLLABLE SSANGPIEUP YEO
+ {0xBBC1, 0xBF09}, //10019 #HANGUL SYLLABLE SSANGPIEUP YEO KIYEOK
+ {0xBBC2, 0xBF18}, //10020 #HANGUL SYLLABLE SSANGPIEUP YEO MIEUM
+ {0xBBC3, 0xBF19}, //10021 #HANGUL SYLLABLE SSANGPIEUP YEO PIEUP
+ {0xBBC4, 0xBF1B}, //10022 #HANGUL SYLLABLE SSANGPIEUP YEO SIOS
+ {0xBBC5, 0xBF1C}, //10023 #HANGUL SYLLABLE SSANGPIEUP YEO SSANGSIOS
+ {0xBBC6, 0xBF1D}, //10024 #HANGUL SYLLABLE SSANGPIEUP YEO IEUNG
+ {0xBBC7, 0xBF40}, //10025 #HANGUL SYLLABLE SSANGPIEUP O
+ {0xBBC8, 0xBF41}, //10026 #HANGUL SYLLABLE SSANGPIEUP O KIYEOK
+ {0xBBC9, 0xBF44}, //10027 #HANGUL SYLLABLE SSANGPIEUP O NIEUN
+ {0xBBCA, 0xBF48}, //10028 #HANGUL SYLLABLE SSANGPIEUP O RIEUL
+ {0xBBCB, 0xBF50}, //10029 #HANGUL SYLLABLE SSANGPIEUP O MIEUM
+ {0xBBCC, 0xBF51}, //10030 #HANGUL SYLLABLE SSANGPIEUP O PIEUP
+ {0xBBCD, 0xBF55}, //10031 #HANGUL SYLLABLE SSANGPIEUP O IEUNG
+ {0xBBCE, 0xBF94}, //10032 #HANGUL SYLLABLE SSANGPIEUP OE
+ {0xBBCF, 0xBFB0}, //10033 #HANGUL SYLLABLE SSANGPIEUP YO
+ {0xBBD0, 0xBFC5}, //10034 #HANGUL SYLLABLE SSANGPIEUP YO IEUNG
+ {0xBBD1, 0xBFCC}, //10035 #HANGUL SYLLABLE SSANGPIEUP U
+ {0xBBD2, 0xBFCD}, //10036 #HANGUL SYLLABLE SSANGPIEUP U KIYEOK
+ {0xBBD3, 0xBFD0}, //10037 #HANGUL SYLLABLE SSANGPIEUP U NIEUN
+ {0xBBD4, 0xBFD4}, //10038 #HANGUL SYLLABLE SSANGPIEUP U RIEUL
+ {0xBBD5, 0xBFDC}, //10039 #HANGUL SYLLABLE SSANGPIEUP U MIEUM
+ {0xBBD6, 0xBFDF}, //10040 #HANGUL SYLLABLE SSANGPIEUP U SIOS
+ {0xBBD7, 0xBFE1}, //10041 #HANGUL SYLLABLE SSANGPIEUP U IEUNG
+ {0xBBD8, 0xC03C}, //10042 #HANGUL SYLLABLE SSANGPIEUP YU
+ {0xBBD9, 0xC051}, //10043 #HANGUL SYLLABLE SSANGPIEUP YU IEUNG
+ {0xBBDA, 0xC058}, //10044 #HANGUL SYLLABLE SSANGPIEUP EU
+ {0xBBDB, 0xC05C}, //10045 #HANGUL SYLLABLE SSANGPIEUP EU NIEUN
+ {0xBBDC, 0xC060}, //10046 #HANGUL SYLLABLE SSANGPIEUP EU RIEUL
+ {0xBBDD, 0xC068}, //10047 #HANGUL SYLLABLE SSANGPIEUP EU MIEUM
+ {0xBBDE, 0xC069}, //10048 #HANGUL SYLLABLE SSANGPIEUP EU PIEUP
+ {0xBBDF, 0xC090}, //10049 #HANGUL SYLLABLE SSANGPIEUP I
+ {0xBBE0, 0xC091}, //10050 #HANGUL SYLLABLE SSANGPIEUP I KIYEOK
+ {0xBBE1, 0xC094}, //10051 #HANGUL SYLLABLE SSANGPIEUP I NIEUN
+ {0xBBE2, 0xC098}, //10052 #HANGUL SYLLABLE SSANGPIEUP I RIEUL
+ {0xBBE3, 0xC0A0}, //10053 #HANGUL SYLLABLE SSANGPIEUP I MIEUM
+ {0xBBE4, 0xC0A1}, //10054 #HANGUL SYLLABLE SSANGPIEUP I PIEUP
+ {0xBBE5, 0xC0A3}, //10055 #HANGUL SYLLABLE SSANGPIEUP I SIOS
+ {0xBBE6, 0xC0A5}, //10056 #HANGUL SYLLABLE SSANGPIEUP I IEUNG
+ {0xBBE7, 0xC0AC}, //10057 #HANGUL SYLLABLE SIOS A
+ {0xBBE8, 0xC0AD}, //10058 #HANGUL SYLLABLE SIOS A KIYEOK
+ {0xBBE9, 0xC0AF}, //10059 #HANGUL SYLLABLE SIOS A KIYEOKSIOS
+ {0xBBEA, 0xC0B0}, //10060 #HANGUL SYLLABLE SIOS A NIEUN
+ {0xBBEB, 0xC0B3}, //10061 #HANGUL SYLLABLE SIOS A TIKEUT
+ {0xBBEC, 0xC0B4}, //10062 #HANGUL SYLLABLE SIOS A RIEUL
+ {0xBBED, 0xC0B5}, //10063 #HANGUL SYLLABLE SIOS A RIEULKIYEOK
+ {0xBBEE, 0xC0B6}, //10064 #HANGUL SYLLABLE SIOS A RIEULMIEUM
+ {0xBBEF, 0xC0BC}, //10065 #HANGUL SYLLABLE SIOS A MIEUM
+ {0xBBF0, 0xC0BD}, //10066 #HANGUL SYLLABLE SIOS A PIEUP
+ {0xBBF1, 0xC0BF}, //10067 #HANGUL SYLLABLE SIOS A SIOS
+ {0xBBF2, 0xC0C0}, //10068 #HANGUL SYLLABLE SIOS A SSANGSIOS
+ {0xBBF3, 0xC0C1}, //10069 #HANGUL SYLLABLE SIOS A IEUNG
+ {0xBBF4, 0xC0C5}, //10070 #HANGUL SYLLABLE SIOS A THIEUTH
+ {0xBBF5, 0xC0C8}, //10071 #HANGUL SYLLABLE SIOS AE
+ {0xBBF6, 0xC0C9}, //10072 #HANGUL SYLLABLE SIOS AE KIYEOK
+ {0xBBF7, 0xC0CC}, //10073 #HANGUL SYLLABLE SIOS AE NIEUN
+ {0xBBF8, 0xC0D0}, //10074 #HANGUL SYLLABLE SIOS AE RIEUL
+ {0xBBF9, 0xC0D8}, //10075 #HANGUL SYLLABLE SIOS AE MIEUM
+ {0xBBFA, 0xC0D9}, //10076 #HANGUL SYLLABLE SIOS AE PIEUP
+ {0xBBFB, 0xC0DB}, //10077 #HANGUL SYLLABLE SIOS AE SIOS
+ {0xBBFC, 0xC0DC}, //10078 #HANGUL SYLLABLE SIOS AE SSANGSIOS
+ {0xBBFD, 0xC0DD}, //10079 #HANGUL SYLLABLE SIOS AE IEUNG
+ {0xBBFE, 0xC0E4}, //10080 #HANGUL SYLLABLE SIOS YA
+ {0xBC41, 0xD36A}, //10081 #HANGUL SYLLABLE PHIEUPH YAE RIEULMIEUM
+ {0xBC42, 0xD36B}, //10082 #HANGUL SYLLABLE PHIEUPH YAE RIEULPIEUP
+ {0xBC43, 0xD36C}, //10083 #HANGUL SYLLABLE PHIEUPH YAE RIEULSIOS
+ {0xBC44, 0xD36D}, //10084 #HANGUL SYLLABLE PHIEUPH YAE RIEULTHIEUTH
+ {0xBC45, 0xD36E}, //10085 #HANGUL SYLLABLE PHIEUPH YAE RIEULPHIEUPH
+ {0xBC46, 0xD36F}, //10086 #HANGUL SYLLABLE PHIEUPH YAE RIEULHIEUH
+ {0xBC47, 0xD370}, //10087 #HANGUL SYLLABLE PHIEUPH YAE MIEUM
+ {0xBC48, 0xD371}, //10088 #HANGUL SYLLABLE PHIEUPH YAE PIEUP
+ {0xBC49, 0xD372}, //10089 #HANGUL SYLLABLE PHIEUPH YAE PIEUPSIOS
+ {0xBC4A, 0xD373}, //10090 #HANGUL SYLLABLE PHIEUPH YAE SIOS
+ {0xBC4B, 0xD374}, //10091 #HANGUL SYLLABLE PHIEUPH YAE SSANGSIOS
+ {0xBC4C, 0xD375}, //10092 #HANGUL SYLLABLE PHIEUPH YAE IEUNG
+ {0xBC4D, 0xD376}, //10093 #HANGUL SYLLABLE PHIEUPH YAE CIEUC
+ {0xBC4E, 0xD377}, //10094 #HANGUL SYLLABLE PHIEUPH YAE CHIEUCH
+ {0xBC4F, 0xD378}, //10095 #HANGUL SYLLABLE PHIEUPH YAE KHIEUKH
+ {0xBC50, 0xD379}, //10096 #HANGUL SYLLABLE PHIEUPH YAE THIEUTH
+ {0xBC51, 0xD37A}, //10097 #HANGUL SYLLABLE PHIEUPH YAE PHIEUPH
+ {0xBC52, 0xD37B}, //10098 #HANGUL SYLLABLE PHIEUPH YAE HIEUH
+ {0xBC53, 0xD37E}, //10099 #HANGUL SYLLABLE PHIEUPH EO SSANGKIYEOK
+ {0xBC54, 0xD37F}, //10100 #HANGUL SYLLABLE PHIEUPH EO KIYEOKSIOS
+ {0xBC55, 0xD381}, //10101 #HANGUL SYLLABLE PHIEUPH EO NIEUNCIEUC
+ {0xBC56, 0xD382}, //10102 #HANGUL SYLLABLE PHIEUPH EO NIEUNHIEUH
+ {0xBC57, 0xD383}, //10103 #HANGUL SYLLABLE PHIEUPH EO TIKEUT
+ {0xBC58, 0xD385}, //10104 #HANGUL SYLLABLE PHIEUPH EO RIEULKIYEOK
+ {0xBC59, 0xD386}, //10105 #HANGUL SYLLABLE PHIEUPH EO RIEULMIEUM
+ {0xBC5A, 0xD387}, //10106 #HANGUL SYLLABLE PHIEUPH EO RIEULPIEUP
+ {0xBC61, 0xD388}, //10107 #HANGUL SYLLABLE PHIEUPH EO RIEULSIOS
+ {0xBC62, 0xD389}, //10108 #HANGUL SYLLABLE PHIEUPH EO RIEULTHIEUTH
+ {0xBC63, 0xD38A}, //10109 #HANGUL SYLLABLE PHIEUPH EO RIEULPHIEUPH
+ {0xBC64, 0xD38B}, //10110 #HANGUL SYLLABLE PHIEUPH EO RIEULHIEUH
+ {0xBC65, 0xD38E}, //10111 #HANGUL SYLLABLE PHIEUPH EO PIEUPSIOS
+ {0xBC66, 0xD392}, //10112 #HANGUL SYLLABLE PHIEUPH EO CIEUC
+ {0xBC67, 0xD393}, //10113 #HANGUL SYLLABLE PHIEUPH EO CHIEUCH
+ {0xBC68, 0xD394}, //10114 #HANGUL SYLLABLE PHIEUPH EO KHIEUKH
+ {0xBC69, 0xD395}, //10115 #HANGUL SYLLABLE PHIEUPH EO THIEUTH
+ {0xBC6A, 0xD396}, //10116 #HANGUL SYLLABLE PHIEUPH EO PHIEUPH
+ {0xBC6B, 0xD397}, //10117 #HANGUL SYLLABLE PHIEUPH EO HIEUH
+ {0xBC6C, 0xD39A}, //10118 #HANGUL SYLLABLE PHIEUPH E SSANGKIYEOK
+ {0xBC6D, 0xD39B}, //10119 #HANGUL SYLLABLE PHIEUPH E KIYEOKSIOS
+ {0xBC6E, 0xD39D}, //10120 #HANGUL SYLLABLE PHIEUPH E NIEUNCIEUC
+ {0xBC6F, 0xD39E}, //10121 #HANGUL SYLLABLE PHIEUPH E NIEUNHIEUH
+ {0xBC70, 0xD39F}, //10122 #HANGUL SYLLABLE PHIEUPH E TIKEUT
+ {0xBC71, 0xD3A1}, //10123 #HANGUL SYLLABLE PHIEUPH E RIEULKIYEOK
+ {0xBC72, 0xD3A2}, //10124 #HANGUL SYLLABLE PHIEUPH E RIEULMIEUM
+ {0xBC73, 0xD3A3}, //10125 #HANGUL SYLLABLE PHIEUPH E RIEULPIEUP
+ {0xBC74, 0xD3A4}, //10126 #HANGUL SYLLABLE PHIEUPH E RIEULSIOS
+ {0xBC75, 0xD3A5}, //10127 #HANGUL SYLLABLE PHIEUPH E RIEULTHIEUTH
+ {0xBC76, 0xD3A6}, //10128 #HANGUL SYLLABLE PHIEUPH E RIEULPHIEUPH
+ {0xBC77, 0xD3A7}, //10129 #HANGUL SYLLABLE PHIEUPH E RIEULHIEUH
+ {0xBC78, 0xD3AA}, //10130 #HANGUL SYLLABLE PHIEUPH E PIEUPSIOS
+ {0xBC79, 0xD3AC}, //10131 #HANGUL SYLLABLE PHIEUPH E SSANGSIOS
+ {0xBC7A, 0xD3AE}, //10132 #HANGUL SYLLABLE PHIEUPH E CIEUC
+ {0xBC81, 0xD3AF}, //10133 #HANGUL SYLLABLE PHIEUPH E CHIEUCH
+ {0xBC82, 0xD3B0}, //10134 #HANGUL SYLLABLE PHIEUPH E KHIEUKH
+ {0xBC83, 0xD3B1}, //10135 #HANGUL SYLLABLE PHIEUPH E THIEUTH
+ {0xBC84, 0xD3B2}, //10136 #HANGUL SYLLABLE PHIEUPH E PHIEUPH
+ {0xBC85, 0xD3B3}, //10137 #HANGUL SYLLABLE PHIEUPH E HIEUH
+ {0xBC86, 0xD3B5}, //10138 #HANGUL SYLLABLE PHIEUPH YEO KIYEOK
+ {0xBC87, 0xD3B6}, //10139 #HANGUL SYLLABLE PHIEUPH YEO SSANGKIYEOK
+ {0xBC88, 0xD3B7}, //10140 #HANGUL SYLLABLE PHIEUPH YEO KIYEOKSIOS
+ {0xBC89, 0xD3B9}, //10141 #HANGUL SYLLABLE PHIEUPH YEO NIEUNCIEUC
+ {0xBC8A, 0xD3BA}, //10142 #HANGUL SYLLABLE PHIEUPH YEO NIEUNHIEUH
+ {0xBC8B, 0xD3BB}, //10143 #HANGUL SYLLABLE PHIEUPH YEO TIKEUT
+ {0xBC8C, 0xD3BD}, //10144 #HANGUL SYLLABLE PHIEUPH YEO RIEULKIYEOK
+ {0xBC8D, 0xD3BE}, //10145 #HANGUL SYLLABLE PHIEUPH YEO RIEULMIEUM
+ {0xBC8E, 0xD3BF}, //10146 #HANGUL SYLLABLE PHIEUPH YEO RIEULPIEUP
+ {0xBC8F, 0xD3C0}, //10147 #HANGUL SYLLABLE PHIEUPH YEO RIEULSIOS
+ {0xBC90, 0xD3C1}, //10148 #HANGUL SYLLABLE PHIEUPH YEO RIEULTHIEUTH
+ {0xBC91, 0xD3C2}, //10149 #HANGUL SYLLABLE PHIEUPH YEO RIEULPHIEUPH
+ {0xBC92, 0xD3C3}, //10150 #HANGUL SYLLABLE PHIEUPH YEO RIEULHIEUH
+ {0xBC93, 0xD3C6}, //10151 #HANGUL SYLLABLE PHIEUPH YEO PIEUPSIOS
+ {0xBC94, 0xD3C7}, //10152 #HANGUL SYLLABLE PHIEUPH YEO SIOS
+ {0xBC95, 0xD3CA}, //10153 #HANGUL SYLLABLE PHIEUPH YEO CIEUC
+ {0xBC96, 0xD3CB}, //10154 #HANGUL SYLLABLE PHIEUPH YEO CHIEUCH
+ {0xBC97, 0xD3CC}, //10155 #HANGUL SYLLABLE PHIEUPH YEO KHIEUKH
+ {0xBC98, 0xD3CD}, //10156 #HANGUL SYLLABLE PHIEUPH YEO THIEUTH
+ {0xBC99, 0xD3CE}, //10157 #HANGUL SYLLABLE PHIEUPH YEO PHIEUPH
+ {0xBC9A, 0xD3CF}, //10158 #HANGUL SYLLABLE PHIEUPH YEO HIEUH
+ {0xBC9B, 0xD3D1}, //10159 #HANGUL SYLLABLE PHIEUPH YE KIYEOK
+ {0xBC9C, 0xD3D2}, //10160 #HANGUL SYLLABLE PHIEUPH YE SSANGKIYEOK
+ {0xBC9D, 0xD3D3}, //10161 #HANGUL SYLLABLE PHIEUPH YE KIYEOKSIOS
+ {0xBC9E, 0xD3D4}, //10162 #HANGUL SYLLABLE PHIEUPH YE NIEUN
+ {0xBC9F, 0xD3D5}, //10163 #HANGUL SYLLABLE PHIEUPH YE NIEUNCIEUC
+ {0xBCA0, 0xD3D6}, //10164 #HANGUL SYLLABLE PHIEUPH YE NIEUNHIEUH
+ {0xBCA1, 0xC0E5}, //10165 #HANGUL SYLLABLE SIOS YA KIYEOK
+ {0xBCA2, 0xC0E8}, //10166 #HANGUL SYLLABLE SIOS YA NIEUN
+ {0xBCA3, 0xC0EC}, //10167 #HANGUL SYLLABLE SIOS YA RIEUL
+ {0xBCA4, 0xC0F4}, //10168 #HANGUL SYLLABLE SIOS YA MIEUM
+ {0xBCA5, 0xC0F5}, //10169 #HANGUL SYLLABLE SIOS YA PIEUP
+ {0xBCA6, 0xC0F7}, //10170 #HANGUL SYLLABLE SIOS YA SIOS
+ {0xBCA7, 0xC0F9}, //10171 #HANGUL SYLLABLE SIOS YA IEUNG
+ {0xBCA8, 0xC100}, //10172 #HANGUL SYLLABLE SIOS YAE
+ {0xBCA9, 0xC104}, //10173 #HANGUL SYLLABLE SIOS YAE NIEUN
+ {0xBCAA, 0xC108}, //10174 #HANGUL SYLLABLE SIOS YAE RIEUL
+ {0xBCAB, 0xC110}, //10175 #HANGUL SYLLABLE SIOS YAE MIEUM
+ {0xBCAC, 0xC115}, //10176 #HANGUL SYLLABLE SIOS YAE IEUNG
+ {0xBCAD, 0xC11C}, //10177 #HANGUL SYLLABLE SIOS EO
+ {0xBCAE, 0xC11D}, //10178 #HANGUL SYLLABLE SIOS EO KIYEOK
+ {0xBCAF, 0xC11E}, //10179 #HANGUL SYLLABLE SIOS EO SSANGKIYEOK
+ {0xBCB0, 0xC11F}, //10180 #HANGUL SYLLABLE SIOS EO KIYEOKSIOS
+ {0xBCB1, 0xC120}, //10181 #HANGUL SYLLABLE SIOS EO NIEUN
+ {0xBCB2, 0xC123}, //10182 #HANGUL SYLLABLE SIOS EO TIKEUT
+ {0xBCB3, 0xC124}, //10183 #HANGUL SYLLABLE SIOS EO RIEUL
+ {0xBCB4, 0xC126}, //10184 #HANGUL SYLLABLE SIOS EO RIEULMIEUM
+ {0xBCB5, 0xC127}, //10185 #HANGUL SYLLABLE SIOS EO RIEULPIEUP
+ {0xBCB6, 0xC12C}, //10186 #HANGUL SYLLABLE SIOS EO MIEUM
+ {0xBCB7, 0xC12D}, //10187 #HANGUL SYLLABLE SIOS EO PIEUP
+ {0xBCB8, 0xC12F}, //10188 #HANGUL SYLLABLE SIOS EO SIOS
+ {0xBCB9, 0xC130}, //10189 #HANGUL SYLLABLE SIOS EO SSANGSIOS
+ {0xBCBA, 0xC131}, //10190 #HANGUL SYLLABLE SIOS EO IEUNG
+ {0xBCBB, 0xC136}, //10191 #HANGUL SYLLABLE SIOS EO PHIEUPH
+ {0xBCBC, 0xC138}, //10192 #HANGUL SYLLABLE SIOS E
+ {0xBCBD, 0xC139}, //10193 #HANGUL SYLLABLE SIOS E KIYEOK
+ {0xBCBE, 0xC13C}, //10194 #HANGUL SYLLABLE SIOS E NIEUN
+ {0xBCBF, 0xC140}, //10195 #HANGUL SYLLABLE SIOS E RIEUL
+ {0xBCC0, 0xC148}, //10196 #HANGUL SYLLABLE SIOS E MIEUM
+ {0xBCC1, 0xC149}, //10197 #HANGUL SYLLABLE SIOS E PIEUP
+ {0xBCC2, 0xC14B}, //10198 #HANGUL SYLLABLE SIOS E SIOS
+ {0xBCC3, 0xC14C}, //10199 #HANGUL SYLLABLE SIOS E SSANGSIOS
+ {0xBCC4, 0xC14D}, //10200 #HANGUL SYLLABLE SIOS E IEUNG
+ {0xBCC5, 0xC154}, //10201 #HANGUL SYLLABLE SIOS YEO
+ {0xBCC6, 0xC155}, //10202 #HANGUL SYLLABLE SIOS YEO KIYEOK
+ {0xBCC7, 0xC158}, //10203 #HANGUL SYLLABLE SIOS YEO NIEUN
+ {0xBCC8, 0xC15C}, //10204 #HANGUL SYLLABLE SIOS YEO RIEUL
+ {0xBCC9, 0xC164}, //10205 #HANGUL SYLLABLE SIOS YEO MIEUM
+ {0xBCCA, 0xC165}, //10206 #HANGUL SYLLABLE SIOS YEO PIEUP
+ {0xBCCB, 0xC167}, //10207 #HANGUL SYLLABLE SIOS YEO SIOS
+ {0xBCCC, 0xC168}, //10208 #HANGUL SYLLABLE SIOS YEO SSANGSIOS
+ {0xBCCD, 0xC169}, //10209 #HANGUL SYLLABLE SIOS YEO IEUNG
+ {0xBCCE, 0xC170}, //10210 #HANGUL SYLLABLE SIOS YE
+ {0xBCCF, 0xC174}, //10211 #HANGUL SYLLABLE SIOS YE NIEUN
+ {0xBCD0, 0xC178}, //10212 #HANGUL SYLLABLE SIOS YE RIEUL
+ {0xBCD1, 0xC185}, //10213 #HANGUL SYLLABLE SIOS YE IEUNG
+ {0xBCD2, 0xC18C}, //10214 #HANGUL SYLLABLE SIOS O
+ {0xBCD3, 0xC18D}, //10215 #HANGUL SYLLABLE SIOS O KIYEOK
+ {0xBCD4, 0xC18E}, //10216 #HANGUL SYLLABLE SIOS O SSANGKIYEOK
+ {0xBCD5, 0xC190}, //10217 #HANGUL SYLLABLE SIOS O NIEUN
+ {0xBCD6, 0xC194}, //10218 #HANGUL SYLLABLE SIOS O RIEUL
+ {0xBCD7, 0xC196}, //10219 #HANGUL SYLLABLE SIOS O RIEULMIEUM
+ {0xBCD8, 0xC19C}, //10220 #HANGUL SYLLABLE SIOS O MIEUM
+ {0xBCD9, 0xC19D}, //10221 #HANGUL SYLLABLE SIOS O PIEUP
+ {0xBCDA, 0xC19F}, //10222 #HANGUL SYLLABLE SIOS O SIOS
+ {0xBCDB, 0xC1A1}, //10223 #HANGUL SYLLABLE SIOS O IEUNG
+ {0xBCDC, 0xC1A5}, //10224 #HANGUL SYLLABLE SIOS O THIEUTH
+ {0xBCDD, 0xC1A8}, //10225 #HANGUL SYLLABLE SIOS WA
+ {0xBCDE, 0xC1A9}, //10226 #HANGUL SYLLABLE SIOS WA KIYEOK
+ {0xBCDF, 0xC1AC}, //10227 #HANGUL SYLLABLE SIOS WA NIEUN
+ {0xBCE0, 0xC1B0}, //10228 #HANGUL SYLLABLE SIOS WA RIEUL
+ {0xBCE1, 0xC1BD}, //10229 #HANGUL SYLLABLE SIOS WA IEUNG
+ {0xBCE2, 0xC1C4}, //10230 #HANGUL SYLLABLE SIOS WAE
+ {0xBCE3, 0xC1C8}, //10231 #HANGUL SYLLABLE SIOS WAE NIEUN
+ {0xBCE4, 0xC1CC}, //10232 #HANGUL SYLLABLE SIOS WAE RIEUL
+ {0xBCE5, 0xC1D4}, //10233 #HANGUL SYLLABLE SIOS WAE MIEUM
+ {0xBCE6, 0xC1D7}, //10234 #HANGUL SYLLABLE SIOS WAE SIOS
+ {0xBCE7, 0xC1D8}, //10235 #HANGUL SYLLABLE SIOS WAE SSANGSIOS
+ {0xBCE8, 0xC1E0}, //10236 #HANGUL SYLLABLE SIOS OE
+ {0xBCE9, 0xC1E4}, //10237 #HANGUL SYLLABLE SIOS OE NIEUN
+ {0xBCEA, 0xC1E8}, //10238 #HANGUL SYLLABLE SIOS OE RIEUL
+ {0xBCEB, 0xC1F0}, //10239 #HANGUL SYLLABLE SIOS OE MIEUM
+ {0xBCEC, 0xC1F1}, //10240 #HANGUL SYLLABLE SIOS OE PIEUP
+ {0xBCED, 0xC1F3}, //10241 #HANGUL SYLLABLE SIOS OE SIOS
+ {0xBCEE, 0xC1FC}, //10242 #HANGUL SYLLABLE SIOS YO
+ {0xBCEF, 0xC1FD}, //10243 #HANGUL SYLLABLE SIOS YO KIYEOK
+ {0xBCF0, 0xC200}, //10244 #HANGUL SYLLABLE SIOS YO NIEUN
+ {0xBCF1, 0xC204}, //10245 #HANGUL SYLLABLE SIOS YO RIEUL
+ {0xBCF2, 0xC20C}, //10246 #HANGUL SYLLABLE SIOS YO MIEUM
+ {0xBCF3, 0xC20D}, //10247 #HANGUL SYLLABLE SIOS YO PIEUP
+ {0xBCF4, 0xC20F}, //10248 #HANGUL SYLLABLE SIOS YO SIOS
+ {0xBCF5, 0xC211}, //10249 #HANGUL SYLLABLE SIOS YO IEUNG
+ {0xBCF6, 0xC218}, //10250 #HANGUL SYLLABLE SIOS U
+ {0xBCF7, 0xC219}, //10251 #HANGUL SYLLABLE SIOS U KIYEOK
+ {0xBCF8, 0xC21C}, //10252 #HANGUL SYLLABLE SIOS U NIEUN
+ {0xBCF9, 0xC21F}, //10253 #HANGUL SYLLABLE SIOS U TIKEUT
+ {0xBCFA, 0xC220}, //10254 #HANGUL SYLLABLE SIOS U RIEUL
+ {0xBCFB, 0xC228}, //10255 #HANGUL SYLLABLE SIOS U MIEUM
+ {0xBCFC, 0xC229}, //10256 #HANGUL SYLLABLE SIOS U PIEUP
+ {0xBCFD, 0xC22B}, //10257 #HANGUL SYLLABLE SIOS U SIOS
+ {0xBCFE, 0xC22D}, //10258 #HANGUL SYLLABLE SIOS U IEUNG
+ {0xBD41, 0xD3D7}, //10259 #HANGUL SYLLABLE PHIEUPH YE TIKEUT
+ {0xBD42, 0xD3D9}, //10260 #HANGUL SYLLABLE PHIEUPH YE RIEULKIYEOK
+ {0xBD43, 0xD3DA}, //10261 #HANGUL SYLLABLE PHIEUPH YE RIEULMIEUM
+ {0xBD44, 0xD3DB}, //10262 #HANGUL SYLLABLE PHIEUPH YE RIEULPIEUP
+ {0xBD45, 0xD3DC}, //10263 #HANGUL SYLLABLE PHIEUPH YE RIEULSIOS
+ {0xBD46, 0xD3DD}, //10264 #HANGUL SYLLABLE PHIEUPH YE RIEULTHIEUTH
+ {0xBD47, 0xD3DE}, //10265 #HANGUL SYLLABLE PHIEUPH YE RIEULPHIEUPH
+ {0xBD48, 0xD3DF}, //10266 #HANGUL SYLLABLE PHIEUPH YE RIEULHIEUH
+ {0xBD49, 0xD3E0}, //10267 #HANGUL SYLLABLE PHIEUPH YE MIEUM
+ {0xBD4A, 0xD3E2}, //10268 #HANGUL SYLLABLE PHIEUPH YE PIEUPSIOS
+ {0xBD4B, 0xD3E4}, //10269 #HANGUL SYLLABLE PHIEUPH YE SSANGSIOS
+ {0xBD4C, 0xD3E5}, //10270 #HANGUL SYLLABLE PHIEUPH YE IEUNG
+ {0xBD4D, 0xD3E6}, //10271 #HANGUL SYLLABLE PHIEUPH YE CIEUC
+ {0xBD4E, 0xD3E7}, //10272 #HANGUL SYLLABLE PHIEUPH YE CHIEUCH
+ {0xBD4F, 0xD3E8}, //10273 #HANGUL SYLLABLE PHIEUPH YE KHIEUKH
+ {0xBD50, 0xD3E9}, //10274 #HANGUL SYLLABLE PHIEUPH YE THIEUTH
+ {0xBD51, 0xD3EA}, //10275 #HANGUL SYLLABLE PHIEUPH YE PHIEUPH
+ {0xBD52, 0xD3EB}, //10276 #HANGUL SYLLABLE PHIEUPH YE HIEUH
+ {0xBD53, 0xD3EE}, //10277 #HANGUL SYLLABLE PHIEUPH O SSANGKIYEOK
+ {0xBD54, 0xD3EF}, //10278 #HANGUL SYLLABLE PHIEUPH O KIYEOKSIOS
+ {0xBD55, 0xD3F1}, //10279 #HANGUL SYLLABLE PHIEUPH O NIEUNCIEUC
+ {0xBD56, 0xD3F2}, //10280 #HANGUL SYLLABLE PHIEUPH O NIEUNHIEUH
+ {0xBD57, 0xD3F3}, //10281 #HANGUL SYLLABLE PHIEUPH O TIKEUT
+ {0xBD58, 0xD3F5}, //10282 #HANGUL SYLLABLE PHIEUPH O RIEULKIYEOK
+ {0xBD59, 0xD3F6}, //10283 #HANGUL SYLLABLE PHIEUPH O RIEULMIEUM
+ {0xBD5A, 0xD3F7}, //10284 #HANGUL SYLLABLE PHIEUPH O RIEULPIEUP
+ {0xBD61, 0xD3F8}, //10285 #HANGUL SYLLABLE PHIEUPH O RIEULSIOS
+ {0xBD62, 0xD3F9}, //10286 #HANGUL SYLLABLE PHIEUPH O RIEULTHIEUTH
+ {0xBD63, 0xD3FA}, //10287 #HANGUL SYLLABLE PHIEUPH O RIEULPHIEUPH
+ {0xBD64, 0xD3FB}, //10288 #HANGUL SYLLABLE PHIEUPH O RIEULHIEUH
+ {0xBD65, 0xD3FE}, //10289 #HANGUL SYLLABLE PHIEUPH O PIEUPSIOS
+ {0xBD66, 0xD400}, //10290 #HANGUL SYLLABLE PHIEUPH O SSANGSIOS
+ {0xBD67, 0xD402}, //10291 #HANGUL SYLLABLE PHIEUPH O CIEUC
+ {0xBD68, 0xD403}, //10292 #HANGUL SYLLABLE PHIEUPH O CHIEUCH
+ {0xBD69, 0xD404}, //10293 #HANGUL SYLLABLE PHIEUPH O KHIEUKH
+ {0xBD6A, 0xD405}, //10294 #HANGUL SYLLABLE PHIEUPH O THIEUTH
+ {0xBD6B, 0xD406}, //10295 #HANGUL SYLLABLE PHIEUPH O PHIEUPH
+ {0xBD6C, 0xD407}, //10296 #HANGUL SYLLABLE PHIEUPH O HIEUH
+ {0xBD6D, 0xD409}, //10297 #HANGUL SYLLABLE PHIEUPH WA KIYEOK
+ {0xBD6E, 0xD40A}, //10298 #HANGUL SYLLABLE PHIEUPH WA SSANGKIYEOK
+ {0xBD6F, 0xD40B}, //10299 #HANGUL SYLLABLE PHIEUPH WA KIYEOKSIOS
+ {0xBD70, 0xD40C}, //10300 #HANGUL SYLLABLE PHIEUPH WA NIEUN
+ {0xBD71, 0xD40D}, //10301 #HANGUL SYLLABLE PHIEUPH WA NIEUNCIEUC
+ {0xBD72, 0xD40E}, //10302 #HANGUL SYLLABLE PHIEUPH WA NIEUNHIEUH
+ {0xBD73, 0xD40F}, //10303 #HANGUL SYLLABLE PHIEUPH WA TIKEUT
+ {0xBD74, 0xD410}, //10304 #HANGUL SYLLABLE PHIEUPH WA RIEUL
+ {0xBD75, 0xD411}, //10305 #HANGUL SYLLABLE PHIEUPH WA RIEULKIYEOK
+ {0xBD76, 0xD412}, //10306 #HANGUL SYLLABLE PHIEUPH WA RIEULMIEUM
+ {0xBD77, 0xD413}, //10307 #HANGUL SYLLABLE PHIEUPH WA RIEULPIEUP
+ {0xBD78, 0xD414}, //10308 #HANGUL SYLLABLE PHIEUPH WA RIEULSIOS
+ {0xBD79, 0xD415}, //10309 #HANGUL SYLLABLE PHIEUPH WA RIEULTHIEUTH
+ {0xBD7A, 0xD416}, //10310 #HANGUL SYLLABLE PHIEUPH WA RIEULPHIEUPH
+ {0xBD81, 0xD417}, //10311 #HANGUL SYLLABLE PHIEUPH WA RIEULHIEUH
+ {0xBD82, 0xD418}, //10312 #HANGUL SYLLABLE PHIEUPH WA MIEUM
+ {0xBD83, 0xD419}, //10313 #HANGUL SYLLABLE PHIEUPH WA PIEUP
+ {0xBD84, 0xD41A}, //10314 #HANGUL SYLLABLE PHIEUPH WA PIEUPSIOS
+ {0xBD85, 0xD41B}, //10315 #HANGUL SYLLABLE PHIEUPH WA SIOS
+ {0xBD86, 0xD41C}, //10316 #HANGUL SYLLABLE PHIEUPH WA SSANGSIOS
+ {0xBD87, 0xD41E}, //10317 #HANGUL SYLLABLE PHIEUPH WA CIEUC
+ {0xBD88, 0xD41F}, //10318 #HANGUL SYLLABLE PHIEUPH WA CHIEUCH
+ {0xBD89, 0xD420}, //10319 #HANGUL SYLLABLE PHIEUPH WA KHIEUKH
+ {0xBD8A, 0xD421}, //10320 #HANGUL SYLLABLE PHIEUPH WA THIEUTH
+ {0xBD8B, 0xD422}, //10321 #HANGUL SYLLABLE PHIEUPH WA PHIEUPH
+ {0xBD8C, 0xD423}, //10322 #HANGUL SYLLABLE PHIEUPH WA HIEUH
+ {0xBD8D, 0xD424}, //10323 #HANGUL SYLLABLE PHIEUPH WAE
+ {0xBD8E, 0xD425}, //10324 #HANGUL SYLLABLE PHIEUPH WAE KIYEOK
+ {0xBD8F, 0xD426}, //10325 #HANGUL SYLLABLE PHIEUPH WAE SSANGKIYEOK
+ {0xBD90, 0xD427}, //10326 #HANGUL SYLLABLE PHIEUPH WAE KIYEOKSIOS
+ {0xBD91, 0xD428}, //10327 #HANGUL SYLLABLE PHIEUPH WAE NIEUN
+ {0xBD92, 0xD429}, //10328 #HANGUL SYLLABLE PHIEUPH WAE NIEUNCIEUC
+ {0xBD93, 0xD42A}, //10329 #HANGUL SYLLABLE PHIEUPH WAE NIEUNHIEUH
+ {0xBD94, 0xD42B}, //10330 #HANGUL SYLLABLE PHIEUPH WAE TIKEUT
+ {0xBD95, 0xD42C}, //10331 #HANGUL SYLLABLE PHIEUPH WAE RIEUL
+ {0xBD96, 0xD42D}, //10332 #HANGUL SYLLABLE PHIEUPH WAE RIEULKIYEOK
+ {0xBD97, 0xD42E}, //10333 #HANGUL SYLLABLE PHIEUPH WAE RIEULMIEUM
+ {0xBD98, 0xD42F}, //10334 #HANGUL SYLLABLE PHIEUPH WAE RIEULPIEUP
+ {0xBD99, 0xD430}, //10335 #HANGUL SYLLABLE PHIEUPH WAE RIEULSIOS
+ {0xBD9A, 0xD431}, //10336 #HANGUL SYLLABLE PHIEUPH WAE RIEULTHIEUTH
+ {0xBD9B, 0xD432}, //10337 #HANGUL SYLLABLE PHIEUPH WAE RIEULPHIEUPH
+ {0xBD9C, 0xD433}, //10338 #HANGUL SYLLABLE PHIEUPH WAE RIEULHIEUH
+ {0xBD9D, 0xD434}, //10339 #HANGUL SYLLABLE PHIEUPH WAE MIEUM
+ {0xBD9E, 0xD435}, //10340 #HANGUL SYLLABLE PHIEUPH WAE PIEUP
+ {0xBD9F, 0xD436}, //10341 #HANGUL SYLLABLE PHIEUPH WAE PIEUPSIOS
+ {0xBDA0, 0xD437}, //10342 #HANGUL SYLLABLE PHIEUPH WAE SIOS
+ {0xBDA1, 0xC22F}, //10343 #HANGUL SYLLABLE SIOS U CHIEUCH
+ {0xBDA2, 0xC231}, //10344 #HANGUL SYLLABLE SIOS U THIEUTH
+ {0xBDA3, 0xC232}, //10345 #HANGUL SYLLABLE SIOS U PHIEUPH
+ {0xBDA4, 0xC234}, //10346 #HANGUL SYLLABLE SIOS WEO
+ {0xBDA5, 0xC248}, //10347 #HANGUL SYLLABLE SIOS WEO SSANGSIOS
+ {0xBDA6, 0xC250}, //10348 #HANGUL SYLLABLE SIOS WE
+ {0xBDA7, 0xC251}, //10349 #HANGUL SYLLABLE SIOS WE KIYEOK
+ {0xBDA8, 0xC254}, //10350 #HANGUL SYLLABLE SIOS WE NIEUN
+ {0xBDA9, 0xC258}, //10351 #HANGUL SYLLABLE SIOS WE RIEUL
+ {0xBDAA, 0xC260}, //10352 #HANGUL SYLLABLE SIOS WE MIEUM
+ {0xBDAB, 0xC265}, //10353 #HANGUL SYLLABLE SIOS WE IEUNG
+ {0xBDAC, 0xC26C}, //10354 #HANGUL SYLLABLE SIOS WI
+ {0xBDAD, 0xC26D}, //10355 #HANGUL SYLLABLE SIOS WI KIYEOK
+ {0xBDAE, 0xC270}, //10356 #HANGUL SYLLABLE SIOS WI NIEUN
+ {0xBDAF, 0xC274}, //10357 #HANGUL SYLLABLE SIOS WI RIEUL
+ {0xBDB0, 0xC27C}, //10358 #HANGUL SYLLABLE SIOS WI MIEUM
+ {0xBDB1, 0xC27D}, //10359 #HANGUL SYLLABLE SIOS WI PIEUP
+ {0xBDB2, 0xC27F}, //10360 #HANGUL SYLLABLE SIOS WI SIOS
+ {0xBDB3, 0xC281}, //10361 #HANGUL SYLLABLE SIOS WI IEUNG
+ {0xBDB4, 0xC288}, //10362 #HANGUL SYLLABLE SIOS YU
+ {0xBDB5, 0xC289}, //10363 #HANGUL SYLLABLE SIOS YU KIYEOK
+ {0xBDB6, 0xC290}, //10364 #HANGUL SYLLABLE SIOS YU RIEUL
+ {0xBDB7, 0xC298}, //10365 #HANGUL SYLLABLE SIOS YU MIEUM
+ {0xBDB8, 0xC29B}, //10366 #HANGUL SYLLABLE SIOS YU SIOS
+ {0xBDB9, 0xC29D}, //10367 #HANGUL SYLLABLE SIOS YU IEUNG
+ {0xBDBA, 0xC2A4}, //10368 #HANGUL SYLLABLE SIOS EU
+ {0xBDBB, 0xC2A5}, //10369 #HANGUL SYLLABLE SIOS EU KIYEOK
+ {0xBDBC, 0xC2A8}, //10370 #HANGUL SYLLABLE SIOS EU NIEUN
+ {0xBDBD, 0xC2AC}, //10371 #HANGUL SYLLABLE SIOS EU RIEUL
+ {0xBDBE, 0xC2AD}, //10372 #HANGUL SYLLABLE SIOS EU RIEULKIYEOK
+ {0xBDBF, 0xC2B4}, //10373 #HANGUL SYLLABLE SIOS EU MIEUM
+ {0xBDC0, 0xC2B5}, //10374 #HANGUL SYLLABLE SIOS EU PIEUP
+ {0xBDC1, 0xC2B7}, //10375 #HANGUL SYLLABLE SIOS EU SIOS
+ {0xBDC2, 0xC2B9}, //10376 #HANGUL SYLLABLE SIOS EU IEUNG
+ {0xBDC3, 0xC2DC}, //10377 #HANGUL SYLLABLE SIOS I
+ {0xBDC4, 0xC2DD}, //10378 #HANGUL SYLLABLE SIOS I KIYEOK
+ {0xBDC5, 0xC2E0}, //10379 #HANGUL SYLLABLE SIOS I NIEUN
+ {0xBDC6, 0xC2E3}, //10380 #HANGUL SYLLABLE SIOS I TIKEUT
+ {0xBDC7, 0xC2E4}, //10381 #HANGUL SYLLABLE SIOS I RIEUL
+ {0xBDC8, 0xC2EB}, //10382 #HANGUL SYLLABLE SIOS I RIEULHIEUH
+ {0xBDC9, 0xC2EC}, //10383 #HANGUL SYLLABLE SIOS I MIEUM
+ {0xBDCA, 0xC2ED}, //10384 #HANGUL SYLLABLE SIOS I PIEUP
+ {0xBDCB, 0xC2EF}, //10385 #HANGUL SYLLABLE SIOS I SIOS
+ {0xBDCC, 0xC2F1}, //10386 #HANGUL SYLLABLE SIOS I IEUNG
+ {0xBDCD, 0xC2F6}, //10387 #HANGUL SYLLABLE SIOS I PHIEUPH
+ {0xBDCE, 0xC2F8}, //10388 #HANGUL SYLLABLE SSANGSIOS A
+ {0xBDCF, 0xC2F9}, //10389 #HANGUL SYLLABLE SSANGSIOS A KIYEOK
+ {0xBDD0, 0xC2FB}, //10390 #HANGUL SYLLABLE SSANGSIOS A KIYEOKSIOS
+ {0xBDD1, 0xC2FC}, //10391 #HANGUL SYLLABLE SSANGSIOS A NIEUN
+ {0xBDD2, 0xC300}, //10392 #HANGUL SYLLABLE SSANGSIOS A RIEUL
+ {0xBDD3, 0xC308}, //10393 #HANGUL SYLLABLE SSANGSIOS A MIEUM
+ {0xBDD4, 0xC309}, //10394 #HANGUL SYLLABLE SSANGSIOS A PIEUP
+ {0xBDD5, 0xC30C}, //10395 #HANGUL SYLLABLE SSANGSIOS A SSANGSIOS
+ {0xBDD6, 0xC30D}, //10396 #HANGUL SYLLABLE SSANGSIOS A IEUNG
+ {0xBDD7, 0xC313}, //10397 #HANGUL SYLLABLE SSANGSIOS A HIEUH
+ {0xBDD8, 0xC314}, //10398 #HANGUL SYLLABLE SSANGSIOS AE
+ {0xBDD9, 0xC315}, //10399 #HANGUL SYLLABLE SSANGSIOS AE KIYEOK
+ {0xBDDA, 0xC318}, //10400 #HANGUL SYLLABLE SSANGSIOS AE NIEUN
+ {0xBDDB, 0xC31C}, //10401 #HANGUL SYLLABLE SSANGSIOS AE RIEUL
+ {0xBDDC, 0xC324}, //10402 #HANGUL SYLLABLE SSANGSIOS AE MIEUM
+ {0xBDDD, 0xC325}, //10403 #HANGUL SYLLABLE SSANGSIOS AE PIEUP
+ {0xBDDE, 0xC328}, //10404 #HANGUL SYLLABLE SSANGSIOS AE SSANGSIOS
+ {0xBDDF, 0xC329}, //10405 #HANGUL SYLLABLE SSANGSIOS AE IEUNG
+ {0xBDE0, 0xC345}, //10406 #HANGUL SYLLABLE SSANGSIOS YA IEUNG
+ {0xBDE1, 0xC368}, //10407 #HANGUL SYLLABLE SSANGSIOS EO
+ {0xBDE2, 0xC369}, //10408 #HANGUL SYLLABLE SSANGSIOS EO KIYEOK
+ {0xBDE3, 0xC36C}, //10409 #HANGUL SYLLABLE SSANGSIOS EO NIEUN
+ {0xBDE4, 0xC370}, //10410 #HANGUL SYLLABLE SSANGSIOS EO RIEUL
+ {0xBDE5, 0xC372}, //10411 #HANGUL SYLLABLE SSANGSIOS EO RIEULMIEUM
+ {0xBDE6, 0xC378}, //10412 #HANGUL SYLLABLE SSANGSIOS EO MIEUM
+ {0xBDE7, 0xC379}, //10413 #HANGUL SYLLABLE SSANGSIOS EO PIEUP
+ {0xBDE8, 0xC37C}, //10414 #HANGUL SYLLABLE SSANGSIOS EO SSANGSIOS
+ {0xBDE9, 0xC37D}, //10415 #HANGUL SYLLABLE SSANGSIOS EO IEUNG
+ {0xBDEA, 0xC384}, //10416 #HANGUL SYLLABLE SSANGSIOS E
+ {0xBDEB, 0xC388}, //10417 #HANGUL SYLLABLE SSANGSIOS E NIEUN
+ {0xBDEC, 0xC38C}, //10418 #HANGUL SYLLABLE SSANGSIOS E RIEUL
+ {0xBDED, 0xC3C0}, //10419 #HANGUL SYLLABLE SSANGSIOS YE NIEUN
+ {0xBDEE, 0xC3D8}, //10420 #HANGUL SYLLABLE SSANGSIOS O
+ {0xBDEF, 0xC3D9}, //10421 #HANGUL SYLLABLE SSANGSIOS O KIYEOK
+ {0xBDF0, 0xC3DC}, //10422 #HANGUL SYLLABLE SSANGSIOS O NIEUN
+ {0xBDF1, 0xC3DF}, //10423 #HANGUL SYLLABLE SSANGSIOS O TIKEUT
+ {0xBDF2, 0xC3E0}, //10424 #HANGUL SYLLABLE SSANGSIOS O RIEUL
+ {0xBDF3, 0xC3E2}, //10425 #HANGUL SYLLABLE SSANGSIOS O RIEULMIEUM
+ {0xBDF4, 0xC3E8}, //10426 #HANGUL SYLLABLE SSANGSIOS O MIEUM
+ {0xBDF5, 0xC3E9}, //10427 #HANGUL SYLLABLE SSANGSIOS O PIEUP
+ {0xBDF6, 0xC3ED}, //10428 #HANGUL SYLLABLE SSANGSIOS O IEUNG
+ {0xBDF7, 0xC3F4}, //10429 #HANGUL SYLLABLE SSANGSIOS WA
+ {0xBDF8, 0xC3F5}, //10430 #HANGUL SYLLABLE SSANGSIOS WA KIYEOK
+ {0xBDF9, 0xC3F8}, //10431 #HANGUL SYLLABLE SSANGSIOS WA NIEUN
+ {0xBDFA, 0xC408}, //10432 #HANGUL SYLLABLE SSANGSIOS WA SSANGSIOS
+ {0xBDFB, 0xC410}, //10433 #HANGUL SYLLABLE SSANGSIOS WAE
+ {0xBDFC, 0xC424}, //10434 #HANGUL SYLLABLE SSANGSIOS WAE SSANGSIOS
+ {0xBDFD, 0xC42C}, //10435 #HANGUL SYLLABLE SSANGSIOS OE
+ {0xBDFE, 0xC430}, //10436 #HANGUL SYLLABLE SSANGSIOS OE NIEUN
+ {0xBE41, 0xD438}, //10437 #HANGUL SYLLABLE PHIEUPH WAE SSANGSIOS
+ {0xBE42, 0xD439}, //10438 #HANGUL SYLLABLE PHIEUPH WAE IEUNG
+ {0xBE43, 0xD43A}, //10439 #HANGUL SYLLABLE PHIEUPH WAE CIEUC
+ {0xBE44, 0xD43B}, //10440 #HANGUL SYLLABLE PHIEUPH WAE CHIEUCH
+ {0xBE45, 0xD43C}, //10441 #HANGUL SYLLABLE PHIEUPH WAE KHIEUKH
+ {0xBE46, 0xD43D}, //10442 #HANGUL SYLLABLE PHIEUPH WAE THIEUTH
+ {0xBE47, 0xD43E}, //10443 #HANGUL SYLLABLE PHIEUPH WAE PHIEUPH
+ {0xBE48, 0xD43F}, //10444 #HANGUL SYLLABLE PHIEUPH WAE HIEUH
+ {0xBE49, 0xD441}, //10445 #HANGUL SYLLABLE PHIEUPH OE KIYEOK
+ {0xBE4A, 0xD442}, //10446 #HANGUL SYLLABLE PHIEUPH OE SSANGKIYEOK
+ {0xBE4B, 0xD443}, //10447 #HANGUL SYLLABLE PHIEUPH OE KIYEOKSIOS
+ {0xBE4C, 0xD445}, //10448 #HANGUL SYLLABLE PHIEUPH OE NIEUNCIEUC
+ {0xBE4D, 0xD446}, //10449 #HANGUL SYLLABLE PHIEUPH OE NIEUNHIEUH
+ {0xBE4E, 0xD447}, //10450 #HANGUL SYLLABLE PHIEUPH OE TIKEUT
+ {0xBE4F, 0xD448}, //10451 #HANGUL SYLLABLE PHIEUPH OE RIEUL
+ {0xBE50, 0xD449}, //10452 #HANGUL SYLLABLE PHIEUPH OE RIEULKIYEOK
+ {0xBE51, 0xD44A}, //10453 #HANGUL SYLLABLE PHIEUPH OE RIEULMIEUM
+ {0xBE52, 0xD44B}, //10454 #HANGUL SYLLABLE PHIEUPH OE RIEULPIEUP
+ {0xBE53, 0xD44C}, //10455 #HANGUL SYLLABLE PHIEUPH OE RIEULSIOS
+ {0xBE54, 0xD44D}, //10456 #HANGUL SYLLABLE PHIEUPH OE RIEULTHIEUTH
+ {0xBE55, 0xD44E}, //10457 #HANGUL SYLLABLE PHIEUPH OE RIEULPHIEUPH
+ {0xBE56, 0xD44F}, //10458 #HANGUL SYLLABLE PHIEUPH OE RIEULHIEUH
+ {0xBE57, 0xD450}, //10459 #HANGUL SYLLABLE PHIEUPH OE MIEUM
+ {0xBE58, 0xD451}, //10460 #HANGUL SYLLABLE PHIEUPH OE PIEUP
+ {0xBE59, 0xD452}, //10461 #HANGUL SYLLABLE PHIEUPH OE PIEUPSIOS
+ {0xBE5A, 0xD453}, //10462 #HANGUL SYLLABLE PHIEUPH OE SIOS
+ {0xBE61, 0xD454}, //10463 #HANGUL SYLLABLE PHIEUPH OE SSANGSIOS
+ {0xBE62, 0xD455}, //10464 #HANGUL SYLLABLE PHIEUPH OE IEUNG
+ {0xBE63, 0xD456}, //10465 #HANGUL SYLLABLE PHIEUPH OE CIEUC
+ {0xBE64, 0xD457}, //10466 #HANGUL SYLLABLE PHIEUPH OE CHIEUCH
+ {0xBE65, 0xD458}, //10467 #HANGUL SYLLABLE PHIEUPH OE KHIEUKH
+ {0xBE66, 0xD459}, //10468 #HANGUL SYLLABLE PHIEUPH OE THIEUTH
+ {0xBE67, 0xD45A}, //10469 #HANGUL SYLLABLE PHIEUPH OE PHIEUPH
+ {0xBE68, 0xD45B}, //10470 #HANGUL SYLLABLE PHIEUPH OE HIEUH
+ {0xBE69, 0xD45D}, //10471 #HANGUL SYLLABLE PHIEUPH YO KIYEOK
+ {0xBE6A, 0xD45E}, //10472 #HANGUL SYLLABLE PHIEUPH YO SSANGKIYEOK
+ {0xBE6B, 0xD45F}, //10473 #HANGUL SYLLABLE PHIEUPH YO KIYEOKSIOS
+ {0xBE6C, 0xD461}, //10474 #HANGUL SYLLABLE PHIEUPH YO NIEUNCIEUC
+ {0xBE6D, 0xD462}, //10475 #HANGUL SYLLABLE PHIEUPH YO NIEUNHIEUH
+ {0xBE6E, 0xD463}, //10476 #HANGUL SYLLABLE PHIEUPH YO TIKEUT
+ {0xBE6F, 0xD465}, //10477 #HANGUL SYLLABLE PHIEUPH YO RIEULKIYEOK
+ {0xBE70, 0xD466}, //10478 #HANGUL SYLLABLE PHIEUPH YO RIEULMIEUM
+ {0xBE71, 0xD467}, //10479 #HANGUL SYLLABLE PHIEUPH YO RIEULPIEUP
+ {0xBE72, 0xD468}, //10480 #HANGUL SYLLABLE PHIEUPH YO RIEULSIOS
+ {0xBE73, 0xD469}, //10481 #HANGUL SYLLABLE PHIEUPH YO RIEULTHIEUTH
+ {0xBE74, 0xD46A}, //10482 #HANGUL SYLLABLE PHIEUPH YO RIEULPHIEUPH
+ {0xBE75, 0xD46B}, //10483 #HANGUL SYLLABLE PHIEUPH YO RIEULHIEUH
+ {0xBE76, 0xD46C}, //10484 #HANGUL SYLLABLE PHIEUPH YO MIEUM
+ {0xBE77, 0xD46E}, //10485 #HANGUL SYLLABLE PHIEUPH YO PIEUPSIOS
+ {0xBE78, 0xD470}, //10486 #HANGUL SYLLABLE PHIEUPH YO SSANGSIOS
+ {0xBE79, 0xD471}, //10487 #HANGUL SYLLABLE PHIEUPH YO IEUNG
+ {0xBE7A, 0xD472}, //10488 #HANGUL SYLLABLE PHIEUPH YO CIEUC
+ {0xBE81, 0xD473}, //10489 #HANGUL SYLLABLE PHIEUPH YO CHIEUCH
+ {0xBE82, 0xD474}, //10490 #HANGUL SYLLABLE PHIEUPH YO KHIEUKH
+ {0xBE83, 0xD475}, //10491 #HANGUL SYLLABLE PHIEUPH YO THIEUTH
+ {0xBE84, 0xD476}, //10492 #HANGUL SYLLABLE PHIEUPH YO PHIEUPH
+ {0xBE85, 0xD477}, //10493 #HANGUL SYLLABLE PHIEUPH YO HIEUH
+ {0xBE86, 0xD47A}, //10494 #HANGUL SYLLABLE PHIEUPH U SSANGKIYEOK
+ {0xBE87, 0xD47B}, //10495 #HANGUL SYLLABLE PHIEUPH U KIYEOKSIOS
+ {0xBE88, 0xD47D}, //10496 #HANGUL SYLLABLE PHIEUPH U NIEUNCIEUC
+ {0xBE89, 0xD47E}, //10497 #HANGUL SYLLABLE PHIEUPH U NIEUNHIEUH
+ {0xBE8A, 0xD481}, //10498 #HANGUL SYLLABLE PHIEUPH U RIEULKIYEOK
+ {0xBE8B, 0xD483}, //10499 #HANGUL SYLLABLE PHIEUPH U RIEULPIEUP
+ {0xBE8C, 0xD484}, //10500 #HANGUL SYLLABLE PHIEUPH U RIEULSIOS
+ {0xBE8D, 0xD485}, //10501 #HANGUL SYLLABLE PHIEUPH U RIEULTHIEUTH
+ {0xBE8E, 0xD486}, //10502 #HANGUL SYLLABLE PHIEUPH U RIEULPHIEUPH
+ {0xBE8F, 0xD487}, //10503 #HANGUL SYLLABLE PHIEUPH U RIEULHIEUH
+ {0xBE90, 0xD48A}, //10504 #HANGUL SYLLABLE PHIEUPH U PIEUPSIOS
+ {0xBE91, 0xD48C}, //10505 #HANGUL SYLLABLE PHIEUPH U SSANGSIOS
+ {0xBE92, 0xD48E}, //10506 #HANGUL SYLLABLE PHIEUPH U CIEUC
+ {0xBE93, 0xD48F}, //10507 #HANGUL SYLLABLE PHIEUPH U CHIEUCH
+ {0xBE94, 0xD490}, //10508 #HANGUL SYLLABLE PHIEUPH U KHIEUKH
+ {0xBE95, 0xD491}, //10509 #HANGUL SYLLABLE PHIEUPH U THIEUTH
+ {0xBE96, 0xD492}, //10510 #HANGUL SYLLABLE PHIEUPH U PHIEUPH
+ {0xBE97, 0xD493}, //10511 #HANGUL SYLLABLE PHIEUPH U HIEUH
+ {0xBE98, 0xD495}, //10512 #HANGUL SYLLABLE PHIEUPH WEO KIYEOK
+ {0xBE99, 0xD496}, //10513 #HANGUL SYLLABLE PHIEUPH WEO SSANGKIYEOK
+ {0xBE9A, 0xD497}, //10514 #HANGUL SYLLABLE PHIEUPH WEO KIYEOKSIOS
+ {0xBE9B, 0xD498}, //10515 #HANGUL SYLLABLE PHIEUPH WEO NIEUN
+ {0xBE9C, 0xD499}, //10516 #HANGUL SYLLABLE PHIEUPH WEO NIEUNCIEUC
+ {0xBE9D, 0xD49A}, //10517 #HANGUL SYLLABLE PHIEUPH WEO NIEUNHIEUH
+ {0xBE9E, 0xD49B}, //10518 #HANGUL SYLLABLE PHIEUPH WEO TIKEUT
+ {0xBE9F, 0xD49C}, //10519 #HANGUL SYLLABLE PHIEUPH WEO RIEUL
+ {0xBEA0, 0xD49D}, //10520 #HANGUL SYLLABLE PHIEUPH WEO RIEULKIYEOK
+ {0xBEA1, 0xC434}, //10521 #HANGUL SYLLABLE SSANGSIOS OE RIEUL
+ {0xBEA2, 0xC43C}, //10522 #HANGUL SYLLABLE SSANGSIOS OE MIEUM
+ {0xBEA3, 0xC43D}, //10523 #HANGUL SYLLABLE SSANGSIOS OE PIEUP
+ {0xBEA4, 0xC448}, //10524 #HANGUL SYLLABLE SSANGSIOS YO
+ {0xBEA5, 0xC464}, //10525 #HANGUL SYLLABLE SSANGSIOS U
+ {0xBEA6, 0xC465}, //10526 #HANGUL SYLLABLE SSANGSIOS U KIYEOK
+ {0xBEA7, 0xC468}, //10527 #HANGUL SYLLABLE SSANGSIOS U NIEUN
+ {0xBEA8, 0xC46C}, //10528 #HANGUL SYLLABLE SSANGSIOS U RIEUL
+ {0xBEA9, 0xC474}, //10529 #HANGUL SYLLABLE SSANGSIOS U MIEUM
+ {0xBEAA, 0xC475}, //10530 #HANGUL SYLLABLE SSANGSIOS U PIEUP
+ {0xBEAB, 0xC479}, //10531 #HANGUL SYLLABLE SSANGSIOS U IEUNG
+ {0xBEAC, 0xC480}, //10532 #HANGUL SYLLABLE SSANGSIOS WEO
+ {0xBEAD, 0xC494}, //10533 #HANGUL SYLLABLE SSANGSIOS WEO SSANGSIOS
+ {0xBEAE, 0xC49C}, //10534 #HANGUL SYLLABLE SSANGSIOS WE
+ {0xBEAF, 0xC4B8}, //10535 #HANGUL SYLLABLE SSANGSIOS WI
+ {0xBEB0, 0xC4BC}, //10536 #HANGUL SYLLABLE SSANGSIOS WI NIEUN
+ {0xBEB1, 0xC4E9}, //10537 #HANGUL SYLLABLE SSANGSIOS YU IEUNG
+ {0xBEB2, 0xC4F0}, //10538 #HANGUL SYLLABLE SSANGSIOS EU
+ {0xBEB3, 0xC4F1}, //10539 #HANGUL SYLLABLE SSANGSIOS EU KIYEOK
+ {0xBEB4, 0xC4F4}, //10540 #HANGUL SYLLABLE SSANGSIOS EU NIEUN
+ {0xBEB5, 0xC4F8}, //10541 #HANGUL SYLLABLE SSANGSIOS EU RIEUL
+ {0xBEB6, 0xC4FA}, //10542 #HANGUL SYLLABLE SSANGSIOS EU RIEULMIEUM
+ {0xBEB7, 0xC4FF}, //10543 #HANGUL SYLLABLE SSANGSIOS EU RIEULHIEUH
+ {0xBEB8, 0xC500}, //10544 #HANGUL SYLLABLE SSANGSIOS EU MIEUM
+ {0xBEB9, 0xC501}, //10545 #HANGUL SYLLABLE SSANGSIOS EU PIEUP
+ {0xBEBA, 0xC50C}, //10546 #HANGUL SYLLABLE SSANGSIOS YI
+ {0xBEBB, 0xC510}, //10547 #HANGUL SYLLABLE SSANGSIOS YI NIEUN
+ {0xBEBC, 0xC514}, //10548 #HANGUL SYLLABLE SSANGSIOS YI RIEUL
+ {0xBEBD, 0xC51C}, //10549 #HANGUL SYLLABLE SSANGSIOS YI MIEUM
+ {0xBEBE, 0xC528}, //10550 #HANGUL SYLLABLE SSANGSIOS I
+ {0xBEBF, 0xC529}, //10551 #HANGUL SYLLABLE SSANGSIOS I KIYEOK
+ {0xBEC0, 0xC52C}, //10552 #HANGUL SYLLABLE SSANGSIOS I NIEUN
+ {0xBEC1, 0xC530}, //10553 #HANGUL SYLLABLE SSANGSIOS I RIEUL
+ {0xBEC2, 0xC538}, //10554 #HANGUL SYLLABLE SSANGSIOS I MIEUM
+ {0xBEC3, 0xC539}, //10555 #HANGUL SYLLABLE SSANGSIOS I PIEUP
+ {0xBEC4, 0xC53B}, //10556 #HANGUL SYLLABLE SSANGSIOS I SIOS
+ {0xBEC5, 0xC53D}, //10557 #HANGUL SYLLABLE SSANGSIOS I IEUNG
+ {0xBEC6, 0xC544}, //10558 #HANGUL SYLLABLE IEUNG A
+ {0xBEC7, 0xC545}, //10559 #HANGUL SYLLABLE IEUNG A KIYEOK
+ {0xBEC8, 0xC548}, //10560 #HANGUL SYLLABLE IEUNG A NIEUN
+ {0xBEC9, 0xC549}, //10561 #HANGUL SYLLABLE IEUNG A NIEUNCIEUC
+ {0xBECA, 0xC54A}, //10562 #HANGUL SYLLABLE IEUNG A NIEUNHIEUH
+ {0xBECB, 0xC54C}, //10563 #HANGUL SYLLABLE IEUNG A RIEUL
+ {0xBECC, 0xC54D}, //10564 #HANGUL SYLLABLE IEUNG A RIEULKIYEOK
+ {0xBECD, 0xC54E}, //10565 #HANGUL SYLLABLE IEUNG A RIEULMIEUM
+ {0xBECE, 0xC553}, //10566 #HANGUL SYLLABLE IEUNG A RIEULHIEUH
+ {0xBECF, 0xC554}, //10567 #HANGUL SYLLABLE IEUNG A MIEUM
+ {0xBED0, 0xC555}, //10568 #HANGUL SYLLABLE IEUNG A PIEUP
+ {0xBED1, 0xC557}, //10569 #HANGUL SYLLABLE IEUNG A SIOS
+ {0xBED2, 0xC558}, //10570 #HANGUL SYLLABLE IEUNG A SSANGSIOS
+ {0xBED3, 0xC559}, //10571 #HANGUL SYLLABLE IEUNG A IEUNG
+ {0xBED4, 0xC55D}, //10572 #HANGUL SYLLABLE IEUNG A THIEUTH
+ {0xBED5, 0xC55E}, //10573 #HANGUL SYLLABLE IEUNG A PHIEUPH
+ {0xBED6, 0xC560}, //10574 #HANGUL SYLLABLE IEUNG AE
+ {0xBED7, 0xC561}, //10575 #HANGUL SYLLABLE IEUNG AE KIYEOK
+ {0xBED8, 0xC564}, //10576 #HANGUL SYLLABLE IEUNG AE NIEUN
+ {0xBED9, 0xC568}, //10577 #HANGUL SYLLABLE IEUNG AE RIEUL
+ {0xBEDA, 0xC570}, //10578 #HANGUL SYLLABLE IEUNG AE MIEUM
+ {0xBEDB, 0xC571}, //10579 #HANGUL SYLLABLE IEUNG AE PIEUP
+ {0xBEDC, 0xC573}, //10580 #HANGUL SYLLABLE IEUNG AE SIOS
+ {0xBEDD, 0xC574}, //10581 #HANGUL SYLLABLE IEUNG AE SSANGSIOS
+ {0xBEDE, 0xC575}, //10582 #HANGUL SYLLABLE IEUNG AE IEUNG
+ {0xBEDF, 0xC57C}, //10583 #HANGUL SYLLABLE IEUNG YA
+ {0xBEE0, 0xC57D}, //10584 #HANGUL SYLLABLE IEUNG YA KIYEOK
+ {0xBEE1, 0xC580}, //10585 #HANGUL SYLLABLE IEUNG YA NIEUN
+ {0xBEE2, 0xC584}, //10586 #HANGUL SYLLABLE IEUNG YA RIEUL
+ {0xBEE3, 0xC587}, //10587 #HANGUL SYLLABLE IEUNG YA RIEULPIEUP
+ {0xBEE4, 0xC58C}, //10588 #HANGUL SYLLABLE IEUNG YA MIEUM
+ {0xBEE5, 0xC58D}, //10589 #HANGUL SYLLABLE IEUNG YA PIEUP
+ {0xBEE6, 0xC58F}, //10590 #HANGUL SYLLABLE IEUNG YA SIOS
+ {0xBEE7, 0xC591}, //10591 #HANGUL SYLLABLE IEUNG YA IEUNG
+ {0xBEE8, 0xC595}, //10592 #HANGUL SYLLABLE IEUNG YA THIEUTH
+ {0xBEE9, 0xC597}, //10593 #HANGUL SYLLABLE IEUNG YA HIEUH
+ {0xBEEA, 0xC598}, //10594 #HANGUL SYLLABLE IEUNG YAE
+ {0xBEEB, 0xC59C}, //10595 #HANGUL SYLLABLE IEUNG YAE NIEUN
+ {0xBEEC, 0xC5A0}, //10596 #HANGUL SYLLABLE IEUNG YAE RIEUL
+ {0xBEED, 0xC5A9}, //10597 #HANGUL SYLLABLE IEUNG YAE PIEUP
+ {0xBEEE, 0xC5B4}, //10598 #HANGUL SYLLABLE IEUNG EO
+ {0xBEEF, 0xC5B5}, //10599 #HANGUL SYLLABLE IEUNG EO KIYEOK
+ {0xBEF0, 0xC5B8}, //10600 #HANGUL SYLLABLE IEUNG EO NIEUN
+ {0xBEF1, 0xC5B9}, //10601 #HANGUL SYLLABLE IEUNG EO NIEUNCIEUC
+ {0xBEF2, 0xC5BB}, //10602 #HANGUL SYLLABLE IEUNG EO TIKEUT
+ {0xBEF3, 0xC5BC}, //10603 #HANGUL SYLLABLE IEUNG EO RIEUL
+ {0xBEF4, 0xC5BD}, //10604 #HANGUL SYLLABLE IEUNG EO RIEULKIYEOK
+ {0xBEF5, 0xC5BE}, //10605 #HANGUL SYLLABLE IEUNG EO RIEULMIEUM
+ {0xBEF6, 0xC5C4}, //10606 #HANGUL SYLLABLE IEUNG EO MIEUM
+ {0xBEF7, 0xC5C5}, //10607 #HANGUL SYLLABLE IEUNG EO PIEUP
+ {0xBEF8, 0xC5C6}, //10608 #HANGUL SYLLABLE IEUNG EO PIEUPSIOS
+ {0xBEF9, 0xC5C7}, //10609 #HANGUL SYLLABLE IEUNG EO SIOS
+ {0xBEFA, 0xC5C8}, //10610 #HANGUL SYLLABLE IEUNG EO SSANGSIOS
+ {0xBEFB, 0xC5C9}, //10611 #HANGUL SYLLABLE IEUNG EO IEUNG
+ {0xBEFC, 0xC5CA}, //10612 #HANGUL SYLLABLE IEUNG EO CIEUC
+ {0xBEFD, 0xC5CC}, //10613 #HANGUL SYLLABLE IEUNG EO KHIEUKH
+ {0xBEFE, 0xC5CE}, //10614 #HANGUL SYLLABLE IEUNG EO PHIEUPH
+ {0xBF41, 0xD49E}, //10615 #HANGUL SYLLABLE PHIEUPH WEO RIEULMIEUM
+ {0xBF42, 0xD49F}, //10616 #HANGUL SYLLABLE PHIEUPH WEO RIEULPIEUP
+ {0xBF43, 0xD4A0}, //10617 #HANGUL SYLLABLE PHIEUPH WEO RIEULSIOS
+ {0xBF44, 0xD4A1}, //10618 #HANGUL SYLLABLE PHIEUPH WEO RIEULTHIEUTH
+ {0xBF45, 0xD4A2}, //10619 #HANGUL SYLLABLE PHIEUPH WEO RIEULPHIEUPH
+ {0xBF46, 0xD4A3}, //10620 #HANGUL SYLLABLE PHIEUPH WEO RIEULHIEUH
+ {0xBF47, 0xD4A4}, //10621 #HANGUL SYLLABLE PHIEUPH WEO MIEUM
+ {0xBF48, 0xD4A5}, //10622 #HANGUL SYLLABLE PHIEUPH WEO PIEUP
+ {0xBF49, 0xD4A6}, //10623 #HANGUL SYLLABLE PHIEUPH WEO PIEUPSIOS
+ {0xBF4A, 0xD4A7}, //10624 #HANGUL SYLLABLE PHIEUPH WEO SIOS
+ {0xBF4B, 0xD4A8}, //10625 #HANGUL SYLLABLE PHIEUPH WEO SSANGSIOS
+ {0xBF4C, 0xD4AA}, //10626 #HANGUL SYLLABLE PHIEUPH WEO CIEUC
+ {0xBF4D, 0xD4AB}, //10627 #HANGUL SYLLABLE PHIEUPH WEO CHIEUCH
+ {0xBF4E, 0xD4AC}, //10628 #HANGUL SYLLABLE PHIEUPH WEO KHIEUKH
+ {0xBF4F, 0xD4AD}, //10629 #HANGUL SYLLABLE PHIEUPH WEO THIEUTH
+ {0xBF50, 0xD4AE}, //10630 #HANGUL SYLLABLE PHIEUPH WEO PHIEUPH
+ {0xBF51, 0xD4AF}, //10631 #HANGUL SYLLABLE PHIEUPH WEO HIEUH
+ {0xBF52, 0xD4B0}, //10632 #HANGUL SYLLABLE PHIEUPH WE
+ {0xBF53, 0xD4B1}, //10633 #HANGUL SYLLABLE PHIEUPH WE KIYEOK
+ {0xBF54, 0xD4B2}, //10634 #HANGUL SYLLABLE PHIEUPH WE SSANGKIYEOK
+ {0xBF55, 0xD4B3}, //10635 #HANGUL SYLLABLE PHIEUPH WE KIYEOKSIOS
+ {0xBF56, 0xD4B4}, //10636 #HANGUL SYLLABLE PHIEUPH WE NIEUN
+ {0xBF57, 0xD4B5}, //10637 #HANGUL SYLLABLE PHIEUPH WE NIEUNCIEUC
+ {0xBF58, 0xD4B6}, //10638 #HANGUL SYLLABLE PHIEUPH WE NIEUNHIEUH
+ {0xBF59, 0xD4B7}, //10639 #HANGUL SYLLABLE PHIEUPH WE TIKEUT
+ {0xBF5A, 0xD4B8}, //10640 #HANGUL SYLLABLE PHIEUPH WE RIEUL
+ {0xBF61, 0xD4B9}, //10641 #HANGUL SYLLABLE PHIEUPH WE RIEULKIYEOK
+ {0xBF62, 0xD4BA}, //10642 #HANGUL SYLLABLE PHIEUPH WE RIEULMIEUM
+ {0xBF63, 0xD4BB}, //10643 #HANGUL SYLLABLE PHIEUPH WE RIEULPIEUP
+ {0xBF64, 0xD4BC}, //10644 #HANGUL SYLLABLE PHIEUPH WE RIEULSIOS
+ {0xBF65, 0xD4BD}, //10645 #HANGUL SYLLABLE PHIEUPH WE RIEULTHIEUTH
+ {0xBF66, 0xD4BE}, //10646 #HANGUL SYLLABLE PHIEUPH WE RIEULPHIEUPH
+ {0xBF67, 0xD4BF}, //10647 #HANGUL SYLLABLE PHIEUPH WE RIEULHIEUH
+ {0xBF68, 0xD4C0}, //10648 #HANGUL SYLLABLE PHIEUPH WE MIEUM
+ {0xBF69, 0xD4C1}, //10649 #HANGUL SYLLABLE PHIEUPH WE PIEUP
+ {0xBF6A, 0xD4C2}, //10650 #HANGUL SYLLABLE PHIEUPH WE PIEUPSIOS
+ {0xBF6B, 0xD4C3}, //10651 #HANGUL SYLLABLE PHIEUPH WE SIOS
+ {0xBF6C, 0xD4C4}, //10652 #HANGUL SYLLABLE PHIEUPH WE SSANGSIOS
+ {0xBF6D, 0xD4C5}, //10653 #HANGUL SYLLABLE PHIEUPH WE IEUNG
+ {0xBF6E, 0xD4C6}, //10654 #HANGUL SYLLABLE PHIEUPH WE CIEUC
+ {0xBF6F, 0xD4C7}, //10655 #HANGUL SYLLABLE PHIEUPH WE CHIEUCH
+ {0xBF70, 0xD4C8}, //10656 #HANGUL SYLLABLE PHIEUPH WE KHIEUKH
+ {0xBF71, 0xD4C9}, //10657 #HANGUL SYLLABLE PHIEUPH WE THIEUTH
+ {0xBF72, 0xD4CA}, //10658 #HANGUL SYLLABLE PHIEUPH WE PHIEUPH
+ {0xBF73, 0xD4CB}, //10659 #HANGUL SYLLABLE PHIEUPH WE HIEUH
+ {0xBF74, 0xD4CD}, //10660 #HANGUL SYLLABLE PHIEUPH WI KIYEOK
+ {0xBF75, 0xD4CE}, //10661 #HANGUL SYLLABLE PHIEUPH WI SSANGKIYEOK
+ {0xBF76, 0xD4CF}, //10662 #HANGUL SYLLABLE PHIEUPH WI KIYEOKSIOS
+ {0xBF77, 0xD4D1}, //10663 #HANGUL SYLLABLE PHIEUPH WI NIEUNCIEUC
+ {0xBF78, 0xD4D2}, //10664 #HANGUL SYLLABLE PHIEUPH WI NIEUNHIEUH
+ {0xBF79, 0xD4D3}, //10665 #HANGUL SYLLABLE PHIEUPH WI TIKEUT
+ {0xBF7A, 0xD4D5}, //10666 #HANGUL SYLLABLE PHIEUPH WI RIEULKIYEOK
+ {0xBF81, 0xD4D6}, //10667 #HANGUL SYLLABLE PHIEUPH WI RIEULMIEUM
+ {0xBF82, 0xD4D7}, //10668 #HANGUL SYLLABLE PHIEUPH WI RIEULPIEUP
+ {0xBF83, 0xD4D8}, //10669 #HANGUL SYLLABLE PHIEUPH WI RIEULSIOS
+ {0xBF84, 0xD4D9}, //10670 #HANGUL SYLLABLE PHIEUPH WI RIEULTHIEUTH
+ {0xBF85, 0xD4DA}, //10671 #HANGUL SYLLABLE PHIEUPH WI RIEULPHIEUPH
+ {0xBF86, 0xD4DB}, //10672 #HANGUL SYLLABLE PHIEUPH WI RIEULHIEUH
+ {0xBF87, 0xD4DD}, //10673 #HANGUL SYLLABLE PHIEUPH WI PIEUP
+ {0xBF88, 0xD4DE}, //10674 #HANGUL SYLLABLE PHIEUPH WI PIEUPSIOS
+ {0xBF89, 0xD4E0}, //10675 #HANGUL SYLLABLE PHIEUPH WI SSANGSIOS
+ {0xBF8A, 0xD4E1}, //10676 #HANGUL SYLLABLE PHIEUPH WI IEUNG
+ {0xBF8B, 0xD4E2}, //10677 #HANGUL SYLLABLE PHIEUPH WI CIEUC
+ {0xBF8C, 0xD4E3}, //10678 #HANGUL SYLLABLE PHIEUPH WI CHIEUCH
+ {0xBF8D, 0xD4E4}, //10679 #HANGUL SYLLABLE PHIEUPH WI KHIEUKH
+ {0xBF8E, 0xD4E5}, //10680 #HANGUL SYLLABLE PHIEUPH WI THIEUTH
+ {0xBF8F, 0xD4E6}, //10681 #HANGUL SYLLABLE PHIEUPH WI PHIEUPH
+ {0xBF90, 0xD4E7}, //10682 #HANGUL SYLLABLE PHIEUPH WI HIEUH
+ {0xBF91, 0xD4E9}, //10683 #HANGUL SYLLABLE PHIEUPH YU KIYEOK
+ {0xBF92, 0xD4EA}, //10684 #HANGUL SYLLABLE PHIEUPH YU SSANGKIYEOK
+ {0xBF93, 0xD4EB}, //10685 #HANGUL SYLLABLE PHIEUPH YU KIYEOKSIOS
+ {0xBF94, 0xD4ED}, //10686 #HANGUL SYLLABLE PHIEUPH YU NIEUNCIEUC
+ {0xBF95, 0xD4EE}, //10687 #HANGUL SYLLABLE PHIEUPH YU NIEUNHIEUH
+ {0xBF96, 0xD4EF}, //10688 #HANGUL SYLLABLE PHIEUPH YU TIKEUT
+ {0xBF97, 0xD4F1}, //10689 #HANGUL SYLLABLE PHIEUPH YU RIEULKIYEOK
+ {0xBF98, 0xD4F2}, //10690 #HANGUL SYLLABLE PHIEUPH YU RIEULMIEUM
+ {0xBF99, 0xD4F3}, //10691 #HANGUL SYLLABLE PHIEUPH YU RIEULPIEUP
+ {0xBF9A, 0xD4F4}, //10692 #HANGUL SYLLABLE PHIEUPH YU RIEULSIOS
+ {0xBF9B, 0xD4F5}, //10693 #HANGUL SYLLABLE PHIEUPH YU RIEULTHIEUTH
+ {0xBF9C, 0xD4F6}, //10694 #HANGUL SYLLABLE PHIEUPH YU RIEULPHIEUPH
+ {0xBF9D, 0xD4F7}, //10695 #HANGUL SYLLABLE PHIEUPH YU RIEULHIEUH
+ {0xBF9E, 0xD4F9}, //10696 #HANGUL SYLLABLE PHIEUPH YU PIEUP
+ {0xBF9F, 0xD4FA}, //10697 #HANGUL SYLLABLE PHIEUPH YU PIEUPSIOS
+ {0xBFA0, 0xD4FC}, //10698 #HANGUL SYLLABLE PHIEUPH YU SSANGSIOS
+ {0xBFA1, 0xC5D0}, //10699 #HANGUL SYLLABLE IEUNG E
+ {0xBFA2, 0xC5D1}, //10700 #HANGUL SYLLABLE IEUNG E KIYEOK
+ {0xBFA3, 0xC5D4}, //10701 #HANGUL SYLLABLE IEUNG E NIEUN
+ {0xBFA4, 0xC5D8}, //10702 #HANGUL SYLLABLE IEUNG E RIEUL
+ {0xBFA5, 0xC5E0}, //10703 #HANGUL SYLLABLE IEUNG E MIEUM
+ {0xBFA6, 0xC5E1}, //10704 #HANGUL SYLLABLE IEUNG E PIEUP
+ {0xBFA7, 0xC5E3}, //10705 #HANGUL SYLLABLE IEUNG E SIOS
+ {0xBFA8, 0xC5E5}, //10706 #HANGUL SYLLABLE IEUNG E IEUNG
+ {0xBFA9, 0xC5EC}, //10707 #HANGUL SYLLABLE IEUNG YEO
+ {0xBFAA, 0xC5ED}, //10708 #HANGUL SYLLABLE IEUNG YEO KIYEOK
+ {0xBFAB, 0xC5EE}, //10709 #HANGUL SYLLABLE IEUNG YEO SSANGKIYEOK
+ {0xBFAC, 0xC5F0}, //10710 #HANGUL SYLLABLE IEUNG YEO NIEUN
+ {0xBFAD, 0xC5F4}, //10711 #HANGUL SYLLABLE IEUNG YEO RIEUL
+ {0xBFAE, 0xC5F6}, //10712 #HANGUL SYLLABLE IEUNG YEO RIEULMIEUM
+ {0xBFAF, 0xC5F7}, //10713 #HANGUL SYLLABLE IEUNG YEO RIEULPIEUP
+ {0xBFB0, 0xC5FC}, //10714 #HANGUL SYLLABLE IEUNG YEO MIEUM
+ {0xBFB1, 0xC5FD}, //10715 #HANGUL SYLLABLE IEUNG YEO PIEUP
+ {0xBFB2, 0xC5FE}, //10716 #HANGUL SYLLABLE IEUNG YEO PIEUPSIOS
+ {0xBFB3, 0xC5FF}, //10717 #HANGUL SYLLABLE IEUNG YEO SIOS
+ {0xBFB4, 0xC600}, //10718 #HANGUL SYLLABLE IEUNG YEO SSANGSIOS
+ {0xBFB5, 0xC601}, //10719 #HANGUL SYLLABLE IEUNG YEO IEUNG
+ {0xBFB6, 0xC605}, //10720 #HANGUL SYLLABLE IEUNG YEO THIEUTH
+ {0xBFB7, 0xC606}, //10721 #HANGUL SYLLABLE IEUNG YEO PHIEUPH
+ {0xBFB8, 0xC607}, //10722 #HANGUL SYLLABLE IEUNG YEO HIEUH
+ {0xBFB9, 0xC608}, //10723 #HANGUL SYLLABLE IEUNG YE
+ {0xBFBA, 0xC60C}, //10724 #HANGUL SYLLABLE IEUNG YE NIEUN
+ {0xBFBB, 0xC610}, //10725 #HANGUL SYLLABLE IEUNG YE RIEUL
+ {0xBFBC, 0xC618}, //10726 #HANGUL SYLLABLE IEUNG YE MIEUM
+ {0xBFBD, 0xC619}, //10727 #HANGUL SYLLABLE IEUNG YE PIEUP
+ {0xBFBE, 0xC61B}, //10728 #HANGUL SYLLABLE IEUNG YE SIOS
+ {0xBFBF, 0xC61C}, //10729 #HANGUL SYLLABLE IEUNG YE SSANGSIOS
+ {0xBFC0, 0xC624}, //10730 #HANGUL SYLLABLE IEUNG O
+ {0xBFC1, 0xC625}, //10731 #HANGUL SYLLABLE IEUNG O KIYEOK
+ {0xBFC2, 0xC628}, //10732 #HANGUL SYLLABLE IEUNG O NIEUN
+ {0xBFC3, 0xC62C}, //10733 #HANGUL SYLLABLE IEUNG O RIEUL
+ {0xBFC4, 0xC62D}, //10734 #HANGUL SYLLABLE IEUNG O RIEULKIYEOK
+ {0xBFC5, 0xC62E}, //10735 #HANGUL SYLLABLE IEUNG O RIEULMIEUM
+ {0xBFC6, 0xC630}, //10736 #HANGUL SYLLABLE IEUNG O RIEULSIOS
+ {0xBFC7, 0xC633}, //10737 #HANGUL SYLLABLE IEUNG O RIEULHIEUH
+ {0xBFC8, 0xC634}, //10738 #HANGUL SYLLABLE IEUNG O MIEUM
+ {0xBFC9, 0xC635}, //10739 #HANGUL SYLLABLE IEUNG O PIEUP
+ {0xBFCA, 0xC637}, //10740 #HANGUL SYLLABLE IEUNG O SIOS
+ {0xBFCB, 0xC639}, //10741 #HANGUL SYLLABLE IEUNG O IEUNG
+ {0xBFCC, 0xC63B}, //10742 #HANGUL SYLLABLE IEUNG O CHIEUCH
+ {0xBFCD, 0xC640}, //10743 #HANGUL SYLLABLE IEUNG WA
+ {0xBFCE, 0xC641}, //10744 #HANGUL SYLLABLE IEUNG WA KIYEOK
+ {0xBFCF, 0xC644}, //10745 #HANGUL SYLLABLE IEUNG WA NIEUN
+ {0xBFD0, 0xC648}, //10746 #HANGUL SYLLABLE IEUNG WA RIEUL
+ {0xBFD1, 0xC650}, //10747 #HANGUL SYLLABLE IEUNG WA MIEUM
+ {0xBFD2, 0xC651}, //10748 #HANGUL SYLLABLE IEUNG WA PIEUP
+ {0xBFD3, 0xC653}, //10749 #HANGUL SYLLABLE IEUNG WA SIOS
+ {0xBFD4, 0xC654}, //10750 #HANGUL SYLLABLE IEUNG WA SSANGSIOS
+ {0xBFD5, 0xC655}, //10751 #HANGUL SYLLABLE IEUNG WA IEUNG
+ {0xBFD6, 0xC65C}, //10752 #HANGUL SYLLABLE IEUNG WAE
+ {0xBFD7, 0xC65D}, //10753 #HANGUL SYLLABLE IEUNG WAE KIYEOK
+ {0xBFD8, 0xC660}, //10754 #HANGUL SYLLABLE IEUNG WAE NIEUN
+ {0xBFD9, 0xC66C}, //10755 #HANGUL SYLLABLE IEUNG WAE MIEUM
+ {0xBFDA, 0xC66F}, //10756 #HANGUL SYLLABLE IEUNG WAE SIOS
+ {0xBFDB, 0xC671}, //10757 #HANGUL SYLLABLE IEUNG WAE IEUNG
+ {0xBFDC, 0xC678}, //10758 #HANGUL SYLLABLE IEUNG OE
+ {0xBFDD, 0xC679}, //10759 #HANGUL SYLLABLE IEUNG OE KIYEOK
+ {0xBFDE, 0xC67C}, //10760 #HANGUL SYLLABLE IEUNG OE NIEUN
+ {0xBFDF, 0xC680}, //10761 #HANGUL SYLLABLE IEUNG OE RIEUL
+ {0xBFE0, 0xC688}, //10762 #HANGUL SYLLABLE IEUNG OE MIEUM
+ {0xBFE1, 0xC689}, //10763 #HANGUL SYLLABLE IEUNG OE PIEUP
+ {0xBFE2, 0xC68B}, //10764 #HANGUL SYLLABLE IEUNG OE SIOS
+ {0xBFE3, 0xC68D}, //10765 #HANGUL SYLLABLE IEUNG OE IEUNG
+ {0xBFE4, 0xC694}, //10766 #HANGUL SYLLABLE IEUNG YO
+ {0xBFE5, 0xC695}, //10767 #HANGUL SYLLABLE IEUNG YO KIYEOK
+ {0xBFE6, 0xC698}, //10768 #HANGUL SYLLABLE IEUNG YO NIEUN
+ {0xBFE7, 0xC69C}, //10769 #HANGUL SYLLABLE IEUNG YO RIEUL
+ {0xBFE8, 0xC6A4}, //10770 #HANGUL SYLLABLE IEUNG YO MIEUM
+ {0xBFE9, 0xC6A5}, //10771 #HANGUL SYLLABLE IEUNG YO PIEUP
+ {0xBFEA, 0xC6A7}, //10772 #HANGUL SYLLABLE IEUNG YO SIOS
+ {0xBFEB, 0xC6A9}, //10773 #HANGUL SYLLABLE IEUNG YO IEUNG
+ {0xBFEC, 0xC6B0}, //10774 #HANGUL SYLLABLE IEUNG U
+ {0xBFED, 0xC6B1}, //10775 #HANGUL SYLLABLE IEUNG U KIYEOK
+ {0xBFEE, 0xC6B4}, //10776 #HANGUL SYLLABLE IEUNG U NIEUN
+ {0xBFEF, 0xC6B8}, //10777 #HANGUL SYLLABLE IEUNG U RIEUL
+ {0xBFF0, 0xC6B9}, //10778 #HANGUL SYLLABLE IEUNG U RIEULKIYEOK
+ {0xBFF1, 0xC6BA}, //10779 #HANGUL SYLLABLE IEUNG U RIEULMIEUM
+ {0xBFF2, 0xC6C0}, //10780 #HANGUL SYLLABLE IEUNG U MIEUM
+ {0xBFF3, 0xC6C1}, //10781 #HANGUL SYLLABLE IEUNG U PIEUP
+ {0xBFF4, 0xC6C3}, //10782 #HANGUL SYLLABLE IEUNG U SIOS
+ {0xBFF5, 0xC6C5}, //10783 #HANGUL SYLLABLE IEUNG U IEUNG
+ {0xBFF6, 0xC6CC}, //10784 #HANGUL SYLLABLE IEUNG WEO
+ {0xBFF7, 0xC6CD}, //10785 #HANGUL SYLLABLE IEUNG WEO KIYEOK
+ {0xBFF8, 0xC6D0}, //10786 #HANGUL SYLLABLE IEUNG WEO NIEUN
+ {0xBFF9, 0xC6D4}, //10787 #HANGUL SYLLABLE IEUNG WEO RIEUL
+ {0xBFFA, 0xC6DC}, //10788 #HANGUL SYLLABLE IEUNG WEO MIEUM
+ {0xBFFB, 0xC6DD}, //10789 #HANGUL SYLLABLE IEUNG WEO PIEUP
+ {0xBFFC, 0xC6E0}, //10790 #HANGUL SYLLABLE IEUNG WEO SSANGSIOS
+ {0xBFFD, 0xC6E1}, //10791 #HANGUL SYLLABLE IEUNG WEO IEUNG
+ {0xBFFE, 0xC6E8}, //10792 #HANGUL SYLLABLE IEUNG WE
+ {0xC041, 0xD4FE}, //10793 #HANGUL SYLLABLE PHIEUPH YU CIEUC
+ {0xC042, 0xD4FF}, //10794 #HANGUL SYLLABLE PHIEUPH YU CHIEUCH
+ {0xC043, 0xD500}, //10795 #HANGUL SYLLABLE PHIEUPH YU KHIEUKH
+ {0xC044, 0xD501}, //10796 #HANGUL SYLLABLE PHIEUPH YU THIEUTH
+ {0xC045, 0xD502}, //10797 #HANGUL SYLLABLE PHIEUPH YU PHIEUPH
+ {0xC046, 0xD503}, //10798 #HANGUL SYLLABLE PHIEUPH YU HIEUH
+ {0xC047, 0xD505}, //10799 #HANGUL SYLLABLE PHIEUPH EU KIYEOK
+ {0xC048, 0xD506}, //10800 #HANGUL SYLLABLE PHIEUPH EU SSANGKIYEOK
+ {0xC049, 0xD507}, //10801 #HANGUL SYLLABLE PHIEUPH EU KIYEOKSIOS
+ {0xC04A, 0xD509}, //10802 #HANGUL SYLLABLE PHIEUPH EU NIEUNCIEUC
+ {0xC04B, 0xD50A}, //10803 #HANGUL SYLLABLE PHIEUPH EU NIEUNHIEUH
+ {0xC04C, 0xD50B}, //10804 #HANGUL SYLLABLE PHIEUPH EU TIKEUT
+ {0xC04D, 0xD50D}, //10805 #HANGUL SYLLABLE PHIEUPH EU RIEULKIYEOK
+ {0xC04E, 0xD50E}, //10806 #HANGUL SYLLABLE PHIEUPH EU RIEULMIEUM
+ {0xC04F, 0xD50F}, //10807 #HANGUL SYLLABLE PHIEUPH EU RIEULPIEUP
+ {0xC050, 0xD510}, //10808 #HANGUL SYLLABLE PHIEUPH EU RIEULSIOS
+ {0xC051, 0xD511}, //10809 #HANGUL SYLLABLE PHIEUPH EU RIEULTHIEUTH
+ {0xC052, 0xD512}, //10810 #HANGUL SYLLABLE PHIEUPH EU RIEULPHIEUPH
+ {0xC053, 0xD513}, //10811 #HANGUL SYLLABLE PHIEUPH EU RIEULHIEUH
+ {0xC054, 0xD516}, //10812 #HANGUL SYLLABLE PHIEUPH EU PIEUPSIOS
+ {0xC055, 0xD518}, //10813 #HANGUL SYLLABLE PHIEUPH EU SSANGSIOS
+ {0xC056, 0xD519}, //10814 #HANGUL SYLLABLE PHIEUPH EU IEUNG
+ {0xC057, 0xD51A}, //10815 #HANGUL SYLLABLE PHIEUPH EU CIEUC
+ {0xC058, 0xD51B}, //10816 #HANGUL SYLLABLE PHIEUPH EU CHIEUCH
+ {0xC059, 0xD51C}, //10817 #HANGUL SYLLABLE PHIEUPH EU KHIEUKH
+ {0xC05A, 0xD51D}, //10818 #HANGUL SYLLABLE PHIEUPH EU THIEUTH
+ {0xC061, 0xD51E}, //10819 #HANGUL SYLLABLE PHIEUPH EU PHIEUPH
+ {0xC062, 0xD51F}, //10820 #HANGUL SYLLABLE PHIEUPH EU HIEUH
+ {0xC063, 0xD520}, //10821 #HANGUL SYLLABLE PHIEUPH YI
+ {0xC064, 0xD521}, //10822 #HANGUL SYLLABLE PHIEUPH YI KIYEOK
+ {0xC065, 0xD522}, //10823 #HANGUL SYLLABLE PHIEUPH YI SSANGKIYEOK
+ {0xC066, 0xD523}, //10824 #HANGUL SYLLABLE PHIEUPH YI KIYEOKSIOS
+ {0xC067, 0xD524}, //10825 #HANGUL SYLLABLE PHIEUPH YI NIEUN
+ {0xC068, 0xD525}, //10826 #HANGUL SYLLABLE PHIEUPH YI NIEUNCIEUC
+ {0xC069, 0xD526}, //10827 #HANGUL SYLLABLE PHIEUPH YI NIEUNHIEUH
+ {0xC06A, 0xD527}, //10828 #HANGUL SYLLABLE PHIEUPH YI TIKEUT
+ {0xC06B, 0xD528}, //10829 #HANGUL SYLLABLE PHIEUPH YI RIEUL
+ {0xC06C, 0xD529}, //10830 #HANGUL SYLLABLE PHIEUPH YI RIEULKIYEOK
+ {0xC06D, 0xD52A}, //10831 #HANGUL SYLLABLE PHIEUPH YI RIEULMIEUM
+ {0xC06E, 0xD52B}, //10832 #HANGUL SYLLABLE PHIEUPH YI RIEULPIEUP
+ {0xC06F, 0xD52C}, //10833 #HANGUL SYLLABLE PHIEUPH YI RIEULSIOS
+ {0xC070, 0xD52D}, //10834 #HANGUL SYLLABLE PHIEUPH YI RIEULTHIEUTH
+ {0xC071, 0xD52E}, //10835 #HANGUL SYLLABLE PHIEUPH YI RIEULPHIEUPH
+ {0xC072, 0xD52F}, //10836 #HANGUL SYLLABLE PHIEUPH YI RIEULHIEUH
+ {0xC073, 0xD530}, //10837 #HANGUL SYLLABLE PHIEUPH YI MIEUM
+ {0xC074, 0xD531}, //10838 #HANGUL SYLLABLE PHIEUPH YI PIEUP
+ {0xC075, 0xD532}, //10839 #HANGUL SYLLABLE PHIEUPH YI PIEUPSIOS
+ {0xC076, 0xD533}, //10840 #HANGUL SYLLABLE PHIEUPH YI SIOS
+ {0xC077, 0xD534}, //10841 #HANGUL SYLLABLE PHIEUPH YI SSANGSIOS
+ {0xC078, 0xD535}, //10842 #HANGUL SYLLABLE PHIEUPH YI IEUNG
+ {0xC079, 0xD536}, //10843 #HANGUL SYLLABLE PHIEUPH YI CIEUC
+ {0xC07A, 0xD537}, //10844 #HANGUL SYLLABLE PHIEUPH YI CHIEUCH
+ {0xC081, 0xD538}, //10845 #HANGUL SYLLABLE PHIEUPH YI KHIEUKH
+ {0xC082, 0xD539}, //10846 #HANGUL SYLLABLE PHIEUPH YI THIEUTH
+ {0xC083, 0xD53A}, //10847 #HANGUL SYLLABLE PHIEUPH YI PHIEUPH
+ {0xC084, 0xD53B}, //10848 #HANGUL SYLLABLE PHIEUPH YI HIEUH
+ {0xC085, 0xD53E}, //10849 #HANGUL SYLLABLE PHIEUPH I SSANGKIYEOK
+ {0xC086, 0xD53F}, //10850 #HANGUL SYLLABLE PHIEUPH I KIYEOKSIOS
+ {0xC087, 0xD541}, //10851 #HANGUL SYLLABLE PHIEUPH I NIEUNCIEUC
+ {0xC088, 0xD542}, //10852 #HANGUL SYLLABLE PHIEUPH I NIEUNHIEUH
+ {0xC089, 0xD543}, //10853 #HANGUL SYLLABLE PHIEUPH I TIKEUT
+ {0xC08A, 0xD545}, //10854 #HANGUL SYLLABLE PHIEUPH I RIEULKIYEOK
+ {0xC08B, 0xD546}, //10855 #HANGUL SYLLABLE PHIEUPH I RIEULMIEUM
+ {0xC08C, 0xD547}, //10856 #HANGUL SYLLABLE PHIEUPH I RIEULPIEUP
+ {0xC08D, 0xD548}, //10857 #HANGUL SYLLABLE PHIEUPH I RIEULSIOS
+ {0xC08E, 0xD549}, //10858 #HANGUL SYLLABLE PHIEUPH I RIEULTHIEUTH
+ {0xC08F, 0xD54A}, //10859 #HANGUL SYLLABLE PHIEUPH I RIEULPHIEUPH
+ {0xC090, 0xD54B}, //10860 #HANGUL SYLLABLE PHIEUPH I RIEULHIEUH
+ {0xC091, 0xD54E}, //10861 #HANGUL SYLLABLE PHIEUPH I PIEUPSIOS
+ {0xC092, 0xD550}, //10862 #HANGUL SYLLABLE PHIEUPH I SSANGSIOS
+ {0xC093, 0xD552}, //10863 #HANGUL SYLLABLE PHIEUPH I CIEUC
+ {0xC094, 0xD553}, //10864 #HANGUL SYLLABLE PHIEUPH I CHIEUCH
+ {0xC095, 0xD554}, //10865 #HANGUL SYLLABLE PHIEUPH I KHIEUKH
+ {0xC096, 0xD555}, //10866 #HANGUL SYLLABLE PHIEUPH I THIEUTH
+ {0xC097, 0xD556}, //10867 #HANGUL SYLLABLE PHIEUPH I PHIEUPH
+ {0xC098, 0xD557}, //10868 #HANGUL SYLLABLE PHIEUPH I HIEUH
+ {0xC099, 0xD55A}, //10869 #HANGUL SYLLABLE HIEUH A SSANGKIYEOK
+ {0xC09A, 0xD55B}, //10870 #HANGUL SYLLABLE HIEUH A KIYEOKSIOS
+ {0xC09B, 0xD55D}, //10871 #HANGUL SYLLABLE HIEUH A NIEUNCIEUC
+ {0xC09C, 0xD55E}, //10872 #HANGUL SYLLABLE HIEUH A NIEUNHIEUH
+ {0xC09D, 0xD55F}, //10873 #HANGUL SYLLABLE HIEUH A TIKEUT
+ {0xC09E, 0xD561}, //10874 #HANGUL SYLLABLE HIEUH A RIEULKIYEOK
+ {0xC09F, 0xD562}, //10875 #HANGUL SYLLABLE HIEUH A RIEULMIEUM
+ {0xC0A0, 0xD563}, //10876 #HANGUL SYLLABLE HIEUH A RIEULPIEUP
+ {0xC0A1, 0xC6E9}, //10877 #HANGUL SYLLABLE IEUNG WE KIYEOK
+ {0xC0A2, 0xC6EC}, //10878 #HANGUL SYLLABLE IEUNG WE NIEUN
+ {0xC0A3, 0xC6F0}, //10879 #HANGUL SYLLABLE IEUNG WE RIEUL
+ {0xC0A4, 0xC6F8}, //10880 #HANGUL SYLLABLE IEUNG WE MIEUM
+ {0xC0A5, 0xC6F9}, //10881 #HANGUL SYLLABLE IEUNG WE PIEUP
+ {0xC0A6, 0xC6FD}, //10882 #HANGUL SYLLABLE IEUNG WE IEUNG
+ {0xC0A7, 0xC704}, //10883 #HANGUL SYLLABLE IEUNG WI
+ {0xC0A8, 0xC705}, //10884 #HANGUL SYLLABLE IEUNG WI KIYEOK
+ {0xC0A9, 0xC708}, //10885 #HANGUL SYLLABLE IEUNG WI NIEUN
+ {0xC0AA, 0xC70C}, //10886 #HANGUL SYLLABLE IEUNG WI RIEUL
+ {0xC0AB, 0xC714}, //10887 #HANGUL SYLLABLE IEUNG WI MIEUM
+ {0xC0AC, 0xC715}, //10888 #HANGUL SYLLABLE IEUNG WI PIEUP
+ {0xC0AD, 0xC717}, //10889 #HANGUL SYLLABLE IEUNG WI SIOS
+ {0xC0AE, 0xC719}, //10890 #HANGUL SYLLABLE IEUNG WI IEUNG
+ {0xC0AF, 0xC720}, //10891 #HANGUL SYLLABLE IEUNG YU
+ {0xC0B0, 0xC721}, //10892 #HANGUL SYLLABLE IEUNG YU KIYEOK
+ {0xC0B1, 0xC724}, //10893 #HANGUL SYLLABLE IEUNG YU NIEUN
+ {0xC0B2, 0xC728}, //10894 #HANGUL SYLLABLE IEUNG YU RIEUL
+ {0xC0B3, 0xC730}, //10895 #HANGUL SYLLABLE IEUNG YU MIEUM
+ {0xC0B4, 0xC731}, //10896 #HANGUL SYLLABLE IEUNG YU PIEUP
+ {0xC0B5, 0xC733}, //10897 #HANGUL SYLLABLE IEUNG YU SIOS
+ {0xC0B6, 0xC735}, //10898 #HANGUL SYLLABLE IEUNG YU IEUNG
+ {0xC0B7, 0xC737}, //10899 #HANGUL SYLLABLE IEUNG YU CHIEUCH
+ {0xC0B8, 0xC73C}, //10900 #HANGUL SYLLABLE IEUNG EU
+ {0xC0B9, 0xC73D}, //10901 #HANGUL SYLLABLE IEUNG EU KIYEOK
+ {0xC0BA, 0xC740}, //10902 #HANGUL SYLLABLE IEUNG EU NIEUN
+ {0xC0BB, 0xC744}, //10903 #HANGUL SYLLABLE IEUNG EU RIEUL
+ {0xC0BC, 0xC74A}, //10904 #HANGUL SYLLABLE IEUNG EU RIEULPHIEUPH
+ {0xC0BD, 0xC74C}, //10905 #HANGUL SYLLABLE IEUNG EU MIEUM
+ {0xC0BE, 0xC74D}, //10906 #HANGUL SYLLABLE IEUNG EU PIEUP
+ {0xC0BF, 0xC74F}, //10907 #HANGUL SYLLABLE IEUNG EU SIOS
+ {0xC0C0, 0xC751}, //10908 #HANGUL SYLLABLE IEUNG EU IEUNG
+ {0xC0C1, 0xC752}, //10909 #HANGUL SYLLABLE IEUNG EU CIEUC
+ {0xC0C2, 0xC753}, //10910 #HANGUL SYLLABLE IEUNG EU CHIEUCH
+ {0xC0C3, 0xC754}, //10911 #HANGUL SYLLABLE IEUNG EU KHIEUKH
+ {0xC0C4, 0xC755}, //10912 #HANGUL SYLLABLE IEUNG EU THIEUTH
+ {0xC0C5, 0xC756}, //10913 #HANGUL SYLLABLE IEUNG EU PHIEUPH
+ {0xC0C6, 0xC757}, //10914 #HANGUL SYLLABLE IEUNG EU HIEUH
+ {0xC0C7, 0xC758}, //10915 #HANGUL SYLLABLE IEUNG YI
+ {0xC0C8, 0xC75C}, //10916 #HANGUL SYLLABLE IEUNG YI NIEUN
+ {0xC0C9, 0xC760}, //10917 #HANGUL SYLLABLE IEUNG YI RIEUL
+ {0xC0CA, 0xC768}, //10918 #HANGUL SYLLABLE IEUNG YI MIEUM
+ {0xC0CB, 0xC76B}, //10919 #HANGUL SYLLABLE IEUNG YI SIOS
+ {0xC0CC, 0xC774}, //10920 #HANGUL SYLLABLE IEUNG I
+ {0xC0CD, 0xC775}, //10921 #HANGUL SYLLABLE IEUNG I KIYEOK
+ {0xC0CE, 0xC778}, //10922 #HANGUL SYLLABLE IEUNG I NIEUN
+ {0xC0CF, 0xC77C}, //10923 #HANGUL SYLLABLE IEUNG I RIEUL
+ {0xC0D0, 0xC77D}, //10924 #HANGUL SYLLABLE IEUNG I RIEULKIYEOK
+ {0xC0D1, 0xC77E}, //10925 #HANGUL SYLLABLE IEUNG I RIEULMIEUM
+ {0xC0D2, 0xC783}, //10926 #HANGUL SYLLABLE IEUNG I RIEULHIEUH
+ {0xC0D3, 0xC784}, //10927 #HANGUL SYLLABLE IEUNG I MIEUM
+ {0xC0D4, 0xC785}, //10928 #HANGUL SYLLABLE IEUNG I PIEUP
+ {0xC0D5, 0xC787}, //10929 #HANGUL SYLLABLE IEUNG I SIOS
+ {0xC0D6, 0xC788}, //10930 #HANGUL SYLLABLE IEUNG I SSANGSIOS
+ {0xC0D7, 0xC789}, //10931 #HANGUL SYLLABLE IEUNG I IEUNG
+ {0xC0D8, 0xC78A}, //10932 #HANGUL SYLLABLE IEUNG I CIEUC
+ {0xC0D9, 0xC78E}, //10933 #HANGUL SYLLABLE IEUNG I PHIEUPH
+ {0xC0DA, 0xC790}, //10934 #HANGUL SYLLABLE CIEUC A
+ {0xC0DB, 0xC791}, //10935 #HANGUL SYLLABLE CIEUC A KIYEOK
+ {0xC0DC, 0xC794}, //10936 #HANGUL SYLLABLE CIEUC A NIEUN
+ {0xC0DD, 0xC796}, //10937 #HANGUL SYLLABLE CIEUC A NIEUNHIEUH
+ {0xC0DE, 0xC797}, //10938 #HANGUL SYLLABLE CIEUC A TIKEUT
+ {0xC0DF, 0xC798}, //10939 #HANGUL SYLLABLE CIEUC A RIEUL
+ {0xC0E0, 0xC79A}, //10940 #HANGUL SYLLABLE CIEUC A RIEULMIEUM
+ {0xC0E1, 0xC7A0}, //10941 #HANGUL SYLLABLE CIEUC A MIEUM
+ {0xC0E2, 0xC7A1}, //10942 #HANGUL SYLLABLE CIEUC A PIEUP
+ {0xC0E3, 0xC7A3}, //10943 #HANGUL SYLLABLE CIEUC A SIOS
+ {0xC0E4, 0xC7A4}, //10944 #HANGUL SYLLABLE CIEUC A SSANGSIOS
+ {0xC0E5, 0xC7A5}, //10945 #HANGUL SYLLABLE CIEUC A IEUNG
+ {0xC0E6, 0xC7A6}, //10946 #HANGUL SYLLABLE CIEUC A CIEUC
+ {0xC0E7, 0xC7AC}, //10947 #HANGUL SYLLABLE CIEUC AE
+ {0xC0E8, 0xC7AD}, //10948 #HANGUL SYLLABLE CIEUC AE KIYEOK
+ {0xC0E9, 0xC7B0}, //10949 #HANGUL SYLLABLE CIEUC AE NIEUN
+ {0xC0EA, 0xC7B4}, //10950 #HANGUL SYLLABLE CIEUC AE RIEUL
+ {0xC0EB, 0xC7BC}, //10951 #HANGUL SYLLABLE CIEUC AE MIEUM
+ {0xC0EC, 0xC7BD}, //10952 #HANGUL SYLLABLE CIEUC AE PIEUP
+ {0xC0ED, 0xC7BF}, //10953 #HANGUL SYLLABLE CIEUC AE SIOS
+ {0xC0EE, 0xC7C0}, //10954 #HANGUL SYLLABLE CIEUC AE SSANGSIOS
+ {0xC0EF, 0xC7C1}, //10955 #HANGUL SYLLABLE CIEUC AE IEUNG
+ {0xC0F0, 0xC7C8}, //10956 #HANGUL SYLLABLE CIEUC YA
+ {0xC0F1, 0xC7C9}, //10957 #HANGUL SYLLABLE CIEUC YA KIYEOK
+ {0xC0F2, 0xC7CC}, //10958 #HANGUL SYLLABLE CIEUC YA NIEUN
+ {0xC0F3, 0xC7CE}, //10959 #HANGUL SYLLABLE CIEUC YA NIEUNHIEUH
+ {0xC0F4, 0xC7D0}, //10960 #HANGUL SYLLABLE CIEUC YA RIEUL
+ {0xC0F5, 0xC7D8}, //10961 #HANGUL SYLLABLE CIEUC YA MIEUM
+ {0xC0F6, 0xC7DD}, //10962 #HANGUL SYLLABLE CIEUC YA IEUNG
+ {0xC0F7, 0xC7E4}, //10963 #HANGUL SYLLABLE CIEUC YAE
+ {0xC0F8, 0xC7E8}, //10964 #HANGUL SYLLABLE CIEUC YAE NIEUN
+ {0xC0F9, 0xC7EC}, //10965 #HANGUL SYLLABLE CIEUC YAE RIEUL
+ {0xC0FA, 0xC800}, //10966 #HANGUL SYLLABLE CIEUC EO
+ {0xC0FB, 0xC801}, //10967 #HANGUL SYLLABLE CIEUC EO KIYEOK
+ {0xC0FC, 0xC804}, //10968 #HANGUL SYLLABLE CIEUC EO NIEUN
+ {0xC0FD, 0xC808}, //10969 #HANGUL SYLLABLE CIEUC EO RIEUL
+ {0xC0FE, 0xC80A}, //10970 #HANGUL SYLLABLE CIEUC EO RIEULMIEUM
+ {0xC141, 0xD564}, //10971 #HANGUL SYLLABLE HIEUH A RIEULSIOS
+ {0xC142, 0xD566}, //10972 #HANGUL SYLLABLE HIEUH A RIEULPHIEUPH
+ {0xC143, 0xD567}, //10973 #HANGUL SYLLABLE HIEUH A RIEULHIEUH
+ {0xC144, 0xD56A}, //10974 #HANGUL SYLLABLE HIEUH A PIEUPSIOS
+ {0xC145, 0xD56C}, //10975 #HANGUL SYLLABLE HIEUH A SSANGSIOS
+ {0xC146, 0xD56E}, //10976 #HANGUL SYLLABLE HIEUH A CIEUC
+ {0xC147, 0xD56F}, //10977 #HANGUL SYLLABLE HIEUH A CHIEUCH
+ {0xC148, 0xD570}, //10978 #HANGUL SYLLABLE HIEUH A KHIEUKH
+ {0xC149, 0xD571}, //10979 #HANGUL SYLLABLE HIEUH A THIEUTH
+ {0xC14A, 0xD572}, //10980 #HANGUL SYLLABLE HIEUH A PHIEUPH
+ {0xC14B, 0xD573}, //10981 #HANGUL SYLLABLE HIEUH A HIEUH
+ {0xC14C, 0xD576}, //10982 #HANGUL SYLLABLE HIEUH AE SSANGKIYEOK
+ {0xC14D, 0xD577}, //10983 #HANGUL SYLLABLE HIEUH AE KIYEOKSIOS
+ {0xC14E, 0xD579}, //10984 #HANGUL SYLLABLE HIEUH AE NIEUNCIEUC
+ {0xC14F, 0xD57A}, //10985 #HANGUL SYLLABLE HIEUH AE NIEUNHIEUH
+ {0xC150, 0xD57B}, //10986 #HANGUL SYLLABLE HIEUH AE TIKEUT
+ {0xC151, 0xD57D}, //10987 #HANGUL SYLLABLE HIEUH AE RIEULKIYEOK
+ {0xC152, 0xD57E}, //10988 #HANGUL SYLLABLE HIEUH AE RIEULMIEUM
+ {0xC153, 0xD57F}, //10989 #HANGUL SYLLABLE HIEUH AE RIEULPIEUP
+ {0xC154, 0xD580}, //10990 #HANGUL SYLLABLE HIEUH AE RIEULSIOS
+ {0xC155, 0xD581}, //10991 #HANGUL SYLLABLE HIEUH AE RIEULTHIEUTH
+ {0xC156, 0xD582}, //10992 #HANGUL SYLLABLE HIEUH AE RIEULPHIEUPH
+ {0xC157, 0xD583}, //10993 #HANGUL SYLLABLE HIEUH AE RIEULHIEUH
+ {0xC158, 0xD586}, //10994 #HANGUL SYLLABLE HIEUH AE PIEUPSIOS
+ {0xC159, 0xD58A}, //10995 #HANGUL SYLLABLE HIEUH AE CIEUC
+ {0xC15A, 0xD58B}, //10996 #HANGUL SYLLABLE HIEUH AE CHIEUCH
+ {0xC161, 0xD58C}, //10997 #HANGUL SYLLABLE HIEUH AE KHIEUKH
+ {0xC162, 0xD58D}, //10998 #HANGUL SYLLABLE HIEUH AE THIEUTH
+ {0xC163, 0xD58E}, //10999 #HANGUL SYLLABLE HIEUH AE PHIEUPH
+ {0xC164, 0xD58F}, //11000 #HANGUL SYLLABLE HIEUH AE HIEUH
+ {0xC165, 0xD591}, //11001 #HANGUL SYLLABLE HIEUH YA KIYEOK
+ {0xC166, 0xD592}, //11002 #HANGUL SYLLABLE HIEUH YA SSANGKIYEOK
+ {0xC167, 0xD593}, //11003 #HANGUL SYLLABLE HIEUH YA KIYEOKSIOS
+ {0xC168, 0xD594}, //11004 #HANGUL SYLLABLE HIEUH YA NIEUN
+ {0xC169, 0xD595}, //11005 #HANGUL SYLLABLE HIEUH YA NIEUNCIEUC
+ {0xC16A, 0xD596}, //11006 #HANGUL SYLLABLE HIEUH YA NIEUNHIEUH
+ {0xC16B, 0xD597}, //11007 #HANGUL SYLLABLE HIEUH YA TIKEUT
+ {0xC16C, 0xD598}, //11008 #HANGUL SYLLABLE HIEUH YA RIEUL
+ {0xC16D, 0xD599}, //11009 #HANGUL SYLLABLE HIEUH YA RIEULKIYEOK
+ {0xC16E, 0xD59A}, //11010 #HANGUL SYLLABLE HIEUH YA RIEULMIEUM
+ {0xC16F, 0xD59B}, //11011 #HANGUL SYLLABLE HIEUH YA RIEULPIEUP
+ {0xC170, 0xD59C}, //11012 #HANGUL SYLLABLE HIEUH YA RIEULSIOS
+ {0xC171, 0xD59D}, //11013 #HANGUL SYLLABLE HIEUH YA RIEULTHIEUTH
+ {0xC172, 0xD59E}, //11014 #HANGUL SYLLABLE HIEUH YA RIEULPHIEUPH
+ {0xC173, 0xD59F}, //11015 #HANGUL SYLLABLE HIEUH YA RIEULHIEUH
+ {0xC174, 0xD5A0}, //11016 #HANGUL SYLLABLE HIEUH YA MIEUM
+ {0xC175, 0xD5A1}, //11017 #HANGUL SYLLABLE HIEUH YA PIEUP
+ {0xC176, 0xD5A2}, //11018 #HANGUL SYLLABLE HIEUH YA PIEUPSIOS
+ {0xC177, 0xD5A3}, //11019 #HANGUL SYLLABLE HIEUH YA SIOS
+ {0xC178, 0xD5A4}, //11020 #HANGUL SYLLABLE HIEUH YA SSANGSIOS
+ {0xC179, 0xD5A6}, //11021 #HANGUL SYLLABLE HIEUH YA CIEUC
+ {0xC17A, 0xD5A7}, //11022 #HANGUL SYLLABLE HIEUH YA CHIEUCH
+ {0xC181, 0xD5A8}, //11023 #HANGUL SYLLABLE HIEUH YA KHIEUKH
+ {0xC182, 0xD5A9}, //11024 #HANGUL SYLLABLE HIEUH YA THIEUTH
+ {0xC183, 0xD5AA}, //11025 #HANGUL SYLLABLE HIEUH YA PHIEUPH
+ {0xC184, 0xD5AB}, //11026 #HANGUL SYLLABLE HIEUH YA HIEUH
+ {0xC185, 0xD5AC}, //11027 #HANGUL SYLLABLE HIEUH YAE
+ {0xC186, 0xD5AD}, //11028 #HANGUL SYLLABLE HIEUH YAE KIYEOK
+ {0xC187, 0xD5AE}, //11029 #HANGUL SYLLABLE HIEUH YAE SSANGKIYEOK
+ {0xC188, 0xD5AF}, //11030 #HANGUL SYLLABLE HIEUH YAE KIYEOKSIOS
+ {0xC189, 0xD5B0}, //11031 #HANGUL SYLLABLE HIEUH YAE NIEUN
+ {0xC18A, 0xD5B1}, //11032 #HANGUL SYLLABLE HIEUH YAE NIEUNCIEUC
+ {0xC18B, 0xD5B2}, //11033 #HANGUL SYLLABLE HIEUH YAE NIEUNHIEUH
+ {0xC18C, 0xD5B3}, //11034 #HANGUL SYLLABLE HIEUH YAE TIKEUT
+ {0xC18D, 0xD5B4}, //11035 #HANGUL SYLLABLE HIEUH YAE RIEUL
+ {0xC18E, 0xD5B5}, //11036 #HANGUL SYLLABLE HIEUH YAE RIEULKIYEOK
+ {0xC18F, 0xD5B6}, //11037 #HANGUL SYLLABLE HIEUH YAE RIEULMIEUM
+ {0xC190, 0xD5B7}, //11038 #HANGUL SYLLABLE HIEUH YAE RIEULPIEUP
+ {0xC191, 0xD5B8}, //11039 #HANGUL SYLLABLE HIEUH YAE RIEULSIOS
+ {0xC192, 0xD5B9}, //11040 #HANGUL SYLLABLE HIEUH YAE RIEULTHIEUTH
+ {0xC193, 0xD5BA}, //11041 #HANGUL SYLLABLE HIEUH YAE RIEULPHIEUPH
+ {0xC194, 0xD5BB}, //11042 #HANGUL SYLLABLE HIEUH YAE RIEULHIEUH
+ {0xC195, 0xD5BC}, //11043 #HANGUL SYLLABLE HIEUH YAE MIEUM
+ {0xC196, 0xD5BD}, //11044 #HANGUL SYLLABLE HIEUH YAE PIEUP
+ {0xC197, 0xD5BE}, //11045 #HANGUL SYLLABLE HIEUH YAE PIEUPSIOS
+ {0xC198, 0xD5BF}, //11046 #HANGUL SYLLABLE HIEUH YAE SIOS
+ {0xC199, 0xD5C0}, //11047 #HANGUL SYLLABLE HIEUH YAE SSANGSIOS
+ {0xC19A, 0xD5C1}, //11048 #HANGUL SYLLABLE HIEUH YAE IEUNG
+ {0xC19B, 0xD5C2}, //11049 #HANGUL SYLLABLE HIEUH YAE CIEUC
+ {0xC19C, 0xD5C3}, //11050 #HANGUL SYLLABLE HIEUH YAE CHIEUCH
+ {0xC19D, 0xD5C4}, //11051 #HANGUL SYLLABLE HIEUH YAE KHIEUKH
+ {0xC19E, 0xD5C5}, //11052 #HANGUL SYLLABLE HIEUH YAE THIEUTH
+ {0xC19F, 0xD5C6}, //11053 #HANGUL SYLLABLE HIEUH YAE PHIEUPH
+ {0xC1A0, 0xD5C7}, //11054 #HANGUL SYLLABLE HIEUH YAE HIEUH
+ {0xC1A1, 0xC810}, //11055 #HANGUL SYLLABLE CIEUC EO MIEUM
+ {0xC1A2, 0xC811}, //11056 #HANGUL SYLLABLE CIEUC EO PIEUP
+ {0xC1A3, 0xC813}, //11057 #HANGUL SYLLABLE CIEUC EO SIOS
+ {0xC1A4, 0xC815}, //11058 #HANGUL SYLLABLE CIEUC EO IEUNG
+ {0xC1A5, 0xC816}, //11059 #HANGUL SYLLABLE CIEUC EO CIEUC
+ {0xC1A6, 0xC81C}, //11060 #HANGUL SYLLABLE CIEUC E
+ {0xC1A7, 0xC81D}, //11061 #HANGUL SYLLABLE CIEUC E KIYEOK
+ {0xC1A8, 0xC820}, //11062 #HANGUL SYLLABLE CIEUC E NIEUN
+ {0xC1A9, 0xC824}, //11063 #HANGUL SYLLABLE CIEUC E RIEUL
+ {0xC1AA, 0xC82C}, //11064 #HANGUL SYLLABLE CIEUC E MIEUM
+ {0xC1AB, 0xC82D}, //11065 #HANGUL SYLLABLE CIEUC E PIEUP
+ {0xC1AC, 0xC82F}, //11066 #HANGUL SYLLABLE CIEUC E SIOS
+ {0xC1AD, 0xC831}, //11067 #HANGUL SYLLABLE CIEUC E IEUNG
+ {0xC1AE, 0xC838}, //11068 #HANGUL SYLLABLE CIEUC YEO
+ {0xC1AF, 0xC83C}, //11069 #HANGUL SYLLABLE CIEUC YEO NIEUN
+ {0xC1B0, 0xC840}, //11070 #HANGUL SYLLABLE CIEUC YEO RIEUL
+ {0xC1B1, 0xC848}, //11071 #HANGUL SYLLABLE CIEUC YEO MIEUM
+ {0xC1B2, 0xC849}, //11072 #HANGUL SYLLABLE CIEUC YEO PIEUP
+ {0xC1B3, 0xC84C}, //11073 #HANGUL SYLLABLE CIEUC YEO SSANGSIOS
+ {0xC1B4, 0xC84D}, //11074 #HANGUL SYLLABLE CIEUC YEO IEUNG
+ {0xC1B5, 0xC854}, //11075 #HANGUL SYLLABLE CIEUC YE
+ {0xC1B6, 0xC870}, //11076 #HANGUL SYLLABLE CIEUC O
+ {0xC1B7, 0xC871}, //11077 #HANGUL SYLLABLE CIEUC O KIYEOK
+ {0xC1B8, 0xC874}, //11078 #HANGUL SYLLABLE CIEUC O NIEUN
+ {0xC1B9, 0xC878}, //11079 #HANGUL SYLLABLE CIEUC O RIEUL
+ {0xC1BA, 0xC87A}, //11080 #HANGUL SYLLABLE CIEUC O RIEULMIEUM
+ {0xC1BB, 0xC880}, //11081 #HANGUL SYLLABLE CIEUC O MIEUM
+ {0xC1BC, 0xC881}, //11082 #HANGUL SYLLABLE CIEUC O PIEUP
+ {0xC1BD, 0xC883}, //11083 #HANGUL SYLLABLE CIEUC O SIOS
+ {0xC1BE, 0xC885}, //11084 #HANGUL SYLLABLE CIEUC O IEUNG
+ {0xC1BF, 0xC886}, //11085 #HANGUL SYLLABLE CIEUC O CIEUC
+ {0xC1C0, 0xC887}, //11086 #HANGUL SYLLABLE CIEUC O CHIEUCH
+ {0xC1C1, 0xC88B}, //11087 #HANGUL SYLLABLE CIEUC O HIEUH
+ {0xC1C2, 0xC88C}, //11088 #HANGUL SYLLABLE CIEUC WA
+ {0xC1C3, 0xC88D}, //11089 #HANGUL SYLLABLE CIEUC WA KIYEOK
+ {0xC1C4, 0xC894}, //11090 #HANGUL SYLLABLE CIEUC WA RIEUL
+ {0xC1C5, 0xC89D}, //11091 #HANGUL SYLLABLE CIEUC WA PIEUP
+ {0xC1C6, 0xC89F}, //11092 #HANGUL SYLLABLE CIEUC WA SIOS
+ {0xC1C7, 0xC8A1}, //11093 #HANGUL SYLLABLE CIEUC WA IEUNG
+ {0xC1C8, 0xC8A8}, //11094 #HANGUL SYLLABLE CIEUC WAE
+ {0xC1C9, 0xC8BC}, //11095 #HANGUL SYLLABLE CIEUC WAE SSANGSIOS
+ {0xC1CA, 0xC8BD}, //11096 #HANGUL SYLLABLE CIEUC WAE IEUNG
+ {0xC1CB, 0xC8C4}, //11097 #HANGUL SYLLABLE CIEUC OE
+ {0xC1CC, 0xC8C8}, //11098 #HANGUL SYLLABLE CIEUC OE NIEUN
+ {0xC1CD, 0xC8CC}, //11099 #HANGUL SYLLABLE CIEUC OE RIEUL
+ {0xC1CE, 0xC8D4}, //11100 #HANGUL SYLLABLE CIEUC OE MIEUM
+ {0xC1CF, 0xC8D5}, //11101 #HANGUL SYLLABLE CIEUC OE PIEUP
+ {0xC1D0, 0xC8D7}, //11102 #HANGUL SYLLABLE CIEUC OE SIOS
+ {0xC1D1, 0xC8D9}, //11103 #HANGUL SYLLABLE CIEUC OE IEUNG
+ {0xC1D2, 0xC8E0}, //11104 #HANGUL SYLLABLE CIEUC YO
+ {0xC1D3, 0xC8E1}, //11105 #HANGUL SYLLABLE CIEUC YO KIYEOK
+ {0xC1D4, 0xC8E4}, //11106 #HANGUL SYLLABLE CIEUC YO NIEUN
+ {0xC1D5, 0xC8F5}, //11107 #HANGUL SYLLABLE CIEUC YO IEUNG
+ {0xC1D6, 0xC8FC}, //11108 #HANGUL SYLLABLE CIEUC U
+ {0xC1D7, 0xC8FD}, //11109 #HANGUL SYLLABLE CIEUC U KIYEOK
+ {0xC1D8, 0xC900}, //11110 #HANGUL SYLLABLE CIEUC U NIEUN
+ {0xC1D9, 0xC904}, //11111 #HANGUL SYLLABLE CIEUC U RIEUL
+ {0xC1DA, 0xC905}, //11112 #HANGUL SYLLABLE CIEUC U RIEULKIYEOK
+ {0xC1DB, 0xC906}, //11113 #HANGUL SYLLABLE CIEUC U RIEULMIEUM
+ {0xC1DC, 0xC90C}, //11114 #HANGUL SYLLABLE CIEUC U MIEUM
+ {0xC1DD, 0xC90D}, //11115 #HANGUL SYLLABLE CIEUC U PIEUP
+ {0xC1DE, 0xC90F}, //11116 #HANGUL SYLLABLE CIEUC U SIOS
+ {0xC1DF, 0xC911}, //11117 #HANGUL SYLLABLE CIEUC U IEUNG
+ {0xC1E0, 0xC918}, //11118 #HANGUL SYLLABLE CIEUC WEO
+ {0xC1E1, 0xC92C}, //11119 #HANGUL SYLLABLE CIEUC WEO SSANGSIOS
+ {0xC1E2, 0xC934}, //11120 #HANGUL SYLLABLE CIEUC WE
+ {0xC1E3, 0xC950}, //11121 #HANGUL SYLLABLE CIEUC WI
+ {0xC1E4, 0xC951}, //11122 #HANGUL SYLLABLE CIEUC WI KIYEOK
+ {0xC1E5, 0xC954}, //11123 #HANGUL SYLLABLE CIEUC WI NIEUN
+ {0xC1E6, 0xC958}, //11124 #HANGUL SYLLABLE CIEUC WI RIEUL
+ {0xC1E7, 0xC960}, //11125 #HANGUL SYLLABLE CIEUC WI MIEUM
+ {0xC1E8, 0xC961}, //11126 #HANGUL SYLLABLE CIEUC WI PIEUP
+ {0xC1E9, 0xC963}, //11127 #HANGUL SYLLABLE CIEUC WI SIOS
+ {0xC1EA, 0xC96C}, //11128 #HANGUL SYLLABLE CIEUC YU
+ {0xC1EB, 0xC970}, //11129 #HANGUL SYLLABLE CIEUC YU NIEUN
+ {0xC1EC, 0xC974}, //11130 #HANGUL SYLLABLE CIEUC YU RIEUL
+ {0xC1ED, 0xC97C}, //11131 #HANGUL SYLLABLE CIEUC YU MIEUM
+ {0xC1EE, 0xC988}, //11132 #HANGUL SYLLABLE CIEUC EU
+ {0xC1EF, 0xC989}, //11133 #HANGUL SYLLABLE CIEUC EU KIYEOK
+ {0xC1F0, 0xC98C}, //11134 #HANGUL SYLLABLE CIEUC EU NIEUN
+ {0xC1F1, 0xC990}, //11135 #HANGUL SYLLABLE CIEUC EU RIEUL
+ {0xC1F2, 0xC998}, //11136 #HANGUL SYLLABLE CIEUC EU MIEUM
+ {0xC1F3, 0xC999}, //11137 #HANGUL SYLLABLE CIEUC EU PIEUP
+ {0xC1F4, 0xC99B}, //11138 #HANGUL SYLLABLE CIEUC EU SIOS
+ {0xC1F5, 0xC99D}, //11139 #HANGUL SYLLABLE CIEUC EU IEUNG
+ {0xC1F6, 0xC9C0}, //11140 #HANGUL SYLLABLE CIEUC I
+ {0xC1F7, 0xC9C1}, //11141 #HANGUL SYLLABLE CIEUC I KIYEOK
+ {0xC1F8, 0xC9C4}, //11142 #HANGUL SYLLABLE CIEUC I NIEUN
+ {0xC1F9, 0xC9C7}, //11143 #HANGUL SYLLABLE CIEUC I TIKEUT
+ {0xC1FA, 0xC9C8}, //11144 #HANGUL SYLLABLE CIEUC I RIEUL
+ {0xC1FB, 0xC9CA}, //11145 #HANGUL SYLLABLE CIEUC I RIEULMIEUM
+ {0xC1FC, 0xC9D0}, //11146 #HANGUL SYLLABLE CIEUC I MIEUM
+ {0xC1FD, 0xC9D1}, //11147 #HANGUL SYLLABLE CIEUC I PIEUP
+ {0xC1FE, 0xC9D3}, //11148 #HANGUL SYLLABLE CIEUC I SIOS
+ {0xC241, 0xD5CA}, //11149 #HANGUL SYLLABLE HIEUH EO SSANGKIYEOK
+ {0xC242, 0xD5CB}, //11150 #HANGUL SYLLABLE HIEUH EO KIYEOKSIOS
+ {0xC243, 0xD5CD}, //11151 #HANGUL SYLLABLE HIEUH EO NIEUNCIEUC
+ {0xC244, 0xD5CE}, //11152 #HANGUL SYLLABLE HIEUH EO NIEUNHIEUH
+ {0xC245, 0xD5CF}, //11153 #HANGUL SYLLABLE HIEUH EO TIKEUT
+ {0xC246, 0xD5D1}, //11154 #HANGUL SYLLABLE HIEUH EO RIEULKIYEOK
+ {0xC247, 0xD5D3}, //11155 #HANGUL SYLLABLE HIEUH EO RIEULPIEUP
+ {0xC248, 0xD5D4}, //11156 #HANGUL SYLLABLE HIEUH EO RIEULSIOS
+ {0xC249, 0xD5D5}, //11157 #HANGUL SYLLABLE HIEUH EO RIEULTHIEUTH
+ {0xC24A, 0xD5D6}, //11158 #HANGUL SYLLABLE HIEUH EO RIEULPHIEUPH
+ {0xC24B, 0xD5D7}, //11159 #HANGUL SYLLABLE HIEUH EO RIEULHIEUH
+ {0xC24C, 0xD5DA}, //11160 #HANGUL SYLLABLE HIEUH EO PIEUPSIOS
+ {0xC24D, 0xD5DC}, //11161 #HANGUL SYLLABLE HIEUH EO SSANGSIOS
+ {0xC24E, 0xD5DE}, //11162 #HANGUL SYLLABLE HIEUH EO CIEUC
+ {0xC24F, 0xD5DF}, //11163 #HANGUL SYLLABLE HIEUH EO CHIEUCH
+ {0xC250, 0xD5E0}, //11164 #HANGUL SYLLABLE HIEUH EO KHIEUKH
+ {0xC251, 0xD5E1}, //11165 #HANGUL SYLLABLE HIEUH EO THIEUTH
+ {0xC252, 0xD5E2}, //11166 #HANGUL SYLLABLE HIEUH EO PHIEUPH
+ {0xC253, 0xD5E3}, //11167 #HANGUL SYLLABLE HIEUH EO HIEUH
+ {0xC254, 0xD5E6}, //11168 #HANGUL SYLLABLE HIEUH E SSANGKIYEOK
+ {0xC255, 0xD5E7}, //11169 #HANGUL SYLLABLE HIEUH E KIYEOKSIOS
+ {0xC256, 0xD5E9}, //11170 #HANGUL SYLLABLE HIEUH E NIEUNCIEUC
+ {0xC257, 0xD5EA}, //11171 #HANGUL SYLLABLE HIEUH E NIEUNHIEUH
+ {0xC258, 0xD5EB}, //11172 #HANGUL SYLLABLE HIEUH E TIKEUT
+ {0xC259, 0xD5ED}, //11173 #HANGUL SYLLABLE HIEUH E RIEULKIYEOK
+ {0xC25A, 0xD5EE}, //11174 #HANGUL SYLLABLE HIEUH E RIEULMIEUM
+ {0xC261, 0xD5EF}, //11175 #HANGUL SYLLABLE HIEUH E RIEULPIEUP
+ {0xC262, 0xD5F0}, //11176 #HANGUL SYLLABLE HIEUH E RIEULSIOS
+ {0xC263, 0xD5F1}, //11177 #HANGUL SYLLABLE HIEUH E RIEULTHIEUTH
+ {0xC264, 0xD5F2}, //11178 #HANGUL SYLLABLE HIEUH E RIEULPHIEUPH
+ {0xC265, 0xD5F3}, //11179 #HANGUL SYLLABLE HIEUH E RIEULHIEUH
+ {0xC266, 0xD5F6}, //11180 #HANGUL SYLLABLE HIEUH E PIEUPSIOS
+ {0xC267, 0xD5F8}, //11181 #HANGUL SYLLABLE HIEUH E SSANGSIOS
+ {0xC268, 0xD5FA}, //11182 #HANGUL SYLLABLE HIEUH E CIEUC
+ {0xC269, 0xD5FB}, //11183 #HANGUL SYLLABLE HIEUH E CHIEUCH
+ {0xC26A, 0xD5FC}, //11184 #HANGUL SYLLABLE HIEUH E KHIEUKH
+ {0xC26B, 0xD5FD}, //11185 #HANGUL SYLLABLE HIEUH E THIEUTH
+ {0xC26C, 0xD5FE}, //11186 #HANGUL SYLLABLE HIEUH E PHIEUPH
+ {0xC26D, 0xD5FF}, //11187 #HANGUL SYLLABLE HIEUH E HIEUH
+ {0xC26E, 0xD602}, //11188 #HANGUL SYLLABLE HIEUH YEO SSANGKIYEOK
+ {0xC26F, 0xD603}, //11189 #HANGUL SYLLABLE HIEUH YEO KIYEOKSIOS
+ {0xC270, 0xD605}, //11190 #HANGUL SYLLABLE HIEUH YEO NIEUNCIEUC
+ {0xC271, 0xD606}, //11191 #HANGUL SYLLABLE HIEUH YEO NIEUNHIEUH
+ {0xC272, 0xD607}, //11192 #HANGUL SYLLABLE HIEUH YEO TIKEUT
+ {0xC273, 0xD609}, //11193 #HANGUL SYLLABLE HIEUH YEO RIEULKIYEOK
+ {0xC274, 0xD60A}, //11194 #HANGUL SYLLABLE HIEUH YEO RIEULMIEUM
+ {0xC275, 0xD60B}, //11195 #HANGUL SYLLABLE HIEUH YEO RIEULPIEUP
+ {0xC276, 0xD60C}, //11196 #HANGUL SYLLABLE HIEUH YEO RIEULSIOS
+ {0xC277, 0xD60D}, //11197 #HANGUL SYLLABLE HIEUH YEO RIEULTHIEUTH
+ {0xC278, 0xD60E}, //11198 #HANGUL SYLLABLE HIEUH YEO RIEULPHIEUPH
+ {0xC279, 0xD60F}, //11199 #HANGUL SYLLABLE HIEUH YEO RIEULHIEUH
+ {0xC27A, 0xD612}, //11200 #HANGUL SYLLABLE HIEUH YEO PIEUPSIOS
+ {0xC281, 0xD616}, //11201 #HANGUL SYLLABLE HIEUH YEO CIEUC
+ {0xC282, 0xD617}, //11202 #HANGUL SYLLABLE HIEUH YEO CHIEUCH
+ {0xC283, 0xD618}, //11203 #HANGUL SYLLABLE HIEUH YEO KHIEUKH
+ {0xC284, 0xD619}, //11204 #HANGUL SYLLABLE HIEUH YEO THIEUTH
+ {0xC285, 0xD61A}, //11205 #HANGUL SYLLABLE HIEUH YEO PHIEUPH
+ {0xC286, 0xD61B}, //11206 #HANGUL SYLLABLE HIEUH YEO HIEUH
+ {0xC287, 0xD61D}, //11207 #HANGUL SYLLABLE HIEUH YE KIYEOK
+ {0xC288, 0xD61E}, //11208 #HANGUL SYLLABLE HIEUH YE SSANGKIYEOK
+ {0xC289, 0xD61F}, //11209 #HANGUL SYLLABLE HIEUH YE KIYEOKSIOS
+ {0xC28A, 0xD621}, //11210 #HANGUL SYLLABLE HIEUH YE NIEUNCIEUC
+ {0xC28B, 0xD622}, //11211 #HANGUL SYLLABLE HIEUH YE NIEUNHIEUH
+ {0xC28C, 0xD623}, //11212 #HANGUL SYLLABLE HIEUH YE TIKEUT
+ {0xC28D, 0xD625}, //11213 #HANGUL SYLLABLE HIEUH YE RIEULKIYEOK
+ {0xC28E, 0xD626}, //11214 #HANGUL SYLLABLE HIEUH YE RIEULMIEUM
+ {0xC28F, 0xD627}, //11215 #HANGUL SYLLABLE HIEUH YE RIEULPIEUP
+ {0xC290, 0xD628}, //11216 #HANGUL SYLLABLE HIEUH YE RIEULSIOS
+ {0xC291, 0xD629}, //11217 #HANGUL SYLLABLE HIEUH YE RIEULTHIEUTH
+ {0xC292, 0xD62A}, //11218 #HANGUL SYLLABLE HIEUH YE RIEULPHIEUPH
+ {0xC293, 0xD62B}, //11219 #HANGUL SYLLABLE HIEUH YE RIEULHIEUH
+ {0xC294, 0xD62C}, //11220 #HANGUL SYLLABLE HIEUH YE MIEUM
+ {0xC295, 0xD62E}, //11221 #HANGUL SYLLABLE HIEUH YE PIEUPSIOS
+ {0xC296, 0xD62F}, //11222 #HANGUL SYLLABLE HIEUH YE SIOS
+ {0xC297, 0xD630}, //11223 #HANGUL SYLLABLE HIEUH YE SSANGSIOS
+ {0xC298, 0xD631}, //11224 #HANGUL SYLLABLE HIEUH YE IEUNG
+ {0xC299, 0xD632}, //11225 #HANGUL SYLLABLE HIEUH YE CIEUC
+ {0xC29A, 0xD633}, //11226 #HANGUL SYLLABLE HIEUH YE CHIEUCH
+ {0xC29B, 0xD634}, //11227 #HANGUL SYLLABLE HIEUH YE KHIEUKH
+ {0xC29C, 0xD635}, //11228 #HANGUL SYLLABLE HIEUH YE THIEUTH
+ {0xC29D, 0xD636}, //11229 #HANGUL SYLLABLE HIEUH YE PHIEUPH
+ {0xC29E, 0xD637}, //11230 #HANGUL SYLLABLE HIEUH YE HIEUH
+ {0xC29F, 0xD63A}, //11231 #HANGUL SYLLABLE HIEUH O SSANGKIYEOK
+ {0xC2A0, 0xD63B}, //11232 #HANGUL SYLLABLE HIEUH O KIYEOKSIOS
+ {0xC2A1, 0xC9D5}, //11233 #HANGUL SYLLABLE CIEUC I IEUNG
+ {0xC2A2, 0xC9D6}, //11234 #HANGUL SYLLABLE CIEUC I CIEUC
+ {0xC2A3, 0xC9D9}, //11235 #HANGUL SYLLABLE CIEUC I THIEUTH
+ {0xC2A4, 0xC9DA}, //11236 #HANGUL SYLLABLE CIEUC I PHIEUPH
+ {0xC2A5, 0xC9DC}, //11237 #HANGUL SYLLABLE SSANGCIEUC A
+ {0xC2A6, 0xC9DD}, //11238 #HANGUL SYLLABLE SSANGCIEUC A KIYEOK
+ {0xC2A7, 0xC9E0}, //11239 #HANGUL SYLLABLE SSANGCIEUC A NIEUN
+ {0xC2A8, 0xC9E2}, //11240 #HANGUL SYLLABLE SSANGCIEUC A NIEUNHIEUH
+ {0xC2A9, 0xC9E4}, //11241 #HANGUL SYLLABLE SSANGCIEUC A RIEUL
+ {0xC2AA, 0xC9E7}, //11242 #HANGUL SYLLABLE SSANGCIEUC A RIEULPIEUP
+ {0xC2AB, 0xC9EC}, //11243 #HANGUL SYLLABLE SSANGCIEUC A MIEUM
+ {0xC2AC, 0xC9ED}, //11244 #HANGUL SYLLABLE SSANGCIEUC A PIEUP
+ {0xC2AD, 0xC9EF}, //11245 #HANGUL SYLLABLE SSANGCIEUC A SIOS
+ {0xC2AE, 0xC9F0}, //11246 #HANGUL SYLLABLE SSANGCIEUC A SSANGSIOS
+ {0xC2AF, 0xC9F1}, //11247 #HANGUL SYLLABLE SSANGCIEUC A IEUNG
+ {0xC2B0, 0xC9F8}, //11248 #HANGUL SYLLABLE SSANGCIEUC AE
+ {0xC2B1, 0xC9F9}, //11249 #HANGUL SYLLABLE SSANGCIEUC AE KIYEOK
+ {0xC2B2, 0xC9FC}, //11250 #HANGUL SYLLABLE SSANGCIEUC AE NIEUN
+ {0xC2B3, 0xCA00}, //11251 #HANGUL SYLLABLE SSANGCIEUC AE RIEUL
+ {0xC2B4, 0xCA08}, //11252 #HANGUL SYLLABLE SSANGCIEUC AE MIEUM
+ {0xC2B5, 0xCA09}, //11253 #HANGUL SYLLABLE SSANGCIEUC AE PIEUP
+ {0xC2B6, 0xCA0B}, //11254 #HANGUL SYLLABLE SSANGCIEUC AE SIOS
+ {0xC2B7, 0xCA0C}, //11255 #HANGUL SYLLABLE SSANGCIEUC AE SSANGSIOS
+ {0xC2B8, 0xCA0D}, //11256 #HANGUL SYLLABLE SSANGCIEUC AE IEUNG
+ {0xC2B9, 0xCA14}, //11257 #HANGUL SYLLABLE SSANGCIEUC YA
+ {0xC2BA, 0xCA18}, //11258 #HANGUL SYLLABLE SSANGCIEUC YA NIEUN
+ {0xC2BB, 0xCA29}, //11259 #HANGUL SYLLABLE SSANGCIEUC YA IEUNG
+ {0xC2BC, 0xCA4C}, //11260 #HANGUL SYLLABLE SSANGCIEUC EO
+ {0xC2BD, 0xCA4D}, //11261 #HANGUL SYLLABLE SSANGCIEUC EO KIYEOK
+ {0xC2BE, 0xCA50}, //11262 #HANGUL SYLLABLE SSANGCIEUC EO NIEUN
+ {0xC2BF, 0xCA54}, //11263 #HANGUL SYLLABLE SSANGCIEUC EO RIEUL
+ {0xC2C0, 0xCA5C}, //11264 #HANGUL SYLLABLE SSANGCIEUC EO MIEUM
+ {0xC2C1, 0xCA5D}, //11265 #HANGUL SYLLABLE SSANGCIEUC EO PIEUP
+ {0xC2C2, 0xCA5F}, //11266 #HANGUL SYLLABLE SSANGCIEUC EO SIOS
+ {0xC2C3, 0xCA60}, //11267 #HANGUL SYLLABLE SSANGCIEUC EO SSANGSIOS
+ {0xC2C4, 0xCA61}, //11268 #HANGUL SYLLABLE SSANGCIEUC EO IEUNG
+ {0xC2C5, 0xCA68}, //11269 #HANGUL SYLLABLE SSANGCIEUC E
+ {0xC2C6, 0xCA7D}, //11270 #HANGUL SYLLABLE SSANGCIEUC E IEUNG
+ {0xC2C7, 0xCA84}, //11271 #HANGUL SYLLABLE SSANGCIEUC YEO
+ {0xC2C8, 0xCA98}, //11272 #HANGUL SYLLABLE SSANGCIEUC YEO SSANGSIOS
+ {0xC2C9, 0xCABC}, //11273 #HANGUL SYLLABLE SSANGCIEUC O
+ {0xC2CA, 0xCABD}, //11274 #HANGUL SYLLABLE SSANGCIEUC O KIYEOK
+ {0xC2CB, 0xCAC0}, //11275 #HANGUL SYLLABLE SSANGCIEUC O NIEUN
+ {0xC2CC, 0xCAC4}, //11276 #HANGUL SYLLABLE SSANGCIEUC O RIEUL
+ {0xC2CD, 0xCACC}, //11277 #HANGUL SYLLABLE SSANGCIEUC O MIEUM
+ {0xC2CE, 0xCACD}, //11278 #HANGUL SYLLABLE SSANGCIEUC O PIEUP
+ {0xC2CF, 0xCACF}, //11279 #HANGUL SYLLABLE SSANGCIEUC O SIOS
+ {0xC2D0, 0xCAD1}, //11280 #HANGUL SYLLABLE SSANGCIEUC O IEUNG
+ {0xC2D1, 0xCAD3}, //11281 #HANGUL SYLLABLE SSANGCIEUC O CHIEUCH
+ {0xC2D2, 0xCAD8}, //11282 #HANGUL SYLLABLE SSANGCIEUC WA
+ {0xC2D3, 0xCAD9}, //11283 #HANGUL SYLLABLE SSANGCIEUC WA KIYEOK
+ {0xC2D4, 0xCAE0}, //11284 #HANGUL SYLLABLE SSANGCIEUC WA RIEUL
+ {0xC2D5, 0xCAEC}, //11285 #HANGUL SYLLABLE SSANGCIEUC WA SSANGSIOS
+ {0xC2D6, 0xCAF4}, //11286 #HANGUL SYLLABLE SSANGCIEUC WAE
+ {0xC2D7, 0xCB08}, //11287 #HANGUL SYLLABLE SSANGCIEUC WAE SSANGSIOS
+ {0xC2D8, 0xCB10}, //11288 #HANGUL SYLLABLE SSANGCIEUC OE
+ {0xC2D9, 0xCB14}, //11289 #HANGUL SYLLABLE SSANGCIEUC OE NIEUN
+ {0xC2DA, 0xCB18}, //11290 #HANGUL SYLLABLE SSANGCIEUC OE RIEUL
+ {0xC2DB, 0xCB20}, //11291 #HANGUL SYLLABLE SSANGCIEUC OE MIEUM
+ {0xC2DC, 0xCB21}, //11292 #HANGUL SYLLABLE SSANGCIEUC OE PIEUP
+ {0xC2DD, 0xCB41}, //11293 #HANGUL SYLLABLE SSANGCIEUC YO IEUNG
+ {0xC2DE, 0xCB48}, //11294 #HANGUL SYLLABLE SSANGCIEUC U
+ {0xC2DF, 0xCB49}, //11295 #HANGUL SYLLABLE SSANGCIEUC U KIYEOK
+ {0xC2E0, 0xCB4C}, //11296 #HANGUL SYLLABLE SSANGCIEUC U NIEUN
+ {0xC2E1, 0xCB50}, //11297 #HANGUL SYLLABLE SSANGCIEUC U RIEUL
+ {0xC2E2, 0xCB58}, //11298 #HANGUL SYLLABLE SSANGCIEUC U MIEUM
+ {0xC2E3, 0xCB59}, //11299 #HANGUL SYLLABLE SSANGCIEUC U PIEUP
+ {0xC2E4, 0xCB5D}, //11300 #HANGUL SYLLABLE SSANGCIEUC U IEUNG
+ {0xC2E5, 0xCB64}, //11301 #HANGUL SYLLABLE SSANGCIEUC WEO
+ {0xC2E6, 0xCB78}, //11302 #HANGUL SYLLABLE SSANGCIEUC WEO SSANGSIOS
+ {0xC2E7, 0xCB79}, //11303 #HANGUL SYLLABLE SSANGCIEUC WEO IEUNG
+ {0xC2E8, 0xCB9C}, //11304 #HANGUL SYLLABLE SSANGCIEUC WI
+ {0xC2E9, 0xCBB8}, //11305 #HANGUL SYLLABLE SSANGCIEUC YU
+ {0xC2EA, 0xCBD4}, //11306 #HANGUL SYLLABLE SSANGCIEUC EU
+ {0xC2EB, 0xCBE4}, //11307 #HANGUL SYLLABLE SSANGCIEUC EU MIEUM
+ {0xC2EC, 0xCBE7}, //11308 #HANGUL SYLLABLE SSANGCIEUC EU SIOS
+ {0xC2ED, 0xCBE9}, //11309 #HANGUL SYLLABLE SSANGCIEUC EU IEUNG
+ {0xC2EE, 0xCC0C}, //11310 #HANGUL SYLLABLE SSANGCIEUC I
+ {0xC2EF, 0xCC0D}, //11311 #HANGUL SYLLABLE SSANGCIEUC I KIYEOK
+ {0xC2F0, 0xCC10}, //11312 #HANGUL SYLLABLE SSANGCIEUC I NIEUN
+ {0xC2F1, 0xCC14}, //11313 #HANGUL SYLLABLE SSANGCIEUC I RIEUL
+ {0xC2F2, 0xCC1C}, //11314 #HANGUL SYLLABLE SSANGCIEUC I MIEUM
+ {0xC2F3, 0xCC1D}, //11315 #HANGUL SYLLABLE SSANGCIEUC I PIEUP
+ {0xC2F4, 0xCC21}, //11316 #HANGUL SYLLABLE SSANGCIEUC I IEUNG
+ {0xC2F5, 0xCC22}, //11317 #HANGUL SYLLABLE SSANGCIEUC I CIEUC
+ {0xC2F6, 0xCC27}, //11318 #HANGUL SYLLABLE SSANGCIEUC I HIEUH
+ {0xC2F7, 0xCC28}, //11319 #HANGUL SYLLABLE CHIEUCH A
+ {0xC2F8, 0xCC29}, //11320 #HANGUL SYLLABLE CHIEUCH A KIYEOK
+ {0xC2F9, 0xCC2C}, //11321 #HANGUL SYLLABLE CHIEUCH A NIEUN
+ {0xC2FA, 0xCC2E}, //11322 #HANGUL SYLLABLE CHIEUCH A NIEUNHIEUH
+ {0xC2FB, 0xCC30}, //11323 #HANGUL SYLLABLE CHIEUCH A RIEUL
+ {0xC2FC, 0xCC38}, //11324 #HANGUL SYLLABLE CHIEUCH A MIEUM
+ {0xC2FD, 0xCC39}, //11325 #HANGUL SYLLABLE CHIEUCH A PIEUP
+ {0xC2FE, 0xCC3B}, //11326 #HANGUL SYLLABLE CHIEUCH A SIOS
+ {0xC341, 0xD63D}, //11327 #HANGUL SYLLABLE HIEUH O NIEUNCIEUC
+ {0xC342, 0xD63E}, //11328 #HANGUL SYLLABLE HIEUH O NIEUNHIEUH
+ {0xC343, 0xD63F}, //11329 #HANGUL SYLLABLE HIEUH O TIKEUT
+ {0xC344, 0xD641}, //11330 #HANGUL SYLLABLE HIEUH O RIEULKIYEOK
+ {0xC345, 0xD642}, //11331 #HANGUL SYLLABLE HIEUH O RIEULMIEUM
+ {0xC346, 0xD643}, //11332 #HANGUL SYLLABLE HIEUH O RIEULPIEUP
+ {0xC347, 0xD644}, //11333 #HANGUL SYLLABLE HIEUH O RIEULSIOS
+ {0xC348, 0xD646}, //11334 #HANGUL SYLLABLE HIEUH O RIEULPHIEUPH
+ {0xC349, 0xD647}, //11335 #HANGUL SYLLABLE HIEUH O RIEULHIEUH
+ {0xC34A, 0xD64A}, //11336 #HANGUL SYLLABLE HIEUH O PIEUPSIOS
+ {0xC34B, 0xD64C}, //11337 #HANGUL SYLLABLE HIEUH O SSANGSIOS
+ {0xC34C, 0xD64E}, //11338 #HANGUL SYLLABLE HIEUH O CIEUC
+ {0xC34D, 0xD64F}, //11339 #HANGUL SYLLABLE HIEUH O CHIEUCH
+ {0xC34E, 0xD650}, //11340 #HANGUL SYLLABLE HIEUH O KHIEUKH
+ {0xC34F, 0xD652}, //11341 #HANGUL SYLLABLE HIEUH O PHIEUPH
+ {0xC350, 0xD653}, //11342 #HANGUL SYLLABLE HIEUH O HIEUH
+ {0xC351, 0xD656}, //11343 #HANGUL SYLLABLE HIEUH WA SSANGKIYEOK
+ {0xC352, 0xD657}, //11344 #HANGUL SYLLABLE HIEUH WA KIYEOKSIOS
+ {0xC353, 0xD659}, //11345 #HANGUL SYLLABLE HIEUH WA NIEUNCIEUC
+ {0xC354, 0xD65A}, //11346 #HANGUL SYLLABLE HIEUH WA NIEUNHIEUH
+ {0xC355, 0xD65B}, //11347 #HANGUL SYLLABLE HIEUH WA TIKEUT
+ {0xC356, 0xD65D}, //11348 #HANGUL SYLLABLE HIEUH WA RIEULKIYEOK
+ {0xC357, 0xD65E}, //11349 #HANGUL SYLLABLE HIEUH WA RIEULMIEUM
+ {0xC358, 0xD65F}, //11350 #HANGUL SYLLABLE HIEUH WA RIEULPIEUP
+ {0xC359, 0xD660}, //11351 #HANGUL SYLLABLE HIEUH WA RIEULSIOS
+ {0xC35A, 0xD661}, //11352 #HANGUL SYLLABLE HIEUH WA RIEULTHIEUTH
+ {0xC361, 0xD662}, //11353 #HANGUL SYLLABLE HIEUH WA RIEULPHIEUPH
+ {0xC362, 0xD663}, //11354 #HANGUL SYLLABLE HIEUH WA RIEULHIEUH
+ {0xC363, 0xD664}, //11355 #HANGUL SYLLABLE HIEUH WA MIEUM
+ {0xC364, 0xD665}, //11356 #HANGUL SYLLABLE HIEUH WA PIEUP
+ {0xC365, 0xD666}, //11357 #HANGUL SYLLABLE HIEUH WA PIEUPSIOS
+ {0xC366, 0xD668}, //11358 #HANGUL SYLLABLE HIEUH WA SSANGSIOS
+ {0xC367, 0xD66A}, //11359 #HANGUL SYLLABLE HIEUH WA CIEUC
+ {0xC368, 0xD66B}, //11360 #HANGUL SYLLABLE HIEUH WA CHIEUCH
+ {0xC369, 0xD66C}, //11361 #HANGUL SYLLABLE HIEUH WA KHIEUKH
+ {0xC36A, 0xD66D}, //11362 #HANGUL SYLLABLE HIEUH WA THIEUTH
+ {0xC36B, 0xD66E}, //11363 #HANGUL SYLLABLE HIEUH WA PHIEUPH
+ {0xC36C, 0xD66F}, //11364 #HANGUL SYLLABLE HIEUH WA HIEUH
+ {0xC36D, 0xD672}, //11365 #HANGUL SYLLABLE HIEUH WAE SSANGKIYEOK
+ {0xC36E, 0xD673}, //11366 #HANGUL SYLLABLE HIEUH WAE KIYEOKSIOS
+ {0xC36F, 0xD675}, //11367 #HANGUL SYLLABLE HIEUH WAE NIEUNCIEUC
+ {0xC370, 0xD676}, //11368 #HANGUL SYLLABLE HIEUH WAE NIEUNHIEUH
+ {0xC371, 0xD677}, //11369 #HANGUL SYLLABLE HIEUH WAE TIKEUT
+ {0xC372, 0xD678}, //11370 #HANGUL SYLLABLE HIEUH WAE RIEUL
+ {0xC373, 0xD679}, //11371 #HANGUL SYLLABLE HIEUH WAE RIEULKIYEOK
+ {0xC374, 0xD67A}, //11372 #HANGUL SYLLABLE HIEUH WAE RIEULMIEUM
+ {0xC375, 0xD67B}, //11373 #HANGUL SYLLABLE HIEUH WAE RIEULPIEUP
+ {0xC376, 0xD67C}, //11374 #HANGUL SYLLABLE HIEUH WAE RIEULSIOS
+ {0xC377, 0xD67D}, //11375 #HANGUL SYLLABLE HIEUH WAE RIEULTHIEUTH
+ {0xC378, 0xD67E}, //11376 #HANGUL SYLLABLE HIEUH WAE RIEULPHIEUPH
+ {0xC379, 0xD67F}, //11377 #HANGUL SYLLABLE HIEUH WAE RIEULHIEUH
+ {0xC37A, 0xD680}, //11378 #HANGUL SYLLABLE HIEUH WAE MIEUM
+ {0xC381, 0xD681}, //11379 #HANGUL SYLLABLE HIEUH WAE PIEUP
+ {0xC382, 0xD682}, //11380 #HANGUL SYLLABLE HIEUH WAE PIEUPSIOS
+ {0xC383, 0xD684}, //11381 #HANGUL SYLLABLE HIEUH WAE SSANGSIOS
+ {0xC384, 0xD686}, //11382 #HANGUL SYLLABLE HIEUH WAE CIEUC
+ {0xC385, 0xD687}, //11383 #HANGUL SYLLABLE HIEUH WAE CHIEUCH
+ {0xC386, 0xD688}, //11384 #HANGUL SYLLABLE HIEUH WAE KHIEUKH
+ {0xC387, 0xD689}, //11385 #HANGUL SYLLABLE HIEUH WAE THIEUTH
+ {0xC388, 0xD68A}, //11386 #HANGUL SYLLABLE HIEUH WAE PHIEUPH
+ {0xC389, 0xD68B}, //11387 #HANGUL SYLLABLE HIEUH WAE HIEUH
+ {0xC38A, 0xD68E}, //11388 #HANGUL SYLLABLE HIEUH OE SSANGKIYEOK
+ {0xC38B, 0xD68F}, //11389 #HANGUL SYLLABLE HIEUH OE KIYEOKSIOS
+ {0xC38C, 0xD691}, //11390 #HANGUL SYLLABLE HIEUH OE NIEUNCIEUC
+ {0xC38D, 0xD692}, //11391 #HANGUL SYLLABLE HIEUH OE NIEUNHIEUH
+ {0xC38E, 0xD693}, //11392 #HANGUL SYLLABLE HIEUH OE TIKEUT
+ {0xC38F, 0xD695}, //11393 #HANGUL SYLLABLE HIEUH OE RIEULKIYEOK
+ {0xC390, 0xD696}, //11394 #HANGUL SYLLABLE HIEUH OE RIEULMIEUM
+ {0xC391, 0xD697}, //11395 #HANGUL SYLLABLE HIEUH OE RIEULPIEUP
+ {0xC392, 0xD698}, //11396 #HANGUL SYLLABLE HIEUH OE RIEULSIOS
+ {0xC393, 0xD699}, //11397 #HANGUL SYLLABLE HIEUH OE RIEULTHIEUTH
+ {0xC394, 0xD69A}, //11398 #HANGUL SYLLABLE HIEUH OE RIEULPHIEUPH
+ {0xC395, 0xD69B}, //11399 #HANGUL SYLLABLE HIEUH OE RIEULHIEUH
+ {0xC396, 0xD69C}, //11400 #HANGUL SYLLABLE HIEUH OE MIEUM
+ {0xC397, 0xD69E}, //11401 #HANGUL SYLLABLE HIEUH OE PIEUPSIOS
+ {0xC398, 0xD6A0}, //11402 #HANGUL SYLLABLE HIEUH OE SSANGSIOS
+ {0xC399, 0xD6A2}, //11403 #HANGUL SYLLABLE HIEUH OE CIEUC
+ {0xC39A, 0xD6A3}, //11404 #HANGUL SYLLABLE HIEUH OE CHIEUCH
+ {0xC39B, 0xD6A4}, //11405 #HANGUL SYLLABLE HIEUH OE KHIEUKH
+ {0xC39C, 0xD6A5}, //11406 #HANGUL SYLLABLE HIEUH OE THIEUTH
+ {0xC39D, 0xD6A6}, //11407 #HANGUL SYLLABLE HIEUH OE PHIEUPH
+ {0xC39E, 0xD6A7}, //11408 #HANGUL SYLLABLE HIEUH OE HIEUH
+ {0xC39F, 0xD6A9}, //11409 #HANGUL SYLLABLE HIEUH YO KIYEOK
+ {0xC3A0, 0xD6AA}, //11410 #HANGUL SYLLABLE HIEUH YO SSANGKIYEOK
+ {0xC3A1, 0xCC3C}, //11411 #HANGUL SYLLABLE CHIEUCH A SSANGSIOS
+ {0xC3A2, 0xCC3D}, //11412 #HANGUL SYLLABLE CHIEUCH A IEUNG
+ {0xC3A3, 0xCC3E}, //11413 #HANGUL SYLLABLE CHIEUCH A CIEUC
+ {0xC3A4, 0xCC44}, //11414 #HANGUL SYLLABLE CHIEUCH AE
+ {0xC3A5, 0xCC45}, //11415 #HANGUL SYLLABLE CHIEUCH AE KIYEOK
+ {0xC3A6, 0xCC48}, //11416 #HANGUL SYLLABLE CHIEUCH AE NIEUN
+ {0xC3A7, 0xCC4C}, //11417 #HANGUL SYLLABLE CHIEUCH AE RIEUL
+ {0xC3A8, 0xCC54}, //11418 #HANGUL SYLLABLE CHIEUCH AE MIEUM
+ {0xC3A9, 0xCC55}, //11419 #HANGUL SYLLABLE CHIEUCH AE PIEUP
+ {0xC3AA, 0xCC57}, //11420 #HANGUL SYLLABLE CHIEUCH AE SIOS
+ {0xC3AB, 0xCC58}, //11421 #HANGUL SYLLABLE CHIEUCH AE SSANGSIOS
+ {0xC3AC, 0xCC59}, //11422 #HANGUL SYLLABLE CHIEUCH AE IEUNG
+ {0xC3AD, 0xCC60}, //11423 #HANGUL SYLLABLE CHIEUCH YA
+ {0xC3AE, 0xCC64}, //11424 #HANGUL SYLLABLE CHIEUCH YA NIEUN
+ {0xC3AF, 0xCC66}, //11425 #HANGUL SYLLABLE CHIEUCH YA NIEUNHIEUH
+ {0xC3B0, 0xCC68}, //11426 #HANGUL SYLLABLE CHIEUCH YA RIEUL
+ {0xC3B1, 0xCC70}, //11427 #HANGUL SYLLABLE CHIEUCH YA MIEUM
+ {0xC3B2, 0xCC75}, //11428 #HANGUL SYLLABLE CHIEUCH YA IEUNG
+ {0xC3B3, 0xCC98}, //11429 #HANGUL SYLLABLE CHIEUCH EO
+ {0xC3B4, 0xCC99}, //11430 #HANGUL SYLLABLE CHIEUCH EO KIYEOK
+ {0xC3B5, 0xCC9C}, //11431 #HANGUL SYLLABLE CHIEUCH EO NIEUN
+ {0xC3B6, 0xCCA0}, //11432 #HANGUL SYLLABLE CHIEUCH EO RIEUL
+ {0xC3B7, 0xCCA8}, //11433 #HANGUL SYLLABLE CHIEUCH EO MIEUM
+ {0xC3B8, 0xCCA9}, //11434 #HANGUL SYLLABLE CHIEUCH EO PIEUP
+ {0xC3B9, 0xCCAB}, //11435 #HANGUL SYLLABLE CHIEUCH EO SIOS
+ {0xC3BA, 0xCCAC}, //11436 #HANGUL SYLLABLE CHIEUCH EO SSANGSIOS
+ {0xC3BB, 0xCCAD}, //11437 #HANGUL SYLLABLE CHIEUCH EO IEUNG
+ {0xC3BC, 0xCCB4}, //11438 #HANGUL SYLLABLE CHIEUCH E
+ {0xC3BD, 0xCCB5}, //11439 #HANGUL SYLLABLE CHIEUCH E KIYEOK
+ {0xC3BE, 0xCCB8}, //11440 #HANGUL SYLLABLE CHIEUCH E NIEUN
+ {0xC3BF, 0xCCBC}, //11441 #HANGUL SYLLABLE CHIEUCH E RIEUL
+ {0xC3C0, 0xCCC4}, //11442 #HANGUL SYLLABLE CHIEUCH E MIEUM
+ {0xC3C1, 0xCCC5}, //11443 #HANGUL SYLLABLE CHIEUCH E PIEUP
+ {0xC3C2, 0xCCC7}, //11444 #HANGUL SYLLABLE CHIEUCH E SIOS
+ {0xC3C3, 0xCCC9}, //11445 #HANGUL SYLLABLE CHIEUCH E IEUNG
+ {0xC3C4, 0xCCD0}, //11446 #HANGUL SYLLABLE CHIEUCH YEO
+ {0xC3C5, 0xCCD4}, //11447 #HANGUL SYLLABLE CHIEUCH YEO NIEUN
+ {0xC3C6, 0xCCE4}, //11448 #HANGUL SYLLABLE CHIEUCH YEO SSANGSIOS
+ {0xC3C7, 0xCCEC}, //11449 #HANGUL SYLLABLE CHIEUCH YE
+ {0xC3C8, 0xCCF0}, //11450 #HANGUL SYLLABLE CHIEUCH YE NIEUN
+ {0xC3C9, 0xCD01}, //11451 #HANGUL SYLLABLE CHIEUCH YE IEUNG
+ {0xC3CA, 0xCD08}, //11452 #HANGUL SYLLABLE CHIEUCH O
+ {0xC3CB, 0xCD09}, //11453 #HANGUL SYLLABLE CHIEUCH O KIYEOK
+ {0xC3CC, 0xCD0C}, //11454 #HANGUL SYLLABLE CHIEUCH O NIEUN
+ {0xC3CD, 0xCD10}, //11455 #HANGUL SYLLABLE CHIEUCH O RIEUL
+ {0xC3CE, 0xCD18}, //11456 #HANGUL SYLLABLE CHIEUCH O MIEUM
+ {0xC3CF, 0xCD19}, //11457 #HANGUL SYLLABLE CHIEUCH O PIEUP
+ {0xC3D0, 0xCD1B}, //11458 #HANGUL SYLLABLE CHIEUCH O SIOS
+ {0xC3D1, 0xCD1D}, //11459 #HANGUL SYLLABLE CHIEUCH O IEUNG
+ {0xC3D2, 0xCD24}, //11460 #HANGUL SYLLABLE CHIEUCH WA
+ {0xC3D3, 0xCD28}, //11461 #HANGUL SYLLABLE CHIEUCH WA NIEUN
+ {0xC3D4, 0xCD2C}, //11462 #HANGUL SYLLABLE CHIEUCH WA RIEUL
+ {0xC3D5, 0xCD39}, //11463 #HANGUL SYLLABLE CHIEUCH WA IEUNG
+ {0xC3D6, 0xCD5C}, //11464 #HANGUL SYLLABLE CHIEUCH OE
+ {0xC3D7, 0xCD60}, //11465 #HANGUL SYLLABLE CHIEUCH OE NIEUN
+ {0xC3D8, 0xCD64}, //11466 #HANGUL SYLLABLE CHIEUCH OE RIEUL
+ {0xC3D9, 0xCD6C}, //11467 #HANGUL SYLLABLE CHIEUCH OE MIEUM
+ {0xC3DA, 0xCD6D}, //11468 #HANGUL SYLLABLE CHIEUCH OE PIEUP
+ {0xC3DB, 0xCD6F}, //11469 #HANGUL SYLLABLE CHIEUCH OE SIOS
+ {0xC3DC, 0xCD71}, //11470 #HANGUL SYLLABLE CHIEUCH OE IEUNG
+ {0xC3DD, 0xCD78}, //11471 #HANGUL SYLLABLE CHIEUCH YO
+ {0xC3DE, 0xCD88}, //11472 #HANGUL SYLLABLE CHIEUCH YO MIEUM
+ {0xC3DF, 0xCD94}, //11473 #HANGUL SYLLABLE CHIEUCH U
+ {0xC3E0, 0xCD95}, //11474 #HANGUL SYLLABLE CHIEUCH U KIYEOK
+ {0xC3E1, 0xCD98}, //11475 #HANGUL SYLLABLE CHIEUCH U NIEUN
+ {0xC3E2, 0xCD9C}, //11476 #HANGUL SYLLABLE CHIEUCH U RIEUL
+ {0xC3E3, 0xCDA4}, //11477 #HANGUL SYLLABLE CHIEUCH U MIEUM
+ {0xC3E4, 0xCDA5}, //11478 #HANGUL SYLLABLE CHIEUCH U PIEUP
+ {0xC3E5, 0xCDA7}, //11479 #HANGUL SYLLABLE CHIEUCH U SIOS
+ {0xC3E6, 0xCDA9}, //11480 #HANGUL SYLLABLE CHIEUCH U IEUNG
+ {0xC3E7, 0xCDB0}, //11481 #HANGUL SYLLABLE CHIEUCH WEO
+ {0xC3E8, 0xCDC4}, //11482 #HANGUL SYLLABLE CHIEUCH WEO SSANGSIOS
+ {0xC3E9, 0xCDCC}, //11483 #HANGUL SYLLABLE CHIEUCH WE
+ {0xC3EA, 0xCDD0}, //11484 #HANGUL SYLLABLE CHIEUCH WE NIEUN
+ {0xC3EB, 0xCDE8}, //11485 #HANGUL SYLLABLE CHIEUCH WI
+ {0xC3EC, 0xCDEC}, //11486 #HANGUL SYLLABLE CHIEUCH WI NIEUN
+ {0xC3ED, 0xCDF0}, //11487 #HANGUL SYLLABLE CHIEUCH WI RIEUL
+ {0xC3EE, 0xCDF8}, //11488 #HANGUL SYLLABLE CHIEUCH WI MIEUM
+ {0xC3EF, 0xCDF9}, //11489 #HANGUL SYLLABLE CHIEUCH WI PIEUP
+ {0xC3F0, 0xCDFB}, //11490 #HANGUL SYLLABLE CHIEUCH WI SIOS
+ {0xC3F1, 0xCDFD}, //11491 #HANGUL SYLLABLE CHIEUCH WI IEUNG
+ {0xC3F2, 0xCE04}, //11492 #HANGUL SYLLABLE CHIEUCH YU
+ {0xC3F3, 0xCE08}, //11493 #HANGUL SYLLABLE CHIEUCH YU NIEUN
+ {0xC3F4, 0xCE0C}, //11494 #HANGUL SYLLABLE CHIEUCH YU RIEUL
+ {0xC3F5, 0xCE14}, //11495 #HANGUL SYLLABLE CHIEUCH YU MIEUM
+ {0xC3F6, 0xCE19}, //11496 #HANGUL SYLLABLE CHIEUCH YU IEUNG
+ {0xC3F7, 0xCE20}, //11497 #HANGUL SYLLABLE CHIEUCH EU
+ {0xC3F8, 0xCE21}, //11498 #HANGUL SYLLABLE CHIEUCH EU KIYEOK
+ {0xC3F9, 0xCE24}, //11499 #HANGUL SYLLABLE CHIEUCH EU NIEUN
+ {0xC3FA, 0xCE28}, //11500 #HANGUL SYLLABLE CHIEUCH EU RIEUL
+ {0xC3FB, 0xCE30}, //11501 #HANGUL SYLLABLE CHIEUCH EU MIEUM
+ {0xC3FC, 0xCE31}, //11502 #HANGUL SYLLABLE CHIEUCH EU PIEUP
+ {0xC3FD, 0xCE33}, //11503 #HANGUL SYLLABLE CHIEUCH EU SIOS
+ {0xC3FE, 0xCE35}, //11504 #HANGUL SYLLABLE CHIEUCH EU IEUNG
+ {0xC441, 0xD6AB}, //11505 #HANGUL SYLLABLE HIEUH YO KIYEOKSIOS
+ {0xC442, 0xD6AD}, //11506 #HANGUL SYLLABLE HIEUH YO NIEUNCIEUC
+ {0xC443, 0xD6AE}, //11507 #HANGUL SYLLABLE HIEUH YO NIEUNHIEUH
+ {0xC444, 0xD6AF}, //11508 #HANGUL SYLLABLE HIEUH YO TIKEUT
+ {0xC445, 0xD6B1}, //11509 #HANGUL SYLLABLE HIEUH YO RIEULKIYEOK
+ {0xC446, 0xD6B2}, //11510 #HANGUL SYLLABLE HIEUH YO RIEULMIEUM
+ {0xC447, 0xD6B3}, //11511 #HANGUL SYLLABLE HIEUH YO RIEULPIEUP
+ {0xC448, 0xD6B4}, //11512 #HANGUL SYLLABLE HIEUH YO RIEULSIOS
+ {0xC449, 0xD6B5}, //11513 #HANGUL SYLLABLE HIEUH YO RIEULTHIEUTH
+ {0xC44A, 0xD6B6}, //11514 #HANGUL SYLLABLE HIEUH YO RIEULPHIEUPH
+ {0xC44B, 0xD6B7}, //11515 #HANGUL SYLLABLE HIEUH YO RIEULHIEUH
+ {0xC44C, 0xD6B8}, //11516 #HANGUL SYLLABLE HIEUH YO MIEUM
+ {0xC44D, 0xD6BA}, //11517 #HANGUL SYLLABLE HIEUH YO PIEUPSIOS
+ {0xC44E, 0xD6BC}, //11518 #HANGUL SYLLABLE HIEUH YO SSANGSIOS
+ {0xC44F, 0xD6BD}, //11519 #HANGUL SYLLABLE HIEUH YO IEUNG
+ {0xC450, 0xD6BE}, //11520 #HANGUL SYLLABLE HIEUH YO CIEUC
+ {0xC451, 0xD6BF}, //11521 #HANGUL SYLLABLE HIEUH YO CHIEUCH
+ {0xC452, 0xD6C0}, //11522 #HANGUL SYLLABLE HIEUH YO KHIEUKH
+ {0xC453, 0xD6C1}, //11523 #HANGUL SYLLABLE HIEUH YO THIEUTH
+ {0xC454, 0xD6C2}, //11524 #HANGUL SYLLABLE HIEUH YO PHIEUPH
+ {0xC455, 0xD6C3}, //11525 #HANGUL SYLLABLE HIEUH YO HIEUH
+ {0xC456, 0xD6C6}, //11526 #HANGUL SYLLABLE HIEUH U SSANGKIYEOK
+ {0xC457, 0xD6C7}, //11527 #HANGUL SYLLABLE HIEUH U KIYEOKSIOS
+ {0xC458, 0xD6C9}, //11528 #HANGUL SYLLABLE HIEUH U NIEUNCIEUC
+ {0xC459, 0xD6CA}, //11529 #HANGUL SYLLABLE HIEUH U NIEUNHIEUH
+ {0xC45A, 0xD6CB}, //11530 #HANGUL SYLLABLE HIEUH U TIKEUT
+ {0xC461, 0xD6CD}, //11531 #HANGUL SYLLABLE HIEUH U RIEULKIYEOK
+ {0xC462, 0xD6CE}, //11532 #HANGUL SYLLABLE HIEUH U RIEULMIEUM
+ {0xC463, 0xD6CF}, //11533 #HANGUL SYLLABLE HIEUH U RIEULPIEUP
+ {0xC464, 0xD6D0}, //11534 #HANGUL SYLLABLE HIEUH U RIEULSIOS
+ {0xC465, 0xD6D2}, //11535 #HANGUL SYLLABLE HIEUH U RIEULPHIEUPH
+ {0xC466, 0xD6D3}, //11536 #HANGUL SYLLABLE HIEUH U RIEULHIEUH
+ {0xC467, 0xD6D5}, //11537 #HANGUL SYLLABLE HIEUH U PIEUP
+ {0xC468, 0xD6D6}, //11538 #HANGUL SYLLABLE HIEUH U PIEUPSIOS
+ {0xC469, 0xD6D8}, //11539 #HANGUL SYLLABLE HIEUH U SSANGSIOS
+ {0xC46A, 0xD6DA}, //11540 #HANGUL SYLLABLE HIEUH U CIEUC
+ {0xC46B, 0xD6DB}, //11541 #HANGUL SYLLABLE HIEUH U CHIEUCH
+ {0xC46C, 0xD6DC}, //11542 #HANGUL SYLLABLE HIEUH U KHIEUKH
+ {0xC46D, 0xD6DD}, //11543 #HANGUL SYLLABLE HIEUH U THIEUTH
+ {0xC46E, 0xD6DE}, //11544 #HANGUL SYLLABLE HIEUH U PHIEUPH
+ {0xC46F, 0xD6DF}, //11545 #HANGUL SYLLABLE HIEUH U HIEUH
+ {0xC470, 0xD6E1}, //11546 #HANGUL SYLLABLE HIEUH WEO KIYEOK
+ {0xC471, 0xD6E2}, //11547 #HANGUL SYLLABLE HIEUH WEO SSANGKIYEOK
+ {0xC472, 0xD6E3}, //11548 #HANGUL SYLLABLE HIEUH WEO KIYEOKSIOS
+ {0xC473, 0xD6E5}, //11549 #HANGUL SYLLABLE HIEUH WEO NIEUNCIEUC
+ {0xC474, 0xD6E6}, //11550 #HANGUL SYLLABLE HIEUH WEO NIEUNHIEUH
+ {0xC475, 0xD6E7}, //11551 #HANGUL SYLLABLE HIEUH WEO TIKEUT
+ {0xC476, 0xD6E9}, //11552 #HANGUL SYLLABLE HIEUH WEO RIEULKIYEOK
+ {0xC477, 0xD6EA}, //11553 #HANGUL SYLLABLE HIEUH WEO RIEULMIEUM
+ {0xC478, 0xD6EB}, //11554 #HANGUL SYLLABLE HIEUH WEO RIEULPIEUP
+ {0xC479, 0xD6EC}, //11555 #HANGUL SYLLABLE HIEUH WEO RIEULSIOS
+ {0xC47A, 0xD6ED}, //11556 #HANGUL SYLLABLE HIEUH WEO RIEULTHIEUTH
+ {0xC481, 0xD6EE}, //11557 #HANGUL SYLLABLE HIEUH WEO RIEULPHIEUPH
+ {0xC482, 0xD6EF}, //11558 #HANGUL SYLLABLE HIEUH WEO RIEULHIEUH
+ {0xC483, 0xD6F1}, //11559 #HANGUL SYLLABLE HIEUH WEO PIEUP
+ {0xC484, 0xD6F2}, //11560 #HANGUL SYLLABLE HIEUH WEO PIEUPSIOS
+ {0xC485, 0xD6F3}, //11561 #HANGUL SYLLABLE HIEUH WEO SIOS
+ {0xC486, 0xD6F4}, //11562 #HANGUL SYLLABLE HIEUH WEO SSANGSIOS
+ {0xC487, 0xD6F6}, //11563 #HANGUL SYLLABLE HIEUH WEO CIEUC
+ {0xC488, 0xD6F7}, //11564 #HANGUL SYLLABLE HIEUH WEO CHIEUCH
+ {0xC489, 0xD6F8}, //11565 #HANGUL SYLLABLE HIEUH WEO KHIEUKH
+ {0xC48A, 0xD6F9}, //11566 #HANGUL SYLLABLE HIEUH WEO THIEUTH
+ {0xC48B, 0xD6FA}, //11567 #HANGUL SYLLABLE HIEUH WEO PHIEUPH
+ {0xC48C, 0xD6FB}, //11568 #HANGUL SYLLABLE HIEUH WEO HIEUH
+ {0xC48D, 0xD6FE}, //11569 #HANGUL SYLLABLE HIEUH WE SSANGKIYEOK
+ {0xC48E, 0xD6FF}, //11570 #HANGUL SYLLABLE HIEUH WE KIYEOKSIOS
+ {0xC48F, 0xD701}, //11571 #HANGUL SYLLABLE HIEUH WE NIEUNCIEUC
+ {0xC490, 0xD702}, //11572 #HANGUL SYLLABLE HIEUH WE NIEUNHIEUH
+ {0xC491, 0xD703}, //11573 #HANGUL SYLLABLE HIEUH WE TIKEUT
+ {0xC492, 0xD705}, //11574 #HANGUL SYLLABLE HIEUH WE RIEULKIYEOK
+ {0xC493, 0xD706}, //11575 #HANGUL SYLLABLE HIEUH WE RIEULMIEUM
+ {0xC494, 0xD707}, //11576 #HANGUL SYLLABLE HIEUH WE RIEULPIEUP
+ {0xC495, 0xD708}, //11577 #HANGUL SYLLABLE HIEUH WE RIEULSIOS
+ {0xC496, 0xD709}, //11578 #HANGUL SYLLABLE HIEUH WE RIEULTHIEUTH
+ {0xC497, 0xD70A}, //11579 #HANGUL SYLLABLE HIEUH WE RIEULPHIEUPH
+ {0xC498, 0xD70B}, //11580 #HANGUL SYLLABLE HIEUH WE RIEULHIEUH
+ {0xC499, 0xD70C}, //11581 #HANGUL SYLLABLE HIEUH WE MIEUM
+ {0xC49A, 0xD70D}, //11582 #HANGUL SYLLABLE HIEUH WE PIEUP
+ {0xC49B, 0xD70E}, //11583 #HANGUL SYLLABLE HIEUH WE PIEUPSIOS
+ {0xC49C, 0xD70F}, //11584 #HANGUL SYLLABLE HIEUH WE SIOS
+ {0xC49D, 0xD710}, //11585 #HANGUL SYLLABLE HIEUH WE SSANGSIOS
+ {0xC49E, 0xD712}, //11586 #HANGUL SYLLABLE HIEUH WE CIEUC
+ {0xC49F, 0xD713}, //11587 #HANGUL SYLLABLE HIEUH WE CHIEUCH
+ {0xC4A0, 0xD714}, //11588 #HANGUL SYLLABLE HIEUH WE KHIEUKH
+ {0xC4A1, 0xCE58}, //11589 #HANGUL SYLLABLE CHIEUCH I
+ {0xC4A2, 0xCE59}, //11590 #HANGUL SYLLABLE CHIEUCH I KIYEOK
+ {0xC4A3, 0xCE5C}, //11591 #HANGUL SYLLABLE CHIEUCH I NIEUN
+ {0xC4A4, 0xCE5F}, //11592 #HANGUL SYLLABLE CHIEUCH I TIKEUT
+ {0xC4A5, 0xCE60}, //11593 #HANGUL SYLLABLE CHIEUCH I RIEUL
+ {0xC4A6, 0xCE61}, //11594 #HANGUL SYLLABLE CHIEUCH I RIEULKIYEOK
+ {0xC4A7, 0xCE68}, //11595 #HANGUL SYLLABLE CHIEUCH I MIEUM
+ {0xC4A8, 0xCE69}, //11596 #HANGUL SYLLABLE CHIEUCH I PIEUP
+ {0xC4A9, 0xCE6B}, //11597 #HANGUL SYLLABLE CHIEUCH I SIOS
+ {0xC4AA, 0xCE6D}, //11598 #HANGUL SYLLABLE CHIEUCH I IEUNG
+ {0xC4AB, 0xCE74}, //11599 #HANGUL SYLLABLE KHIEUKH A
+ {0xC4AC, 0xCE75}, //11600 #HANGUL SYLLABLE KHIEUKH A KIYEOK
+ {0xC4AD, 0xCE78}, //11601 #HANGUL SYLLABLE KHIEUKH A NIEUN
+ {0xC4AE, 0xCE7C}, //11602 #HANGUL SYLLABLE KHIEUKH A RIEUL
+ {0xC4AF, 0xCE84}, //11603 #HANGUL SYLLABLE KHIEUKH A MIEUM
+ {0xC4B0, 0xCE85}, //11604 #HANGUL SYLLABLE KHIEUKH A PIEUP
+ {0xC4B1, 0xCE87}, //11605 #HANGUL SYLLABLE KHIEUKH A SIOS
+ {0xC4B2, 0xCE89}, //11606 #HANGUL SYLLABLE KHIEUKH A IEUNG
+ {0xC4B3, 0xCE90}, //11607 #HANGUL SYLLABLE KHIEUKH AE
+ {0xC4B4, 0xCE91}, //11608 #HANGUL SYLLABLE KHIEUKH AE KIYEOK
+ {0xC4B5, 0xCE94}, //11609 #HANGUL SYLLABLE KHIEUKH AE NIEUN
+ {0xC4B6, 0xCE98}, //11610 #HANGUL SYLLABLE KHIEUKH AE RIEUL
+ {0xC4B7, 0xCEA0}, //11611 #HANGUL SYLLABLE KHIEUKH AE MIEUM
+ {0xC4B8, 0xCEA1}, //11612 #HANGUL SYLLABLE KHIEUKH AE PIEUP
+ {0xC4B9, 0xCEA3}, //11613 #HANGUL SYLLABLE KHIEUKH AE SIOS
+ {0xC4BA, 0xCEA4}, //11614 #HANGUL SYLLABLE KHIEUKH AE SSANGSIOS
+ {0xC4BB, 0xCEA5}, //11615 #HANGUL SYLLABLE KHIEUKH AE IEUNG
+ {0xC4BC, 0xCEAC}, //11616 #HANGUL SYLLABLE KHIEUKH YA
+ {0xC4BD, 0xCEAD}, //11617 #HANGUL SYLLABLE KHIEUKH YA KIYEOK
+ {0xC4BE, 0xCEC1}, //11618 #HANGUL SYLLABLE KHIEUKH YA IEUNG
+ {0xC4BF, 0xCEE4}, //11619 #HANGUL SYLLABLE KHIEUKH EO
+ {0xC4C0, 0xCEE5}, //11620 #HANGUL SYLLABLE KHIEUKH EO KIYEOK
+ {0xC4C1, 0xCEE8}, //11621 #HANGUL SYLLABLE KHIEUKH EO NIEUN
+ {0xC4C2, 0xCEEB}, //11622 #HANGUL SYLLABLE KHIEUKH EO TIKEUT
+ {0xC4C3, 0xCEEC}, //11623 #HANGUL SYLLABLE KHIEUKH EO RIEUL
+ {0xC4C4, 0xCEF4}, //11624 #HANGUL SYLLABLE KHIEUKH EO MIEUM
+ {0xC4C5, 0xCEF5}, //11625 #HANGUL SYLLABLE KHIEUKH EO PIEUP
+ {0xC4C6, 0xCEF7}, //11626 #HANGUL SYLLABLE KHIEUKH EO SIOS
+ {0xC4C7, 0xCEF8}, //11627 #HANGUL SYLLABLE KHIEUKH EO SSANGSIOS
+ {0xC4C8, 0xCEF9}, //11628 #HANGUL SYLLABLE KHIEUKH EO IEUNG
+ {0xC4C9, 0xCF00}, //11629 #HANGUL SYLLABLE KHIEUKH E
+ {0xC4CA, 0xCF01}, //11630 #HANGUL SYLLABLE KHIEUKH E KIYEOK
+ {0xC4CB, 0xCF04}, //11631 #HANGUL SYLLABLE KHIEUKH E NIEUN
+ {0xC4CC, 0xCF08}, //11632 #HANGUL SYLLABLE KHIEUKH E RIEUL
+ {0xC4CD, 0xCF10}, //11633 #HANGUL SYLLABLE KHIEUKH E MIEUM
+ {0xC4CE, 0xCF11}, //11634 #HANGUL SYLLABLE KHIEUKH E PIEUP
+ {0xC4CF, 0xCF13}, //11635 #HANGUL SYLLABLE KHIEUKH E SIOS
+ {0xC4D0, 0xCF15}, //11636 #HANGUL SYLLABLE KHIEUKH E IEUNG
+ {0xC4D1, 0xCF1C}, //11637 #HANGUL SYLLABLE KHIEUKH YEO
+ {0xC4D2, 0xCF20}, //11638 #HANGUL SYLLABLE KHIEUKH YEO NIEUN
+ {0xC4D3, 0xCF24}, //11639 #HANGUL SYLLABLE KHIEUKH YEO RIEUL
+ {0xC4D4, 0xCF2C}, //11640 #HANGUL SYLLABLE KHIEUKH YEO MIEUM
+ {0xC4D5, 0xCF2D}, //11641 #HANGUL SYLLABLE KHIEUKH YEO PIEUP
+ {0xC4D6, 0xCF2F}, //11642 #HANGUL SYLLABLE KHIEUKH YEO SIOS
+ {0xC4D7, 0xCF30}, //11643 #HANGUL SYLLABLE KHIEUKH YEO SSANGSIOS
+ {0xC4D8, 0xCF31}, //11644 #HANGUL SYLLABLE KHIEUKH YEO IEUNG
+ {0xC4D9, 0xCF38}, //11645 #HANGUL SYLLABLE KHIEUKH YE
+ {0xC4DA, 0xCF54}, //11646 #HANGUL SYLLABLE KHIEUKH O
+ {0xC4DB, 0xCF55}, //11647 #HANGUL SYLLABLE KHIEUKH O KIYEOK
+ {0xC4DC, 0xCF58}, //11648 #HANGUL SYLLABLE KHIEUKH O NIEUN
+ {0xC4DD, 0xCF5C}, //11649 #HANGUL SYLLABLE KHIEUKH O RIEUL
+ {0xC4DE, 0xCF64}, //11650 #HANGUL SYLLABLE KHIEUKH O MIEUM
+ {0xC4DF, 0xCF65}, //11651 #HANGUL SYLLABLE KHIEUKH O PIEUP
+ {0xC4E0, 0xCF67}, //11652 #HANGUL SYLLABLE KHIEUKH O SIOS
+ {0xC4E1, 0xCF69}, //11653 #HANGUL SYLLABLE KHIEUKH O IEUNG
+ {0xC4E2, 0xCF70}, //11654 #HANGUL SYLLABLE KHIEUKH WA
+ {0xC4E3, 0xCF71}, //11655 #HANGUL SYLLABLE KHIEUKH WA KIYEOK
+ {0xC4E4, 0xCF74}, //11656 #HANGUL SYLLABLE KHIEUKH WA NIEUN
+ {0xC4E5, 0xCF78}, //11657 #HANGUL SYLLABLE KHIEUKH WA RIEUL
+ {0xC4E6, 0xCF80}, //11658 #HANGUL SYLLABLE KHIEUKH WA MIEUM
+ {0xC4E7, 0xCF85}, //11659 #HANGUL SYLLABLE KHIEUKH WA IEUNG
+ {0xC4E8, 0xCF8C}, //11660 #HANGUL SYLLABLE KHIEUKH WAE
+ {0xC4E9, 0xCFA1}, //11661 #HANGUL SYLLABLE KHIEUKH WAE IEUNG
+ {0xC4EA, 0xCFA8}, //11662 #HANGUL SYLLABLE KHIEUKH OE
+ {0xC4EB, 0xCFB0}, //11663 #HANGUL SYLLABLE KHIEUKH OE RIEUL
+ {0xC4EC, 0xCFC4}, //11664 #HANGUL SYLLABLE KHIEUKH YO
+ {0xC4ED, 0xCFE0}, //11665 #HANGUL SYLLABLE KHIEUKH U
+ {0xC4EE, 0xCFE1}, //11666 #HANGUL SYLLABLE KHIEUKH U KIYEOK
+ {0xC4EF, 0xCFE4}, //11667 #HANGUL SYLLABLE KHIEUKH U NIEUN
+ {0xC4F0, 0xCFE8}, //11668 #HANGUL SYLLABLE KHIEUKH U RIEUL
+ {0xC4F1, 0xCFF0}, //11669 #HANGUL SYLLABLE KHIEUKH U MIEUM
+ {0xC4F2, 0xCFF1}, //11670 #HANGUL SYLLABLE KHIEUKH U PIEUP
+ {0xC4F3, 0xCFF3}, //11671 #HANGUL SYLLABLE KHIEUKH U SIOS
+ {0xC4F4, 0xCFF5}, //11672 #HANGUL SYLLABLE KHIEUKH U IEUNG
+ {0xC4F5, 0xCFFC}, //11673 #HANGUL SYLLABLE KHIEUKH WEO
+ {0xC4F6, 0xD000}, //11674 #HANGUL SYLLABLE KHIEUKH WEO NIEUN
+ {0xC4F7, 0xD004}, //11675 #HANGUL SYLLABLE KHIEUKH WEO RIEUL
+ {0xC4F8, 0xD011}, //11676 #HANGUL SYLLABLE KHIEUKH WEO IEUNG
+ {0xC4F9, 0xD018}, //11677 #HANGUL SYLLABLE KHIEUKH WE
+ {0xC4FA, 0xD02D}, //11678 #HANGUL SYLLABLE KHIEUKH WE IEUNG
+ {0xC4FB, 0xD034}, //11679 #HANGUL SYLLABLE KHIEUKH WI
+ {0xC4FC, 0xD035}, //11680 #HANGUL SYLLABLE KHIEUKH WI KIYEOK
+ {0xC4FD, 0xD038}, //11681 #HANGUL SYLLABLE KHIEUKH WI NIEUN
+ {0xC4FE, 0xD03C}, //11682 #HANGUL SYLLABLE KHIEUKH WI RIEUL
+ {0xC541, 0xD715}, //11683 #HANGUL SYLLABLE HIEUH WE THIEUTH
+ {0xC542, 0xD716}, //11684 #HANGUL SYLLABLE HIEUH WE PHIEUPH
+ {0xC543, 0xD717}, //11685 #HANGUL SYLLABLE HIEUH WE HIEUH
+ {0xC544, 0xD71A}, //11686 #HANGUL SYLLABLE HIEUH WI SSANGKIYEOK
+ {0xC545, 0xD71B}, //11687 #HANGUL SYLLABLE HIEUH WI KIYEOKSIOS
+ {0xC546, 0xD71D}, //11688 #HANGUL SYLLABLE HIEUH WI NIEUNCIEUC
+ {0xC547, 0xD71E}, //11689 #HANGUL SYLLABLE HIEUH WI NIEUNHIEUH
+ {0xC548, 0xD71F}, //11690 #HANGUL SYLLABLE HIEUH WI TIKEUT
+ {0xC549, 0xD721}, //11691 #HANGUL SYLLABLE HIEUH WI RIEULKIYEOK
+ {0xC54A, 0xD722}, //11692 #HANGUL SYLLABLE HIEUH WI RIEULMIEUM
+ {0xC54B, 0xD723}, //11693 #HANGUL SYLLABLE HIEUH WI RIEULPIEUP
+ {0xC54C, 0xD724}, //11694 #HANGUL SYLLABLE HIEUH WI RIEULSIOS
+ {0xC54D, 0xD725}, //11695 #HANGUL SYLLABLE HIEUH WI RIEULTHIEUTH
+ {0xC54E, 0xD726}, //11696 #HANGUL SYLLABLE HIEUH WI RIEULPHIEUPH
+ {0xC54F, 0xD727}, //11697 #HANGUL SYLLABLE HIEUH WI RIEULHIEUH
+ {0xC550, 0xD72A}, //11698 #HANGUL SYLLABLE HIEUH WI PIEUPSIOS
+ {0xC551, 0xD72C}, //11699 #HANGUL SYLLABLE HIEUH WI SSANGSIOS
+ {0xC552, 0xD72E}, //11700 #HANGUL SYLLABLE HIEUH WI CIEUC
+ {0xC553, 0xD72F}, //11701 #HANGUL SYLLABLE HIEUH WI CHIEUCH
+ {0xC554, 0xD730}, //11702 #HANGUL SYLLABLE HIEUH WI KHIEUKH
+ {0xC555, 0xD731}, //11703 #HANGUL SYLLABLE HIEUH WI THIEUTH
+ {0xC556, 0xD732}, //11704 #HANGUL SYLLABLE HIEUH WI PHIEUPH
+ {0xC557, 0xD733}, //11705 #HANGUL SYLLABLE HIEUH WI HIEUH
+ {0xC558, 0xD736}, //11706 #HANGUL SYLLABLE HIEUH YU SSANGKIYEOK
+ {0xC559, 0xD737}, //11707 #HANGUL SYLLABLE HIEUH YU KIYEOKSIOS
+ {0xC55A, 0xD739}, //11708 #HANGUL SYLLABLE HIEUH YU NIEUNCIEUC
+ {0xC561, 0xD73A}, //11709 #HANGUL SYLLABLE HIEUH YU NIEUNHIEUH
+ {0xC562, 0xD73B}, //11710 #HANGUL SYLLABLE HIEUH YU TIKEUT
+ {0xC563, 0xD73D}, //11711 #HANGUL SYLLABLE HIEUH YU RIEULKIYEOK
+ {0xC564, 0xD73E}, //11712 #HANGUL SYLLABLE HIEUH YU RIEULMIEUM
+ {0xC565, 0xD73F}, //11713 #HANGUL SYLLABLE HIEUH YU RIEULPIEUP
+ {0xC566, 0xD740}, //11714 #HANGUL SYLLABLE HIEUH YU RIEULSIOS
+ {0xC567, 0xD741}, //11715 #HANGUL SYLLABLE HIEUH YU RIEULTHIEUTH
+ {0xC568, 0xD742}, //11716 #HANGUL SYLLABLE HIEUH YU RIEULPHIEUPH
+ {0xC569, 0xD743}, //11717 #HANGUL SYLLABLE HIEUH YU RIEULHIEUH
+ {0xC56A, 0xD745}, //11718 #HANGUL SYLLABLE HIEUH YU PIEUP
+ {0xC56B, 0xD746}, //11719 #HANGUL SYLLABLE HIEUH YU PIEUPSIOS
+ {0xC56C, 0xD748}, //11720 #HANGUL SYLLABLE HIEUH YU SSANGSIOS
+ {0xC56D, 0xD74A}, //11721 #HANGUL SYLLABLE HIEUH YU CIEUC
+ {0xC56E, 0xD74B}, //11722 #HANGUL SYLLABLE HIEUH YU CHIEUCH
+ {0xC56F, 0xD74C}, //11723 #HANGUL SYLLABLE HIEUH YU KHIEUKH
+ {0xC570, 0xD74D}, //11724 #HANGUL SYLLABLE HIEUH YU THIEUTH
+ {0xC571, 0xD74E}, //11725 #HANGUL SYLLABLE HIEUH YU PHIEUPH
+ {0xC572, 0xD74F}, //11726 #HANGUL SYLLABLE HIEUH YU HIEUH
+ {0xC573, 0xD752}, //11727 #HANGUL SYLLABLE HIEUH EU SSANGKIYEOK
+ {0xC574, 0xD753}, //11728 #HANGUL SYLLABLE HIEUH EU KIYEOKSIOS
+ {0xC575, 0xD755}, //11729 #HANGUL SYLLABLE HIEUH EU NIEUNCIEUC
+ {0xC576, 0xD75A}, //11730 #HANGUL SYLLABLE HIEUH EU RIEULMIEUM
+ {0xC577, 0xD75B}, //11731 #HANGUL SYLLABLE HIEUH EU RIEULPIEUP
+ {0xC578, 0xD75C}, //11732 #HANGUL SYLLABLE HIEUH EU RIEULSIOS
+ {0xC579, 0xD75D}, //11733 #HANGUL SYLLABLE HIEUH EU RIEULTHIEUTH
+ {0xC57A, 0xD75E}, //11734 #HANGUL SYLLABLE HIEUH EU RIEULPHIEUPH
+ {0xC581, 0xD75F}, //11735 #HANGUL SYLLABLE HIEUH EU RIEULHIEUH
+ {0xC582, 0xD762}, //11736 #HANGUL SYLLABLE HIEUH EU PIEUPSIOS
+ {0xC583, 0xD764}, //11737 #HANGUL SYLLABLE HIEUH EU SSANGSIOS
+ {0xC584, 0xD766}, //11738 #HANGUL SYLLABLE HIEUH EU CIEUC
+ {0xC585, 0xD767}, //11739 #HANGUL SYLLABLE HIEUH EU CHIEUCH
+ {0xC586, 0xD768}, //11740 #HANGUL SYLLABLE HIEUH EU KHIEUKH
+ {0xC587, 0xD76A}, //11741 #HANGUL SYLLABLE HIEUH EU PHIEUPH
+ {0xC588, 0xD76B}, //11742 #HANGUL SYLLABLE HIEUH EU HIEUH
+ {0xC589, 0xD76D}, //11743 #HANGUL SYLLABLE HIEUH YI KIYEOK
+ {0xC58A, 0xD76E}, //11744 #HANGUL SYLLABLE HIEUH YI SSANGKIYEOK
+ {0xC58B, 0xD76F}, //11745 #HANGUL SYLLABLE HIEUH YI KIYEOKSIOS
+ {0xC58C, 0xD771}, //11746 #HANGUL SYLLABLE HIEUH YI NIEUNCIEUC
+ {0xC58D, 0xD772}, //11747 #HANGUL SYLLABLE HIEUH YI NIEUNHIEUH
+ {0xC58E, 0xD773}, //11748 #HANGUL SYLLABLE HIEUH YI TIKEUT
+ {0xC58F, 0xD775}, //11749 #HANGUL SYLLABLE HIEUH YI RIEULKIYEOK
+ {0xC590, 0xD776}, //11750 #HANGUL SYLLABLE HIEUH YI RIEULMIEUM
+ {0xC591, 0xD777}, //11751 #HANGUL SYLLABLE HIEUH YI RIEULPIEUP
+ {0xC592, 0xD778}, //11752 #HANGUL SYLLABLE HIEUH YI RIEULSIOS
+ {0xC593, 0xD779}, //11753 #HANGUL SYLLABLE HIEUH YI RIEULTHIEUTH
+ {0xC594, 0xD77A}, //11754 #HANGUL SYLLABLE HIEUH YI RIEULPHIEUPH
+ {0xC595, 0xD77B}, //11755 #HANGUL SYLLABLE HIEUH YI RIEULHIEUH
+ {0xC596, 0xD77E}, //11756 #HANGUL SYLLABLE HIEUH YI PIEUPSIOS
+ {0xC597, 0xD77F}, //11757 #HANGUL SYLLABLE HIEUH YI SIOS
+ {0xC598, 0xD780}, //11758 #HANGUL SYLLABLE HIEUH YI SSANGSIOS
+ {0xC599, 0xD782}, //11759 #HANGUL SYLLABLE HIEUH YI CIEUC
+ {0xC59A, 0xD783}, //11760 #HANGUL SYLLABLE HIEUH YI CHIEUCH
+ {0xC59B, 0xD784}, //11761 #HANGUL SYLLABLE HIEUH YI KHIEUKH
+ {0xC59C, 0xD785}, //11762 #HANGUL SYLLABLE HIEUH YI THIEUTH
+ {0xC59D, 0xD786}, //11763 #HANGUL SYLLABLE HIEUH YI PHIEUPH
+ {0xC59E, 0xD787}, //11764 #HANGUL SYLLABLE HIEUH YI HIEUH
+ {0xC59F, 0xD78A}, //11765 #HANGUL SYLLABLE HIEUH I SSANGKIYEOK
+ {0xC5A0, 0xD78B}, //11766 #HANGUL SYLLABLE HIEUH I KIYEOKSIOS
+ {0xC5A1, 0xD044}, //11767 #HANGUL SYLLABLE KHIEUKH WI MIEUM
+ {0xC5A2, 0xD045}, //11768 #HANGUL SYLLABLE KHIEUKH WI PIEUP
+ {0xC5A3, 0xD047}, //11769 #HANGUL SYLLABLE KHIEUKH WI SIOS
+ {0xC5A4, 0xD049}, //11770 #HANGUL SYLLABLE KHIEUKH WI IEUNG
+ {0xC5A5, 0xD050}, //11771 #HANGUL SYLLABLE KHIEUKH YU
+ {0xC5A6, 0xD054}, //11772 #HANGUL SYLLABLE KHIEUKH YU NIEUN
+ {0xC5A7, 0xD058}, //11773 #HANGUL SYLLABLE KHIEUKH YU RIEUL
+ {0xC5A8, 0xD060}, //11774 #HANGUL SYLLABLE KHIEUKH YU MIEUM
+ {0xC5A9, 0xD06C}, //11775 #HANGUL SYLLABLE KHIEUKH EU
+ {0xC5AA, 0xD06D}, //11776 #HANGUL SYLLABLE KHIEUKH EU KIYEOK
+ {0xC5AB, 0xD070}, //11777 #HANGUL SYLLABLE KHIEUKH EU NIEUN
+ {0xC5AC, 0xD074}, //11778 #HANGUL SYLLABLE KHIEUKH EU RIEUL
+ {0xC5AD, 0xD07C}, //11779 #HANGUL SYLLABLE KHIEUKH EU MIEUM
+ {0xC5AE, 0xD07D}, //11780 #HANGUL SYLLABLE KHIEUKH EU PIEUP
+ {0xC5AF, 0xD081}, //11781 #HANGUL SYLLABLE KHIEUKH EU IEUNG
+ {0xC5B0, 0xD0A4}, //11782 #HANGUL SYLLABLE KHIEUKH I
+ {0xC5B1, 0xD0A5}, //11783 #HANGUL SYLLABLE KHIEUKH I KIYEOK
+ {0xC5B2, 0xD0A8}, //11784 #HANGUL SYLLABLE KHIEUKH I NIEUN
+ {0xC5B3, 0xD0AC}, //11785 #HANGUL SYLLABLE KHIEUKH I RIEUL
+ {0xC5B4, 0xD0B4}, //11786 #HANGUL SYLLABLE KHIEUKH I MIEUM
+ {0xC5B5, 0xD0B5}, //11787 #HANGUL SYLLABLE KHIEUKH I PIEUP
+ {0xC5B6, 0xD0B7}, //11788 #HANGUL SYLLABLE KHIEUKH I SIOS
+ {0xC5B7, 0xD0B9}, //11789 #HANGUL SYLLABLE KHIEUKH I IEUNG
+ {0xC5B8, 0xD0C0}, //11790 #HANGUL SYLLABLE THIEUTH A
+ {0xC5B9, 0xD0C1}, //11791 #HANGUL SYLLABLE THIEUTH A KIYEOK
+ {0xC5BA, 0xD0C4}, //11792 #HANGUL SYLLABLE THIEUTH A NIEUN
+ {0xC5BB, 0xD0C8}, //11793 #HANGUL SYLLABLE THIEUTH A RIEUL
+ {0xC5BC, 0xD0C9}, //11794 #HANGUL SYLLABLE THIEUTH A RIEULKIYEOK
+ {0xC5BD, 0xD0D0}, //11795 #HANGUL SYLLABLE THIEUTH A MIEUM
+ {0xC5BE, 0xD0D1}, //11796 #HANGUL SYLLABLE THIEUTH A PIEUP
+ {0xC5BF, 0xD0D3}, //11797 #HANGUL SYLLABLE THIEUTH A SIOS
+ {0xC5C0, 0xD0D4}, //11798 #HANGUL SYLLABLE THIEUTH A SSANGSIOS
+ {0xC5C1, 0xD0D5}, //11799 #HANGUL SYLLABLE THIEUTH A IEUNG
+ {0xC5C2, 0xD0DC}, //11800 #HANGUL SYLLABLE THIEUTH AE
+ {0xC5C3, 0xD0DD}, //11801 #HANGUL SYLLABLE THIEUTH AE KIYEOK
+ {0xC5C4, 0xD0E0}, //11802 #HANGUL SYLLABLE THIEUTH AE NIEUN
+ {0xC5C5, 0xD0E4}, //11803 #HANGUL SYLLABLE THIEUTH AE RIEUL
+ {0xC5C6, 0xD0EC}, //11804 #HANGUL SYLLABLE THIEUTH AE MIEUM
+ {0xC5C7, 0xD0ED}, //11805 #HANGUL SYLLABLE THIEUTH AE PIEUP
+ {0xC5C8, 0xD0EF}, //11806 #HANGUL SYLLABLE THIEUTH AE SIOS
+ {0xC5C9, 0xD0F0}, //11807 #HANGUL SYLLABLE THIEUTH AE SSANGSIOS
+ {0xC5CA, 0xD0F1}, //11808 #HANGUL SYLLABLE THIEUTH AE IEUNG
+ {0xC5CB, 0xD0F8}, //11809 #HANGUL SYLLABLE THIEUTH YA
+ {0xC5CC, 0xD10D}, //11810 #HANGUL SYLLABLE THIEUTH YA IEUNG
+ {0xC5CD, 0xD130}, //11811 #HANGUL SYLLABLE THIEUTH EO
+ {0xC5CE, 0xD131}, //11812 #HANGUL SYLLABLE THIEUTH EO KIYEOK
+ {0xC5CF, 0xD134}, //11813 #HANGUL SYLLABLE THIEUTH EO NIEUN
+ {0xC5D0, 0xD138}, //11814 #HANGUL SYLLABLE THIEUTH EO RIEUL
+ {0xC5D1, 0xD13A}, //11815 #HANGUL SYLLABLE THIEUTH EO RIEULMIEUM
+ {0xC5D2, 0xD140}, //11816 #HANGUL SYLLABLE THIEUTH EO MIEUM
+ {0xC5D3, 0xD141}, //11817 #HANGUL SYLLABLE THIEUTH EO PIEUP
+ {0xC5D4, 0xD143}, //11818 #HANGUL SYLLABLE THIEUTH EO SIOS
+ {0xC5D5, 0xD144}, //11819 #HANGUL SYLLABLE THIEUTH EO SSANGSIOS
+ {0xC5D6, 0xD145}, //11820 #HANGUL SYLLABLE THIEUTH EO IEUNG
+ {0xC5D7, 0xD14C}, //11821 #HANGUL SYLLABLE THIEUTH E
+ {0xC5D8, 0xD14D}, //11822 #HANGUL SYLLABLE THIEUTH E KIYEOK
+ {0xC5D9, 0xD150}, //11823 #HANGUL SYLLABLE THIEUTH E NIEUN
+ {0xC5DA, 0xD154}, //11824 #HANGUL SYLLABLE THIEUTH E RIEUL
+ {0xC5DB, 0xD15C}, //11825 #HANGUL SYLLABLE THIEUTH E MIEUM
+ {0xC5DC, 0xD15D}, //11826 #HANGUL SYLLABLE THIEUTH E PIEUP
+ {0xC5DD, 0xD15F}, //11827 #HANGUL SYLLABLE THIEUTH E SIOS
+ {0xC5DE, 0xD161}, //11828 #HANGUL SYLLABLE THIEUTH E IEUNG
+ {0xC5DF, 0xD168}, //11829 #HANGUL SYLLABLE THIEUTH YEO
+ {0xC5E0, 0xD16C}, //11830 #HANGUL SYLLABLE THIEUTH YEO NIEUN
+ {0xC5E1, 0xD17C}, //11831 #HANGUL SYLLABLE THIEUTH YEO SSANGSIOS
+ {0xC5E2, 0xD184}, //11832 #HANGUL SYLLABLE THIEUTH YE
+ {0xC5E3, 0xD188}, //11833 #HANGUL SYLLABLE THIEUTH YE NIEUN
+ {0xC5E4, 0xD1A0}, //11834 #HANGUL SYLLABLE THIEUTH O
+ {0xC5E5, 0xD1A1}, //11835 #HANGUL SYLLABLE THIEUTH O KIYEOK
+ {0xC5E6, 0xD1A4}, //11836 #HANGUL SYLLABLE THIEUTH O NIEUN
+ {0xC5E7, 0xD1A8}, //11837 #HANGUL SYLLABLE THIEUTH O RIEUL
+ {0xC5E8, 0xD1B0}, //11838 #HANGUL SYLLABLE THIEUTH O MIEUM
+ {0xC5E9, 0xD1B1}, //11839 #HANGUL SYLLABLE THIEUTH O PIEUP
+ {0xC5EA, 0xD1B3}, //11840 #HANGUL SYLLABLE THIEUTH O SIOS
+ {0xC5EB, 0xD1B5}, //11841 #HANGUL SYLLABLE THIEUTH O IEUNG
+ {0xC5EC, 0xD1BA}, //11842 #HANGUL SYLLABLE THIEUTH O PHIEUPH
+ {0xC5ED, 0xD1BC}, //11843 #HANGUL SYLLABLE THIEUTH WA
+ {0xC5EE, 0xD1C0}, //11844 #HANGUL SYLLABLE THIEUTH WA NIEUN
+ {0xC5EF, 0xD1D8}, //11845 #HANGUL SYLLABLE THIEUTH WAE
+ {0xC5F0, 0xD1F4}, //11846 #HANGUL SYLLABLE THIEUTH OE
+ {0xC5F1, 0xD1F8}, //11847 #HANGUL SYLLABLE THIEUTH OE NIEUN
+ {0xC5F2, 0xD207}, //11848 #HANGUL SYLLABLE THIEUTH OE SIOS
+ {0xC5F3, 0xD209}, //11849 #HANGUL SYLLABLE THIEUTH OE IEUNG
+ {0xC5F4, 0xD210}, //11850 #HANGUL SYLLABLE THIEUTH YO
+ {0xC5F5, 0xD22C}, //11851 #HANGUL SYLLABLE THIEUTH U
+ {0xC5F6, 0xD22D}, //11852 #HANGUL SYLLABLE THIEUTH U KIYEOK
+ {0xC5F7, 0xD230}, //11853 #HANGUL SYLLABLE THIEUTH U NIEUN
+ {0xC5F8, 0xD234}, //11854 #HANGUL SYLLABLE THIEUTH U RIEUL
+ {0xC5F9, 0xD23C}, //11855 #HANGUL SYLLABLE THIEUTH U MIEUM
+ {0xC5FA, 0xD23D}, //11856 #HANGUL SYLLABLE THIEUTH U PIEUP
+ {0xC5FB, 0xD23F}, //11857 #HANGUL SYLLABLE THIEUTH U SIOS
+ {0xC5FC, 0xD241}, //11858 #HANGUL SYLLABLE THIEUTH U IEUNG
+ {0xC5FD, 0xD248}, //11859 #HANGUL SYLLABLE THIEUTH WEO
+ {0xC5FE, 0xD25C}, //11860 #HANGUL SYLLABLE THIEUTH WEO SSANGSIOS
+ {0xC641, 0xD78D}, //11861 #HANGUL SYLLABLE HIEUH I NIEUNCIEUC
+ {0xC642, 0xD78E}, //11862 #HANGUL SYLLABLE HIEUH I NIEUNHIEUH
+ {0xC643, 0xD78F}, //11863 #HANGUL SYLLABLE HIEUH I TIKEUT
+ {0xC644, 0xD791}, //11864 #HANGUL SYLLABLE HIEUH I RIEULKIYEOK
+ {0xC645, 0xD792}, //11865 #HANGUL SYLLABLE HIEUH I RIEULMIEUM
+ {0xC646, 0xD793}, //11866 #HANGUL SYLLABLE HIEUH I RIEULPIEUP
+ {0xC647, 0xD794}, //11867 #HANGUL SYLLABLE HIEUH I RIEULSIOS
+ {0xC648, 0xD795}, //11868 #HANGUL SYLLABLE HIEUH I RIEULTHIEUTH
+ {0xC649, 0xD796}, //11869 #HANGUL SYLLABLE HIEUH I RIEULPHIEUPH
+ {0xC64A, 0xD797}, //11870 #HANGUL SYLLABLE HIEUH I RIEULHIEUH
+ {0xC64B, 0xD79A}, //11871 #HANGUL SYLLABLE HIEUH I PIEUPSIOS
+ {0xC64C, 0xD79C}, //11872 #HANGUL SYLLABLE HIEUH I SSANGSIOS
+ {0xC64D, 0xD79E}, //11873 #HANGUL SYLLABLE HIEUH I CIEUC
+ {0xC64E, 0xD79F}, //11874 #HANGUL SYLLABLE HIEUH I CHIEUCH
+ {0xC64F, 0xD7A0}, //11875 #HANGUL SYLLABLE HIEUH I KHIEUKH
+ {0xC650, 0xD7A1}, //11876 #HANGUL SYLLABLE HIEUH I THIEUTH
+ {0xC651, 0xD7A2}, //11877 #HANGUL SYLLABLE HIEUH I PHIEUPH
+ {0xC652, 0xD7A3}, //11878 #HANGUL SYLLABLE HIEUH I HIEUH
+ {0xC6A1, 0xD264}, //11879 #HANGUL SYLLABLE THIEUTH WE
+ {0xC6A2, 0xD280}, //11880 #HANGUL SYLLABLE THIEUTH WI
+ {0xC6A3, 0xD281}, //11881 #HANGUL SYLLABLE THIEUTH WI KIYEOK
+ {0xC6A4, 0xD284}, //11882 #HANGUL SYLLABLE THIEUTH WI NIEUN
+ {0xC6A5, 0xD288}, //11883 #HANGUL SYLLABLE THIEUTH WI RIEUL
+ {0xC6A6, 0xD290}, //11884 #HANGUL SYLLABLE THIEUTH WI MIEUM
+ {0xC6A7, 0xD291}, //11885 #HANGUL SYLLABLE THIEUTH WI PIEUP
+ {0xC6A8, 0xD295}, //11886 #HANGUL SYLLABLE THIEUTH WI IEUNG
+ {0xC6A9, 0xD29C}, //11887 #HANGUL SYLLABLE THIEUTH YU
+ {0xC6AA, 0xD2A0}, //11888 #HANGUL SYLLABLE THIEUTH YU NIEUN
+ {0xC6AB, 0xD2A4}, //11889 #HANGUL SYLLABLE THIEUTH YU RIEUL
+ {0xC6AC, 0xD2AC}, //11890 #HANGUL SYLLABLE THIEUTH YU MIEUM
+ {0xC6AD, 0xD2B1}, //11891 #HANGUL SYLLABLE THIEUTH YU IEUNG
+ {0xC6AE, 0xD2B8}, //11892 #HANGUL SYLLABLE THIEUTH EU
+ {0xC6AF, 0xD2B9}, //11893 #HANGUL SYLLABLE THIEUTH EU KIYEOK
+ {0xC6B0, 0xD2BC}, //11894 #HANGUL SYLLABLE THIEUTH EU NIEUN
+ {0xC6B1, 0xD2BF}, //11895 #HANGUL SYLLABLE THIEUTH EU TIKEUT
+ {0xC6B2, 0xD2C0}, //11896 #HANGUL SYLLABLE THIEUTH EU RIEUL
+ {0xC6B3, 0xD2C2}, //11897 #HANGUL SYLLABLE THIEUTH EU RIEULMIEUM
+ {0xC6B4, 0xD2C8}, //11898 #HANGUL SYLLABLE THIEUTH EU MIEUM
+ {0xC6B5, 0xD2C9}, //11899 #HANGUL SYLLABLE THIEUTH EU PIEUP
+ {0xC6B6, 0xD2CB}, //11900 #HANGUL SYLLABLE THIEUTH EU SIOS
+ {0xC6B7, 0xD2D4}, //11901 #HANGUL SYLLABLE THIEUTH YI
+ {0xC6B8, 0xD2D8}, //11902 #HANGUL SYLLABLE THIEUTH YI NIEUN
+ {0xC6B9, 0xD2DC}, //11903 #HANGUL SYLLABLE THIEUTH YI RIEUL
+ {0xC6BA, 0xD2E4}, //11904 #HANGUL SYLLABLE THIEUTH YI MIEUM
+ {0xC6BB, 0xD2E5}, //11905 #HANGUL SYLLABLE THIEUTH YI PIEUP
+ {0xC6BC, 0xD2F0}, //11906 #HANGUL SYLLABLE THIEUTH I
+ {0xC6BD, 0xD2F1}, //11907 #HANGUL SYLLABLE THIEUTH I KIYEOK
+ {0xC6BE, 0xD2F4}, //11908 #HANGUL SYLLABLE THIEUTH I NIEUN
+ {0xC6BF, 0xD2F8}, //11909 #HANGUL SYLLABLE THIEUTH I RIEUL
+ {0xC6C0, 0xD300}, //11910 #HANGUL SYLLABLE THIEUTH I MIEUM
+ {0xC6C1, 0xD301}, //11911 #HANGUL SYLLABLE THIEUTH I PIEUP
+ {0xC6C2, 0xD303}, //11912 #HANGUL SYLLABLE THIEUTH I SIOS
+ {0xC6C3, 0xD305}, //11913 #HANGUL SYLLABLE THIEUTH I IEUNG
+ {0xC6C4, 0xD30C}, //11914 #HANGUL SYLLABLE PHIEUPH A
+ {0xC6C5, 0xD30D}, //11915 #HANGUL SYLLABLE PHIEUPH A KIYEOK
+ {0xC6C6, 0xD30E}, //11916 #HANGUL SYLLABLE PHIEUPH A SSANGKIYEOK
+ {0xC6C7, 0xD310}, //11917 #HANGUL SYLLABLE PHIEUPH A NIEUN
+ {0xC6C8, 0xD314}, //11918 #HANGUL SYLLABLE PHIEUPH A RIEUL
+ {0xC6C9, 0xD316}, //11919 #HANGUL SYLLABLE PHIEUPH A RIEULMIEUM
+ {0xC6CA, 0xD31C}, //11920 #HANGUL SYLLABLE PHIEUPH A MIEUM
+ {0xC6CB, 0xD31D}, //11921 #HANGUL SYLLABLE PHIEUPH A PIEUP
+ {0xC6CC, 0xD31F}, //11922 #HANGUL SYLLABLE PHIEUPH A SIOS
+ {0xC6CD, 0xD320}, //11923 #HANGUL SYLLABLE PHIEUPH A SSANGSIOS
+ {0xC6CE, 0xD321}, //11924 #HANGUL SYLLABLE PHIEUPH A IEUNG
+ {0xC6CF, 0xD325}, //11925 #HANGUL SYLLABLE PHIEUPH A THIEUTH
+ {0xC6D0, 0xD328}, //11926 #HANGUL SYLLABLE PHIEUPH AE
+ {0xC6D1, 0xD329}, //11927 #HANGUL SYLLABLE PHIEUPH AE KIYEOK
+ {0xC6D2, 0xD32C}, //11928 #HANGUL SYLLABLE PHIEUPH AE NIEUN
+ {0xC6D3, 0xD330}, //11929 #HANGUL SYLLABLE PHIEUPH AE RIEUL
+ {0xC6D4, 0xD338}, //11930 #HANGUL SYLLABLE PHIEUPH AE MIEUM
+ {0xC6D5, 0xD339}, //11931 #HANGUL SYLLABLE PHIEUPH AE PIEUP
+ {0xC6D6, 0xD33B}, //11932 #HANGUL SYLLABLE PHIEUPH AE SIOS
+ {0xC6D7, 0xD33C}, //11933 #HANGUL SYLLABLE PHIEUPH AE SSANGSIOS
+ {0xC6D8, 0xD33D}, //11934 #HANGUL SYLLABLE PHIEUPH AE IEUNG
+ {0xC6D9, 0xD344}, //11935 #HANGUL SYLLABLE PHIEUPH YA
+ {0xC6DA, 0xD345}, //11936 #HANGUL SYLLABLE PHIEUPH YA KIYEOK
+ {0xC6DB, 0xD37C}, //11937 #HANGUL SYLLABLE PHIEUPH EO
+ {0xC6DC, 0xD37D}, //11938 #HANGUL SYLLABLE PHIEUPH EO KIYEOK
+ {0xC6DD, 0xD380}, //11939 #HANGUL SYLLABLE PHIEUPH EO NIEUN
+ {0xC6DE, 0xD384}, //11940 #HANGUL SYLLABLE PHIEUPH EO RIEUL
+ {0xC6DF, 0xD38C}, //11941 #HANGUL SYLLABLE PHIEUPH EO MIEUM
+ {0xC6E0, 0xD38D}, //11942 #HANGUL SYLLABLE PHIEUPH EO PIEUP
+ {0xC6E1, 0xD38F}, //11943 #HANGUL SYLLABLE PHIEUPH EO SIOS
+ {0xC6E2, 0xD390}, //11944 #HANGUL SYLLABLE PHIEUPH EO SSANGSIOS
+ {0xC6E3, 0xD391}, //11945 #HANGUL SYLLABLE PHIEUPH EO IEUNG
+ {0xC6E4, 0xD398}, //11946 #HANGUL SYLLABLE PHIEUPH E
+ {0xC6E5, 0xD399}, //11947 #HANGUL SYLLABLE PHIEUPH E KIYEOK
+ {0xC6E6, 0xD39C}, //11948 #HANGUL SYLLABLE PHIEUPH E NIEUN
+ {0xC6E7, 0xD3A0}, //11949 #HANGUL SYLLABLE PHIEUPH E RIEUL
+ {0xC6E8, 0xD3A8}, //11950 #HANGUL SYLLABLE PHIEUPH E MIEUM
+ {0xC6E9, 0xD3A9}, //11951 #HANGUL SYLLABLE PHIEUPH E PIEUP
+ {0xC6EA, 0xD3AB}, //11952 #HANGUL SYLLABLE PHIEUPH E SIOS
+ {0xC6EB, 0xD3AD}, //11953 #HANGUL SYLLABLE PHIEUPH E IEUNG
+ {0xC6EC, 0xD3B4}, //11954 #HANGUL SYLLABLE PHIEUPH YEO
+ {0xC6ED, 0xD3B8}, //11955 #HANGUL SYLLABLE PHIEUPH YEO NIEUN
+ {0xC6EE, 0xD3BC}, //11956 #HANGUL SYLLABLE PHIEUPH YEO RIEUL
+ {0xC6EF, 0xD3C4}, //11957 #HANGUL SYLLABLE PHIEUPH YEO MIEUM
+ {0xC6F0, 0xD3C5}, //11958 #HANGUL SYLLABLE PHIEUPH YEO PIEUP
+ {0xC6F1, 0xD3C8}, //11959 #HANGUL SYLLABLE PHIEUPH YEO SSANGSIOS
+ {0xC6F2, 0xD3C9}, //11960 #HANGUL SYLLABLE PHIEUPH YEO IEUNG
+ {0xC6F3, 0xD3D0}, //11961 #HANGUL SYLLABLE PHIEUPH YE
+ {0xC6F4, 0xD3D8}, //11962 #HANGUL SYLLABLE PHIEUPH YE RIEUL
+ {0xC6F5, 0xD3E1}, //11963 #HANGUL SYLLABLE PHIEUPH YE PIEUP
+ {0xC6F6, 0xD3E3}, //11964 #HANGUL SYLLABLE PHIEUPH YE SIOS
+ {0xC6F7, 0xD3EC}, //11965 #HANGUL SYLLABLE PHIEUPH O
+ {0xC6F8, 0xD3ED}, //11966 #HANGUL SYLLABLE PHIEUPH O KIYEOK
+ {0xC6F9, 0xD3F0}, //11967 #HANGUL SYLLABLE PHIEUPH O NIEUN
+ {0xC6FA, 0xD3F4}, //11968 #HANGUL SYLLABLE PHIEUPH O RIEUL
+ {0xC6FB, 0xD3FC}, //11969 #HANGUL SYLLABLE PHIEUPH O MIEUM
+ {0xC6FC, 0xD3FD}, //11970 #HANGUL SYLLABLE PHIEUPH O PIEUP
+ {0xC6FD, 0xD3FF}, //11971 #HANGUL SYLLABLE PHIEUPH O SIOS
+ {0xC6FE, 0xD401}, //11972 #HANGUL SYLLABLE PHIEUPH O IEUNG
+ {0xC7A1, 0xD408}, //11973 #HANGUL SYLLABLE PHIEUPH WA
+ {0xC7A2, 0xD41D}, //11974 #HANGUL SYLLABLE PHIEUPH WA IEUNG
+ {0xC7A3, 0xD440}, //11975 #HANGUL SYLLABLE PHIEUPH OE
+ {0xC7A4, 0xD444}, //11976 #HANGUL SYLLABLE PHIEUPH OE NIEUN
+ {0xC7A5, 0xD45C}, //11977 #HANGUL SYLLABLE PHIEUPH YO
+ {0xC7A6, 0xD460}, //11978 #HANGUL SYLLABLE PHIEUPH YO NIEUN
+ {0xC7A7, 0xD464}, //11979 #HANGUL SYLLABLE PHIEUPH YO RIEUL
+ {0xC7A8, 0xD46D}, //11980 #HANGUL SYLLABLE PHIEUPH YO PIEUP
+ {0xC7A9, 0xD46F}, //11981 #HANGUL SYLLABLE PHIEUPH YO SIOS
+ {0xC7AA, 0xD478}, //11982 #HANGUL SYLLABLE PHIEUPH U
+ {0xC7AB, 0xD479}, //11983 #HANGUL SYLLABLE PHIEUPH U KIYEOK
+ {0xC7AC, 0xD47C}, //11984 #HANGUL SYLLABLE PHIEUPH U NIEUN
+ {0xC7AD, 0xD47F}, //11985 #HANGUL SYLLABLE PHIEUPH U TIKEUT
+ {0xC7AE, 0xD480}, //11986 #HANGUL SYLLABLE PHIEUPH U RIEUL
+ {0xC7AF, 0xD482}, //11987 #HANGUL SYLLABLE PHIEUPH U RIEULMIEUM
+ {0xC7B0, 0xD488}, //11988 #HANGUL SYLLABLE PHIEUPH U MIEUM
+ {0xC7B1, 0xD489}, //11989 #HANGUL SYLLABLE PHIEUPH U PIEUP
+ {0xC7B2, 0xD48B}, //11990 #HANGUL SYLLABLE PHIEUPH U SIOS
+ {0xC7B3, 0xD48D}, //11991 #HANGUL SYLLABLE PHIEUPH U IEUNG
+ {0xC7B4, 0xD494}, //11992 #HANGUL SYLLABLE PHIEUPH WEO
+ {0xC7B5, 0xD4A9}, //11993 #HANGUL SYLLABLE PHIEUPH WEO IEUNG
+ {0xC7B6, 0xD4CC}, //11994 #HANGUL SYLLABLE PHIEUPH WI
+ {0xC7B7, 0xD4D0}, //11995 #HANGUL SYLLABLE PHIEUPH WI NIEUN
+ {0xC7B8, 0xD4D4}, //11996 #HANGUL SYLLABLE PHIEUPH WI RIEUL
+ {0xC7B9, 0xD4DC}, //11997 #HANGUL SYLLABLE PHIEUPH WI MIEUM
+ {0xC7BA, 0xD4DF}, //11998 #HANGUL SYLLABLE PHIEUPH WI SIOS
+ {0xC7BB, 0xD4E8}, //11999 #HANGUL SYLLABLE PHIEUPH YU
+ {0xC7BC, 0xD4EC}, //12000 #HANGUL SYLLABLE PHIEUPH YU NIEUN
+ {0xC7BD, 0xD4F0}, //12001 #HANGUL SYLLABLE PHIEUPH YU RIEUL
+ {0xC7BE, 0xD4F8}, //12002 #HANGUL SYLLABLE PHIEUPH YU MIEUM
+ {0xC7BF, 0xD4FB}, //12003 #HANGUL SYLLABLE PHIEUPH YU SIOS
+ {0xC7C0, 0xD4FD}, //12004 #HANGUL SYLLABLE PHIEUPH YU IEUNG
+ {0xC7C1, 0xD504}, //12005 #HANGUL SYLLABLE PHIEUPH EU
+ {0xC7C2, 0xD508}, //12006 #HANGUL SYLLABLE PHIEUPH EU NIEUN
+ {0xC7C3, 0xD50C}, //12007 #HANGUL SYLLABLE PHIEUPH EU RIEUL
+ {0xC7C4, 0xD514}, //12008 #HANGUL SYLLABLE PHIEUPH EU MIEUM
+ {0xC7C5, 0xD515}, //12009 #HANGUL SYLLABLE PHIEUPH EU PIEUP
+ {0xC7C6, 0xD517}, //12010 #HANGUL SYLLABLE PHIEUPH EU SIOS
+ {0xC7C7, 0xD53C}, //12011 #HANGUL SYLLABLE PHIEUPH I
+ {0xC7C8, 0xD53D}, //12012 #HANGUL SYLLABLE PHIEUPH I KIYEOK
+ {0xC7C9, 0xD540}, //12013 #HANGUL SYLLABLE PHIEUPH I NIEUN
+ {0xC7CA, 0xD544}, //12014 #HANGUL SYLLABLE PHIEUPH I RIEUL
+ {0xC7CB, 0xD54C}, //12015 #HANGUL SYLLABLE PHIEUPH I MIEUM
+ {0xC7CC, 0xD54D}, //12016 #HANGUL SYLLABLE PHIEUPH I PIEUP
+ {0xC7CD, 0xD54F}, //12017 #HANGUL SYLLABLE PHIEUPH I SIOS
+ {0xC7CE, 0xD551}, //12018 #HANGUL SYLLABLE PHIEUPH I IEUNG
+ {0xC7CF, 0xD558}, //12019 #HANGUL SYLLABLE HIEUH A
+ {0xC7D0, 0xD559}, //12020 #HANGUL SYLLABLE HIEUH A KIYEOK
+ {0xC7D1, 0xD55C}, //12021 #HANGUL SYLLABLE HIEUH A NIEUN
+ {0xC7D2, 0xD560}, //12022 #HANGUL SYLLABLE HIEUH A RIEUL
+ {0xC7D3, 0xD565}, //12023 #HANGUL SYLLABLE HIEUH A RIEULTHIEUTH
+ {0xC7D4, 0xD568}, //12024 #HANGUL SYLLABLE HIEUH A MIEUM
+ {0xC7D5, 0xD569}, //12025 #HANGUL SYLLABLE HIEUH A PIEUP
+ {0xC7D6, 0xD56B}, //12026 #HANGUL SYLLABLE HIEUH A SIOS
+ {0xC7D7, 0xD56D}, //12027 #HANGUL SYLLABLE HIEUH A IEUNG
+ {0xC7D8, 0xD574}, //12028 #HANGUL SYLLABLE HIEUH AE
+ {0xC7D9, 0xD575}, //12029 #HANGUL SYLLABLE HIEUH AE KIYEOK
+ {0xC7DA, 0xD578}, //12030 #HANGUL SYLLABLE HIEUH AE NIEUN
+ {0xC7DB, 0xD57C}, //12031 #HANGUL SYLLABLE HIEUH AE RIEUL
+ {0xC7DC, 0xD584}, //12032 #HANGUL SYLLABLE HIEUH AE MIEUM
+ {0xC7DD, 0xD585}, //12033 #HANGUL SYLLABLE HIEUH AE PIEUP
+ {0xC7DE, 0xD587}, //12034 #HANGUL SYLLABLE HIEUH AE SIOS
+ {0xC7DF, 0xD588}, //12035 #HANGUL SYLLABLE HIEUH AE SSANGSIOS
+ {0xC7E0, 0xD589}, //12036 #HANGUL SYLLABLE HIEUH AE IEUNG
+ {0xC7E1, 0xD590}, //12037 #HANGUL SYLLABLE HIEUH YA
+ {0xC7E2, 0xD5A5}, //12038 #HANGUL SYLLABLE HIEUH YA IEUNG
+ {0xC7E3, 0xD5C8}, //12039 #HANGUL SYLLABLE HIEUH EO
+ {0xC7E4, 0xD5C9}, //12040 #HANGUL SYLLABLE HIEUH EO KIYEOK
+ {0xC7E5, 0xD5CC}, //12041 #HANGUL SYLLABLE HIEUH EO NIEUN
+ {0xC7E6, 0xD5D0}, //12042 #HANGUL SYLLABLE HIEUH EO RIEUL
+ {0xC7E7, 0xD5D2}, //12043 #HANGUL SYLLABLE HIEUH EO RIEULMIEUM
+ {0xC7E8, 0xD5D8}, //12044 #HANGUL SYLLABLE HIEUH EO MIEUM
+ {0xC7E9, 0xD5D9}, //12045 #HANGUL SYLLABLE HIEUH EO PIEUP
+ {0xC7EA, 0xD5DB}, //12046 #HANGUL SYLLABLE HIEUH EO SIOS
+ {0xC7EB, 0xD5DD}, //12047 #HANGUL SYLLABLE HIEUH EO IEUNG
+ {0xC7EC, 0xD5E4}, //12048 #HANGUL SYLLABLE HIEUH E
+ {0xC7ED, 0xD5E5}, //12049 #HANGUL SYLLABLE HIEUH E KIYEOK
+ {0xC7EE, 0xD5E8}, //12050 #HANGUL SYLLABLE HIEUH E NIEUN
+ {0xC7EF, 0xD5EC}, //12051 #HANGUL SYLLABLE HIEUH E RIEUL
+ {0xC7F0, 0xD5F4}, //12052 #HANGUL SYLLABLE HIEUH E MIEUM
+ {0xC7F1, 0xD5F5}, //12053 #HANGUL SYLLABLE HIEUH E PIEUP
+ {0xC7F2, 0xD5F7}, //12054 #HANGUL SYLLABLE HIEUH E SIOS
+ {0xC7F3, 0xD5F9}, //12055 #HANGUL SYLLABLE HIEUH E IEUNG
+ {0xC7F4, 0xD600}, //12056 #HANGUL SYLLABLE HIEUH YEO
+ {0xC7F5, 0xD601}, //12057 #HANGUL SYLLABLE HIEUH YEO KIYEOK
+ {0xC7F6, 0xD604}, //12058 #HANGUL SYLLABLE HIEUH YEO NIEUN
+ {0xC7F7, 0xD608}, //12059 #HANGUL SYLLABLE HIEUH YEO RIEUL
+ {0xC7F8, 0xD610}, //12060 #HANGUL SYLLABLE HIEUH YEO MIEUM
+ {0xC7F9, 0xD611}, //12061 #HANGUL SYLLABLE HIEUH YEO PIEUP
+ {0xC7FA, 0xD613}, //12062 #HANGUL SYLLABLE HIEUH YEO SIOS
+ {0xC7FB, 0xD614}, //12063 #HANGUL SYLLABLE HIEUH YEO SSANGSIOS
+ {0xC7FC, 0xD615}, //12064 #HANGUL SYLLABLE HIEUH YEO IEUNG
+ {0xC7FD, 0xD61C}, //12065 #HANGUL SYLLABLE HIEUH YE
+ {0xC7FE, 0xD620}, //12066 #HANGUL SYLLABLE HIEUH YE NIEUN
+ {0xC8A1, 0xD624}, //12067 #HANGUL SYLLABLE HIEUH YE RIEUL
+ {0xC8A2, 0xD62D}, //12068 #HANGUL SYLLABLE HIEUH YE PIEUP
+ {0xC8A3, 0xD638}, //12069 #HANGUL SYLLABLE HIEUH O
+ {0xC8A4, 0xD639}, //12070 #HANGUL SYLLABLE HIEUH O KIYEOK
+ {0xC8A5, 0xD63C}, //12071 #HANGUL SYLLABLE HIEUH O NIEUN
+ {0xC8A6, 0xD640}, //12072 #HANGUL SYLLABLE HIEUH O RIEUL
+ {0xC8A7, 0xD645}, //12073 #HANGUL SYLLABLE HIEUH O RIEULTHIEUTH
+ {0xC8A8, 0xD648}, //12074 #HANGUL SYLLABLE HIEUH O MIEUM
+ {0xC8A9, 0xD649}, //12075 #HANGUL SYLLABLE HIEUH O PIEUP
+ {0xC8AA, 0xD64B}, //12076 #HANGUL SYLLABLE HIEUH O SIOS
+ {0xC8AB, 0xD64D}, //12077 #HANGUL SYLLABLE HIEUH O IEUNG
+ {0xC8AC, 0xD651}, //12078 #HANGUL SYLLABLE HIEUH O THIEUTH
+ {0xC8AD, 0xD654}, //12079 #HANGUL SYLLABLE HIEUH WA
+ {0xC8AE, 0xD655}, //12080 #HANGUL SYLLABLE HIEUH WA KIYEOK
+ {0xC8AF, 0xD658}, //12081 #HANGUL SYLLABLE HIEUH WA NIEUN
+ {0xC8B0, 0xD65C}, //12082 #HANGUL SYLLABLE HIEUH WA RIEUL
+ {0xC8B1, 0xD667}, //12083 #HANGUL SYLLABLE HIEUH WA SIOS
+ {0xC8B2, 0xD669}, //12084 #HANGUL SYLLABLE HIEUH WA IEUNG
+ {0xC8B3, 0xD670}, //12085 #HANGUL SYLLABLE HIEUH WAE
+ {0xC8B4, 0xD671}, //12086 #HANGUL SYLLABLE HIEUH WAE KIYEOK
+ {0xC8B5, 0xD674}, //12087 #HANGUL SYLLABLE HIEUH WAE NIEUN
+ {0xC8B6, 0xD683}, //12088 #HANGUL SYLLABLE HIEUH WAE SIOS
+ {0xC8B7, 0xD685}, //12089 #HANGUL SYLLABLE HIEUH WAE IEUNG
+ {0xC8B8, 0xD68C}, //12090 #HANGUL SYLLABLE HIEUH OE
+ {0xC8B9, 0xD68D}, //12091 #HANGUL SYLLABLE HIEUH OE KIYEOK
+ {0xC8BA, 0xD690}, //12092 #HANGUL SYLLABLE HIEUH OE NIEUN
+ {0xC8BB, 0xD694}, //12093 #HANGUL SYLLABLE HIEUH OE RIEUL
+ {0xC8BC, 0xD69D}, //12094 #HANGUL SYLLABLE HIEUH OE PIEUP
+ {0xC8BD, 0xD69F}, //12095 #HANGUL SYLLABLE HIEUH OE SIOS
+ {0xC8BE, 0xD6A1}, //12096 #HANGUL SYLLABLE HIEUH OE IEUNG
+ {0xC8BF, 0xD6A8}, //12097 #HANGUL SYLLABLE HIEUH YO
+ {0xC8C0, 0xD6AC}, //12098 #HANGUL SYLLABLE HIEUH YO NIEUN
+ {0xC8C1, 0xD6B0}, //12099 #HANGUL SYLLABLE HIEUH YO RIEUL
+ {0xC8C2, 0xD6B9}, //12100 #HANGUL SYLLABLE HIEUH YO PIEUP
+ {0xC8C3, 0xD6BB}, //12101 #HANGUL SYLLABLE HIEUH YO SIOS
+ {0xC8C4, 0xD6C4}, //12102 #HANGUL SYLLABLE HIEUH U
+ {0xC8C5, 0xD6C5}, //12103 #HANGUL SYLLABLE HIEUH U KIYEOK
+ {0xC8C6, 0xD6C8}, //12104 #HANGUL SYLLABLE HIEUH U NIEUN
+ {0xC8C7, 0xD6CC}, //12105 #HANGUL SYLLABLE HIEUH U RIEUL
+ {0xC8C8, 0xD6D1}, //12106 #HANGUL SYLLABLE HIEUH U RIEULTHIEUTH
+ {0xC8C9, 0xD6D4}, //12107 #HANGUL SYLLABLE HIEUH U MIEUM
+ {0xC8CA, 0xD6D7}, //12108 #HANGUL SYLLABLE HIEUH U SIOS
+ {0xC8CB, 0xD6D9}, //12109 #HANGUL SYLLABLE HIEUH U IEUNG
+ {0xC8CC, 0xD6E0}, //12110 #HANGUL SYLLABLE HIEUH WEO
+ {0xC8CD, 0xD6E4}, //12111 #HANGUL SYLLABLE HIEUH WEO NIEUN
+ {0xC8CE, 0xD6E8}, //12112 #HANGUL SYLLABLE HIEUH WEO RIEUL
+ {0xC8CF, 0xD6F0}, //12113 #HANGUL SYLLABLE HIEUH WEO MIEUM
+ {0xC8D0, 0xD6F5}, //12114 #HANGUL SYLLABLE HIEUH WEO IEUNG
+ {0xC8D1, 0xD6FC}, //12115 #HANGUL SYLLABLE HIEUH WE
+ {0xC8D2, 0xD6FD}, //12116 #HANGUL SYLLABLE HIEUH WE KIYEOK
+ {0xC8D3, 0xD700}, //12117 #HANGUL SYLLABLE HIEUH WE NIEUN
+ {0xC8D4, 0xD704}, //12118 #HANGUL SYLLABLE HIEUH WE RIEUL
+ {0xC8D5, 0xD711}, //12119 #HANGUL SYLLABLE HIEUH WE IEUNG
+ {0xC8D6, 0xD718}, //12120 #HANGUL SYLLABLE HIEUH WI
+ {0xC8D7, 0xD719}, //12121 #HANGUL SYLLABLE HIEUH WI KIYEOK
+ {0xC8D8, 0xD71C}, //12122 #HANGUL SYLLABLE HIEUH WI NIEUN
+ {0xC8D9, 0xD720}, //12123 #HANGUL SYLLABLE HIEUH WI RIEUL
+ {0xC8DA, 0xD728}, //12124 #HANGUL SYLLABLE HIEUH WI MIEUM
+ {0xC8DB, 0xD729}, //12125 #HANGUL SYLLABLE HIEUH WI PIEUP
+ {0xC8DC, 0xD72B}, //12126 #HANGUL SYLLABLE HIEUH WI SIOS
+ {0xC8DD, 0xD72D}, //12127 #HANGUL SYLLABLE HIEUH WI IEUNG
+ {0xC8DE, 0xD734}, //12128 #HANGUL SYLLABLE HIEUH YU
+ {0xC8DF, 0xD735}, //12129 #HANGUL SYLLABLE HIEUH YU KIYEOK
+ {0xC8E0, 0xD738}, //12130 #HANGUL SYLLABLE HIEUH YU NIEUN
+ {0xC8E1, 0xD73C}, //12131 #HANGUL SYLLABLE HIEUH YU RIEUL
+ {0xC8E2, 0xD744}, //12132 #HANGUL SYLLABLE HIEUH YU MIEUM
+ {0xC8E3, 0xD747}, //12133 #HANGUL SYLLABLE HIEUH YU SIOS
+ {0xC8E4, 0xD749}, //12134 #HANGUL SYLLABLE HIEUH YU IEUNG
+ {0xC8E5, 0xD750}, //12135 #HANGUL SYLLABLE HIEUH EU
+ {0xC8E6, 0xD751}, //12136 #HANGUL SYLLABLE HIEUH EU KIYEOK
+ {0xC8E7, 0xD754}, //12137 #HANGUL SYLLABLE HIEUH EU NIEUN
+ {0xC8E8, 0xD756}, //12138 #HANGUL SYLLABLE HIEUH EU NIEUNHIEUH
+ {0xC8E9, 0xD757}, //12139 #HANGUL SYLLABLE HIEUH EU TIKEUT
+ {0xC8EA, 0xD758}, //12140 #HANGUL SYLLABLE HIEUH EU RIEUL
+ {0xC8EB, 0xD759}, //12141 #HANGUL SYLLABLE HIEUH EU RIEULKIYEOK
+ {0xC8EC, 0xD760}, //12142 #HANGUL SYLLABLE HIEUH EU MIEUM
+ {0xC8ED, 0xD761}, //12143 #HANGUL SYLLABLE HIEUH EU PIEUP
+ {0xC8EE, 0xD763}, //12144 #HANGUL SYLLABLE HIEUH EU SIOS
+ {0xC8EF, 0xD765}, //12145 #HANGUL SYLLABLE HIEUH EU IEUNG
+ {0xC8F0, 0xD769}, //12146 #HANGUL SYLLABLE HIEUH EU THIEUTH
+ {0xC8F1, 0xD76C}, //12147 #HANGUL SYLLABLE HIEUH YI
+ {0xC8F2, 0xD770}, //12148 #HANGUL SYLLABLE HIEUH YI NIEUN
+ {0xC8F3, 0xD774}, //12149 #HANGUL SYLLABLE HIEUH YI RIEUL
+ {0xC8F4, 0xD77C}, //12150 #HANGUL SYLLABLE HIEUH YI MIEUM
+ {0xC8F5, 0xD77D}, //12151 #HANGUL SYLLABLE HIEUH YI PIEUP
+ {0xC8F6, 0xD781}, //12152 #HANGUL SYLLABLE HIEUH YI IEUNG
+ {0xC8F7, 0xD788}, //12153 #HANGUL SYLLABLE HIEUH I
+ {0xC8F8, 0xD789}, //12154 #HANGUL SYLLABLE HIEUH I KIYEOK
+ {0xC8F9, 0xD78C}, //12155 #HANGUL SYLLABLE HIEUH I NIEUN
+ {0xC8FA, 0xD790}, //12156 #HANGUL SYLLABLE HIEUH I RIEUL
+ {0xC8FB, 0xD798}, //12157 #HANGUL SYLLABLE HIEUH I MIEUM
+ {0xC8FC, 0xD799}, //12158 #HANGUL SYLLABLE HIEUH I PIEUP
+ {0xC8FD, 0xD79B}, //12159 #HANGUL SYLLABLE HIEUH I SIOS
+ {0xC8FE, 0xD79D}, //12160 #HANGUL SYLLABLE HIEUH I IEUNG
+ {0xCAA1, 0x4F3D}, //12161 #CJK UNIFIED IDEOGRAPH
+ {0xCAA2, 0x4F73}, //12162 #CJK UNIFIED IDEOGRAPH
+ {0xCAA3, 0x5047}, //12163 #CJK UNIFIED IDEOGRAPH
+ {0xCAA4, 0x50F9}, //12164 #CJK UNIFIED IDEOGRAPH
+ {0xCAA5, 0x52A0}, //12165 #CJK UNIFIED IDEOGRAPH
+ {0xCAA6, 0x53EF}, //12166 #CJK UNIFIED IDEOGRAPH
+ {0xCAA7, 0x5475}, //12167 #CJK UNIFIED IDEOGRAPH
+ {0xCAA8, 0x54E5}, //12168 #CJK UNIFIED IDEOGRAPH
+ {0xCAA9, 0x5609}, //12169 #CJK UNIFIED IDEOGRAPH
+ {0xCAAA, 0x5AC1}, //12170 #CJK UNIFIED IDEOGRAPH
+ {0xCAAB, 0x5BB6}, //12171 #CJK UNIFIED IDEOGRAPH
+ {0xCAAC, 0x6687}, //12172 #CJK UNIFIED IDEOGRAPH
+ {0xCAAD, 0x67B6}, //12173 #CJK UNIFIED IDEOGRAPH
+ {0xCAAE, 0x67B7}, //12174 #CJK UNIFIED IDEOGRAPH
+ {0xCAAF, 0x67EF}, //12175 #CJK UNIFIED IDEOGRAPH
+ {0xCAB0, 0x6B4C}, //12176 #CJK UNIFIED IDEOGRAPH
+ {0xCAB1, 0x73C2}, //12177 #CJK UNIFIED IDEOGRAPH
+ {0xCAB2, 0x75C2}, //12178 #CJK UNIFIED IDEOGRAPH
+ {0xCAB3, 0x7A3C}, //12179 #CJK UNIFIED IDEOGRAPH
+ {0xCAB4, 0x82DB}, //12180 #CJK UNIFIED IDEOGRAPH
+ {0xCAB5, 0x8304}, //12181 #CJK UNIFIED IDEOGRAPH
+ {0xCAB6, 0x8857}, //12182 #CJK UNIFIED IDEOGRAPH
+ {0xCAB7, 0x8888}, //12183 #CJK UNIFIED IDEOGRAPH
+ {0xCAB8, 0x8A36}, //12184 #CJK UNIFIED IDEOGRAPH
+ {0xCAB9, 0x8CC8}, //12185 #CJK UNIFIED IDEOGRAPH
+ {0xCABA, 0x8DCF}, //12186 #CJK UNIFIED IDEOGRAPH
+ {0xCABB, 0x8EFB}, //12187 #CJK UNIFIED IDEOGRAPH
+ {0xCABC, 0x8FE6}, //12188 #CJK UNIFIED IDEOGRAPH
+ {0xCABD, 0x99D5}, //12189 #CJK UNIFIED IDEOGRAPH
+ {0xCABE, 0x523B}, //12190 #CJK UNIFIED IDEOGRAPH
+ {0xCABF, 0x5374}, //12191 #CJK UNIFIED IDEOGRAPH
+ {0xCAC0, 0x5404}, //12192 #CJK UNIFIED IDEOGRAPH
+ {0xCAC1, 0x606A}, //12193 #CJK UNIFIED IDEOGRAPH
+ {0xCAC2, 0x6164}, //12194 #CJK UNIFIED IDEOGRAPH
+ {0xCAC3, 0x6BBC}, //12195 #CJK UNIFIED IDEOGRAPH
+ {0xCAC4, 0x73CF}, //12196 #CJK UNIFIED IDEOGRAPH
+ {0xCAC5, 0x811A}, //12197 #CJK UNIFIED IDEOGRAPH
+ {0xCAC6, 0x89BA}, //12198 #CJK UNIFIED IDEOGRAPH
+ {0xCAC7, 0x89D2}, //12199 #CJK UNIFIED IDEOGRAPH
+ {0xCAC8, 0x95A3}, //12200 #CJK UNIFIED IDEOGRAPH
+ {0xCAC9, 0x4F83}, //12201 #CJK UNIFIED IDEOGRAPH
+ {0xCACA, 0x520A}, //12202 #CJK UNIFIED IDEOGRAPH
+ {0xCACB, 0x58BE}, //12203 #CJK UNIFIED IDEOGRAPH
+ {0xCACC, 0x5978}, //12204 #CJK UNIFIED IDEOGRAPH
+ {0xCACD, 0x59E6}, //12205 #CJK UNIFIED IDEOGRAPH
+ {0xCACE, 0x5E72}, //12206 #CJK UNIFIED IDEOGRAPH
+ {0xCACF, 0x5E79}, //12207 #CJK UNIFIED IDEOGRAPH
+ {0xCAD0, 0x61C7}, //12208 #CJK UNIFIED IDEOGRAPH
+ {0xCAD1, 0x63C0}, //12209 #CJK UNIFIED IDEOGRAPH
+ {0xCAD2, 0x6746}, //12210 #CJK UNIFIED IDEOGRAPH
+ {0xCAD3, 0x67EC}, //12211 #CJK UNIFIED IDEOGRAPH
+ {0xCAD4, 0x687F}, //12212 #CJK UNIFIED IDEOGRAPH
+ {0xCAD5, 0x6F97}, //12213 #CJK UNIFIED IDEOGRAPH
+ {0xCAD6, 0x764E}, //12214 #CJK UNIFIED IDEOGRAPH
+ {0xCAD7, 0x770B}, //12215 #CJK UNIFIED IDEOGRAPH
+ {0xCAD8, 0x78F5}, //12216 #CJK UNIFIED IDEOGRAPH
+ {0xCAD9, 0x7A08}, //12217 #CJK UNIFIED IDEOGRAPH
+ {0xCADA, 0x7AFF}, //12218 #CJK UNIFIED IDEOGRAPH
+ {0xCADB, 0x7C21}, //12219 #CJK UNIFIED IDEOGRAPH
+ {0xCADC, 0x809D}, //12220 #CJK UNIFIED IDEOGRAPH
+ {0xCADD, 0x826E}, //12221 #CJK UNIFIED IDEOGRAPH
+ {0xCADE, 0x8271}, //12222 #CJK UNIFIED IDEOGRAPH
+ {0xCADF, 0x8AEB}, //12223 #CJK UNIFIED IDEOGRAPH
+ {0xCAE0, 0x9593}, //12224 #CJK UNIFIED IDEOGRAPH
+ {0xCAE1, 0x4E6B}, //12225 #CJK UNIFIED IDEOGRAPH
+ {0xCAE2, 0x559D}, //12226 #CJK UNIFIED IDEOGRAPH
+ {0xCAE3, 0x66F7}, //12227 #CJK UNIFIED IDEOGRAPH
+ {0xCAE4, 0x6E34}, //12228 #CJK UNIFIED IDEOGRAPH
+ {0xCAE5, 0x78A3}, //12229 #CJK UNIFIED IDEOGRAPH
+ {0xCAE6, 0x7AED}, //12230 #CJK UNIFIED IDEOGRAPH
+ {0xCAE7, 0x845B}, //12231 #CJK UNIFIED IDEOGRAPH
+ {0xCAE8, 0x8910}, //12232 #CJK UNIFIED IDEOGRAPH
+ {0xCAE9, 0x874E}, //12233 #CJK UNIFIED IDEOGRAPH
+ {0xCAEA, 0x97A8}, //12234 #CJK UNIFIED IDEOGRAPH
+ {0xCAEB, 0x52D8}, //12235 #CJK UNIFIED IDEOGRAPH
+ {0xCAEC, 0x574E}, //12236 #CJK UNIFIED IDEOGRAPH
+ {0xCAED, 0x582A}, //12237 #CJK UNIFIED IDEOGRAPH
+ {0xCAEE, 0x5D4C}, //12238 #CJK UNIFIED IDEOGRAPH
+ {0xCAEF, 0x611F}, //12239 #CJK UNIFIED IDEOGRAPH
+ {0xCAF0, 0x61BE}, //12240 #CJK UNIFIED IDEOGRAPH
+ {0xCAF1, 0x6221}, //12241 #CJK UNIFIED IDEOGRAPH
+ {0xCAF2, 0x6562}, //12242 #CJK UNIFIED IDEOGRAPH
+ {0xCAF3, 0x67D1}, //12243 #CJK UNIFIED IDEOGRAPH
+ {0xCAF4, 0x6A44}, //12244 #CJK UNIFIED IDEOGRAPH
+ {0xCAF5, 0x6E1B}, //12245 #CJK UNIFIED IDEOGRAPH
+ {0xCAF6, 0x7518}, //12246 #CJK UNIFIED IDEOGRAPH
+ {0xCAF7, 0x75B3}, //12247 #CJK UNIFIED IDEOGRAPH
+ {0xCAF8, 0x76E3}, //12248 #CJK UNIFIED IDEOGRAPH
+ {0xCAF9, 0x77B0}, //12249 #CJK UNIFIED IDEOGRAPH
+ {0xCAFA, 0x7D3A}, //12250 #CJK UNIFIED IDEOGRAPH
+ {0xCAFB, 0x90AF}, //12251 #CJK UNIFIED IDEOGRAPH
+ {0xCAFC, 0x9451}, //12252 #CJK UNIFIED IDEOGRAPH
+ {0xCAFD, 0x9452}, //12253 #CJK UNIFIED IDEOGRAPH
+ {0xCAFE, 0x9F95}, //12254 #CJK UNIFIED IDEOGRAPH
+ {0xCBA1, 0x5323}, //12255 #CJK UNIFIED IDEOGRAPH
+ {0xCBA2, 0x5CAC}, //12256 #CJK UNIFIED IDEOGRAPH
+ {0xCBA3, 0x7532}, //12257 #CJK UNIFIED IDEOGRAPH
+ {0xCBA4, 0x80DB}, //12258 #CJK UNIFIED IDEOGRAPH
+ {0xCBA5, 0x9240}, //12259 #CJK UNIFIED IDEOGRAPH
+ {0xCBA6, 0x9598}, //12260 #CJK UNIFIED IDEOGRAPH
+ {0xCBA7, 0x525B}, //12261 #CJK UNIFIED IDEOGRAPH
+ {0xCBA8, 0x5808}, //12262 #CJK UNIFIED IDEOGRAPH
+ {0xCBA9, 0x59DC}, //12263 #CJK UNIFIED IDEOGRAPH
+ {0xCBAA, 0x5CA1}, //12264 #CJK UNIFIED IDEOGRAPH
+ {0xCBAB, 0x5D17}, //12265 #CJK UNIFIED IDEOGRAPH
+ {0xCBAC, 0x5EB7}, //12266 #CJK UNIFIED IDEOGRAPH
+ {0xCBAD, 0x5F3A}, //12267 #CJK UNIFIED IDEOGRAPH
+ {0xCBAE, 0x5F4A}, //12268 #CJK UNIFIED IDEOGRAPH
+ {0xCBAF, 0x6177}, //12269 #CJK UNIFIED IDEOGRAPH
+ {0xCBB0, 0x6C5F}, //12270 #CJK UNIFIED IDEOGRAPH
+ {0xCBB1, 0x757A}, //12271 #CJK UNIFIED IDEOGRAPH
+ {0xCBB2, 0x7586}, //12272 #CJK UNIFIED IDEOGRAPH
+ {0xCBB3, 0x7CE0}, //12273 #CJK UNIFIED IDEOGRAPH
+ {0xCBB4, 0x7D73}, //12274 #CJK UNIFIED IDEOGRAPH
+ {0xCBB5, 0x7DB1}, //12275 #CJK UNIFIED IDEOGRAPH
+ {0xCBB6, 0x7F8C}, //12276 #CJK UNIFIED IDEOGRAPH
+ {0xCBB7, 0x8154}, //12277 #CJK UNIFIED IDEOGRAPH
+ {0xCBB8, 0x8221}, //12278 #CJK UNIFIED IDEOGRAPH
+ {0xCBB9, 0x8591}, //12279 #CJK UNIFIED IDEOGRAPH
+ {0xCBBA, 0x8941}, //12280 #CJK UNIFIED IDEOGRAPH
+ {0xCBBB, 0x8B1B}, //12281 #CJK UNIFIED IDEOGRAPH
+ {0xCBBC, 0x92FC}, //12282 #CJK UNIFIED IDEOGRAPH
+ {0xCBBD, 0x964D}, //12283 #CJK UNIFIED IDEOGRAPH
+ {0xCBBE, 0x9C47}, //12284 #CJK UNIFIED IDEOGRAPH
+ {0xCBBF, 0x4ECB}, //12285 #CJK UNIFIED IDEOGRAPH
+ {0xCBC0, 0x4EF7}, //12286 #CJK UNIFIED IDEOGRAPH
+ {0xCBC1, 0x500B}, //12287 #CJK UNIFIED IDEOGRAPH
+ {0xCBC2, 0x51F1}, //12288 #CJK UNIFIED IDEOGRAPH
+ {0xCBC3, 0x584F}, //12289 #CJK UNIFIED IDEOGRAPH
+ {0xCBC4, 0x6137}, //12290 #CJK UNIFIED IDEOGRAPH
+ {0xCBC5, 0x613E}, //12291 #CJK UNIFIED IDEOGRAPH
+ {0xCBC6, 0x6168}, //12292 #CJK UNIFIED IDEOGRAPH
+ {0xCBC7, 0x6539}, //12293 #CJK UNIFIED IDEOGRAPH
+ {0xCBC8, 0x69EA}, //12294 #CJK UNIFIED IDEOGRAPH
+ {0xCBC9, 0x6F11}, //12295 #CJK UNIFIED IDEOGRAPH
+ {0xCBCA, 0x75A5}, //12296 #CJK UNIFIED IDEOGRAPH
+ {0xCBCB, 0x7686}, //12297 #CJK UNIFIED IDEOGRAPH
+ {0xCBCC, 0x76D6}, //12298 #CJK UNIFIED IDEOGRAPH
+ {0xCBCD, 0x7B87}, //12299 #CJK UNIFIED IDEOGRAPH
+ {0xCBCE, 0x82A5}, //12300 #CJK UNIFIED IDEOGRAPH
+ {0xCBCF, 0x84CB}, //12301 #CJK UNIFIED IDEOGRAPH
+ {0xCBD0, 0xF900}, //12302 #CJK COMPATIBILITY IDEOGRAPH
+ {0xCBD1, 0x93A7}, //12303 #CJK UNIFIED IDEOGRAPH
+ {0xCBD2, 0x958B}, //12304 #CJK UNIFIED IDEOGRAPH
+ {0xCBD3, 0x5580}, //12305 #CJK UNIFIED IDEOGRAPH
+ {0xCBD4, 0x5BA2}, //12306 #CJK UNIFIED IDEOGRAPH
+ {0xCBD5, 0x5751}, //12307 #CJK UNIFIED IDEOGRAPH
+ {0xCBD6, 0xF901}, //12308 #CJK COMPATIBILITY IDEOGRAPH
+ {0xCBD7, 0x7CB3}, //12309 #CJK UNIFIED IDEOGRAPH
+ {0xCBD8, 0x7FB9}, //12310 #CJK UNIFIED IDEOGRAPH
+ {0xCBD9, 0x91B5}, //12311 #CJK UNIFIED IDEOGRAPH
+ {0xCBDA, 0x5028}, //12312 #CJK UNIFIED IDEOGRAPH
+ {0xCBDB, 0x53BB}, //12313 #CJK UNIFIED IDEOGRAPH
+ {0xCBDC, 0x5C45}, //12314 #CJK UNIFIED IDEOGRAPH
+ {0xCBDD, 0x5DE8}, //12315 #CJK UNIFIED IDEOGRAPH
+ {0xCBDE, 0x62D2}, //12316 #CJK UNIFIED IDEOGRAPH
+ {0xCBDF, 0x636E}, //12317 #CJK UNIFIED IDEOGRAPH
+ {0xCBE0, 0x64DA}, //12318 #CJK UNIFIED IDEOGRAPH
+ {0xCBE1, 0x64E7}, //12319 #CJK UNIFIED IDEOGRAPH
+ {0xCBE2, 0x6E20}, //12320 #CJK UNIFIED IDEOGRAPH
+ {0xCBE3, 0x70AC}, //12321 #CJK UNIFIED IDEOGRAPH
+ {0xCBE4, 0x795B}, //12322 #CJK UNIFIED IDEOGRAPH
+ {0xCBE5, 0x8DDD}, //12323 #CJK UNIFIED IDEOGRAPH
+ {0xCBE6, 0x8E1E}, //12324 #CJK UNIFIED IDEOGRAPH
+ {0xCBE7, 0xF902}, //12325 #CJK COMPATIBILITY IDEOGRAPH
+ {0xCBE8, 0x907D}, //12326 #CJK UNIFIED IDEOGRAPH
+ {0xCBE9, 0x9245}, //12327 #CJK UNIFIED IDEOGRAPH
+ {0xCBEA, 0x92F8}, //12328 #CJK UNIFIED IDEOGRAPH
+ {0xCBEB, 0x4E7E}, //12329 #CJK UNIFIED IDEOGRAPH
+ {0xCBEC, 0x4EF6}, //12330 #CJK UNIFIED IDEOGRAPH
+ {0xCBED, 0x5065}, //12331 #CJK UNIFIED IDEOGRAPH
+ {0xCBEE, 0x5DFE}, //12332 #CJK UNIFIED IDEOGRAPH
+ {0xCBEF, 0x5EFA}, //12333 #CJK UNIFIED IDEOGRAPH
+ {0xCBF0, 0x6106}, //12334 #CJK UNIFIED IDEOGRAPH
+ {0xCBF1, 0x6957}, //12335 #CJK UNIFIED IDEOGRAPH
+ {0xCBF2, 0x8171}, //12336 #CJK UNIFIED IDEOGRAPH
+ {0xCBF3, 0x8654}, //12337 #CJK UNIFIED IDEOGRAPH
+ {0xCBF4, 0x8E47}, //12338 #CJK UNIFIED IDEOGRAPH
+ {0xCBF5, 0x9375}, //12339 #CJK UNIFIED IDEOGRAPH
+ {0xCBF6, 0x9A2B}, //12340 #CJK UNIFIED IDEOGRAPH
+ {0xCBF7, 0x4E5E}, //12341 #CJK UNIFIED IDEOGRAPH
+ {0xCBF8, 0x5091}, //12342 #CJK UNIFIED IDEOGRAPH
+ {0xCBF9, 0x6770}, //12343 #CJK UNIFIED IDEOGRAPH
+ {0xCBFA, 0x6840}, //12344 #CJK UNIFIED IDEOGRAPH
+ {0xCBFB, 0x5109}, //12345 #CJK UNIFIED IDEOGRAPH
+ {0xCBFC, 0x528D}, //12346 #CJK UNIFIED IDEOGRAPH
+ {0xCBFD, 0x5292}, //12347 #CJK UNIFIED IDEOGRAPH
+ {0xCBFE, 0x6AA2}, //12348 #CJK UNIFIED IDEOGRAPH
+ {0xCCA1, 0x77BC}, //12349 #CJK UNIFIED IDEOGRAPH
+ {0xCCA2, 0x9210}, //12350 #CJK UNIFIED IDEOGRAPH
+ {0xCCA3, 0x9ED4}, //12351 #CJK UNIFIED IDEOGRAPH
+ {0xCCA4, 0x52AB}, //12352 #CJK UNIFIED IDEOGRAPH
+ {0xCCA5, 0x602F}, //12353 #CJK UNIFIED IDEOGRAPH
+ {0xCCA6, 0x8FF2}, //12354 #CJK UNIFIED IDEOGRAPH
+ {0xCCA7, 0x5048}, //12355 #CJK UNIFIED IDEOGRAPH
+ {0xCCA8, 0x61A9}, //12356 #CJK UNIFIED IDEOGRAPH
+ {0xCCA9, 0x63ED}, //12357 #CJK UNIFIED IDEOGRAPH
+ {0xCCAA, 0x64CA}, //12358 #CJK UNIFIED IDEOGRAPH
+ {0xCCAB, 0x683C}, //12359 #CJK UNIFIED IDEOGRAPH
+ {0xCCAC, 0x6A84}, //12360 #CJK UNIFIED IDEOGRAPH
+ {0xCCAD, 0x6FC0}, //12361 #CJK UNIFIED IDEOGRAPH
+ {0xCCAE, 0x8188}, //12362 #CJK UNIFIED IDEOGRAPH
+ {0xCCAF, 0x89A1}, //12363 #CJK UNIFIED IDEOGRAPH
+ {0xCCB0, 0x9694}, //12364 #CJK UNIFIED IDEOGRAPH
+ {0xCCB1, 0x5805}, //12365 #CJK UNIFIED IDEOGRAPH
+ {0xCCB2, 0x727D}, //12366 #CJK UNIFIED IDEOGRAPH
+ {0xCCB3, 0x72AC}, //12367 #CJK UNIFIED IDEOGRAPH
+ {0xCCB4, 0x7504}, //12368 #CJK UNIFIED IDEOGRAPH
+ {0xCCB5, 0x7D79}, //12369 #CJK UNIFIED IDEOGRAPH
+ {0xCCB6, 0x7E6D}, //12370 #CJK UNIFIED IDEOGRAPH
+ {0xCCB7, 0x80A9}, //12371 #CJK UNIFIED IDEOGRAPH
+ {0xCCB8, 0x898B}, //12372 #CJK UNIFIED IDEOGRAPH
+ {0xCCB9, 0x8B74}, //12373 #CJK UNIFIED IDEOGRAPH
+ {0xCCBA, 0x9063}, //12374 #CJK UNIFIED IDEOGRAPH
+ {0xCCBB, 0x9D51}, //12375 #CJK UNIFIED IDEOGRAPH
+ {0xCCBC, 0x6289}, //12376 #CJK UNIFIED IDEOGRAPH
+ {0xCCBD, 0x6C7A}, //12377 #CJK UNIFIED IDEOGRAPH
+ {0xCCBE, 0x6F54}, //12378 #CJK UNIFIED IDEOGRAPH
+ {0xCCBF, 0x7D50}, //12379 #CJK UNIFIED IDEOGRAPH
+ {0xCCC0, 0x7F3A}, //12380 #CJK UNIFIED IDEOGRAPH
+ {0xCCC1, 0x8A23}, //12381 #CJK UNIFIED IDEOGRAPH
+ {0xCCC2, 0x517C}, //12382 #CJK UNIFIED IDEOGRAPH
+ {0xCCC3, 0x614A}, //12383 #CJK UNIFIED IDEOGRAPH
+ {0xCCC4, 0x7B9D}, //12384 #CJK UNIFIED IDEOGRAPH
+ {0xCCC5, 0x8B19}, //12385 #CJK UNIFIED IDEOGRAPH
+ {0xCCC6, 0x9257}, //12386 #CJK UNIFIED IDEOGRAPH
+ {0xCCC7, 0x938C}, //12387 #CJK UNIFIED IDEOGRAPH
+ {0xCCC8, 0x4EAC}, //12388 #CJK UNIFIED IDEOGRAPH
+ {0xCCC9, 0x4FD3}, //12389 #CJK UNIFIED IDEOGRAPH
+ {0xCCCA, 0x501E}, //12390 #CJK UNIFIED IDEOGRAPH
+ {0xCCCB, 0x50BE}, //12391 #CJK UNIFIED IDEOGRAPH
+ {0xCCCC, 0x5106}, //12392 #CJK UNIFIED IDEOGRAPH
+ {0xCCCD, 0x52C1}, //12393 #CJK UNIFIED IDEOGRAPH
+ {0xCCCE, 0x52CD}, //12394 #CJK UNIFIED IDEOGRAPH
+ {0xCCCF, 0x537F}, //12395 #CJK UNIFIED IDEOGRAPH
+ {0xCCD0, 0x5770}, //12396 #CJK UNIFIED IDEOGRAPH
+ {0xCCD1, 0x5883}, //12397 #CJK UNIFIED IDEOGRAPH
+ {0xCCD2, 0x5E9A}, //12398 #CJK UNIFIED IDEOGRAPH
+ {0xCCD3, 0x5F91}, //12399 #CJK UNIFIED IDEOGRAPH
+ {0xCCD4, 0x6176}, //12400 #CJK UNIFIED IDEOGRAPH
+ {0xCCD5, 0x61AC}, //12401 #CJK UNIFIED IDEOGRAPH
+ {0xCCD6, 0x64CE}, //12402 #CJK UNIFIED IDEOGRAPH
+ {0xCCD7, 0x656C}, //12403 #CJK UNIFIED IDEOGRAPH
+ {0xCCD8, 0x666F}, //12404 #CJK UNIFIED IDEOGRAPH
+ {0xCCD9, 0x66BB}, //12405 #CJK UNIFIED IDEOGRAPH
+ {0xCCDA, 0x66F4}, //12406 #CJK UNIFIED IDEOGRAPH
+ {0xCCDB, 0x6897}, //12407 #CJK UNIFIED IDEOGRAPH
+ {0xCCDC, 0x6D87}, //12408 #CJK UNIFIED IDEOGRAPH
+ {0xCCDD, 0x7085}, //12409 #CJK UNIFIED IDEOGRAPH
+ {0xCCDE, 0x70F1}, //12410 #CJK UNIFIED IDEOGRAPH
+ {0xCCDF, 0x749F}, //12411 #CJK UNIFIED IDEOGRAPH
+ {0xCCE0, 0x74A5}, //12412 #CJK UNIFIED IDEOGRAPH
+ {0xCCE1, 0x74CA}, //12413 #CJK UNIFIED IDEOGRAPH
+ {0xCCE2, 0x75D9}, //12414 #CJK UNIFIED IDEOGRAPH
+ {0xCCE3, 0x786C}, //12415 #CJK UNIFIED IDEOGRAPH
+ {0xCCE4, 0x78EC}, //12416 #CJK UNIFIED IDEOGRAPH
+ {0xCCE5, 0x7ADF}, //12417 #CJK UNIFIED IDEOGRAPH
+ {0xCCE6, 0x7AF6}, //12418 #CJK UNIFIED IDEOGRAPH
+ {0xCCE7, 0x7D45}, //12419 #CJK UNIFIED IDEOGRAPH
+ {0xCCE8, 0x7D93}, //12420 #CJK UNIFIED IDEOGRAPH
+ {0xCCE9, 0x8015}, //12421 #CJK UNIFIED IDEOGRAPH
+ {0xCCEA, 0x803F}, //12422 #CJK UNIFIED IDEOGRAPH
+ {0xCCEB, 0x811B}, //12423 #CJK UNIFIED IDEOGRAPH
+ {0xCCEC, 0x8396}, //12424 #CJK UNIFIED IDEOGRAPH
+ {0xCCED, 0x8B66}, //12425 #CJK UNIFIED IDEOGRAPH
+ {0xCCEE, 0x8F15}, //12426 #CJK UNIFIED IDEOGRAPH
+ {0xCCEF, 0x9015}, //12427 #CJK UNIFIED IDEOGRAPH
+ {0xCCF0, 0x93E1}, //12428 #CJK UNIFIED IDEOGRAPH
+ {0xCCF1, 0x9803}, //12429 #CJK UNIFIED IDEOGRAPH
+ {0xCCF2, 0x9838}, //12430 #CJK UNIFIED IDEOGRAPH
+ {0xCCF3, 0x9A5A}, //12431 #CJK UNIFIED IDEOGRAPH
+ {0xCCF4, 0x9BE8}, //12432 #CJK UNIFIED IDEOGRAPH
+ {0xCCF5, 0x4FC2}, //12433 #CJK UNIFIED IDEOGRAPH
+ {0xCCF6, 0x5553}, //12434 #CJK UNIFIED IDEOGRAPH
+ {0xCCF7, 0x583A}, //12435 #CJK UNIFIED IDEOGRAPH
+ {0xCCF8, 0x5951}, //12436 #CJK UNIFIED IDEOGRAPH
+ {0xCCF9, 0x5B63}, //12437 #CJK UNIFIED IDEOGRAPH
+ {0xCCFA, 0x5C46}, //12438 #CJK UNIFIED IDEOGRAPH
+ {0xCCFB, 0x60B8}, //12439 #CJK UNIFIED IDEOGRAPH
+ {0xCCFC, 0x6212}, //12440 #CJK UNIFIED IDEOGRAPH
+ {0xCCFD, 0x6842}, //12441 #CJK UNIFIED IDEOGRAPH
+ {0xCCFE, 0x68B0}, //12442 #CJK UNIFIED IDEOGRAPH
+ {0xCDA1, 0x68E8}, //12443 #CJK UNIFIED IDEOGRAPH
+ {0xCDA2, 0x6EAA}, //12444 #CJK UNIFIED IDEOGRAPH
+ {0xCDA3, 0x754C}, //12445 #CJK UNIFIED IDEOGRAPH
+ {0xCDA4, 0x7678}, //12446 #CJK UNIFIED IDEOGRAPH
+ {0xCDA5, 0x78CE}, //12447 #CJK UNIFIED IDEOGRAPH
+ {0xCDA6, 0x7A3D}, //12448 #CJK UNIFIED IDEOGRAPH
+ {0xCDA7, 0x7CFB}, //12449 #CJK UNIFIED IDEOGRAPH
+ {0xCDA8, 0x7E6B}, //12450 #CJK UNIFIED IDEOGRAPH
+ {0xCDA9, 0x7E7C}, //12451 #CJK UNIFIED IDEOGRAPH
+ {0xCDAA, 0x8A08}, //12452 #CJK UNIFIED IDEOGRAPH
+ {0xCDAB, 0x8AA1}, //12453 #CJK UNIFIED IDEOGRAPH
+ {0xCDAC, 0x8C3F}, //12454 #CJK UNIFIED IDEOGRAPH
+ {0xCDAD, 0x968E}, //12455 #CJK UNIFIED IDEOGRAPH
+ {0xCDAE, 0x9DC4}, //12456 #CJK UNIFIED IDEOGRAPH
+ {0xCDAF, 0x53E4}, //12457 #CJK UNIFIED IDEOGRAPH
+ {0xCDB0, 0x53E9}, //12458 #CJK UNIFIED IDEOGRAPH
+ {0xCDB1, 0x544A}, //12459 #CJK UNIFIED IDEOGRAPH
+ {0xCDB2, 0x5471}, //12460 #CJK UNIFIED IDEOGRAPH
+ {0xCDB3, 0x56FA}, //12461 #CJK UNIFIED IDEOGRAPH
+ {0xCDB4, 0x59D1}, //12462 #CJK UNIFIED IDEOGRAPH
+ {0xCDB5, 0x5B64}, //12463 #CJK UNIFIED IDEOGRAPH
+ {0xCDB6, 0x5C3B}, //12464 #CJK UNIFIED IDEOGRAPH
+ {0xCDB7, 0x5EAB}, //12465 #CJK UNIFIED IDEOGRAPH
+ {0xCDB8, 0x62F7}, //12466 #CJK UNIFIED IDEOGRAPH
+ {0xCDB9, 0x6537}, //12467 #CJK UNIFIED IDEOGRAPH
+ {0xCDBA, 0x6545}, //12468 #CJK UNIFIED IDEOGRAPH
+ {0xCDBB, 0x6572}, //12469 #CJK UNIFIED IDEOGRAPH
+ {0xCDBC, 0x66A0}, //12470 #CJK UNIFIED IDEOGRAPH
+ {0xCDBD, 0x67AF}, //12471 #CJK UNIFIED IDEOGRAPH
+ {0xCDBE, 0x69C1}, //12472 #CJK UNIFIED IDEOGRAPH
+ {0xCDBF, 0x6CBD}, //12473 #CJK UNIFIED IDEOGRAPH
+ {0xCDC0, 0x75FC}, //12474 #CJK UNIFIED IDEOGRAPH
+ {0xCDC1, 0x7690}, //12475 #CJK UNIFIED IDEOGRAPH
+ {0xCDC2, 0x777E}, //12476 #CJK UNIFIED IDEOGRAPH
+ {0xCDC3, 0x7A3F}, //12477 #CJK UNIFIED IDEOGRAPH
+ {0xCDC4, 0x7F94}, //12478 #CJK UNIFIED IDEOGRAPH
+ {0xCDC5, 0x8003}, //12479 #CJK UNIFIED IDEOGRAPH
+ {0xCDC6, 0x80A1}, //12480 #CJK UNIFIED IDEOGRAPH
+ {0xCDC7, 0x818F}, //12481 #CJK UNIFIED IDEOGRAPH
+ {0xCDC8, 0x82E6}, //12482 #CJK UNIFIED IDEOGRAPH
+ {0xCDC9, 0x82FD}, //12483 #CJK UNIFIED IDEOGRAPH
+ {0xCDCA, 0x83F0}, //12484 #CJK UNIFIED IDEOGRAPH
+ {0xCDCB, 0x85C1}, //12485 #CJK UNIFIED IDEOGRAPH
+ {0xCDCC, 0x8831}, //12486 #CJK UNIFIED IDEOGRAPH
+ {0xCDCD, 0x88B4}, //12487 #CJK UNIFIED IDEOGRAPH
+ {0xCDCE, 0x8AA5}, //12488 #CJK UNIFIED IDEOGRAPH
+ {0xCDCF, 0xF903}, //12489 #CJK COMPATIBILITY IDEOGRAPH
+ {0xCDD0, 0x8F9C}, //12490 #CJK UNIFIED IDEOGRAPH
+ {0xCDD1, 0x932E}, //12491 #CJK UNIFIED IDEOGRAPH
+ {0xCDD2, 0x96C7}, //12492 #CJK UNIFIED IDEOGRAPH
+ {0xCDD3, 0x9867}, //12493 #CJK UNIFIED IDEOGRAPH
+ {0xCDD4, 0x9AD8}, //12494 #CJK UNIFIED IDEOGRAPH
+ {0xCDD5, 0x9F13}, //12495 #CJK UNIFIED IDEOGRAPH
+ {0xCDD6, 0x54ED}, //12496 #CJK UNIFIED IDEOGRAPH
+ {0xCDD7, 0x659B}, //12497 #CJK UNIFIED IDEOGRAPH
+ {0xCDD8, 0x66F2}, //12498 #CJK UNIFIED IDEOGRAPH
+ {0xCDD9, 0x688F}, //12499 #CJK UNIFIED IDEOGRAPH
+ {0xCDDA, 0x7A40}, //12500 #CJK UNIFIED IDEOGRAPH
+ {0xCDDB, 0x8C37}, //12501 #CJK UNIFIED IDEOGRAPH
+ {0xCDDC, 0x9D60}, //12502 #CJK UNIFIED IDEOGRAPH
+ {0xCDDD, 0x56F0}, //12503 #CJK UNIFIED IDEOGRAPH
+ {0xCDDE, 0x5764}, //12504 #CJK UNIFIED IDEOGRAPH
+ {0xCDDF, 0x5D11}, //12505 #CJK UNIFIED IDEOGRAPH
+ {0xCDE0, 0x6606}, //12506 #CJK UNIFIED IDEOGRAPH
+ {0xCDE1, 0x68B1}, //12507 #CJK UNIFIED IDEOGRAPH
+ {0xCDE2, 0x68CD}, //12508 #CJK UNIFIED IDEOGRAPH
+ {0xCDE3, 0x6EFE}, //12509 #CJK UNIFIED IDEOGRAPH
+ {0xCDE4, 0x7428}, //12510 #CJK UNIFIED IDEOGRAPH
+ {0xCDE5, 0x889E}, //12511 #CJK UNIFIED IDEOGRAPH
+ {0xCDE6, 0x9BE4}, //12512 #CJK UNIFIED IDEOGRAPH
+ {0xCDE7, 0x6C68}, //12513 #CJK UNIFIED IDEOGRAPH
+ {0xCDE8, 0xF904}, //12514 #CJK COMPATIBILITY IDEOGRAPH
+ {0xCDE9, 0x9AA8}, //12515 #CJK UNIFIED IDEOGRAPH
+ {0xCDEA, 0x4F9B}, //12516 #CJK UNIFIED IDEOGRAPH
+ {0xCDEB, 0x516C}, //12517 #CJK UNIFIED IDEOGRAPH
+ {0xCDEC, 0x5171}, //12518 #CJK UNIFIED IDEOGRAPH
+ {0xCDED, 0x529F}, //12519 #CJK UNIFIED IDEOGRAPH
+ {0xCDEE, 0x5B54}, //12520 #CJK UNIFIED IDEOGRAPH
+ {0xCDEF, 0x5DE5}, //12521 #CJK UNIFIED IDEOGRAPH
+ {0xCDF0, 0x6050}, //12522 #CJK UNIFIED IDEOGRAPH
+ {0xCDF1, 0x606D}, //12523 #CJK UNIFIED IDEOGRAPH
+ {0xCDF2, 0x62F1}, //12524 #CJK UNIFIED IDEOGRAPH
+ {0xCDF3, 0x63A7}, //12525 #CJK UNIFIED IDEOGRAPH
+ {0xCDF4, 0x653B}, //12526 #CJK UNIFIED IDEOGRAPH
+ {0xCDF5, 0x73D9}, //12527 #CJK UNIFIED IDEOGRAPH
+ {0xCDF6, 0x7A7A}, //12528 #CJK UNIFIED IDEOGRAPH
+ {0xCDF7, 0x86A3}, //12529 #CJK UNIFIED IDEOGRAPH
+ {0xCDF8, 0x8CA2}, //12530 #CJK UNIFIED IDEOGRAPH
+ {0xCDF9, 0x978F}, //12531 #CJK UNIFIED IDEOGRAPH
+ {0xCDFA, 0x4E32}, //12532 #CJK UNIFIED IDEOGRAPH
+ {0xCDFB, 0x5BE1}, //12533 #CJK UNIFIED IDEOGRAPH
+ {0xCDFC, 0x6208}, //12534 #CJK UNIFIED IDEOGRAPH
+ {0xCDFD, 0x679C}, //12535 #CJK UNIFIED IDEOGRAPH
+ {0xCDFE, 0x74DC}, //12536 #CJK UNIFIED IDEOGRAPH
+ {0xCEA1, 0x79D1}, //12537 #CJK UNIFIED IDEOGRAPH
+ {0xCEA2, 0x83D3}, //12538 #CJK UNIFIED IDEOGRAPH
+ {0xCEA3, 0x8A87}, //12539 #CJK UNIFIED IDEOGRAPH
+ {0xCEA4, 0x8AB2}, //12540 #CJK UNIFIED IDEOGRAPH
+ {0xCEA5, 0x8DE8}, //12541 #CJK UNIFIED IDEOGRAPH
+ {0xCEA6, 0x904E}, //12542 #CJK UNIFIED IDEOGRAPH
+ {0xCEA7, 0x934B}, //12543 #CJK UNIFIED IDEOGRAPH
+ {0xCEA8, 0x9846}, //12544 #CJK UNIFIED IDEOGRAPH
+ {0xCEA9, 0x5ED3}, //12545 #CJK UNIFIED IDEOGRAPH
+ {0xCEAA, 0x69E8}, //12546 #CJK UNIFIED IDEOGRAPH
+ {0xCEAB, 0x85FF}, //12547 #CJK UNIFIED IDEOGRAPH
+ {0xCEAC, 0x90ED}, //12548 #CJK UNIFIED IDEOGRAPH
+ {0xCEAD, 0xF905}, //12549 #CJK COMPATIBILITY IDEOGRAPH
+ {0xCEAE, 0x51A0}, //12550 #CJK UNIFIED IDEOGRAPH
+ {0xCEAF, 0x5B98}, //12551 #CJK UNIFIED IDEOGRAPH
+ {0xCEB0, 0x5BEC}, //12552 #CJK UNIFIED IDEOGRAPH
+ {0xCEB1, 0x6163}, //12553 #CJK UNIFIED IDEOGRAPH
+ {0xCEB2, 0x68FA}, //12554 #CJK UNIFIED IDEOGRAPH
+ {0xCEB3, 0x6B3E}, //12555 #CJK UNIFIED IDEOGRAPH
+ {0xCEB4, 0x704C}, //12556 #CJK UNIFIED IDEOGRAPH
+ {0xCEB5, 0x742F}, //12557 #CJK UNIFIED IDEOGRAPH
+ {0xCEB6, 0x74D8}, //12558 #CJK UNIFIED IDEOGRAPH
+ {0xCEB7, 0x7BA1}, //12559 #CJK UNIFIED IDEOGRAPH
+ {0xCEB8, 0x7F50}, //12560 #CJK UNIFIED IDEOGRAPH
+ {0xCEB9, 0x83C5}, //12561 #CJK UNIFIED IDEOGRAPH
+ {0xCEBA, 0x89C0}, //12562 #CJK UNIFIED IDEOGRAPH
+ {0xCEBB, 0x8CAB}, //12563 #CJK UNIFIED IDEOGRAPH
+ {0xCEBC, 0x95DC}, //12564 #CJK UNIFIED IDEOGRAPH
+ {0xCEBD, 0x9928}, //12565 #CJK UNIFIED IDEOGRAPH
+ {0xCEBE, 0x522E}, //12566 #CJK UNIFIED IDEOGRAPH
+ {0xCEBF, 0x605D}, //12567 #CJK UNIFIED IDEOGRAPH
+ {0xCEC0, 0x62EC}, //12568 #CJK UNIFIED IDEOGRAPH
+ {0xCEC1, 0x9002}, //12569 #CJK UNIFIED IDEOGRAPH
+ {0xCEC2, 0x4F8A}, //12570 #CJK UNIFIED IDEOGRAPH
+ {0xCEC3, 0x5149}, //12571 #CJK UNIFIED IDEOGRAPH
+ {0xCEC4, 0x5321}, //12572 #CJK UNIFIED IDEOGRAPH
+ {0xCEC5, 0x58D9}, //12573 #CJK UNIFIED IDEOGRAPH
+ {0xCEC6, 0x5EE3}, //12574 #CJK UNIFIED IDEOGRAPH
+ {0xCEC7, 0x66E0}, //12575 #CJK UNIFIED IDEOGRAPH
+ {0xCEC8, 0x6D38}, //12576 #CJK UNIFIED IDEOGRAPH
+ {0xCEC9, 0x709A}, //12577 #CJK UNIFIED IDEOGRAPH
+ {0xCECA, 0x72C2}, //12578 #CJK UNIFIED IDEOGRAPH
+ {0xCECB, 0x73D6}, //12579 #CJK UNIFIED IDEOGRAPH
+ {0xCECC, 0x7B50}, //12580 #CJK UNIFIED IDEOGRAPH
+ {0xCECD, 0x80F1}, //12581 #CJK UNIFIED IDEOGRAPH
+ {0xCECE, 0x945B}, //12582 #CJK UNIFIED IDEOGRAPH
+ {0xCECF, 0x5366}, //12583 #CJK UNIFIED IDEOGRAPH
+ {0xCED0, 0x639B}, //12584 #CJK UNIFIED IDEOGRAPH
+ {0xCED1, 0x7F6B}, //12585 #CJK UNIFIED IDEOGRAPH
+ {0xCED2, 0x4E56}, //12586 #CJK UNIFIED IDEOGRAPH
+ {0xCED3, 0x5080}, //12587 #CJK UNIFIED IDEOGRAPH
+ {0xCED4, 0x584A}, //12588 #CJK UNIFIED IDEOGRAPH
+ {0xCED5, 0x58DE}, //12589 #CJK UNIFIED IDEOGRAPH
+ {0xCED6, 0x602A}, //12590 #CJK UNIFIED IDEOGRAPH
+ {0xCED7, 0x6127}, //12591 #CJK UNIFIED IDEOGRAPH
+ {0xCED8, 0x62D0}, //12592 #CJK UNIFIED IDEOGRAPH
+ {0xCED9, 0x69D0}, //12593 #CJK UNIFIED IDEOGRAPH
+ {0xCEDA, 0x9B41}, //12594 #CJK UNIFIED IDEOGRAPH
+ {0xCEDB, 0x5B8F}, //12595 #CJK UNIFIED IDEOGRAPH
+ {0xCEDC, 0x7D18}, //12596 #CJK UNIFIED IDEOGRAPH
+ {0xCEDD, 0x80B1}, //12597 #CJK UNIFIED IDEOGRAPH
+ {0xCEDE, 0x8F5F}, //12598 #CJK UNIFIED IDEOGRAPH
+ {0xCEDF, 0x4EA4}, //12599 #CJK UNIFIED IDEOGRAPH
+ {0xCEE0, 0x50D1}, //12600 #CJK UNIFIED IDEOGRAPH
+ {0xCEE1, 0x54AC}, //12601 #CJK UNIFIED IDEOGRAPH
+ {0xCEE2, 0x55AC}, //12602 #CJK UNIFIED IDEOGRAPH
+ {0xCEE3, 0x5B0C}, //12603 #CJK UNIFIED IDEOGRAPH
+ {0xCEE4, 0x5DA0}, //12604 #CJK UNIFIED IDEOGRAPH
+ {0xCEE5, 0x5DE7}, //12605 #CJK UNIFIED IDEOGRAPH
+ {0xCEE6, 0x652A}, //12606 #CJK UNIFIED IDEOGRAPH
+ {0xCEE7, 0x654E}, //12607 #CJK UNIFIED IDEOGRAPH
+ {0xCEE8, 0x6821}, //12608 #CJK UNIFIED IDEOGRAPH
+ {0xCEE9, 0x6A4B}, //12609 #CJK UNIFIED IDEOGRAPH
+ {0xCEEA, 0x72E1}, //12610 #CJK UNIFIED IDEOGRAPH
+ {0xCEEB, 0x768E}, //12611 #CJK UNIFIED IDEOGRAPH
+ {0xCEEC, 0x77EF}, //12612 #CJK UNIFIED IDEOGRAPH
+ {0xCEED, 0x7D5E}, //12613 #CJK UNIFIED IDEOGRAPH
+ {0xCEEE, 0x7FF9}, //12614 #CJK UNIFIED IDEOGRAPH
+ {0xCEEF, 0x81A0}, //12615 #CJK UNIFIED IDEOGRAPH
+ {0xCEF0, 0x854E}, //12616 #CJK UNIFIED IDEOGRAPH
+ {0xCEF1, 0x86DF}, //12617 #CJK UNIFIED IDEOGRAPH
+ {0xCEF2, 0x8F03}, //12618 #CJK UNIFIED IDEOGRAPH
+ {0xCEF3, 0x8F4E}, //12619 #CJK UNIFIED IDEOGRAPH
+ {0xCEF4, 0x90CA}, //12620 #CJK UNIFIED IDEOGRAPH
+ {0xCEF5, 0x9903}, //12621 #CJK UNIFIED IDEOGRAPH
+ {0xCEF6, 0x9A55}, //12622 #CJK UNIFIED IDEOGRAPH
+ {0xCEF7, 0x9BAB}, //12623 #CJK UNIFIED IDEOGRAPH
+ {0xCEF8, 0x4E18}, //12624 #CJK UNIFIED IDEOGRAPH
+ {0xCEF9, 0x4E45}, //12625 #CJK UNIFIED IDEOGRAPH
+ {0xCEFA, 0x4E5D}, //12626 #CJK UNIFIED IDEOGRAPH
+ {0xCEFB, 0x4EC7}, //12627 #CJK UNIFIED IDEOGRAPH
+ {0xCEFC, 0x4FF1}, //12628 #CJK UNIFIED IDEOGRAPH
+ {0xCEFD, 0x5177}, //12629 #CJK UNIFIED IDEOGRAPH
+ {0xCEFE, 0x52FE}, //12630 #CJK UNIFIED IDEOGRAPH
+ {0xCFA1, 0x5340}, //12631 #CJK UNIFIED IDEOGRAPH
+ {0xCFA2, 0x53E3}, //12632 #CJK UNIFIED IDEOGRAPH
+ {0xCFA3, 0x53E5}, //12633 #CJK UNIFIED IDEOGRAPH
+ {0xCFA4, 0x548E}, //12634 #CJK UNIFIED IDEOGRAPH
+ {0xCFA5, 0x5614}, //12635 #CJK UNIFIED IDEOGRAPH
+ {0xCFA6, 0x5775}, //12636 #CJK UNIFIED IDEOGRAPH
+ {0xCFA7, 0x57A2}, //12637 #CJK UNIFIED IDEOGRAPH
+ {0xCFA8, 0x5BC7}, //12638 #CJK UNIFIED IDEOGRAPH
+ {0xCFA9, 0x5D87}, //12639 #CJK UNIFIED IDEOGRAPH
+ {0xCFAA, 0x5ED0}, //12640 #CJK UNIFIED IDEOGRAPH
+ {0xCFAB, 0x61FC}, //12641 #CJK UNIFIED IDEOGRAPH
+ {0xCFAC, 0x62D8}, //12642 #CJK UNIFIED IDEOGRAPH
+ {0xCFAD, 0x6551}, //12643 #CJK UNIFIED IDEOGRAPH
+ {0xCFAE, 0x67B8}, //12644 #CJK UNIFIED IDEOGRAPH
+ {0xCFAF, 0x67E9}, //12645 #CJK UNIFIED IDEOGRAPH
+ {0xCFB0, 0x69CB}, //12646 #CJK UNIFIED IDEOGRAPH
+ {0xCFB1, 0x6B50}, //12647 #CJK UNIFIED IDEOGRAPH
+ {0xCFB2, 0x6BC6}, //12648 #CJK UNIFIED IDEOGRAPH
+ {0xCFB3, 0x6BEC}, //12649 #CJK UNIFIED IDEOGRAPH
+ {0xCFB4, 0x6C42}, //12650 #CJK UNIFIED IDEOGRAPH
+ {0xCFB5, 0x6E9D}, //12651 #CJK UNIFIED IDEOGRAPH
+ {0xCFB6, 0x7078}, //12652 #CJK UNIFIED IDEOGRAPH
+ {0xCFB7, 0x72D7}, //12653 #CJK UNIFIED IDEOGRAPH
+ {0xCFB8, 0x7396}, //12654 #CJK UNIFIED IDEOGRAPH
+ {0xCFB9, 0x7403}, //12655 #CJK UNIFIED IDEOGRAPH
+ {0xCFBA, 0x77BF}, //12656 #CJK UNIFIED IDEOGRAPH
+ {0xCFBB, 0x77E9}, //12657 #CJK UNIFIED IDEOGRAPH
+ {0xCFBC, 0x7A76}, //12658 #CJK UNIFIED IDEOGRAPH
+ {0xCFBD, 0x7D7F}, //12659 #CJK UNIFIED IDEOGRAPH
+ {0xCFBE, 0x8009}, //12660 #CJK UNIFIED IDEOGRAPH
+ {0xCFBF, 0x81FC}, //12661 #CJK UNIFIED IDEOGRAPH
+ {0xCFC0, 0x8205}, //12662 #CJK UNIFIED IDEOGRAPH
+ {0xCFC1, 0x820A}, //12663 #CJK UNIFIED IDEOGRAPH
+ {0xCFC2, 0x82DF}, //12664 #CJK UNIFIED IDEOGRAPH
+ {0xCFC3, 0x8862}, //12665 #CJK UNIFIED IDEOGRAPH
+ {0xCFC4, 0x8B33}, //12666 #CJK UNIFIED IDEOGRAPH
+ {0xCFC5, 0x8CFC}, //12667 #CJK UNIFIED IDEOGRAPH
+ {0xCFC6, 0x8EC0}, //12668 #CJK UNIFIED IDEOGRAPH
+ {0xCFC7, 0x9011}, //12669 #CJK UNIFIED IDEOGRAPH
+ {0xCFC8, 0x90B1}, //12670 #CJK UNIFIED IDEOGRAPH
+ {0xCFC9, 0x9264}, //12671 #CJK UNIFIED IDEOGRAPH
+ {0xCFCA, 0x92B6}, //12672 #CJK UNIFIED IDEOGRAPH
+ {0xCFCB, 0x99D2}, //12673 #CJK UNIFIED IDEOGRAPH
+ {0xCFCC, 0x9A45}, //12674 #CJK UNIFIED IDEOGRAPH
+ {0xCFCD, 0x9CE9}, //12675 #CJK UNIFIED IDEOGRAPH
+ {0xCFCE, 0x9DD7}, //12676 #CJK UNIFIED IDEOGRAPH
+ {0xCFCF, 0x9F9C}, //12677 #CJK UNIFIED IDEOGRAPH
+ {0xCFD0, 0x570B}, //12678 #CJK UNIFIED IDEOGRAPH
+ {0xCFD1, 0x5C40}, //12679 #CJK UNIFIED IDEOGRAPH
+ {0xCFD2, 0x83CA}, //12680 #CJK UNIFIED IDEOGRAPH
+ {0xCFD3, 0x97A0}, //12681 #CJK UNIFIED IDEOGRAPH
+ {0xCFD4, 0x97AB}, //12682 #CJK UNIFIED IDEOGRAPH
+ {0xCFD5, 0x9EB4}, //12683 #CJK UNIFIED IDEOGRAPH
+ {0xCFD6, 0x541B}, //12684 #CJK UNIFIED IDEOGRAPH
+ {0xCFD7, 0x7A98}, //12685 #CJK UNIFIED IDEOGRAPH
+ {0xCFD8, 0x7FA4}, //12686 #CJK UNIFIED IDEOGRAPH
+ {0xCFD9, 0x88D9}, //12687 #CJK UNIFIED IDEOGRAPH
+ {0xCFDA, 0x8ECD}, //12688 #CJK UNIFIED IDEOGRAPH
+ {0xCFDB, 0x90E1}, //12689 #CJK UNIFIED IDEOGRAPH
+ {0xCFDC, 0x5800}, //12690 #CJK UNIFIED IDEOGRAPH
+ {0xCFDD, 0x5C48}, //12691 #CJK UNIFIED IDEOGRAPH
+ {0xCFDE, 0x6398}, //12692 #CJK UNIFIED IDEOGRAPH
+ {0xCFDF, 0x7A9F}, //12693 #CJK UNIFIED IDEOGRAPH
+ {0xCFE0, 0x5BAE}, //12694 #CJK UNIFIED IDEOGRAPH
+ {0xCFE1, 0x5F13}, //12695 #CJK UNIFIED IDEOGRAPH
+ {0xCFE2, 0x7A79}, //12696 #CJK UNIFIED IDEOGRAPH
+ {0xCFE3, 0x7AAE}, //12697 #CJK UNIFIED IDEOGRAPH
+ {0xCFE4, 0x828E}, //12698 #CJK UNIFIED IDEOGRAPH
+ {0xCFE5, 0x8EAC}, //12699 #CJK UNIFIED IDEOGRAPH
+ {0xCFE6, 0x5026}, //12700 #CJK UNIFIED IDEOGRAPH
+ {0xCFE7, 0x5238}, //12701 #CJK UNIFIED IDEOGRAPH
+ {0xCFE8, 0x52F8}, //12702 #CJK UNIFIED IDEOGRAPH
+ {0xCFE9, 0x5377}, //12703 #CJK UNIFIED IDEOGRAPH
+ {0xCFEA, 0x5708}, //12704 #CJK UNIFIED IDEOGRAPH
+ {0xCFEB, 0x62F3}, //12705 #CJK UNIFIED IDEOGRAPH
+ {0xCFEC, 0x6372}, //12706 #CJK UNIFIED IDEOGRAPH
+ {0xCFED, 0x6B0A}, //12707 #CJK UNIFIED IDEOGRAPH
+ {0xCFEE, 0x6DC3}, //12708 #CJK UNIFIED IDEOGRAPH
+ {0xCFEF, 0x7737}, //12709 #CJK UNIFIED IDEOGRAPH
+ {0xCFF0, 0x53A5}, //12710 #CJK UNIFIED IDEOGRAPH
+ {0xCFF1, 0x7357}, //12711 #CJK UNIFIED IDEOGRAPH
+ {0xCFF2, 0x8568}, //12712 #CJK UNIFIED IDEOGRAPH
+ {0xCFF3, 0x8E76}, //12713 #CJK UNIFIED IDEOGRAPH
+ {0xCFF4, 0x95D5}, //12714 #CJK UNIFIED IDEOGRAPH
+ {0xCFF5, 0x673A}, //12715 #CJK UNIFIED IDEOGRAPH
+ {0xCFF6, 0x6AC3}, //12716 #CJK UNIFIED IDEOGRAPH
+ {0xCFF7, 0x6F70}, //12717 #CJK UNIFIED IDEOGRAPH
+ {0xCFF8, 0x8A6D}, //12718 #CJK UNIFIED IDEOGRAPH
+ {0xCFF9, 0x8ECC}, //12719 #CJK UNIFIED IDEOGRAPH
+ {0xCFFA, 0x994B}, //12720 #CJK UNIFIED IDEOGRAPH
+ {0xCFFB, 0xF906}, //12721 #CJK COMPATIBILITY IDEOGRAPH
+ {0xCFFC, 0x6677}, //12722 #CJK UNIFIED IDEOGRAPH
+ {0xCFFD, 0x6B78}, //12723 #CJK UNIFIED IDEOGRAPH
+ {0xCFFE, 0x8CB4}, //12724 #CJK UNIFIED IDEOGRAPH
+ {0xD0A1, 0x9B3C}, //12725 #CJK UNIFIED IDEOGRAPH
+ {0xD0A2, 0xF907}, //12726 #CJK COMPATIBILITY IDEOGRAPH
+ {0xD0A3, 0x53EB}, //12727 #CJK UNIFIED IDEOGRAPH
+ {0xD0A4, 0x572D}, //12728 #CJK UNIFIED IDEOGRAPH
+ {0xD0A5, 0x594E}, //12729 #CJK UNIFIED IDEOGRAPH
+ {0xD0A6, 0x63C6}, //12730 #CJK UNIFIED IDEOGRAPH
+ {0xD0A7, 0x69FB}, //12731 #CJK UNIFIED IDEOGRAPH
+ {0xD0A8, 0x73EA}, //12732 #CJK UNIFIED IDEOGRAPH
+ {0xD0A9, 0x7845}, //12733 #CJK UNIFIED IDEOGRAPH
+ {0xD0AA, 0x7ABA}, //12734 #CJK UNIFIED IDEOGRAPH
+ {0xD0AB, 0x7AC5}, //12735 #CJK UNIFIED IDEOGRAPH
+ {0xD0AC, 0x7CFE}, //12736 #CJK UNIFIED IDEOGRAPH
+ {0xD0AD, 0x8475}, //12737 #CJK UNIFIED IDEOGRAPH
+ {0xD0AE, 0x898F}, //12738 #CJK UNIFIED IDEOGRAPH
+ {0xD0AF, 0x8D73}, //12739 #CJK UNIFIED IDEOGRAPH
+ {0xD0B0, 0x9035}, //12740 #CJK UNIFIED IDEOGRAPH
+ {0xD0B1, 0x95A8}, //12741 #CJK UNIFIED IDEOGRAPH
+ {0xD0B2, 0x52FB}, //12742 #CJK UNIFIED IDEOGRAPH
+ {0xD0B3, 0x5747}, //12743 #CJK UNIFIED IDEOGRAPH
+ {0xD0B4, 0x7547}, //12744 #CJK UNIFIED IDEOGRAPH
+ {0xD0B5, 0x7B60}, //12745 #CJK UNIFIED IDEOGRAPH
+ {0xD0B6, 0x83CC}, //12746 #CJK UNIFIED IDEOGRAPH
+ {0xD0B7, 0x921E}, //12747 #CJK UNIFIED IDEOGRAPH
+ {0xD0B8, 0xF908}, //12748 #CJK COMPATIBILITY IDEOGRAPH
+ {0xD0B9, 0x6A58}, //12749 #CJK UNIFIED IDEOGRAPH
+ {0xD0BA, 0x514B}, //12750 #CJK UNIFIED IDEOGRAPH
+ {0xD0BB, 0x524B}, //12751 #CJK UNIFIED IDEOGRAPH
+ {0xD0BC, 0x5287}, //12752 #CJK UNIFIED IDEOGRAPH
+ {0xD0BD, 0x621F}, //12753 #CJK UNIFIED IDEOGRAPH
+ {0xD0BE, 0x68D8}, //12754 #CJK UNIFIED IDEOGRAPH
+ {0xD0BF, 0x6975}, //12755 #CJK UNIFIED IDEOGRAPH
+ {0xD0C0, 0x9699}, //12756 #CJK UNIFIED IDEOGRAPH
+ {0xD0C1, 0x50C5}, //12757 #CJK UNIFIED IDEOGRAPH
+ {0xD0C2, 0x52A4}, //12758 #CJK UNIFIED IDEOGRAPH
+ {0xD0C3, 0x52E4}, //12759 #CJK UNIFIED IDEOGRAPH
+ {0xD0C4, 0x61C3}, //12760 #CJK UNIFIED IDEOGRAPH
+ {0xD0C5, 0x65A4}, //12761 #CJK UNIFIED IDEOGRAPH
+ {0xD0C6, 0x6839}, //12762 #CJK UNIFIED IDEOGRAPH
+ {0xD0C7, 0x69FF}, //12763 #CJK UNIFIED IDEOGRAPH
+ {0xD0C8, 0x747E}, //12764 #CJK UNIFIED IDEOGRAPH
+ {0xD0C9, 0x7B4B}, //12765 #CJK UNIFIED IDEOGRAPH
+ {0xD0CA, 0x82B9}, //12766 #CJK UNIFIED IDEOGRAPH
+ {0xD0CB, 0x83EB}, //12767 #CJK UNIFIED IDEOGRAPH
+ {0xD0CC, 0x89B2}, //12768 #CJK UNIFIED IDEOGRAPH
+ {0xD0CD, 0x8B39}, //12769 #CJK UNIFIED IDEOGRAPH
+ {0xD0CE, 0x8FD1}, //12770 #CJK UNIFIED IDEOGRAPH
+ {0xD0CF, 0x9949}, //12771 #CJK UNIFIED IDEOGRAPH
+ {0xD0D0, 0xF909}, //12772 #CJK COMPATIBILITY IDEOGRAPH
+ {0xD0D1, 0x4ECA}, //12773 #CJK UNIFIED IDEOGRAPH
+ {0xD0D2, 0x5997}, //12774 #CJK UNIFIED IDEOGRAPH
+ {0xD0D3, 0x64D2}, //12775 #CJK UNIFIED IDEOGRAPH
+ {0xD0D4, 0x6611}, //12776 #CJK UNIFIED IDEOGRAPH
+ {0xD0D5, 0x6A8E}, //12777 #CJK UNIFIED IDEOGRAPH
+ {0xD0D6, 0x7434}, //12778 #CJK UNIFIED IDEOGRAPH
+ {0xD0D7, 0x7981}, //12779 #CJK UNIFIED IDEOGRAPH
+ {0xD0D8, 0x79BD}, //12780 #CJK UNIFIED IDEOGRAPH
+ {0xD0D9, 0x82A9}, //12781 #CJK UNIFIED IDEOGRAPH
+ {0xD0DA, 0x887E}, //12782 #CJK UNIFIED IDEOGRAPH
+ {0xD0DB, 0x887F}, //12783 #CJK UNIFIED IDEOGRAPH
+ {0xD0DC, 0x895F}, //12784 #CJK UNIFIED IDEOGRAPH
+ {0xD0DD, 0xF90A}, //12785 #CJK COMPATIBILITY IDEOGRAPH
+ {0xD0DE, 0x9326}, //12786 #CJK UNIFIED IDEOGRAPH
+ {0xD0DF, 0x4F0B}, //12787 #CJK UNIFIED IDEOGRAPH
+ {0xD0E0, 0x53CA}, //12788 #CJK UNIFIED IDEOGRAPH
+ {0xD0E1, 0x6025}, //12789 #CJK UNIFIED IDEOGRAPH
+ {0xD0E2, 0x6271}, //12790 #CJK UNIFIED IDEOGRAPH
+ {0xD0E3, 0x6C72}, //12791 #CJK UNIFIED IDEOGRAPH
+ {0xD0E4, 0x7D1A}, //12792 #CJK UNIFIED IDEOGRAPH
+ {0xD0E5, 0x7D66}, //12793 #CJK UNIFIED IDEOGRAPH
+ {0xD0E6, 0x4E98}, //12794 #CJK UNIFIED IDEOGRAPH
+ {0xD0E7, 0x5162}, //12795 #CJK UNIFIED IDEOGRAPH
+ {0xD0E8, 0x77DC}, //12796 #CJK UNIFIED IDEOGRAPH
+ {0xD0E9, 0x80AF}, //12797 #CJK UNIFIED IDEOGRAPH
+ {0xD0EA, 0x4F01}, //12798 #CJK UNIFIED IDEOGRAPH
+ {0xD0EB, 0x4F0E}, //12799 #CJK UNIFIED IDEOGRAPH
+ {0xD0EC, 0x5176}, //12800 #CJK UNIFIED IDEOGRAPH
+ {0xD0ED, 0x5180}, //12801 #CJK UNIFIED IDEOGRAPH
+ {0xD0EE, 0x55DC}, //12802 #CJK UNIFIED IDEOGRAPH
+ {0xD0EF, 0x5668}, //12803 #CJK UNIFIED IDEOGRAPH
+ {0xD0F0, 0x573B}, //12804 #CJK UNIFIED IDEOGRAPH
+ {0xD0F1, 0x57FA}, //12805 #CJK UNIFIED IDEOGRAPH
+ {0xD0F2, 0x57FC}, //12806 #CJK UNIFIED IDEOGRAPH
+ {0xD0F3, 0x5914}, //12807 #CJK UNIFIED IDEOGRAPH
+ {0xD0F4, 0x5947}, //12808 #CJK UNIFIED IDEOGRAPH
+ {0xD0F5, 0x5993}, //12809 #CJK UNIFIED IDEOGRAPH
+ {0xD0F6, 0x5BC4}, //12810 #CJK UNIFIED IDEOGRAPH
+ {0xD0F7, 0x5C90}, //12811 #CJK UNIFIED IDEOGRAPH
+ {0xD0F8, 0x5D0E}, //12812 #CJK UNIFIED IDEOGRAPH
+ {0xD0F9, 0x5DF1}, //12813 #CJK UNIFIED IDEOGRAPH
+ {0xD0FA, 0x5E7E}, //12814 #CJK UNIFIED IDEOGRAPH
+ {0xD0FB, 0x5FCC}, //12815 #CJK UNIFIED IDEOGRAPH
+ {0xD0FC, 0x6280}, //12816 #CJK UNIFIED IDEOGRAPH
+ {0xD0FD, 0x65D7}, //12817 #CJK UNIFIED IDEOGRAPH
+ {0xD0FE, 0x65E3}, //12818 #CJK UNIFIED IDEOGRAPH
+ {0xD1A1, 0x671E}, //12819 #CJK UNIFIED IDEOGRAPH
+ {0xD1A2, 0x671F}, //12820 #CJK UNIFIED IDEOGRAPH
+ {0xD1A3, 0x675E}, //12821 #CJK UNIFIED IDEOGRAPH
+ {0xD1A4, 0x68CB}, //12822 #CJK UNIFIED IDEOGRAPH
+ {0xD1A5, 0x68C4}, //12823 #CJK UNIFIED IDEOGRAPH
+ {0xD1A6, 0x6A5F}, //12824 #CJK UNIFIED IDEOGRAPH
+ {0xD1A7, 0x6B3A}, //12825 #CJK UNIFIED IDEOGRAPH
+ {0xD1A8, 0x6C23}, //12826 #CJK UNIFIED IDEOGRAPH
+ {0xD1A9, 0x6C7D}, //12827 #CJK UNIFIED IDEOGRAPH
+ {0xD1AA, 0x6C82}, //12828 #CJK UNIFIED IDEOGRAPH
+ {0xD1AB, 0x6DC7}, //12829 #CJK UNIFIED IDEOGRAPH
+ {0xD1AC, 0x7398}, //12830 #CJK UNIFIED IDEOGRAPH
+ {0xD1AD, 0x7426}, //12831 #CJK UNIFIED IDEOGRAPH
+ {0xD1AE, 0x742A}, //12832 #CJK UNIFIED IDEOGRAPH
+ {0xD1AF, 0x7482}, //12833 #CJK UNIFIED IDEOGRAPH
+ {0xD1B0, 0x74A3}, //12834 #CJK UNIFIED IDEOGRAPH
+ {0xD1B1, 0x7578}, //12835 #CJK UNIFIED IDEOGRAPH
+ {0xD1B2, 0x757F}, //12836 #CJK UNIFIED IDEOGRAPH
+ {0xD1B3, 0x7881}, //12837 #CJK UNIFIED IDEOGRAPH
+ {0xD1B4, 0x78EF}, //12838 #CJK UNIFIED IDEOGRAPH
+ {0xD1B5, 0x7941}, //12839 #CJK UNIFIED IDEOGRAPH
+ {0xD1B6, 0x7947}, //12840 #CJK UNIFIED IDEOGRAPH
+ {0xD1B7, 0x7948}, //12841 #CJK UNIFIED IDEOGRAPH
+ {0xD1B8, 0x797A}, //12842 #CJK UNIFIED IDEOGRAPH
+ {0xD1B9, 0x7B95}, //12843 #CJK UNIFIED IDEOGRAPH
+ {0xD1BA, 0x7D00}, //12844 #CJK UNIFIED IDEOGRAPH
+ {0xD1BB, 0x7DBA}, //12845 #CJK UNIFIED IDEOGRAPH
+ {0xD1BC, 0x7F88}, //12846 #CJK UNIFIED IDEOGRAPH
+ {0xD1BD, 0x8006}, //12847 #CJK UNIFIED IDEOGRAPH
+ {0xD1BE, 0x802D}, //12848 #CJK UNIFIED IDEOGRAPH
+ {0xD1BF, 0x808C}, //12849 #CJK UNIFIED IDEOGRAPH
+ {0xD1C0, 0x8A18}, //12850 #CJK UNIFIED IDEOGRAPH
+ {0xD1C1, 0x8B4F}, //12851 #CJK UNIFIED IDEOGRAPH
+ {0xD1C2, 0x8C48}, //12852 #CJK UNIFIED IDEOGRAPH
+ {0xD1C3, 0x8D77}, //12853 #CJK UNIFIED IDEOGRAPH
+ {0xD1C4, 0x9321}, //12854 #CJK UNIFIED IDEOGRAPH
+ {0xD1C5, 0x9324}, //12855 #CJK UNIFIED IDEOGRAPH
+ {0xD1C6, 0x98E2}, //12856 #CJK UNIFIED IDEOGRAPH
+ {0xD1C7, 0x9951}, //12857 #CJK UNIFIED IDEOGRAPH
+ {0xD1C8, 0x9A0E}, //12858 #CJK UNIFIED IDEOGRAPH
+ {0xD1C9, 0x9A0F}, //12859 #CJK UNIFIED IDEOGRAPH
+ {0xD1CA, 0x9A65}, //12860 #CJK UNIFIED IDEOGRAPH
+ {0xD1CB, 0x9E92}, //12861 #CJK UNIFIED IDEOGRAPH
+ {0xD1CC, 0x7DCA}, //12862 #CJK UNIFIED IDEOGRAPH
+ {0xD1CD, 0x4F76}, //12863 #CJK UNIFIED IDEOGRAPH
+ {0xD1CE, 0x5409}, //12864 #CJK UNIFIED IDEOGRAPH
+ {0xD1CF, 0x62EE}, //12865 #CJK UNIFIED IDEOGRAPH
+ {0xD1D0, 0x6854}, //12866 #CJK UNIFIED IDEOGRAPH
+ {0xD1D1, 0x91D1}, //12867 #CJK UNIFIED IDEOGRAPH
+ {0xD1D2, 0x55AB}, //12868 #CJK UNIFIED IDEOGRAPH
+ {0xD1D3, 0x513A}, //12869 #CJK UNIFIED IDEOGRAPH
+ {0xD1D4, 0xF90B}, //12870 #CJK COMPATIBILITY IDEOGRAPH
+ {0xD1D5, 0xF90C}, //12871 #CJK COMPATIBILITY IDEOGRAPH
+ {0xD1D6, 0x5A1C}, //12872 #CJK UNIFIED IDEOGRAPH
+ {0xD1D7, 0x61E6}, //12873 #CJK UNIFIED IDEOGRAPH
+ {0xD1D8, 0xF90D}, //12874 #CJK COMPATIBILITY IDEOGRAPH
+ {0xD1D9, 0x62CF}, //12875 #CJK UNIFIED IDEOGRAPH
+ {0xD1DA, 0x62FF}, //12876 #CJK UNIFIED IDEOGRAPH
+ {0xD1DB, 0xF90E}, //12877 #CJK COMPATIBILITY IDEOGRAPH
+ {0xD1DC, 0xF90F}, //12878 #CJK COMPATIBILITY IDEOGRAPH
+ {0xD1DD, 0xF910}, //12879 #CJK COMPATIBILITY IDEOGRAPH
+ {0xD1DE, 0xF911}, //12880 #CJK COMPATIBILITY IDEOGRAPH
+ {0xD1DF, 0xF912}, //12881 #CJK COMPATIBILITY IDEOGRAPH
+ {0xD1E0, 0xF913}, //12882 #CJK COMPATIBILITY IDEOGRAPH
+ {0xD1E1, 0x90A3}, //12883 #CJK UNIFIED IDEOGRAPH
+ {0xD1E2, 0xF914}, //12884 #CJK COMPATIBILITY IDEOGRAPH
+ {0xD1E3, 0xF915}, //12885 #CJK COMPATIBILITY IDEOGRAPH
+ {0xD1E4, 0xF916}, //12886 #CJK COMPATIBILITY IDEOGRAPH
+ {0xD1E5, 0xF917}, //12887 #CJK COMPATIBILITY IDEOGRAPH
+ {0xD1E6, 0xF918}, //12888 #CJK COMPATIBILITY IDEOGRAPH
+ {0xD1E7, 0x8AFE}, //12889 #CJK UNIFIED IDEOGRAPH
+ {0xD1E8, 0xF919}, //12890 #CJK COMPATIBILITY IDEOGRAPH
+ {0xD1E9, 0xF91A}, //12891 #CJK COMPATIBILITY IDEOGRAPH
+ {0xD1EA, 0xF91B}, //12892 #CJK COMPATIBILITY IDEOGRAPH
+ {0xD1EB, 0xF91C}, //12893 #CJK COMPATIBILITY IDEOGRAPH
+ {0xD1EC, 0x6696}, //12894 #CJK UNIFIED IDEOGRAPH
+ {0xD1ED, 0xF91D}, //12895 #CJK COMPATIBILITY IDEOGRAPH
+ {0xD1EE, 0x7156}, //12896 #CJK UNIFIED IDEOGRAPH
+ {0xD1EF, 0xF91E}, //12897 #CJK COMPATIBILITY IDEOGRAPH
+ {0xD1F0, 0xF91F}, //12898 #CJK COMPATIBILITY IDEOGRAPH
+ {0xD1F1, 0x96E3}, //12899 #CJK UNIFIED IDEOGRAPH
+ {0xD1F2, 0xF920}, //12900 #CJK COMPATIBILITY IDEOGRAPH
+ {0xD1F3, 0x634F}, //12901 #CJK UNIFIED IDEOGRAPH
+ {0xD1F4, 0x637A}, //12902 #CJK UNIFIED IDEOGRAPH
+ {0xD1F5, 0x5357}, //12903 #CJK UNIFIED IDEOGRAPH
+ {0xD1F6, 0xF921}, //12904 #CJK COMPATIBILITY IDEOGRAPH
+ {0xD1F7, 0x678F}, //12905 #CJK UNIFIED IDEOGRAPH
+ {0xD1F8, 0x6960}, //12906 #CJK UNIFIED IDEOGRAPH
+ {0xD1F9, 0x6E73}, //12907 #CJK UNIFIED IDEOGRAPH
+ {0xD1FA, 0xF922}, //12908 #CJK COMPATIBILITY IDEOGRAPH
+ {0xD1FB, 0x7537}, //12909 #CJK UNIFIED IDEOGRAPH
+ {0xD1FC, 0xF923}, //12910 #CJK COMPATIBILITY IDEOGRAPH
+ {0xD1FD, 0xF924}, //12911 #CJK COMPATIBILITY IDEOGRAPH
+ {0xD1FE, 0xF925}, //12912 #CJK COMPATIBILITY IDEOGRAPH
+ {0xD2A1, 0x7D0D}, //12913 #CJK UNIFIED IDEOGRAPH
+ {0xD2A2, 0xF926}, //12914 #CJK COMPATIBILITY IDEOGRAPH
+ {0xD2A3, 0xF927}, //12915 #CJK COMPATIBILITY IDEOGRAPH
+ {0xD2A4, 0x8872}, //12916 #CJK UNIFIED IDEOGRAPH
+ {0xD2A5, 0x56CA}, //12917 #CJK UNIFIED IDEOGRAPH
+ {0xD2A6, 0x5A18}, //12918 #CJK UNIFIED IDEOGRAPH
+ {0xD2A7, 0xF928}, //12919 #CJK COMPATIBILITY IDEOGRAPH
+ {0xD2A8, 0xF929}, //12920 #CJK COMPATIBILITY IDEOGRAPH
+ {0xD2A9, 0xF92A}, //12921 #CJK COMPATIBILITY IDEOGRAPH
+ {0xD2AA, 0xF92B}, //12922 #CJK COMPATIBILITY IDEOGRAPH
+ {0xD2AB, 0xF92C}, //12923 #CJK COMPATIBILITY IDEOGRAPH
+ {0xD2AC, 0x4E43}, //12924 #CJK UNIFIED IDEOGRAPH
+ {0xD2AD, 0xF92D}, //12925 #CJK COMPATIBILITY IDEOGRAPH
+ {0xD2AE, 0x5167}, //12926 #CJK UNIFIED IDEOGRAPH
+ {0xD2AF, 0x5948}, //12927 #CJK UNIFIED IDEOGRAPH
+ {0xD2B0, 0x67F0}, //12928 #CJK UNIFIED IDEOGRAPH
+ {0xD2B1, 0x8010}, //12929 #CJK UNIFIED IDEOGRAPH
+ {0xD2B2, 0xF92E}, //12930 #CJK COMPATIBILITY IDEOGRAPH
+ {0xD2B3, 0x5973}, //12931 #CJK UNIFIED IDEOGRAPH
+ {0xD2B4, 0x5E74}, //12932 #CJK UNIFIED IDEOGRAPH
+ {0xD2B5, 0x649A}, //12933 #CJK UNIFIED IDEOGRAPH
+ {0xD2B6, 0x79CA}, //12934 #CJK UNIFIED IDEOGRAPH
+ {0xD2B7, 0x5FF5}, //12935 #CJK UNIFIED IDEOGRAPH
+ {0xD2B8, 0x606C}, //12936 #CJK UNIFIED IDEOGRAPH
+ {0xD2B9, 0x62C8}, //12937 #CJK UNIFIED IDEOGRAPH
+ {0xD2BA, 0x637B}, //12938 #CJK UNIFIED IDEOGRAPH
+ {0xD2BB, 0x5BE7}, //12939 #CJK UNIFIED IDEOGRAPH
+ {0xD2BC, 0x5BD7}, //12940 #CJK UNIFIED IDEOGRAPH
+ {0xD2BD, 0x52AA}, //12941 #CJK UNIFIED IDEOGRAPH
+ {0xD2BE, 0xF92F}, //12942 #CJK COMPATIBILITY IDEOGRAPH
+ {0xD2BF, 0x5974}, //12943 #CJK UNIFIED IDEOGRAPH
+ {0xD2C0, 0x5F29}, //12944 #CJK UNIFIED IDEOGRAPH
+ {0xD2C1, 0x6012}, //12945 #CJK UNIFIED IDEOGRAPH
+ {0xD2C2, 0xF930}, //12946 #CJK COMPATIBILITY IDEOGRAPH
+ {0xD2C3, 0xF931}, //12947 #CJK COMPATIBILITY IDEOGRAPH
+ {0xD2C4, 0xF932}, //12948 #CJK COMPATIBILITY IDEOGRAPH
+ {0xD2C5, 0x7459}, //12949 #CJK UNIFIED IDEOGRAPH
+ {0xD2C6, 0xF933}, //12950 #CJK COMPATIBILITY IDEOGRAPH
+ {0xD2C7, 0xF934}, //12951 #CJK COMPATIBILITY IDEOGRAPH
+ {0xD2C8, 0xF935}, //12952 #CJK COMPATIBILITY IDEOGRAPH
+ {0xD2C9, 0xF936}, //12953 #CJK COMPATIBILITY IDEOGRAPH
+ {0xD2CA, 0xF937}, //12954 #CJK COMPATIBILITY IDEOGRAPH
+ {0xD2CB, 0xF938}, //12955 #CJK COMPATIBILITY IDEOGRAPH
+ {0xD2CC, 0x99D1}, //12956 #CJK UNIFIED IDEOGRAPH
+ {0xD2CD, 0xF939}, //12957 #CJK COMPATIBILITY IDEOGRAPH
+ {0xD2CE, 0xF93A}, //12958 #CJK COMPATIBILITY IDEOGRAPH
+ {0xD2CF, 0xF93B}, //12959 #CJK COMPATIBILITY IDEOGRAPH
+ {0xD2D0, 0xF93C}, //12960 #CJK COMPATIBILITY IDEOGRAPH
+ {0xD2D1, 0xF93D}, //12961 #CJK COMPATIBILITY IDEOGRAPH
+ {0xD2D2, 0xF93E}, //12962 #CJK COMPATIBILITY IDEOGRAPH
+ {0xD2D3, 0xF93F}, //12963 #CJK COMPATIBILITY IDEOGRAPH
+ {0xD2D4, 0xF940}, //12964 #CJK COMPATIBILITY IDEOGRAPH
+ {0xD2D5, 0xF941}, //12965 #CJK COMPATIBILITY IDEOGRAPH
+ {0xD2D6, 0xF942}, //12966 #CJK COMPATIBILITY IDEOGRAPH
+ {0xD2D7, 0xF943}, //12967 #CJK COMPATIBILITY IDEOGRAPH
+ {0xD2D8, 0x6FC3}, //12968 #CJK UNIFIED IDEOGRAPH
+ {0xD2D9, 0xF944}, //12969 #CJK COMPATIBILITY IDEOGRAPH
+ {0xD2DA, 0xF945}, //12970 #CJK COMPATIBILITY IDEOGRAPH
+ {0xD2DB, 0x81BF}, //12971 #CJK UNIFIED IDEOGRAPH
+ {0xD2DC, 0x8FB2}, //12972 #CJK UNIFIED IDEOGRAPH
+ {0xD2DD, 0x60F1}, //12973 #CJK UNIFIED IDEOGRAPH
+ {0xD2DE, 0xF946}, //12974 #CJK COMPATIBILITY IDEOGRAPH
+ {0xD2DF, 0xF947}, //12975 #CJK COMPATIBILITY IDEOGRAPH
+ {0xD2E0, 0x8166}, //12976 #CJK UNIFIED IDEOGRAPH
+ {0xD2E1, 0xF948}, //12977 #CJK COMPATIBILITY IDEOGRAPH
+ {0xD2E2, 0xF949}, //12978 #CJK COMPATIBILITY IDEOGRAPH
+ {0xD2E3, 0x5C3F}, //12979 #CJK UNIFIED IDEOGRAPH
+ {0xD2E4, 0xF94A}, //12980 #CJK COMPATIBILITY IDEOGRAPH
+ {0xD2E5, 0xF94B}, //12981 #CJK COMPATIBILITY IDEOGRAPH
+ {0xD2E6, 0xF94C}, //12982 #CJK COMPATIBILITY IDEOGRAPH
+ {0xD2E7, 0xF94D}, //12983 #CJK COMPATIBILITY IDEOGRAPH
+ {0xD2E8, 0xF94E}, //12984 #CJK COMPATIBILITY IDEOGRAPH
+ {0xD2E9, 0xF94F}, //12985 #CJK COMPATIBILITY IDEOGRAPH
+ {0xD2EA, 0xF950}, //12986 #CJK COMPATIBILITY IDEOGRAPH
+ {0xD2EB, 0xF951}, //12987 #CJK COMPATIBILITY IDEOGRAPH
+ {0xD2EC, 0x5AE9}, //12988 #CJK UNIFIED IDEOGRAPH
+ {0xD2ED, 0x8A25}, //12989 #CJK UNIFIED IDEOGRAPH
+ {0xD2EE, 0x677B}, //12990 #CJK UNIFIED IDEOGRAPH
+ {0xD2EF, 0x7D10}, //12991 #CJK UNIFIED IDEOGRAPH
+ {0xD2F0, 0xF952}, //12992 #CJK COMPATIBILITY IDEOGRAPH
+ {0xD2F1, 0xF953}, //12993 #CJK COMPATIBILITY IDEOGRAPH
+ {0xD2F2, 0xF954}, //12994 #CJK COMPATIBILITY IDEOGRAPH
+ {0xD2F3, 0xF955}, //12995 #CJK COMPATIBILITY IDEOGRAPH
+ {0xD2F4, 0xF956}, //12996 #CJK COMPATIBILITY IDEOGRAPH
+ {0xD2F5, 0xF957}, //12997 #CJK COMPATIBILITY IDEOGRAPH
+ {0xD2F6, 0x80FD}, //12998 #CJK UNIFIED IDEOGRAPH
+ {0xD2F7, 0xF958}, //12999 #CJK COMPATIBILITY IDEOGRAPH
+ {0xD2F8, 0xF959}, //13000 #CJK COMPATIBILITY IDEOGRAPH
+ {0xD2F9, 0x5C3C}, //13001 #CJK UNIFIED IDEOGRAPH
+ {0xD2FA, 0x6CE5}, //13002 #CJK UNIFIED IDEOGRAPH
+ {0xD2FB, 0x533F}, //13003 #CJK UNIFIED IDEOGRAPH
+ {0xD2FC, 0x6EBA}, //13004 #CJK UNIFIED IDEOGRAPH
+ {0xD2FD, 0x591A}, //13005 #CJK UNIFIED IDEOGRAPH
+ {0xD2FE, 0x8336}, //13006 #CJK UNIFIED IDEOGRAPH
+ {0xD3A1, 0x4E39}, //13007 #CJK UNIFIED IDEOGRAPH
+ {0xD3A2, 0x4EB6}, //13008 #CJK UNIFIED IDEOGRAPH
+ {0xD3A3, 0x4F46}, //13009 #CJK UNIFIED IDEOGRAPH
+ {0xD3A4, 0x55AE}, //13010 #CJK UNIFIED IDEOGRAPH
+ {0xD3A5, 0x5718}, //13011 #CJK UNIFIED IDEOGRAPH
+ {0xD3A6, 0x58C7}, //13012 #CJK UNIFIED IDEOGRAPH
+ {0xD3A7, 0x5F56}, //13013 #CJK UNIFIED IDEOGRAPH
+ {0xD3A8, 0x65B7}, //13014 #CJK UNIFIED IDEOGRAPH
+ {0xD3A9, 0x65E6}, //13015 #CJK UNIFIED IDEOGRAPH
+ {0xD3AA, 0x6A80}, //13016 #CJK UNIFIED IDEOGRAPH
+ {0xD3AB, 0x6BB5}, //13017 #CJK UNIFIED IDEOGRAPH
+ {0xD3AC, 0x6E4D}, //13018 #CJK UNIFIED IDEOGRAPH
+ {0xD3AD, 0x77ED}, //13019 #CJK UNIFIED IDEOGRAPH
+ {0xD3AE, 0x7AEF}, //13020 #CJK UNIFIED IDEOGRAPH
+ {0xD3AF, 0x7C1E}, //13021 #CJK UNIFIED IDEOGRAPH
+ {0xD3B0, 0x7DDE}, //13022 #CJK UNIFIED IDEOGRAPH
+ {0xD3B1, 0x86CB}, //13023 #CJK UNIFIED IDEOGRAPH
+ {0xD3B2, 0x8892}, //13024 #CJK UNIFIED IDEOGRAPH
+ {0xD3B3, 0x9132}, //13025 #CJK UNIFIED IDEOGRAPH
+ {0xD3B4, 0x935B}, //13026 #CJK UNIFIED IDEOGRAPH
+ {0xD3B5, 0x64BB}, //13027 #CJK UNIFIED IDEOGRAPH
+ {0xD3B6, 0x6FBE}, //13028 #CJK UNIFIED IDEOGRAPH
+ {0xD3B7, 0x737A}, //13029 #CJK UNIFIED IDEOGRAPH
+ {0xD3B8, 0x75B8}, //13030 #CJK UNIFIED IDEOGRAPH
+ {0xD3B9, 0x9054}, //13031 #CJK UNIFIED IDEOGRAPH
+ {0xD3BA, 0x5556}, //13032 #CJK UNIFIED IDEOGRAPH
+ {0xD3BB, 0x574D}, //13033 #CJK UNIFIED IDEOGRAPH
+ {0xD3BC, 0x61BA}, //13034 #CJK UNIFIED IDEOGRAPH
+ {0xD3BD, 0x64D4}, //13035 #CJK UNIFIED IDEOGRAPH
+ {0xD3BE, 0x66C7}, //13036 #CJK UNIFIED IDEOGRAPH
+ {0xD3BF, 0x6DE1}, //13037 #CJK UNIFIED IDEOGRAPH
+ {0xD3C0, 0x6E5B}, //13038 #CJK UNIFIED IDEOGRAPH
+ {0xD3C1, 0x6F6D}, //13039 #CJK UNIFIED IDEOGRAPH
+ {0xD3C2, 0x6FB9}, //13040 #CJK UNIFIED IDEOGRAPH
+ {0xD3C3, 0x75F0}, //13041 #CJK UNIFIED IDEOGRAPH
+ {0xD3C4, 0x8043}, //13042 #CJK UNIFIED IDEOGRAPH
+ {0xD3C5, 0x81BD}, //13043 #CJK UNIFIED IDEOGRAPH
+ {0xD3C6, 0x8541}, //13044 #CJK UNIFIED IDEOGRAPH
+ {0xD3C7, 0x8983}, //13045 #CJK UNIFIED IDEOGRAPH
+ {0xD3C8, 0x8AC7}, //13046 #CJK UNIFIED IDEOGRAPH
+ {0xD3C9, 0x8B5A}, //13047 #CJK UNIFIED IDEOGRAPH
+ {0xD3CA, 0x931F}, //13048 #CJK UNIFIED IDEOGRAPH
+ {0xD3CB, 0x6C93}, //13049 #CJK UNIFIED IDEOGRAPH
+ {0xD3CC, 0x7553}, //13050 #CJK UNIFIED IDEOGRAPH
+ {0xD3CD, 0x7B54}, //13051 #CJK UNIFIED IDEOGRAPH
+ {0xD3CE, 0x8E0F}, //13052 #CJK UNIFIED IDEOGRAPH
+ {0xD3CF, 0x905D}, //13053 #CJK UNIFIED IDEOGRAPH
+ {0xD3D0, 0x5510}, //13054 #CJK UNIFIED IDEOGRAPH
+ {0xD3D1, 0x5802}, //13055 #CJK UNIFIED IDEOGRAPH
+ {0xD3D2, 0x5858}, //13056 #CJK UNIFIED IDEOGRAPH
+ {0xD3D3, 0x5E62}, //13057 #CJK UNIFIED IDEOGRAPH
+ {0xD3D4, 0x6207}, //13058 #CJK UNIFIED IDEOGRAPH
+ {0xD3D5, 0x649E}, //13059 #CJK UNIFIED IDEOGRAPH
+ {0xD3D6, 0x68E0}, //13060 #CJK UNIFIED IDEOGRAPH
+ {0xD3D7, 0x7576}, //13061 #CJK UNIFIED IDEOGRAPH
+ {0xD3D8, 0x7CD6}, //13062 #CJK UNIFIED IDEOGRAPH
+ {0xD3D9, 0x87B3}, //13063 #CJK UNIFIED IDEOGRAPH
+ {0xD3DA, 0x9EE8}, //13064 #CJK UNIFIED IDEOGRAPH
+ {0xD3DB, 0x4EE3}, //13065 #CJK UNIFIED IDEOGRAPH
+ {0xD3DC, 0x5788}, //13066 #CJK UNIFIED IDEOGRAPH
+ {0xD3DD, 0x576E}, //13067 #CJK UNIFIED IDEOGRAPH
+ {0xD3DE, 0x5927}, //13068 #CJK UNIFIED IDEOGRAPH
+ {0xD3DF, 0x5C0D}, //13069 #CJK UNIFIED IDEOGRAPH
+ {0xD3E0, 0x5CB1}, //13070 #CJK UNIFIED IDEOGRAPH
+ {0xD3E1, 0x5E36}, //13071 #CJK UNIFIED IDEOGRAPH
+ {0xD3E2, 0x5F85}, //13072 #CJK UNIFIED IDEOGRAPH
+ {0xD3E3, 0x6234}, //13073 #CJK UNIFIED IDEOGRAPH
+ {0xD3E4, 0x64E1}, //13074 #CJK UNIFIED IDEOGRAPH
+ {0xD3E5, 0x73B3}, //13075 #CJK UNIFIED IDEOGRAPH
+ {0xD3E6, 0x81FA}, //13076 #CJK UNIFIED IDEOGRAPH
+ {0xD3E7, 0x888B}, //13077 #CJK UNIFIED IDEOGRAPH
+ {0xD3E8, 0x8CB8}, //13078 #CJK UNIFIED IDEOGRAPH
+ {0xD3E9, 0x968A}, //13079 #CJK UNIFIED IDEOGRAPH
+ {0xD3EA, 0x9EDB}, //13080 #CJK UNIFIED IDEOGRAPH
+ {0xD3EB, 0x5B85}, //13081 #CJK UNIFIED IDEOGRAPH
+ {0xD3EC, 0x5FB7}, //13082 #CJK UNIFIED IDEOGRAPH
+ {0xD3ED, 0x60B3}, //13083 #CJK UNIFIED IDEOGRAPH
+ {0xD3EE, 0x5012}, //13084 #CJK UNIFIED IDEOGRAPH
+ {0xD3EF, 0x5200}, //13085 #CJK UNIFIED IDEOGRAPH
+ {0xD3F0, 0x5230}, //13086 #CJK UNIFIED IDEOGRAPH
+ {0xD3F1, 0x5716}, //13087 #CJK UNIFIED IDEOGRAPH
+ {0xD3F2, 0x5835}, //13088 #CJK UNIFIED IDEOGRAPH
+ {0xD3F3, 0x5857}, //13089 #CJK UNIFIED IDEOGRAPH
+ {0xD3F4, 0x5C0E}, //13090 #CJK UNIFIED IDEOGRAPH
+ {0xD3F5, 0x5C60}, //13091 #CJK UNIFIED IDEOGRAPH
+ {0xD3F6, 0x5CF6}, //13092 #CJK UNIFIED IDEOGRAPH
+ {0xD3F7, 0x5D8B}, //13093 #CJK UNIFIED IDEOGRAPH
+ {0xD3F8, 0x5EA6}, //13094 #CJK UNIFIED IDEOGRAPH
+ {0xD3F9, 0x5F92}, //13095 #CJK UNIFIED IDEOGRAPH
+ {0xD3FA, 0x60BC}, //13096 #CJK UNIFIED IDEOGRAPH
+ {0xD3FB, 0x6311}, //13097 #CJK UNIFIED IDEOGRAPH
+ {0xD3FC, 0x6389}, //13098 #CJK UNIFIED IDEOGRAPH
+ {0xD3FD, 0x6417}, //13099 #CJK UNIFIED IDEOGRAPH
+ {0xD3FE, 0x6843}, //13100 #CJK UNIFIED IDEOGRAPH
+ {0xD4A1, 0x68F9}, //13101 #CJK UNIFIED IDEOGRAPH
+ {0xD4A2, 0x6AC2}, //13102 #CJK UNIFIED IDEOGRAPH
+ {0xD4A3, 0x6DD8}, //13103 #CJK UNIFIED IDEOGRAPH
+ {0xD4A4, 0x6E21}, //13104 #CJK UNIFIED IDEOGRAPH
+ {0xD4A5, 0x6ED4}, //13105 #CJK UNIFIED IDEOGRAPH
+ {0xD4A6, 0x6FE4}, //13106 #CJK UNIFIED IDEOGRAPH
+ {0xD4A7, 0x71FE}, //13107 #CJK UNIFIED IDEOGRAPH
+ {0xD4A8, 0x76DC}, //13108 #CJK UNIFIED IDEOGRAPH
+ {0xD4A9, 0x7779}, //13109 #CJK UNIFIED IDEOGRAPH
+ {0xD4AA, 0x79B1}, //13110 #CJK UNIFIED IDEOGRAPH
+ {0xD4AB, 0x7A3B}, //13111 #CJK UNIFIED IDEOGRAPH
+ {0xD4AC, 0x8404}, //13112 #CJK UNIFIED IDEOGRAPH
+ {0xD4AD, 0x89A9}, //13113 #CJK UNIFIED IDEOGRAPH
+ {0xD4AE, 0x8CED}, //13114 #CJK UNIFIED IDEOGRAPH
+ {0xD4AF, 0x8DF3}, //13115 #CJK UNIFIED IDEOGRAPH
+ {0xD4B0, 0x8E48}, //13116 #CJK UNIFIED IDEOGRAPH
+ {0xD4B1, 0x9003}, //13117 #CJK UNIFIED IDEOGRAPH
+ {0xD4B2, 0x9014}, //13118 #CJK UNIFIED IDEOGRAPH
+ {0xD4B3, 0x9053}, //13119 #CJK UNIFIED IDEOGRAPH
+ {0xD4B4, 0x90FD}, //13120 #CJK UNIFIED IDEOGRAPH
+ {0xD4B5, 0x934D}, //13121 #CJK UNIFIED IDEOGRAPH
+ {0xD4B6, 0x9676}, //13122 #CJK UNIFIED IDEOGRAPH
+ {0xD4B7, 0x97DC}, //13123 #CJK UNIFIED IDEOGRAPH
+ {0xD4B8, 0x6BD2}, //13124 #CJK UNIFIED IDEOGRAPH
+ {0xD4B9, 0x7006}, //13125 #CJK UNIFIED IDEOGRAPH
+ {0xD4BA, 0x7258}, //13126 #CJK UNIFIED IDEOGRAPH
+ {0xD4BB, 0x72A2}, //13127 #CJK UNIFIED IDEOGRAPH
+ {0xD4BC, 0x7368}, //13128 #CJK UNIFIED IDEOGRAPH
+ {0xD4BD, 0x7763}, //13129 #CJK UNIFIED IDEOGRAPH
+ {0xD4BE, 0x79BF}, //13130 #CJK UNIFIED IDEOGRAPH
+ {0xD4BF, 0x7BE4}, //13131 #CJK UNIFIED IDEOGRAPH
+ {0xD4C0, 0x7E9B}, //13132 #CJK UNIFIED IDEOGRAPH
+ {0xD4C1, 0x8B80}, //13133 #CJK UNIFIED IDEOGRAPH
+ {0xD4C2, 0x58A9}, //13134 #CJK UNIFIED IDEOGRAPH
+ {0xD4C3, 0x60C7}, //13135 #CJK UNIFIED IDEOGRAPH
+ {0xD4C4, 0x6566}, //13136 #CJK UNIFIED IDEOGRAPH
+ {0xD4C5, 0x65FD}, //13137 #CJK UNIFIED IDEOGRAPH
+ {0xD4C6, 0x66BE}, //13138 #CJK UNIFIED IDEOGRAPH
+ {0xD4C7, 0x6C8C}, //13139 #CJK UNIFIED IDEOGRAPH
+ {0xD4C8, 0x711E}, //13140 #CJK UNIFIED IDEOGRAPH
+ {0xD4C9, 0x71C9}, //13141 #CJK UNIFIED IDEOGRAPH
+ {0xD4CA, 0x8C5A}, //13142 #CJK UNIFIED IDEOGRAPH
+ {0xD4CB, 0x9813}, //13143 #CJK UNIFIED IDEOGRAPH
+ {0xD4CC, 0x4E6D}, //13144 #CJK UNIFIED IDEOGRAPH
+ {0xD4CD, 0x7A81}, //13145 #CJK UNIFIED IDEOGRAPH
+ {0xD4CE, 0x4EDD}, //13146 #CJK UNIFIED IDEOGRAPH
+ {0xD4CF, 0x51AC}, //13147 #CJK UNIFIED IDEOGRAPH
+ {0xD4D0, 0x51CD}, //13148 #CJK UNIFIED IDEOGRAPH
+ {0xD4D1, 0x52D5}, //13149 #CJK UNIFIED IDEOGRAPH
+ {0xD4D2, 0x540C}, //13150 #CJK UNIFIED IDEOGRAPH
+ {0xD4D3, 0x61A7}, //13151 #CJK UNIFIED IDEOGRAPH
+ {0xD4D4, 0x6771}, //13152 #CJK UNIFIED IDEOGRAPH
+ {0xD4D5, 0x6850}, //13153 #CJK UNIFIED IDEOGRAPH
+ {0xD4D6, 0x68DF}, //13154 #CJK UNIFIED IDEOGRAPH
+ {0xD4D7, 0x6D1E}, //13155 #CJK UNIFIED IDEOGRAPH
+ {0xD4D8, 0x6F7C}, //13156 #CJK UNIFIED IDEOGRAPH
+ {0xD4D9, 0x75BC}, //13157 #CJK UNIFIED IDEOGRAPH
+ {0xD4DA, 0x77B3}, //13158 #CJK UNIFIED IDEOGRAPH
+ {0xD4DB, 0x7AE5}, //13159 #CJK UNIFIED IDEOGRAPH
+ {0xD4DC, 0x80F4}, //13160 #CJK UNIFIED IDEOGRAPH
+ {0xD4DD, 0x8463}, //13161 #CJK UNIFIED IDEOGRAPH
+ {0xD4DE, 0x9285}, //13162 #CJK UNIFIED IDEOGRAPH
+ {0xD4DF, 0x515C}, //13163 #CJK UNIFIED IDEOGRAPH
+ {0xD4E0, 0x6597}, //13164 #CJK UNIFIED IDEOGRAPH
+ {0xD4E1, 0x675C}, //13165 #CJK UNIFIED IDEOGRAPH
+ {0xD4E2, 0x6793}, //13166 #CJK UNIFIED IDEOGRAPH
+ {0xD4E3, 0x75D8}, //13167 #CJK UNIFIED IDEOGRAPH
+ {0xD4E4, 0x7AC7}, //13168 #CJK UNIFIED IDEOGRAPH
+ {0xD4E5, 0x8373}, //13169 #CJK UNIFIED IDEOGRAPH
+ {0xD4E6, 0xF95A}, //13170 #CJK COMPATIBILITY IDEOGRAPH
+ {0xD4E7, 0x8C46}, //13171 #CJK UNIFIED IDEOGRAPH
+ {0xD4E8, 0x9017}, //13172 #CJK UNIFIED IDEOGRAPH
+ {0xD4E9, 0x982D}, //13173 #CJK UNIFIED IDEOGRAPH
+ {0xD4EA, 0x5C6F}, //13174 #CJK UNIFIED IDEOGRAPH
+ {0xD4EB, 0x81C0}, //13175 #CJK UNIFIED IDEOGRAPH
+ {0xD4EC, 0x829A}, //13176 #CJK UNIFIED IDEOGRAPH
+ {0xD4ED, 0x9041}, //13177 #CJK UNIFIED IDEOGRAPH
+ {0xD4EE, 0x906F}, //13178 #CJK UNIFIED IDEOGRAPH
+ {0xD4EF, 0x920D}, //13179 #CJK UNIFIED IDEOGRAPH
+ {0xD4F0, 0x5F97}, //13180 #CJK UNIFIED IDEOGRAPH
+ {0xD4F1, 0x5D9D}, //13181 #CJK UNIFIED IDEOGRAPH
+ {0xD4F2, 0x6A59}, //13182 #CJK UNIFIED IDEOGRAPH
+ {0xD4F3, 0x71C8}, //13183 #CJK UNIFIED IDEOGRAPH
+ {0xD4F4, 0x767B}, //13184 #CJK UNIFIED IDEOGRAPH
+ {0xD4F5, 0x7B49}, //13185 #CJK UNIFIED IDEOGRAPH
+ {0xD4F6, 0x85E4}, //13186 #CJK UNIFIED IDEOGRAPH
+ {0xD4F7, 0x8B04}, //13187 #CJK UNIFIED IDEOGRAPH
+ {0xD4F8, 0x9127}, //13188 #CJK UNIFIED IDEOGRAPH
+ {0xD4F9, 0x9A30}, //13189 #CJK UNIFIED IDEOGRAPH
+ {0xD4FA, 0x5587}, //13190 #CJK UNIFIED IDEOGRAPH
+ {0xD4FB, 0x61F6}, //13191 #CJK UNIFIED IDEOGRAPH
+ {0xD4FC, 0xF95B}, //13192 #CJK COMPATIBILITY IDEOGRAPH
+ {0xD4FD, 0x7669}, //13193 #CJK UNIFIED IDEOGRAPH
+ {0xD4FE, 0x7F85}, //13194 #CJK UNIFIED IDEOGRAPH
+ {0xD5A1, 0x863F}, //13195 #CJK UNIFIED IDEOGRAPH
+ {0xD5A2, 0x87BA}, //13196 #CJK UNIFIED IDEOGRAPH
+ {0xD5A3, 0x88F8}, //13197 #CJK UNIFIED IDEOGRAPH
+ {0xD5A4, 0x908F}, //13198 #CJK UNIFIED IDEOGRAPH
+ {0xD5A5, 0xF95C}, //13199 #CJK COMPATIBILITY IDEOGRAPH
+ {0xD5A6, 0x6D1B}, //13200 #CJK UNIFIED IDEOGRAPH
+ {0xD5A7, 0x70D9}, //13201 #CJK UNIFIED IDEOGRAPH
+ {0xD5A8, 0x73DE}, //13202 #CJK UNIFIED IDEOGRAPH
+ {0xD5A9, 0x7D61}, //13203 #CJK UNIFIED IDEOGRAPH
+ {0xD5AA, 0x843D}, //13204 #CJK UNIFIED IDEOGRAPH
+ {0xD5AB, 0xF95D}, //13205 #CJK COMPATIBILITY IDEOGRAPH
+ {0xD5AC, 0x916A}, //13206 #CJK UNIFIED IDEOGRAPH
+ {0xD5AD, 0x99F1}, //13207 #CJK UNIFIED IDEOGRAPH
+ {0xD5AE, 0xF95E}, //13208 #CJK COMPATIBILITY IDEOGRAPH
+ {0xD5AF, 0x4E82}, //13209 #CJK UNIFIED IDEOGRAPH
+ {0xD5B0, 0x5375}, //13210 #CJK UNIFIED IDEOGRAPH
+ {0xD5B1, 0x6B04}, //13211 #CJK UNIFIED IDEOGRAPH
+ {0xD5B2, 0x6B12}, //13212 #CJK UNIFIED IDEOGRAPH
+ {0xD5B3, 0x703E}, //13213 #CJK UNIFIED IDEOGRAPH
+ {0xD5B4, 0x721B}, //13214 #CJK UNIFIED IDEOGRAPH
+ {0xD5B5, 0x862D}, //13215 #CJK UNIFIED IDEOGRAPH
+ {0xD5B6, 0x9E1E}, //13216 #CJK UNIFIED IDEOGRAPH
+ {0xD5B7, 0x524C}, //13217 #CJK UNIFIED IDEOGRAPH
+ {0xD5B8, 0x8FA3}, //13218 #CJK UNIFIED IDEOGRAPH
+ {0xD5B9, 0x5D50}, //13219 #CJK UNIFIED IDEOGRAPH
+ {0xD5BA, 0x64E5}, //13220 #CJK UNIFIED IDEOGRAPH
+ {0xD5BB, 0x652C}, //13221 #CJK UNIFIED IDEOGRAPH
+ {0xD5BC, 0x6B16}, //13222 #CJK UNIFIED IDEOGRAPH
+ {0xD5BD, 0x6FEB}, //13223 #CJK UNIFIED IDEOGRAPH
+ {0xD5BE, 0x7C43}, //13224 #CJK UNIFIED IDEOGRAPH
+ {0xD5BF, 0x7E9C}, //13225 #CJK UNIFIED IDEOGRAPH
+ {0xD5C0, 0x85CD}, //13226 #CJK UNIFIED IDEOGRAPH
+ {0xD5C1, 0x8964}, //13227 #CJK UNIFIED IDEOGRAPH
+ {0xD5C2, 0x89BD}, //13228 #CJK UNIFIED IDEOGRAPH
+ {0xD5C3, 0x62C9}, //13229 #CJK UNIFIED IDEOGRAPH
+ {0xD5C4, 0x81D8}, //13230 #CJK UNIFIED IDEOGRAPH
+ {0xD5C5, 0x881F}, //13231 #CJK UNIFIED IDEOGRAPH
+ {0xD5C6, 0x5ECA}, //13232 #CJK UNIFIED IDEOGRAPH
+ {0xD5C7, 0x6717}, //13233 #CJK UNIFIED IDEOGRAPH
+ {0xD5C8, 0x6D6A}, //13234 #CJK UNIFIED IDEOGRAPH
+ {0xD5C9, 0x72FC}, //13235 #CJK UNIFIED IDEOGRAPH
+ {0xD5CA, 0x7405}, //13236 #CJK UNIFIED IDEOGRAPH
+ {0xD5CB, 0x746F}, //13237 #CJK UNIFIED IDEOGRAPH
+ {0xD5CC, 0x8782}, //13238 #CJK UNIFIED IDEOGRAPH
+ {0xD5CD, 0x90DE}, //13239 #CJK UNIFIED IDEOGRAPH
+ {0xD5CE, 0x4F86}, //13240 #CJK UNIFIED IDEOGRAPH
+ {0xD5CF, 0x5D0D}, //13241 #CJK UNIFIED IDEOGRAPH
+ {0xD5D0, 0x5FA0}, //13242 #CJK UNIFIED IDEOGRAPH
+ {0xD5D1, 0x840A}, //13243 #CJK UNIFIED IDEOGRAPH
+ {0xD5D2, 0x51B7}, //13244 #CJK UNIFIED IDEOGRAPH
+ {0xD5D3, 0x63A0}, //13245 #CJK UNIFIED IDEOGRAPH
+ {0xD5D4, 0x7565}, //13246 #CJK UNIFIED IDEOGRAPH
+ {0xD5D5, 0x4EAE}, //13247 #CJK UNIFIED IDEOGRAPH
+ {0xD5D6, 0x5006}, //13248 #CJK UNIFIED IDEOGRAPH
+ {0xD5D7, 0x5169}, //13249 #CJK UNIFIED IDEOGRAPH
+ {0xD5D8, 0x51C9}, //13250 #CJK UNIFIED IDEOGRAPH
+ {0xD5D9, 0x6881}, //13251 #CJK UNIFIED IDEOGRAPH
+ {0xD5DA, 0x6A11}, //13252 #CJK UNIFIED IDEOGRAPH
+ {0xD5DB, 0x7CAE}, //13253 #CJK UNIFIED IDEOGRAPH
+ {0xD5DC, 0x7CB1}, //13254 #CJK UNIFIED IDEOGRAPH
+ {0xD5DD, 0x7CE7}, //13255 #CJK UNIFIED IDEOGRAPH
+ {0xD5DE, 0x826F}, //13256 #CJK UNIFIED IDEOGRAPH
+ {0xD5DF, 0x8AD2}, //13257 #CJK UNIFIED IDEOGRAPH
+ {0xD5E0, 0x8F1B}, //13258 #CJK UNIFIED IDEOGRAPH
+ {0xD5E1, 0x91CF}, //13259 #CJK UNIFIED IDEOGRAPH
+ {0xD5E2, 0x4FB6}, //13260 #CJK UNIFIED IDEOGRAPH
+ {0xD5E3, 0x5137}, //13261 #CJK UNIFIED IDEOGRAPH
+ {0xD5E4, 0x52F5}, //13262 #CJK UNIFIED IDEOGRAPH
+ {0xD5E5, 0x5442}, //13263 #CJK UNIFIED IDEOGRAPH
+ {0xD5E6, 0x5EEC}, //13264 #CJK UNIFIED IDEOGRAPH
+ {0xD5E7, 0x616E}, //13265 #CJK UNIFIED IDEOGRAPH
+ {0xD5E8, 0x623E}, //13266 #CJK UNIFIED IDEOGRAPH
+ {0xD5E9, 0x65C5}, //13267 #CJK UNIFIED IDEOGRAPH
+ {0xD5EA, 0x6ADA}, //13268 #CJK UNIFIED IDEOGRAPH
+ {0xD5EB, 0x6FFE}, //13269 #CJK UNIFIED IDEOGRAPH
+ {0xD5EC, 0x792A}, //13270 #CJK UNIFIED IDEOGRAPH
+ {0xD5ED, 0x85DC}, //13271 #CJK UNIFIED IDEOGRAPH
+ {0xD5EE, 0x8823}, //13272 #CJK UNIFIED IDEOGRAPH
+ {0xD5EF, 0x95AD}, //13273 #CJK UNIFIED IDEOGRAPH
+ {0xD5F0, 0x9A62}, //13274 #CJK UNIFIED IDEOGRAPH
+ {0xD5F1, 0x9A6A}, //13275 #CJK UNIFIED IDEOGRAPH
+ {0xD5F2, 0x9E97}, //13276 #CJK UNIFIED IDEOGRAPH
+ {0xD5F3, 0x9ECE}, //13277 #CJK UNIFIED IDEOGRAPH
+ {0xD5F4, 0x529B}, //13278 #CJK UNIFIED IDEOGRAPH
+ {0xD5F5, 0x66C6}, //13279 #CJK UNIFIED IDEOGRAPH
+ {0xD5F6, 0x6B77}, //13280 #CJK UNIFIED IDEOGRAPH
+ {0xD5F7, 0x701D}, //13281 #CJK UNIFIED IDEOGRAPH
+ {0xD5F8, 0x792B}, //13282 #CJK UNIFIED IDEOGRAPH
+ {0xD5F9, 0x8F62}, //13283 #CJK UNIFIED IDEOGRAPH
+ {0xD5FA, 0x9742}, //13284 #CJK UNIFIED IDEOGRAPH
+ {0xD5FB, 0x6190}, //13285 #CJK UNIFIED IDEOGRAPH
+ {0xD5FC, 0x6200}, //13286 #CJK UNIFIED IDEOGRAPH
+ {0xD5FD, 0x6523}, //13287 #CJK UNIFIED IDEOGRAPH
+ {0xD5FE, 0x6F23}, //13288 #CJK UNIFIED IDEOGRAPH
+ {0xD6A1, 0x7149}, //13289 #CJK UNIFIED IDEOGRAPH
+ {0xD6A2, 0x7489}, //13290 #CJK UNIFIED IDEOGRAPH
+ {0xD6A3, 0x7DF4}, //13291 #CJK UNIFIED IDEOGRAPH
+ {0xD6A4, 0x806F}, //13292 #CJK UNIFIED IDEOGRAPH
+ {0xD6A5, 0x84EE}, //13293 #CJK UNIFIED IDEOGRAPH
+ {0xD6A6, 0x8F26}, //13294 #CJK UNIFIED IDEOGRAPH
+ {0xD6A7, 0x9023}, //13295 #CJK UNIFIED IDEOGRAPH
+ {0xD6A8, 0x934A}, //13296 #CJK UNIFIED IDEOGRAPH
+ {0xD6A9, 0x51BD}, //13297 #CJK UNIFIED IDEOGRAPH
+ {0xD6AA, 0x5217}, //13298 #CJK UNIFIED IDEOGRAPH
+ {0xD6AB, 0x52A3}, //13299 #CJK UNIFIED IDEOGRAPH
+ {0xD6AC, 0x6D0C}, //13300 #CJK UNIFIED IDEOGRAPH
+ {0xD6AD, 0x70C8}, //13301 #CJK UNIFIED IDEOGRAPH
+ {0xD6AE, 0x88C2}, //13302 #CJK UNIFIED IDEOGRAPH
+ {0xD6AF, 0x5EC9}, //13303 #CJK UNIFIED IDEOGRAPH
+ {0xD6B0, 0x6582}, //13304 #CJK UNIFIED IDEOGRAPH
+ {0xD6B1, 0x6BAE}, //13305 #CJK UNIFIED IDEOGRAPH
+ {0xD6B2, 0x6FC2}, //13306 #CJK UNIFIED IDEOGRAPH
+ {0xD6B3, 0x7C3E}, //13307 #CJK UNIFIED IDEOGRAPH
+ {0xD6B4, 0x7375}, //13308 #CJK UNIFIED IDEOGRAPH
+ {0xD6B5, 0x4EE4}, //13309 #CJK UNIFIED IDEOGRAPH
+ {0xD6B6, 0x4F36}, //13310 #CJK UNIFIED IDEOGRAPH
+ {0xD6B7, 0x56F9}, //13311 #CJK UNIFIED IDEOGRAPH
+ {0xD6B8, 0xF95F}, //13312 #CJK COMPATIBILITY IDEOGRAPH
+ {0xD6B9, 0x5CBA}, //13313 #CJK UNIFIED IDEOGRAPH
+ {0xD6BA, 0x5DBA}, //13314 #CJK UNIFIED IDEOGRAPH
+ {0xD6BB, 0x601C}, //13315 #CJK UNIFIED IDEOGRAPH
+ {0xD6BC, 0x73B2}, //13316 #CJK UNIFIED IDEOGRAPH
+ {0xD6BD, 0x7B2D}, //13317 #CJK UNIFIED IDEOGRAPH
+ {0xD6BE, 0x7F9A}, //13318 #CJK UNIFIED IDEOGRAPH
+ {0xD6BF, 0x7FCE}, //13319 #CJK UNIFIED IDEOGRAPH
+ {0xD6C0, 0x8046}, //13320 #CJK UNIFIED IDEOGRAPH
+ {0xD6C1, 0x901E}, //13321 #CJK UNIFIED IDEOGRAPH
+ {0xD6C2, 0x9234}, //13322 #CJK UNIFIED IDEOGRAPH
+ {0xD6C3, 0x96F6}, //13323 #CJK UNIFIED IDEOGRAPH
+ {0xD6C4, 0x9748}, //13324 #CJK UNIFIED IDEOGRAPH
+ {0xD6C5, 0x9818}, //13325 #CJK UNIFIED IDEOGRAPH
+ {0xD6C6, 0x9F61}, //13326 #CJK UNIFIED IDEOGRAPH
+ {0xD6C7, 0x4F8B}, //13327 #CJK UNIFIED IDEOGRAPH
+ {0xD6C8, 0x6FA7}, //13328 #CJK UNIFIED IDEOGRAPH
+ {0xD6C9, 0x79AE}, //13329 #CJK UNIFIED IDEOGRAPH
+ {0xD6CA, 0x91B4}, //13330 #CJK UNIFIED IDEOGRAPH
+ {0xD6CB, 0x96B7}, //13331 #CJK UNIFIED IDEOGRAPH
+ {0xD6CC, 0x52DE}, //13332 #CJK UNIFIED IDEOGRAPH
+ {0xD6CD, 0xF960}, //13333 #CJK COMPATIBILITY IDEOGRAPH
+ {0xD6CE, 0x6488}, //13334 #CJK UNIFIED IDEOGRAPH
+ {0xD6CF, 0x64C4}, //13335 #CJK UNIFIED IDEOGRAPH
+ {0xD6D0, 0x6AD3}, //13336 #CJK UNIFIED IDEOGRAPH
+ {0xD6D1, 0x6F5E}, //13337 #CJK UNIFIED IDEOGRAPH
+ {0xD6D2, 0x7018}, //13338 #CJK UNIFIED IDEOGRAPH
+ {0xD6D3, 0x7210}, //13339 #CJK UNIFIED IDEOGRAPH
+ {0xD6D4, 0x76E7}, //13340 #CJK UNIFIED IDEOGRAPH
+ {0xD6D5, 0x8001}, //13341 #CJK UNIFIED IDEOGRAPH
+ {0xD6D6, 0x8606}, //13342 #CJK UNIFIED IDEOGRAPH
+ {0xD6D7, 0x865C}, //13343 #CJK UNIFIED IDEOGRAPH
+ {0xD6D8, 0x8DEF}, //13344 #CJK UNIFIED IDEOGRAPH
+ {0xD6D9, 0x8F05}, //13345 #CJK UNIFIED IDEOGRAPH
+ {0xD6DA, 0x9732}, //13346 #CJK UNIFIED IDEOGRAPH
+ {0xD6DB, 0x9B6F}, //13347 #CJK UNIFIED IDEOGRAPH
+ {0xD6DC, 0x9DFA}, //13348 #CJK UNIFIED IDEOGRAPH
+ {0xD6DD, 0x9E75}, //13349 #CJK UNIFIED IDEOGRAPH
+ {0xD6DE, 0x788C}, //13350 #CJK UNIFIED IDEOGRAPH
+ {0xD6DF, 0x797F}, //13351 #CJK UNIFIED IDEOGRAPH
+ {0xD6E0, 0x7DA0}, //13352 #CJK UNIFIED IDEOGRAPH
+ {0xD6E1, 0x83C9}, //13353 #CJK UNIFIED IDEOGRAPH
+ {0xD6E2, 0x9304}, //13354 #CJK UNIFIED IDEOGRAPH
+ {0xD6E3, 0x9E7F}, //13355 #CJK UNIFIED IDEOGRAPH
+ {0xD6E4, 0x9E93}, //13356 #CJK UNIFIED IDEOGRAPH
+ {0xD6E5, 0x8AD6}, //13357 #CJK UNIFIED IDEOGRAPH
+ {0xD6E6, 0x58DF}, //13358 #CJK UNIFIED IDEOGRAPH
+ {0xD6E7, 0x5F04}, //13359 #CJK UNIFIED IDEOGRAPH
+ {0xD6E8, 0x6727}, //13360 #CJK UNIFIED IDEOGRAPH
+ {0xD6E9, 0x7027}, //13361 #CJK UNIFIED IDEOGRAPH
+ {0xD6EA, 0x74CF}, //13362 #CJK UNIFIED IDEOGRAPH
+ {0xD6EB, 0x7C60}, //13363 #CJK UNIFIED IDEOGRAPH
+ {0xD6EC, 0x807E}, //13364 #CJK UNIFIED IDEOGRAPH
+ {0xD6ED, 0x5121}, //13365 #CJK UNIFIED IDEOGRAPH
+ {0xD6EE, 0x7028}, //13366 #CJK UNIFIED IDEOGRAPH
+ {0xD6EF, 0x7262}, //13367 #CJK UNIFIED IDEOGRAPH
+ {0xD6F0, 0x78CA}, //13368 #CJK UNIFIED IDEOGRAPH
+ {0xD6F1, 0x8CC2}, //13369 #CJK UNIFIED IDEOGRAPH
+ {0xD6F2, 0x8CDA}, //13370 #CJK UNIFIED IDEOGRAPH
+ {0xD6F3, 0x8CF4}, //13371 #CJK UNIFIED IDEOGRAPH
+ {0xD6F4, 0x96F7}, //13372 #CJK UNIFIED IDEOGRAPH
+ {0xD6F5, 0x4E86}, //13373 #CJK UNIFIED IDEOGRAPH
+ {0xD6F6, 0x50DA}, //13374 #CJK UNIFIED IDEOGRAPH
+ {0xD6F7, 0x5BEE}, //13375 #CJK UNIFIED IDEOGRAPH
+ {0xD6F8, 0x5ED6}, //13376 #CJK UNIFIED IDEOGRAPH
+ {0xD6F9, 0x6599}, //13377 #CJK UNIFIED IDEOGRAPH
+ {0xD6FA, 0x71CE}, //13378 #CJK UNIFIED IDEOGRAPH
+ {0xD6FB, 0x7642}, //13379 #CJK UNIFIED IDEOGRAPH
+ {0xD6FC, 0x77AD}, //13380 #CJK UNIFIED IDEOGRAPH
+ {0xD6FD, 0x804A}, //13381 #CJK UNIFIED IDEOGRAPH
+ {0xD6FE, 0x84FC}, //13382 #CJK UNIFIED IDEOGRAPH
+ {0xD7A1, 0x907C}, //13383 #CJK UNIFIED IDEOGRAPH
+ {0xD7A2, 0x9B27}, //13384 #CJK UNIFIED IDEOGRAPH
+ {0xD7A3, 0x9F8D}, //13385 #CJK UNIFIED IDEOGRAPH
+ {0xD7A4, 0x58D8}, //13386 #CJK UNIFIED IDEOGRAPH
+ {0xD7A5, 0x5A41}, //13387 #CJK UNIFIED IDEOGRAPH
+ {0xD7A6, 0x5C62}, //13388 #CJK UNIFIED IDEOGRAPH
+ {0xD7A7, 0x6A13}, //13389 #CJK UNIFIED IDEOGRAPH
+ {0xD7A8, 0x6DDA}, //13390 #CJK UNIFIED IDEOGRAPH
+ {0xD7A9, 0x6F0F}, //13391 #CJK UNIFIED IDEOGRAPH
+ {0xD7AA, 0x763B}, //13392 #CJK UNIFIED IDEOGRAPH
+ {0xD7AB, 0x7D2F}, //13393 #CJK UNIFIED IDEOGRAPH
+ {0xD7AC, 0x7E37}, //13394 #CJK UNIFIED IDEOGRAPH
+ {0xD7AD, 0x851E}, //13395 #CJK UNIFIED IDEOGRAPH
+ {0xD7AE, 0x8938}, //13396 #CJK UNIFIED IDEOGRAPH
+ {0xD7AF, 0x93E4}, //13397 #CJK UNIFIED IDEOGRAPH
+ {0xD7B0, 0x964B}, //13398 #CJK UNIFIED IDEOGRAPH
+ {0xD7B1, 0x5289}, //13399 #CJK UNIFIED IDEOGRAPH
+ {0xD7B2, 0x65D2}, //13400 #CJK UNIFIED IDEOGRAPH
+ {0xD7B3, 0x67F3}, //13401 #CJK UNIFIED IDEOGRAPH
+ {0xD7B4, 0x69B4}, //13402 #CJK UNIFIED IDEOGRAPH
+ {0xD7B5, 0x6D41}, //13403 #CJK UNIFIED IDEOGRAPH
+ {0xD7B6, 0x6E9C}, //13404 #CJK UNIFIED IDEOGRAPH
+ {0xD7B7, 0x700F}, //13405 #CJK UNIFIED IDEOGRAPH
+ {0xD7B8, 0x7409}, //13406 #CJK UNIFIED IDEOGRAPH
+ {0xD7B9, 0x7460}, //13407 #CJK UNIFIED IDEOGRAPH
+ {0xD7BA, 0x7559}, //13408 #CJK UNIFIED IDEOGRAPH
+ {0xD7BB, 0x7624}, //13409 #CJK UNIFIED IDEOGRAPH
+ {0xD7BC, 0x786B}, //13410 #CJK UNIFIED IDEOGRAPH
+ {0xD7BD, 0x8B2C}, //13411 #CJK UNIFIED IDEOGRAPH
+ {0xD7BE, 0x985E}, //13412 #CJK UNIFIED IDEOGRAPH
+ {0xD7BF, 0x516D}, //13413 #CJK UNIFIED IDEOGRAPH
+ {0xD7C0, 0x622E}, //13414 #CJK UNIFIED IDEOGRAPH
+ {0xD7C1, 0x9678}, //13415 #CJK UNIFIED IDEOGRAPH
+ {0xD7C2, 0x4F96}, //13416 #CJK UNIFIED IDEOGRAPH
+ {0xD7C3, 0x502B}, //13417 #CJK UNIFIED IDEOGRAPH
+ {0xD7C4, 0x5D19}, //13418 #CJK UNIFIED IDEOGRAPH
+ {0xD7C5, 0x6DEA}, //13419 #CJK UNIFIED IDEOGRAPH
+ {0xD7C6, 0x7DB8}, //13420 #CJK UNIFIED IDEOGRAPH
+ {0xD7C7, 0x8F2A}, //13421 #CJK UNIFIED IDEOGRAPH
+ {0xD7C8, 0x5F8B}, //13422 #CJK UNIFIED IDEOGRAPH
+ {0xD7C9, 0x6144}, //13423 #CJK UNIFIED IDEOGRAPH
+ {0xD7CA, 0x6817}, //13424 #CJK UNIFIED IDEOGRAPH
+ {0xD7CB, 0xF961}, //13425 #CJK COMPATIBILITY IDEOGRAPH
+ {0xD7CC, 0x9686}, //13426 #CJK UNIFIED IDEOGRAPH
+ {0xD7CD, 0x52D2}, //13427 #CJK UNIFIED IDEOGRAPH
+ {0xD7CE, 0x808B}, //13428 #CJK UNIFIED IDEOGRAPH
+ {0xD7CF, 0x51DC}, //13429 #CJK UNIFIED IDEOGRAPH
+ {0xD7D0, 0x51CC}, //13430 #CJK UNIFIED IDEOGRAPH
+ {0xD7D1, 0x695E}, //13431 #CJK UNIFIED IDEOGRAPH
+ {0xD7D2, 0x7A1C}, //13432 #CJK UNIFIED IDEOGRAPH
+ {0xD7D3, 0x7DBE}, //13433 #CJK UNIFIED IDEOGRAPH
+ {0xD7D4, 0x83F1}, //13434 #CJK UNIFIED IDEOGRAPH
+ {0xD7D5, 0x9675}, //13435 #CJK UNIFIED IDEOGRAPH
+ {0xD7D6, 0x4FDA}, //13436 #CJK UNIFIED IDEOGRAPH
+ {0xD7D7, 0x5229}, //13437 #CJK UNIFIED IDEOGRAPH
+ {0xD7D8, 0x5398}, //13438 #CJK UNIFIED IDEOGRAPH
+ {0xD7D9, 0x540F}, //13439 #CJK UNIFIED IDEOGRAPH
+ {0xD7DA, 0x550E}, //13440 #CJK UNIFIED IDEOGRAPH
+ {0xD7DB, 0x5C65}, //13441 #CJK UNIFIED IDEOGRAPH
+ {0xD7DC, 0x60A7}, //13442 #CJK UNIFIED IDEOGRAPH
+ {0xD7DD, 0x674E}, //13443 #CJK UNIFIED IDEOGRAPH
+ {0xD7DE, 0x68A8}, //13444 #CJK UNIFIED IDEOGRAPH
+ {0xD7DF, 0x6D6C}, //13445 #CJK UNIFIED IDEOGRAPH
+ {0xD7E0, 0x7281}, //13446 #CJK UNIFIED IDEOGRAPH
+ {0xD7E1, 0x72F8}, //13447 #CJK UNIFIED IDEOGRAPH
+ {0xD7E2, 0x7406}, //13448 #CJK UNIFIED IDEOGRAPH
+ {0xD7E3, 0x7483}, //13449 #CJK UNIFIED IDEOGRAPH
+ {0xD7E4, 0xF962}, //13450 #CJK COMPATIBILITY IDEOGRAPH
+ {0xD7E5, 0x75E2}, //13451 #CJK UNIFIED IDEOGRAPH
+ {0xD7E6, 0x7C6C}, //13452 #CJK UNIFIED IDEOGRAPH
+ {0xD7E7, 0x7F79}, //13453 #CJK UNIFIED IDEOGRAPH
+ {0xD7E8, 0x7FB8}, //13454 #CJK UNIFIED IDEOGRAPH
+ {0xD7E9, 0x8389}, //13455 #CJK UNIFIED IDEOGRAPH
+ {0xD7EA, 0x88CF}, //13456 #CJK UNIFIED IDEOGRAPH
+ {0xD7EB, 0x88E1}, //13457 #CJK UNIFIED IDEOGRAPH
+ {0xD7EC, 0x91CC}, //13458 #CJK UNIFIED IDEOGRAPH
+ {0xD7ED, 0x91D0}, //13459 #CJK UNIFIED IDEOGRAPH
+ {0xD7EE, 0x96E2}, //13460 #CJK UNIFIED IDEOGRAPH
+ {0xD7EF, 0x9BC9}, //13461 #CJK UNIFIED IDEOGRAPH
+ {0xD7F0, 0x541D}, //13462 #CJK UNIFIED IDEOGRAPH
+ {0xD7F1, 0x6F7E}, //13463 #CJK UNIFIED IDEOGRAPH
+ {0xD7F2, 0x71D0}, //13464 #CJK UNIFIED IDEOGRAPH
+ {0xD7F3, 0x7498}, //13465 #CJK UNIFIED IDEOGRAPH
+ {0xD7F4, 0x85FA}, //13466 #CJK UNIFIED IDEOGRAPH
+ {0xD7F5, 0x8EAA}, //13467 #CJK UNIFIED IDEOGRAPH
+ {0xD7F6, 0x96A3}, //13468 #CJK UNIFIED IDEOGRAPH
+ {0xD7F7, 0x9C57}, //13469 #CJK UNIFIED IDEOGRAPH
+ {0xD7F8, 0x9E9F}, //13470 #CJK UNIFIED IDEOGRAPH
+ {0xD7F9, 0x6797}, //13471 #CJK UNIFIED IDEOGRAPH
+ {0xD7FA, 0x6DCB}, //13472 #CJK UNIFIED IDEOGRAPH
+ {0xD7FB, 0x7433}, //13473 #CJK UNIFIED IDEOGRAPH
+ {0xD7FC, 0x81E8}, //13474 #CJK UNIFIED IDEOGRAPH
+ {0xD7FD, 0x9716}, //13475 #CJK UNIFIED IDEOGRAPH
+ {0xD7FE, 0x782C}, //13476 #CJK UNIFIED IDEOGRAPH
+ {0xD8A1, 0x7ACB}, //13477 #CJK UNIFIED IDEOGRAPH
+ {0xD8A2, 0x7B20}, //13478 #CJK UNIFIED IDEOGRAPH
+ {0xD8A3, 0x7C92}, //13479 #CJK UNIFIED IDEOGRAPH
+ {0xD8A4, 0x6469}, //13480 #CJK UNIFIED IDEOGRAPH
+ {0xD8A5, 0x746A}, //13481 #CJK UNIFIED IDEOGRAPH
+ {0xD8A6, 0x75F2}, //13482 #CJK UNIFIED IDEOGRAPH
+ {0xD8A7, 0x78BC}, //13483 #CJK UNIFIED IDEOGRAPH
+ {0xD8A8, 0x78E8}, //13484 #CJK UNIFIED IDEOGRAPH
+ {0xD8A9, 0x99AC}, //13485 #CJK UNIFIED IDEOGRAPH
+ {0xD8AA, 0x9B54}, //13486 #CJK UNIFIED IDEOGRAPH
+ {0xD8AB, 0x9EBB}, //13487 #CJK UNIFIED IDEOGRAPH
+ {0xD8AC, 0x5BDE}, //13488 #CJK UNIFIED IDEOGRAPH
+ {0xD8AD, 0x5E55}, //13489 #CJK UNIFIED IDEOGRAPH
+ {0xD8AE, 0x6F20}, //13490 #CJK UNIFIED IDEOGRAPH
+ {0xD8AF, 0x819C}, //13491 #CJK UNIFIED IDEOGRAPH
+ {0xD8B0, 0x83AB}, //13492 #CJK UNIFIED IDEOGRAPH
+ {0xD8B1, 0x9088}, //13493 #CJK UNIFIED IDEOGRAPH
+ {0xD8B2, 0x4E07}, //13494 #CJK UNIFIED IDEOGRAPH
+ {0xD8B3, 0x534D}, //13495 #CJK UNIFIED IDEOGRAPH
+ {0xD8B4, 0x5A29}, //13496 #CJK UNIFIED IDEOGRAPH
+ {0xD8B5, 0x5DD2}, //13497 #CJK UNIFIED IDEOGRAPH
+ {0xD8B6, 0x5F4E}, //13498 #CJK UNIFIED IDEOGRAPH
+ {0xD8B7, 0x6162}, //13499 #CJK UNIFIED IDEOGRAPH
+ {0xD8B8, 0x633D}, //13500 #CJK UNIFIED IDEOGRAPH
+ {0xD8B9, 0x6669}, //13501 #CJK UNIFIED IDEOGRAPH
+ {0xD8BA, 0x66FC}, //13502 #CJK UNIFIED IDEOGRAPH
+ {0xD8BB, 0x6EFF}, //13503 #CJK UNIFIED IDEOGRAPH
+ {0xD8BC, 0x6F2B}, //13504 #CJK UNIFIED IDEOGRAPH
+ {0xD8BD, 0x7063}, //13505 #CJK UNIFIED IDEOGRAPH
+ {0xD8BE, 0x779E}, //13506 #CJK UNIFIED IDEOGRAPH
+ {0xD8BF, 0x842C}, //13507 #CJK UNIFIED IDEOGRAPH
+ {0xD8C0, 0x8513}, //13508 #CJK UNIFIED IDEOGRAPH
+ {0xD8C1, 0x883B}, //13509 #CJK UNIFIED IDEOGRAPH
+ {0xD8C2, 0x8F13}, //13510 #CJK UNIFIED IDEOGRAPH
+ {0xD8C3, 0x9945}, //13511 #CJK UNIFIED IDEOGRAPH
+ {0xD8C4, 0x9C3B}, //13512 #CJK UNIFIED IDEOGRAPH
+ {0xD8C5, 0x551C}, //13513 #CJK UNIFIED IDEOGRAPH
+ {0xD8C6, 0x62B9}, //13514 #CJK UNIFIED IDEOGRAPH
+ {0xD8C7, 0x672B}, //13515 #CJK UNIFIED IDEOGRAPH
+ {0xD8C8, 0x6CAB}, //13516 #CJK UNIFIED IDEOGRAPH
+ {0xD8C9, 0x8309}, //13517 #CJK UNIFIED IDEOGRAPH
+ {0xD8CA, 0x896A}, //13518 #CJK UNIFIED IDEOGRAPH
+ {0xD8CB, 0x977A}, //13519 #CJK UNIFIED IDEOGRAPH
+ {0xD8CC, 0x4EA1}, //13520 #CJK UNIFIED IDEOGRAPH
+ {0xD8CD, 0x5984}, //13521 #CJK UNIFIED IDEOGRAPH
+ {0xD8CE, 0x5FD8}, //13522 #CJK UNIFIED IDEOGRAPH
+ {0xD8CF, 0x5FD9}, //13523 #CJK UNIFIED IDEOGRAPH
+ {0xD8D0, 0x671B}, //13524 #CJK UNIFIED IDEOGRAPH
+ {0xD8D1, 0x7DB2}, //13525 #CJK UNIFIED IDEOGRAPH
+ {0xD8D2, 0x7F54}, //13526 #CJK UNIFIED IDEOGRAPH
+ {0xD8D3, 0x8292}, //13527 #CJK UNIFIED IDEOGRAPH
+ {0xD8D4, 0x832B}, //13528 #CJK UNIFIED IDEOGRAPH
+ {0xD8D5, 0x83BD}, //13529 #CJK UNIFIED IDEOGRAPH
+ {0xD8D6, 0x8F1E}, //13530 #CJK UNIFIED IDEOGRAPH
+ {0xD8D7, 0x9099}, //13531 #CJK UNIFIED IDEOGRAPH
+ {0xD8D8, 0x57CB}, //13532 #CJK UNIFIED IDEOGRAPH
+ {0xD8D9, 0x59B9}, //13533 #CJK UNIFIED IDEOGRAPH
+ {0xD8DA, 0x5A92}, //13534 #CJK UNIFIED IDEOGRAPH
+ {0xD8DB, 0x5BD0}, //13535 #CJK UNIFIED IDEOGRAPH
+ {0xD8DC, 0x6627}, //13536 #CJK UNIFIED IDEOGRAPH
+ {0xD8DD, 0x679A}, //13537 #CJK UNIFIED IDEOGRAPH
+ {0xD8DE, 0x6885}, //13538 #CJK UNIFIED IDEOGRAPH
+ {0xD8DF, 0x6BCF}, //13539 #CJK UNIFIED IDEOGRAPH
+ {0xD8E0, 0x7164}, //13540 #CJK UNIFIED IDEOGRAPH
+ {0xD8E1, 0x7F75}, //13541 #CJK UNIFIED IDEOGRAPH
+ {0xD8E2, 0x8CB7}, //13542 #CJK UNIFIED IDEOGRAPH
+ {0xD8E3, 0x8CE3}, //13543 #CJK UNIFIED IDEOGRAPH
+ {0xD8E4, 0x9081}, //13544 #CJK UNIFIED IDEOGRAPH
+ {0xD8E5, 0x9B45}, //13545 #CJK UNIFIED IDEOGRAPH
+ {0xD8E6, 0x8108}, //13546 #CJK UNIFIED IDEOGRAPH
+ {0xD8E7, 0x8C8A}, //13547 #CJK UNIFIED IDEOGRAPH
+ {0xD8E8, 0x964C}, //13548 #CJK UNIFIED IDEOGRAPH
+ {0xD8E9, 0x9A40}, //13549 #CJK UNIFIED IDEOGRAPH
+ {0xD8EA, 0x9EA5}, //13550 #CJK UNIFIED IDEOGRAPH
+ {0xD8EB, 0x5B5F}, //13551 #CJK UNIFIED IDEOGRAPH
+ {0xD8EC, 0x6C13}, //13552 #CJK UNIFIED IDEOGRAPH
+ {0xD8ED, 0x731B}, //13553 #CJK UNIFIED IDEOGRAPH
+ {0xD8EE, 0x76F2}, //13554 #CJK UNIFIED IDEOGRAPH
+ {0xD8EF, 0x76DF}, //13555 #CJK UNIFIED IDEOGRAPH
+ {0xD8F0, 0x840C}, //13556 #CJK UNIFIED IDEOGRAPH
+ {0xD8F1, 0x51AA}, //13557 #CJK UNIFIED IDEOGRAPH
+ {0xD8F2, 0x8993}, //13558 #CJK UNIFIED IDEOGRAPH
+ {0xD8F3, 0x514D}, //13559 #CJK UNIFIED IDEOGRAPH
+ {0xD8F4, 0x5195}, //13560 #CJK UNIFIED IDEOGRAPH
+ {0xD8F5, 0x52C9}, //13561 #CJK UNIFIED IDEOGRAPH
+ {0xD8F6, 0x68C9}, //13562 #CJK UNIFIED IDEOGRAPH
+ {0xD8F7, 0x6C94}, //13563 #CJK UNIFIED IDEOGRAPH
+ {0xD8F8, 0x7704}, //13564 #CJK UNIFIED IDEOGRAPH
+ {0xD8F9, 0x7720}, //13565 #CJK UNIFIED IDEOGRAPH
+ {0xD8FA, 0x7DBF}, //13566 #CJK UNIFIED IDEOGRAPH
+ {0xD8FB, 0x7DEC}, //13567 #CJK UNIFIED IDEOGRAPH
+ {0xD8FC, 0x9762}, //13568 #CJK UNIFIED IDEOGRAPH
+ {0xD8FD, 0x9EB5}, //13569 #CJK UNIFIED IDEOGRAPH
+ {0xD8FE, 0x6EC5}, //13570 #CJK UNIFIED IDEOGRAPH
+ {0xD9A1, 0x8511}, //13571 #CJK UNIFIED IDEOGRAPH
+ {0xD9A2, 0x51A5}, //13572 #CJK UNIFIED IDEOGRAPH
+ {0xD9A3, 0x540D}, //13573 #CJK UNIFIED IDEOGRAPH
+ {0xD9A4, 0x547D}, //13574 #CJK UNIFIED IDEOGRAPH
+ {0xD9A5, 0x660E}, //13575 #CJK UNIFIED IDEOGRAPH
+ {0xD9A6, 0x669D}, //13576 #CJK UNIFIED IDEOGRAPH
+ {0xD9A7, 0x6927}, //13577 #CJK UNIFIED IDEOGRAPH
+ {0xD9A8, 0x6E9F}, //13578 #CJK UNIFIED IDEOGRAPH
+ {0xD9A9, 0x76BF}, //13579 #CJK UNIFIED IDEOGRAPH
+ {0xD9AA, 0x7791}, //13580 #CJK UNIFIED IDEOGRAPH
+ {0xD9AB, 0x8317}, //13581 #CJK UNIFIED IDEOGRAPH
+ {0xD9AC, 0x84C2}, //13582 #CJK UNIFIED IDEOGRAPH
+ {0xD9AD, 0x879F}, //13583 #CJK UNIFIED IDEOGRAPH
+ {0xD9AE, 0x9169}, //13584 #CJK UNIFIED IDEOGRAPH
+ {0xD9AF, 0x9298}, //13585 #CJK UNIFIED IDEOGRAPH
+ {0xD9B0, 0x9CF4}, //13586 #CJK UNIFIED IDEOGRAPH
+ {0xD9B1, 0x8882}, //13587 #CJK UNIFIED IDEOGRAPH
+ {0xD9B2, 0x4FAE}, //13588 #CJK UNIFIED IDEOGRAPH
+ {0xD9B3, 0x5192}, //13589 #CJK UNIFIED IDEOGRAPH
+ {0xD9B4, 0x52DF}, //13590 #CJK UNIFIED IDEOGRAPH
+ {0xD9B5, 0x59C6}, //13591 #CJK UNIFIED IDEOGRAPH
+ {0xD9B6, 0x5E3D}, //13592 #CJK UNIFIED IDEOGRAPH
+ {0xD9B7, 0x6155}, //13593 #CJK UNIFIED IDEOGRAPH
+ {0xD9B8, 0x6478}, //13594 #CJK UNIFIED IDEOGRAPH
+ {0xD9B9, 0x6479}, //13595 #CJK UNIFIED IDEOGRAPH
+ {0xD9BA, 0x66AE}, //13596 #CJK UNIFIED IDEOGRAPH
+ {0xD9BB, 0x67D0}, //13597 #CJK UNIFIED IDEOGRAPH
+ {0xD9BC, 0x6A21}, //13598 #CJK UNIFIED IDEOGRAPH
+ {0xD9BD, 0x6BCD}, //13599 #CJK UNIFIED IDEOGRAPH
+ {0xD9BE, 0x6BDB}, //13600 #CJK UNIFIED IDEOGRAPH
+ {0xD9BF, 0x725F}, //13601 #CJK UNIFIED IDEOGRAPH
+ {0xD9C0, 0x7261}, //13602 #CJK UNIFIED IDEOGRAPH
+ {0xD9C1, 0x7441}, //13603 #CJK UNIFIED IDEOGRAPH
+ {0xD9C2, 0x7738}, //13604 #CJK UNIFIED IDEOGRAPH
+ {0xD9C3, 0x77DB}, //13605 #CJK UNIFIED IDEOGRAPH
+ {0xD9C4, 0x8017}, //13606 #CJK UNIFIED IDEOGRAPH
+ {0xD9C5, 0x82BC}, //13607 #CJK UNIFIED IDEOGRAPH
+ {0xD9C6, 0x8305}, //13608 #CJK UNIFIED IDEOGRAPH
+ {0xD9C7, 0x8B00}, //13609 #CJK UNIFIED IDEOGRAPH
+ {0xD9C8, 0x8B28}, //13610 #CJK UNIFIED IDEOGRAPH
+ {0xD9C9, 0x8C8C}, //13611 #CJK UNIFIED IDEOGRAPH
+ {0xD9CA, 0x6728}, //13612 #CJK UNIFIED IDEOGRAPH
+ {0xD9CB, 0x6C90}, //13613 #CJK UNIFIED IDEOGRAPH
+ {0xD9CC, 0x7267}, //13614 #CJK UNIFIED IDEOGRAPH
+ {0xD9CD, 0x76EE}, //13615 #CJK UNIFIED IDEOGRAPH
+ {0xD9CE, 0x7766}, //13616 #CJK UNIFIED IDEOGRAPH
+ {0xD9CF, 0x7A46}, //13617 #CJK UNIFIED IDEOGRAPH
+ {0xD9D0, 0x9DA9}, //13618 #CJK UNIFIED IDEOGRAPH
+ {0xD9D1, 0x6B7F}, //13619 #CJK UNIFIED IDEOGRAPH
+ {0xD9D2, 0x6C92}, //13620 #CJK UNIFIED IDEOGRAPH
+ {0xD9D3, 0x5922}, //13621 #CJK UNIFIED IDEOGRAPH
+ {0xD9D4, 0x6726}, //13622 #CJK UNIFIED IDEOGRAPH
+ {0xD9D5, 0x8499}, //13623 #CJK UNIFIED IDEOGRAPH
+ {0xD9D6, 0x536F}, //13624 #CJK UNIFIED IDEOGRAPH
+ {0xD9D7, 0x5893}, //13625 #CJK UNIFIED IDEOGRAPH
+ {0xD9D8, 0x5999}, //13626 #CJK UNIFIED IDEOGRAPH
+ {0xD9D9, 0x5EDF}, //13627 #CJK UNIFIED IDEOGRAPH
+ {0xD9DA, 0x63CF}, //13628 #CJK UNIFIED IDEOGRAPH
+ {0xD9DB, 0x6634}, //13629 #CJK UNIFIED IDEOGRAPH
+ {0xD9DC, 0x6773}, //13630 #CJK UNIFIED IDEOGRAPH
+ {0xD9DD, 0x6E3A}, //13631 #CJK UNIFIED IDEOGRAPH
+ {0xD9DE, 0x732B}, //13632 #CJK UNIFIED IDEOGRAPH
+ {0xD9DF, 0x7AD7}, //13633 #CJK UNIFIED IDEOGRAPH
+ {0xD9E0, 0x82D7}, //13634 #CJK UNIFIED IDEOGRAPH
+ {0xD9E1, 0x9328}, //13635 #CJK UNIFIED IDEOGRAPH
+ {0xD9E2, 0x52D9}, //13636 #CJK UNIFIED IDEOGRAPH
+ {0xD9E3, 0x5DEB}, //13637 #CJK UNIFIED IDEOGRAPH
+ {0xD9E4, 0x61AE}, //13638 #CJK UNIFIED IDEOGRAPH
+ {0xD9E5, 0x61CB}, //13639 #CJK UNIFIED IDEOGRAPH
+ {0xD9E6, 0x620A}, //13640 #CJK UNIFIED IDEOGRAPH
+ {0xD9E7, 0x62C7}, //13641 #CJK UNIFIED IDEOGRAPH
+ {0xD9E8, 0x64AB}, //13642 #CJK UNIFIED IDEOGRAPH
+ {0xD9E9, 0x65E0}, //13643 #CJK UNIFIED IDEOGRAPH
+ {0xD9EA, 0x6959}, //13644 #CJK UNIFIED IDEOGRAPH
+ {0xD9EB, 0x6B66}, //13645 #CJK UNIFIED IDEOGRAPH
+ {0xD9EC, 0x6BCB}, //13646 #CJK UNIFIED IDEOGRAPH
+ {0xD9ED, 0x7121}, //13647 #CJK UNIFIED IDEOGRAPH
+ {0xD9EE, 0x73F7}, //13648 #CJK UNIFIED IDEOGRAPH
+ {0xD9EF, 0x755D}, //13649 #CJK UNIFIED IDEOGRAPH
+ {0xD9F0, 0x7E46}, //13650 #CJK UNIFIED IDEOGRAPH
+ {0xD9F1, 0x821E}, //13651 #CJK UNIFIED IDEOGRAPH
+ {0xD9F2, 0x8302}, //13652 #CJK UNIFIED IDEOGRAPH
+ {0xD9F3, 0x856A}, //13653 #CJK UNIFIED IDEOGRAPH
+ {0xD9F4, 0x8AA3}, //13654 #CJK UNIFIED IDEOGRAPH
+ {0xD9F5, 0x8CBF}, //13655 #CJK UNIFIED IDEOGRAPH
+ {0xD9F6, 0x9727}, //13656 #CJK UNIFIED IDEOGRAPH
+ {0xD9F7, 0x9D61}, //13657 #CJK UNIFIED IDEOGRAPH
+ {0xD9F8, 0x58A8}, //13658 #CJK UNIFIED IDEOGRAPH
+ {0xD9F9, 0x9ED8}, //13659 #CJK UNIFIED IDEOGRAPH
+ {0xD9FA, 0x5011}, //13660 #CJK UNIFIED IDEOGRAPH
+ {0xD9FB, 0x520E}, //13661 #CJK UNIFIED IDEOGRAPH
+ {0xD9FC, 0x543B}, //13662 #CJK UNIFIED IDEOGRAPH
+ {0xD9FD, 0x554F}, //13663 #CJK UNIFIED IDEOGRAPH
+ {0xD9FE, 0x6587}, //13664 #CJK UNIFIED IDEOGRAPH
+ {0xDAA1, 0x6C76}, //13665 #CJK UNIFIED IDEOGRAPH
+ {0xDAA2, 0x7D0A}, //13666 #CJK UNIFIED IDEOGRAPH
+ {0xDAA3, 0x7D0B}, //13667 #CJK UNIFIED IDEOGRAPH
+ {0xDAA4, 0x805E}, //13668 #CJK UNIFIED IDEOGRAPH
+ {0xDAA5, 0x868A}, //13669 #CJK UNIFIED IDEOGRAPH
+ {0xDAA6, 0x9580}, //13670 #CJK UNIFIED IDEOGRAPH
+ {0xDAA7, 0x96EF}, //13671 #CJK UNIFIED IDEOGRAPH
+ {0xDAA8, 0x52FF}, //13672 #CJK UNIFIED IDEOGRAPH
+ {0xDAA9, 0x6C95}, //13673 #CJK UNIFIED IDEOGRAPH
+ {0xDAAA, 0x7269}, //13674 #CJK UNIFIED IDEOGRAPH
+ {0xDAAB, 0x5473}, //13675 #CJK UNIFIED IDEOGRAPH
+ {0xDAAC, 0x5A9A}, //13676 #CJK UNIFIED IDEOGRAPH
+ {0xDAAD, 0x5C3E}, //13677 #CJK UNIFIED IDEOGRAPH
+ {0xDAAE, 0x5D4B}, //13678 #CJK UNIFIED IDEOGRAPH
+ {0xDAAF, 0x5F4C}, //13679 #CJK UNIFIED IDEOGRAPH
+ {0xDAB0, 0x5FAE}, //13680 #CJK UNIFIED IDEOGRAPH
+ {0xDAB1, 0x672A}, //13681 #CJK UNIFIED IDEOGRAPH
+ {0xDAB2, 0x68B6}, //13682 #CJK UNIFIED IDEOGRAPH
+ {0xDAB3, 0x6963}, //13683 #CJK UNIFIED IDEOGRAPH
+ {0xDAB4, 0x6E3C}, //13684 #CJK UNIFIED IDEOGRAPH
+ {0xDAB5, 0x6E44}, //13685 #CJK UNIFIED IDEOGRAPH
+ {0xDAB6, 0x7709}, //13686 #CJK UNIFIED IDEOGRAPH
+ {0xDAB7, 0x7C73}, //13687 #CJK UNIFIED IDEOGRAPH
+ {0xDAB8, 0x7F8E}, //13688 #CJK UNIFIED IDEOGRAPH
+ {0xDAB9, 0x8587}, //13689 #CJK UNIFIED IDEOGRAPH
+ {0xDABA, 0x8B0E}, //13690 #CJK UNIFIED IDEOGRAPH
+ {0xDABB, 0x8FF7}, //13691 #CJK UNIFIED IDEOGRAPH
+ {0xDABC, 0x9761}, //13692 #CJK UNIFIED IDEOGRAPH
+ {0xDABD, 0x9EF4}, //13693 #CJK UNIFIED IDEOGRAPH
+ {0xDABE, 0x5CB7}, //13694 #CJK UNIFIED IDEOGRAPH
+ {0xDABF, 0x60B6}, //13695 #CJK UNIFIED IDEOGRAPH
+ {0xDAC0, 0x610D}, //13696 #CJK UNIFIED IDEOGRAPH
+ {0xDAC1, 0x61AB}, //13697 #CJK UNIFIED IDEOGRAPH
+ {0xDAC2, 0x654F}, //13698 #CJK UNIFIED IDEOGRAPH
+ {0xDAC3, 0x65FB}, //13699 #CJK UNIFIED IDEOGRAPH
+ {0xDAC4, 0x65FC}, //13700 #CJK UNIFIED IDEOGRAPH
+ {0xDAC5, 0x6C11}, //13701 #CJK UNIFIED IDEOGRAPH
+ {0xDAC6, 0x6CEF}, //13702 #CJK UNIFIED IDEOGRAPH
+ {0xDAC7, 0x739F}, //13703 #CJK UNIFIED IDEOGRAPH
+ {0xDAC8, 0x73C9}, //13704 #CJK UNIFIED IDEOGRAPH
+ {0xDAC9, 0x7DE1}, //13705 #CJK UNIFIED IDEOGRAPH
+ {0xDACA, 0x9594}, //13706 #CJK UNIFIED IDEOGRAPH
+ {0xDACB, 0x5BC6}, //13707 #CJK UNIFIED IDEOGRAPH
+ {0xDACC, 0x871C}, //13708 #CJK UNIFIED IDEOGRAPH
+ {0xDACD, 0x8B10}, //13709 #CJK UNIFIED IDEOGRAPH
+ {0xDACE, 0x525D}, //13710 #CJK UNIFIED IDEOGRAPH
+ {0xDACF, 0x535A}, //13711 #CJK UNIFIED IDEOGRAPH
+ {0xDAD0, 0x62CD}, //13712 #CJK UNIFIED IDEOGRAPH
+ {0xDAD1, 0x640F}, //13713 #CJK UNIFIED IDEOGRAPH
+ {0xDAD2, 0x64B2}, //13714 #CJK UNIFIED IDEOGRAPH
+ {0xDAD3, 0x6734}, //13715 #CJK UNIFIED IDEOGRAPH
+ {0xDAD4, 0x6A38}, //13716 #CJK UNIFIED IDEOGRAPH
+ {0xDAD5, 0x6CCA}, //13717 #CJK UNIFIED IDEOGRAPH
+ {0xDAD6, 0x73C0}, //13718 #CJK UNIFIED IDEOGRAPH
+ {0xDAD7, 0x749E}, //13719 #CJK UNIFIED IDEOGRAPH
+ {0xDAD8, 0x7B94}, //13720 #CJK UNIFIED IDEOGRAPH
+ {0xDAD9, 0x7C95}, //13721 #CJK UNIFIED IDEOGRAPH
+ {0xDADA, 0x7E1B}, //13722 #CJK UNIFIED IDEOGRAPH
+ {0xDADB, 0x818A}, //13723 #CJK UNIFIED IDEOGRAPH
+ {0xDADC, 0x8236}, //13724 #CJK UNIFIED IDEOGRAPH
+ {0xDADD, 0x8584}, //13725 #CJK UNIFIED IDEOGRAPH
+ {0xDADE, 0x8FEB}, //13726 #CJK UNIFIED IDEOGRAPH
+ {0xDADF, 0x96F9}, //13727 #CJK UNIFIED IDEOGRAPH
+ {0xDAE0, 0x99C1}, //13728 #CJK UNIFIED IDEOGRAPH
+ {0xDAE1, 0x4F34}, //13729 #CJK UNIFIED IDEOGRAPH
+ {0xDAE2, 0x534A}, //13730 #CJK UNIFIED IDEOGRAPH
+ {0xDAE3, 0x53CD}, //13731 #CJK UNIFIED IDEOGRAPH
+ {0xDAE4, 0x53DB}, //13732 #CJK UNIFIED IDEOGRAPH
+ {0xDAE5, 0x62CC}, //13733 #CJK UNIFIED IDEOGRAPH
+ {0xDAE6, 0x642C}, //13734 #CJK UNIFIED IDEOGRAPH
+ {0xDAE7, 0x6500}, //13735 #CJK UNIFIED IDEOGRAPH
+ {0xDAE8, 0x6591}, //13736 #CJK UNIFIED IDEOGRAPH
+ {0xDAE9, 0x69C3}, //13737 #CJK UNIFIED IDEOGRAPH
+ {0xDAEA, 0x6CEE}, //13738 #CJK UNIFIED IDEOGRAPH
+ {0xDAEB, 0x6F58}, //13739 #CJK UNIFIED IDEOGRAPH
+ {0xDAEC, 0x73ED}, //13740 #CJK UNIFIED IDEOGRAPH
+ {0xDAED, 0x7554}, //13741 #CJK UNIFIED IDEOGRAPH
+ {0xDAEE, 0x7622}, //13742 #CJK UNIFIED IDEOGRAPH
+ {0xDAEF, 0x76E4}, //13743 #CJK UNIFIED IDEOGRAPH
+ {0xDAF0, 0x76FC}, //13744 #CJK UNIFIED IDEOGRAPH
+ {0xDAF1, 0x78D0}, //13745 #CJK UNIFIED IDEOGRAPH
+ {0xDAF2, 0x78FB}, //13746 #CJK UNIFIED IDEOGRAPH
+ {0xDAF3, 0x792C}, //13747 #CJK UNIFIED IDEOGRAPH
+ {0xDAF4, 0x7D46}, //13748 #CJK UNIFIED IDEOGRAPH
+ {0xDAF5, 0x822C}, //13749 #CJK UNIFIED IDEOGRAPH
+ {0xDAF6, 0x87E0}, //13750 #CJK UNIFIED IDEOGRAPH
+ {0xDAF7, 0x8FD4}, //13751 #CJK UNIFIED IDEOGRAPH
+ {0xDAF8, 0x9812}, //13752 #CJK UNIFIED IDEOGRAPH
+ {0xDAF9, 0x98EF}, //13753 #CJK UNIFIED IDEOGRAPH
+ {0xDAFA, 0x52C3}, //13754 #CJK UNIFIED IDEOGRAPH
+ {0xDAFB, 0x62D4}, //13755 #CJK UNIFIED IDEOGRAPH
+ {0xDAFC, 0x64A5}, //13756 #CJK UNIFIED IDEOGRAPH
+ {0xDAFD, 0x6E24}, //13757 #CJK UNIFIED IDEOGRAPH
+ {0xDAFE, 0x6F51}, //13758 #CJK UNIFIED IDEOGRAPH
+ {0xDBA1, 0x767C}, //13759 #CJK UNIFIED IDEOGRAPH
+ {0xDBA2, 0x8DCB}, //13760 #CJK UNIFIED IDEOGRAPH
+ {0xDBA3, 0x91B1}, //13761 #CJK UNIFIED IDEOGRAPH
+ {0xDBA4, 0x9262}, //13762 #CJK UNIFIED IDEOGRAPH
+ {0xDBA5, 0x9AEE}, //13763 #CJK UNIFIED IDEOGRAPH
+ {0xDBA6, 0x9B43}, //13764 #CJK UNIFIED IDEOGRAPH
+ {0xDBA7, 0x5023}, //13765 #CJK UNIFIED IDEOGRAPH
+ {0xDBA8, 0x508D}, //13766 #CJK UNIFIED IDEOGRAPH
+ {0xDBA9, 0x574A}, //13767 #CJK UNIFIED IDEOGRAPH
+ {0xDBAA, 0x59A8}, //13768 #CJK UNIFIED IDEOGRAPH
+ {0xDBAB, 0x5C28}, //13769 #CJK UNIFIED IDEOGRAPH
+ {0xDBAC, 0x5E47}, //13770 #CJK UNIFIED IDEOGRAPH
+ {0xDBAD, 0x5F77}, //13771 #CJK UNIFIED IDEOGRAPH
+ {0xDBAE, 0x623F}, //13772 #CJK UNIFIED IDEOGRAPH
+ {0xDBAF, 0x653E}, //13773 #CJK UNIFIED IDEOGRAPH
+ {0xDBB0, 0x65B9}, //13774 #CJK UNIFIED IDEOGRAPH
+ {0xDBB1, 0x65C1}, //13775 #CJK UNIFIED IDEOGRAPH
+ {0xDBB2, 0x6609}, //13776 #CJK UNIFIED IDEOGRAPH
+ {0xDBB3, 0x678B}, //13777 #CJK UNIFIED IDEOGRAPH
+ {0xDBB4, 0x699C}, //13778 #CJK UNIFIED IDEOGRAPH
+ {0xDBB5, 0x6EC2}, //13779 #CJK UNIFIED IDEOGRAPH
+ {0xDBB6, 0x78C5}, //13780 #CJK UNIFIED IDEOGRAPH
+ {0xDBB7, 0x7D21}, //13781 #CJK UNIFIED IDEOGRAPH
+ {0xDBB8, 0x80AA}, //13782 #CJK UNIFIED IDEOGRAPH
+ {0xDBB9, 0x8180}, //13783 #CJK UNIFIED IDEOGRAPH
+ {0xDBBA, 0x822B}, //13784 #CJK UNIFIED IDEOGRAPH
+ {0xDBBB, 0x82B3}, //13785 #CJK UNIFIED IDEOGRAPH
+ {0xDBBC, 0x84A1}, //13786 #CJK UNIFIED IDEOGRAPH
+ {0xDBBD, 0x868C}, //13787 #CJK UNIFIED IDEOGRAPH
+ {0xDBBE, 0x8A2A}, //13788 #CJK UNIFIED IDEOGRAPH
+ {0xDBBF, 0x8B17}, //13789 #CJK UNIFIED IDEOGRAPH
+ {0xDBC0, 0x90A6}, //13790 #CJK UNIFIED IDEOGRAPH
+ {0xDBC1, 0x9632}, //13791 #CJK UNIFIED IDEOGRAPH
+ {0xDBC2, 0x9F90}, //13792 #CJK UNIFIED IDEOGRAPH
+ {0xDBC3, 0x500D}, //13793 #CJK UNIFIED IDEOGRAPH
+ {0xDBC4, 0x4FF3}, //13794 #CJK UNIFIED IDEOGRAPH
+ {0xDBC5, 0xF963}, //13795 #CJK COMPATIBILITY IDEOGRAPH
+ {0xDBC6, 0x57F9}, //13796 #CJK UNIFIED IDEOGRAPH
+ {0xDBC7, 0x5F98}, //13797 #CJK UNIFIED IDEOGRAPH
+ {0xDBC8, 0x62DC}, //13798 #CJK UNIFIED IDEOGRAPH
+ {0xDBC9, 0x6392}, //13799 #CJK UNIFIED IDEOGRAPH
+ {0xDBCA, 0x676F}, //13800 #CJK UNIFIED IDEOGRAPH
+ {0xDBCB, 0x6E43}, //13801 #CJK UNIFIED IDEOGRAPH
+ {0xDBCC, 0x7119}, //13802 #CJK UNIFIED IDEOGRAPH
+ {0xDBCD, 0x76C3}, //13803 #CJK UNIFIED IDEOGRAPH
+ {0xDBCE, 0x80CC}, //13804 #CJK UNIFIED IDEOGRAPH
+ {0xDBCF, 0x80DA}, //13805 #CJK UNIFIED IDEOGRAPH
+ {0xDBD0, 0x88F4}, //13806 #CJK UNIFIED IDEOGRAPH
+ {0xDBD1, 0x88F5}, //13807 #CJK UNIFIED IDEOGRAPH
+ {0xDBD2, 0x8919}, //13808 #CJK UNIFIED IDEOGRAPH
+ {0xDBD3, 0x8CE0}, //13809 #CJK UNIFIED IDEOGRAPH
+ {0xDBD4, 0x8F29}, //13810 #CJK UNIFIED IDEOGRAPH
+ {0xDBD5, 0x914D}, //13811 #CJK UNIFIED IDEOGRAPH
+ {0xDBD6, 0x966A}, //13812 #CJK UNIFIED IDEOGRAPH
+ {0xDBD7, 0x4F2F}, //13813 #CJK UNIFIED IDEOGRAPH
+ {0xDBD8, 0x4F70}, //13814 #CJK UNIFIED IDEOGRAPH
+ {0xDBD9, 0x5E1B}, //13815 #CJK UNIFIED IDEOGRAPH
+ {0xDBDA, 0x67CF}, //13816 #CJK UNIFIED IDEOGRAPH
+ {0xDBDB, 0x6822}, //13817 #CJK UNIFIED IDEOGRAPH
+ {0xDBDC, 0x767D}, //13818 #CJK UNIFIED IDEOGRAPH
+ {0xDBDD, 0x767E}, //13819 #CJK UNIFIED IDEOGRAPH
+ {0xDBDE, 0x9B44}, //13820 #CJK UNIFIED IDEOGRAPH
+ {0xDBDF, 0x5E61}, //13821 #CJK UNIFIED IDEOGRAPH
+ {0xDBE0, 0x6A0A}, //13822 #CJK UNIFIED IDEOGRAPH
+ {0xDBE1, 0x7169}, //13823 #CJK UNIFIED IDEOGRAPH
+ {0xDBE2, 0x71D4}, //13824 #CJK UNIFIED IDEOGRAPH
+ {0xDBE3, 0x756A}, //13825 #CJK UNIFIED IDEOGRAPH
+ {0xDBE4, 0xF964}, //13826 #CJK COMPATIBILITY IDEOGRAPH
+ {0xDBE5, 0x7E41}, //13827 #CJK UNIFIED IDEOGRAPH
+ {0xDBE6, 0x8543}, //13828 #CJK UNIFIED IDEOGRAPH
+ {0xDBE7, 0x85E9}, //13829 #CJK UNIFIED IDEOGRAPH
+ {0xDBE8, 0x98DC}, //13830 #CJK UNIFIED IDEOGRAPH
+ {0xDBE9, 0x4F10}, //13831 #CJK UNIFIED IDEOGRAPH
+ {0xDBEA, 0x7B4F}, //13832 #CJK UNIFIED IDEOGRAPH
+ {0xDBEB, 0x7F70}, //13833 #CJK UNIFIED IDEOGRAPH
+ {0xDBEC, 0x95A5}, //13834 #CJK UNIFIED IDEOGRAPH
+ {0xDBED, 0x51E1}, //13835 #CJK UNIFIED IDEOGRAPH
+ {0xDBEE, 0x5E06}, //13836 #CJK UNIFIED IDEOGRAPH
+ {0xDBEF, 0x68B5}, //13837 #CJK UNIFIED IDEOGRAPH
+ {0xDBF0, 0x6C3E}, //13838 #CJK UNIFIED IDEOGRAPH
+ {0xDBF1, 0x6C4E}, //13839 #CJK UNIFIED IDEOGRAPH
+ {0xDBF2, 0x6CDB}, //13840 #CJK UNIFIED IDEOGRAPH
+ {0xDBF3, 0x72AF}, //13841 #CJK UNIFIED IDEOGRAPH
+ {0xDBF4, 0x7BC4}, //13842 #CJK UNIFIED IDEOGRAPH
+ {0xDBF5, 0x8303}, //13843 #CJK UNIFIED IDEOGRAPH
+ {0xDBF6, 0x6CD5}, //13844 #CJK UNIFIED IDEOGRAPH
+ {0xDBF7, 0x743A}, //13845 #CJK UNIFIED IDEOGRAPH
+ {0xDBF8, 0x50FB}, //13846 #CJK UNIFIED IDEOGRAPH
+ {0xDBF9, 0x5288}, //13847 #CJK UNIFIED IDEOGRAPH
+ {0xDBFA, 0x58C1}, //13848 #CJK UNIFIED IDEOGRAPH
+ {0xDBFB, 0x64D8}, //13849 #CJK UNIFIED IDEOGRAPH
+ {0xDBFC, 0x6A97}, //13850 #CJK UNIFIED IDEOGRAPH
+ {0xDBFD, 0x74A7}, //13851 #CJK UNIFIED IDEOGRAPH
+ {0xDBFE, 0x7656}, //13852 #CJK UNIFIED IDEOGRAPH
+ {0xDCA1, 0x78A7}, //13853 #CJK UNIFIED IDEOGRAPH
+ {0xDCA2, 0x8617}, //13854 #CJK UNIFIED IDEOGRAPH
+ {0xDCA3, 0x95E2}, //13855 #CJK UNIFIED IDEOGRAPH
+ {0xDCA4, 0x9739}, //13856 #CJK UNIFIED IDEOGRAPH
+ {0xDCA5, 0xF965}, //13857 #CJK COMPATIBILITY IDEOGRAPH
+ {0xDCA6, 0x535E}, //13858 #CJK UNIFIED IDEOGRAPH
+ {0xDCA7, 0x5F01}, //13859 #CJK UNIFIED IDEOGRAPH
+ {0xDCA8, 0x8B8A}, //13860 #CJK UNIFIED IDEOGRAPH
+ {0xDCA9, 0x8FA8}, //13861 #CJK UNIFIED IDEOGRAPH
+ {0xDCAA, 0x8FAF}, //13862 #CJK UNIFIED IDEOGRAPH
+ {0xDCAB, 0x908A}, //13863 #CJK UNIFIED IDEOGRAPH
+ {0xDCAC, 0x5225}, //13864 #CJK UNIFIED IDEOGRAPH
+ {0xDCAD, 0x77A5}, //13865 #CJK UNIFIED IDEOGRAPH
+ {0xDCAE, 0x9C49}, //13866 #CJK UNIFIED IDEOGRAPH
+ {0xDCAF, 0x9F08}, //13867 #CJK UNIFIED IDEOGRAPH
+ {0xDCB0, 0x4E19}, //13868 #CJK UNIFIED IDEOGRAPH
+ {0xDCB1, 0x5002}, //13869 #CJK UNIFIED IDEOGRAPH
+ {0xDCB2, 0x5175}, //13870 #CJK UNIFIED IDEOGRAPH
+ {0xDCB3, 0x5C5B}, //13871 #CJK UNIFIED IDEOGRAPH
+ {0xDCB4, 0x5E77}, //13872 #CJK UNIFIED IDEOGRAPH
+ {0xDCB5, 0x661E}, //13873 #CJK UNIFIED IDEOGRAPH
+ {0xDCB6, 0x663A}, //13874 #CJK UNIFIED IDEOGRAPH
+ {0xDCB7, 0x67C4}, //13875 #CJK UNIFIED IDEOGRAPH
+ {0xDCB8, 0x68C5}, //13876 #CJK UNIFIED IDEOGRAPH
+ {0xDCB9, 0x70B3}, //13877 #CJK UNIFIED IDEOGRAPH
+ {0xDCBA, 0x7501}, //13878 #CJK UNIFIED IDEOGRAPH
+ {0xDCBB, 0x75C5}, //13879 #CJK UNIFIED IDEOGRAPH
+ {0xDCBC, 0x79C9}, //13880 #CJK UNIFIED IDEOGRAPH
+ {0xDCBD, 0x7ADD}, //13881 #CJK UNIFIED IDEOGRAPH
+ {0xDCBE, 0x8F27}, //13882 #CJK UNIFIED IDEOGRAPH
+ {0xDCBF, 0x9920}, //13883 #CJK UNIFIED IDEOGRAPH
+ {0xDCC0, 0x9A08}, //13884 #CJK UNIFIED IDEOGRAPH
+ {0xDCC1, 0x4FDD}, //13885 #CJK UNIFIED IDEOGRAPH
+ {0xDCC2, 0x5821}, //13886 #CJK UNIFIED IDEOGRAPH
+ {0xDCC3, 0x5831}, //13887 #CJK UNIFIED IDEOGRAPH
+ {0xDCC4, 0x5BF6}, //13888 #CJK UNIFIED IDEOGRAPH
+ {0xDCC5, 0x666E}, //13889 #CJK UNIFIED IDEOGRAPH
+ {0xDCC6, 0x6B65}, //13890 #CJK UNIFIED IDEOGRAPH
+ {0xDCC7, 0x6D11}, //13891 #CJK UNIFIED IDEOGRAPH
+ {0xDCC8, 0x6E7A}, //13892 #CJK UNIFIED IDEOGRAPH
+ {0xDCC9, 0x6F7D}, //13893 #CJK UNIFIED IDEOGRAPH
+ {0xDCCA, 0x73E4}, //13894 #CJK UNIFIED IDEOGRAPH
+ {0xDCCB, 0x752B}, //13895 #CJK UNIFIED IDEOGRAPH
+ {0xDCCC, 0x83E9}, //13896 #CJK UNIFIED IDEOGRAPH
+ {0xDCCD, 0x88DC}, //13897 #CJK UNIFIED IDEOGRAPH
+ {0xDCCE, 0x8913}, //13898 #CJK UNIFIED IDEOGRAPH
+ {0xDCCF, 0x8B5C}, //13899 #CJK UNIFIED IDEOGRAPH
+ {0xDCD0, 0x8F14}, //13900 #CJK UNIFIED IDEOGRAPH
+ {0xDCD1, 0x4F0F}, //13901 #CJK UNIFIED IDEOGRAPH
+ {0xDCD2, 0x50D5}, //13902 #CJK UNIFIED IDEOGRAPH
+ {0xDCD3, 0x5310}, //13903 #CJK UNIFIED IDEOGRAPH
+ {0xDCD4, 0x535C}, //13904 #CJK UNIFIED IDEOGRAPH
+ {0xDCD5, 0x5B93}, //13905 #CJK UNIFIED IDEOGRAPH
+ {0xDCD6, 0x5FA9}, //13906 #CJK UNIFIED IDEOGRAPH
+ {0xDCD7, 0x670D}, //13907 #CJK UNIFIED IDEOGRAPH
+ {0xDCD8, 0x798F}, //13908 #CJK UNIFIED IDEOGRAPH
+ {0xDCD9, 0x8179}, //13909 #CJK UNIFIED IDEOGRAPH
+ {0xDCDA, 0x832F}, //13910 #CJK UNIFIED IDEOGRAPH
+ {0xDCDB, 0x8514}, //13911 #CJK UNIFIED IDEOGRAPH
+ {0xDCDC, 0x8907}, //13912 #CJK UNIFIED IDEOGRAPH
+ {0xDCDD, 0x8986}, //13913 #CJK UNIFIED IDEOGRAPH
+ {0xDCDE, 0x8F39}, //13914 #CJK UNIFIED IDEOGRAPH
+ {0xDCDF, 0x8F3B}, //13915 #CJK UNIFIED IDEOGRAPH
+ {0xDCE0, 0x99A5}, //13916 #CJK UNIFIED IDEOGRAPH
+ {0xDCE1, 0x9C12}, //13917 #CJK UNIFIED IDEOGRAPH
+ {0xDCE2, 0x672C}, //13918 #CJK UNIFIED IDEOGRAPH
+ {0xDCE3, 0x4E76}, //13919 #CJK UNIFIED IDEOGRAPH
+ {0xDCE4, 0x4FF8}, //13920 #CJK UNIFIED IDEOGRAPH
+ {0xDCE5, 0x5949}, //13921 #CJK UNIFIED IDEOGRAPH
+ {0xDCE6, 0x5C01}, //13922 #CJK UNIFIED IDEOGRAPH
+ {0xDCE7, 0x5CEF}, //13923 #CJK UNIFIED IDEOGRAPH
+ {0xDCE8, 0x5CF0}, //13924 #CJK UNIFIED IDEOGRAPH
+ {0xDCE9, 0x6367}, //13925 #CJK UNIFIED IDEOGRAPH
+ {0xDCEA, 0x68D2}, //13926 #CJK UNIFIED IDEOGRAPH
+ {0xDCEB, 0x70FD}, //13927 #CJK UNIFIED IDEOGRAPH
+ {0xDCEC, 0x71A2}, //13928 #CJK UNIFIED IDEOGRAPH
+ {0xDCED, 0x742B}, //13929 #CJK UNIFIED IDEOGRAPH
+ {0xDCEE, 0x7E2B}, //13930 #CJK UNIFIED IDEOGRAPH
+ {0xDCEF, 0x84EC}, //13931 #CJK UNIFIED IDEOGRAPH
+ {0xDCF0, 0x8702}, //13932 #CJK UNIFIED IDEOGRAPH
+ {0xDCF1, 0x9022}, //13933 #CJK UNIFIED IDEOGRAPH
+ {0xDCF2, 0x92D2}, //13934 #CJK UNIFIED IDEOGRAPH
+ {0xDCF3, 0x9CF3}, //13935 #CJK UNIFIED IDEOGRAPH
+ {0xDCF4, 0x4E0D}, //13936 #CJK UNIFIED IDEOGRAPH
+ {0xDCF5, 0x4ED8}, //13937 #CJK UNIFIED IDEOGRAPH
+ {0xDCF6, 0x4FEF}, //13938 #CJK UNIFIED IDEOGRAPH
+ {0xDCF7, 0x5085}, //13939 #CJK UNIFIED IDEOGRAPH
+ {0xDCF8, 0x5256}, //13940 #CJK UNIFIED IDEOGRAPH
+ {0xDCF9, 0x526F}, //13941 #CJK UNIFIED IDEOGRAPH
+ {0xDCFA, 0x5426}, //13942 #CJK UNIFIED IDEOGRAPH
+ {0xDCFB, 0x5490}, //13943 #CJK UNIFIED IDEOGRAPH
+ {0xDCFC, 0x57E0}, //13944 #CJK UNIFIED IDEOGRAPH
+ {0xDCFD, 0x592B}, //13945 #CJK UNIFIED IDEOGRAPH
+ {0xDCFE, 0x5A66}, //13946 #CJK UNIFIED IDEOGRAPH
+ {0xDDA1, 0x5B5A}, //13947 #CJK UNIFIED IDEOGRAPH
+ {0xDDA2, 0x5B75}, //13948 #CJK UNIFIED IDEOGRAPH
+ {0xDDA3, 0x5BCC}, //13949 #CJK UNIFIED IDEOGRAPH
+ {0xDDA4, 0x5E9C}, //13950 #CJK UNIFIED IDEOGRAPH
+ {0xDDA5, 0xF966}, //13951 #CJK COMPATIBILITY IDEOGRAPH
+ {0xDDA6, 0x6276}, //13952 #CJK UNIFIED IDEOGRAPH
+ {0xDDA7, 0x6577}, //13953 #CJK UNIFIED IDEOGRAPH
+ {0xDDA8, 0x65A7}, //13954 #CJK UNIFIED IDEOGRAPH
+ {0xDDA9, 0x6D6E}, //13955 #CJK UNIFIED IDEOGRAPH
+ {0xDDAA, 0x6EA5}, //13956 #CJK UNIFIED IDEOGRAPH
+ {0xDDAB, 0x7236}, //13957 #CJK UNIFIED IDEOGRAPH
+ {0xDDAC, 0x7B26}, //13958 #CJK UNIFIED IDEOGRAPH
+ {0xDDAD, 0x7C3F}, //13959 #CJK UNIFIED IDEOGRAPH
+ {0xDDAE, 0x7F36}, //13960 #CJK UNIFIED IDEOGRAPH
+ {0xDDAF, 0x8150}, //13961 #CJK UNIFIED IDEOGRAPH
+ {0xDDB0, 0x8151}, //13962 #CJK UNIFIED IDEOGRAPH
+ {0xDDB1, 0x819A}, //13963 #CJK UNIFIED IDEOGRAPH
+ {0xDDB2, 0x8240}, //13964 #CJK UNIFIED IDEOGRAPH
+ {0xDDB3, 0x8299}, //13965 #CJK UNIFIED IDEOGRAPH
+ {0xDDB4, 0x83A9}, //13966 #CJK UNIFIED IDEOGRAPH
+ {0xDDB5, 0x8A03}, //13967 #CJK UNIFIED IDEOGRAPH
+ {0xDDB6, 0x8CA0}, //13968 #CJK UNIFIED IDEOGRAPH
+ {0xDDB7, 0x8CE6}, //13969 #CJK UNIFIED IDEOGRAPH
+ {0xDDB8, 0x8CFB}, //13970 #CJK UNIFIED IDEOGRAPH
+ {0xDDB9, 0x8D74}, //13971 #CJK UNIFIED IDEOGRAPH
+ {0xDDBA, 0x8DBA}, //13972 #CJK UNIFIED IDEOGRAPH
+ {0xDDBB, 0x90E8}, //13973 #CJK UNIFIED IDEOGRAPH
+ {0xDDBC, 0x91DC}, //13974 #CJK UNIFIED IDEOGRAPH
+ {0xDDBD, 0x961C}, //13975 #CJK UNIFIED IDEOGRAPH
+ {0xDDBE, 0x9644}, //13976 #CJK UNIFIED IDEOGRAPH
+ {0xDDBF, 0x99D9}, //13977 #CJK UNIFIED IDEOGRAPH
+ {0xDDC0, 0x9CE7}, //13978 #CJK UNIFIED IDEOGRAPH
+ {0xDDC1, 0x5317}, //13979 #CJK UNIFIED IDEOGRAPH
+ {0xDDC2, 0x5206}, //13980 #CJK UNIFIED IDEOGRAPH
+ {0xDDC3, 0x5429}, //13981 #CJK UNIFIED IDEOGRAPH
+ {0xDDC4, 0x5674}, //13982 #CJK UNIFIED IDEOGRAPH
+ {0xDDC5, 0x58B3}, //13983 #CJK UNIFIED IDEOGRAPH
+ {0xDDC6, 0x5954}, //13984 #CJK UNIFIED IDEOGRAPH
+ {0xDDC7, 0x596E}, //13985 #CJK UNIFIED IDEOGRAPH
+ {0xDDC8, 0x5FFF}, //13986 #CJK UNIFIED IDEOGRAPH
+ {0xDDC9, 0x61A4}, //13987 #CJK UNIFIED IDEOGRAPH
+ {0xDDCA, 0x626E}, //13988 #CJK UNIFIED IDEOGRAPH
+ {0xDDCB, 0x6610}, //13989 #CJK UNIFIED IDEOGRAPH
+ {0xDDCC, 0x6C7E}, //13990 #CJK UNIFIED IDEOGRAPH
+ {0xDDCD, 0x711A}, //13991 #CJK UNIFIED IDEOGRAPH
+ {0xDDCE, 0x76C6}, //13992 #CJK UNIFIED IDEOGRAPH
+ {0xDDCF, 0x7C89}, //13993 #CJK UNIFIED IDEOGRAPH
+ {0xDDD0, 0x7CDE}, //13994 #CJK UNIFIED IDEOGRAPH
+ {0xDDD1, 0x7D1B}, //13995 #CJK UNIFIED IDEOGRAPH
+ {0xDDD2, 0x82AC}, //13996 #CJK UNIFIED IDEOGRAPH
+ {0xDDD3, 0x8CC1}, //13997 #CJK UNIFIED IDEOGRAPH
+ {0xDDD4, 0x96F0}, //13998 #CJK UNIFIED IDEOGRAPH
+ {0xDDD5, 0xF967}, //13999 #CJK COMPATIBILITY IDEOGRAPH
+ {0xDDD6, 0x4F5B}, //14000 #CJK UNIFIED IDEOGRAPH
+ {0xDDD7, 0x5F17}, //14001 #CJK UNIFIED IDEOGRAPH
+ {0xDDD8, 0x5F7F}, //14002 #CJK UNIFIED IDEOGRAPH
+ {0xDDD9, 0x62C2}, //14003 #CJK UNIFIED IDEOGRAPH
+ {0xDDDA, 0x5D29}, //14004 #CJK UNIFIED IDEOGRAPH
+ {0xDDDB, 0x670B}, //14005 #CJK UNIFIED IDEOGRAPH
+ {0xDDDC, 0x68DA}, //14006 #CJK UNIFIED IDEOGRAPH
+ {0xDDDD, 0x787C}, //14007 #CJK UNIFIED IDEOGRAPH
+ {0xDDDE, 0x7E43}, //14008 #CJK UNIFIED IDEOGRAPH
+ {0xDDDF, 0x9D6C}, //14009 #CJK UNIFIED IDEOGRAPH
+ {0xDDE0, 0x4E15}, //14010 #CJK UNIFIED IDEOGRAPH
+ {0xDDE1, 0x5099}, //14011 #CJK UNIFIED IDEOGRAPH
+ {0xDDE2, 0x5315}, //14012 #CJK UNIFIED IDEOGRAPH
+ {0xDDE3, 0x532A}, //14013 #CJK UNIFIED IDEOGRAPH
+ {0xDDE4, 0x5351}, //14014 #CJK UNIFIED IDEOGRAPH
+ {0xDDE5, 0x5983}, //14015 #CJK UNIFIED IDEOGRAPH
+ {0xDDE6, 0x5A62}, //14016 #CJK UNIFIED IDEOGRAPH
+ {0xDDE7, 0x5E87}, //14017 #CJK UNIFIED IDEOGRAPH
+ {0xDDE8, 0x60B2}, //14018 #CJK UNIFIED IDEOGRAPH
+ {0xDDE9, 0x618A}, //14019 #CJK UNIFIED IDEOGRAPH
+ {0xDDEA, 0x6249}, //14020 #CJK UNIFIED IDEOGRAPH
+ {0xDDEB, 0x6279}, //14021 #CJK UNIFIED IDEOGRAPH
+ {0xDDEC, 0x6590}, //14022 #CJK UNIFIED IDEOGRAPH
+ {0xDDED, 0x6787}, //14023 #CJK UNIFIED IDEOGRAPH
+ {0xDDEE, 0x69A7}, //14024 #CJK UNIFIED IDEOGRAPH
+ {0xDDEF, 0x6BD4}, //14025 #CJK UNIFIED IDEOGRAPH
+ {0xDDF0, 0x6BD6}, //14026 #CJK UNIFIED IDEOGRAPH
+ {0xDDF1, 0x6BD7}, //14027 #CJK UNIFIED IDEOGRAPH
+ {0xDDF2, 0x6BD8}, //14028 #CJK UNIFIED IDEOGRAPH
+ {0xDDF3, 0x6CB8}, //14029 #CJK UNIFIED IDEOGRAPH
+ {0xDDF4, 0xF968}, //14030 #CJK COMPATIBILITY IDEOGRAPH
+ {0xDDF5, 0x7435}, //14031 #CJK UNIFIED IDEOGRAPH
+ {0xDDF6, 0x75FA}, //14032 #CJK UNIFIED IDEOGRAPH
+ {0xDDF7, 0x7812}, //14033 #CJK UNIFIED IDEOGRAPH
+ {0xDDF8, 0x7891}, //14034 #CJK UNIFIED IDEOGRAPH
+ {0xDDF9, 0x79D5}, //14035 #CJK UNIFIED IDEOGRAPH
+ {0xDDFA, 0x79D8}, //14036 #CJK UNIFIED IDEOGRAPH
+ {0xDDFB, 0x7C83}, //14037 #CJK UNIFIED IDEOGRAPH
+ {0xDDFC, 0x7DCB}, //14038 #CJK UNIFIED IDEOGRAPH
+ {0xDDFD, 0x7FE1}, //14039 #CJK UNIFIED IDEOGRAPH
+ {0xDDFE, 0x80A5}, //14040 #CJK UNIFIED IDEOGRAPH
+ {0xDEA1, 0x813E}, //14041 #CJK UNIFIED IDEOGRAPH
+ {0xDEA2, 0x81C2}, //14042 #CJK UNIFIED IDEOGRAPH
+ {0xDEA3, 0x83F2}, //14043 #CJK UNIFIED IDEOGRAPH
+ {0xDEA4, 0x871A}, //14044 #CJK UNIFIED IDEOGRAPH
+ {0xDEA5, 0x88E8}, //14045 #CJK UNIFIED IDEOGRAPH
+ {0xDEA6, 0x8AB9}, //14046 #CJK UNIFIED IDEOGRAPH
+ {0xDEA7, 0x8B6C}, //14047 #CJK UNIFIED IDEOGRAPH
+ {0xDEA8, 0x8CBB}, //14048 #CJK UNIFIED IDEOGRAPH
+ {0xDEA9, 0x9119}, //14049 #CJK UNIFIED IDEOGRAPH
+ {0xDEAA, 0x975E}, //14050 #CJK UNIFIED IDEOGRAPH
+ {0xDEAB, 0x98DB}, //14051 #CJK UNIFIED IDEOGRAPH
+ {0xDEAC, 0x9F3B}, //14052 #CJK UNIFIED IDEOGRAPH
+ {0xDEAD, 0x56AC}, //14053 #CJK UNIFIED IDEOGRAPH
+ {0xDEAE, 0x5B2A}, //14054 #CJK UNIFIED IDEOGRAPH
+ {0xDEAF, 0x5F6C}, //14055 #CJK UNIFIED IDEOGRAPH
+ {0xDEB0, 0x658C}, //14056 #CJK UNIFIED IDEOGRAPH
+ {0xDEB1, 0x6AB3}, //14057 #CJK UNIFIED IDEOGRAPH
+ {0xDEB2, 0x6BAF}, //14058 #CJK UNIFIED IDEOGRAPH
+ {0xDEB3, 0x6D5C}, //14059 #CJK UNIFIED IDEOGRAPH
+ {0xDEB4, 0x6FF1}, //14060 #CJK UNIFIED IDEOGRAPH
+ {0xDEB5, 0x7015}, //14061 #CJK UNIFIED IDEOGRAPH
+ {0xDEB6, 0x725D}, //14062 #CJK UNIFIED IDEOGRAPH
+ {0xDEB7, 0x73AD}, //14063 #CJK UNIFIED IDEOGRAPH
+ {0xDEB8, 0x8CA7}, //14064 #CJK UNIFIED IDEOGRAPH
+ {0xDEB9, 0x8CD3}, //14065 #CJK UNIFIED IDEOGRAPH
+ {0xDEBA, 0x983B}, //14066 #CJK UNIFIED IDEOGRAPH
+ {0xDEBB, 0x6191}, //14067 #CJK UNIFIED IDEOGRAPH
+ {0xDEBC, 0x6C37}, //14068 #CJK UNIFIED IDEOGRAPH
+ {0xDEBD, 0x8058}, //14069 #CJK UNIFIED IDEOGRAPH
+ {0xDEBE, 0x9A01}, //14070 #CJK UNIFIED IDEOGRAPH
+ {0xDEBF, 0x4E4D}, //14071 #CJK UNIFIED IDEOGRAPH
+ {0xDEC0, 0x4E8B}, //14072 #CJK UNIFIED IDEOGRAPH
+ {0xDEC1, 0x4E9B}, //14073 #CJK UNIFIED IDEOGRAPH
+ {0xDEC2, 0x4ED5}, //14074 #CJK UNIFIED IDEOGRAPH
+ {0xDEC3, 0x4F3A}, //14075 #CJK UNIFIED IDEOGRAPH
+ {0xDEC4, 0x4F3C}, //14076 #CJK UNIFIED IDEOGRAPH
+ {0xDEC5, 0x4F7F}, //14077 #CJK UNIFIED IDEOGRAPH
+ {0xDEC6, 0x4FDF}, //14078 #CJK UNIFIED IDEOGRAPH
+ {0xDEC7, 0x50FF}, //14079 #CJK UNIFIED IDEOGRAPH
+ {0xDEC8, 0x53F2}, //14080 #CJK UNIFIED IDEOGRAPH
+ {0xDEC9, 0x53F8}, //14081 #CJK UNIFIED IDEOGRAPH
+ {0xDECA, 0x5506}, //14082 #CJK UNIFIED IDEOGRAPH
+ {0xDECB, 0x55E3}, //14083 #CJK UNIFIED IDEOGRAPH
+ {0xDECC, 0x56DB}, //14084 #CJK UNIFIED IDEOGRAPH
+ {0xDECD, 0x58EB}, //14085 #CJK UNIFIED IDEOGRAPH
+ {0xDECE, 0x5962}, //14086 #CJK UNIFIED IDEOGRAPH
+ {0xDECF, 0x5A11}, //14087 #CJK UNIFIED IDEOGRAPH
+ {0xDED0, 0x5BEB}, //14088 #CJK UNIFIED IDEOGRAPH
+ {0xDED1, 0x5BFA}, //14089 #CJK UNIFIED IDEOGRAPH
+ {0xDED2, 0x5C04}, //14090 #CJK UNIFIED IDEOGRAPH
+ {0xDED3, 0x5DF3}, //14091 #CJK UNIFIED IDEOGRAPH
+ {0xDED4, 0x5E2B}, //14092 #CJK UNIFIED IDEOGRAPH
+ {0xDED5, 0x5F99}, //14093 #CJK UNIFIED IDEOGRAPH
+ {0xDED6, 0x601D}, //14094 #CJK UNIFIED IDEOGRAPH
+ {0xDED7, 0x6368}, //14095 #CJK UNIFIED IDEOGRAPH
+ {0xDED8, 0x659C}, //14096 #CJK UNIFIED IDEOGRAPH
+ {0xDED9, 0x65AF}, //14097 #CJK UNIFIED IDEOGRAPH
+ {0xDEDA, 0x67F6}, //14098 #CJK UNIFIED IDEOGRAPH
+ {0xDEDB, 0x67FB}, //14099 #CJK UNIFIED IDEOGRAPH
+ {0xDEDC, 0x68AD}, //14100 #CJK UNIFIED IDEOGRAPH
+ {0xDEDD, 0x6B7B}, //14101 #CJK UNIFIED IDEOGRAPH
+ {0xDEDE, 0x6C99}, //14102 #CJK UNIFIED IDEOGRAPH
+ {0xDEDF, 0x6CD7}, //14103 #CJK UNIFIED IDEOGRAPH
+ {0xDEE0, 0x6E23}, //14104 #CJK UNIFIED IDEOGRAPH
+ {0xDEE1, 0x7009}, //14105 #CJK UNIFIED IDEOGRAPH
+ {0xDEE2, 0x7345}, //14106 #CJK UNIFIED IDEOGRAPH
+ {0xDEE3, 0x7802}, //14107 #CJK UNIFIED IDEOGRAPH
+ {0xDEE4, 0x793E}, //14108 #CJK UNIFIED IDEOGRAPH
+ {0xDEE5, 0x7940}, //14109 #CJK UNIFIED IDEOGRAPH
+ {0xDEE6, 0x7960}, //14110 #CJK UNIFIED IDEOGRAPH
+ {0xDEE7, 0x79C1}, //14111 #CJK UNIFIED IDEOGRAPH
+ {0xDEE8, 0x7BE9}, //14112 #CJK UNIFIED IDEOGRAPH
+ {0xDEE9, 0x7D17}, //14113 #CJK UNIFIED IDEOGRAPH
+ {0xDEEA, 0x7D72}, //14114 #CJK UNIFIED IDEOGRAPH
+ {0xDEEB, 0x8086}, //14115 #CJK UNIFIED IDEOGRAPH
+ {0xDEEC, 0x820D}, //14116 #CJK UNIFIED IDEOGRAPH
+ {0xDEED, 0x838E}, //14117 #CJK UNIFIED IDEOGRAPH
+ {0xDEEE, 0x84D1}, //14118 #CJK UNIFIED IDEOGRAPH
+ {0xDEEF, 0x86C7}, //14119 #CJK UNIFIED IDEOGRAPH
+ {0xDEF0, 0x88DF}, //14120 #CJK UNIFIED IDEOGRAPH
+ {0xDEF1, 0x8A50}, //14121 #CJK UNIFIED IDEOGRAPH
+ {0xDEF2, 0x8A5E}, //14122 #CJK UNIFIED IDEOGRAPH
+ {0xDEF3, 0x8B1D}, //14123 #CJK UNIFIED IDEOGRAPH
+ {0xDEF4, 0x8CDC}, //14124 #CJK UNIFIED IDEOGRAPH
+ {0xDEF5, 0x8D66}, //14125 #CJK UNIFIED IDEOGRAPH
+ {0xDEF6, 0x8FAD}, //14126 #CJK UNIFIED IDEOGRAPH
+ {0xDEF7, 0x90AA}, //14127 #CJK UNIFIED IDEOGRAPH
+ {0xDEF8, 0x98FC}, //14128 #CJK UNIFIED IDEOGRAPH
+ {0xDEF9, 0x99DF}, //14129 #CJK UNIFIED IDEOGRAPH
+ {0xDEFA, 0x9E9D}, //14130 #CJK UNIFIED IDEOGRAPH
+ {0xDEFB, 0x524A}, //14131 #CJK UNIFIED IDEOGRAPH
+ {0xDEFC, 0xF969}, //14132 #CJK COMPATIBILITY IDEOGRAPH
+ {0xDEFD, 0x6714}, //14133 #CJK UNIFIED IDEOGRAPH
+ {0xDEFE, 0xF96A}, //14134 #CJK COMPATIBILITY IDEOGRAPH
+ {0xDFA1, 0x5098}, //14135 #CJK UNIFIED IDEOGRAPH
+ {0xDFA2, 0x522A}, //14136 #CJK UNIFIED IDEOGRAPH
+ {0xDFA3, 0x5C71}, //14137 #CJK UNIFIED IDEOGRAPH
+ {0xDFA4, 0x6563}, //14138 #CJK UNIFIED IDEOGRAPH
+ {0xDFA5, 0x6C55}, //14139 #CJK UNIFIED IDEOGRAPH
+ {0xDFA6, 0x73CA}, //14140 #CJK UNIFIED IDEOGRAPH
+ {0xDFA7, 0x7523}, //14141 #CJK UNIFIED IDEOGRAPH
+ {0xDFA8, 0x759D}, //14142 #CJK UNIFIED IDEOGRAPH
+ {0xDFA9, 0x7B97}, //14143 #CJK UNIFIED IDEOGRAPH
+ {0xDFAA, 0x849C}, //14144 #CJK UNIFIED IDEOGRAPH
+ {0xDFAB, 0x9178}, //14145 #CJK UNIFIED IDEOGRAPH
+ {0xDFAC, 0x9730}, //14146 #CJK UNIFIED IDEOGRAPH
+ {0xDFAD, 0x4E77}, //14147 #CJK UNIFIED IDEOGRAPH
+ {0xDFAE, 0x6492}, //14148 #CJK UNIFIED IDEOGRAPH
+ {0xDFAF, 0x6BBA}, //14149 #CJK UNIFIED IDEOGRAPH
+ {0xDFB0, 0x715E}, //14150 #CJK UNIFIED IDEOGRAPH
+ {0xDFB1, 0x85A9}, //14151 #CJK UNIFIED IDEOGRAPH
+ {0xDFB2, 0x4E09}, //14152 #CJK UNIFIED IDEOGRAPH
+ {0xDFB3, 0xF96B}, //14153 #CJK COMPATIBILITY IDEOGRAPH
+ {0xDFB4, 0x6749}, //14154 #CJK UNIFIED IDEOGRAPH
+ {0xDFB5, 0x68EE}, //14155 #CJK UNIFIED IDEOGRAPH
+ {0xDFB6, 0x6E17}, //14156 #CJK UNIFIED IDEOGRAPH
+ {0xDFB7, 0x829F}, //14157 #CJK UNIFIED IDEOGRAPH
+ {0xDFB8, 0x8518}, //14158 #CJK UNIFIED IDEOGRAPH
+ {0xDFB9, 0x886B}, //14159 #CJK UNIFIED IDEOGRAPH
+ {0xDFBA, 0x63F7}, //14160 #CJK UNIFIED IDEOGRAPH
+ {0xDFBB, 0x6F81}, //14161 #CJK UNIFIED IDEOGRAPH
+ {0xDFBC, 0x9212}, //14162 #CJK UNIFIED IDEOGRAPH
+ {0xDFBD, 0x98AF}, //14163 #CJK UNIFIED IDEOGRAPH
+ {0xDFBE, 0x4E0A}, //14164 #CJK UNIFIED IDEOGRAPH
+ {0xDFBF, 0x50B7}, //14165 #CJK UNIFIED IDEOGRAPH
+ {0xDFC0, 0x50CF}, //14166 #CJK UNIFIED IDEOGRAPH
+ {0xDFC1, 0x511F}, //14167 #CJK UNIFIED IDEOGRAPH
+ {0xDFC2, 0x5546}, //14168 #CJK UNIFIED IDEOGRAPH
+ {0xDFC3, 0x55AA}, //14169 #CJK UNIFIED IDEOGRAPH
+ {0xDFC4, 0x5617}, //14170 #CJK UNIFIED IDEOGRAPH
+ {0xDFC5, 0x5B40}, //14171 #CJK UNIFIED IDEOGRAPH
+ {0xDFC6, 0x5C19}, //14172 #CJK UNIFIED IDEOGRAPH
+ {0xDFC7, 0x5CE0}, //14173 #CJK UNIFIED IDEOGRAPH
+ {0xDFC8, 0x5E38}, //14174 #CJK UNIFIED IDEOGRAPH
+ {0xDFC9, 0x5E8A}, //14175 #CJK UNIFIED IDEOGRAPH
+ {0xDFCA, 0x5EA0}, //14176 #CJK UNIFIED IDEOGRAPH
+ {0xDFCB, 0x5EC2}, //14177 #CJK UNIFIED IDEOGRAPH
+ {0xDFCC, 0x60F3}, //14178 #CJK UNIFIED IDEOGRAPH
+ {0xDFCD, 0x6851}, //14179 #CJK UNIFIED IDEOGRAPH
+ {0xDFCE, 0x6A61}, //14180 #CJK UNIFIED IDEOGRAPH
+ {0xDFCF, 0x6E58}, //14181 #CJK UNIFIED IDEOGRAPH
+ {0xDFD0, 0x723D}, //14182 #CJK UNIFIED IDEOGRAPH
+ {0xDFD1, 0x7240}, //14183 #CJK UNIFIED IDEOGRAPH
+ {0xDFD2, 0x72C0}, //14184 #CJK UNIFIED IDEOGRAPH
+ {0xDFD3, 0x76F8}, //14185 #CJK UNIFIED IDEOGRAPH
+ {0xDFD4, 0x7965}, //14186 #CJK UNIFIED IDEOGRAPH
+ {0xDFD5, 0x7BB1}, //14187 #CJK UNIFIED IDEOGRAPH
+ {0xDFD6, 0x7FD4}, //14188 #CJK UNIFIED IDEOGRAPH
+ {0xDFD7, 0x88F3}, //14189 #CJK UNIFIED IDEOGRAPH
+ {0xDFD8, 0x89F4}, //14190 #CJK UNIFIED IDEOGRAPH
+ {0xDFD9, 0x8A73}, //14191 #CJK UNIFIED IDEOGRAPH
+ {0xDFDA, 0x8C61}, //14192 #CJK UNIFIED IDEOGRAPH
+ {0xDFDB, 0x8CDE}, //14193 #CJK UNIFIED IDEOGRAPH
+ {0xDFDC, 0x971C}, //14194 #CJK UNIFIED IDEOGRAPH
+ {0xDFDD, 0x585E}, //14195 #CJK UNIFIED IDEOGRAPH
+ {0xDFDE, 0x74BD}, //14196 #CJK UNIFIED IDEOGRAPH
+ {0xDFDF, 0x8CFD}, //14197 #CJK UNIFIED IDEOGRAPH
+ {0xDFE0, 0x55C7}, //14198 #CJK UNIFIED IDEOGRAPH
+ {0xDFE1, 0xF96C}, //14199 #CJK COMPATIBILITY IDEOGRAPH
+ {0xDFE2, 0x7A61}, //14200 #CJK UNIFIED IDEOGRAPH
+ {0xDFE3, 0x7D22}, //14201 #CJK UNIFIED IDEOGRAPH
+ {0xDFE4, 0x8272}, //14202 #CJK UNIFIED IDEOGRAPH
+ {0xDFE5, 0x7272}, //14203 #CJK UNIFIED IDEOGRAPH
+ {0xDFE6, 0x751F}, //14204 #CJK UNIFIED IDEOGRAPH
+ {0xDFE7, 0x7525}, //14205 #CJK UNIFIED IDEOGRAPH
+ {0xDFE8, 0xF96D}, //14206 #CJK COMPATIBILITY IDEOGRAPH
+ {0xDFE9, 0x7B19}, //14207 #CJK UNIFIED IDEOGRAPH
+ {0xDFEA, 0x5885}, //14208 #CJK UNIFIED IDEOGRAPH
+ {0xDFEB, 0x58FB}, //14209 #CJK UNIFIED IDEOGRAPH
+ {0xDFEC, 0x5DBC}, //14210 #CJK UNIFIED IDEOGRAPH
+ {0xDFED, 0x5E8F}, //14211 #CJK UNIFIED IDEOGRAPH
+ {0xDFEE, 0x5EB6}, //14212 #CJK UNIFIED IDEOGRAPH
+ {0xDFEF, 0x5F90}, //14213 #CJK UNIFIED IDEOGRAPH
+ {0xDFF0, 0x6055}, //14214 #CJK UNIFIED IDEOGRAPH
+ {0xDFF1, 0x6292}, //14215 #CJK UNIFIED IDEOGRAPH
+ {0xDFF2, 0x637F}, //14216 #CJK UNIFIED IDEOGRAPH
+ {0xDFF3, 0x654D}, //14217 #CJK UNIFIED IDEOGRAPH
+ {0xDFF4, 0x6691}, //14218 #CJK UNIFIED IDEOGRAPH
+ {0xDFF5, 0x66D9}, //14219 #CJK UNIFIED IDEOGRAPH
+ {0xDFF6, 0x66F8}, //14220 #CJK UNIFIED IDEOGRAPH
+ {0xDFF7, 0x6816}, //14221 #CJK UNIFIED IDEOGRAPH
+ {0xDFF8, 0x68F2}, //14222 #CJK UNIFIED IDEOGRAPH
+ {0xDFF9, 0x7280}, //14223 #CJK UNIFIED IDEOGRAPH
+ {0xDFFA, 0x745E}, //14224 #CJK UNIFIED IDEOGRAPH
+ {0xDFFB, 0x7B6E}, //14225 #CJK UNIFIED IDEOGRAPH
+ {0xDFFC, 0x7D6E}, //14226 #CJK UNIFIED IDEOGRAPH
+ {0xDFFD, 0x7DD6}, //14227 #CJK UNIFIED IDEOGRAPH
+ {0xDFFE, 0x7F72}, //14228 #CJK UNIFIED IDEOGRAPH
+ {0xE0A1, 0x80E5}, //14229 #CJK UNIFIED IDEOGRAPH
+ {0xE0A2, 0x8212}, //14230 #CJK UNIFIED IDEOGRAPH
+ {0xE0A3, 0x85AF}, //14231 #CJK UNIFIED IDEOGRAPH
+ {0xE0A4, 0x897F}, //14232 #CJK UNIFIED IDEOGRAPH
+ {0xE0A5, 0x8A93}, //14233 #CJK UNIFIED IDEOGRAPH
+ {0xE0A6, 0x901D}, //14234 #CJK UNIFIED IDEOGRAPH
+ {0xE0A7, 0x92E4}, //14235 #CJK UNIFIED IDEOGRAPH
+ {0xE0A8, 0x9ECD}, //14236 #CJK UNIFIED IDEOGRAPH
+ {0xE0A9, 0x9F20}, //14237 #CJK UNIFIED IDEOGRAPH
+ {0xE0AA, 0x5915}, //14238 #CJK UNIFIED IDEOGRAPH
+ {0xE0AB, 0x596D}, //14239 #CJK UNIFIED IDEOGRAPH
+ {0xE0AC, 0x5E2D}, //14240 #CJK UNIFIED IDEOGRAPH
+ {0xE0AD, 0x60DC}, //14241 #CJK UNIFIED IDEOGRAPH
+ {0xE0AE, 0x6614}, //14242 #CJK UNIFIED IDEOGRAPH
+ {0xE0AF, 0x6673}, //14243 #CJK UNIFIED IDEOGRAPH
+ {0xE0B0, 0x6790}, //14244 #CJK UNIFIED IDEOGRAPH
+ {0xE0B1, 0x6C50}, //14245 #CJK UNIFIED IDEOGRAPH
+ {0xE0B2, 0x6DC5}, //14246 #CJK UNIFIED IDEOGRAPH
+ {0xE0B3, 0x6F5F}, //14247 #CJK UNIFIED IDEOGRAPH
+ {0xE0B4, 0x77F3}, //14248 #CJK UNIFIED IDEOGRAPH
+ {0xE0B5, 0x78A9}, //14249 #CJK UNIFIED IDEOGRAPH
+ {0xE0B6, 0x84C6}, //14250 #CJK UNIFIED IDEOGRAPH
+ {0xE0B7, 0x91CB}, //14251 #CJK UNIFIED IDEOGRAPH
+ {0xE0B8, 0x932B}, //14252 #CJK UNIFIED IDEOGRAPH
+ {0xE0B9, 0x4ED9}, //14253 #CJK UNIFIED IDEOGRAPH
+ {0xE0BA, 0x50CA}, //14254 #CJK UNIFIED IDEOGRAPH
+ {0xE0BB, 0x5148}, //14255 #CJK UNIFIED IDEOGRAPH
+ {0xE0BC, 0x5584}, //14256 #CJK UNIFIED IDEOGRAPH
+ {0xE0BD, 0x5B0B}, //14257 #CJK UNIFIED IDEOGRAPH
+ {0xE0BE, 0x5BA3}, //14258 #CJK UNIFIED IDEOGRAPH
+ {0xE0BF, 0x6247}, //14259 #CJK UNIFIED IDEOGRAPH
+ {0xE0C0, 0x657E}, //14260 #CJK UNIFIED IDEOGRAPH
+ {0xE0C1, 0x65CB}, //14261 #CJK UNIFIED IDEOGRAPH
+ {0xE0C2, 0x6E32}, //14262 #CJK UNIFIED IDEOGRAPH
+ {0xE0C3, 0x717D}, //14263 #CJK UNIFIED IDEOGRAPH
+ {0xE0C4, 0x7401}, //14264 #CJK UNIFIED IDEOGRAPH
+ {0xE0C5, 0x7444}, //14265 #CJK UNIFIED IDEOGRAPH
+ {0xE0C6, 0x7487}, //14266 #CJK UNIFIED IDEOGRAPH
+ {0xE0C7, 0x74BF}, //14267 #CJK UNIFIED IDEOGRAPH
+ {0xE0C8, 0x766C}, //14268 #CJK UNIFIED IDEOGRAPH
+ {0xE0C9, 0x79AA}, //14269 #CJK UNIFIED IDEOGRAPH
+ {0xE0CA, 0x7DDA}, //14270 #CJK UNIFIED IDEOGRAPH
+ {0xE0CB, 0x7E55}, //14271 #CJK UNIFIED IDEOGRAPH
+ {0xE0CC, 0x7FA8}, //14272 #CJK UNIFIED IDEOGRAPH
+ {0xE0CD, 0x817A}, //14273 #CJK UNIFIED IDEOGRAPH
+ {0xE0CE, 0x81B3}, //14274 #CJK UNIFIED IDEOGRAPH
+ {0xE0CF, 0x8239}, //14275 #CJK UNIFIED IDEOGRAPH
+ {0xE0D0, 0x861A}, //14276 #CJK UNIFIED IDEOGRAPH
+ {0xE0D1, 0x87EC}, //14277 #CJK UNIFIED IDEOGRAPH
+ {0xE0D2, 0x8A75}, //14278 #CJK UNIFIED IDEOGRAPH
+ {0xE0D3, 0x8DE3}, //14279 #CJK UNIFIED IDEOGRAPH
+ {0xE0D4, 0x9078}, //14280 #CJK UNIFIED IDEOGRAPH
+ {0xE0D5, 0x9291}, //14281 #CJK UNIFIED IDEOGRAPH
+ {0xE0D6, 0x9425}, //14282 #CJK UNIFIED IDEOGRAPH
+ {0xE0D7, 0x994D}, //14283 #CJK UNIFIED IDEOGRAPH
+ {0xE0D8, 0x9BAE}, //14284 #CJK UNIFIED IDEOGRAPH
+ {0xE0D9, 0x5368}, //14285 #CJK UNIFIED IDEOGRAPH
+ {0xE0DA, 0x5C51}, //14286 #CJK UNIFIED IDEOGRAPH
+ {0xE0DB, 0x6954}, //14287 #CJK UNIFIED IDEOGRAPH
+ {0xE0DC, 0x6CC4}, //14288 #CJK UNIFIED IDEOGRAPH
+ {0xE0DD, 0x6D29}, //14289 #CJK UNIFIED IDEOGRAPH
+ {0xE0DE, 0x6E2B}, //14290 #CJK UNIFIED IDEOGRAPH
+ {0xE0DF, 0x820C}, //14291 #CJK UNIFIED IDEOGRAPH
+ {0xE0E0, 0x859B}, //14292 #CJK UNIFIED IDEOGRAPH
+ {0xE0E1, 0x893B}, //14293 #CJK UNIFIED IDEOGRAPH
+ {0xE0E2, 0x8A2D}, //14294 #CJK UNIFIED IDEOGRAPH
+ {0xE0E3, 0x8AAA}, //14295 #CJK UNIFIED IDEOGRAPH
+ {0xE0E4, 0x96EA}, //14296 #CJK UNIFIED IDEOGRAPH
+ {0xE0E5, 0x9F67}, //14297 #CJK UNIFIED IDEOGRAPH
+ {0xE0E6, 0x5261}, //14298 #CJK UNIFIED IDEOGRAPH
+ {0xE0E7, 0x66B9}, //14299 #CJK UNIFIED IDEOGRAPH
+ {0xE0E8, 0x6BB2}, //14300 #CJK UNIFIED IDEOGRAPH
+ {0xE0E9, 0x7E96}, //14301 #CJK UNIFIED IDEOGRAPH
+ {0xE0EA, 0x87FE}, //14302 #CJK UNIFIED IDEOGRAPH
+ {0xE0EB, 0x8D0D}, //14303 #CJK UNIFIED IDEOGRAPH
+ {0xE0EC, 0x9583}, //14304 #CJK UNIFIED IDEOGRAPH
+ {0xE0ED, 0x965D}, //14305 #CJK UNIFIED IDEOGRAPH
+ {0xE0EE, 0x651D}, //14306 #CJK UNIFIED IDEOGRAPH
+ {0xE0EF, 0x6D89}, //14307 #CJK UNIFIED IDEOGRAPH
+ {0xE0F0, 0x71EE}, //14308 #CJK UNIFIED IDEOGRAPH
+ {0xE0F1, 0xF96E}, //14309 #CJK COMPATIBILITY IDEOGRAPH
+ {0xE0F2, 0x57CE}, //14310 #CJK UNIFIED IDEOGRAPH
+ {0xE0F3, 0x59D3}, //14311 #CJK UNIFIED IDEOGRAPH
+ {0xE0F4, 0x5BAC}, //14312 #CJK UNIFIED IDEOGRAPH
+ {0xE0F5, 0x6027}, //14313 #CJK UNIFIED IDEOGRAPH
+ {0xE0F6, 0x60FA}, //14314 #CJK UNIFIED IDEOGRAPH
+ {0xE0F7, 0x6210}, //14315 #CJK UNIFIED IDEOGRAPH
+ {0xE0F8, 0x661F}, //14316 #CJK UNIFIED IDEOGRAPH
+ {0xE0F9, 0x665F}, //14317 #CJK UNIFIED IDEOGRAPH
+ {0xE0FA, 0x7329}, //14318 #CJK UNIFIED IDEOGRAPH
+ {0xE0FB, 0x73F9}, //14319 #CJK UNIFIED IDEOGRAPH
+ {0xE0FC, 0x76DB}, //14320 #CJK UNIFIED IDEOGRAPH
+ {0xE0FD, 0x7701}, //14321 #CJK UNIFIED IDEOGRAPH
+ {0xE0FE, 0x7B6C}, //14322 #CJK UNIFIED IDEOGRAPH
+ {0xE1A1, 0x8056}, //14323 #CJK UNIFIED IDEOGRAPH
+ {0xE1A2, 0x8072}, //14324 #CJK UNIFIED IDEOGRAPH
+ {0xE1A3, 0x8165}, //14325 #CJK UNIFIED IDEOGRAPH
+ {0xE1A4, 0x8AA0}, //14326 #CJK UNIFIED IDEOGRAPH
+ {0xE1A5, 0x9192}, //14327 #CJK UNIFIED IDEOGRAPH
+ {0xE1A6, 0x4E16}, //14328 #CJK UNIFIED IDEOGRAPH
+ {0xE1A7, 0x52E2}, //14329 #CJK UNIFIED IDEOGRAPH
+ {0xE1A8, 0x6B72}, //14330 #CJK UNIFIED IDEOGRAPH
+ {0xE1A9, 0x6D17}, //14331 #CJK UNIFIED IDEOGRAPH
+ {0xE1AA, 0x7A05}, //14332 #CJK UNIFIED IDEOGRAPH
+ {0xE1AB, 0x7B39}, //14333 #CJK UNIFIED IDEOGRAPH
+ {0xE1AC, 0x7D30}, //14334 #CJK UNIFIED IDEOGRAPH
+ {0xE1AD, 0xF96F}, //14335 #CJK COMPATIBILITY IDEOGRAPH
+ {0xE1AE, 0x8CB0}, //14336 #CJK UNIFIED IDEOGRAPH
+ {0xE1AF, 0x53EC}, //14337 #CJK UNIFIED IDEOGRAPH
+ {0xE1B0, 0x562F}, //14338 #CJK UNIFIED IDEOGRAPH
+ {0xE1B1, 0x5851}, //14339 #CJK UNIFIED IDEOGRAPH
+ {0xE1B2, 0x5BB5}, //14340 #CJK UNIFIED IDEOGRAPH
+ {0xE1B3, 0x5C0F}, //14341 #CJK UNIFIED IDEOGRAPH
+ {0xE1B4, 0x5C11}, //14342 #CJK UNIFIED IDEOGRAPH
+ {0xE1B5, 0x5DE2}, //14343 #CJK UNIFIED IDEOGRAPH
+ {0xE1B6, 0x6240}, //14344 #CJK UNIFIED IDEOGRAPH
+ {0xE1B7, 0x6383}, //14345 #CJK UNIFIED IDEOGRAPH
+ {0xE1B8, 0x6414}, //14346 #CJK UNIFIED IDEOGRAPH
+ {0xE1B9, 0x662D}, //14347 #CJK UNIFIED IDEOGRAPH
+ {0xE1BA, 0x68B3}, //14348 #CJK UNIFIED IDEOGRAPH
+ {0xE1BB, 0x6CBC}, //14349 #CJK UNIFIED IDEOGRAPH
+ {0xE1BC, 0x6D88}, //14350 #CJK UNIFIED IDEOGRAPH
+ {0xE1BD, 0x6EAF}, //14351 #CJK UNIFIED IDEOGRAPH
+ {0xE1BE, 0x701F}, //14352 #CJK UNIFIED IDEOGRAPH
+ {0xE1BF, 0x70A4}, //14353 #CJK UNIFIED IDEOGRAPH
+ {0xE1C0, 0x71D2}, //14354 #CJK UNIFIED IDEOGRAPH
+ {0xE1C1, 0x7526}, //14355 #CJK UNIFIED IDEOGRAPH
+ {0xE1C2, 0x758F}, //14356 #CJK UNIFIED IDEOGRAPH
+ {0xE1C3, 0x758E}, //14357 #CJK UNIFIED IDEOGRAPH
+ {0xE1C4, 0x7619}, //14358 #CJK UNIFIED IDEOGRAPH
+ {0xE1C5, 0x7B11}, //14359 #CJK UNIFIED IDEOGRAPH
+ {0xE1C6, 0x7BE0}, //14360 #CJK UNIFIED IDEOGRAPH
+ {0xE1C7, 0x7C2B}, //14361 #CJK UNIFIED IDEOGRAPH
+ {0xE1C8, 0x7D20}, //14362 #CJK UNIFIED IDEOGRAPH
+ {0xE1C9, 0x7D39}, //14363 #CJK UNIFIED IDEOGRAPH
+ {0xE1CA, 0x852C}, //14364 #CJK UNIFIED IDEOGRAPH
+ {0xE1CB, 0x856D}, //14365 #CJK UNIFIED IDEOGRAPH
+ {0xE1CC, 0x8607}, //14366 #CJK UNIFIED IDEOGRAPH
+ {0xE1CD, 0x8A34}, //14367 #CJK UNIFIED IDEOGRAPH
+ {0xE1CE, 0x900D}, //14368 #CJK UNIFIED IDEOGRAPH
+ {0xE1CF, 0x9061}, //14369 #CJK UNIFIED IDEOGRAPH
+ {0xE1D0, 0x90B5}, //14370 #CJK UNIFIED IDEOGRAPH
+ {0xE1D1, 0x92B7}, //14371 #CJK UNIFIED IDEOGRAPH
+ {0xE1D2, 0x97F6}, //14372 #CJK UNIFIED IDEOGRAPH
+ {0xE1D3, 0x9A37}, //14373 #CJK UNIFIED IDEOGRAPH
+ {0xE1D4, 0x4FD7}, //14374 #CJK UNIFIED IDEOGRAPH
+ {0xE1D5, 0x5C6C}, //14375 #CJK UNIFIED IDEOGRAPH
+ {0xE1D6, 0x675F}, //14376 #CJK UNIFIED IDEOGRAPH
+ {0xE1D7, 0x6D91}, //14377 #CJK UNIFIED IDEOGRAPH
+ {0xE1D8, 0x7C9F}, //14378 #CJK UNIFIED IDEOGRAPH
+ {0xE1D9, 0x7E8C}, //14379 #CJK UNIFIED IDEOGRAPH
+ {0xE1DA, 0x8B16}, //14380 #CJK UNIFIED IDEOGRAPH
+ {0xE1DB, 0x8D16}, //14381 #CJK UNIFIED IDEOGRAPH
+ {0xE1DC, 0x901F}, //14382 #CJK UNIFIED IDEOGRAPH
+ {0xE1DD, 0x5B6B}, //14383 #CJK UNIFIED IDEOGRAPH
+ {0xE1DE, 0x5DFD}, //14384 #CJK UNIFIED IDEOGRAPH
+ {0xE1DF, 0x640D}, //14385 #CJK UNIFIED IDEOGRAPH
+ {0xE1E0, 0x84C0}, //14386 #CJK UNIFIED IDEOGRAPH
+ {0xE1E1, 0x905C}, //14387 #CJK UNIFIED IDEOGRAPH
+ {0xE1E2, 0x98E1}, //14388 #CJK UNIFIED IDEOGRAPH
+ {0xE1E3, 0x7387}, //14389 #CJK UNIFIED IDEOGRAPH
+ {0xE1E4, 0x5B8B}, //14390 #CJK UNIFIED IDEOGRAPH
+ {0xE1E5, 0x609A}, //14391 #CJK UNIFIED IDEOGRAPH
+ {0xE1E6, 0x677E}, //14392 #CJK UNIFIED IDEOGRAPH
+ {0xE1E7, 0x6DDE}, //14393 #CJK UNIFIED IDEOGRAPH
+ {0xE1E8, 0x8A1F}, //14394 #CJK UNIFIED IDEOGRAPH
+ {0xE1E9, 0x8AA6}, //14395 #CJK UNIFIED IDEOGRAPH
+ {0xE1EA, 0x9001}, //14396 #CJK UNIFIED IDEOGRAPH
+ {0xE1EB, 0x980C}, //14397 #CJK UNIFIED IDEOGRAPH
+ {0xE1EC, 0x5237}, //14398 #CJK UNIFIED IDEOGRAPH
+ {0xE1ED, 0xF970}, //14399 #CJK COMPATIBILITY IDEOGRAPH
+ {0xE1EE, 0x7051}, //14400 #CJK UNIFIED IDEOGRAPH
+ {0xE1EF, 0x788E}, //14401 #CJK UNIFIED IDEOGRAPH
+ {0xE1F0, 0x9396}, //14402 #CJK UNIFIED IDEOGRAPH
+ {0xE1F1, 0x8870}, //14403 #CJK UNIFIED IDEOGRAPH
+ {0xE1F2, 0x91D7}, //14404 #CJK UNIFIED IDEOGRAPH
+ {0xE1F3, 0x4FEE}, //14405 #CJK UNIFIED IDEOGRAPH
+ {0xE1F4, 0x53D7}, //14406 #CJK UNIFIED IDEOGRAPH
+ {0xE1F5, 0x55FD}, //14407 #CJK UNIFIED IDEOGRAPH
+ {0xE1F6, 0x56DA}, //14408 #CJK UNIFIED IDEOGRAPH
+ {0xE1F7, 0x5782}, //14409 #CJK UNIFIED IDEOGRAPH
+ {0xE1F8, 0x58FD}, //14410 #CJK UNIFIED IDEOGRAPH
+ {0xE1F9, 0x5AC2}, //14411 #CJK UNIFIED IDEOGRAPH
+ {0xE1FA, 0x5B88}, //14412 #CJK UNIFIED IDEOGRAPH
+ {0xE1FB, 0x5CAB}, //14413 #CJK UNIFIED IDEOGRAPH
+ {0xE1FC, 0x5CC0}, //14414 #CJK UNIFIED IDEOGRAPH
+ {0xE1FD, 0x5E25}, //14415 #CJK UNIFIED IDEOGRAPH
+ {0xE1FE, 0x6101}, //14416 #CJK UNIFIED IDEOGRAPH
+ {0xE2A1, 0x620D}, //14417 #CJK UNIFIED IDEOGRAPH
+ {0xE2A2, 0x624B}, //14418 #CJK UNIFIED IDEOGRAPH
+ {0xE2A3, 0x6388}, //14419 #CJK UNIFIED IDEOGRAPH
+ {0xE2A4, 0x641C}, //14420 #CJK UNIFIED IDEOGRAPH
+ {0xE2A5, 0x6536}, //14421 #CJK UNIFIED IDEOGRAPH
+ {0xE2A6, 0x6578}, //14422 #CJK UNIFIED IDEOGRAPH
+ {0xE2A7, 0x6A39}, //14423 #CJK UNIFIED IDEOGRAPH
+ {0xE2A8, 0x6B8A}, //14424 #CJK UNIFIED IDEOGRAPH
+ {0xE2A9, 0x6C34}, //14425 #CJK UNIFIED IDEOGRAPH
+ {0xE2AA, 0x6D19}, //14426 #CJK UNIFIED IDEOGRAPH
+ {0xE2AB, 0x6F31}, //14427 #CJK UNIFIED IDEOGRAPH
+ {0xE2AC, 0x71E7}, //14428 #CJK UNIFIED IDEOGRAPH
+ {0xE2AD, 0x72E9}, //14429 #CJK UNIFIED IDEOGRAPH
+ {0xE2AE, 0x7378}, //14430 #CJK UNIFIED IDEOGRAPH
+ {0xE2AF, 0x7407}, //14431 #CJK UNIFIED IDEOGRAPH
+ {0xE2B0, 0x74B2}, //14432 #CJK UNIFIED IDEOGRAPH
+ {0xE2B1, 0x7626}, //14433 #CJK UNIFIED IDEOGRAPH
+ {0xE2B2, 0x7761}, //14434 #CJK UNIFIED IDEOGRAPH
+ {0xE2B3, 0x79C0}, //14435 #CJK UNIFIED IDEOGRAPH
+ {0xE2B4, 0x7A57}, //14436 #CJK UNIFIED IDEOGRAPH
+ {0xE2B5, 0x7AEA}, //14437 #CJK UNIFIED IDEOGRAPH
+ {0xE2B6, 0x7CB9}, //14438 #CJK UNIFIED IDEOGRAPH
+ {0xE2B7, 0x7D8F}, //14439 #CJK UNIFIED IDEOGRAPH
+ {0xE2B8, 0x7DAC}, //14440 #CJK UNIFIED IDEOGRAPH
+ {0xE2B9, 0x7E61}, //14441 #CJK UNIFIED IDEOGRAPH
+ {0xE2BA, 0x7F9E}, //14442 #CJK UNIFIED IDEOGRAPH
+ {0xE2BB, 0x8129}, //14443 #CJK UNIFIED IDEOGRAPH
+ {0xE2BC, 0x8331}, //14444 #CJK UNIFIED IDEOGRAPH
+ {0xE2BD, 0x8490}, //14445 #CJK UNIFIED IDEOGRAPH
+ {0xE2BE, 0x84DA}, //14446 #CJK UNIFIED IDEOGRAPH
+ {0xE2BF, 0x85EA}, //14447 #CJK UNIFIED IDEOGRAPH
+ {0xE2C0, 0x8896}, //14448 #CJK UNIFIED IDEOGRAPH
+ {0xE2C1, 0x8AB0}, //14449 #CJK UNIFIED IDEOGRAPH
+ {0xE2C2, 0x8B90}, //14450 #CJK UNIFIED IDEOGRAPH
+ {0xE2C3, 0x8F38}, //14451 #CJK UNIFIED IDEOGRAPH
+ {0xE2C4, 0x9042}, //14452 #CJK UNIFIED IDEOGRAPH
+ {0xE2C5, 0x9083}, //14453 #CJK UNIFIED IDEOGRAPH
+ {0xE2C6, 0x916C}, //14454 #CJK UNIFIED IDEOGRAPH
+ {0xE2C7, 0x9296}, //14455 #CJK UNIFIED IDEOGRAPH
+ {0xE2C8, 0x92B9}, //14456 #CJK UNIFIED IDEOGRAPH
+ {0xE2C9, 0x968B}, //14457 #CJK UNIFIED IDEOGRAPH
+ {0xE2CA, 0x96A7}, //14458 #CJK UNIFIED IDEOGRAPH
+ {0xE2CB, 0x96A8}, //14459 #CJK UNIFIED IDEOGRAPH
+ {0xE2CC, 0x96D6}, //14460 #CJK UNIFIED IDEOGRAPH
+ {0xE2CD, 0x9700}, //14461 #CJK UNIFIED IDEOGRAPH
+ {0xE2CE, 0x9808}, //14462 #CJK UNIFIED IDEOGRAPH
+ {0xE2CF, 0x9996}, //14463 #CJK UNIFIED IDEOGRAPH
+ {0xE2D0, 0x9AD3}, //14464 #CJK UNIFIED IDEOGRAPH
+ {0xE2D1, 0x9B1A}, //14465 #CJK UNIFIED IDEOGRAPH
+ {0xE2D2, 0x53D4}, //14466 #CJK UNIFIED IDEOGRAPH
+ {0xE2D3, 0x587E}, //14467 #CJK UNIFIED IDEOGRAPH
+ {0xE2D4, 0x5919}, //14468 #CJK UNIFIED IDEOGRAPH
+ {0xE2D5, 0x5B70}, //14469 #CJK UNIFIED IDEOGRAPH
+ {0xE2D6, 0x5BBF}, //14470 #CJK UNIFIED IDEOGRAPH
+ {0xE2D7, 0x6DD1}, //14471 #CJK UNIFIED IDEOGRAPH
+ {0xE2D8, 0x6F5A}, //14472 #CJK UNIFIED IDEOGRAPH
+ {0xE2D9, 0x719F}, //14473 #CJK UNIFIED IDEOGRAPH
+ {0xE2DA, 0x7421}, //14474 #CJK UNIFIED IDEOGRAPH
+ {0xE2DB, 0x74B9}, //14475 #CJK UNIFIED IDEOGRAPH
+ {0xE2DC, 0x8085}, //14476 #CJK UNIFIED IDEOGRAPH
+ {0xE2DD, 0x83FD}, //14477 #CJK UNIFIED IDEOGRAPH
+ {0xE2DE, 0x5DE1}, //14478 #CJK UNIFIED IDEOGRAPH
+ {0xE2DF, 0x5F87}, //14479 #CJK UNIFIED IDEOGRAPH
+ {0xE2E0, 0x5FAA}, //14480 #CJK UNIFIED IDEOGRAPH
+ {0xE2E1, 0x6042}, //14481 #CJK UNIFIED IDEOGRAPH
+ {0xE2E2, 0x65EC}, //14482 #CJK UNIFIED IDEOGRAPH
+ {0xE2E3, 0x6812}, //14483 #CJK UNIFIED IDEOGRAPH
+ {0xE2E4, 0x696F}, //14484 #CJK UNIFIED IDEOGRAPH
+ {0xE2E5, 0x6A53}, //14485 #CJK UNIFIED IDEOGRAPH
+ {0xE2E6, 0x6B89}, //14486 #CJK UNIFIED IDEOGRAPH
+ {0xE2E7, 0x6D35}, //14487 #CJK UNIFIED IDEOGRAPH
+ {0xE2E8, 0x6DF3}, //14488 #CJK UNIFIED IDEOGRAPH
+ {0xE2E9, 0x73E3}, //14489 #CJK UNIFIED IDEOGRAPH
+ {0xE2EA, 0x76FE}, //14490 #CJK UNIFIED IDEOGRAPH
+ {0xE2EB, 0x77AC}, //14491 #CJK UNIFIED IDEOGRAPH
+ {0xE2EC, 0x7B4D}, //14492 #CJK UNIFIED IDEOGRAPH
+ {0xE2ED, 0x7D14}, //14493 #CJK UNIFIED IDEOGRAPH
+ {0xE2EE, 0x8123}, //14494 #CJK UNIFIED IDEOGRAPH
+ {0xE2EF, 0x821C}, //14495 #CJK UNIFIED IDEOGRAPH
+ {0xE2F0, 0x8340}, //14496 #CJK UNIFIED IDEOGRAPH
+ {0xE2F1, 0x84F4}, //14497 #CJK UNIFIED IDEOGRAPH
+ {0xE2F2, 0x8563}, //14498 #CJK UNIFIED IDEOGRAPH
+ {0xE2F3, 0x8A62}, //14499 #CJK UNIFIED IDEOGRAPH
+ {0xE2F4, 0x8AC4}, //14500 #CJK UNIFIED IDEOGRAPH
+ {0xE2F5, 0x9187}, //14501 #CJK UNIFIED IDEOGRAPH
+ {0xE2F6, 0x931E}, //14502 #CJK UNIFIED IDEOGRAPH
+ {0xE2F7, 0x9806}, //14503 #CJK UNIFIED IDEOGRAPH
+ {0xE2F8, 0x99B4}, //14504 #CJK UNIFIED IDEOGRAPH
+ {0xE2F9, 0x620C}, //14505 #CJK UNIFIED IDEOGRAPH
+ {0xE2FA, 0x8853}, //14506 #CJK UNIFIED IDEOGRAPH
+ {0xE2FB, 0x8FF0}, //14507 #CJK UNIFIED IDEOGRAPH
+ {0xE2FC, 0x9265}, //14508 #CJK UNIFIED IDEOGRAPH
+ {0xE2FD, 0x5D07}, //14509 #CJK UNIFIED IDEOGRAPH
+ {0xE2FE, 0x5D27}, //14510 #CJK UNIFIED IDEOGRAPH
+ {0xE3A1, 0x5D69}, //14511 #CJK UNIFIED IDEOGRAPH
+ {0xE3A2, 0x745F}, //14512 #CJK UNIFIED IDEOGRAPH
+ {0xE3A3, 0x819D}, //14513 #CJK UNIFIED IDEOGRAPH
+ {0xE3A4, 0x8768}, //14514 #CJK UNIFIED IDEOGRAPH
+ {0xE3A5, 0x6FD5}, //14515 #CJK UNIFIED IDEOGRAPH
+ {0xE3A6, 0x62FE}, //14516 #CJK UNIFIED IDEOGRAPH
+ {0xE3A7, 0x7FD2}, //14517 #CJK UNIFIED IDEOGRAPH
+ {0xE3A8, 0x8936}, //14518 #CJK UNIFIED IDEOGRAPH
+ {0xE3A9, 0x8972}, //14519 #CJK UNIFIED IDEOGRAPH
+ {0xE3AA, 0x4E1E}, //14520 #CJK UNIFIED IDEOGRAPH
+ {0xE3AB, 0x4E58}, //14521 #CJK UNIFIED IDEOGRAPH
+ {0xE3AC, 0x50E7}, //14522 #CJK UNIFIED IDEOGRAPH
+ {0xE3AD, 0x52DD}, //14523 #CJK UNIFIED IDEOGRAPH
+ {0xE3AE, 0x5347}, //14524 #CJK UNIFIED IDEOGRAPH
+ {0xE3AF, 0x627F}, //14525 #CJK UNIFIED IDEOGRAPH
+ {0xE3B0, 0x6607}, //14526 #CJK UNIFIED IDEOGRAPH
+ {0xE3B1, 0x7E69}, //14527 #CJK UNIFIED IDEOGRAPH
+ {0xE3B2, 0x8805}, //14528 #CJK UNIFIED IDEOGRAPH
+ {0xE3B3, 0x965E}, //14529 #CJK UNIFIED IDEOGRAPH
+ {0xE3B4, 0x4F8D}, //14530 #CJK UNIFIED IDEOGRAPH
+ {0xE3B5, 0x5319}, //14531 #CJK UNIFIED IDEOGRAPH
+ {0xE3B6, 0x5636}, //14532 #CJK UNIFIED IDEOGRAPH
+ {0xE3B7, 0x59CB}, //14533 #CJK UNIFIED IDEOGRAPH
+ {0xE3B8, 0x5AA4}, //14534 #CJK UNIFIED IDEOGRAPH
+ {0xE3B9, 0x5C38}, //14535 #CJK UNIFIED IDEOGRAPH
+ {0xE3BA, 0x5C4E}, //14536 #CJK UNIFIED IDEOGRAPH
+ {0xE3BB, 0x5C4D}, //14537 #CJK UNIFIED IDEOGRAPH
+ {0xE3BC, 0x5E02}, //14538 #CJK UNIFIED IDEOGRAPH
+ {0xE3BD, 0x5F11}, //14539 #CJK UNIFIED IDEOGRAPH
+ {0xE3BE, 0x6043}, //14540 #CJK UNIFIED IDEOGRAPH
+ {0xE3BF, 0x65BD}, //14541 #CJK UNIFIED IDEOGRAPH
+ {0xE3C0, 0x662F}, //14542 #CJK UNIFIED IDEOGRAPH
+ {0xE3C1, 0x6642}, //14543 #CJK UNIFIED IDEOGRAPH
+ {0xE3C2, 0x67BE}, //14544 #CJK UNIFIED IDEOGRAPH
+ {0xE3C3, 0x67F4}, //14545 #CJK UNIFIED IDEOGRAPH
+ {0xE3C4, 0x731C}, //14546 #CJK UNIFIED IDEOGRAPH
+ {0xE3C5, 0x77E2}, //14547 #CJK UNIFIED IDEOGRAPH
+ {0xE3C6, 0x793A}, //14548 #CJK UNIFIED IDEOGRAPH
+ {0xE3C7, 0x7FC5}, //14549 #CJK UNIFIED IDEOGRAPH
+ {0xE3C8, 0x8494}, //14550 #CJK UNIFIED IDEOGRAPH
+ {0xE3C9, 0x84CD}, //14551 #CJK UNIFIED IDEOGRAPH
+ {0xE3CA, 0x8996}, //14552 #CJK UNIFIED IDEOGRAPH
+ {0xE3CB, 0x8A66}, //14553 #CJK UNIFIED IDEOGRAPH
+ {0xE3CC, 0x8A69}, //14554 #CJK UNIFIED IDEOGRAPH
+ {0xE3CD, 0x8AE1}, //14555 #CJK UNIFIED IDEOGRAPH
+ {0xE3CE, 0x8C55}, //14556 #CJK UNIFIED IDEOGRAPH
+ {0xE3CF, 0x8C7A}, //14557 #CJK UNIFIED IDEOGRAPH
+ {0xE3D0, 0x57F4}, //14558 #CJK UNIFIED IDEOGRAPH
+ {0xE3D1, 0x5BD4}, //14559 #CJK UNIFIED IDEOGRAPH
+ {0xE3D2, 0x5F0F}, //14560 #CJK UNIFIED IDEOGRAPH
+ {0xE3D3, 0x606F}, //14561 #CJK UNIFIED IDEOGRAPH
+ {0xE3D4, 0x62ED}, //14562 #CJK UNIFIED IDEOGRAPH
+ {0xE3D5, 0x690D}, //14563 #CJK UNIFIED IDEOGRAPH
+ {0xE3D6, 0x6B96}, //14564 #CJK UNIFIED IDEOGRAPH
+ {0xE3D7, 0x6E5C}, //14565 #CJK UNIFIED IDEOGRAPH
+ {0xE3D8, 0x7184}, //14566 #CJK UNIFIED IDEOGRAPH
+ {0xE3D9, 0x7BD2}, //14567 #CJK UNIFIED IDEOGRAPH
+ {0xE3DA, 0x8755}, //14568 #CJK UNIFIED IDEOGRAPH
+ {0xE3DB, 0x8B58}, //14569 #CJK UNIFIED IDEOGRAPH
+ {0xE3DC, 0x8EFE}, //14570 #CJK UNIFIED IDEOGRAPH
+ {0xE3DD, 0x98DF}, //14571 #CJK UNIFIED IDEOGRAPH
+ {0xE3DE, 0x98FE}, //14572 #CJK UNIFIED IDEOGRAPH
+ {0xE3DF, 0x4F38}, //14573 #CJK UNIFIED IDEOGRAPH
+ {0xE3E0, 0x4F81}, //14574 #CJK UNIFIED IDEOGRAPH
+ {0xE3E1, 0x4FE1}, //14575 #CJK UNIFIED IDEOGRAPH
+ {0xE3E2, 0x547B}, //14576 #CJK UNIFIED IDEOGRAPH
+ {0xE3E3, 0x5A20}, //14577 #CJK UNIFIED IDEOGRAPH
+ {0xE3E4, 0x5BB8}, //14578 #CJK UNIFIED IDEOGRAPH
+ {0xE3E5, 0x613C}, //14579 #CJK UNIFIED IDEOGRAPH
+ {0xE3E6, 0x65B0}, //14580 #CJK UNIFIED IDEOGRAPH
+ {0xE3E7, 0x6668}, //14581 #CJK UNIFIED IDEOGRAPH
+ {0xE3E8, 0x71FC}, //14582 #CJK UNIFIED IDEOGRAPH
+ {0xE3E9, 0x7533}, //14583 #CJK UNIFIED IDEOGRAPH
+ {0xE3EA, 0x795E}, //14584 #CJK UNIFIED IDEOGRAPH
+ {0xE3EB, 0x7D33}, //14585 #CJK UNIFIED IDEOGRAPH
+ {0xE3EC, 0x814E}, //14586 #CJK UNIFIED IDEOGRAPH
+ {0xE3ED, 0x81E3}, //14587 #CJK UNIFIED IDEOGRAPH
+ {0xE3EE, 0x8398}, //14588 #CJK UNIFIED IDEOGRAPH
+ {0xE3EF, 0x85AA}, //14589 #CJK UNIFIED IDEOGRAPH
+ {0xE3F0, 0x85CE}, //14590 #CJK UNIFIED IDEOGRAPH
+ {0xE3F1, 0x8703}, //14591 #CJK UNIFIED IDEOGRAPH
+ {0xE3F2, 0x8A0A}, //14592 #CJK UNIFIED IDEOGRAPH
+ {0xE3F3, 0x8EAB}, //14593 #CJK UNIFIED IDEOGRAPH
+ {0xE3F4, 0x8F9B}, //14594 #CJK UNIFIED IDEOGRAPH
+ {0xE3F5, 0xF971}, //14595 #CJK COMPATIBILITY IDEOGRAPH
+ {0xE3F6, 0x8FC5}, //14596 #CJK UNIFIED IDEOGRAPH
+ {0xE3F7, 0x5931}, //14597 #CJK UNIFIED IDEOGRAPH
+ {0xE3F8, 0x5BA4}, //14598 #CJK UNIFIED IDEOGRAPH
+ {0xE3F9, 0x5BE6}, //14599 #CJK UNIFIED IDEOGRAPH
+ {0xE3FA, 0x6089}, //14600 #CJK UNIFIED IDEOGRAPH
+ {0xE3FB, 0x5BE9}, //14601 #CJK UNIFIED IDEOGRAPH
+ {0xE3FC, 0x5C0B}, //14602 #CJK UNIFIED IDEOGRAPH
+ {0xE3FD, 0x5FC3}, //14603 #CJK UNIFIED IDEOGRAPH
+ {0xE3FE, 0x6C81}, //14604 #CJK UNIFIED IDEOGRAPH
+ {0xE4A1, 0xF972}, //14605 #CJK COMPATIBILITY IDEOGRAPH
+ {0xE4A2, 0x6DF1}, //14606 #CJK UNIFIED IDEOGRAPH
+ {0xE4A3, 0x700B}, //14607 #CJK UNIFIED IDEOGRAPH
+ {0xE4A4, 0x751A}, //14608 #CJK UNIFIED IDEOGRAPH
+ {0xE4A5, 0x82AF}, //14609 #CJK UNIFIED IDEOGRAPH
+ {0xE4A6, 0x8AF6}, //14610 #CJK UNIFIED IDEOGRAPH
+ {0xE4A7, 0x4EC0}, //14611 #CJK UNIFIED IDEOGRAPH
+ {0xE4A8, 0x5341}, //14612 #CJK UNIFIED IDEOGRAPH
+ {0xE4A9, 0xF973}, //14613 #CJK COMPATIBILITY IDEOGRAPH
+ {0xE4AA, 0x96D9}, //14614 #CJK UNIFIED IDEOGRAPH
+ {0xE4AB, 0x6C0F}, //14615 #CJK UNIFIED IDEOGRAPH
+ {0xE4AC, 0x4E9E}, //14616 #CJK UNIFIED IDEOGRAPH
+ {0xE4AD, 0x4FC4}, //14617 #CJK UNIFIED IDEOGRAPH
+ {0xE4AE, 0x5152}, //14618 #CJK UNIFIED IDEOGRAPH
+ {0xE4AF, 0x555E}, //14619 #CJK UNIFIED IDEOGRAPH
+ {0xE4B0, 0x5A25}, //14620 #CJK UNIFIED IDEOGRAPH
+ {0xE4B1, 0x5CE8}, //14621 #CJK UNIFIED IDEOGRAPH
+ {0xE4B2, 0x6211}, //14622 #CJK UNIFIED IDEOGRAPH
+ {0xE4B3, 0x7259}, //14623 #CJK UNIFIED IDEOGRAPH
+ {0xE4B4, 0x82BD}, //14624 #CJK UNIFIED IDEOGRAPH
+ {0xE4B5, 0x83AA}, //14625 #CJK UNIFIED IDEOGRAPH
+ {0xE4B6, 0x86FE}, //14626 #CJK UNIFIED IDEOGRAPH
+ {0xE4B7, 0x8859}, //14627 #CJK UNIFIED IDEOGRAPH
+ {0xE4B8, 0x8A1D}, //14628 #CJK UNIFIED IDEOGRAPH
+ {0xE4B9, 0x963F}, //14629 #CJK UNIFIED IDEOGRAPH
+ {0xE4BA, 0x96C5}, //14630 #CJK UNIFIED IDEOGRAPH
+ {0xE4BB, 0x9913}, //14631 #CJK UNIFIED IDEOGRAPH
+ {0xE4BC, 0x9D09}, //14632 #CJK UNIFIED IDEOGRAPH
+ {0xE4BD, 0x9D5D}, //14633 #CJK UNIFIED IDEOGRAPH
+ {0xE4BE, 0x580A}, //14634 #CJK UNIFIED IDEOGRAPH
+ {0xE4BF, 0x5CB3}, //14635 #CJK UNIFIED IDEOGRAPH
+ {0xE4C0, 0x5DBD}, //14636 #CJK UNIFIED IDEOGRAPH
+ {0xE4C1, 0x5E44}, //14637 #CJK UNIFIED IDEOGRAPH
+ {0xE4C2, 0x60E1}, //14638 #CJK UNIFIED IDEOGRAPH
+ {0xE4C3, 0x6115}, //14639 #CJK UNIFIED IDEOGRAPH
+ {0xE4C4, 0x63E1}, //14640 #CJK UNIFIED IDEOGRAPH
+ {0xE4C5, 0x6A02}, //14641 #CJK UNIFIED IDEOGRAPH
+ {0xE4C6, 0x6E25}, //14642 #CJK UNIFIED IDEOGRAPH
+ {0xE4C7, 0x9102}, //14643 #CJK UNIFIED IDEOGRAPH
+ {0xE4C8, 0x9354}, //14644 #CJK UNIFIED IDEOGRAPH
+ {0xE4C9, 0x984E}, //14645 #CJK UNIFIED IDEOGRAPH
+ {0xE4CA, 0x9C10}, //14646 #CJK UNIFIED IDEOGRAPH
+ {0xE4CB, 0x9F77}, //14647 #CJK UNIFIED IDEOGRAPH
+ {0xE4CC, 0x5B89}, //14648 #CJK UNIFIED IDEOGRAPH
+ {0xE4CD, 0x5CB8}, //14649 #CJK UNIFIED IDEOGRAPH
+ {0xE4CE, 0x6309}, //14650 #CJK UNIFIED IDEOGRAPH
+ {0xE4CF, 0x664F}, //14651 #CJK UNIFIED IDEOGRAPH
+ {0xE4D0, 0x6848}, //14652 #CJK UNIFIED IDEOGRAPH
+ {0xE4D1, 0x773C}, //14653 #CJK UNIFIED IDEOGRAPH
+ {0xE4D2, 0x96C1}, //14654 #CJK UNIFIED IDEOGRAPH
+ {0xE4D3, 0x978D}, //14655 #CJK UNIFIED IDEOGRAPH
+ {0xE4D4, 0x9854}, //14656 #CJK UNIFIED IDEOGRAPH
+ {0xE4D5, 0x9B9F}, //14657 #CJK UNIFIED IDEOGRAPH
+ {0xE4D6, 0x65A1}, //14658 #CJK UNIFIED IDEOGRAPH
+ {0xE4D7, 0x8B01}, //14659 #CJK UNIFIED IDEOGRAPH
+ {0xE4D8, 0x8ECB}, //14660 #CJK UNIFIED IDEOGRAPH
+ {0xE4D9, 0x95BC}, //14661 #CJK UNIFIED IDEOGRAPH
+ {0xE4DA, 0x5535}, //14662 #CJK UNIFIED IDEOGRAPH
+ {0xE4DB, 0x5CA9}, //14663 #CJK UNIFIED IDEOGRAPH
+ {0xE4DC, 0x5DD6}, //14664 #CJK UNIFIED IDEOGRAPH
+ {0xE4DD, 0x5EB5}, //14665 #CJK UNIFIED IDEOGRAPH
+ {0xE4DE, 0x6697}, //14666 #CJK UNIFIED IDEOGRAPH
+ {0xE4DF, 0x764C}, //14667 #CJK UNIFIED IDEOGRAPH
+ {0xE4E0, 0x83F4}, //14668 #CJK UNIFIED IDEOGRAPH
+ {0xE4E1, 0x95C7}, //14669 #CJK UNIFIED IDEOGRAPH
+ {0xE4E2, 0x58D3}, //14670 #CJK UNIFIED IDEOGRAPH
+ {0xE4E3, 0x62BC}, //14671 #CJK UNIFIED IDEOGRAPH
+ {0xE4E4, 0x72CE}, //14672 #CJK UNIFIED IDEOGRAPH
+ {0xE4E5, 0x9D28}, //14673 #CJK UNIFIED IDEOGRAPH
+ {0xE4E6, 0x4EF0}, //14674 #CJK UNIFIED IDEOGRAPH
+ {0xE4E7, 0x592E}, //14675 #CJK UNIFIED IDEOGRAPH
+ {0xE4E8, 0x600F}, //14676 #CJK UNIFIED IDEOGRAPH
+ {0xE4E9, 0x663B}, //14677 #CJK UNIFIED IDEOGRAPH
+ {0xE4EA, 0x6B83}, //14678 #CJK UNIFIED IDEOGRAPH
+ {0xE4EB, 0x79E7}, //14679 #CJK UNIFIED IDEOGRAPH
+ {0xE4EC, 0x9D26}, //14680 #CJK UNIFIED IDEOGRAPH
+ {0xE4ED, 0x5393}, //14681 #CJK UNIFIED IDEOGRAPH
+ {0xE4EE, 0x54C0}, //14682 #CJK UNIFIED IDEOGRAPH
+ {0xE4EF, 0x57C3}, //14683 #CJK UNIFIED IDEOGRAPH
+ {0xE4F0, 0x5D16}, //14684 #CJK UNIFIED IDEOGRAPH
+ {0xE4F1, 0x611B}, //14685 #CJK UNIFIED IDEOGRAPH
+ {0xE4F2, 0x66D6}, //14686 #CJK UNIFIED IDEOGRAPH
+ {0xE4F3, 0x6DAF}, //14687 #CJK UNIFIED IDEOGRAPH
+ {0xE4F4, 0x788D}, //14688 #CJK UNIFIED IDEOGRAPH
+ {0xE4F5, 0x827E}, //14689 #CJK UNIFIED IDEOGRAPH
+ {0xE4F6, 0x9698}, //14690 #CJK UNIFIED IDEOGRAPH
+ {0xE4F7, 0x9744}, //14691 #CJK UNIFIED IDEOGRAPH
+ {0xE4F8, 0x5384}, //14692 #CJK UNIFIED IDEOGRAPH
+ {0xE4F9, 0x627C}, //14693 #CJK UNIFIED IDEOGRAPH
+ {0xE4FA, 0x6396}, //14694 #CJK UNIFIED IDEOGRAPH
+ {0xE4FB, 0x6DB2}, //14695 #CJK UNIFIED IDEOGRAPH
+ {0xE4FC, 0x7E0A}, //14696 #CJK UNIFIED IDEOGRAPH
+ {0xE4FD, 0x814B}, //14697 #CJK UNIFIED IDEOGRAPH
+ {0xE4FE, 0x984D}, //14698 #CJK UNIFIED IDEOGRAPH
+ {0xE5A1, 0x6AFB}, //14699 #CJK UNIFIED IDEOGRAPH
+ {0xE5A2, 0x7F4C}, //14700 #CJK UNIFIED IDEOGRAPH
+ {0xE5A3, 0x9DAF}, //14701 #CJK UNIFIED IDEOGRAPH
+ {0xE5A4, 0x9E1A}, //14702 #CJK UNIFIED IDEOGRAPH
+ {0xE5A5, 0x4E5F}, //14703 #CJK UNIFIED IDEOGRAPH
+ {0xE5A6, 0x503B}, //14704 #CJK UNIFIED IDEOGRAPH
+ {0xE5A7, 0x51B6}, //14705 #CJK UNIFIED IDEOGRAPH
+ {0xE5A8, 0x591C}, //14706 #CJK UNIFIED IDEOGRAPH
+ {0xE5A9, 0x60F9}, //14707 #CJK UNIFIED IDEOGRAPH
+ {0xE5AA, 0x63F6}, //14708 #CJK UNIFIED IDEOGRAPH
+ {0xE5AB, 0x6930}, //14709 #CJK UNIFIED IDEOGRAPH
+ {0xE5AC, 0x723A}, //14710 #CJK UNIFIED IDEOGRAPH
+ {0xE5AD, 0x8036}, //14711 #CJK UNIFIED IDEOGRAPH
+ {0xE5AE, 0xF974}, //14712 #CJK COMPATIBILITY IDEOGRAPH
+ {0xE5AF, 0x91CE}, //14713 #CJK UNIFIED IDEOGRAPH
+ {0xE5B0, 0x5F31}, //14714 #CJK UNIFIED IDEOGRAPH
+ {0xE5B1, 0xF975}, //14715 #CJK COMPATIBILITY IDEOGRAPH
+ {0xE5B2, 0xF976}, //14716 #CJK COMPATIBILITY IDEOGRAPH
+ {0xE5B3, 0x7D04}, //14717 #CJK UNIFIED IDEOGRAPH
+ {0xE5B4, 0x82E5}, //14718 #CJK UNIFIED IDEOGRAPH
+ {0xE5B5, 0x846F}, //14719 #CJK UNIFIED IDEOGRAPH
+ {0xE5B6, 0x84BB}, //14720 #CJK UNIFIED IDEOGRAPH
+ {0xE5B7, 0x85E5}, //14721 #CJK UNIFIED IDEOGRAPH
+ {0xE5B8, 0x8E8D}, //14722 #CJK UNIFIED IDEOGRAPH
+ {0xE5B9, 0xF977}, //14723 #CJK COMPATIBILITY IDEOGRAPH
+ {0xE5BA, 0x4F6F}, //14724 #CJK UNIFIED IDEOGRAPH
+ {0xE5BB, 0xF978}, //14725 #CJK COMPATIBILITY IDEOGRAPH
+ {0xE5BC, 0xF979}, //14726 #CJK COMPATIBILITY IDEOGRAPH
+ {0xE5BD, 0x58E4}, //14727 #CJK UNIFIED IDEOGRAPH
+ {0xE5BE, 0x5B43}, //14728 #CJK UNIFIED IDEOGRAPH
+ {0xE5BF, 0x6059}, //14729 #CJK UNIFIED IDEOGRAPH
+ {0xE5C0, 0x63DA}, //14730 #CJK UNIFIED IDEOGRAPH
+ {0xE5C1, 0x6518}, //14731 #CJK UNIFIED IDEOGRAPH
+ {0xE5C2, 0x656D}, //14732 #CJK UNIFIED IDEOGRAPH
+ {0xE5C3, 0x6698}, //14733 #CJK UNIFIED IDEOGRAPH
+ {0xE5C4, 0xF97A}, //14734 #CJK COMPATIBILITY IDEOGRAPH
+ {0xE5C5, 0x694A}, //14735 #CJK UNIFIED IDEOGRAPH
+ {0xE5C6, 0x6A23}, //14736 #CJK UNIFIED IDEOGRAPH
+ {0xE5C7, 0x6D0B}, //14737 #CJK UNIFIED IDEOGRAPH
+ {0xE5C8, 0x7001}, //14738 #CJK UNIFIED IDEOGRAPH
+ {0xE5C9, 0x716C}, //14739 #CJK UNIFIED IDEOGRAPH
+ {0xE5CA, 0x75D2}, //14740 #CJK UNIFIED IDEOGRAPH
+ {0xE5CB, 0x760D}, //14741 #CJK UNIFIED IDEOGRAPH
+ {0xE5CC, 0x79B3}, //14742 #CJK UNIFIED IDEOGRAPH
+ {0xE5CD, 0x7A70}, //14743 #CJK UNIFIED IDEOGRAPH
+ {0xE5CE, 0xF97B}, //14744 #CJK COMPATIBILITY IDEOGRAPH
+ {0xE5CF, 0x7F8A}, //14745 #CJK UNIFIED IDEOGRAPH
+ {0xE5D0, 0xF97C}, //14746 #CJK COMPATIBILITY IDEOGRAPH
+ {0xE5D1, 0x8944}, //14747 #CJK UNIFIED IDEOGRAPH
+ {0xE5D2, 0xF97D}, //14748 #CJK COMPATIBILITY IDEOGRAPH
+ {0xE5D3, 0x8B93}, //14749 #CJK UNIFIED IDEOGRAPH
+ {0xE5D4, 0x91C0}, //14750 #CJK UNIFIED IDEOGRAPH
+ {0xE5D5, 0x967D}, //14751 #CJK UNIFIED IDEOGRAPH
+ {0xE5D6, 0xF97E}, //14752 #CJK COMPATIBILITY IDEOGRAPH
+ {0xE5D7, 0x990A}, //14753 #CJK UNIFIED IDEOGRAPH
+ {0xE5D8, 0x5704}, //14754 #CJK UNIFIED IDEOGRAPH
+ {0xE5D9, 0x5FA1}, //14755 #CJK UNIFIED IDEOGRAPH
+ {0xE5DA, 0x65BC}, //14756 #CJK UNIFIED IDEOGRAPH
+ {0xE5DB, 0x6F01}, //14757 #CJK UNIFIED IDEOGRAPH
+ {0xE5DC, 0x7600}, //14758 #CJK UNIFIED IDEOGRAPH
+ {0xE5DD, 0x79A6}, //14759 #CJK UNIFIED IDEOGRAPH
+ {0xE5DE, 0x8A9E}, //14760 #CJK UNIFIED IDEOGRAPH
+ {0xE5DF, 0x99AD}, //14761 #CJK UNIFIED IDEOGRAPH
+ {0xE5E0, 0x9B5A}, //14762 #CJK UNIFIED IDEOGRAPH
+ {0xE5E1, 0x9F6C}, //14763 #CJK UNIFIED IDEOGRAPH
+ {0xE5E2, 0x5104}, //14764 #CJK UNIFIED IDEOGRAPH
+ {0xE5E3, 0x61B6}, //14765 #CJK UNIFIED IDEOGRAPH
+ {0xE5E4, 0x6291}, //14766 #CJK UNIFIED IDEOGRAPH
+ {0xE5E5, 0x6A8D}, //14767 #CJK UNIFIED IDEOGRAPH
+ {0xE5E6, 0x81C6}, //14768 #CJK UNIFIED IDEOGRAPH
+ {0xE5E7, 0x5043}, //14769 #CJK UNIFIED IDEOGRAPH
+ {0xE5E8, 0x5830}, //14770 #CJK UNIFIED IDEOGRAPH
+ {0xE5E9, 0x5F66}, //14771 #CJK UNIFIED IDEOGRAPH
+ {0xE5EA, 0x7109}, //14772 #CJK UNIFIED IDEOGRAPH
+ {0xE5EB, 0x8A00}, //14773 #CJK UNIFIED IDEOGRAPH
+ {0xE5EC, 0x8AFA}, //14774 #CJK UNIFIED IDEOGRAPH
+ {0xE5ED, 0x5B7C}, //14775 #CJK UNIFIED IDEOGRAPH
+ {0xE5EE, 0x8616}, //14776 #CJK UNIFIED IDEOGRAPH
+ {0xE5EF, 0x4FFA}, //14777 #CJK UNIFIED IDEOGRAPH
+ {0xE5F0, 0x513C}, //14778 #CJK UNIFIED IDEOGRAPH
+ {0xE5F1, 0x56B4}, //14779 #CJK UNIFIED IDEOGRAPH
+ {0xE5F2, 0x5944}, //14780 #CJK UNIFIED IDEOGRAPH
+ {0xE5F3, 0x63A9}, //14781 #CJK UNIFIED IDEOGRAPH
+ {0xE5F4, 0x6DF9}, //14782 #CJK UNIFIED IDEOGRAPH
+ {0xE5F5, 0x5DAA}, //14783 #CJK UNIFIED IDEOGRAPH
+ {0xE5F6, 0x696D}, //14784 #CJK UNIFIED IDEOGRAPH
+ {0xE5F7, 0x5186}, //14785 #CJK UNIFIED IDEOGRAPH
+ {0xE5F8, 0x4E88}, //14786 #CJK UNIFIED IDEOGRAPH
+ {0xE5F9, 0x4F59}, //14787 #CJK UNIFIED IDEOGRAPH
+ {0xE5FA, 0xF97F}, //14788 #CJK COMPATIBILITY IDEOGRAPH
+ {0xE5FB, 0xF980}, //14789 #CJK COMPATIBILITY IDEOGRAPH
+ {0xE5FC, 0xF981}, //14790 #CJK COMPATIBILITY IDEOGRAPH
+ {0xE5FD, 0x5982}, //14791 #CJK UNIFIED IDEOGRAPH
+ {0xE5FE, 0xF982}, //14792 #CJK COMPATIBILITY IDEOGRAPH
+ {0xE6A1, 0xF983}, //14793 #CJK COMPATIBILITY IDEOGRAPH
+ {0xE6A2, 0x6B5F}, //14794 #CJK UNIFIED IDEOGRAPH
+ {0xE6A3, 0x6C5D}, //14795 #CJK UNIFIED IDEOGRAPH
+ {0xE6A4, 0xF984}, //14796 #CJK COMPATIBILITY IDEOGRAPH
+ {0xE6A5, 0x74B5}, //14797 #CJK UNIFIED IDEOGRAPH
+ {0xE6A6, 0x7916}, //14798 #CJK UNIFIED IDEOGRAPH
+ {0xE6A7, 0xF985}, //14799 #CJK COMPATIBILITY IDEOGRAPH
+ {0xE6A8, 0x8207}, //14800 #CJK UNIFIED IDEOGRAPH
+ {0xE6A9, 0x8245}, //14801 #CJK UNIFIED IDEOGRAPH
+ {0xE6AA, 0x8339}, //14802 #CJK UNIFIED IDEOGRAPH
+ {0xE6AB, 0x8F3F}, //14803 #CJK UNIFIED IDEOGRAPH
+ {0xE6AC, 0x8F5D}, //14804 #CJK UNIFIED IDEOGRAPH
+ {0xE6AD, 0xF986}, //14805 #CJK COMPATIBILITY IDEOGRAPH
+ {0xE6AE, 0x9918}, //14806 #CJK UNIFIED IDEOGRAPH
+ {0xE6AF, 0xF987}, //14807 #CJK COMPATIBILITY IDEOGRAPH
+ {0xE6B0, 0xF988}, //14808 #CJK COMPATIBILITY IDEOGRAPH
+ {0xE6B1, 0xF989}, //14809 #CJK COMPATIBILITY IDEOGRAPH
+ {0xE6B2, 0x4EA6}, //14810 #CJK UNIFIED IDEOGRAPH
+ {0xE6B3, 0xF98A}, //14811 #CJK COMPATIBILITY IDEOGRAPH
+ {0xE6B4, 0x57DF}, //14812 #CJK UNIFIED IDEOGRAPH
+ {0xE6B5, 0x5F79}, //14813 #CJK UNIFIED IDEOGRAPH
+ {0xE6B6, 0x6613}, //14814 #CJK UNIFIED IDEOGRAPH
+ {0xE6B7, 0xF98B}, //14815 #CJK COMPATIBILITY IDEOGRAPH
+ {0xE6B8, 0xF98C}, //14816 #CJK COMPATIBILITY IDEOGRAPH
+ {0xE6B9, 0x75AB}, //14817 #CJK UNIFIED IDEOGRAPH
+ {0xE6BA, 0x7E79}, //14818 #CJK UNIFIED IDEOGRAPH
+ {0xE6BB, 0x8B6F}, //14819 #CJK UNIFIED IDEOGRAPH
+ {0xE6BC, 0xF98D}, //14820 #CJK COMPATIBILITY IDEOGRAPH
+ {0xE6BD, 0x9006}, //14821 #CJK UNIFIED IDEOGRAPH
+ {0xE6BE, 0x9A5B}, //14822 #CJK UNIFIED IDEOGRAPH
+ {0xE6BF, 0x56A5}, //14823 #CJK UNIFIED IDEOGRAPH
+ {0xE6C0, 0x5827}, //14824 #CJK UNIFIED IDEOGRAPH
+ {0xE6C1, 0x59F8}, //14825 #CJK UNIFIED IDEOGRAPH
+ {0xE6C2, 0x5A1F}, //14826 #CJK UNIFIED IDEOGRAPH
+ {0xE6C3, 0x5BB4}, //14827 #CJK UNIFIED IDEOGRAPH
+ {0xE6C4, 0xF98E}, //14828 #CJK COMPATIBILITY IDEOGRAPH
+ {0xE6C5, 0x5EF6}, //14829 #CJK UNIFIED IDEOGRAPH
+ {0xE6C6, 0xF98F}, //14830 #CJK COMPATIBILITY IDEOGRAPH
+ {0xE6C7, 0xF990}, //14831 #CJK COMPATIBILITY IDEOGRAPH
+ {0xE6C8, 0x6350}, //14832 #CJK UNIFIED IDEOGRAPH
+ {0xE6C9, 0x633B}, //14833 #CJK UNIFIED IDEOGRAPH
+ {0xE6CA, 0xF991}, //14834 #CJK COMPATIBILITY IDEOGRAPH
+ {0xE6CB, 0x693D}, //14835 #CJK UNIFIED IDEOGRAPH
+ {0xE6CC, 0x6C87}, //14836 #CJK UNIFIED IDEOGRAPH
+ {0xE6CD, 0x6CBF}, //14837 #CJK UNIFIED IDEOGRAPH
+ {0xE6CE, 0x6D8E}, //14838 #CJK UNIFIED IDEOGRAPH
+ {0xE6CF, 0x6D93}, //14839 #CJK UNIFIED IDEOGRAPH
+ {0xE6D0, 0x6DF5}, //14840 #CJK UNIFIED IDEOGRAPH
+ {0xE6D1, 0x6F14}, //14841 #CJK UNIFIED IDEOGRAPH
+ {0xE6D2, 0xF992}, //14842 #CJK COMPATIBILITY IDEOGRAPH
+ {0xE6D3, 0x70DF}, //14843 #CJK UNIFIED IDEOGRAPH
+ {0xE6D4, 0x7136}, //14844 #CJK UNIFIED IDEOGRAPH
+ {0xE6D5, 0x7159}, //14845 #CJK UNIFIED IDEOGRAPH
+ {0xE6D6, 0xF993}, //14846 #CJK COMPATIBILITY IDEOGRAPH
+ {0xE6D7, 0x71C3}, //14847 #CJK UNIFIED IDEOGRAPH
+ {0xE6D8, 0x71D5}, //14848 #CJK UNIFIED IDEOGRAPH
+ {0xE6D9, 0xF994}, //14849 #CJK COMPATIBILITY IDEOGRAPH
+ {0xE6DA, 0x784F}, //14850 #CJK UNIFIED IDEOGRAPH
+ {0xE6DB, 0x786F}, //14851 #CJK UNIFIED IDEOGRAPH
+ {0xE6DC, 0xF995}, //14852 #CJK COMPATIBILITY IDEOGRAPH
+ {0xE6DD, 0x7B75}, //14853 #CJK UNIFIED IDEOGRAPH
+ {0xE6DE, 0x7DE3}, //14854 #CJK UNIFIED IDEOGRAPH
+ {0xE6DF, 0xF996}, //14855 #CJK COMPATIBILITY IDEOGRAPH
+ {0xE6E0, 0x7E2F}, //14856 #CJK UNIFIED IDEOGRAPH
+ {0xE6E1, 0xF997}, //14857 #CJK COMPATIBILITY IDEOGRAPH
+ {0xE6E2, 0x884D}, //14858 #CJK UNIFIED IDEOGRAPH
+ {0xE6E3, 0x8EDF}, //14859 #CJK UNIFIED IDEOGRAPH
+ {0xE6E4, 0xF998}, //14860 #CJK COMPATIBILITY IDEOGRAPH
+ {0xE6E5, 0xF999}, //14861 #CJK COMPATIBILITY IDEOGRAPH
+ {0xE6E6, 0xF99A}, //14862 #CJK COMPATIBILITY IDEOGRAPH
+ {0xE6E7, 0x925B}, //14863 #CJK UNIFIED IDEOGRAPH
+ {0xE6E8, 0xF99B}, //14864 #CJK COMPATIBILITY IDEOGRAPH
+ {0xE6E9, 0x9CF6}, //14865 #CJK UNIFIED IDEOGRAPH
+ {0xE6EA, 0xF99C}, //14866 #CJK COMPATIBILITY IDEOGRAPH
+ {0xE6EB, 0xF99D}, //14867 #CJK COMPATIBILITY IDEOGRAPH
+ {0xE6EC, 0xF99E}, //14868 #CJK COMPATIBILITY IDEOGRAPH
+ {0xE6ED, 0x6085}, //14869 #CJK UNIFIED IDEOGRAPH
+ {0xE6EE, 0x6D85}, //14870 #CJK UNIFIED IDEOGRAPH
+ {0xE6EF, 0xF99F}, //14871 #CJK COMPATIBILITY IDEOGRAPH
+ {0xE6F0, 0x71B1}, //14872 #CJK UNIFIED IDEOGRAPH
+ {0xE6F1, 0xF9A0}, //14873 #CJK COMPATIBILITY IDEOGRAPH
+ {0xE6F2, 0xF9A1}, //14874 #CJK COMPATIBILITY IDEOGRAPH
+ {0xE6F3, 0x95B1}, //14875 #CJK UNIFIED IDEOGRAPH
+ {0xE6F4, 0x53AD}, //14876 #CJK UNIFIED IDEOGRAPH
+ {0xE6F5, 0xF9A2}, //14877 #CJK COMPATIBILITY IDEOGRAPH
+ {0xE6F6, 0xF9A3}, //14878 #CJK COMPATIBILITY IDEOGRAPH
+ {0xE6F7, 0xF9A4}, //14879 #CJK COMPATIBILITY IDEOGRAPH
+ {0xE6F8, 0x67D3}, //14880 #CJK UNIFIED IDEOGRAPH
+ {0xE6F9, 0xF9A5}, //14881 #CJK COMPATIBILITY IDEOGRAPH
+ {0xE6FA, 0x708E}, //14882 #CJK UNIFIED IDEOGRAPH
+ {0xE6FB, 0x7130}, //14883 #CJK UNIFIED IDEOGRAPH
+ {0xE6FC, 0x7430}, //14884 #CJK UNIFIED IDEOGRAPH
+ {0xE6FD, 0x8276}, //14885 #CJK UNIFIED IDEOGRAPH
+ {0xE6FE, 0x82D2}, //14886 #CJK UNIFIED IDEOGRAPH
+ {0xE7A1, 0xF9A6}, //14887 #CJK COMPATIBILITY IDEOGRAPH
+ {0xE7A2, 0x95BB}, //14888 #CJK UNIFIED IDEOGRAPH
+ {0xE7A3, 0x9AE5}, //14889 #CJK UNIFIED IDEOGRAPH
+ {0xE7A4, 0x9E7D}, //14890 #CJK UNIFIED IDEOGRAPH
+ {0xE7A5, 0x66C4}, //14891 #CJK UNIFIED IDEOGRAPH
+ {0xE7A6, 0xF9A7}, //14892 #CJK COMPATIBILITY IDEOGRAPH
+ {0xE7A7, 0x71C1}, //14893 #CJK UNIFIED IDEOGRAPH
+ {0xE7A8, 0x8449}, //14894 #CJK UNIFIED IDEOGRAPH
+ {0xE7A9, 0xF9A8}, //14895 #CJK COMPATIBILITY IDEOGRAPH
+ {0xE7AA, 0xF9A9}, //14896 #CJK COMPATIBILITY IDEOGRAPH
+ {0xE7AB, 0x584B}, //14897 #CJK UNIFIED IDEOGRAPH
+ {0xE7AC, 0xF9AA}, //14898 #CJK COMPATIBILITY IDEOGRAPH
+ {0xE7AD, 0xF9AB}, //14899 #CJK COMPATIBILITY IDEOGRAPH
+ {0xE7AE, 0x5DB8}, //14900 #CJK UNIFIED IDEOGRAPH
+ {0xE7AF, 0x5F71}, //14901 #CJK UNIFIED IDEOGRAPH
+ {0xE7B0, 0xF9AC}, //14902 #CJK COMPATIBILITY IDEOGRAPH
+ {0xE7B1, 0x6620}, //14903 #CJK UNIFIED IDEOGRAPH
+ {0xE7B2, 0x668E}, //14904 #CJK UNIFIED IDEOGRAPH
+ {0xE7B3, 0x6979}, //14905 #CJK UNIFIED IDEOGRAPH
+ {0xE7B4, 0x69AE}, //14906 #CJK UNIFIED IDEOGRAPH
+ {0xE7B5, 0x6C38}, //14907 #CJK UNIFIED IDEOGRAPH
+ {0xE7B6, 0x6CF3}, //14908 #CJK UNIFIED IDEOGRAPH
+ {0xE7B7, 0x6E36}, //14909 #CJK UNIFIED IDEOGRAPH
+ {0xE7B8, 0x6F41}, //14910 #CJK UNIFIED IDEOGRAPH
+ {0xE7B9, 0x6FDA}, //14911 #CJK UNIFIED IDEOGRAPH
+ {0xE7BA, 0x701B}, //14912 #CJK UNIFIED IDEOGRAPH
+ {0xE7BB, 0x702F}, //14913 #CJK UNIFIED IDEOGRAPH
+ {0xE7BC, 0x7150}, //14914 #CJK UNIFIED IDEOGRAPH
+ {0xE7BD, 0x71DF}, //14915 #CJK UNIFIED IDEOGRAPH
+ {0xE7BE, 0x7370}, //14916 #CJK UNIFIED IDEOGRAPH
+ {0xE7BF, 0xF9AD}, //14917 #CJK COMPATIBILITY IDEOGRAPH
+ {0xE7C0, 0x745B}, //14918 #CJK UNIFIED IDEOGRAPH
+ {0xE7C1, 0xF9AE}, //14919 #CJK COMPATIBILITY IDEOGRAPH
+ {0xE7C2, 0x74D4}, //14920 #CJK UNIFIED IDEOGRAPH
+ {0xE7C3, 0x76C8}, //14921 #CJK UNIFIED IDEOGRAPH
+ {0xE7C4, 0x7A4E}, //14922 #CJK UNIFIED IDEOGRAPH
+ {0xE7C5, 0x7E93}, //14923 #CJK UNIFIED IDEOGRAPH
+ {0xE7C6, 0xF9AF}, //14924 #CJK COMPATIBILITY IDEOGRAPH
+ {0xE7C7, 0xF9B0}, //14925 #CJK COMPATIBILITY IDEOGRAPH
+ {0xE7C8, 0x82F1}, //14926 #CJK UNIFIED IDEOGRAPH
+ {0xE7C9, 0x8A60}, //14927 #CJK UNIFIED IDEOGRAPH
+ {0xE7CA, 0x8FCE}, //14928 #CJK UNIFIED IDEOGRAPH
+ {0xE7CB, 0xF9B1}, //14929 #CJK COMPATIBILITY IDEOGRAPH
+ {0xE7CC, 0x9348}, //14930 #CJK UNIFIED IDEOGRAPH
+ {0xE7CD, 0xF9B2}, //14931 #CJK COMPATIBILITY IDEOGRAPH
+ {0xE7CE, 0x9719}, //14932 #CJK UNIFIED IDEOGRAPH
+ {0xE7CF, 0xF9B3}, //14933 #CJK COMPATIBILITY IDEOGRAPH
+ {0xE7D0, 0xF9B4}, //14934 #CJK COMPATIBILITY IDEOGRAPH
+ {0xE7D1, 0x4E42}, //14935 #CJK UNIFIED IDEOGRAPH
+ {0xE7D2, 0x502A}, //14936 #CJK UNIFIED IDEOGRAPH
+ {0xE7D3, 0xF9B5}, //14937 #CJK COMPATIBILITY IDEOGRAPH
+ {0xE7D4, 0x5208}, //14938 #CJK UNIFIED IDEOGRAPH
+ {0xE7D5, 0x53E1}, //14939 #CJK UNIFIED IDEOGRAPH
+ {0xE7D6, 0x66F3}, //14940 #CJK UNIFIED IDEOGRAPH
+ {0xE7D7, 0x6C6D}, //14941 #CJK UNIFIED IDEOGRAPH
+ {0xE7D8, 0x6FCA}, //14942 #CJK UNIFIED IDEOGRAPH
+ {0xE7D9, 0x730A}, //14943 #CJK UNIFIED IDEOGRAPH
+ {0xE7DA, 0x777F}, //14944 #CJK UNIFIED IDEOGRAPH
+ {0xE7DB, 0x7A62}, //14945 #CJK UNIFIED IDEOGRAPH
+ {0xE7DC, 0x82AE}, //14946 #CJK UNIFIED IDEOGRAPH
+ {0xE7DD, 0x85DD}, //14947 #CJK UNIFIED IDEOGRAPH
+ {0xE7DE, 0x8602}, //14948 #CJK UNIFIED IDEOGRAPH
+ {0xE7DF, 0xF9B6}, //14949 #CJK COMPATIBILITY IDEOGRAPH
+ {0xE7E0, 0x88D4}, //14950 #CJK UNIFIED IDEOGRAPH
+ {0xE7E1, 0x8A63}, //14951 #CJK UNIFIED IDEOGRAPH
+ {0xE7E2, 0x8B7D}, //14952 #CJK UNIFIED IDEOGRAPH
+ {0xE7E3, 0x8C6B}, //14953 #CJK UNIFIED IDEOGRAPH
+ {0xE7E4, 0xF9B7}, //14954 #CJK COMPATIBILITY IDEOGRAPH
+ {0xE7E5, 0x92B3}, //14955 #CJK UNIFIED IDEOGRAPH
+ {0xE7E6, 0xF9B8}, //14956 #CJK COMPATIBILITY IDEOGRAPH
+ {0xE7E7, 0x9713}, //14957 #CJK UNIFIED IDEOGRAPH
+ {0xE7E8, 0x9810}, //14958 #CJK UNIFIED IDEOGRAPH
+ {0xE7E9, 0x4E94}, //14959 #CJK UNIFIED IDEOGRAPH
+ {0xE7EA, 0x4F0D}, //14960 #CJK UNIFIED IDEOGRAPH
+ {0xE7EB, 0x4FC9}, //14961 #CJK UNIFIED IDEOGRAPH
+ {0xE7EC, 0x50B2}, //14962 #CJK UNIFIED IDEOGRAPH
+ {0xE7ED, 0x5348}, //14963 #CJK UNIFIED IDEOGRAPH
+ {0xE7EE, 0x543E}, //14964 #CJK UNIFIED IDEOGRAPH
+ {0xE7EF, 0x5433}, //14965 #CJK UNIFIED IDEOGRAPH
+ {0xE7F0, 0x55DA}, //14966 #CJK UNIFIED IDEOGRAPH
+ {0xE7F1, 0x5862}, //14967 #CJK UNIFIED IDEOGRAPH
+ {0xE7F2, 0x58BA}, //14968 #CJK UNIFIED IDEOGRAPH
+ {0xE7F3, 0x5967}, //14969 #CJK UNIFIED IDEOGRAPH
+ {0xE7F4, 0x5A1B}, //14970 #CJK UNIFIED IDEOGRAPH
+ {0xE7F5, 0x5BE4}, //14971 #CJK UNIFIED IDEOGRAPH
+ {0xE7F6, 0x609F}, //14972 #CJK UNIFIED IDEOGRAPH
+ {0xE7F7, 0xF9B9}, //14973 #CJK COMPATIBILITY IDEOGRAPH
+ {0xE7F8, 0x61CA}, //14974 #CJK UNIFIED IDEOGRAPH
+ {0xE7F9, 0x6556}, //14975 #CJK UNIFIED IDEOGRAPH
+ {0xE7FA, 0x65FF}, //14976 #CJK UNIFIED IDEOGRAPH
+ {0xE7FB, 0x6664}, //14977 #CJK UNIFIED IDEOGRAPH
+ {0xE7FC, 0x68A7}, //14978 #CJK UNIFIED IDEOGRAPH
+ {0xE7FD, 0x6C5A}, //14979 #CJK UNIFIED IDEOGRAPH
+ {0xE7FE, 0x6FB3}, //14980 #CJK UNIFIED IDEOGRAPH
+ {0xE8A1, 0x70CF}, //14981 #CJK UNIFIED IDEOGRAPH
+ {0xE8A2, 0x71AC}, //14982 #CJK UNIFIED IDEOGRAPH
+ {0xE8A3, 0x7352}, //14983 #CJK UNIFIED IDEOGRAPH
+ {0xE8A4, 0x7B7D}, //14984 #CJK UNIFIED IDEOGRAPH
+ {0xE8A5, 0x8708}, //14985 #CJK UNIFIED IDEOGRAPH
+ {0xE8A6, 0x8AA4}, //14986 #CJK UNIFIED IDEOGRAPH
+ {0xE8A7, 0x9C32}, //14987 #CJK UNIFIED IDEOGRAPH
+ {0xE8A8, 0x9F07}, //14988 #CJK UNIFIED IDEOGRAPH
+ {0xE8A9, 0x5C4B}, //14989 #CJK UNIFIED IDEOGRAPH
+ {0xE8AA, 0x6C83}, //14990 #CJK UNIFIED IDEOGRAPH
+ {0xE8AB, 0x7344}, //14991 #CJK UNIFIED IDEOGRAPH
+ {0xE8AC, 0x7389}, //14992 #CJK UNIFIED IDEOGRAPH
+ {0xE8AD, 0x923A}, //14993 #CJK UNIFIED IDEOGRAPH
+ {0xE8AE, 0x6EAB}, //14994 #CJK UNIFIED IDEOGRAPH
+ {0xE8AF, 0x7465}, //14995 #CJK UNIFIED IDEOGRAPH
+ {0xE8B0, 0x761F}, //14996 #CJK UNIFIED IDEOGRAPH
+ {0xE8B1, 0x7A69}, //14997 #CJK UNIFIED IDEOGRAPH
+ {0xE8B2, 0x7E15}, //14998 #CJK UNIFIED IDEOGRAPH
+ {0xE8B3, 0x860A}, //14999 #CJK UNIFIED IDEOGRAPH
+ {0xE8B4, 0x5140}, //15000 #CJK UNIFIED IDEOGRAPH
+ {0xE8B5, 0x58C5}, //15001 #CJK UNIFIED IDEOGRAPH
+ {0xE8B6, 0x64C1}, //15002 #CJK UNIFIED IDEOGRAPH
+ {0xE8B7, 0x74EE}, //15003 #CJK UNIFIED IDEOGRAPH
+ {0xE8B8, 0x7515}, //15004 #CJK UNIFIED IDEOGRAPH
+ {0xE8B9, 0x7670}, //15005 #CJK UNIFIED IDEOGRAPH
+ {0xE8BA, 0x7FC1}, //15006 #CJK UNIFIED IDEOGRAPH
+ {0xE8BB, 0x9095}, //15007 #CJK UNIFIED IDEOGRAPH
+ {0xE8BC, 0x96CD}, //15008 #CJK UNIFIED IDEOGRAPH
+ {0xE8BD, 0x9954}, //15009 #CJK UNIFIED IDEOGRAPH
+ {0xE8BE, 0x6E26}, //15010 #CJK UNIFIED IDEOGRAPH
+ {0xE8BF, 0x74E6}, //15011 #CJK UNIFIED IDEOGRAPH
+ {0xE8C0, 0x7AA9}, //15012 #CJK UNIFIED IDEOGRAPH
+ {0xE8C1, 0x7AAA}, //15013 #CJK UNIFIED IDEOGRAPH
+ {0xE8C2, 0x81E5}, //15014 #CJK UNIFIED IDEOGRAPH
+ {0xE8C3, 0x86D9}, //15015 #CJK UNIFIED IDEOGRAPH
+ {0xE8C4, 0x8778}, //15016 #CJK UNIFIED IDEOGRAPH
+ {0xE8C5, 0x8A1B}, //15017 #CJK UNIFIED IDEOGRAPH
+ {0xE8C6, 0x5A49}, //15018 #CJK UNIFIED IDEOGRAPH
+ {0xE8C7, 0x5B8C}, //15019 #CJK UNIFIED IDEOGRAPH
+ {0xE8C8, 0x5B9B}, //15020 #CJK UNIFIED IDEOGRAPH
+ {0xE8C9, 0x68A1}, //15021 #CJK UNIFIED IDEOGRAPH
+ {0xE8CA, 0x6900}, //15022 #CJK UNIFIED IDEOGRAPH
+ {0xE8CB, 0x6D63}, //15023 #CJK UNIFIED IDEOGRAPH
+ {0xE8CC, 0x73A9}, //15024 #CJK UNIFIED IDEOGRAPH
+ {0xE8CD, 0x7413}, //15025 #CJK UNIFIED IDEOGRAPH
+ {0xE8CE, 0x742C}, //15026 #CJK UNIFIED IDEOGRAPH
+ {0xE8CF, 0x7897}, //15027 #CJK UNIFIED IDEOGRAPH
+ {0xE8D0, 0x7DE9}, //15028 #CJK UNIFIED IDEOGRAPH
+ {0xE8D1, 0x7FEB}, //15029 #CJK UNIFIED IDEOGRAPH
+ {0xE8D2, 0x8118}, //15030 #CJK UNIFIED IDEOGRAPH
+ {0xE8D3, 0x8155}, //15031 #CJK UNIFIED IDEOGRAPH
+ {0xE8D4, 0x839E}, //15032 #CJK UNIFIED IDEOGRAPH
+ {0xE8D5, 0x8C4C}, //15033 #CJK UNIFIED IDEOGRAPH
+ {0xE8D6, 0x962E}, //15034 #CJK UNIFIED IDEOGRAPH
+ {0xE8D7, 0x9811}, //15035 #CJK UNIFIED IDEOGRAPH
+ {0xE8D8, 0x66F0}, //15036 #CJK UNIFIED IDEOGRAPH
+ {0xE8D9, 0x5F80}, //15037 #CJK UNIFIED IDEOGRAPH
+ {0xE8DA, 0x65FA}, //15038 #CJK UNIFIED IDEOGRAPH
+ {0xE8DB, 0x6789}, //15039 #CJK UNIFIED IDEOGRAPH
+ {0xE8DC, 0x6C6A}, //15040 #CJK UNIFIED IDEOGRAPH
+ {0xE8DD, 0x738B}, //15041 #CJK UNIFIED IDEOGRAPH
+ {0xE8DE, 0x502D}, //15042 #CJK UNIFIED IDEOGRAPH
+ {0xE8DF, 0x5A03}, //15043 #CJK UNIFIED IDEOGRAPH
+ {0xE8E0, 0x6B6A}, //15044 #CJK UNIFIED IDEOGRAPH
+ {0xE8E1, 0x77EE}, //15045 #CJK UNIFIED IDEOGRAPH
+ {0xE8E2, 0x5916}, //15046 #CJK UNIFIED IDEOGRAPH
+ {0xE8E3, 0x5D6C}, //15047 #CJK UNIFIED IDEOGRAPH
+ {0xE8E4, 0x5DCD}, //15048 #CJK UNIFIED IDEOGRAPH
+ {0xE8E5, 0x7325}, //15049 #CJK UNIFIED IDEOGRAPH
+ {0xE8E6, 0x754F}, //15050 #CJK UNIFIED IDEOGRAPH
+ {0xE8E7, 0xF9BA}, //15051 #CJK COMPATIBILITY IDEOGRAPH
+ {0xE8E8, 0xF9BB}, //15052 #CJK COMPATIBILITY IDEOGRAPH
+ {0xE8E9, 0x50E5}, //15053 #CJK UNIFIED IDEOGRAPH
+ {0xE8EA, 0x51F9}, //15054 #CJK UNIFIED IDEOGRAPH
+ {0xE8EB, 0x582F}, //15055 #CJK UNIFIED IDEOGRAPH
+ {0xE8EC, 0x592D}, //15056 #CJK UNIFIED IDEOGRAPH
+ {0xE8ED, 0x5996}, //15057 #CJK UNIFIED IDEOGRAPH
+ {0xE8EE, 0x59DA}, //15058 #CJK UNIFIED IDEOGRAPH
+ {0xE8EF, 0x5BE5}, //15059 #CJK UNIFIED IDEOGRAPH
+ {0xE8F0, 0xF9BC}, //15060 #CJK COMPATIBILITY IDEOGRAPH
+ {0xE8F1, 0xF9BD}, //15061 #CJK COMPATIBILITY IDEOGRAPH
+ {0xE8F2, 0x5DA2}, //15062 #CJK UNIFIED IDEOGRAPH
+ {0xE8F3, 0x62D7}, //15063 #CJK UNIFIED IDEOGRAPH
+ {0xE8F4, 0x6416}, //15064 #CJK UNIFIED IDEOGRAPH
+ {0xE8F5, 0x6493}, //15065 #CJK UNIFIED IDEOGRAPH
+ {0xE8F6, 0x64FE}, //15066 #CJK UNIFIED IDEOGRAPH
+ {0xE8F7, 0xF9BE}, //15067 #CJK COMPATIBILITY IDEOGRAPH
+ {0xE8F8, 0x66DC}, //15068 #CJK UNIFIED IDEOGRAPH
+ {0xE8F9, 0xF9BF}, //15069 #CJK COMPATIBILITY IDEOGRAPH
+ {0xE8FA, 0x6A48}, //15070 #CJK UNIFIED IDEOGRAPH
+ {0xE8FB, 0xF9C0}, //15071 #CJK COMPATIBILITY IDEOGRAPH
+ {0xE8FC, 0x71FF}, //15072 #CJK UNIFIED IDEOGRAPH
+ {0xE8FD, 0x7464}, //15073 #CJK UNIFIED IDEOGRAPH
+ {0xE8FE, 0xF9C1}, //15074 #CJK COMPATIBILITY IDEOGRAPH
+ {0xE9A1, 0x7A88}, //15075 #CJK UNIFIED IDEOGRAPH
+ {0xE9A2, 0x7AAF}, //15076 #CJK UNIFIED IDEOGRAPH
+ {0xE9A3, 0x7E47}, //15077 #CJK UNIFIED IDEOGRAPH
+ {0xE9A4, 0x7E5E}, //15078 #CJK UNIFIED IDEOGRAPH
+ {0xE9A5, 0x8000}, //15079 #CJK UNIFIED IDEOGRAPH
+ {0xE9A6, 0x8170}, //15080 #CJK UNIFIED IDEOGRAPH
+ {0xE9A7, 0xF9C2}, //15081 #CJK COMPATIBILITY IDEOGRAPH
+ {0xE9A8, 0x87EF}, //15082 #CJK UNIFIED IDEOGRAPH
+ {0xE9A9, 0x8981}, //15083 #CJK UNIFIED IDEOGRAPH
+ {0xE9AA, 0x8B20}, //15084 #CJK UNIFIED IDEOGRAPH
+ {0xE9AB, 0x9059}, //15085 #CJK UNIFIED IDEOGRAPH
+ {0xE9AC, 0xF9C3}, //15086 #CJK COMPATIBILITY IDEOGRAPH
+ {0xE9AD, 0x9080}, //15087 #CJK UNIFIED IDEOGRAPH
+ {0xE9AE, 0x9952}, //15088 #CJK UNIFIED IDEOGRAPH
+ {0xE9AF, 0x617E}, //15089 #CJK UNIFIED IDEOGRAPH
+ {0xE9B0, 0x6B32}, //15090 #CJK UNIFIED IDEOGRAPH
+ {0xE9B1, 0x6D74}, //15091 #CJK UNIFIED IDEOGRAPH
+ {0xE9B2, 0x7E1F}, //15092 #CJK UNIFIED IDEOGRAPH
+ {0xE9B3, 0x8925}, //15093 #CJK UNIFIED IDEOGRAPH
+ {0xE9B4, 0x8FB1}, //15094 #CJK UNIFIED IDEOGRAPH
+ {0xE9B5, 0x4FD1}, //15095 #CJK UNIFIED IDEOGRAPH
+ {0xE9B6, 0x50AD}, //15096 #CJK UNIFIED IDEOGRAPH
+ {0xE9B7, 0x5197}, //15097 #CJK UNIFIED IDEOGRAPH
+ {0xE9B8, 0x52C7}, //15098 #CJK UNIFIED IDEOGRAPH
+ {0xE9B9, 0x57C7}, //15099 #CJK UNIFIED IDEOGRAPH
+ {0xE9BA, 0x5889}, //15100 #CJK UNIFIED IDEOGRAPH
+ {0xE9BB, 0x5BB9}, //15101 #CJK UNIFIED IDEOGRAPH
+ {0xE9BC, 0x5EB8}, //15102 #CJK UNIFIED IDEOGRAPH
+ {0xE9BD, 0x6142}, //15103 #CJK UNIFIED IDEOGRAPH
+ {0xE9BE, 0x6995}, //15104 #CJK UNIFIED IDEOGRAPH
+ {0xE9BF, 0x6D8C}, //15105 #CJK UNIFIED IDEOGRAPH
+ {0xE9C0, 0x6E67}, //15106 #CJK UNIFIED IDEOGRAPH
+ {0xE9C1, 0x6EB6}, //15107 #CJK UNIFIED IDEOGRAPH
+ {0xE9C2, 0x7194}, //15108 #CJK UNIFIED IDEOGRAPH
+ {0xE9C3, 0x7462}, //15109 #CJK UNIFIED IDEOGRAPH
+ {0xE9C4, 0x7528}, //15110 #CJK UNIFIED IDEOGRAPH
+ {0xE9C5, 0x752C}, //15111 #CJK UNIFIED IDEOGRAPH
+ {0xE9C6, 0x8073}, //15112 #CJK UNIFIED IDEOGRAPH
+ {0xE9C7, 0x8338}, //15113 #CJK UNIFIED IDEOGRAPH
+ {0xE9C8, 0x84C9}, //15114 #CJK UNIFIED IDEOGRAPH
+ {0xE9C9, 0x8E0A}, //15115 #CJK UNIFIED IDEOGRAPH
+ {0xE9CA, 0x9394}, //15116 #CJK UNIFIED IDEOGRAPH
+ {0xE9CB, 0x93DE}, //15117 #CJK UNIFIED IDEOGRAPH
+ {0xE9CC, 0xF9C4}, //15118 #CJK COMPATIBILITY IDEOGRAPH
+ {0xE9CD, 0x4E8E}, //15119 #CJK UNIFIED IDEOGRAPH
+ {0xE9CE, 0x4F51}, //15120 #CJK UNIFIED IDEOGRAPH
+ {0xE9CF, 0x5076}, //15121 #CJK UNIFIED IDEOGRAPH
+ {0xE9D0, 0x512A}, //15122 #CJK UNIFIED IDEOGRAPH
+ {0xE9D1, 0x53C8}, //15123 #CJK UNIFIED IDEOGRAPH
+ {0xE9D2, 0x53CB}, //15124 #CJK UNIFIED IDEOGRAPH
+ {0xE9D3, 0x53F3}, //15125 #CJK UNIFIED IDEOGRAPH
+ {0xE9D4, 0x5B87}, //15126 #CJK UNIFIED IDEOGRAPH
+ {0xE9D5, 0x5BD3}, //15127 #CJK UNIFIED IDEOGRAPH
+ {0xE9D6, 0x5C24}, //15128 #CJK UNIFIED IDEOGRAPH
+ {0xE9D7, 0x611A}, //15129 #CJK UNIFIED IDEOGRAPH
+ {0xE9D8, 0x6182}, //15130 #CJK UNIFIED IDEOGRAPH
+ {0xE9D9, 0x65F4}, //15131 #CJK UNIFIED IDEOGRAPH
+ {0xE9DA, 0x725B}, //15132 #CJK UNIFIED IDEOGRAPH
+ {0xE9DB, 0x7397}, //15133 #CJK UNIFIED IDEOGRAPH
+ {0xE9DC, 0x7440}, //15134 #CJK UNIFIED IDEOGRAPH
+ {0xE9DD, 0x76C2}, //15135 #CJK UNIFIED IDEOGRAPH
+ {0xE9DE, 0x7950}, //15136 #CJK UNIFIED IDEOGRAPH
+ {0xE9DF, 0x7991}, //15137 #CJK UNIFIED IDEOGRAPH
+ {0xE9E0, 0x79B9}, //15138 #CJK UNIFIED IDEOGRAPH
+ {0xE9E1, 0x7D06}, //15139 #CJK UNIFIED IDEOGRAPH
+ {0xE9E2, 0x7FBD}, //15140 #CJK UNIFIED IDEOGRAPH
+ {0xE9E3, 0x828B}, //15141 #CJK UNIFIED IDEOGRAPH
+ {0xE9E4, 0x85D5}, //15142 #CJK UNIFIED IDEOGRAPH
+ {0xE9E5, 0x865E}, //15143 #CJK UNIFIED IDEOGRAPH
+ {0xE9E6, 0x8FC2}, //15144 #CJK UNIFIED IDEOGRAPH
+ {0xE9E7, 0x9047}, //15145 #CJK UNIFIED IDEOGRAPH
+ {0xE9E8, 0x90F5}, //15146 #CJK UNIFIED IDEOGRAPH
+ {0xE9E9, 0x91EA}, //15147 #CJK UNIFIED IDEOGRAPH
+ {0xE9EA, 0x9685}, //15148 #CJK UNIFIED IDEOGRAPH
+ {0xE9EB, 0x96E8}, //15149 #CJK UNIFIED IDEOGRAPH
+ {0xE9EC, 0x96E9}, //15150 #CJK UNIFIED IDEOGRAPH
+ {0xE9ED, 0x52D6}, //15151 #CJK UNIFIED IDEOGRAPH
+ {0xE9EE, 0x5F67}, //15152 #CJK UNIFIED IDEOGRAPH
+ {0xE9EF, 0x65ED}, //15153 #CJK UNIFIED IDEOGRAPH
+ {0xE9F0, 0x6631}, //15154 #CJK UNIFIED IDEOGRAPH
+ {0xE9F1, 0x682F}, //15155 #CJK UNIFIED IDEOGRAPH
+ {0xE9F2, 0x715C}, //15156 #CJK UNIFIED IDEOGRAPH
+ {0xE9F3, 0x7A36}, //15157 #CJK UNIFIED IDEOGRAPH
+ {0xE9F4, 0x90C1}, //15158 #CJK UNIFIED IDEOGRAPH
+ {0xE9F5, 0x980A}, //15159 #CJK UNIFIED IDEOGRAPH
+ {0xE9F6, 0x4E91}, //15160 #CJK UNIFIED IDEOGRAPH
+ {0xE9F7, 0xF9C5}, //15161 #CJK COMPATIBILITY IDEOGRAPH
+ {0xE9F8, 0x6A52}, //15162 #CJK UNIFIED IDEOGRAPH
+ {0xE9F9, 0x6B9E}, //15163 #CJK UNIFIED IDEOGRAPH
+ {0xE9FA, 0x6F90}, //15164 #CJK UNIFIED IDEOGRAPH
+ {0xE9FB, 0x7189}, //15165 #CJK UNIFIED IDEOGRAPH
+ {0xE9FC, 0x8018}, //15166 #CJK UNIFIED IDEOGRAPH
+ {0xE9FD, 0x82B8}, //15167 #CJK UNIFIED IDEOGRAPH
+ {0xE9FE, 0x8553}, //15168 #CJK UNIFIED IDEOGRAPH
+ {0xEAA1, 0x904B}, //15169 #CJK UNIFIED IDEOGRAPH
+ {0xEAA2, 0x9695}, //15170 #CJK UNIFIED IDEOGRAPH
+ {0xEAA3, 0x96F2}, //15171 #CJK UNIFIED IDEOGRAPH
+ {0xEAA4, 0x97FB}, //15172 #CJK UNIFIED IDEOGRAPH
+ {0xEAA5, 0x851A}, //15173 #CJK UNIFIED IDEOGRAPH
+ {0xEAA6, 0x9B31}, //15174 #CJK UNIFIED IDEOGRAPH
+ {0xEAA7, 0x4E90}, //15175 #CJK UNIFIED IDEOGRAPH
+ {0xEAA8, 0x718A}, //15176 #CJK UNIFIED IDEOGRAPH
+ {0xEAA9, 0x96C4}, //15177 #CJK UNIFIED IDEOGRAPH
+ {0xEAAA, 0x5143}, //15178 #CJK UNIFIED IDEOGRAPH
+ {0xEAAB, 0x539F}, //15179 #CJK UNIFIED IDEOGRAPH
+ {0xEAAC, 0x54E1}, //15180 #CJK UNIFIED IDEOGRAPH
+ {0xEAAD, 0x5713}, //15181 #CJK UNIFIED IDEOGRAPH
+ {0xEAAE, 0x5712}, //15182 #CJK UNIFIED IDEOGRAPH
+ {0xEAAF, 0x57A3}, //15183 #CJK UNIFIED IDEOGRAPH
+ {0xEAB0, 0x5A9B}, //15184 #CJK UNIFIED IDEOGRAPH
+ {0xEAB1, 0x5AC4}, //15185 #CJK UNIFIED IDEOGRAPH
+ {0xEAB2, 0x5BC3}, //15186 #CJK UNIFIED IDEOGRAPH
+ {0xEAB3, 0x6028}, //15187 #CJK UNIFIED IDEOGRAPH
+ {0xEAB4, 0x613F}, //15188 #CJK UNIFIED IDEOGRAPH
+ {0xEAB5, 0x63F4}, //15189 #CJK UNIFIED IDEOGRAPH
+ {0xEAB6, 0x6C85}, //15190 #CJK UNIFIED IDEOGRAPH
+ {0xEAB7, 0x6D39}, //15191 #CJK UNIFIED IDEOGRAPH
+ {0xEAB8, 0x6E72}, //15192 #CJK UNIFIED IDEOGRAPH
+ {0xEAB9, 0x6E90}, //15193 #CJK UNIFIED IDEOGRAPH
+ {0xEABA, 0x7230}, //15194 #CJK UNIFIED IDEOGRAPH
+ {0xEABB, 0x733F}, //15195 #CJK UNIFIED IDEOGRAPH
+ {0xEABC, 0x7457}, //15196 #CJK UNIFIED IDEOGRAPH
+ {0xEABD, 0x82D1}, //15197 #CJK UNIFIED IDEOGRAPH
+ {0xEABE, 0x8881}, //15198 #CJK UNIFIED IDEOGRAPH
+ {0xEABF, 0x8F45}, //15199 #CJK UNIFIED IDEOGRAPH
+ {0xEAC0, 0x9060}, //15200 #CJK UNIFIED IDEOGRAPH
+ {0xEAC1, 0xF9C6}, //15201 #CJK COMPATIBILITY IDEOGRAPH
+ {0xEAC2, 0x9662}, //15202 #CJK UNIFIED IDEOGRAPH
+ {0xEAC3, 0x9858}, //15203 #CJK UNIFIED IDEOGRAPH
+ {0xEAC4, 0x9D1B}, //15204 #CJK UNIFIED IDEOGRAPH
+ {0xEAC5, 0x6708}, //15205 #CJK UNIFIED IDEOGRAPH
+ {0xEAC6, 0x8D8A}, //15206 #CJK UNIFIED IDEOGRAPH
+ {0xEAC7, 0x925E}, //15207 #CJK UNIFIED IDEOGRAPH
+ {0xEAC8, 0x4F4D}, //15208 #CJK UNIFIED IDEOGRAPH
+ {0xEAC9, 0x5049}, //15209 #CJK UNIFIED IDEOGRAPH
+ {0xEACA, 0x50DE}, //15210 #CJK UNIFIED IDEOGRAPH
+ {0xEACB, 0x5371}, //15211 #CJK UNIFIED IDEOGRAPH
+ {0xEACC, 0x570D}, //15212 #CJK UNIFIED IDEOGRAPH
+ {0xEACD, 0x59D4}, //15213 #CJK UNIFIED IDEOGRAPH
+ {0xEACE, 0x5A01}, //15214 #CJK UNIFIED IDEOGRAPH
+ {0xEACF, 0x5C09}, //15215 #CJK UNIFIED IDEOGRAPH
+ {0xEAD0, 0x6170}, //15216 #CJK UNIFIED IDEOGRAPH
+ {0xEAD1, 0x6690}, //15217 #CJK UNIFIED IDEOGRAPH
+ {0xEAD2, 0x6E2D}, //15218 #CJK UNIFIED IDEOGRAPH
+ {0xEAD3, 0x7232}, //15219 #CJK UNIFIED IDEOGRAPH
+ {0xEAD4, 0x744B}, //15220 #CJK UNIFIED IDEOGRAPH
+ {0xEAD5, 0x7DEF}, //15221 #CJK UNIFIED IDEOGRAPH
+ {0xEAD6, 0x80C3}, //15222 #CJK UNIFIED IDEOGRAPH
+ {0xEAD7, 0x840E}, //15223 #CJK UNIFIED IDEOGRAPH
+ {0xEAD8, 0x8466}, //15224 #CJK UNIFIED IDEOGRAPH
+ {0xEAD9, 0x853F}, //15225 #CJK UNIFIED IDEOGRAPH
+ {0xEADA, 0x875F}, //15226 #CJK UNIFIED IDEOGRAPH
+ {0xEADB, 0x885B}, //15227 #CJK UNIFIED IDEOGRAPH
+ {0xEADC, 0x8918}, //15228 #CJK UNIFIED IDEOGRAPH
+ {0xEADD, 0x8B02}, //15229 #CJK UNIFIED IDEOGRAPH
+ {0xEADE, 0x9055}, //15230 #CJK UNIFIED IDEOGRAPH
+ {0xEADF, 0x97CB}, //15231 #CJK UNIFIED IDEOGRAPH
+ {0xEAE0, 0x9B4F}, //15232 #CJK UNIFIED IDEOGRAPH
+ {0xEAE1, 0x4E73}, //15233 #CJK UNIFIED IDEOGRAPH
+ {0xEAE2, 0x4F91}, //15234 #CJK UNIFIED IDEOGRAPH
+ {0xEAE3, 0x5112}, //15235 #CJK UNIFIED IDEOGRAPH
+ {0xEAE4, 0x516A}, //15236 #CJK UNIFIED IDEOGRAPH
+ {0xEAE5, 0xF9C7}, //15237 #CJK COMPATIBILITY IDEOGRAPH
+ {0xEAE6, 0x552F}, //15238 #CJK UNIFIED IDEOGRAPH
+ {0xEAE7, 0x55A9}, //15239 #CJK UNIFIED IDEOGRAPH
+ {0xEAE8, 0x5B7A}, //15240 #CJK UNIFIED IDEOGRAPH
+ {0xEAE9, 0x5BA5}, //15241 #CJK UNIFIED IDEOGRAPH
+ {0xEAEA, 0x5E7C}, //15242 #CJK UNIFIED IDEOGRAPH
+ {0xEAEB, 0x5E7D}, //15243 #CJK UNIFIED IDEOGRAPH
+ {0xEAEC, 0x5EBE}, //15244 #CJK UNIFIED IDEOGRAPH
+ {0xEAED, 0x60A0}, //15245 #CJK UNIFIED IDEOGRAPH
+ {0xEAEE, 0x60DF}, //15246 #CJK UNIFIED IDEOGRAPH
+ {0xEAEF, 0x6108}, //15247 #CJK UNIFIED IDEOGRAPH
+ {0xEAF0, 0x6109}, //15248 #CJK UNIFIED IDEOGRAPH
+ {0xEAF1, 0x63C4}, //15249 #CJK UNIFIED IDEOGRAPH
+ {0xEAF2, 0x6538}, //15250 #CJK UNIFIED IDEOGRAPH
+ {0xEAF3, 0x6709}, //15251 #CJK UNIFIED IDEOGRAPH
+ {0xEAF4, 0xF9C8}, //15252 #CJK COMPATIBILITY IDEOGRAPH
+ {0xEAF5, 0x67D4}, //15253 #CJK UNIFIED IDEOGRAPH
+ {0xEAF6, 0x67DA}, //15254 #CJK UNIFIED IDEOGRAPH
+ {0xEAF7, 0xF9C9}, //15255 #CJK COMPATIBILITY IDEOGRAPH
+ {0xEAF8, 0x6961}, //15256 #CJK UNIFIED IDEOGRAPH
+ {0xEAF9, 0x6962}, //15257 #CJK UNIFIED IDEOGRAPH
+ {0xEAFA, 0x6CB9}, //15258 #CJK UNIFIED IDEOGRAPH
+ {0xEAFB, 0x6D27}, //15259 #CJK UNIFIED IDEOGRAPH
+ {0xEAFC, 0xF9CA}, //15260 #CJK COMPATIBILITY IDEOGRAPH
+ {0xEAFD, 0x6E38}, //15261 #CJK UNIFIED IDEOGRAPH
+ {0xEAFE, 0xF9CB}, //15262 #CJK COMPATIBILITY IDEOGRAPH
+ {0xEBA1, 0x6FE1}, //15263 #CJK UNIFIED IDEOGRAPH
+ {0xEBA2, 0x7336}, //15264 #CJK UNIFIED IDEOGRAPH
+ {0xEBA3, 0x7337}, //15265 #CJK UNIFIED IDEOGRAPH
+ {0xEBA4, 0xF9CC}, //15266 #CJK COMPATIBILITY IDEOGRAPH
+ {0xEBA5, 0x745C}, //15267 #CJK UNIFIED IDEOGRAPH
+ {0xEBA6, 0x7531}, //15268 #CJK UNIFIED IDEOGRAPH
+ {0xEBA7, 0xF9CD}, //15269 #CJK COMPATIBILITY IDEOGRAPH
+ {0xEBA8, 0x7652}, //15270 #CJK UNIFIED IDEOGRAPH
+ {0xEBA9, 0xF9CE}, //15271 #CJK COMPATIBILITY IDEOGRAPH
+ {0xEBAA, 0xF9CF}, //15272 #CJK COMPATIBILITY IDEOGRAPH
+ {0xEBAB, 0x7DAD}, //15273 #CJK UNIFIED IDEOGRAPH
+ {0xEBAC, 0x81FE}, //15274 #CJK UNIFIED IDEOGRAPH
+ {0xEBAD, 0x8438}, //15275 #CJK UNIFIED IDEOGRAPH
+ {0xEBAE, 0x88D5}, //15276 #CJK UNIFIED IDEOGRAPH
+ {0xEBAF, 0x8A98}, //15277 #CJK UNIFIED IDEOGRAPH
+ {0xEBB0, 0x8ADB}, //15278 #CJK UNIFIED IDEOGRAPH
+ {0xEBB1, 0x8AED}, //15279 #CJK UNIFIED IDEOGRAPH
+ {0xEBB2, 0x8E30}, //15280 #CJK UNIFIED IDEOGRAPH
+ {0xEBB3, 0x8E42}, //15281 #CJK UNIFIED IDEOGRAPH
+ {0xEBB4, 0x904A}, //15282 #CJK UNIFIED IDEOGRAPH
+ {0xEBB5, 0x903E}, //15283 #CJK UNIFIED IDEOGRAPH
+ {0xEBB6, 0x907A}, //15284 #CJK UNIFIED IDEOGRAPH
+ {0xEBB7, 0x9149}, //15285 #CJK UNIFIED IDEOGRAPH
+ {0xEBB8, 0x91C9}, //15286 #CJK UNIFIED IDEOGRAPH
+ {0xEBB9, 0x936E}, //15287 #CJK UNIFIED IDEOGRAPH
+ {0xEBBA, 0xF9D0}, //15288 #CJK COMPATIBILITY IDEOGRAPH
+ {0xEBBB, 0xF9D1}, //15289 #CJK COMPATIBILITY IDEOGRAPH
+ {0xEBBC, 0x5809}, //15290 #CJK UNIFIED IDEOGRAPH
+ {0xEBBD, 0xF9D2}, //15291 #CJK COMPATIBILITY IDEOGRAPH
+ {0xEBBE, 0x6BD3}, //15292 #CJK UNIFIED IDEOGRAPH
+ {0xEBBF, 0x8089}, //15293 #CJK UNIFIED IDEOGRAPH
+ {0xEBC0, 0x80B2}, //15294 #CJK UNIFIED IDEOGRAPH
+ {0xEBC1, 0xF9D3}, //15295 #CJK COMPATIBILITY IDEOGRAPH
+ {0xEBC2, 0xF9D4}, //15296 #CJK COMPATIBILITY IDEOGRAPH
+ {0xEBC3, 0x5141}, //15297 #CJK UNIFIED IDEOGRAPH
+ {0xEBC4, 0x596B}, //15298 #CJK UNIFIED IDEOGRAPH
+ {0xEBC5, 0x5C39}, //15299 #CJK UNIFIED IDEOGRAPH
+ {0xEBC6, 0xF9D5}, //15300 #CJK COMPATIBILITY IDEOGRAPH
+ {0xEBC7, 0xF9D6}, //15301 #CJK COMPATIBILITY IDEOGRAPH
+ {0xEBC8, 0x6F64}, //15302 #CJK UNIFIED IDEOGRAPH
+ {0xEBC9, 0x73A7}, //15303 #CJK UNIFIED IDEOGRAPH
+ {0xEBCA, 0x80E4}, //15304 #CJK UNIFIED IDEOGRAPH
+ {0xEBCB, 0x8D07}, //15305 #CJK UNIFIED IDEOGRAPH
+ {0xEBCC, 0xF9D7}, //15306 #CJK COMPATIBILITY IDEOGRAPH
+ {0xEBCD, 0x9217}, //15307 #CJK UNIFIED IDEOGRAPH
+ {0xEBCE, 0x958F}, //15308 #CJK UNIFIED IDEOGRAPH
+ {0xEBCF, 0xF9D8}, //15309 #CJK COMPATIBILITY IDEOGRAPH
+ {0xEBD0, 0xF9D9}, //15310 #CJK COMPATIBILITY IDEOGRAPH
+ {0xEBD1, 0xF9DA}, //15311 #CJK COMPATIBILITY IDEOGRAPH
+ {0xEBD2, 0xF9DB}, //15312 #CJK COMPATIBILITY IDEOGRAPH
+ {0xEBD3, 0x807F}, //15313 #CJK UNIFIED IDEOGRAPH
+ {0xEBD4, 0x620E}, //15314 #CJK UNIFIED IDEOGRAPH
+ {0xEBD5, 0x701C}, //15315 #CJK UNIFIED IDEOGRAPH
+ {0xEBD6, 0x7D68}, //15316 #CJK UNIFIED IDEOGRAPH
+ {0xEBD7, 0x878D}, //15317 #CJK UNIFIED IDEOGRAPH
+ {0xEBD8, 0xF9DC}, //15318 #CJK COMPATIBILITY IDEOGRAPH
+ {0xEBD9, 0x57A0}, //15319 #CJK UNIFIED IDEOGRAPH
+ {0xEBDA, 0x6069}, //15320 #CJK UNIFIED IDEOGRAPH
+ {0xEBDB, 0x6147}, //15321 #CJK UNIFIED IDEOGRAPH
+ {0xEBDC, 0x6BB7}, //15322 #CJK UNIFIED IDEOGRAPH
+ {0xEBDD, 0x8ABE}, //15323 #CJK UNIFIED IDEOGRAPH
+ {0xEBDE, 0x9280}, //15324 #CJK UNIFIED IDEOGRAPH
+ {0xEBDF, 0x96B1}, //15325 #CJK UNIFIED IDEOGRAPH
+ {0xEBE0, 0x4E59}, //15326 #CJK UNIFIED IDEOGRAPH
+ {0xEBE1, 0x541F}, //15327 #CJK UNIFIED IDEOGRAPH
+ {0xEBE2, 0x6DEB}, //15328 #CJK UNIFIED IDEOGRAPH
+ {0xEBE3, 0x852D}, //15329 #CJK UNIFIED IDEOGRAPH
+ {0xEBE4, 0x9670}, //15330 #CJK UNIFIED IDEOGRAPH
+ {0xEBE5, 0x97F3}, //15331 #CJK UNIFIED IDEOGRAPH
+ {0xEBE6, 0x98EE}, //15332 #CJK UNIFIED IDEOGRAPH
+ {0xEBE7, 0x63D6}, //15333 #CJK UNIFIED IDEOGRAPH
+ {0xEBE8, 0x6CE3}, //15334 #CJK UNIFIED IDEOGRAPH
+ {0xEBE9, 0x9091}, //15335 #CJK UNIFIED IDEOGRAPH
+ {0xEBEA, 0x51DD}, //15336 #CJK UNIFIED IDEOGRAPH
+ {0xEBEB, 0x61C9}, //15337 #CJK UNIFIED IDEOGRAPH
+ {0xEBEC, 0x81BA}, //15338 #CJK UNIFIED IDEOGRAPH
+ {0xEBED, 0x9DF9}, //15339 #CJK UNIFIED IDEOGRAPH
+ {0xEBEE, 0x4F9D}, //15340 #CJK UNIFIED IDEOGRAPH
+ {0xEBEF, 0x501A}, //15341 #CJK UNIFIED IDEOGRAPH
+ {0xEBF0, 0x5100}, //15342 #CJK UNIFIED IDEOGRAPH
+ {0xEBF1, 0x5B9C}, //15343 #CJK UNIFIED IDEOGRAPH
+ {0xEBF2, 0x610F}, //15344 #CJK UNIFIED IDEOGRAPH
+ {0xEBF3, 0x61FF}, //15345 #CJK UNIFIED IDEOGRAPH
+ {0xEBF4, 0x64EC}, //15346 #CJK UNIFIED IDEOGRAPH
+ {0xEBF5, 0x6905}, //15347 #CJK UNIFIED IDEOGRAPH
+ {0xEBF6, 0x6BC5}, //15348 #CJK UNIFIED IDEOGRAPH
+ {0xEBF7, 0x7591}, //15349 #CJK UNIFIED IDEOGRAPH
+ {0xEBF8, 0x77E3}, //15350 #CJK UNIFIED IDEOGRAPH
+ {0xEBF9, 0x7FA9}, //15351 #CJK UNIFIED IDEOGRAPH
+ {0xEBFA, 0x8264}, //15352 #CJK UNIFIED IDEOGRAPH
+ {0xEBFB, 0x858F}, //15353 #CJK UNIFIED IDEOGRAPH
+ {0xEBFC, 0x87FB}, //15354 #CJK UNIFIED IDEOGRAPH
+ {0xEBFD, 0x8863}, //15355 #CJK UNIFIED IDEOGRAPH
+ {0xEBFE, 0x8ABC}, //15356 #CJK UNIFIED IDEOGRAPH
+ {0xECA1, 0x8B70}, //15357 #CJK UNIFIED IDEOGRAPH
+ {0xECA2, 0x91AB}, //15358 #CJK UNIFIED IDEOGRAPH
+ {0xECA3, 0x4E8C}, //15359 #CJK UNIFIED IDEOGRAPH
+ {0xECA4, 0x4EE5}, //15360 #CJK UNIFIED IDEOGRAPH
+ {0xECA5, 0x4F0A}, //15361 #CJK UNIFIED IDEOGRAPH
+ {0xECA6, 0xF9DD}, //15362 #CJK COMPATIBILITY IDEOGRAPH
+ {0xECA7, 0xF9DE}, //15363 #CJK COMPATIBILITY IDEOGRAPH
+ {0xECA8, 0x5937}, //15364 #CJK UNIFIED IDEOGRAPH
+ {0xECA9, 0x59E8}, //15365 #CJK UNIFIED IDEOGRAPH
+ {0xECAA, 0xF9DF}, //15366 #CJK COMPATIBILITY IDEOGRAPH
+ {0xECAB, 0x5DF2}, //15367 #CJK UNIFIED IDEOGRAPH
+ {0xECAC, 0x5F1B}, //15368 #CJK UNIFIED IDEOGRAPH
+ {0xECAD, 0x5F5B}, //15369 #CJK UNIFIED IDEOGRAPH
+ {0xECAE, 0x6021}, //15370 #CJK UNIFIED IDEOGRAPH
+ {0xECAF, 0xF9E0}, //15371 #CJK COMPATIBILITY IDEOGRAPH
+ {0xECB0, 0xF9E1}, //15372 #CJK COMPATIBILITY IDEOGRAPH
+ {0xECB1, 0xF9E2}, //15373 #CJK COMPATIBILITY IDEOGRAPH
+ {0xECB2, 0xF9E3}, //15374 #CJK COMPATIBILITY IDEOGRAPH
+ {0xECB3, 0x723E}, //15375 #CJK UNIFIED IDEOGRAPH
+ {0xECB4, 0x73E5}, //15376 #CJK UNIFIED IDEOGRAPH
+ {0xECB5, 0xF9E4}, //15377 #CJK COMPATIBILITY IDEOGRAPH
+ {0xECB6, 0x7570}, //15378 #CJK UNIFIED IDEOGRAPH
+ {0xECB7, 0x75CD}, //15379 #CJK UNIFIED IDEOGRAPH
+ {0xECB8, 0xF9E5}, //15380 #CJK COMPATIBILITY IDEOGRAPH
+ {0xECB9, 0x79FB}, //15381 #CJK UNIFIED IDEOGRAPH
+ {0xECBA, 0xF9E6}, //15382 #CJK COMPATIBILITY IDEOGRAPH
+ {0xECBB, 0x800C}, //15383 #CJK UNIFIED IDEOGRAPH
+ {0xECBC, 0x8033}, //15384 #CJK UNIFIED IDEOGRAPH
+ {0xECBD, 0x8084}, //15385 #CJK UNIFIED IDEOGRAPH
+ {0xECBE, 0x82E1}, //15386 #CJK UNIFIED IDEOGRAPH
+ {0xECBF, 0x8351}, //15387 #CJK UNIFIED IDEOGRAPH
+ {0xECC0, 0xF9E7}, //15388 #CJK COMPATIBILITY IDEOGRAPH
+ {0xECC1, 0xF9E8}, //15389 #CJK COMPATIBILITY IDEOGRAPH
+ {0xECC2, 0x8CBD}, //15390 #CJK UNIFIED IDEOGRAPH
+ {0xECC3, 0x8CB3}, //15391 #CJK UNIFIED IDEOGRAPH
+ {0xECC4, 0x9087}, //15392 #CJK UNIFIED IDEOGRAPH
+ {0xECC5, 0xF9E9}, //15393 #CJK COMPATIBILITY IDEOGRAPH
+ {0xECC6, 0xF9EA}, //15394 #CJK COMPATIBILITY IDEOGRAPH
+ {0xECC7, 0x98F4}, //15395 #CJK UNIFIED IDEOGRAPH
+ {0xECC8, 0x990C}, //15396 #CJK UNIFIED IDEOGRAPH
+ {0xECC9, 0xF9EB}, //15397 #CJK COMPATIBILITY IDEOGRAPH
+ {0xECCA, 0xF9EC}, //15398 #CJK COMPATIBILITY IDEOGRAPH
+ {0xECCB, 0x7037}, //15399 #CJK UNIFIED IDEOGRAPH
+ {0xECCC, 0x76CA}, //15400 #CJK UNIFIED IDEOGRAPH
+ {0xECCD, 0x7FCA}, //15401 #CJK UNIFIED IDEOGRAPH
+ {0xECCE, 0x7FCC}, //15402 #CJK UNIFIED IDEOGRAPH
+ {0xECCF, 0x7FFC}, //15403 #CJK UNIFIED IDEOGRAPH
+ {0xECD0, 0x8B1A}, //15404 #CJK UNIFIED IDEOGRAPH
+ {0xECD1, 0x4EBA}, //15405 #CJK UNIFIED IDEOGRAPH
+ {0xECD2, 0x4EC1}, //15406 #CJK UNIFIED IDEOGRAPH
+ {0xECD3, 0x5203}, //15407 #CJK UNIFIED IDEOGRAPH
+ {0xECD4, 0x5370}, //15408 #CJK UNIFIED IDEOGRAPH
+ {0xECD5, 0xF9ED}, //15409 #CJK COMPATIBILITY IDEOGRAPH
+ {0xECD6, 0x54BD}, //15410 #CJK UNIFIED IDEOGRAPH
+ {0xECD7, 0x56E0}, //15411 #CJK UNIFIED IDEOGRAPH
+ {0xECD8, 0x59FB}, //15412 #CJK UNIFIED IDEOGRAPH
+ {0xECD9, 0x5BC5}, //15413 #CJK UNIFIED IDEOGRAPH
+ {0xECDA, 0x5F15}, //15414 #CJK UNIFIED IDEOGRAPH
+ {0xECDB, 0x5FCD}, //15415 #CJK UNIFIED IDEOGRAPH
+ {0xECDC, 0x6E6E}, //15416 #CJK UNIFIED IDEOGRAPH
+ {0xECDD, 0xF9EE}, //15417 #CJK COMPATIBILITY IDEOGRAPH
+ {0xECDE, 0xF9EF}, //15418 #CJK COMPATIBILITY IDEOGRAPH
+ {0xECDF, 0x7D6A}, //15419 #CJK UNIFIED IDEOGRAPH
+ {0xECE0, 0x8335}, //15420 #CJK UNIFIED IDEOGRAPH
+ {0xECE1, 0xF9F0}, //15421 #CJK COMPATIBILITY IDEOGRAPH
+ {0xECE2, 0x8693}, //15422 #CJK UNIFIED IDEOGRAPH
+ {0xECE3, 0x8A8D}, //15423 #CJK UNIFIED IDEOGRAPH
+ {0xECE4, 0xF9F1}, //15424 #CJK COMPATIBILITY IDEOGRAPH
+ {0xECE5, 0x976D}, //15425 #CJK UNIFIED IDEOGRAPH
+ {0xECE6, 0x9777}, //15426 #CJK UNIFIED IDEOGRAPH
+ {0xECE7, 0xF9F2}, //15427 #CJK COMPATIBILITY IDEOGRAPH
+ {0xECE8, 0xF9F3}, //15428 #CJK COMPATIBILITY IDEOGRAPH
+ {0xECE9, 0x4E00}, //15429 #CJK UNIFIED IDEOGRAPH
+ {0xECEA, 0x4F5A}, //15430 #CJK UNIFIED IDEOGRAPH
+ {0xECEB, 0x4F7E}, //15431 #CJK UNIFIED IDEOGRAPH
+ {0xECEC, 0x58F9}, //15432 #CJK UNIFIED IDEOGRAPH
+ {0xECED, 0x65E5}, //15433 #CJK UNIFIED IDEOGRAPH
+ {0xECEE, 0x6EA2}, //15434 #CJK UNIFIED IDEOGRAPH
+ {0xECEF, 0x9038}, //15435 #CJK UNIFIED IDEOGRAPH
+ {0xECF0, 0x93B0}, //15436 #CJK UNIFIED IDEOGRAPH
+ {0xECF1, 0x99B9}, //15437 #CJK UNIFIED IDEOGRAPH
+ {0xECF2, 0x4EFB}, //15438 #CJK UNIFIED IDEOGRAPH
+ {0xECF3, 0x58EC}, //15439 #CJK UNIFIED IDEOGRAPH
+ {0xECF4, 0x598A}, //15440 #CJK UNIFIED IDEOGRAPH
+ {0xECF5, 0x59D9}, //15441 #CJK UNIFIED IDEOGRAPH
+ {0xECF6, 0x6041}, //15442 #CJK UNIFIED IDEOGRAPH
+ {0xECF7, 0xF9F4}, //15443 #CJK COMPATIBILITY IDEOGRAPH
+ {0xECF8, 0xF9F5}, //15444 #CJK COMPATIBILITY IDEOGRAPH
+ {0xECF9, 0x7A14}, //15445 #CJK UNIFIED IDEOGRAPH
+ {0xECFA, 0xF9F6}, //15446 #CJK COMPATIBILITY IDEOGRAPH
+ {0xECFB, 0x834F}, //15447 #CJK UNIFIED IDEOGRAPH
+ {0xECFC, 0x8CC3}, //15448 #CJK UNIFIED IDEOGRAPH
+ {0xECFD, 0x5165}, //15449 #CJK UNIFIED IDEOGRAPH
+ {0xECFE, 0x5344}, //15450 #CJK UNIFIED IDEOGRAPH
+ {0xEDA1, 0xF9F7}, //15451 #CJK COMPATIBILITY IDEOGRAPH
+ {0xEDA2, 0xF9F8}, //15452 #CJK COMPATIBILITY IDEOGRAPH
+ {0xEDA3, 0xF9F9}, //15453 #CJK COMPATIBILITY IDEOGRAPH
+ {0xEDA4, 0x4ECD}, //15454 #CJK UNIFIED IDEOGRAPH
+ {0xEDA5, 0x5269}, //15455 #CJK UNIFIED IDEOGRAPH
+ {0xEDA6, 0x5B55}, //15456 #CJK UNIFIED IDEOGRAPH
+ {0xEDA7, 0x82BF}, //15457 #CJK UNIFIED IDEOGRAPH
+ {0xEDA8, 0x4ED4}, //15458 #CJK UNIFIED IDEOGRAPH
+ {0xEDA9, 0x523A}, //15459 #CJK UNIFIED IDEOGRAPH
+ {0xEDAA, 0x54A8}, //15460 #CJK UNIFIED IDEOGRAPH
+ {0xEDAB, 0x59C9}, //15461 #CJK UNIFIED IDEOGRAPH
+ {0xEDAC, 0x59FF}, //15462 #CJK UNIFIED IDEOGRAPH
+ {0xEDAD, 0x5B50}, //15463 #CJK UNIFIED IDEOGRAPH
+ {0xEDAE, 0x5B57}, //15464 #CJK UNIFIED IDEOGRAPH
+ {0xEDAF, 0x5B5C}, //15465 #CJK UNIFIED IDEOGRAPH
+ {0xEDB0, 0x6063}, //15466 #CJK UNIFIED IDEOGRAPH
+ {0xEDB1, 0x6148}, //15467 #CJK UNIFIED IDEOGRAPH
+ {0xEDB2, 0x6ECB}, //15468 #CJK UNIFIED IDEOGRAPH
+ {0xEDB3, 0x7099}, //15469 #CJK UNIFIED IDEOGRAPH
+ {0xEDB4, 0x716E}, //15470 #CJK UNIFIED IDEOGRAPH
+ {0xEDB5, 0x7386}, //15471 #CJK UNIFIED IDEOGRAPH
+ {0xEDB6, 0x74F7}, //15472 #CJK UNIFIED IDEOGRAPH
+ {0xEDB7, 0x75B5}, //15473 #CJK UNIFIED IDEOGRAPH
+ {0xEDB8, 0x78C1}, //15474 #CJK UNIFIED IDEOGRAPH
+ {0xEDB9, 0x7D2B}, //15475 #CJK UNIFIED IDEOGRAPH
+ {0xEDBA, 0x8005}, //15476 #CJK UNIFIED IDEOGRAPH
+ {0xEDBB, 0x81EA}, //15477 #CJK UNIFIED IDEOGRAPH
+ {0xEDBC, 0x8328}, //15478 #CJK UNIFIED IDEOGRAPH
+ {0xEDBD, 0x8517}, //15479 #CJK UNIFIED IDEOGRAPH
+ {0xEDBE, 0x85C9}, //15480 #CJK UNIFIED IDEOGRAPH
+ {0xEDBF, 0x8AEE}, //15481 #CJK UNIFIED IDEOGRAPH
+ {0xEDC0, 0x8CC7}, //15482 #CJK UNIFIED IDEOGRAPH
+ {0xEDC1, 0x96CC}, //15483 #CJK UNIFIED IDEOGRAPH
+ {0xEDC2, 0x4F5C}, //15484 #CJK UNIFIED IDEOGRAPH
+ {0xEDC3, 0x52FA}, //15485 #CJK UNIFIED IDEOGRAPH
+ {0xEDC4, 0x56BC}, //15486 #CJK UNIFIED IDEOGRAPH
+ {0xEDC5, 0x65AB}, //15487 #CJK UNIFIED IDEOGRAPH
+ {0xEDC6, 0x6628}, //15488 #CJK UNIFIED IDEOGRAPH
+ {0xEDC7, 0x707C}, //15489 #CJK UNIFIED IDEOGRAPH
+ {0xEDC8, 0x70B8}, //15490 #CJK UNIFIED IDEOGRAPH
+ {0xEDC9, 0x7235}, //15491 #CJK UNIFIED IDEOGRAPH
+ {0xEDCA, 0x7DBD}, //15492 #CJK UNIFIED IDEOGRAPH
+ {0xEDCB, 0x828D}, //15493 #CJK UNIFIED IDEOGRAPH
+ {0xEDCC, 0x914C}, //15494 #CJK UNIFIED IDEOGRAPH
+ {0xEDCD, 0x96C0}, //15495 #CJK UNIFIED IDEOGRAPH
+ {0xEDCE, 0x9D72}, //15496 #CJK UNIFIED IDEOGRAPH
+ {0xEDCF, 0x5B71}, //15497 #CJK UNIFIED IDEOGRAPH
+ {0xEDD0, 0x68E7}, //15498 #CJK UNIFIED IDEOGRAPH
+ {0xEDD1, 0x6B98}, //15499 #CJK UNIFIED IDEOGRAPH
+ {0xEDD2, 0x6F7A}, //15500 #CJK UNIFIED IDEOGRAPH
+ {0xEDD3, 0x76DE}, //15501 #CJK UNIFIED IDEOGRAPH
+ {0xEDD4, 0x5C91}, //15502 #CJK UNIFIED IDEOGRAPH
+ {0xEDD5, 0x66AB}, //15503 #CJK UNIFIED IDEOGRAPH
+ {0xEDD6, 0x6F5B}, //15504 #CJK UNIFIED IDEOGRAPH
+ {0xEDD7, 0x7BB4}, //15505 #CJK UNIFIED IDEOGRAPH
+ {0xEDD8, 0x7C2A}, //15506 #CJK UNIFIED IDEOGRAPH
+ {0xEDD9, 0x8836}, //15507 #CJK UNIFIED IDEOGRAPH
+ {0xEDDA, 0x96DC}, //15508 #CJK UNIFIED IDEOGRAPH
+ {0xEDDB, 0x4E08}, //15509 #CJK UNIFIED IDEOGRAPH
+ {0xEDDC, 0x4ED7}, //15510 #CJK UNIFIED IDEOGRAPH
+ {0xEDDD, 0x5320}, //15511 #CJK UNIFIED IDEOGRAPH
+ {0xEDDE, 0x5834}, //15512 #CJK UNIFIED IDEOGRAPH
+ {0xEDDF, 0x58BB}, //15513 #CJK UNIFIED IDEOGRAPH
+ {0xEDE0, 0x58EF}, //15514 #CJK UNIFIED IDEOGRAPH
+ {0xEDE1, 0x596C}, //15515 #CJK UNIFIED IDEOGRAPH
+ {0xEDE2, 0x5C07}, //15516 #CJK UNIFIED IDEOGRAPH
+ {0xEDE3, 0x5E33}, //15517 #CJK UNIFIED IDEOGRAPH
+ {0xEDE4, 0x5E84}, //15518 #CJK UNIFIED IDEOGRAPH
+ {0xEDE5, 0x5F35}, //15519 #CJK UNIFIED IDEOGRAPH
+ {0xEDE6, 0x638C}, //15520 #CJK UNIFIED IDEOGRAPH
+ {0xEDE7, 0x66B2}, //15521 #CJK UNIFIED IDEOGRAPH
+ {0xEDE8, 0x6756}, //15522 #CJK UNIFIED IDEOGRAPH
+ {0xEDE9, 0x6A1F}, //15523 #CJK UNIFIED IDEOGRAPH
+ {0xEDEA, 0x6AA3}, //15524 #CJK UNIFIED IDEOGRAPH
+ {0xEDEB, 0x6B0C}, //15525 #CJK UNIFIED IDEOGRAPH
+ {0xEDEC, 0x6F3F}, //15526 #CJK UNIFIED IDEOGRAPH
+ {0xEDED, 0x7246}, //15527 #CJK UNIFIED IDEOGRAPH
+ {0xEDEE, 0xF9FA}, //15528 #CJK COMPATIBILITY IDEOGRAPH
+ {0xEDEF, 0x7350}, //15529 #CJK UNIFIED IDEOGRAPH
+ {0xEDF0, 0x748B}, //15530 #CJK UNIFIED IDEOGRAPH
+ {0xEDF1, 0x7AE0}, //15531 #CJK UNIFIED IDEOGRAPH
+ {0xEDF2, 0x7CA7}, //15532 #CJK UNIFIED IDEOGRAPH
+ {0xEDF3, 0x8178}, //15533 #CJK UNIFIED IDEOGRAPH
+ {0xEDF4, 0x81DF}, //15534 #CJK UNIFIED IDEOGRAPH
+ {0xEDF5, 0x81E7}, //15535 #CJK UNIFIED IDEOGRAPH
+ {0xEDF6, 0x838A}, //15536 #CJK UNIFIED IDEOGRAPH
+ {0xEDF7, 0x846C}, //15537 #CJK UNIFIED IDEOGRAPH
+ {0xEDF8, 0x8523}, //15538 #CJK UNIFIED IDEOGRAPH
+ {0xEDF9, 0x8594}, //15539 #CJK UNIFIED IDEOGRAPH
+ {0xEDFA, 0x85CF}, //15540 #CJK UNIFIED IDEOGRAPH
+ {0xEDFB, 0x88DD}, //15541 #CJK UNIFIED IDEOGRAPH
+ {0xEDFC, 0x8D13}, //15542 #CJK UNIFIED IDEOGRAPH
+ {0xEDFD, 0x91AC}, //15543 #CJK UNIFIED IDEOGRAPH
+ {0xEDFE, 0x9577}, //15544 #CJK UNIFIED IDEOGRAPH
+ {0xEEA1, 0x969C}, //15545 #CJK UNIFIED IDEOGRAPH
+ {0xEEA2, 0x518D}, //15546 #CJK UNIFIED IDEOGRAPH
+ {0xEEA3, 0x54C9}, //15547 #CJK UNIFIED IDEOGRAPH
+ {0xEEA4, 0x5728}, //15548 #CJK UNIFIED IDEOGRAPH
+ {0xEEA5, 0x5BB0}, //15549 #CJK UNIFIED IDEOGRAPH
+ {0xEEA6, 0x624D}, //15550 #CJK UNIFIED IDEOGRAPH
+ {0xEEA7, 0x6750}, //15551 #CJK UNIFIED IDEOGRAPH
+ {0xEEA8, 0x683D}, //15552 #CJK UNIFIED IDEOGRAPH
+ {0xEEA9, 0x6893}, //15553 #CJK UNIFIED IDEOGRAPH
+ {0xEEAA, 0x6E3D}, //15554 #CJK UNIFIED IDEOGRAPH
+ {0xEEAB, 0x6ED3}, //15555 #CJK UNIFIED IDEOGRAPH
+ {0xEEAC, 0x707D}, //15556 #CJK UNIFIED IDEOGRAPH
+ {0xEEAD, 0x7E21}, //15557 #CJK UNIFIED IDEOGRAPH
+ {0xEEAE, 0x88C1}, //15558 #CJK UNIFIED IDEOGRAPH
+ {0xEEAF, 0x8CA1}, //15559 #CJK UNIFIED IDEOGRAPH
+ {0xEEB0, 0x8F09}, //15560 #CJK UNIFIED IDEOGRAPH
+ {0xEEB1, 0x9F4B}, //15561 #CJK UNIFIED IDEOGRAPH
+ {0xEEB2, 0x9F4E}, //15562 #CJK UNIFIED IDEOGRAPH
+ {0xEEB3, 0x722D}, //15563 #CJK UNIFIED IDEOGRAPH
+ {0xEEB4, 0x7B8F}, //15564 #CJK UNIFIED IDEOGRAPH
+ {0xEEB5, 0x8ACD}, //15565 #CJK UNIFIED IDEOGRAPH
+ {0xEEB6, 0x931A}, //15566 #CJK UNIFIED IDEOGRAPH
+ {0xEEB7, 0x4F47}, //15567 #CJK UNIFIED IDEOGRAPH
+ {0xEEB8, 0x4F4E}, //15568 #CJK UNIFIED IDEOGRAPH
+ {0xEEB9, 0x5132}, //15569 #CJK UNIFIED IDEOGRAPH
+ {0xEEBA, 0x5480}, //15570 #CJK UNIFIED IDEOGRAPH
+ {0xEEBB, 0x59D0}, //15571 #CJK UNIFIED IDEOGRAPH
+ {0xEEBC, 0x5E95}, //15572 #CJK UNIFIED IDEOGRAPH
+ {0xEEBD, 0x62B5}, //15573 #CJK UNIFIED IDEOGRAPH
+ {0xEEBE, 0x6775}, //15574 #CJK UNIFIED IDEOGRAPH
+ {0xEEBF, 0x696E}, //15575 #CJK UNIFIED IDEOGRAPH
+ {0xEEC0, 0x6A17}, //15576 #CJK UNIFIED IDEOGRAPH
+ {0xEEC1, 0x6CAE}, //15577 #CJK UNIFIED IDEOGRAPH
+ {0xEEC2, 0x6E1A}, //15578 #CJK UNIFIED IDEOGRAPH
+ {0xEEC3, 0x72D9}, //15579 #CJK UNIFIED IDEOGRAPH
+ {0xEEC4, 0x732A}, //15580 #CJK UNIFIED IDEOGRAPH
+ {0xEEC5, 0x75BD}, //15581 #CJK UNIFIED IDEOGRAPH
+ {0xEEC6, 0x7BB8}, //15582 #CJK UNIFIED IDEOGRAPH
+ {0xEEC7, 0x7D35}, //15583 #CJK UNIFIED IDEOGRAPH
+ {0xEEC8, 0x82E7}, //15584 #CJK UNIFIED IDEOGRAPH
+ {0xEEC9, 0x83F9}, //15585 #CJK UNIFIED IDEOGRAPH
+ {0xEECA, 0x8457}, //15586 #CJK UNIFIED IDEOGRAPH
+ {0xEECB, 0x85F7}, //15587 #CJK UNIFIED IDEOGRAPH
+ {0xEECC, 0x8A5B}, //15588 #CJK UNIFIED IDEOGRAPH
+ {0xEECD, 0x8CAF}, //15589 #CJK UNIFIED IDEOGRAPH
+ {0xEECE, 0x8E87}, //15590 #CJK UNIFIED IDEOGRAPH
+ {0xEECF, 0x9019}, //15591 #CJK UNIFIED IDEOGRAPH
+ {0xEED0, 0x90B8}, //15592 #CJK UNIFIED IDEOGRAPH
+ {0xEED1, 0x96CE}, //15593 #CJK UNIFIED IDEOGRAPH
+ {0xEED2, 0x9F5F}, //15594 #CJK UNIFIED IDEOGRAPH
+ {0xEED3, 0x52E3}, //15595 #CJK UNIFIED IDEOGRAPH
+ {0xEED4, 0x540A}, //15596 #CJK UNIFIED IDEOGRAPH
+ {0xEED5, 0x5AE1}, //15597 #CJK UNIFIED IDEOGRAPH
+ {0xEED6, 0x5BC2}, //15598 #CJK UNIFIED IDEOGRAPH
+ {0xEED7, 0x6458}, //15599 #CJK UNIFIED IDEOGRAPH
+ {0xEED8, 0x6575}, //15600 #CJK UNIFIED IDEOGRAPH
+ {0xEED9, 0x6EF4}, //15601 #CJK UNIFIED IDEOGRAPH
+ {0xEEDA, 0x72C4}, //15602 #CJK UNIFIED IDEOGRAPH
+ {0xEEDB, 0xF9FB}, //15603 #CJK COMPATIBILITY IDEOGRAPH
+ {0xEEDC, 0x7684}, //15604 #CJK UNIFIED IDEOGRAPH
+ {0xEEDD, 0x7A4D}, //15605 #CJK UNIFIED IDEOGRAPH
+ {0xEEDE, 0x7B1B}, //15606 #CJK UNIFIED IDEOGRAPH
+ {0xEEDF, 0x7C4D}, //15607 #CJK UNIFIED IDEOGRAPH
+ {0xEEE0, 0x7E3E}, //15608 #CJK UNIFIED IDEOGRAPH
+ {0xEEE1, 0x7FDF}, //15609 #CJK UNIFIED IDEOGRAPH
+ {0xEEE2, 0x837B}, //15610 #CJK UNIFIED IDEOGRAPH
+ {0xEEE3, 0x8B2B}, //15611 #CJK UNIFIED IDEOGRAPH
+ {0xEEE4, 0x8CCA}, //15612 #CJK UNIFIED IDEOGRAPH
+ {0xEEE5, 0x8D64}, //15613 #CJK UNIFIED IDEOGRAPH
+ {0xEEE6, 0x8DE1}, //15614 #CJK UNIFIED IDEOGRAPH
+ {0xEEE7, 0x8E5F}, //15615 #CJK UNIFIED IDEOGRAPH
+ {0xEEE8, 0x8FEA}, //15616 #CJK UNIFIED IDEOGRAPH
+ {0xEEE9, 0x8FF9}, //15617 #CJK UNIFIED IDEOGRAPH
+ {0xEEEA, 0x9069}, //15618 #CJK UNIFIED IDEOGRAPH
+ {0xEEEB, 0x93D1}, //15619 #CJK UNIFIED IDEOGRAPH
+ {0xEEEC, 0x4F43}, //15620 #CJK UNIFIED IDEOGRAPH
+ {0xEEED, 0x4F7A}, //15621 #CJK UNIFIED IDEOGRAPH
+ {0xEEEE, 0x50B3}, //15622 #CJK UNIFIED IDEOGRAPH
+ {0xEEEF, 0x5168}, //15623 #CJK UNIFIED IDEOGRAPH
+ {0xEEF0, 0x5178}, //15624 #CJK UNIFIED IDEOGRAPH
+ {0xEEF1, 0x524D}, //15625 #CJK UNIFIED IDEOGRAPH
+ {0xEEF2, 0x526A}, //15626 #CJK UNIFIED IDEOGRAPH
+ {0xEEF3, 0x5861}, //15627 #CJK UNIFIED IDEOGRAPH
+ {0xEEF4, 0x587C}, //15628 #CJK UNIFIED IDEOGRAPH
+ {0xEEF5, 0x5960}, //15629 #CJK UNIFIED IDEOGRAPH
+ {0xEEF6, 0x5C08}, //15630 #CJK UNIFIED IDEOGRAPH
+ {0xEEF7, 0x5C55}, //15631 #CJK UNIFIED IDEOGRAPH
+ {0xEEF8, 0x5EDB}, //15632 #CJK UNIFIED IDEOGRAPH
+ {0xEEF9, 0x609B}, //15633 #CJK UNIFIED IDEOGRAPH
+ {0xEEFA, 0x6230}, //15634 #CJK UNIFIED IDEOGRAPH
+ {0xEEFB, 0x6813}, //15635 #CJK UNIFIED IDEOGRAPH
+ {0xEEFC, 0x6BBF}, //15636 #CJK UNIFIED IDEOGRAPH
+ {0xEEFD, 0x6C08}, //15637 #CJK UNIFIED IDEOGRAPH
+ {0xEEFE, 0x6FB1}, //15638 #CJK UNIFIED IDEOGRAPH
+ {0xEFA1, 0x714E}, //15639 #CJK UNIFIED IDEOGRAPH
+ {0xEFA2, 0x7420}, //15640 #CJK UNIFIED IDEOGRAPH
+ {0xEFA3, 0x7530}, //15641 #CJK UNIFIED IDEOGRAPH
+ {0xEFA4, 0x7538}, //15642 #CJK UNIFIED IDEOGRAPH
+ {0xEFA5, 0x7551}, //15643 #CJK UNIFIED IDEOGRAPH
+ {0xEFA6, 0x7672}, //15644 #CJK UNIFIED IDEOGRAPH
+ {0xEFA7, 0x7B4C}, //15645 #CJK UNIFIED IDEOGRAPH
+ {0xEFA8, 0x7B8B}, //15646 #CJK UNIFIED IDEOGRAPH
+ {0xEFA9, 0x7BAD}, //15647 #CJK UNIFIED IDEOGRAPH
+ {0xEFAA, 0x7BC6}, //15648 #CJK UNIFIED IDEOGRAPH
+ {0xEFAB, 0x7E8F}, //15649 #CJK UNIFIED IDEOGRAPH
+ {0xEFAC, 0x8A6E}, //15650 #CJK UNIFIED IDEOGRAPH
+ {0xEFAD, 0x8F3E}, //15651 #CJK UNIFIED IDEOGRAPH
+ {0xEFAE, 0x8F49}, //15652 #CJK UNIFIED IDEOGRAPH
+ {0xEFAF, 0x923F}, //15653 #CJK UNIFIED IDEOGRAPH
+ {0xEFB0, 0x9293}, //15654 #CJK UNIFIED IDEOGRAPH
+ {0xEFB1, 0x9322}, //15655 #CJK UNIFIED IDEOGRAPH
+ {0xEFB2, 0x942B}, //15656 #CJK UNIFIED IDEOGRAPH
+ {0xEFB3, 0x96FB}, //15657 #CJK UNIFIED IDEOGRAPH
+ {0xEFB4, 0x985A}, //15658 #CJK UNIFIED IDEOGRAPH
+ {0xEFB5, 0x986B}, //15659 #CJK UNIFIED IDEOGRAPH
+ {0xEFB6, 0x991E}, //15660 #CJK UNIFIED IDEOGRAPH
+ {0xEFB7, 0x5207}, //15661 #CJK UNIFIED IDEOGRAPH
+ {0xEFB8, 0x622A}, //15662 #CJK UNIFIED IDEOGRAPH
+ {0xEFB9, 0x6298}, //15663 #CJK UNIFIED IDEOGRAPH
+ {0xEFBA, 0x6D59}, //15664 #CJK UNIFIED IDEOGRAPH
+ {0xEFBB, 0x7664}, //15665 #CJK UNIFIED IDEOGRAPH
+ {0xEFBC, 0x7ACA}, //15666 #CJK UNIFIED IDEOGRAPH
+ {0xEFBD, 0x7BC0}, //15667 #CJK UNIFIED IDEOGRAPH
+ {0xEFBE, 0x7D76}, //15668 #CJK UNIFIED IDEOGRAPH
+ {0xEFBF, 0x5360}, //15669 #CJK UNIFIED IDEOGRAPH
+ {0xEFC0, 0x5CBE}, //15670 #CJK UNIFIED IDEOGRAPH
+ {0xEFC1, 0x5E97}, //15671 #CJK UNIFIED IDEOGRAPH
+ {0xEFC2, 0x6F38}, //15672 #CJK UNIFIED IDEOGRAPH
+ {0xEFC3, 0x70B9}, //15673 #CJK UNIFIED IDEOGRAPH
+ {0xEFC4, 0x7C98}, //15674 #CJK UNIFIED IDEOGRAPH
+ {0xEFC5, 0x9711}, //15675 #CJK UNIFIED IDEOGRAPH
+ {0xEFC6, 0x9B8E}, //15676 #CJK UNIFIED IDEOGRAPH
+ {0xEFC7, 0x9EDE}, //15677 #CJK UNIFIED IDEOGRAPH
+ {0xEFC8, 0x63A5}, //15678 #CJK UNIFIED IDEOGRAPH
+ {0xEFC9, 0x647A}, //15679 #CJK UNIFIED IDEOGRAPH
+ {0xEFCA, 0x8776}, //15680 #CJK UNIFIED IDEOGRAPH
+ {0xEFCB, 0x4E01}, //15681 #CJK UNIFIED IDEOGRAPH
+ {0xEFCC, 0x4E95}, //15682 #CJK UNIFIED IDEOGRAPH
+ {0xEFCD, 0x4EAD}, //15683 #CJK UNIFIED IDEOGRAPH
+ {0xEFCE, 0x505C}, //15684 #CJK UNIFIED IDEOGRAPH
+ {0xEFCF, 0x5075}, //15685 #CJK UNIFIED IDEOGRAPH
+ {0xEFD0, 0x5448}, //15686 #CJK UNIFIED IDEOGRAPH
+ {0xEFD1, 0x59C3}, //15687 #CJK UNIFIED IDEOGRAPH
+ {0xEFD2, 0x5B9A}, //15688 #CJK UNIFIED IDEOGRAPH
+ {0xEFD3, 0x5E40}, //15689 #CJK UNIFIED IDEOGRAPH
+ {0xEFD4, 0x5EAD}, //15690 #CJK UNIFIED IDEOGRAPH
+ {0xEFD5, 0x5EF7}, //15691 #CJK UNIFIED IDEOGRAPH
+ {0xEFD6, 0x5F81}, //15692 #CJK UNIFIED IDEOGRAPH
+ {0xEFD7, 0x60C5}, //15693 #CJK UNIFIED IDEOGRAPH
+ {0xEFD8, 0x633A}, //15694 #CJK UNIFIED IDEOGRAPH
+ {0xEFD9, 0x653F}, //15695 #CJK UNIFIED IDEOGRAPH
+ {0xEFDA, 0x6574}, //15696 #CJK UNIFIED IDEOGRAPH
+ {0xEFDB, 0x65CC}, //15697 #CJK UNIFIED IDEOGRAPH
+ {0xEFDC, 0x6676}, //15698 #CJK UNIFIED IDEOGRAPH
+ {0xEFDD, 0x6678}, //15699 #CJK UNIFIED IDEOGRAPH
+ {0xEFDE, 0x67FE}, //15700 #CJK UNIFIED IDEOGRAPH
+ {0xEFDF, 0x6968}, //15701 #CJK UNIFIED IDEOGRAPH
+ {0xEFE0, 0x6A89}, //15702 #CJK UNIFIED IDEOGRAPH
+ {0xEFE1, 0x6B63}, //15703 #CJK UNIFIED IDEOGRAPH
+ {0xEFE2, 0x6C40}, //15704 #CJK UNIFIED IDEOGRAPH
+ {0xEFE3, 0x6DC0}, //15705 #CJK UNIFIED IDEOGRAPH
+ {0xEFE4, 0x6DE8}, //15706 #CJK UNIFIED IDEOGRAPH
+ {0xEFE5, 0x6E1F}, //15707 #CJK UNIFIED IDEOGRAPH
+ {0xEFE6, 0x6E5E}, //15708 #CJK UNIFIED IDEOGRAPH
+ {0xEFE7, 0x701E}, //15709 #CJK UNIFIED IDEOGRAPH
+ {0xEFE8, 0x70A1}, //15710 #CJK UNIFIED IDEOGRAPH
+ {0xEFE9, 0x738E}, //15711 #CJK UNIFIED IDEOGRAPH
+ {0xEFEA, 0x73FD}, //15712 #CJK UNIFIED IDEOGRAPH
+ {0xEFEB, 0x753A}, //15713 #CJK UNIFIED IDEOGRAPH
+ {0xEFEC, 0x775B}, //15714 #CJK UNIFIED IDEOGRAPH
+ {0xEFED, 0x7887}, //15715 #CJK UNIFIED IDEOGRAPH
+ {0xEFEE, 0x798E}, //15716 #CJK UNIFIED IDEOGRAPH
+ {0xEFEF, 0x7A0B}, //15717 #CJK UNIFIED IDEOGRAPH
+ {0xEFF0, 0x7A7D}, //15718 #CJK UNIFIED IDEOGRAPH
+ {0xEFF1, 0x7CBE}, //15719 #CJK UNIFIED IDEOGRAPH
+ {0xEFF2, 0x7D8E}, //15720 #CJK UNIFIED IDEOGRAPH
+ {0xEFF3, 0x8247}, //15721 #CJK UNIFIED IDEOGRAPH
+ {0xEFF4, 0x8A02}, //15722 #CJK UNIFIED IDEOGRAPH
+ {0xEFF5, 0x8AEA}, //15723 #CJK UNIFIED IDEOGRAPH
+ {0xEFF6, 0x8C9E}, //15724 #CJK UNIFIED IDEOGRAPH
+ {0xEFF7, 0x912D}, //15725 #CJK UNIFIED IDEOGRAPH
+ {0xEFF8, 0x914A}, //15726 #CJK UNIFIED IDEOGRAPH
+ {0xEFF9, 0x91D8}, //15727 #CJK UNIFIED IDEOGRAPH
+ {0xEFFA, 0x9266}, //15728 #CJK UNIFIED IDEOGRAPH
+ {0xEFFB, 0x92CC}, //15729 #CJK UNIFIED IDEOGRAPH
+ {0xEFFC, 0x9320}, //15730 #CJK UNIFIED IDEOGRAPH
+ {0xEFFD, 0x9706}, //15731 #CJK UNIFIED IDEOGRAPH
+ {0xEFFE, 0x9756}, //15732 #CJK UNIFIED IDEOGRAPH
+ {0xF0A1, 0x975C}, //15733 #CJK UNIFIED IDEOGRAPH
+ {0xF0A2, 0x9802}, //15734 #CJK UNIFIED IDEOGRAPH
+ {0xF0A3, 0x9F0E}, //15735 #CJK UNIFIED IDEOGRAPH
+ {0xF0A4, 0x5236}, //15736 #CJK UNIFIED IDEOGRAPH
+ {0xF0A5, 0x5291}, //15737 #CJK UNIFIED IDEOGRAPH
+ {0xF0A6, 0x557C}, //15738 #CJK UNIFIED IDEOGRAPH
+ {0xF0A7, 0x5824}, //15739 #CJK UNIFIED IDEOGRAPH
+ {0xF0A8, 0x5E1D}, //15740 #CJK UNIFIED IDEOGRAPH
+ {0xF0A9, 0x5F1F}, //15741 #CJK UNIFIED IDEOGRAPH
+ {0xF0AA, 0x608C}, //15742 #CJK UNIFIED IDEOGRAPH
+ {0xF0AB, 0x63D0}, //15743 #CJK UNIFIED IDEOGRAPH
+ {0xF0AC, 0x68AF}, //15744 #CJK UNIFIED IDEOGRAPH
+ {0xF0AD, 0x6FDF}, //15745 #CJK UNIFIED IDEOGRAPH
+ {0xF0AE, 0x796D}, //15746 #CJK UNIFIED IDEOGRAPH
+ {0xF0AF, 0x7B2C}, //15747 #CJK UNIFIED IDEOGRAPH
+ {0xF0B0, 0x81CD}, //15748 #CJK UNIFIED IDEOGRAPH
+ {0xF0B1, 0x85BA}, //15749 #CJK UNIFIED IDEOGRAPH
+ {0xF0B2, 0x88FD}, //15750 #CJK UNIFIED IDEOGRAPH
+ {0xF0B3, 0x8AF8}, //15751 #CJK UNIFIED IDEOGRAPH
+ {0xF0B4, 0x8E44}, //15752 #CJK UNIFIED IDEOGRAPH
+ {0xF0B5, 0x918D}, //15753 #CJK UNIFIED IDEOGRAPH
+ {0xF0B6, 0x9664}, //15754 #CJK UNIFIED IDEOGRAPH
+ {0xF0B7, 0x969B}, //15755 #CJK UNIFIED IDEOGRAPH
+ {0xF0B8, 0x973D}, //15756 #CJK UNIFIED IDEOGRAPH
+ {0xF0B9, 0x984C}, //15757 #CJK UNIFIED IDEOGRAPH
+ {0xF0BA, 0x9F4A}, //15758 #CJK UNIFIED IDEOGRAPH
+ {0xF0BB, 0x4FCE}, //15759 #CJK UNIFIED IDEOGRAPH
+ {0xF0BC, 0x5146}, //15760 #CJK UNIFIED IDEOGRAPH
+ {0xF0BD, 0x51CB}, //15761 #CJK UNIFIED IDEOGRAPH
+ {0xF0BE, 0x52A9}, //15762 #CJK UNIFIED IDEOGRAPH
+ {0xF0BF, 0x5632}, //15763 #CJK UNIFIED IDEOGRAPH
+ {0xF0C0, 0x5F14}, //15764 #CJK UNIFIED IDEOGRAPH
+ {0xF0C1, 0x5F6B}, //15765 #CJK UNIFIED IDEOGRAPH
+ {0xF0C2, 0x63AA}, //15766 #CJK UNIFIED IDEOGRAPH
+ {0xF0C3, 0x64CD}, //15767 #CJK UNIFIED IDEOGRAPH
+ {0xF0C4, 0x65E9}, //15768 #CJK UNIFIED IDEOGRAPH
+ {0xF0C5, 0x6641}, //15769 #CJK UNIFIED IDEOGRAPH
+ {0xF0C6, 0x66FA}, //15770 #CJK UNIFIED IDEOGRAPH
+ {0xF0C7, 0x66F9}, //15771 #CJK UNIFIED IDEOGRAPH
+ {0xF0C8, 0x671D}, //15772 #CJK UNIFIED IDEOGRAPH
+ {0xF0C9, 0x689D}, //15773 #CJK UNIFIED IDEOGRAPH
+ {0xF0CA, 0x68D7}, //15774 #CJK UNIFIED IDEOGRAPH
+ {0xF0CB, 0x69FD}, //15775 #CJK UNIFIED IDEOGRAPH
+ {0xF0CC, 0x6F15}, //15776 #CJK UNIFIED IDEOGRAPH
+ {0xF0CD, 0x6F6E}, //15777 #CJK UNIFIED IDEOGRAPH
+ {0xF0CE, 0x7167}, //15778 #CJK UNIFIED IDEOGRAPH
+ {0xF0CF, 0x71E5}, //15779 #CJK UNIFIED IDEOGRAPH
+ {0xF0D0, 0x722A}, //15780 #CJK UNIFIED IDEOGRAPH
+ {0xF0D1, 0x74AA}, //15781 #CJK UNIFIED IDEOGRAPH
+ {0xF0D2, 0x773A}, //15782 #CJK UNIFIED IDEOGRAPH
+ {0xF0D3, 0x7956}, //15783 #CJK UNIFIED IDEOGRAPH
+ {0xF0D4, 0x795A}, //15784 #CJK UNIFIED IDEOGRAPH
+ {0xF0D5, 0x79DF}, //15785 #CJK UNIFIED IDEOGRAPH
+ {0xF0D6, 0x7A20}, //15786 #CJK UNIFIED IDEOGRAPH
+ {0xF0D7, 0x7A95}, //15787 #CJK UNIFIED IDEOGRAPH
+ {0xF0D8, 0x7C97}, //15788 #CJK UNIFIED IDEOGRAPH
+ {0xF0D9, 0x7CDF}, //15789 #CJK UNIFIED IDEOGRAPH
+ {0xF0DA, 0x7D44}, //15790 #CJK UNIFIED IDEOGRAPH
+ {0xF0DB, 0x7E70}, //15791 #CJK UNIFIED IDEOGRAPH
+ {0xF0DC, 0x8087}, //15792 #CJK UNIFIED IDEOGRAPH
+ {0xF0DD, 0x85FB}, //15793 #CJK UNIFIED IDEOGRAPH
+ {0xF0DE, 0x86A4}, //15794 #CJK UNIFIED IDEOGRAPH
+ {0xF0DF, 0x8A54}, //15795 #CJK UNIFIED IDEOGRAPH
+ {0xF0E0, 0x8ABF}, //15796 #CJK UNIFIED IDEOGRAPH
+ {0xF0E1, 0x8D99}, //15797 #CJK UNIFIED IDEOGRAPH
+ {0xF0E2, 0x8E81}, //15798 #CJK UNIFIED IDEOGRAPH
+ {0xF0E3, 0x9020}, //15799 #CJK UNIFIED IDEOGRAPH
+ {0xF0E4, 0x906D}, //15800 #CJK UNIFIED IDEOGRAPH
+ {0xF0E5, 0x91E3}, //15801 #CJK UNIFIED IDEOGRAPH
+ {0xF0E6, 0x963B}, //15802 #CJK UNIFIED IDEOGRAPH
+ {0xF0E7, 0x96D5}, //15803 #CJK UNIFIED IDEOGRAPH
+ {0xF0E8, 0x9CE5}, //15804 #CJK UNIFIED IDEOGRAPH
+ {0xF0E9, 0x65CF}, //15805 #CJK UNIFIED IDEOGRAPH
+ {0xF0EA, 0x7C07}, //15806 #CJK UNIFIED IDEOGRAPH
+ {0xF0EB, 0x8DB3}, //15807 #CJK UNIFIED IDEOGRAPH
+ {0xF0EC, 0x93C3}, //15808 #CJK UNIFIED IDEOGRAPH
+ {0xF0ED, 0x5B58}, //15809 #CJK UNIFIED IDEOGRAPH
+ {0xF0EE, 0x5C0A}, //15810 #CJK UNIFIED IDEOGRAPH
+ {0xF0EF, 0x5352}, //15811 #CJK UNIFIED IDEOGRAPH
+ {0xF0F0, 0x62D9}, //15812 #CJK UNIFIED IDEOGRAPH
+ {0xF0F1, 0x731D}, //15813 #CJK UNIFIED IDEOGRAPH
+ {0xF0F2, 0x5027}, //15814 #CJK UNIFIED IDEOGRAPH
+ {0xF0F3, 0x5B97}, //15815 #CJK UNIFIED IDEOGRAPH
+ {0xF0F4, 0x5F9E}, //15816 #CJK UNIFIED IDEOGRAPH
+ {0xF0F5, 0x60B0}, //15817 #CJK UNIFIED IDEOGRAPH
+ {0xF0F6, 0x616B}, //15818 #CJK UNIFIED IDEOGRAPH
+ {0xF0F7, 0x68D5}, //15819 #CJK UNIFIED IDEOGRAPH
+ {0xF0F8, 0x6DD9}, //15820 #CJK UNIFIED IDEOGRAPH
+ {0xF0F9, 0x742E}, //15821 #CJK UNIFIED IDEOGRAPH
+ {0xF0FA, 0x7A2E}, //15822 #CJK UNIFIED IDEOGRAPH
+ {0xF0FB, 0x7D42}, //15823 #CJK UNIFIED IDEOGRAPH
+ {0xF0FC, 0x7D9C}, //15824 #CJK UNIFIED IDEOGRAPH
+ {0xF0FD, 0x7E31}, //15825 #CJK UNIFIED IDEOGRAPH
+ {0xF0FE, 0x816B}, //15826 #CJK UNIFIED IDEOGRAPH
+ {0xF1A1, 0x8E2A}, //15827 #CJK UNIFIED IDEOGRAPH
+ {0xF1A2, 0x8E35}, //15828 #CJK UNIFIED IDEOGRAPH
+ {0xF1A3, 0x937E}, //15829 #CJK UNIFIED IDEOGRAPH
+ {0xF1A4, 0x9418}, //15830 #CJK UNIFIED IDEOGRAPH
+ {0xF1A5, 0x4F50}, //15831 #CJK UNIFIED IDEOGRAPH
+ {0xF1A6, 0x5750}, //15832 #CJK UNIFIED IDEOGRAPH
+ {0xF1A7, 0x5DE6}, //15833 #CJK UNIFIED IDEOGRAPH
+ {0xF1A8, 0x5EA7}, //15834 #CJK UNIFIED IDEOGRAPH
+ {0xF1A9, 0x632B}, //15835 #CJK UNIFIED IDEOGRAPH
+ {0xF1AA, 0x7F6A}, //15836 #CJK UNIFIED IDEOGRAPH
+ {0xF1AB, 0x4E3B}, //15837 #CJK UNIFIED IDEOGRAPH
+ {0xF1AC, 0x4F4F}, //15838 #CJK UNIFIED IDEOGRAPH
+ {0xF1AD, 0x4F8F}, //15839 #CJK UNIFIED IDEOGRAPH
+ {0xF1AE, 0x505A}, //15840 #CJK UNIFIED IDEOGRAPH
+ {0xF1AF, 0x59DD}, //15841 #CJK UNIFIED IDEOGRAPH
+ {0xF1B0, 0x80C4}, //15842 #CJK UNIFIED IDEOGRAPH
+ {0xF1B1, 0x546A}, //15843 #CJK UNIFIED IDEOGRAPH
+ {0xF1B2, 0x5468}, //15844 #CJK UNIFIED IDEOGRAPH
+ {0xF1B3, 0x55FE}, //15845 #CJK UNIFIED IDEOGRAPH
+ {0xF1B4, 0x594F}, //15846 #CJK UNIFIED IDEOGRAPH
+ {0xF1B5, 0x5B99}, //15847 #CJK UNIFIED IDEOGRAPH
+ {0xF1B6, 0x5DDE}, //15848 #CJK UNIFIED IDEOGRAPH
+ {0xF1B7, 0x5EDA}, //15849 #CJK UNIFIED IDEOGRAPH
+ {0xF1B8, 0x665D}, //15850 #CJK UNIFIED IDEOGRAPH
+ {0xF1B9, 0x6731}, //15851 #CJK UNIFIED IDEOGRAPH
+ {0xF1BA, 0x67F1}, //15852 #CJK UNIFIED IDEOGRAPH
+ {0xF1BB, 0x682A}, //15853 #CJK UNIFIED IDEOGRAPH
+ {0xF1BC, 0x6CE8}, //15854 #CJK UNIFIED IDEOGRAPH
+ {0xF1BD, 0x6D32}, //15855 #CJK UNIFIED IDEOGRAPH
+ {0xF1BE, 0x6E4A}, //15856 #CJK UNIFIED IDEOGRAPH
+ {0xF1BF, 0x6F8D}, //15857 #CJK UNIFIED IDEOGRAPH
+ {0xF1C0, 0x70B7}, //15858 #CJK UNIFIED IDEOGRAPH
+ {0xF1C1, 0x73E0}, //15859 #CJK UNIFIED IDEOGRAPH
+ {0xF1C2, 0x7587}, //15860 #CJK UNIFIED IDEOGRAPH
+ {0xF1C3, 0x7C4C}, //15861 #CJK UNIFIED IDEOGRAPH
+ {0xF1C4, 0x7D02}, //15862 #CJK UNIFIED IDEOGRAPH
+ {0xF1C5, 0x7D2C}, //15863 #CJK UNIFIED IDEOGRAPH
+ {0xF1C6, 0x7DA2}, //15864 #CJK UNIFIED IDEOGRAPH
+ {0xF1C7, 0x821F}, //15865 #CJK UNIFIED IDEOGRAPH
+ {0xF1C8, 0x86DB}, //15866 #CJK UNIFIED IDEOGRAPH
+ {0xF1C9, 0x8A3B}, //15867 #CJK UNIFIED IDEOGRAPH
+ {0xF1CA, 0x8A85}, //15868 #CJK UNIFIED IDEOGRAPH
+ {0xF1CB, 0x8D70}, //15869 #CJK UNIFIED IDEOGRAPH
+ {0xF1CC, 0x8E8A}, //15870 #CJK UNIFIED IDEOGRAPH
+ {0xF1CD, 0x8F33}, //15871 #CJK UNIFIED IDEOGRAPH
+ {0xF1CE, 0x9031}, //15872 #CJK UNIFIED IDEOGRAPH
+ {0xF1CF, 0x914E}, //15873 #CJK UNIFIED IDEOGRAPH
+ {0xF1D0, 0x9152}, //15874 #CJK UNIFIED IDEOGRAPH
+ {0xF1D1, 0x9444}, //15875 #CJK UNIFIED IDEOGRAPH
+ {0xF1D2, 0x99D0}, //15876 #CJK UNIFIED IDEOGRAPH
+ {0xF1D3, 0x7AF9}, //15877 #CJK UNIFIED IDEOGRAPH
+ {0xF1D4, 0x7CA5}, //15878 #CJK UNIFIED IDEOGRAPH
+ {0xF1D5, 0x4FCA}, //15879 #CJK UNIFIED IDEOGRAPH
+ {0xF1D6, 0x5101}, //15880 #CJK UNIFIED IDEOGRAPH
+ {0xF1D7, 0x51C6}, //15881 #CJK UNIFIED IDEOGRAPH
+ {0xF1D8, 0x57C8}, //15882 #CJK UNIFIED IDEOGRAPH
+ {0xF1D9, 0x5BEF}, //15883 #CJK UNIFIED IDEOGRAPH
+ {0xF1DA, 0x5CFB}, //15884 #CJK UNIFIED IDEOGRAPH
+ {0xF1DB, 0x6659}, //15885 #CJK UNIFIED IDEOGRAPH
+ {0xF1DC, 0x6A3D}, //15886 #CJK UNIFIED IDEOGRAPH
+ {0xF1DD, 0x6D5A}, //15887 #CJK UNIFIED IDEOGRAPH
+ {0xF1DE, 0x6E96}, //15888 #CJK UNIFIED IDEOGRAPH
+ {0xF1DF, 0x6FEC}, //15889 #CJK UNIFIED IDEOGRAPH
+ {0xF1E0, 0x710C}, //15890 #CJK UNIFIED IDEOGRAPH
+ {0xF1E1, 0x756F}, //15891 #CJK UNIFIED IDEOGRAPH
+ {0xF1E2, 0x7AE3}, //15892 #CJK UNIFIED IDEOGRAPH
+ {0xF1E3, 0x8822}, //15893 #CJK UNIFIED IDEOGRAPH
+ {0xF1E4, 0x9021}, //15894 #CJK UNIFIED IDEOGRAPH
+ {0xF1E5, 0x9075}, //15895 #CJK UNIFIED IDEOGRAPH
+ {0xF1E6, 0x96CB}, //15896 #CJK UNIFIED IDEOGRAPH
+ {0xF1E7, 0x99FF}, //15897 #CJK UNIFIED IDEOGRAPH
+ {0xF1E8, 0x8301}, //15898 #CJK UNIFIED IDEOGRAPH
+ {0xF1E9, 0x4E2D}, //15899 #CJK UNIFIED IDEOGRAPH
+ {0xF1EA, 0x4EF2}, //15900 #CJK UNIFIED IDEOGRAPH
+ {0xF1EB, 0x8846}, //15901 #CJK UNIFIED IDEOGRAPH
+ {0xF1EC, 0x91CD}, //15902 #CJK UNIFIED IDEOGRAPH
+ {0xF1ED, 0x537D}, //15903 #CJK UNIFIED IDEOGRAPH
+ {0xF1EE, 0x6ADB}, //15904 #CJK UNIFIED IDEOGRAPH
+ {0xF1EF, 0x696B}, //15905 #CJK UNIFIED IDEOGRAPH
+ {0xF1F0, 0x6C41}, //15906 #CJK UNIFIED IDEOGRAPH
+ {0xF1F1, 0x847A}, //15907 #CJK UNIFIED IDEOGRAPH
+ {0xF1F2, 0x589E}, //15908 #CJK UNIFIED IDEOGRAPH
+ {0xF1F3, 0x618E}, //15909 #CJK UNIFIED IDEOGRAPH
+ {0xF1F4, 0x66FE}, //15910 #CJK UNIFIED IDEOGRAPH
+ {0xF1F5, 0x62EF}, //15911 #CJK UNIFIED IDEOGRAPH
+ {0xF1F6, 0x70DD}, //15912 #CJK UNIFIED IDEOGRAPH
+ {0xF1F7, 0x7511}, //15913 #CJK UNIFIED IDEOGRAPH
+ {0xF1F8, 0x75C7}, //15914 #CJK UNIFIED IDEOGRAPH
+ {0xF1F9, 0x7E52}, //15915 #CJK UNIFIED IDEOGRAPH
+ {0xF1FA, 0x84B8}, //15916 #CJK UNIFIED IDEOGRAPH
+ {0xF1FB, 0x8B49}, //15917 #CJK UNIFIED IDEOGRAPH
+ {0xF1FC, 0x8D08}, //15918 #CJK UNIFIED IDEOGRAPH
+ {0xF1FD, 0x4E4B}, //15919 #CJK UNIFIED IDEOGRAPH
+ {0xF1FE, 0x53EA}, //15920 #CJK UNIFIED IDEOGRAPH
+ {0xF2A1, 0x54AB}, //15921 #CJK UNIFIED IDEOGRAPH
+ {0xF2A2, 0x5730}, //15922 #CJK UNIFIED IDEOGRAPH
+ {0xF2A3, 0x5740}, //15923 #CJK UNIFIED IDEOGRAPH
+ {0xF2A4, 0x5FD7}, //15924 #CJK UNIFIED IDEOGRAPH
+ {0xF2A5, 0x6301}, //15925 #CJK UNIFIED IDEOGRAPH
+ {0xF2A6, 0x6307}, //15926 #CJK UNIFIED IDEOGRAPH
+ {0xF2A7, 0x646F}, //15927 #CJK UNIFIED IDEOGRAPH
+ {0xF2A8, 0x652F}, //15928 #CJK UNIFIED IDEOGRAPH
+ {0xF2A9, 0x65E8}, //15929 #CJK UNIFIED IDEOGRAPH
+ {0xF2AA, 0x667A}, //15930 #CJK UNIFIED IDEOGRAPH
+ {0xF2AB, 0x679D}, //15931 #CJK UNIFIED IDEOGRAPH
+ {0xF2AC, 0x67B3}, //15932 #CJK UNIFIED IDEOGRAPH
+ {0xF2AD, 0x6B62}, //15933 #CJK UNIFIED IDEOGRAPH
+ {0xF2AE, 0x6C60}, //15934 #CJK UNIFIED IDEOGRAPH
+ {0xF2AF, 0x6C9A}, //15935 #CJK UNIFIED IDEOGRAPH
+ {0xF2B0, 0x6F2C}, //15936 #CJK UNIFIED IDEOGRAPH
+ {0xF2B1, 0x77E5}, //15937 #CJK UNIFIED IDEOGRAPH
+ {0xF2B2, 0x7825}, //15938 #CJK UNIFIED IDEOGRAPH
+ {0xF2B3, 0x7949}, //15939 #CJK UNIFIED IDEOGRAPH
+ {0xF2B4, 0x7957}, //15940 #CJK UNIFIED IDEOGRAPH
+ {0xF2B5, 0x7D19}, //15941 #CJK UNIFIED IDEOGRAPH
+ {0xF2B6, 0x80A2}, //15942 #CJK UNIFIED IDEOGRAPH
+ {0xF2B7, 0x8102}, //15943 #CJK UNIFIED IDEOGRAPH
+ {0xF2B8, 0x81F3}, //15944 #CJK UNIFIED IDEOGRAPH
+ {0xF2B9, 0x829D}, //15945 #CJK UNIFIED IDEOGRAPH
+ {0xF2BA, 0x82B7}, //15946 #CJK UNIFIED IDEOGRAPH
+ {0xF2BB, 0x8718}, //15947 #CJK UNIFIED IDEOGRAPH
+ {0xF2BC, 0x8A8C}, //15948 #CJK UNIFIED IDEOGRAPH
+ {0xF2BD, 0xF9FC}, //15949 #CJK COMPATIBILITY IDEOGRAPH
+ {0xF2BE, 0x8D04}, //15950 #CJK UNIFIED IDEOGRAPH
+ {0xF2BF, 0x8DBE}, //15951 #CJK UNIFIED IDEOGRAPH
+ {0xF2C0, 0x9072}, //15952 #CJK UNIFIED IDEOGRAPH
+ {0xF2C1, 0x76F4}, //15953 #CJK UNIFIED IDEOGRAPH
+ {0xF2C2, 0x7A19}, //15954 #CJK UNIFIED IDEOGRAPH
+ {0xF2C3, 0x7A37}, //15955 #CJK UNIFIED IDEOGRAPH
+ {0xF2C4, 0x7E54}, //15956 #CJK UNIFIED IDEOGRAPH
+ {0xF2C5, 0x8077}, //15957 #CJK UNIFIED IDEOGRAPH
+ {0xF2C6, 0x5507}, //15958 #CJK UNIFIED IDEOGRAPH
+ {0xF2C7, 0x55D4}, //15959 #CJK UNIFIED IDEOGRAPH
+ {0xF2C8, 0x5875}, //15960 #CJK UNIFIED IDEOGRAPH
+ {0xF2C9, 0x632F}, //15961 #CJK UNIFIED IDEOGRAPH
+ {0xF2CA, 0x6422}, //15962 #CJK UNIFIED IDEOGRAPH
+ {0xF2CB, 0x6649}, //15963 #CJK UNIFIED IDEOGRAPH
+ {0xF2CC, 0x664B}, //15964 #CJK UNIFIED IDEOGRAPH
+ {0xF2CD, 0x686D}, //15965 #CJK UNIFIED IDEOGRAPH
+ {0xF2CE, 0x699B}, //15966 #CJK UNIFIED IDEOGRAPH
+ {0xF2CF, 0x6B84}, //15967 #CJK UNIFIED IDEOGRAPH
+ {0xF2D0, 0x6D25}, //15968 #CJK UNIFIED IDEOGRAPH
+ {0xF2D1, 0x6EB1}, //15969 #CJK UNIFIED IDEOGRAPH
+ {0xF2D2, 0x73CD}, //15970 #CJK UNIFIED IDEOGRAPH
+ {0xF2D3, 0x7468}, //15971 #CJK UNIFIED IDEOGRAPH
+ {0xF2D4, 0x74A1}, //15972 #CJK UNIFIED IDEOGRAPH
+ {0xF2D5, 0x755B}, //15973 #CJK UNIFIED IDEOGRAPH
+ {0xF2D6, 0x75B9}, //15974 #CJK UNIFIED IDEOGRAPH
+ {0xF2D7, 0x76E1}, //15975 #CJK UNIFIED IDEOGRAPH
+ {0xF2D8, 0x771E}, //15976 #CJK UNIFIED IDEOGRAPH
+ {0xF2D9, 0x778B}, //15977 #CJK UNIFIED IDEOGRAPH
+ {0xF2DA, 0x79E6}, //15978 #CJK UNIFIED IDEOGRAPH
+ {0xF2DB, 0x7E09}, //15979 #CJK UNIFIED IDEOGRAPH
+ {0xF2DC, 0x7E1D}, //15980 #CJK UNIFIED IDEOGRAPH
+ {0xF2DD, 0x81FB}, //15981 #CJK UNIFIED IDEOGRAPH
+ {0xF2DE, 0x852F}, //15982 #CJK UNIFIED IDEOGRAPH
+ {0xF2DF, 0x8897}, //15983 #CJK UNIFIED IDEOGRAPH
+ {0xF2E0, 0x8A3A}, //15984 #CJK UNIFIED IDEOGRAPH
+ {0xF2E1, 0x8CD1}, //15985 #CJK UNIFIED IDEOGRAPH
+ {0xF2E2, 0x8EEB}, //15986 #CJK UNIFIED IDEOGRAPH
+ {0xF2E3, 0x8FB0}, //15987 #CJK UNIFIED IDEOGRAPH
+ {0xF2E4, 0x9032}, //15988 #CJK UNIFIED IDEOGRAPH
+ {0xF2E5, 0x93AD}, //15989 #CJK UNIFIED IDEOGRAPH
+ {0xF2E6, 0x9663}, //15990 #CJK UNIFIED IDEOGRAPH
+ {0xF2E7, 0x9673}, //15991 #CJK UNIFIED IDEOGRAPH
+ {0xF2E8, 0x9707}, //15992 #CJK UNIFIED IDEOGRAPH
+ {0xF2E9, 0x4F84}, //15993 #CJK UNIFIED IDEOGRAPH
+ {0xF2EA, 0x53F1}, //15994 #CJK UNIFIED IDEOGRAPH
+ {0xF2EB, 0x59EA}, //15995 #CJK UNIFIED IDEOGRAPH
+ {0xF2EC, 0x5AC9}, //15996 #CJK UNIFIED IDEOGRAPH
+ {0xF2ED, 0x5E19}, //15997 #CJK UNIFIED IDEOGRAPH
+ {0xF2EE, 0x684E}, //15998 #CJK UNIFIED IDEOGRAPH
+ {0xF2EF, 0x74C6}, //15999 #CJK UNIFIED IDEOGRAPH
+ {0xF2F0, 0x75BE}, //16000 #CJK UNIFIED IDEOGRAPH
+ {0xF2F1, 0x79E9}, //16001 #CJK UNIFIED IDEOGRAPH
+ {0xF2F2, 0x7A92}, //16002 #CJK UNIFIED IDEOGRAPH
+ {0xF2F3, 0x81A3}, //16003 #CJK UNIFIED IDEOGRAPH
+ {0xF2F4, 0x86ED}, //16004 #CJK UNIFIED IDEOGRAPH
+ {0xF2F5, 0x8CEA}, //16005 #CJK UNIFIED IDEOGRAPH
+ {0xF2F6, 0x8DCC}, //16006 #CJK UNIFIED IDEOGRAPH
+ {0xF2F7, 0x8FED}, //16007 #CJK UNIFIED IDEOGRAPH
+ {0xF2F8, 0x659F}, //16008 #CJK UNIFIED IDEOGRAPH
+ {0xF2F9, 0x6715}, //16009 #CJK UNIFIED IDEOGRAPH
+ {0xF2FA, 0xF9FD}, //16010 #CJK COMPATIBILITY IDEOGRAPH
+ {0xF2FB, 0x57F7}, //16011 #CJK UNIFIED IDEOGRAPH
+ {0xF2FC, 0x6F57}, //16012 #CJK UNIFIED IDEOGRAPH
+ {0xF2FD, 0x7DDD}, //16013 #CJK UNIFIED IDEOGRAPH
+ {0xF2FE, 0x8F2F}, //16014 #CJK UNIFIED IDEOGRAPH
+ {0xF3A1, 0x93F6}, //16015 #CJK UNIFIED IDEOGRAPH
+ {0xF3A2, 0x96C6}, //16016 #CJK UNIFIED IDEOGRAPH
+ {0xF3A3, 0x5FB5}, //16017 #CJK UNIFIED IDEOGRAPH
+ {0xF3A4, 0x61F2}, //16018 #CJK UNIFIED IDEOGRAPH
+ {0xF3A5, 0x6F84}, //16019 #CJK UNIFIED IDEOGRAPH
+ {0xF3A6, 0x4E14}, //16020 #CJK UNIFIED IDEOGRAPH
+ {0xF3A7, 0x4F98}, //16021 #CJK UNIFIED IDEOGRAPH
+ {0xF3A8, 0x501F}, //16022 #CJK UNIFIED IDEOGRAPH
+ {0xF3A9, 0x53C9}, //16023 #CJK UNIFIED IDEOGRAPH
+ {0xF3AA, 0x55DF}, //16024 #CJK UNIFIED IDEOGRAPH
+ {0xF3AB, 0x5D6F}, //16025 #CJK UNIFIED IDEOGRAPH
+ {0xF3AC, 0x5DEE}, //16026 #CJK UNIFIED IDEOGRAPH
+ {0xF3AD, 0x6B21}, //16027 #CJK UNIFIED IDEOGRAPH
+ {0xF3AE, 0x6B64}, //16028 #CJK UNIFIED IDEOGRAPH
+ {0xF3AF, 0x78CB}, //16029 #CJK UNIFIED IDEOGRAPH
+ {0xF3B0, 0x7B9A}, //16030 #CJK UNIFIED IDEOGRAPH
+ {0xF3B1, 0xF9FE}, //16031 #CJK COMPATIBILITY IDEOGRAPH
+ {0xF3B2, 0x8E49}, //16032 #CJK UNIFIED IDEOGRAPH
+ {0xF3B3, 0x8ECA}, //16033 #CJK UNIFIED IDEOGRAPH
+ {0xF3B4, 0x906E}, //16034 #CJK UNIFIED IDEOGRAPH
+ {0xF3B5, 0x6349}, //16035 #CJK UNIFIED IDEOGRAPH
+ {0xF3B6, 0x643E}, //16036 #CJK UNIFIED IDEOGRAPH
+ {0xF3B7, 0x7740}, //16037 #CJK UNIFIED IDEOGRAPH
+ {0xF3B8, 0x7A84}, //16038 #CJK UNIFIED IDEOGRAPH
+ {0xF3B9, 0x932F}, //16039 #CJK UNIFIED IDEOGRAPH
+ {0xF3BA, 0x947F}, //16040 #CJK UNIFIED IDEOGRAPH
+ {0xF3BB, 0x9F6A}, //16041 #CJK UNIFIED IDEOGRAPH
+ {0xF3BC, 0x64B0}, //16042 #CJK UNIFIED IDEOGRAPH
+ {0xF3BD, 0x6FAF}, //16043 #CJK UNIFIED IDEOGRAPH
+ {0xF3BE, 0x71E6}, //16044 #CJK UNIFIED IDEOGRAPH
+ {0xF3BF, 0x74A8}, //16045 #CJK UNIFIED IDEOGRAPH
+ {0xF3C0, 0x74DA}, //16046 #CJK UNIFIED IDEOGRAPH
+ {0xF3C1, 0x7AC4}, //16047 #CJK UNIFIED IDEOGRAPH
+ {0xF3C2, 0x7C12}, //16048 #CJK UNIFIED IDEOGRAPH
+ {0xF3C3, 0x7E82}, //16049 #CJK UNIFIED IDEOGRAPH
+ {0xF3C4, 0x7CB2}, //16050 #CJK UNIFIED IDEOGRAPH
+ {0xF3C5, 0x7E98}, //16051 #CJK UNIFIED IDEOGRAPH
+ {0xF3C6, 0x8B9A}, //16052 #CJK UNIFIED IDEOGRAPH
+ {0xF3C7, 0x8D0A}, //16053 #CJK UNIFIED IDEOGRAPH
+ {0xF3C8, 0x947D}, //16054 #CJK UNIFIED IDEOGRAPH
+ {0xF3C9, 0x9910}, //16055 #CJK UNIFIED IDEOGRAPH
+ {0xF3CA, 0x994C}, //16056 #CJK UNIFIED IDEOGRAPH
+ {0xF3CB, 0x5239}, //16057 #CJK UNIFIED IDEOGRAPH
+ {0xF3CC, 0x5BDF}, //16058 #CJK UNIFIED IDEOGRAPH
+ {0xF3CD, 0x64E6}, //16059 #CJK UNIFIED IDEOGRAPH
+ {0xF3CE, 0x672D}, //16060 #CJK UNIFIED IDEOGRAPH
+ {0xF3CF, 0x7D2E}, //16061 #CJK UNIFIED IDEOGRAPH
+ {0xF3D0, 0x50ED}, //16062 #CJK UNIFIED IDEOGRAPH
+ {0xF3D1, 0x53C3}, //16063 #CJK UNIFIED IDEOGRAPH
+ {0xF3D2, 0x5879}, //16064 #CJK UNIFIED IDEOGRAPH
+ {0xF3D3, 0x6158}, //16065 #CJK UNIFIED IDEOGRAPH
+ {0xF3D4, 0x6159}, //16066 #CJK UNIFIED IDEOGRAPH
+ {0xF3D5, 0x61FA}, //16067 #CJK UNIFIED IDEOGRAPH
+ {0xF3D6, 0x65AC}, //16068 #CJK UNIFIED IDEOGRAPH
+ {0xF3D7, 0x7AD9}, //16069 #CJK UNIFIED IDEOGRAPH
+ {0xF3D8, 0x8B92}, //16070 #CJK UNIFIED IDEOGRAPH
+ {0xF3D9, 0x8B96}, //16071 #CJK UNIFIED IDEOGRAPH
+ {0xF3DA, 0x5009}, //16072 #CJK UNIFIED IDEOGRAPH
+ {0xF3DB, 0x5021}, //16073 #CJK UNIFIED IDEOGRAPH
+ {0xF3DC, 0x5275}, //16074 #CJK UNIFIED IDEOGRAPH
+ {0xF3DD, 0x5531}, //16075 #CJK UNIFIED IDEOGRAPH
+ {0xF3DE, 0x5A3C}, //16076 #CJK UNIFIED IDEOGRAPH
+ {0xF3DF, 0x5EE0}, //16077 #CJK UNIFIED IDEOGRAPH
+ {0xF3E0, 0x5F70}, //16078 #CJK UNIFIED IDEOGRAPH
+ {0xF3E1, 0x6134}, //16079 #CJK UNIFIED IDEOGRAPH
+ {0xF3E2, 0x655E}, //16080 #CJK UNIFIED IDEOGRAPH
+ {0xF3E3, 0x660C}, //16081 #CJK UNIFIED IDEOGRAPH
+ {0xF3E4, 0x6636}, //16082 #CJK UNIFIED IDEOGRAPH
+ {0xF3E5, 0x66A2}, //16083 #CJK UNIFIED IDEOGRAPH
+ {0xF3E6, 0x69CD}, //16084 #CJK UNIFIED IDEOGRAPH
+ {0xF3E7, 0x6EC4}, //16085 #CJK UNIFIED IDEOGRAPH
+ {0xF3E8, 0x6F32}, //16086 #CJK UNIFIED IDEOGRAPH
+ {0xF3E9, 0x7316}, //16087 #CJK UNIFIED IDEOGRAPH
+ {0xF3EA, 0x7621}, //16088 #CJK UNIFIED IDEOGRAPH
+ {0xF3EB, 0x7A93}, //16089 #CJK UNIFIED IDEOGRAPH
+ {0xF3EC, 0x8139}, //16090 #CJK UNIFIED IDEOGRAPH
+ {0xF3ED, 0x8259}, //16091 #CJK UNIFIED IDEOGRAPH
+ {0xF3EE, 0x83D6}, //16092 #CJK UNIFIED IDEOGRAPH
+ {0xF3EF, 0x84BC}, //16093 #CJK UNIFIED IDEOGRAPH
+ {0xF3F0, 0x50B5}, //16094 #CJK UNIFIED IDEOGRAPH
+ {0xF3F1, 0x57F0}, //16095 #CJK UNIFIED IDEOGRAPH
+ {0xF3F2, 0x5BC0}, //16096 #CJK UNIFIED IDEOGRAPH
+ {0xF3F3, 0x5BE8}, //16097 #CJK UNIFIED IDEOGRAPH
+ {0xF3F4, 0x5F69}, //16098 #CJK UNIFIED IDEOGRAPH
+ {0xF3F5, 0x63A1}, //16099 #CJK UNIFIED IDEOGRAPH
+ {0xF3F6, 0x7826}, //16100 #CJK UNIFIED IDEOGRAPH
+ {0xF3F7, 0x7DB5}, //16101 #CJK UNIFIED IDEOGRAPH
+ {0xF3F8, 0x83DC}, //16102 #CJK UNIFIED IDEOGRAPH
+ {0xF3F9, 0x8521}, //16103 #CJK UNIFIED IDEOGRAPH
+ {0xF3FA, 0x91C7}, //16104 #CJK UNIFIED IDEOGRAPH
+ {0xF3FB, 0x91F5}, //16105 #CJK UNIFIED IDEOGRAPH
+ {0xF3FC, 0x518A}, //16106 #CJK UNIFIED IDEOGRAPH
+ {0xF3FD, 0x67F5}, //16107 #CJK UNIFIED IDEOGRAPH
+ {0xF3FE, 0x7B56}, //16108 #CJK UNIFIED IDEOGRAPH
+ {0xF4A1, 0x8CAC}, //16109 #CJK UNIFIED IDEOGRAPH
+ {0xF4A2, 0x51C4}, //16110 #CJK UNIFIED IDEOGRAPH
+ {0xF4A3, 0x59BB}, //16111 #CJK UNIFIED IDEOGRAPH
+ {0xF4A4, 0x60BD}, //16112 #CJK UNIFIED IDEOGRAPH
+ {0xF4A5, 0x8655}, //16113 #CJK UNIFIED IDEOGRAPH
+ {0xF4A6, 0x501C}, //16114 #CJK UNIFIED IDEOGRAPH
+ {0xF4A7, 0xF9FF}, //16115 #CJK COMPATIBILITY IDEOGRAPH
+ {0xF4A8, 0x5254}, //16116 #CJK UNIFIED IDEOGRAPH
+ {0xF4A9, 0x5C3A}, //16117 #CJK UNIFIED IDEOGRAPH
+ {0xF4AA, 0x617D}, //16118 #CJK UNIFIED IDEOGRAPH
+ {0xF4AB, 0x621A}, //16119 #CJK UNIFIED IDEOGRAPH
+ {0xF4AC, 0x62D3}, //16120 #CJK UNIFIED IDEOGRAPH
+ {0xF4AD, 0x64F2}, //16121 #CJK UNIFIED IDEOGRAPH
+ {0xF4AE, 0x65A5}, //16122 #CJK UNIFIED IDEOGRAPH
+ {0xF4AF, 0x6ECC}, //16123 #CJK UNIFIED IDEOGRAPH
+ {0xF4B0, 0x7620}, //16124 #CJK UNIFIED IDEOGRAPH
+ {0xF4B1, 0x810A}, //16125 #CJK UNIFIED IDEOGRAPH
+ {0xF4B2, 0x8E60}, //16126 #CJK UNIFIED IDEOGRAPH
+ {0xF4B3, 0x965F}, //16127 #CJK UNIFIED IDEOGRAPH
+ {0xF4B4, 0x96BB}, //16128 #CJK UNIFIED IDEOGRAPH
+ {0xF4B5, 0x4EDF}, //16129 #CJK UNIFIED IDEOGRAPH
+ {0xF4B6, 0x5343}, //16130 #CJK UNIFIED IDEOGRAPH
+ {0xF4B7, 0x5598}, //16131 #CJK UNIFIED IDEOGRAPH
+ {0xF4B8, 0x5929}, //16132 #CJK UNIFIED IDEOGRAPH
+ {0xF4B9, 0x5DDD}, //16133 #CJK UNIFIED IDEOGRAPH
+ {0xF4BA, 0x64C5}, //16134 #CJK UNIFIED IDEOGRAPH
+ {0xF4BB, 0x6CC9}, //16135 #CJK UNIFIED IDEOGRAPH
+ {0xF4BC, 0x6DFA}, //16136 #CJK UNIFIED IDEOGRAPH
+ {0xF4BD, 0x7394}, //16137 #CJK UNIFIED IDEOGRAPH
+ {0xF4BE, 0x7A7F}, //16138 #CJK UNIFIED IDEOGRAPH
+ {0xF4BF, 0x821B}, //16139 #CJK UNIFIED IDEOGRAPH
+ {0xF4C0, 0x85A6}, //16140 #CJK UNIFIED IDEOGRAPH
+ {0xF4C1, 0x8CE4}, //16141 #CJK UNIFIED IDEOGRAPH
+ {0xF4C2, 0x8E10}, //16142 #CJK UNIFIED IDEOGRAPH
+ {0xF4C3, 0x9077}, //16143 #CJK UNIFIED IDEOGRAPH
+ {0xF4C4, 0x91E7}, //16144 #CJK UNIFIED IDEOGRAPH
+ {0xF4C5, 0x95E1}, //16145 #CJK UNIFIED IDEOGRAPH
+ {0xF4C6, 0x9621}, //16146 #CJK UNIFIED IDEOGRAPH
+ {0xF4C7, 0x97C6}, //16147 #CJK UNIFIED IDEOGRAPH
+ {0xF4C8, 0x51F8}, //16148 #CJK UNIFIED IDEOGRAPH
+ {0xF4C9, 0x54F2}, //16149 #CJK UNIFIED IDEOGRAPH
+ {0xF4CA, 0x5586}, //16150 #CJK UNIFIED IDEOGRAPH
+ {0xF4CB, 0x5FB9}, //16151 #CJK UNIFIED IDEOGRAPH
+ {0xF4CC, 0x64A4}, //16152 #CJK UNIFIED IDEOGRAPH
+ {0xF4CD, 0x6F88}, //16153 #CJK UNIFIED IDEOGRAPH
+ {0xF4CE, 0x7DB4}, //16154 #CJK UNIFIED IDEOGRAPH
+ {0xF4CF, 0x8F1F}, //16155 #CJK UNIFIED IDEOGRAPH
+ {0xF4D0, 0x8F4D}, //16156 #CJK UNIFIED IDEOGRAPH
+ {0xF4D1, 0x9435}, //16157 #CJK UNIFIED IDEOGRAPH
+ {0xF4D2, 0x50C9}, //16158 #CJK UNIFIED IDEOGRAPH
+ {0xF4D3, 0x5C16}, //16159 #CJK UNIFIED IDEOGRAPH
+ {0xF4D4, 0x6CBE}, //16160 #CJK UNIFIED IDEOGRAPH
+ {0xF4D5, 0x6DFB}, //16161 #CJK UNIFIED IDEOGRAPH
+ {0xF4D6, 0x751B}, //16162 #CJK UNIFIED IDEOGRAPH
+ {0xF4D7, 0x77BB}, //16163 #CJK UNIFIED IDEOGRAPH
+ {0xF4D8, 0x7C3D}, //16164 #CJK UNIFIED IDEOGRAPH
+ {0xF4D9, 0x7C64}, //16165 #CJK UNIFIED IDEOGRAPH
+ {0xF4DA, 0x8A79}, //16166 #CJK UNIFIED IDEOGRAPH
+ {0xF4DB, 0x8AC2}, //16167 #CJK UNIFIED IDEOGRAPH
+ {0xF4DC, 0x581E}, //16168 #CJK UNIFIED IDEOGRAPH
+ {0xF4DD, 0x59BE}, //16169 #CJK UNIFIED IDEOGRAPH
+ {0xF4DE, 0x5E16}, //16170 #CJK UNIFIED IDEOGRAPH
+ {0xF4DF, 0x6377}, //16171 #CJK UNIFIED IDEOGRAPH
+ {0xF4E0, 0x7252}, //16172 #CJK UNIFIED IDEOGRAPH
+ {0xF4E1, 0x758A}, //16173 #CJK UNIFIED IDEOGRAPH
+ {0xF4E2, 0x776B}, //16174 #CJK UNIFIED IDEOGRAPH
+ {0xF4E3, 0x8ADC}, //16175 #CJK UNIFIED IDEOGRAPH
+ {0xF4E4, 0x8CBC}, //16176 #CJK UNIFIED IDEOGRAPH
+ {0xF4E5, 0x8F12}, //16177 #CJK UNIFIED IDEOGRAPH
+ {0xF4E6, 0x5EF3}, //16178 #CJK UNIFIED IDEOGRAPH
+ {0xF4E7, 0x6674}, //16179 #CJK UNIFIED IDEOGRAPH
+ {0xF4E8, 0x6DF8}, //16180 #CJK UNIFIED IDEOGRAPH
+ {0xF4E9, 0x807D}, //16181 #CJK UNIFIED IDEOGRAPH
+ {0xF4EA, 0x83C1}, //16182 #CJK UNIFIED IDEOGRAPH
+ {0xF4EB, 0x8ACB}, //16183 #CJK UNIFIED IDEOGRAPH
+ {0xF4EC, 0x9751}, //16184 #CJK UNIFIED IDEOGRAPH
+ {0xF4ED, 0x9BD6}, //16185 #CJK UNIFIED IDEOGRAPH
+ {0xF4EE, 0xFA00}, //16186 #CJK COMPATIBILITY IDEOGRAPH
+ {0xF4EF, 0x5243}, //16187 #CJK UNIFIED IDEOGRAPH
+ {0xF4F0, 0x66FF}, //16188 #CJK UNIFIED IDEOGRAPH
+ {0xF4F1, 0x6D95}, //16189 #CJK UNIFIED IDEOGRAPH
+ {0xF4F2, 0x6EEF}, //16190 #CJK UNIFIED IDEOGRAPH
+ {0xF4F3, 0x7DE0}, //16191 #CJK UNIFIED IDEOGRAPH
+ {0xF4F4, 0x8AE6}, //16192 #CJK UNIFIED IDEOGRAPH
+ {0xF4F5, 0x902E}, //16193 #CJK UNIFIED IDEOGRAPH
+ {0xF4F6, 0x905E}, //16194 #CJK UNIFIED IDEOGRAPH
+ {0xF4F7, 0x9AD4}, //16195 #CJK UNIFIED IDEOGRAPH
+ {0xF4F8, 0x521D}, //16196 #CJK UNIFIED IDEOGRAPH
+ {0xF4F9, 0x527F}, //16197 #CJK UNIFIED IDEOGRAPH
+ {0xF4FA, 0x54E8}, //16198 #CJK UNIFIED IDEOGRAPH
+ {0xF4FB, 0x6194}, //16199 #CJK UNIFIED IDEOGRAPH
+ {0xF4FC, 0x6284}, //16200 #CJK UNIFIED IDEOGRAPH
+ {0xF4FD, 0x62DB}, //16201 #CJK UNIFIED IDEOGRAPH
+ {0xF4FE, 0x68A2}, //16202 #CJK UNIFIED IDEOGRAPH
+ {0xF5A1, 0x6912}, //16203 #CJK UNIFIED IDEOGRAPH
+ {0xF5A2, 0x695A}, //16204 #CJK UNIFIED IDEOGRAPH
+ {0xF5A3, 0x6A35}, //16205 #CJK UNIFIED IDEOGRAPH
+ {0xF5A4, 0x7092}, //16206 #CJK UNIFIED IDEOGRAPH
+ {0xF5A5, 0x7126}, //16207 #CJK UNIFIED IDEOGRAPH
+ {0xF5A6, 0x785D}, //16208 #CJK UNIFIED IDEOGRAPH
+ {0xF5A7, 0x7901}, //16209 #CJK UNIFIED IDEOGRAPH
+ {0xF5A8, 0x790E}, //16210 #CJK UNIFIED IDEOGRAPH
+ {0xF5A9, 0x79D2}, //16211 #CJK UNIFIED IDEOGRAPH
+ {0xF5AA, 0x7A0D}, //16212 #CJK UNIFIED IDEOGRAPH
+ {0xF5AB, 0x8096}, //16213 #CJK UNIFIED IDEOGRAPH
+ {0xF5AC, 0x8278}, //16214 #CJK UNIFIED IDEOGRAPH
+ {0xF5AD, 0x82D5}, //16215 #CJK UNIFIED IDEOGRAPH
+ {0xF5AE, 0x8349}, //16216 #CJK UNIFIED IDEOGRAPH
+ {0xF5AF, 0x8549}, //16217 #CJK UNIFIED IDEOGRAPH
+ {0xF5B0, 0x8C82}, //16218 #CJK UNIFIED IDEOGRAPH
+ {0xF5B1, 0x8D85}, //16219 #CJK UNIFIED IDEOGRAPH
+ {0xF5B2, 0x9162}, //16220 #CJK UNIFIED IDEOGRAPH
+ {0xF5B3, 0x918B}, //16221 #CJK UNIFIED IDEOGRAPH
+ {0xF5B4, 0x91AE}, //16222 #CJK UNIFIED IDEOGRAPH
+ {0xF5B5, 0x4FC3}, //16223 #CJK UNIFIED IDEOGRAPH
+ {0xF5B6, 0x56D1}, //16224 #CJK UNIFIED IDEOGRAPH
+ {0xF5B7, 0x71ED}, //16225 #CJK UNIFIED IDEOGRAPH
+ {0xF5B8, 0x77D7}, //16226 #CJK UNIFIED IDEOGRAPH
+ {0xF5B9, 0x8700}, //16227 #CJK UNIFIED IDEOGRAPH
+ {0xF5BA, 0x89F8}, //16228 #CJK UNIFIED IDEOGRAPH
+ {0xF5BB, 0x5BF8}, //16229 #CJK UNIFIED IDEOGRAPH
+ {0xF5BC, 0x5FD6}, //16230 #CJK UNIFIED IDEOGRAPH
+ {0xF5BD, 0x6751}, //16231 #CJK UNIFIED IDEOGRAPH
+ {0xF5BE, 0x90A8}, //16232 #CJK UNIFIED IDEOGRAPH
+ {0xF5BF, 0x53E2}, //16233 #CJK UNIFIED IDEOGRAPH
+ {0xF5C0, 0x585A}, //16234 #CJK UNIFIED IDEOGRAPH
+ {0xF5C1, 0x5BF5}, //16235 #CJK UNIFIED IDEOGRAPH
+ {0xF5C2, 0x60A4}, //16236 #CJK UNIFIED IDEOGRAPH
+ {0xF5C3, 0x6181}, //16237 #CJK UNIFIED IDEOGRAPH
+ {0xF5C4, 0x6460}, //16238 #CJK UNIFIED IDEOGRAPH
+ {0xF5C5, 0x7E3D}, //16239 #CJK UNIFIED IDEOGRAPH
+ {0xF5C6, 0x8070}, //16240 #CJK UNIFIED IDEOGRAPH
+ {0xF5C7, 0x8525}, //16241 #CJK UNIFIED IDEOGRAPH
+ {0xF5C8, 0x9283}, //16242 #CJK UNIFIED IDEOGRAPH
+ {0xF5C9, 0x64AE}, //16243 #CJK UNIFIED IDEOGRAPH
+ {0xF5CA, 0x50AC}, //16244 #CJK UNIFIED IDEOGRAPH
+ {0xF5CB, 0x5D14}, //16245 #CJK UNIFIED IDEOGRAPH
+ {0xF5CC, 0x6700}, //16246 #CJK UNIFIED IDEOGRAPH
+ {0xF5CD, 0x589C}, //16247 #CJK UNIFIED IDEOGRAPH
+ {0xF5CE, 0x62BD}, //16248 #CJK UNIFIED IDEOGRAPH
+ {0xF5CF, 0x63A8}, //16249 #CJK UNIFIED IDEOGRAPH
+ {0xF5D0, 0x690E}, //16250 #CJK UNIFIED IDEOGRAPH
+ {0xF5D1, 0x6978}, //16251 #CJK UNIFIED IDEOGRAPH
+ {0xF5D2, 0x6A1E}, //16252 #CJK UNIFIED IDEOGRAPH
+ {0xF5D3, 0x6E6B}, //16253 #CJK UNIFIED IDEOGRAPH
+ {0xF5D4, 0x76BA}, //16254 #CJK UNIFIED IDEOGRAPH
+ {0xF5D5, 0x79CB}, //16255 #CJK UNIFIED IDEOGRAPH
+ {0xF5D6, 0x82BB}, //16256 #CJK UNIFIED IDEOGRAPH
+ {0xF5D7, 0x8429}, //16257 #CJK UNIFIED IDEOGRAPH
+ {0xF5D8, 0x8ACF}, //16258 #CJK UNIFIED IDEOGRAPH
+ {0xF5D9, 0x8DA8}, //16259 #CJK UNIFIED IDEOGRAPH
+ {0xF5DA, 0x8FFD}, //16260 #CJK UNIFIED IDEOGRAPH
+ {0xF5DB, 0x9112}, //16261 #CJK UNIFIED IDEOGRAPH
+ {0xF5DC, 0x914B}, //16262 #CJK UNIFIED IDEOGRAPH
+ {0xF5DD, 0x919C}, //16263 #CJK UNIFIED IDEOGRAPH
+ {0xF5DE, 0x9310}, //16264 #CJK UNIFIED IDEOGRAPH
+ {0xF5DF, 0x9318}, //16265 #CJK UNIFIED IDEOGRAPH
+ {0xF5E0, 0x939A}, //16266 #CJK UNIFIED IDEOGRAPH
+ {0xF5E1, 0x96DB}, //16267 #CJK UNIFIED IDEOGRAPH
+ {0xF5E2, 0x9A36}, //16268 #CJK UNIFIED IDEOGRAPH
+ {0xF5E3, 0x9C0D}, //16269 #CJK UNIFIED IDEOGRAPH
+ {0xF5E4, 0x4E11}, //16270 #CJK UNIFIED IDEOGRAPH
+ {0xF5E5, 0x755C}, //16271 #CJK UNIFIED IDEOGRAPH
+ {0xF5E6, 0x795D}, //16272 #CJK UNIFIED IDEOGRAPH
+ {0xF5E7, 0x7AFA}, //16273 #CJK UNIFIED IDEOGRAPH
+ {0xF5E8, 0x7B51}, //16274 #CJK UNIFIED IDEOGRAPH
+ {0xF5E9, 0x7BC9}, //16275 #CJK UNIFIED IDEOGRAPH
+ {0xF5EA, 0x7E2E}, //16276 #CJK UNIFIED IDEOGRAPH
+ {0xF5EB, 0x84C4}, //16277 #CJK UNIFIED IDEOGRAPH
+ {0xF5EC, 0x8E59}, //16278 #CJK UNIFIED IDEOGRAPH
+ {0xF5ED, 0x8E74}, //16279 #CJK UNIFIED IDEOGRAPH
+ {0xF5EE, 0x8EF8}, //16280 #CJK UNIFIED IDEOGRAPH
+ {0xF5EF, 0x9010}, //16281 #CJK UNIFIED IDEOGRAPH
+ {0xF5F0, 0x6625}, //16282 #CJK UNIFIED IDEOGRAPH
+ {0xF5F1, 0x693F}, //16283 #CJK UNIFIED IDEOGRAPH
+ {0xF5F2, 0x7443}, //16284 #CJK UNIFIED IDEOGRAPH
+ {0xF5F3, 0x51FA}, //16285 #CJK UNIFIED IDEOGRAPH
+ {0xF5F4, 0x672E}, //16286 #CJK UNIFIED IDEOGRAPH
+ {0xF5F5, 0x9EDC}, //16287 #CJK UNIFIED IDEOGRAPH
+ {0xF5F6, 0x5145}, //16288 #CJK UNIFIED IDEOGRAPH
+ {0xF5F7, 0x5FE0}, //16289 #CJK UNIFIED IDEOGRAPH
+ {0xF5F8, 0x6C96}, //16290 #CJK UNIFIED IDEOGRAPH
+ {0xF5F9, 0x87F2}, //16291 #CJK UNIFIED IDEOGRAPH
+ {0xF5FA, 0x885D}, //16292 #CJK UNIFIED IDEOGRAPH
+ {0xF5FB, 0x8877}, //16293 #CJK UNIFIED IDEOGRAPH
+ {0xF5FC, 0x60B4}, //16294 #CJK UNIFIED IDEOGRAPH
+ {0xF5FD, 0x81B5}, //16295 #CJK UNIFIED IDEOGRAPH
+ {0xF5FE, 0x8403}, //16296 #CJK UNIFIED IDEOGRAPH
+ {0xF6A1, 0x8D05}, //16297 #CJK UNIFIED IDEOGRAPH
+ {0xF6A2, 0x53D6}, //16298 #CJK UNIFIED IDEOGRAPH
+ {0xF6A3, 0x5439}, //16299 #CJK UNIFIED IDEOGRAPH
+ {0xF6A4, 0x5634}, //16300 #CJK UNIFIED IDEOGRAPH
+ {0xF6A5, 0x5A36}, //16301 #CJK UNIFIED IDEOGRAPH
+ {0xF6A6, 0x5C31}, //16302 #CJK UNIFIED IDEOGRAPH
+ {0xF6A7, 0x708A}, //16303 #CJK UNIFIED IDEOGRAPH
+ {0xF6A8, 0x7FE0}, //16304 #CJK UNIFIED IDEOGRAPH
+ {0xF6A9, 0x805A}, //16305 #CJK UNIFIED IDEOGRAPH
+ {0xF6AA, 0x8106}, //16306 #CJK UNIFIED IDEOGRAPH
+ {0xF6AB, 0x81ED}, //16307 #CJK UNIFIED IDEOGRAPH
+ {0xF6AC, 0x8DA3}, //16308 #CJK UNIFIED IDEOGRAPH
+ {0xF6AD, 0x9189}, //16309 #CJK UNIFIED IDEOGRAPH
+ {0xF6AE, 0x9A5F}, //16310 #CJK UNIFIED IDEOGRAPH
+ {0xF6AF, 0x9DF2}, //16311 #CJK UNIFIED IDEOGRAPH
+ {0xF6B0, 0x5074}, //16312 #CJK UNIFIED IDEOGRAPH
+ {0xF6B1, 0x4EC4}, //16313 #CJK UNIFIED IDEOGRAPH
+ {0xF6B2, 0x53A0}, //16314 #CJK UNIFIED IDEOGRAPH
+ {0xF6B3, 0x60FB}, //16315 #CJK UNIFIED IDEOGRAPH
+ {0xF6B4, 0x6E2C}, //16316 #CJK UNIFIED IDEOGRAPH
+ {0xF6B5, 0x5C64}, //16317 #CJK UNIFIED IDEOGRAPH
+ {0xF6B6, 0x4F88}, //16318 #CJK UNIFIED IDEOGRAPH
+ {0xF6B7, 0x5024}, //16319 #CJK UNIFIED IDEOGRAPH
+ {0xF6B8, 0x55E4}, //16320 #CJK UNIFIED IDEOGRAPH
+ {0xF6B9, 0x5CD9}, //16321 #CJK UNIFIED IDEOGRAPH
+ {0xF6BA, 0x5E5F}, //16322 #CJK UNIFIED IDEOGRAPH
+ {0xF6BB, 0x6065}, //16323 #CJK UNIFIED IDEOGRAPH
+ {0xF6BC, 0x6894}, //16324 #CJK UNIFIED IDEOGRAPH
+ {0xF6BD, 0x6CBB}, //16325 #CJK UNIFIED IDEOGRAPH
+ {0xF6BE, 0x6DC4}, //16326 #CJK UNIFIED IDEOGRAPH
+ {0xF6BF, 0x71BE}, //16327 #CJK UNIFIED IDEOGRAPH
+ {0xF6C0, 0x75D4}, //16328 #CJK UNIFIED IDEOGRAPH
+ {0xF6C1, 0x75F4}, //16329 #CJK UNIFIED IDEOGRAPH
+ {0xF6C2, 0x7661}, //16330 #CJK UNIFIED IDEOGRAPH
+ {0xF6C3, 0x7A1A}, //16331 #CJK UNIFIED IDEOGRAPH
+ {0xF6C4, 0x7A49}, //16332 #CJK UNIFIED IDEOGRAPH
+ {0xF6C5, 0x7DC7}, //16333 #CJK UNIFIED IDEOGRAPH
+ {0xF6C6, 0x7DFB}, //16334 #CJK UNIFIED IDEOGRAPH
+ {0xF6C7, 0x7F6E}, //16335 #CJK UNIFIED IDEOGRAPH
+ {0xF6C8, 0x81F4}, //16336 #CJK UNIFIED IDEOGRAPH
+ {0xF6C9, 0x86A9}, //16337 #CJK UNIFIED IDEOGRAPH
+ {0xF6CA, 0x8F1C}, //16338 #CJK UNIFIED IDEOGRAPH
+ {0xF6CB, 0x96C9}, //16339 #CJK UNIFIED IDEOGRAPH
+ {0xF6CC, 0x99B3}, //16340 #CJK UNIFIED IDEOGRAPH
+ {0xF6CD, 0x9F52}, //16341 #CJK UNIFIED IDEOGRAPH
+ {0xF6CE, 0x5247}, //16342 #CJK UNIFIED IDEOGRAPH
+ {0xF6CF, 0x52C5}, //16343 #CJK UNIFIED IDEOGRAPH
+ {0xF6D0, 0x98ED}, //16344 #CJK UNIFIED IDEOGRAPH
+ {0xF6D1, 0x89AA}, //16345 #CJK UNIFIED IDEOGRAPH
+ {0xF6D2, 0x4E03}, //16346 #CJK UNIFIED IDEOGRAPH
+ {0xF6D3, 0x67D2}, //16347 #CJK UNIFIED IDEOGRAPH
+ {0xF6D4, 0x6F06}, //16348 #CJK UNIFIED IDEOGRAPH
+ {0xF6D5, 0x4FB5}, //16349 #CJK UNIFIED IDEOGRAPH
+ {0xF6D6, 0x5BE2}, //16350 #CJK UNIFIED IDEOGRAPH
+ {0xF6D7, 0x6795}, //16351 #CJK UNIFIED IDEOGRAPH
+ {0xF6D8, 0x6C88}, //16352 #CJK UNIFIED IDEOGRAPH
+ {0xF6D9, 0x6D78}, //16353 #CJK UNIFIED IDEOGRAPH
+ {0xF6DA, 0x741B}, //16354 #CJK UNIFIED IDEOGRAPH
+ {0xF6DB, 0x7827}, //16355 #CJK UNIFIED IDEOGRAPH
+ {0xF6DC, 0x91DD}, //16356 #CJK UNIFIED IDEOGRAPH
+ {0xF6DD, 0x937C}, //16357 #CJK UNIFIED IDEOGRAPH
+ {0xF6DE, 0x87C4}, //16358 #CJK UNIFIED IDEOGRAPH
+ {0xF6DF, 0x79E4}, //16359 #CJK UNIFIED IDEOGRAPH
+ {0xF6E0, 0x7A31}, //16360 #CJK UNIFIED IDEOGRAPH
+ {0xF6E1, 0x5FEB}, //16361 #CJK UNIFIED IDEOGRAPH
+ {0xF6E2, 0x4ED6}, //16362 #CJK UNIFIED IDEOGRAPH
+ {0xF6E3, 0x54A4}, //16363 #CJK UNIFIED IDEOGRAPH
+ {0xF6E4, 0x553E}, //16364 #CJK UNIFIED IDEOGRAPH
+ {0xF6E5, 0x58AE}, //16365 #CJK UNIFIED IDEOGRAPH
+ {0xF6E6, 0x59A5}, //16366 #CJK UNIFIED IDEOGRAPH
+ {0xF6E7, 0x60F0}, //16367 #CJK UNIFIED IDEOGRAPH
+ {0xF6E8, 0x6253}, //16368 #CJK UNIFIED IDEOGRAPH
+ {0xF6E9, 0x62D6}, //16369 #CJK UNIFIED IDEOGRAPH
+ {0xF6EA, 0x6736}, //16370 #CJK UNIFIED IDEOGRAPH
+ {0xF6EB, 0x6955}, //16371 #CJK UNIFIED IDEOGRAPH
+ {0xF6EC, 0x8235}, //16372 #CJK UNIFIED IDEOGRAPH
+ {0xF6ED, 0x9640}, //16373 #CJK UNIFIED IDEOGRAPH
+ {0xF6EE, 0x99B1}, //16374 #CJK UNIFIED IDEOGRAPH
+ {0xF6EF, 0x99DD}, //16375 #CJK UNIFIED IDEOGRAPH
+ {0xF6F0, 0x502C}, //16376 #CJK UNIFIED IDEOGRAPH
+ {0xF6F1, 0x5353}, //16377 #CJK UNIFIED IDEOGRAPH
+ {0xF6F2, 0x5544}, //16378 #CJK UNIFIED IDEOGRAPH
+ {0xF6F3, 0x577C}, //16379 #CJK UNIFIED IDEOGRAPH
+ {0xF6F4, 0xFA01}, //16380 #CJK COMPATIBILITY IDEOGRAPH
+ {0xF6F5, 0x6258}, //16381 #CJK UNIFIED IDEOGRAPH
+ {0xF6F6, 0xFA02}, //16382 #CJK COMPATIBILITY IDEOGRAPH
+ {0xF6F7, 0x64E2}, //16383 #CJK UNIFIED IDEOGRAPH
+ {0xF6F8, 0x666B}, //16384 #CJK UNIFIED IDEOGRAPH
+ {0xF6F9, 0x67DD}, //16385 #CJK UNIFIED IDEOGRAPH
+ {0xF6FA, 0x6FC1}, //16386 #CJK UNIFIED IDEOGRAPH
+ {0xF6FB, 0x6FEF}, //16387 #CJK UNIFIED IDEOGRAPH
+ {0xF6FC, 0x7422}, //16388 #CJK UNIFIED IDEOGRAPH
+ {0xF6FD, 0x7438}, //16389 #CJK UNIFIED IDEOGRAPH
+ {0xF6FE, 0x8A17}, //16390 #CJK UNIFIED IDEOGRAPH
+ {0xF7A1, 0x9438}, //16391 #CJK UNIFIED IDEOGRAPH
+ {0xF7A2, 0x5451}, //16392 #CJK UNIFIED IDEOGRAPH
+ {0xF7A3, 0x5606}, //16393 #CJK UNIFIED IDEOGRAPH
+ {0xF7A4, 0x5766}, //16394 #CJK UNIFIED IDEOGRAPH
+ {0xF7A5, 0x5F48}, //16395 #CJK UNIFIED IDEOGRAPH
+ {0xF7A6, 0x619A}, //16396 #CJK UNIFIED IDEOGRAPH
+ {0xF7A7, 0x6B4E}, //16397 #CJK UNIFIED IDEOGRAPH
+ {0xF7A8, 0x7058}, //16398 #CJK UNIFIED IDEOGRAPH
+ {0xF7A9, 0x70AD}, //16399 #CJK UNIFIED IDEOGRAPH
+ {0xF7AA, 0x7DBB}, //16400 #CJK UNIFIED IDEOGRAPH
+ {0xF7AB, 0x8A95}, //16401 #CJK UNIFIED IDEOGRAPH
+ {0xF7AC, 0x596A}, //16402 #CJK UNIFIED IDEOGRAPH
+ {0xF7AD, 0x812B}, //16403 #CJK UNIFIED IDEOGRAPH
+ {0xF7AE, 0x63A2}, //16404 #CJK UNIFIED IDEOGRAPH
+ {0xF7AF, 0x7708}, //16405 #CJK UNIFIED IDEOGRAPH
+ {0xF7B0, 0x803D}, //16406 #CJK UNIFIED IDEOGRAPH
+ {0xF7B1, 0x8CAA}, //16407 #CJK UNIFIED IDEOGRAPH
+ {0xF7B2, 0x5854}, //16408 #CJK UNIFIED IDEOGRAPH
+ {0xF7B3, 0x642D}, //16409 #CJK UNIFIED IDEOGRAPH
+ {0xF7B4, 0x69BB}, //16410 #CJK UNIFIED IDEOGRAPH
+ {0xF7B5, 0x5B95}, //16411 #CJK UNIFIED IDEOGRAPH
+ {0xF7B6, 0x5E11}, //16412 #CJK UNIFIED IDEOGRAPH
+ {0xF7B7, 0x6E6F}, //16413 #CJK UNIFIED IDEOGRAPH
+ {0xF7B8, 0xFA03}, //16414 #CJK COMPATIBILITY IDEOGRAPH
+ {0xF7B9, 0x8569}, //16415 #CJK UNIFIED IDEOGRAPH
+ {0xF7BA, 0x514C}, //16416 #CJK UNIFIED IDEOGRAPH
+ {0xF7BB, 0x53F0}, //16417 #CJK UNIFIED IDEOGRAPH
+ {0xF7BC, 0x592A}, //16418 #CJK UNIFIED IDEOGRAPH
+ {0xF7BD, 0x6020}, //16419 #CJK UNIFIED IDEOGRAPH
+ {0xF7BE, 0x614B}, //16420 #CJK UNIFIED IDEOGRAPH
+ {0xF7BF, 0x6B86}, //16421 #CJK UNIFIED IDEOGRAPH
+ {0xF7C0, 0x6C70}, //16422 #CJK UNIFIED IDEOGRAPH
+ {0xF7C1, 0x6CF0}, //16423 #CJK UNIFIED IDEOGRAPH
+ {0xF7C2, 0x7B1E}, //16424 #CJK UNIFIED IDEOGRAPH
+ {0xF7C3, 0x80CE}, //16425 #CJK UNIFIED IDEOGRAPH
+ {0xF7C4, 0x82D4}, //16426 #CJK UNIFIED IDEOGRAPH
+ {0xF7C5, 0x8DC6}, //16427 #CJK UNIFIED IDEOGRAPH
+ {0xF7C6, 0x90B0}, //16428 #CJK UNIFIED IDEOGRAPH
+ {0xF7C7, 0x98B1}, //16429 #CJK UNIFIED IDEOGRAPH
+ {0xF7C8, 0xFA04}, //16430 #CJK COMPATIBILITY IDEOGRAPH
+ {0xF7C9, 0x64C7}, //16431 #CJK UNIFIED IDEOGRAPH
+ {0xF7CA, 0x6FA4}, //16432 #CJK UNIFIED IDEOGRAPH
+ {0xF7CB, 0x6491}, //16433 #CJK UNIFIED IDEOGRAPH
+ {0xF7CC, 0x6504}, //16434 #CJK UNIFIED IDEOGRAPH
+ {0xF7CD, 0x514E}, //16435 #CJK UNIFIED IDEOGRAPH
+ {0xF7CE, 0x5410}, //16436 #CJK UNIFIED IDEOGRAPH
+ {0xF7CF, 0x571F}, //16437 #CJK UNIFIED IDEOGRAPH
+ {0xF7D0, 0x8A0E}, //16438 #CJK UNIFIED IDEOGRAPH
+ {0xF7D1, 0x615F}, //16439 #CJK UNIFIED IDEOGRAPH
+ {0xF7D2, 0x6876}, //16440 #CJK UNIFIED IDEOGRAPH
+ {0xF7D3, 0xFA05}, //16441 #CJK COMPATIBILITY IDEOGRAPH
+ {0xF7D4, 0x75DB}, //16442 #CJK UNIFIED IDEOGRAPH
+ {0xF7D5, 0x7B52}, //16443 #CJK UNIFIED IDEOGRAPH
+ {0xF7D6, 0x7D71}, //16444 #CJK UNIFIED IDEOGRAPH
+ {0xF7D7, 0x901A}, //16445 #CJK UNIFIED IDEOGRAPH
+ {0xF7D8, 0x5806}, //16446 #CJK UNIFIED IDEOGRAPH
+ {0xF7D9, 0x69CC}, //16447 #CJK UNIFIED IDEOGRAPH
+ {0xF7DA, 0x817F}, //16448 #CJK UNIFIED IDEOGRAPH
+ {0xF7DB, 0x892A}, //16449 #CJK UNIFIED IDEOGRAPH
+ {0xF7DC, 0x9000}, //16450 #CJK UNIFIED IDEOGRAPH
+ {0xF7DD, 0x9839}, //16451 #CJK UNIFIED IDEOGRAPH
+ {0xF7DE, 0x5078}, //16452 #CJK UNIFIED IDEOGRAPH
+ {0xF7DF, 0x5957}, //16453 #CJK UNIFIED IDEOGRAPH
+ {0xF7E0, 0x59AC}, //16454 #CJK UNIFIED IDEOGRAPH
+ {0xF7E1, 0x6295}, //16455 #CJK UNIFIED IDEOGRAPH
+ {0xF7E2, 0x900F}, //16456 #CJK UNIFIED IDEOGRAPH
+ {0xF7E3, 0x9B2A}, //16457 #CJK UNIFIED IDEOGRAPH
+ {0xF7E4, 0x615D}, //16458 #CJK UNIFIED IDEOGRAPH
+ {0xF7E5, 0x7279}, //16459 #CJK UNIFIED IDEOGRAPH
+ {0xF7E6, 0x95D6}, //16460 #CJK UNIFIED IDEOGRAPH
+ {0xF7E7, 0x5761}, //16461 #CJK UNIFIED IDEOGRAPH
+ {0xF7E8, 0x5A46}, //16462 #CJK UNIFIED IDEOGRAPH
+ {0xF7E9, 0x5DF4}, //16463 #CJK UNIFIED IDEOGRAPH
+ {0xF7EA, 0x628A}, //16464 #CJK UNIFIED IDEOGRAPH
+ {0xF7EB, 0x64AD}, //16465 #CJK UNIFIED IDEOGRAPH
+ {0xF7EC, 0x64FA}, //16466 #CJK UNIFIED IDEOGRAPH
+ {0xF7ED, 0x6777}, //16467 #CJK UNIFIED IDEOGRAPH
+ {0xF7EE, 0x6CE2}, //16468 #CJK UNIFIED IDEOGRAPH
+ {0xF7EF, 0x6D3E}, //16469 #CJK UNIFIED IDEOGRAPH
+ {0xF7F0, 0x722C}, //16470 #CJK UNIFIED IDEOGRAPH
+ {0xF7F1, 0x7436}, //16471 #CJK UNIFIED IDEOGRAPH
+ {0xF7F2, 0x7834}, //16472 #CJK UNIFIED IDEOGRAPH
+ {0xF7F3, 0x7F77}, //16473 #CJK UNIFIED IDEOGRAPH
+ {0xF7F4, 0x82AD}, //16474 #CJK UNIFIED IDEOGRAPH
+ {0xF7F5, 0x8DDB}, //16475 #CJK UNIFIED IDEOGRAPH
+ {0xF7F6, 0x9817}, //16476 #CJK UNIFIED IDEOGRAPH
+ {0xF7F7, 0x5224}, //16477 #CJK UNIFIED IDEOGRAPH
+ {0xF7F8, 0x5742}, //16478 #CJK UNIFIED IDEOGRAPH
+ {0xF7F9, 0x677F}, //16479 #CJK UNIFIED IDEOGRAPH
+ {0xF7FA, 0x7248}, //16480 #CJK UNIFIED IDEOGRAPH
+ {0xF7FB, 0x74E3}, //16481 #CJK UNIFIED IDEOGRAPH
+ {0xF7FC, 0x8CA9}, //16482 #CJK UNIFIED IDEOGRAPH
+ {0xF7FD, 0x8FA6}, //16483 #CJK UNIFIED IDEOGRAPH
+ {0xF7FE, 0x9211}, //16484 #CJK UNIFIED IDEOGRAPH
+ {0xF8A1, 0x962A}, //16485 #CJK UNIFIED IDEOGRAPH
+ {0xF8A2, 0x516B}, //16486 #CJK UNIFIED IDEOGRAPH
+ {0xF8A3, 0x53ED}, //16487 #CJK UNIFIED IDEOGRAPH
+ {0xF8A4, 0x634C}, //16488 #CJK UNIFIED IDEOGRAPH
+ {0xF8A5, 0x4F69}, //16489 #CJK UNIFIED IDEOGRAPH
+ {0xF8A6, 0x5504}, //16490 #CJK UNIFIED IDEOGRAPH
+ {0xF8A7, 0x6096}, //16491 #CJK UNIFIED IDEOGRAPH
+ {0xF8A8, 0x6557}, //16492 #CJK UNIFIED IDEOGRAPH
+ {0xF8A9, 0x6C9B}, //16493 #CJK UNIFIED IDEOGRAPH
+ {0xF8AA, 0x6D7F}, //16494 #CJK UNIFIED IDEOGRAPH
+ {0xF8AB, 0x724C}, //16495 #CJK UNIFIED IDEOGRAPH
+ {0xF8AC, 0x72FD}, //16496 #CJK UNIFIED IDEOGRAPH
+ {0xF8AD, 0x7A17}, //16497 #CJK UNIFIED IDEOGRAPH
+ {0xF8AE, 0x8987}, //16498 #CJK UNIFIED IDEOGRAPH
+ {0xF8AF, 0x8C9D}, //16499 #CJK UNIFIED IDEOGRAPH
+ {0xF8B0, 0x5F6D}, //16500 #CJK UNIFIED IDEOGRAPH
+ {0xF8B1, 0x6F8E}, //16501 #CJK UNIFIED IDEOGRAPH
+ {0xF8B2, 0x70F9}, //16502 #CJK UNIFIED IDEOGRAPH
+ {0xF8B3, 0x81A8}, //16503 #CJK UNIFIED IDEOGRAPH
+ {0xF8B4, 0x610E}, //16504 #CJK UNIFIED IDEOGRAPH
+ {0xF8B5, 0x4FBF}, //16505 #CJK UNIFIED IDEOGRAPH
+ {0xF8B6, 0x504F}, //16506 #CJK UNIFIED IDEOGRAPH
+ {0xF8B7, 0x6241}, //16507 #CJK UNIFIED IDEOGRAPH
+ {0xF8B8, 0x7247}, //16508 #CJK UNIFIED IDEOGRAPH
+ {0xF8B9, 0x7BC7}, //16509 #CJK UNIFIED IDEOGRAPH
+ {0xF8BA, 0x7DE8}, //16510 #CJK UNIFIED IDEOGRAPH
+ {0xF8BB, 0x7FE9}, //16511 #CJK UNIFIED IDEOGRAPH
+ {0xF8BC, 0x904D}, //16512 #CJK UNIFIED IDEOGRAPH
+ {0xF8BD, 0x97AD}, //16513 #CJK UNIFIED IDEOGRAPH
+ {0xF8BE, 0x9A19}, //16514 #CJK UNIFIED IDEOGRAPH
+ {0xF8BF, 0x8CB6}, //16515 #CJK UNIFIED IDEOGRAPH
+ {0xF8C0, 0x576A}, //16516 #CJK UNIFIED IDEOGRAPH
+ {0xF8C1, 0x5E73}, //16517 #CJK UNIFIED IDEOGRAPH
+ {0xF8C2, 0x67B0}, //16518 #CJK UNIFIED IDEOGRAPH
+ {0xF8C3, 0x840D}, //16519 #CJK UNIFIED IDEOGRAPH
+ {0xF8C4, 0x8A55}, //16520 #CJK UNIFIED IDEOGRAPH
+ {0xF8C5, 0x5420}, //16521 #CJK UNIFIED IDEOGRAPH
+ {0xF8C6, 0x5B16}, //16522 #CJK UNIFIED IDEOGRAPH
+ {0xF8C7, 0x5E63}, //16523 #CJK UNIFIED IDEOGRAPH
+ {0xF8C8, 0x5EE2}, //16524 #CJK UNIFIED IDEOGRAPH
+ {0xF8C9, 0x5F0A}, //16525 #CJK UNIFIED IDEOGRAPH
+ {0xF8CA, 0x6583}, //16526 #CJK UNIFIED IDEOGRAPH
+ {0xF8CB, 0x80BA}, //16527 #CJK UNIFIED IDEOGRAPH
+ {0xF8CC, 0x853D}, //16528 #CJK UNIFIED IDEOGRAPH
+ {0xF8CD, 0x9589}, //16529 #CJK UNIFIED IDEOGRAPH
+ {0xF8CE, 0x965B}, //16530 #CJK UNIFIED IDEOGRAPH
+ {0xF8CF, 0x4F48}, //16531 #CJK UNIFIED IDEOGRAPH
+ {0xF8D0, 0x5305}, //16532 #CJK UNIFIED IDEOGRAPH
+ {0xF8D1, 0x530D}, //16533 #CJK UNIFIED IDEOGRAPH
+ {0xF8D2, 0x530F}, //16534 #CJK UNIFIED IDEOGRAPH
+ {0xF8D3, 0x5486}, //16535 #CJK UNIFIED IDEOGRAPH
+ {0xF8D4, 0x54FA}, //16536 #CJK UNIFIED IDEOGRAPH
+ {0xF8D5, 0x5703}, //16537 #CJK UNIFIED IDEOGRAPH
+ {0xF8D6, 0x5E03}, //16538 #CJK UNIFIED IDEOGRAPH
+ {0xF8D7, 0x6016}, //16539 #CJK UNIFIED IDEOGRAPH
+ {0xF8D8, 0x629B}, //16540 #CJK UNIFIED IDEOGRAPH
+ {0xF8D9, 0x62B1}, //16541 #CJK UNIFIED IDEOGRAPH
+ {0xF8DA, 0x6355}, //16542 #CJK UNIFIED IDEOGRAPH
+ {0xF8DB, 0xFA06}, //16543 #CJK COMPATIBILITY IDEOGRAPH
+ {0xF8DC, 0x6CE1}, //16544 #CJK UNIFIED IDEOGRAPH
+ {0xF8DD, 0x6D66}, //16545 #CJK UNIFIED IDEOGRAPH
+ {0xF8DE, 0x75B1}, //16546 #CJK UNIFIED IDEOGRAPH
+ {0xF8DF, 0x7832}, //16547 #CJK UNIFIED IDEOGRAPH
+ {0xF8E0, 0x80DE}, //16548 #CJK UNIFIED IDEOGRAPH
+ {0xF8E1, 0x812F}, //16549 #CJK UNIFIED IDEOGRAPH
+ {0xF8E2, 0x82DE}, //16550 #CJK UNIFIED IDEOGRAPH
+ {0xF8E3, 0x8461}, //16551 #CJK UNIFIED IDEOGRAPH
+ {0xF8E4, 0x84B2}, //16552 #CJK UNIFIED IDEOGRAPH
+ {0xF8E5, 0x888D}, //16553 #CJK UNIFIED IDEOGRAPH
+ {0xF8E6, 0x8912}, //16554 #CJK UNIFIED IDEOGRAPH
+ {0xF8E7, 0x900B}, //16555 #CJK UNIFIED IDEOGRAPH
+ {0xF8E8, 0x92EA}, //16556 #CJK UNIFIED IDEOGRAPH
+ {0xF8E9, 0x98FD}, //16557 #CJK UNIFIED IDEOGRAPH
+ {0xF8EA, 0x9B91}, //16558 #CJK UNIFIED IDEOGRAPH
+ {0xF8EB, 0x5E45}, //16559 #CJK UNIFIED IDEOGRAPH
+ {0xF8EC, 0x66B4}, //16560 #CJK UNIFIED IDEOGRAPH
+ {0xF8ED, 0x66DD}, //16561 #CJK UNIFIED IDEOGRAPH
+ {0xF8EE, 0x7011}, //16562 #CJK UNIFIED IDEOGRAPH
+ {0xF8EF, 0x7206}, //16563 #CJK UNIFIED IDEOGRAPH
+ {0xF8F0, 0xFA07}, //16564 #CJK COMPATIBILITY IDEOGRAPH
+ {0xF8F1, 0x4FF5}, //16565 #CJK UNIFIED IDEOGRAPH
+ {0xF8F2, 0x527D}, //16566 #CJK UNIFIED IDEOGRAPH
+ {0xF8F3, 0x5F6A}, //16567 #CJK UNIFIED IDEOGRAPH
+ {0xF8F4, 0x6153}, //16568 #CJK UNIFIED IDEOGRAPH
+ {0xF8F5, 0x6753}, //16569 #CJK UNIFIED IDEOGRAPH
+ {0xF8F6, 0x6A19}, //16570 #CJK UNIFIED IDEOGRAPH
+ {0xF8F7, 0x6F02}, //16571 #CJK UNIFIED IDEOGRAPH
+ {0xF8F8, 0x74E2}, //16572 #CJK UNIFIED IDEOGRAPH
+ {0xF8F9, 0x7968}, //16573 #CJK UNIFIED IDEOGRAPH
+ {0xF8FA, 0x8868}, //16574 #CJK UNIFIED IDEOGRAPH
+ {0xF8FB, 0x8C79}, //16575 #CJK UNIFIED IDEOGRAPH
+ {0xF8FC, 0x98C7}, //16576 #CJK UNIFIED IDEOGRAPH
+ {0xF8FD, 0x98C4}, //16577 #CJK UNIFIED IDEOGRAPH
+ {0xF8FE, 0x9A43}, //16578 #CJK UNIFIED IDEOGRAPH
+ {0xF9A1, 0x54C1}, //16579 #CJK UNIFIED IDEOGRAPH
+ {0xF9A2, 0x7A1F}, //16580 #CJK UNIFIED IDEOGRAPH
+ {0xF9A3, 0x6953}, //16581 #CJK UNIFIED IDEOGRAPH
+ {0xF9A4, 0x8AF7}, //16582 #CJK UNIFIED IDEOGRAPH
+ {0xF9A5, 0x8C4A}, //16583 #CJK UNIFIED IDEOGRAPH
+ {0xF9A6, 0x98A8}, //16584 #CJK UNIFIED IDEOGRAPH
+ {0xF9A7, 0x99AE}, //16585 #CJK UNIFIED IDEOGRAPH
+ {0xF9A8, 0x5F7C}, //16586 #CJK UNIFIED IDEOGRAPH
+ {0xF9A9, 0x62AB}, //16587 #CJK UNIFIED IDEOGRAPH
+ {0xF9AA, 0x75B2}, //16588 #CJK UNIFIED IDEOGRAPH
+ {0xF9AB, 0x76AE}, //16589 #CJK UNIFIED IDEOGRAPH
+ {0xF9AC, 0x88AB}, //16590 #CJK UNIFIED IDEOGRAPH
+ {0xF9AD, 0x907F}, //16591 #CJK UNIFIED IDEOGRAPH
+ {0xF9AE, 0x9642}, //16592 #CJK UNIFIED IDEOGRAPH
+ {0xF9AF, 0x5339}, //16593 #CJK UNIFIED IDEOGRAPH
+ {0xF9B0, 0x5F3C}, //16594 #CJK UNIFIED IDEOGRAPH
+ {0xF9B1, 0x5FC5}, //16595 #CJK UNIFIED IDEOGRAPH
+ {0xF9B2, 0x6CCC}, //16596 #CJK UNIFIED IDEOGRAPH
+ {0xF9B3, 0x73CC}, //16597 #CJK UNIFIED IDEOGRAPH
+ {0xF9B4, 0x7562}, //16598 #CJK UNIFIED IDEOGRAPH
+ {0xF9B5, 0x758B}, //16599 #CJK UNIFIED IDEOGRAPH
+ {0xF9B6, 0x7B46}, //16600 #CJK UNIFIED IDEOGRAPH
+ {0xF9B7, 0x82FE}, //16601 #CJK UNIFIED IDEOGRAPH
+ {0xF9B8, 0x999D}, //16602 #CJK UNIFIED IDEOGRAPH
+ {0xF9B9, 0x4E4F}, //16603 #CJK UNIFIED IDEOGRAPH
+ {0xF9BA, 0x903C}, //16604 #CJK UNIFIED IDEOGRAPH
+ {0xF9BB, 0x4E0B}, //16605 #CJK UNIFIED IDEOGRAPH
+ {0xF9BC, 0x4F55}, //16606 #CJK UNIFIED IDEOGRAPH
+ {0xF9BD, 0x53A6}, //16607 #CJK UNIFIED IDEOGRAPH
+ {0xF9BE, 0x590F}, //16608 #CJK UNIFIED IDEOGRAPH
+ {0xF9BF, 0x5EC8}, //16609 #CJK UNIFIED IDEOGRAPH
+ {0xF9C0, 0x6630}, //16610 #CJK UNIFIED IDEOGRAPH
+ {0xF9C1, 0x6CB3}, //16611 #CJK UNIFIED IDEOGRAPH
+ {0xF9C2, 0x7455}, //16612 #CJK UNIFIED IDEOGRAPH
+ {0xF9C3, 0x8377}, //16613 #CJK UNIFIED IDEOGRAPH
+ {0xF9C4, 0x8766}, //16614 #CJK UNIFIED IDEOGRAPH
+ {0xF9C5, 0x8CC0}, //16615 #CJK UNIFIED IDEOGRAPH
+ {0xF9C6, 0x9050}, //16616 #CJK UNIFIED IDEOGRAPH
+ {0xF9C7, 0x971E}, //16617 #CJK UNIFIED IDEOGRAPH
+ {0xF9C8, 0x9C15}, //16618 #CJK UNIFIED IDEOGRAPH
+ {0xF9C9, 0x58D1}, //16619 #CJK UNIFIED IDEOGRAPH
+ {0xF9CA, 0x5B78}, //16620 #CJK UNIFIED IDEOGRAPH
+ {0xF9CB, 0x8650}, //16621 #CJK UNIFIED IDEOGRAPH
+ {0xF9CC, 0x8B14}, //16622 #CJK UNIFIED IDEOGRAPH
+ {0xF9CD, 0x9DB4}, //16623 #CJK UNIFIED IDEOGRAPH
+ {0xF9CE, 0x5BD2}, //16624 #CJK UNIFIED IDEOGRAPH
+ {0xF9CF, 0x6068}, //16625 #CJK UNIFIED IDEOGRAPH
+ {0xF9D0, 0x608D}, //16626 #CJK UNIFIED IDEOGRAPH
+ {0xF9D1, 0x65F1}, //16627 #CJK UNIFIED IDEOGRAPH
+ {0xF9D2, 0x6C57}, //16628 #CJK UNIFIED IDEOGRAPH
+ {0xF9D3, 0x6F22}, //16629 #CJK UNIFIED IDEOGRAPH
+ {0xF9D4, 0x6FA3}, //16630 #CJK UNIFIED IDEOGRAPH
+ {0xF9D5, 0x701A}, //16631 #CJK UNIFIED IDEOGRAPH
+ {0xF9D6, 0x7F55}, //16632 #CJK UNIFIED IDEOGRAPH
+ {0xF9D7, 0x7FF0}, //16633 #CJK UNIFIED IDEOGRAPH
+ {0xF9D8, 0x9591}, //16634 #CJK UNIFIED IDEOGRAPH
+ {0xF9D9, 0x9592}, //16635 #CJK UNIFIED IDEOGRAPH
+ {0xF9DA, 0x9650}, //16636 #CJK UNIFIED IDEOGRAPH
+ {0xF9DB, 0x97D3}, //16637 #CJK UNIFIED IDEOGRAPH
+ {0xF9DC, 0x5272}, //16638 #CJK UNIFIED IDEOGRAPH
+ {0xF9DD, 0x8F44}, //16639 #CJK UNIFIED IDEOGRAPH
+ {0xF9DE, 0x51FD}, //16640 #CJK UNIFIED IDEOGRAPH
+ {0xF9DF, 0x542B}, //16641 #CJK UNIFIED IDEOGRAPH
+ {0xF9E0, 0x54B8}, //16642 #CJK UNIFIED IDEOGRAPH
+ {0xF9E1, 0x5563}, //16643 #CJK UNIFIED IDEOGRAPH
+ {0xF9E2, 0x558A}, //16644 #CJK UNIFIED IDEOGRAPH
+ {0xF9E3, 0x6ABB}, //16645 #CJK UNIFIED IDEOGRAPH
+ {0xF9E4, 0x6DB5}, //16646 #CJK UNIFIED IDEOGRAPH
+ {0xF9E5, 0x7DD8}, //16647 #CJK UNIFIED IDEOGRAPH
+ {0xF9E6, 0x8266}, //16648 #CJK UNIFIED IDEOGRAPH
+ {0xF9E7, 0x929C}, //16649 #CJK UNIFIED IDEOGRAPH
+ {0xF9E8, 0x9677}, //16650 #CJK UNIFIED IDEOGRAPH
+ {0xF9E9, 0x9E79}, //16651 #CJK UNIFIED IDEOGRAPH
+ {0xF9EA, 0x5408}, //16652 #CJK UNIFIED IDEOGRAPH
+ {0xF9EB, 0x54C8}, //16653 #CJK UNIFIED IDEOGRAPH
+ {0xF9EC, 0x76D2}, //16654 #CJK UNIFIED IDEOGRAPH
+ {0xF9ED, 0x86E4}, //16655 #CJK UNIFIED IDEOGRAPH
+ {0xF9EE, 0x95A4}, //16656 #CJK UNIFIED IDEOGRAPH
+ {0xF9EF, 0x95D4}, //16657 #CJK UNIFIED IDEOGRAPH
+ {0xF9F0, 0x965C}, //16658 #CJK UNIFIED IDEOGRAPH
+ {0xF9F1, 0x4EA2}, //16659 #CJK UNIFIED IDEOGRAPH
+ {0xF9F2, 0x4F09}, //16660 #CJK UNIFIED IDEOGRAPH
+ {0xF9F3, 0x59EE}, //16661 #CJK UNIFIED IDEOGRAPH
+ {0xF9F4, 0x5AE6}, //16662 #CJK UNIFIED IDEOGRAPH
+ {0xF9F5, 0x5DF7}, //16663 #CJK UNIFIED IDEOGRAPH
+ {0xF9F6, 0x6052}, //16664 #CJK UNIFIED IDEOGRAPH
+ {0xF9F7, 0x6297}, //16665 #CJK UNIFIED IDEOGRAPH
+ {0xF9F8, 0x676D}, //16666 #CJK UNIFIED IDEOGRAPH
+ {0xF9F9, 0x6841}, //16667 #CJK UNIFIED IDEOGRAPH
+ {0xF9FA, 0x6C86}, //16668 #CJK UNIFIED IDEOGRAPH
+ {0xF9FB, 0x6E2F}, //16669 #CJK UNIFIED IDEOGRAPH
+ {0xF9FC, 0x7F38}, //16670 #CJK UNIFIED IDEOGRAPH
+ {0xF9FD, 0x809B}, //16671 #CJK UNIFIED IDEOGRAPH
+ {0xF9FE, 0x822A}, //16672 #CJK UNIFIED IDEOGRAPH
+ {0xFAA1, 0xFA08}, //16673 #CJK COMPATIBILITY IDEOGRAPH
+ {0xFAA2, 0xFA09}, //16674 #CJK COMPATIBILITY IDEOGRAPH
+ {0xFAA3, 0x9805}, //16675 #CJK UNIFIED IDEOGRAPH
+ {0xFAA4, 0x4EA5}, //16676 #CJK UNIFIED IDEOGRAPH
+ {0xFAA5, 0x5055}, //16677 #CJK UNIFIED IDEOGRAPH
+ {0xFAA6, 0x54B3}, //16678 #CJK UNIFIED IDEOGRAPH
+ {0xFAA7, 0x5793}, //16679 #CJK UNIFIED IDEOGRAPH
+ {0xFAA8, 0x595A}, //16680 #CJK UNIFIED IDEOGRAPH
+ {0xFAA9, 0x5B69}, //16681 #CJK UNIFIED IDEOGRAPH
+ {0xFAAA, 0x5BB3}, //16682 #CJK UNIFIED IDEOGRAPH
+ {0xFAAB, 0x61C8}, //16683 #CJK UNIFIED IDEOGRAPH
+ {0xFAAC, 0x6977}, //16684 #CJK UNIFIED IDEOGRAPH
+ {0xFAAD, 0x6D77}, //16685 #CJK UNIFIED IDEOGRAPH
+ {0xFAAE, 0x7023}, //16686 #CJK UNIFIED IDEOGRAPH
+ {0xFAAF, 0x87F9}, //16687 #CJK UNIFIED IDEOGRAPH
+ {0xFAB0, 0x89E3}, //16688 #CJK UNIFIED IDEOGRAPH
+ {0xFAB1, 0x8A72}, //16689 #CJK UNIFIED IDEOGRAPH
+ {0xFAB2, 0x8AE7}, //16690 #CJK UNIFIED IDEOGRAPH
+ {0xFAB3, 0x9082}, //16691 #CJK UNIFIED IDEOGRAPH
+ {0xFAB4, 0x99ED}, //16692 #CJK UNIFIED IDEOGRAPH
+ {0xFAB5, 0x9AB8}, //16693 #CJK UNIFIED IDEOGRAPH
+ {0xFAB6, 0x52BE}, //16694 #CJK UNIFIED IDEOGRAPH
+ {0xFAB7, 0x6838}, //16695 #CJK UNIFIED IDEOGRAPH
+ {0xFAB8, 0x5016}, //16696 #CJK UNIFIED IDEOGRAPH
+ {0xFAB9, 0x5E78}, //16697 #CJK UNIFIED IDEOGRAPH
+ {0xFABA, 0x674F}, //16698 #CJK UNIFIED IDEOGRAPH
+ {0xFABB, 0x8347}, //16699 #CJK UNIFIED IDEOGRAPH
+ {0xFABC, 0x884C}, //16700 #CJK UNIFIED IDEOGRAPH
+ {0xFABD, 0x4EAB}, //16701 #CJK UNIFIED IDEOGRAPH
+ {0xFABE, 0x5411}, //16702 #CJK UNIFIED IDEOGRAPH
+ {0xFABF, 0x56AE}, //16703 #CJK UNIFIED IDEOGRAPH
+ {0xFAC0, 0x73E6}, //16704 #CJK UNIFIED IDEOGRAPH
+ {0xFAC1, 0x9115}, //16705 #CJK UNIFIED IDEOGRAPH
+ {0xFAC2, 0x97FF}, //16706 #CJK UNIFIED IDEOGRAPH
+ {0xFAC3, 0x9909}, //16707 #CJK UNIFIED IDEOGRAPH
+ {0xFAC4, 0x9957}, //16708 #CJK UNIFIED IDEOGRAPH
+ {0xFAC5, 0x9999}, //16709 #CJK UNIFIED IDEOGRAPH
+ {0xFAC6, 0x5653}, //16710 #CJK UNIFIED IDEOGRAPH
+ {0xFAC7, 0x589F}, //16711 #CJK UNIFIED IDEOGRAPH
+ {0xFAC8, 0x865B}, //16712 #CJK UNIFIED IDEOGRAPH
+ {0xFAC9, 0x8A31}, //16713 #CJK UNIFIED IDEOGRAPH
+ {0xFACA, 0x61B2}, //16714 #CJK UNIFIED IDEOGRAPH
+ {0xFACB, 0x6AF6}, //16715 #CJK UNIFIED IDEOGRAPH
+ {0xFACC, 0x737B}, //16716 #CJK UNIFIED IDEOGRAPH
+ {0xFACD, 0x8ED2}, //16717 #CJK UNIFIED IDEOGRAPH
+ {0xFACE, 0x6B47}, //16718 #CJK UNIFIED IDEOGRAPH
+ {0xFACF, 0x96AA}, //16719 #CJK UNIFIED IDEOGRAPH
+ {0xFAD0, 0x9A57}, //16720 #CJK UNIFIED IDEOGRAPH
+ {0xFAD1, 0x5955}, //16721 #CJK UNIFIED IDEOGRAPH
+ {0xFAD2, 0x7200}, //16722 #CJK UNIFIED IDEOGRAPH
+ {0xFAD3, 0x8D6B}, //16723 #CJK UNIFIED IDEOGRAPH
+ {0xFAD4, 0x9769}, //16724 #CJK UNIFIED IDEOGRAPH
+ {0xFAD5, 0x4FD4}, //16725 #CJK UNIFIED IDEOGRAPH
+ {0xFAD6, 0x5CF4}, //16726 #CJK UNIFIED IDEOGRAPH
+ {0xFAD7, 0x5F26}, //16727 #CJK UNIFIED IDEOGRAPH
+ {0xFAD8, 0x61F8}, //16728 #CJK UNIFIED IDEOGRAPH
+ {0xFAD9, 0x665B}, //16729 #CJK UNIFIED IDEOGRAPH
+ {0xFADA, 0x6CEB}, //16730 #CJK UNIFIED IDEOGRAPH
+ {0xFADB, 0x70AB}, //16731 #CJK UNIFIED IDEOGRAPH
+ {0xFADC, 0x7384}, //16732 #CJK UNIFIED IDEOGRAPH
+ {0xFADD, 0x73B9}, //16733 #CJK UNIFIED IDEOGRAPH
+ {0xFADE, 0x73FE}, //16734 #CJK UNIFIED IDEOGRAPH
+ {0xFADF, 0x7729}, //16735 #CJK UNIFIED IDEOGRAPH
+ {0xFAE0, 0x774D}, //16736 #CJK UNIFIED IDEOGRAPH
+ {0xFAE1, 0x7D43}, //16737 #CJK UNIFIED IDEOGRAPH
+ {0xFAE2, 0x7D62}, //16738 #CJK UNIFIED IDEOGRAPH
+ {0xFAE3, 0x7E23}, //16739 #CJK UNIFIED IDEOGRAPH
+ {0xFAE4, 0x8237}, //16740 #CJK UNIFIED IDEOGRAPH
+ {0xFAE5, 0x8852}, //16741 #CJK UNIFIED IDEOGRAPH
+ {0xFAE6, 0xFA0A}, //16742 #CJK COMPATIBILITY IDEOGRAPH
+ {0xFAE7, 0x8CE2}, //16743 #CJK UNIFIED IDEOGRAPH
+ {0xFAE8, 0x9249}, //16744 #CJK UNIFIED IDEOGRAPH
+ {0xFAE9, 0x986F}, //16745 #CJK UNIFIED IDEOGRAPH
+ {0xFAEA, 0x5B51}, //16746 #CJK UNIFIED IDEOGRAPH
+ {0xFAEB, 0x7A74}, //16747 #CJK UNIFIED IDEOGRAPH
+ {0xFAEC, 0x8840}, //16748 #CJK UNIFIED IDEOGRAPH
+ {0xFAED, 0x9801}, //16749 #CJK UNIFIED IDEOGRAPH
+ {0xFAEE, 0x5ACC}, //16750 #CJK UNIFIED IDEOGRAPH
+ {0xFAEF, 0x4FE0}, //16751 #CJK UNIFIED IDEOGRAPH
+ {0xFAF0, 0x5354}, //16752 #CJK UNIFIED IDEOGRAPH
+ {0xFAF1, 0x593E}, //16753 #CJK UNIFIED IDEOGRAPH
+ {0xFAF2, 0x5CFD}, //16754 #CJK UNIFIED IDEOGRAPH
+ {0xFAF3, 0x633E}, //16755 #CJK UNIFIED IDEOGRAPH
+ {0xFAF4, 0x6D79}, //16756 #CJK UNIFIED IDEOGRAPH
+ {0xFAF5, 0x72F9}, //16757 #CJK UNIFIED IDEOGRAPH
+ {0xFAF6, 0x8105}, //16758 #CJK UNIFIED IDEOGRAPH
+ {0xFAF7, 0x8107}, //16759 #CJK UNIFIED IDEOGRAPH
+ {0xFAF8, 0x83A2}, //16760 #CJK UNIFIED IDEOGRAPH
+ {0xFAF9, 0x92CF}, //16761 #CJK UNIFIED IDEOGRAPH
+ {0xFAFA, 0x9830}, //16762 #CJK UNIFIED IDEOGRAPH
+ {0xFAFB, 0x4EA8}, //16763 #CJK UNIFIED IDEOGRAPH
+ {0xFAFC, 0x5144}, //16764 #CJK UNIFIED IDEOGRAPH
+ {0xFAFD, 0x5211}, //16765 #CJK UNIFIED IDEOGRAPH
+ {0xFAFE, 0x578B}, //16766 #CJK UNIFIED IDEOGRAPH
+ {0xFBA1, 0x5F62}, //16767 #CJK UNIFIED IDEOGRAPH
+ {0xFBA2, 0x6CC2}, //16768 #CJK UNIFIED IDEOGRAPH
+ {0xFBA3, 0x6ECE}, //16769 #CJK UNIFIED IDEOGRAPH
+ {0xFBA4, 0x7005}, //16770 #CJK UNIFIED IDEOGRAPH
+ {0xFBA5, 0x7050}, //16771 #CJK UNIFIED IDEOGRAPH
+ {0xFBA6, 0x70AF}, //16772 #CJK UNIFIED IDEOGRAPH
+ {0xFBA7, 0x7192}, //16773 #CJK UNIFIED IDEOGRAPH
+ {0xFBA8, 0x73E9}, //16774 #CJK UNIFIED IDEOGRAPH
+ {0xFBA9, 0x7469}, //16775 #CJK UNIFIED IDEOGRAPH
+ {0xFBAA, 0x834A}, //16776 #CJK UNIFIED IDEOGRAPH
+ {0xFBAB, 0x87A2}, //16777 #CJK UNIFIED IDEOGRAPH
+ {0xFBAC, 0x8861}, //16778 #CJK UNIFIED IDEOGRAPH
+ {0xFBAD, 0x9008}, //16779 #CJK UNIFIED IDEOGRAPH
+ {0xFBAE, 0x90A2}, //16780 #CJK UNIFIED IDEOGRAPH
+ {0xFBAF, 0x93A3}, //16781 #CJK UNIFIED IDEOGRAPH
+ {0xFBB0, 0x99A8}, //16782 #CJK UNIFIED IDEOGRAPH
+ {0xFBB1, 0x516E}, //16783 #CJK UNIFIED IDEOGRAPH
+ {0xFBB2, 0x5F57}, //16784 #CJK UNIFIED IDEOGRAPH
+ {0xFBB3, 0x60E0}, //16785 #CJK UNIFIED IDEOGRAPH
+ {0xFBB4, 0x6167}, //16786 #CJK UNIFIED IDEOGRAPH
+ {0xFBB5, 0x66B3}, //16787 #CJK UNIFIED IDEOGRAPH
+ {0xFBB6, 0x8559}, //16788 #CJK UNIFIED IDEOGRAPH
+ {0xFBB7, 0x8E4A}, //16789 #CJK UNIFIED IDEOGRAPH
+ {0xFBB8, 0x91AF}, //16790 #CJK UNIFIED IDEOGRAPH
+ {0xFBB9, 0x978B}, //16791 #CJK UNIFIED IDEOGRAPH
+ {0xFBBA, 0x4E4E}, //16792 #CJK UNIFIED IDEOGRAPH
+ {0xFBBB, 0x4E92}, //16793 #CJK UNIFIED IDEOGRAPH
+ {0xFBBC, 0x547C}, //16794 #CJK UNIFIED IDEOGRAPH
+ {0xFBBD, 0x58D5}, //16795 #CJK UNIFIED IDEOGRAPH
+ {0xFBBE, 0x58FA}, //16796 #CJK UNIFIED IDEOGRAPH
+ {0xFBBF, 0x597D}, //16797 #CJK UNIFIED IDEOGRAPH
+ {0xFBC0, 0x5CB5}, //16798 #CJK UNIFIED IDEOGRAPH
+ {0xFBC1, 0x5F27}, //16799 #CJK UNIFIED IDEOGRAPH
+ {0xFBC2, 0x6236}, //16800 #CJK UNIFIED IDEOGRAPH
+ {0xFBC3, 0x6248}, //16801 #CJK UNIFIED IDEOGRAPH
+ {0xFBC4, 0x660A}, //16802 #CJK UNIFIED IDEOGRAPH
+ {0xFBC5, 0x6667}, //16803 #CJK UNIFIED IDEOGRAPH
+ {0xFBC6, 0x6BEB}, //16804 #CJK UNIFIED IDEOGRAPH
+ {0xFBC7, 0x6D69}, //16805 #CJK UNIFIED IDEOGRAPH
+ {0xFBC8, 0x6DCF}, //16806 #CJK UNIFIED IDEOGRAPH
+ {0xFBC9, 0x6E56}, //16807 #CJK UNIFIED IDEOGRAPH
+ {0xFBCA, 0x6EF8}, //16808 #CJK UNIFIED IDEOGRAPH
+ {0xFBCB, 0x6F94}, //16809 #CJK UNIFIED IDEOGRAPH
+ {0xFBCC, 0x6FE0}, //16810 #CJK UNIFIED IDEOGRAPH
+ {0xFBCD, 0x6FE9}, //16811 #CJK UNIFIED IDEOGRAPH
+ {0xFBCE, 0x705D}, //16812 #CJK UNIFIED IDEOGRAPH
+ {0xFBCF, 0x72D0}, //16813 #CJK UNIFIED IDEOGRAPH
+ {0xFBD0, 0x7425}, //16814 #CJK UNIFIED IDEOGRAPH
+ {0xFBD1, 0x745A}, //16815 #CJK UNIFIED IDEOGRAPH
+ {0xFBD2, 0x74E0}, //16816 #CJK UNIFIED IDEOGRAPH
+ {0xFBD3, 0x7693}, //16817 #CJK UNIFIED IDEOGRAPH
+ {0xFBD4, 0x795C}, //16818 #CJK UNIFIED IDEOGRAPH
+ {0xFBD5, 0x7CCA}, //16819 #CJK UNIFIED IDEOGRAPH
+ {0xFBD6, 0x7E1E}, //16820 #CJK UNIFIED IDEOGRAPH
+ {0xFBD7, 0x80E1}, //16821 #CJK UNIFIED IDEOGRAPH
+ {0xFBD8, 0x82A6}, //16822 #CJK UNIFIED IDEOGRAPH
+ {0xFBD9, 0x846B}, //16823 #CJK UNIFIED IDEOGRAPH
+ {0xFBDA, 0x84BF}, //16824 #CJK UNIFIED IDEOGRAPH
+ {0xFBDB, 0x864E}, //16825 #CJK UNIFIED IDEOGRAPH
+ {0xFBDC, 0x865F}, //16826 #CJK UNIFIED IDEOGRAPH
+ {0xFBDD, 0x8774}, //16827 #CJK UNIFIED IDEOGRAPH
+ {0xFBDE, 0x8B77}, //16828 #CJK UNIFIED IDEOGRAPH
+ {0xFBDF, 0x8C6A}, //16829 #CJK UNIFIED IDEOGRAPH
+ {0xFBE0, 0x93AC}, //16830 #CJK UNIFIED IDEOGRAPH
+ {0xFBE1, 0x9800}, //16831 #CJK UNIFIED IDEOGRAPH
+ {0xFBE2, 0x9865}, //16832 #CJK UNIFIED IDEOGRAPH
+ {0xFBE3, 0x60D1}, //16833 #CJK UNIFIED IDEOGRAPH
+ {0xFBE4, 0x6216}, //16834 #CJK UNIFIED IDEOGRAPH
+ {0xFBE5, 0x9177}, //16835 #CJK UNIFIED IDEOGRAPH
+ {0xFBE6, 0x5A5A}, //16836 #CJK UNIFIED IDEOGRAPH
+ {0xFBE7, 0x660F}, //16837 #CJK UNIFIED IDEOGRAPH
+ {0xFBE8, 0x6DF7}, //16838 #CJK UNIFIED IDEOGRAPH
+ {0xFBE9, 0x6E3E}, //16839 #CJK UNIFIED IDEOGRAPH
+ {0xFBEA, 0x743F}, //16840 #CJK UNIFIED IDEOGRAPH
+ {0xFBEB, 0x9B42}, //16841 #CJK UNIFIED IDEOGRAPH
+ {0xFBEC, 0x5FFD}, //16842 #CJK UNIFIED IDEOGRAPH
+ {0xFBED, 0x60DA}, //16843 #CJK UNIFIED IDEOGRAPH
+ {0xFBEE, 0x7B0F}, //16844 #CJK UNIFIED IDEOGRAPH
+ {0xFBEF, 0x54C4}, //16845 #CJK UNIFIED IDEOGRAPH
+ {0xFBF0, 0x5F18}, //16846 #CJK UNIFIED IDEOGRAPH
+ {0xFBF1, 0x6C5E}, //16847 #CJK UNIFIED IDEOGRAPH
+ {0xFBF2, 0x6CD3}, //16848 #CJK UNIFIED IDEOGRAPH
+ {0xFBF3, 0x6D2A}, //16849 #CJK UNIFIED IDEOGRAPH
+ {0xFBF4, 0x70D8}, //16850 #CJK UNIFIED IDEOGRAPH
+ {0xFBF5, 0x7D05}, //16851 #CJK UNIFIED IDEOGRAPH
+ {0xFBF6, 0x8679}, //16852 #CJK UNIFIED IDEOGRAPH
+ {0xFBF7, 0x8A0C}, //16853 #CJK UNIFIED IDEOGRAPH
+ {0xFBF8, 0x9D3B}, //16854 #CJK UNIFIED IDEOGRAPH
+ {0xFBF9, 0x5316}, //16855 #CJK UNIFIED IDEOGRAPH
+ {0xFBFA, 0x548C}, //16856 #CJK UNIFIED IDEOGRAPH
+ {0xFBFB, 0x5B05}, //16857 #CJK UNIFIED IDEOGRAPH
+ {0xFBFC, 0x6A3A}, //16858 #CJK UNIFIED IDEOGRAPH
+ {0xFBFD, 0x706B}, //16859 #CJK UNIFIED IDEOGRAPH
+ {0xFBFE, 0x7575}, //16860 #CJK UNIFIED IDEOGRAPH
+ {0xFCA1, 0x798D}, //16861 #CJK UNIFIED IDEOGRAPH
+ {0xFCA2, 0x79BE}, //16862 #CJK UNIFIED IDEOGRAPH
+ {0xFCA3, 0x82B1}, //16863 #CJK UNIFIED IDEOGRAPH
+ {0xFCA4, 0x83EF}, //16864 #CJK UNIFIED IDEOGRAPH
+ {0xFCA5, 0x8A71}, //16865 #CJK UNIFIED IDEOGRAPH
+ {0xFCA6, 0x8B41}, //16866 #CJK UNIFIED IDEOGRAPH
+ {0xFCA7, 0x8CA8}, //16867 #CJK UNIFIED IDEOGRAPH
+ {0xFCA8, 0x9774}, //16868 #CJK UNIFIED IDEOGRAPH
+ {0xFCA9, 0xFA0B}, //16869 #CJK COMPATIBILITY IDEOGRAPH
+ {0xFCAA, 0x64F4}, //16870 #CJK UNIFIED IDEOGRAPH
+ {0xFCAB, 0x652B}, //16871 #CJK UNIFIED IDEOGRAPH
+ {0xFCAC, 0x78BA}, //16872 #CJK UNIFIED IDEOGRAPH
+ {0xFCAD, 0x78BB}, //16873 #CJK UNIFIED IDEOGRAPH
+ {0xFCAE, 0x7A6B}, //16874 #CJK UNIFIED IDEOGRAPH
+ {0xFCAF, 0x4E38}, //16875 #CJK UNIFIED IDEOGRAPH
+ {0xFCB0, 0x559A}, //16876 #CJK UNIFIED IDEOGRAPH
+ {0xFCB1, 0x5950}, //16877 #CJK UNIFIED IDEOGRAPH
+ {0xFCB2, 0x5BA6}, //16878 #CJK UNIFIED IDEOGRAPH
+ {0xFCB3, 0x5E7B}, //16879 #CJK UNIFIED IDEOGRAPH
+ {0xFCB4, 0x60A3}, //16880 #CJK UNIFIED IDEOGRAPH
+ {0xFCB5, 0x63DB}, //16881 #CJK UNIFIED IDEOGRAPH
+ {0xFCB6, 0x6B61}, //16882 #CJK UNIFIED IDEOGRAPH
+ {0xFCB7, 0x6665}, //16883 #CJK UNIFIED IDEOGRAPH
+ {0xFCB8, 0x6853}, //16884 #CJK UNIFIED IDEOGRAPH
+ {0xFCB9, 0x6E19}, //16885 #CJK UNIFIED IDEOGRAPH
+ {0xFCBA, 0x7165}, //16886 #CJK UNIFIED IDEOGRAPH
+ {0xFCBB, 0x74B0}, //16887 #CJK UNIFIED IDEOGRAPH
+ {0xFCBC, 0x7D08}, //16888 #CJK UNIFIED IDEOGRAPH
+ {0xFCBD, 0x9084}, //16889 #CJK UNIFIED IDEOGRAPH
+ {0xFCBE, 0x9A69}, //16890 #CJK UNIFIED IDEOGRAPH
+ {0xFCBF, 0x9C25}, //16891 #CJK UNIFIED IDEOGRAPH
+ {0xFCC0, 0x6D3B}, //16892 #CJK UNIFIED IDEOGRAPH
+ {0xFCC1, 0x6ED1}, //16893 #CJK UNIFIED IDEOGRAPH
+ {0xFCC2, 0x733E}, //16894 #CJK UNIFIED IDEOGRAPH
+ {0xFCC3, 0x8C41}, //16895 #CJK UNIFIED IDEOGRAPH
+ {0xFCC4, 0x95CA}, //16896 #CJK UNIFIED IDEOGRAPH
+ {0xFCC5, 0x51F0}, //16897 #CJK UNIFIED IDEOGRAPH
+ {0xFCC6, 0x5E4C}, //16898 #CJK UNIFIED IDEOGRAPH
+ {0xFCC7, 0x5FA8}, //16899 #CJK UNIFIED IDEOGRAPH
+ {0xFCC8, 0x604D}, //16900 #CJK UNIFIED IDEOGRAPH
+ {0xFCC9, 0x60F6}, //16901 #CJK UNIFIED IDEOGRAPH
+ {0xFCCA, 0x6130}, //16902 #CJK UNIFIED IDEOGRAPH
+ {0xFCCB, 0x614C}, //16903 #CJK UNIFIED IDEOGRAPH
+ {0xFCCC, 0x6643}, //16904 #CJK UNIFIED IDEOGRAPH
+ {0xFCCD, 0x6644}, //16905 #CJK UNIFIED IDEOGRAPH
+ {0xFCCE, 0x69A5}, //16906 #CJK UNIFIED IDEOGRAPH
+ {0xFCCF, 0x6CC1}, //16907 #CJK UNIFIED IDEOGRAPH
+ {0xFCD0, 0x6E5F}, //16908 #CJK UNIFIED IDEOGRAPH
+ {0xFCD1, 0x6EC9}, //16909 #CJK UNIFIED IDEOGRAPH
+ {0xFCD2, 0x6F62}, //16910 #CJK UNIFIED IDEOGRAPH
+ {0xFCD3, 0x714C}, //16911 #CJK UNIFIED IDEOGRAPH
+ {0xFCD4, 0x749C}, //16912 #CJK UNIFIED IDEOGRAPH
+ {0xFCD5, 0x7687}, //16913 #CJK UNIFIED IDEOGRAPH
+ {0xFCD6, 0x7BC1}, //16914 #CJK UNIFIED IDEOGRAPH
+ {0xFCD7, 0x7C27}, //16915 #CJK UNIFIED IDEOGRAPH
+ {0xFCD8, 0x8352}, //16916 #CJK UNIFIED IDEOGRAPH
+ {0xFCD9, 0x8757}, //16917 #CJK UNIFIED IDEOGRAPH
+ {0xFCDA, 0x9051}, //16918 #CJK UNIFIED IDEOGRAPH
+ {0xFCDB, 0x968D}, //16919 #CJK UNIFIED IDEOGRAPH
+ {0xFCDC, 0x9EC3}, //16920 #CJK UNIFIED IDEOGRAPH
+ {0xFCDD, 0x532F}, //16921 #CJK UNIFIED IDEOGRAPH
+ {0xFCDE, 0x56DE}, //16922 #CJK UNIFIED IDEOGRAPH
+ {0xFCDF, 0x5EFB}, //16923 #CJK UNIFIED IDEOGRAPH
+ {0xFCE0, 0x5F8A}, //16924 #CJK UNIFIED IDEOGRAPH
+ {0xFCE1, 0x6062}, //16925 #CJK UNIFIED IDEOGRAPH
+ {0xFCE2, 0x6094}, //16926 #CJK UNIFIED IDEOGRAPH
+ {0xFCE3, 0x61F7}, //16927 #CJK UNIFIED IDEOGRAPH
+ {0xFCE4, 0x6666}, //16928 #CJK UNIFIED IDEOGRAPH
+ {0xFCE5, 0x6703}, //16929 #CJK UNIFIED IDEOGRAPH
+ {0xFCE6, 0x6A9C}, //16930 #CJK UNIFIED IDEOGRAPH
+ {0xFCE7, 0x6DEE}, //16931 #CJK UNIFIED IDEOGRAPH
+ {0xFCE8, 0x6FAE}, //16932 #CJK UNIFIED IDEOGRAPH
+ {0xFCE9, 0x7070}, //16933 #CJK UNIFIED IDEOGRAPH
+ {0xFCEA, 0x736A}, //16934 #CJK UNIFIED IDEOGRAPH
+ {0xFCEB, 0x7E6A}, //16935 #CJK UNIFIED IDEOGRAPH
+ {0xFCEC, 0x81BE}, //16936 #CJK UNIFIED IDEOGRAPH
+ {0xFCED, 0x8334}, //16937 #CJK UNIFIED IDEOGRAPH
+ {0xFCEE, 0x86D4}, //16938 #CJK UNIFIED IDEOGRAPH
+ {0xFCEF, 0x8AA8}, //16939 #CJK UNIFIED IDEOGRAPH
+ {0xFCF0, 0x8CC4}, //16940 #CJK UNIFIED IDEOGRAPH
+ {0xFCF1, 0x5283}, //16941 #CJK UNIFIED IDEOGRAPH
+ {0xFCF2, 0x7372}, //16942 #CJK UNIFIED IDEOGRAPH
+ {0xFCF3, 0x5B96}, //16943 #CJK UNIFIED IDEOGRAPH
+ {0xFCF4, 0x6A6B}, //16944 #CJK UNIFIED IDEOGRAPH
+ {0xFCF5, 0x9404}, //16945 #CJK UNIFIED IDEOGRAPH
+ {0xFCF6, 0x54EE}, //16946 #CJK UNIFIED IDEOGRAPH
+ {0xFCF7, 0x5686}, //16947 #CJK UNIFIED IDEOGRAPH
+ {0xFCF8, 0x5B5D}, //16948 #CJK UNIFIED IDEOGRAPH
+ {0xFCF9, 0x6548}, //16949 #CJK UNIFIED IDEOGRAPH
+ {0xFCFA, 0x6585}, //16950 #CJK UNIFIED IDEOGRAPH
+ {0xFCFB, 0x66C9}, //16951 #CJK UNIFIED IDEOGRAPH
+ {0xFCFC, 0x689F}, //16952 #CJK UNIFIED IDEOGRAPH
+ {0xFCFD, 0x6D8D}, //16953 #CJK UNIFIED IDEOGRAPH
+ {0xFCFE, 0x6DC6}, //16954 #CJK UNIFIED IDEOGRAPH
+ {0xFDA1, 0x723B}, //16955 #CJK UNIFIED IDEOGRAPH
+ {0xFDA2, 0x80B4}, //16956 #CJK UNIFIED IDEOGRAPH
+ {0xFDA3, 0x9175}, //16957 #CJK UNIFIED IDEOGRAPH
+ {0xFDA4, 0x9A4D}, //16958 #CJK UNIFIED IDEOGRAPH
+ {0xFDA5, 0x4FAF}, //16959 #CJK UNIFIED IDEOGRAPH
+ {0xFDA6, 0x5019}, //16960 #CJK UNIFIED IDEOGRAPH
+ {0xFDA7, 0x539A}, //16961 #CJK UNIFIED IDEOGRAPH
+ {0xFDA8, 0x540E}, //16962 #CJK UNIFIED IDEOGRAPH
+ {0xFDA9, 0x543C}, //16963 #CJK UNIFIED IDEOGRAPH
+ {0xFDAA, 0x5589}, //16964 #CJK UNIFIED IDEOGRAPH
+ {0xFDAB, 0x55C5}, //16965 #CJK UNIFIED IDEOGRAPH
+ {0xFDAC, 0x5E3F}, //16966 #CJK UNIFIED IDEOGRAPH
+ {0xFDAD, 0x5F8C}, //16967 #CJK UNIFIED IDEOGRAPH
+ {0xFDAE, 0x673D}, //16968 #CJK UNIFIED IDEOGRAPH
+ {0xFDAF, 0x7166}, //16969 #CJK UNIFIED IDEOGRAPH
+ {0xFDB0, 0x73DD}, //16970 #CJK UNIFIED IDEOGRAPH
+ {0xFDB1, 0x9005}, //16971 #CJK UNIFIED IDEOGRAPH
+ {0xFDB2, 0x52DB}, //16972 #CJK UNIFIED IDEOGRAPH
+ {0xFDB3, 0x52F3}, //16973 #CJK UNIFIED IDEOGRAPH
+ {0xFDB4, 0x5864}, //16974 #CJK UNIFIED IDEOGRAPH
+ {0xFDB5, 0x58CE}, //16975 #CJK UNIFIED IDEOGRAPH
+ {0xFDB6, 0x7104}, //16976 #CJK UNIFIED IDEOGRAPH
+ {0xFDB7, 0x718F}, //16977 #CJK UNIFIED IDEOGRAPH
+ {0xFDB8, 0x71FB}, //16978 #CJK UNIFIED IDEOGRAPH
+ {0xFDB9, 0x85B0}, //16979 #CJK UNIFIED IDEOGRAPH
+ {0xFDBA, 0x8A13}, //16980 #CJK UNIFIED IDEOGRAPH
+ {0xFDBB, 0x6688}, //16981 #CJK UNIFIED IDEOGRAPH
+ {0xFDBC, 0x85A8}, //16982 #CJK UNIFIED IDEOGRAPH
+ {0xFDBD, 0x55A7}, //16983 #CJK UNIFIED IDEOGRAPH
+ {0xFDBE, 0x6684}, //16984 #CJK UNIFIED IDEOGRAPH
+ {0xFDBF, 0x714A}, //16985 #CJK UNIFIED IDEOGRAPH
+ {0xFDC0, 0x8431}, //16986 #CJK UNIFIED IDEOGRAPH
+ {0xFDC1, 0x5349}, //16987 #CJK UNIFIED IDEOGRAPH
+ {0xFDC2, 0x5599}, //16988 #CJK UNIFIED IDEOGRAPH
+ {0xFDC3, 0x6BC1}, //16989 #CJK UNIFIED IDEOGRAPH
+ {0xFDC4, 0x5F59}, //16990 #CJK UNIFIED IDEOGRAPH
+ {0xFDC5, 0x5FBD}, //16991 #CJK UNIFIED IDEOGRAPH
+ {0xFDC6, 0x63EE}, //16992 #CJK UNIFIED IDEOGRAPH
+ {0xFDC7, 0x6689}, //16993 #CJK UNIFIED IDEOGRAPH
+ {0xFDC8, 0x7147}, //16994 #CJK UNIFIED IDEOGRAPH
+ {0xFDC9, 0x8AF1}, //16995 #CJK UNIFIED IDEOGRAPH
+ {0xFDCA, 0x8F1D}, //16996 #CJK UNIFIED IDEOGRAPH
+ {0xFDCB, 0x9EBE}, //16997 #CJK UNIFIED IDEOGRAPH
+ {0xFDCC, 0x4F11}, //16998 #CJK UNIFIED IDEOGRAPH
+ {0xFDCD, 0x643A}, //16999 #CJK UNIFIED IDEOGRAPH
+ {0xFDCE, 0x70CB}, //17000 #CJK UNIFIED IDEOGRAPH
+ {0xFDCF, 0x7566}, //17001 #CJK UNIFIED IDEOGRAPH
+ {0xFDD0, 0x8667}, //17002 #CJK UNIFIED IDEOGRAPH
+ {0xFDD1, 0x6064}, //17003 #CJK UNIFIED IDEOGRAPH
+ {0xFDD2, 0x8B4E}, //17004 #CJK UNIFIED IDEOGRAPH
+ {0xFDD3, 0x9DF8}, //17005 #CJK UNIFIED IDEOGRAPH
+ {0xFDD4, 0x5147}, //17006 #CJK UNIFIED IDEOGRAPH
+ {0xFDD5, 0x51F6}, //17007 #CJK UNIFIED IDEOGRAPH
+ {0xFDD6, 0x5308}, //17008 #CJK UNIFIED IDEOGRAPH
+ {0xFDD7, 0x6D36}, //17009 #CJK UNIFIED IDEOGRAPH
+ {0xFDD8, 0x80F8}, //17010 #CJK UNIFIED IDEOGRAPH
+ {0xFDD9, 0x9ED1}, //17011 #CJK UNIFIED IDEOGRAPH
+ {0xFDDA, 0x6615}, //17012 #CJK UNIFIED IDEOGRAPH
+ {0xFDDB, 0x6B23}, //17013 #CJK UNIFIED IDEOGRAPH
+ {0xFDDC, 0x7098}, //17014 #CJK UNIFIED IDEOGRAPH
+ {0xFDDD, 0x75D5}, //17015 #CJK UNIFIED IDEOGRAPH
+ {0xFDDE, 0x5403}, //17016 #CJK UNIFIED IDEOGRAPH
+ {0xFDDF, 0x5C79}, //17017 #CJK UNIFIED IDEOGRAPH
+ {0xFDE0, 0x7D07}, //17018 #CJK UNIFIED IDEOGRAPH
+ {0xFDE1, 0x8A16}, //17019 #CJK UNIFIED IDEOGRAPH
+ {0xFDE2, 0x6B20}, //17020 #CJK UNIFIED IDEOGRAPH
+ {0xFDE3, 0x6B3D}, //17021 #CJK UNIFIED IDEOGRAPH
+ {0xFDE4, 0x6B46}, //17022 #CJK UNIFIED IDEOGRAPH
+ {0xFDE5, 0x5438}, //17023 #CJK UNIFIED IDEOGRAPH
+ {0xFDE6, 0x6070}, //17024 #CJK UNIFIED IDEOGRAPH
+ {0xFDE7, 0x6D3D}, //17025 #CJK UNIFIED IDEOGRAPH
+ {0xFDE8, 0x7FD5}, //17026 #CJK UNIFIED IDEOGRAPH
+ {0xFDE9, 0x8208}, //17027 #CJK UNIFIED IDEOGRAPH
+ {0xFDEA, 0x50D6}, //17028 #CJK UNIFIED IDEOGRAPH
+ {0xFDEB, 0x51DE}, //17029 #CJK UNIFIED IDEOGRAPH
+ {0xFDEC, 0x559C}, //17030 #CJK UNIFIED IDEOGRAPH
+ {0xFDED, 0x566B}, //17031 #CJK UNIFIED IDEOGRAPH
+ {0xFDEE, 0x56CD}, //17032 #CJK UNIFIED IDEOGRAPH
+ {0xFDEF, 0x59EC}, //17033 #CJK UNIFIED IDEOGRAPH
+ {0xFDF0, 0x5B09}, //17034 #CJK UNIFIED IDEOGRAPH
+ {0xFDF1, 0x5E0C}, //17035 #CJK UNIFIED IDEOGRAPH
+ {0xFDF2, 0x6199}, //17036 #CJK UNIFIED IDEOGRAPH
+ {0xFDF3, 0x6198}, //17037 #CJK UNIFIED IDEOGRAPH
+ {0xFDF4, 0x6231}, //17038 #CJK UNIFIED IDEOGRAPH
+ {0xFDF5, 0x665E}, //17039 #CJK UNIFIED IDEOGRAPH
+ {0xFDF6, 0x66E6}, //17040 #CJK UNIFIED IDEOGRAPH
+ {0xFDF7, 0x7199}, //17041 #CJK UNIFIED IDEOGRAPH
+ {0xFDF8, 0x71B9}, //17042 #CJK UNIFIED IDEOGRAPH
+ {0xFDF9, 0x71BA}, //17043 #CJK UNIFIED IDEOGRAPH
+ {0xFDFA, 0x72A7}, //17044 #CJK UNIFIED IDEOGRAPH
+ {0xFDFB, 0x79A7}, //17045 #CJK UNIFIED IDEOGRAPH
+ {0xFDFC, 0x7A00}, //17046 #CJK UNIFIED IDEOGRAPH
+ {0xFDFD, 0x7FB2}, //17047 #CJK UNIFIED IDEOGRAPH
+ {0xFDFE, 0x8A70}, //17048 #CJK UNIFIED IDEOGRAPH
+};
+
+#endif // DRW_CPTABLE949_H
--- /dev/null
+#ifndef DRW_CPTABLE950_H
+#define DRW_CPTABLE950_H
+
+//Chinese (Taiwan, Hong Kong SAR)
+
+//first entry in this table are 0x80
+#define CPOFFSET950 0x80
+#define CPLENGHT950 13503
+#define NOTFOUND950 0x003F
+
+//Table 950 one byte
+static const int DRW_Table950[1] = {
+};
+
+//Table 950 lead byte
+//pairs of start/end in DRW_DoubleTable950
+static const int DRW_LeadTable950[] = {
+ 0, //1#DBCS LEAD BYTE 0x81, empty
+ 0, //2#DBCS LEAD BYTE 0x82, empty
+ 0, //3#DBCS LEAD BYTE 0x83, empty
+ 0, //4#DBCS LEAD BYTE 0x84, empty
+ 0, //5#DBCS LEAD BYTE 0x85, empty
+ 0, //6#DBCS LEAD BYTE 0x86, empty
+ 0, //7#DBCS LEAD BYTE 0x87, empty
+ 0, //8#DBCS LEAD BYTE 0x88, empty
+ 0, //9#DBCS LEAD BYTE 0x89, empty
+ 0, //10#DBCS LEAD BYTE 0x8A, empty
+ 0, //11#DBCS LEAD BYTE 0x8B, empty
+ 0, //12#DBCS LEAD BYTE 0x8C, empty
+ 0, //13#DBCS LEAD BYTE 0x8D, empty
+ 0, //14#DBCS LEAD BYTE 0x8E, empty
+ 0, //15#DBCS LEAD BYTE 0x8F, empty
+ 0, //16#DBCS LEAD BYTE 0x90, empty
+ 0, //17#DBCS LEAD BYTE 0x91, empty
+ 0, //18#DBCS LEAD BYTE 0x92, empty
+ 0, //19#DBCS LEAD BYTE 0x93, empty
+ 0, //20#DBCS LEAD BYTE 0x94, empty
+ 0, //21#DBCS LEAD BYTE 0x95, empty
+ 0, //22#DBCS LEAD BYTE 0x96, empty
+ 0, //23#DBCS LEAD BYTE 0x97, empty
+ 0, //24#DBCS LEAD BYTE 0x98, empty
+ 0, //25#DBCS LEAD BYTE 0x99, empty
+ 0, //26#DBCS LEAD BYTE 0x9A, empty
+ 0, //27#DBCS LEAD BYTE 0x9B, empty
+ 0, //28#DBCS LEAD BYTE 0x9C, empty
+ 0, //29#DBCS LEAD BYTE 0x9D, empty
+ 0, //30#DBCS LEAD BYTE 0x9E, empty
+ 0, //31#DBCS LEAD BYTE 0x9F, empty
+ 0, //32#DBCS LEAD BYTE 0xA0, empty
+ 0, //33#DBCS LEAD BYTE 0xA1
+ 157, //34#DBCS LEAD BYTE 0xA2
+ 314, //35#DBCS LEAD BYTE 0xA3
+ 409, //36#DBCS LEAD BYTE 0xA4
+ 566, //37#DBCS LEAD BYTE 0xA5
+ 723, //38#DBCS LEAD BYTE 0xA6
+ 880, //39#DBCS LEAD BYTE 0xA7
+ 1037, //40#DBCS LEAD BYTE 0xA8
+ 1194, //41#DBCS LEAD BYTE 0xA9
+ 1351, //42#DBCS LEAD BYTE 0xAA
+ 1508, //43#DBCS LEAD BYTE 0xAB
+ 1665, //44#DBCS LEAD BYTE 0xAC
+ 1822, //45#DBCS LEAD BYTE 0xAD
+ 1979, //46#DBCS LEAD BYTE 0xAE
+ 2136, //47#DBCS LEAD BYTE 0xAF
+ 2293, //48#DBCS LEAD BYTE 0xB0
+ 2450, //49#DBCS LEAD BYTE 0xB1
+ 2607, //50#DBCS LEAD BYTE 0xB2
+ 2764, //51#DBCS LEAD BYTE 0xB3
+ 2921, //52#DBCS LEAD BYTE 0xB4
+ 3078, //53#DBCS LEAD BYTE 0xB5
+ 3235, //54#DBCS LEAD BYTE 0xB6
+ 3392, //55#DBCS LEAD BYTE 0xB7
+ 3549, //56#DBCS LEAD BYTE 0xB8
+ 3706, //57#DBCS LEAD BYTE 0xB9
+ 3863, //58#DBCS LEAD BYTE 0xBA
+ 4020, //59#DBCS LEAD BYTE 0xBB
+ 4177, //60#DBCS LEAD BYTE 0xBC
+ 4334, //61#DBCS LEAD BYTE 0xBD
+ 4491, //62#DBCS LEAD BYTE 0xBE
+ 4648, //63#DBCS LEAD BYTE 0xBF
+ 4805, //64#DBCS LEAD BYTE 0xC0
+ 4962, //65#DBCS LEAD BYTE 0xC1
+ 5119, //66#DBCS LEAD BYTE 0xC2
+ 5276, //67#DBCS LEAD BYTE 0xC3
+ 5443, //68#DBCS LEAD BYTE 0xC4
+ 5590, //69#DBCS LEAD BYTE 0xC5
+ 5747, //70#DBCS LEAD BYTE 0xC6
+ 5810, //71#DBCS LEAD BYTE 0xC7, empty
+ 5810, //72#DBCS LEAD BYTE 0xC8, empty
+ 5810, //73#DBCS LEAD BYTE 0xC9
+ 5967, //74#DBCS LEAD BYTE 0xCA
+ 6124, //75#DBCS LEAD BYTE 0xCB
+ 6281, //76#DBCS LEAD BYTE 0xCC
+ 6438, //77#DBCS LEAD BYTE 0xCD
+ 6595, //78#DBCS LEAD BYTE 0xCE
+ 6752, //79#DBCS LEAD BYTE 0xCF
+ 6909, //80#DBCS LEAD BYTE 0xD0
+ 7066, //81#DBCS LEAD BYTE 0xD1
+ 7223, //82#DBCS LEAD BYTE 0xD2
+ 7380, //83#DBCS LEAD BYTE 0xD3
+ 7537, //84#DBCS LEAD BYTE 0xD4
+ 7694, //85#DBCS LEAD BYTE 0xD5
+ 7851, //86#DBCS LEAD BYTE 0xD6
+ 8008, //87#DBCS LEAD BYTE 0xD7
+ 8165, //88#DBCS LEAD BYTE 0xD8
+ 8322, //89#DBCS LEAD BYTE 0xD9
+ 8479, //90#DBCS LEAD BYTE 0xDA
+ 8636, //91#DBCS LEAD BYTE 0xDB
+ 8793, //92#DBCS LEAD BYTE 0xDC
+ 8950, //93#DBCS LEAD BYTE 0xDD
+ 9107, //94#DBCS LEAD BYTE 0xDE
+ 9264, //95#DBCS LEAD BYTE 0xDF
+ 9421, //96#DBCS LEAD BYTE 0xE0
+ 9578, //97#DBCS LEAD BYTE 0xE1
+ 9735, //98#DBCS LEAD BYTE 0xE2
+ 9892, //99#DBCS LEAD BYTE 0xE3
+ 10049, //100#DBCS LEAD BYTE 0xE4
+ 10206, //101#DBCS LEAD BYTE 0xE5
+ 10363, //102#DBCS LEAD BYTE 0xE6
+ 10520, //103#DBCS LEAD BYTE 0xE7
+ 10677, //104#DBCS LEAD BYTE 0xE8
+ 10834, //105#DBCS LEAD BYTE 0xE9
+ 10991, //106#DBCS LEAD BYTE 0xEA
+ 11148, //107#DBCS LEAD BYTE 0xEB
+ 11305, //108#DBCS LEAD BYTE 0xEC
+ 11462, //109#DBCS LEAD BYTE 0xED
+ 11619, //110#DBCS LEAD BYTE 0xEE
+ 11776, //111#DBCS LEAD BYTE 0xEF
+ 11933, //112#DBCS LEAD BYTE 0xF0
+ 12090, //113#DBCS LEAD BYTE 0xF1
+ 12247, //114#DBCS LEAD BYTE 0xF2
+ 12404, //115#DBCS LEAD BYTE 0xF3
+ 12561, //116#DBCS LEAD BYTE 0xF4
+ 12718, //117#DBCS LEAD BYTE 0xF5
+ 12875, //118#DBCS LEAD BYTE 0xF6
+ 13032, //119#DBCS LEAD BYTE 0xF7
+ 13189, //120#DBCS LEAD BYTE 0xF8
+ 13346, //121#DBCS LEAD BYTE 0xF9
+ 13502, //122#DBCS LEAD BYTE 0xFA, empty
+ 13502, //123#DBCS LEAD BYTE 0xFB, empty
+ 13502, //124#DBCS LEAD BYTE 0xFC, empty
+ 13502, //125#DBCS LEAD BYTE 0xFD, empty
+ 13502, //126#DBCS LEAD BYTE 0xFE, empty
+ 13502, //127#UNDEFINED 0xFF, END OF TABLE
+};
+
+//Table 950 tail byte
+static const int DRW_DoubleTable950[][2] = {
+ {0xA140, 0x3000}, //1 #IDEOGRAPHIC SPACE
+ {0xA141, 0xFF0C}, //2 #FULLWIDTH COMMA
+ {0xA142, 0x3001}, //3 #IDEOGRAPHIC COMMA
+ {0xA143, 0x3002}, //4 #IDEOGRAPHIC FULL STOP
+ {0xA144, 0xFF0E}, //5 #FULLWIDTH FULL STOP
+ {0xA145, 0x2027}, //6 #HYPHENATION POINT
+ {0xA146, 0xFF1B}, //7 #FULLWIDTH SEMICOLON
+ {0xA147, 0xFF1A}, //8 #FULLWIDTH COLON
+ {0xA148, 0xFF1F}, //9 #FULLWIDTH QUESTION MARK
+ {0xA149, 0xFF01}, //10 #FULLWIDTH EXCLAMATION MARK
+ {0xA14A, 0xFE30}, //11 #PRESENTATION FORM FOR VERTICAL TWO DOT LEADER
+ {0xA14B, 0x2026}, //12 #HORIZONTAL ELLIPSIS
+ {0xA14C, 0x2025}, //13 #TWO DOT LEADER
+ {0xA14D, 0xFE50}, //14 #SMALL COMMA
+ {0xA14E, 0xFE51}, //15 #SMALL IDEOGRAPHIC COMMA
+ {0xA14F, 0xFE52}, //16 #SMALL FULL STOP
+ {0xA150, 0x00B7}, //17 #MIDDLE DOT
+ {0xA151, 0xFE54}, //18 #SMALL SEMICOLON
+ {0xA152, 0xFE55}, //19 #SMALL COLON
+ {0xA153, 0xFE56}, //20 #SMALL QUESTION MARK
+ {0xA154, 0xFE57}, //21 #SMALL EXCLAMATION MARK
+ {0xA155, 0xFF5C}, //22 #FULLWIDTH VERTICAL LINE
+ {0xA156, 0x2013}, //23 #EN DASH
+ {0xA157, 0xFE31}, //24 #PRESENTATION FORM FOR VERTICAL EM DASH
+ {0xA158, 0x2014}, //25 #EM DASH
+ {0xA159, 0xFE33}, //26 #PRESENTATION FORM FOR VERTICAL LOW LINE
+ {0xA15A, 0x2574}, //27 #BOX DRAWINGS LIGHT LEFT
+ {0xA15B, 0xFE34}, //28 #PRESENTATION FORM FOR VERTICAL WAVY LOW LINE
+ {0xA15C, 0xFE4F}, //29 #WAVY LOW LINE
+ {0xA15D, 0xFF08}, //30 #FULLWIDTH LEFT PARENTHESIS
+ {0xA15E, 0xFF09}, //31 #FULLWIDTH RIGHT PARENTHESIS
+ {0xA15F, 0xFE35}, //32 #PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS
+ {0xA160, 0xFE36}, //33 #PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS
+ {0xA161, 0xFF5B}, //34 #FULLWIDTH LEFT CURLY BRACKET
+ {0xA162, 0xFF5D}, //35 #FULLWIDTH RIGHT CURLY BRACKET
+ {0xA163, 0xFE37}, //36 #PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET
+ {0xA164, 0xFE38}, //37 #PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET
+ {0xA165, 0x3014}, //38 #LEFT TORTOISE SHELL BRACKET
+ {0xA166, 0x3015}, //39 #RIGHT TORTOISE SHELL BRACKET
+ {0xA167, 0xFE39}, //40 #PRESENTATION FORM FOR VERTICAL LEFT TORTOISE SHELL BRACKET
+ {0xA168, 0xFE3A}, //41 #PRESENTATION FORM FOR VERTICAL RIGHT TORTOISE SHELL BRACKET
+ {0xA169, 0x3010}, //42 #LEFT BLACK LENTICULAR BRACKET
+ {0xA16A, 0x3011}, //43 #RIGHT BLACK LENTICULAR BRACKET
+ {0xA16B, 0xFE3B}, //44 #PRESENTATION FORM FOR VERTICAL LEFT BLACK LENTICULAR BRACKET
+ {0xA16C, 0xFE3C}, //45 #PRESENTATION FORM FOR VERTICAL RIGHT BLACK LENTICULAR BRACKET
+ {0xA16D, 0x300A}, //46 #LEFT DOUBLE ANGLE BRACKET
+ {0xA16E, 0x300B}, //47 #RIGHT DOUBLE ANGLE BRACKET
+ {0xA16F, 0xFE3D}, //48 #PRESENTATION FORM FOR VERTICAL LEFT DOUBLE ANGLE BRACKET
+ {0xA170, 0xFE3E}, //49 #PRESENTATION FORM FOR VERTICAL RIGHT DOUBLE ANGLE BRACKET
+ {0xA171, 0x3008}, //50 #LEFT ANGLE BRACKET
+ {0xA172, 0x3009}, //51 #RIGHT ANGLE BRACKET
+ {0xA173, 0xFE3F}, //52 #PRESENTATION FORM FOR VERTICAL LEFT ANGLE BRACKET
+ {0xA174, 0xFE40}, //53 #PRESENTATION FORM FOR VERTICAL RIGHT ANGLE BRACKET
+ {0xA175, 0x300C}, //54 #LEFT CORNER BRACKET
+ {0xA176, 0x300D}, //55 #RIGHT CORNER BRACKET
+ {0xA177, 0xFE41}, //56 #PRESENTATION FORM FOR VERTICAL LEFT CORNER BRACKET
+ {0xA178, 0xFE42}, //57 #PRESENTATION FORM FOR VERTICAL RIGHT CORNER BRACKET
+ {0xA179, 0x300E}, //58 #LEFT WHITE CORNER BRACKET
+ {0xA17A, 0x300F}, //59 #RIGHT WHITE CORNER BRACKET
+ {0xA17B, 0xFE43}, //60 #PRESENTATION FORM FOR VERTICAL LEFT WHITE CORNER BRACKET
+ {0xA17C, 0xFE44}, //61 #PRESENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKET
+ {0xA17D, 0xFE59}, //62 #SMALL LEFT PARENTHESIS
+ {0xA17E, 0xFE5A}, //63 #SMALL RIGHT PARENTHESIS
+ {0xA1A1, 0xFE5B}, //64 #SMALL LEFT CURLY BRACKET
+ {0xA1A2, 0xFE5C}, //65 #SMALL RIGHT CURLY BRACKET
+ {0xA1A3, 0xFE5D}, //66 #SMALL LEFT TORTOISE SHELL BRACKET
+ {0xA1A4, 0xFE5E}, //67 #SMALL RIGHT TORTOISE SHELL BRACKET
+ {0xA1A5, 0x2018}, //68 #LEFT SINGLE QUOTATION MARK
+ {0xA1A6, 0x2019}, //69 #RIGHT SINGLE QUOTATION MARK
+ {0xA1A7, 0x201C}, //70 #LEFT DOUBLE QUOTATION MARK
+ {0xA1A8, 0x201D}, //71 #RIGHT DOUBLE QUOTATION MARK
+ {0xA1A9, 0x301D}, //72 #REVERSED DOUBLE PRIME QUOTATION MARK
+ {0xA1AA, 0x301E}, //73 #DOUBLE PRIME QUOTATION MARK
+ {0xA1AB, 0x2035}, //74 #REVERSED PRIME
+ {0xA1AC, 0x2032}, //75 #PRIME
+ {0xA1AD, 0xFF03}, //76 #FULLWIDTH NUMBER SIGN
+ {0xA1AE, 0xFF06}, //77 #FULLWIDTH AMPERSAND
+ {0xA1AF, 0xFF0A}, //78 #FULLWIDTH ASTERISK
+ {0xA1B0, 0x203B}, //79 #REFERENCE MARK
+ {0xA1B1, 0x00A7}, //80 #SECTION SIGN
+ {0xA1B2, 0x3003}, //81 #DITTO MARK
+ {0xA1B3, 0x25CB}, //82 #WHITE CIRCLE
+ {0xA1B4, 0x25CF}, //83 #BLACK CIRCLE
+ {0xA1B5, 0x25B3}, //84 #WHITE UP-POINTING TRIANGLE
+ {0xA1B6, 0x25B2}, //85 #BLACK UP-POINTING TRIANGLE
+ {0xA1B7, 0x25CE}, //86 #BULLSEYE
+ {0xA1B8, 0x2606}, //87 #WHITE STAR
+ {0xA1B9, 0x2605}, //88 #BLACK STAR
+ {0xA1BA, 0x25C7}, //89 #WHITE DIAMOND
+ {0xA1BB, 0x25C6}, //90 #BLACK DIAMOND
+ {0xA1BC, 0x25A1}, //91 #WHITE SQUARE
+ {0xA1BD, 0x25A0}, //92 #BLACK SQUARE
+ {0xA1BE, 0x25BD}, //93 #WHITE DOWN-POINTING TRIANGLE
+ {0xA1BF, 0x25BC}, //94 #BLACK DOWN-POINTING TRIANGLE
+ {0xA1C0, 0x32A3}, //95 #CIRCLED IDEOGRAPH CORRECT
+ {0xA1C1, 0x2105}, //96 #CARE OF
+ {0xA1C2, 0x00AF}, //97 #MACRON
+ {0xA1C3, 0xFFE3}, //98 #FULLWIDTH MACRON
+ {0xA1C4, 0xFF3F}, //99 #FULLWIDTH LOW LINE
+ {0xA1C5, 0x02CD}, //100 #MODIFIER LETTER LOW MACRON
+ {0xA1C6, 0xFE49}, //101 #DASHED OVERLINE
+ {0xA1C7, 0xFE4A}, //102 #CENTRELINE OVERLINE
+ {0xA1C8, 0xFE4D}, //103 #DASHED LOW LINE
+ {0xA1C9, 0xFE4E}, //104 #CENTRELINE LOW LINE
+ {0xA1CA, 0xFE4B}, //105 #WAVY OVERLINE
+ {0xA1CB, 0xFE4C}, //106 #DOUBLE WAVY OVERLINE
+ {0xA1CC, 0xFE5F}, //107 #SMALL NUMBER SIGN
+ {0xA1CD, 0xFE60}, //108 #SMALL AMPERSAND
+ {0xA1CE, 0xFE61}, //109 #SMALL ASTERISK
+ {0xA1CF, 0xFF0B}, //110 #FULLWIDTH PLUS SIGN
+ {0xA1D0, 0xFF0D}, //111 #FULLWIDTH HYPHEN-MINUS
+ {0xA1D1, 0x00D7}, //112 #MULTIPLICATION SIGN
+ {0xA1D2, 0x00F7}, //113 #DIVISION SIGN
+ {0xA1D3, 0x00B1}, //114 #PLUS-MINUS SIGN
+ {0xA1D4, 0x221A}, //115 #SQUARE ROOT
+ {0xA1D5, 0xFF1C}, //116 #FULLWIDTH LESS-THAN SIGN
+ {0xA1D6, 0xFF1E}, //117 #FULLWIDTH GREATER-THAN SIGN
+ {0xA1D7, 0xFF1D}, //118 #FULLWIDTH EQUALS SIGN
+ {0xA1D8, 0x2266}, //119 #LESS-THAN OVER EQUAL TO
+ {0xA1D9, 0x2267}, //120 #GREATER-THAN OVER EQUAL TO
+ {0xA1DA, 0x2260}, //121 #NOT EQUAL TO
+ {0xA1DB, 0x221E}, //122 #INFINITY
+ {0xA1DC, 0x2252}, //123 #APPROXIMATELY EQUAL TO OR THE IMAGE OF
+ {0xA1DD, 0x2261}, //124 #IDENTICAL TO
+ {0xA1DE, 0xFE62}, //125 #SMALL PLUS SIGN
+ {0xA1DF, 0xFE63}, //126 #SMALL HYPHEN-MINUS
+ {0xA1E0, 0xFE64}, //127 #SMALL LESS-THAN SIGN
+ {0xA1E1, 0xFE65}, //128 #SMALL GREATER-THAN SIGN
+ {0xA1E2, 0xFE66}, //129 #SMALL EQUALS SIGN
+ {0xA1E3, 0xFF5E}, //130 #FULLWIDTH TILDE
+ {0xA1E4, 0x2229}, //131 #INTERSECTION
+ {0xA1E5, 0x222A}, //132 #UNION
+ {0xA1E6, 0x22A5}, //133 #UP TACK
+ {0xA1E7, 0x2220}, //134 #ANGLE
+ {0xA1E8, 0x221F}, //135 #RIGHT ANGLE
+ {0xA1E9, 0x22BF}, //136 #RIGHT TRIANGLE
+ {0xA1EA, 0x33D2}, //137 #SQUARE LOG
+ {0xA1EB, 0x33D1}, //138 #SQUARE LN
+ {0xA1EC, 0x222B}, //139 #INTEGRAL
+ {0xA1ED, 0x222E}, //140 #CONTOUR INTEGRAL
+ {0xA1EE, 0x2235}, //141 #BECAUSE
+ {0xA1EF, 0x2234}, //142 #THEREFORE
+ {0xA1F0, 0x2640}, //143 #FEMALE SIGN
+ {0xA1F1, 0x2642}, //144 #MALE SIGN
+ {0xA1F2, 0x2295}, //145 #CIRCLED PLUS
+ {0xA1F3, 0x2299}, //146 #CIRCLED DOT OPERATOR
+ {0xA1F4, 0x2191}, //147 #UPWARDS ARROW
+ {0xA1F5, 0x2193}, //148 #DOWNWARDS ARROW
+ {0xA1F6, 0x2190}, //149 #LEFTWARDS ARROW
+ {0xA1F7, 0x2192}, //150 #RIGHTWARDS ARROW
+ {0xA1F8, 0x2196}, //151 #NORTH WEST ARROW
+ {0xA1F9, 0x2197}, //152 #NORTH EAST ARROW
+ {0xA1FA, 0x2199}, //153 #SOUTH WEST ARROW
+ {0xA1FB, 0x2198}, //154 #SOUTH EAST ARROW
+ {0xA1FC, 0x2225}, //155 #PARALLEL TO
+ {0xA1FD, 0x2223}, //156 #DIVIDES
+ {0xA1FE, 0xFF0F}, //157 #FULLWIDTH SOLIDUS
+ {0xA240, 0xFF3C}, //158 #FULLWIDTH REVERSE SOLIDUS
+ {0xA241, 0x2215}, //159 #DIVISION SLASH
+ {0xA242, 0xFE68}, //160 #SMALL REVERSE SOLIDUS
+ {0xA243, 0xFF04}, //161 #FULLWIDTH DOLLAR SIGN
+ {0xA244, 0xFFE5}, //162 #FULLWIDTH YEN SIGN
+ {0xA245, 0x3012}, //163 #POSTAL MARK
+ {0xA246, 0xFFE0}, //164 #FULLWIDTH CENT SIGN
+ {0xA247, 0xFFE1}, //165 #FULLWIDTH POUND SIGN
+ {0xA248, 0xFF05}, //166 #FULLWIDTH PERCENT SIGN
+ {0xA249, 0xFF20}, //167 #FULLWIDTH COMMERCIAL AT
+ {0xA24A, 0x2103}, //168 #DEGREE CELSIUS
+ {0xA24B, 0x2109}, //169 #DEGREE FAHRENHEIT
+ {0xA24C, 0xFE69}, //170 #SMALL DOLLAR SIGN
+ {0xA24D, 0xFE6A}, //171 #SMALL PERCENT SIGN
+ {0xA24E, 0xFE6B}, //172 #SMALL COMMERCIAL AT
+ {0xA24F, 0x33D5}, //173 #SQUARE MIL
+ {0xA250, 0x339C}, //174 #SQUARE MM
+ {0xA251, 0x339D}, //175 #SQUARE CM
+ {0xA252, 0x339E}, //176 #SQUARE KM
+ {0xA253, 0x33CE}, //177 #SQUARE KM CAPITAL
+ {0xA254, 0x33A1}, //178 #SQUARE M SQUARED
+ {0xA255, 0x338E}, //179 #SQUARE MG
+ {0xA256, 0x338F}, //180 #SQUARE KG
+ {0xA257, 0x33C4}, //181 #SQUARE CC
+ {0xA258, 0x00B0}, //182 #DEGREE SIGN
+ {0xA259, 0x5159}, //183 #CJK UNIFIED IDEOGRAPH
+ {0xA25A, 0x515B}, //184 #CJK UNIFIED IDEOGRAPH
+ {0xA25B, 0x515E}, //185 #CJK UNIFIED IDEOGRAPH
+ {0xA25C, 0x515D}, //186 #CJK UNIFIED IDEOGRAPH
+ {0xA25D, 0x5161}, //187 #CJK UNIFIED IDEOGRAPH
+ {0xA25E, 0x5163}, //188 #CJK UNIFIED IDEOGRAPH
+ {0xA25F, 0x55E7}, //189 #CJK UNIFIED IDEOGRAPH
+ {0xA260, 0x74E9}, //190 #CJK UNIFIED IDEOGRAPH
+ {0xA261, 0x7CCE}, //191 #CJK UNIFIED IDEOGRAPH
+ {0xA262, 0x2581}, //192 #LOWER ONE EIGHTH BLOCK
+ {0xA263, 0x2582}, //193 #LOWER ONE QUARTER BLOCK
+ {0xA264, 0x2583}, //194 #LOWER THREE EIGHTHS BLOCK
+ {0xA265, 0x2584}, //195 #LOWER HALF BLOCK
+ {0xA266, 0x2585}, //196 #LOWER FIVE EIGHTHS BLOCK
+ {0xA267, 0x2586}, //197 #LOWER THREE QUARTERS BLOCK
+ {0xA268, 0x2587}, //198 #LOWER SEVEN EIGHTHS BLOCK
+ {0xA269, 0x2588}, //199 #FULL BLOCK
+ {0xA26A, 0x258F}, //200 #LEFT ONE EIGHTH BLOCK
+ {0xA26B, 0x258E}, //201 #LEFT ONE QUARTER BLOCK
+ {0xA26C, 0x258D}, //202 #LEFT THREE EIGHTHS BLOCK
+ {0xA26D, 0x258C}, //203 #LEFT HALF BLOCK
+ {0xA26E, 0x258B}, //204 #LEFT FIVE EIGHTHS BLOCK
+ {0xA26F, 0x258A}, //205 #LEFT THREE QUARTERS BLOCK
+ {0xA270, 0x2589}, //206 #LEFT SEVEN EIGHTHS BLOCK
+ {0xA271, 0x253C}, //207 #BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
+ {0xA272, 0x2534}, //208 #BOX DRAWINGS LIGHT UP AND HORIZONTAL
+ {0xA273, 0x252C}, //209 #BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
+ {0xA274, 0x2524}, //210 #BOX DRAWINGS LIGHT VERTICAL AND LEFT
+ {0xA275, 0x251C}, //211 #BOX DRAWINGS LIGHT VERTICAL AND RIGHT
+ {0xA276, 0x2594}, //212 #UPPER ONE EIGHTH BLOCK
+ {0xA277, 0x2500}, //213 #BOX DRAWINGS LIGHT HORIZONTAL
+ {0xA278, 0x2502}, //214 #BOX DRAWINGS LIGHT VERTICAL
+ {0xA279, 0x2595}, //215 #RIGHT ONE EIGHTH BLOCK
+ {0xA27A, 0x250C}, //216 #BOX DRAWINGS LIGHT DOWN AND RIGHT
+ {0xA27B, 0x2510}, //217 #BOX DRAWINGS LIGHT DOWN AND LEFT
+ {0xA27C, 0x2514}, //218 #BOX DRAWINGS LIGHT UP AND RIGHT
+ {0xA27D, 0x2518}, //219 #BOX DRAWINGS LIGHT UP AND LEFT
+ {0xA27E, 0x256D}, //220 #BOX DRAWINGS LIGHT ARC DOWN AND RIGHT
+ {0xA2A1, 0x256E}, //221 #BOX DRAWINGS LIGHT ARC DOWN AND LEFT
+ {0xA2A2, 0x2570}, //222 #BOX DRAWINGS LIGHT ARC UP AND RIGHT
+ {0xA2A3, 0x256F}, //223 #BOX DRAWINGS LIGHT ARC UP AND LEFT
+ {0xA2A4, 0x2550}, //224 #BOX DRAWINGS DOUBLE HORIZONTAL
+ {0xA2A5, 0x255E}, //225 #BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE
+ {0xA2A6, 0x256A}, //226 #BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE
+ {0xA2A7, 0x2561}, //227 #BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE
+ {0xA2A8, 0x25E2}, //228 #BLACK LOWER RIGHT TRIANGLE
+ {0xA2A9, 0x25E3}, //229 #BLACK LOWER LEFT TRIANGLE
+ {0xA2AA, 0x25E5}, //230 #BLACK UPPER RIGHT TRIANGLE
+ {0xA2AB, 0x25E4}, //231 #BLACK UPPER LEFT TRIANGLE
+ {0xA2AC, 0x2571}, //232 #BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT
+ {0xA2AD, 0x2572}, //233 #BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT
+ {0xA2AE, 0x2573}, //234 #BOX DRAWINGS LIGHT DIAGONAL CROSS
+ {0xA2AF, 0xFF10}, //235 #FULLWIDTH DIGIT ZERO
+ {0xA2B0, 0xFF11}, //236 #FULLWIDTH DIGIT ONE
+ {0xA2B1, 0xFF12}, //237 #FULLWIDTH DIGIT TWO
+ {0xA2B2, 0xFF13}, //238 #FULLWIDTH DIGIT THREE
+ {0xA2B3, 0xFF14}, //239 #FULLWIDTH DIGIT FOUR
+ {0xA2B4, 0xFF15}, //240 #FULLWIDTH DIGIT FIVE
+ {0xA2B5, 0xFF16}, //241 #FULLWIDTH DIGIT SIX
+ {0xA2B6, 0xFF17}, //242 #FULLWIDTH DIGIT SEVEN
+ {0xA2B7, 0xFF18}, //243 #FULLWIDTH DIGIT EIGHT
+ {0xA2B8, 0xFF19}, //244 #FULLWIDTH DIGIT NINE
+ {0xA2B9, 0x2160}, //245 #ROMAN NUMERAL ONE
+ {0xA2BA, 0x2161}, //246 #ROMAN NUMERAL TWO
+ {0xA2BB, 0x2162}, //247 #ROMAN NUMERAL THREE
+ {0xA2BC, 0x2163}, //248 #ROMAN NUMERAL FOUR
+ {0xA2BD, 0x2164}, //249 #ROMAN NUMERAL FIVE
+ {0xA2BE, 0x2165}, //250 #ROMAN NUMERAL SIX
+ {0xA2BF, 0x2166}, //251 #ROMAN NUMERAL SEVEN
+ {0xA2C0, 0x2167}, //252 #ROMAN NUMERAL EIGHT
+ {0xA2C1, 0x2168}, //253 #ROMAN NUMERAL NINE
+ {0xA2C2, 0x2169}, //254 #ROMAN NUMERAL TEN
+ {0xA2C3, 0x3021}, //255 #HANGZHOU NUMERAL ONE
+ {0xA2C4, 0x3022}, //256 #HANGZHOU NUMERAL TWO
+ {0xA2C5, 0x3023}, //257 #HANGZHOU NUMERAL THREE
+ {0xA2C6, 0x3024}, //258 #HANGZHOU NUMERAL FOUR
+ {0xA2C7, 0x3025}, //259 #HANGZHOU NUMERAL FIVE
+ {0xA2C8, 0x3026}, //260 #HANGZHOU NUMERAL SIX
+ {0xA2C9, 0x3027}, //261 #HANGZHOU NUMERAL SEVEN
+ {0xA2CA, 0x3028}, //262 #HANGZHOU NUMERAL EIGHT
+ {0xA2CB, 0x3029}, //263 #HANGZHOU NUMERAL NINE
+ {0xA2CC, 0x5341}, //264 #CJK UNIFIED IDEOGRAPH
+ {0xA2CD, 0x5344}, //265 #CJK UNIFIED IDEOGRAPH
+ {0xA2CE, 0x5345}, //266 #CJK UNIFIED IDEOGRAPH
+ {0xA2CF, 0xFF21}, //267 #FULLWIDTH LATIN CAPITAL LETTER A
+ {0xA2D0, 0xFF22}, //268 #FULLWIDTH LATIN CAPITAL LETTER B
+ {0xA2D1, 0xFF23}, //269 #FULLWIDTH LATIN CAPITAL LETTER C
+ {0xA2D2, 0xFF24}, //270 #FULLWIDTH LATIN CAPITAL LETTER D
+ {0xA2D3, 0xFF25}, //271 #FULLWIDTH LATIN CAPITAL LETTER E
+ {0xA2D4, 0xFF26}, //272 #FULLWIDTH LATIN CAPITAL LETTER F
+ {0xA2D5, 0xFF27}, //273 #FULLWIDTH LATIN CAPITAL LETTER G
+ {0xA2D6, 0xFF28}, //274 #FULLWIDTH LATIN CAPITAL LETTER H
+ {0xA2D7, 0xFF29}, //275 #FULLWIDTH LATIN CAPITAL LETTER I
+ {0xA2D8, 0xFF2A}, //276 #FULLWIDTH LATIN CAPITAL LETTER J
+ {0xA2D9, 0xFF2B}, //277 #FULLWIDTH LATIN CAPITAL LETTER K
+ {0xA2DA, 0xFF2C}, //278 #FULLWIDTH LATIN CAPITAL LETTER L
+ {0xA2DB, 0xFF2D}, //279 #FULLWIDTH LATIN CAPITAL LETTER M
+ {0xA2DC, 0xFF2E}, //280 #FULLWIDTH LATIN CAPITAL LETTER N
+ {0xA2DD, 0xFF2F}, //281 #FULLWIDTH LATIN CAPITAL LETTER O
+ {0xA2DE, 0xFF30}, //282 #FULLWIDTH LATIN CAPITAL LETTER P
+ {0xA2DF, 0xFF31}, //283 #FULLWIDTH LATIN CAPITAL LETTER Q
+ {0xA2E0, 0xFF32}, //284 #FULLWIDTH LATIN CAPITAL LETTER R
+ {0xA2E1, 0xFF33}, //285 #FULLWIDTH LATIN CAPITAL LETTER S
+ {0xA2E2, 0xFF34}, //286 #FULLWIDTH LATIN CAPITAL LETTER T
+ {0xA2E3, 0xFF35}, //287 #FULLWIDTH LATIN CAPITAL LETTER U
+ {0xA2E4, 0xFF36}, //288 #FULLWIDTH LATIN CAPITAL LETTER V
+ {0xA2E5, 0xFF37}, //289 #FULLWIDTH LATIN CAPITAL LETTER W
+ {0xA2E6, 0xFF38}, //290 #FULLWIDTH LATIN CAPITAL LETTER X
+ {0xA2E7, 0xFF39}, //291 #FULLWIDTH LATIN CAPITAL LETTER Y
+ {0xA2E8, 0xFF3A}, //292 #FULLWIDTH LATIN CAPITAL LETTER Z
+ {0xA2E9, 0xFF41}, //293 #FULLWIDTH LATIN SMALL LETTER A
+ {0xA2EA, 0xFF42}, //294 #FULLWIDTH LATIN SMALL LETTER B
+ {0xA2EB, 0xFF43}, //295 #FULLWIDTH LATIN SMALL LETTER C
+ {0xA2EC, 0xFF44}, //296 #FULLWIDTH LATIN SMALL LETTER D
+ {0xA2ED, 0xFF45}, //297 #FULLWIDTH LATIN SMALL LETTER E
+ {0xA2EE, 0xFF46}, //298 #FULLWIDTH LATIN SMALL LETTER F
+ {0xA2EF, 0xFF47}, //299 #FULLWIDTH LATIN SMALL LETTER G
+ {0xA2F0, 0xFF48}, //300 #FULLWIDTH LATIN SMALL LETTER H
+ {0xA2F1, 0xFF49}, //301 #FULLWIDTH LATIN SMALL LETTER I
+ {0xA2F2, 0xFF4A}, //302 #FULLWIDTH LATIN SMALL LETTER J
+ {0xA2F3, 0xFF4B}, //303 #FULLWIDTH LATIN SMALL LETTER K
+ {0xA2F4, 0xFF4C}, //304 #FULLWIDTH LATIN SMALL LETTER L
+ {0xA2F5, 0xFF4D}, //305 #FULLWIDTH LATIN SMALL LETTER M
+ {0xA2F6, 0xFF4E}, //306 #FULLWIDTH LATIN SMALL LETTER N
+ {0xA2F7, 0xFF4F}, //307 #FULLWIDTH LATIN SMALL LETTER O
+ {0xA2F8, 0xFF50}, //308 #FULLWIDTH LATIN SMALL LETTER P
+ {0xA2F9, 0xFF51}, //309 #FULLWIDTH LATIN SMALL LETTER Q
+ {0xA2FA, 0xFF52}, //310 #FULLWIDTH LATIN SMALL LETTER R
+ {0xA2FB, 0xFF53}, //311 #FULLWIDTH LATIN SMALL LETTER S
+ {0xA2FC, 0xFF54}, //312 #FULLWIDTH LATIN SMALL LETTER T
+ {0xA2FD, 0xFF55}, //313 #FULLWIDTH LATIN SMALL LETTER U
+ {0xA2FE, 0xFF56}, //314 #FULLWIDTH LATIN SMALL LETTER V
+ {0xA340, 0xFF57}, //315 #FULLWIDTH LATIN SMALL LETTER W
+ {0xA341, 0xFF58}, //316 #FULLWIDTH LATIN SMALL LETTER X
+ {0xA342, 0xFF59}, //317 #FULLWIDTH LATIN SMALL LETTER Y
+ {0xA343, 0xFF5A}, //318 #FULLWIDTH LATIN SMALL LETTER Z
+ {0xA344, 0x0391}, //319 #GREEK CAPITAL LETTER ALPHA
+ {0xA345, 0x0392}, //320 #GREEK CAPITAL LETTER BETA
+ {0xA346, 0x0393}, //321 #GREEK CAPITAL LETTER GAMMA
+ {0xA347, 0x0394}, //322 #GREEK CAPITAL LETTER DELTA
+ {0xA348, 0x0395}, //323 #GREEK CAPITAL LETTER EPSILON
+ {0xA349, 0x0396}, //324 #GREEK CAPITAL LETTER ZETA
+ {0xA34A, 0x0397}, //325 #GREEK CAPITAL LETTER ETA
+ {0xA34B, 0x0398}, //326 #GREEK CAPITAL LETTER THETA
+ {0xA34C, 0x0399}, //327 #GREEK CAPITAL LETTER IOTA
+ {0xA34D, 0x039A}, //328 #GREEK CAPITAL LETTER KAPPA
+ {0xA34E, 0x039B}, //329 #GREEK CAPITAL LETTER LAMDA
+ {0xA34F, 0x039C}, //330 #GREEK CAPITAL LETTER MU
+ {0xA350, 0x039D}, //331 #GREEK CAPITAL LETTER NU
+ {0xA351, 0x039E}, //332 #GREEK CAPITAL LETTER XI
+ {0xA352, 0x039F}, //333 #GREEK CAPITAL LETTER OMICRON
+ {0xA353, 0x03A0}, //334 #GREEK CAPITAL LETTER PI
+ {0xA354, 0x03A1}, //335 #GREEK CAPITAL LETTER RHO
+ {0xA355, 0x03A3}, //336 #GREEK CAPITAL LETTER SIGMA
+ {0xA356, 0x03A4}, //337 #GREEK CAPITAL LETTER TAU
+ {0xA357, 0x03A5}, //338 #GREEK CAPITAL LETTER UPSILON
+ {0xA358, 0x03A6}, //339 #GREEK CAPITAL LETTER PHI
+ {0xA359, 0x03A7}, //340 #GREEK CAPITAL LETTER CHI
+ {0xA35A, 0x03A8}, //341 #GREEK CAPITAL LETTER PSI
+ {0xA35B, 0x03A9}, //342 #GREEK CAPITAL LETTER OMEGA
+ {0xA35C, 0x03B1}, //343 #GREEK SMALL LETTER ALPHA
+ {0xA35D, 0x03B2}, //344 #GREEK SMALL LETTER BETA
+ {0xA35E, 0x03B3}, //345 #GREEK SMALL LETTER GAMMA
+ {0xA35F, 0x03B4}, //346 #GREEK SMALL LETTER DELTA
+ {0xA360, 0x03B5}, //347 #GREEK SMALL LETTER EPSILON
+ {0xA361, 0x03B6}, //348 #GREEK SMALL LETTER ZETA
+ {0xA362, 0x03B7}, //349 #GREEK SMALL LETTER ETA
+ {0xA363, 0x03B8}, //350 #GREEK SMALL LETTER THETA
+ {0xA364, 0x03B9}, //351 #GREEK SMALL LETTER IOTA
+ {0xA365, 0x03BA}, //352 #GREEK SMALL LETTER KAPPA
+ {0xA366, 0x03BB}, //353 #GREEK SMALL LETTER LAMDA
+ {0xA367, 0x03BC}, //354 #GREEK SMALL LETTER MU
+ {0xA368, 0x03BD}, //355 #GREEK SMALL LETTER NU
+ {0xA369, 0x03BE}, //356 #GREEK SMALL LETTER XI
+ {0xA36A, 0x03BF}, //357 #GREEK SMALL LETTER OMICRON
+ {0xA36B, 0x03C0}, //358 #GREEK SMALL LETTER PI
+ {0xA36C, 0x03C1}, //359 #GREEK SMALL LETTER RHO
+ {0xA36D, 0x03C3}, //360 #GREEK SMALL LETTER SIGMA
+ {0xA36E, 0x03C4}, //361 #GREEK SMALL LETTER TAU
+ {0xA36F, 0x03C5}, //362 #GREEK SMALL LETTER UPSILON
+ {0xA370, 0x03C6}, //363 #GREEK SMALL LETTER PHI
+ {0xA371, 0x03C7}, //364 #GREEK SMALL LETTER CHI
+ {0xA372, 0x03C8}, //365 #GREEK SMALL LETTER PSI
+ {0xA373, 0x03C9}, //366 #GREEK SMALL LETTER OMEGA
+ {0xA374, 0x3105}, //367 #BOPOMOFO LETTER B
+ {0xA375, 0x3106}, //368 #BOPOMOFO LETTER P
+ {0xA376, 0x3107}, //369 #BOPOMOFO LETTER M
+ {0xA377, 0x3108}, //370 #BOPOMOFO LETTER F
+ {0xA378, 0x3109}, //371 #BOPOMOFO LETTER D
+ {0xA379, 0x310A}, //372 #BOPOMOFO LETTER T
+ {0xA37A, 0x310B}, //373 #BOPOMOFO LETTER N
+ {0xA37B, 0x310C}, //374 #BOPOMOFO LETTER L
+ {0xA37C, 0x310D}, //375 #BOPOMOFO LETTER G
+ {0xA37D, 0x310E}, //376 #BOPOMOFO LETTER K
+ {0xA37E, 0x310F}, //377 #BOPOMOFO LETTER H
+ {0xA3A1, 0x3110}, //378 #BOPOMOFO LETTER J
+ {0xA3A2, 0x3111}, //379 #BOPOMOFO LETTER Q
+ {0xA3A3, 0x3112}, //380 #BOPOMOFO LETTER X
+ {0xA3A4, 0x3113}, //381 #BOPOMOFO LETTER ZH
+ {0xA3A5, 0x3114}, //382 #BOPOMOFO LETTER CH
+ {0xA3A6, 0x3115}, //383 #BOPOMOFO LETTER SH
+ {0xA3A7, 0x3116}, //384 #BOPOMOFO LETTER R
+ {0xA3A8, 0x3117}, //385 #BOPOMOFO LETTER Z
+ {0xA3A9, 0x3118}, //386 #BOPOMOFO LETTER C
+ {0xA3AA, 0x3119}, //387 #BOPOMOFO LETTER S
+ {0xA3AB, 0x311A}, //388 #BOPOMOFO LETTER A
+ {0xA3AC, 0x311B}, //389 #BOPOMOFO LETTER O
+ {0xA3AD, 0x311C}, //390 #BOPOMOFO LETTER E
+ {0xA3AE, 0x311D}, //391 #BOPOMOFO LETTER EH
+ {0xA3AF, 0x311E}, //392 #BOPOMOFO LETTER AI
+ {0xA3B0, 0x311F}, //393 #BOPOMOFO LETTER EI
+ {0xA3B1, 0x3120}, //394 #BOPOMOFO LETTER AU
+ {0xA3B2, 0x3121}, //395 #BOPOMOFO LETTER OU
+ {0xA3B3, 0x3122}, //396 #BOPOMOFO LETTER AN
+ {0xA3B4, 0x3123}, //397 #BOPOMOFO LETTER EN
+ {0xA3B5, 0x3124}, //398 #BOPOMOFO LETTER ANG
+ {0xA3B6, 0x3125}, //399 #BOPOMOFO LETTER ENG
+ {0xA3B7, 0x3126}, //400 #BOPOMOFO LETTER ER
+ {0xA3B8, 0x3127}, //401 #BOPOMOFO LETTER I
+ {0xA3B9, 0x3128}, //402 #BOPOMOFO LETTER U
+ {0xA3BA, 0x3129}, //403 #BOPOMOFO LETTER IU
+ {0xA3BB, 0x02D9}, //404 #DOT ABOVE
+ {0xA3BC, 0x02C9}, //405 #MODIFIER LETTER MACRON
+ {0xA3BD, 0x02CA}, //406 #MODIFIER LETTER ACUTE ACCENT
+ {0xA3BE, 0x02C7}, //407 #CARON
+ {0xA3BF, 0x02CB}, //408 #MODIFIER LETTER GRAVE ACCENT
+ {0xA3E1, 0x20AC}, //409 #EURO SIGN
+ {0xA440, 0x4E00}, //410 #CJK UNIFIED IDEOGRAPH
+ {0xA441, 0x4E59}, //411 #CJK UNIFIED IDEOGRAPH
+ {0xA442, 0x4E01}, //412 #CJK UNIFIED IDEOGRAPH
+ {0xA443, 0x4E03}, //413 #CJK UNIFIED IDEOGRAPH
+ {0xA444, 0x4E43}, //414 #CJK UNIFIED IDEOGRAPH
+ {0xA445, 0x4E5D}, //415 #CJK UNIFIED IDEOGRAPH
+ {0xA446, 0x4E86}, //416 #CJK UNIFIED IDEOGRAPH
+ {0xA447, 0x4E8C}, //417 #CJK UNIFIED IDEOGRAPH
+ {0xA448, 0x4EBA}, //418 #CJK UNIFIED IDEOGRAPH
+ {0xA449, 0x513F}, //419 #CJK UNIFIED IDEOGRAPH
+ {0xA44A, 0x5165}, //420 #CJK UNIFIED IDEOGRAPH
+ {0xA44B, 0x516B}, //421 #CJK UNIFIED IDEOGRAPH
+ {0xA44C, 0x51E0}, //422 #CJK UNIFIED IDEOGRAPH
+ {0xA44D, 0x5200}, //423 #CJK UNIFIED IDEOGRAPH
+ {0xA44E, 0x5201}, //424 #CJK UNIFIED IDEOGRAPH
+ {0xA44F, 0x529B}, //425 #CJK UNIFIED IDEOGRAPH
+ {0xA450, 0x5315}, //426 #CJK UNIFIED IDEOGRAPH
+ {0xA451, 0x5341}, //427 #CJK UNIFIED IDEOGRAPH
+ {0xA452, 0x535C}, //428 #CJK UNIFIED IDEOGRAPH
+ {0xA453, 0x53C8}, //429 #CJK UNIFIED IDEOGRAPH
+ {0xA454, 0x4E09}, //430 #CJK UNIFIED IDEOGRAPH
+ {0xA455, 0x4E0B}, //431 #CJK UNIFIED IDEOGRAPH
+ {0xA456, 0x4E08}, //432 #CJK UNIFIED IDEOGRAPH
+ {0xA457, 0x4E0A}, //433 #CJK UNIFIED IDEOGRAPH
+ {0xA458, 0x4E2B}, //434 #CJK UNIFIED IDEOGRAPH
+ {0xA459, 0x4E38}, //435 #CJK UNIFIED IDEOGRAPH
+ {0xA45A, 0x51E1}, //436 #CJK UNIFIED IDEOGRAPH
+ {0xA45B, 0x4E45}, //437 #CJK UNIFIED IDEOGRAPH
+ {0xA45C, 0x4E48}, //438 #CJK UNIFIED IDEOGRAPH
+ {0xA45D, 0x4E5F}, //439 #CJK UNIFIED IDEOGRAPH
+ {0xA45E, 0x4E5E}, //440 #CJK UNIFIED IDEOGRAPH
+ {0xA45F, 0x4E8E}, //441 #CJK UNIFIED IDEOGRAPH
+ {0xA460, 0x4EA1}, //442 #CJK UNIFIED IDEOGRAPH
+ {0xA461, 0x5140}, //443 #CJK UNIFIED IDEOGRAPH
+ {0xA462, 0x5203}, //444 #CJK UNIFIED IDEOGRAPH
+ {0xA463, 0x52FA}, //445 #CJK UNIFIED IDEOGRAPH
+ {0xA464, 0x5343}, //446 #CJK UNIFIED IDEOGRAPH
+ {0xA465, 0x53C9}, //447 #CJK UNIFIED IDEOGRAPH
+ {0xA466, 0x53E3}, //448 #CJK UNIFIED IDEOGRAPH
+ {0xA467, 0x571F}, //449 #CJK UNIFIED IDEOGRAPH
+ {0xA468, 0x58EB}, //450 #CJK UNIFIED IDEOGRAPH
+ {0xA469, 0x5915}, //451 #CJK UNIFIED IDEOGRAPH
+ {0xA46A, 0x5927}, //452 #CJK UNIFIED IDEOGRAPH
+ {0xA46B, 0x5973}, //453 #CJK UNIFIED IDEOGRAPH
+ {0xA46C, 0x5B50}, //454 #CJK UNIFIED IDEOGRAPH
+ {0xA46D, 0x5B51}, //455 #CJK UNIFIED IDEOGRAPH
+ {0xA46E, 0x5B53}, //456 #CJK UNIFIED IDEOGRAPH
+ {0xA46F, 0x5BF8}, //457 #CJK UNIFIED IDEOGRAPH
+ {0xA470, 0x5C0F}, //458 #CJK UNIFIED IDEOGRAPH
+ {0xA471, 0x5C22}, //459 #CJK UNIFIED IDEOGRAPH
+ {0xA472, 0x5C38}, //460 #CJK UNIFIED IDEOGRAPH
+ {0xA473, 0x5C71}, //461 #CJK UNIFIED IDEOGRAPH
+ {0xA474, 0x5DDD}, //462 #CJK UNIFIED IDEOGRAPH
+ {0xA475, 0x5DE5}, //463 #CJK UNIFIED IDEOGRAPH
+ {0xA476, 0x5DF1}, //464 #CJK UNIFIED IDEOGRAPH
+ {0xA477, 0x5DF2}, //465 #CJK UNIFIED IDEOGRAPH
+ {0xA478, 0x5DF3}, //466 #CJK UNIFIED IDEOGRAPH
+ {0xA479, 0x5DFE}, //467 #CJK UNIFIED IDEOGRAPH
+ {0xA47A, 0x5E72}, //468 #CJK UNIFIED IDEOGRAPH
+ {0xA47B, 0x5EFE}, //469 #CJK UNIFIED IDEOGRAPH
+ {0xA47C, 0x5F0B}, //470 #CJK UNIFIED IDEOGRAPH
+ {0xA47D, 0x5F13}, //471 #CJK UNIFIED IDEOGRAPH
+ {0xA47E, 0x624D}, //472 #CJK UNIFIED IDEOGRAPH
+ {0xA4A1, 0x4E11}, //473 #CJK UNIFIED IDEOGRAPH
+ {0xA4A2, 0x4E10}, //474 #CJK UNIFIED IDEOGRAPH
+ {0xA4A3, 0x4E0D}, //475 #CJK UNIFIED IDEOGRAPH
+ {0xA4A4, 0x4E2D}, //476 #CJK UNIFIED IDEOGRAPH
+ {0xA4A5, 0x4E30}, //477 #CJK UNIFIED IDEOGRAPH
+ {0xA4A6, 0x4E39}, //478 #CJK UNIFIED IDEOGRAPH
+ {0xA4A7, 0x4E4B}, //479 #CJK UNIFIED IDEOGRAPH
+ {0xA4A8, 0x5C39}, //480 #CJK UNIFIED IDEOGRAPH
+ {0xA4A9, 0x4E88}, //481 #CJK UNIFIED IDEOGRAPH
+ {0xA4AA, 0x4E91}, //482 #CJK UNIFIED IDEOGRAPH
+ {0xA4AB, 0x4E95}, //483 #CJK UNIFIED IDEOGRAPH
+ {0xA4AC, 0x4E92}, //484 #CJK UNIFIED IDEOGRAPH
+ {0xA4AD, 0x4E94}, //485 #CJK UNIFIED IDEOGRAPH
+ {0xA4AE, 0x4EA2}, //486 #CJK UNIFIED IDEOGRAPH
+ {0xA4AF, 0x4EC1}, //487 #CJK UNIFIED IDEOGRAPH
+ {0xA4B0, 0x4EC0}, //488 #CJK UNIFIED IDEOGRAPH
+ {0xA4B1, 0x4EC3}, //489 #CJK UNIFIED IDEOGRAPH
+ {0xA4B2, 0x4EC6}, //490 #CJK UNIFIED IDEOGRAPH
+ {0xA4B3, 0x4EC7}, //491 #CJK UNIFIED IDEOGRAPH
+ {0xA4B4, 0x4ECD}, //492 #CJK UNIFIED IDEOGRAPH
+ {0xA4B5, 0x4ECA}, //493 #CJK UNIFIED IDEOGRAPH
+ {0xA4B6, 0x4ECB}, //494 #CJK UNIFIED IDEOGRAPH
+ {0xA4B7, 0x4EC4}, //495 #CJK UNIFIED IDEOGRAPH
+ {0xA4B8, 0x5143}, //496 #CJK UNIFIED IDEOGRAPH
+ {0xA4B9, 0x5141}, //497 #CJK UNIFIED IDEOGRAPH
+ {0xA4BA, 0x5167}, //498 #CJK UNIFIED IDEOGRAPH
+ {0xA4BB, 0x516D}, //499 #CJK UNIFIED IDEOGRAPH
+ {0xA4BC, 0x516E}, //500 #CJK UNIFIED IDEOGRAPH
+ {0xA4BD, 0x516C}, //501 #CJK UNIFIED IDEOGRAPH
+ {0xA4BE, 0x5197}, //502 #CJK UNIFIED IDEOGRAPH
+ {0xA4BF, 0x51F6}, //503 #CJK UNIFIED IDEOGRAPH
+ {0xA4C0, 0x5206}, //504 #CJK UNIFIED IDEOGRAPH
+ {0xA4C1, 0x5207}, //505 #CJK UNIFIED IDEOGRAPH
+ {0xA4C2, 0x5208}, //506 #CJK UNIFIED IDEOGRAPH
+ {0xA4C3, 0x52FB}, //507 #CJK UNIFIED IDEOGRAPH
+ {0xA4C4, 0x52FE}, //508 #CJK UNIFIED IDEOGRAPH
+ {0xA4C5, 0x52FF}, //509 #CJK UNIFIED IDEOGRAPH
+ {0xA4C6, 0x5316}, //510 #CJK UNIFIED IDEOGRAPH
+ {0xA4C7, 0x5339}, //511 #CJK UNIFIED IDEOGRAPH
+ {0xA4C8, 0x5348}, //512 #CJK UNIFIED IDEOGRAPH
+ {0xA4C9, 0x5347}, //513 #CJK UNIFIED IDEOGRAPH
+ {0xA4CA, 0x5345}, //514 #CJK UNIFIED IDEOGRAPH
+ {0xA4CB, 0x535E}, //515 #CJK UNIFIED IDEOGRAPH
+ {0xA4CC, 0x5384}, //516 #CJK UNIFIED IDEOGRAPH
+ {0xA4CD, 0x53CB}, //517 #CJK UNIFIED IDEOGRAPH
+ {0xA4CE, 0x53CA}, //518 #CJK UNIFIED IDEOGRAPH
+ {0xA4CF, 0x53CD}, //519 #CJK UNIFIED IDEOGRAPH
+ {0xA4D0, 0x58EC}, //520 #CJK UNIFIED IDEOGRAPH
+ {0xA4D1, 0x5929}, //521 #CJK UNIFIED IDEOGRAPH
+ {0xA4D2, 0x592B}, //522 #CJK UNIFIED IDEOGRAPH
+ {0xA4D3, 0x592A}, //523 #CJK UNIFIED IDEOGRAPH
+ {0xA4D4, 0x592D}, //524 #CJK UNIFIED IDEOGRAPH
+ {0xA4D5, 0x5B54}, //525 #CJK UNIFIED IDEOGRAPH
+ {0xA4D6, 0x5C11}, //526 #CJK UNIFIED IDEOGRAPH
+ {0xA4D7, 0x5C24}, //527 #CJK UNIFIED IDEOGRAPH
+ {0xA4D8, 0x5C3A}, //528 #CJK UNIFIED IDEOGRAPH
+ {0xA4D9, 0x5C6F}, //529 #CJK UNIFIED IDEOGRAPH
+ {0xA4DA, 0x5DF4}, //530 #CJK UNIFIED IDEOGRAPH
+ {0xA4DB, 0x5E7B}, //531 #CJK UNIFIED IDEOGRAPH
+ {0xA4DC, 0x5EFF}, //532 #CJK UNIFIED IDEOGRAPH
+ {0xA4DD, 0x5F14}, //533 #CJK UNIFIED IDEOGRAPH
+ {0xA4DE, 0x5F15}, //534 #CJK UNIFIED IDEOGRAPH
+ {0xA4DF, 0x5FC3}, //535 #CJK UNIFIED IDEOGRAPH
+ {0xA4E0, 0x6208}, //536 #CJK UNIFIED IDEOGRAPH
+ {0xA4E1, 0x6236}, //537 #CJK UNIFIED IDEOGRAPH
+ {0xA4E2, 0x624B}, //538 #CJK UNIFIED IDEOGRAPH
+ {0xA4E3, 0x624E}, //539 #CJK UNIFIED IDEOGRAPH
+ {0xA4E4, 0x652F}, //540 #CJK UNIFIED IDEOGRAPH
+ {0xA4E5, 0x6587}, //541 #CJK UNIFIED IDEOGRAPH
+ {0xA4E6, 0x6597}, //542 #CJK UNIFIED IDEOGRAPH
+ {0xA4E7, 0x65A4}, //543 #CJK UNIFIED IDEOGRAPH
+ {0xA4E8, 0x65B9}, //544 #CJK UNIFIED IDEOGRAPH
+ {0xA4E9, 0x65E5}, //545 #CJK UNIFIED IDEOGRAPH
+ {0xA4EA, 0x66F0}, //546 #CJK UNIFIED IDEOGRAPH
+ {0xA4EB, 0x6708}, //547 #CJK UNIFIED IDEOGRAPH
+ {0xA4EC, 0x6728}, //548 #CJK UNIFIED IDEOGRAPH
+ {0xA4ED, 0x6B20}, //549 #CJK UNIFIED IDEOGRAPH
+ {0xA4EE, 0x6B62}, //550 #CJK UNIFIED IDEOGRAPH
+ {0xA4EF, 0x6B79}, //551 #CJK UNIFIED IDEOGRAPH
+ {0xA4F0, 0x6BCB}, //552 #CJK UNIFIED IDEOGRAPH
+ {0xA4F1, 0x6BD4}, //553 #CJK UNIFIED IDEOGRAPH
+ {0xA4F2, 0x6BDB}, //554 #CJK UNIFIED IDEOGRAPH
+ {0xA4F3, 0x6C0F}, //555 #CJK UNIFIED IDEOGRAPH
+ {0xA4F4, 0x6C34}, //556 #CJK UNIFIED IDEOGRAPH
+ {0xA4F5, 0x706B}, //557 #CJK UNIFIED IDEOGRAPH
+ {0xA4F6, 0x722A}, //558 #CJK UNIFIED IDEOGRAPH
+ {0xA4F7, 0x7236}, //559 #CJK UNIFIED IDEOGRAPH
+ {0xA4F8, 0x723B}, //560 #CJK UNIFIED IDEOGRAPH
+ {0xA4F9, 0x7247}, //561 #CJK UNIFIED IDEOGRAPH
+ {0xA4FA, 0x7259}, //562 #CJK UNIFIED IDEOGRAPH
+ {0xA4FB, 0x725B}, //563 #CJK UNIFIED IDEOGRAPH
+ {0xA4FC, 0x72AC}, //564 #CJK UNIFIED IDEOGRAPH
+ {0xA4FD, 0x738B}, //565 #CJK UNIFIED IDEOGRAPH
+ {0xA4FE, 0x4E19}, //566 #CJK UNIFIED IDEOGRAPH
+ {0xA540, 0x4E16}, //567 #CJK UNIFIED IDEOGRAPH
+ {0xA541, 0x4E15}, //568 #CJK UNIFIED IDEOGRAPH
+ {0xA542, 0x4E14}, //569 #CJK UNIFIED IDEOGRAPH
+ {0xA543, 0x4E18}, //570 #CJK UNIFIED IDEOGRAPH
+ {0xA544, 0x4E3B}, //571 #CJK UNIFIED IDEOGRAPH
+ {0xA545, 0x4E4D}, //572 #CJK UNIFIED IDEOGRAPH
+ {0xA546, 0x4E4F}, //573 #CJK UNIFIED IDEOGRAPH
+ {0xA547, 0x4E4E}, //574 #CJK UNIFIED IDEOGRAPH
+ {0xA548, 0x4EE5}, //575 #CJK UNIFIED IDEOGRAPH
+ {0xA549, 0x4ED8}, //576 #CJK UNIFIED IDEOGRAPH
+ {0xA54A, 0x4ED4}, //577 #CJK UNIFIED IDEOGRAPH
+ {0xA54B, 0x4ED5}, //578 #CJK UNIFIED IDEOGRAPH
+ {0xA54C, 0x4ED6}, //579 #CJK UNIFIED IDEOGRAPH
+ {0xA54D, 0x4ED7}, //580 #CJK UNIFIED IDEOGRAPH
+ {0xA54E, 0x4EE3}, //581 #CJK UNIFIED IDEOGRAPH
+ {0xA54F, 0x4EE4}, //582 #CJK UNIFIED IDEOGRAPH
+ {0xA550, 0x4ED9}, //583 #CJK UNIFIED IDEOGRAPH
+ {0xA551, 0x4EDE}, //584 #CJK UNIFIED IDEOGRAPH
+ {0xA552, 0x5145}, //585 #CJK UNIFIED IDEOGRAPH
+ {0xA553, 0x5144}, //586 #CJK UNIFIED IDEOGRAPH
+ {0xA554, 0x5189}, //587 #CJK UNIFIED IDEOGRAPH
+ {0xA555, 0x518A}, //588 #CJK UNIFIED IDEOGRAPH
+ {0xA556, 0x51AC}, //589 #CJK UNIFIED IDEOGRAPH
+ {0xA557, 0x51F9}, //590 #CJK UNIFIED IDEOGRAPH
+ {0xA558, 0x51FA}, //591 #CJK UNIFIED IDEOGRAPH
+ {0xA559, 0x51F8}, //592 #CJK UNIFIED IDEOGRAPH
+ {0xA55A, 0x520A}, //593 #CJK UNIFIED IDEOGRAPH
+ {0xA55B, 0x52A0}, //594 #CJK UNIFIED IDEOGRAPH
+ {0xA55C, 0x529F}, //595 #CJK UNIFIED IDEOGRAPH
+ {0xA55D, 0x5305}, //596 #CJK UNIFIED IDEOGRAPH
+ {0xA55E, 0x5306}, //597 #CJK UNIFIED IDEOGRAPH
+ {0xA55F, 0x5317}, //598 #CJK UNIFIED IDEOGRAPH
+ {0xA560, 0x531D}, //599 #CJK UNIFIED IDEOGRAPH
+ {0xA561, 0x4EDF}, //600 #CJK UNIFIED IDEOGRAPH
+ {0xA562, 0x534A}, //601 #CJK UNIFIED IDEOGRAPH
+ {0xA563, 0x5349}, //602 #CJK UNIFIED IDEOGRAPH
+ {0xA564, 0x5361}, //603 #CJK UNIFIED IDEOGRAPH
+ {0xA565, 0x5360}, //604 #CJK UNIFIED IDEOGRAPH
+ {0xA566, 0x536F}, //605 #CJK UNIFIED IDEOGRAPH
+ {0xA567, 0x536E}, //606 #CJK UNIFIED IDEOGRAPH
+ {0xA568, 0x53BB}, //607 #CJK UNIFIED IDEOGRAPH
+ {0xA569, 0x53EF}, //608 #CJK UNIFIED IDEOGRAPH
+ {0xA56A, 0x53E4}, //609 #CJK UNIFIED IDEOGRAPH
+ {0xA56B, 0x53F3}, //610 #CJK UNIFIED IDEOGRAPH
+ {0xA56C, 0x53EC}, //611 #CJK UNIFIED IDEOGRAPH
+ {0xA56D, 0x53EE}, //612 #CJK UNIFIED IDEOGRAPH
+ {0xA56E, 0x53E9}, //613 #CJK UNIFIED IDEOGRAPH
+ {0xA56F, 0x53E8}, //614 #CJK UNIFIED IDEOGRAPH
+ {0xA570, 0x53FC}, //615 #CJK UNIFIED IDEOGRAPH
+ {0xA571, 0x53F8}, //616 #CJK UNIFIED IDEOGRAPH
+ {0xA572, 0x53F5}, //617 #CJK UNIFIED IDEOGRAPH
+ {0xA573, 0x53EB}, //618 #CJK UNIFIED IDEOGRAPH
+ {0xA574, 0x53E6}, //619 #CJK UNIFIED IDEOGRAPH
+ {0xA575, 0x53EA}, //620 #CJK UNIFIED IDEOGRAPH
+ {0xA576, 0x53F2}, //621 #CJK UNIFIED IDEOGRAPH
+ {0xA577, 0x53F1}, //622 #CJK UNIFIED IDEOGRAPH
+ {0xA578, 0x53F0}, //623 #CJK UNIFIED IDEOGRAPH
+ {0xA579, 0x53E5}, //624 #CJK UNIFIED IDEOGRAPH
+ {0xA57A, 0x53ED}, //625 #CJK UNIFIED IDEOGRAPH
+ {0xA57B, 0x53FB}, //626 #CJK UNIFIED IDEOGRAPH
+ {0xA57C, 0x56DB}, //627 #CJK UNIFIED IDEOGRAPH
+ {0xA57D, 0x56DA}, //628 #CJK UNIFIED IDEOGRAPH
+ {0xA57E, 0x5916}, //629 #CJK UNIFIED IDEOGRAPH
+ {0xA5A1, 0x592E}, //630 #CJK UNIFIED IDEOGRAPH
+ {0xA5A2, 0x5931}, //631 #CJK UNIFIED IDEOGRAPH
+ {0xA5A3, 0x5974}, //632 #CJK UNIFIED IDEOGRAPH
+ {0xA5A4, 0x5976}, //633 #CJK UNIFIED IDEOGRAPH
+ {0xA5A5, 0x5B55}, //634 #CJK UNIFIED IDEOGRAPH
+ {0xA5A6, 0x5B83}, //635 #CJK UNIFIED IDEOGRAPH
+ {0xA5A7, 0x5C3C}, //636 #CJK UNIFIED IDEOGRAPH
+ {0xA5A8, 0x5DE8}, //637 #CJK UNIFIED IDEOGRAPH
+ {0xA5A9, 0x5DE7}, //638 #CJK UNIFIED IDEOGRAPH
+ {0xA5AA, 0x5DE6}, //639 #CJK UNIFIED IDEOGRAPH
+ {0xA5AB, 0x5E02}, //640 #CJK UNIFIED IDEOGRAPH
+ {0xA5AC, 0x5E03}, //641 #CJK UNIFIED IDEOGRAPH
+ {0xA5AD, 0x5E73}, //642 #CJK UNIFIED IDEOGRAPH
+ {0xA5AE, 0x5E7C}, //643 #CJK UNIFIED IDEOGRAPH
+ {0xA5AF, 0x5F01}, //644 #CJK UNIFIED IDEOGRAPH
+ {0xA5B0, 0x5F18}, //645 #CJK UNIFIED IDEOGRAPH
+ {0xA5B1, 0x5F17}, //646 #CJK UNIFIED IDEOGRAPH
+ {0xA5B2, 0x5FC5}, //647 #CJK UNIFIED IDEOGRAPH
+ {0xA5B3, 0x620A}, //648 #CJK UNIFIED IDEOGRAPH
+ {0xA5B4, 0x6253}, //649 #CJK UNIFIED IDEOGRAPH
+ {0xA5B5, 0x6254}, //650 #CJK UNIFIED IDEOGRAPH
+ {0xA5B6, 0x6252}, //651 #CJK UNIFIED IDEOGRAPH
+ {0xA5B7, 0x6251}, //652 #CJK UNIFIED IDEOGRAPH
+ {0xA5B8, 0x65A5}, //653 #CJK UNIFIED IDEOGRAPH
+ {0xA5B9, 0x65E6}, //654 #CJK UNIFIED IDEOGRAPH
+ {0xA5BA, 0x672E}, //655 #CJK UNIFIED IDEOGRAPH
+ {0xA5BB, 0x672C}, //656 #CJK UNIFIED IDEOGRAPH
+ {0xA5BC, 0x672A}, //657 #CJK UNIFIED IDEOGRAPH
+ {0xA5BD, 0x672B}, //658 #CJK UNIFIED IDEOGRAPH
+ {0xA5BE, 0x672D}, //659 #CJK UNIFIED IDEOGRAPH
+ {0xA5BF, 0x6B63}, //660 #CJK UNIFIED IDEOGRAPH
+ {0xA5C0, 0x6BCD}, //661 #CJK UNIFIED IDEOGRAPH
+ {0xA5C1, 0x6C11}, //662 #CJK UNIFIED IDEOGRAPH
+ {0xA5C2, 0x6C10}, //663 #CJK UNIFIED IDEOGRAPH
+ {0xA5C3, 0x6C38}, //664 #CJK UNIFIED IDEOGRAPH
+ {0xA5C4, 0x6C41}, //665 #CJK UNIFIED IDEOGRAPH
+ {0xA5C5, 0x6C40}, //666 #CJK UNIFIED IDEOGRAPH
+ {0xA5C6, 0x6C3E}, //667 #CJK UNIFIED IDEOGRAPH
+ {0xA5C7, 0x72AF}, //668 #CJK UNIFIED IDEOGRAPH
+ {0xA5C8, 0x7384}, //669 #CJK UNIFIED IDEOGRAPH
+ {0xA5C9, 0x7389}, //670 #CJK UNIFIED IDEOGRAPH
+ {0xA5CA, 0x74DC}, //671 #CJK UNIFIED IDEOGRAPH
+ {0xA5CB, 0x74E6}, //672 #CJK UNIFIED IDEOGRAPH
+ {0xA5CC, 0x7518}, //673 #CJK UNIFIED IDEOGRAPH
+ {0xA5CD, 0x751F}, //674 #CJK UNIFIED IDEOGRAPH
+ {0xA5CE, 0x7528}, //675 #CJK UNIFIED IDEOGRAPH
+ {0xA5CF, 0x7529}, //676 #CJK UNIFIED IDEOGRAPH
+ {0xA5D0, 0x7530}, //677 #CJK UNIFIED IDEOGRAPH
+ {0xA5D1, 0x7531}, //678 #CJK UNIFIED IDEOGRAPH
+ {0xA5D2, 0x7532}, //679 #CJK UNIFIED IDEOGRAPH
+ {0xA5D3, 0x7533}, //680 #CJK UNIFIED IDEOGRAPH
+ {0xA5D4, 0x758B}, //681 #CJK UNIFIED IDEOGRAPH
+ {0xA5D5, 0x767D}, //682 #CJK UNIFIED IDEOGRAPH
+ {0xA5D6, 0x76AE}, //683 #CJK UNIFIED IDEOGRAPH
+ {0xA5D7, 0x76BF}, //684 #CJK UNIFIED IDEOGRAPH
+ {0xA5D8, 0x76EE}, //685 #CJK UNIFIED IDEOGRAPH
+ {0xA5D9, 0x77DB}, //686 #CJK UNIFIED IDEOGRAPH
+ {0xA5DA, 0x77E2}, //687 #CJK UNIFIED IDEOGRAPH
+ {0xA5DB, 0x77F3}, //688 #CJK UNIFIED IDEOGRAPH
+ {0xA5DC, 0x793A}, //689 #CJK UNIFIED IDEOGRAPH
+ {0xA5DD, 0x79BE}, //690 #CJK UNIFIED IDEOGRAPH
+ {0xA5DE, 0x7A74}, //691 #CJK UNIFIED IDEOGRAPH
+ {0xA5DF, 0x7ACB}, //692 #CJK UNIFIED IDEOGRAPH
+ {0xA5E0, 0x4E1E}, //693 #CJK UNIFIED IDEOGRAPH
+ {0xA5E1, 0x4E1F}, //694 #CJK UNIFIED IDEOGRAPH
+ {0xA5E2, 0x4E52}, //695 #CJK UNIFIED IDEOGRAPH
+ {0xA5E3, 0x4E53}, //696 #CJK UNIFIED IDEOGRAPH
+ {0xA5E4, 0x4E69}, //697 #CJK UNIFIED IDEOGRAPH
+ {0xA5E5, 0x4E99}, //698 #CJK UNIFIED IDEOGRAPH
+ {0xA5E6, 0x4EA4}, //699 #CJK UNIFIED IDEOGRAPH
+ {0xA5E7, 0x4EA6}, //700 #CJK UNIFIED IDEOGRAPH
+ {0xA5E8, 0x4EA5}, //701 #CJK UNIFIED IDEOGRAPH
+ {0xA5E9, 0x4EFF}, //702 #CJK UNIFIED IDEOGRAPH
+ {0xA5EA, 0x4F09}, //703 #CJK UNIFIED IDEOGRAPH
+ {0xA5EB, 0x4F19}, //704 #CJK UNIFIED IDEOGRAPH
+ {0xA5EC, 0x4F0A}, //705 #CJK UNIFIED IDEOGRAPH
+ {0xA5ED, 0x4F15}, //706 #CJK UNIFIED IDEOGRAPH
+ {0xA5EE, 0x4F0D}, //707 #CJK UNIFIED IDEOGRAPH
+ {0xA5EF, 0x4F10}, //708 #CJK UNIFIED IDEOGRAPH
+ {0xA5F0, 0x4F11}, //709 #CJK UNIFIED IDEOGRAPH
+ {0xA5F1, 0x4F0F}, //710 #CJK UNIFIED IDEOGRAPH
+ {0xA5F2, 0x4EF2}, //711 #CJK UNIFIED IDEOGRAPH
+ {0xA5F3, 0x4EF6}, //712 #CJK UNIFIED IDEOGRAPH
+ {0xA5F4, 0x4EFB}, //713 #CJK UNIFIED IDEOGRAPH
+ {0xA5F5, 0x4EF0}, //714 #CJK UNIFIED IDEOGRAPH
+ {0xA5F6, 0x4EF3}, //715 #CJK UNIFIED IDEOGRAPH
+ {0xA5F7, 0x4EFD}, //716 #CJK UNIFIED IDEOGRAPH
+ {0xA5F8, 0x4F01}, //717 #CJK UNIFIED IDEOGRAPH
+ {0xA5F9, 0x4F0B}, //718 #CJK UNIFIED IDEOGRAPH
+ {0xA5FA, 0x5149}, //719 #CJK UNIFIED IDEOGRAPH
+ {0xA5FB, 0x5147}, //720 #CJK UNIFIED IDEOGRAPH
+ {0xA5FC, 0x5146}, //721 #CJK UNIFIED IDEOGRAPH
+ {0xA5FD, 0x5148}, //722 #CJK UNIFIED IDEOGRAPH
+ {0xA5FE, 0x5168}, //723 #CJK UNIFIED IDEOGRAPH
+ {0xA640, 0x5171}, //724 #CJK UNIFIED IDEOGRAPH
+ {0xA641, 0x518D}, //725 #CJK UNIFIED IDEOGRAPH
+ {0xA642, 0x51B0}, //726 #CJK UNIFIED IDEOGRAPH
+ {0xA643, 0x5217}, //727 #CJK UNIFIED IDEOGRAPH
+ {0xA644, 0x5211}, //728 #CJK UNIFIED IDEOGRAPH
+ {0xA645, 0x5212}, //729 #CJK UNIFIED IDEOGRAPH
+ {0xA646, 0x520E}, //730 #CJK UNIFIED IDEOGRAPH
+ {0xA647, 0x5216}, //731 #CJK UNIFIED IDEOGRAPH
+ {0xA648, 0x52A3}, //732 #CJK UNIFIED IDEOGRAPH
+ {0xA649, 0x5308}, //733 #CJK UNIFIED IDEOGRAPH
+ {0xA64A, 0x5321}, //734 #CJK UNIFIED IDEOGRAPH
+ {0xA64B, 0x5320}, //735 #CJK UNIFIED IDEOGRAPH
+ {0xA64C, 0x5370}, //736 #CJK UNIFIED IDEOGRAPH
+ {0xA64D, 0x5371}, //737 #CJK UNIFIED IDEOGRAPH
+ {0xA64E, 0x5409}, //738 #CJK UNIFIED IDEOGRAPH
+ {0xA64F, 0x540F}, //739 #CJK UNIFIED IDEOGRAPH
+ {0xA650, 0x540C}, //740 #CJK UNIFIED IDEOGRAPH
+ {0xA651, 0x540A}, //741 #CJK UNIFIED IDEOGRAPH
+ {0xA652, 0x5410}, //742 #CJK UNIFIED IDEOGRAPH
+ {0xA653, 0x5401}, //743 #CJK UNIFIED IDEOGRAPH
+ {0xA654, 0x540B}, //744 #CJK UNIFIED IDEOGRAPH
+ {0xA655, 0x5404}, //745 #CJK UNIFIED IDEOGRAPH
+ {0xA656, 0x5411}, //746 #CJK UNIFIED IDEOGRAPH
+ {0xA657, 0x540D}, //747 #CJK UNIFIED IDEOGRAPH
+ {0xA658, 0x5408}, //748 #CJK UNIFIED IDEOGRAPH
+ {0xA659, 0x5403}, //749 #CJK UNIFIED IDEOGRAPH
+ {0xA65A, 0x540E}, //750 #CJK UNIFIED IDEOGRAPH
+ {0xA65B, 0x5406}, //751 #CJK UNIFIED IDEOGRAPH
+ {0xA65C, 0x5412}, //752 #CJK UNIFIED IDEOGRAPH
+ {0xA65D, 0x56E0}, //753 #CJK UNIFIED IDEOGRAPH
+ {0xA65E, 0x56DE}, //754 #CJK UNIFIED IDEOGRAPH
+ {0xA65F, 0x56DD}, //755 #CJK UNIFIED IDEOGRAPH
+ {0xA660, 0x5733}, //756 #CJK UNIFIED IDEOGRAPH
+ {0xA661, 0x5730}, //757 #CJK UNIFIED IDEOGRAPH
+ {0xA662, 0x5728}, //758 #CJK UNIFIED IDEOGRAPH
+ {0xA663, 0x572D}, //759 #CJK UNIFIED IDEOGRAPH
+ {0xA664, 0x572C}, //760 #CJK UNIFIED IDEOGRAPH
+ {0xA665, 0x572F}, //761 #CJK UNIFIED IDEOGRAPH
+ {0xA666, 0x5729}, //762 #CJK UNIFIED IDEOGRAPH
+ {0xA667, 0x5919}, //763 #CJK UNIFIED IDEOGRAPH
+ {0xA668, 0x591A}, //764 #CJK UNIFIED IDEOGRAPH
+ {0xA669, 0x5937}, //765 #CJK UNIFIED IDEOGRAPH
+ {0xA66A, 0x5938}, //766 #CJK UNIFIED IDEOGRAPH
+ {0xA66B, 0x5984}, //767 #CJK UNIFIED IDEOGRAPH
+ {0xA66C, 0x5978}, //768 #CJK UNIFIED IDEOGRAPH
+ {0xA66D, 0x5983}, //769 #CJK UNIFIED IDEOGRAPH
+ {0xA66E, 0x597D}, //770 #CJK UNIFIED IDEOGRAPH
+ {0xA66F, 0x5979}, //771 #CJK UNIFIED IDEOGRAPH
+ {0xA670, 0x5982}, //772 #CJK UNIFIED IDEOGRAPH
+ {0xA671, 0x5981}, //773 #CJK UNIFIED IDEOGRAPH
+ {0xA672, 0x5B57}, //774 #CJK UNIFIED IDEOGRAPH
+ {0xA673, 0x5B58}, //775 #CJK UNIFIED IDEOGRAPH
+ {0xA674, 0x5B87}, //776 #CJK UNIFIED IDEOGRAPH
+ {0xA675, 0x5B88}, //777 #CJK UNIFIED IDEOGRAPH
+ {0xA676, 0x5B85}, //778 #CJK UNIFIED IDEOGRAPH
+ {0xA677, 0x5B89}, //779 #CJK UNIFIED IDEOGRAPH
+ {0xA678, 0x5BFA}, //780 #CJK UNIFIED IDEOGRAPH
+ {0xA679, 0x5C16}, //781 #CJK UNIFIED IDEOGRAPH
+ {0xA67A, 0x5C79}, //782 #CJK UNIFIED IDEOGRAPH
+ {0xA67B, 0x5DDE}, //783 #CJK UNIFIED IDEOGRAPH
+ {0xA67C, 0x5E06}, //784 #CJK UNIFIED IDEOGRAPH
+ {0xA67D, 0x5E76}, //785 #CJK UNIFIED IDEOGRAPH
+ {0xA67E, 0x5E74}, //786 #CJK UNIFIED IDEOGRAPH
+ {0xA6A1, 0x5F0F}, //787 #CJK UNIFIED IDEOGRAPH
+ {0xA6A2, 0x5F1B}, //788 #CJK UNIFIED IDEOGRAPH
+ {0xA6A3, 0x5FD9}, //789 #CJK UNIFIED IDEOGRAPH
+ {0xA6A4, 0x5FD6}, //790 #CJK UNIFIED IDEOGRAPH
+ {0xA6A5, 0x620E}, //791 #CJK UNIFIED IDEOGRAPH
+ {0xA6A6, 0x620C}, //792 #CJK UNIFIED IDEOGRAPH
+ {0xA6A7, 0x620D}, //793 #CJK UNIFIED IDEOGRAPH
+ {0xA6A8, 0x6210}, //794 #CJK UNIFIED IDEOGRAPH
+ {0xA6A9, 0x6263}, //795 #CJK UNIFIED IDEOGRAPH
+ {0xA6AA, 0x625B}, //796 #CJK UNIFIED IDEOGRAPH
+ {0xA6AB, 0x6258}, //797 #CJK UNIFIED IDEOGRAPH
+ {0xA6AC, 0x6536}, //798 #CJK UNIFIED IDEOGRAPH
+ {0xA6AD, 0x65E9}, //799 #CJK UNIFIED IDEOGRAPH
+ {0xA6AE, 0x65E8}, //800 #CJK UNIFIED IDEOGRAPH
+ {0xA6AF, 0x65EC}, //801 #CJK UNIFIED IDEOGRAPH
+ {0xA6B0, 0x65ED}, //802 #CJK UNIFIED IDEOGRAPH
+ {0xA6B1, 0x66F2}, //803 #CJK UNIFIED IDEOGRAPH
+ {0xA6B2, 0x66F3}, //804 #CJK UNIFIED IDEOGRAPH
+ {0xA6B3, 0x6709}, //805 #CJK UNIFIED IDEOGRAPH
+ {0xA6B4, 0x673D}, //806 #CJK UNIFIED IDEOGRAPH
+ {0xA6B5, 0x6734}, //807 #CJK UNIFIED IDEOGRAPH
+ {0xA6B6, 0x6731}, //808 #CJK UNIFIED IDEOGRAPH
+ {0xA6B7, 0x6735}, //809 #CJK UNIFIED IDEOGRAPH
+ {0xA6B8, 0x6B21}, //810 #CJK UNIFIED IDEOGRAPH
+ {0xA6B9, 0x6B64}, //811 #CJK UNIFIED IDEOGRAPH
+ {0xA6BA, 0x6B7B}, //812 #CJK UNIFIED IDEOGRAPH
+ {0xA6BB, 0x6C16}, //813 #CJK UNIFIED IDEOGRAPH
+ {0xA6BC, 0x6C5D}, //814 #CJK UNIFIED IDEOGRAPH
+ {0xA6BD, 0x6C57}, //815 #CJK UNIFIED IDEOGRAPH
+ {0xA6BE, 0x6C59}, //816 #CJK UNIFIED IDEOGRAPH
+ {0xA6BF, 0x6C5F}, //817 #CJK UNIFIED IDEOGRAPH
+ {0xA6C0, 0x6C60}, //818 #CJK UNIFIED IDEOGRAPH
+ {0xA6C1, 0x6C50}, //819 #CJK UNIFIED IDEOGRAPH
+ {0xA6C2, 0x6C55}, //820 #CJK UNIFIED IDEOGRAPH
+ {0xA6C3, 0x6C61}, //821 #CJK UNIFIED IDEOGRAPH
+ {0xA6C4, 0x6C5B}, //822 #CJK UNIFIED IDEOGRAPH
+ {0xA6C5, 0x6C4D}, //823 #CJK UNIFIED IDEOGRAPH
+ {0xA6C6, 0x6C4E}, //824 #CJK UNIFIED IDEOGRAPH
+ {0xA6C7, 0x7070}, //825 #CJK UNIFIED IDEOGRAPH
+ {0xA6C8, 0x725F}, //826 #CJK UNIFIED IDEOGRAPH
+ {0xA6C9, 0x725D}, //827 #CJK UNIFIED IDEOGRAPH
+ {0xA6CA, 0x767E}, //828 #CJK UNIFIED IDEOGRAPH
+ {0xA6CB, 0x7AF9}, //829 #CJK UNIFIED IDEOGRAPH
+ {0xA6CC, 0x7C73}, //830 #CJK UNIFIED IDEOGRAPH
+ {0xA6CD, 0x7CF8}, //831 #CJK UNIFIED IDEOGRAPH
+ {0xA6CE, 0x7F36}, //832 #CJK UNIFIED IDEOGRAPH
+ {0xA6CF, 0x7F8A}, //833 #CJK UNIFIED IDEOGRAPH
+ {0xA6D0, 0x7FBD}, //834 #CJK UNIFIED IDEOGRAPH
+ {0xA6D1, 0x8001}, //835 #CJK UNIFIED IDEOGRAPH
+ {0xA6D2, 0x8003}, //836 #CJK UNIFIED IDEOGRAPH
+ {0xA6D3, 0x800C}, //837 #CJK UNIFIED IDEOGRAPH
+ {0xA6D4, 0x8012}, //838 #CJK UNIFIED IDEOGRAPH
+ {0xA6D5, 0x8033}, //839 #CJK UNIFIED IDEOGRAPH
+ {0xA6D6, 0x807F}, //840 #CJK UNIFIED IDEOGRAPH
+ {0xA6D7, 0x8089}, //841 #CJK UNIFIED IDEOGRAPH
+ {0xA6D8, 0x808B}, //842 #CJK UNIFIED IDEOGRAPH
+ {0xA6D9, 0x808C}, //843 #CJK UNIFIED IDEOGRAPH
+ {0xA6DA, 0x81E3}, //844 #CJK UNIFIED IDEOGRAPH
+ {0xA6DB, 0x81EA}, //845 #CJK UNIFIED IDEOGRAPH
+ {0xA6DC, 0x81F3}, //846 #CJK UNIFIED IDEOGRAPH
+ {0xA6DD, 0x81FC}, //847 #CJK UNIFIED IDEOGRAPH
+ {0xA6DE, 0x820C}, //848 #CJK UNIFIED IDEOGRAPH
+ {0xA6DF, 0x821B}, //849 #CJK UNIFIED IDEOGRAPH
+ {0xA6E0, 0x821F}, //850 #CJK UNIFIED IDEOGRAPH
+ {0xA6E1, 0x826E}, //851 #CJK UNIFIED IDEOGRAPH
+ {0xA6E2, 0x8272}, //852 #CJK UNIFIED IDEOGRAPH
+ {0xA6E3, 0x827E}, //853 #CJK UNIFIED IDEOGRAPH
+ {0xA6E4, 0x866B}, //854 #CJK UNIFIED IDEOGRAPH
+ {0xA6E5, 0x8840}, //855 #CJK UNIFIED IDEOGRAPH
+ {0xA6E6, 0x884C}, //856 #CJK UNIFIED IDEOGRAPH
+ {0xA6E7, 0x8863}, //857 #CJK UNIFIED IDEOGRAPH
+ {0xA6E8, 0x897F}, //858 #CJK UNIFIED IDEOGRAPH
+ {0xA6E9, 0x9621}, //859 #CJK UNIFIED IDEOGRAPH
+ {0xA6EA, 0x4E32}, //860 #CJK UNIFIED IDEOGRAPH
+ {0xA6EB, 0x4EA8}, //861 #CJK UNIFIED IDEOGRAPH
+ {0xA6EC, 0x4F4D}, //862 #CJK UNIFIED IDEOGRAPH
+ {0xA6ED, 0x4F4F}, //863 #CJK UNIFIED IDEOGRAPH
+ {0xA6EE, 0x4F47}, //864 #CJK UNIFIED IDEOGRAPH
+ {0xA6EF, 0x4F57}, //865 #CJK UNIFIED IDEOGRAPH
+ {0xA6F0, 0x4F5E}, //866 #CJK UNIFIED IDEOGRAPH
+ {0xA6F1, 0x4F34}, //867 #CJK UNIFIED IDEOGRAPH
+ {0xA6F2, 0x4F5B}, //868 #CJK UNIFIED IDEOGRAPH
+ {0xA6F3, 0x4F55}, //869 #CJK UNIFIED IDEOGRAPH
+ {0xA6F4, 0x4F30}, //870 #CJK UNIFIED IDEOGRAPH
+ {0xA6F5, 0x4F50}, //871 #CJK UNIFIED IDEOGRAPH
+ {0xA6F6, 0x4F51}, //872 #CJK UNIFIED IDEOGRAPH
+ {0xA6F7, 0x4F3D}, //873 #CJK UNIFIED IDEOGRAPH
+ {0xA6F8, 0x4F3A}, //874 #CJK UNIFIED IDEOGRAPH
+ {0xA6F9, 0x4F38}, //875 #CJK UNIFIED IDEOGRAPH
+ {0xA6FA, 0x4F43}, //876 #CJK UNIFIED IDEOGRAPH
+ {0xA6FB, 0x4F54}, //877 #CJK UNIFIED IDEOGRAPH
+ {0xA6FC, 0x4F3C}, //878 #CJK UNIFIED IDEOGRAPH
+ {0xA6FD, 0x4F46}, //879 #CJK UNIFIED IDEOGRAPH
+ {0xA6FE, 0x4F63}, //880 #CJK UNIFIED IDEOGRAPH
+ {0xA740, 0x4F5C}, //881 #CJK UNIFIED IDEOGRAPH
+ {0xA741, 0x4F60}, //882 #CJK UNIFIED IDEOGRAPH
+ {0xA742, 0x4F2F}, //883 #CJK UNIFIED IDEOGRAPH
+ {0xA743, 0x4F4E}, //884 #CJK UNIFIED IDEOGRAPH
+ {0xA744, 0x4F36}, //885 #CJK UNIFIED IDEOGRAPH
+ {0xA745, 0x4F59}, //886 #CJK UNIFIED IDEOGRAPH
+ {0xA746, 0x4F5D}, //887 #CJK UNIFIED IDEOGRAPH
+ {0xA747, 0x4F48}, //888 #CJK UNIFIED IDEOGRAPH
+ {0xA748, 0x4F5A}, //889 #CJK UNIFIED IDEOGRAPH
+ {0xA749, 0x514C}, //890 #CJK UNIFIED IDEOGRAPH
+ {0xA74A, 0x514B}, //891 #CJK UNIFIED IDEOGRAPH
+ {0xA74B, 0x514D}, //892 #CJK UNIFIED IDEOGRAPH
+ {0xA74C, 0x5175}, //893 #CJK UNIFIED IDEOGRAPH
+ {0xA74D, 0x51B6}, //894 #CJK UNIFIED IDEOGRAPH
+ {0xA74E, 0x51B7}, //895 #CJK UNIFIED IDEOGRAPH
+ {0xA74F, 0x5225}, //896 #CJK UNIFIED IDEOGRAPH
+ {0xA750, 0x5224}, //897 #CJK UNIFIED IDEOGRAPH
+ {0xA751, 0x5229}, //898 #CJK UNIFIED IDEOGRAPH
+ {0xA752, 0x522A}, //899 #CJK UNIFIED IDEOGRAPH
+ {0xA753, 0x5228}, //900 #CJK UNIFIED IDEOGRAPH
+ {0xA754, 0x52AB}, //901 #CJK UNIFIED IDEOGRAPH
+ {0xA755, 0x52A9}, //902 #CJK UNIFIED IDEOGRAPH
+ {0xA756, 0x52AA}, //903 #CJK UNIFIED IDEOGRAPH
+ {0xA757, 0x52AC}, //904 #CJK UNIFIED IDEOGRAPH
+ {0xA758, 0x5323}, //905 #CJK UNIFIED IDEOGRAPH
+ {0xA759, 0x5373}, //906 #CJK UNIFIED IDEOGRAPH
+ {0xA75A, 0x5375}, //907 #CJK UNIFIED IDEOGRAPH
+ {0xA75B, 0x541D}, //908 #CJK UNIFIED IDEOGRAPH
+ {0xA75C, 0x542D}, //909 #CJK UNIFIED IDEOGRAPH
+ {0xA75D, 0x541E}, //910 #CJK UNIFIED IDEOGRAPH
+ {0xA75E, 0x543E}, //911 #CJK UNIFIED IDEOGRAPH
+ {0xA75F, 0x5426}, //912 #CJK UNIFIED IDEOGRAPH
+ {0xA760, 0x544E}, //913 #CJK UNIFIED IDEOGRAPH
+ {0xA761, 0x5427}, //914 #CJK UNIFIED IDEOGRAPH
+ {0xA762, 0x5446}, //915 #CJK UNIFIED IDEOGRAPH
+ {0xA763, 0x5443}, //916 #CJK UNIFIED IDEOGRAPH
+ {0xA764, 0x5433}, //917 #CJK UNIFIED IDEOGRAPH
+ {0xA765, 0x5448}, //918 #CJK UNIFIED IDEOGRAPH
+ {0xA766, 0x5442}, //919 #CJK UNIFIED IDEOGRAPH
+ {0xA767, 0x541B}, //920 #CJK UNIFIED IDEOGRAPH
+ {0xA768, 0x5429}, //921 #CJK UNIFIED IDEOGRAPH
+ {0xA769, 0x544A}, //922 #CJK UNIFIED IDEOGRAPH
+ {0xA76A, 0x5439}, //923 #CJK UNIFIED IDEOGRAPH
+ {0xA76B, 0x543B}, //924 #CJK UNIFIED IDEOGRAPH
+ {0xA76C, 0x5438}, //925 #CJK UNIFIED IDEOGRAPH
+ {0xA76D, 0x542E}, //926 #CJK UNIFIED IDEOGRAPH
+ {0xA76E, 0x5435}, //927 #CJK UNIFIED IDEOGRAPH
+ {0xA76F, 0x5436}, //928 #CJK UNIFIED IDEOGRAPH
+ {0xA770, 0x5420}, //929 #CJK UNIFIED IDEOGRAPH
+ {0xA771, 0x543C}, //930 #CJK UNIFIED IDEOGRAPH
+ {0xA772, 0x5440}, //931 #CJK UNIFIED IDEOGRAPH
+ {0xA773, 0x5431}, //932 #CJK UNIFIED IDEOGRAPH
+ {0xA774, 0x542B}, //933 #CJK UNIFIED IDEOGRAPH
+ {0xA775, 0x541F}, //934 #CJK UNIFIED IDEOGRAPH
+ {0xA776, 0x542C}, //935 #CJK UNIFIED IDEOGRAPH
+ {0xA777, 0x56EA}, //936 #CJK UNIFIED IDEOGRAPH
+ {0xA778, 0x56F0}, //937 #CJK UNIFIED IDEOGRAPH
+ {0xA779, 0x56E4}, //938 #CJK UNIFIED IDEOGRAPH
+ {0xA77A, 0x56EB}, //939 #CJK UNIFIED IDEOGRAPH
+ {0xA77B, 0x574A}, //940 #CJK UNIFIED IDEOGRAPH
+ {0xA77C, 0x5751}, //941 #CJK UNIFIED IDEOGRAPH
+ {0xA77D, 0x5740}, //942 #CJK UNIFIED IDEOGRAPH
+ {0xA77E, 0x574D}, //943 #CJK UNIFIED IDEOGRAPH
+ {0xA7A1, 0x5747}, //944 #CJK UNIFIED IDEOGRAPH
+ {0xA7A2, 0x574E}, //945 #CJK UNIFIED IDEOGRAPH
+ {0xA7A3, 0x573E}, //946 #CJK UNIFIED IDEOGRAPH
+ {0xA7A4, 0x5750}, //947 #CJK UNIFIED IDEOGRAPH
+ {0xA7A5, 0x574F}, //948 #CJK UNIFIED IDEOGRAPH
+ {0xA7A6, 0x573B}, //949 #CJK UNIFIED IDEOGRAPH
+ {0xA7A7, 0x58EF}, //950 #CJK UNIFIED IDEOGRAPH
+ {0xA7A8, 0x593E}, //951 #CJK UNIFIED IDEOGRAPH
+ {0xA7A9, 0x599D}, //952 #CJK UNIFIED IDEOGRAPH
+ {0xA7AA, 0x5992}, //953 #CJK UNIFIED IDEOGRAPH
+ {0xA7AB, 0x59A8}, //954 #CJK UNIFIED IDEOGRAPH
+ {0xA7AC, 0x599E}, //955 #CJK UNIFIED IDEOGRAPH
+ {0xA7AD, 0x59A3}, //956 #CJK UNIFIED IDEOGRAPH
+ {0xA7AE, 0x5999}, //957 #CJK UNIFIED IDEOGRAPH
+ {0xA7AF, 0x5996}, //958 #CJK UNIFIED IDEOGRAPH
+ {0xA7B0, 0x598D}, //959 #CJK UNIFIED IDEOGRAPH
+ {0xA7B1, 0x59A4}, //960 #CJK UNIFIED IDEOGRAPH
+ {0xA7B2, 0x5993}, //961 #CJK UNIFIED IDEOGRAPH
+ {0xA7B3, 0x598A}, //962 #CJK UNIFIED IDEOGRAPH
+ {0xA7B4, 0x59A5}, //963 #CJK UNIFIED IDEOGRAPH
+ {0xA7B5, 0x5B5D}, //964 #CJK UNIFIED IDEOGRAPH
+ {0xA7B6, 0x5B5C}, //965 #CJK UNIFIED IDEOGRAPH
+ {0xA7B7, 0x5B5A}, //966 #CJK UNIFIED IDEOGRAPH
+ {0xA7B8, 0x5B5B}, //967 #CJK UNIFIED IDEOGRAPH
+ {0xA7B9, 0x5B8C}, //968 #CJK UNIFIED IDEOGRAPH
+ {0xA7BA, 0x5B8B}, //969 #CJK UNIFIED IDEOGRAPH
+ {0xA7BB, 0x5B8F}, //970 #CJK UNIFIED IDEOGRAPH
+ {0xA7BC, 0x5C2C}, //971 #CJK UNIFIED IDEOGRAPH
+ {0xA7BD, 0x5C40}, //972 #CJK UNIFIED IDEOGRAPH
+ {0xA7BE, 0x5C41}, //973 #CJK UNIFIED IDEOGRAPH
+ {0xA7BF, 0x5C3F}, //974 #CJK UNIFIED IDEOGRAPH
+ {0xA7C0, 0x5C3E}, //975 #CJK UNIFIED IDEOGRAPH
+ {0xA7C1, 0x5C90}, //976 #CJK UNIFIED IDEOGRAPH
+ {0xA7C2, 0x5C91}, //977 #CJK UNIFIED IDEOGRAPH
+ {0xA7C3, 0x5C94}, //978 #CJK UNIFIED IDEOGRAPH
+ {0xA7C4, 0x5C8C}, //979 #CJK UNIFIED IDEOGRAPH
+ {0xA7C5, 0x5DEB}, //980 #CJK UNIFIED IDEOGRAPH
+ {0xA7C6, 0x5E0C}, //981 #CJK UNIFIED IDEOGRAPH
+ {0xA7C7, 0x5E8F}, //982 #CJK UNIFIED IDEOGRAPH
+ {0xA7C8, 0x5E87}, //983 #CJK UNIFIED IDEOGRAPH
+ {0xA7C9, 0x5E8A}, //984 #CJK UNIFIED IDEOGRAPH
+ {0xA7CA, 0x5EF7}, //985 #CJK UNIFIED IDEOGRAPH
+ {0xA7CB, 0x5F04}, //986 #CJK UNIFIED IDEOGRAPH
+ {0xA7CC, 0x5F1F}, //987 #CJK UNIFIED IDEOGRAPH
+ {0xA7CD, 0x5F64}, //988 #CJK UNIFIED IDEOGRAPH
+ {0xA7CE, 0x5F62}, //989 #CJK UNIFIED IDEOGRAPH
+ {0xA7CF, 0x5F77}, //990 #CJK UNIFIED IDEOGRAPH
+ {0xA7D0, 0x5F79}, //991 #CJK UNIFIED IDEOGRAPH
+ {0xA7D1, 0x5FD8}, //992 #CJK UNIFIED IDEOGRAPH
+ {0xA7D2, 0x5FCC}, //993 #CJK UNIFIED IDEOGRAPH
+ {0xA7D3, 0x5FD7}, //994 #CJK UNIFIED IDEOGRAPH
+ {0xA7D4, 0x5FCD}, //995 #CJK UNIFIED IDEOGRAPH
+ {0xA7D5, 0x5FF1}, //996 #CJK UNIFIED IDEOGRAPH
+ {0xA7D6, 0x5FEB}, //997 #CJK UNIFIED IDEOGRAPH
+ {0xA7D7, 0x5FF8}, //998 #CJK UNIFIED IDEOGRAPH
+ {0xA7D8, 0x5FEA}, //999 #CJK UNIFIED IDEOGRAPH
+ {0xA7D9, 0x6212}, //1000 #CJK UNIFIED IDEOGRAPH
+ {0xA7DA, 0x6211}, //1001 #CJK UNIFIED IDEOGRAPH
+ {0xA7DB, 0x6284}, //1002 #CJK UNIFIED IDEOGRAPH
+ {0xA7DC, 0x6297}, //1003 #CJK UNIFIED IDEOGRAPH
+ {0xA7DD, 0x6296}, //1004 #CJK UNIFIED IDEOGRAPH
+ {0xA7DE, 0x6280}, //1005 #CJK UNIFIED IDEOGRAPH
+ {0xA7DF, 0x6276}, //1006 #CJK UNIFIED IDEOGRAPH
+ {0xA7E0, 0x6289}, //1007 #CJK UNIFIED IDEOGRAPH
+ {0xA7E1, 0x626D}, //1008 #CJK UNIFIED IDEOGRAPH
+ {0xA7E2, 0x628A}, //1009 #CJK UNIFIED IDEOGRAPH
+ {0xA7E3, 0x627C}, //1010 #CJK UNIFIED IDEOGRAPH
+ {0xA7E4, 0x627E}, //1011 #CJK UNIFIED IDEOGRAPH
+ {0xA7E5, 0x6279}, //1012 #CJK UNIFIED IDEOGRAPH
+ {0xA7E6, 0x6273}, //1013 #CJK UNIFIED IDEOGRAPH
+ {0xA7E7, 0x6292}, //1014 #CJK UNIFIED IDEOGRAPH
+ {0xA7E8, 0x626F}, //1015 #CJK UNIFIED IDEOGRAPH
+ {0xA7E9, 0x6298}, //1016 #CJK UNIFIED IDEOGRAPH
+ {0xA7EA, 0x626E}, //1017 #CJK UNIFIED IDEOGRAPH
+ {0xA7EB, 0x6295}, //1018 #CJK UNIFIED IDEOGRAPH
+ {0xA7EC, 0x6293}, //1019 #CJK UNIFIED IDEOGRAPH
+ {0xA7ED, 0x6291}, //1020 #CJK UNIFIED IDEOGRAPH
+ {0xA7EE, 0x6286}, //1021 #CJK UNIFIED IDEOGRAPH
+ {0xA7EF, 0x6539}, //1022 #CJK UNIFIED IDEOGRAPH
+ {0xA7F0, 0x653B}, //1023 #CJK UNIFIED IDEOGRAPH
+ {0xA7F1, 0x6538}, //1024 #CJK UNIFIED IDEOGRAPH
+ {0xA7F2, 0x65F1}, //1025 #CJK UNIFIED IDEOGRAPH
+ {0xA7F3, 0x66F4}, //1026 #CJK UNIFIED IDEOGRAPH
+ {0xA7F4, 0x675F}, //1027 #CJK UNIFIED IDEOGRAPH
+ {0xA7F5, 0x674E}, //1028 #CJK UNIFIED IDEOGRAPH
+ {0xA7F6, 0x674F}, //1029 #CJK UNIFIED IDEOGRAPH
+ {0xA7F7, 0x6750}, //1030 #CJK UNIFIED IDEOGRAPH
+ {0xA7F8, 0x6751}, //1031 #CJK UNIFIED IDEOGRAPH
+ {0xA7F9, 0x675C}, //1032 #CJK UNIFIED IDEOGRAPH
+ {0xA7FA, 0x6756}, //1033 #CJK UNIFIED IDEOGRAPH
+ {0xA7FB, 0x675E}, //1034 #CJK UNIFIED IDEOGRAPH
+ {0xA7FC, 0x6749}, //1035 #CJK UNIFIED IDEOGRAPH
+ {0xA7FD, 0x6746}, //1036 #CJK UNIFIED IDEOGRAPH
+ {0xA7FE, 0x6760}, //1037 #CJK UNIFIED IDEOGRAPH
+ {0xA840, 0x6753}, //1038 #CJK UNIFIED IDEOGRAPH
+ {0xA841, 0x6757}, //1039 #CJK UNIFIED IDEOGRAPH
+ {0xA842, 0x6B65}, //1040 #CJK UNIFIED IDEOGRAPH
+ {0xA843, 0x6BCF}, //1041 #CJK UNIFIED IDEOGRAPH
+ {0xA844, 0x6C42}, //1042 #CJK UNIFIED IDEOGRAPH
+ {0xA845, 0x6C5E}, //1043 #CJK UNIFIED IDEOGRAPH
+ {0xA846, 0x6C99}, //1044 #CJK UNIFIED IDEOGRAPH
+ {0xA847, 0x6C81}, //1045 #CJK UNIFIED IDEOGRAPH
+ {0xA848, 0x6C88}, //1046 #CJK UNIFIED IDEOGRAPH
+ {0xA849, 0x6C89}, //1047 #CJK UNIFIED IDEOGRAPH
+ {0xA84A, 0x6C85}, //1048 #CJK UNIFIED IDEOGRAPH
+ {0xA84B, 0x6C9B}, //1049 #CJK UNIFIED IDEOGRAPH
+ {0xA84C, 0x6C6A}, //1050 #CJK UNIFIED IDEOGRAPH
+ {0xA84D, 0x6C7A}, //1051 #CJK UNIFIED IDEOGRAPH
+ {0xA84E, 0x6C90}, //1052 #CJK UNIFIED IDEOGRAPH
+ {0xA84F, 0x6C70}, //1053 #CJK UNIFIED IDEOGRAPH
+ {0xA850, 0x6C8C}, //1054 #CJK UNIFIED IDEOGRAPH
+ {0xA851, 0x6C68}, //1055 #CJK UNIFIED IDEOGRAPH
+ {0xA852, 0x6C96}, //1056 #CJK UNIFIED IDEOGRAPH
+ {0xA853, 0x6C92}, //1057 #CJK UNIFIED IDEOGRAPH
+ {0xA854, 0x6C7D}, //1058 #CJK UNIFIED IDEOGRAPH
+ {0xA855, 0x6C83}, //1059 #CJK UNIFIED IDEOGRAPH
+ {0xA856, 0x6C72}, //1060 #CJK UNIFIED IDEOGRAPH
+ {0xA857, 0x6C7E}, //1061 #CJK UNIFIED IDEOGRAPH
+ {0xA858, 0x6C74}, //1062 #CJK UNIFIED IDEOGRAPH
+ {0xA859, 0x6C86}, //1063 #CJK UNIFIED IDEOGRAPH
+ {0xA85A, 0x6C76}, //1064 #CJK UNIFIED IDEOGRAPH
+ {0xA85B, 0x6C8D}, //1065 #CJK UNIFIED IDEOGRAPH
+ {0xA85C, 0x6C94}, //1066 #CJK UNIFIED IDEOGRAPH
+ {0xA85D, 0x6C98}, //1067 #CJK UNIFIED IDEOGRAPH
+ {0xA85E, 0x6C82}, //1068 #CJK UNIFIED IDEOGRAPH
+ {0xA85F, 0x7076}, //1069 #CJK UNIFIED IDEOGRAPH
+ {0xA860, 0x707C}, //1070 #CJK UNIFIED IDEOGRAPH
+ {0xA861, 0x707D}, //1071 #CJK UNIFIED IDEOGRAPH
+ {0xA862, 0x7078}, //1072 #CJK UNIFIED IDEOGRAPH
+ {0xA863, 0x7262}, //1073 #CJK UNIFIED IDEOGRAPH
+ {0xA864, 0x7261}, //1074 #CJK UNIFIED IDEOGRAPH
+ {0xA865, 0x7260}, //1075 #CJK UNIFIED IDEOGRAPH
+ {0xA866, 0x72C4}, //1076 #CJK UNIFIED IDEOGRAPH
+ {0xA867, 0x72C2}, //1077 #CJK UNIFIED IDEOGRAPH
+ {0xA868, 0x7396}, //1078 #CJK UNIFIED IDEOGRAPH
+ {0xA869, 0x752C}, //1079 #CJK UNIFIED IDEOGRAPH
+ {0xA86A, 0x752B}, //1080 #CJK UNIFIED IDEOGRAPH
+ {0xA86B, 0x7537}, //1081 #CJK UNIFIED IDEOGRAPH
+ {0xA86C, 0x7538}, //1082 #CJK UNIFIED IDEOGRAPH
+ {0xA86D, 0x7682}, //1083 #CJK UNIFIED IDEOGRAPH
+ {0xA86E, 0x76EF}, //1084 #CJK UNIFIED IDEOGRAPH
+ {0xA86F, 0x77E3}, //1085 #CJK UNIFIED IDEOGRAPH
+ {0xA870, 0x79C1}, //1086 #CJK UNIFIED IDEOGRAPH
+ {0xA871, 0x79C0}, //1087 #CJK UNIFIED IDEOGRAPH
+ {0xA872, 0x79BF}, //1088 #CJK UNIFIED IDEOGRAPH
+ {0xA873, 0x7A76}, //1089 #CJK UNIFIED IDEOGRAPH
+ {0xA874, 0x7CFB}, //1090 #CJK UNIFIED IDEOGRAPH
+ {0xA875, 0x7F55}, //1091 #CJK UNIFIED IDEOGRAPH
+ {0xA876, 0x8096}, //1092 #CJK UNIFIED IDEOGRAPH
+ {0xA877, 0x8093}, //1093 #CJK UNIFIED IDEOGRAPH
+ {0xA878, 0x809D}, //1094 #CJK UNIFIED IDEOGRAPH
+ {0xA879, 0x8098}, //1095 #CJK UNIFIED IDEOGRAPH
+ {0xA87A, 0x809B}, //1096 #CJK UNIFIED IDEOGRAPH
+ {0xA87B, 0x809A}, //1097 #CJK UNIFIED IDEOGRAPH
+ {0xA87C, 0x80B2}, //1098 #CJK UNIFIED IDEOGRAPH
+ {0xA87D, 0x826F}, //1099 #CJK UNIFIED IDEOGRAPH
+ {0xA87E, 0x8292}, //1100 #CJK UNIFIED IDEOGRAPH
+ {0xA8A1, 0x828B}, //1101 #CJK UNIFIED IDEOGRAPH
+ {0xA8A2, 0x828D}, //1102 #CJK UNIFIED IDEOGRAPH
+ {0xA8A3, 0x898B}, //1103 #CJK UNIFIED IDEOGRAPH
+ {0xA8A4, 0x89D2}, //1104 #CJK UNIFIED IDEOGRAPH
+ {0xA8A5, 0x8A00}, //1105 #CJK UNIFIED IDEOGRAPH
+ {0xA8A6, 0x8C37}, //1106 #CJK UNIFIED IDEOGRAPH
+ {0xA8A7, 0x8C46}, //1107 #CJK UNIFIED IDEOGRAPH
+ {0xA8A8, 0x8C55}, //1108 #CJK UNIFIED IDEOGRAPH
+ {0xA8A9, 0x8C9D}, //1109 #CJK UNIFIED IDEOGRAPH
+ {0xA8AA, 0x8D64}, //1110 #CJK UNIFIED IDEOGRAPH
+ {0xA8AB, 0x8D70}, //1111 #CJK UNIFIED IDEOGRAPH
+ {0xA8AC, 0x8DB3}, //1112 #CJK UNIFIED IDEOGRAPH
+ {0xA8AD, 0x8EAB}, //1113 #CJK UNIFIED IDEOGRAPH
+ {0xA8AE, 0x8ECA}, //1114 #CJK UNIFIED IDEOGRAPH
+ {0xA8AF, 0x8F9B}, //1115 #CJK UNIFIED IDEOGRAPH
+ {0xA8B0, 0x8FB0}, //1116 #CJK UNIFIED IDEOGRAPH
+ {0xA8B1, 0x8FC2}, //1117 #CJK UNIFIED IDEOGRAPH
+ {0xA8B2, 0x8FC6}, //1118 #CJK UNIFIED IDEOGRAPH
+ {0xA8B3, 0x8FC5}, //1119 #CJK UNIFIED IDEOGRAPH
+ {0xA8B4, 0x8FC4}, //1120 #CJK UNIFIED IDEOGRAPH
+ {0xA8B5, 0x5DE1}, //1121 #CJK UNIFIED IDEOGRAPH
+ {0xA8B6, 0x9091}, //1122 #CJK UNIFIED IDEOGRAPH
+ {0xA8B7, 0x90A2}, //1123 #CJK UNIFIED IDEOGRAPH
+ {0xA8B8, 0x90AA}, //1124 #CJK UNIFIED IDEOGRAPH
+ {0xA8B9, 0x90A6}, //1125 #CJK UNIFIED IDEOGRAPH
+ {0xA8BA, 0x90A3}, //1126 #CJK UNIFIED IDEOGRAPH
+ {0xA8BB, 0x9149}, //1127 #CJK UNIFIED IDEOGRAPH
+ {0xA8BC, 0x91C6}, //1128 #CJK UNIFIED IDEOGRAPH
+ {0xA8BD, 0x91CC}, //1129 #CJK UNIFIED IDEOGRAPH
+ {0xA8BE, 0x9632}, //1130 #CJK UNIFIED IDEOGRAPH
+ {0xA8BF, 0x962E}, //1131 #CJK UNIFIED IDEOGRAPH
+ {0xA8C0, 0x9631}, //1132 #CJK UNIFIED IDEOGRAPH
+ {0xA8C1, 0x962A}, //1133 #CJK UNIFIED IDEOGRAPH
+ {0xA8C2, 0x962C}, //1134 #CJK UNIFIED IDEOGRAPH
+ {0xA8C3, 0x4E26}, //1135 #CJK UNIFIED IDEOGRAPH
+ {0xA8C4, 0x4E56}, //1136 #CJK UNIFIED IDEOGRAPH
+ {0xA8C5, 0x4E73}, //1137 #CJK UNIFIED IDEOGRAPH
+ {0xA8C6, 0x4E8B}, //1138 #CJK UNIFIED IDEOGRAPH
+ {0xA8C7, 0x4E9B}, //1139 #CJK UNIFIED IDEOGRAPH
+ {0xA8C8, 0x4E9E}, //1140 #CJK UNIFIED IDEOGRAPH
+ {0xA8C9, 0x4EAB}, //1141 #CJK UNIFIED IDEOGRAPH
+ {0xA8CA, 0x4EAC}, //1142 #CJK UNIFIED IDEOGRAPH
+ {0xA8CB, 0x4F6F}, //1143 #CJK UNIFIED IDEOGRAPH
+ {0xA8CC, 0x4F9D}, //1144 #CJK UNIFIED IDEOGRAPH
+ {0xA8CD, 0x4F8D}, //1145 #CJK UNIFIED IDEOGRAPH
+ {0xA8CE, 0x4F73}, //1146 #CJK UNIFIED IDEOGRAPH
+ {0xA8CF, 0x4F7F}, //1147 #CJK UNIFIED IDEOGRAPH
+ {0xA8D0, 0x4F6C}, //1148 #CJK UNIFIED IDEOGRAPH
+ {0xA8D1, 0x4F9B}, //1149 #CJK UNIFIED IDEOGRAPH
+ {0xA8D2, 0x4F8B}, //1150 #CJK UNIFIED IDEOGRAPH
+ {0xA8D3, 0x4F86}, //1151 #CJK UNIFIED IDEOGRAPH
+ {0xA8D4, 0x4F83}, //1152 #CJK UNIFIED IDEOGRAPH
+ {0xA8D5, 0x4F70}, //1153 #CJK UNIFIED IDEOGRAPH
+ {0xA8D6, 0x4F75}, //1154 #CJK UNIFIED IDEOGRAPH
+ {0xA8D7, 0x4F88}, //1155 #CJK UNIFIED IDEOGRAPH
+ {0xA8D8, 0x4F69}, //1156 #CJK UNIFIED IDEOGRAPH
+ {0xA8D9, 0x4F7B}, //1157 #CJK UNIFIED IDEOGRAPH
+ {0xA8DA, 0x4F96}, //1158 #CJK UNIFIED IDEOGRAPH
+ {0xA8DB, 0x4F7E}, //1159 #CJK UNIFIED IDEOGRAPH
+ {0xA8DC, 0x4F8F}, //1160 #CJK UNIFIED IDEOGRAPH
+ {0xA8DD, 0x4F91}, //1161 #CJK UNIFIED IDEOGRAPH
+ {0xA8DE, 0x4F7A}, //1162 #CJK UNIFIED IDEOGRAPH
+ {0xA8DF, 0x5154}, //1163 #CJK UNIFIED IDEOGRAPH
+ {0xA8E0, 0x5152}, //1164 #CJK UNIFIED IDEOGRAPH
+ {0xA8E1, 0x5155}, //1165 #CJK UNIFIED IDEOGRAPH
+ {0xA8E2, 0x5169}, //1166 #CJK UNIFIED IDEOGRAPH
+ {0xA8E3, 0x5177}, //1167 #CJK UNIFIED IDEOGRAPH
+ {0xA8E4, 0x5176}, //1168 #CJK UNIFIED IDEOGRAPH
+ {0xA8E5, 0x5178}, //1169 #CJK UNIFIED IDEOGRAPH
+ {0xA8E6, 0x51BD}, //1170 #CJK UNIFIED IDEOGRAPH
+ {0xA8E7, 0x51FD}, //1171 #CJK UNIFIED IDEOGRAPH
+ {0xA8E8, 0x523B}, //1172 #CJK UNIFIED IDEOGRAPH
+ {0xA8E9, 0x5238}, //1173 #CJK UNIFIED IDEOGRAPH
+ {0xA8EA, 0x5237}, //1174 #CJK UNIFIED IDEOGRAPH
+ {0xA8EB, 0x523A}, //1175 #CJK UNIFIED IDEOGRAPH
+ {0xA8EC, 0x5230}, //1176 #CJK UNIFIED IDEOGRAPH
+ {0xA8ED, 0x522E}, //1177 #CJK UNIFIED IDEOGRAPH
+ {0xA8EE, 0x5236}, //1178 #CJK UNIFIED IDEOGRAPH
+ {0xA8EF, 0x5241}, //1179 #CJK UNIFIED IDEOGRAPH
+ {0xA8F0, 0x52BE}, //1180 #CJK UNIFIED IDEOGRAPH
+ {0xA8F1, 0x52BB}, //1181 #CJK UNIFIED IDEOGRAPH
+ {0xA8F2, 0x5352}, //1182 #CJK UNIFIED IDEOGRAPH
+ {0xA8F3, 0x5354}, //1183 #CJK UNIFIED IDEOGRAPH
+ {0xA8F4, 0x5353}, //1184 #CJK UNIFIED IDEOGRAPH
+ {0xA8F5, 0x5351}, //1185 #CJK UNIFIED IDEOGRAPH
+ {0xA8F6, 0x5366}, //1186 #CJK UNIFIED IDEOGRAPH
+ {0xA8F7, 0x5377}, //1187 #CJK UNIFIED IDEOGRAPH
+ {0xA8F8, 0x5378}, //1188 #CJK UNIFIED IDEOGRAPH
+ {0xA8F9, 0x5379}, //1189 #CJK UNIFIED IDEOGRAPH
+ {0xA8FA, 0x53D6}, //1190 #CJK UNIFIED IDEOGRAPH
+ {0xA8FB, 0x53D4}, //1191 #CJK UNIFIED IDEOGRAPH
+ {0xA8FC, 0x53D7}, //1192 #CJK UNIFIED IDEOGRAPH
+ {0xA8FD, 0x5473}, //1193 #CJK UNIFIED IDEOGRAPH
+ {0xA8FE, 0x5475}, //1194 #CJK UNIFIED IDEOGRAPH
+ {0xA940, 0x5496}, //1195 #CJK UNIFIED IDEOGRAPH
+ {0xA941, 0x5478}, //1196 #CJK UNIFIED IDEOGRAPH
+ {0xA942, 0x5495}, //1197 #CJK UNIFIED IDEOGRAPH
+ {0xA943, 0x5480}, //1198 #CJK UNIFIED IDEOGRAPH
+ {0xA944, 0x547B}, //1199 #CJK UNIFIED IDEOGRAPH
+ {0xA945, 0x5477}, //1200 #CJK UNIFIED IDEOGRAPH
+ {0xA946, 0x5484}, //1201 #CJK UNIFIED IDEOGRAPH
+ {0xA947, 0x5492}, //1202 #CJK UNIFIED IDEOGRAPH
+ {0xA948, 0x5486}, //1203 #CJK UNIFIED IDEOGRAPH
+ {0xA949, 0x547C}, //1204 #CJK UNIFIED IDEOGRAPH
+ {0xA94A, 0x5490}, //1205 #CJK UNIFIED IDEOGRAPH
+ {0xA94B, 0x5471}, //1206 #CJK UNIFIED IDEOGRAPH
+ {0xA94C, 0x5476}, //1207 #CJK UNIFIED IDEOGRAPH
+ {0xA94D, 0x548C}, //1208 #CJK UNIFIED IDEOGRAPH
+ {0xA94E, 0x549A}, //1209 #CJK UNIFIED IDEOGRAPH
+ {0xA94F, 0x5462}, //1210 #CJK UNIFIED IDEOGRAPH
+ {0xA950, 0x5468}, //1211 #CJK UNIFIED IDEOGRAPH
+ {0xA951, 0x548B}, //1212 #CJK UNIFIED IDEOGRAPH
+ {0xA952, 0x547D}, //1213 #CJK UNIFIED IDEOGRAPH
+ {0xA953, 0x548E}, //1214 #CJK UNIFIED IDEOGRAPH
+ {0xA954, 0x56FA}, //1215 #CJK UNIFIED IDEOGRAPH
+ {0xA955, 0x5783}, //1216 #CJK UNIFIED IDEOGRAPH
+ {0xA956, 0x5777}, //1217 #CJK UNIFIED IDEOGRAPH
+ {0xA957, 0x576A}, //1218 #CJK UNIFIED IDEOGRAPH
+ {0xA958, 0x5769}, //1219 #CJK UNIFIED IDEOGRAPH
+ {0xA959, 0x5761}, //1220 #CJK UNIFIED IDEOGRAPH
+ {0xA95A, 0x5766}, //1221 #CJK UNIFIED IDEOGRAPH
+ {0xA95B, 0x5764}, //1222 #CJK UNIFIED IDEOGRAPH
+ {0xA95C, 0x577C}, //1223 #CJK UNIFIED IDEOGRAPH
+ {0xA95D, 0x591C}, //1224 #CJK UNIFIED IDEOGRAPH
+ {0xA95E, 0x5949}, //1225 #CJK UNIFIED IDEOGRAPH
+ {0xA95F, 0x5947}, //1226 #CJK UNIFIED IDEOGRAPH
+ {0xA960, 0x5948}, //1227 #CJK UNIFIED IDEOGRAPH
+ {0xA961, 0x5944}, //1228 #CJK UNIFIED IDEOGRAPH
+ {0xA962, 0x5954}, //1229 #CJK UNIFIED IDEOGRAPH
+ {0xA963, 0x59BE}, //1230 #CJK UNIFIED IDEOGRAPH
+ {0xA964, 0x59BB}, //1231 #CJK UNIFIED IDEOGRAPH
+ {0xA965, 0x59D4}, //1232 #CJK UNIFIED IDEOGRAPH
+ {0xA966, 0x59B9}, //1233 #CJK UNIFIED IDEOGRAPH
+ {0xA967, 0x59AE}, //1234 #CJK UNIFIED IDEOGRAPH
+ {0xA968, 0x59D1}, //1235 #CJK UNIFIED IDEOGRAPH
+ {0xA969, 0x59C6}, //1236 #CJK UNIFIED IDEOGRAPH
+ {0xA96A, 0x59D0}, //1237 #CJK UNIFIED IDEOGRAPH
+ {0xA96B, 0x59CD}, //1238 #CJK UNIFIED IDEOGRAPH
+ {0xA96C, 0x59CB}, //1239 #CJK UNIFIED IDEOGRAPH
+ {0xA96D, 0x59D3}, //1240 #CJK UNIFIED IDEOGRAPH
+ {0xA96E, 0x59CA}, //1241 #CJK UNIFIED IDEOGRAPH
+ {0xA96F, 0x59AF}, //1242 #CJK UNIFIED IDEOGRAPH
+ {0xA970, 0x59B3}, //1243 #CJK UNIFIED IDEOGRAPH
+ {0xA971, 0x59D2}, //1244 #CJK UNIFIED IDEOGRAPH
+ {0xA972, 0x59C5}, //1245 #CJK UNIFIED IDEOGRAPH
+ {0xA973, 0x5B5F}, //1246 #CJK UNIFIED IDEOGRAPH
+ {0xA974, 0x5B64}, //1247 #CJK UNIFIED IDEOGRAPH
+ {0xA975, 0x5B63}, //1248 #CJK UNIFIED IDEOGRAPH
+ {0xA976, 0x5B97}, //1249 #CJK UNIFIED IDEOGRAPH
+ {0xA977, 0x5B9A}, //1250 #CJK UNIFIED IDEOGRAPH
+ {0xA978, 0x5B98}, //1251 #CJK UNIFIED IDEOGRAPH
+ {0xA979, 0x5B9C}, //1252 #CJK UNIFIED IDEOGRAPH
+ {0xA97A, 0x5B99}, //1253 #CJK UNIFIED IDEOGRAPH
+ {0xA97B, 0x5B9B}, //1254 #CJK UNIFIED IDEOGRAPH
+ {0xA97C, 0x5C1A}, //1255 #CJK UNIFIED IDEOGRAPH
+ {0xA97D, 0x5C48}, //1256 #CJK UNIFIED IDEOGRAPH
+ {0xA97E, 0x5C45}, //1257 #CJK UNIFIED IDEOGRAPH
+ {0xA9A1, 0x5C46}, //1258 #CJK UNIFIED IDEOGRAPH
+ {0xA9A2, 0x5CB7}, //1259 #CJK UNIFIED IDEOGRAPH
+ {0xA9A3, 0x5CA1}, //1260 #CJK UNIFIED IDEOGRAPH
+ {0xA9A4, 0x5CB8}, //1261 #CJK UNIFIED IDEOGRAPH
+ {0xA9A5, 0x5CA9}, //1262 #CJK UNIFIED IDEOGRAPH
+ {0xA9A6, 0x5CAB}, //1263 #CJK UNIFIED IDEOGRAPH
+ {0xA9A7, 0x5CB1}, //1264 #CJK UNIFIED IDEOGRAPH
+ {0xA9A8, 0x5CB3}, //1265 #CJK UNIFIED IDEOGRAPH
+ {0xA9A9, 0x5E18}, //1266 #CJK UNIFIED IDEOGRAPH
+ {0xA9AA, 0x5E1A}, //1267 #CJK UNIFIED IDEOGRAPH
+ {0xA9AB, 0x5E16}, //1268 #CJK UNIFIED IDEOGRAPH
+ {0xA9AC, 0x5E15}, //1269 #CJK UNIFIED IDEOGRAPH
+ {0xA9AD, 0x5E1B}, //1270 #CJK UNIFIED IDEOGRAPH
+ {0xA9AE, 0x5E11}, //1271 #CJK UNIFIED IDEOGRAPH
+ {0xA9AF, 0x5E78}, //1272 #CJK UNIFIED IDEOGRAPH
+ {0xA9B0, 0x5E9A}, //1273 #CJK UNIFIED IDEOGRAPH
+ {0xA9B1, 0x5E97}, //1274 #CJK UNIFIED IDEOGRAPH
+ {0xA9B2, 0x5E9C}, //1275 #CJK UNIFIED IDEOGRAPH
+ {0xA9B3, 0x5E95}, //1276 #CJK UNIFIED IDEOGRAPH
+ {0xA9B4, 0x5E96}, //1277 #CJK UNIFIED IDEOGRAPH
+ {0xA9B5, 0x5EF6}, //1278 #CJK UNIFIED IDEOGRAPH
+ {0xA9B6, 0x5F26}, //1279 #CJK UNIFIED IDEOGRAPH
+ {0xA9B7, 0x5F27}, //1280 #CJK UNIFIED IDEOGRAPH
+ {0xA9B8, 0x5F29}, //1281 #CJK UNIFIED IDEOGRAPH
+ {0xA9B9, 0x5F80}, //1282 #CJK UNIFIED IDEOGRAPH
+ {0xA9BA, 0x5F81}, //1283 #CJK UNIFIED IDEOGRAPH
+ {0xA9BB, 0x5F7F}, //1284 #CJK UNIFIED IDEOGRAPH
+ {0xA9BC, 0x5F7C}, //1285 #CJK UNIFIED IDEOGRAPH
+ {0xA9BD, 0x5FDD}, //1286 #CJK UNIFIED IDEOGRAPH
+ {0xA9BE, 0x5FE0}, //1287 #CJK UNIFIED IDEOGRAPH
+ {0xA9BF, 0x5FFD}, //1288 #CJK UNIFIED IDEOGRAPH
+ {0xA9C0, 0x5FF5}, //1289 #CJK UNIFIED IDEOGRAPH
+ {0xA9C1, 0x5FFF}, //1290 #CJK UNIFIED IDEOGRAPH
+ {0xA9C2, 0x600F}, //1291 #CJK UNIFIED IDEOGRAPH
+ {0xA9C3, 0x6014}, //1292 #CJK UNIFIED IDEOGRAPH
+ {0xA9C4, 0x602F}, //1293 #CJK UNIFIED IDEOGRAPH
+ {0xA9C5, 0x6035}, //1294 #CJK UNIFIED IDEOGRAPH
+ {0xA9C6, 0x6016}, //1295 #CJK UNIFIED IDEOGRAPH
+ {0xA9C7, 0x602A}, //1296 #CJK UNIFIED IDEOGRAPH
+ {0xA9C8, 0x6015}, //1297 #CJK UNIFIED IDEOGRAPH
+ {0xA9C9, 0x6021}, //1298 #CJK UNIFIED IDEOGRAPH
+ {0xA9CA, 0x6027}, //1299 #CJK UNIFIED IDEOGRAPH
+ {0xA9CB, 0x6029}, //1300 #CJK UNIFIED IDEOGRAPH
+ {0xA9CC, 0x602B}, //1301 #CJK UNIFIED IDEOGRAPH
+ {0xA9CD, 0x601B}, //1302 #CJK UNIFIED IDEOGRAPH
+ {0xA9CE, 0x6216}, //1303 #CJK UNIFIED IDEOGRAPH
+ {0xA9CF, 0x6215}, //1304 #CJK UNIFIED IDEOGRAPH
+ {0xA9D0, 0x623F}, //1305 #CJK UNIFIED IDEOGRAPH
+ {0xA9D1, 0x623E}, //1306 #CJK UNIFIED IDEOGRAPH
+ {0xA9D2, 0x6240}, //1307 #CJK UNIFIED IDEOGRAPH
+ {0xA9D3, 0x627F}, //1308 #CJK UNIFIED IDEOGRAPH
+ {0xA9D4, 0x62C9}, //1309 #CJK UNIFIED IDEOGRAPH
+ {0xA9D5, 0x62CC}, //1310 #CJK UNIFIED IDEOGRAPH
+ {0xA9D6, 0x62C4}, //1311 #CJK UNIFIED IDEOGRAPH
+ {0xA9D7, 0x62BF}, //1312 #CJK UNIFIED IDEOGRAPH
+ {0xA9D8, 0x62C2}, //1313 #CJK UNIFIED IDEOGRAPH
+ {0xA9D9, 0x62B9}, //1314 #CJK UNIFIED IDEOGRAPH
+ {0xA9DA, 0x62D2}, //1315 #CJK UNIFIED IDEOGRAPH
+ {0xA9DB, 0x62DB}, //1316 #CJK UNIFIED IDEOGRAPH
+ {0xA9DC, 0x62AB}, //1317 #CJK UNIFIED IDEOGRAPH
+ {0xA9DD, 0x62D3}, //1318 #CJK UNIFIED IDEOGRAPH
+ {0xA9DE, 0x62D4}, //1319 #CJK UNIFIED IDEOGRAPH
+ {0xA9DF, 0x62CB}, //1320 #CJK UNIFIED IDEOGRAPH
+ {0xA9E0, 0x62C8}, //1321 #CJK UNIFIED IDEOGRAPH
+ {0xA9E1, 0x62A8}, //1322 #CJK UNIFIED IDEOGRAPH
+ {0xA9E2, 0x62BD}, //1323 #CJK UNIFIED IDEOGRAPH
+ {0xA9E3, 0x62BC}, //1324 #CJK UNIFIED IDEOGRAPH
+ {0xA9E4, 0x62D0}, //1325 #CJK UNIFIED IDEOGRAPH
+ {0xA9E5, 0x62D9}, //1326 #CJK UNIFIED IDEOGRAPH
+ {0xA9E6, 0x62C7}, //1327 #CJK UNIFIED IDEOGRAPH
+ {0xA9E7, 0x62CD}, //1328 #CJK UNIFIED IDEOGRAPH
+ {0xA9E8, 0x62B5}, //1329 #CJK UNIFIED IDEOGRAPH
+ {0xA9E9, 0x62DA}, //1330 #CJK UNIFIED IDEOGRAPH
+ {0xA9EA, 0x62B1}, //1331 #CJK UNIFIED IDEOGRAPH
+ {0xA9EB, 0x62D8}, //1332 #CJK UNIFIED IDEOGRAPH
+ {0xA9EC, 0x62D6}, //1333 #CJK UNIFIED IDEOGRAPH
+ {0xA9ED, 0x62D7}, //1334 #CJK UNIFIED IDEOGRAPH
+ {0xA9EE, 0x62C6}, //1335 #CJK UNIFIED IDEOGRAPH
+ {0xA9EF, 0x62AC}, //1336 #CJK UNIFIED IDEOGRAPH
+ {0xA9F0, 0x62CE}, //1337 #CJK UNIFIED IDEOGRAPH
+ {0xA9F1, 0x653E}, //1338 #CJK UNIFIED IDEOGRAPH
+ {0xA9F2, 0x65A7}, //1339 #CJK UNIFIED IDEOGRAPH
+ {0xA9F3, 0x65BC}, //1340 #CJK UNIFIED IDEOGRAPH
+ {0xA9F4, 0x65FA}, //1341 #CJK UNIFIED IDEOGRAPH
+ {0xA9F5, 0x6614}, //1342 #CJK UNIFIED IDEOGRAPH
+ {0xA9F6, 0x6613}, //1343 #CJK UNIFIED IDEOGRAPH
+ {0xA9F7, 0x660C}, //1344 #CJK UNIFIED IDEOGRAPH
+ {0xA9F8, 0x6606}, //1345 #CJK UNIFIED IDEOGRAPH
+ {0xA9F9, 0x6602}, //1346 #CJK UNIFIED IDEOGRAPH
+ {0xA9FA, 0x660E}, //1347 #CJK UNIFIED IDEOGRAPH
+ {0xA9FB, 0x6600}, //1348 #CJK UNIFIED IDEOGRAPH
+ {0xA9FC, 0x660F}, //1349 #CJK UNIFIED IDEOGRAPH
+ {0xA9FD, 0x6615}, //1350 #CJK UNIFIED IDEOGRAPH
+ {0xA9FE, 0x660A}, //1351 #CJK UNIFIED IDEOGRAPH
+ {0xAA40, 0x6607}, //1352 #CJK UNIFIED IDEOGRAPH
+ {0xAA41, 0x670D}, //1353 #CJK UNIFIED IDEOGRAPH
+ {0xAA42, 0x670B}, //1354 #CJK UNIFIED IDEOGRAPH
+ {0xAA43, 0x676D}, //1355 #CJK UNIFIED IDEOGRAPH
+ {0xAA44, 0x678B}, //1356 #CJK UNIFIED IDEOGRAPH
+ {0xAA45, 0x6795}, //1357 #CJK UNIFIED IDEOGRAPH
+ {0xAA46, 0x6771}, //1358 #CJK UNIFIED IDEOGRAPH
+ {0xAA47, 0x679C}, //1359 #CJK UNIFIED IDEOGRAPH
+ {0xAA48, 0x6773}, //1360 #CJK UNIFIED IDEOGRAPH
+ {0xAA49, 0x6777}, //1361 #CJK UNIFIED IDEOGRAPH
+ {0xAA4A, 0x6787}, //1362 #CJK UNIFIED IDEOGRAPH
+ {0xAA4B, 0x679D}, //1363 #CJK UNIFIED IDEOGRAPH
+ {0xAA4C, 0x6797}, //1364 #CJK UNIFIED IDEOGRAPH
+ {0xAA4D, 0x676F}, //1365 #CJK UNIFIED IDEOGRAPH
+ {0xAA4E, 0x6770}, //1366 #CJK UNIFIED IDEOGRAPH
+ {0xAA4F, 0x677F}, //1367 #CJK UNIFIED IDEOGRAPH
+ {0xAA50, 0x6789}, //1368 #CJK UNIFIED IDEOGRAPH
+ {0xAA51, 0x677E}, //1369 #CJK UNIFIED IDEOGRAPH
+ {0xAA52, 0x6790}, //1370 #CJK UNIFIED IDEOGRAPH
+ {0xAA53, 0x6775}, //1371 #CJK UNIFIED IDEOGRAPH
+ {0xAA54, 0x679A}, //1372 #CJK UNIFIED IDEOGRAPH
+ {0xAA55, 0x6793}, //1373 #CJK UNIFIED IDEOGRAPH
+ {0xAA56, 0x677C}, //1374 #CJK UNIFIED IDEOGRAPH
+ {0xAA57, 0x676A}, //1375 #CJK UNIFIED IDEOGRAPH
+ {0xAA58, 0x6772}, //1376 #CJK UNIFIED IDEOGRAPH
+ {0xAA59, 0x6B23}, //1377 #CJK UNIFIED IDEOGRAPH
+ {0xAA5A, 0x6B66}, //1378 #CJK UNIFIED IDEOGRAPH
+ {0xAA5B, 0x6B67}, //1379 #CJK UNIFIED IDEOGRAPH
+ {0xAA5C, 0x6B7F}, //1380 #CJK UNIFIED IDEOGRAPH
+ {0xAA5D, 0x6C13}, //1381 #CJK UNIFIED IDEOGRAPH
+ {0xAA5E, 0x6C1B}, //1382 #CJK UNIFIED IDEOGRAPH
+ {0xAA5F, 0x6CE3}, //1383 #CJK UNIFIED IDEOGRAPH
+ {0xAA60, 0x6CE8}, //1384 #CJK UNIFIED IDEOGRAPH
+ {0xAA61, 0x6CF3}, //1385 #CJK UNIFIED IDEOGRAPH
+ {0xAA62, 0x6CB1}, //1386 #CJK UNIFIED IDEOGRAPH
+ {0xAA63, 0x6CCC}, //1387 #CJK UNIFIED IDEOGRAPH
+ {0xAA64, 0x6CE5}, //1388 #CJK UNIFIED IDEOGRAPH
+ {0xAA65, 0x6CB3}, //1389 #CJK UNIFIED IDEOGRAPH
+ {0xAA66, 0x6CBD}, //1390 #CJK UNIFIED IDEOGRAPH
+ {0xAA67, 0x6CBE}, //1391 #CJK UNIFIED IDEOGRAPH
+ {0xAA68, 0x6CBC}, //1392 #CJK UNIFIED IDEOGRAPH
+ {0xAA69, 0x6CE2}, //1393 #CJK UNIFIED IDEOGRAPH
+ {0xAA6A, 0x6CAB}, //1394 #CJK UNIFIED IDEOGRAPH
+ {0xAA6B, 0x6CD5}, //1395 #CJK UNIFIED IDEOGRAPH
+ {0xAA6C, 0x6CD3}, //1396 #CJK UNIFIED IDEOGRAPH
+ {0xAA6D, 0x6CB8}, //1397 #CJK UNIFIED IDEOGRAPH
+ {0xAA6E, 0x6CC4}, //1398 #CJK UNIFIED IDEOGRAPH
+ {0xAA6F, 0x6CB9}, //1399 #CJK UNIFIED IDEOGRAPH
+ {0xAA70, 0x6CC1}, //1400 #CJK UNIFIED IDEOGRAPH
+ {0xAA71, 0x6CAE}, //1401 #CJK UNIFIED IDEOGRAPH
+ {0xAA72, 0x6CD7}, //1402 #CJK UNIFIED IDEOGRAPH
+ {0xAA73, 0x6CC5}, //1403 #CJK UNIFIED IDEOGRAPH
+ {0xAA74, 0x6CF1}, //1404 #CJK UNIFIED IDEOGRAPH
+ {0xAA75, 0x6CBF}, //1405 #CJK UNIFIED IDEOGRAPH
+ {0xAA76, 0x6CBB}, //1406 #CJK UNIFIED IDEOGRAPH
+ {0xAA77, 0x6CE1}, //1407 #CJK UNIFIED IDEOGRAPH
+ {0xAA78, 0x6CDB}, //1408 #CJK UNIFIED IDEOGRAPH
+ {0xAA79, 0x6CCA}, //1409 #CJK UNIFIED IDEOGRAPH
+ {0xAA7A, 0x6CAC}, //1410 #CJK UNIFIED IDEOGRAPH
+ {0xAA7B, 0x6CEF}, //1411 #CJK UNIFIED IDEOGRAPH
+ {0xAA7C, 0x6CDC}, //1412 #CJK UNIFIED IDEOGRAPH
+ {0xAA7D, 0x6CD6}, //1413 #CJK UNIFIED IDEOGRAPH
+ {0xAA7E, 0x6CE0}, //1414 #CJK UNIFIED IDEOGRAPH
+ {0xAAA1, 0x7095}, //1415 #CJK UNIFIED IDEOGRAPH
+ {0xAAA2, 0x708E}, //1416 #CJK UNIFIED IDEOGRAPH
+ {0xAAA3, 0x7092}, //1417 #CJK UNIFIED IDEOGRAPH
+ {0xAAA4, 0x708A}, //1418 #CJK UNIFIED IDEOGRAPH
+ {0xAAA5, 0x7099}, //1419 #CJK UNIFIED IDEOGRAPH
+ {0xAAA6, 0x722C}, //1420 #CJK UNIFIED IDEOGRAPH
+ {0xAAA7, 0x722D}, //1421 #CJK UNIFIED IDEOGRAPH
+ {0xAAA8, 0x7238}, //1422 #CJK UNIFIED IDEOGRAPH
+ {0xAAA9, 0x7248}, //1423 #CJK UNIFIED IDEOGRAPH
+ {0xAAAA, 0x7267}, //1424 #CJK UNIFIED IDEOGRAPH
+ {0xAAAB, 0x7269}, //1425 #CJK UNIFIED IDEOGRAPH
+ {0xAAAC, 0x72C0}, //1426 #CJK UNIFIED IDEOGRAPH
+ {0xAAAD, 0x72CE}, //1427 #CJK UNIFIED IDEOGRAPH
+ {0xAAAE, 0x72D9}, //1428 #CJK UNIFIED IDEOGRAPH
+ {0xAAAF, 0x72D7}, //1429 #CJK UNIFIED IDEOGRAPH
+ {0xAAB0, 0x72D0}, //1430 #CJK UNIFIED IDEOGRAPH
+ {0xAAB1, 0x73A9}, //1431 #CJK UNIFIED IDEOGRAPH
+ {0xAAB2, 0x73A8}, //1432 #CJK UNIFIED IDEOGRAPH
+ {0xAAB3, 0x739F}, //1433 #CJK UNIFIED IDEOGRAPH
+ {0xAAB4, 0x73AB}, //1434 #CJK UNIFIED IDEOGRAPH
+ {0xAAB5, 0x73A5}, //1435 #CJK UNIFIED IDEOGRAPH
+ {0xAAB6, 0x753D}, //1436 #CJK UNIFIED IDEOGRAPH
+ {0xAAB7, 0x759D}, //1437 #CJK UNIFIED IDEOGRAPH
+ {0xAAB8, 0x7599}, //1438 #CJK UNIFIED IDEOGRAPH
+ {0xAAB9, 0x759A}, //1439 #CJK UNIFIED IDEOGRAPH
+ {0xAABA, 0x7684}, //1440 #CJK UNIFIED IDEOGRAPH
+ {0xAABB, 0x76C2}, //1441 #CJK UNIFIED IDEOGRAPH
+ {0xAABC, 0x76F2}, //1442 #CJK UNIFIED IDEOGRAPH
+ {0xAABD, 0x76F4}, //1443 #CJK UNIFIED IDEOGRAPH
+ {0xAABE, 0x77E5}, //1444 #CJK UNIFIED IDEOGRAPH
+ {0xAABF, 0x77FD}, //1445 #CJK UNIFIED IDEOGRAPH
+ {0xAAC0, 0x793E}, //1446 #CJK UNIFIED IDEOGRAPH
+ {0xAAC1, 0x7940}, //1447 #CJK UNIFIED IDEOGRAPH
+ {0xAAC2, 0x7941}, //1448 #CJK UNIFIED IDEOGRAPH
+ {0xAAC3, 0x79C9}, //1449 #CJK UNIFIED IDEOGRAPH
+ {0xAAC4, 0x79C8}, //1450 #CJK UNIFIED IDEOGRAPH
+ {0xAAC5, 0x7A7A}, //1451 #CJK UNIFIED IDEOGRAPH
+ {0xAAC6, 0x7A79}, //1452 #CJK UNIFIED IDEOGRAPH
+ {0xAAC7, 0x7AFA}, //1453 #CJK UNIFIED IDEOGRAPH
+ {0xAAC8, 0x7CFE}, //1454 #CJK UNIFIED IDEOGRAPH
+ {0xAAC9, 0x7F54}, //1455 #CJK UNIFIED IDEOGRAPH
+ {0xAACA, 0x7F8C}, //1456 #CJK UNIFIED IDEOGRAPH
+ {0xAACB, 0x7F8B}, //1457 #CJK UNIFIED IDEOGRAPH
+ {0xAACC, 0x8005}, //1458 #CJK UNIFIED IDEOGRAPH
+ {0xAACD, 0x80BA}, //1459 #CJK UNIFIED IDEOGRAPH
+ {0xAACE, 0x80A5}, //1460 #CJK UNIFIED IDEOGRAPH
+ {0xAACF, 0x80A2}, //1461 #CJK UNIFIED IDEOGRAPH
+ {0xAAD0, 0x80B1}, //1462 #CJK UNIFIED IDEOGRAPH
+ {0xAAD1, 0x80A1}, //1463 #CJK UNIFIED IDEOGRAPH
+ {0xAAD2, 0x80AB}, //1464 #CJK UNIFIED IDEOGRAPH
+ {0xAAD3, 0x80A9}, //1465 #CJK UNIFIED IDEOGRAPH
+ {0xAAD4, 0x80B4}, //1466 #CJK UNIFIED IDEOGRAPH
+ {0xAAD5, 0x80AA}, //1467 #CJK UNIFIED IDEOGRAPH
+ {0xAAD6, 0x80AF}, //1468 #CJK UNIFIED IDEOGRAPH
+ {0xAAD7, 0x81E5}, //1469 #CJK UNIFIED IDEOGRAPH
+ {0xAAD8, 0x81FE}, //1470 #CJK UNIFIED IDEOGRAPH
+ {0xAAD9, 0x820D}, //1471 #CJK UNIFIED IDEOGRAPH
+ {0xAADA, 0x82B3}, //1472 #CJK UNIFIED IDEOGRAPH
+ {0xAADB, 0x829D}, //1473 #CJK UNIFIED IDEOGRAPH
+ {0xAADC, 0x8299}, //1474 #CJK UNIFIED IDEOGRAPH
+ {0xAADD, 0x82AD}, //1475 #CJK UNIFIED IDEOGRAPH
+ {0xAADE, 0x82BD}, //1476 #CJK UNIFIED IDEOGRAPH
+ {0xAADF, 0x829F}, //1477 #CJK UNIFIED IDEOGRAPH
+ {0xAAE0, 0x82B9}, //1478 #CJK UNIFIED IDEOGRAPH
+ {0xAAE1, 0x82B1}, //1479 #CJK UNIFIED IDEOGRAPH
+ {0xAAE2, 0x82AC}, //1480 #CJK UNIFIED IDEOGRAPH
+ {0xAAE3, 0x82A5}, //1481 #CJK UNIFIED IDEOGRAPH
+ {0xAAE4, 0x82AF}, //1482 #CJK UNIFIED IDEOGRAPH
+ {0xAAE5, 0x82B8}, //1483 #CJK UNIFIED IDEOGRAPH
+ {0xAAE6, 0x82A3}, //1484 #CJK UNIFIED IDEOGRAPH
+ {0xAAE7, 0x82B0}, //1485 #CJK UNIFIED IDEOGRAPH
+ {0xAAE8, 0x82BE}, //1486 #CJK UNIFIED IDEOGRAPH
+ {0xAAE9, 0x82B7}, //1487 #CJK UNIFIED IDEOGRAPH
+ {0xAAEA, 0x864E}, //1488 #CJK UNIFIED IDEOGRAPH
+ {0xAAEB, 0x8671}, //1489 #CJK UNIFIED IDEOGRAPH
+ {0xAAEC, 0x521D}, //1490 #CJK UNIFIED IDEOGRAPH
+ {0xAAED, 0x8868}, //1491 #CJK UNIFIED IDEOGRAPH
+ {0xAAEE, 0x8ECB}, //1492 #CJK UNIFIED IDEOGRAPH
+ {0xAAEF, 0x8FCE}, //1493 #CJK UNIFIED IDEOGRAPH
+ {0xAAF0, 0x8FD4}, //1494 #CJK UNIFIED IDEOGRAPH
+ {0xAAF1, 0x8FD1}, //1495 #CJK UNIFIED IDEOGRAPH
+ {0xAAF2, 0x90B5}, //1496 #CJK UNIFIED IDEOGRAPH
+ {0xAAF3, 0x90B8}, //1497 #CJK UNIFIED IDEOGRAPH
+ {0xAAF4, 0x90B1}, //1498 #CJK UNIFIED IDEOGRAPH
+ {0xAAF5, 0x90B6}, //1499 #CJK UNIFIED IDEOGRAPH
+ {0xAAF6, 0x91C7}, //1500 #CJK UNIFIED IDEOGRAPH
+ {0xAAF7, 0x91D1}, //1501 #CJK UNIFIED IDEOGRAPH
+ {0xAAF8, 0x9577}, //1502 #CJK UNIFIED IDEOGRAPH
+ {0xAAF9, 0x9580}, //1503 #CJK UNIFIED IDEOGRAPH
+ {0xAAFA, 0x961C}, //1504 #CJK UNIFIED IDEOGRAPH
+ {0xAAFB, 0x9640}, //1505 #CJK UNIFIED IDEOGRAPH
+ {0xAAFC, 0x963F}, //1506 #CJK UNIFIED IDEOGRAPH
+ {0xAAFD, 0x963B}, //1507 #CJK UNIFIED IDEOGRAPH
+ {0xAAFE, 0x9644}, //1508 #CJK UNIFIED IDEOGRAPH
+ {0xAB40, 0x9642}, //1509 #CJK UNIFIED IDEOGRAPH
+ {0xAB41, 0x96B9}, //1510 #CJK UNIFIED IDEOGRAPH
+ {0xAB42, 0x96E8}, //1511 #CJK UNIFIED IDEOGRAPH
+ {0xAB43, 0x9752}, //1512 #CJK UNIFIED IDEOGRAPH
+ {0xAB44, 0x975E}, //1513 #CJK UNIFIED IDEOGRAPH
+ {0xAB45, 0x4E9F}, //1514 #CJK UNIFIED IDEOGRAPH
+ {0xAB46, 0x4EAD}, //1515 #CJK UNIFIED IDEOGRAPH
+ {0xAB47, 0x4EAE}, //1516 #CJK UNIFIED IDEOGRAPH
+ {0xAB48, 0x4FE1}, //1517 #CJK UNIFIED IDEOGRAPH
+ {0xAB49, 0x4FB5}, //1518 #CJK UNIFIED IDEOGRAPH
+ {0xAB4A, 0x4FAF}, //1519 #CJK UNIFIED IDEOGRAPH
+ {0xAB4B, 0x4FBF}, //1520 #CJK UNIFIED IDEOGRAPH
+ {0xAB4C, 0x4FE0}, //1521 #CJK UNIFIED IDEOGRAPH
+ {0xAB4D, 0x4FD1}, //1522 #CJK UNIFIED IDEOGRAPH
+ {0xAB4E, 0x4FCF}, //1523 #CJK UNIFIED IDEOGRAPH
+ {0xAB4F, 0x4FDD}, //1524 #CJK UNIFIED IDEOGRAPH
+ {0xAB50, 0x4FC3}, //1525 #CJK UNIFIED IDEOGRAPH
+ {0xAB51, 0x4FB6}, //1526 #CJK UNIFIED IDEOGRAPH
+ {0xAB52, 0x4FD8}, //1527 #CJK UNIFIED IDEOGRAPH
+ {0xAB53, 0x4FDF}, //1528 #CJK UNIFIED IDEOGRAPH
+ {0xAB54, 0x4FCA}, //1529 #CJK UNIFIED IDEOGRAPH
+ {0xAB55, 0x4FD7}, //1530 #CJK UNIFIED IDEOGRAPH
+ {0xAB56, 0x4FAE}, //1531 #CJK UNIFIED IDEOGRAPH
+ {0xAB57, 0x4FD0}, //1532 #CJK UNIFIED IDEOGRAPH
+ {0xAB58, 0x4FC4}, //1533 #CJK UNIFIED IDEOGRAPH
+ {0xAB59, 0x4FC2}, //1534 #CJK UNIFIED IDEOGRAPH
+ {0xAB5A, 0x4FDA}, //1535 #CJK UNIFIED IDEOGRAPH
+ {0xAB5B, 0x4FCE}, //1536 #CJK UNIFIED IDEOGRAPH
+ {0xAB5C, 0x4FDE}, //1537 #CJK UNIFIED IDEOGRAPH
+ {0xAB5D, 0x4FB7}, //1538 #CJK UNIFIED IDEOGRAPH
+ {0xAB5E, 0x5157}, //1539 #CJK UNIFIED IDEOGRAPH
+ {0xAB5F, 0x5192}, //1540 #CJK UNIFIED IDEOGRAPH
+ {0xAB60, 0x5191}, //1541 #CJK UNIFIED IDEOGRAPH
+ {0xAB61, 0x51A0}, //1542 #CJK UNIFIED IDEOGRAPH
+ {0xAB62, 0x524E}, //1543 #CJK UNIFIED IDEOGRAPH
+ {0xAB63, 0x5243}, //1544 #CJK UNIFIED IDEOGRAPH
+ {0xAB64, 0x524A}, //1545 #CJK UNIFIED IDEOGRAPH
+ {0xAB65, 0x524D}, //1546 #CJK UNIFIED IDEOGRAPH
+ {0xAB66, 0x524C}, //1547 #CJK UNIFIED IDEOGRAPH
+ {0xAB67, 0x524B}, //1548 #CJK UNIFIED IDEOGRAPH
+ {0xAB68, 0x5247}, //1549 #CJK UNIFIED IDEOGRAPH
+ {0xAB69, 0x52C7}, //1550 #CJK UNIFIED IDEOGRAPH
+ {0xAB6A, 0x52C9}, //1551 #CJK UNIFIED IDEOGRAPH
+ {0xAB6B, 0x52C3}, //1552 #CJK UNIFIED IDEOGRAPH
+ {0xAB6C, 0x52C1}, //1553 #CJK UNIFIED IDEOGRAPH
+ {0xAB6D, 0x530D}, //1554 #CJK UNIFIED IDEOGRAPH
+ {0xAB6E, 0x5357}, //1555 #CJK UNIFIED IDEOGRAPH
+ {0xAB6F, 0x537B}, //1556 #CJK UNIFIED IDEOGRAPH
+ {0xAB70, 0x539A}, //1557 #CJK UNIFIED IDEOGRAPH
+ {0xAB71, 0x53DB}, //1558 #CJK UNIFIED IDEOGRAPH
+ {0xAB72, 0x54AC}, //1559 #CJK UNIFIED IDEOGRAPH
+ {0xAB73, 0x54C0}, //1560 #CJK UNIFIED IDEOGRAPH
+ {0xAB74, 0x54A8}, //1561 #CJK UNIFIED IDEOGRAPH
+ {0xAB75, 0x54CE}, //1562 #CJK UNIFIED IDEOGRAPH
+ {0xAB76, 0x54C9}, //1563 #CJK UNIFIED IDEOGRAPH
+ {0xAB77, 0x54B8}, //1564 #CJK UNIFIED IDEOGRAPH
+ {0xAB78, 0x54A6}, //1565 #CJK UNIFIED IDEOGRAPH
+ {0xAB79, 0x54B3}, //1566 #CJK UNIFIED IDEOGRAPH
+ {0xAB7A, 0x54C7}, //1567 #CJK UNIFIED IDEOGRAPH
+ {0xAB7B, 0x54C2}, //1568 #CJK UNIFIED IDEOGRAPH
+ {0xAB7C, 0x54BD}, //1569 #CJK UNIFIED IDEOGRAPH
+ {0xAB7D, 0x54AA}, //1570 #CJK UNIFIED IDEOGRAPH
+ {0xAB7E, 0x54C1}, //1571 #CJK UNIFIED IDEOGRAPH
+ {0xABA1, 0x54C4}, //1572 #CJK UNIFIED IDEOGRAPH
+ {0xABA2, 0x54C8}, //1573 #CJK UNIFIED IDEOGRAPH
+ {0xABA3, 0x54AF}, //1574 #CJK UNIFIED IDEOGRAPH
+ {0xABA4, 0x54AB}, //1575 #CJK UNIFIED IDEOGRAPH
+ {0xABA5, 0x54B1}, //1576 #CJK UNIFIED IDEOGRAPH
+ {0xABA6, 0x54BB}, //1577 #CJK UNIFIED IDEOGRAPH
+ {0xABA7, 0x54A9}, //1578 #CJK UNIFIED IDEOGRAPH
+ {0xABA8, 0x54A7}, //1579 #CJK UNIFIED IDEOGRAPH
+ {0xABA9, 0x54BF}, //1580 #CJK UNIFIED IDEOGRAPH
+ {0xABAA, 0x56FF}, //1581 #CJK UNIFIED IDEOGRAPH
+ {0xABAB, 0x5782}, //1582 #CJK UNIFIED IDEOGRAPH
+ {0xABAC, 0x578B}, //1583 #CJK UNIFIED IDEOGRAPH
+ {0xABAD, 0x57A0}, //1584 #CJK UNIFIED IDEOGRAPH
+ {0xABAE, 0x57A3}, //1585 #CJK UNIFIED IDEOGRAPH
+ {0xABAF, 0x57A2}, //1586 #CJK UNIFIED IDEOGRAPH
+ {0xABB0, 0x57CE}, //1587 #CJK UNIFIED IDEOGRAPH
+ {0xABB1, 0x57AE}, //1588 #CJK UNIFIED IDEOGRAPH
+ {0xABB2, 0x5793}, //1589 #CJK UNIFIED IDEOGRAPH
+ {0xABB3, 0x5955}, //1590 #CJK UNIFIED IDEOGRAPH
+ {0xABB4, 0x5951}, //1591 #CJK UNIFIED IDEOGRAPH
+ {0xABB5, 0x594F}, //1592 #CJK UNIFIED IDEOGRAPH
+ {0xABB6, 0x594E}, //1593 #CJK UNIFIED IDEOGRAPH
+ {0xABB7, 0x5950}, //1594 #CJK UNIFIED IDEOGRAPH
+ {0xABB8, 0x59DC}, //1595 #CJK UNIFIED IDEOGRAPH
+ {0xABB9, 0x59D8}, //1596 #CJK UNIFIED IDEOGRAPH
+ {0xABBA, 0x59FF}, //1597 #CJK UNIFIED IDEOGRAPH
+ {0xABBB, 0x59E3}, //1598 #CJK UNIFIED IDEOGRAPH
+ {0xABBC, 0x59E8}, //1599 #CJK UNIFIED IDEOGRAPH
+ {0xABBD, 0x5A03}, //1600 #CJK UNIFIED IDEOGRAPH
+ {0xABBE, 0x59E5}, //1601 #CJK UNIFIED IDEOGRAPH
+ {0xABBF, 0x59EA}, //1602 #CJK UNIFIED IDEOGRAPH
+ {0xABC0, 0x59DA}, //1603 #CJK UNIFIED IDEOGRAPH
+ {0xABC1, 0x59E6}, //1604 #CJK UNIFIED IDEOGRAPH
+ {0xABC2, 0x5A01}, //1605 #CJK UNIFIED IDEOGRAPH
+ {0xABC3, 0x59FB}, //1606 #CJK UNIFIED IDEOGRAPH
+ {0xABC4, 0x5B69}, //1607 #CJK UNIFIED IDEOGRAPH
+ {0xABC5, 0x5BA3}, //1608 #CJK UNIFIED IDEOGRAPH
+ {0xABC6, 0x5BA6}, //1609 #CJK UNIFIED IDEOGRAPH
+ {0xABC7, 0x5BA4}, //1610 #CJK UNIFIED IDEOGRAPH
+ {0xABC8, 0x5BA2}, //1611 #CJK UNIFIED IDEOGRAPH
+ {0xABC9, 0x5BA5}, //1612 #CJK UNIFIED IDEOGRAPH
+ {0xABCA, 0x5C01}, //1613 #CJK UNIFIED IDEOGRAPH
+ {0xABCB, 0x5C4E}, //1614 #CJK UNIFIED IDEOGRAPH
+ {0xABCC, 0x5C4F}, //1615 #CJK UNIFIED IDEOGRAPH
+ {0xABCD, 0x5C4D}, //1616 #CJK UNIFIED IDEOGRAPH
+ {0xABCE, 0x5C4B}, //1617 #CJK UNIFIED IDEOGRAPH
+ {0xABCF, 0x5CD9}, //1618 #CJK UNIFIED IDEOGRAPH
+ {0xABD0, 0x5CD2}, //1619 #CJK UNIFIED IDEOGRAPH
+ {0xABD1, 0x5DF7}, //1620 #CJK UNIFIED IDEOGRAPH
+ {0xABD2, 0x5E1D}, //1621 #CJK UNIFIED IDEOGRAPH
+ {0xABD3, 0x5E25}, //1622 #CJK UNIFIED IDEOGRAPH
+ {0xABD4, 0x5E1F}, //1623 #CJK UNIFIED IDEOGRAPH
+ {0xABD5, 0x5E7D}, //1624 #CJK UNIFIED IDEOGRAPH
+ {0xABD6, 0x5EA0}, //1625 #CJK UNIFIED IDEOGRAPH
+ {0xABD7, 0x5EA6}, //1626 #CJK UNIFIED IDEOGRAPH
+ {0xABD8, 0x5EFA}, //1627 #CJK UNIFIED IDEOGRAPH
+ {0xABD9, 0x5F08}, //1628 #CJK UNIFIED IDEOGRAPH
+ {0xABDA, 0x5F2D}, //1629 #CJK UNIFIED IDEOGRAPH
+ {0xABDB, 0x5F65}, //1630 #CJK UNIFIED IDEOGRAPH
+ {0xABDC, 0x5F88}, //1631 #CJK UNIFIED IDEOGRAPH
+ {0xABDD, 0x5F85}, //1632 #CJK UNIFIED IDEOGRAPH
+ {0xABDE, 0x5F8A}, //1633 #CJK UNIFIED IDEOGRAPH
+ {0xABDF, 0x5F8B}, //1634 #CJK UNIFIED IDEOGRAPH
+ {0xABE0, 0x5F87}, //1635 #CJK UNIFIED IDEOGRAPH
+ {0xABE1, 0x5F8C}, //1636 #CJK UNIFIED IDEOGRAPH
+ {0xABE2, 0x5F89}, //1637 #CJK UNIFIED IDEOGRAPH
+ {0xABE3, 0x6012}, //1638 #CJK UNIFIED IDEOGRAPH
+ {0xABE4, 0x601D}, //1639 #CJK UNIFIED IDEOGRAPH
+ {0xABE5, 0x6020}, //1640 #CJK UNIFIED IDEOGRAPH
+ {0xABE6, 0x6025}, //1641 #CJK UNIFIED IDEOGRAPH
+ {0xABE7, 0x600E}, //1642 #CJK UNIFIED IDEOGRAPH
+ {0xABE8, 0x6028}, //1643 #CJK UNIFIED IDEOGRAPH
+ {0xABE9, 0x604D}, //1644 #CJK UNIFIED IDEOGRAPH
+ {0xABEA, 0x6070}, //1645 #CJK UNIFIED IDEOGRAPH
+ {0xABEB, 0x6068}, //1646 #CJK UNIFIED IDEOGRAPH
+ {0xABEC, 0x6062}, //1647 #CJK UNIFIED IDEOGRAPH
+ {0xABED, 0x6046}, //1648 #CJK UNIFIED IDEOGRAPH
+ {0xABEE, 0x6043}, //1649 #CJK UNIFIED IDEOGRAPH
+ {0xABEF, 0x606C}, //1650 #CJK UNIFIED IDEOGRAPH
+ {0xABF0, 0x606B}, //1651 #CJK UNIFIED IDEOGRAPH
+ {0xABF1, 0x606A}, //1652 #CJK UNIFIED IDEOGRAPH
+ {0xABF2, 0x6064}, //1653 #CJK UNIFIED IDEOGRAPH
+ {0xABF3, 0x6241}, //1654 #CJK UNIFIED IDEOGRAPH
+ {0xABF4, 0x62DC}, //1655 #CJK UNIFIED IDEOGRAPH
+ {0xABF5, 0x6316}, //1656 #CJK UNIFIED IDEOGRAPH
+ {0xABF6, 0x6309}, //1657 #CJK UNIFIED IDEOGRAPH
+ {0xABF7, 0x62FC}, //1658 #CJK UNIFIED IDEOGRAPH
+ {0xABF8, 0x62ED}, //1659 #CJK UNIFIED IDEOGRAPH
+ {0xABF9, 0x6301}, //1660 #CJK UNIFIED IDEOGRAPH
+ {0xABFA, 0x62EE}, //1661 #CJK UNIFIED IDEOGRAPH
+ {0xABFB, 0x62FD}, //1662 #CJK UNIFIED IDEOGRAPH
+ {0xABFC, 0x6307}, //1663 #CJK UNIFIED IDEOGRAPH
+ {0xABFD, 0x62F1}, //1664 #CJK UNIFIED IDEOGRAPH
+ {0xABFE, 0x62F7}, //1665 #CJK UNIFIED IDEOGRAPH
+ {0xAC40, 0x62EF}, //1666 #CJK UNIFIED IDEOGRAPH
+ {0xAC41, 0x62EC}, //1667 #CJK UNIFIED IDEOGRAPH
+ {0xAC42, 0x62FE}, //1668 #CJK UNIFIED IDEOGRAPH
+ {0xAC43, 0x62F4}, //1669 #CJK UNIFIED IDEOGRAPH
+ {0xAC44, 0x6311}, //1670 #CJK UNIFIED IDEOGRAPH
+ {0xAC45, 0x6302}, //1671 #CJK UNIFIED IDEOGRAPH
+ {0xAC46, 0x653F}, //1672 #CJK UNIFIED IDEOGRAPH
+ {0xAC47, 0x6545}, //1673 #CJK UNIFIED IDEOGRAPH
+ {0xAC48, 0x65AB}, //1674 #CJK UNIFIED IDEOGRAPH
+ {0xAC49, 0x65BD}, //1675 #CJK UNIFIED IDEOGRAPH
+ {0xAC4A, 0x65E2}, //1676 #CJK UNIFIED IDEOGRAPH
+ {0xAC4B, 0x6625}, //1677 #CJK UNIFIED IDEOGRAPH
+ {0xAC4C, 0x662D}, //1678 #CJK UNIFIED IDEOGRAPH
+ {0xAC4D, 0x6620}, //1679 #CJK UNIFIED IDEOGRAPH
+ {0xAC4E, 0x6627}, //1680 #CJK UNIFIED IDEOGRAPH
+ {0xAC4F, 0x662F}, //1681 #CJK UNIFIED IDEOGRAPH
+ {0xAC50, 0x661F}, //1682 #CJK UNIFIED IDEOGRAPH
+ {0xAC51, 0x6628}, //1683 #CJK UNIFIED IDEOGRAPH
+ {0xAC52, 0x6631}, //1684 #CJK UNIFIED IDEOGRAPH
+ {0xAC53, 0x6624}, //1685 #CJK UNIFIED IDEOGRAPH
+ {0xAC54, 0x66F7}, //1686 #CJK UNIFIED IDEOGRAPH
+ {0xAC55, 0x67FF}, //1687 #CJK UNIFIED IDEOGRAPH
+ {0xAC56, 0x67D3}, //1688 #CJK UNIFIED IDEOGRAPH
+ {0xAC57, 0x67F1}, //1689 #CJK UNIFIED IDEOGRAPH
+ {0xAC58, 0x67D4}, //1690 #CJK UNIFIED IDEOGRAPH
+ {0xAC59, 0x67D0}, //1691 #CJK UNIFIED IDEOGRAPH
+ {0xAC5A, 0x67EC}, //1692 #CJK UNIFIED IDEOGRAPH
+ {0xAC5B, 0x67B6}, //1693 #CJK UNIFIED IDEOGRAPH
+ {0xAC5C, 0x67AF}, //1694 #CJK UNIFIED IDEOGRAPH
+ {0xAC5D, 0x67F5}, //1695 #CJK UNIFIED IDEOGRAPH
+ {0xAC5E, 0x67E9}, //1696 #CJK UNIFIED IDEOGRAPH
+ {0xAC5F, 0x67EF}, //1697 #CJK UNIFIED IDEOGRAPH
+ {0xAC60, 0x67C4}, //1698 #CJK UNIFIED IDEOGRAPH
+ {0xAC61, 0x67D1}, //1699 #CJK UNIFIED IDEOGRAPH
+ {0xAC62, 0x67B4}, //1700 #CJK UNIFIED IDEOGRAPH
+ {0xAC63, 0x67DA}, //1701 #CJK UNIFIED IDEOGRAPH
+ {0xAC64, 0x67E5}, //1702 #CJK UNIFIED IDEOGRAPH
+ {0xAC65, 0x67B8}, //1703 #CJK UNIFIED IDEOGRAPH
+ {0xAC66, 0x67CF}, //1704 #CJK UNIFIED IDEOGRAPH
+ {0xAC67, 0x67DE}, //1705 #CJK UNIFIED IDEOGRAPH
+ {0xAC68, 0x67F3}, //1706 #CJK UNIFIED IDEOGRAPH
+ {0xAC69, 0x67B0}, //1707 #CJK UNIFIED IDEOGRAPH
+ {0xAC6A, 0x67D9}, //1708 #CJK UNIFIED IDEOGRAPH
+ {0xAC6B, 0x67E2}, //1709 #CJK UNIFIED IDEOGRAPH
+ {0xAC6C, 0x67DD}, //1710 #CJK UNIFIED IDEOGRAPH
+ {0xAC6D, 0x67D2}, //1711 #CJK UNIFIED IDEOGRAPH
+ {0xAC6E, 0x6B6A}, //1712 #CJK UNIFIED IDEOGRAPH
+ {0xAC6F, 0x6B83}, //1713 #CJK UNIFIED IDEOGRAPH
+ {0xAC70, 0x6B86}, //1714 #CJK UNIFIED IDEOGRAPH
+ {0xAC71, 0x6BB5}, //1715 #CJK UNIFIED IDEOGRAPH
+ {0xAC72, 0x6BD2}, //1716 #CJK UNIFIED IDEOGRAPH
+ {0xAC73, 0x6BD7}, //1717 #CJK UNIFIED IDEOGRAPH
+ {0xAC74, 0x6C1F}, //1718 #CJK UNIFIED IDEOGRAPH
+ {0xAC75, 0x6CC9}, //1719 #CJK UNIFIED IDEOGRAPH
+ {0xAC76, 0x6D0B}, //1720 #CJK UNIFIED IDEOGRAPH
+ {0xAC77, 0x6D32}, //1721 #CJK UNIFIED IDEOGRAPH
+ {0xAC78, 0x6D2A}, //1722 #CJK UNIFIED IDEOGRAPH
+ {0xAC79, 0x6D41}, //1723 #CJK UNIFIED IDEOGRAPH
+ {0xAC7A, 0x6D25}, //1724 #CJK UNIFIED IDEOGRAPH
+ {0xAC7B, 0x6D0C}, //1725 #CJK UNIFIED IDEOGRAPH
+ {0xAC7C, 0x6D31}, //1726 #CJK UNIFIED IDEOGRAPH
+ {0xAC7D, 0x6D1E}, //1727 #CJK UNIFIED IDEOGRAPH
+ {0xAC7E, 0x6D17}, //1728 #CJK UNIFIED IDEOGRAPH
+ {0xACA1, 0x6D3B}, //1729 #CJK UNIFIED IDEOGRAPH
+ {0xACA2, 0x6D3D}, //1730 #CJK UNIFIED IDEOGRAPH
+ {0xACA3, 0x6D3E}, //1731 #CJK UNIFIED IDEOGRAPH
+ {0xACA4, 0x6D36}, //1732 #CJK UNIFIED IDEOGRAPH
+ {0xACA5, 0x6D1B}, //1733 #CJK UNIFIED IDEOGRAPH
+ {0xACA6, 0x6CF5}, //1734 #CJK UNIFIED IDEOGRAPH
+ {0xACA7, 0x6D39}, //1735 #CJK UNIFIED IDEOGRAPH
+ {0xACA8, 0x6D27}, //1736 #CJK UNIFIED IDEOGRAPH
+ {0xACA9, 0x6D38}, //1737 #CJK UNIFIED IDEOGRAPH
+ {0xACAA, 0x6D29}, //1738 #CJK UNIFIED IDEOGRAPH
+ {0xACAB, 0x6D2E}, //1739 #CJK UNIFIED IDEOGRAPH
+ {0xACAC, 0x6D35}, //1740 #CJK UNIFIED IDEOGRAPH
+ {0xACAD, 0x6D0E}, //1741 #CJK UNIFIED IDEOGRAPH
+ {0xACAE, 0x6D2B}, //1742 #CJK UNIFIED IDEOGRAPH
+ {0xACAF, 0x70AB}, //1743 #CJK UNIFIED IDEOGRAPH
+ {0xACB0, 0x70BA}, //1744 #CJK UNIFIED IDEOGRAPH
+ {0xACB1, 0x70B3}, //1745 #CJK UNIFIED IDEOGRAPH
+ {0xACB2, 0x70AC}, //1746 #CJK UNIFIED IDEOGRAPH
+ {0xACB3, 0x70AF}, //1747 #CJK UNIFIED IDEOGRAPH
+ {0xACB4, 0x70AD}, //1748 #CJK UNIFIED IDEOGRAPH
+ {0xACB5, 0x70B8}, //1749 #CJK UNIFIED IDEOGRAPH
+ {0xACB6, 0x70AE}, //1750 #CJK UNIFIED IDEOGRAPH
+ {0xACB7, 0x70A4}, //1751 #CJK UNIFIED IDEOGRAPH
+ {0xACB8, 0x7230}, //1752 #CJK UNIFIED IDEOGRAPH
+ {0xACB9, 0x7272}, //1753 #CJK UNIFIED IDEOGRAPH
+ {0xACBA, 0x726F}, //1754 #CJK UNIFIED IDEOGRAPH
+ {0xACBB, 0x7274}, //1755 #CJK UNIFIED IDEOGRAPH
+ {0xACBC, 0x72E9}, //1756 #CJK UNIFIED IDEOGRAPH
+ {0xACBD, 0x72E0}, //1757 #CJK UNIFIED IDEOGRAPH
+ {0xACBE, 0x72E1}, //1758 #CJK UNIFIED IDEOGRAPH
+ {0xACBF, 0x73B7}, //1759 #CJK UNIFIED IDEOGRAPH
+ {0xACC0, 0x73CA}, //1760 #CJK UNIFIED IDEOGRAPH
+ {0xACC1, 0x73BB}, //1761 #CJK UNIFIED IDEOGRAPH
+ {0xACC2, 0x73B2}, //1762 #CJK UNIFIED IDEOGRAPH
+ {0xACC3, 0x73CD}, //1763 #CJK UNIFIED IDEOGRAPH
+ {0xACC4, 0x73C0}, //1764 #CJK UNIFIED IDEOGRAPH
+ {0xACC5, 0x73B3}, //1765 #CJK UNIFIED IDEOGRAPH
+ {0xACC6, 0x751A}, //1766 #CJK UNIFIED IDEOGRAPH
+ {0xACC7, 0x752D}, //1767 #CJK UNIFIED IDEOGRAPH
+ {0xACC8, 0x754F}, //1768 #CJK UNIFIED IDEOGRAPH
+ {0xACC9, 0x754C}, //1769 #CJK UNIFIED IDEOGRAPH
+ {0xACCA, 0x754E}, //1770 #CJK UNIFIED IDEOGRAPH
+ {0xACCB, 0x754B}, //1771 #CJK UNIFIED IDEOGRAPH
+ {0xACCC, 0x75AB}, //1772 #CJK UNIFIED IDEOGRAPH
+ {0xACCD, 0x75A4}, //1773 #CJK UNIFIED IDEOGRAPH
+ {0xACCE, 0x75A5}, //1774 #CJK UNIFIED IDEOGRAPH
+ {0xACCF, 0x75A2}, //1775 #CJK UNIFIED IDEOGRAPH
+ {0xACD0, 0x75A3}, //1776 #CJK UNIFIED IDEOGRAPH
+ {0xACD1, 0x7678}, //1777 #CJK UNIFIED IDEOGRAPH
+ {0xACD2, 0x7686}, //1778 #CJK UNIFIED IDEOGRAPH
+ {0xACD3, 0x7687}, //1779 #CJK UNIFIED IDEOGRAPH
+ {0xACD4, 0x7688}, //1780 #CJK UNIFIED IDEOGRAPH
+ {0xACD5, 0x76C8}, //1781 #CJK UNIFIED IDEOGRAPH
+ {0xACD6, 0x76C6}, //1782 #CJK UNIFIED IDEOGRAPH
+ {0xACD7, 0x76C3}, //1783 #CJK UNIFIED IDEOGRAPH
+ {0xACD8, 0x76C5}, //1784 #CJK UNIFIED IDEOGRAPH
+ {0xACD9, 0x7701}, //1785 #CJK UNIFIED IDEOGRAPH
+ {0xACDA, 0x76F9}, //1786 #CJK UNIFIED IDEOGRAPH
+ {0xACDB, 0x76F8}, //1787 #CJK UNIFIED IDEOGRAPH
+ {0xACDC, 0x7709}, //1788 #CJK UNIFIED IDEOGRAPH
+ {0xACDD, 0x770B}, //1789 #CJK UNIFIED IDEOGRAPH
+ {0xACDE, 0x76FE}, //1790 #CJK UNIFIED IDEOGRAPH
+ {0xACDF, 0x76FC}, //1791 #CJK UNIFIED IDEOGRAPH
+ {0xACE0, 0x7707}, //1792 #CJK UNIFIED IDEOGRAPH
+ {0xACE1, 0x77DC}, //1793 #CJK UNIFIED IDEOGRAPH
+ {0xACE2, 0x7802}, //1794 #CJK UNIFIED IDEOGRAPH
+ {0xACE3, 0x7814}, //1795 #CJK UNIFIED IDEOGRAPH
+ {0xACE4, 0x780C}, //1796 #CJK UNIFIED IDEOGRAPH
+ {0xACE5, 0x780D}, //1797 #CJK UNIFIED IDEOGRAPH
+ {0xACE6, 0x7946}, //1798 #CJK UNIFIED IDEOGRAPH
+ {0xACE7, 0x7949}, //1799 #CJK UNIFIED IDEOGRAPH
+ {0xACE8, 0x7948}, //1800 #CJK UNIFIED IDEOGRAPH
+ {0xACE9, 0x7947}, //1801 #CJK UNIFIED IDEOGRAPH
+ {0xACEA, 0x79B9}, //1802 #CJK UNIFIED IDEOGRAPH
+ {0xACEB, 0x79BA}, //1803 #CJK UNIFIED IDEOGRAPH
+ {0xACEC, 0x79D1}, //1804 #CJK UNIFIED IDEOGRAPH
+ {0xACED, 0x79D2}, //1805 #CJK UNIFIED IDEOGRAPH
+ {0xACEE, 0x79CB}, //1806 #CJK UNIFIED IDEOGRAPH
+ {0xACEF, 0x7A7F}, //1807 #CJK UNIFIED IDEOGRAPH
+ {0xACF0, 0x7A81}, //1808 #CJK UNIFIED IDEOGRAPH
+ {0xACF1, 0x7AFF}, //1809 #CJK UNIFIED IDEOGRAPH
+ {0xACF2, 0x7AFD}, //1810 #CJK UNIFIED IDEOGRAPH
+ {0xACF3, 0x7C7D}, //1811 #CJK UNIFIED IDEOGRAPH
+ {0xACF4, 0x7D02}, //1812 #CJK UNIFIED IDEOGRAPH
+ {0xACF5, 0x7D05}, //1813 #CJK UNIFIED IDEOGRAPH
+ {0xACF6, 0x7D00}, //1814 #CJK UNIFIED IDEOGRAPH
+ {0xACF7, 0x7D09}, //1815 #CJK UNIFIED IDEOGRAPH
+ {0xACF8, 0x7D07}, //1816 #CJK UNIFIED IDEOGRAPH
+ {0xACF9, 0x7D04}, //1817 #CJK UNIFIED IDEOGRAPH
+ {0xACFA, 0x7D06}, //1818 #CJK UNIFIED IDEOGRAPH
+ {0xACFB, 0x7F38}, //1819 #CJK UNIFIED IDEOGRAPH
+ {0xACFC, 0x7F8E}, //1820 #CJK UNIFIED IDEOGRAPH
+ {0xACFD, 0x7FBF}, //1821 #CJK UNIFIED IDEOGRAPH
+ {0xACFE, 0x8004}, //1822 #CJK UNIFIED IDEOGRAPH
+ {0xAD40, 0x8010}, //1823 #CJK UNIFIED IDEOGRAPH
+ {0xAD41, 0x800D}, //1824 #CJK UNIFIED IDEOGRAPH
+ {0xAD42, 0x8011}, //1825 #CJK UNIFIED IDEOGRAPH
+ {0xAD43, 0x8036}, //1826 #CJK UNIFIED IDEOGRAPH
+ {0xAD44, 0x80D6}, //1827 #CJK UNIFIED IDEOGRAPH
+ {0xAD45, 0x80E5}, //1828 #CJK UNIFIED IDEOGRAPH
+ {0xAD46, 0x80DA}, //1829 #CJK UNIFIED IDEOGRAPH
+ {0xAD47, 0x80C3}, //1830 #CJK UNIFIED IDEOGRAPH
+ {0xAD48, 0x80C4}, //1831 #CJK UNIFIED IDEOGRAPH
+ {0xAD49, 0x80CC}, //1832 #CJK UNIFIED IDEOGRAPH
+ {0xAD4A, 0x80E1}, //1833 #CJK UNIFIED IDEOGRAPH
+ {0xAD4B, 0x80DB}, //1834 #CJK UNIFIED IDEOGRAPH
+ {0xAD4C, 0x80CE}, //1835 #CJK UNIFIED IDEOGRAPH
+ {0xAD4D, 0x80DE}, //1836 #CJK UNIFIED IDEOGRAPH
+ {0xAD4E, 0x80E4}, //1837 #CJK UNIFIED IDEOGRAPH
+ {0xAD4F, 0x80DD}, //1838 #CJK UNIFIED IDEOGRAPH
+ {0xAD50, 0x81F4}, //1839 #CJK UNIFIED IDEOGRAPH
+ {0xAD51, 0x8222}, //1840 #CJK UNIFIED IDEOGRAPH
+ {0xAD52, 0x82E7}, //1841 #CJK UNIFIED IDEOGRAPH
+ {0xAD53, 0x8303}, //1842 #CJK UNIFIED IDEOGRAPH
+ {0xAD54, 0x8305}, //1843 #CJK UNIFIED IDEOGRAPH
+ {0xAD55, 0x82E3}, //1844 #CJK UNIFIED IDEOGRAPH
+ {0xAD56, 0x82DB}, //1845 #CJK UNIFIED IDEOGRAPH
+ {0xAD57, 0x82E6}, //1846 #CJK UNIFIED IDEOGRAPH
+ {0xAD58, 0x8304}, //1847 #CJK UNIFIED IDEOGRAPH
+ {0xAD59, 0x82E5}, //1848 #CJK UNIFIED IDEOGRAPH
+ {0xAD5A, 0x8302}, //1849 #CJK UNIFIED IDEOGRAPH
+ {0xAD5B, 0x8309}, //1850 #CJK UNIFIED IDEOGRAPH
+ {0xAD5C, 0x82D2}, //1851 #CJK UNIFIED IDEOGRAPH
+ {0xAD5D, 0x82D7}, //1852 #CJK UNIFIED IDEOGRAPH
+ {0xAD5E, 0x82F1}, //1853 #CJK UNIFIED IDEOGRAPH
+ {0xAD5F, 0x8301}, //1854 #CJK UNIFIED IDEOGRAPH
+ {0xAD60, 0x82DC}, //1855 #CJK UNIFIED IDEOGRAPH
+ {0xAD61, 0x82D4}, //1856 #CJK UNIFIED IDEOGRAPH
+ {0xAD62, 0x82D1}, //1857 #CJK UNIFIED IDEOGRAPH
+ {0xAD63, 0x82DE}, //1858 #CJK UNIFIED IDEOGRAPH
+ {0xAD64, 0x82D3}, //1859 #CJK UNIFIED IDEOGRAPH
+ {0xAD65, 0x82DF}, //1860 #CJK UNIFIED IDEOGRAPH
+ {0xAD66, 0x82EF}, //1861 #CJK UNIFIED IDEOGRAPH
+ {0xAD67, 0x8306}, //1862 #CJK UNIFIED IDEOGRAPH
+ {0xAD68, 0x8650}, //1863 #CJK UNIFIED IDEOGRAPH
+ {0xAD69, 0x8679}, //1864 #CJK UNIFIED IDEOGRAPH
+ {0xAD6A, 0x867B}, //1865 #CJK UNIFIED IDEOGRAPH
+ {0xAD6B, 0x867A}, //1866 #CJK UNIFIED IDEOGRAPH
+ {0xAD6C, 0x884D}, //1867 #CJK UNIFIED IDEOGRAPH
+ {0xAD6D, 0x886B}, //1868 #CJK UNIFIED IDEOGRAPH
+ {0xAD6E, 0x8981}, //1869 #CJK UNIFIED IDEOGRAPH
+ {0xAD6F, 0x89D4}, //1870 #CJK UNIFIED IDEOGRAPH
+ {0xAD70, 0x8A08}, //1871 #CJK UNIFIED IDEOGRAPH
+ {0xAD71, 0x8A02}, //1872 #CJK UNIFIED IDEOGRAPH
+ {0xAD72, 0x8A03}, //1873 #CJK UNIFIED IDEOGRAPH
+ {0xAD73, 0x8C9E}, //1874 #CJK UNIFIED IDEOGRAPH
+ {0xAD74, 0x8CA0}, //1875 #CJK UNIFIED IDEOGRAPH
+ {0xAD75, 0x8D74}, //1876 #CJK UNIFIED IDEOGRAPH
+ {0xAD76, 0x8D73}, //1877 #CJK UNIFIED IDEOGRAPH
+ {0xAD77, 0x8DB4}, //1878 #CJK UNIFIED IDEOGRAPH
+ {0xAD78, 0x8ECD}, //1879 #CJK UNIFIED IDEOGRAPH
+ {0xAD79, 0x8ECC}, //1880 #CJK UNIFIED IDEOGRAPH
+ {0xAD7A, 0x8FF0}, //1881 #CJK UNIFIED IDEOGRAPH
+ {0xAD7B, 0x8FE6}, //1882 #CJK UNIFIED IDEOGRAPH
+ {0xAD7C, 0x8FE2}, //1883 #CJK UNIFIED IDEOGRAPH
+ {0xAD7D, 0x8FEA}, //1884 #CJK UNIFIED IDEOGRAPH
+ {0xAD7E, 0x8FE5}, //1885 #CJK UNIFIED IDEOGRAPH
+ {0xADA1, 0x8FED}, //1886 #CJK UNIFIED IDEOGRAPH
+ {0xADA2, 0x8FEB}, //1887 #CJK UNIFIED IDEOGRAPH
+ {0xADA3, 0x8FE4}, //1888 #CJK UNIFIED IDEOGRAPH
+ {0xADA4, 0x8FE8}, //1889 #CJK UNIFIED IDEOGRAPH
+ {0xADA5, 0x90CA}, //1890 #CJK UNIFIED IDEOGRAPH
+ {0xADA6, 0x90CE}, //1891 #CJK UNIFIED IDEOGRAPH
+ {0xADA7, 0x90C1}, //1892 #CJK UNIFIED IDEOGRAPH
+ {0xADA8, 0x90C3}, //1893 #CJK UNIFIED IDEOGRAPH
+ {0xADA9, 0x914B}, //1894 #CJK UNIFIED IDEOGRAPH
+ {0xADAA, 0x914A}, //1895 #CJK UNIFIED IDEOGRAPH
+ {0xADAB, 0x91CD}, //1896 #CJK UNIFIED IDEOGRAPH
+ {0xADAC, 0x9582}, //1897 #CJK UNIFIED IDEOGRAPH
+ {0xADAD, 0x9650}, //1898 #CJK UNIFIED IDEOGRAPH
+ {0xADAE, 0x964B}, //1899 #CJK UNIFIED IDEOGRAPH
+ {0xADAF, 0x964C}, //1900 #CJK UNIFIED IDEOGRAPH
+ {0xADB0, 0x964D}, //1901 #CJK UNIFIED IDEOGRAPH
+ {0xADB1, 0x9762}, //1902 #CJK UNIFIED IDEOGRAPH
+ {0xADB2, 0x9769}, //1903 #CJK UNIFIED IDEOGRAPH
+ {0xADB3, 0x97CB}, //1904 #CJK UNIFIED IDEOGRAPH
+ {0xADB4, 0x97ED}, //1905 #CJK UNIFIED IDEOGRAPH
+ {0xADB5, 0x97F3}, //1906 #CJK UNIFIED IDEOGRAPH
+ {0xADB6, 0x9801}, //1907 #CJK UNIFIED IDEOGRAPH
+ {0xADB7, 0x98A8}, //1908 #CJK UNIFIED IDEOGRAPH
+ {0xADB8, 0x98DB}, //1909 #CJK UNIFIED IDEOGRAPH
+ {0xADB9, 0x98DF}, //1910 #CJK UNIFIED IDEOGRAPH
+ {0xADBA, 0x9996}, //1911 #CJK UNIFIED IDEOGRAPH
+ {0xADBB, 0x9999}, //1912 #CJK UNIFIED IDEOGRAPH
+ {0xADBC, 0x4E58}, //1913 #CJK UNIFIED IDEOGRAPH
+ {0xADBD, 0x4EB3}, //1914 #CJK UNIFIED IDEOGRAPH
+ {0xADBE, 0x500C}, //1915 #CJK UNIFIED IDEOGRAPH
+ {0xADBF, 0x500D}, //1916 #CJK UNIFIED IDEOGRAPH
+ {0xADC0, 0x5023}, //1917 #CJK UNIFIED IDEOGRAPH
+ {0xADC1, 0x4FEF}, //1918 #CJK UNIFIED IDEOGRAPH
+ {0xADC2, 0x5026}, //1919 #CJK UNIFIED IDEOGRAPH
+ {0xADC3, 0x5025}, //1920 #CJK UNIFIED IDEOGRAPH
+ {0xADC4, 0x4FF8}, //1921 #CJK UNIFIED IDEOGRAPH
+ {0xADC5, 0x5029}, //1922 #CJK UNIFIED IDEOGRAPH
+ {0xADC6, 0x5016}, //1923 #CJK UNIFIED IDEOGRAPH
+ {0xADC7, 0x5006}, //1924 #CJK UNIFIED IDEOGRAPH
+ {0xADC8, 0x503C}, //1925 #CJK UNIFIED IDEOGRAPH
+ {0xADC9, 0x501F}, //1926 #CJK UNIFIED IDEOGRAPH
+ {0xADCA, 0x501A}, //1927 #CJK UNIFIED IDEOGRAPH
+ {0xADCB, 0x5012}, //1928 #CJK UNIFIED IDEOGRAPH
+ {0xADCC, 0x5011}, //1929 #CJK UNIFIED IDEOGRAPH
+ {0xADCD, 0x4FFA}, //1930 #CJK UNIFIED IDEOGRAPH
+ {0xADCE, 0x5000}, //1931 #CJK UNIFIED IDEOGRAPH
+ {0xADCF, 0x5014}, //1932 #CJK UNIFIED IDEOGRAPH
+ {0xADD0, 0x5028}, //1933 #CJK UNIFIED IDEOGRAPH
+ {0xADD1, 0x4FF1}, //1934 #CJK UNIFIED IDEOGRAPH
+ {0xADD2, 0x5021}, //1935 #CJK UNIFIED IDEOGRAPH
+ {0xADD3, 0x500B}, //1936 #CJK UNIFIED IDEOGRAPH
+ {0xADD4, 0x5019}, //1937 #CJK UNIFIED IDEOGRAPH
+ {0xADD5, 0x5018}, //1938 #CJK UNIFIED IDEOGRAPH
+ {0xADD6, 0x4FF3}, //1939 #CJK UNIFIED IDEOGRAPH
+ {0xADD7, 0x4FEE}, //1940 #CJK UNIFIED IDEOGRAPH
+ {0xADD8, 0x502D}, //1941 #CJK UNIFIED IDEOGRAPH
+ {0xADD9, 0x502A}, //1942 #CJK UNIFIED IDEOGRAPH
+ {0xADDA, 0x4FFE}, //1943 #CJK UNIFIED IDEOGRAPH
+ {0xADDB, 0x502B}, //1944 #CJK UNIFIED IDEOGRAPH
+ {0xADDC, 0x5009}, //1945 #CJK UNIFIED IDEOGRAPH
+ {0xADDD, 0x517C}, //1946 #CJK UNIFIED IDEOGRAPH
+ {0xADDE, 0x51A4}, //1947 #CJK UNIFIED IDEOGRAPH
+ {0xADDF, 0x51A5}, //1948 #CJK UNIFIED IDEOGRAPH
+ {0xADE0, 0x51A2}, //1949 #CJK UNIFIED IDEOGRAPH
+ {0xADE1, 0x51CD}, //1950 #CJK UNIFIED IDEOGRAPH
+ {0xADE2, 0x51CC}, //1951 #CJK UNIFIED IDEOGRAPH
+ {0xADE3, 0x51C6}, //1952 #CJK UNIFIED IDEOGRAPH
+ {0xADE4, 0x51CB}, //1953 #CJK UNIFIED IDEOGRAPH
+ {0xADE5, 0x5256}, //1954 #CJK UNIFIED IDEOGRAPH
+ {0xADE6, 0x525C}, //1955 #CJK UNIFIED IDEOGRAPH
+ {0xADE7, 0x5254}, //1956 #CJK UNIFIED IDEOGRAPH
+ {0xADE8, 0x525B}, //1957 #CJK UNIFIED IDEOGRAPH
+ {0xADE9, 0x525D}, //1958 #CJK UNIFIED IDEOGRAPH
+ {0xADEA, 0x532A}, //1959 #CJK UNIFIED IDEOGRAPH
+ {0xADEB, 0x537F}, //1960 #CJK UNIFIED IDEOGRAPH
+ {0xADEC, 0x539F}, //1961 #CJK UNIFIED IDEOGRAPH
+ {0xADED, 0x539D}, //1962 #CJK UNIFIED IDEOGRAPH
+ {0xADEE, 0x53DF}, //1963 #CJK UNIFIED IDEOGRAPH
+ {0xADEF, 0x54E8}, //1964 #CJK UNIFIED IDEOGRAPH
+ {0xADF0, 0x5510}, //1965 #CJK UNIFIED IDEOGRAPH
+ {0xADF1, 0x5501}, //1966 #CJK UNIFIED IDEOGRAPH
+ {0xADF2, 0x5537}, //1967 #CJK UNIFIED IDEOGRAPH
+ {0xADF3, 0x54FC}, //1968 #CJK UNIFIED IDEOGRAPH
+ {0xADF4, 0x54E5}, //1969 #CJK UNIFIED IDEOGRAPH
+ {0xADF5, 0x54F2}, //1970 #CJK UNIFIED IDEOGRAPH
+ {0xADF6, 0x5506}, //1971 #CJK UNIFIED IDEOGRAPH
+ {0xADF7, 0x54FA}, //1972 #CJK UNIFIED IDEOGRAPH
+ {0xADF8, 0x5514}, //1973 #CJK UNIFIED IDEOGRAPH
+ {0xADF9, 0x54E9}, //1974 #CJK UNIFIED IDEOGRAPH
+ {0xADFA, 0x54ED}, //1975 #CJK UNIFIED IDEOGRAPH
+ {0xADFB, 0x54E1}, //1976 #CJK UNIFIED IDEOGRAPH
+ {0xADFC, 0x5509}, //1977 #CJK UNIFIED IDEOGRAPH
+ {0xADFD, 0x54EE}, //1978 #CJK UNIFIED IDEOGRAPH
+ {0xADFE, 0x54EA}, //1979 #CJK UNIFIED IDEOGRAPH
+ {0xAE40, 0x54E6}, //1980 #CJK UNIFIED IDEOGRAPH
+ {0xAE41, 0x5527}, //1981 #CJK UNIFIED IDEOGRAPH
+ {0xAE42, 0x5507}, //1982 #CJK UNIFIED IDEOGRAPH
+ {0xAE43, 0x54FD}, //1983 #CJK UNIFIED IDEOGRAPH
+ {0xAE44, 0x550F}, //1984 #CJK UNIFIED IDEOGRAPH
+ {0xAE45, 0x5703}, //1985 #CJK UNIFIED IDEOGRAPH
+ {0xAE46, 0x5704}, //1986 #CJK UNIFIED IDEOGRAPH
+ {0xAE47, 0x57C2}, //1987 #CJK UNIFIED IDEOGRAPH
+ {0xAE48, 0x57D4}, //1988 #CJK UNIFIED IDEOGRAPH
+ {0xAE49, 0x57CB}, //1989 #CJK UNIFIED IDEOGRAPH
+ {0xAE4A, 0x57C3}, //1990 #CJK UNIFIED IDEOGRAPH
+ {0xAE4B, 0x5809}, //1991 #CJK UNIFIED IDEOGRAPH
+ {0xAE4C, 0x590F}, //1992 #CJK UNIFIED IDEOGRAPH
+ {0xAE4D, 0x5957}, //1993 #CJK UNIFIED IDEOGRAPH
+ {0xAE4E, 0x5958}, //1994 #CJK UNIFIED IDEOGRAPH
+ {0xAE4F, 0x595A}, //1995 #CJK UNIFIED IDEOGRAPH
+ {0xAE50, 0x5A11}, //1996 #CJK UNIFIED IDEOGRAPH
+ {0xAE51, 0x5A18}, //1997 #CJK UNIFIED IDEOGRAPH
+ {0xAE52, 0x5A1C}, //1998 #CJK UNIFIED IDEOGRAPH
+ {0xAE53, 0x5A1F}, //1999 #CJK UNIFIED IDEOGRAPH
+ {0xAE54, 0x5A1B}, //2000 #CJK UNIFIED IDEOGRAPH
+ {0xAE55, 0x5A13}, //2001 #CJK UNIFIED IDEOGRAPH
+ {0xAE56, 0x59EC}, //2002 #CJK UNIFIED IDEOGRAPH
+ {0xAE57, 0x5A20}, //2003 #CJK UNIFIED IDEOGRAPH
+ {0xAE58, 0x5A23}, //2004 #CJK UNIFIED IDEOGRAPH
+ {0xAE59, 0x5A29}, //2005 #CJK UNIFIED IDEOGRAPH
+ {0xAE5A, 0x5A25}, //2006 #CJK UNIFIED IDEOGRAPH
+ {0xAE5B, 0x5A0C}, //2007 #CJK UNIFIED IDEOGRAPH
+ {0xAE5C, 0x5A09}, //2008 #CJK UNIFIED IDEOGRAPH
+ {0xAE5D, 0x5B6B}, //2009 #CJK UNIFIED IDEOGRAPH
+ {0xAE5E, 0x5C58}, //2010 #CJK UNIFIED IDEOGRAPH
+ {0xAE5F, 0x5BB0}, //2011 #CJK UNIFIED IDEOGRAPH
+ {0xAE60, 0x5BB3}, //2012 #CJK UNIFIED IDEOGRAPH
+ {0xAE61, 0x5BB6}, //2013 #CJK UNIFIED IDEOGRAPH
+ {0xAE62, 0x5BB4}, //2014 #CJK UNIFIED IDEOGRAPH
+ {0xAE63, 0x5BAE}, //2015 #CJK UNIFIED IDEOGRAPH
+ {0xAE64, 0x5BB5}, //2016 #CJK UNIFIED IDEOGRAPH
+ {0xAE65, 0x5BB9}, //2017 #CJK UNIFIED IDEOGRAPH
+ {0xAE66, 0x5BB8}, //2018 #CJK UNIFIED IDEOGRAPH
+ {0xAE67, 0x5C04}, //2019 #CJK UNIFIED IDEOGRAPH
+ {0xAE68, 0x5C51}, //2020 #CJK UNIFIED IDEOGRAPH
+ {0xAE69, 0x5C55}, //2021 #CJK UNIFIED IDEOGRAPH
+ {0xAE6A, 0x5C50}, //2022 #CJK UNIFIED IDEOGRAPH
+ {0xAE6B, 0x5CED}, //2023 #CJK UNIFIED IDEOGRAPH
+ {0xAE6C, 0x5CFD}, //2024 #CJK UNIFIED IDEOGRAPH
+ {0xAE6D, 0x5CFB}, //2025 #CJK UNIFIED IDEOGRAPH
+ {0xAE6E, 0x5CEA}, //2026 #CJK UNIFIED IDEOGRAPH
+ {0xAE6F, 0x5CE8}, //2027 #CJK UNIFIED IDEOGRAPH
+ {0xAE70, 0x5CF0}, //2028 #CJK UNIFIED IDEOGRAPH
+ {0xAE71, 0x5CF6}, //2029 #CJK UNIFIED IDEOGRAPH
+ {0xAE72, 0x5D01}, //2030 #CJK UNIFIED IDEOGRAPH
+ {0xAE73, 0x5CF4}, //2031 #CJK UNIFIED IDEOGRAPH
+ {0xAE74, 0x5DEE}, //2032 #CJK UNIFIED IDEOGRAPH
+ {0xAE75, 0x5E2D}, //2033 #CJK UNIFIED IDEOGRAPH
+ {0xAE76, 0x5E2B}, //2034 #CJK UNIFIED IDEOGRAPH
+ {0xAE77, 0x5EAB}, //2035 #CJK UNIFIED IDEOGRAPH
+ {0xAE78, 0x5EAD}, //2036 #CJK UNIFIED IDEOGRAPH
+ {0xAE79, 0x5EA7}, //2037 #CJK UNIFIED IDEOGRAPH
+ {0xAE7A, 0x5F31}, //2038 #CJK UNIFIED IDEOGRAPH
+ {0xAE7B, 0x5F92}, //2039 #CJK UNIFIED IDEOGRAPH
+ {0xAE7C, 0x5F91}, //2040 #CJK UNIFIED IDEOGRAPH
+ {0xAE7D, 0x5F90}, //2041 #CJK UNIFIED IDEOGRAPH
+ {0xAE7E, 0x6059}, //2042 #CJK UNIFIED IDEOGRAPH
+ {0xAEA1, 0x6063}, //2043 #CJK UNIFIED IDEOGRAPH
+ {0xAEA2, 0x6065}, //2044 #CJK UNIFIED IDEOGRAPH
+ {0xAEA3, 0x6050}, //2045 #CJK UNIFIED IDEOGRAPH
+ {0xAEA4, 0x6055}, //2046 #CJK UNIFIED IDEOGRAPH
+ {0xAEA5, 0x606D}, //2047 #CJK UNIFIED IDEOGRAPH
+ {0xAEA6, 0x6069}, //2048 #CJK UNIFIED IDEOGRAPH
+ {0xAEA7, 0x606F}, //2049 #CJK UNIFIED IDEOGRAPH
+ {0xAEA8, 0x6084}, //2050 #CJK UNIFIED IDEOGRAPH
+ {0xAEA9, 0x609F}, //2051 #CJK UNIFIED IDEOGRAPH
+ {0xAEAA, 0x609A}, //2052 #CJK UNIFIED IDEOGRAPH
+ {0xAEAB, 0x608D}, //2053 #CJK UNIFIED IDEOGRAPH
+ {0xAEAC, 0x6094}, //2054 #CJK UNIFIED IDEOGRAPH
+ {0xAEAD, 0x608C}, //2055 #CJK UNIFIED IDEOGRAPH
+ {0xAEAE, 0x6085}, //2056 #CJK UNIFIED IDEOGRAPH
+ {0xAEAF, 0x6096}, //2057 #CJK UNIFIED IDEOGRAPH
+ {0xAEB0, 0x6247}, //2058 #CJK UNIFIED IDEOGRAPH
+ {0xAEB1, 0x62F3}, //2059 #CJK UNIFIED IDEOGRAPH
+ {0xAEB2, 0x6308}, //2060 #CJK UNIFIED IDEOGRAPH
+ {0xAEB3, 0x62FF}, //2061 #CJK UNIFIED IDEOGRAPH
+ {0xAEB4, 0x634E}, //2062 #CJK UNIFIED IDEOGRAPH
+ {0xAEB5, 0x633E}, //2063 #CJK UNIFIED IDEOGRAPH
+ {0xAEB6, 0x632F}, //2064 #CJK UNIFIED IDEOGRAPH
+ {0xAEB7, 0x6355}, //2065 #CJK UNIFIED IDEOGRAPH
+ {0xAEB8, 0x6342}, //2066 #CJK UNIFIED IDEOGRAPH
+ {0xAEB9, 0x6346}, //2067 #CJK UNIFIED IDEOGRAPH
+ {0xAEBA, 0x634F}, //2068 #CJK UNIFIED IDEOGRAPH
+ {0xAEBB, 0x6349}, //2069 #CJK UNIFIED IDEOGRAPH
+ {0xAEBC, 0x633A}, //2070 #CJK UNIFIED IDEOGRAPH
+ {0xAEBD, 0x6350}, //2071 #CJK UNIFIED IDEOGRAPH
+ {0xAEBE, 0x633D}, //2072 #CJK UNIFIED IDEOGRAPH
+ {0xAEBF, 0x632A}, //2073 #CJK UNIFIED IDEOGRAPH
+ {0xAEC0, 0x632B}, //2074 #CJK UNIFIED IDEOGRAPH
+ {0xAEC1, 0x6328}, //2075 #CJK UNIFIED IDEOGRAPH
+ {0xAEC2, 0x634D}, //2076 #CJK UNIFIED IDEOGRAPH
+ {0xAEC3, 0x634C}, //2077 #CJK UNIFIED IDEOGRAPH
+ {0xAEC4, 0x6548}, //2078 #CJK UNIFIED IDEOGRAPH
+ {0xAEC5, 0x6549}, //2079 #CJK UNIFIED IDEOGRAPH
+ {0xAEC6, 0x6599}, //2080 #CJK UNIFIED IDEOGRAPH
+ {0xAEC7, 0x65C1}, //2081 #CJK UNIFIED IDEOGRAPH
+ {0xAEC8, 0x65C5}, //2082 #CJK UNIFIED IDEOGRAPH
+ {0xAEC9, 0x6642}, //2083 #CJK UNIFIED IDEOGRAPH
+ {0xAECA, 0x6649}, //2084 #CJK UNIFIED IDEOGRAPH
+ {0xAECB, 0x664F}, //2085 #CJK UNIFIED IDEOGRAPH
+ {0xAECC, 0x6643}, //2086 #CJK UNIFIED IDEOGRAPH
+ {0xAECD, 0x6652}, //2087 #CJK UNIFIED IDEOGRAPH
+ {0xAECE, 0x664C}, //2088 #CJK UNIFIED IDEOGRAPH
+ {0xAECF, 0x6645}, //2089 #CJK UNIFIED IDEOGRAPH
+ {0xAED0, 0x6641}, //2090 #CJK UNIFIED IDEOGRAPH
+ {0xAED1, 0x66F8}, //2091 #CJK UNIFIED IDEOGRAPH
+ {0xAED2, 0x6714}, //2092 #CJK UNIFIED IDEOGRAPH
+ {0xAED3, 0x6715}, //2093 #CJK UNIFIED IDEOGRAPH
+ {0xAED4, 0x6717}, //2094 #CJK UNIFIED IDEOGRAPH
+ {0xAED5, 0x6821}, //2095 #CJK UNIFIED IDEOGRAPH
+ {0xAED6, 0x6838}, //2096 #CJK UNIFIED IDEOGRAPH
+ {0xAED7, 0x6848}, //2097 #CJK UNIFIED IDEOGRAPH
+ {0xAED8, 0x6846}, //2098 #CJK UNIFIED IDEOGRAPH
+ {0xAED9, 0x6853}, //2099 #CJK UNIFIED IDEOGRAPH
+ {0xAEDA, 0x6839}, //2100 #CJK UNIFIED IDEOGRAPH
+ {0xAEDB, 0x6842}, //2101 #CJK UNIFIED IDEOGRAPH
+ {0xAEDC, 0x6854}, //2102 #CJK UNIFIED IDEOGRAPH
+ {0xAEDD, 0x6829}, //2103 #CJK UNIFIED IDEOGRAPH
+ {0xAEDE, 0x68B3}, //2104 #CJK UNIFIED IDEOGRAPH
+ {0xAEDF, 0x6817}, //2105 #CJK UNIFIED IDEOGRAPH
+ {0xAEE0, 0x684C}, //2106 #CJK UNIFIED IDEOGRAPH
+ {0xAEE1, 0x6851}, //2107 #CJK UNIFIED IDEOGRAPH
+ {0xAEE2, 0x683D}, //2108 #CJK UNIFIED IDEOGRAPH
+ {0xAEE3, 0x67F4}, //2109 #CJK UNIFIED IDEOGRAPH
+ {0xAEE4, 0x6850}, //2110 #CJK UNIFIED IDEOGRAPH
+ {0xAEE5, 0x6840}, //2111 #CJK UNIFIED IDEOGRAPH
+ {0xAEE6, 0x683C}, //2112 #CJK UNIFIED IDEOGRAPH
+ {0xAEE7, 0x6843}, //2113 #CJK UNIFIED IDEOGRAPH
+ {0xAEE8, 0x682A}, //2114 #CJK UNIFIED IDEOGRAPH
+ {0xAEE9, 0x6845}, //2115 #CJK UNIFIED IDEOGRAPH
+ {0xAEEA, 0x6813}, //2116 #CJK UNIFIED IDEOGRAPH
+ {0xAEEB, 0x6818}, //2117 #CJK UNIFIED IDEOGRAPH
+ {0xAEEC, 0x6841}, //2118 #CJK UNIFIED IDEOGRAPH
+ {0xAEED, 0x6B8A}, //2119 #CJK UNIFIED IDEOGRAPH
+ {0xAEEE, 0x6B89}, //2120 #CJK UNIFIED IDEOGRAPH
+ {0xAEEF, 0x6BB7}, //2121 #CJK UNIFIED IDEOGRAPH
+ {0xAEF0, 0x6C23}, //2122 #CJK UNIFIED IDEOGRAPH
+ {0xAEF1, 0x6C27}, //2123 #CJK UNIFIED IDEOGRAPH
+ {0xAEF2, 0x6C28}, //2124 #CJK UNIFIED IDEOGRAPH
+ {0xAEF3, 0x6C26}, //2125 #CJK UNIFIED IDEOGRAPH
+ {0xAEF4, 0x6C24}, //2126 #CJK UNIFIED IDEOGRAPH
+ {0xAEF5, 0x6CF0}, //2127 #CJK UNIFIED IDEOGRAPH
+ {0xAEF6, 0x6D6A}, //2128 #CJK UNIFIED IDEOGRAPH
+ {0xAEF7, 0x6D95}, //2129 #CJK UNIFIED IDEOGRAPH
+ {0xAEF8, 0x6D88}, //2130 #CJK UNIFIED IDEOGRAPH
+ {0xAEF9, 0x6D87}, //2131 #CJK UNIFIED IDEOGRAPH
+ {0xAEFA, 0x6D66}, //2132 #CJK UNIFIED IDEOGRAPH
+ {0xAEFB, 0x6D78}, //2133 #CJK UNIFIED IDEOGRAPH
+ {0xAEFC, 0x6D77}, //2134 #CJK UNIFIED IDEOGRAPH
+ {0xAEFD, 0x6D59}, //2135 #CJK UNIFIED IDEOGRAPH
+ {0xAEFE, 0x6D93}, //2136 #CJK UNIFIED IDEOGRAPH
+ {0xAF40, 0x6D6C}, //2137 #CJK UNIFIED IDEOGRAPH
+ {0xAF41, 0x6D89}, //2138 #CJK UNIFIED IDEOGRAPH
+ {0xAF42, 0x6D6E}, //2139 #CJK UNIFIED IDEOGRAPH
+ {0xAF43, 0x6D5A}, //2140 #CJK UNIFIED IDEOGRAPH
+ {0xAF44, 0x6D74}, //2141 #CJK UNIFIED IDEOGRAPH
+ {0xAF45, 0x6D69}, //2142 #CJK UNIFIED IDEOGRAPH
+ {0xAF46, 0x6D8C}, //2143 #CJK UNIFIED IDEOGRAPH
+ {0xAF47, 0x6D8A}, //2144 #CJK UNIFIED IDEOGRAPH
+ {0xAF48, 0x6D79}, //2145 #CJK UNIFIED IDEOGRAPH
+ {0xAF49, 0x6D85}, //2146 #CJK UNIFIED IDEOGRAPH
+ {0xAF4A, 0x6D65}, //2147 #CJK UNIFIED IDEOGRAPH
+ {0xAF4B, 0x6D94}, //2148 #CJK UNIFIED IDEOGRAPH
+ {0xAF4C, 0x70CA}, //2149 #CJK UNIFIED IDEOGRAPH
+ {0xAF4D, 0x70D8}, //2150 #CJK UNIFIED IDEOGRAPH
+ {0xAF4E, 0x70E4}, //2151 #CJK UNIFIED IDEOGRAPH
+ {0xAF4F, 0x70D9}, //2152 #CJK UNIFIED IDEOGRAPH
+ {0xAF50, 0x70C8}, //2153 #CJK UNIFIED IDEOGRAPH
+ {0xAF51, 0x70CF}, //2154 #CJK UNIFIED IDEOGRAPH
+ {0xAF52, 0x7239}, //2155 #CJK UNIFIED IDEOGRAPH
+ {0xAF53, 0x7279}, //2156 #CJK UNIFIED IDEOGRAPH
+ {0xAF54, 0x72FC}, //2157 #CJK UNIFIED IDEOGRAPH
+ {0xAF55, 0x72F9}, //2158 #CJK UNIFIED IDEOGRAPH
+ {0xAF56, 0x72FD}, //2159 #CJK UNIFIED IDEOGRAPH
+ {0xAF57, 0x72F8}, //2160 #CJK UNIFIED IDEOGRAPH
+ {0xAF58, 0x72F7}, //2161 #CJK UNIFIED IDEOGRAPH
+ {0xAF59, 0x7386}, //2162 #CJK UNIFIED IDEOGRAPH
+ {0xAF5A, 0x73ED}, //2163 #CJK UNIFIED IDEOGRAPH
+ {0xAF5B, 0x7409}, //2164 #CJK UNIFIED IDEOGRAPH
+ {0xAF5C, 0x73EE}, //2165 #CJK UNIFIED IDEOGRAPH
+ {0xAF5D, 0x73E0}, //2166 #CJK UNIFIED IDEOGRAPH
+ {0xAF5E, 0x73EA}, //2167 #CJK UNIFIED IDEOGRAPH
+ {0xAF5F, 0x73DE}, //2168 #CJK UNIFIED IDEOGRAPH
+ {0xAF60, 0x7554}, //2169 #CJK UNIFIED IDEOGRAPH
+ {0xAF61, 0x755D}, //2170 #CJK UNIFIED IDEOGRAPH
+ {0xAF62, 0x755C}, //2171 #CJK UNIFIED IDEOGRAPH
+ {0xAF63, 0x755A}, //2172 #CJK UNIFIED IDEOGRAPH
+ {0xAF64, 0x7559}, //2173 #CJK UNIFIED IDEOGRAPH
+ {0xAF65, 0x75BE}, //2174 #CJK UNIFIED IDEOGRAPH
+ {0xAF66, 0x75C5}, //2175 #CJK UNIFIED IDEOGRAPH
+ {0xAF67, 0x75C7}, //2176 #CJK UNIFIED IDEOGRAPH
+ {0xAF68, 0x75B2}, //2177 #CJK UNIFIED IDEOGRAPH
+ {0xAF69, 0x75B3}, //2178 #CJK UNIFIED IDEOGRAPH
+ {0xAF6A, 0x75BD}, //2179 #CJK UNIFIED IDEOGRAPH
+ {0xAF6B, 0x75BC}, //2180 #CJK UNIFIED IDEOGRAPH
+ {0xAF6C, 0x75B9}, //2181 #CJK UNIFIED IDEOGRAPH
+ {0xAF6D, 0x75C2}, //2182 #CJK UNIFIED IDEOGRAPH
+ {0xAF6E, 0x75B8}, //2183 #CJK UNIFIED IDEOGRAPH
+ {0xAF6F, 0x768B}, //2184 #CJK UNIFIED IDEOGRAPH
+ {0xAF70, 0x76B0}, //2185 #CJK UNIFIED IDEOGRAPH
+ {0xAF71, 0x76CA}, //2186 #CJK UNIFIED IDEOGRAPH
+ {0xAF72, 0x76CD}, //2187 #CJK UNIFIED IDEOGRAPH
+ {0xAF73, 0x76CE}, //2188 #CJK UNIFIED IDEOGRAPH
+ {0xAF74, 0x7729}, //2189 #CJK UNIFIED IDEOGRAPH
+ {0xAF75, 0x771F}, //2190 #CJK UNIFIED IDEOGRAPH
+ {0xAF76, 0x7720}, //2191 #CJK UNIFIED IDEOGRAPH
+ {0xAF77, 0x7728}, //2192 #CJK UNIFIED IDEOGRAPH
+ {0xAF78, 0x77E9}, //2193 #CJK UNIFIED IDEOGRAPH
+ {0xAF79, 0x7830}, //2194 #CJK UNIFIED IDEOGRAPH
+ {0xAF7A, 0x7827}, //2195 #CJK UNIFIED IDEOGRAPH
+ {0xAF7B, 0x7838}, //2196 #CJK UNIFIED IDEOGRAPH
+ {0xAF7C, 0x781D}, //2197 #CJK UNIFIED IDEOGRAPH
+ {0xAF7D, 0x7834}, //2198 #CJK UNIFIED IDEOGRAPH
+ {0xAF7E, 0x7837}, //2199 #CJK UNIFIED IDEOGRAPH
+ {0xAFA1, 0x7825}, //2200 #CJK UNIFIED IDEOGRAPH
+ {0xAFA2, 0x782D}, //2201 #CJK UNIFIED IDEOGRAPH
+ {0xAFA3, 0x7820}, //2202 #CJK UNIFIED IDEOGRAPH
+ {0xAFA4, 0x781F}, //2203 #CJK UNIFIED IDEOGRAPH
+ {0xAFA5, 0x7832}, //2204 #CJK UNIFIED IDEOGRAPH
+ {0xAFA6, 0x7955}, //2205 #CJK UNIFIED IDEOGRAPH
+ {0xAFA7, 0x7950}, //2206 #CJK UNIFIED IDEOGRAPH
+ {0xAFA8, 0x7960}, //2207 #CJK UNIFIED IDEOGRAPH
+ {0xAFA9, 0x795F}, //2208 #CJK UNIFIED IDEOGRAPH
+ {0xAFAA, 0x7956}, //2209 #CJK UNIFIED IDEOGRAPH
+ {0xAFAB, 0x795E}, //2210 #CJK UNIFIED IDEOGRAPH
+ {0xAFAC, 0x795D}, //2211 #CJK UNIFIED IDEOGRAPH
+ {0xAFAD, 0x7957}, //2212 #CJK UNIFIED IDEOGRAPH
+ {0xAFAE, 0x795A}, //2213 #CJK UNIFIED IDEOGRAPH
+ {0xAFAF, 0x79E4}, //2214 #CJK UNIFIED IDEOGRAPH
+ {0xAFB0, 0x79E3}, //2215 #CJK UNIFIED IDEOGRAPH
+ {0xAFB1, 0x79E7}, //2216 #CJK UNIFIED IDEOGRAPH
+ {0xAFB2, 0x79DF}, //2217 #CJK UNIFIED IDEOGRAPH
+ {0xAFB3, 0x79E6}, //2218 #CJK UNIFIED IDEOGRAPH
+ {0xAFB4, 0x79E9}, //2219 #CJK UNIFIED IDEOGRAPH
+ {0xAFB5, 0x79D8}, //2220 #CJK UNIFIED IDEOGRAPH
+ {0xAFB6, 0x7A84}, //2221 #CJK UNIFIED IDEOGRAPH
+ {0xAFB7, 0x7A88}, //2222 #CJK UNIFIED IDEOGRAPH
+ {0xAFB8, 0x7AD9}, //2223 #CJK UNIFIED IDEOGRAPH
+ {0xAFB9, 0x7B06}, //2224 #CJK UNIFIED IDEOGRAPH
+ {0xAFBA, 0x7B11}, //2225 #CJK UNIFIED IDEOGRAPH
+ {0xAFBB, 0x7C89}, //2226 #CJK UNIFIED IDEOGRAPH
+ {0xAFBC, 0x7D21}, //2227 #CJK UNIFIED IDEOGRAPH
+ {0xAFBD, 0x7D17}, //2228 #CJK UNIFIED IDEOGRAPH
+ {0xAFBE, 0x7D0B}, //2229 #CJK UNIFIED IDEOGRAPH
+ {0xAFBF, 0x7D0A}, //2230 #CJK UNIFIED IDEOGRAPH
+ {0xAFC0, 0x7D20}, //2231 #CJK UNIFIED IDEOGRAPH
+ {0xAFC1, 0x7D22}, //2232 #CJK UNIFIED IDEOGRAPH
+ {0xAFC2, 0x7D14}, //2233 #CJK UNIFIED IDEOGRAPH
+ {0xAFC3, 0x7D10}, //2234 #CJK UNIFIED IDEOGRAPH
+ {0xAFC4, 0x7D15}, //2235 #CJK UNIFIED IDEOGRAPH
+ {0xAFC5, 0x7D1A}, //2236 #CJK UNIFIED IDEOGRAPH
+ {0xAFC6, 0x7D1C}, //2237 #CJK UNIFIED IDEOGRAPH
+ {0xAFC7, 0x7D0D}, //2238 #CJK UNIFIED IDEOGRAPH
+ {0xAFC8, 0x7D19}, //2239 #CJK UNIFIED IDEOGRAPH
+ {0xAFC9, 0x7D1B}, //2240 #CJK UNIFIED IDEOGRAPH
+ {0xAFCA, 0x7F3A}, //2241 #CJK UNIFIED IDEOGRAPH
+ {0xAFCB, 0x7F5F}, //2242 #CJK UNIFIED IDEOGRAPH
+ {0xAFCC, 0x7F94}, //2243 #CJK UNIFIED IDEOGRAPH
+ {0xAFCD, 0x7FC5}, //2244 #CJK UNIFIED IDEOGRAPH
+ {0xAFCE, 0x7FC1}, //2245 #CJK UNIFIED IDEOGRAPH
+ {0xAFCF, 0x8006}, //2246 #CJK UNIFIED IDEOGRAPH
+ {0xAFD0, 0x8018}, //2247 #CJK UNIFIED IDEOGRAPH
+ {0xAFD1, 0x8015}, //2248 #CJK UNIFIED IDEOGRAPH
+ {0xAFD2, 0x8019}, //2249 #CJK UNIFIED IDEOGRAPH
+ {0xAFD3, 0x8017}, //2250 #CJK UNIFIED IDEOGRAPH
+ {0xAFD4, 0x803D}, //2251 #CJK UNIFIED IDEOGRAPH
+ {0xAFD5, 0x803F}, //2252 #CJK UNIFIED IDEOGRAPH
+ {0xAFD6, 0x80F1}, //2253 #CJK UNIFIED IDEOGRAPH
+ {0xAFD7, 0x8102}, //2254 #CJK UNIFIED IDEOGRAPH
+ {0xAFD8, 0x80F0}, //2255 #CJK UNIFIED IDEOGRAPH
+ {0xAFD9, 0x8105}, //2256 #CJK UNIFIED IDEOGRAPH
+ {0xAFDA, 0x80ED}, //2257 #CJK UNIFIED IDEOGRAPH
+ {0xAFDB, 0x80F4}, //2258 #CJK UNIFIED IDEOGRAPH
+ {0xAFDC, 0x8106}, //2259 #CJK UNIFIED IDEOGRAPH
+ {0xAFDD, 0x80F8}, //2260 #CJK UNIFIED IDEOGRAPH
+ {0xAFDE, 0x80F3}, //2261 #CJK UNIFIED IDEOGRAPH
+ {0xAFDF, 0x8108}, //2262 #CJK UNIFIED IDEOGRAPH
+ {0xAFE0, 0x80FD}, //2263 #CJK UNIFIED IDEOGRAPH
+ {0xAFE1, 0x810A}, //2264 #CJK UNIFIED IDEOGRAPH
+ {0xAFE2, 0x80FC}, //2265 #CJK UNIFIED IDEOGRAPH
+ {0xAFE3, 0x80EF}, //2266 #CJK UNIFIED IDEOGRAPH
+ {0xAFE4, 0x81ED}, //2267 #CJK UNIFIED IDEOGRAPH
+ {0xAFE5, 0x81EC}, //2268 #CJK UNIFIED IDEOGRAPH
+ {0xAFE6, 0x8200}, //2269 #CJK UNIFIED IDEOGRAPH
+ {0xAFE7, 0x8210}, //2270 #CJK UNIFIED IDEOGRAPH
+ {0xAFE8, 0x822A}, //2271 #CJK UNIFIED IDEOGRAPH
+ {0xAFE9, 0x822B}, //2272 #CJK UNIFIED IDEOGRAPH
+ {0xAFEA, 0x8228}, //2273 #CJK UNIFIED IDEOGRAPH
+ {0xAFEB, 0x822C}, //2274 #CJK UNIFIED IDEOGRAPH
+ {0xAFEC, 0x82BB}, //2275 #CJK UNIFIED IDEOGRAPH
+ {0xAFED, 0x832B}, //2276 #CJK UNIFIED IDEOGRAPH
+ {0xAFEE, 0x8352}, //2277 #CJK UNIFIED IDEOGRAPH
+ {0xAFEF, 0x8354}, //2278 #CJK UNIFIED IDEOGRAPH
+ {0xAFF0, 0x834A}, //2279 #CJK UNIFIED IDEOGRAPH
+ {0xAFF1, 0x8338}, //2280 #CJK UNIFIED IDEOGRAPH
+ {0xAFF2, 0x8350}, //2281 #CJK UNIFIED IDEOGRAPH
+ {0xAFF3, 0x8349}, //2282 #CJK UNIFIED IDEOGRAPH
+ {0xAFF4, 0x8335}, //2283 #CJK UNIFIED IDEOGRAPH
+ {0xAFF5, 0x8334}, //2284 #CJK UNIFIED IDEOGRAPH
+ {0xAFF6, 0x834F}, //2285 #CJK UNIFIED IDEOGRAPH
+ {0xAFF7, 0x8332}, //2286 #CJK UNIFIED IDEOGRAPH
+ {0xAFF8, 0x8339}, //2287 #CJK UNIFIED IDEOGRAPH
+ {0xAFF9, 0x8336}, //2288 #CJK UNIFIED IDEOGRAPH
+ {0xAFFA, 0x8317}, //2289 #CJK UNIFIED IDEOGRAPH
+ {0xAFFB, 0x8340}, //2290 #CJK UNIFIED IDEOGRAPH
+ {0xAFFC, 0x8331}, //2291 #CJK UNIFIED IDEOGRAPH
+ {0xAFFD, 0x8328}, //2292 #CJK UNIFIED IDEOGRAPH
+ {0xAFFE, 0x8343}, //2293 #CJK UNIFIED IDEOGRAPH
+ {0xB040, 0x8654}, //2294 #CJK UNIFIED IDEOGRAPH
+ {0xB041, 0x868A}, //2295 #CJK UNIFIED IDEOGRAPH
+ {0xB042, 0x86AA}, //2296 #CJK UNIFIED IDEOGRAPH
+ {0xB043, 0x8693}, //2297 #CJK UNIFIED IDEOGRAPH
+ {0xB044, 0x86A4}, //2298 #CJK UNIFIED IDEOGRAPH
+ {0xB045, 0x86A9}, //2299 #CJK UNIFIED IDEOGRAPH
+ {0xB046, 0x868C}, //2300 #CJK UNIFIED IDEOGRAPH
+ {0xB047, 0x86A3}, //2301 #CJK UNIFIED IDEOGRAPH
+ {0xB048, 0x869C}, //2302 #CJK UNIFIED IDEOGRAPH
+ {0xB049, 0x8870}, //2303 #CJK UNIFIED IDEOGRAPH
+ {0xB04A, 0x8877}, //2304 #CJK UNIFIED IDEOGRAPH
+ {0xB04B, 0x8881}, //2305 #CJK UNIFIED IDEOGRAPH
+ {0xB04C, 0x8882}, //2306 #CJK UNIFIED IDEOGRAPH
+ {0xB04D, 0x887D}, //2307 #CJK UNIFIED IDEOGRAPH
+ {0xB04E, 0x8879}, //2308 #CJK UNIFIED IDEOGRAPH
+ {0xB04F, 0x8A18}, //2309 #CJK UNIFIED IDEOGRAPH
+ {0xB050, 0x8A10}, //2310 #CJK UNIFIED IDEOGRAPH
+ {0xB051, 0x8A0E}, //2311 #CJK UNIFIED IDEOGRAPH
+ {0xB052, 0x8A0C}, //2312 #CJK UNIFIED IDEOGRAPH
+ {0xB053, 0x8A15}, //2313 #CJK UNIFIED IDEOGRAPH
+ {0xB054, 0x8A0A}, //2314 #CJK UNIFIED IDEOGRAPH
+ {0xB055, 0x8A17}, //2315 #CJK UNIFIED IDEOGRAPH
+ {0xB056, 0x8A13}, //2316 #CJK UNIFIED IDEOGRAPH
+ {0xB057, 0x8A16}, //2317 #CJK UNIFIED IDEOGRAPH
+ {0xB058, 0x8A0F}, //2318 #CJK UNIFIED IDEOGRAPH
+ {0xB059, 0x8A11}, //2319 #CJK UNIFIED IDEOGRAPH
+ {0xB05A, 0x8C48}, //2320 #CJK UNIFIED IDEOGRAPH
+ {0xB05B, 0x8C7A}, //2321 #CJK UNIFIED IDEOGRAPH
+ {0xB05C, 0x8C79}, //2322 #CJK UNIFIED IDEOGRAPH
+ {0xB05D, 0x8CA1}, //2323 #CJK UNIFIED IDEOGRAPH
+ {0xB05E, 0x8CA2}, //2324 #CJK UNIFIED IDEOGRAPH
+ {0xB05F, 0x8D77}, //2325 #CJK UNIFIED IDEOGRAPH
+ {0xB060, 0x8EAC}, //2326 #CJK UNIFIED IDEOGRAPH
+ {0xB061, 0x8ED2}, //2327 #CJK UNIFIED IDEOGRAPH
+ {0xB062, 0x8ED4}, //2328 #CJK UNIFIED IDEOGRAPH
+ {0xB063, 0x8ECF}, //2329 #CJK UNIFIED IDEOGRAPH
+ {0xB064, 0x8FB1}, //2330 #CJK UNIFIED IDEOGRAPH
+ {0xB065, 0x9001}, //2331 #CJK UNIFIED IDEOGRAPH
+ {0xB066, 0x9006}, //2332 #CJK UNIFIED IDEOGRAPH
+ {0xB067, 0x8FF7}, //2333 #CJK UNIFIED IDEOGRAPH
+ {0xB068, 0x9000}, //2334 #CJK UNIFIED IDEOGRAPH
+ {0xB069, 0x8FFA}, //2335 #CJK UNIFIED IDEOGRAPH
+ {0xB06A, 0x8FF4}, //2336 #CJK UNIFIED IDEOGRAPH
+ {0xB06B, 0x9003}, //2337 #CJK UNIFIED IDEOGRAPH
+ {0xB06C, 0x8FFD}, //2338 #CJK UNIFIED IDEOGRAPH
+ {0xB06D, 0x9005}, //2339 #CJK UNIFIED IDEOGRAPH
+ {0xB06E, 0x8FF8}, //2340 #CJK UNIFIED IDEOGRAPH
+ {0xB06F, 0x9095}, //2341 #CJK UNIFIED IDEOGRAPH
+ {0xB070, 0x90E1}, //2342 #CJK UNIFIED IDEOGRAPH
+ {0xB071, 0x90DD}, //2343 #CJK UNIFIED IDEOGRAPH
+ {0xB072, 0x90E2}, //2344 #CJK UNIFIED IDEOGRAPH
+ {0xB073, 0x9152}, //2345 #CJK UNIFIED IDEOGRAPH
+ {0xB074, 0x914D}, //2346 #CJK UNIFIED IDEOGRAPH
+ {0xB075, 0x914C}, //2347 #CJK UNIFIED IDEOGRAPH
+ {0xB076, 0x91D8}, //2348 #CJK UNIFIED IDEOGRAPH
+ {0xB077, 0x91DD}, //2349 #CJK UNIFIED IDEOGRAPH
+ {0xB078, 0x91D7}, //2350 #CJK UNIFIED IDEOGRAPH
+ {0xB079, 0x91DC}, //2351 #CJK UNIFIED IDEOGRAPH
+ {0xB07A, 0x91D9}, //2352 #CJK UNIFIED IDEOGRAPH
+ {0xB07B, 0x9583}, //2353 #CJK UNIFIED IDEOGRAPH
+ {0xB07C, 0x9662}, //2354 #CJK UNIFIED IDEOGRAPH
+ {0xB07D, 0x9663}, //2355 #CJK UNIFIED IDEOGRAPH
+ {0xB07E, 0x9661}, //2356 #CJK UNIFIED IDEOGRAPH
+ {0xB0A1, 0x965B}, //2357 #CJK UNIFIED IDEOGRAPH
+ {0xB0A2, 0x965D}, //2358 #CJK UNIFIED IDEOGRAPH
+ {0xB0A3, 0x9664}, //2359 #CJK UNIFIED IDEOGRAPH
+ {0xB0A4, 0x9658}, //2360 #CJK UNIFIED IDEOGRAPH
+ {0xB0A5, 0x965E}, //2361 #CJK UNIFIED IDEOGRAPH
+ {0xB0A6, 0x96BB}, //2362 #CJK UNIFIED IDEOGRAPH
+ {0xB0A7, 0x98E2}, //2363 #CJK UNIFIED IDEOGRAPH
+ {0xB0A8, 0x99AC}, //2364 #CJK UNIFIED IDEOGRAPH
+ {0xB0A9, 0x9AA8}, //2365 #CJK UNIFIED IDEOGRAPH
+ {0xB0AA, 0x9AD8}, //2366 #CJK UNIFIED IDEOGRAPH
+ {0xB0AB, 0x9B25}, //2367 #CJK UNIFIED IDEOGRAPH
+ {0xB0AC, 0x9B32}, //2368 #CJK UNIFIED IDEOGRAPH
+ {0xB0AD, 0x9B3C}, //2369 #CJK UNIFIED IDEOGRAPH
+ {0xB0AE, 0x4E7E}, //2370 #CJK UNIFIED IDEOGRAPH
+ {0xB0AF, 0x507A}, //2371 #CJK UNIFIED IDEOGRAPH
+ {0xB0B0, 0x507D}, //2372 #CJK UNIFIED IDEOGRAPH
+ {0xB0B1, 0x505C}, //2373 #CJK UNIFIED IDEOGRAPH
+ {0xB0B2, 0x5047}, //2374 #CJK UNIFIED IDEOGRAPH
+ {0xB0B3, 0x5043}, //2375 #CJK UNIFIED IDEOGRAPH
+ {0xB0B4, 0x504C}, //2376 #CJK UNIFIED IDEOGRAPH
+ {0xB0B5, 0x505A}, //2377 #CJK UNIFIED IDEOGRAPH
+ {0xB0B6, 0x5049}, //2378 #CJK UNIFIED IDEOGRAPH
+ {0xB0B7, 0x5065}, //2379 #CJK UNIFIED IDEOGRAPH
+ {0xB0B8, 0x5076}, //2380 #CJK UNIFIED IDEOGRAPH
+ {0xB0B9, 0x504E}, //2381 #CJK UNIFIED IDEOGRAPH
+ {0xB0BA, 0x5055}, //2382 #CJK UNIFIED IDEOGRAPH
+ {0xB0BB, 0x5075}, //2383 #CJK UNIFIED IDEOGRAPH
+ {0xB0BC, 0x5074}, //2384 #CJK UNIFIED IDEOGRAPH
+ {0xB0BD, 0x5077}, //2385 #CJK UNIFIED IDEOGRAPH
+ {0xB0BE, 0x504F}, //2386 #CJK UNIFIED IDEOGRAPH
+ {0xB0BF, 0x500F}, //2387 #CJK UNIFIED IDEOGRAPH
+ {0xB0C0, 0x506F}, //2388 #CJK UNIFIED IDEOGRAPH
+ {0xB0C1, 0x506D}, //2389 #CJK UNIFIED IDEOGRAPH
+ {0xB0C2, 0x515C}, //2390 #CJK UNIFIED IDEOGRAPH
+ {0xB0C3, 0x5195}, //2391 #CJK UNIFIED IDEOGRAPH
+ {0xB0C4, 0x51F0}, //2392 #CJK UNIFIED IDEOGRAPH
+ {0xB0C5, 0x526A}, //2393 #CJK UNIFIED IDEOGRAPH
+ {0xB0C6, 0x526F}, //2394 #CJK UNIFIED IDEOGRAPH
+ {0xB0C7, 0x52D2}, //2395 #CJK UNIFIED IDEOGRAPH
+ {0xB0C8, 0x52D9}, //2396 #CJK UNIFIED IDEOGRAPH
+ {0xB0C9, 0x52D8}, //2397 #CJK UNIFIED IDEOGRAPH
+ {0xB0CA, 0x52D5}, //2398 #CJK UNIFIED IDEOGRAPH
+ {0xB0CB, 0x5310}, //2399 #CJK UNIFIED IDEOGRAPH
+ {0xB0CC, 0x530F}, //2400 #CJK UNIFIED IDEOGRAPH
+ {0xB0CD, 0x5319}, //2401 #CJK UNIFIED IDEOGRAPH
+ {0xB0CE, 0x533F}, //2402 #CJK UNIFIED IDEOGRAPH
+ {0xB0CF, 0x5340}, //2403 #CJK UNIFIED IDEOGRAPH
+ {0xB0D0, 0x533E}, //2404 #CJK UNIFIED IDEOGRAPH
+ {0xB0D1, 0x53C3}, //2405 #CJK UNIFIED IDEOGRAPH
+ {0xB0D2, 0x66FC}, //2406 #CJK UNIFIED IDEOGRAPH
+ {0xB0D3, 0x5546}, //2407 #CJK UNIFIED IDEOGRAPH
+ {0xB0D4, 0x556A}, //2408 #CJK UNIFIED IDEOGRAPH
+ {0xB0D5, 0x5566}, //2409 #CJK UNIFIED IDEOGRAPH
+ {0xB0D6, 0x5544}, //2410 #CJK UNIFIED IDEOGRAPH
+ {0xB0D7, 0x555E}, //2411 #CJK UNIFIED IDEOGRAPH
+ {0xB0D8, 0x5561}, //2412 #CJK UNIFIED IDEOGRAPH
+ {0xB0D9, 0x5543}, //2413 #CJK UNIFIED IDEOGRAPH
+ {0xB0DA, 0x554A}, //2414 #CJK UNIFIED IDEOGRAPH
+ {0xB0DB, 0x5531}, //2415 #CJK UNIFIED IDEOGRAPH
+ {0xB0DC, 0x5556}, //2416 #CJK UNIFIED IDEOGRAPH
+ {0xB0DD, 0x554F}, //2417 #CJK UNIFIED IDEOGRAPH
+ {0xB0DE, 0x5555}, //2418 #CJK UNIFIED IDEOGRAPH
+ {0xB0DF, 0x552F}, //2419 #CJK UNIFIED IDEOGRAPH
+ {0xB0E0, 0x5564}, //2420 #CJK UNIFIED IDEOGRAPH
+ {0xB0E1, 0x5538}, //2421 #CJK UNIFIED IDEOGRAPH
+ {0xB0E2, 0x552E}, //2422 #CJK UNIFIED IDEOGRAPH
+ {0xB0E3, 0x555C}, //2423 #CJK UNIFIED IDEOGRAPH
+ {0xB0E4, 0x552C}, //2424 #CJK UNIFIED IDEOGRAPH
+ {0xB0E5, 0x5563}, //2425 #CJK UNIFIED IDEOGRAPH
+ {0xB0E6, 0x5533}, //2426 #CJK UNIFIED IDEOGRAPH
+ {0xB0E7, 0x5541}, //2427 #CJK UNIFIED IDEOGRAPH
+ {0xB0E8, 0x5557}, //2428 #CJK UNIFIED IDEOGRAPH
+ {0xB0E9, 0x5708}, //2429 #CJK UNIFIED IDEOGRAPH
+ {0xB0EA, 0x570B}, //2430 #CJK UNIFIED IDEOGRAPH
+ {0xB0EB, 0x5709}, //2431 #CJK UNIFIED IDEOGRAPH
+ {0xB0EC, 0x57DF}, //2432 #CJK UNIFIED IDEOGRAPH
+ {0xB0ED, 0x5805}, //2433 #CJK UNIFIED IDEOGRAPH
+ {0xB0EE, 0x580A}, //2434 #CJK UNIFIED IDEOGRAPH
+ {0xB0EF, 0x5806}, //2435 #CJK UNIFIED IDEOGRAPH
+ {0xB0F0, 0x57E0}, //2436 #CJK UNIFIED IDEOGRAPH
+ {0xB0F1, 0x57E4}, //2437 #CJK UNIFIED IDEOGRAPH
+ {0xB0F2, 0x57FA}, //2438 #CJK UNIFIED IDEOGRAPH
+ {0xB0F3, 0x5802}, //2439 #CJK UNIFIED IDEOGRAPH
+ {0xB0F4, 0x5835}, //2440 #CJK UNIFIED IDEOGRAPH
+ {0xB0F5, 0x57F7}, //2441 #CJK UNIFIED IDEOGRAPH
+ {0xB0F6, 0x57F9}, //2442 #CJK UNIFIED IDEOGRAPH
+ {0xB0F7, 0x5920}, //2443 #CJK UNIFIED IDEOGRAPH
+ {0xB0F8, 0x5962}, //2444 #CJK UNIFIED IDEOGRAPH
+ {0xB0F9, 0x5A36}, //2445 #CJK UNIFIED IDEOGRAPH
+ {0xB0FA, 0x5A41}, //2446 #CJK UNIFIED IDEOGRAPH
+ {0xB0FB, 0x5A49}, //2447 #CJK UNIFIED IDEOGRAPH
+ {0xB0FC, 0x5A66}, //2448 #CJK UNIFIED IDEOGRAPH
+ {0xB0FD, 0x5A6A}, //2449 #CJK UNIFIED IDEOGRAPH
+ {0xB0FE, 0x5A40}, //2450 #CJK UNIFIED IDEOGRAPH
+ {0xB140, 0x5A3C}, //2451 #CJK UNIFIED IDEOGRAPH
+ {0xB141, 0x5A62}, //2452 #CJK UNIFIED IDEOGRAPH
+ {0xB142, 0x5A5A}, //2453 #CJK UNIFIED IDEOGRAPH
+ {0xB143, 0x5A46}, //2454 #CJK UNIFIED IDEOGRAPH
+ {0xB144, 0x5A4A}, //2455 #CJK UNIFIED IDEOGRAPH
+ {0xB145, 0x5B70}, //2456 #CJK UNIFIED IDEOGRAPH
+ {0xB146, 0x5BC7}, //2457 #CJK UNIFIED IDEOGRAPH
+ {0xB147, 0x5BC5}, //2458 #CJK UNIFIED IDEOGRAPH
+ {0xB148, 0x5BC4}, //2459 #CJK UNIFIED IDEOGRAPH
+ {0xB149, 0x5BC2}, //2460 #CJK UNIFIED IDEOGRAPH
+ {0xB14A, 0x5BBF}, //2461 #CJK UNIFIED IDEOGRAPH
+ {0xB14B, 0x5BC6}, //2462 #CJK UNIFIED IDEOGRAPH
+ {0xB14C, 0x5C09}, //2463 #CJK UNIFIED IDEOGRAPH
+ {0xB14D, 0x5C08}, //2464 #CJK UNIFIED IDEOGRAPH
+ {0xB14E, 0x5C07}, //2465 #CJK UNIFIED IDEOGRAPH
+ {0xB14F, 0x5C60}, //2466 #CJK UNIFIED IDEOGRAPH
+ {0xB150, 0x5C5C}, //2467 #CJK UNIFIED IDEOGRAPH
+ {0xB151, 0x5C5D}, //2468 #CJK UNIFIED IDEOGRAPH
+ {0xB152, 0x5D07}, //2469 #CJK UNIFIED IDEOGRAPH
+ {0xB153, 0x5D06}, //2470 #CJK UNIFIED IDEOGRAPH
+ {0xB154, 0x5D0E}, //2471 #CJK UNIFIED IDEOGRAPH
+ {0xB155, 0x5D1B}, //2472 #CJK UNIFIED IDEOGRAPH
+ {0xB156, 0x5D16}, //2473 #CJK UNIFIED IDEOGRAPH
+ {0xB157, 0x5D22}, //2474 #CJK UNIFIED IDEOGRAPH
+ {0xB158, 0x5D11}, //2475 #CJK UNIFIED IDEOGRAPH
+ {0xB159, 0x5D29}, //2476 #CJK UNIFIED IDEOGRAPH
+ {0xB15A, 0x5D14}, //2477 #CJK UNIFIED IDEOGRAPH
+ {0xB15B, 0x5D19}, //2478 #CJK UNIFIED IDEOGRAPH
+ {0xB15C, 0x5D24}, //2479 #CJK UNIFIED IDEOGRAPH
+ {0xB15D, 0x5D27}, //2480 #CJK UNIFIED IDEOGRAPH
+ {0xB15E, 0x5D17}, //2481 #CJK UNIFIED IDEOGRAPH
+ {0xB15F, 0x5DE2}, //2482 #CJK UNIFIED IDEOGRAPH
+ {0xB160, 0x5E38}, //2483 #CJK UNIFIED IDEOGRAPH
+ {0xB161, 0x5E36}, //2484 #CJK UNIFIED IDEOGRAPH
+ {0xB162, 0x5E33}, //2485 #CJK UNIFIED IDEOGRAPH
+ {0xB163, 0x5E37}, //2486 #CJK UNIFIED IDEOGRAPH
+ {0xB164, 0x5EB7}, //2487 #CJK UNIFIED IDEOGRAPH
+ {0xB165, 0x5EB8}, //2488 #CJK UNIFIED IDEOGRAPH
+ {0xB166, 0x5EB6}, //2489 #CJK UNIFIED IDEOGRAPH
+ {0xB167, 0x5EB5}, //2490 #CJK UNIFIED IDEOGRAPH
+ {0xB168, 0x5EBE}, //2491 #CJK UNIFIED IDEOGRAPH
+ {0xB169, 0x5F35}, //2492 #CJK UNIFIED IDEOGRAPH
+ {0xB16A, 0x5F37}, //2493 #CJK UNIFIED IDEOGRAPH
+ {0xB16B, 0x5F57}, //2494 #CJK UNIFIED IDEOGRAPH
+ {0xB16C, 0x5F6C}, //2495 #CJK UNIFIED IDEOGRAPH
+ {0xB16D, 0x5F69}, //2496 #CJK UNIFIED IDEOGRAPH
+ {0xB16E, 0x5F6B}, //2497 #CJK UNIFIED IDEOGRAPH
+ {0xB16F, 0x5F97}, //2498 #CJK UNIFIED IDEOGRAPH
+ {0xB170, 0x5F99}, //2499 #CJK UNIFIED IDEOGRAPH
+ {0xB171, 0x5F9E}, //2500 #CJK UNIFIED IDEOGRAPH
+ {0xB172, 0x5F98}, //2501 #CJK UNIFIED IDEOGRAPH
+ {0xB173, 0x5FA1}, //2502 #CJK UNIFIED IDEOGRAPH
+ {0xB174, 0x5FA0}, //2503 #CJK UNIFIED IDEOGRAPH
+ {0xB175, 0x5F9C}, //2504 #CJK UNIFIED IDEOGRAPH
+ {0xB176, 0x607F}, //2505 #CJK UNIFIED IDEOGRAPH
+ {0xB177, 0x60A3}, //2506 #CJK UNIFIED IDEOGRAPH
+ {0xB178, 0x6089}, //2507 #CJK UNIFIED IDEOGRAPH
+ {0xB179, 0x60A0}, //2508 #CJK UNIFIED IDEOGRAPH
+ {0xB17A, 0x60A8}, //2509 #CJK UNIFIED IDEOGRAPH
+ {0xB17B, 0x60CB}, //2510 #CJK UNIFIED IDEOGRAPH
+ {0xB17C, 0x60B4}, //2511 #CJK UNIFIED IDEOGRAPH
+ {0xB17D, 0x60E6}, //2512 #CJK UNIFIED IDEOGRAPH
+ {0xB17E, 0x60BD}, //2513 #CJK UNIFIED IDEOGRAPH
+ {0xB1A1, 0x60C5}, //2514 #CJK UNIFIED IDEOGRAPH
+ {0xB1A2, 0x60BB}, //2515 #CJK UNIFIED IDEOGRAPH
+ {0xB1A3, 0x60B5}, //2516 #CJK UNIFIED IDEOGRAPH
+ {0xB1A4, 0x60DC}, //2517 #CJK UNIFIED IDEOGRAPH
+ {0xB1A5, 0x60BC}, //2518 #CJK UNIFIED IDEOGRAPH
+ {0xB1A6, 0x60D8}, //2519 #CJK UNIFIED IDEOGRAPH
+ {0xB1A7, 0x60D5}, //2520 #CJK UNIFIED IDEOGRAPH
+ {0xB1A8, 0x60C6}, //2521 #CJK UNIFIED IDEOGRAPH
+ {0xB1A9, 0x60DF}, //2522 #CJK UNIFIED IDEOGRAPH
+ {0xB1AA, 0x60B8}, //2523 #CJK UNIFIED IDEOGRAPH
+ {0xB1AB, 0x60DA}, //2524 #CJK UNIFIED IDEOGRAPH
+ {0xB1AC, 0x60C7}, //2525 #CJK UNIFIED IDEOGRAPH
+ {0xB1AD, 0x621A}, //2526 #CJK UNIFIED IDEOGRAPH
+ {0xB1AE, 0x621B}, //2527 #CJK UNIFIED IDEOGRAPH
+ {0xB1AF, 0x6248}, //2528 #CJK UNIFIED IDEOGRAPH
+ {0xB1B0, 0x63A0}, //2529 #CJK UNIFIED IDEOGRAPH
+ {0xB1B1, 0x63A7}, //2530 #CJK UNIFIED IDEOGRAPH
+ {0xB1B2, 0x6372}, //2531 #CJK UNIFIED IDEOGRAPH
+ {0xB1B3, 0x6396}, //2532 #CJK UNIFIED IDEOGRAPH
+ {0xB1B4, 0x63A2}, //2533 #CJK UNIFIED IDEOGRAPH
+ {0xB1B5, 0x63A5}, //2534 #CJK UNIFIED IDEOGRAPH
+ {0xB1B6, 0x6377}, //2535 #CJK UNIFIED IDEOGRAPH
+ {0xB1B7, 0x6367}, //2536 #CJK UNIFIED IDEOGRAPH
+ {0xB1B8, 0x6398}, //2537 #CJK UNIFIED IDEOGRAPH
+ {0xB1B9, 0x63AA}, //2538 #CJK UNIFIED IDEOGRAPH
+ {0xB1BA, 0x6371}, //2539 #CJK UNIFIED IDEOGRAPH
+ {0xB1BB, 0x63A9}, //2540 #CJK UNIFIED IDEOGRAPH
+ {0xB1BC, 0x6389}, //2541 #CJK UNIFIED IDEOGRAPH
+ {0xB1BD, 0x6383}, //2542 #CJK UNIFIED IDEOGRAPH
+ {0xB1BE, 0x639B}, //2543 #CJK UNIFIED IDEOGRAPH
+ {0xB1BF, 0x636B}, //2544 #CJK UNIFIED IDEOGRAPH
+ {0xB1C0, 0x63A8}, //2545 #CJK UNIFIED IDEOGRAPH
+ {0xB1C1, 0x6384}, //2546 #CJK UNIFIED IDEOGRAPH
+ {0xB1C2, 0x6388}, //2547 #CJK UNIFIED IDEOGRAPH
+ {0xB1C3, 0x6399}, //2548 #CJK UNIFIED IDEOGRAPH
+ {0xB1C4, 0x63A1}, //2549 #CJK UNIFIED IDEOGRAPH
+ {0xB1C5, 0x63AC}, //2550 #CJK UNIFIED IDEOGRAPH
+ {0xB1C6, 0x6392}, //2551 #CJK UNIFIED IDEOGRAPH
+ {0xB1C7, 0x638F}, //2552 #CJK UNIFIED IDEOGRAPH
+ {0xB1C8, 0x6380}, //2553 #CJK UNIFIED IDEOGRAPH
+ {0xB1C9, 0x637B}, //2554 #CJK UNIFIED IDEOGRAPH
+ {0xB1CA, 0x6369}, //2555 #CJK UNIFIED IDEOGRAPH
+ {0xB1CB, 0x6368}, //2556 #CJK UNIFIED IDEOGRAPH
+ {0xB1CC, 0x637A}, //2557 #CJK UNIFIED IDEOGRAPH
+ {0xB1CD, 0x655D}, //2558 #CJK UNIFIED IDEOGRAPH
+ {0xB1CE, 0x6556}, //2559 #CJK UNIFIED IDEOGRAPH
+ {0xB1CF, 0x6551}, //2560 #CJK UNIFIED IDEOGRAPH
+ {0xB1D0, 0x6559}, //2561 #CJK UNIFIED IDEOGRAPH
+ {0xB1D1, 0x6557}, //2562 #CJK UNIFIED IDEOGRAPH
+ {0xB1D2, 0x555F}, //2563 #CJK UNIFIED IDEOGRAPH
+ {0xB1D3, 0x654F}, //2564 #CJK UNIFIED IDEOGRAPH
+ {0xB1D4, 0x6558}, //2565 #CJK UNIFIED IDEOGRAPH
+ {0xB1D5, 0x6555}, //2566 #CJK UNIFIED IDEOGRAPH
+ {0xB1D6, 0x6554}, //2567 #CJK UNIFIED IDEOGRAPH
+ {0xB1D7, 0x659C}, //2568 #CJK UNIFIED IDEOGRAPH
+ {0xB1D8, 0x659B}, //2569 #CJK UNIFIED IDEOGRAPH
+ {0xB1D9, 0x65AC}, //2570 #CJK UNIFIED IDEOGRAPH
+ {0xB1DA, 0x65CF}, //2571 #CJK UNIFIED IDEOGRAPH
+ {0xB1DB, 0x65CB}, //2572 #CJK UNIFIED IDEOGRAPH
+ {0xB1DC, 0x65CC}, //2573 #CJK UNIFIED IDEOGRAPH
+ {0xB1DD, 0x65CE}, //2574 #CJK UNIFIED IDEOGRAPH
+ {0xB1DE, 0x665D}, //2575 #CJK UNIFIED IDEOGRAPH
+ {0xB1DF, 0x665A}, //2576 #CJK UNIFIED IDEOGRAPH
+ {0xB1E0, 0x6664}, //2577 #CJK UNIFIED IDEOGRAPH
+ {0xB1E1, 0x6668}, //2578 #CJK UNIFIED IDEOGRAPH
+ {0xB1E2, 0x6666}, //2579 #CJK UNIFIED IDEOGRAPH
+ {0xB1E3, 0x665E}, //2580 #CJK UNIFIED IDEOGRAPH
+ {0xB1E4, 0x66F9}, //2581 #CJK UNIFIED IDEOGRAPH
+ {0xB1E5, 0x52D7}, //2582 #CJK UNIFIED IDEOGRAPH
+ {0xB1E6, 0x671B}, //2583 #CJK UNIFIED IDEOGRAPH
+ {0xB1E7, 0x6881}, //2584 #CJK UNIFIED IDEOGRAPH
+ {0xB1E8, 0x68AF}, //2585 #CJK UNIFIED IDEOGRAPH
+ {0xB1E9, 0x68A2}, //2586 #CJK UNIFIED IDEOGRAPH
+ {0xB1EA, 0x6893}, //2587 #CJK UNIFIED IDEOGRAPH
+ {0xB1EB, 0x68B5}, //2588 #CJK UNIFIED IDEOGRAPH
+ {0xB1EC, 0x687F}, //2589 #CJK UNIFIED IDEOGRAPH
+ {0xB1ED, 0x6876}, //2590 #CJK UNIFIED IDEOGRAPH
+ {0xB1EE, 0x68B1}, //2591 #CJK UNIFIED IDEOGRAPH
+ {0xB1EF, 0x68A7}, //2592 #CJK UNIFIED IDEOGRAPH
+ {0xB1F0, 0x6897}, //2593 #CJK UNIFIED IDEOGRAPH
+ {0xB1F1, 0x68B0}, //2594 #CJK UNIFIED IDEOGRAPH
+ {0xB1F2, 0x6883}, //2595 #CJK UNIFIED IDEOGRAPH
+ {0xB1F3, 0x68C4}, //2596 #CJK UNIFIED IDEOGRAPH
+ {0xB1F4, 0x68AD}, //2597 #CJK UNIFIED IDEOGRAPH
+ {0xB1F5, 0x6886}, //2598 #CJK UNIFIED IDEOGRAPH
+ {0xB1F6, 0x6885}, //2599 #CJK UNIFIED IDEOGRAPH
+ {0xB1F7, 0x6894}, //2600 #CJK UNIFIED IDEOGRAPH
+ {0xB1F8, 0x689D}, //2601 #CJK UNIFIED IDEOGRAPH
+ {0xB1F9, 0x68A8}, //2602 #CJK UNIFIED IDEOGRAPH
+ {0xB1FA, 0x689F}, //2603 #CJK UNIFIED IDEOGRAPH
+ {0xB1FB, 0x68A1}, //2604 #CJK UNIFIED IDEOGRAPH
+ {0xB1FC, 0x6882}, //2605 #CJK UNIFIED IDEOGRAPH
+ {0xB1FD, 0x6B32}, //2606 #CJK UNIFIED IDEOGRAPH
+ {0xB1FE, 0x6BBA}, //2607 #CJK UNIFIED IDEOGRAPH
+ {0xB240, 0x6BEB}, //2608 #CJK UNIFIED IDEOGRAPH
+ {0xB241, 0x6BEC}, //2609 #CJK UNIFIED IDEOGRAPH
+ {0xB242, 0x6C2B}, //2610 #CJK UNIFIED IDEOGRAPH
+ {0xB243, 0x6D8E}, //2611 #CJK UNIFIED IDEOGRAPH
+ {0xB244, 0x6DBC}, //2612 #CJK UNIFIED IDEOGRAPH
+ {0xB245, 0x6DF3}, //2613 #CJK UNIFIED IDEOGRAPH
+ {0xB246, 0x6DD9}, //2614 #CJK UNIFIED IDEOGRAPH
+ {0xB247, 0x6DB2}, //2615 #CJK UNIFIED IDEOGRAPH
+ {0xB248, 0x6DE1}, //2616 #CJK UNIFIED IDEOGRAPH
+ {0xB249, 0x6DCC}, //2617 #CJK UNIFIED IDEOGRAPH
+ {0xB24A, 0x6DE4}, //2618 #CJK UNIFIED IDEOGRAPH
+ {0xB24B, 0x6DFB}, //2619 #CJK UNIFIED IDEOGRAPH
+ {0xB24C, 0x6DFA}, //2620 #CJK UNIFIED IDEOGRAPH
+ {0xB24D, 0x6E05}, //2621 #CJK UNIFIED IDEOGRAPH
+ {0xB24E, 0x6DC7}, //2622 #CJK UNIFIED IDEOGRAPH
+ {0xB24F, 0x6DCB}, //2623 #CJK UNIFIED IDEOGRAPH
+ {0xB250, 0x6DAF}, //2624 #CJK UNIFIED IDEOGRAPH
+ {0xB251, 0x6DD1}, //2625 #CJK UNIFIED IDEOGRAPH
+ {0xB252, 0x6DAE}, //2626 #CJK UNIFIED IDEOGRAPH
+ {0xB253, 0x6DDE}, //2627 #CJK UNIFIED IDEOGRAPH
+ {0xB254, 0x6DF9}, //2628 #CJK UNIFIED IDEOGRAPH
+ {0xB255, 0x6DB8}, //2629 #CJK UNIFIED IDEOGRAPH
+ {0xB256, 0x6DF7}, //2630 #CJK UNIFIED IDEOGRAPH
+ {0xB257, 0x6DF5}, //2631 #CJK UNIFIED IDEOGRAPH
+ {0xB258, 0x6DC5}, //2632 #CJK UNIFIED IDEOGRAPH
+ {0xB259, 0x6DD2}, //2633 #CJK UNIFIED IDEOGRAPH
+ {0xB25A, 0x6E1A}, //2634 #CJK UNIFIED IDEOGRAPH
+ {0xB25B, 0x6DB5}, //2635 #CJK UNIFIED IDEOGRAPH
+ {0xB25C, 0x6DDA}, //2636 #CJK UNIFIED IDEOGRAPH
+ {0xB25D, 0x6DEB}, //2637 #CJK UNIFIED IDEOGRAPH
+ {0xB25E, 0x6DD8}, //2638 #CJK UNIFIED IDEOGRAPH
+ {0xB25F, 0x6DEA}, //2639 #CJK UNIFIED IDEOGRAPH
+ {0xB260, 0x6DF1}, //2640 #CJK UNIFIED IDEOGRAPH
+ {0xB261, 0x6DEE}, //2641 #CJK UNIFIED IDEOGRAPH
+ {0xB262, 0x6DE8}, //2642 #CJK UNIFIED IDEOGRAPH
+ {0xB263, 0x6DC6}, //2643 #CJK UNIFIED IDEOGRAPH
+ {0xB264, 0x6DC4}, //2644 #CJK UNIFIED IDEOGRAPH
+ {0xB265, 0x6DAA}, //2645 #CJK UNIFIED IDEOGRAPH
+ {0xB266, 0x6DEC}, //2646 #CJK UNIFIED IDEOGRAPH
+ {0xB267, 0x6DBF}, //2647 #CJK UNIFIED IDEOGRAPH
+ {0xB268, 0x6DE6}, //2648 #CJK UNIFIED IDEOGRAPH
+ {0xB269, 0x70F9}, //2649 #CJK UNIFIED IDEOGRAPH
+ {0xB26A, 0x7109}, //2650 #CJK UNIFIED IDEOGRAPH
+ {0xB26B, 0x710A}, //2651 #CJK UNIFIED IDEOGRAPH
+ {0xB26C, 0x70FD}, //2652 #CJK UNIFIED IDEOGRAPH
+ {0xB26D, 0x70EF}, //2653 #CJK UNIFIED IDEOGRAPH
+ {0xB26E, 0x723D}, //2654 #CJK UNIFIED IDEOGRAPH
+ {0xB26F, 0x727D}, //2655 #CJK UNIFIED IDEOGRAPH
+ {0xB270, 0x7281}, //2656 #CJK UNIFIED IDEOGRAPH
+ {0xB271, 0x731C}, //2657 #CJK UNIFIED IDEOGRAPH
+ {0xB272, 0x731B}, //2658 #CJK UNIFIED IDEOGRAPH
+ {0xB273, 0x7316}, //2659 #CJK UNIFIED IDEOGRAPH
+ {0xB274, 0x7313}, //2660 #CJK UNIFIED IDEOGRAPH
+ {0xB275, 0x7319}, //2661 #CJK UNIFIED IDEOGRAPH
+ {0xB276, 0x7387}, //2662 #CJK UNIFIED IDEOGRAPH
+ {0xB277, 0x7405}, //2663 #CJK UNIFIED IDEOGRAPH
+ {0xB278, 0x740A}, //2664 #CJK UNIFIED IDEOGRAPH
+ {0xB279, 0x7403}, //2665 #CJK UNIFIED IDEOGRAPH
+ {0xB27A, 0x7406}, //2666 #CJK UNIFIED IDEOGRAPH
+ {0xB27B, 0x73FE}, //2667 #CJK UNIFIED IDEOGRAPH
+ {0xB27C, 0x740D}, //2668 #CJK UNIFIED IDEOGRAPH
+ {0xB27D, 0x74E0}, //2669 #CJK UNIFIED IDEOGRAPH
+ {0xB27E, 0x74F6}, //2670 #CJK UNIFIED IDEOGRAPH
+ {0xB2A1, 0x74F7}, //2671 #CJK UNIFIED IDEOGRAPH
+ {0xB2A2, 0x751C}, //2672 #CJK UNIFIED IDEOGRAPH
+ {0xB2A3, 0x7522}, //2673 #CJK UNIFIED IDEOGRAPH
+ {0xB2A4, 0x7565}, //2674 #CJK UNIFIED IDEOGRAPH
+ {0xB2A5, 0x7566}, //2675 #CJK UNIFIED IDEOGRAPH
+ {0xB2A6, 0x7562}, //2676 #CJK UNIFIED IDEOGRAPH
+ {0xB2A7, 0x7570}, //2677 #CJK UNIFIED IDEOGRAPH
+ {0xB2A8, 0x758F}, //2678 #CJK UNIFIED IDEOGRAPH
+ {0xB2A9, 0x75D4}, //2679 #CJK UNIFIED IDEOGRAPH
+ {0xB2AA, 0x75D5}, //2680 #CJK UNIFIED IDEOGRAPH
+ {0xB2AB, 0x75B5}, //2681 #CJK UNIFIED IDEOGRAPH
+ {0xB2AC, 0x75CA}, //2682 #CJK UNIFIED IDEOGRAPH
+ {0xB2AD, 0x75CD}, //2683 #CJK UNIFIED IDEOGRAPH
+ {0xB2AE, 0x768E}, //2684 #CJK UNIFIED IDEOGRAPH
+ {0xB2AF, 0x76D4}, //2685 #CJK UNIFIED IDEOGRAPH
+ {0xB2B0, 0x76D2}, //2686 #CJK UNIFIED IDEOGRAPH
+ {0xB2B1, 0x76DB}, //2687 #CJK UNIFIED IDEOGRAPH
+ {0xB2B2, 0x7737}, //2688 #CJK UNIFIED IDEOGRAPH
+ {0xB2B3, 0x773E}, //2689 #CJK UNIFIED IDEOGRAPH
+ {0xB2B4, 0x773C}, //2690 #CJK UNIFIED IDEOGRAPH
+ {0xB2B5, 0x7736}, //2691 #CJK UNIFIED IDEOGRAPH
+ {0xB2B6, 0x7738}, //2692 #CJK UNIFIED IDEOGRAPH
+ {0xB2B7, 0x773A}, //2693 #CJK UNIFIED IDEOGRAPH
+ {0xB2B8, 0x786B}, //2694 #CJK UNIFIED IDEOGRAPH
+ {0xB2B9, 0x7843}, //2695 #CJK UNIFIED IDEOGRAPH
+ {0xB2BA, 0x784E}, //2696 #CJK UNIFIED IDEOGRAPH
+ {0xB2BB, 0x7965}, //2697 #CJK UNIFIED IDEOGRAPH
+ {0xB2BC, 0x7968}, //2698 #CJK UNIFIED IDEOGRAPH
+ {0xB2BD, 0x796D}, //2699 #CJK UNIFIED IDEOGRAPH
+ {0xB2BE, 0x79FB}, //2700 #CJK UNIFIED IDEOGRAPH
+ {0xB2BF, 0x7A92}, //2701 #CJK UNIFIED IDEOGRAPH
+ {0xB2C0, 0x7A95}, //2702 #CJK UNIFIED IDEOGRAPH
+ {0xB2C1, 0x7B20}, //2703 #CJK UNIFIED IDEOGRAPH
+ {0xB2C2, 0x7B28}, //2704 #CJK UNIFIED IDEOGRAPH
+ {0xB2C3, 0x7B1B}, //2705 #CJK UNIFIED IDEOGRAPH
+ {0xB2C4, 0x7B2C}, //2706 #CJK UNIFIED IDEOGRAPH
+ {0xB2C5, 0x7B26}, //2707 #CJK UNIFIED IDEOGRAPH
+ {0xB2C6, 0x7B19}, //2708 #CJK UNIFIED IDEOGRAPH
+ {0xB2C7, 0x7B1E}, //2709 #CJK UNIFIED IDEOGRAPH
+ {0xB2C8, 0x7B2E}, //2710 #CJK UNIFIED IDEOGRAPH
+ {0xB2C9, 0x7C92}, //2711 #CJK UNIFIED IDEOGRAPH
+ {0xB2CA, 0x7C97}, //2712 #CJK UNIFIED IDEOGRAPH
+ {0xB2CB, 0x7C95}, //2713 #CJK UNIFIED IDEOGRAPH
+ {0xB2CC, 0x7D46}, //2714 #CJK UNIFIED IDEOGRAPH
+ {0xB2CD, 0x7D43}, //2715 #CJK UNIFIED IDEOGRAPH
+ {0xB2CE, 0x7D71}, //2716 #CJK UNIFIED IDEOGRAPH
+ {0xB2CF, 0x7D2E}, //2717 #CJK UNIFIED IDEOGRAPH
+ {0xB2D0, 0x7D39}, //2718 #CJK UNIFIED IDEOGRAPH
+ {0xB2D1, 0x7D3C}, //2719 #CJK UNIFIED IDEOGRAPH
+ {0xB2D2, 0x7D40}, //2720 #CJK UNIFIED IDEOGRAPH
+ {0xB2D3, 0x7D30}, //2721 #CJK UNIFIED IDEOGRAPH
+ {0xB2D4, 0x7D33}, //2722 #CJK UNIFIED IDEOGRAPH
+ {0xB2D5, 0x7D44}, //2723 #CJK UNIFIED IDEOGRAPH
+ {0xB2D6, 0x7D2F}, //2724 #CJK UNIFIED IDEOGRAPH
+ {0xB2D7, 0x7D42}, //2725 #CJK UNIFIED IDEOGRAPH
+ {0xB2D8, 0x7D32}, //2726 #CJK UNIFIED IDEOGRAPH
+ {0xB2D9, 0x7D31}, //2727 #CJK UNIFIED IDEOGRAPH
+ {0xB2DA, 0x7F3D}, //2728 #CJK UNIFIED IDEOGRAPH
+ {0xB2DB, 0x7F9E}, //2729 #CJK UNIFIED IDEOGRAPH
+ {0xB2DC, 0x7F9A}, //2730 #CJK UNIFIED IDEOGRAPH
+ {0xB2DD, 0x7FCC}, //2731 #CJK UNIFIED IDEOGRAPH
+ {0xB2DE, 0x7FCE}, //2732 #CJK UNIFIED IDEOGRAPH
+ {0xB2DF, 0x7FD2}, //2733 #CJK UNIFIED IDEOGRAPH
+ {0xB2E0, 0x801C}, //2734 #CJK UNIFIED IDEOGRAPH
+ {0xB2E1, 0x804A}, //2735 #CJK UNIFIED IDEOGRAPH
+ {0xB2E2, 0x8046}, //2736 #CJK UNIFIED IDEOGRAPH
+ {0xB2E3, 0x812F}, //2737 #CJK UNIFIED IDEOGRAPH
+ {0xB2E4, 0x8116}, //2738 #CJK UNIFIED IDEOGRAPH
+ {0xB2E5, 0x8123}, //2739 #CJK UNIFIED IDEOGRAPH
+ {0xB2E6, 0x812B}, //2740 #CJK UNIFIED IDEOGRAPH
+ {0xB2E7, 0x8129}, //2741 #CJK UNIFIED IDEOGRAPH
+ {0xB2E8, 0x8130}, //2742 #CJK UNIFIED IDEOGRAPH
+ {0xB2E9, 0x8124}, //2743 #CJK UNIFIED IDEOGRAPH
+ {0xB2EA, 0x8202}, //2744 #CJK UNIFIED IDEOGRAPH
+ {0xB2EB, 0x8235}, //2745 #CJK UNIFIED IDEOGRAPH
+ {0xB2EC, 0x8237}, //2746 #CJK UNIFIED IDEOGRAPH
+ {0xB2ED, 0x8236}, //2747 #CJK UNIFIED IDEOGRAPH
+ {0xB2EE, 0x8239}, //2748 #CJK UNIFIED IDEOGRAPH
+ {0xB2EF, 0x838E}, //2749 #CJK UNIFIED IDEOGRAPH
+ {0xB2F0, 0x839E}, //2750 #CJK UNIFIED IDEOGRAPH
+ {0xB2F1, 0x8398}, //2751 #CJK UNIFIED IDEOGRAPH
+ {0xB2F2, 0x8378}, //2752 #CJK UNIFIED IDEOGRAPH
+ {0xB2F3, 0x83A2}, //2753 #CJK UNIFIED IDEOGRAPH
+ {0xB2F4, 0x8396}, //2754 #CJK UNIFIED IDEOGRAPH
+ {0xB2F5, 0x83BD}, //2755 #CJK UNIFIED IDEOGRAPH
+ {0xB2F6, 0x83AB}, //2756 #CJK UNIFIED IDEOGRAPH
+ {0xB2F7, 0x8392}, //2757 #CJK UNIFIED IDEOGRAPH
+ {0xB2F8, 0x838A}, //2758 #CJK UNIFIED IDEOGRAPH
+ {0xB2F9, 0x8393}, //2759 #CJK UNIFIED IDEOGRAPH
+ {0xB2FA, 0x8389}, //2760 #CJK UNIFIED IDEOGRAPH
+ {0xB2FB, 0x83A0}, //2761 #CJK UNIFIED IDEOGRAPH
+ {0xB2FC, 0x8377}, //2762 #CJK UNIFIED IDEOGRAPH
+ {0xB2FD, 0x837B}, //2763 #CJK UNIFIED IDEOGRAPH
+ {0xB2FE, 0x837C}, //2764 #CJK UNIFIED IDEOGRAPH
+ {0xB340, 0x8386}, //2765 #CJK UNIFIED IDEOGRAPH
+ {0xB341, 0x83A7}, //2766 #CJK UNIFIED IDEOGRAPH
+ {0xB342, 0x8655}, //2767 #CJK UNIFIED IDEOGRAPH
+ {0xB343, 0x5F6A}, //2768 #CJK UNIFIED IDEOGRAPH
+ {0xB344, 0x86C7}, //2769 #CJK UNIFIED IDEOGRAPH
+ {0xB345, 0x86C0}, //2770 #CJK UNIFIED IDEOGRAPH
+ {0xB346, 0x86B6}, //2771 #CJK UNIFIED IDEOGRAPH
+ {0xB347, 0x86C4}, //2772 #CJK UNIFIED IDEOGRAPH
+ {0xB348, 0x86B5}, //2773 #CJK UNIFIED IDEOGRAPH
+ {0xB349, 0x86C6}, //2774 #CJK UNIFIED IDEOGRAPH
+ {0xB34A, 0x86CB}, //2775 #CJK UNIFIED IDEOGRAPH
+ {0xB34B, 0x86B1}, //2776 #CJK UNIFIED IDEOGRAPH
+ {0xB34C, 0x86AF}, //2777 #CJK UNIFIED IDEOGRAPH
+ {0xB34D, 0x86C9}, //2778 #CJK UNIFIED IDEOGRAPH
+ {0xB34E, 0x8853}, //2779 #CJK UNIFIED IDEOGRAPH
+ {0xB34F, 0x889E}, //2780 #CJK UNIFIED IDEOGRAPH
+ {0xB350, 0x8888}, //2781 #CJK UNIFIED IDEOGRAPH
+ {0xB351, 0x88AB}, //2782 #CJK UNIFIED IDEOGRAPH
+ {0xB352, 0x8892}, //2783 #CJK UNIFIED IDEOGRAPH
+ {0xB353, 0x8896}, //2784 #CJK UNIFIED IDEOGRAPH
+ {0xB354, 0x888D}, //2785 #CJK UNIFIED IDEOGRAPH
+ {0xB355, 0x888B}, //2786 #CJK UNIFIED IDEOGRAPH
+ {0xB356, 0x8993}, //2787 #CJK UNIFIED IDEOGRAPH
+ {0xB357, 0x898F}, //2788 #CJK UNIFIED IDEOGRAPH
+ {0xB358, 0x8A2A}, //2789 #CJK UNIFIED IDEOGRAPH
+ {0xB359, 0x8A1D}, //2790 #CJK UNIFIED IDEOGRAPH
+ {0xB35A, 0x8A23}, //2791 #CJK UNIFIED IDEOGRAPH
+ {0xB35B, 0x8A25}, //2792 #CJK UNIFIED IDEOGRAPH
+ {0xB35C, 0x8A31}, //2793 #CJK UNIFIED IDEOGRAPH
+ {0xB35D, 0x8A2D}, //2794 #CJK UNIFIED IDEOGRAPH
+ {0xB35E, 0x8A1F}, //2795 #CJK UNIFIED IDEOGRAPH
+ {0xB35F, 0x8A1B}, //2796 #CJK UNIFIED IDEOGRAPH
+ {0xB360, 0x8A22}, //2797 #CJK UNIFIED IDEOGRAPH
+ {0xB361, 0x8C49}, //2798 #CJK UNIFIED IDEOGRAPH
+ {0xB362, 0x8C5A}, //2799 #CJK UNIFIED IDEOGRAPH
+ {0xB363, 0x8CA9}, //2800 #CJK UNIFIED IDEOGRAPH
+ {0xB364, 0x8CAC}, //2801 #CJK UNIFIED IDEOGRAPH
+ {0xB365, 0x8CAB}, //2802 #CJK UNIFIED IDEOGRAPH
+ {0xB366, 0x8CA8}, //2803 #CJK UNIFIED IDEOGRAPH
+ {0xB367, 0x8CAA}, //2804 #CJK UNIFIED IDEOGRAPH
+ {0xB368, 0x8CA7}, //2805 #CJK UNIFIED IDEOGRAPH
+ {0xB369, 0x8D67}, //2806 #CJK UNIFIED IDEOGRAPH
+ {0xB36A, 0x8D66}, //2807 #CJK UNIFIED IDEOGRAPH
+ {0xB36B, 0x8DBE}, //2808 #CJK UNIFIED IDEOGRAPH
+ {0xB36C, 0x8DBA}, //2809 #CJK UNIFIED IDEOGRAPH
+ {0xB36D, 0x8EDB}, //2810 #CJK UNIFIED IDEOGRAPH
+ {0xB36E, 0x8EDF}, //2811 #CJK UNIFIED IDEOGRAPH
+ {0xB36F, 0x9019}, //2812 #CJK UNIFIED IDEOGRAPH
+ {0xB370, 0x900D}, //2813 #CJK UNIFIED IDEOGRAPH
+ {0xB371, 0x901A}, //2814 #CJK UNIFIED IDEOGRAPH
+ {0xB372, 0x9017}, //2815 #CJK UNIFIED IDEOGRAPH
+ {0xB373, 0x9023}, //2816 #CJK UNIFIED IDEOGRAPH
+ {0xB374, 0x901F}, //2817 #CJK UNIFIED IDEOGRAPH
+ {0xB375, 0x901D}, //2818 #CJK UNIFIED IDEOGRAPH
+ {0xB376, 0x9010}, //2819 #CJK UNIFIED IDEOGRAPH
+ {0xB377, 0x9015}, //2820 #CJK UNIFIED IDEOGRAPH
+ {0xB378, 0x901E}, //2821 #CJK UNIFIED IDEOGRAPH
+ {0xB379, 0x9020}, //2822 #CJK UNIFIED IDEOGRAPH
+ {0xB37A, 0x900F}, //2823 #CJK UNIFIED IDEOGRAPH
+ {0xB37B, 0x9022}, //2824 #CJK UNIFIED IDEOGRAPH
+ {0xB37C, 0x9016}, //2825 #CJK UNIFIED IDEOGRAPH
+ {0xB37D, 0x901B}, //2826 #CJK UNIFIED IDEOGRAPH
+ {0xB37E, 0x9014}, //2827 #CJK UNIFIED IDEOGRAPH
+ {0xB3A1, 0x90E8}, //2828 #CJK UNIFIED IDEOGRAPH
+ {0xB3A2, 0x90ED}, //2829 #CJK UNIFIED IDEOGRAPH
+ {0xB3A3, 0x90FD}, //2830 #CJK UNIFIED IDEOGRAPH
+ {0xB3A4, 0x9157}, //2831 #CJK UNIFIED IDEOGRAPH
+ {0xB3A5, 0x91CE}, //2832 #CJK UNIFIED IDEOGRAPH
+ {0xB3A6, 0x91F5}, //2833 #CJK UNIFIED IDEOGRAPH
+ {0xB3A7, 0x91E6}, //2834 #CJK UNIFIED IDEOGRAPH
+ {0xB3A8, 0x91E3}, //2835 #CJK UNIFIED IDEOGRAPH
+ {0xB3A9, 0x91E7}, //2836 #CJK UNIFIED IDEOGRAPH
+ {0xB3AA, 0x91ED}, //2837 #CJK UNIFIED IDEOGRAPH
+ {0xB3AB, 0x91E9}, //2838 #CJK UNIFIED IDEOGRAPH
+ {0xB3AC, 0x9589}, //2839 #CJK UNIFIED IDEOGRAPH
+ {0xB3AD, 0x966A}, //2840 #CJK UNIFIED IDEOGRAPH
+ {0xB3AE, 0x9675}, //2841 #CJK UNIFIED IDEOGRAPH
+ {0xB3AF, 0x9673}, //2842 #CJK UNIFIED IDEOGRAPH
+ {0xB3B0, 0x9678}, //2843 #CJK UNIFIED IDEOGRAPH
+ {0xB3B1, 0x9670}, //2844 #CJK UNIFIED IDEOGRAPH
+ {0xB3B2, 0x9674}, //2845 #CJK UNIFIED IDEOGRAPH
+ {0xB3B3, 0x9676}, //2846 #CJK UNIFIED IDEOGRAPH
+ {0xB3B4, 0x9677}, //2847 #CJK UNIFIED IDEOGRAPH
+ {0xB3B5, 0x966C}, //2848 #CJK UNIFIED IDEOGRAPH
+ {0xB3B6, 0x96C0}, //2849 #CJK UNIFIED IDEOGRAPH
+ {0xB3B7, 0x96EA}, //2850 #CJK UNIFIED IDEOGRAPH
+ {0xB3B8, 0x96E9}, //2851 #CJK UNIFIED IDEOGRAPH
+ {0xB3B9, 0x7AE0}, //2852 #CJK UNIFIED IDEOGRAPH
+ {0xB3BA, 0x7ADF}, //2853 #CJK UNIFIED IDEOGRAPH
+ {0xB3BB, 0x9802}, //2854 #CJK UNIFIED IDEOGRAPH
+ {0xB3BC, 0x9803}, //2855 #CJK UNIFIED IDEOGRAPH
+ {0xB3BD, 0x9B5A}, //2856 #CJK UNIFIED IDEOGRAPH
+ {0xB3BE, 0x9CE5}, //2857 #CJK UNIFIED IDEOGRAPH
+ {0xB3BF, 0x9E75}, //2858 #CJK UNIFIED IDEOGRAPH
+ {0xB3C0, 0x9E7F}, //2859 #CJK UNIFIED IDEOGRAPH
+ {0xB3C1, 0x9EA5}, //2860 #CJK UNIFIED IDEOGRAPH
+ {0xB3C2, 0x9EBB}, //2861 #CJK UNIFIED IDEOGRAPH
+ {0xB3C3, 0x50A2}, //2862 #CJK UNIFIED IDEOGRAPH
+ {0xB3C4, 0x508D}, //2863 #CJK UNIFIED IDEOGRAPH
+ {0xB3C5, 0x5085}, //2864 #CJK UNIFIED IDEOGRAPH
+ {0xB3C6, 0x5099}, //2865 #CJK UNIFIED IDEOGRAPH
+ {0xB3C7, 0x5091}, //2866 #CJK UNIFIED IDEOGRAPH
+ {0xB3C8, 0x5080}, //2867 #CJK UNIFIED IDEOGRAPH
+ {0xB3C9, 0x5096}, //2868 #CJK UNIFIED IDEOGRAPH
+ {0xB3CA, 0x5098}, //2869 #CJK UNIFIED IDEOGRAPH
+ {0xB3CB, 0x509A}, //2870 #CJK UNIFIED IDEOGRAPH
+ {0xB3CC, 0x6700}, //2871 #CJK UNIFIED IDEOGRAPH
+ {0xB3CD, 0x51F1}, //2872 #CJK UNIFIED IDEOGRAPH
+ {0xB3CE, 0x5272}, //2873 #CJK UNIFIED IDEOGRAPH
+ {0xB3CF, 0x5274}, //2874 #CJK UNIFIED IDEOGRAPH
+ {0xB3D0, 0x5275}, //2875 #CJK UNIFIED IDEOGRAPH
+ {0xB3D1, 0x5269}, //2876 #CJK UNIFIED IDEOGRAPH
+ {0xB3D2, 0x52DE}, //2877 #CJK UNIFIED IDEOGRAPH
+ {0xB3D3, 0x52DD}, //2878 #CJK UNIFIED IDEOGRAPH
+ {0xB3D4, 0x52DB}, //2879 #CJK UNIFIED IDEOGRAPH
+ {0xB3D5, 0x535A}, //2880 #CJK UNIFIED IDEOGRAPH
+ {0xB3D6, 0x53A5}, //2881 #CJK UNIFIED IDEOGRAPH
+ {0xB3D7, 0x557B}, //2882 #CJK UNIFIED IDEOGRAPH
+ {0xB3D8, 0x5580}, //2883 #CJK UNIFIED IDEOGRAPH
+ {0xB3D9, 0x55A7}, //2884 #CJK UNIFIED IDEOGRAPH
+ {0xB3DA, 0x557C}, //2885 #CJK UNIFIED IDEOGRAPH
+ {0xB3DB, 0x558A}, //2886 #CJK UNIFIED IDEOGRAPH
+ {0xB3DC, 0x559D}, //2887 #CJK UNIFIED IDEOGRAPH
+ {0xB3DD, 0x5598}, //2888 #CJK UNIFIED IDEOGRAPH
+ {0xB3DE, 0x5582}, //2889 #CJK UNIFIED IDEOGRAPH
+ {0xB3DF, 0x559C}, //2890 #CJK UNIFIED IDEOGRAPH
+ {0xB3E0, 0x55AA}, //2891 #CJK UNIFIED IDEOGRAPH
+ {0xB3E1, 0x5594}, //2892 #CJK UNIFIED IDEOGRAPH
+ {0xB3E2, 0x5587}, //2893 #CJK UNIFIED IDEOGRAPH
+ {0xB3E3, 0x558B}, //2894 #CJK UNIFIED IDEOGRAPH
+ {0xB3E4, 0x5583}, //2895 #CJK UNIFIED IDEOGRAPH
+ {0xB3E5, 0x55B3}, //2896 #CJK UNIFIED IDEOGRAPH
+ {0xB3E6, 0x55AE}, //2897 #CJK UNIFIED IDEOGRAPH
+ {0xB3E7, 0x559F}, //2898 #CJK UNIFIED IDEOGRAPH
+ {0xB3E8, 0x553E}, //2899 #CJK UNIFIED IDEOGRAPH
+ {0xB3E9, 0x55B2}, //2900 #CJK UNIFIED IDEOGRAPH
+ {0xB3EA, 0x559A}, //2901 #CJK UNIFIED IDEOGRAPH
+ {0xB3EB, 0x55BB}, //2902 #CJK UNIFIED IDEOGRAPH
+ {0xB3EC, 0x55AC}, //2903 #CJK UNIFIED IDEOGRAPH
+ {0xB3ED, 0x55B1}, //2904 #CJK UNIFIED IDEOGRAPH
+ {0xB3EE, 0x557E}, //2905 #CJK UNIFIED IDEOGRAPH
+ {0xB3EF, 0x5589}, //2906 #CJK UNIFIED IDEOGRAPH
+ {0xB3F0, 0x55AB}, //2907 #CJK UNIFIED IDEOGRAPH
+ {0xB3F1, 0x5599}, //2908 #CJK UNIFIED IDEOGRAPH
+ {0xB3F2, 0x570D}, //2909 #CJK UNIFIED IDEOGRAPH
+ {0xB3F3, 0x582F}, //2910 #CJK UNIFIED IDEOGRAPH
+ {0xB3F4, 0x582A}, //2911 #CJK UNIFIED IDEOGRAPH
+ {0xB3F5, 0x5834}, //2912 #CJK UNIFIED IDEOGRAPH
+ {0xB3F6, 0x5824}, //2913 #CJK UNIFIED IDEOGRAPH
+ {0xB3F7, 0x5830}, //2914 #CJK UNIFIED IDEOGRAPH
+ {0xB3F8, 0x5831}, //2915 #CJK UNIFIED IDEOGRAPH
+ {0xB3F9, 0x5821}, //2916 #CJK UNIFIED IDEOGRAPH
+ {0xB3FA, 0x581D}, //2917 #CJK UNIFIED IDEOGRAPH
+ {0xB3FB, 0x5820}, //2918 #CJK UNIFIED IDEOGRAPH
+ {0xB3FC, 0x58F9}, //2919 #CJK UNIFIED IDEOGRAPH
+ {0xB3FD, 0x58FA}, //2920 #CJK UNIFIED IDEOGRAPH
+ {0xB3FE, 0x5960}, //2921 #CJK UNIFIED IDEOGRAPH
+ {0xB440, 0x5A77}, //2922 #CJK UNIFIED IDEOGRAPH
+ {0xB441, 0x5A9A}, //2923 #CJK UNIFIED IDEOGRAPH
+ {0xB442, 0x5A7F}, //2924 #CJK UNIFIED IDEOGRAPH
+ {0xB443, 0x5A92}, //2925 #CJK UNIFIED IDEOGRAPH
+ {0xB444, 0x5A9B}, //2926 #CJK UNIFIED IDEOGRAPH
+ {0xB445, 0x5AA7}, //2927 #CJK UNIFIED IDEOGRAPH
+ {0xB446, 0x5B73}, //2928 #CJK UNIFIED IDEOGRAPH
+ {0xB447, 0x5B71}, //2929 #CJK UNIFIED IDEOGRAPH
+ {0xB448, 0x5BD2}, //2930 #CJK UNIFIED IDEOGRAPH
+ {0xB449, 0x5BCC}, //2931 #CJK UNIFIED IDEOGRAPH
+ {0xB44A, 0x5BD3}, //2932 #CJK UNIFIED IDEOGRAPH
+ {0xB44B, 0x5BD0}, //2933 #CJK UNIFIED IDEOGRAPH
+ {0xB44C, 0x5C0A}, //2934 #CJK UNIFIED IDEOGRAPH
+ {0xB44D, 0x5C0B}, //2935 #CJK UNIFIED IDEOGRAPH
+ {0xB44E, 0x5C31}, //2936 #CJK UNIFIED IDEOGRAPH
+ {0xB44F, 0x5D4C}, //2937 #CJK UNIFIED IDEOGRAPH
+ {0xB450, 0x5D50}, //2938 #CJK UNIFIED IDEOGRAPH
+ {0xB451, 0x5D34}, //2939 #CJK UNIFIED IDEOGRAPH
+ {0xB452, 0x5D47}, //2940 #CJK UNIFIED IDEOGRAPH
+ {0xB453, 0x5DFD}, //2941 #CJK UNIFIED IDEOGRAPH
+ {0xB454, 0x5E45}, //2942 #CJK UNIFIED IDEOGRAPH
+ {0xB455, 0x5E3D}, //2943 #CJK UNIFIED IDEOGRAPH
+ {0xB456, 0x5E40}, //2944 #CJK UNIFIED IDEOGRAPH
+ {0xB457, 0x5E43}, //2945 #CJK UNIFIED IDEOGRAPH
+ {0xB458, 0x5E7E}, //2946 #CJK UNIFIED IDEOGRAPH
+ {0xB459, 0x5ECA}, //2947 #CJK UNIFIED IDEOGRAPH
+ {0xB45A, 0x5EC1}, //2948 #CJK UNIFIED IDEOGRAPH
+ {0xB45B, 0x5EC2}, //2949 #CJK UNIFIED IDEOGRAPH
+ {0xB45C, 0x5EC4}, //2950 #CJK UNIFIED IDEOGRAPH
+ {0xB45D, 0x5F3C}, //2951 #CJK UNIFIED IDEOGRAPH
+ {0xB45E, 0x5F6D}, //2952 #CJK UNIFIED IDEOGRAPH
+ {0xB45F, 0x5FA9}, //2953 #CJK UNIFIED IDEOGRAPH
+ {0xB460, 0x5FAA}, //2954 #CJK UNIFIED IDEOGRAPH
+ {0xB461, 0x5FA8}, //2955 #CJK UNIFIED IDEOGRAPH
+ {0xB462, 0x60D1}, //2956 #CJK UNIFIED IDEOGRAPH
+ {0xB463, 0x60E1}, //2957 #CJK UNIFIED IDEOGRAPH
+ {0xB464, 0x60B2}, //2958 #CJK UNIFIED IDEOGRAPH
+ {0xB465, 0x60B6}, //2959 #CJK UNIFIED IDEOGRAPH
+ {0xB466, 0x60E0}, //2960 #CJK UNIFIED IDEOGRAPH
+ {0xB467, 0x611C}, //2961 #CJK UNIFIED IDEOGRAPH
+ {0xB468, 0x6123}, //2962 #CJK UNIFIED IDEOGRAPH
+ {0xB469, 0x60FA}, //2963 #CJK UNIFIED IDEOGRAPH
+ {0xB46A, 0x6115}, //2964 #CJK UNIFIED IDEOGRAPH
+ {0xB46B, 0x60F0}, //2965 #CJK UNIFIED IDEOGRAPH
+ {0xB46C, 0x60FB}, //2966 #CJK UNIFIED IDEOGRAPH
+ {0xB46D, 0x60F4}, //2967 #CJK UNIFIED IDEOGRAPH
+ {0xB46E, 0x6168}, //2968 #CJK UNIFIED IDEOGRAPH
+ {0xB46F, 0x60F1}, //2969 #CJK UNIFIED IDEOGRAPH
+ {0xB470, 0x610E}, //2970 #CJK UNIFIED IDEOGRAPH
+ {0xB471, 0x60F6}, //2971 #CJK UNIFIED IDEOGRAPH
+ {0xB472, 0x6109}, //2972 #CJK UNIFIED IDEOGRAPH
+ {0xB473, 0x6100}, //2973 #CJK UNIFIED IDEOGRAPH
+ {0xB474, 0x6112}, //2974 #CJK UNIFIED IDEOGRAPH
+ {0xB475, 0x621F}, //2975 #CJK UNIFIED IDEOGRAPH
+ {0xB476, 0x6249}, //2976 #CJK UNIFIED IDEOGRAPH
+ {0xB477, 0x63A3}, //2977 #CJK UNIFIED IDEOGRAPH
+ {0xB478, 0x638C}, //2978 #CJK UNIFIED IDEOGRAPH
+ {0xB479, 0x63CF}, //2979 #CJK UNIFIED IDEOGRAPH
+ {0xB47A, 0x63C0}, //2980 #CJK UNIFIED IDEOGRAPH
+ {0xB47B, 0x63E9}, //2981 #CJK UNIFIED IDEOGRAPH
+ {0xB47C, 0x63C9}, //2982 #CJK UNIFIED IDEOGRAPH
+ {0xB47D, 0x63C6}, //2983 #CJK UNIFIED IDEOGRAPH
+ {0xB47E, 0x63CD}, //2984 #CJK UNIFIED IDEOGRAPH
+ {0xB4A1, 0x63D2}, //2985 #CJK UNIFIED IDEOGRAPH
+ {0xB4A2, 0x63E3}, //2986 #CJK UNIFIED IDEOGRAPH
+ {0xB4A3, 0x63D0}, //2987 #CJK UNIFIED IDEOGRAPH
+ {0xB4A4, 0x63E1}, //2988 #CJK UNIFIED IDEOGRAPH
+ {0xB4A5, 0x63D6}, //2989 #CJK UNIFIED IDEOGRAPH
+ {0xB4A6, 0x63ED}, //2990 #CJK UNIFIED IDEOGRAPH
+ {0xB4A7, 0x63EE}, //2991 #CJK UNIFIED IDEOGRAPH
+ {0xB4A8, 0x6376}, //2992 #CJK UNIFIED IDEOGRAPH
+ {0xB4A9, 0x63F4}, //2993 #CJK UNIFIED IDEOGRAPH
+ {0xB4AA, 0x63EA}, //2994 #CJK UNIFIED IDEOGRAPH
+ {0xB4AB, 0x63DB}, //2995 #CJK UNIFIED IDEOGRAPH
+ {0xB4AC, 0x6452}, //2996 #CJK UNIFIED IDEOGRAPH
+ {0xB4AD, 0x63DA}, //2997 #CJK UNIFIED IDEOGRAPH
+ {0xB4AE, 0x63F9}, //2998 #CJK UNIFIED IDEOGRAPH
+ {0xB4AF, 0x655E}, //2999 #CJK UNIFIED IDEOGRAPH
+ {0xB4B0, 0x6566}, //3000 #CJK UNIFIED IDEOGRAPH
+ {0xB4B1, 0x6562}, //3001 #CJK UNIFIED IDEOGRAPH
+ {0xB4B2, 0x6563}, //3002 #CJK UNIFIED IDEOGRAPH
+ {0xB4B3, 0x6591}, //3003 #CJK UNIFIED IDEOGRAPH
+ {0xB4B4, 0x6590}, //3004 #CJK UNIFIED IDEOGRAPH
+ {0xB4B5, 0x65AF}, //3005 #CJK UNIFIED IDEOGRAPH
+ {0xB4B6, 0x666E}, //3006 #CJK UNIFIED IDEOGRAPH
+ {0xB4B7, 0x6670}, //3007 #CJK UNIFIED IDEOGRAPH
+ {0xB4B8, 0x6674}, //3008 #CJK UNIFIED IDEOGRAPH
+ {0xB4B9, 0x6676}, //3009 #CJK UNIFIED IDEOGRAPH
+ {0xB4BA, 0x666F}, //3010 #CJK UNIFIED IDEOGRAPH
+ {0xB4BB, 0x6691}, //3011 #CJK UNIFIED IDEOGRAPH
+ {0xB4BC, 0x667A}, //3012 #CJK UNIFIED IDEOGRAPH
+ {0xB4BD, 0x667E}, //3013 #CJK UNIFIED IDEOGRAPH
+ {0xB4BE, 0x6677}, //3014 #CJK UNIFIED IDEOGRAPH
+ {0xB4BF, 0x66FE}, //3015 #CJK UNIFIED IDEOGRAPH
+ {0xB4C0, 0x66FF}, //3016 #CJK UNIFIED IDEOGRAPH
+ {0xB4C1, 0x671F}, //3017 #CJK UNIFIED IDEOGRAPH
+ {0xB4C2, 0x671D}, //3018 #CJK UNIFIED IDEOGRAPH
+ {0xB4C3, 0x68FA}, //3019 #CJK UNIFIED IDEOGRAPH
+ {0xB4C4, 0x68D5}, //3020 #CJK UNIFIED IDEOGRAPH
+ {0xB4C5, 0x68E0}, //3021 #CJK UNIFIED IDEOGRAPH
+ {0xB4C6, 0x68D8}, //3022 #CJK UNIFIED IDEOGRAPH
+ {0xB4C7, 0x68D7}, //3023 #CJK UNIFIED IDEOGRAPH
+ {0xB4C8, 0x6905}, //3024 #CJK UNIFIED IDEOGRAPH
+ {0xB4C9, 0x68DF}, //3025 #CJK UNIFIED IDEOGRAPH
+ {0xB4CA, 0x68F5}, //3026 #CJK UNIFIED IDEOGRAPH
+ {0xB4CB, 0x68EE}, //3027 #CJK UNIFIED IDEOGRAPH
+ {0xB4CC, 0x68E7}, //3028 #CJK UNIFIED IDEOGRAPH
+ {0xB4CD, 0x68F9}, //3029 #CJK UNIFIED IDEOGRAPH
+ {0xB4CE, 0x68D2}, //3030 #CJK UNIFIED IDEOGRAPH
+ {0xB4CF, 0x68F2}, //3031 #CJK UNIFIED IDEOGRAPH
+ {0xB4D0, 0x68E3}, //3032 #CJK UNIFIED IDEOGRAPH
+ {0xB4D1, 0x68CB}, //3033 #CJK UNIFIED IDEOGRAPH
+ {0xB4D2, 0x68CD}, //3034 #CJK UNIFIED IDEOGRAPH
+ {0xB4D3, 0x690D}, //3035 #CJK UNIFIED IDEOGRAPH
+ {0xB4D4, 0x6912}, //3036 #CJK UNIFIED IDEOGRAPH
+ {0xB4D5, 0x690E}, //3037 #CJK UNIFIED IDEOGRAPH
+ {0xB4D6, 0x68C9}, //3038 #CJK UNIFIED IDEOGRAPH
+ {0xB4D7, 0x68DA}, //3039 #CJK UNIFIED IDEOGRAPH
+ {0xB4D8, 0x696E}, //3040 #CJK UNIFIED IDEOGRAPH
+ {0xB4D9, 0x68FB}, //3041 #CJK UNIFIED IDEOGRAPH
+ {0xB4DA, 0x6B3E}, //3042 #CJK UNIFIED IDEOGRAPH
+ {0xB4DB, 0x6B3A}, //3043 #CJK UNIFIED IDEOGRAPH
+ {0xB4DC, 0x6B3D}, //3044 #CJK UNIFIED IDEOGRAPH
+ {0xB4DD, 0x6B98}, //3045 #CJK UNIFIED IDEOGRAPH
+ {0xB4DE, 0x6B96}, //3046 #CJK UNIFIED IDEOGRAPH
+ {0xB4DF, 0x6BBC}, //3047 #CJK UNIFIED IDEOGRAPH
+ {0xB4E0, 0x6BEF}, //3048 #CJK UNIFIED IDEOGRAPH
+ {0xB4E1, 0x6C2E}, //3049 #CJK UNIFIED IDEOGRAPH
+ {0xB4E2, 0x6C2F}, //3050 #CJK UNIFIED IDEOGRAPH
+ {0xB4E3, 0x6C2C}, //3051 #CJK UNIFIED IDEOGRAPH
+ {0xB4E4, 0x6E2F}, //3052 #CJK UNIFIED IDEOGRAPH
+ {0xB4E5, 0x6E38}, //3053 #CJK UNIFIED IDEOGRAPH
+ {0xB4E6, 0x6E54}, //3054 #CJK UNIFIED IDEOGRAPH
+ {0xB4E7, 0x6E21}, //3055 #CJK UNIFIED IDEOGRAPH
+ {0xB4E8, 0x6E32}, //3056 #CJK UNIFIED IDEOGRAPH
+ {0xB4E9, 0x6E67}, //3057 #CJK UNIFIED IDEOGRAPH
+ {0xB4EA, 0x6E4A}, //3058 #CJK UNIFIED IDEOGRAPH
+ {0xB4EB, 0x6E20}, //3059 #CJK UNIFIED IDEOGRAPH
+ {0xB4EC, 0x6E25}, //3060 #CJK UNIFIED IDEOGRAPH
+ {0xB4ED, 0x6E23}, //3061 #CJK UNIFIED IDEOGRAPH
+ {0xB4EE, 0x6E1B}, //3062 #CJK UNIFIED IDEOGRAPH
+ {0xB4EF, 0x6E5B}, //3063 #CJK UNIFIED IDEOGRAPH
+ {0xB4F0, 0x6E58}, //3064 #CJK UNIFIED IDEOGRAPH
+ {0xB4F1, 0x6E24}, //3065 #CJK UNIFIED IDEOGRAPH
+ {0xB4F2, 0x6E56}, //3066 #CJK UNIFIED IDEOGRAPH
+ {0xB4F3, 0x6E6E}, //3067 #CJK UNIFIED IDEOGRAPH
+ {0xB4F4, 0x6E2D}, //3068 #CJK UNIFIED IDEOGRAPH
+ {0xB4F5, 0x6E26}, //3069 #CJK UNIFIED IDEOGRAPH
+ {0xB4F6, 0x6E6F}, //3070 #CJK UNIFIED IDEOGRAPH
+ {0xB4F7, 0x6E34}, //3071 #CJK UNIFIED IDEOGRAPH
+ {0xB4F8, 0x6E4D}, //3072 #CJK UNIFIED IDEOGRAPH
+ {0xB4F9, 0x6E3A}, //3073 #CJK UNIFIED IDEOGRAPH
+ {0xB4FA, 0x6E2C}, //3074 #CJK UNIFIED IDEOGRAPH
+ {0xB4FB, 0x6E43}, //3075 #CJK UNIFIED IDEOGRAPH
+ {0xB4FC, 0x6E1D}, //3076 #CJK UNIFIED IDEOGRAPH
+ {0xB4FD, 0x6E3E}, //3077 #CJK UNIFIED IDEOGRAPH
+ {0xB4FE, 0x6ECB}, //3078 #CJK UNIFIED IDEOGRAPH
+ {0xB540, 0x6E89}, //3079 #CJK UNIFIED IDEOGRAPH
+ {0xB541, 0x6E19}, //3080 #CJK UNIFIED IDEOGRAPH
+ {0xB542, 0x6E4E}, //3081 #CJK UNIFIED IDEOGRAPH
+ {0xB543, 0x6E63}, //3082 #CJK UNIFIED IDEOGRAPH
+ {0xB544, 0x6E44}, //3083 #CJK UNIFIED IDEOGRAPH
+ {0xB545, 0x6E72}, //3084 #CJK UNIFIED IDEOGRAPH
+ {0xB546, 0x6E69}, //3085 #CJK UNIFIED IDEOGRAPH
+ {0xB547, 0x6E5F}, //3086 #CJK UNIFIED IDEOGRAPH
+ {0xB548, 0x7119}, //3087 #CJK UNIFIED IDEOGRAPH
+ {0xB549, 0x711A}, //3088 #CJK UNIFIED IDEOGRAPH
+ {0xB54A, 0x7126}, //3089 #CJK UNIFIED IDEOGRAPH
+ {0xB54B, 0x7130}, //3090 #CJK UNIFIED IDEOGRAPH
+ {0xB54C, 0x7121}, //3091 #CJK UNIFIED IDEOGRAPH
+ {0xB54D, 0x7136}, //3092 #CJK UNIFIED IDEOGRAPH
+ {0xB54E, 0x716E}, //3093 #CJK UNIFIED IDEOGRAPH
+ {0xB54F, 0x711C}, //3094 #CJK UNIFIED IDEOGRAPH
+ {0xB550, 0x724C}, //3095 #CJK UNIFIED IDEOGRAPH
+ {0xB551, 0x7284}, //3096 #CJK UNIFIED IDEOGRAPH
+ {0xB552, 0x7280}, //3097 #CJK UNIFIED IDEOGRAPH
+ {0xB553, 0x7336}, //3098 #CJK UNIFIED IDEOGRAPH
+ {0xB554, 0x7325}, //3099 #CJK UNIFIED IDEOGRAPH
+ {0xB555, 0x7334}, //3100 #CJK UNIFIED IDEOGRAPH
+ {0xB556, 0x7329}, //3101 #CJK UNIFIED IDEOGRAPH
+ {0xB557, 0x743A}, //3102 #CJK UNIFIED IDEOGRAPH
+ {0xB558, 0x742A}, //3103 #CJK UNIFIED IDEOGRAPH
+ {0xB559, 0x7433}, //3104 #CJK UNIFIED IDEOGRAPH
+ {0xB55A, 0x7422}, //3105 #CJK UNIFIED IDEOGRAPH
+ {0xB55B, 0x7425}, //3106 #CJK UNIFIED IDEOGRAPH
+ {0xB55C, 0x7435}, //3107 #CJK UNIFIED IDEOGRAPH
+ {0xB55D, 0x7436}, //3108 #CJK UNIFIED IDEOGRAPH
+ {0xB55E, 0x7434}, //3109 #CJK UNIFIED IDEOGRAPH
+ {0xB55F, 0x742F}, //3110 #CJK UNIFIED IDEOGRAPH
+ {0xB560, 0x741B}, //3111 #CJK UNIFIED IDEOGRAPH
+ {0xB561, 0x7426}, //3112 #CJK UNIFIED IDEOGRAPH
+ {0xB562, 0x7428}, //3113 #CJK UNIFIED IDEOGRAPH
+ {0xB563, 0x7525}, //3114 #CJK UNIFIED IDEOGRAPH
+ {0xB564, 0x7526}, //3115 #CJK UNIFIED IDEOGRAPH
+ {0xB565, 0x756B}, //3116 #CJK UNIFIED IDEOGRAPH
+ {0xB566, 0x756A}, //3117 #CJK UNIFIED IDEOGRAPH
+ {0xB567, 0x75E2}, //3118 #CJK UNIFIED IDEOGRAPH
+ {0xB568, 0x75DB}, //3119 #CJK UNIFIED IDEOGRAPH
+ {0xB569, 0x75E3}, //3120 #CJK UNIFIED IDEOGRAPH
+ {0xB56A, 0x75D9}, //3121 #CJK UNIFIED IDEOGRAPH
+ {0xB56B, 0x75D8}, //3122 #CJK UNIFIED IDEOGRAPH
+ {0xB56C, 0x75DE}, //3123 #CJK UNIFIED IDEOGRAPH
+ {0xB56D, 0x75E0}, //3124 #CJK UNIFIED IDEOGRAPH
+ {0xB56E, 0x767B}, //3125 #CJK UNIFIED IDEOGRAPH
+ {0xB56F, 0x767C}, //3126 #CJK UNIFIED IDEOGRAPH
+ {0xB570, 0x7696}, //3127 #CJK UNIFIED IDEOGRAPH
+ {0xB571, 0x7693}, //3128 #CJK UNIFIED IDEOGRAPH
+ {0xB572, 0x76B4}, //3129 #CJK UNIFIED IDEOGRAPH
+ {0xB573, 0x76DC}, //3130 #CJK UNIFIED IDEOGRAPH
+ {0xB574, 0x774F}, //3131 #CJK UNIFIED IDEOGRAPH
+ {0xB575, 0x77ED}, //3132 #CJK UNIFIED IDEOGRAPH
+ {0xB576, 0x785D}, //3133 #CJK UNIFIED IDEOGRAPH
+ {0xB577, 0x786C}, //3134 #CJK UNIFIED IDEOGRAPH
+ {0xB578, 0x786F}, //3135 #CJK UNIFIED IDEOGRAPH
+ {0xB579, 0x7A0D}, //3136 #CJK UNIFIED IDEOGRAPH
+ {0xB57A, 0x7A08}, //3137 #CJK UNIFIED IDEOGRAPH
+ {0xB57B, 0x7A0B}, //3138 #CJK UNIFIED IDEOGRAPH
+ {0xB57C, 0x7A05}, //3139 #CJK UNIFIED IDEOGRAPH
+ {0xB57D, 0x7A00}, //3140 #CJK UNIFIED IDEOGRAPH
+ {0xB57E, 0x7A98}, //3141 #CJK UNIFIED IDEOGRAPH
+ {0xB5A1, 0x7A97}, //3142 #CJK UNIFIED IDEOGRAPH
+ {0xB5A2, 0x7A96}, //3143 #CJK UNIFIED IDEOGRAPH
+ {0xB5A3, 0x7AE5}, //3144 #CJK UNIFIED IDEOGRAPH
+ {0xB5A4, 0x7AE3}, //3145 #CJK UNIFIED IDEOGRAPH
+ {0xB5A5, 0x7B49}, //3146 #CJK UNIFIED IDEOGRAPH
+ {0xB5A6, 0x7B56}, //3147 #CJK UNIFIED IDEOGRAPH
+ {0xB5A7, 0x7B46}, //3148 #CJK UNIFIED IDEOGRAPH
+ {0xB5A8, 0x7B50}, //3149 #CJK UNIFIED IDEOGRAPH
+ {0xB5A9, 0x7B52}, //3150 #CJK UNIFIED IDEOGRAPH
+ {0xB5AA, 0x7B54}, //3151 #CJK UNIFIED IDEOGRAPH
+ {0xB5AB, 0x7B4D}, //3152 #CJK UNIFIED IDEOGRAPH
+ {0xB5AC, 0x7B4B}, //3153 #CJK UNIFIED IDEOGRAPH
+ {0xB5AD, 0x7B4F}, //3154 #CJK UNIFIED IDEOGRAPH
+ {0xB5AE, 0x7B51}, //3155 #CJK UNIFIED IDEOGRAPH
+ {0xB5AF, 0x7C9F}, //3156 #CJK UNIFIED IDEOGRAPH
+ {0xB5B0, 0x7CA5}, //3157 #CJK UNIFIED IDEOGRAPH
+ {0xB5B1, 0x7D5E}, //3158 #CJK UNIFIED IDEOGRAPH
+ {0xB5B2, 0x7D50}, //3159 #CJK UNIFIED IDEOGRAPH
+ {0xB5B3, 0x7D68}, //3160 #CJK UNIFIED IDEOGRAPH
+ {0xB5B4, 0x7D55}, //3161 #CJK UNIFIED IDEOGRAPH
+ {0xB5B5, 0x7D2B}, //3162 #CJK UNIFIED IDEOGRAPH
+ {0xB5B6, 0x7D6E}, //3163 #CJK UNIFIED IDEOGRAPH
+ {0xB5B7, 0x7D72}, //3164 #CJK UNIFIED IDEOGRAPH
+ {0xB5B8, 0x7D61}, //3165 #CJK UNIFIED IDEOGRAPH
+ {0xB5B9, 0x7D66}, //3166 #CJK UNIFIED IDEOGRAPH
+ {0xB5BA, 0x7D62}, //3167 #CJK UNIFIED IDEOGRAPH
+ {0xB5BB, 0x7D70}, //3168 #CJK UNIFIED IDEOGRAPH
+ {0xB5BC, 0x7D73}, //3169 #CJK UNIFIED IDEOGRAPH
+ {0xB5BD, 0x5584}, //3170 #CJK UNIFIED IDEOGRAPH
+ {0xB5BE, 0x7FD4}, //3171 #CJK UNIFIED IDEOGRAPH
+ {0xB5BF, 0x7FD5}, //3172 #CJK UNIFIED IDEOGRAPH
+ {0xB5C0, 0x800B}, //3173 #CJK UNIFIED IDEOGRAPH
+ {0xB5C1, 0x8052}, //3174 #CJK UNIFIED IDEOGRAPH
+ {0xB5C2, 0x8085}, //3175 #CJK UNIFIED IDEOGRAPH
+ {0xB5C3, 0x8155}, //3176 #CJK UNIFIED IDEOGRAPH
+ {0xB5C4, 0x8154}, //3177 #CJK UNIFIED IDEOGRAPH
+ {0xB5C5, 0x814B}, //3178 #CJK UNIFIED IDEOGRAPH
+ {0xB5C6, 0x8151}, //3179 #CJK UNIFIED IDEOGRAPH
+ {0xB5C7, 0x814E}, //3180 #CJK UNIFIED IDEOGRAPH
+ {0xB5C8, 0x8139}, //3181 #CJK UNIFIED IDEOGRAPH
+ {0xB5C9, 0x8146}, //3182 #CJK UNIFIED IDEOGRAPH
+ {0xB5CA, 0x813E}, //3183 #CJK UNIFIED IDEOGRAPH
+ {0xB5CB, 0x814C}, //3184 #CJK UNIFIED IDEOGRAPH
+ {0xB5CC, 0x8153}, //3185 #CJK UNIFIED IDEOGRAPH
+ {0xB5CD, 0x8174}, //3186 #CJK UNIFIED IDEOGRAPH
+ {0xB5CE, 0x8212}, //3187 #CJK UNIFIED IDEOGRAPH
+ {0xB5CF, 0x821C}, //3188 #CJK UNIFIED IDEOGRAPH
+ {0xB5D0, 0x83E9}, //3189 #CJK UNIFIED IDEOGRAPH
+ {0xB5D1, 0x8403}, //3190 #CJK UNIFIED IDEOGRAPH
+ {0xB5D2, 0x83F8}, //3191 #CJK UNIFIED IDEOGRAPH
+ {0xB5D3, 0x840D}, //3192 #CJK UNIFIED IDEOGRAPH
+ {0xB5D4, 0x83E0}, //3193 #CJK UNIFIED IDEOGRAPH
+ {0xB5D5, 0x83C5}, //3194 #CJK UNIFIED IDEOGRAPH
+ {0xB5D6, 0x840B}, //3195 #CJK UNIFIED IDEOGRAPH
+ {0xB5D7, 0x83C1}, //3196 #CJK UNIFIED IDEOGRAPH
+ {0xB5D8, 0x83EF}, //3197 #CJK UNIFIED IDEOGRAPH
+ {0xB5D9, 0x83F1}, //3198 #CJK UNIFIED IDEOGRAPH
+ {0xB5DA, 0x83F4}, //3199 #CJK UNIFIED IDEOGRAPH
+ {0xB5DB, 0x8457}, //3200 #CJK UNIFIED IDEOGRAPH
+ {0xB5DC, 0x840A}, //3201 #CJK UNIFIED IDEOGRAPH
+ {0xB5DD, 0x83F0}, //3202 #CJK UNIFIED IDEOGRAPH
+ {0xB5DE, 0x840C}, //3203 #CJK UNIFIED IDEOGRAPH
+ {0xB5DF, 0x83CC}, //3204 #CJK UNIFIED IDEOGRAPH
+ {0xB5E0, 0x83FD}, //3205 #CJK UNIFIED IDEOGRAPH
+ {0xB5E1, 0x83F2}, //3206 #CJK UNIFIED IDEOGRAPH
+ {0xB5E2, 0x83CA}, //3207 #CJK UNIFIED IDEOGRAPH
+ {0xB5E3, 0x8438}, //3208 #CJK UNIFIED IDEOGRAPH
+ {0xB5E4, 0x840E}, //3209 #CJK UNIFIED IDEOGRAPH
+ {0xB5E5, 0x8404}, //3210 #CJK UNIFIED IDEOGRAPH
+ {0xB5E6, 0x83DC}, //3211 #CJK UNIFIED IDEOGRAPH
+ {0xB5E7, 0x8407}, //3212 #CJK UNIFIED IDEOGRAPH
+ {0xB5E8, 0x83D4}, //3213 #CJK UNIFIED IDEOGRAPH
+ {0xB5E9, 0x83DF}, //3214 #CJK UNIFIED IDEOGRAPH
+ {0xB5EA, 0x865B}, //3215 #CJK UNIFIED IDEOGRAPH
+ {0xB5EB, 0x86DF}, //3216 #CJK UNIFIED IDEOGRAPH
+ {0xB5EC, 0x86D9}, //3217 #CJK UNIFIED IDEOGRAPH
+ {0xB5ED, 0x86ED}, //3218 #CJK UNIFIED IDEOGRAPH
+ {0xB5EE, 0x86D4}, //3219 #CJK UNIFIED IDEOGRAPH
+ {0xB5EF, 0x86DB}, //3220 #CJK UNIFIED IDEOGRAPH
+ {0xB5F0, 0x86E4}, //3221 #CJK UNIFIED IDEOGRAPH
+ {0xB5F1, 0x86D0}, //3222 #CJK UNIFIED IDEOGRAPH
+ {0xB5F2, 0x86DE}, //3223 #CJK UNIFIED IDEOGRAPH
+ {0xB5F3, 0x8857}, //3224 #CJK UNIFIED IDEOGRAPH
+ {0xB5F4, 0x88C1}, //3225 #CJK UNIFIED IDEOGRAPH
+ {0xB5F5, 0x88C2}, //3226 #CJK UNIFIED IDEOGRAPH
+ {0xB5F6, 0x88B1}, //3227 #CJK UNIFIED IDEOGRAPH
+ {0xB5F7, 0x8983}, //3228 #CJK UNIFIED IDEOGRAPH
+ {0xB5F8, 0x8996}, //3229 #CJK UNIFIED IDEOGRAPH
+ {0xB5F9, 0x8A3B}, //3230 #CJK UNIFIED IDEOGRAPH
+ {0xB5FA, 0x8A60}, //3231 #CJK UNIFIED IDEOGRAPH
+ {0xB5FB, 0x8A55}, //3232 #CJK UNIFIED IDEOGRAPH
+ {0xB5FC, 0x8A5E}, //3233 #CJK UNIFIED IDEOGRAPH
+ {0xB5FD, 0x8A3C}, //3234 #CJK UNIFIED IDEOGRAPH
+ {0xB5FE, 0x8A41}, //3235 #CJK UNIFIED IDEOGRAPH
+ {0xB640, 0x8A54}, //3236 #CJK UNIFIED IDEOGRAPH
+ {0xB641, 0x8A5B}, //3237 #CJK UNIFIED IDEOGRAPH
+ {0xB642, 0x8A50}, //3238 #CJK UNIFIED IDEOGRAPH
+ {0xB643, 0x8A46}, //3239 #CJK UNIFIED IDEOGRAPH
+ {0xB644, 0x8A34}, //3240 #CJK UNIFIED IDEOGRAPH
+ {0xB645, 0x8A3A}, //3241 #CJK UNIFIED IDEOGRAPH
+ {0xB646, 0x8A36}, //3242 #CJK UNIFIED IDEOGRAPH
+ {0xB647, 0x8A56}, //3243 #CJK UNIFIED IDEOGRAPH
+ {0xB648, 0x8C61}, //3244 #CJK UNIFIED IDEOGRAPH
+ {0xB649, 0x8C82}, //3245 #CJK UNIFIED IDEOGRAPH
+ {0xB64A, 0x8CAF}, //3246 #CJK UNIFIED IDEOGRAPH
+ {0xB64B, 0x8CBC}, //3247 #CJK UNIFIED IDEOGRAPH
+ {0xB64C, 0x8CB3}, //3248 #CJK UNIFIED IDEOGRAPH
+ {0xB64D, 0x8CBD}, //3249 #CJK UNIFIED IDEOGRAPH
+ {0xB64E, 0x8CC1}, //3250 #CJK UNIFIED IDEOGRAPH
+ {0xB64F, 0x8CBB}, //3251 #CJK UNIFIED IDEOGRAPH
+ {0xB650, 0x8CC0}, //3252 #CJK UNIFIED IDEOGRAPH
+ {0xB651, 0x8CB4}, //3253 #CJK UNIFIED IDEOGRAPH
+ {0xB652, 0x8CB7}, //3254 #CJK UNIFIED IDEOGRAPH
+ {0xB653, 0x8CB6}, //3255 #CJK UNIFIED IDEOGRAPH
+ {0xB654, 0x8CBF}, //3256 #CJK UNIFIED IDEOGRAPH
+ {0xB655, 0x8CB8}, //3257 #CJK UNIFIED IDEOGRAPH
+ {0xB656, 0x8D8A}, //3258 #CJK UNIFIED IDEOGRAPH
+ {0xB657, 0x8D85}, //3259 #CJK UNIFIED IDEOGRAPH
+ {0xB658, 0x8D81}, //3260 #CJK UNIFIED IDEOGRAPH
+ {0xB659, 0x8DCE}, //3261 #CJK UNIFIED IDEOGRAPH
+ {0xB65A, 0x8DDD}, //3262 #CJK UNIFIED IDEOGRAPH
+ {0xB65B, 0x8DCB}, //3263 #CJK UNIFIED IDEOGRAPH
+ {0xB65C, 0x8DDA}, //3264 #CJK UNIFIED IDEOGRAPH
+ {0xB65D, 0x8DD1}, //3265 #CJK UNIFIED IDEOGRAPH
+ {0xB65E, 0x8DCC}, //3266 #CJK UNIFIED IDEOGRAPH
+ {0xB65F, 0x8DDB}, //3267 #CJK UNIFIED IDEOGRAPH
+ {0xB660, 0x8DC6}, //3268 #CJK UNIFIED IDEOGRAPH
+ {0xB661, 0x8EFB}, //3269 #CJK UNIFIED IDEOGRAPH
+ {0xB662, 0x8EF8}, //3270 #CJK UNIFIED IDEOGRAPH
+ {0xB663, 0x8EFC}, //3271 #CJK UNIFIED IDEOGRAPH
+ {0xB664, 0x8F9C}, //3272 #CJK UNIFIED IDEOGRAPH
+ {0xB665, 0x902E}, //3273 #CJK UNIFIED IDEOGRAPH
+ {0xB666, 0x9035}, //3274 #CJK UNIFIED IDEOGRAPH
+ {0xB667, 0x9031}, //3275 #CJK UNIFIED IDEOGRAPH
+ {0xB668, 0x9038}, //3276 #CJK UNIFIED IDEOGRAPH
+ {0xB669, 0x9032}, //3277 #CJK UNIFIED IDEOGRAPH
+ {0xB66A, 0x9036}, //3278 #CJK UNIFIED IDEOGRAPH
+ {0xB66B, 0x9102}, //3279 #CJK UNIFIED IDEOGRAPH
+ {0xB66C, 0x90F5}, //3280 #CJK UNIFIED IDEOGRAPH
+ {0xB66D, 0x9109}, //3281 #CJK UNIFIED IDEOGRAPH
+ {0xB66E, 0x90FE}, //3282 #CJK UNIFIED IDEOGRAPH
+ {0xB66F, 0x9163}, //3283 #CJK UNIFIED IDEOGRAPH
+ {0xB670, 0x9165}, //3284 #CJK UNIFIED IDEOGRAPH
+ {0xB671, 0x91CF}, //3285 #CJK UNIFIED IDEOGRAPH
+ {0xB672, 0x9214}, //3286 #CJK UNIFIED IDEOGRAPH
+ {0xB673, 0x9215}, //3287 #CJK UNIFIED IDEOGRAPH
+ {0xB674, 0x9223}, //3288 #CJK UNIFIED IDEOGRAPH
+ {0xB675, 0x9209}, //3289 #CJK UNIFIED IDEOGRAPH
+ {0xB676, 0x921E}, //3290 #CJK UNIFIED IDEOGRAPH
+ {0xB677, 0x920D}, //3291 #CJK UNIFIED IDEOGRAPH
+ {0xB678, 0x9210}, //3292 #CJK UNIFIED IDEOGRAPH
+ {0xB679, 0x9207}, //3293 #CJK UNIFIED IDEOGRAPH
+ {0xB67A, 0x9211}, //3294 #CJK UNIFIED IDEOGRAPH
+ {0xB67B, 0x9594}, //3295 #CJK UNIFIED IDEOGRAPH
+ {0xB67C, 0x958F}, //3296 #CJK UNIFIED IDEOGRAPH
+ {0xB67D, 0x958B}, //3297 #CJK UNIFIED IDEOGRAPH
+ {0xB67E, 0x9591}, //3298 #CJK UNIFIED IDEOGRAPH
+ {0xB6A1, 0x9593}, //3299 #CJK UNIFIED IDEOGRAPH
+ {0xB6A2, 0x9592}, //3300 #CJK UNIFIED IDEOGRAPH
+ {0xB6A3, 0x958E}, //3301 #CJK UNIFIED IDEOGRAPH
+ {0xB6A4, 0x968A}, //3302 #CJK UNIFIED IDEOGRAPH
+ {0xB6A5, 0x968E}, //3303 #CJK UNIFIED IDEOGRAPH
+ {0xB6A6, 0x968B}, //3304 #CJK UNIFIED IDEOGRAPH
+ {0xB6A7, 0x967D}, //3305 #CJK UNIFIED IDEOGRAPH
+ {0xB6A8, 0x9685}, //3306 #CJK UNIFIED IDEOGRAPH
+ {0xB6A9, 0x9686}, //3307 #CJK UNIFIED IDEOGRAPH
+ {0xB6AA, 0x968D}, //3308 #CJK UNIFIED IDEOGRAPH
+ {0xB6AB, 0x9672}, //3309 #CJK UNIFIED IDEOGRAPH
+ {0xB6AC, 0x9684}, //3310 #CJK UNIFIED IDEOGRAPH
+ {0xB6AD, 0x96C1}, //3311 #CJK UNIFIED IDEOGRAPH
+ {0xB6AE, 0x96C5}, //3312 #CJK UNIFIED IDEOGRAPH
+ {0xB6AF, 0x96C4}, //3313 #CJK UNIFIED IDEOGRAPH
+ {0xB6B0, 0x96C6}, //3314 #CJK UNIFIED IDEOGRAPH
+ {0xB6B1, 0x96C7}, //3315 #CJK UNIFIED IDEOGRAPH
+ {0xB6B2, 0x96EF}, //3316 #CJK UNIFIED IDEOGRAPH
+ {0xB6B3, 0x96F2}, //3317 #CJK UNIFIED IDEOGRAPH
+ {0xB6B4, 0x97CC}, //3318 #CJK UNIFIED IDEOGRAPH
+ {0xB6B5, 0x9805}, //3319 #CJK UNIFIED IDEOGRAPH
+ {0xB6B6, 0x9806}, //3320 #CJK UNIFIED IDEOGRAPH
+ {0xB6B7, 0x9808}, //3321 #CJK UNIFIED IDEOGRAPH
+ {0xB6B8, 0x98E7}, //3322 #CJK UNIFIED IDEOGRAPH
+ {0xB6B9, 0x98EA}, //3323 #CJK UNIFIED IDEOGRAPH
+ {0xB6BA, 0x98EF}, //3324 #CJK UNIFIED IDEOGRAPH
+ {0xB6BB, 0x98E9}, //3325 #CJK UNIFIED IDEOGRAPH
+ {0xB6BC, 0x98F2}, //3326 #CJK UNIFIED IDEOGRAPH
+ {0xB6BD, 0x98ED}, //3327 #CJK UNIFIED IDEOGRAPH
+ {0xB6BE, 0x99AE}, //3328 #CJK UNIFIED IDEOGRAPH
+ {0xB6BF, 0x99AD}, //3329 #CJK UNIFIED IDEOGRAPH
+ {0xB6C0, 0x9EC3}, //3330 #CJK UNIFIED IDEOGRAPH
+ {0xB6C1, 0x9ECD}, //3331 #CJK UNIFIED IDEOGRAPH
+ {0xB6C2, 0x9ED1}, //3332 #CJK UNIFIED IDEOGRAPH
+ {0xB6C3, 0x4E82}, //3333 #CJK UNIFIED IDEOGRAPH
+ {0xB6C4, 0x50AD}, //3334 #CJK UNIFIED IDEOGRAPH
+ {0xB6C5, 0x50B5}, //3335 #CJK UNIFIED IDEOGRAPH
+ {0xB6C6, 0x50B2}, //3336 #CJK UNIFIED IDEOGRAPH
+ {0xB6C7, 0x50B3}, //3337 #CJK UNIFIED IDEOGRAPH
+ {0xB6C8, 0x50C5}, //3338 #CJK UNIFIED IDEOGRAPH
+ {0xB6C9, 0x50BE}, //3339 #CJK UNIFIED IDEOGRAPH
+ {0xB6CA, 0x50AC}, //3340 #CJK UNIFIED IDEOGRAPH
+ {0xB6CB, 0x50B7}, //3341 #CJK UNIFIED IDEOGRAPH
+ {0xB6CC, 0x50BB}, //3342 #CJK UNIFIED IDEOGRAPH
+ {0xB6CD, 0x50AF}, //3343 #CJK UNIFIED IDEOGRAPH
+ {0xB6CE, 0x50C7}, //3344 #CJK UNIFIED IDEOGRAPH
+ {0xB6CF, 0x527F}, //3345 #CJK UNIFIED IDEOGRAPH
+ {0xB6D0, 0x5277}, //3346 #CJK UNIFIED IDEOGRAPH
+ {0xB6D1, 0x527D}, //3347 #CJK UNIFIED IDEOGRAPH
+ {0xB6D2, 0x52DF}, //3348 #CJK UNIFIED IDEOGRAPH
+ {0xB6D3, 0x52E6}, //3349 #CJK UNIFIED IDEOGRAPH
+ {0xB6D4, 0x52E4}, //3350 #CJK UNIFIED IDEOGRAPH
+ {0xB6D5, 0x52E2}, //3351 #CJK UNIFIED IDEOGRAPH
+ {0xB6D6, 0x52E3}, //3352 #CJK UNIFIED IDEOGRAPH
+ {0xB6D7, 0x532F}, //3353 #CJK UNIFIED IDEOGRAPH
+ {0xB6D8, 0x55DF}, //3354 #CJK UNIFIED IDEOGRAPH
+ {0xB6D9, 0x55E8}, //3355 #CJK UNIFIED IDEOGRAPH
+ {0xB6DA, 0x55D3}, //3356 #CJK UNIFIED IDEOGRAPH
+ {0xB6DB, 0x55E6}, //3357 #CJK UNIFIED IDEOGRAPH
+ {0xB6DC, 0x55CE}, //3358 #CJK UNIFIED IDEOGRAPH
+ {0xB6DD, 0x55DC}, //3359 #CJK UNIFIED IDEOGRAPH
+ {0xB6DE, 0x55C7}, //3360 #CJK UNIFIED IDEOGRAPH
+ {0xB6DF, 0x55D1}, //3361 #CJK UNIFIED IDEOGRAPH
+ {0xB6E0, 0x55E3}, //3362 #CJK UNIFIED IDEOGRAPH
+ {0xB6E1, 0x55E4}, //3363 #CJK UNIFIED IDEOGRAPH
+ {0xB6E2, 0x55EF}, //3364 #CJK UNIFIED IDEOGRAPH
+ {0xB6E3, 0x55DA}, //3365 #CJK UNIFIED IDEOGRAPH
+ {0xB6E4, 0x55E1}, //3366 #CJK UNIFIED IDEOGRAPH
+ {0xB6E5, 0x55C5}, //3367 #CJK UNIFIED IDEOGRAPH
+ {0xB6E6, 0x55C6}, //3368 #CJK UNIFIED IDEOGRAPH
+ {0xB6E7, 0x55E5}, //3369 #CJK UNIFIED IDEOGRAPH
+ {0xB6E8, 0x55C9}, //3370 #CJK UNIFIED IDEOGRAPH
+ {0xB6E9, 0x5712}, //3371 #CJK UNIFIED IDEOGRAPH
+ {0xB6EA, 0x5713}, //3372 #CJK UNIFIED IDEOGRAPH
+ {0xB6EB, 0x585E}, //3373 #CJK UNIFIED IDEOGRAPH
+ {0xB6EC, 0x5851}, //3374 #CJK UNIFIED IDEOGRAPH
+ {0xB6ED, 0x5858}, //3375 #CJK UNIFIED IDEOGRAPH
+ {0xB6EE, 0x5857}, //3376 #CJK UNIFIED IDEOGRAPH
+ {0xB6EF, 0x585A}, //3377 #CJK UNIFIED IDEOGRAPH
+ {0xB6F0, 0x5854}, //3378 #CJK UNIFIED IDEOGRAPH
+ {0xB6F1, 0x586B}, //3379 #CJK UNIFIED IDEOGRAPH
+ {0xB6F2, 0x584C}, //3380 #CJK UNIFIED IDEOGRAPH
+ {0xB6F3, 0x586D}, //3381 #CJK UNIFIED IDEOGRAPH
+ {0xB6F4, 0x584A}, //3382 #CJK UNIFIED IDEOGRAPH
+ {0xB6F5, 0x5862}, //3383 #CJK UNIFIED IDEOGRAPH
+ {0xB6F6, 0x5852}, //3384 #CJK UNIFIED IDEOGRAPH
+ {0xB6F7, 0x584B}, //3385 #CJK UNIFIED IDEOGRAPH
+ {0xB6F8, 0x5967}, //3386 #CJK UNIFIED IDEOGRAPH
+ {0xB6F9, 0x5AC1}, //3387 #CJK UNIFIED IDEOGRAPH
+ {0xB6FA, 0x5AC9}, //3388 #CJK UNIFIED IDEOGRAPH
+ {0xB6FB, 0x5ACC}, //3389 #CJK UNIFIED IDEOGRAPH
+ {0xB6FC, 0x5ABE}, //3390 #CJK UNIFIED IDEOGRAPH
+ {0xB6FD, 0x5ABD}, //3391 #CJK UNIFIED IDEOGRAPH
+ {0xB6FE, 0x5ABC}, //3392 #CJK UNIFIED IDEOGRAPH
+ {0xB740, 0x5AB3}, //3393 #CJK UNIFIED IDEOGRAPH
+ {0xB741, 0x5AC2}, //3394 #CJK UNIFIED IDEOGRAPH
+ {0xB742, 0x5AB2}, //3395 #CJK UNIFIED IDEOGRAPH
+ {0xB743, 0x5D69}, //3396 #CJK UNIFIED IDEOGRAPH
+ {0xB744, 0x5D6F}, //3397 #CJK UNIFIED IDEOGRAPH
+ {0xB745, 0x5E4C}, //3398 #CJK UNIFIED IDEOGRAPH
+ {0xB746, 0x5E79}, //3399 #CJK UNIFIED IDEOGRAPH
+ {0xB747, 0x5EC9}, //3400 #CJK UNIFIED IDEOGRAPH
+ {0xB748, 0x5EC8}, //3401 #CJK UNIFIED IDEOGRAPH
+ {0xB749, 0x5F12}, //3402 #CJK UNIFIED IDEOGRAPH
+ {0xB74A, 0x5F59}, //3403 #CJK UNIFIED IDEOGRAPH
+ {0xB74B, 0x5FAC}, //3404 #CJK UNIFIED IDEOGRAPH
+ {0xB74C, 0x5FAE}, //3405 #CJK UNIFIED IDEOGRAPH
+ {0xB74D, 0x611A}, //3406 #CJK UNIFIED IDEOGRAPH
+ {0xB74E, 0x610F}, //3407 #CJK UNIFIED IDEOGRAPH
+ {0xB74F, 0x6148}, //3408 #CJK UNIFIED IDEOGRAPH
+ {0xB750, 0x611F}, //3409 #CJK UNIFIED IDEOGRAPH
+ {0xB751, 0x60F3}, //3410 #CJK UNIFIED IDEOGRAPH
+ {0xB752, 0x611B}, //3411 #CJK UNIFIED IDEOGRAPH
+ {0xB753, 0x60F9}, //3412 #CJK UNIFIED IDEOGRAPH
+ {0xB754, 0x6101}, //3413 #CJK UNIFIED IDEOGRAPH
+ {0xB755, 0x6108}, //3414 #CJK UNIFIED IDEOGRAPH
+ {0xB756, 0x614E}, //3415 #CJK UNIFIED IDEOGRAPH
+ {0xB757, 0x614C}, //3416 #CJK UNIFIED IDEOGRAPH
+ {0xB758, 0x6144}, //3417 #CJK UNIFIED IDEOGRAPH
+ {0xB759, 0x614D}, //3418 #CJK UNIFIED IDEOGRAPH
+ {0xB75A, 0x613E}, //3419 #CJK UNIFIED IDEOGRAPH
+ {0xB75B, 0x6134}, //3420 #CJK UNIFIED IDEOGRAPH
+ {0xB75C, 0x6127}, //3421 #CJK UNIFIED IDEOGRAPH
+ {0xB75D, 0x610D}, //3422 #CJK UNIFIED IDEOGRAPH
+ {0xB75E, 0x6106}, //3423 #CJK UNIFIED IDEOGRAPH
+ {0xB75F, 0x6137}, //3424 #CJK UNIFIED IDEOGRAPH
+ {0xB760, 0x6221}, //3425 #CJK UNIFIED IDEOGRAPH
+ {0xB761, 0x6222}, //3426 #CJK UNIFIED IDEOGRAPH
+ {0xB762, 0x6413}, //3427 #CJK UNIFIED IDEOGRAPH
+ {0xB763, 0x643E}, //3428 #CJK UNIFIED IDEOGRAPH
+ {0xB764, 0x641E}, //3429 #CJK UNIFIED IDEOGRAPH
+ {0xB765, 0x642A}, //3430 #CJK UNIFIED IDEOGRAPH
+ {0xB766, 0x642D}, //3431 #CJK UNIFIED IDEOGRAPH
+ {0xB767, 0x643D}, //3432 #CJK UNIFIED IDEOGRAPH
+ {0xB768, 0x642C}, //3433 #CJK UNIFIED IDEOGRAPH
+ {0xB769, 0x640F}, //3434 #CJK UNIFIED IDEOGRAPH
+ {0xB76A, 0x641C}, //3435 #CJK UNIFIED IDEOGRAPH
+ {0xB76B, 0x6414}, //3436 #CJK UNIFIED IDEOGRAPH
+ {0xB76C, 0x640D}, //3437 #CJK UNIFIED IDEOGRAPH
+ {0xB76D, 0x6436}, //3438 #CJK UNIFIED IDEOGRAPH
+ {0xB76E, 0x6416}, //3439 #CJK UNIFIED IDEOGRAPH
+ {0xB76F, 0x6417}, //3440 #CJK UNIFIED IDEOGRAPH
+ {0xB770, 0x6406}, //3441 #CJK UNIFIED IDEOGRAPH
+ {0xB771, 0x656C}, //3442 #CJK UNIFIED IDEOGRAPH
+ {0xB772, 0x659F}, //3443 #CJK UNIFIED IDEOGRAPH
+ {0xB773, 0x65B0}, //3444 #CJK UNIFIED IDEOGRAPH
+ {0xB774, 0x6697}, //3445 #CJK UNIFIED IDEOGRAPH
+ {0xB775, 0x6689}, //3446 #CJK UNIFIED IDEOGRAPH
+ {0xB776, 0x6687}, //3447 #CJK UNIFIED IDEOGRAPH
+ {0xB777, 0x6688}, //3448 #CJK UNIFIED IDEOGRAPH
+ {0xB778, 0x6696}, //3449 #CJK UNIFIED IDEOGRAPH
+ {0xB779, 0x6684}, //3450 #CJK UNIFIED IDEOGRAPH
+ {0xB77A, 0x6698}, //3451 #CJK UNIFIED IDEOGRAPH
+ {0xB77B, 0x668D}, //3452 #CJK UNIFIED IDEOGRAPH
+ {0xB77C, 0x6703}, //3453 #CJK UNIFIED IDEOGRAPH
+ {0xB77D, 0x6994}, //3454 #CJK UNIFIED IDEOGRAPH
+ {0xB77E, 0x696D}, //3455 #CJK UNIFIED IDEOGRAPH
+ {0xB7A1, 0x695A}, //3456 #CJK UNIFIED IDEOGRAPH
+ {0xB7A2, 0x6977}, //3457 #CJK UNIFIED IDEOGRAPH
+ {0xB7A3, 0x6960}, //3458 #CJK UNIFIED IDEOGRAPH
+ {0xB7A4, 0x6954}, //3459 #CJK UNIFIED IDEOGRAPH
+ {0xB7A5, 0x6975}, //3460 #CJK UNIFIED IDEOGRAPH
+ {0xB7A6, 0x6930}, //3461 #CJK UNIFIED IDEOGRAPH
+ {0xB7A7, 0x6982}, //3462 #CJK UNIFIED IDEOGRAPH
+ {0xB7A8, 0x694A}, //3463 #CJK UNIFIED IDEOGRAPH
+ {0xB7A9, 0x6968}, //3464 #CJK UNIFIED IDEOGRAPH
+ {0xB7AA, 0x696B}, //3465 #CJK UNIFIED IDEOGRAPH
+ {0xB7AB, 0x695E}, //3466 #CJK UNIFIED IDEOGRAPH
+ {0xB7AC, 0x6953}, //3467 #CJK UNIFIED IDEOGRAPH
+ {0xB7AD, 0x6979}, //3468 #CJK UNIFIED IDEOGRAPH
+ {0xB7AE, 0x6986}, //3469 #CJK UNIFIED IDEOGRAPH
+ {0xB7AF, 0x695D}, //3470 #CJK UNIFIED IDEOGRAPH
+ {0xB7B0, 0x6963}, //3471 #CJK UNIFIED IDEOGRAPH
+ {0xB7B1, 0x695B}, //3472 #CJK UNIFIED IDEOGRAPH
+ {0xB7B2, 0x6B47}, //3473 #CJK UNIFIED IDEOGRAPH
+ {0xB7B3, 0x6B72}, //3474 #CJK UNIFIED IDEOGRAPH
+ {0xB7B4, 0x6BC0}, //3475 #CJK UNIFIED IDEOGRAPH
+ {0xB7B5, 0x6BBF}, //3476 #CJK UNIFIED IDEOGRAPH
+ {0xB7B6, 0x6BD3}, //3477 #CJK UNIFIED IDEOGRAPH
+ {0xB7B7, 0x6BFD}, //3478 #CJK UNIFIED IDEOGRAPH
+ {0xB7B8, 0x6EA2}, //3479 #CJK UNIFIED IDEOGRAPH
+ {0xB7B9, 0x6EAF}, //3480 #CJK UNIFIED IDEOGRAPH
+ {0xB7BA, 0x6ED3}, //3481 #CJK UNIFIED IDEOGRAPH
+ {0xB7BB, 0x6EB6}, //3482 #CJK UNIFIED IDEOGRAPH
+ {0xB7BC, 0x6EC2}, //3483 #CJK UNIFIED IDEOGRAPH
+ {0xB7BD, 0x6E90}, //3484 #CJK UNIFIED IDEOGRAPH
+ {0xB7BE, 0x6E9D}, //3485 #CJK UNIFIED IDEOGRAPH
+ {0xB7BF, 0x6EC7}, //3486 #CJK UNIFIED IDEOGRAPH
+ {0xB7C0, 0x6EC5}, //3487 #CJK UNIFIED IDEOGRAPH
+ {0xB7C1, 0x6EA5}, //3488 #CJK UNIFIED IDEOGRAPH
+ {0xB7C2, 0x6E98}, //3489 #CJK UNIFIED IDEOGRAPH
+ {0xB7C3, 0x6EBC}, //3490 #CJK UNIFIED IDEOGRAPH
+ {0xB7C4, 0x6EBA}, //3491 #CJK UNIFIED IDEOGRAPH
+ {0xB7C5, 0x6EAB}, //3492 #CJK UNIFIED IDEOGRAPH
+ {0xB7C6, 0x6ED1}, //3493 #CJK UNIFIED IDEOGRAPH
+ {0xB7C7, 0x6E96}, //3494 #CJK UNIFIED IDEOGRAPH
+ {0xB7C8, 0x6E9C}, //3495 #CJK UNIFIED IDEOGRAPH
+ {0xB7C9, 0x6EC4}, //3496 #CJK UNIFIED IDEOGRAPH
+ {0xB7CA, 0x6ED4}, //3497 #CJK UNIFIED IDEOGRAPH
+ {0xB7CB, 0x6EAA}, //3498 #CJK UNIFIED IDEOGRAPH
+ {0xB7CC, 0x6EA7}, //3499 #CJK UNIFIED IDEOGRAPH
+ {0xB7CD, 0x6EB4}, //3500 #CJK UNIFIED IDEOGRAPH
+ {0xB7CE, 0x714E}, //3501 #CJK UNIFIED IDEOGRAPH
+ {0xB7CF, 0x7159}, //3502 #CJK UNIFIED IDEOGRAPH
+ {0xB7D0, 0x7169}, //3503 #CJK UNIFIED IDEOGRAPH
+ {0xB7D1, 0x7164}, //3504 #CJK UNIFIED IDEOGRAPH
+ {0xB7D2, 0x7149}, //3505 #CJK UNIFIED IDEOGRAPH
+ {0xB7D3, 0x7167}, //3506 #CJK UNIFIED IDEOGRAPH
+ {0xB7D4, 0x715C}, //3507 #CJK UNIFIED IDEOGRAPH
+ {0xB7D5, 0x716C}, //3508 #CJK UNIFIED IDEOGRAPH
+ {0xB7D6, 0x7166}, //3509 #CJK UNIFIED IDEOGRAPH
+ {0xB7D7, 0x714C}, //3510 #CJK UNIFIED IDEOGRAPH
+ {0xB7D8, 0x7165}, //3511 #CJK UNIFIED IDEOGRAPH
+ {0xB7D9, 0x715E}, //3512 #CJK UNIFIED IDEOGRAPH
+ {0xB7DA, 0x7146}, //3513 #CJK UNIFIED IDEOGRAPH
+ {0xB7DB, 0x7168}, //3514 #CJK UNIFIED IDEOGRAPH
+ {0xB7DC, 0x7156}, //3515 #CJK UNIFIED IDEOGRAPH
+ {0xB7DD, 0x723A}, //3516 #CJK UNIFIED IDEOGRAPH
+ {0xB7DE, 0x7252}, //3517 #CJK UNIFIED IDEOGRAPH
+ {0xB7DF, 0x7337}, //3518 #CJK UNIFIED IDEOGRAPH
+ {0xB7E0, 0x7345}, //3519 #CJK UNIFIED IDEOGRAPH
+ {0xB7E1, 0x733F}, //3520 #CJK UNIFIED IDEOGRAPH
+ {0xB7E2, 0x733E}, //3521 #CJK UNIFIED IDEOGRAPH
+ {0xB7E3, 0x746F}, //3522 #CJK UNIFIED IDEOGRAPH
+ {0xB7E4, 0x745A}, //3523 #CJK UNIFIED IDEOGRAPH
+ {0xB7E5, 0x7455}, //3524 #CJK UNIFIED IDEOGRAPH
+ {0xB7E6, 0x745F}, //3525 #CJK UNIFIED IDEOGRAPH
+ {0xB7E7, 0x745E}, //3526 #CJK UNIFIED IDEOGRAPH
+ {0xB7E8, 0x7441}, //3527 #CJK UNIFIED IDEOGRAPH
+ {0xB7E9, 0x743F}, //3528 #CJK UNIFIED IDEOGRAPH
+ {0xB7EA, 0x7459}, //3529 #CJK UNIFIED IDEOGRAPH
+ {0xB7EB, 0x745B}, //3530 #CJK UNIFIED IDEOGRAPH
+ {0xB7EC, 0x745C}, //3531 #CJK UNIFIED IDEOGRAPH
+ {0xB7ED, 0x7576}, //3532 #CJK UNIFIED IDEOGRAPH
+ {0xB7EE, 0x7578}, //3533 #CJK UNIFIED IDEOGRAPH
+ {0xB7EF, 0x7600}, //3534 #CJK UNIFIED IDEOGRAPH
+ {0xB7F0, 0x75F0}, //3535 #CJK UNIFIED IDEOGRAPH
+ {0xB7F1, 0x7601}, //3536 #CJK UNIFIED IDEOGRAPH
+ {0xB7F2, 0x75F2}, //3537 #CJK UNIFIED IDEOGRAPH
+ {0xB7F3, 0x75F1}, //3538 #CJK UNIFIED IDEOGRAPH
+ {0xB7F4, 0x75FA}, //3539 #CJK UNIFIED IDEOGRAPH
+ {0xB7F5, 0x75FF}, //3540 #CJK UNIFIED IDEOGRAPH
+ {0xB7F6, 0x75F4}, //3541 #CJK UNIFIED IDEOGRAPH
+ {0xB7F7, 0x75F3}, //3542 #CJK UNIFIED IDEOGRAPH
+ {0xB7F8, 0x76DE}, //3543 #CJK UNIFIED IDEOGRAPH
+ {0xB7F9, 0x76DF}, //3544 #CJK UNIFIED IDEOGRAPH
+ {0xB7FA, 0x775B}, //3545 #CJK UNIFIED IDEOGRAPH
+ {0xB7FB, 0x776B}, //3546 #CJK UNIFIED IDEOGRAPH
+ {0xB7FC, 0x7766}, //3547 #CJK UNIFIED IDEOGRAPH
+ {0xB7FD, 0x775E}, //3548 #CJK UNIFIED IDEOGRAPH
+ {0xB7FE, 0x7763}, //3549 #CJK UNIFIED IDEOGRAPH
+ {0xB840, 0x7779}, //3550 #CJK UNIFIED IDEOGRAPH
+ {0xB841, 0x776A}, //3551 #CJK UNIFIED IDEOGRAPH
+ {0xB842, 0x776C}, //3552 #CJK UNIFIED IDEOGRAPH
+ {0xB843, 0x775C}, //3553 #CJK UNIFIED IDEOGRAPH
+ {0xB844, 0x7765}, //3554 #CJK UNIFIED IDEOGRAPH
+ {0xB845, 0x7768}, //3555 #CJK UNIFIED IDEOGRAPH
+ {0xB846, 0x7762}, //3556 #CJK UNIFIED IDEOGRAPH
+ {0xB847, 0x77EE}, //3557 #CJK UNIFIED IDEOGRAPH
+ {0xB848, 0x788E}, //3558 #CJK UNIFIED IDEOGRAPH
+ {0xB849, 0x78B0}, //3559 #CJK UNIFIED IDEOGRAPH
+ {0xB84A, 0x7897}, //3560 #CJK UNIFIED IDEOGRAPH
+ {0xB84B, 0x7898}, //3561 #CJK UNIFIED IDEOGRAPH
+ {0xB84C, 0x788C}, //3562 #CJK UNIFIED IDEOGRAPH
+ {0xB84D, 0x7889}, //3563 #CJK UNIFIED IDEOGRAPH
+ {0xB84E, 0x787C}, //3564 #CJK UNIFIED IDEOGRAPH
+ {0xB84F, 0x7891}, //3565 #CJK UNIFIED IDEOGRAPH
+ {0xB850, 0x7893}, //3566 #CJK UNIFIED IDEOGRAPH
+ {0xB851, 0x787F}, //3567 #CJK UNIFIED IDEOGRAPH
+ {0xB852, 0x797A}, //3568 #CJK UNIFIED IDEOGRAPH
+ {0xB853, 0x797F}, //3569 #CJK UNIFIED IDEOGRAPH
+ {0xB854, 0x7981}, //3570 #CJK UNIFIED IDEOGRAPH
+ {0xB855, 0x842C}, //3571 #CJK UNIFIED IDEOGRAPH
+ {0xB856, 0x79BD}, //3572 #CJK UNIFIED IDEOGRAPH
+ {0xB857, 0x7A1C}, //3573 #CJK UNIFIED IDEOGRAPH
+ {0xB858, 0x7A1A}, //3574 #CJK UNIFIED IDEOGRAPH
+ {0xB859, 0x7A20}, //3575 #CJK UNIFIED IDEOGRAPH
+ {0xB85A, 0x7A14}, //3576 #CJK UNIFIED IDEOGRAPH
+ {0xB85B, 0x7A1F}, //3577 #CJK UNIFIED IDEOGRAPH
+ {0xB85C, 0x7A1E}, //3578 #CJK UNIFIED IDEOGRAPH
+ {0xB85D, 0x7A9F}, //3579 #CJK UNIFIED IDEOGRAPH
+ {0xB85E, 0x7AA0}, //3580 #CJK UNIFIED IDEOGRAPH
+ {0xB85F, 0x7B77}, //3581 #CJK UNIFIED IDEOGRAPH
+ {0xB860, 0x7BC0}, //3582 #CJK UNIFIED IDEOGRAPH
+ {0xB861, 0x7B60}, //3583 #CJK UNIFIED IDEOGRAPH
+ {0xB862, 0x7B6E}, //3584 #CJK UNIFIED IDEOGRAPH
+ {0xB863, 0x7B67}, //3585 #CJK UNIFIED IDEOGRAPH
+ {0xB864, 0x7CB1}, //3586 #CJK UNIFIED IDEOGRAPH
+ {0xB865, 0x7CB3}, //3587 #CJK UNIFIED IDEOGRAPH
+ {0xB866, 0x7CB5}, //3588 #CJK UNIFIED IDEOGRAPH
+ {0xB867, 0x7D93}, //3589 #CJK UNIFIED IDEOGRAPH
+ {0xB868, 0x7D79}, //3590 #CJK UNIFIED IDEOGRAPH
+ {0xB869, 0x7D91}, //3591 #CJK UNIFIED IDEOGRAPH
+ {0xB86A, 0x7D81}, //3592 #CJK UNIFIED IDEOGRAPH
+ {0xB86B, 0x7D8F}, //3593 #CJK UNIFIED IDEOGRAPH
+ {0xB86C, 0x7D5B}, //3594 #CJK UNIFIED IDEOGRAPH
+ {0xB86D, 0x7F6E}, //3595 #CJK UNIFIED IDEOGRAPH
+ {0xB86E, 0x7F69}, //3596 #CJK UNIFIED IDEOGRAPH
+ {0xB86F, 0x7F6A}, //3597 #CJK UNIFIED IDEOGRAPH
+ {0xB870, 0x7F72}, //3598 #CJK UNIFIED IDEOGRAPH
+ {0xB871, 0x7FA9}, //3599 #CJK UNIFIED IDEOGRAPH
+ {0xB872, 0x7FA8}, //3600 #CJK UNIFIED IDEOGRAPH
+ {0xB873, 0x7FA4}, //3601 #CJK UNIFIED IDEOGRAPH
+ {0xB874, 0x8056}, //3602 #CJK UNIFIED IDEOGRAPH
+ {0xB875, 0x8058}, //3603 #CJK UNIFIED IDEOGRAPH
+ {0xB876, 0x8086}, //3604 #CJK UNIFIED IDEOGRAPH
+ {0xB877, 0x8084}, //3605 #CJK UNIFIED IDEOGRAPH
+ {0xB878, 0x8171}, //3606 #CJK UNIFIED IDEOGRAPH
+ {0xB879, 0x8170}, //3607 #CJK UNIFIED IDEOGRAPH
+ {0xB87A, 0x8178}, //3608 #CJK UNIFIED IDEOGRAPH
+ {0xB87B, 0x8165}, //3609 #CJK UNIFIED IDEOGRAPH
+ {0xB87C, 0x816E}, //3610 #CJK UNIFIED IDEOGRAPH
+ {0xB87D, 0x8173}, //3611 #CJK UNIFIED IDEOGRAPH
+ {0xB87E, 0x816B}, //3612 #CJK UNIFIED IDEOGRAPH
+ {0xB8A1, 0x8179}, //3613 #CJK UNIFIED IDEOGRAPH
+ {0xB8A2, 0x817A}, //3614 #CJK UNIFIED IDEOGRAPH
+ {0xB8A3, 0x8166}, //3615 #CJK UNIFIED IDEOGRAPH
+ {0xB8A4, 0x8205}, //3616 #CJK UNIFIED IDEOGRAPH
+ {0xB8A5, 0x8247}, //3617 #CJK UNIFIED IDEOGRAPH
+ {0xB8A6, 0x8482}, //3618 #CJK UNIFIED IDEOGRAPH
+ {0xB8A7, 0x8477}, //3619 #CJK UNIFIED IDEOGRAPH
+ {0xB8A8, 0x843D}, //3620 #CJK UNIFIED IDEOGRAPH
+ {0xB8A9, 0x8431}, //3621 #CJK UNIFIED IDEOGRAPH
+ {0xB8AA, 0x8475}, //3622 #CJK UNIFIED IDEOGRAPH
+ {0xB8AB, 0x8466}, //3623 #CJK UNIFIED IDEOGRAPH
+ {0xB8AC, 0x846B}, //3624 #CJK UNIFIED IDEOGRAPH
+ {0xB8AD, 0x8449}, //3625 #CJK UNIFIED IDEOGRAPH
+ {0xB8AE, 0x846C}, //3626 #CJK UNIFIED IDEOGRAPH
+ {0xB8AF, 0x845B}, //3627 #CJK UNIFIED IDEOGRAPH
+ {0xB8B0, 0x843C}, //3628 #CJK UNIFIED IDEOGRAPH
+ {0xB8B1, 0x8435}, //3629 #CJK UNIFIED IDEOGRAPH
+ {0xB8B2, 0x8461}, //3630 #CJK UNIFIED IDEOGRAPH
+ {0xB8B3, 0x8463}, //3631 #CJK UNIFIED IDEOGRAPH
+ {0xB8B4, 0x8469}, //3632 #CJK UNIFIED IDEOGRAPH
+ {0xB8B5, 0x846D}, //3633 #CJK UNIFIED IDEOGRAPH
+ {0xB8B6, 0x8446}, //3634 #CJK UNIFIED IDEOGRAPH
+ {0xB8B7, 0x865E}, //3635 #CJK UNIFIED IDEOGRAPH
+ {0xB8B8, 0x865C}, //3636 #CJK UNIFIED IDEOGRAPH
+ {0xB8B9, 0x865F}, //3637 #CJK UNIFIED IDEOGRAPH
+ {0xB8BA, 0x86F9}, //3638 #CJK UNIFIED IDEOGRAPH
+ {0xB8BB, 0x8713}, //3639 #CJK UNIFIED IDEOGRAPH
+ {0xB8BC, 0x8708}, //3640 #CJK UNIFIED IDEOGRAPH
+ {0xB8BD, 0x8707}, //3641 #CJK UNIFIED IDEOGRAPH
+ {0xB8BE, 0x8700}, //3642 #CJK UNIFIED IDEOGRAPH
+ {0xB8BF, 0x86FE}, //3643 #CJK UNIFIED IDEOGRAPH
+ {0xB8C0, 0x86FB}, //3644 #CJK UNIFIED IDEOGRAPH
+ {0xB8C1, 0x8702}, //3645 #CJK UNIFIED IDEOGRAPH
+ {0xB8C2, 0x8703}, //3646 #CJK UNIFIED IDEOGRAPH
+ {0xB8C3, 0x8706}, //3647 #CJK UNIFIED IDEOGRAPH
+ {0xB8C4, 0x870A}, //3648 #CJK UNIFIED IDEOGRAPH
+ {0xB8C5, 0x8859}, //3649 #CJK UNIFIED IDEOGRAPH
+ {0xB8C6, 0x88DF}, //3650 #CJK UNIFIED IDEOGRAPH
+ {0xB8C7, 0x88D4}, //3651 #CJK UNIFIED IDEOGRAPH
+ {0xB8C8, 0x88D9}, //3652 #CJK UNIFIED IDEOGRAPH
+ {0xB8C9, 0x88DC}, //3653 #CJK UNIFIED IDEOGRAPH
+ {0xB8CA, 0x88D8}, //3654 #CJK UNIFIED IDEOGRAPH
+ {0xB8CB, 0x88DD}, //3655 #CJK UNIFIED IDEOGRAPH
+ {0xB8CC, 0x88E1}, //3656 #CJK UNIFIED IDEOGRAPH
+ {0xB8CD, 0x88CA}, //3657 #CJK UNIFIED IDEOGRAPH
+ {0xB8CE, 0x88D5}, //3658 #CJK UNIFIED IDEOGRAPH
+ {0xB8CF, 0x88D2}, //3659 #CJK UNIFIED IDEOGRAPH
+ {0xB8D0, 0x899C}, //3660 #CJK UNIFIED IDEOGRAPH
+ {0xB8D1, 0x89E3}, //3661 #CJK UNIFIED IDEOGRAPH
+ {0xB8D2, 0x8A6B}, //3662 #CJK UNIFIED IDEOGRAPH
+ {0xB8D3, 0x8A72}, //3663 #CJK UNIFIED IDEOGRAPH
+ {0xB8D4, 0x8A73}, //3664 #CJK UNIFIED IDEOGRAPH
+ {0xB8D5, 0x8A66}, //3665 #CJK UNIFIED IDEOGRAPH
+ {0xB8D6, 0x8A69}, //3666 #CJK UNIFIED IDEOGRAPH
+ {0xB8D7, 0x8A70}, //3667 #CJK UNIFIED IDEOGRAPH
+ {0xB8D8, 0x8A87}, //3668 #CJK UNIFIED IDEOGRAPH
+ {0xB8D9, 0x8A7C}, //3669 #CJK UNIFIED IDEOGRAPH
+ {0xB8DA, 0x8A63}, //3670 #CJK UNIFIED IDEOGRAPH
+ {0xB8DB, 0x8AA0}, //3671 #CJK UNIFIED IDEOGRAPH
+ {0xB8DC, 0x8A71}, //3672 #CJK UNIFIED IDEOGRAPH
+ {0xB8DD, 0x8A85}, //3673 #CJK UNIFIED IDEOGRAPH
+ {0xB8DE, 0x8A6D}, //3674 #CJK UNIFIED IDEOGRAPH
+ {0xB8DF, 0x8A62}, //3675 #CJK UNIFIED IDEOGRAPH
+ {0xB8E0, 0x8A6E}, //3676 #CJK UNIFIED IDEOGRAPH
+ {0xB8E1, 0x8A6C}, //3677 #CJK UNIFIED IDEOGRAPH
+ {0xB8E2, 0x8A79}, //3678 #CJK UNIFIED IDEOGRAPH
+ {0xB8E3, 0x8A7B}, //3679 #CJK UNIFIED IDEOGRAPH
+ {0xB8E4, 0x8A3E}, //3680 #CJK UNIFIED IDEOGRAPH
+ {0xB8E5, 0x8A68}, //3681 #CJK UNIFIED IDEOGRAPH
+ {0xB8E6, 0x8C62}, //3682 #CJK UNIFIED IDEOGRAPH
+ {0xB8E7, 0x8C8A}, //3683 #CJK UNIFIED IDEOGRAPH
+ {0xB8E8, 0x8C89}, //3684 #CJK UNIFIED IDEOGRAPH
+ {0xB8E9, 0x8CCA}, //3685 #CJK UNIFIED IDEOGRAPH
+ {0xB8EA, 0x8CC7}, //3686 #CJK UNIFIED IDEOGRAPH
+ {0xB8EB, 0x8CC8}, //3687 #CJK UNIFIED IDEOGRAPH
+ {0xB8EC, 0x8CC4}, //3688 #CJK UNIFIED IDEOGRAPH
+ {0xB8ED, 0x8CB2}, //3689 #CJK UNIFIED IDEOGRAPH
+ {0xB8EE, 0x8CC3}, //3690 #CJK UNIFIED IDEOGRAPH
+ {0xB8EF, 0x8CC2}, //3691 #CJK UNIFIED IDEOGRAPH
+ {0xB8F0, 0x8CC5}, //3692 #CJK UNIFIED IDEOGRAPH
+ {0xB8F1, 0x8DE1}, //3693 #CJK UNIFIED IDEOGRAPH
+ {0xB8F2, 0x8DDF}, //3694 #CJK UNIFIED IDEOGRAPH
+ {0xB8F3, 0x8DE8}, //3695 #CJK UNIFIED IDEOGRAPH
+ {0xB8F4, 0x8DEF}, //3696 #CJK UNIFIED IDEOGRAPH
+ {0xB8F5, 0x8DF3}, //3697 #CJK UNIFIED IDEOGRAPH
+ {0xB8F6, 0x8DFA}, //3698 #CJK UNIFIED IDEOGRAPH
+ {0xB8F7, 0x8DEA}, //3699 #CJK UNIFIED IDEOGRAPH
+ {0xB8F8, 0x8DE4}, //3700 #CJK UNIFIED IDEOGRAPH
+ {0xB8F9, 0x8DE6}, //3701 #CJK UNIFIED IDEOGRAPH
+ {0xB8FA, 0x8EB2}, //3702 #CJK UNIFIED IDEOGRAPH
+ {0xB8FB, 0x8F03}, //3703 #CJK UNIFIED IDEOGRAPH
+ {0xB8FC, 0x8F09}, //3704 #CJK UNIFIED IDEOGRAPH
+ {0xB8FD, 0x8EFE}, //3705 #CJK UNIFIED IDEOGRAPH
+ {0xB8FE, 0x8F0A}, //3706 #CJK UNIFIED IDEOGRAPH
+ {0xB940, 0x8F9F}, //3707 #CJK UNIFIED IDEOGRAPH
+ {0xB941, 0x8FB2}, //3708 #CJK UNIFIED IDEOGRAPH
+ {0xB942, 0x904B}, //3709 #CJK UNIFIED IDEOGRAPH
+ {0xB943, 0x904A}, //3710 #CJK UNIFIED IDEOGRAPH
+ {0xB944, 0x9053}, //3711 #CJK UNIFIED IDEOGRAPH
+ {0xB945, 0x9042}, //3712 #CJK UNIFIED IDEOGRAPH
+ {0xB946, 0x9054}, //3713 #CJK UNIFIED IDEOGRAPH
+ {0xB947, 0x903C}, //3714 #CJK UNIFIED IDEOGRAPH
+ {0xB948, 0x9055}, //3715 #CJK UNIFIED IDEOGRAPH
+ {0xB949, 0x9050}, //3716 #CJK UNIFIED IDEOGRAPH
+ {0xB94A, 0x9047}, //3717 #CJK UNIFIED IDEOGRAPH
+ {0xB94B, 0x904F}, //3718 #CJK UNIFIED IDEOGRAPH
+ {0xB94C, 0x904E}, //3719 #CJK UNIFIED IDEOGRAPH
+ {0xB94D, 0x904D}, //3720 #CJK UNIFIED IDEOGRAPH
+ {0xB94E, 0x9051}, //3721 #CJK UNIFIED IDEOGRAPH
+ {0xB94F, 0x903E}, //3722 #CJK UNIFIED IDEOGRAPH
+ {0xB950, 0x9041}, //3723 #CJK UNIFIED IDEOGRAPH
+ {0xB951, 0x9112}, //3724 #CJK UNIFIED IDEOGRAPH
+ {0xB952, 0x9117}, //3725 #CJK UNIFIED IDEOGRAPH
+ {0xB953, 0x916C}, //3726 #CJK UNIFIED IDEOGRAPH
+ {0xB954, 0x916A}, //3727 #CJK UNIFIED IDEOGRAPH
+ {0xB955, 0x9169}, //3728 #CJK UNIFIED IDEOGRAPH
+ {0xB956, 0x91C9}, //3729 #CJK UNIFIED IDEOGRAPH
+ {0xB957, 0x9237}, //3730 #CJK UNIFIED IDEOGRAPH
+ {0xB958, 0x9257}, //3731 #CJK UNIFIED IDEOGRAPH
+ {0xB959, 0x9238}, //3732 #CJK UNIFIED IDEOGRAPH
+ {0xB95A, 0x923D}, //3733 #CJK UNIFIED IDEOGRAPH
+ {0xB95B, 0x9240}, //3734 #CJK UNIFIED IDEOGRAPH
+ {0xB95C, 0x923E}, //3735 #CJK UNIFIED IDEOGRAPH
+ {0xB95D, 0x925B}, //3736 #CJK UNIFIED IDEOGRAPH
+ {0xB95E, 0x924B}, //3737 #CJK UNIFIED IDEOGRAPH
+ {0xB95F, 0x9264}, //3738 #CJK UNIFIED IDEOGRAPH
+ {0xB960, 0x9251}, //3739 #CJK UNIFIED IDEOGRAPH
+ {0xB961, 0x9234}, //3740 #CJK UNIFIED IDEOGRAPH
+ {0xB962, 0x9249}, //3741 #CJK UNIFIED IDEOGRAPH
+ {0xB963, 0x924D}, //3742 #CJK UNIFIED IDEOGRAPH
+ {0xB964, 0x9245}, //3743 #CJK UNIFIED IDEOGRAPH
+ {0xB965, 0x9239}, //3744 #CJK UNIFIED IDEOGRAPH
+ {0xB966, 0x923F}, //3745 #CJK UNIFIED IDEOGRAPH
+ {0xB967, 0x925A}, //3746 #CJK UNIFIED IDEOGRAPH
+ {0xB968, 0x9598}, //3747 #CJK UNIFIED IDEOGRAPH
+ {0xB969, 0x9698}, //3748 #CJK UNIFIED IDEOGRAPH
+ {0xB96A, 0x9694}, //3749 #CJK UNIFIED IDEOGRAPH
+ {0xB96B, 0x9695}, //3750 #CJK UNIFIED IDEOGRAPH
+ {0xB96C, 0x96CD}, //3751 #CJK UNIFIED IDEOGRAPH
+ {0xB96D, 0x96CB}, //3752 #CJK UNIFIED IDEOGRAPH
+ {0xB96E, 0x96C9}, //3753 #CJK UNIFIED IDEOGRAPH
+ {0xB96F, 0x96CA}, //3754 #CJK UNIFIED IDEOGRAPH
+ {0xB970, 0x96F7}, //3755 #CJK UNIFIED IDEOGRAPH
+ {0xB971, 0x96FB}, //3756 #CJK UNIFIED IDEOGRAPH
+ {0xB972, 0x96F9}, //3757 #CJK UNIFIED IDEOGRAPH
+ {0xB973, 0x96F6}, //3758 #CJK UNIFIED IDEOGRAPH
+ {0xB974, 0x9756}, //3759 #CJK UNIFIED IDEOGRAPH
+ {0xB975, 0x9774}, //3760 #CJK UNIFIED IDEOGRAPH
+ {0xB976, 0x9776}, //3761 #CJK UNIFIED IDEOGRAPH
+ {0xB977, 0x9810}, //3762 #CJK UNIFIED IDEOGRAPH
+ {0xB978, 0x9811}, //3763 #CJK UNIFIED IDEOGRAPH
+ {0xB979, 0x9813}, //3764 #CJK UNIFIED IDEOGRAPH
+ {0xB97A, 0x980A}, //3765 #CJK UNIFIED IDEOGRAPH
+ {0xB97B, 0x9812}, //3766 #CJK UNIFIED IDEOGRAPH
+ {0xB97C, 0x980C}, //3767 #CJK UNIFIED IDEOGRAPH
+ {0xB97D, 0x98FC}, //3768 #CJK UNIFIED IDEOGRAPH
+ {0xB97E, 0x98F4}, //3769 #CJK UNIFIED IDEOGRAPH
+ {0xB9A1, 0x98FD}, //3770 #CJK UNIFIED IDEOGRAPH
+ {0xB9A2, 0x98FE}, //3771 #CJK UNIFIED IDEOGRAPH
+ {0xB9A3, 0x99B3}, //3772 #CJK UNIFIED IDEOGRAPH
+ {0xB9A4, 0x99B1}, //3773 #CJK UNIFIED IDEOGRAPH
+ {0xB9A5, 0x99B4}, //3774 #CJK UNIFIED IDEOGRAPH
+ {0xB9A6, 0x9AE1}, //3775 #CJK UNIFIED IDEOGRAPH
+ {0xB9A7, 0x9CE9}, //3776 #CJK UNIFIED IDEOGRAPH
+ {0xB9A8, 0x9E82}, //3777 #CJK UNIFIED IDEOGRAPH
+ {0xB9A9, 0x9F0E}, //3778 #CJK UNIFIED IDEOGRAPH
+ {0xB9AA, 0x9F13}, //3779 #CJK UNIFIED IDEOGRAPH
+ {0xB9AB, 0x9F20}, //3780 #CJK UNIFIED IDEOGRAPH
+ {0xB9AC, 0x50E7}, //3781 #CJK UNIFIED IDEOGRAPH
+ {0xB9AD, 0x50EE}, //3782 #CJK UNIFIED IDEOGRAPH
+ {0xB9AE, 0x50E5}, //3783 #CJK UNIFIED IDEOGRAPH
+ {0xB9AF, 0x50D6}, //3784 #CJK UNIFIED IDEOGRAPH
+ {0xB9B0, 0x50ED}, //3785 #CJK UNIFIED IDEOGRAPH
+ {0xB9B1, 0x50DA}, //3786 #CJK UNIFIED IDEOGRAPH
+ {0xB9B2, 0x50D5}, //3787 #CJK UNIFIED IDEOGRAPH
+ {0xB9B3, 0x50CF}, //3788 #CJK UNIFIED IDEOGRAPH
+ {0xB9B4, 0x50D1}, //3789 #CJK UNIFIED IDEOGRAPH
+ {0xB9B5, 0x50F1}, //3790 #CJK UNIFIED IDEOGRAPH
+ {0xB9B6, 0x50CE}, //3791 #CJK UNIFIED IDEOGRAPH
+ {0xB9B7, 0x50E9}, //3792 #CJK UNIFIED IDEOGRAPH
+ {0xB9B8, 0x5162}, //3793 #CJK UNIFIED IDEOGRAPH
+ {0xB9B9, 0x51F3}, //3794 #CJK UNIFIED IDEOGRAPH
+ {0xB9BA, 0x5283}, //3795 #CJK UNIFIED IDEOGRAPH
+ {0xB9BB, 0x5282}, //3796 #CJK UNIFIED IDEOGRAPH
+ {0xB9BC, 0x5331}, //3797 #CJK UNIFIED IDEOGRAPH
+ {0xB9BD, 0x53AD}, //3798 #CJK UNIFIED IDEOGRAPH
+ {0xB9BE, 0x55FE}, //3799 #CJK UNIFIED IDEOGRAPH
+ {0xB9BF, 0x5600}, //3800 #CJK UNIFIED IDEOGRAPH
+ {0xB9C0, 0x561B}, //3801 #CJK UNIFIED IDEOGRAPH
+ {0xB9C1, 0x5617}, //3802 #CJK UNIFIED IDEOGRAPH
+ {0xB9C2, 0x55FD}, //3803 #CJK UNIFIED IDEOGRAPH
+ {0xB9C3, 0x5614}, //3804 #CJK UNIFIED IDEOGRAPH
+ {0xB9C4, 0x5606}, //3805 #CJK UNIFIED IDEOGRAPH
+ {0xB9C5, 0x5609}, //3806 #CJK UNIFIED IDEOGRAPH
+ {0xB9C6, 0x560D}, //3807 #CJK UNIFIED IDEOGRAPH
+ {0xB9C7, 0x560E}, //3808 #CJK UNIFIED IDEOGRAPH
+ {0xB9C8, 0x55F7}, //3809 #CJK UNIFIED IDEOGRAPH
+ {0xB9C9, 0x5616}, //3810 #CJK UNIFIED IDEOGRAPH
+ {0xB9CA, 0x561F}, //3811 #CJK UNIFIED IDEOGRAPH
+ {0xB9CB, 0x5608}, //3812 #CJK UNIFIED IDEOGRAPH
+ {0xB9CC, 0x5610}, //3813 #CJK UNIFIED IDEOGRAPH
+ {0xB9CD, 0x55F6}, //3814 #CJK UNIFIED IDEOGRAPH
+ {0xB9CE, 0x5718}, //3815 #CJK UNIFIED IDEOGRAPH
+ {0xB9CF, 0x5716}, //3816 #CJK UNIFIED IDEOGRAPH
+ {0xB9D0, 0x5875}, //3817 #CJK UNIFIED IDEOGRAPH
+ {0xB9D1, 0x587E}, //3818 #CJK UNIFIED IDEOGRAPH
+ {0xB9D2, 0x5883}, //3819 #CJK UNIFIED IDEOGRAPH
+ {0xB9D3, 0x5893}, //3820 #CJK UNIFIED IDEOGRAPH
+ {0xB9D4, 0x588A}, //3821 #CJK UNIFIED IDEOGRAPH
+ {0xB9D5, 0x5879}, //3822 #CJK UNIFIED IDEOGRAPH
+ {0xB9D6, 0x5885}, //3823 #CJK UNIFIED IDEOGRAPH
+ {0xB9D7, 0x587D}, //3824 #CJK UNIFIED IDEOGRAPH
+ {0xB9D8, 0x58FD}, //3825 #CJK UNIFIED IDEOGRAPH
+ {0xB9D9, 0x5925}, //3826 #CJK UNIFIED IDEOGRAPH
+ {0xB9DA, 0x5922}, //3827 #CJK UNIFIED IDEOGRAPH
+ {0xB9DB, 0x5924}, //3828 #CJK UNIFIED IDEOGRAPH
+ {0xB9DC, 0x596A}, //3829 #CJK UNIFIED IDEOGRAPH
+ {0xB9DD, 0x5969}, //3830 #CJK UNIFIED IDEOGRAPH
+ {0xB9DE, 0x5AE1}, //3831 #CJK UNIFIED IDEOGRAPH
+ {0xB9DF, 0x5AE6}, //3832 #CJK UNIFIED IDEOGRAPH
+ {0xB9E0, 0x5AE9}, //3833 #CJK UNIFIED IDEOGRAPH
+ {0xB9E1, 0x5AD7}, //3834 #CJK UNIFIED IDEOGRAPH
+ {0xB9E2, 0x5AD6}, //3835 #CJK UNIFIED IDEOGRAPH
+ {0xB9E3, 0x5AD8}, //3836 #CJK UNIFIED IDEOGRAPH
+ {0xB9E4, 0x5AE3}, //3837 #CJK UNIFIED IDEOGRAPH
+ {0xB9E5, 0x5B75}, //3838 #CJK UNIFIED IDEOGRAPH
+ {0xB9E6, 0x5BDE}, //3839 #CJK UNIFIED IDEOGRAPH
+ {0xB9E7, 0x5BE7}, //3840 #CJK UNIFIED IDEOGRAPH
+ {0xB9E8, 0x5BE1}, //3841 #CJK UNIFIED IDEOGRAPH
+ {0xB9E9, 0x5BE5}, //3842 #CJK UNIFIED IDEOGRAPH
+ {0xB9EA, 0x5BE6}, //3843 #CJK UNIFIED IDEOGRAPH
+ {0xB9EB, 0x5BE8}, //3844 #CJK UNIFIED IDEOGRAPH
+ {0xB9EC, 0x5BE2}, //3845 #CJK UNIFIED IDEOGRAPH
+ {0xB9ED, 0x5BE4}, //3846 #CJK UNIFIED IDEOGRAPH
+ {0xB9EE, 0x5BDF}, //3847 #CJK UNIFIED IDEOGRAPH
+ {0xB9EF, 0x5C0D}, //3848 #CJK UNIFIED IDEOGRAPH
+ {0xB9F0, 0x5C62}, //3849 #CJK UNIFIED IDEOGRAPH
+ {0xB9F1, 0x5D84}, //3850 #CJK UNIFIED IDEOGRAPH
+ {0xB9F2, 0x5D87}, //3851 #CJK UNIFIED IDEOGRAPH
+ {0xB9F3, 0x5E5B}, //3852 #CJK UNIFIED IDEOGRAPH
+ {0xB9F4, 0x5E63}, //3853 #CJK UNIFIED IDEOGRAPH
+ {0xB9F5, 0x5E55}, //3854 #CJK UNIFIED IDEOGRAPH
+ {0xB9F6, 0x5E57}, //3855 #CJK UNIFIED IDEOGRAPH
+ {0xB9F7, 0x5E54}, //3856 #CJK UNIFIED IDEOGRAPH
+ {0xB9F8, 0x5ED3}, //3857 #CJK UNIFIED IDEOGRAPH
+ {0xB9F9, 0x5ED6}, //3858 #CJK UNIFIED IDEOGRAPH
+ {0xB9FA, 0x5F0A}, //3859 #CJK UNIFIED IDEOGRAPH
+ {0xB9FB, 0x5F46}, //3860 #CJK UNIFIED IDEOGRAPH
+ {0xB9FC, 0x5F70}, //3861 #CJK UNIFIED IDEOGRAPH
+ {0xB9FD, 0x5FB9}, //3862 #CJK UNIFIED IDEOGRAPH
+ {0xB9FE, 0x6147}, //3863 #CJK UNIFIED IDEOGRAPH
+ {0xBA40, 0x613F}, //3864 #CJK UNIFIED IDEOGRAPH
+ {0xBA41, 0x614B}, //3865 #CJK UNIFIED IDEOGRAPH
+ {0xBA42, 0x6177}, //3866 #CJK UNIFIED IDEOGRAPH
+ {0xBA43, 0x6162}, //3867 #CJK UNIFIED IDEOGRAPH
+ {0xBA44, 0x6163}, //3868 #CJK UNIFIED IDEOGRAPH
+ {0xBA45, 0x615F}, //3869 #CJK UNIFIED IDEOGRAPH
+ {0xBA46, 0x615A}, //3870 #CJK UNIFIED IDEOGRAPH
+ {0xBA47, 0x6158}, //3871 #CJK UNIFIED IDEOGRAPH
+ {0xBA48, 0x6175}, //3872 #CJK UNIFIED IDEOGRAPH
+ {0xBA49, 0x622A}, //3873 #CJK UNIFIED IDEOGRAPH
+ {0xBA4A, 0x6487}, //3874 #CJK UNIFIED IDEOGRAPH
+ {0xBA4B, 0x6458}, //3875 #CJK UNIFIED IDEOGRAPH
+ {0xBA4C, 0x6454}, //3876 #CJK UNIFIED IDEOGRAPH
+ {0xBA4D, 0x64A4}, //3877 #CJK UNIFIED IDEOGRAPH
+ {0xBA4E, 0x6478}, //3878 #CJK UNIFIED IDEOGRAPH
+ {0xBA4F, 0x645F}, //3879 #CJK UNIFIED IDEOGRAPH
+ {0xBA50, 0x647A}, //3880 #CJK UNIFIED IDEOGRAPH
+ {0xBA51, 0x6451}, //3881 #CJK UNIFIED IDEOGRAPH
+ {0xBA52, 0x6467}, //3882 #CJK UNIFIED IDEOGRAPH
+ {0xBA53, 0x6434}, //3883 #CJK UNIFIED IDEOGRAPH
+ {0xBA54, 0x646D}, //3884 #CJK UNIFIED IDEOGRAPH
+ {0xBA55, 0x647B}, //3885 #CJK UNIFIED IDEOGRAPH
+ {0xBA56, 0x6572}, //3886 #CJK UNIFIED IDEOGRAPH
+ {0xBA57, 0x65A1}, //3887 #CJK UNIFIED IDEOGRAPH
+ {0xBA58, 0x65D7}, //3888 #CJK UNIFIED IDEOGRAPH
+ {0xBA59, 0x65D6}, //3889 #CJK UNIFIED IDEOGRAPH
+ {0xBA5A, 0x66A2}, //3890 #CJK UNIFIED IDEOGRAPH
+ {0xBA5B, 0x66A8}, //3891 #CJK UNIFIED IDEOGRAPH
+ {0xBA5C, 0x669D}, //3892 #CJK UNIFIED IDEOGRAPH
+ {0xBA5D, 0x699C}, //3893 #CJK UNIFIED IDEOGRAPH
+ {0xBA5E, 0x69A8}, //3894 #CJK UNIFIED IDEOGRAPH
+ {0xBA5F, 0x6995}, //3895 #CJK UNIFIED IDEOGRAPH
+ {0xBA60, 0x69C1}, //3896 #CJK UNIFIED IDEOGRAPH
+ {0xBA61, 0x69AE}, //3897 #CJK UNIFIED IDEOGRAPH
+ {0xBA62, 0x69D3}, //3898 #CJK UNIFIED IDEOGRAPH
+ {0xBA63, 0x69CB}, //3899 #CJK UNIFIED IDEOGRAPH
+ {0xBA64, 0x699B}, //3900 #CJK UNIFIED IDEOGRAPH
+ {0xBA65, 0x69B7}, //3901 #CJK UNIFIED IDEOGRAPH
+ {0xBA66, 0x69BB}, //3902 #CJK UNIFIED IDEOGRAPH
+ {0xBA67, 0x69AB}, //3903 #CJK UNIFIED IDEOGRAPH
+ {0xBA68, 0x69B4}, //3904 #CJK UNIFIED IDEOGRAPH
+ {0xBA69, 0x69D0}, //3905 #CJK UNIFIED IDEOGRAPH
+ {0xBA6A, 0x69CD}, //3906 #CJK UNIFIED IDEOGRAPH
+ {0xBA6B, 0x69AD}, //3907 #CJK UNIFIED IDEOGRAPH
+ {0xBA6C, 0x69CC}, //3908 #CJK UNIFIED IDEOGRAPH
+ {0xBA6D, 0x69A6}, //3909 #CJK UNIFIED IDEOGRAPH
+ {0xBA6E, 0x69C3}, //3910 #CJK UNIFIED IDEOGRAPH
+ {0xBA6F, 0x69A3}, //3911 #CJK UNIFIED IDEOGRAPH
+ {0xBA70, 0x6B49}, //3912 #CJK UNIFIED IDEOGRAPH
+ {0xBA71, 0x6B4C}, //3913 #CJK UNIFIED IDEOGRAPH
+ {0xBA72, 0x6C33}, //3914 #CJK UNIFIED IDEOGRAPH
+ {0xBA73, 0x6F33}, //3915 #CJK UNIFIED IDEOGRAPH
+ {0xBA74, 0x6F14}, //3916 #CJK UNIFIED IDEOGRAPH
+ {0xBA75, 0x6EFE}, //3917 #CJK UNIFIED IDEOGRAPH
+ {0xBA76, 0x6F13}, //3918 #CJK UNIFIED IDEOGRAPH
+ {0xBA77, 0x6EF4}, //3919 #CJK UNIFIED IDEOGRAPH
+ {0xBA78, 0x6F29}, //3920 #CJK UNIFIED IDEOGRAPH
+ {0xBA79, 0x6F3E}, //3921 #CJK UNIFIED IDEOGRAPH
+ {0xBA7A, 0x6F20}, //3922 #CJK UNIFIED IDEOGRAPH
+ {0xBA7B, 0x6F2C}, //3923 #CJK UNIFIED IDEOGRAPH
+ {0xBA7C, 0x6F0F}, //3924 #CJK UNIFIED IDEOGRAPH
+ {0xBA7D, 0x6F02}, //3925 #CJK UNIFIED IDEOGRAPH
+ {0xBA7E, 0x6F22}, //3926 #CJK UNIFIED IDEOGRAPH
+ {0xBAA1, 0x6EFF}, //3927 #CJK UNIFIED IDEOGRAPH
+ {0xBAA2, 0x6EEF}, //3928 #CJK UNIFIED IDEOGRAPH
+ {0xBAA3, 0x6F06}, //3929 #CJK UNIFIED IDEOGRAPH
+ {0xBAA4, 0x6F31}, //3930 #CJK UNIFIED IDEOGRAPH
+ {0xBAA5, 0x6F38}, //3931 #CJK UNIFIED IDEOGRAPH
+ {0xBAA6, 0x6F32}, //3932 #CJK UNIFIED IDEOGRAPH
+ {0xBAA7, 0x6F23}, //3933 #CJK UNIFIED IDEOGRAPH
+ {0xBAA8, 0x6F15}, //3934 #CJK UNIFIED IDEOGRAPH
+ {0xBAA9, 0x6F2B}, //3935 #CJK UNIFIED IDEOGRAPH
+ {0xBAAA, 0x6F2F}, //3936 #CJK UNIFIED IDEOGRAPH
+ {0xBAAB, 0x6F88}, //3937 #CJK UNIFIED IDEOGRAPH
+ {0xBAAC, 0x6F2A}, //3938 #CJK UNIFIED IDEOGRAPH
+ {0xBAAD, 0x6EEC}, //3939 #CJK UNIFIED IDEOGRAPH
+ {0xBAAE, 0x6F01}, //3940 #CJK UNIFIED IDEOGRAPH
+ {0xBAAF, 0x6EF2}, //3941 #CJK UNIFIED IDEOGRAPH
+ {0xBAB0, 0x6ECC}, //3942 #CJK UNIFIED IDEOGRAPH
+ {0xBAB1, 0x6EF7}, //3943 #CJK UNIFIED IDEOGRAPH
+ {0xBAB2, 0x7194}, //3944 #CJK UNIFIED IDEOGRAPH
+ {0xBAB3, 0x7199}, //3945 #CJK UNIFIED IDEOGRAPH
+ {0xBAB4, 0x717D}, //3946 #CJK UNIFIED IDEOGRAPH
+ {0xBAB5, 0x718A}, //3947 #CJK UNIFIED IDEOGRAPH
+ {0xBAB6, 0x7184}, //3948 #CJK UNIFIED IDEOGRAPH
+ {0xBAB7, 0x7192}, //3949 #CJK UNIFIED IDEOGRAPH
+ {0xBAB8, 0x723E}, //3950 #CJK UNIFIED IDEOGRAPH
+ {0xBAB9, 0x7292}, //3951 #CJK UNIFIED IDEOGRAPH
+ {0xBABA, 0x7296}, //3952 #CJK UNIFIED IDEOGRAPH
+ {0xBABB, 0x7344}, //3953 #CJK UNIFIED IDEOGRAPH
+ {0xBABC, 0x7350}, //3954 #CJK UNIFIED IDEOGRAPH
+ {0xBABD, 0x7464}, //3955 #CJK UNIFIED IDEOGRAPH
+ {0xBABE, 0x7463}, //3956 #CJK UNIFIED IDEOGRAPH
+ {0xBABF, 0x746A}, //3957 #CJK UNIFIED IDEOGRAPH
+ {0xBAC0, 0x7470}, //3958 #CJK UNIFIED IDEOGRAPH
+ {0xBAC1, 0x746D}, //3959 #CJK UNIFIED IDEOGRAPH
+ {0xBAC2, 0x7504}, //3960 #CJK UNIFIED IDEOGRAPH
+ {0xBAC3, 0x7591}, //3961 #CJK UNIFIED IDEOGRAPH
+ {0xBAC4, 0x7627}, //3962 #CJK UNIFIED IDEOGRAPH
+ {0xBAC5, 0x760D}, //3963 #CJK UNIFIED IDEOGRAPH
+ {0xBAC6, 0x760B}, //3964 #CJK UNIFIED IDEOGRAPH
+ {0xBAC7, 0x7609}, //3965 #CJK UNIFIED IDEOGRAPH
+ {0xBAC8, 0x7613}, //3966 #CJK UNIFIED IDEOGRAPH
+ {0xBAC9, 0x76E1}, //3967 #CJK UNIFIED IDEOGRAPH
+ {0xBACA, 0x76E3}, //3968 #CJK UNIFIED IDEOGRAPH
+ {0xBACB, 0x7784}, //3969 #CJK UNIFIED IDEOGRAPH
+ {0xBACC, 0x777D}, //3970 #CJK UNIFIED IDEOGRAPH
+ {0xBACD, 0x777F}, //3971 #CJK UNIFIED IDEOGRAPH
+ {0xBACE, 0x7761}, //3972 #CJK UNIFIED IDEOGRAPH
+ {0xBACF, 0x78C1}, //3973 #CJK UNIFIED IDEOGRAPH
+ {0xBAD0, 0x789F}, //3974 #CJK UNIFIED IDEOGRAPH
+ {0xBAD1, 0x78A7}, //3975 #CJK UNIFIED IDEOGRAPH
+ {0xBAD2, 0x78B3}, //3976 #CJK UNIFIED IDEOGRAPH
+ {0xBAD3, 0x78A9}, //3977 #CJK UNIFIED IDEOGRAPH
+ {0xBAD4, 0x78A3}, //3978 #CJK UNIFIED IDEOGRAPH
+ {0xBAD5, 0x798E}, //3979 #CJK UNIFIED IDEOGRAPH
+ {0xBAD6, 0x798F}, //3980 #CJK UNIFIED IDEOGRAPH
+ {0xBAD7, 0x798D}, //3981 #CJK UNIFIED IDEOGRAPH
+ {0xBAD8, 0x7A2E}, //3982 #CJK UNIFIED IDEOGRAPH
+ {0xBAD9, 0x7A31}, //3983 #CJK UNIFIED IDEOGRAPH
+ {0xBADA, 0x7AAA}, //3984 #CJK UNIFIED IDEOGRAPH
+ {0xBADB, 0x7AA9}, //3985 #CJK UNIFIED IDEOGRAPH
+ {0xBADC, 0x7AED}, //3986 #CJK UNIFIED IDEOGRAPH
+ {0xBADD, 0x7AEF}, //3987 #CJK UNIFIED IDEOGRAPH
+ {0xBADE, 0x7BA1}, //3988 #CJK UNIFIED IDEOGRAPH
+ {0xBADF, 0x7B95}, //3989 #CJK UNIFIED IDEOGRAPH
+ {0xBAE0, 0x7B8B}, //3990 #CJK UNIFIED IDEOGRAPH
+ {0xBAE1, 0x7B75}, //3991 #CJK UNIFIED IDEOGRAPH
+ {0xBAE2, 0x7B97}, //3992 #CJK UNIFIED IDEOGRAPH
+ {0xBAE3, 0x7B9D}, //3993 #CJK UNIFIED IDEOGRAPH
+ {0xBAE4, 0x7B94}, //3994 #CJK UNIFIED IDEOGRAPH
+ {0xBAE5, 0x7B8F}, //3995 #CJK UNIFIED IDEOGRAPH
+ {0xBAE6, 0x7BB8}, //3996 #CJK UNIFIED IDEOGRAPH
+ {0xBAE7, 0x7B87}, //3997 #CJK UNIFIED IDEOGRAPH
+ {0xBAE8, 0x7B84}, //3998 #CJK UNIFIED IDEOGRAPH
+ {0xBAE9, 0x7CB9}, //3999 #CJK UNIFIED IDEOGRAPH
+ {0xBAEA, 0x7CBD}, //4000 #CJK UNIFIED IDEOGRAPH
+ {0xBAEB, 0x7CBE}, //4001 #CJK UNIFIED IDEOGRAPH
+ {0xBAEC, 0x7DBB}, //4002 #CJK UNIFIED IDEOGRAPH
+ {0xBAED, 0x7DB0}, //4003 #CJK UNIFIED IDEOGRAPH
+ {0xBAEE, 0x7D9C}, //4004 #CJK UNIFIED IDEOGRAPH
+ {0xBAEF, 0x7DBD}, //4005 #CJK UNIFIED IDEOGRAPH
+ {0xBAF0, 0x7DBE}, //4006 #CJK UNIFIED IDEOGRAPH
+ {0xBAF1, 0x7DA0}, //4007 #CJK UNIFIED IDEOGRAPH
+ {0xBAF2, 0x7DCA}, //4008 #CJK UNIFIED IDEOGRAPH
+ {0xBAF3, 0x7DB4}, //4009 #CJK UNIFIED IDEOGRAPH
+ {0xBAF4, 0x7DB2}, //4010 #CJK UNIFIED IDEOGRAPH
+ {0xBAF5, 0x7DB1}, //4011 #CJK UNIFIED IDEOGRAPH
+ {0xBAF6, 0x7DBA}, //4012 #CJK UNIFIED IDEOGRAPH
+ {0xBAF7, 0x7DA2}, //4013 #CJK UNIFIED IDEOGRAPH
+ {0xBAF8, 0x7DBF}, //4014 #CJK UNIFIED IDEOGRAPH
+ {0xBAF9, 0x7DB5}, //4015 #CJK UNIFIED IDEOGRAPH
+ {0xBAFA, 0x7DB8}, //4016 #CJK UNIFIED IDEOGRAPH
+ {0xBAFB, 0x7DAD}, //4017 #CJK UNIFIED IDEOGRAPH
+ {0xBAFC, 0x7DD2}, //4018 #CJK UNIFIED IDEOGRAPH
+ {0xBAFD, 0x7DC7}, //4019 #CJK UNIFIED IDEOGRAPH
+ {0xBAFE, 0x7DAC}, //4020 #CJK UNIFIED IDEOGRAPH
+ {0xBB40, 0x7F70}, //4021 #CJK UNIFIED IDEOGRAPH
+ {0xBB41, 0x7FE0}, //4022 #CJK UNIFIED IDEOGRAPH
+ {0xBB42, 0x7FE1}, //4023 #CJK UNIFIED IDEOGRAPH
+ {0xBB43, 0x7FDF}, //4024 #CJK UNIFIED IDEOGRAPH
+ {0xBB44, 0x805E}, //4025 #CJK UNIFIED IDEOGRAPH
+ {0xBB45, 0x805A}, //4026 #CJK UNIFIED IDEOGRAPH
+ {0xBB46, 0x8087}, //4027 #CJK UNIFIED IDEOGRAPH
+ {0xBB47, 0x8150}, //4028 #CJK UNIFIED IDEOGRAPH
+ {0xBB48, 0x8180}, //4029 #CJK UNIFIED IDEOGRAPH
+ {0xBB49, 0x818F}, //4030 #CJK UNIFIED IDEOGRAPH
+ {0xBB4A, 0x8188}, //4031 #CJK UNIFIED IDEOGRAPH
+ {0xBB4B, 0x818A}, //4032 #CJK UNIFIED IDEOGRAPH
+ {0xBB4C, 0x817F}, //4033 #CJK UNIFIED IDEOGRAPH
+ {0xBB4D, 0x8182}, //4034 #CJK UNIFIED IDEOGRAPH
+ {0xBB4E, 0x81E7}, //4035 #CJK UNIFIED IDEOGRAPH
+ {0xBB4F, 0x81FA}, //4036 #CJK UNIFIED IDEOGRAPH
+ {0xBB50, 0x8207}, //4037 #CJK UNIFIED IDEOGRAPH
+ {0xBB51, 0x8214}, //4038 #CJK UNIFIED IDEOGRAPH
+ {0xBB52, 0x821E}, //4039 #CJK UNIFIED IDEOGRAPH
+ {0xBB53, 0x824B}, //4040 #CJK UNIFIED IDEOGRAPH
+ {0xBB54, 0x84C9}, //4041 #CJK UNIFIED IDEOGRAPH
+ {0xBB55, 0x84BF}, //4042 #CJK UNIFIED IDEOGRAPH
+ {0xBB56, 0x84C6}, //4043 #CJK UNIFIED IDEOGRAPH
+ {0xBB57, 0x84C4}, //4044 #CJK UNIFIED IDEOGRAPH
+ {0xBB58, 0x8499}, //4045 #CJK UNIFIED IDEOGRAPH
+ {0xBB59, 0x849E}, //4046 #CJK UNIFIED IDEOGRAPH
+ {0xBB5A, 0x84B2}, //4047 #CJK UNIFIED IDEOGRAPH
+ {0xBB5B, 0x849C}, //4048 #CJK UNIFIED IDEOGRAPH
+ {0xBB5C, 0x84CB}, //4049 #CJK UNIFIED IDEOGRAPH
+ {0xBB5D, 0x84B8}, //4050 #CJK UNIFIED IDEOGRAPH
+ {0xBB5E, 0x84C0}, //4051 #CJK UNIFIED IDEOGRAPH
+ {0xBB5F, 0x84D3}, //4052 #CJK UNIFIED IDEOGRAPH
+ {0xBB60, 0x8490}, //4053 #CJK UNIFIED IDEOGRAPH
+ {0xBB61, 0x84BC}, //4054 #CJK UNIFIED IDEOGRAPH
+ {0xBB62, 0x84D1}, //4055 #CJK UNIFIED IDEOGRAPH
+ {0xBB63, 0x84CA}, //4056 #CJK UNIFIED IDEOGRAPH
+ {0xBB64, 0x873F}, //4057 #CJK UNIFIED IDEOGRAPH
+ {0xBB65, 0x871C}, //4058 #CJK UNIFIED IDEOGRAPH
+ {0xBB66, 0x873B}, //4059 #CJK UNIFIED IDEOGRAPH
+ {0xBB67, 0x8722}, //4060 #CJK UNIFIED IDEOGRAPH
+ {0xBB68, 0x8725}, //4061 #CJK UNIFIED IDEOGRAPH
+ {0xBB69, 0x8734}, //4062 #CJK UNIFIED IDEOGRAPH
+ {0xBB6A, 0x8718}, //4063 #CJK UNIFIED IDEOGRAPH
+ {0xBB6B, 0x8755}, //4064 #CJK UNIFIED IDEOGRAPH
+ {0xBB6C, 0x8737}, //4065 #CJK UNIFIED IDEOGRAPH
+ {0xBB6D, 0x8729}, //4066 #CJK UNIFIED IDEOGRAPH
+ {0xBB6E, 0x88F3}, //4067 #CJK UNIFIED IDEOGRAPH
+ {0xBB6F, 0x8902}, //4068 #CJK UNIFIED IDEOGRAPH
+ {0xBB70, 0x88F4}, //4069 #CJK UNIFIED IDEOGRAPH
+ {0xBB71, 0x88F9}, //4070 #CJK UNIFIED IDEOGRAPH
+ {0xBB72, 0x88F8}, //4071 #CJK UNIFIED IDEOGRAPH
+ {0xBB73, 0x88FD}, //4072 #CJK UNIFIED IDEOGRAPH
+ {0xBB74, 0x88E8}, //4073 #CJK UNIFIED IDEOGRAPH
+ {0xBB75, 0x891A}, //4074 #CJK UNIFIED IDEOGRAPH
+ {0xBB76, 0x88EF}, //4075 #CJK UNIFIED IDEOGRAPH
+ {0xBB77, 0x8AA6}, //4076 #CJK UNIFIED IDEOGRAPH
+ {0xBB78, 0x8A8C}, //4077 #CJK UNIFIED IDEOGRAPH
+ {0xBB79, 0x8A9E}, //4078 #CJK UNIFIED IDEOGRAPH
+ {0xBB7A, 0x8AA3}, //4079 #CJK UNIFIED IDEOGRAPH
+ {0xBB7B, 0x8A8D}, //4080 #CJK UNIFIED IDEOGRAPH
+ {0xBB7C, 0x8AA1}, //4081 #CJK UNIFIED IDEOGRAPH
+ {0xBB7D, 0x8A93}, //4082 #CJK UNIFIED IDEOGRAPH
+ {0xBB7E, 0x8AA4}, //4083 #CJK UNIFIED IDEOGRAPH
+ {0xBBA1, 0x8AAA}, //4084 #CJK UNIFIED IDEOGRAPH
+ {0xBBA2, 0x8AA5}, //4085 #CJK UNIFIED IDEOGRAPH
+ {0xBBA3, 0x8AA8}, //4086 #CJK UNIFIED IDEOGRAPH
+ {0xBBA4, 0x8A98}, //4087 #CJK UNIFIED IDEOGRAPH
+ {0xBBA5, 0x8A91}, //4088 #CJK UNIFIED IDEOGRAPH
+ {0xBBA6, 0x8A9A}, //4089 #CJK UNIFIED IDEOGRAPH
+ {0xBBA7, 0x8AA7}, //4090 #CJK UNIFIED IDEOGRAPH
+ {0xBBA8, 0x8C6A}, //4091 #CJK UNIFIED IDEOGRAPH
+ {0xBBA9, 0x8C8D}, //4092 #CJK UNIFIED IDEOGRAPH
+ {0xBBAA, 0x8C8C}, //4093 #CJK UNIFIED IDEOGRAPH
+ {0xBBAB, 0x8CD3}, //4094 #CJK UNIFIED IDEOGRAPH
+ {0xBBAC, 0x8CD1}, //4095 #CJK UNIFIED IDEOGRAPH
+ {0xBBAD, 0x8CD2}, //4096 #CJK UNIFIED IDEOGRAPH
+ {0xBBAE, 0x8D6B}, //4097 #CJK UNIFIED IDEOGRAPH
+ {0xBBAF, 0x8D99}, //4098 #CJK UNIFIED IDEOGRAPH
+ {0xBBB0, 0x8D95}, //4099 #CJK UNIFIED IDEOGRAPH
+ {0xBBB1, 0x8DFC}, //4100 #CJK UNIFIED IDEOGRAPH
+ {0xBBB2, 0x8F14}, //4101 #CJK UNIFIED IDEOGRAPH
+ {0xBBB3, 0x8F12}, //4102 #CJK UNIFIED IDEOGRAPH
+ {0xBBB4, 0x8F15}, //4103 #CJK UNIFIED IDEOGRAPH
+ {0xBBB5, 0x8F13}, //4104 #CJK UNIFIED IDEOGRAPH
+ {0xBBB6, 0x8FA3}, //4105 #CJK UNIFIED IDEOGRAPH
+ {0xBBB7, 0x9060}, //4106 #CJK UNIFIED IDEOGRAPH
+ {0xBBB8, 0x9058}, //4107 #CJK UNIFIED IDEOGRAPH
+ {0xBBB9, 0x905C}, //4108 #CJK UNIFIED IDEOGRAPH
+ {0xBBBA, 0x9063}, //4109 #CJK UNIFIED IDEOGRAPH
+ {0xBBBB, 0x9059}, //4110 #CJK UNIFIED IDEOGRAPH
+ {0xBBBC, 0x905E}, //4111 #CJK UNIFIED IDEOGRAPH
+ {0xBBBD, 0x9062}, //4112 #CJK UNIFIED IDEOGRAPH
+ {0xBBBE, 0x905D}, //4113 #CJK UNIFIED IDEOGRAPH
+ {0xBBBF, 0x905B}, //4114 #CJK UNIFIED IDEOGRAPH
+ {0xBBC0, 0x9119}, //4115 #CJK UNIFIED IDEOGRAPH
+ {0xBBC1, 0x9118}, //4116 #CJK UNIFIED IDEOGRAPH
+ {0xBBC2, 0x911E}, //4117 #CJK UNIFIED IDEOGRAPH
+ {0xBBC3, 0x9175}, //4118 #CJK UNIFIED IDEOGRAPH
+ {0xBBC4, 0x9178}, //4119 #CJK UNIFIED IDEOGRAPH
+ {0xBBC5, 0x9177}, //4120 #CJK UNIFIED IDEOGRAPH
+ {0xBBC6, 0x9174}, //4121 #CJK UNIFIED IDEOGRAPH
+ {0xBBC7, 0x9278}, //4122 #CJK UNIFIED IDEOGRAPH
+ {0xBBC8, 0x9280}, //4123 #CJK UNIFIED IDEOGRAPH
+ {0xBBC9, 0x9285}, //4124 #CJK UNIFIED IDEOGRAPH
+ {0xBBCA, 0x9298}, //4125 #CJK UNIFIED IDEOGRAPH
+ {0xBBCB, 0x9296}, //4126 #CJK UNIFIED IDEOGRAPH
+ {0xBBCC, 0x927B}, //4127 #CJK UNIFIED IDEOGRAPH
+ {0xBBCD, 0x9293}, //4128 #CJK UNIFIED IDEOGRAPH
+ {0xBBCE, 0x929C}, //4129 #CJK UNIFIED IDEOGRAPH
+ {0xBBCF, 0x92A8}, //4130 #CJK UNIFIED IDEOGRAPH
+ {0xBBD0, 0x927C}, //4131 #CJK UNIFIED IDEOGRAPH
+ {0xBBD1, 0x9291}, //4132 #CJK UNIFIED IDEOGRAPH
+ {0xBBD2, 0x95A1}, //4133 #CJK UNIFIED IDEOGRAPH
+ {0xBBD3, 0x95A8}, //4134 #CJK UNIFIED IDEOGRAPH
+ {0xBBD4, 0x95A9}, //4135 #CJK UNIFIED IDEOGRAPH
+ {0xBBD5, 0x95A3}, //4136 #CJK UNIFIED IDEOGRAPH
+ {0xBBD6, 0x95A5}, //4137 #CJK UNIFIED IDEOGRAPH
+ {0xBBD7, 0x95A4}, //4138 #CJK UNIFIED IDEOGRAPH
+ {0xBBD8, 0x9699}, //4139 #CJK UNIFIED IDEOGRAPH
+ {0xBBD9, 0x969C}, //4140 #CJK UNIFIED IDEOGRAPH
+ {0xBBDA, 0x969B}, //4141 #CJK UNIFIED IDEOGRAPH
+ {0xBBDB, 0x96CC}, //4142 #CJK UNIFIED IDEOGRAPH
+ {0xBBDC, 0x96D2}, //4143 #CJK UNIFIED IDEOGRAPH
+ {0xBBDD, 0x9700}, //4144 #CJK UNIFIED IDEOGRAPH
+ {0xBBDE, 0x977C}, //4145 #CJK UNIFIED IDEOGRAPH
+ {0xBBDF, 0x9785}, //4146 #CJK UNIFIED IDEOGRAPH
+ {0xBBE0, 0x97F6}, //4147 #CJK UNIFIED IDEOGRAPH
+ {0xBBE1, 0x9817}, //4148 #CJK UNIFIED IDEOGRAPH
+ {0xBBE2, 0x9818}, //4149 #CJK UNIFIED IDEOGRAPH
+ {0xBBE3, 0x98AF}, //4150 #CJK UNIFIED IDEOGRAPH
+ {0xBBE4, 0x98B1}, //4151 #CJK UNIFIED IDEOGRAPH
+ {0xBBE5, 0x9903}, //4152 #CJK UNIFIED IDEOGRAPH
+ {0xBBE6, 0x9905}, //4153 #CJK UNIFIED IDEOGRAPH
+ {0xBBE7, 0x990C}, //4154 #CJK UNIFIED IDEOGRAPH
+ {0xBBE8, 0x9909}, //4155 #CJK UNIFIED IDEOGRAPH
+ {0xBBE9, 0x99C1}, //4156 #CJK UNIFIED IDEOGRAPH
+ {0xBBEA, 0x9AAF}, //4157 #CJK UNIFIED IDEOGRAPH
+ {0xBBEB, 0x9AB0}, //4158 #CJK UNIFIED IDEOGRAPH
+ {0xBBEC, 0x9AE6}, //4159 #CJK UNIFIED IDEOGRAPH
+ {0xBBED, 0x9B41}, //4160 #CJK UNIFIED IDEOGRAPH
+ {0xBBEE, 0x9B42}, //4161 #CJK UNIFIED IDEOGRAPH
+ {0xBBEF, 0x9CF4}, //4162 #CJK UNIFIED IDEOGRAPH
+ {0xBBF0, 0x9CF6}, //4163 #CJK UNIFIED IDEOGRAPH
+ {0xBBF1, 0x9CF3}, //4164 #CJK UNIFIED IDEOGRAPH
+ {0xBBF2, 0x9EBC}, //4165 #CJK UNIFIED IDEOGRAPH
+ {0xBBF3, 0x9F3B}, //4166 #CJK UNIFIED IDEOGRAPH
+ {0xBBF4, 0x9F4A}, //4167 #CJK UNIFIED IDEOGRAPH
+ {0xBBF5, 0x5104}, //4168 #CJK UNIFIED IDEOGRAPH
+ {0xBBF6, 0x5100}, //4169 #CJK UNIFIED IDEOGRAPH
+ {0xBBF7, 0x50FB}, //4170 #CJK UNIFIED IDEOGRAPH
+ {0xBBF8, 0x50F5}, //4171 #CJK UNIFIED IDEOGRAPH
+ {0xBBF9, 0x50F9}, //4172 #CJK UNIFIED IDEOGRAPH
+ {0xBBFA, 0x5102}, //4173 #CJK UNIFIED IDEOGRAPH
+ {0xBBFB, 0x5108}, //4174 #CJK UNIFIED IDEOGRAPH
+ {0xBBFC, 0x5109}, //4175 #CJK UNIFIED IDEOGRAPH
+ {0xBBFD, 0x5105}, //4176 #CJK UNIFIED IDEOGRAPH
+ {0xBBFE, 0x51DC}, //4177 #CJK UNIFIED IDEOGRAPH
+ {0xBC40, 0x5287}, //4178 #CJK UNIFIED IDEOGRAPH
+ {0xBC41, 0x5288}, //4179 #CJK UNIFIED IDEOGRAPH
+ {0xBC42, 0x5289}, //4180 #CJK UNIFIED IDEOGRAPH
+ {0xBC43, 0x528D}, //4181 #CJK UNIFIED IDEOGRAPH
+ {0xBC44, 0x528A}, //4182 #CJK UNIFIED IDEOGRAPH
+ {0xBC45, 0x52F0}, //4183 #CJK UNIFIED IDEOGRAPH
+ {0xBC46, 0x53B2}, //4184 #CJK UNIFIED IDEOGRAPH
+ {0xBC47, 0x562E}, //4185 #CJK UNIFIED IDEOGRAPH
+ {0xBC48, 0x563B}, //4186 #CJK UNIFIED IDEOGRAPH
+ {0xBC49, 0x5639}, //4187 #CJK UNIFIED IDEOGRAPH
+ {0xBC4A, 0x5632}, //4188 #CJK UNIFIED IDEOGRAPH
+ {0xBC4B, 0x563F}, //4189 #CJK UNIFIED IDEOGRAPH
+ {0xBC4C, 0x5634}, //4190 #CJK UNIFIED IDEOGRAPH
+ {0xBC4D, 0x5629}, //4191 #CJK UNIFIED IDEOGRAPH
+ {0xBC4E, 0x5653}, //4192 #CJK UNIFIED IDEOGRAPH
+ {0xBC4F, 0x564E}, //4193 #CJK UNIFIED IDEOGRAPH
+ {0xBC50, 0x5657}, //4194 #CJK UNIFIED IDEOGRAPH
+ {0xBC51, 0x5674}, //4195 #CJK UNIFIED IDEOGRAPH
+ {0xBC52, 0x5636}, //4196 #CJK UNIFIED IDEOGRAPH
+ {0xBC53, 0x562F}, //4197 #CJK UNIFIED IDEOGRAPH
+ {0xBC54, 0x5630}, //4198 #CJK UNIFIED IDEOGRAPH
+ {0xBC55, 0x5880}, //4199 #CJK UNIFIED IDEOGRAPH
+ {0xBC56, 0x589F}, //4200 #CJK UNIFIED IDEOGRAPH
+ {0xBC57, 0x589E}, //4201 #CJK UNIFIED IDEOGRAPH
+ {0xBC58, 0x58B3}, //4202 #CJK UNIFIED IDEOGRAPH
+ {0xBC59, 0x589C}, //4203 #CJK UNIFIED IDEOGRAPH
+ {0xBC5A, 0x58AE}, //4204 #CJK UNIFIED IDEOGRAPH
+ {0xBC5B, 0x58A9}, //4205 #CJK UNIFIED IDEOGRAPH
+ {0xBC5C, 0x58A6}, //4206 #CJK UNIFIED IDEOGRAPH
+ {0xBC5D, 0x596D}, //4207 #CJK UNIFIED IDEOGRAPH
+ {0xBC5E, 0x5B09}, //4208 #CJK UNIFIED IDEOGRAPH
+ {0xBC5F, 0x5AFB}, //4209 #CJK UNIFIED IDEOGRAPH
+ {0xBC60, 0x5B0B}, //4210 #CJK UNIFIED IDEOGRAPH
+ {0xBC61, 0x5AF5}, //4211 #CJK UNIFIED IDEOGRAPH
+ {0xBC62, 0x5B0C}, //4212 #CJK UNIFIED IDEOGRAPH
+ {0xBC63, 0x5B08}, //4213 #CJK UNIFIED IDEOGRAPH
+ {0xBC64, 0x5BEE}, //4214 #CJK UNIFIED IDEOGRAPH
+ {0xBC65, 0x5BEC}, //4215 #CJK UNIFIED IDEOGRAPH
+ {0xBC66, 0x5BE9}, //4216 #CJK UNIFIED IDEOGRAPH
+ {0xBC67, 0x5BEB}, //4217 #CJK UNIFIED IDEOGRAPH
+ {0xBC68, 0x5C64}, //4218 #CJK UNIFIED IDEOGRAPH
+ {0xBC69, 0x5C65}, //4219 #CJK UNIFIED IDEOGRAPH
+ {0xBC6A, 0x5D9D}, //4220 #CJK UNIFIED IDEOGRAPH
+ {0xBC6B, 0x5D94}, //4221 #CJK UNIFIED IDEOGRAPH
+ {0xBC6C, 0x5E62}, //4222 #CJK UNIFIED IDEOGRAPH
+ {0xBC6D, 0x5E5F}, //4223 #CJK UNIFIED IDEOGRAPH
+ {0xBC6E, 0x5E61}, //4224 #CJK UNIFIED IDEOGRAPH
+ {0xBC6F, 0x5EE2}, //4225 #CJK UNIFIED IDEOGRAPH
+ {0xBC70, 0x5EDA}, //4226 #CJK UNIFIED IDEOGRAPH
+ {0xBC71, 0x5EDF}, //4227 #CJK UNIFIED IDEOGRAPH
+ {0xBC72, 0x5EDD}, //4228 #CJK UNIFIED IDEOGRAPH
+ {0xBC73, 0x5EE3}, //4229 #CJK UNIFIED IDEOGRAPH
+ {0xBC74, 0x5EE0}, //4230 #CJK UNIFIED IDEOGRAPH
+ {0xBC75, 0x5F48}, //4231 #CJK UNIFIED IDEOGRAPH
+ {0xBC76, 0x5F71}, //4232 #CJK UNIFIED IDEOGRAPH
+ {0xBC77, 0x5FB7}, //4233 #CJK UNIFIED IDEOGRAPH
+ {0xBC78, 0x5FB5}, //4234 #CJK UNIFIED IDEOGRAPH
+ {0xBC79, 0x6176}, //4235 #CJK UNIFIED IDEOGRAPH
+ {0xBC7A, 0x6167}, //4236 #CJK UNIFIED IDEOGRAPH
+ {0xBC7B, 0x616E}, //4237 #CJK UNIFIED IDEOGRAPH
+ {0xBC7C, 0x615D}, //4238 #CJK UNIFIED IDEOGRAPH
+ {0xBC7D, 0x6155}, //4239 #CJK UNIFIED IDEOGRAPH
+ {0xBC7E, 0x6182}, //4240 #CJK UNIFIED IDEOGRAPH
+ {0xBCA1, 0x617C}, //4241 #CJK UNIFIED IDEOGRAPH
+ {0xBCA2, 0x6170}, //4242 #CJK UNIFIED IDEOGRAPH
+ {0xBCA3, 0x616B}, //4243 #CJK UNIFIED IDEOGRAPH
+ {0xBCA4, 0x617E}, //4244 #CJK UNIFIED IDEOGRAPH
+ {0xBCA5, 0x61A7}, //4245 #CJK UNIFIED IDEOGRAPH
+ {0xBCA6, 0x6190}, //4246 #CJK UNIFIED IDEOGRAPH
+ {0xBCA7, 0x61AB}, //4247 #CJK UNIFIED IDEOGRAPH
+ {0xBCA8, 0x618E}, //4248 #CJK UNIFIED IDEOGRAPH
+ {0xBCA9, 0x61AC}, //4249 #CJK UNIFIED IDEOGRAPH
+ {0xBCAA, 0x619A}, //4250 #CJK UNIFIED IDEOGRAPH
+ {0xBCAB, 0x61A4}, //4251 #CJK UNIFIED IDEOGRAPH
+ {0xBCAC, 0x6194}, //4252 #CJK UNIFIED IDEOGRAPH
+ {0xBCAD, 0x61AE}, //4253 #CJK UNIFIED IDEOGRAPH
+ {0xBCAE, 0x622E}, //4254 #CJK UNIFIED IDEOGRAPH
+ {0xBCAF, 0x6469}, //4255 #CJK UNIFIED IDEOGRAPH
+ {0xBCB0, 0x646F}, //4256 #CJK UNIFIED IDEOGRAPH
+ {0xBCB1, 0x6479}, //4257 #CJK UNIFIED IDEOGRAPH
+ {0xBCB2, 0x649E}, //4258 #CJK UNIFIED IDEOGRAPH
+ {0xBCB3, 0x64B2}, //4259 #CJK UNIFIED IDEOGRAPH
+ {0xBCB4, 0x6488}, //4260 #CJK UNIFIED IDEOGRAPH
+ {0xBCB5, 0x6490}, //4261 #CJK UNIFIED IDEOGRAPH
+ {0xBCB6, 0x64B0}, //4262 #CJK UNIFIED IDEOGRAPH
+ {0xBCB7, 0x64A5}, //4263 #CJK UNIFIED IDEOGRAPH
+ {0xBCB8, 0x6493}, //4264 #CJK UNIFIED IDEOGRAPH
+ {0xBCB9, 0x6495}, //4265 #CJK UNIFIED IDEOGRAPH
+ {0xBCBA, 0x64A9}, //4266 #CJK UNIFIED IDEOGRAPH
+ {0xBCBB, 0x6492}, //4267 #CJK UNIFIED IDEOGRAPH
+ {0xBCBC, 0x64AE}, //4268 #CJK UNIFIED IDEOGRAPH
+ {0xBCBD, 0x64AD}, //4269 #CJK UNIFIED IDEOGRAPH
+ {0xBCBE, 0x64AB}, //4270 #CJK UNIFIED IDEOGRAPH
+ {0xBCBF, 0x649A}, //4271 #CJK UNIFIED IDEOGRAPH
+ {0xBCC0, 0x64AC}, //4272 #CJK UNIFIED IDEOGRAPH
+ {0xBCC1, 0x6499}, //4273 #CJK UNIFIED IDEOGRAPH
+ {0xBCC2, 0x64A2}, //4274 #CJK UNIFIED IDEOGRAPH
+ {0xBCC3, 0x64B3}, //4275 #CJK UNIFIED IDEOGRAPH
+ {0xBCC4, 0x6575}, //4276 #CJK UNIFIED IDEOGRAPH
+ {0xBCC5, 0x6577}, //4277 #CJK UNIFIED IDEOGRAPH
+ {0xBCC6, 0x6578}, //4278 #CJK UNIFIED IDEOGRAPH
+ {0xBCC7, 0x66AE}, //4279 #CJK UNIFIED IDEOGRAPH
+ {0xBCC8, 0x66AB}, //4280 #CJK UNIFIED IDEOGRAPH
+ {0xBCC9, 0x66B4}, //4281 #CJK UNIFIED IDEOGRAPH
+ {0xBCCA, 0x66B1}, //4282 #CJK UNIFIED IDEOGRAPH
+ {0xBCCB, 0x6A23}, //4283 #CJK UNIFIED IDEOGRAPH
+ {0xBCCC, 0x6A1F}, //4284 #CJK UNIFIED IDEOGRAPH
+ {0xBCCD, 0x69E8}, //4285 #CJK UNIFIED IDEOGRAPH
+ {0xBCCE, 0x6A01}, //4286 #CJK UNIFIED IDEOGRAPH
+ {0xBCCF, 0x6A1E}, //4287 #CJK UNIFIED IDEOGRAPH
+ {0xBCD0, 0x6A19}, //4288 #CJK UNIFIED IDEOGRAPH
+ {0xBCD1, 0x69FD}, //4289 #CJK UNIFIED IDEOGRAPH
+ {0xBCD2, 0x6A21}, //4290 #CJK UNIFIED IDEOGRAPH
+ {0xBCD3, 0x6A13}, //4291 #CJK UNIFIED IDEOGRAPH
+ {0xBCD4, 0x6A0A}, //4292 #CJK UNIFIED IDEOGRAPH
+ {0xBCD5, 0x69F3}, //4293 #CJK UNIFIED IDEOGRAPH
+ {0xBCD6, 0x6A02}, //4294 #CJK UNIFIED IDEOGRAPH
+ {0xBCD7, 0x6A05}, //4295 #CJK UNIFIED IDEOGRAPH
+ {0xBCD8, 0x69ED}, //4296 #CJK UNIFIED IDEOGRAPH
+ {0xBCD9, 0x6A11}, //4297 #CJK UNIFIED IDEOGRAPH
+ {0xBCDA, 0x6B50}, //4298 #CJK UNIFIED IDEOGRAPH
+ {0xBCDB, 0x6B4E}, //4299 #CJK UNIFIED IDEOGRAPH
+ {0xBCDC, 0x6BA4}, //4300 #CJK UNIFIED IDEOGRAPH
+ {0xBCDD, 0x6BC5}, //4301 #CJK UNIFIED IDEOGRAPH
+ {0xBCDE, 0x6BC6}, //4302 #CJK UNIFIED IDEOGRAPH
+ {0xBCDF, 0x6F3F}, //4303 #CJK UNIFIED IDEOGRAPH
+ {0xBCE0, 0x6F7C}, //4304 #CJK UNIFIED IDEOGRAPH
+ {0xBCE1, 0x6F84}, //4305 #CJK UNIFIED IDEOGRAPH
+ {0xBCE2, 0x6F51}, //4306 #CJK UNIFIED IDEOGRAPH
+ {0xBCE3, 0x6F66}, //4307 #CJK UNIFIED IDEOGRAPH
+ {0xBCE4, 0x6F54}, //4308 #CJK UNIFIED IDEOGRAPH
+ {0xBCE5, 0x6F86}, //4309 #CJK UNIFIED IDEOGRAPH
+ {0xBCE6, 0x6F6D}, //4310 #CJK UNIFIED IDEOGRAPH
+ {0xBCE7, 0x6F5B}, //4311 #CJK UNIFIED IDEOGRAPH
+ {0xBCE8, 0x6F78}, //4312 #CJK UNIFIED IDEOGRAPH
+ {0xBCE9, 0x6F6E}, //4313 #CJK UNIFIED IDEOGRAPH
+ {0xBCEA, 0x6F8E}, //4314 #CJK UNIFIED IDEOGRAPH
+ {0xBCEB, 0x6F7A}, //4315 #CJK UNIFIED IDEOGRAPH
+ {0xBCEC, 0x6F70}, //4316 #CJK UNIFIED IDEOGRAPH
+ {0xBCED, 0x6F64}, //4317 #CJK UNIFIED IDEOGRAPH
+ {0xBCEE, 0x6F97}, //4318 #CJK UNIFIED IDEOGRAPH
+ {0xBCEF, 0x6F58}, //4319 #CJK UNIFIED IDEOGRAPH
+ {0xBCF0, 0x6ED5}, //4320 #CJK UNIFIED IDEOGRAPH
+ {0xBCF1, 0x6F6F}, //4321 #CJK UNIFIED IDEOGRAPH
+ {0xBCF2, 0x6F60}, //4322 #CJK UNIFIED IDEOGRAPH
+ {0xBCF3, 0x6F5F}, //4323 #CJK UNIFIED IDEOGRAPH
+ {0xBCF4, 0x719F}, //4324 #CJK UNIFIED IDEOGRAPH
+ {0xBCF5, 0x71AC}, //4325 #CJK UNIFIED IDEOGRAPH
+ {0xBCF6, 0x71B1}, //4326 #CJK UNIFIED IDEOGRAPH
+ {0xBCF7, 0x71A8}, //4327 #CJK UNIFIED IDEOGRAPH
+ {0xBCF8, 0x7256}, //4328 #CJK UNIFIED IDEOGRAPH
+ {0xBCF9, 0x729B}, //4329 #CJK UNIFIED IDEOGRAPH
+ {0xBCFA, 0x734E}, //4330 #CJK UNIFIED IDEOGRAPH
+ {0xBCFB, 0x7357}, //4331 #CJK UNIFIED IDEOGRAPH
+ {0xBCFC, 0x7469}, //4332 #CJK UNIFIED IDEOGRAPH
+ {0xBCFD, 0x748B}, //4333 #CJK UNIFIED IDEOGRAPH
+ {0xBCFE, 0x7483}, //4334 #CJK UNIFIED IDEOGRAPH
+ {0xBD40, 0x747E}, //4335 #CJK UNIFIED IDEOGRAPH
+ {0xBD41, 0x7480}, //4336 #CJK UNIFIED IDEOGRAPH
+ {0xBD42, 0x757F}, //4337 #CJK UNIFIED IDEOGRAPH
+ {0xBD43, 0x7620}, //4338 #CJK UNIFIED IDEOGRAPH
+ {0xBD44, 0x7629}, //4339 #CJK UNIFIED IDEOGRAPH
+ {0xBD45, 0x761F}, //4340 #CJK UNIFIED IDEOGRAPH
+ {0xBD46, 0x7624}, //4341 #CJK UNIFIED IDEOGRAPH
+ {0xBD47, 0x7626}, //4342 #CJK UNIFIED IDEOGRAPH
+ {0xBD48, 0x7621}, //4343 #CJK UNIFIED IDEOGRAPH
+ {0xBD49, 0x7622}, //4344 #CJK UNIFIED IDEOGRAPH
+ {0xBD4A, 0x769A}, //4345 #CJK UNIFIED IDEOGRAPH
+ {0xBD4B, 0x76BA}, //4346 #CJK UNIFIED IDEOGRAPH
+ {0xBD4C, 0x76E4}, //4347 #CJK UNIFIED IDEOGRAPH
+ {0xBD4D, 0x778E}, //4348 #CJK UNIFIED IDEOGRAPH
+ {0xBD4E, 0x7787}, //4349 #CJK UNIFIED IDEOGRAPH
+ {0xBD4F, 0x778C}, //4350 #CJK UNIFIED IDEOGRAPH
+ {0xBD50, 0x7791}, //4351 #CJK UNIFIED IDEOGRAPH
+ {0xBD51, 0x778B}, //4352 #CJK UNIFIED IDEOGRAPH
+ {0xBD52, 0x78CB}, //4353 #CJK UNIFIED IDEOGRAPH
+ {0xBD53, 0x78C5}, //4354 #CJK UNIFIED IDEOGRAPH
+ {0xBD54, 0x78BA}, //4355 #CJK UNIFIED IDEOGRAPH
+ {0xBD55, 0x78CA}, //4356 #CJK UNIFIED IDEOGRAPH
+ {0xBD56, 0x78BE}, //4357 #CJK UNIFIED IDEOGRAPH
+ {0xBD57, 0x78D5}, //4358 #CJK UNIFIED IDEOGRAPH
+ {0xBD58, 0x78BC}, //4359 #CJK UNIFIED IDEOGRAPH
+ {0xBD59, 0x78D0}, //4360 #CJK UNIFIED IDEOGRAPH
+ {0xBD5A, 0x7A3F}, //4361 #CJK UNIFIED IDEOGRAPH
+ {0xBD5B, 0x7A3C}, //4362 #CJK UNIFIED IDEOGRAPH
+ {0xBD5C, 0x7A40}, //4363 #CJK UNIFIED IDEOGRAPH
+ {0xBD5D, 0x7A3D}, //4364 #CJK UNIFIED IDEOGRAPH
+ {0xBD5E, 0x7A37}, //4365 #CJK UNIFIED IDEOGRAPH
+ {0xBD5F, 0x7A3B}, //4366 #CJK UNIFIED IDEOGRAPH
+ {0xBD60, 0x7AAF}, //4367 #CJK UNIFIED IDEOGRAPH
+ {0xBD61, 0x7AAE}, //4368 #CJK UNIFIED IDEOGRAPH
+ {0xBD62, 0x7BAD}, //4369 #CJK UNIFIED IDEOGRAPH
+ {0xBD63, 0x7BB1}, //4370 #CJK UNIFIED IDEOGRAPH
+ {0xBD64, 0x7BC4}, //4371 #CJK UNIFIED IDEOGRAPH
+ {0xBD65, 0x7BB4}, //4372 #CJK UNIFIED IDEOGRAPH
+ {0xBD66, 0x7BC6}, //4373 #CJK UNIFIED IDEOGRAPH
+ {0xBD67, 0x7BC7}, //4374 #CJK UNIFIED IDEOGRAPH
+ {0xBD68, 0x7BC1}, //4375 #CJK UNIFIED IDEOGRAPH
+ {0xBD69, 0x7BA0}, //4376 #CJK UNIFIED IDEOGRAPH
+ {0xBD6A, 0x7BCC}, //4377 #CJK UNIFIED IDEOGRAPH
+ {0xBD6B, 0x7CCA}, //4378 #CJK UNIFIED IDEOGRAPH
+ {0xBD6C, 0x7DE0}, //4379 #CJK UNIFIED IDEOGRAPH
+ {0xBD6D, 0x7DF4}, //4380 #CJK UNIFIED IDEOGRAPH
+ {0xBD6E, 0x7DEF}, //4381 #CJK UNIFIED IDEOGRAPH
+ {0xBD6F, 0x7DFB}, //4382 #CJK UNIFIED IDEOGRAPH
+ {0xBD70, 0x7DD8}, //4383 #CJK UNIFIED IDEOGRAPH
+ {0xBD71, 0x7DEC}, //4384 #CJK UNIFIED IDEOGRAPH
+ {0xBD72, 0x7DDD}, //4385 #CJK UNIFIED IDEOGRAPH
+ {0xBD73, 0x7DE8}, //4386 #CJK UNIFIED IDEOGRAPH
+ {0xBD74, 0x7DE3}, //4387 #CJK UNIFIED IDEOGRAPH
+ {0xBD75, 0x7DDA}, //4388 #CJK UNIFIED IDEOGRAPH
+ {0xBD76, 0x7DDE}, //4389 #CJK UNIFIED IDEOGRAPH
+ {0xBD77, 0x7DE9}, //4390 #CJK UNIFIED IDEOGRAPH
+ {0xBD78, 0x7D9E}, //4391 #CJK UNIFIED IDEOGRAPH
+ {0xBD79, 0x7DD9}, //4392 #CJK UNIFIED IDEOGRAPH
+ {0xBD7A, 0x7DF2}, //4393 #CJK UNIFIED IDEOGRAPH
+ {0xBD7B, 0x7DF9}, //4394 #CJK UNIFIED IDEOGRAPH
+ {0xBD7C, 0x7F75}, //4395 #CJK UNIFIED IDEOGRAPH
+ {0xBD7D, 0x7F77}, //4396 #CJK UNIFIED IDEOGRAPH
+ {0xBD7E, 0x7FAF}, //4397 #CJK UNIFIED IDEOGRAPH
+ {0xBDA1, 0x7FE9}, //4398 #CJK UNIFIED IDEOGRAPH
+ {0xBDA2, 0x8026}, //4399 #CJK UNIFIED IDEOGRAPH
+ {0xBDA3, 0x819B}, //4400 #CJK UNIFIED IDEOGRAPH
+ {0xBDA4, 0x819C}, //4401 #CJK UNIFIED IDEOGRAPH
+ {0xBDA5, 0x819D}, //4402 #CJK UNIFIED IDEOGRAPH
+ {0xBDA6, 0x81A0}, //4403 #CJK UNIFIED IDEOGRAPH
+ {0xBDA7, 0x819A}, //4404 #CJK UNIFIED IDEOGRAPH
+ {0xBDA8, 0x8198}, //4405 #CJK UNIFIED IDEOGRAPH
+ {0xBDA9, 0x8517}, //4406 #CJK UNIFIED IDEOGRAPH
+ {0xBDAA, 0x853D}, //4407 #CJK UNIFIED IDEOGRAPH
+ {0xBDAB, 0x851A}, //4408 #CJK UNIFIED IDEOGRAPH
+ {0xBDAC, 0x84EE}, //4409 #CJK UNIFIED IDEOGRAPH
+ {0xBDAD, 0x852C}, //4410 #CJK UNIFIED IDEOGRAPH
+ {0xBDAE, 0x852D}, //4411 #CJK UNIFIED IDEOGRAPH
+ {0xBDAF, 0x8513}, //4412 #CJK UNIFIED IDEOGRAPH
+ {0xBDB0, 0x8511}, //4413 #CJK UNIFIED IDEOGRAPH
+ {0xBDB1, 0x8523}, //4414 #CJK UNIFIED IDEOGRAPH
+ {0xBDB2, 0x8521}, //4415 #CJK UNIFIED IDEOGRAPH
+ {0xBDB3, 0x8514}, //4416 #CJK UNIFIED IDEOGRAPH
+ {0xBDB4, 0x84EC}, //4417 #CJK UNIFIED IDEOGRAPH
+ {0xBDB5, 0x8525}, //4418 #CJK UNIFIED IDEOGRAPH
+ {0xBDB6, 0x84FF}, //4419 #CJK UNIFIED IDEOGRAPH
+ {0xBDB7, 0x8506}, //4420 #CJK UNIFIED IDEOGRAPH
+ {0xBDB8, 0x8782}, //4421 #CJK UNIFIED IDEOGRAPH
+ {0xBDB9, 0x8774}, //4422 #CJK UNIFIED IDEOGRAPH
+ {0xBDBA, 0x8776}, //4423 #CJK UNIFIED IDEOGRAPH
+ {0xBDBB, 0x8760}, //4424 #CJK UNIFIED IDEOGRAPH
+ {0xBDBC, 0x8766}, //4425 #CJK UNIFIED IDEOGRAPH
+ {0xBDBD, 0x8778}, //4426 #CJK UNIFIED IDEOGRAPH
+ {0xBDBE, 0x8768}, //4427 #CJK UNIFIED IDEOGRAPH
+ {0xBDBF, 0x8759}, //4428 #CJK UNIFIED IDEOGRAPH
+ {0xBDC0, 0x8757}, //4429 #CJK UNIFIED IDEOGRAPH
+ {0xBDC1, 0x874C}, //4430 #CJK UNIFIED IDEOGRAPH
+ {0xBDC2, 0x8753}, //4431 #CJK UNIFIED IDEOGRAPH
+ {0xBDC3, 0x885B}, //4432 #CJK UNIFIED IDEOGRAPH
+ {0xBDC4, 0x885D}, //4433 #CJK UNIFIED IDEOGRAPH
+ {0xBDC5, 0x8910}, //4434 #CJK UNIFIED IDEOGRAPH
+ {0xBDC6, 0x8907}, //4435 #CJK UNIFIED IDEOGRAPH
+ {0xBDC7, 0x8912}, //4436 #CJK UNIFIED IDEOGRAPH
+ {0xBDC8, 0x8913}, //4437 #CJK UNIFIED IDEOGRAPH
+ {0xBDC9, 0x8915}, //4438 #CJK UNIFIED IDEOGRAPH
+ {0xBDCA, 0x890A}, //4439 #CJK UNIFIED IDEOGRAPH
+ {0xBDCB, 0x8ABC}, //4440 #CJK UNIFIED IDEOGRAPH
+ {0xBDCC, 0x8AD2}, //4441 #CJK UNIFIED IDEOGRAPH
+ {0xBDCD, 0x8AC7}, //4442 #CJK UNIFIED IDEOGRAPH
+ {0xBDCE, 0x8AC4}, //4443 #CJK UNIFIED IDEOGRAPH
+ {0xBDCF, 0x8A95}, //4444 #CJK UNIFIED IDEOGRAPH
+ {0xBDD0, 0x8ACB}, //4445 #CJK UNIFIED IDEOGRAPH
+ {0xBDD1, 0x8AF8}, //4446 #CJK UNIFIED IDEOGRAPH
+ {0xBDD2, 0x8AB2}, //4447 #CJK UNIFIED IDEOGRAPH
+ {0xBDD3, 0x8AC9}, //4448 #CJK UNIFIED IDEOGRAPH
+ {0xBDD4, 0x8AC2}, //4449 #CJK UNIFIED IDEOGRAPH
+ {0xBDD5, 0x8ABF}, //4450 #CJK UNIFIED IDEOGRAPH
+ {0xBDD6, 0x8AB0}, //4451 #CJK UNIFIED IDEOGRAPH
+ {0xBDD7, 0x8AD6}, //4452 #CJK UNIFIED IDEOGRAPH
+ {0xBDD8, 0x8ACD}, //4453 #CJK UNIFIED IDEOGRAPH
+ {0xBDD9, 0x8AB6}, //4454 #CJK UNIFIED IDEOGRAPH
+ {0xBDDA, 0x8AB9}, //4455 #CJK UNIFIED IDEOGRAPH
+ {0xBDDB, 0x8ADB}, //4456 #CJK UNIFIED IDEOGRAPH
+ {0xBDDC, 0x8C4C}, //4457 #CJK UNIFIED IDEOGRAPH
+ {0xBDDD, 0x8C4E}, //4458 #CJK UNIFIED IDEOGRAPH
+ {0xBDDE, 0x8C6C}, //4459 #CJK UNIFIED IDEOGRAPH
+ {0xBDDF, 0x8CE0}, //4460 #CJK UNIFIED IDEOGRAPH
+ {0xBDE0, 0x8CDE}, //4461 #CJK UNIFIED IDEOGRAPH
+ {0xBDE1, 0x8CE6}, //4462 #CJK UNIFIED IDEOGRAPH
+ {0xBDE2, 0x8CE4}, //4463 #CJK UNIFIED IDEOGRAPH
+ {0xBDE3, 0x8CEC}, //4464 #CJK UNIFIED IDEOGRAPH
+ {0xBDE4, 0x8CED}, //4465 #CJK UNIFIED IDEOGRAPH
+ {0xBDE5, 0x8CE2}, //4466 #CJK UNIFIED IDEOGRAPH
+ {0xBDE6, 0x8CE3}, //4467 #CJK UNIFIED IDEOGRAPH
+ {0xBDE7, 0x8CDC}, //4468 #CJK UNIFIED IDEOGRAPH
+ {0xBDE8, 0x8CEA}, //4469 #CJK UNIFIED IDEOGRAPH
+ {0xBDE9, 0x8CE1}, //4470 #CJK UNIFIED IDEOGRAPH
+ {0xBDEA, 0x8D6D}, //4471 #CJK UNIFIED IDEOGRAPH
+ {0xBDEB, 0x8D9F}, //4472 #CJK UNIFIED IDEOGRAPH
+ {0xBDEC, 0x8DA3}, //4473 #CJK UNIFIED IDEOGRAPH
+ {0xBDED, 0x8E2B}, //4474 #CJK UNIFIED IDEOGRAPH
+ {0xBDEE, 0x8E10}, //4475 #CJK UNIFIED IDEOGRAPH
+ {0xBDEF, 0x8E1D}, //4476 #CJK UNIFIED IDEOGRAPH
+ {0xBDF0, 0x8E22}, //4477 #CJK UNIFIED IDEOGRAPH
+ {0xBDF1, 0x8E0F}, //4478 #CJK UNIFIED IDEOGRAPH
+ {0xBDF2, 0x8E29}, //4479 #CJK UNIFIED IDEOGRAPH
+ {0xBDF3, 0x8E1F}, //4480 #CJK UNIFIED IDEOGRAPH
+ {0xBDF4, 0x8E21}, //4481 #CJK UNIFIED IDEOGRAPH
+ {0xBDF5, 0x8E1E}, //4482 #CJK UNIFIED IDEOGRAPH
+ {0xBDF6, 0x8EBA}, //4483 #CJK UNIFIED IDEOGRAPH
+ {0xBDF7, 0x8F1D}, //4484 #CJK UNIFIED IDEOGRAPH
+ {0xBDF8, 0x8F1B}, //4485 #CJK UNIFIED IDEOGRAPH
+ {0xBDF9, 0x8F1F}, //4486 #CJK UNIFIED IDEOGRAPH
+ {0xBDFA, 0x8F29}, //4487 #CJK UNIFIED IDEOGRAPH
+ {0xBDFB, 0x8F26}, //4488 #CJK UNIFIED IDEOGRAPH
+ {0xBDFC, 0x8F2A}, //4489 #CJK UNIFIED IDEOGRAPH
+ {0xBDFD, 0x8F1C}, //4490 #CJK UNIFIED IDEOGRAPH
+ {0xBDFE, 0x8F1E}, //4491 #CJK UNIFIED IDEOGRAPH
+ {0xBE40, 0x8F25}, //4492 #CJK UNIFIED IDEOGRAPH
+ {0xBE41, 0x9069}, //4493 #CJK UNIFIED IDEOGRAPH
+ {0xBE42, 0x906E}, //4494 #CJK UNIFIED IDEOGRAPH
+ {0xBE43, 0x9068}, //4495 #CJK UNIFIED IDEOGRAPH
+ {0xBE44, 0x906D}, //4496 #CJK UNIFIED IDEOGRAPH
+ {0xBE45, 0x9077}, //4497 #CJK UNIFIED IDEOGRAPH
+ {0xBE46, 0x9130}, //4498 #CJK UNIFIED IDEOGRAPH
+ {0xBE47, 0x912D}, //4499 #CJK UNIFIED IDEOGRAPH
+ {0xBE48, 0x9127}, //4500 #CJK UNIFIED IDEOGRAPH
+ {0xBE49, 0x9131}, //4501 #CJK UNIFIED IDEOGRAPH
+ {0xBE4A, 0x9187}, //4502 #CJK UNIFIED IDEOGRAPH
+ {0xBE4B, 0x9189}, //4503 #CJK UNIFIED IDEOGRAPH
+ {0xBE4C, 0x918B}, //4504 #CJK UNIFIED IDEOGRAPH
+ {0xBE4D, 0x9183}, //4505 #CJK UNIFIED IDEOGRAPH
+ {0xBE4E, 0x92C5}, //4506 #CJK UNIFIED IDEOGRAPH
+ {0xBE4F, 0x92BB}, //4507 #CJK UNIFIED IDEOGRAPH
+ {0xBE50, 0x92B7}, //4508 #CJK UNIFIED IDEOGRAPH
+ {0xBE51, 0x92EA}, //4509 #CJK UNIFIED IDEOGRAPH
+ {0xBE52, 0x92AC}, //4510 #CJK UNIFIED IDEOGRAPH
+ {0xBE53, 0x92E4}, //4511 #CJK UNIFIED IDEOGRAPH
+ {0xBE54, 0x92C1}, //4512 #CJK UNIFIED IDEOGRAPH
+ {0xBE55, 0x92B3}, //4513 #CJK UNIFIED IDEOGRAPH
+ {0xBE56, 0x92BC}, //4514 #CJK UNIFIED IDEOGRAPH
+ {0xBE57, 0x92D2}, //4515 #CJK UNIFIED IDEOGRAPH
+ {0xBE58, 0x92C7}, //4516 #CJK UNIFIED IDEOGRAPH
+ {0xBE59, 0x92F0}, //4517 #CJK UNIFIED IDEOGRAPH
+ {0xBE5A, 0x92B2}, //4518 #CJK UNIFIED IDEOGRAPH
+ {0xBE5B, 0x95AD}, //4519 #CJK UNIFIED IDEOGRAPH
+ {0xBE5C, 0x95B1}, //4520 #CJK UNIFIED IDEOGRAPH
+ {0xBE5D, 0x9704}, //4521 #CJK UNIFIED IDEOGRAPH
+ {0xBE5E, 0x9706}, //4522 #CJK UNIFIED IDEOGRAPH
+ {0xBE5F, 0x9707}, //4523 #CJK UNIFIED IDEOGRAPH
+ {0xBE60, 0x9709}, //4524 #CJK UNIFIED IDEOGRAPH
+ {0xBE61, 0x9760}, //4525 #CJK UNIFIED IDEOGRAPH
+ {0xBE62, 0x978D}, //4526 #CJK UNIFIED IDEOGRAPH
+ {0xBE63, 0x978B}, //4527 #CJK UNIFIED IDEOGRAPH
+ {0xBE64, 0x978F}, //4528 #CJK UNIFIED IDEOGRAPH
+ {0xBE65, 0x9821}, //4529 #CJK UNIFIED IDEOGRAPH
+ {0xBE66, 0x982B}, //4530 #CJK UNIFIED IDEOGRAPH
+ {0xBE67, 0x981C}, //4531 #CJK UNIFIED IDEOGRAPH
+ {0xBE68, 0x98B3}, //4532 #CJK UNIFIED IDEOGRAPH
+ {0xBE69, 0x990A}, //4533 #CJK UNIFIED IDEOGRAPH
+ {0xBE6A, 0x9913}, //4534 #CJK UNIFIED IDEOGRAPH
+ {0xBE6B, 0x9912}, //4535 #CJK UNIFIED IDEOGRAPH
+ {0xBE6C, 0x9918}, //4536 #CJK UNIFIED IDEOGRAPH
+ {0xBE6D, 0x99DD}, //4537 #CJK UNIFIED IDEOGRAPH
+ {0xBE6E, 0x99D0}, //4538 #CJK UNIFIED IDEOGRAPH
+ {0xBE6F, 0x99DF}, //4539 #CJK UNIFIED IDEOGRAPH
+ {0xBE70, 0x99DB}, //4540 #CJK UNIFIED IDEOGRAPH
+ {0xBE71, 0x99D1}, //4541 #CJK UNIFIED IDEOGRAPH
+ {0xBE72, 0x99D5}, //4542 #CJK UNIFIED IDEOGRAPH
+ {0xBE73, 0x99D2}, //4543 #CJK UNIFIED IDEOGRAPH
+ {0xBE74, 0x99D9}, //4544 #CJK UNIFIED IDEOGRAPH
+ {0xBE75, 0x9AB7}, //4545 #CJK UNIFIED IDEOGRAPH
+ {0xBE76, 0x9AEE}, //4546 #CJK UNIFIED IDEOGRAPH
+ {0xBE77, 0x9AEF}, //4547 #CJK UNIFIED IDEOGRAPH
+ {0xBE78, 0x9B27}, //4548 #CJK UNIFIED IDEOGRAPH
+ {0xBE79, 0x9B45}, //4549 #CJK UNIFIED IDEOGRAPH
+ {0xBE7A, 0x9B44}, //4550 #CJK UNIFIED IDEOGRAPH
+ {0xBE7B, 0x9B77}, //4551 #CJK UNIFIED IDEOGRAPH
+ {0xBE7C, 0x9B6F}, //4552 #CJK UNIFIED IDEOGRAPH
+ {0xBE7D, 0x9D06}, //4553 #CJK UNIFIED IDEOGRAPH
+ {0xBE7E, 0x9D09}, //4554 #CJK UNIFIED IDEOGRAPH
+ {0xBEA1, 0x9D03}, //4555 #CJK UNIFIED IDEOGRAPH
+ {0xBEA2, 0x9EA9}, //4556 #CJK UNIFIED IDEOGRAPH
+ {0xBEA3, 0x9EBE}, //4557 #CJK UNIFIED IDEOGRAPH
+ {0xBEA4, 0x9ECE}, //4558 #CJK UNIFIED IDEOGRAPH
+ {0xBEA5, 0x58A8}, //4559 #CJK UNIFIED IDEOGRAPH
+ {0xBEA6, 0x9F52}, //4560 #CJK UNIFIED IDEOGRAPH
+ {0xBEA7, 0x5112}, //4561 #CJK UNIFIED IDEOGRAPH
+ {0xBEA8, 0x5118}, //4562 #CJK UNIFIED IDEOGRAPH
+ {0xBEA9, 0x5114}, //4563 #CJK UNIFIED IDEOGRAPH
+ {0xBEAA, 0x5110}, //4564 #CJK UNIFIED IDEOGRAPH
+ {0xBEAB, 0x5115}, //4565 #CJK UNIFIED IDEOGRAPH
+ {0xBEAC, 0x5180}, //4566 #CJK UNIFIED IDEOGRAPH
+ {0xBEAD, 0x51AA}, //4567 #CJK UNIFIED IDEOGRAPH
+ {0xBEAE, 0x51DD}, //4568 #CJK UNIFIED IDEOGRAPH
+ {0xBEAF, 0x5291}, //4569 #CJK UNIFIED IDEOGRAPH
+ {0xBEB0, 0x5293}, //4570 #CJK UNIFIED IDEOGRAPH
+ {0xBEB1, 0x52F3}, //4571 #CJK UNIFIED IDEOGRAPH
+ {0xBEB2, 0x5659}, //4572 #CJK UNIFIED IDEOGRAPH
+ {0xBEB3, 0x566B}, //4573 #CJK UNIFIED IDEOGRAPH
+ {0xBEB4, 0x5679}, //4574 #CJK UNIFIED IDEOGRAPH
+ {0xBEB5, 0x5669}, //4575 #CJK UNIFIED IDEOGRAPH
+ {0xBEB6, 0x5664}, //4576 #CJK UNIFIED IDEOGRAPH
+ {0xBEB7, 0x5678}, //4577 #CJK UNIFIED IDEOGRAPH
+ {0xBEB8, 0x566A}, //4578 #CJK UNIFIED IDEOGRAPH
+ {0xBEB9, 0x5668}, //4579 #CJK UNIFIED IDEOGRAPH
+ {0xBEBA, 0x5665}, //4580 #CJK UNIFIED IDEOGRAPH
+ {0xBEBB, 0x5671}, //4581 #CJK UNIFIED IDEOGRAPH
+ {0xBEBC, 0x566F}, //4582 #CJK UNIFIED IDEOGRAPH
+ {0xBEBD, 0x566C}, //4583 #CJK UNIFIED IDEOGRAPH
+ {0xBEBE, 0x5662}, //4584 #CJK UNIFIED IDEOGRAPH
+ {0xBEBF, 0x5676}, //4585 #CJK UNIFIED IDEOGRAPH
+ {0xBEC0, 0x58C1}, //4586 #CJK UNIFIED IDEOGRAPH
+ {0xBEC1, 0x58BE}, //4587 #CJK UNIFIED IDEOGRAPH
+ {0xBEC2, 0x58C7}, //4588 #CJK UNIFIED IDEOGRAPH
+ {0xBEC3, 0x58C5}, //4589 #CJK UNIFIED IDEOGRAPH
+ {0xBEC4, 0x596E}, //4590 #CJK UNIFIED IDEOGRAPH
+ {0xBEC5, 0x5B1D}, //4591 #CJK UNIFIED IDEOGRAPH
+ {0xBEC6, 0x5B34}, //4592 #CJK UNIFIED IDEOGRAPH
+ {0xBEC7, 0x5B78}, //4593 #CJK UNIFIED IDEOGRAPH
+ {0xBEC8, 0x5BF0}, //4594 #CJK UNIFIED IDEOGRAPH
+ {0xBEC9, 0x5C0E}, //4595 #CJK UNIFIED IDEOGRAPH
+ {0xBECA, 0x5F4A}, //4596 #CJK UNIFIED IDEOGRAPH
+ {0xBECB, 0x61B2}, //4597 #CJK UNIFIED IDEOGRAPH
+ {0xBECC, 0x6191}, //4598 #CJK UNIFIED IDEOGRAPH
+ {0xBECD, 0x61A9}, //4599 #CJK UNIFIED IDEOGRAPH
+ {0xBECE, 0x618A}, //4600 #CJK UNIFIED IDEOGRAPH
+ {0xBECF, 0x61CD}, //4601 #CJK UNIFIED IDEOGRAPH
+ {0xBED0, 0x61B6}, //4602 #CJK UNIFIED IDEOGRAPH
+ {0xBED1, 0x61BE}, //4603 #CJK UNIFIED IDEOGRAPH
+ {0xBED2, 0x61CA}, //4604 #CJK UNIFIED IDEOGRAPH
+ {0xBED3, 0x61C8}, //4605 #CJK UNIFIED IDEOGRAPH
+ {0xBED4, 0x6230}, //4606 #CJK UNIFIED IDEOGRAPH
+ {0xBED5, 0x64C5}, //4607 #CJK UNIFIED IDEOGRAPH
+ {0xBED6, 0x64C1}, //4608 #CJK UNIFIED IDEOGRAPH
+ {0xBED7, 0x64CB}, //4609 #CJK UNIFIED IDEOGRAPH
+ {0xBED8, 0x64BB}, //4610 #CJK UNIFIED IDEOGRAPH
+ {0xBED9, 0x64BC}, //4611 #CJK UNIFIED IDEOGRAPH
+ {0xBEDA, 0x64DA}, //4612 #CJK UNIFIED IDEOGRAPH
+ {0xBEDB, 0x64C4}, //4613 #CJK UNIFIED IDEOGRAPH
+ {0xBEDC, 0x64C7}, //4614 #CJK UNIFIED IDEOGRAPH
+ {0xBEDD, 0x64C2}, //4615 #CJK UNIFIED IDEOGRAPH
+ {0xBEDE, 0x64CD}, //4616 #CJK UNIFIED IDEOGRAPH
+ {0xBEDF, 0x64BF}, //4617 #CJK UNIFIED IDEOGRAPH
+ {0xBEE0, 0x64D2}, //4618 #CJK UNIFIED IDEOGRAPH
+ {0xBEE1, 0x64D4}, //4619 #CJK UNIFIED IDEOGRAPH
+ {0xBEE2, 0x64BE}, //4620 #CJK UNIFIED IDEOGRAPH
+ {0xBEE3, 0x6574}, //4621 #CJK UNIFIED IDEOGRAPH
+ {0xBEE4, 0x66C6}, //4622 #CJK UNIFIED IDEOGRAPH
+ {0xBEE5, 0x66C9}, //4623 #CJK UNIFIED IDEOGRAPH
+ {0xBEE6, 0x66B9}, //4624 #CJK UNIFIED IDEOGRAPH
+ {0xBEE7, 0x66C4}, //4625 #CJK UNIFIED IDEOGRAPH
+ {0xBEE8, 0x66C7}, //4626 #CJK UNIFIED IDEOGRAPH
+ {0xBEE9, 0x66B8}, //4627 #CJK UNIFIED IDEOGRAPH
+ {0xBEEA, 0x6A3D}, //4628 #CJK UNIFIED IDEOGRAPH
+ {0xBEEB, 0x6A38}, //4629 #CJK UNIFIED IDEOGRAPH
+ {0xBEEC, 0x6A3A}, //4630 #CJK UNIFIED IDEOGRAPH
+ {0xBEED, 0x6A59}, //4631 #CJK UNIFIED IDEOGRAPH
+ {0xBEEE, 0x6A6B}, //4632 #CJK UNIFIED IDEOGRAPH
+ {0xBEEF, 0x6A58}, //4633 #CJK UNIFIED IDEOGRAPH
+ {0xBEF0, 0x6A39}, //4634 #CJK UNIFIED IDEOGRAPH
+ {0xBEF1, 0x6A44}, //4635 #CJK UNIFIED IDEOGRAPH
+ {0xBEF2, 0x6A62}, //4636 #CJK UNIFIED IDEOGRAPH
+ {0xBEF3, 0x6A61}, //4637 #CJK UNIFIED IDEOGRAPH
+ {0xBEF4, 0x6A4B}, //4638 #CJK UNIFIED IDEOGRAPH
+ {0xBEF5, 0x6A47}, //4639 #CJK UNIFIED IDEOGRAPH
+ {0xBEF6, 0x6A35}, //4640 #CJK UNIFIED IDEOGRAPH
+ {0xBEF7, 0x6A5F}, //4641 #CJK UNIFIED IDEOGRAPH
+ {0xBEF8, 0x6A48}, //4642 #CJK UNIFIED IDEOGRAPH
+ {0xBEF9, 0x6B59}, //4643 #CJK UNIFIED IDEOGRAPH
+ {0xBEFA, 0x6B77}, //4644 #CJK UNIFIED IDEOGRAPH
+ {0xBEFB, 0x6C05}, //4645 #CJK UNIFIED IDEOGRAPH
+ {0xBEFC, 0x6FC2}, //4646 #CJK UNIFIED IDEOGRAPH
+ {0xBEFD, 0x6FB1}, //4647 #CJK UNIFIED IDEOGRAPH
+ {0xBEFE, 0x6FA1}, //4648 #CJK UNIFIED IDEOGRAPH
+ {0xBF40, 0x6FC3}, //4649 #CJK UNIFIED IDEOGRAPH
+ {0xBF41, 0x6FA4}, //4650 #CJK UNIFIED IDEOGRAPH
+ {0xBF42, 0x6FC1}, //4651 #CJK UNIFIED IDEOGRAPH
+ {0xBF43, 0x6FA7}, //4652 #CJK UNIFIED IDEOGRAPH
+ {0xBF44, 0x6FB3}, //4653 #CJK UNIFIED IDEOGRAPH
+ {0xBF45, 0x6FC0}, //4654 #CJK UNIFIED IDEOGRAPH
+ {0xBF46, 0x6FB9}, //4655 #CJK UNIFIED IDEOGRAPH
+ {0xBF47, 0x6FB6}, //4656 #CJK UNIFIED IDEOGRAPH
+ {0xBF48, 0x6FA6}, //4657 #CJK UNIFIED IDEOGRAPH
+ {0xBF49, 0x6FA0}, //4658 #CJK UNIFIED IDEOGRAPH
+ {0xBF4A, 0x6FB4}, //4659 #CJK UNIFIED IDEOGRAPH
+ {0xBF4B, 0x71BE}, //4660 #CJK UNIFIED IDEOGRAPH
+ {0xBF4C, 0x71C9}, //4661 #CJK UNIFIED IDEOGRAPH
+ {0xBF4D, 0x71D0}, //4662 #CJK UNIFIED IDEOGRAPH
+ {0xBF4E, 0x71D2}, //4663 #CJK UNIFIED IDEOGRAPH
+ {0xBF4F, 0x71C8}, //4664 #CJK UNIFIED IDEOGRAPH
+ {0xBF50, 0x71D5}, //4665 #CJK UNIFIED IDEOGRAPH
+ {0xBF51, 0x71B9}, //4666 #CJK UNIFIED IDEOGRAPH
+ {0xBF52, 0x71CE}, //4667 #CJK UNIFIED IDEOGRAPH
+ {0xBF53, 0x71D9}, //4668 #CJK UNIFIED IDEOGRAPH
+ {0xBF54, 0x71DC}, //4669 #CJK UNIFIED IDEOGRAPH
+ {0xBF55, 0x71C3}, //4670 #CJK UNIFIED IDEOGRAPH
+ {0xBF56, 0x71C4}, //4671 #CJK UNIFIED IDEOGRAPH
+ {0xBF57, 0x7368}, //4672 #CJK UNIFIED IDEOGRAPH
+ {0xBF58, 0x749C}, //4673 #CJK UNIFIED IDEOGRAPH
+ {0xBF59, 0x74A3}, //4674 #CJK UNIFIED IDEOGRAPH
+ {0xBF5A, 0x7498}, //4675 #CJK UNIFIED IDEOGRAPH
+ {0xBF5B, 0x749F}, //4676 #CJK UNIFIED IDEOGRAPH
+ {0xBF5C, 0x749E}, //4677 #CJK UNIFIED IDEOGRAPH
+ {0xBF5D, 0x74E2}, //4678 #CJK UNIFIED IDEOGRAPH
+ {0xBF5E, 0x750C}, //4679 #CJK UNIFIED IDEOGRAPH
+ {0xBF5F, 0x750D}, //4680 #CJK UNIFIED IDEOGRAPH
+ {0xBF60, 0x7634}, //4681 #CJK UNIFIED IDEOGRAPH
+ {0xBF61, 0x7638}, //4682 #CJK UNIFIED IDEOGRAPH
+ {0xBF62, 0x763A}, //4683 #CJK UNIFIED IDEOGRAPH
+ {0xBF63, 0x76E7}, //4684 #CJK UNIFIED IDEOGRAPH
+ {0xBF64, 0x76E5}, //4685 #CJK UNIFIED IDEOGRAPH
+ {0xBF65, 0x77A0}, //4686 #CJK UNIFIED IDEOGRAPH
+ {0xBF66, 0x779E}, //4687 #CJK UNIFIED IDEOGRAPH
+ {0xBF67, 0x779F}, //4688 #CJK UNIFIED IDEOGRAPH
+ {0xBF68, 0x77A5}, //4689 #CJK UNIFIED IDEOGRAPH
+ {0xBF69, 0x78E8}, //4690 #CJK UNIFIED IDEOGRAPH
+ {0xBF6A, 0x78DA}, //4691 #CJK UNIFIED IDEOGRAPH
+ {0xBF6B, 0x78EC}, //4692 #CJK UNIFIED IDEOGRAPH
+ {0xBF6C, 0x78E7}, //4693 #CJK UNIFIED IDEOGRAPH
+ {0xBF6D, 0x79A6}, //4694 #CJK UNIFIED IDEOGRAPH
+ {0xBF6E, 0x7A4D}, //4695 #CJK UNIFIED IDEOGRAPH
+ {0xBF6F, 0x7A4E}, //4696 #CJK UNIFIED IDEOGRAPH
+ {0xBF70, 0x7A46}, //4697 #CJK UNIFIED IDEOGRAPH
+ {0xBF71, 0x7A4C}, //4698 #CJK UNIFIED IDEOGRAPH
+ {0xBF72, 0x7A4B}, //4699 #CJK UNIFIED IDEOGRAPH
+ {0xBF73, 0x7ABA}, //4700 #CJK UNIFIED IDEOGRAPH
+ {0xBF74, 0x7BD9}, //4701 #CJK UNIFIED IDEOGRAPH
+ {0xBF75, 0x7C11}, //4702 #CJK UNIFIED IDEOGRAPH
+ {0xBF76, 0x7BC9}, //4703 #CJK UNIFIED IDEOGRAPH
+ {0xBF77, 0x7BE4}, //4704 #CJK UNIFIED IDEOGRAPH
+ {0xBF78, 0x7BDB}, //4705 #CJK UNIFIED IDEOGRAPH
+ {0xBF79, 0x7BE1}, //4706 #CJK UNIFIED IDEOGRAPH
+ {0xBF7A, 0x7BE9}, //4707 #CJK UNIFIED IDEOGRAPH
+ {0xBF7B, 0x7BE6}, //4708 #CJK UNIFIED IDEOGRAPH
+ {0xBF7C, 0x7CD5}, //4709 #CJK UNIFIED IDEOGRAPH
+ {0xBF7D, 0x7CD6}, //4710 #CJK UNIFIED IDEOGRAPH
+ {0xBF7E, 0x7E0A}, //4711 #CJK UNIFIED IDEOGRAPH
+ {0xBFA1, 0x7E11}, //4712 #CJK UNIFIED IDEOGRAPH
+ {0xBFA2, 0x7E08}, //4713 #CJK UNIFIED IDEOGRAPH
+ {0xBFA3, 0x7E1B}, //4714 #CJK UNIFIED IDEOGRAPH
+ {0xBFA4, 0x7E23}, //4715 #CJK UNIFIED IDEOGRAPH
+ {0xBFA5, 0x7E1E}, //4716 #CJK UNIFIED IDEOGRAPH
+ {0xBFA6, 0x7E1D}, //4717 #CJK UNIFIED IDEOGRAPH
+ {0xBFA7, 0x7E09}, //4718 #CJK UNIFIED IDEOGRAPH
+ {0xBFA8, 0x7E10}, //4719 #CJK UNIFIED IDEOGRAPH
+ {0xBFA9, 0x7F79}, //4720 #CJK UNIFIED IDEOGRAPH
+ {0xBFAA, 0x7FB2}, //4721 #CJK UNIFIED IDEOGRAPH
+ {0xBFAB, 0x7FF0}, //4722 #CJK UNIFIED IDEOGRAPH
+ {0xBFAC, 0x7FF1}, //4723 #CJK UNIFIED IDEOGRAPH
+ {0xBFAD, 0x7FEE}, //4724 #CJK UNIFIED IDEOGRAPH
+ {0xBFAE, 0x8028}, //4725 #CJK UNIFIED IDEOGRAPH
+ {0xBFAF, 0x81B3}, //4726 #CJK UNIFIED IDEOGRAPH
+ {0xBFB0, 0x81A9}, //4727 #CJK UNIFIED IDEOGRAPH
+ {0xBFB1, 0x81A8}, //4728 #CJK UNIFIED IDEOGRAPH
+ {0xBFB2, 0x81FB}, //4729 #CJK UNIFIED IDEOGRAPH
+ {0xBFB3, 0x8208}, //4730 #CJK UNIFIED IDEOGRAPH
+ {0xBFB4, 0x8258}, //4731 #CJK UNIFIED IDEOGRAPH
+ {0xBFB5, 0x8259}, //4732 #CJK UNIFIED IDEOGRAPH
+ {0xBFB6, 0x854A}, //4733 #CJK UNIFIED IDEOGRAPH
+ {0xBFB7, 0x8559}, //4734 #CJK UNIFIED IDEOGRAPH
+ {0xBFB8, 0x8548}, //4735 #CJK UNIFIED IDEOGRAPH
+ {0xBFB9, 0x8568}, //4736 #CJK UNIFIED IDEOGRAPH
+ {0xBFBA, 0x8569}, //4737 #CJK UNIFIED IDEOGRAPH
+ {0xBFBB, 0x8543}, //4738 #CJK UNIFIED IDEOGRAPH
+ {0xBFBC, 0x8549}, //4739 #CJK UNIFIED IDEOGRAPH
+ {0xBFBD, 0x856D}, //4740 #CJK UNIFIED IDEOGRAPH
+ {0xBFBE, 0x856A}, //4741 #CJK UNIFIED IDEOGRAPH
+ {0xBFBF, 0x855E}, //4742 #CJK UNIFIED IDEOGRAPH
+ {0xBFC0, 0x8783}, //4743 #CJK UNIFIED IDEOGRAPH
+ {0xBFC1, 0x879F}, //4744 #CJK UNIFIED IDEOGRAPH
+ {0xBFC2, 0x879E}, //4745 #CJK UNIFIED IDEOGRAPH
+ {0xBFC3, 0x87A2}, //4746 #CJK UNIFIED IDEOGRAPH
+ {0xBFC4, 0x878D}, //4747 #CJK UNIFIED IDEOGRAPH
+ {0xBFC5, 0x8861}, //4748 #CJK UNIFIED IDEOGRAPH
+ {0xBFC6, 0x892A}, //4749 #CJK UNIFIED IDEOGRAPH
+ {0xBFC7, 0x8932}, //4750 #CJK UNIFIED IDEOGRAPH
+ {0xBFC8, 0x8925}, //4751 #CJK UNIFIED IDEOGRAPH
+ {0xBFC9, 0x892B}, //4752 #CJK UNIFIED IDEOGRAPH
+ {0xBFCA, 0x8921}, //4753 #CJK UNIFIED IDEOGRAPH
+ {0xBFCB, 0x89AA}, //4754 #CJK UNIFIED IDEOGRAPH
+ {0xBFCC, 0x89A6}, //4755 #CJK UNIFIED IDEOGRAPH
+ {0xBFCD, 0x8AE6}, //4756 #CJK UNIFIED IDEOGRAPH
+ {0xBFCE, 0x8AFA}, //4757 #CJK UNIFIED IDEOGRAPH
+ {0xBFCF, 0x8AEB}, //4758 #CJK UNIFIED IDEOGRAPH
+ {0xBFD0, 0x8AF1}, //4759 #CJK UNIFIED IDEOGRAPH
+ {0xBFD1, 0x8B00}, //4760 #CJK UNIFIED IDEOGRAPH
+ {0xBFD2, 0x8ADC}, //4761 #CJK UNIFIED IDEOGRAPH
+ {0xBFD3, 0x8AE7}, //4762 #CJK UNIFIED IDEOGRAPH
+ {0xBFD4, 0x8AEE}, //4763 #CJK UNIFIED IDEOGRAPH
+ {0xBFD5, 0x8AFE}, //4764 #CJK UNIFIED IDEOGRAPH
+ {0xBFD6, 0x8B01}, //4765 #CJK UNIFIED IDEOGRAPH
+ {0xBFD7, 0x8B02}, //4766 #CJK UNIFIED IDEOGRAPH
+ {0xBFD8, 0x8AF7}, //4767 #CJK UNIFIED IDEOGRAPH
+ {0xBFD9, 0x8AED}, //4768 #CJK UNIFIED IDEOGRAPH
+ {0xBFDA, 0x8AF3}, //4769 #CJK UNIFIED IDEOGRAPH
+ {0xBFDB, 0x8AF6}, //4770 #CJK UNIFIED IDEOGRAPH
+ {0xBFDC, 0x8AFC}, //4771 #CJK UNIFIED IDEOGRAPH
+ {0xBFDD, 0x8C6B}, //4772 #CJK UNIFIED IDEOGRAPH
+ {0xBFDE, 0x8C6D}, //4773 #CJK UNIFIED IDEOGRAPH
+ {0xBFDF, 0x8C93}, //4774 #CJK UNIFIED IDEOGRAPH
+ {0xBFE0, 0x8CF4}, //4775 #CJK UNIFIED IDEOGRAPH
+ {0xBFE1, 0x8E44}, //4776 #CJK UNIFIED IDEOGRAPH
+ {0xBFE2, 0x8E31}, //4777 #CJK UNIFIED IDEOGRAPH
+ {0xBFE3, 0x8E34}, //4778 #CJK UNIFIED IDEOGRAPH
+ {0xBFE4, 0x8E42}, //4779 #CJK UNIFIED IDEOGRAPH
+ {0xBFE5, 0x8E39}, //4780 #CJK UNIFIED IDEOGRAPH
+ {0xBFE6, 0x8E35}, //4781 #CJK UNIFIED IDEOGRAPH
+ {0xBFE7, 0x8F3B}, //4782 #CJK UNIFIED IDEOGRAPH
+ {0xBFE8, 0x8F2F}, //4783 #CJK UNIFIED IDEOGRAPH
+ {0xBFE9, 0x8F38}, //4784 #CJK UNIFIED IDEOGRAPH
+ {0xBFEA, 0x8F33}, //4785 #CJK UNIFIED IDEOGRAPH
+ {0xBFEB, 0x8FA8}, //4786 #CJK UNIFIED IDEOGRAPH
+ {0xBFEC, 0x8FA6}, //4787 #CJK UNIFIED IDEOGRAPH
+ {0xBFED, 0x9075}, //4788 #CJK UNIFIED IDEOGRAPH
+ {0xBFEE, 0x9074}, //4789 #CJK UNIFIED IDEOGRAPH
+ {0xBFEF, 0x9078}, //4790 #CJK UNIFIED IDEOGRAPH
+ {0xBFF0, 0x9072}, //4791 #CJK UNIFIED IDEOGRAPH
+ {0xBFF1, 0x907C}, //4792 #CJK UNIFIED IDEOGRAPH
+ {0xBFF2, 0x907A}, //4793 #CJK UNIFIED IDEOGRAPH
+ {0xBFF3, 0x9134}, //4794 #CJK UNIFIED IDEOGRAPH
+ {0xBFF4, 0x9192}, //4795 #CJK UNIFIED IDEOGRAPH
+ {0xBFF5, 0x9320}, //4796 #CJK UNIFIED IDEOGRAPH
+ {0xBFF6, 0x9336}, //4797 #CJK UNIFIED IDEOGRAPH
+ {0xBFF7, 0x92F8}, //4798 #CJK UNIFIED IDEOGRAPH
+ {0xBFF8, 0x9333}, //4799 #CJK UNIFIED IDEOGRAPH
+ {0xBFF9, 0x932F}, //4800 #CJK UNIFIED IDEOGRAPH
+ {0xBFFA, 0x9322}, //4801 #CJK UNIFIED IDEOGRAPH
+ {0xBFFB, 0x92FC}, //4802 #CJK UNIFIED IDEOGRAPH
+ {0xBFFC, 0x932B}, //4803 #CJK UNIFIED IDEOGRAPH
+ {0xBFFD, 0x9304}, //4804 #CJK UNIFIED IDEOGRAPH
+ {0xBFFE, 0x931A}, //4805 #CJK UNIFIED IDEOGRAPH
+ {0xC040, 0x9310}, //4806 #CJK UNIFIED IDEOGRAPH
+ {0xC041, 0x9326}, //4807 #CJK UNIFIED IDEOGRAPH
+ {0xC042, 0x9321}, //4808 #CJK UNIFIED IDEOGRAPH
+ {0xC043, 0x9315}, //4809 #CJK UNIFIED IDEOGRAPH
+ {0xC044, 0x932E}, //4810 #CJK UNIFIED IDEOGRAPH
+ {0xC045, 0x9319}, //4811 #CJK UNIFIED IDEOGRAPH
+ {0xC046, 0x95BB}, //4812 #CJK UNIFIED IDEOGRAPH
+ {0xC047, 0x96A7}, //4813 #CJK UNIFIED IDEOGRAPH
+ {0xC048, 0x96A8}, //4814 #CJK UNIFIED IDEOGRAPH
+ {0xC049, 0x96AA}, //4815 #CJK UNIFIED IDEOGRAPH
+ {0xC04A, 0x96D5}, //4816 #CJK UNIFIED IDEOGRAPH
+ {0xC04B, 0x970E}, //4817 #CJK UNIFIED IDEOGRAPH
+ {0xC04C, 0x9711}, //4818 #CJK UNIFIED IDEOGRAPH
+ {0xC04D, 0x9716}, //4819 #CJK UNIFIED IDEOGRAPH
+ {0xC04E, 0x970D}, //4820 #CJK UNIFIED IDEOGRAPH
+ {0xC04F, 0x9713}, //4821 #CJK UNIFIED IDEOGRAPH
+ {0xC050, 0x970F}, //4822 #CJK UNIFIED IDEOGRAPH
+ {0xC051, 0x975B}, //4823 #CJK UNIFIED IDEOGRAPH
+ {0xC052, 0x975C}, //4824 #CJK UNIFIED IDEOGRAPH
+ {0xC053, 0x9766}, //4825 #CJK UNIFIED IDEOGRAPH
+ {0xC054, 0x9798}, //4826 #CJK UNIFIED IDEOGRAPH
+ {0xC055, 0x9830}, //4827 #CJK UNIFIED IDEOGRAPH
+ {0xC056, 0x9838}, //4828 #CJK UNIFIED IDEOGRAPH
+ {0xC057, 0x983B}, //4829 #CJK UNIFIED IDEOGRAPH
+ {0xC058, 0x9837}, //4830 #CJK UNIFIED IDEOGRAPH
+ {0xC059, 0x982D}, //4831 #CJK UNIFIED IDEOGRAPH
+ {0xC05A, 0x9839}, //4832 #CJK UNIFIED IDEOGRAPH
+ {0xC05B, 0x9824}, //4833 #CJK UNIFIED IDEOGRAPH
+ {0xC05C, 0x9910}, //4834 #CJK UNIFIED IDEOGRAPH
+ {0xC05D, 0x9928}, //4835 #CJK UNIFIED IDEOGRAPH
+ {0xC05E, 0x991E}, //4836 #CJK UNIFIED IDEOGRAPH
+ {0xC05F, 0x991B}, //4837 #CJK UNIFIED IDEOGRAPH
+ {0xC060, 0x9921}, //4838 #CJK UNIFIED IDEOGRAPH
+ {0xC061, 0x991A}, //4839 #CJK UNIFIED IDEOGRAPH
+ {0xC062, 0x99ED}, //4840 #CJK UNIFIED IDEOGRAPH
+ {0xC063, 0x99E2}, //4841 #CJK UNIFIED IDEOGRAPH
+ {0xC064, 0x99F1}, //4842 #CJK UNIFIED IDEOGRAPH
+ {0xC065, 0x9AB8}, //4843 #CJK UNIFIED IDEOGRAPH
+ {0xC066, 0x9ABC}, //4844 #CJK UNIFIED IDEOGRAPH
+ {0xC067, 0x9AFB}, //4845 #CJK UNIFIED IDEOGRAPH
+ {0xC068, 0x9AED}, //4846 #CJK UNIFIED IDEOGRAPH
+ {0xC069, 0x9B28}, //4847 #CJK UNIFIED IDEOGRAPH
+ {0xC06A, 0x9B91}, //4848 #CJK UNIFIED IDEOGRAPH
+ {0xC06B, 0x9D15}, //4849 #CJK UNIFIED IDEOGRAPH
+ {0xC06C, 0x9D23}, //4850 #CJK UNIFIED IDEOGRAPH
+ {0xC06D, 0x9D26}, //4851 #CJK UNIFIED IDEOGRAPH
+ {0xC06E, 0x9D28}, //4852 #CJK UNIFIED IDEOGRAPH
+ {0xC06F, 0x9D12}, //4853 #CJK UNIFIED IDEOGRAPH
+ {0xC070, 0x9D1B}, //4854 #CJK UNIFIED IDEOGRAPH
+ {0xC071, 0x9ED8}, //4855 #CJK UNIFIED IDEOGRAPH
+ {0xC072, 0x9ED4}, //4856 #CJK UNIFIED IDEOGRAPH
+ {0xC073, 0x9F8D}, //4857 #CJK UNIFIED IDEOGRAPH
+ {0xC074, 0x9F9C}, //4858 #CJK UNIFIED IDEOGRAPH
+ {0xC075, 0x512A}, //4859 #CJK UNIFIED IDEOGRAPH
+ {0xC076, 0x511F}, //4860 #CJK UNIFIED IDEOGRAPH
+ {0xC077, 0x5121}, //4861 #CJK UNIFIED IDEOGRAPH
+ {0xC078, 0x5132}, //4862 #CJK UNIFIED IDEOGRAPH
+ {0xC079, 0x52F5}, //4863 #CJK UNIFIED IDEOGRAPH
+ {0xC07A, 0x568E}, //4864 #CJK UNIFIED IDEOGRAPH
+ {0xC07B, 0x5680}, //4865 #CJK UNIFIED IDEOGRAPH
+ {0xC07C, 0x5690}, //4866 #CJK UNIFIED IDEOGRAPH
+ {0xC07D, 0x5685}, //4867 #CJK UNIFIED IDEOGRAPH
+ {0xC07E, 0x5687}, //4868 #CJK UNIFIED IDEOGRAPH
+ {0xC0A1, 0x568F}, //4869 #CJK UNIFIED IDEOGRAPH
+ {0xC0A2, 0x58D5}, //4870 #CJK UNIFIED IDEOGRAPH
+ {0xC0A3, 0x58D3}, //4871 #CJK UNIFIED IDEOGRAPH
+ {0xC0A4, 0x58D1}, //4872 #CJK UNIFIED IDEOGRAPH
+ {0xC0A5, 0x58CE}, //4873 #CJK UNIFIED IDEOGRAPH
+ {0xC0A6, 0x5B30}, //4874 #CJK UNIFIED IDEOGRAPH
+ {0xC0A7, 0x5B2A}, //4875 #CJK UNIFIED IDEOGRAPH
+ {0xC0A8, 0x5B24}, //4876 #CJK UNIFIED IDEOGRAPH
+ {0xC0A9, 0x5B7A}, //4877 #CJK UNIFIED IDEOGRAPH
+ {0xC0AA, 0x5C37}, //4878 #CJK UNIFIED IDEOGRAPH
+ {0xC0AB, 0x5C68}, //4879 #CJK UNIFIED IDEOGRAPH
+ {0xC0AC, 0x5DBC}, //4880 #CJK UNIFIED IDEOGRAPH
+ {0xC0AD, 0x5DBA}, //4881 #CJK UNIFIED IDEOGRAPH
+ {0xC0AE, 0x5DBD}, //4882 #CJK UNIFIED IDEOGRAPH
+ {0xC0AF, 0x5DB8}, //4883 #CJK UNIFIED IDEOGRAPH
+ {0xC0B0, 0x5E6B}, //4884 #CJK UNIFIED IDEOGRAPH
+ {0xC0B1, 0x5F4C}, //4885 #CJK UNIFIED IDEOGRAPH
+ {0xC0B2, 0x5FBD}, //4886 #CJK UNIFIED IDEOGRAPH
+ {0xC0B3, 0x61C9}, //4887 #CJK UNIFIED IDEOGRAPH
+ {0xC0B4, 0x61C2}, //4888 #CJK UNIFIED IDEOGRAPH
+ {0xC0B5, 0x61C7}, //4889 #CJK UNIFIED IDEOGRAPH
+ {0xC0B6, 0x61E6}, //4890 #CJK UNIFIED IDEOGRAPH
+ {0xC0B7, 0x61CB}, //4891 #CJK UNIFIED IDEOGRAPH
+ {0xC0B8, 0x6232}, //4892 #CJK UNIFIED IDEOGRAPH
+ {0xC0B9, 0x6234}, //4893 #CJK UNIFIED IDEOGRAPH
+ {0xC0BA, 0x64CE}, //4894 #CJK UNIFIED IDEOGRAPH
+ {0xC0BB, 0x64CA}, //4895 #CJK UNIFIED IDEOGRAPH
+ {0xC0BC, 0x64D8}, //4896 #CJK UNIFIED IDEOGRAPH
+ {0xC0BD, 0x64E0}, //4897 #CJK UNIFIED IDEOGRAPH
+ {0xC0BE, 0x64F0}, //4898 #CJK UNIFIED IDEOGRAPH
+ {0xC0BF, 0x64E6}, //4899 #CJK UNIFIED IDEOGRAPH
+ {0xC0C0, 0x64EC}, //4900 #CJK UNIFIED IDEOGRAPH
+ {0xC0C1, 0x64F1}, //4901 #CJK UNIFIED IDEOGRAPH
+ {0xC0C2, 0x64E2}, //4902 #CJK UNIFIED IDEOGRAPH
+ {0xC0C3, 0x64ED}, //4903 #CJK UNIFIED IDEOGRAPH
+ {0xC0C4, 0x6582}, //4904 #CJK UNIFIED IDEOGRAPH
+ {0xC0C5, 0x6583}, //4905 #CJK UNIFIED IDEOGRAPH
+ {0xC0C6, 0x66D9}, //4906 #CJK UNIFIED IDEOGRAPH
+ {0xC0C7, 0x66D6}, //4907 #CJK UNIFIED IDEOGRAPH
+ {0xC0C8, 0x6A80}, //4908 #CJK UNIFIED IDEOGRAPH
+ {0xC0C9, 0x6A94}, //4909 #CJK UNIFIED IDEOGRAPH
+ {0xC0CA, 0x6A84}, //4910 #CJK UNIFIED IDEOGRAPH
+ {0xC0CB, 0x6AA2}, //4911 #CJK UNIFIED IDEOGRAPH
+ {0xC0CC, 0x6A9C}, //4912 #CJK UNIFIED IDEOGRAPH
+ {0xC0CD, 0x6ADB}, //4913 #CJK UNIFIED IDEOGRAPH
+ {0xC0CE, 0x6AA3}, //4914 #CJK UNIFIED IDEOGRAPH
+ {0xC0CF, 0x6A7E}, //4915 #CJK UNIFIED IDEOGRAPH
+ {0xC0D0, 0x6A97}, //4916 #CJK UNIFIED IDEOGRAPH
+ {0xC0D1, 0x6A90}, //4917 #CJK UNIFIED IDEOGRAPH
+ {0xC0D2, 0x6AA0}, //4918 #CJK UNIFIED IDEOGRAPH
+ {0xC0D3, 0x6B5C}, //4919 #CJK UNIFIED IDEOGRAPH
+ {0xC0D4, 0x6BAE}, //4920 #CJK UNIFIED IDEOGRAPH
+ {0xC0D5, 0x6BDA}, //4921 #CJK UNIFIED IDEOGRAPH
+ {0xC0D6, 0x6C08}, //4922 #CJK UNIFIED IDEOGRAPH
+ {0xC0D7, 0x6FD8}, //4923 #CJK UNIFIED IDEOGRAPH
+ {0xC0D8, 0x6FF1}, //4924 #CJK UNIFIED IDEOGRAPH
+ {0xC0D9, 0x6FDF}, //4925 #CJK UNIFIED IDEOGRAPH
+ {0xC0DA, 0x6FE0}, //4926 #CJK UNIFIED IDEOGRAPH
+ {0xC0DB, 0x6FDB}, //4927 #CJK UNIFIED IDEOGRAPH
+ {0xC0DC, 0x6FE4}, //4928 #CJK UNIFIED IDEOGRAPH
+ {0xC0DD, 0x6FEB}, //4929 #CJK UNIFIED IDEOGRAPH
+ {0xC0DE, 0x6FEF}, //4930 #CJK UNIFIED IDEOGRAPH
+ {0xC0DF, 0x6F80}, //4931 #CJK UNIFIED IDEOGRAPH
+ {0xC0E0, 0x6FEC}, //4932 #CJK UNIFIED IDEOGRAPH
+ {0xC0E1, 0x6FE1}, //4933 #CJK UNIFIED IDEOGRAPH
+ {0xC0E2, 0x6FE9}, //4934 #CJK UNIFIED IDEOGRAPH
+ {0xC0E3, 0x6FD5}, //4935 #CJK UNIFIED IDEOGRAPH
+ {0xC0E4, 0x6FEE}, //4936 #CJK UNIFIED IDEOGRAPH
+ {0xC0E5, 0x6FF0}, //4937 #CJK UNIFIED IDEOGRAPH
+ {0xC0E6, 0x71E7}, //4938 #CJK UNIFIED IDEOGRAPH
+ {0xC0E7, 0x71DF}, //4939 #CJK UNIFIED IDEOGRAPH
+ {0xC0E8, 0x71EE}, //4940 #CJK UNIFIED IDEOGRAPH
+ {0xC0E9, 0x71E6}, //4941 #CJK UNIFIED IDEOGRAPH
+ {0xC0EA, 0x71E5}, //4942 #CJK UNIFIED IDEOGRAPH
+ {0xC0EB, 0x71ED}, //4943 #CJK UNIFIED IDEOGRAPH
+ {0xC0EC, 0x71EC}, //4944 #CJK UNIFIED IDEOGRAPH
+ {0xC0ED, 0x71F4}, //4945 #CJK UNIFIED IDEOGRAPH
+ {0xC0EE, 0x71E0}, //4946 #CJK UNIFIED IDEOGRAPH
+ {0xC0EF, 0x7235}, //4947 #CJK UNIFIED IDEOGRAPH
+ {0xC0F0, 0x7246}, //4948 #CJK UNIFIED IDEOGRAPH
+ {0xC0F1, 0x7370}, //4949 #CJK UNIFIED IDEOGRAPH
+ {0xC0F2, 0x7372}, //4950 #CJK UNIFIED IDEOGRAPH
+ {0xC0F3, 0x74A9}, //4951 #CJK UNIFIED IDEOGRAPH
+ {0xC0F4, 0x74B0}, //4952 #CJK UNIFIED IDEOGRAPH
+ {0xC0F5, 0x74A6}, //4953 #CJK UNIFIED IDEOGRAPH
+ {0xC0F6, 0x74A8}, //4954 #CJK UNIFIED IDEOGRAPH
+ {0xC0F7, 0x7646}, //4955 #CJK UNIFIED IDEOGRAPH
+ {0xC0F8, 0x7642}, //4956 #CJK UNIFIED IDEOGRAPH
+ {0xC0F9, 0x764C}, //4957 #CJK UNIFIED IDEOGRAPH
+ {0xC0FA, 0x76EA}, //4958 #CJK UNIFIED IDEOGRAPH
+ {0xC0FB, 0x77B3}, //4959 #CJK UNIFIED IDEOGRAPH
+ {0xC0FC, 0x77AA}, //4960 #CJK UNIFIED IDEOGRAPH
+ {0xC0FD, 0x77B0}, //4961 #CJK UNIFIED IDEOGRAPH
+ {0xC0FE, 0x77AC}, //4962 #CJK UNIFIED IDEOGRAPH
+ {0xC140, 0x77A7}, //4963 #CJK UNIFIED IDEOGRAPH
+ {0xC141, 0x77AD}, //4964 #CJK UNIFIED IDEOGRAPH
+ {0xC142, 0x77EF}, //4965 #CJK UNIFIED IDEOGRAPH
+ {0xC143, 0x78F7}, //4966 #CJK UNIFIED IDEOGRAPH
+ {0xC144, 0x78FA}, //4967 #CJK UNIFIED IDEOGRAPH
+ {0xC145, 0x78F4}, //4968 #CJK UNIFIED IDEOGRAPH
+ {0xC146, 0x78EF}, //4969 #CJK UNIFIED IDEOGRAPH
+ {0xC147, 0x7901}, //4970 #CJK UNIFIED IDEOGRAPH
+ {0xC148, 0x79A7}, //4971 #CJK UNIFIED IDEOGRAPH
+ {0xC149, 0x79AA}, //4972 #CJK UNIFIED IDEOGRAPH
+ {0xC14A, 0x7A57}, //4973 #CJK UNIFIED IDEOGRAPH
+ {0xC14B, 0x7ABF}, //4974 #CJK UNIFIED IDEOGRAPH
+ {0xC14C, 0x7C07}, //4975 #CJK UNIFIED IDEOGRAPH
+ {0xC14D, 0x7C0D}, //4976 #CJK UNIFIED IDEOGRAPH
+ {0xC14E, 0x7BFE}, //4977 #CJK UNIFIED IDEOGRAPH
+ {0xC14F, 0x7BF7}, //4978 #CJK UNIFIED IDEOGRAPH
+ {0xC150, 0x7C0C}, //4979 #CJK UNIFIED IDEOGRAPH
+ {0xC151, 0x7BE0}, //4980 #CJK UNIFIED IDEOGRAPH
+ {0xC152, 0x7CE0}, //4981 #CJK UNIFIED IDEOGRAPH
+ {0xC153, 0x7CDC}, //4982 #CJK UNIFIED IDEOGRAPH
+ {0xC154, 0x7CDE}, //4983 #CJK UNIFIED IDEOGRAPH
+ {0xC155, 0x7CE2}, //4984 #CJK UNIFIED IDEOGRAPH
+ {0xC156, 0x7CDF}, //4985 #CJK UNIFIED IDEOGRAPH
+ {0xC157, 0x7CD9}, //4986 #CJK UNIFIED IDEOGRAPH
+ {0xC158, 0x7CDD}, //4987 #CJK UNIFIED IDEOGRAPH
+ {0xC159, 0x7E2E}, //4988 #CJK UNIFIED IDEOGRAPH
+ {0xC15A, 0x7E3E}, //4989 #CJK UNIFIED IDEOGRAPH
+ {0xC15B, 0x7E46}, //4990 #CJK UNIFIED IDEOGRAPH
+ {0xC15C, 0x7E37}, //4991 #CJK UNIFIED IDEOGRAPH
+ {0xC15D, 0x7E32}, //4992 #CJK UNIFIED IDEOGRAPH
+ {0xC15E, 0x7E43}, //4993 #CJK UNIFIED IDEOGRAPH
+ {0xC15F, 0x7E2B}, //4994 #CJK UNIFIED IDEOGRAPH
+ {0xC160, 0x7E3D}, //4995 #CJK UNIFIED IDEOGRAPH
+ {0xC161, 0x7E31}, //4996 #CJK UNIFIED IDEOGRAPH
+ {0xC162, 0x7E45}, //4997 #CJK UNIFIED IDEOGRAPH
+ {0xC163, 0x7E41}, //4998 #CJK UNIFIED IDEOGRAPH
+ {0xC164, 0x7E34}, //4999 #CJK UNIFIED IDEOGRAPH
+ {0xC165, 0x7E39}, //5000 #CJK UNIFIED IDEOGRAPH
+ {0xC166, 0x7E48}, //5001 #CJK UNIFIED IDEOGRAPH
+ {0xC167, 0x7E35}, //5002 #CJK UNIFIED IDEOGRAPH
+ {0xC168, 0x7E3F}, //5003 #CJK UNIFIED IDEOGRAPH
+ {0xC169, 0x7E2F}, //5004 #CJK UNIFIED IDEOGRAPH
+ {0xC16A, 0x7F44}, //5005 #CJK UNIFIED IDEOGRAPH
+ {0xC16B, 0x7FF3}, //5006 #CJK UNIFIED IDEOGRAPH
+ {0xC16C, 0x7FFC}, //5007 #CJK UNIFIED IDEOGRAPH
+ {0xC16D, 0x8071}, //5008 #CJK UNIFIED IDEOGRAPH
+ {0xC16E, 0x8072}, //5009 #CJK UNIFIED IDEOGRAPH
+ {0xC16F, 0x8070}, //5010 #CJK UNIFIED IDEOGRAPH
+ {0xC170, 0x806F}, //5011 #CJK UNIFIED IDEOGRAPH
+ {0xC171, 0x8073}, //5012 #CJK UNIFIED IDEOGRAPH
+ {0xC172, 0x81C6}, //5013 #CJK UNIFIED IDEOGRAPH
+ {0xC173, 0x81C3}, //5014 #CJK UNIFIED IDEOGRAPH
+ {0xC174, 0x81BA}, //5015 #CJK UNIFIED IDEOGRAPH
+ {0xC175, 0x81C2}, //5016 #CJK UNIFIED IDEOGRAPH
+ {0xC176, 0x81C0}, //5017 #CJK UNIFIED IDEOGRAPH
+ {0xC177, 0x81BF}, //5018 #CJK UNIFIED IDEOGRAPH
+ {0xC178, 0x81BD}, //5019 #CJK UNIFIED IDEOGRAPH
+ {0xC179, 0x81C9}, //5020 #CJK UNIFIED IDEOGRAPH
+ {0xC17A, 0x81BE}, //5021 #CJK UNIFIED IDEOGRAPH
+ {0xC17B, 0x81E8}, //5022 #CJK UNIFIED IDEOGRAPH
+ {0xC17C, 0x8209}, //5023 #CJK UNIFIED IDEOGRAPH
+ {0xC17D, 0x8271}, //5024 #CJK UNIFIED IDEOGRAPH
+ {0xC17E, 0x85AA}, //5025 #CJK UNIFIED IDEOGRAPH
+ {0xC1A1, 0x8584}, //5026 #CJK UNIFIED IDEOGRAPH
+ {0xC1A2, 0x857E}, //5027 #CJK UNIFIED IDEOGRAPH
+ {0xC1A3, 0x859C}, //5028 #CJK UNIFIED IDEOGRAPH
+ {0xC1A4, 0x8591}, //5029 #CJK UNIFIED IDEOGRAPH
+ {0xC1A5, 0x8594}, //5030 #CJK UNIFIED IDEOGRAPH
+ {0xC1A6, 0x85AF}, //5031 #CJK UNIFIED IDEOGRAPH
+ {0xC1A7, 0x859B}, //5032 #CJK UNIFIED IDEOGRAPH
+ {0xC1A8, 0x8587}, //5033 #CJK UNIFIED IDEOGRAPH
+ {0xC1A9, 0x85A8}, //5034 #CJK UNIFIED IDEOGRAPH
+ {0xC1AA, 0x858A}, //5035 #CJK UNIFIED IDEOGRAPH
+ {0xC1AB, 0x8667}, //5036 #CJK UNIFIED IDEOGRAPH
+ {0xC1AC, 0x87C0}, //5037 #CJK UNIFIED IDEOGRAPH
+ {0xC1AD, 0x87D1}, //5038 #CJK UNIFIED IDEOGRAPH
+ {0xC1AE, 0x87B3}, //5039 #CJK UNIFIED IDEOGRAPH
+ {0xC1AF, 0x87D2}, //5040 #CJK UNIFIED IDEOGRAPH
+ {0xC1B0, 0x87C6}, //5041 #CJK UNIFIED IDEOGRAPH
+ {0xC1B1, 0x87AB}, //5042 #CJK UNIFIED IDEOGRAPH
+ {0xC1B2, 0x87BB}, //5043 #CJK UNIFIED IDEOGRAPH
+ {0xC1B3, 0x87BA}, //5044 #CJK UNIFIED IDEOGRAPH
+ {0xC1B4, 0x87C8}, //5045 #CJK UNIFIED IDEOGRAPH
+ {0xC1B5, 0x87CB}, //5046 #CJK UNIFIED IDEOGRAPH
+ {0xC1B6, 0x893B}, //5047 #CJK UNIFIED IDEOGRAPH
+ {0xC1B7, 0x8936}, //5048 #CJK UNIFIED IDEOGRAPH
+ {0xC1B8, 0x8944}, //5049 #CJK UNIFIED IDEOGRAPH
+ {0xC1B9, 0x8938}, //5050 #CJK UNIFIED IDEOGRAPH
+ {0xC1BA, 0x893D}, //5051 #CJK UNIFIED IDEOGRAPH
+ {0xC1BB, 0x89AC}, //5052 #CJK UNIFIED IDEOGRAPH
+ {0xC1BC, 0x8B0E}, //5053 #CJK UNIFIED IDEOGRAPH
+ {0xC1BD, 0x8B17}, //5054 #CJK UNIFIED IDEOGRAPH
+ {0xC1BE, 0x8B19}, //5055 #CJK UNIFIED IDEOGRAPH
+ {0xC1BF, 0x8B1B}, //5056 #CJK UNIFIED IDEOGRAPH
+ {0xC1C0, 0x8B0A}, //5057 #CJK UNIFIED IDEOGRAPH
+ {0xC1C1, 0x8B20}, //5058 #CJK UNIFIED IDEOGRAPH
+ {0xC1C2, 0x8B1D}, //5059 #CJK UNIFIED IDEOGRAPH
+ {0xC1C3, 0x8B04}, //5060 #CJK UNIFIED IDEOGRAPH
+ {0xC1C4, 0x8B10}, //5061 #CJK UNIFIED IDEOGRAPH
+ {0xC1C5, 0x8C41}, //5062 #CJK UNIFIED IDEOGRAPH
+ {0xC1C6, 0x8C3F}, //5063 #CJK UNIFIED IDEOGRAPH
+ {0xC1C7, 0x8C73}, //5064 #CJK UNIFIED IDEOGRAPH
+ {0xC1C8, 0x8CFA}, //5065 #CJK UNIFIED IDEOGRAPH
+ {0xC1C9, 0x8CFD}, //5066 #CJK UNIFIED IDEOGRAPH
+ {0xC1CA, 0x8CFC}, //5067 #CJK UNIFIED IDEOGRAPH
+ {0xC1CB, 0x8CF8}, //5068 #CJK UNIFIED IDEOGRAPH
+ {0xC1CC, 0x8CFB}, //5069 #CJK UNIFIED IDEOGRAPH
+ {0xC1CD, 0x8DA8}, //5070 #CJK UNIFIED IDEOGRAPH
+ {0xC1CE, 0x8E49}, //5071 #CJK UNIFIED IDEOGRAPH
+ {0xC1CF, 0x8E4B}, //5072 #CJK UNIFIED IDEOGRAPH
+ {0xC1D0, 0x8E48}, //5073 #CJK UNIFIED IDEOGRAPH
+ {0xC1D1, 0x8E4A}, //5074 #CJK UNIFIED IDEOGRAPH
+ {0xC1D2, 0x8F44}, //5075 #CJK UNIFIED IDEOGRAPH
+ {0xC1D3, 0x8F3E}, //5076 #CJK UNIFIED IDEOGRAPH
+ {0xC1D4, 0x8F42}, //5077 #CJK UNIFIED IDEOGRAPH
+ {0xC1D5, 0x8F45}, //5078 #CJK UNIFIED IDEOGRAPH
+ {0xC1D6, 0x8F3F}, //5079 #CJK UNIFIED IDEOGRAPH
+ {0xC1D7, 0x907F}, //5080 #CJK UNIFIED IDEOGRAPH
+ {0xC1D8, 0x907D}, //5081 #CJK UNIFIED IDEOGRAPH
+ {0xC1D9, 0x9084}, //5082 #CJK UNIFIED IDEOGRAPH
+ {0xC1DA, 0x9081}, //5083 #CJK UNIFIED IDEOGRAPH
+ {0xC1DB, 0x9082}, //5084 #CJK UNIFIED IDEOGRAPH
+ {0xC1DC, 0x9080}, //5085 #CJK UNIFIED IDEOGRAPH
+ {0xC1DD, 0x9139}, //5086 #CJK UNIFIED IDEOGRAPH
+ {0xC1DE, 0x91A3}, //5087 #CJK UNIFIED IDEOGRAPH
+ {0xC1DF, 0x919E}, //5088 #CJK UNIFIED IDEOGRAPH
+ {0xC1E0, 0x919C}, //5089 #CJK UNIFIED IDEOGRAPH
+ {0xC1E1, 0x934D}, //5090 #CJK UNIFIED IDEOGRAPH
+ {0xC1E2, 0x9382}, //5091 #CJK UNIFIED IDEOGRAPH
+ {0xC1E3, 0x9328}, //5092 #CJK UNIFIED IDEOGRAPH
+ {0xC1E4, 0x9375}, //5093 #CJK UNIFIED IDEOGRAPH
+ {0xC1E5, 0x934A}, //5094 #CJK UNIFIED IDEOGRAPH
+ {0xC1E6, 0x9365}, //5095 #CJK UNIFIED IDEOGRAPH
+ {0xC1E7, 0x934B}, //5096 #CJK UNIFIED IDEOGRAPH
+ {0xC1E8, 0x9318}, //5097 #CJK UNIFIED IDEOGRAPH
+ {0xC1E9, 0x937E}, //5098 #CJK UNIFIED IDEOGRAPH
+ {0xC1EA, 0x936C}, //5099 #CJK UNIFIED IDEOGRAPH
+ {0xC1EB, 0x935B}, //5100 #CJK UNIFIED IDEOGRAPH
+ {0xC1EC, 0x9370}, //5101 #CJK UNIFIED IDEOGRAPH
+ {0xC1ED, 0x935A}, //5102 #CJK UNIFIED IDEOGRAPH
+ {0xC1EE, 0x9354}, //5103 #CJK UNIFIED IDEOGRAPH
+ {0xC1EF, 0x95CA}, //5104 #CJK UNIFIED IDEOGRAPH
+ {0xC1F0, 0x95CB}, //5105 #CJK UNIFIED IDEOGRAPH
+ {0xC1F1, 0x95CC}, //5106 #CJK UNIFIED IDEOGRAPH
+ {0xC1F2, 0x95C8}, //5107 #CJK UNIFIED IDEOGRAPH
+ {0xC1F3, 0x95C6}, //5108 #CJK UNIFIED IDEOGRAPH
+ {0xC1F4, 0x96B1}, //5109 #CJK UNIFIED IDEOGRAPH
+ {0xC1F5, 0x96B8}, //5110 #CJK UNIFIED IDEOGRAPH
+ {0xC1F6, 0x96D6}, //5111 #CJK UNIFIED IDEOGRAPH
+ {0xC1F7, 0x971C}, //5112 #CJK UNIFIED IDEOGRAPH
+ {0xC1F8, 0x971E}, //5113 #CJK UNIFIED IDEOGRAPH
+ {0xC1F9, 0x97A0}, //5114 #CJK UNIFIED IDEOGRAPH
+ {0xC1FA, 0x97D3}, //5115 #CJK UNIFIED IDEOGRAPH
+ {0xC1FB, 0x9846}, //5116 #CJK UNIFIED IDEOGRAPH
+ {0xC1FC, 0x98B6}, //5117 #CJK UNIFIED IDEOGRAPH
+ {0xC1FD, 0x9935}, //5118 #CJK UNIFIED IDEOGRAPH
+ {0xC1FE, 0x9A01}, //5119 #CJK UNIFIED IDEOGRAPH
+ {0xC240, 0x99FF}, //5120 #CJK UNIFIED IDEOGRAPH
+ {0xC241, 0x9BAE}, //5121 #CJK UNIFIED IDEOGRAPH
+ {0xC242, 0x9BAB}, //5122 #CJK UNIFIED IDEOGRAPH
+ {0xC243, 0x9BAA}, //5123 #CJK UNIFIED IDEOGRAPH
+ {0xC244, 0x9BAD}, //5124 #CJK UNIFIED IDEOGRAPH
+ {0xC245, 0x9D3B}, //5125 #CJK UNIFIED IDEOGRAPH
+ {0xC246, 0x9D3F}, //5126 #CJK UNIFIED IDEOGRAPH
+ {0xC247, 0x9E8B}, //5127 #CJK UNIFIED IDEOGRAPH
+ {0xC248, 0x9ECF}, //5128 #CJK UNIFIED IDEOGRAPH
+ {0xC249, 0x9EDE}, //5129 #CJK UNIFIED IDEOGRAPH
+ {0xC24A, 0x9EDC}, //5130 #CJK UNIFIED IDEOGRAPH
+ {0xC24B, 0x9EDD}, //5131 #CJK UNIFIED IDEOGRAPH
+ {0xC24C, 0x9EDB}, //5132 #CJK UNIFIED IDEOGRAPH
+ {0xC24D, 0x9F3E}, //5133 #CJK UNIFIED IDEOGRAPH
+ {0xC24E, 0x9F4B}, //5134 #CJK UNIFIED IDEOGRAPH
+ {0xC24F, 0x53E2}, //5135 #CJK UNIFIED IDEOGRAPH
+ {0xC250, 0x5695}, //5136 #CJK UNIFIED IDEOGRAPH
+ {0xC251, 0x56AE}, //5137 #CJK UNIFIED IDEOGRAPH
+ {0xC252, 0x58D9}, //5138 #CJK UNIFIED IDEOGRAPH
+ {0xC253, 0x58D8}, //5139 #CJK UNIFIED IDEOGRAPH
+ {0xC254, 0x5B38}, //5140 #CJK UNIFIED IDEOGRAPH
+ {0xC255, 0x5F5D}, //5141 #CJK UNIFIED IDEOGRAPH
+ {0xC256, 0x61E3}, //5142 #CJK UNIFIED IDEOGRAPH
+ {0xC257, 0x6233}, //5143 #CJK UNIFIED IDEOGRAPH
+ {0xC258, 0x64F4}, //5144 #CJK UNIFIED IDEOGRAPH
+ {0xC259, 0x64F2}, //5145 #CJK UNIFIED IDEOGRAPH
+ {0xC25A, 0x64FE}, //5146 #CJK UNIFIED IDEOGRAPH
+ {0xC25B, 0x6506}, //5147 #CJK UNIFIED IDEOGRAPH
+ {0xC25C, 0x64FA}, //5148 #CJK UNIFIED IDEOGRAPH
+ {0xC25D, 0x64FB}, //5149 #CJK UNIFIED IDEOGRAPH
+ {0xC25E, 0x64F7}, //5150 #CJK UNIFIED IDEOGRAPH
+ {0xC25F, 0x65B7}, //5151 #CJK UNIFIED IDEOGRAPH
+ {0xC260, 0x66DC}, //5152 #CJK UNIFIED IDEOGRAPH
+ {0xC261, 0x6726}, //5153 #CJK UNIFIED IDEOGRAPH
+ {0xC262, 0x6AB3}, //5154 #CJK UNIFIED IDEOGRAPH
+ {0xC263, 0x6AAC}, //5155 #CJK UNIFIED IDEOGRAPH
+ {0xC264, 0x6AC3}, //5156 #CJK UNIFIED IDEOGRAPH
+ {0xC265, 0x6ABB}, //5157 #CJK UNIFIED IDEOGRAPH
+ {0xC266, 0x6AB8}, //5158 #CJK UNIFIED IDEOGRAPH
+ {0xC267, 0x6AC2}, //5159 #CJK UNIFIED IDEOGRAPH
+ {0xC268, 0x6AAE}, //5160 #CJK UNIFIED IDEOGRAPH
+ {0xC269, 0x6AAF}, //5161 #CJK UNIFIED IDEOGRAPH
+ {0xC26A, 0x6B5F}, //5162 #CJK UNIFIED IDEOGRAPH
+ {0xC26B, 0x6B78}, //5163 #CJK UNIFIED IDEOGRAPH
+ {0xC26C, 0x6BAF}, //5164 #CJK UNIFIED IDEOGRAPH
+ {0xC26D, 0x7009}, //5165 #CJK UNIFIED IDEOGRAPH
+ {0xC26E, 0x700B}, //5166 #CJK UNIFIED IDEOGRAPH
+ {0xC26F, 0x6FFE}, //5167 #CJK UNIFIED IDEOGRAPH
+ {0xC270, 0x7006}, //5168 #CJK UNIFIED IDEOGRAPH
+ {0xC271, 0x6FFA}, //5169 #CJK UNIFIED IDEOGRAPH
+ {0xC272, 0x7011}, //5170 #CJK UNIFIED IDEOGRAPH
+ {0xC273, 0x700F}, //5171 #CJK UNIFIED IDEOGRAPH
+ {0xC274, 0x71FB}, //5172 #CJK UNIFIED IDEOGRAPH
+ {0xC275, 0x71FC}, //5173 #CJK UNIFIED IDEOGRAPH
+ {0xC276, 0x71FE}, //5174 #CJK UNIFIED IDEOGRAPH
+ {0xC277, 0x71F8}, //5175 #CJK UNIFIED IDEOGRAPH
+ {0xC278, 0x7377}, //5176 #CJK UNIFIED IDEOGRAPH
+ {0xC279, 0x7375}, //5177 #CJK UNIFIED IDEOGRAPH
+ {0xC27A, 0x74A7}, //5178 #CJK UNIFIED IDEOGRAPH
+ {0xC27B, 0x74BF}, //5179 #CJK UNIFIED IDEOGRAPH
+ {0xC27C, 0x7515}, //5180 #CJK UNIFIED IDEOGRAPH
+ {0xC27D, 0x7656}, //5181 #CJK UNIFIED IDEOGRAPH
+ {0xC27E, 0x7658}, //5182 #CJK UNIFIED IDEOGRAPH
+ {0xC2A1, 0x7652}, //5183 #CJK UNIFIED IDEOGRAPH
+ {0xC2A2, 0x77BD}, //5184 #CJK UNIFIED IDEOGRAPH
+ {0xC2A3, 0x77BF}, //5185 #CJK UNIFIED IDEOGRAPH
+ {0xC2A4, 0x77BB}, //5186 #CJK UNIFIED IDEOGRAPH
+ {0xC2A5, 0x77BC}, //5187 #CJK UNIFIED IDEOGRAPH
+ {0xC2A6, 0x790E}, //5188 #CJK UNIFIED IDEOGRAPH
+ {0xC2A7, 0x79AE}, //5189 #CJK UNIFIED IDEOGRAPH
+ {0xC2A8, 0x7A61}, //5190 #CJK UNIFIED IDEOGRAPH
+ {0xC2A9, 0x7A62}, //5191 #CJK UNIFIED IDEOGRAPH
+ {0xC2AA, 0x7A60}, //5192 #CJK UNIFIED IDEOGRAPH
+ {0xC2AB, 0x7AC4}, //5193 #CJK UNIFIED IDEOGRAPH
+ {0xC2AC, 0x7AC5}, //5194 #CJK UNIFIED IDEOGRAPH
+ {0xC2AD, 0x7C2B}, //5195 #CJK UNIFIED IDEOGRAPH
+ {0xC2AE, 0x7C27}, //5196 #CJK UNIFIED IDEOGRAPH
+ {0xC2AF, 0x7C2A}, //5197 #CJK UNIFIED IDEOGRAPH
+ {0xC2B0, 0x7C1E}, //5198 #CJK UNIFIED IDEOGRAPH
+ {0xC2B1, 0x7C23}, //5199 #CJK UNIFIED IDEOGRAPH
+ {0xC2B2, 0x7C21}, //5200 #CJK UNIFIED IDEOGRAPH
+ {0xC2B3, 0x7CE7}, //5201 #CJK UNIFIED IDEOGRAPH
+ {0xC2B4, 0x7E54}, //5202 #CJK UNIFIED IDEOGRAPH
+ {0xC2B5, 0x7E55}, //5203 #CJK UNIFIED IDEOGRAPH
+ {0xC2B6, 0x7E5E}, //5204 #CJK UNIFIED IDEOGRAPH
+ {0xC2B7, 0x7E5A}, //5205 #CJK UNIFIED IDEOGRAPH
+ {0xC2B8, 0x7E61}, //5206 #CJK UNIFIED IDEOGRAPH
+ {0xC2B9, 0x7E52}, //5207 #CJK UNIFIED IDEOGRAPH
+ {0xC2BA, 0x7E59}, //5208 #CJK UNIFIED IDEOGRAPH
+ {0xC2BB, 0x7F48}, //5209 #CJK UNIFIED IDEOGRAPH
+ {0xC2BC, 0x7FF9}, //5210 #CJK UNIFIED IDEOGRAPH
+ {0xC2BD, 0x7FFB}, //5211 #CJK UNIFIED IDEOGRAPH
+ {0xC2BE, 0x8077}, //5212 #CJK UNIFIED IDEOGRAPH
+ {0xC2BF, 0x8076}, //5213 #CJK UNIFIED IDEOGRAPH
+ {0xC2C0, 0x81CD}, //5214 #CJK UNIFIED IDEOGRAPH
+ {0xC2C1, 0x81CF}, //5215 #CJK UNIFIED IDEOGRAPH
+ {0xC2C2, 0x820A}, //5216 #CJK UNIFIED IDEOGRAPH
+ {0xC2C3, 0x85CF}, //5217 #CJK UNIFIED IDEOGRAPH
+ {0xC2C4, 0x85A9}, //5218 #CJK UNIFIED IDEOGRAPH
+ {0xC2C5, 0x85CD}, //5219 #CJK UNIFIED IDEOGRAPH
+ {0xC2C6, 0x85D0}, //5220 #CJK UNIFIED IDEOGRAPH
+ {0xC2C7, 0x85C9}, //5221 #CJK UNIFIED IDEOGRAPH
+ {0xC2C8, 0x85B0}, //5222 #CJK UNIFIED IDEOGRAPH
+ {0xC2C9, 0x85BA}, //5223 #CJK UNIFIED IDEOGRAPH
+ {0xC2CA, 0x85B9}, //5224 #CJK UNIFIED IDEOGRAPH
+ {0xC2CB, 0x85A6}, //5225 #CJK UNIFIED IDEOGRAPH
+ {0xC2CC, 0x87EF}, //5226 #CJK UNIFIED IDEOGRAPH
+ {0xC2CD, 0x87EC}, //5227 #CJK UNIFIED IDEOGRAPH
+ {0xC2CE, 0x87F2}, //5228 #CJK UNIFIED IDEOGRAPH
+ {0xC2CF, 0x87E0}, //5229 #CJK UNIFIED IDEOGRAPH
+ {0xC2D0, 0x8986}, //5230 #CJK UNIFIED IDEOGRAPH
+ {0xC2D1, 0x89B2}, //5231 #CJK UNIFIED IDEOGRAPH
+ {0xC2D2, 0x89F4}, //5232 #CJK UNIFIED IDEOGRAPH
+ {0xC2D3, 0x8B28}, //5233 #CJK UNIFIED IDEOGRAPH
+ {0xC2D4, 0x8B39}, //5234 #CJK UNIFIED IDEOGRAPH
+ {0xC2D5, 0x8B2C}, //5235 #CJK UNIFIED IDEOGRAPH
+ {0xC2D6, 0x8B2B}, //5236 #CJK UNIFIED IDEOGRAPH
+ {0xC2D7, 0x8C50}, //5237 #CJK UNIFIED IDEOGRAPH
+ {0xC2D8, 0x8D05}, //5238 #CJK UNIFIED IDEOGRAPH
+ {0xC2D9, 0x8E59}, //5239 #CJK UNIFIED IDEOGRAPH
+ {0xC2DA, 0x8E63}, //5240 #CJK UNIFIED IDEOGRAPH
+ {0xC2DB, 0x8E66}, //5241 #CJK UNIFIED IDEOGRAPH
+ {0xC2DC, 0x8E64}, //5242 #CJK UNIFIED IDEOGRAPH
+ {0xC2DD, 0x8E5F}, //5243 #CJK UNIFIED IDEOGRAPH
+ {0xC2DE, 0x8E55}, //5244 #CJK UNIFIED IDEOGRAPH
+ {0xC2DF, 0x8EC0}, //5245 #CJK UNIFIED IDEOGRAPH
+ {0xC2E0, 0x8F49}, //5246 #CJK UNIFIED IDEOGRAPH
+ {0xC2E1, 0x8F4D}, //5247 #CJK UNIFIED IDEOGRAPH
+ {0xC2E2, 0x9087}, //5248 #CJK UNIFIED IDEOGRAPH
+ {0xC2E3, 0x9083}, //5249 #CJK UNIFIED IDEOGRAPH
+ {0xC2E4, 0x9088}, //5250 #CJK UNIFIED IDEOGRAPH
+ {0xC2E5, 0x91AB}, //5251 #CJK UNIFIED IDEOGRAPH
+ {0xC2E6, 0x91AC}, //5252 #CJK UNIFIED IDEOGRAPH
+ {0xC2E7, 0x91D0}, //5253 #CJK UNIFIED IDEOGRAPH
+ {0xC2E8, 0x9394}, //5254 #CJK UNIFIED IDEOGRAPH
+ {0xC2E9, 0x938A}, //5255 #CJK UNIFIED IDEOGRAPH
+ {0xC2EA, 0x9396}, //5256 #CJK UNIFIED IDEOGRAPH
+ {0xC2EB, 0x93A2}, //5257 #CJK UNIFIED IDEOGRAPH
+ {0xC2EC, 0x93B3}, //5258 #CJK UNIFIED IDEOGRAPH
+ {0xC2ED, 0x93AE}, //5259 #CJK UNIFIED IDEOGRAPH
+ {0xC2EE, 0x93AC}, //5260 #CJK UNIFIED IDEOGRAPH
+ {0xC2EF, 0x93B0}, //5261 #CJK UNIFIED IDEOGRAPH
+ {0xC2F0, 0x9398}, //5262 #CJK UNIFIED IDEOGRAPH
+ {0xC2F1, 0x939A}, //5263 #CJK UNIFIED IDEOGRAPH
+ {0xC2F2, 0x9397}, //5264 #CJK UNIFIED IDEOGRAPH
+ {0xC2F3, 0x95D4}, //5265 #CJK UNIFIED IDEOGRAPH
+ {0xC2F4, 0x95D6}, //5266 #CJK UNIFIED IDEOGRAPH
+ {0xC2F5, 0x95D0}, //5267 #CJK UNIFIED IDEOGRAPH
+ {0xC2F6, 0x95D5}, //5268 #CJK UNIFIED IDEOGRAPH
+ {0xC2F7, 0x96E2}, //5269 #CJK UNIFIED IDEOGRAPH
+ {0xC2F8, 0x96DC}, //5270 #CJK UNIFIED IDEOGRAPH
+ {0xC2F9, 0x96D9}, //5271 #CJK UNIFIED IDEOGRAPH
+ {0xC2FA, 0x96DB}, //5272 #CJK UNIFIED IDEOGRAPH
+ {0xC2FB, 0x96DE}, //5273 #CJK UNIFIED IDEOGRAPH
+ {0xC2FC, 0x9724}, //5274 #CJK UNIFIED IDEOGRAPH
+ {0xC2FD, 0x97A3}, //5275 #CJK UNIFIED IDEOGRAPH
+ {0xC2FE, 0x97A6}, //5276 #CJK UNIFIED IDEOGRAPH
+ {0xC340, 0x97AD}, //5277 #CJK UNIFIED IDEOGRAPH
+ {0xC341, 0x97F9}, //5278 #CJK UNIFIED IDEOGRAPH
+ {0xC342, 0x984D}, //5279 #CJK UNIFIED IDEOGRAPH
+ {0xC343, 0x984F}, //5280 #CJK UNIFIED IDEOGRAPH
+ {0xC344, 0x984C}, //5281 #CJK UNIFIED IDEOGRAPH
+ {0xC345, 0x984E}, //5282 #CJK UNIFIED IDEOGRAPH
+ {0xC346, 0x9853}, //5283 #CJK UNIFIED IDEOGRAPH
+ {0xC347, 0x98BA}, //5284 #CJK UNIFIED IDEOGRAPH
+ {0xC348, 0x993E}, //5285 #CJK UNIFIED IDEOGRAPH
+ {0xC349, 0x993F}, //5286 #CJK UNIFIED IDEOGRAPH
+ {0xC34A, 0x993D}, //5287 #CJK UNIFIED IDEOGRAPH
+ {0xC34B, 0x992E}, //5288 #CJK UNIFIED IDEOGRAPH
+ {0xC34C, 0x99A5}, //5289 #CJK UNIFIED IDEOGRAPH
+ {0xC34D, 0x9A0E}, //5290 #CJK UNIFIED IDEOGRAPH
+ {0xC34E, 0x9AC1}, //5291 #CJK UNIFIED IDEOGRAPH
+ {0xC34F, 0x9B03}, //5292 #CJK UNIFIED IDEOGRAPH
+ {0xC350, 0x9B06}, //5293 #CJK UNIFIED IDEOGRAPH
+ {0xC351, 0x9B4F}, //5294 #CJK UNIFIED IDEOGRAPH
+ {0xC352, 0x9B4E}, //5295 #CJK UNIFIED IDEOGRAPH
+ {0xC353, 0x9B4D}, //5296 #CJK UNIFIED IDEOGRAPH
+ {0xC354, 0x9BCA}, //5297 #CJK UNIFIED IDEOGRAPH
+ {0xC355, 0x9BC9}, //5298 #CJK UNIFIED IDEOGRAPH
+ {0xC356, 0x9BFD}, //5299 #CJK UNIFIED IDEOGRAPH
+ {0xC357, 0x9BC8}, //5300 #CJK UNIFIED IDEOGRAPH
+ {0xC358, 0x9BC0}, //5301 #CJK UNIFIED IDEOGRAPH
+ {0xC359, 0x9D51}, //5302 #CJK UNIFIED IDEOGRAPH
+ {0xC35A, 0x9D5D}, //5303 #CJK UNIFIED IDEOGRAPH
+ {0xC35B, 0x9D60}, //5304 #CJK UNIFIED IDEOGRAPH
+ {0xC35C, 0x9EE0}, //5305 #CJK UNIFIED IDEOGRAPH
+ {0xC35D, 0x9F15}, //5306 #CJK UNIFIED IDEOGRAPH
+ {0xC35E, 0x9F2C}, //5307 #CJK UNIFIED IDEOGRAPH
+ {0xC35F, 0x5133}, //5308 #CJK UNIFIED IDEOGRAPH
+ {0xC360, 0x56A5}, //5309 #CJK UNIFIED IDEOGRAPH
+ {0xC361, 0x58DE}, //5310 #CJK UNIFIED IDEOGRAPH
+ {0xC362, 0x58DF}, //5311 #CJK UNIFIED IDEOGRAPH
+ {0xC363, 0x58E2}, //5312 #CJK UNIFIED IDEOGRAPH
+ {0xC364, 0x5BF5}, //5313 #CJK UNIFIED IDEOGRAPH
+ {0xC365, 0x9F90}, //5314 #CJK UNIFIED IDEOGRAPH
+ {0xC366, 0x5EEC}, //5315 #CJK UNIFIED IDEOGRAPH
+ {0xC367, 0x61F2}, //5316 #CJK UNIFIED IDEOGRAPH
+ {0xC368, 0x61F7}, //5317 #CJK UNIFIED IDEOGRAPH
+ {0xC369, 0x61F6}, //5318 #CJK UNIFIED IDEOGRAPH
+ {0xC36A, 0x61F5}, //5319 #CJK UNIFIED IDEOGRAPH
+ {0xC36B, 0x6500}, //5320 #CJK UNIFIED IDEOGRAPH
+ {0xC36C, 0x650F}, //5321 #CJK UNIFIED IDEOGRAPH
+ {0xC36D, 0x66E0}, //5322 #CJK UNIFIED IDEOGRAPH
+ {0xC36E, 0x66DD}, //5323 #CJK UNIFIED IDEOGRAPH
+ {0xC36F, 0x6AE5}, //5324 #CJK UNIFIED IDEOGRAPH
+ {0xC370, 0x6ADD}, //5325 #CJK UNIFIED IDEOGRAPH
+ {0xC371, 0x6ADA}, //5326 #CJK UNIFIED IDEOGRAPH
+ {0xC372, 0x6AD3}, //5327 #CJK UNIFIED IDEOGRAPH
+ {0xC373, 0x701B}, //5328 #CJK UNIFIED IDEOGRAPH
+ {0xC374, 0x701F}, //5329 #CJK UNIFIED IDEOGRAPH
+ {0xC375, 0x7028}, //5330 #CJK UNIFIED IDEOGRAPH
+ {0xC376, 0x701A}, //5331 #CJK UNIFIED IDEOGRAPH
+ {0xC377, 0x701D}, //5332 #CJK UNIFIED IDEOGRAPH
+ {0xC378, 0x7015}, //5333 #CJK UNIFIED IDEOGRAPH
+ {0xC379, 0x7018}, //5334 #CJK UNIFIED IDEOGRAPH
+ {0xC37A, 0x7206}, //5335 #CJK UNIFIED IDEOGRAPH
+ {0xC37B, 0x720D}, //5336 #CJK UNIFIED IDEOGRAPH
+ {0xC37C, 0x7258}, //5337 #CJK UNIFIED IDEOGRAPH
+ {0xC37D, 0x72A2}, //5338 #CJK UNIFIED IDEOGRAPH
+ {0xC37E, 0x7378}, //5339 #CJK UNIFIED IDEOGRAPH
+ {0xC3A1, 0x737A}, //5340 #CJK UNIFIED IDEOGRAPH
+ {0xC3A2, 0x74BD}, //5341 #CJK UNIFIED IDEOGRAPH
+ {0xC3A3, 0x74CA}, //5342 #CJK UNIFIED IDEOGRAPH
+ {0xC3A4, 0x74E3}, //5343 #CJK UNIFIED IDEOGRAPH
+ {0xC3A5, 0x7587}, //5344 #CJK UNIFIED IDEOGRAPH
+ {0xC3A6, 0x7586}, //5345 #CJK UNIFIED IDEOGRAPH
+ {0xC3A7, 0x765F}, //5346 #CJK UNIFIED IDEOGRAPH
+ {0xC3A8, 0x7661}, //5347 #CJK UNIFIED IDEOGRAPH
+ {0xC3A9, 0x77C7}, //5348 #CJK UNIFIED IDEOGRAPH
+ {0xC3AA, 0x7919}, //5349 #CJK UNIFIED IDEOGRAPH
+ {0xC3AB, 0x79B1}, //5350 #CJK UNIFIED IDEOGRAPH
+ {0xC3AC, 0x7A6B}, //5351 #CJK UNIFIED IDEOGRAPH
+ {0xC3AD, 0x7A69}, //5352 #CJK UNIFIED IDEOGRAPH
+ {0xC3AE, 0x7C3E}, //5353 #CJK UNIFIED IDEOGRAPH
+ {0xC3AF, 0x7C3F}, //5354 #CJK UNIFIED IDEOGRAPH
+ {0xC3B0, 0x7C38}, //5355 #CJK UNIFIED IDEOGRAPH
+ {0xC3B1, 0x7C3D}, //5356 #CJK UNIFIED IDEOGRAPH
+ {0xC3B2, 0x7C37}, //5357 #CJK UNIFIED IDEOGRAPH
+ {0xC3B3, 0x7C40}, //5358 #CJK UNIFIED IDEOGRAPH
+ {0xC3B4, 0x7E6B}, //5359 #CJK UNIFIED IDEOGRAPH
+ {0xC3B5, 0x7E6D}, //5360 #CJK UNIFIED IDEOGRAPH
+ {0xC3B6, 0x7E79}, //5361 #CJK UNIFIED IDEOGRAPH
+ {0xC3B7, 0x7E69}, //5362 #CJK UNIFIED IDEOGRAPH
+ {0xC3B8, 0x7E6A}, //5363 #CJK UNIFIED IDEOGRAPH
+ {0xC3B9, 0x7F85}, //5364 #CJK UNIFIED IDEOGRAPH
+ {0xC3BA, 0x7E73}, //5365 #CJK UNIFIED IDEOGRAPH
+ {0xC3BB, 0x7FB6}, //5366 #CJK UNIFIED IDEOGRAPH
+ {0xC3BC, 0x7FB9}, //5367 #CJK UNIFIED IDEOGRAPH
+ {0xC3BD, 0x7FB8}, //5368 #CJK UNIFIED IDEOGRAPH
+ {0xC3BE, 0x81D8}, //5369 #CJK UNIFIED IDEOGRAPH
+ {0xC3BF, 0x85E9}, //5370 #CJK UNIFIED IDEOGRAPH
+ {0xC3C0, 0x85DD}, //5371 #CJK UNIFIED IDEOGRAPH
+ {0xC3C1, 0x85EA}, //5372 #CJK UNIFIED IDEOGRAPH
+ {0xC3C2, 0x85D5}, //5373 #CJK UNIFIED IDEOGRAPH
+ {0xC3C3, 0x85E4}, //5374 #CJK UNIFIED IDEOGRAPH
+ {0xC3C4, 0x85E5}, //5375 #CJK UNIFIED IDEOGRAPH
+ {0xC3C5, 0x85F7}, //5376 #CJK UNIFIED IDEOGRAPH
+ {0xC3C6, 0x87FB}, //5377 #CJK UNIFIED IDEOGRAPH
+ {0xC3C7, 0x8805}, //5378 #CJK UNIFIED IDEOGRAPH
+ {0xC3C8, 0x880D}, //5379 #CJK UNIFIED IDEOGRAPH
+ {0xC3C9, 0x87F9}, //5380 #CJK UNIFIED IDEOGRAPH
+ {0xC3CA, 0x87FE}, //5381 #CJK UNIFIED IDEOGRAPH
+ {0xC3CB, 0x8960}, //5382 #CJK UNIFIED IDEOGRAPH
+ {0xC3CC, 0x895F}, //5383 #CJK UNIFIED IDEOGRAPH
+ {0xC3CD, 0x8956}, //5384 #CJK UNIFIED IDEOGRAPH
+ {0xC3CE, 0x895E}, //5385 #CJK UNIFIED IDEOGRAPH
+ {0xC3CF, 0x8B41}, //5386 #CJK UNIFIED IDEOGRAPH
+ {0xC3D0, 0x8B5C}, //5387 #CJK UNIFIED IDEOGRAPH
+ {0xC3D1, 0x8B58}, //5388 #CJK UNIFIED IDEOGRAPH
+ {0xC3D2, 0x8B49}, //5389 #CJK UNIFIED IDEOGRAPH
+ {0xC3D3, 0x8B5A}, //5390 #CJK UNIFIED IDEOGRAPH
+ {0xC3D4, 0x8B4E}, //5391 #CJK UNIFIED IDEOGRAPH
+ {0xC3D5, 0x8B4F}, //5392 #CJK UNIFIED IDEOGRAPH
+ {0xC3D6, 0x8B46}, //5393 #CJK UNIFIED IDEOGRAPH
+ {0xC3D7, 0x8B59}, //5394 #CJK UNIFIED IDEOGRAPH
+ {0xC3D8, 0x8D08}, //5395 #CJK UNIFIED IDEOGRAPH
+ {0xC3D9, 0x8D0A}, //5396 #CJK UNIFIED IDEOGRAPH
+ {0xC3DA, 0x8E7C}, //5397 #CJK UNIFIED IDEOGRAPH
+ {0xC3DB, 0x8E72}, //5398 #CJK UNIFIED IDEOGRAPH
+ {0xC3DC, 0x8E87}, //5399 #CJK UNIFIED IDEOGRAPH
+ {0xC3DD, 0x8E76}, //5400 #CJK UNIFIED IDEOGRAPH
+ {0xC3DE, 0x8E6C}, //5401 #CJK UNIFIED IDEOGRAPH
+ {0xC3DF, 0x8E7A}, //5402 #CJK UNIFIED IDEOGRAPH
+ {0xC3E0, 0x8E74}, //5403 #CJK UNIFIED IDEOGRAPH
+ {0xC3E1, 0x8F54}, //5404 #CJK UNIFIED IDEOGRAPH
+ {0xC3E2, 0x8F4E}, //5405 #CJK UNIFIED IDEOGRAPH
+ {0xC3E3, 0x8FAD}, //5406 #CJK UNIFIED IDEOGRAPH
+ {0xC3E4, 0x908A}, //5407 #CJK UNIFIED IDEOGRAPH
+ {0xC3E5, 0x908B}, //5408 #CJK UNIFIED IDEOGRAPH
+ {0xC3E6, 0x91B1}, //5409 #CJK UNIFIED IDEOGRAPH
+ {0xC3E7, 0x91AE}, //5410 #CJK UNIFIED IDEOGRAPH
+ {0xC3E8, 0x93E1}, //5411 #CJK UNIFIED IDEOGRAPH
+ {0xC3E9, 0x93D1}, //5412 #CJK UNIFIED IDEOGRAPH
+ {0xC3EA, 0x93DF}, //5413 #CJK UNIFIED IDEOGRAPH
+ {0xC3EB, 0x93C3}, //5414 #CJK UNIFIED IDEOGRAPH
+ {0xC3EC, 0x93C8}, //5415 #CJK UNIFIED IDEOGRAPH
+ {0xC3ED, 0x93DC}, //5416 #CJK UNIFIED IDEOGRAPH
+ {0xC3EE, 0x93DD}, //5417 #CJK UNIFIED IDEOGRAPH
+ {0xC3EF, 0x93D6}, //5418 #CJK UNIFIED IDEOGRAPH
+ {0xC3F0, 0x93E2}, //5419 #CJK UNIFIED IDEOGRAPH
+ {0xC3F1, 0x93CD}, //5420 #CJK UNIFIED IDEOGRAPH
+ {0xC3F2, 0x93D8}, //5421 #CJK UNIFIED IDEOGRAPH
+ {0xC3F3, 0x93E4}, //5422 #CJK UNIFIED IDEOGRAPH
+ {0xC3F4, 0x93D7}, //5423 #CJK UNIFIED IDEOGRAPH
+ {0xC3F5, 0x93E8}, //5424 #CJK UNIFIED IDEOGRAPH
+ {0xC3F6, 0x95DC}, //5425 #CJK UNIFIED IDEOGRAPH
+ {0xC3F7, 0x96B4}, //5426 #CJK UNIFIED IDEOGRAPH
+ {0xC3F8, 0x96E3}, //5427 #CJK UNIFIED IDEOGRAPH
+ {0xC3F9, 0x972A}, //5428 #CJK UNIFIED IDEOGRAPH
+ {0xC3FA, 0x9727}, //5429 #CJK UNIFIED IDEOGRAPH
+ {0xC3FB, 0x9761}, //5430 #CJK UNIFIED IDEOGRAPH
+ {0xC3FC, 0x97DC}, //5431 #CJK UNIFIED IDEOGRAPH
+ {0xC3FD, 0x97FB}, //5432 #CJK UNIFIED IDEOGRAPH
+ {0xC3FE, 0x985E}, //5433 #CJK UNIFIED IDEOGRAPH
+ {0xC440, 0x9858}, //5434 #CJK UNIFIED IDEOGRAPH
+ {0xC441, 0x985B}, //5435 #CJK UNIFIED IDEOGRAPH
+ {0xC442, 0x98BC}, //5436 #CJK UNIFIED IDEOGRAPH
+ {0xC443, 0x9945}, //5437 #CJK UNIFIED IDEOGRAPH
+ {0xC444, 0x9949}, //5438 #CJK UNIFIED IDEOGRAPH
+ {0xC445, 0x9A16}, //5439 #CJK UNIFIED IDEOGRAPH
+ {0xC446, 0x9A19}, //5440 #CJK UNIFIED IDEOGRAPH
+ {0xC447, 0x9B0D}, //5441 #CJK UNIFIED IDEOGRAPH
+ {0xC448, 0x9BE8}, //5442 #CJK UNIFIED IDEOGRAPH
+ {0xC449, 0x9BE7}, //5443 #CJK UNIFIED IDEOGRAPH
+ {0xC44A, 0x9BD6}, //5444 #CJK UNIFIED IDEOGRAPH
+ {0xC44B, 0x9BDB}, //5445 #CJK UNIFIED IDEOGRAPH
+ {0xC44C, 0x9D89}, //5446 #CJK UNIFIED IDEOGRAPH
+ {0xC44D, 0x9D61}, //5447 #CJK UNIFIED IDEOGRAPH
+ {0xC44E, 0x9D72}, //5448 #CJK UNIFIED IDEOGRAPH
+ {0xC44F, 0x9D6A}, //5449 #CJK UNIFIED IDEOGRAPH
+ {0xC450, 0x9D6C}, //5450 #CJK UNIFIED IDEOGRAPH
+ {0xC451, 0x9E92}, //5451 #CJK UNIFIED IDEOGRAPH
+ {0xC452, 0x9E97}, //5452 #CJK UNIFIED IDEOGRAPH
+ {0xC453, 0x9E93}, //5453 #CJK UNIFIED IDEOGRAPH
+ {0xC454, 0x9EB4}, //5454 #CJK UNIFIED IDEOGRAPH
+ {0xC455, 0x52F8}, //5455 #CJK UNIFIED IDEOGRAPH
+ {0xC456, 0x56A8}, //5456 #CJK UNIFIED IDEOGRAPH
+ {0xC457, 0x56B7}, //5457 #CJK UNIFIED IDEOGRAPH
+ {0xC458, 0x56B6}, //5458 #CJK UNIFIED IDEOGRAPH
+ {0xC459, 0x56B4}, //5459 #CJK UNIFIED IDEOGRAPH
+ {0xC45A, 0x56BC}, //5460 #CJK UNIFIED IDEOGRAPH
+ {0xC45B, 0x58E4}, //5461 #CJK UNIFIED IDEOGRAPH
+ {0xC45C, 0x5B40}, //5462 #CJK UNIFIED IDEOGRAPH
+ {0xC45D, 0x5B43}, //5463 #CJK UNIFIED IDEOGRAPH
+ {0xC45E, 0x5B7D}, //5464 #CJK UNIFIED IDEOGRAPH
+ {0xC45F, 0x5BF6}, //5465 #CJK UNIFIED IDEOGRAPH
+ {0xC460, 0x5DC9}, //5466 #CJK UNIFIED IDEOGRAPH
+ {0xC461, 0x61F8}, //5467 #CJK UNIFIED IDEOGRAPH
+ {0xC462, 0x61FA}, //5468 #CJK UNIFIED IDEOGRAPH
+ {0xC463, 0x6518}, //5469 #CJK UNIFIED IDEOGRAPH
+ {0xC464, 0x6514}, //5470 #CJK UNIFIED IDEOGRAPH
+ {0xC465, 0x6519}, //5471 #CJK UNIFIED IDEOGRAPH
+ {0xC466, 0x66E6}, //5472 #CJK UNIFIED IDEOGRAPH
+ {0xC467, 0x6727}, //5473 #CJK UNIFIED IDEOGRAPH
+ {0xC468, 0x6AEC}, //5474 #CJK UNIFIED IDEOGRAPH
+ {0xC469, 0x703E}, //5475 #CJK UNIFIED IDEOGRAPH
+ {0xC46A, 0x7030}, //5476 #CJK UNIFIED IDEOGRAPH
+ {0xC46B, 0x7032}, //5477 #CJK UNIFIED IDEOGRAPH
+ {0xC46C, 0x7210}, //5478 #CJK UNIFIED IDEOGRAPH
+ {0xC46D, 0x737B}, //5479 #CJK UNIFIED IDEOGRAPH
+ {0xC46E, 0x74CF}, //5480 #CJK UNIFIED IDEOGRAPH
+ {0xC46F, 0x7662}, //5481 #CJK UNIFIED IDEOGRAPH
+ {0xC470, 0x7665}, //5482 #CJK UNIFIED IDEOGRAPH
+ {0xC471, 0x7926}, //5483 #CJK UNIFIED IDEOGRAPH
+ {0xC472, 0x792A}, //5484 #CJK UNIFIED IDEOGRAPH
+ {0xC473, 0x792C}, //5485 #CJK UNIFIED IDEOGRAPH
+ {0xC474, 0x792B}, //5486 #CJK UNIFIED IDEOGRAPH
+ {0xC475, 0x7AC7}, //5487 #CJK UNIFIED IDEOGRAPH
+ {0xC476, 0x7AF6}, //5488 #CJK UNIFIED IDEOGRAPH
+ {0xC477, 0x7C4C}, //5489 #CJK UNIFIED IDEOGRAPH
+ {0xC478, 0x7C43}, //5490 #CJK UNIFIED IDEOGRAPH
+ {0xC479, 0x7C4D}, //5491 #CJK UNIFIED IDEOGRAPH
+ {0xC47A, 0x7CEF}, //5492 #CJK UNIFIED IDEOGRAPH
+ {0xC47B, 0x7CF0}, //5493 #CJK UNIFIED IDEOGRAPH
+ {0xC47C, 0x8FAE}, //5494 #CJK UNIFIED IDEOGRAPH
+ {0xC47D, 0x7E7D}, //5495 #CJK UNIFIED IDEOGRAPH
+ {0xC47E, 0x7E7C}, //5496 #CJK UNIFIED IDEOGRAPH
+ {0xC4A1, 0x7E82}, //5497 #CJK UNIFIED IDEOGRAPH
+ {0xC4A2, 0x7F4C}, //5498 #CJK UNIFIED IDEOGRAPH
+ {0xC4A3, 0x8000}, //5499 #CJK UNIFIED IDEOGRAPH
+ {0xC4A4, 0x81DA}, //5500 #CJK UNIFIED IDEOGRAPH
+ {0xC4A5, 0x8266}, //5501 #CJK UNIFIED IDEOGRAPH
+ {0xC4A6, 0x85FB}, //5502 #CJK UNIFIED IDEOGRAPH
+ {0xC4A7, 0x85F9}, //5503 #CJK UNIFIED IDEOGRAPH
+ {0xC4A8, 0x8611}, //5504 #CJK UNIFIED IDEOGRAPH
+ {0xC4A9, 0x85FA}, //5505 #CJK UNIFIED IDEOGRAPH
+ {0xC4AA, 0x8606}, //5506 #CJK UNIFIED IDEOGRAPH
+ {0xC4AB, 0x860B}, //5507 #CJK UNIFIED IDEOGRAPH
+ {0xC4AC, 0x8607}, //5508 #CJK UNIFIED IDEOGRAPH
+ {0xC4AD, 0x860A}, //5509 #CJK UNIFIED IDEOGRAPH
+ {0xC4AE, 0x8814}, //5510 #CJK UNIFIED IDEOGRAPH
+ {0xC4AF, 0x8815}, //5511 #CJK UNIFIED IDEOGRAPH
+ {0xC4B0, 0x8964}, //5512 #CJK UNIFIED IDEOGRAPH
+ {0xC4B1, 0x89BA}, //5513 #CJK UNIFIED IDEOGRAPH
+ {0xC4B2, 0x89F8}, //5514 #CJK UNIFIED IDEOGRAPH
+ {0xC4B3, 0x8B70}, //5515 #CJK UNIFIED IDEOGRAPH
+ {0xC4B4, 0x8B6C}, //5516 #CJK UNIFIED IDEOGRAPH
+ {0xC4B5, 0x8B66}, //5517 #CJK UNIFIED IDEOGRAPH
+ {0xC4B6, 0x8B6F}, //5518 #CJK UNIFIED IDEOGRAPH
+ {0xC4B7, 0x8B5F}, //5519 #CJK UNIFIED IDEOGRAPH
+ {0xC4B8, 0x8B6B}, //5520 #CJK UNIFIED IDEOGRAPH
+ {0xC4B9, 0x8D0F}, //5521 #CJK UNIFIED IDEOGRAPH
+ {0xC4BA, 0x8D0D}, //5522 #CJK UNIFIED IDEOGRAPH
+ {0xC4BB, 0x8E89}, //5523 #CJK UNIFIED IDEOGRAPH
+ {0xC4BC, 0x8E81}, //5524 #CJK UNIFIED IDEOGRAPH
+ {0xC4BD, 0x8E85}, //5525 #CJK UNIFIED IDEOGRAPH
+ {0xC4BE, 0x8E82}, //5526 #CJK UNIFIED IDEOGRAPH
+ {0xC4BF, 0x91B4}, //5527 #CJK UNIFIED IDEOGRAPH
+ {0xC4C0, 0x91CB}, //5528 #CJK UNIFIED IDEOGRAPH
+ {0xC4C1, 0x9418}, //5529 #CJK UNIFIED IDEOGRAPH
+ {0xC4C2, 0x9403}, //5530 #CJK UNIFIED IDEOGRAPH
+ {0xC4C3, 0x93FD}, //5531 #CJK UNIFIED IDEOGRAPH
+ {0xC4C4, 0x95E1}, //5532 #CJK UNIFIED IDEOGRAPH
+ {0xC4C5, 0x9730}, //5533 #CJK UNIFIED IDEOGRAPH
+ {0xC4C6, 0x98C4}, //5534 #CJK UNIFIED IDEOGRAPH
+ {0xC4C7, 0x9952}, //5535 #CJK UNIFIED IDEOGRAPH
+ {0xC4C8, 0x9951}, //5536 #CJK UNIFIED IDEOGRAPH
+ {0xC4C9, 0x99A8}, //5537 #CJK UNIFIED IDEOGRAPH
+ {0xC4CA, 0x9A2B}, //5538 #CJK UNIFIED IDEOGRAPH
+ {0xC4CB, 0x9A30}, //5539 #CJK UNIFIED IDEOGRAPH
+ {0xC4CC, 0x9A37}, //5540 #CJK UNIFIED IDEOGRAPH
+ {0xC4CD, 0x9A35}, //5541 #CJK UNIFIED IDEOGRAPH
+ {0xC4CE, 0x9C13}, //5542 #CJK UNIFIED IDEOGRAPH
+ {0xC4CF, 0x9C0D}, //5543 #CJK UNIFIED IDEOGRAPH
+ {0xC4D0, 0x9E79}, //5544 #CJK UNIFIED IDEOGRAPH
+ {0xC4D1, 0x9EB5}, //5545 #CJK UNIFIED IDEOGRAPH
+ {0xC4D2, 0x9EE8}, //5546 #CJK UNIFIED IDEOGRAPH
+ {0xC4D3, 0x9F2F}, //5547 #CJK UNIFIED IDEOGRAPH
+ {0xC4D4, 0x9F5F}, //5548 #CJK UNIFIED IDEOGRAPH
+ {0xC4D5, 0x9F63}, //5549 #CJK UNIFIED IDEOGRAPH
+ {0xC4D6, 0x9F61}, //5550 #CJK UNIFIED IDEOGRAPH
+ {0xC4D7, 0x5137}, //5551 #CJK UNIFIED IDEOGRAPH
+ {0xC4D8, 0x5138}, //5552 #CJK UNIFIED IDEOGRAPH
+ {0xC4D9, 0x56C1}, //5553 #CJK UNIFIED IDEOGRAPH
+ {0xC4DA, 0x56C0}, //5554 #CJK UNIFIED IDEOGRAPH
+ {0xC4DB, 0x56C2}, //5555 #CJK UNIFIED IDEOGRAPH
+ {0xC4DC, 0x5914}, //5556 #CJK UNIFIED IDEOGRAPH
+ {0xC4DD, 0x5C6C}, //5557 #CJK UNIFIED IDEOGRAPH
+ {0xC4DE, 0x5DCD}, //5558 #CJK UNIFIED IDEOGRAPH
+ {0xC4DF, 0x61FC}, //5559 #CJK UNIFIED IDEOGRAPH
+ {0xC4E0, 0x61FE}, //5560 #CJK UNIFIED IDEOGRAPH
+ {0xC4E1, 0x651D}, //5561 #CJK UNIFIED IDEOGRAPH
+ {0xC4E2, 0x651C}, //5562 #CJK UNIFIED IDEOGRAPH
+ {0xC4E3, 0x6595}, //5563 #CJK UNIFIED IDEOGRAPH
+ {0xC4E4, 0x66E9}, //5564 #CJK UNIFIED IDEOGRAPH
+ {0xC4E5, 0x6AFB}, //5565 #CJK UNIFIED IDEOGRAPH
+ {0xC4E6, 0x6B04}, //5566 #CJK UNIFIED IDEOGRAPH
+ {0xC4E7, 0x6AFA}, //5567 #CJK UNIFIED IDEOGRAPH
+ {0xC4E8, 0x6BB2}, //5568 #CJK UNIFIED IDEOGRAPH
+ {0xC4E9, 0x704C}, //5569 #CJK UNIFIED IDEOGRAPH
+ {0xC4EA, 0x721B}, //5570 #CJK UNIFIED IDEOGRAPH
+ {0xC4EB, 0x72A7}, //5571 #CJK UNIFIED IDEOGRAPH
+ {0xC4EC, 0x74D6}, //5572 #CJK UNIFIED IDEOGRAPH
+ {0xC4ED, 0x74D4}, //5573 #CJK UNIFIED IDEOGRAPH
+ {0xC4EE, 0x7669}, //5574 #CJK UNIFIED IDEOGRAPH
+ {0xC4EF, 0x77D3}, //5575 #CJK UNIFIED IDEOGRAPH
+ {0xC4F0, 0x7C50}, //5576 #CJK UNIFIED IDEOGRAPH
+ {0xC4F1, 0x7E8F}, //5577 #CJK UNIFIED IDEOGRAPH
+ {0xC4F2, 0x7E8C}, //5578 #CJK UNIFIED IDEOGRAPH
+ {0xC4F3, 0x7FBC}, //5579 #CJK UNIFIED IDEOGRAPH
+ {0xC4F4, 0x8617}, //5580 #CJK UNIFIED IDEOGRAPH
+ {0xC4F5, 0x862D}, //5581 #CJK UNIFIED IDEOGRAPH
+ {0xC4F6, 0x861A}, //5582 #CJK UNIFIED IDEOGRAPH
+ {0xC4F7, 0x8823}, //5583 #CJK UNIFIED IDEOGRAPH
+ {0xC4F8, 0x8822}, //5584 #CJK UNIFIED IDEOGRAPH
+ {0xC4F9, 0x8821}, //5585 #CJK UNIFIED IDEOGRAPH
+ {0xC4FA, 0x881F}, //5586 #CJK UNIFIED IDEOGRAPH
+ {0xC4FB, 0x896A}, //5587 #CJK UNIFIED IDEOGRAPH
+ {0xC4FC, 0x896C}, //5588 #CJK UNIFIED IDEOGRAPH
+ {0xC4FD, 0x89BD}, //5589 #CJK UNIFIED IDEOGRAPH
+ {0xC4FE, 0x8B74}, //5590 #CJK UNIFIED IDEOGRAPH
+ {0xC540, 0x8B77}, //5591 #CJK UNIFIED IDEOGRAPH
+ {0xC541, 0x8B7D}, //5592 #CJK UNIFIED IDEOGRAPH
+ {0xC542, 0x8D13}, //5593 #CJK UNIFIED IDEOGRAPH
+ {0xC543, 0x8E8A}, //5594 #CJK UNIFIED IDEOGRAPH
+ {0xC544, 0x8E8D}, //5595 #CJK UNIFIED IDEOGRAPH
+ {0xC545, 0x8E8B}, //5596 #CJK UNIFIED IDEOGRAPH
+ {0xC546, 0x8F5F}, //5597 #CJK UNIFIED IDEOGRAPH
+ {0xC547, 0x8FAF}, //5598 #CJK UNIFIED IDEOGRAPH
+ {0xC548, 0x91BA}, //5599 #CJK UNIFIED IDEOGRAPH
+ {0xC549, 0x942E}, //5600 #CJK UNIFIED IDEOGRAPH
+ {0xC54A, 0x9433}, //5601 #CJK UNIFIED IDEOGRAPH
+ {0xC54B, 0x9435}, //5602 #CJK UNIFIED IDEOGRAPH
+ {0xC54C, 0x943A}, //5603 #CJK UNIFIED IDEOGRAPH
+ {0xC54D, 0x9438}, //5604 #CJK UNIFIED IDEOGRAPH
+ {0xC54E, 0x9432}, //5605 #CJK UNIFIED IDEOGRAPH
+ {0xC54F, 0x942B}, //5606 #CJK UNIFIED IDEOGRAPH
+ {0xC550, 0x95E2}, //5607 #CJK UNIFIED IDEOGRAPH
+ {0xC551, 0x9738}, //5608 #CJK UNIFIED IDEOGRAPH
+ {0xC552, 0x9739}, //5609 #CJK UNIFIED IDEOGRAPH
+ {0xC553, 0x9732}, //5610 #CJK UNIFIED IDEOGRAPH
+ {0xC554, 0x97FF}, //5611 #CJK UNIFIED IDEOGRAPH
+ {0xC555, 0x9867}, //5612 #CJK UNIFIED IDEOGRAPH
+ {0xC556, 0x9865}, //5613 #CJK UNIFIED IDEOGRAPH
+ {0xC557, 0x9957}, //5614 #CJK UNIFIED IDEOGRAPH
+ {0xC558, 0x9A45}, //5615 #CJK UNIFIED IDEOGRAPH
+ {0xC559, 0x9A43}, //5616 #CJK UNIFIED IDEOGRAPH
+ {0xC55A, 0x9A40}, //5617 #CJK UNIFIED IDEOGRAPH
+ {0xC55B, 0x9A3E}, //5618 #CJK UNIFIED IDEOGRAPH
+ {0xC55C, 0x9ACF}, //5619 #CJK UNIFIED IDEOGRAPH
+ {0xC55D, 0x9B54}, //5620 #CJK UNIFIED IDEOGRAPH
+ {0xC55E, 0x9B51}, //5621 #CJK UNIFIED IDEOGRAPH
+ {0xC55F, 0x9C2D}, //5622 #CJK UNIFIED IDEOGRAPH
+ {0xC560, 0x9C25}, //5623 #CJK UNIFIED IDEOGRAPH
+ {0xC561, 0x9DAF}, //5624 #CJK UNIFIED IDEOGRAPH
+ {0xC562, 0x9DB4}, //5625 #CJK UNIFIED IDEOGRAPH
+ {0xC563, 0x9DC2}, //5626 #CJK UNIFIED IDEOGRAPH
+ {0xC564, 0x9DB8}, //5627 #CJK UNIFIED IDEOGRAPH
+ {0xC565, 0x9E9D}, //5628 #CJK UNIFIED IDEOGRAPH
+ {0xC566, 0x9EEF}, //5629 #CJK UNIFIED IDEOGRAPH
+ {0xC567, 0x9F19}, //5630 #CJK UNIFIED IDEOGRAPH
+ {0xC568, 0x9F5C}, //5631 #CJK UNIFIED IDEOGRAPH
+ {0xC569, 0x9F66}, //5632 #CJK UNIFIED IDEOGRAPH
+ {0xC56A, 0x9F67}, //5633 #CJK UNIFIED IDEOGRAPH
+ {0xC56B, 0x513C}, //5634 #CJK UNIFIED IDEOGRAPH
+ {0xC56C, 0x513B}, //5635 #CJK UNIFIED IDEOGRAPH
+ {0xC56D, 0x56C8}, //5636 #CJK UNIFIED IDEOGRAPH
+ {0xC56E, 0x56CA}, //5637 #CJK UNIFIED IDEOGRAPH
+ {0xC56F, 0x56C9}, //5638 #CJK UNIFIED IDEOGRAPH
+ {0xC570, 0x5B7F}, //5639 #CJK UNIFIED IDEOGRAPH
+ {0xC571, 0x5DD4}, //5640 #CJK UNIFIED IDEOGRAPH
+ {0xC572, 0x5DD2}, //5641 #CJK UNIFIED IDEOGRAPH
+ {0xC573, 0x5F4E}, //5642 #CJK UNIFIED IDEOGRAPH
+ {0xC574, 0x61FF}, //5643 #CJK UNIFIED IDEOGRAPH
+ {0xC575, 0x6524}, //5644 #CJK UNIFIED IDEOGRAPH
+ {0xC576, 0x6B0A}, //5645 #CJK UNIFIED IDEOGRAPH
+ {0xC577, 0x6B61}, //5646 #CJK UNIFIED IDEOGRAPH
+ {0xC578, 0x7051}, //5647 #CJK UNIFIED IDEOGRAPH
+ {0xC579, 0x7058}, //5648 #CJK UNIFIED IDEOGRAPH
+ {0xC57A, 0x7380}, //5649 #CJK UNIFIED IDEOGRAPH
+ {0xC57B, 0x74E4}, //5650 #CJK UNIFIED IDEOGRAPH
+ {0xC57C, 0x758A}, //5651 #CJK UNIFIED IDEOGRAPH
+ {0xC57D, 0x766E}, //5652 #CJK UNIFIED IDEOGRAPH
+ {0xC57E, 0x766C}, //5653 #CJK UNIFIED IDEOGRAPH
+ {0xC5A1, 0x79B3}, //5654 #CJK UNIFIED IDEOGRAPH
+ {0xC5A2, 0x7C60}, //5655 #CJK UNIFIED IDEOGRAPH
+ {0xC5A3, 0x7C5F}, //5656 #CJK UNIFIED IDEOGRAPH
+ {0xC5A4, 0x807E}, //5657 #CJK UNIFIED IDEOGRAPH
+ {0xC5A5, 0x807D}, //5658 #CJK UNIFIED IDEOGRAPH
+ {0xC5A6, 0x81DF}, //5659 #CJK UNIFIED IDEOGRAPH
+ {0xC5A7, 0x8972}, //5660 #CJK UNIFIED IDEOGRAPH
+ {0xC5A8, 0x896F}, //5661 #CJK UNIFIED IDEOGRAPH
+ {0xC5A9, 0x89FC}, //5662 #CJK UNIFIED IDEOGRAPH
+ {0xC5AA, 0x8B80}, //5663 #CJK UNIFIED IDEOGRAPH
+ {0xC5AB, 0x8D16}, //5664 #CJK UNIFIED IDEOGRAPH
+ {0xC5AC, 0x8D17}, //5665 #CJK UNIFIED IDEOGRAPH
+ {0xC5AD, 0x8E91}, //5666 #CJK UNIFIED IDEOGRAPH
+ {0xC5AE, 0x8E93}, //5667 #CJK UNIFIED IDEOGRAPH
+ {0xC5AF, 0x8F61}, //5668 #CJK UNIFIED IDEOGRAPH
+ {0xC5B0, 0x9148}, //5669 #CJK UNIFIED IDEOGRAPH
+ {0xC5B1, 0x9444}, //5670 #CJK UNIFIED IDEOGRAPH
+ {0xC5B2, 0x9451}, //5671 #CJK UNIFIED IDEOGRAPH
+ {0xC5B3, 0x9452}, //5672 #CJK UNIFIED IDEOGRAPH
+ {0xC5B4, 0x973D}, //5673 #CJK UNIFIED IDEOGRAPH
+ {0xC5B5, 0x973E}, //5674 #CJK UNIFIED IDEOGRAPH
+ {0xC5B6, 0x97C3}, //5675 #CJK UNIFIED IDEOGRAPH
+ {0xC5B7, 0x97C1}, //5676 #CJK UNIFIED IDEOGRAPH
+ {0xC5B8, 0x986B}, //5677 #CJK UNIFIED IDEOGRAPH
+ {0xC5B9, 0x9955}, //5678 #CJK UNIFIED IDEOGRAPH
+ {0xC5BA, 0x9A55}, //5679 #CJK UNIFIED IDEOGRAPH
+ {0xC5BB, 0x9A4D}, //5680 #CJK UNIFIED IDEOGRAPH
+ {0xC5BC, 0x9AD2}, //5681 #CJK UNIFIED IDEOGRAPH
+ {0xC5BD, 0x9B1A}, //5682 #CJK UNIFIED IDEOGRAPH
+ {0xC5BE, 0x9C49}, //5683 #CJK UNIFIED IDEOGRAPH
+ {0xC5BF, 0x9C31}, //5684 #CJK UNIFIED IDEOGRAPH
+ {0xC5C0, 0x9C3E}, //5685 #CJK UNIFIED IDEOGRAPH
+ {0xC5C1, 0x9C3B}, //5686 #CJK UNIFIED IDEOGRAPH
+ {0xC5C2, 0x9DD3}, //5687 #CJK UNIFIED IDEOGRAPH
+ {0xC5C3, 0x9DD7}, //5688 #CJK UNIFIED IDEOGRAPH
+ {0xC5C4, 0x9F34}, //5689 #CJK UNIFIED IDEOGRAPH
+ {0xC5C5, 0x9F6C}, //5690 #CJK UNIFIED IDEOGRAPH
+ {0xC5C6, 0x9F6A}, //5691 #CJK UNIFIED IDEOGRAPH
+ {0xC5C7, 0x9F94}, //5692 #CJK UNIFIED IDEOGRAPH
+ {0xC5C8, 0x56CC}, //5693 #CJK UNIFIED IDEOGRAPH
+ {0xC5C9, 0x5DD6}, //5694 #CJK UNIFIED IDEOGRAPH
+ {0xC5CA, 0x6200}, //5695 #CJK UNIFIED IDEOGRAPH
+ {0xC5CB, 0x6523}, //5696 #CJK UNIFIED IDEOGRAPH
+ {0xC5CC, 0x652B}, //5697 #CJK UNIFIED IDEOGRAPH
+ {0xC5CD, 0x652A}, //5698 #CJK UNIFIED IDEOGRAPH
+ {0xC5CE, 0x66EC}, //5699 #CJK UNIFIED IDEOGRAPH
+ {0xC5CF, 0x6B10}, //5700 #CJK UNIFIED IDEOGRAPH
+ {0xC5D0, 0x74DA}, //5701 #CJK UNIFIED IDEOGRAPH
+ {0xC5D1, 0x7ACA}, //5702 #CJK UNIFIED IDEOGRAPH
+ {0xC5D2, 0x7C64}, //5703 #CJK UNIFIED IDEOGRAPH
+ {0xC5D3, 0x7C63}, //5704 #CJK UNIFIED IDEOGRAPH
+ {0xC5D4, 0x7C65}, //5705 #CJK UNIFIED IDEOGRAPH
+ {0xC5D5, 0x7E93}, //5706 #CJK UNIFIED IDEOGRAPH
+ {0xC5D6, 0x7E96}, //5707 #CJK UNIFIED IDEOGRAPH
+ {0xC5D7, 0x7E94}, //5708 #CJK UNIFIED IDEOGRAPH
+ {0xC5D8, 0x81E2}, //5709 #CJK UNIFIED IDEOGRAPH
+ {0xC5D9, 0x8638}, //5710 #CJK UNIFIED IDEOGRAPH
+ {0xC5DA, 0x863F}, //5711 #CJK UNIFIED IDEOGRAPH
+ {0xC5DB, 0x8831}, //5712 #CJK UNIFIED IDEOGRAPH
+ {0xC5DC, 0x8B8A}, //5713 #CJK UNIFIED IDEOGRAPH
+ {0xC5DD, 0x9090}, //5714 #CJK UNIFIED IDEOGRAPH
+ {0xC5DE, 0x908F}, //5715 #CJK UNIFIED IDEOGRAPH
+ {0xC5DF, 0x9463}, //5716 #CJK UNIFIED IDEOGRAPH
+ {0xC5E0, 0x9460}, //5717 #CJK UNIFIED IDEOGRAPH
+ {0xC5E1, 0x9464}, //5718 #CJK UNIFIED IDEOGRAPH
+ {0xC5E2, 0x9768}, //5719 #CJK UNIFIED IDEOGRAPH
+ {0xC5E3, 0x986F}, //5720 #CJK UNIFIED IDEOGRAPH
+ {0xC5E4, 0x995C}, //5721 #CJK UNIFIED IDEOGRAPH
+ {0xC5E5, 0x9A5A}, //5722 #CJK UNIFIED IDEOGRAPH
+ {0xC5E6, 0x9A5B}, //5723 #CJK UNIFIED IDEOGRAPH
+ {0xC5E7, 0x9A57}, //5724 #CJK UNIFIED IDEOGRAPH
+ {0xC5E8, 0x9AD3}, //5725 #CJK UNIFIED IDEOGRAPH
+ {0xC5E9, 0x9AD4}, //5726 #CJK UNIFIED IDEOGRAPH
+ {0xC5EA, 0x9AD1}, //5727 #CJK UNIFIED IDEOGRAPH
+ {0xC5EB, 0x9C54}, //5728 #CJK UNIFIED IDEOGRAPH
+ {0xC5EC, 0x9C57}, //5729 #CJK UNIFIED IDEOGRAPH
+ {0xC5ED, 0x9C56}, //5730 #CJK UNIFIED IDEOGRAPH
+ {0xC5EE, 0x9DE5}, //5731 #CJK UNIFIED IDEOGRAPH
+ {0xC5EF, 0x9E9F}, //5732 #CJK UNIFIED IDEOGRAPH
+ {0xC5F0, 0x9EF4}, //5733 #CJK UNIFIED IDEOGRAPH
+ {0xC5F1, 0x56D1}, //5734 #CJK UNIFIED IDEOGRAPH
+ {0xC5F2, 0x58E9}, //5735 #CJK UNIFIED IDEOGRAPH
+ {0xC5F3, 0x652C}, //5736 #CJK UNIFIED IDEOGRAPH
+ {0xC5F4, 0x705E}, //5737 #CJK UNIFIED IDEOGRAPH
+ {0xC5F5, 0x7671}, //5738 #CJK UNIFIED IDEOGRAPH
+ {0xC5F6, 0x7672}, //5739 #CJK UNIFIED IDEOGRAPH
+ {0xC5F7, 0x77D7}, //5740 #CJK UNIFIED IDEOGRAPH
+ {0xC5F8, 0x7F50}, //5741 #CJK UNIFIED IDEOGRAPH
+ {0xC5F9, 0x7F88}, //5742 #CJK UNIFIED IDEOGRAPH
+ {0xC5FA, 0x8836}, //5743 #CJK UNIFIED IDEOGRAPH
+ {0xC5FB, 0x8839}, //5744 #CJK UNIFIED IDEOGRAPH
+ {0xC5FC, 0x8862}, //5745 #CJK UNIFIED IDEOGRAPH
+ {0xC5FD, 0x8B93}, //5746 #CJK UNIFIED IDEOGRAPH
+ {0xC5FE, 0x8B92}, //5747 #CJK UNIFIED IDEOGRAPH
+ {0xC640, 0x8B96}, //5748 #CJK UNIFIED IDEOGRAPH
+ {0xC641, 0x8277}, //5749 #CJK UNIFIED IDEOGRAPH
+ {0xC642, 0x8D1B}, //5750 #CJK UNIFIED IDEOGRAPH
+ {0xC643, 0x91C0}, //5751 #CJK UNIFIED IDEOGRAPH
+ {0xC644, 0x946A}, //5752 #CJK UNIFIED IDEOGRAPH
+ {0xC645, 0x9742}, //5753 #CJK UNIFIED IDEOGRAPH
+ {0xC646, 0x9748}, //5754 #CJK UNIFIED IDEOGRAPH
+ {0xC647, 0x9744}, //5755 #CJK UNIFIED IDEOGRAPH
+ {0xC648, 0x97C6}, //5756 #CJK UNIFIED IDEOGRAPH
+ {0xC649, 0x9870}, //5757 #CJK UNIFIED IDEOGRAPH
+ {0xC64A, 0x9A5F}, //5758 #CJK UNIFIED IDEOGRAPH
+ {0xC64B, 0x9B22}, //5759 #CJK UNIFIED IDEOGRAPH
+ {0xC64C, 0x9B58}, //5760 #CJK UNIFIED IDEOGRAPH
+ {0xC64D, 0x9C5F}, //5761 #CJK UNIFIED IDEOGRAPH
+ {0xC64E, 0x9DF9}, //5762 #CJK UNIFIED IDEOGRAPH
+ {0xC64F, 0x9DFA}, //5763 #CJK UNIFIED IDEOGRAPH
+ {0xC650, 0x9E7C}, //5764 #CJK UNIFIED IDEOGRAPH
+ {0xC651, 0x9E7D}, //5765 #CJK UNIFIED IDEOGRAPH
+ {0xC652, 0x9F07}, //5766 #CJK UNIFIED IDEOGRAPH
+ {0xC653, 0x9F77}, //5767 #CJK UNIFIED IDEOGRAPH
+ {0xC654, 0x9F72}, //5768 #CJK UNIFIED IDEOGRAPH
+ {0xC655, 0x5EF3}, //5769 #CJK UNIFIED IDEOGRAPH
+ {0xC656, 0x6B16}, //5770 #CJK UNIFIED IDEOGRAPH
+ {0xC657, 0x7063}, //5771 #CJK UNIFIED IDEOGRAPH
+ {0xC658, 0x7C6C}, //5772 #CJK UNIFIED IDEOGRAPH
+ {0xC659, 0x7C6E}, //5773 #CJK UNIFIED IDEOGRAPH
+ {0xC65A, 0x883B}, //5774 #CJK UNIFIED IDEOGRAPH
+ {0xC65B, 0x89C0}, //5775 #CJK UNIFIED IDEOGRAPH
+ {0xC65C, 0x8EA1}, //5776 #CJK UNIFIED IDEOGRAPH
+ {0xC65D, 0x91C1}, //5777 #CJK UNIFIED IDEOGRAPH
+ {0xC65E, 0x9472}, //5778 #CJK UNIFIED IDEOGRAPH
+ {0xC65F, 0x9470}, //5779 #CJK UNIFIED IDEOGRAPH
+ {0xC660, 0x9871}, //5780 #CJK UNIFIED IDEOGRAPH
+ {0xC661, 0x995E}, //5781 #CJK UNIFIED IDEOGRAPH
+ {0xC662, 0x9AD6}, //5782 #CJK UNIFIED IDEOGRAPH
+ {0xC663, 0x9B23}, //5783 #CJK UNIFIED IDEOGRAPH
+ {0xC664, 0x9ECC}, //5784 #CJK UNIFIED IDEOGRAPH
+ {0xC665, 0x7064}, //5785 #CJK UNIFIED IDEOGRAPH
+ {0xC666, 0x77DA}, //5786 #CJK UNIFIED IDEOGRAPH
+ {0xC667, 0x8B9A}, //5787 #CJK UNIFIED IDEOGRAPH
+ {0xC668, 0x9477}, //5788 #CJK UNIFIED IDEOGRAPH
+ {0xC669, 0x97C9}, //5789 #CJK UNIFIED IDEOGRAPH
+ {0xC66A, 0x9A62}, //5790 #CJK UNIFIED IDEOGRAPH
+ {0xC66B, 0x9A65}, //5791 #CJK UNIFIED IDEOGRAPH
+ {0xC66C, 0x7E9C}, //5792 #CJK UNIFIED IDEOGRAPH
+ {0xC66D, 0x8B9C}, //5793 #CJK UNIFIED IDEOGRAPH
+ {0xC66E, 0x8EAA}, //5794 #CJK UNIFIED IDEOGRAPH
+ {0xC66F, 0x91C5}, //5795 #CJK UNIFIED IDEOGRAPH
+ {0xC670, 0x947D}, //5796 #CJK UNIFIED IDEOGRAPH
+ {0xC671, 0x947E}, //5797 #CJK UNIFIED IDEOGRAPH
+ {0xC672, 0x947C}, //5798 #CJK UNIFIED IDEOGRAPH
+ {0xC673, 0x9C77}, //5799 #CJK UNIFIED IDEOGRAPH
+ {0xC674, 0x9C78}, //5800 #CJK UNIFIED IDEOGRAPH
+ {0xC675, 0x9EF7}, //5801 #CJK UNIFIED IDEOGRAPH
+ {0xC676, 0x8C54}, //5802 #CJK UNIFIED IDEOGRAPH
+ {0xC677, 0x947F}, //5803 #CJK UNIFIED IDEOGRAPH
+ {0xC678, 0x9E1A}, //5804 #CJK UNIFIED IDEOGRAPH
+ {0xC679, 0x7228}, //5805 #CJK UNIFIED IDEOGRAPH
+ {0xC67A, 0x9A6A}, //5806 #CJK UNIFIED IDEOGRAPH
+ {0xC67B, 0x9B31}, //5807 #CJK UNIFIED IDEOGRAPH
+ {0xC67C, 0x9E1B}, //5808 #CJK UNIFIED IDEOGRAPH
+ {0xC67D, 0x9E1E}, //5809 #CJK UNIFIED IDEOGRAPH
+ {0xC67E, 0x7C72}, //5810 #CJK UNIFIED IDEOGRAPH
+ {0xC940, 0x4E42}, //5811 #CJK UNIFIED IDEOGRAPH
+ {0xC941, 0x4E5C}, //5812 #CJK UNIFIED IDEOGRAPH
+ {0xC942, 0x51F5}, //5813 #CJK UNIFIED IDEOGRAPH
+ {0xC943, 0x531A}, //5814 #CJK UNIFIED IDEOGRAPH
+ {0xC944, 0x5382}, //5815 #CJK UNIFIED IDEOGRAPH
+ {0xC945, 0x4E07}, //5816 #CJK UNIFIED IDEOGRAPH
+ {0xC946, 0x4E0C}, //5817 #CJK UNIFIED IDEOGRAPH
+ {0xC947, 0x4E47}, //5818 #CJK UNIFIED IDEOGRAPH
+ {0xC948, 0x4E8D}, //5819 #CJK UNIFIED IDEOGRAPH
+ {0xC949, 0x56D7}, //5820 #CJK UNIFIED IDEOGRAPH
+ {0xC94A, 0xFA0C}, //5821 #CJK COMPATIBILITY IDEOGRAPH
+ {0xC94B, 0x5C6E}, //5822 #CJK UNIFIED IDEOGRAPH
+ {0xC94C, 0x5F73}, //5823 #CJK UNIFIED IDEOGRAPH
+ {0xC94D, 0x4E0F}, //5824 #CJK UNIFIED IDEOGRAPH
+ {0xC94E, 0x5187}, //5825 #CJK UNIFIED IDEOGRAPH
+ {0xC94F, 0x4E0E}, //5826 #CJK UNIFIED IDEOGRAPH
+ {0xC950, 0x4E2E}, //5827 #CJK UNIFIED IDEOGRAPH
+ {0xC951, 0x4E93}, //5828 #CJK UNIFIED IDEOGRAPH
+ {0xC952, 0x4EC2}, //5829 #CJK UNIFIED IDEOGRAPH
+ {0xC953, 0x4EC9}, //5830 #CJK UNIFIED IDEOGRAPH
+ {0xC954, 0x4EC8}, //5831 #CJK UNIFIED IDEOGRAPH
+ {0xC955, 0x5198}, //5832 #CJK UNIFIED IDEOGRAPH
+ {0xC956, 0x52FC}, //5833 #CJK UNIFIED IDEOGRAPH
+ {0xC957, 0x536C}, //5834 #CJK UNIFIED IDEOGRAPH
+ {0xC958, 0x53B9}, //5835 #CJK UNIFIED IDEOGRAPH
+ {0xC959, 0x5720}, //5836 #CJK UNIFIED IDEOGRAPH
+ {0xC95A, 0x5903}, //5837 #CJK UNIFIED IDEOGRAPH
+ {0xC95B, 0x592C}, //5838 #CJK UNIFIED IDEOGRAPH
+ {0xC95C, 0x5C10}, //5839 #CJK UNIFIED IDEOGRAPH
+ {0xC95D, 0x5DFF}, //5840 #CJK UNIFIED IDEOGRAPH
+ {0xC95E, 0x65E1}, //5841 #CJK UNIFIED IDEOGRAPH
+ {0xC95F, 0x6BB3}, //5842 #CJK UNIFIED IDEOGRAPH
+ {0xC960, 0x6BCC}, //5843 #CJK UNIFIED IDEOGRAPH
+ {0xC961, 0x6C14}, //5844 #CJK UNIFIED IDEOGRAPH
+ {0xC962, 0x723F}, //5845 #CJK UNIFIED IDEOGRAPH
+ {0xC963, 0x4E31}, //5846 #CJK UNIFIED IDEOGRAPH
+ {0xC964, 0x4E3C}, //5847 #CJK UNIFIED IDEOGRAPH
+ {0xC965, 0x4EE8}, //5848 #CJK UNIFIED IDEOGRAPH
+ {0xC966, 0x4EDC}, //5849 #CJK UNIFIED IDEOGRAPH
+ {0xC967, 0x4EE9}, //5850 #CJK UNIFIED IDEOGRAPH
+ {0xC968, 0x4EE1}, //5851 #CJK UNIFIED IDEOGRAPH
+ {0xC969, 0x4EDD}, //5852 #CJK UNIFIED IDEOGRAPH
+ {0xC96A, 0x4EDA}, //5853 #CJK UNIFIED IDEOGRAPH
+ {0xC96B, 0x520C}, //5854 #CJK UNIFIED IDEOGRAPH
+ {0xC96C, 0x531C}, //5855 #CJK UNIFIED IDEOGRAPH
+ {0xC96D, 0x534C}, //5856 #CJK UNIFIED IDEOGRAPH
+ {0xC96E, 0x5722}, //5857 #CJK UNIFIED IDEOGRAPH
+ {0xC96F, 0x5723}, //5858 #CJK UNIFIED IDEOGRAPH
+ {0xC970, 0x5917}, //5859 #CJK UNIFIED IDEOGRAPH
+ {0xC971, 0x592F}, //5860 #CJK UNIFIED IDEOGRAPH
+ {0xC972, 0x5B81}, //5861 #CJK UNIFIED IDEOGRAPH
+ {0xC973, 0x5B84}, //5862 #CJK UNIFIED IDEOGRAPH
+ {0xC974, 0x5C12}, //5863 #CJK UNIFIED IDEOGRAPH
+ {0xC975, 0x5C3B}, //5864 #CJK UNIFIED IDEOGRAPH
+ {0xC976, 0x5C74}, //5865 #CJK UNIFIED IDEOGRAPH
+ {0xC977, 0x5C73}, //5866 #CJK UNIFIED IDEOGRAPH
+ {0xC978, 0x5E04}, //5867 #CJK UNIFIED IDEOGRAPH
+ {0xC979, 0x5E80}, //5868 #CJK UNIFIED IDEOGRAPH
+ {0xC97A, 0x5E82}, //5869 #CJK UNIFIED IDEOGRAPH
+ {0xC97B, 0x5FC9}, //5870 #CJK UNIFIED IDEOGRAPH
+ {0xC97C, 0x6209}, //5871 #CJK UNIFIED IDEOGRAPH
+ {0xC97D, 0x6250}, //5872 #CJK UNIFIED IDEOGRAPH
+ {0xC97E, 0x6C15}, //5873 #CJK UNIFIED IDEOGRAPH
+ {0xC9A1, 0x6C36}, //5874 #CJK UNIFIED IDEOGRAPH
+ {0xC9A2, 0x6C43}, //5875 #CJK UNIFIED IDEOGRAPH
+ {0xC9A3, 0x6C3F}, //5876 #CJK UNIFIED IDEOGRAPH
+ {0xC9A4, 0x6C3B}, //5877 #CJK UNIFIED IDEOGRAPH
+ {0xC9A5, 0x72AE}, //5878 #CJK UNIFIED IDEOGRAPH
+ {0xC9A6, 0x72B0}, //5879 #CJK UNIFIED IDEOGRAPH
+ {0xC9A7, 0x738A}, //5880 #CJK UNIFIED IDEOGRAPH
+ {0xC9A8, 0x79B8}, //5881 #CJK UNIFIED IDEOGRAPH
+ {0xC9A9, 0x808A}, //5882 #CJK UNIFIED IDEOGRAPH
+ {0xC9AA, 0x961E}, //5883 #CJK UNIFIED IDEOGRAPH
+ {0xC9AB, 0x4F0E}, //5884 #CJK UNIFIED IDEOGRAPH
+ {0xC9AC, 0x4F18}, //5885 #CJK UNIFIED IDEOGRAPH
+ {0xC9AD, 0x4F2C}, //5886 #CJK UNIFIED IDEOGRAPH
+ {0xC9AE, 0x4EF5}, //5887 #CJK UNIFIED IDEOGRAPH
+ {0xC9AF, 0x4F14}, //5888 #CJK UNIFIED IDEOGRAPH
+ {0xC9B0, 0x4EF1}, //5889 #CJK UNIFIED IDEOGRAPH
+ {0xC9B1, 0x4F00}, //5890 #CJK UNIFIED IDEOGRAPH
+ {0xC9B2, 0x4EF7}, //5891 #CJK UNIFIED IDEOGRAPH
+ {0xC9B3, 0x4F08}, //5892 #CJK UNIFIED IDEOGRAPH
+ {0xC9B4, 0x4F1D}, //5893 #CJK UNIFIED IDEOGRAPH
+ {0xC9B5, 0x4F02}, //5894 #CJK UNIFIED IDEOGRAPH
+ {0xC9B6, 0x4F05}, //5895 #CJK UNIFIED IDEOGRAPH
+ {0xC9B7, 0x4F22}, //5896 #CJK UNIFIED IDEOGRAPH
+ {0xC9B8, 0x4F13}, //5897 #CJK UNIFIED IDEOGRAPH
+ {0xC9B9, 0x4F04}, //5898 #CJK UNIFIED IDEOGRAPH
+ {0xC9BA, 0x4EF4}, //5899 #CJK UNIFIED IDEOGRAPH
+ {0xC9BB, 0x4F12}, //5900 #CJK UNIFIED IDEOGRAPH
+ {0xC9BC, 0x51B1}, //5901 #CJK UNIFIED IDEOGRAPH
+ {0xC9BD, 0x5213}, //5902 #CJK UNIFIED IDEOGRAPH
+ {0xC9BE, 0x5209}, //5903 #CJK UNIFIED IDEOGRAPH
+ {0xC9BF, 0x5210}, //5904 #CJK UNIFIED IDEOGRAPH
+ {0xC9C0, 0x52A6}, //5905 #CJK UNIFIED IDEOGRAPH
+ {0xC9C1, 0x5322}, //5906 #CJK UNIFIED IDEOGRAPH
+ {0xC9C2, 0x531F}, //5907 #CJK UNIFIED IDEOGRAPH
+ {0xC9C3, 0x534D}, //5908 #CJK UNIFIED IDEOGRAPH
+ {0xC9C4, 0x538A}, //5909 #CJK UNIFIED IDEOGRAPH
+ {0xC9C5, 0x5407}, //5910 #CJK UNIFIED IDEOGRAPH
+ {0xC9C6, 0x56E1}, //5911 #CJK UNIFIED IDEOGRAPH
+ {0xC9C7, 0x56DF}, //5912 #CJK UNIFIED IDEOGRAPH
+ {0xC9C8, 0x572E}, //5913 #CJK UNIFIED IDEOGRAPH
+ {0xC9C9, 0x572A}, //5914 #CJK UNIFIED IDEOGRAPH
+ {0xC9CA, 0x5734}, //5915 #CJK UNIFIED IDEOGRAPH
+ {0xC9CB, 0x593C}, //5916 #CJK UNIFIED IDEOGRAPH
+ {0xC9CC, 0x5980}, //5917 #CJK UNIFIED IDEOGRAPH
+ {0xC9CD, 0x597C}, //5918 #CJK UNIFIED IDEOGRAPH
+ {0xC9CE, 0x5985}, //5919 #CJK UNIFIED IDEOGRAPH
+ {0xC9CF, 0x597B}, //5920 #CJK UNIFIED IDEOGRAPH
+ {0xC9D0, 0x597E}, //5921 #CJK UNIFIED IDEOGRAPH
+ {0xC9D1, 0x5977}, //5922 #CJK UNIFIED IDEOGRAPH
+ {0xC9D2, 0x597F}, //5923 #CJK UNIFIED IDEOGRAPH
+ {0xC9D3, 0x5B56}, //5924 #CJK UNIFIED IDEOGRAPH
+ {0xC9D4, 0x5C15}, //5925 #CJK UNIFIED IDEOGRAPH
+ {0xC9D5, 0x5C25}, //5926 #CJK UNIFIED IDEOGRAPH
+ {0xC9D6, 0x5C7C}, //5927 #CJK UNIFIED IDEOGRAPH
+ {0xC9D7, 0x5C7A}, //5928 #CJK UNIFIED IDEOGRAPH
+ {0xC9D8, 0x5C7B}, //5929 #CJK UNIFIED IDEOGRAPH
+ {0xC9D9, 0x5C7E}, //5930 #CJK UNIFIED IDEOGRAPH
+ {0xC9DA, 0x5DDF}, //5931 #CJK UNIFIED IDEOGRAPH
+ {0xC9DB, 0x5E75}, //5932 #CJK UNIFIED IDEOGRAPH
+ {0xC9DC, 0x5E84}, //5933 #CJK UNIFIED IDEOGRAPH
+ {0xC9DD, 0x5F02}, //5934 #CJK UNIFIED IDEOGRAPH
+ {0xC9DE, 0x5F1A}, //5935 #CJK UNIFIED IDEOGRAPH
+ {0xC9DF, 0x5F74}, //5936 #CJK UNIFIED IDEOGRAPH
+ {0xC9E0, 0x5FD5}, //5937 #CJK UNIFIED IDEOGRAPH
+ {0xC9E1, 0x5FD4}, //5938 #CJK UNIFIED IDEOGRAPH
+ {0xC9E2, 0x5FCF}, //5939 #CJK UNIFIED IDEOGRAPH
+ {0xC9E3, 0x625C}, //5940 #CJK UNIFIED IDEOGRAPH
+ {0xC9E4, 0x625E}, //5941 #CJK UNIFIED IDEOGRAPH
+ {0xC9E5, 0x6264}, //5942 #CJK UNIFIED IDEOGRAPH
+ {0xC9E6, 0x6261}, //5943 #CJK UNIFIED IDEOGRAPH
+ {0xC9E7, 0x6266}, //5944 #CJK UNIFIED IDEOGRAPH
+ {0xC9E8, 0x6262}, //5945 #CJK UNIFIED IDEOGRAPH
+ {0xC9E9, 0x6259}, //5946 #CJK UNIFIED IDEOGRAPH
+ {0xC9EA, 0x6260}, //5947 #CJK UNIFIED IDEOGRAPH
+ {0xC9EB, 0x625A}, //5948 #CJK UNIFIED IDEOGRAPH
+ {0xC9EC, 0x6265}, //5949 #CJK UNIFIED IDEOGRAPH
+ {0xC9ED, 0x65EF}, //5950 #CJK UNIFIED IDEOGRAPH
+ {0xC9EE, 0x65EE}, //5951 #CJK UNIFIED IDEOGRAPH
+ {0xC9EF, 0x673E}, //5952 #CJK UNIFIED IDEOGRAPH
+ {0xC9F0, 0x6739}, //5953 #CJK UNIFIED IDEOGRAPH
+ {0xC9F1, 0x6738}, //5954 #CJK UNIFIED IDEOGRAPH
+ {0xC9F2, 0x673B}, //5955 #CJK UNIFIED IDEOGRAPH
+ {0xC9F3, 0x673A}, //5956 #CJK UNIFIED IDEOGRAPH
+ {0xC9F4, 0x673F}, //5957 #CJK UNIFIED IDEOGRAPH
+ {0xC9F5, 0x673C}, //5958 #CJK UNIFIED IDEOGRAPH
+ {0xC9F6, 0x6733}, //5959 #CJK UNIFIED IDEOGRAPH
+ {0xC9F7, 0x6C18}, //5960 #CJK UNIFIED IDEOGRAPH
+ {0xC9F8, 0x6C46}, //5961 #CJK UNIFIED IDEOGRAPH
+ {0xC9F9, 0x6C52}, //5962 #CJK UNIFIED IDEOGRAPH
+ {0xC9FA, 0x6C5C}, //5963 #CJK UNIFIED IDEOGRAPH
+ {0xC9FB, 0x6C4F}, //5964 #CJK UNIFIED IDEOGRAPH
+ {0xC9FC, 0x6C4A}, //5965 #CJK UNIFIED IDEOGRAPH
+ {0xC9FD, 0x6C54}, //5966 #CJK UNIFIED IDEOGRAPH
+ {0xC9FE, 0x6C4B}, //5967 #CJK UNIFIED IDEOGRAPH
+ {0xCA40, 0x6C4C}, //5968 #CJK UNIFIED IDEOGRAPH
+ {0xCA41, 0x7071}, //5969 #CJK UNIFIED IDEOGRAPH
+ {0xCA42, 0x725E}, //5970 #CJK UNIFIED IDEOGRAPH
+ {0xCA43, 0x72B4}, //5971 #CJK UNIFIED IDEOGRAPH
+ {0xCA44, 0x72B5}, //5972 #CJK UNIFIED IDEOGRAPH
+ {0xCA45, 0x738E}, //5973 #CJK UNIFIED IDEOGRAPH
+ {0xCA46, 0x752A}, //5974 #CJK UNIFIED IDEOGRAPH
+ {0xCA47, 0x767F}, //5975 #CJK UNIFIED IDEOGRAPH
+ {0xCA48, 0x7A75}, //5976 #CJK UNIFIED IDEOGRAPH
+ {0xCA49, 0x7F51}, //5977 #CJK UNIFIED IDEOGRAPH
+ {0xCA4A, 0x8278}, //5978 #CJK UNIFIED IDEOGRAPH
+ {0xCA4B, 0x827C}, //5979 #CJK UNIFIED IDEOGRAPH
+ {0xCA4C, 0x8280}, //5980 #CJK UNIFIED IDEOGRAPH
+ {0xCA4D, 0x827D}, //5981 #CJK UNIFIED IDEOGRAPH
+ {0xCA4E, 0x827F}, //5982 #CJK UNIFIED IDEOGRAPH
+ {0xCA4F, 0x864D}, //5983 #CJK UNIFIED IDEOGRAPH
+ {0xCA50, 0x897E}, //5984 #CJK UNIFIED IDEOGRAPH
+ {0xCA51, 0x9099}, //5985 #CJK UNIFIED IDEOGRAPH
+ {0xCA52, 0x9097}, //5986 #CJK UNIFIED IDEOGRAPH
+ {0xCA53, 0x9098}, //5987 #CJK UNIFIED IDEOGRAPH
+ {0xCA54, 0x909B}, //5988 #CJK UNIFIED IDEOGRAPH
+ {0xCA55, 0x9094}, //5989 #CJK UNIFIED IDEOGRAPH
+ {0xCA56, 0x9622}, //5990 #CJK UNIFIED IDEOGRAPH
+ {0xCA57, 0x9624}, //5991 #CJK UNIFIED IDEOGRAPH
+ {0xCA58, 0x9620}, //5992 #CJK UNIFIED IDEOGRAPH
+ {0xCA59, 0x9623}, //5993 #CJK UNIFIED IDEOGRAPH
+ {0xCA5A, 0x4F56}, //5994 #CJK UNIFIED IDEOGRAPH
+ {0xCA5B, 0x4F3B}, //5995 #CJK UNIFIED IDEOGRAPH
+ {0xCA5C, 0x4F62}, //5996 #CJK UNIFIED IDEOGRAPH
+ {0xCA5D, 0x4F49}, //5997 #CJK UNIFIED IDEOGRAPH
+ {0xCA5E, 0x4F53}, //5998 #CJK UNIFIED IDEOGRAPH
+ {0xCA5F, 0x4F64}, //5999 #CJK UNIFIED IDEOGRAPH
+ {0xCA60, 0x4F3E}, //6000 #CJK UNIFIED IDEOGRAPH
+ {0xCA61, 0x4F67}, //6001 #CJK UNIFIED IDEOGRAPH
+ {0xCA62, 0x4F52}, //6002 #CJK UNIFIED IDEOGRAPH
+ {0xCA63, 0x4F5F}, //6003 #CJK UNIFIED IDEOGRAPH
+ {0xCA64, 0x4F41}, //6004 #CJK UNIFIED IDEOGRAPH
+ {0xCA65, 0x4F58}, //6005 #CJK UNIFIED IDEOGRAPH
+ {0xCA66, 0x4F2D}, //6006 #CJK UNIFIED IDEOGRAPH
+ {0xCA67, 0x4F33}, //6007 #CJK UNIFIED IDEOGRAPH
+ {0xCA68, 0x4F3F}, //6008 #CJK UNIFIED IDEOGRAPH
+ {0xCA69, 0x4F61}, //6009 #CJK UNIFIED IDEOGRAPH
+ {0xCA6A, 0x518F}, //6010 #CJK UNIFIED IDEOGRAPH
+ {0xCA6B, 0x51B9}, //6011 #CJK UNIFIED IDEOGRAPH
+ {0xCA6C, 0x521C}, //6012 #CJK UNIFIED IDEOGRAPH
+ {0xCA6D, 0x521E}, //6013 #CJK UNIFIED IDEOGRAPH
+ {0xCA6E, 0x5221}, //6014 #CJK UNIFIED IDEOGRAPH
+ {0xCA6F, 0x52AD}, //6015 #CJK UNIFIED IDEOGRAPH
+ {0xCA70, 0x52AE}, //6016 #CJK UNIFIED IDEOGRAPH
+ {0xCA71, 0x5309}, //6017 #CJK UNIFIED IDEOGRAPH
+ {0xCA72, 0x5363}, //6018 #CJK UNIFIED IDEOGRAPH
+ {0xCA73, 0x5372}, //6019 #CJK UNIFIED IDEOGRAPH
+ {0xCA74, 0x538E}, //6020 #CJK UNIFIED IDEOGRAPH
+ {0xCA75, 0x538F}, //6021 #CJK UNIFIED IDEOGRAPH
+ {0xCA76, 0x5430}, //6022 #CJK UNIFIED IDEOGRAPH
+ {0xCA77, 0x5437}, //6023 #CJK UNIFIED IDEOGRAPH
+ {0xCA78, 0x542A}, //6024 #CJK UNIFIED IDEOGRAPH
+ {0xCA79, 0x5454}, //6025 #CJK UNIFIED IDEOGRAPH
+ {0xCA7A, 0x5445}, //6026 #CJK UNIFIED IDEOGRAPH
+ {0xCA7B, 0x5419}, //6027 #CJK UNIFIED IDEOGRAPH
+ {0xCA7C, 0x541C}, //6028 #CJK UNIFIED IDEOGRAPH
+ {0xCA7D, 0x5425}, //6029 #CJK UNIFIED IDEOGRAPH
+ {0xCA7E, 0x5418}, //6030 #CJK UNIFIED IDEOGRAPH
+ {0xCAA1, 0x543D}, //6031 #CJK UNIFIED IDEOGRAPH
+ {0xCAA2, 0x544F}, //6032 #CJK UNIFIED IDEOGRAPH
+ {0xCAA3, 0x5441}, //6033 #CJK UNIFIED IDEOGRAPH
+ {0xCAA4, 0x5428}, //6034 #CJK UNIFIED IDEOGRAPH
+ {0xCAA5, 0x5424}, //6035 #CJK UNIFIED IDEOGRAPH
+ {0xCAA6, 0x5447}, //6036 #CJK UNIFIED IDEOGRAPH
+ {0xCAA7, 0x56EE}, //6037 #CJK UNIFIED IDEOGRAPH
+ {0xCAA8, 0x56E7}, //6038 #CJK UNIFIED IDEOGRAPH
+ {0xCAA9, 0x56E5}, //6039 #CJK UNIFIED IDEOGRAPH
+ {0xCAAA, 0x5741}, //6040 #CJK UNIFIED IDEOGRAPH
+ {0xCAAB, 0x5745}, //6041 #CJK UNIFIED IDEOGRAPH
+ {0xCAAC, 0x574C}, //6042 #CJK UNIFIED IDEOGRAPH
+ {0xCAAD, 0x5749}, //6043 #CJK UNIFIED IDEOGRAPH
+ {0xCAAE, 0x574B}, //6044 #CJK UNIFIED IDEOGRAPH
+ {0xCAAF, 0x5752}, //6045 #CJK UNIFIED IDEOGRAPH
+ {0xCAB0, 0x5906}, //6046 #CJK UNIFIED IDEOGRAPH
+ {0xCAB1, 0x5940}, //6047 #CJK UNIFIED IDEOGRAPH
+ {0xCAB2, 0x59A6}, //6048 #CJK UNIFIED IDEOGRAPH
+ {0xCAB3, 0x5998}, //6049 #CJK UNIFIED IDEOGRAPH
+ {0xCAB4, 0x59A0}, //6050 #CJK UNIFIED IDEOGRAPH
+ {0xCAB5, 0x5997}, //6051 #CJK UNIFIED IDEOGRAPH
+ {0xCAB6, 0x598E}, //6052 #CJK UNIFIED IDEOGRAPH
+ {0xCAB7, 0x59A2}, //6053 #CJK UNIFIED IDEOGRAPH
+ {0xCAB8, 0x5990}, //6054 #CJK UNIFIED IDEOGRAPH
+ {0xCAB9, 0x598F}, //6055 #CJK UNIFIED IDEOGRAPH
+ {0xCABA, 0x59A7}, //6056 #CJK UNIFIED IDEOGRAPH
+ {0xCABB, 0x59A1}, //6057 #CJK UNIFIED IDEOGRAPH
+ {0xCABC, 0x5B8E}, //6058 #CJK UNIFIED IDEOGRAPH
+ {0xCABD, 0x5B92}, //6059 #CJK UNIFIED IDEOGRAPH
+ {0xCABE, 0x5C28}, //6060 #CJK UNIFIED IDEOGRAPH
+ {0xCABF, 0x5C2A}, //6061 #CJK UNIFIED IDEOGRAPH
+ {0xCAC0, 0x5C8D}, //6062 #CJK UNIFIED IDEOGRAPH
+ {0xCAC1, 0x5C8F}, //6063 #CJK UNIFIED IDEOGRAPH
+ {0xCAC2, 0x5C88}, //6064 #CJK UNIFIED IDEOGRAPH
+ {0xCAC3, 0x5C8B}, //6065 #CJK UNIFIED IDEOGRAPH
+ {0xCAC4, 0x5C89}, //6066 #CJK UNIFIED IDEOGRAPH
+ {0xCAC5, 0x5C92}, //6067 #CJK UNIFIED IDEOGRAPH
+ {0xCAC6, 0x5C8A}, //6068 #CJK UNIFIED IDEOGRAPH
+ {0xCAC7, 0x5C86}, //6069 #CJK UNIFIED IDEOGRAPH
+ {0xCAC8, 0x5C93}, //6070 #CJK UNIFIED IDEOGRAPH
+ {0xCAC9, 0x5C95}, //6071 #CJK UNIFIED IDEOGRAPH
+ {0xCACA, 0x5DE0}, //6072 #CJK UNIFIED IDEOGRAPH
+ {0xCACB, 0x5E0A}, //6073 #CJK UNIFIED IDEOGRAPH
+ {0xCACC, 0x5E0E}, //6074 #CJK UNIFIED IDEOGRAPH
+ {0xCACD, 0x5E8B}, //6075 #CJK UNIFIED IDEOGRAPH
+ {0xCACE, 0x5E89}, //6076 #CJK UNIFIED IDEOGRAPH
+ {0xCACF, 0x5E8C}, //6077 #CJK UNIFIED IDEOGRAPH
+ {0xCAD0, 0x5E88}, //6078 #CJK UNIFIED IDEOGRAPH
+ {0xCAD1, 0x5E8D}, //6079 #CJK UNIFIED IDEOGRAPH
+ {0xCAD2, 0x5F05}, //6080 #CJK UNIFIED IDEOGRAPH
+ {0xCAD3, 0x5F1D}, //6081 #CJK UNIFIED IDEOGRAPH
+ {0xCAD4, 0x5F78}, //6082 #CJK UNIFIED IDEOGRAPH
+ {0xCAD5, 0x5F76}, //6083 #CJK UNIFIED IDEOGRAPH
+ {0xCAD6, 0x5FD2}, //6084 #CJK UNIFIED IDEOGRAPH
+ {0xCAD7, 0x5FD1}, //6085 #CJK UNIFIED IDEOGRAPH
+ {0xCAD8, 0x5FD0}, //6086 #CJK UNIFIED IDEOGRAPH
+ {0xCAD9, 0x5FED}, //6087 #CJK UNIFIED IDEOGRAPH
+ {0xCADA, 0x5FE8}, //6088 #CJK UNIFIED IDEOGRAPH
+ {0xCADB, 0x5FEE}, //6089 #CJK UNIFIED IDEOGRAPH
+ {0xCADC, 0x5FF3}, //6090 #CJK UNIFIED IDEOGRAPH
+ {0xCADD, 0x5FE1}, //6091 #CJK UNIFIED IDEOGRAPH
+ {0xCADE, 0x5FE4}, //6092 #CJK UNIFIED IDEOGRAPH
+ {0xCADF, 0x5FE3}, //6093 #CJK UNIFIED IDEOGRAPH
+ {0xCAE0, 0x5FFA}, //6094 #CJK UNIFIED IDEOGRAPH
+ {0xCAE1, 0x5FEF}, //6095 #CJK UNIFIED IDEOGRAPH
+ {0xCAE2, 0x5FF7}, //6096 #CJK UNIFIED IDEOGRAPH
+ {0xCAE3, 0x5FFB}, //6097 #CJK UNIFIED IDEOGRAPH
+ {0xCAE4, 0x6000}, //6098 #CJK UNIFIED IDEOGRAPH
+ {0xCAE5, 0x5FF4}, //6099 #CJK UNIFIED IDEOGRAPH
+ {0xCAE6, 0x623A}, //6100 #CJK UNIFIED IDEOGRAPH
+ {0xCAE7, 0x6283}, //6101 #CJK UNIFIED IDEOGRAPH
+ {0xCAE8, 0x628C}, //6102 #CJK UNIFIED IDEOGRAPH
+ {0xCAE9, 0x628E}, //6103 #CJK UNIFIED IDEOGRAPH
+ {0xCAEA, 0x628F}, //6104 #CJK UNIFIED IDEOGRAPH
+ {0xCAEB, 0x6294}, //6105 #CJK UNIFIED IDEOGRAPH
+ {0xCAEC, 0x6287}, //6106 #CJK UNIFIED IDEOGRAPH
+ {0xCAED, 0x6271}, //6107 #CJK UNIFIED IDEOGRAPH
+ {0xCAEE, 0x627B}, //6108 #CJK UNIFIED IDEOGRAPH
+ {0xCAEF, 0x627A}, //6109 #CJK UNIFIED IDEOGRAPH
+ {0xCAF0, 0x6270}, //6110 #CJK UNIFIED IDEOGRAPH
+ {0xCAF1, 0x6281}, //6111 #CJK UNIFIED IDEOGRAPH
+ {0xCAF2, 0x6288}, //6112 #CJK UNIFIED IDEOGRAPH
+ {0xCAF3, 0x6277}, //6113 #CJK UNIFIED IDEOGRAPH
+ {0xCAF4, 0x627D}, //6114 #CJK UNIFIED IDEOGRAPH
+ {0xCAF5, 0x6272}, //6115 #CJK UNIFIED IDEOGRAPH
+ {0xCAF6, 0x6274}, //6116 #CJK UNIFIED IDEOGRAPH
+ {0xCAF7, 0x6537}, //6117 #CJK UNIFIED IDEOGRAPH
+ {0xCAF8, 0x65F0}, //6118 #CJK UNIFIED IDEOGRAPH
+ {0xCAF9, 0x65F4}, //6119 #CJK UNIFIED IDEOGRAPH
+ {0xCAFA, 0x65F3}, //6120 #CJK UNIFIED IDEOGRAPH
+ {0xCAFB, 0x65F2}, //6121 #CJK UNIFIED IDEOGRAPH
+ {0xCAFC, 0x65F5}, //6122 #CJK UNIFIED IDEOGRAPH
+ {0xCAFD, 0x6745}, //6123 #CJK UNIFIED IDEOGRAPH
+ {0xCAFE, 0x6747}, //6124 #CJK UNIFIED IDEOGRAPH
+ {0xCB40, 0x6759}, //6125 #CJK UNIFIED IDEOGRAPH
+ {0xCB41, 0x6755}, //6126 #CJK UNIFIED IDEOGRAPH
+ {0xCB42, 0x674C}, //6127 #CJK UNIFIED IDEOGRAPH
+ {0xCB43, 0x6748}, //6128 #CJK UNIFIED IDEOGRAPH
+ {0xCB44, 0x675D}, //6129 #CJK UNIFIED IDEOGRAPH
+ {0xCB45, 0x674D}, //6130 #CJK UNIFIED IDEOGRAPH
+ {0xCB46, 0x675A}, //6131 #CJK UNIFIED IDEOGRAPH
+ {0xCB47, 0x674B}, //6132 #CJK UNIFIED IDEOGRAPH
+ {0xCB48, 0x6BD0}, //6133 #CJK UNIFIED IDEOGRAPH
+ {0xCB49, 0x6C19}, //6134 #CJK UNIFIED IDEOGRAPH
+ {0xCB4A, 0x6C1A}, //6135 #CJK UNIFIED IDEOGRAPH
+ {0xCB4B, 0x6C78}, //6136 #CJK UNIFIED IDEOGRAPH
+ {0xCB4C, 0x6C67}, //6137 #CJK UNIFIED IDEOGRAPH
+ {0xCB4D, 0x6C6B}, //6138 #CJK UNIFIED IDEOGRAPH
+ {0xCB4E, 0x6C84}, //6139 #CJK UNIFIED IDEOGRAPH
+ {0xCB4F, 0x6C8B}, //6140 #CJK UNIFIED IDEOGRAPH
+ {0xCB50, 0x6C8F}, //6141 #CJK UNIFIED IDEOGRAPH
+ {0xCB51, 0x6C71}, //6142 #CJK UNIFIED IDEOGRAPH
+ {0xCB52, 0x6C6F}, //6143 #CJK UNIFIED IDEOGRAPH
+ {0xCB53, 0x6C69}, //6144 #CJK UNIFIED IDEOGRAPH
+ {0xCB54, 0x6C9A}, //6145 #CJK UNIFIED IDEOGRAPH
+ {0xCB55, 0x6C6D}, //6146 #CJK UNIFIED IDEOGRAPH
+ {0xCB56, 0x6C87}, //6147 #CJK UNIFIED IDEOGRAPH
+ {0xCB57, 0x6C95}, //6148 #CJK UNIFIED IDEOGRAPH
+ {0xCB58, 0x6C9C}, //6149 #CJK UNIFIED IDEOGRAPH
+ {0xCB59, 0x6C66}, //6150 #CJK UNIFIED IDEOGRAPH
+ {0xCB5A, 0x6C73}, //6151 #CJK UNIFIED IDEOGRAPH
+ {0xCB5B, 0x6C65}, //6152 #CJK UNIFIED IDEOGRAPH
+ {0xCB5C, 0x6C7B}, //6153 #CJK UNIFIED IDEOGRAPH
+ {0xCB5D, 0x6C8E}, //6154 #CJK UNIFIED IDEOGRAPH
+ {0xCB5E, 0x7074}, //6155 #CJK UNIFIED IDEOGRAPH
+ {0xCB5F, 0x707A}, //6156 #CJK UNIFIED IDEOGRAPH
+ {0xCB60, 0x7263}, //6157 #CJK UNIFIED IDEOGRAPH
+ {0xCB61, 0x72BF}, //6158 #CJK UNIFIED IDEOGRAPH
+ {0xCB62, 0x72BD}, //6159 #CJK UNIFIED IDEOGRAPH
+ {0xCB63, 0x72C3}, //6160 #CJK UNIFIED IDEOGRAPH
+ {0xCB64, 0x72C6}, //6161 #CJK UNIFIED IDEOGRAPH
+ {0xCB65, 0x72C1}, //6162 #CJK UNIFIED IDEOGRAPH
+ {0xCB66, 0x72BA}, //6163 #CJK UNIFIED IDEOGRAPH
+ {0xCB67, 0x72C5}, //6164 #CJK UNIFIED IDEOGRAPH
+ {0xCB68, 0x7395}, //6165 #CJK UNIFIED IDEOGRAPH
+ {0xCB69, 0x7397}, //6166 #CJK UNIFIED IDEOGRAPH
+ {0xCB6A, 0x7393}, //6167 #CJK UNIFIED IDEOGRAPH
+ {0xCB6B, 0x7394}, //6168 #CJK UNIFIED IDEOGRAPH
+ {0xCB6C, 0x7392}, //6169 #CJK UNIFIED IDEOGRAPH
+ {0xCB6D, 0x753A}, //6170 #CJK UNIFIED IDEOGRAPH
+ {0xCB6E, 0x7539}, //6171 #CJK UNIFIED IDEOGRAPH
+ {0xCB6F, 0x7594}, //6172 #CJK UNIFIED IDEOGRAPH
+ {0xCB70, 0x7595}, //6173 #CJK UNIFIED IDEOGRAPH
+ {0xCB71, 0x7681}, //6174 #CJK UNIFIED IDEOGRAPH
+ {0xCB72, 0x793D}, //6175 #CJK UNIFIED IDEOGRAPH
+ {0xCB73, 0x8034}, //6176 #CJK UNIFIED IDEOGRAPH
+ {0xCB74, 0x8095}, //6177 #CJK UNIFIED IDEOGRAPH
+ {0xCB75, 0x8099}, //6178 #CJK UNIFIED IDEOGRAPH
+ {0xCB76, 0x8090}, //6179 #CJK UNIFIED IDEOGRAPH
+ {0xCB77, 0x8092}, //6180 #CJK UNIFIED IDEOGRAPH
+ {0xCB78, 0x809C}, //6181 #CJK UNIFIED IDEOGRAPH
+ {0xCB79, 0x8290}, //6182 #CJK UNIFIED IDEOGRAPH
+ {0xCB7A, 0x828F}, //6183 #CJK UNIFIED IDEOGRAPH
+ {0xCB7B, 0x8285}, //6184 #CJK UNIFIED IDEOGRAPH
+ {0xCB7C, 0x828E}, //6185 #CJK UNIFIED IDEOGRAPH
+ {0xCB7D, 0x8291}, //6186 #CJK UNIFIED IDEOGRAPH
+ {0xCB7E, 0x8293}, //6187 #CJK UNIFIED IDEOGRAPH
+ {0xCBA1, 0x828A}, //6188 #CJK UNIFIED IDEOGRAPH
+ {0xCBA2, 0x8283}, //6189 #CJK UNIFIED IDEOGRAPH
+ {0xCBA3, 0x8284}, //6190 #CJK UNIFIED IDEOGRAPH
+ {0xCBA4, 0x8C78}, //6191 #CJK UNIFIED IDEOGRAPH
+ {0xCBA5, 0x8FC9}, //6192 #CJK UNIFIED IDEOGRAPH
+ {0xCBA6, 0x8FBF}, //6193 #CJK UNIFIED IDEOGRAPH
+ {0xCBA7, 0x909F}, //6194 #CJK UNIFIED IDEOGRAPH
+ {0xCBA8, 0x90A1}, //6195 #CJK UNIFIED IDEOGRAPH
+ {0xCBA9, 0x90A5}, //6196 #CJK UNIFIED IDEOGRAPH
+ {0xCBAA, 0x909E}, //6197 #CJK UNIFIED IDEOGRAPH
+ {0xCBAB, 0x90A7}, //6198 #CJK UNIFIED IDEOGRAPH
+ {0xCBAC, 0x90A0}, //6199 #CJK UNIFIED IDEOGRAPH
+ {0xCBAD, 0x9630}, //6200 #CJK UNIFIED IDEOGRAPH
+ {0xCBAE, 0x9628}, //6201 #CJK UNIFIED IDEOGRAPH
+ {0xCBAF, 0x962F}, //6202 #CJK UNIFIED IDEOGRAPH
+ {0xCBB0, 0x962D}, //6203 #CJK UNIFIED IDEOGRAPH
+ {0xCBB1, 0x4E33}, //6204 #CJK UNIFIED IDEOGRAPH
+ {0xCBB2, 0x4F98}, //6205 #CJK UNIFIED IDEOGRAPH
+ {0xCBB3, 0x4F7C}, //6206 #CJK UNIFIED IDEOGRAPH
+ {0xCBB4, 0x4F85}, //6207 #CJK UNIFIED IDEOGRAPH
+ {0xCBB5, 0x4F7D}, //6208 #CJK UNIFIED IDEOGRAPH
+ {0xCBB6, 0x4F80}, //6209 #CJK UNIFIED IDEOGRAPH
+ {0xCBB7, 0x4F87}, //6210 #CJK UNIFIED IDEOGRAPH
+ {0xCBB8, 0x4F76}, //6211 #CJK UNIFIED IDEOGRAPH
+ {0xCBB9, 0x4F74}, //6212 #CJK UNIFIED IDEOGRAPH
+ {0xCBBA, 0x4F89}, //6213 #CJK UNIFIED IDEOGRAPH
+ {0xCBBB, 0x4F84}, //6214 #CJK UNIFIED IDEOGRAPH
+ {0xCBBC, 0x4F77}, //6215 #CJK UNIFIED IDEOGRAPH
+ {0xCBBD, 0x4F4C}, //6216 #CJK UNIFIED IDEOGRAPH
+ {0xCBBE, 0x4F97}, //6217 #CJK UNIFIED IDEOGRAPH
+ {0xCBBF, 0x4F6A}, //6218 #CJK UNIFIED IDEOGRAPH
+ {0xCBC0, 0x4F9A}, //6219 #CJK UNIFIED IDEOGRAPH
+ {0xCBC1, 0x4F79}, //6220 #CJK UNIFIED IDEOGRAPH
+ {0xCBC2, 0x4F81}, //6221 #CJK UNIFIED IDEOGRAPH
+ {0xCBC3, 0x4F78}, //6222 #CJK UNIFIED IDEOGRAPH
+ {0xCBC4, 0x4F90}, //6223 #CJK UNIFIED IDEOGRAPH
+ {0xCBC5, 0x4F9C}, //6224 #CJK UNIFIED IDEOGRAPH
+ {0xCBC6, 0x4F94}, //6225 #CJK UNIFIED IDEOGRAPH
+ {0xCBC7, 0x4F9E}, //6226 #CJK UNIFIED IDEOGRAPH
+ {0xCBC8, 0x4F92}, //6227 #CJK UNIFIED IDEOGRAPH
+ {0xCBC9, 0x4F82}, //6228 #CJK UNIFIED IDEOGRAPH
+ {0xCBCA, 0x4F95}, //6229 #CJK UNIFIED IDEOGRAPH
+ {0xCBCB, 0x4F6B}, //6230 #CJK UNIFIED IDEOGRAPH
+ {0xCBCC, 0x4F6E}, //6231 #CJK UNIFIED IDEOGRAPH
+ {0xCBCD, 0x519E}, //6232 #CJK UNIFIED IDEOGRAPH
+ {0xCBCE, 0x51BC}, //6233 #CJK UNIFIED IDEOGRAPH
+ {0xCBCF, 0x51BE}, //6234 #CJK UNIFIED IDEOGRAPH
+ {0xCBD0, 0x5235}, //6235 #CJK UNIFIED IDEOGRAPH
+ {0xCBD1, 0x5232}, //6236 #CJK UNIFIED IDEOGRAPH
+ {0xCBD2, 0x5233}, //6237 #CJK UNIFIED IDEOGRAPH
+ {0xCBD3, 0x5246}, //6238 #CJK UNIFIED IDEOGRAPH
+ {0xCBD4, 0x5231}, //6239 #CJK UNIFIED IDEOGRAPH
+ {0xCBD5, 0x52BC}, //6240 #CJK UNIFIED IDEOGRAPH
+ {0xCBD6, 0x530A}, //6241 #CJK UNIFIED IDEOGRAPH
+ {0xCBD7, 0x530B}, //6242 #CJK UNIFIED IDEOGRAPH
+ {0xCBD8, 0x533C}, //6243 #CJK UNIFIED IDEOGRAPH
+ {0xCBD9, 0x5392}, //6244 #CJK UNIFIED IDEOGRAPH
+ {0xCBDA, 0x5394}, //6245 #CJK UNIFIED IDEOGRAPH
+ {0xCBDB, 0x5487}, //6246 #CJK UNIFIED IDEOGRAPH
+ {0xCBDC, 0x547F}, //6247 #CJK UNIFIED IDEOGRAPH
+ {0xCBDD, 0x5481}, //6248 #CJK UNIFIED IDEOGRAPH
+ {0xCBDE, 0x5491}, //6249 #CJK UNIFIED IDEOGRAPH
+ {0xCBDF, 0x5482}, //6250 #CJK UNIFIED IDEOGRAPH
+ {0xCBE0, 0x5488}, //6251 #CJK UNIFIED IDEOGRAPH
+ {0xCBE1, 0x546B}, //6252 #CJK UNIFIED IDEOGRAPH
+ {0xCBE2, 0x547A}, //6253 #CJK UNIFIED IDEOGRAPH
+ {0xCBE3, 0x547E}, //6254 #CJK UNIFIED IDEOGRAPH
+ {0xCBE4, 0x5465}, //6255 #CJK UNIFIED IDEOGRAPH
+ {0xCBE5, 0x546C}, //6256 #CJK UNIFIED IDEOGRAPH
+ {0xCBE6, 0x5474}, //6257 #CJK UNIFIED IDEOGRAPH
+ {0xCBE7, 0x5466}, //6258 #CJK UNIFIED IDEOGRAPH
+ {0xCBE8, 0x548D}, //6259 #CJK UNIFIED IDEOGRAPH
+ {0xCBE9, 0x546F}, //6260 #CJK UNIFIED IDEOGRAPH
+ {0xCBEA, 0x5461}, //6261 #CJK UNIFIED IDEOGRAPH
+ {0xCBEB, 0x5460}, //6262 #CJK UNIFIED IDEOGRAPH
+ {0xCBEC, 0x5498}, //6263 #CJK UNIFIED IDEOGRAPH
+ {0xCBED, 0x5463}, //6264 #CJK UNIFIED IDEOGRAPH
+ {0xCBEE, 0x5467}, //6265 #CJK UNIFIED IDEOGRAPH
+ {0xCBEF, 0x5464}, //6266 #CJK UNIFIED IDEOGRAPH
+ {0xCBF0, 0x56F7}, //6267 #CJK UNIFIED IDEOGRAPH
+ {0xCBF1, 0x56F9}, //6268 #CJK UNIFIED IDEOGRAPH
+ {0xCBF2, 0x576F}, //6269 #CJK UNIFIED IDEOGRAPH
+ {0xCBF3, 0x5772}, //6270 #CJK UNIFIED IDEOGRAPH
+ {0xCBF4, 0x576D}, //6271 #CJK UNIFIED IDEOGRAPH
+ {0xCBF5, 0x576B}, //6272 #CJK UNIFIED IDEOGRAPH
+ {0xCBF6, 0x5771}, //6273 #CJK UNIFIED IDEOGRAPH
+ {0xCBF7, 0x5770}, //6274 #CJK UNIFIED IDEOGRAPH
+ {0xCBF8, 0x5776}, //6275 #CJK UNIFIED IDEOGRAPH
+ {0xCBF9, 0x5780}, //6276 #CJK UNIFIED IDEOGRAPH
+ {0xCBFA, 0x5775}, //6277 #CJK UNIFIED IDEOGRAPH
+ {0xCBFB, 0x577B}, //6278 #CJK UNIFIED IDEOGRAPH
+ {0xCBFC, 0x5773}, //6279 #CJK UNIFIED IDEOGRAPH
+ {0xCBFD, 0x5774}, //6280 #CJK UNIFIED IDEOGRAPH
+ {0xCBFE, 0x5762}, //6281 #CJK UNIFIED IDEOGRAPH
+ {0xCC40, 0x5768}, //6282 #CJK UNIFIED IDEOGRAPH
+ {0xCC41, 0x577D}, //6283 #CJK UNIFIED IDEOGRAPH
+ {0xCC42, 0x590C}, //6284 #CJK UNIFIED IDEOGRAPH
+ {0xCC43, 0x5945}, //6285 #CJK UNIFIED IDEOGRAPH
+ {0xCC44, 0x59B5}, //6286 #CJK UNIFIED IDEOGRAPH
+ {0xCC45, 0x59BA}, //6287 #CJK UNIFIED IDEOGRAPH
+ {0xCC46, 0x59CF}, //6288 #CJK UNIFIED IDEOGRAPH
+ {0xCC47, 0x59CE}, //6289 #CJK UNIFIED IDEOGRAPH
+ {0xCC48, 0x59B2}, //6290 #CJK UNIFIED IDEOGRAPH
+ {0xCC49, 0x59CC}, //6291 #CJK UNIFIED IDEOGRAPH
+ {0xCC4A, 0x59C1}, //6292 #CJK UNIFIED IDEOGRAPH
+ {0xCC4B, 0x59B6}, //6293 #CJK UNIFIED IDEOGRAPH
+ {0xCC4C, 0x59BC}, //6294 #CJK UNIFIED IDEOGRAPH
+ {0xCC4D, 0x59C3}, //6295 #CJK UNIFIED IDEOGRAPH
+ {0xCC4E, 0x59D6}, //6296 #CJK UNIFIED IDEOGRAPH
+ {0xCC4F, 0x59B1}, //6297 #CJK UNIFIED IDEOGRAPH
+ {0xCC50, 0x59BD}, //6298 #CJK UNIFIED IDEOGRAPH
+ {0xCC51, 0x59C0}, //6299 #CJK UNIFIED IDEOGRAPH
+ {0xCC52, 0x59C8}, //6300 #CJK UNIFIED IDEOGRAPH
+ {0xCC53, 0x59B4}, //6301 #CJK UNIFIED IDEOGRAPH
+ {0xCC54, 0x59C7}, //6302 #CJK UNIFIED IDEOGRAPH
+ {0xCC55, 0x5B62}, //6303 #CJK UNIFIED IDEOGRAPH
+ {0xCC56, 0x5B65}, //6304 #CJK UNIFIED IDEOGRAPH
+ {0xCC57, 0x5B93}, //6305 #CJK UNIFIED IDEOGRAPH
+ {0xCC58, 0x5B95}, //6306 #CJK UNIFIED IDEOGRAPH
+ {0xCC59, 0x5C44}, //6307 #CJK UNIFIED IDEOGRAPH
+ {0xCC5A, 0x5C47}, //6308 #CJK UNIFIED IDEOGRAPH
+ {0xCC5B, 0x5CAE}, //6309 #CJK UNIFIED IDEOGRAPH
+ {0xCC5C, 0x5CA4}, //6310 #CJK UNIFIED IDEOGRAPH
+ {0xCC5D, 0x5CA0}, //6311 #CJK UNIFIED IDEOGRAPH
+ {0xCC5E, 0x5CB5}, //6312 #CJK UNIFIED IDEOGRAPH
+ {0xCC5F, 0x5CAF}, //6313 #CJK UNIFIED IDEOGRAPH
+ {0xCC60, 0x5CA8}, //6314 #CJK UNIFIED IDEOGRAPH
+ {0xCC61, 0x5CAC}, //6315 #CJK UNIFIED IDEOGRAPH
+ {0xCC62, 0x5C9F}, //6316 #CJK UNIFIED IDEOGRAPH
+ {0xCC63, 0x5CA3}, //6317 #CJK UNIFIED IDEOGRAPH
+ {0xCC64, 0x5CAD}, //6318 #CJK UNIFIED IDEOGRAPH
+ {0xCC65, 0x5CA2}, //6319 #CJK UNIFIED IDEOGRAPH
+ {0xCC66, 0x5CAA}, //6320 #CJK UNIFIED IDEOGRAPH
+ {0xCC67, 0x5CA7}, //6321 #CJK UNIFIED IDEOGRAPH
+ {0xCC68, 0x5C9D}, //6322 #CJK UNIFIED IDEOGRAPH
+ {0xCC69, 0x5CA5}, //6323 #CJK UNIFIED IDEOGRAPH
+ {0xCC6A, 0x5CB6}, //6324 #CJK UNIFIED IDEOGRAPH
+ {0xCC6B, 0x5CB0}, //6325 #CJK UNIFIED IDEOGRAPH
+ {0xCC6C, 0x5CA6}, //6326 #CJK UNIFIED IDEOGRAPH
+ {0xCC6D, 0x5E17}, //6327 #CJK UNIFIED IDEOGRAPH
+ {0xCC6E, 0x5E14}, //6328 #CJK UNIFIED IDEOGRAPH
+ {0xCC6F, 0x5E19}, //6329 #CJK UNIFIED IDEOGRAPH
+ {0xCC70, 0x5F28}, //6330 #CJK UNIFIED IDEOGRAPH
+ {0xCC71, 0x5F22}, //6331 #CJK UNIFIED IDEOGRAPH
+ {0xCC72, 0x5F23}, //6332 #CJK UNIFIED IDEOGRAPH
+ {0xCC73, 0x5F24}, //6333 #CJK UNIFIED IDEOGRAPH
+ {0xCC74, 0x5F54}, //6334 #CJK UNIFIED IDEOGRAPH
+ {0xCC75, 0x5F82}, //6335 #CJK UNIFIED IDEOGRAPH
+ {0xCC76, 0x5F7E}, //6336 #CJK UNIFIED IDEOGRAPH
+ {0xCC77, 0x5F7D}, //6337 #CJK UNIFIED IDEOGRAPH
+ {0xCC78, 0x5FDE}, //6338 #CJK UNIFIED IDEOGRAPH
+ {0xCC79, 0x5FE5}, //6339 #CJK UNIFIED IDEOGRAPH
+ {0xCC7A, 0x602D}, //6340 #CJK UNIFIED IDEOGRAPH
+ {0xCC7B, 0x6026}, //6341 #CJK UNIFIED IDEOGRAPH
+ {0xCC7C, 0x6019}, //6342 #CJK UNIFIED IDEOGRAPH
+ {0xCC7D, 0x6032}, //6343 #CJK UNIFIED IDEOGRAPH
+ {0xCC7E, 0x600B}, //6344 #CJK UNIFIED IDEOGRAPH
+ {0xCCA1, 0x6034}, //6345 #CJK UNIFIED IDEOGRAPH
+ {0xCCA2, 0x600A}, //6346 #CJK UNIFIED IDEOGRAPH
+ {0xCCA3, 0x6017}, //6347 #CJK UNIFIED IDEOGRAPH
+ {0xCCA4, 0x6033}, //6348 #CJK UNIFIED IDEOGRAPH
+ {0xCCA5, 0x601A}, //6349 #CJK UNIFIED IDEOGRAPH
+ {0xCCA6, 0x601E}, //6350 #CJK UNIFIED IDEOGRAPH
+ {0xCCA7, 0x602C}, //6351 #CJK UNIFIED IDEOGRAPH
+ {0xCCA8, 0x6022}, //6352 #CJK UNIFIED IDEOGRAPH
+ {0xCCA9, 0x600D}, //6353 #CJK UNIFIED IDEOGRAPH
+ {0xCCAA, 0x6010}, //6354 #CJK UNIFIED IDEOGRAPH
+ {0xCCAB, 0x602E}, //6355 #CJK UNIFIED IDEOGRAPH
+ {0xCCAC, 0x6013}, //6356 #CJK UNIFIED IDEOGRAPH
+ {0xCCAD, 0x6011}, //6357 #CJK UNIFIED IDEOGRAPH
+ {0xCCAE, 0x600C}, //6358 #CJK UNIFIED IDEOGRAPH
+ {0xCCAF, 0x6009}, //6359 #CJK UNIFIED IDEOGRAPH
+ {0xCCB0, 0x601C}, //6360 #CJK UNIFIED IDEOGRAPH
+ {0xCCB1, 0x6214}, //6361 #CJK UNIFIED IDEOGRAPH
+ {0xCCB2, 0x623D}, //6362 #CJK UNIFIED IDEOGRAPH
+ {0xCCB3, 0x62AD}, //6363 #CJK UNIFIED IDEOGRAPH
+ {0xCCB4, 0x62B4}, //6364 #CJK UNIFIED IDEOGRAPH
+ {0xCCB5, 0x62D1}, //6365 #CJK UNIFIED IDEOGRAPH
+ {0xCCB6, 0x62BE}, //6366 #CJK UNIFIED IDEOGRAPH
+ {0xCCB7, 0x62AA}, //6367 #CJK UNIFIED IDEOGRAPH
+ {0xCCB8, 0x62B6}, //6368 #CJK UNIFIED IDEOGRAPH
+ {0xCCB9, 0x62CA}, //6369 #CJK UNIFIED IDEOGRAPH
+ {0xCCBA, 0x62AE}, //6370 #CJK UNIFIED IDEOGRAPH
+ {0xCCBB, 0x62B3}, //6371 #CJK UNIFIED IDEOGRAPH
+ {0xCCBC, 0x62AF}, //6372 #CJK UNIFIED IDEOGRAPH
+ {0xCCBD, 0x62BB}, //6373 #CJK UNIFIED IDEOGRAPH
+ {0xCCBE, 0x62A9}, //6374 #CJK UNIFIED IDEOGRAPH
+ {0xCCBF, 0x62B0}, //6375 #CJK UNIFIED IDEOGRAPH
+ {0xCCC0, 0x62B8}, //6376 #CJK UNIFIED IDEOGRAPH
+ {0xCCC1, 0x653D}, //6377 #CJK UNIFIED IDEOGRAPH
+ {0xCCC2, 0x65A8}, //6378 #CJK UNIFIED IDEOGRAPH
+ {0xCCC3, 0x65BB}, //6379 #CJK UNIFIED IDEOGRAPH
+ {0xCCC4, 0x6609}, //6380 #CJK UNIFIED IDEOGRAPH
+ {0xCCC5, 0x65FC}, //6381 #CJK UNIFIED IDEOGRAPH
+ {0xCCC6, 0x6604}, //6382 #CJK UNIFIED IDEOGRAPH
+ {0xCCC7, 0x6612}, //6383 #CJK UNIFIED IDEOGRAPH
+ {0xCCC8, 0x6608}, //6384 #CJK UNIFIED IDEOGRAPH
+ {0xCCC9, 0x65FB}, //6385 #CJK UNIFIED IDEOGRAPH
+ {0xCCCA, 0x6603}, //6386 #CJK UNIFIED IDEOGRAPH
+ {0xCCCB, 0x660B}, //6387 #CJK UNIFIED IDEOGRAPH
+ {0xCCCC, 0x660D}, //6388 #CJK UNIFIED IDEOGRAPH
+ {0xCCCD, 0x6605}, //6389 #CJK UNIFIED IDEOGRAPH
+ {0xCCCE, 0x65FD}, //6390 #CJK UNIFIED IDEOGRAPH
+ {0xCCCF, 0x6611}, //6391 #CJK UNIFIED IDEOGRAPH
+ {0xCCD0, 0x6610}, //6392 #CJK UNIFIED IDEOGRAPH
+ {0xCCD1, 0x66F6}, //6393 #CJK UNIFIED IDEOGRAPH
+ {0xCCD2, 0x670A}, //6394 #CJK UNIFIED IDEOGRAPH
+ {0xCCD3, 0x6785}, //6395 #CJK UNIFIED IDEOGRAPH
+ {0xCCD4, 0x676C}, //6396 #CJK UNIFIED IDEOGRAPH
+ {0xCCD5, 0x678E}, //6397 #CJK UNIFIED IDEOGRAPH
+ {0xCCD6, 0x6792}, //6398 #CJK UNIFIED IDEOGRAPH
+ {0xCCD7, 0x6776}, //6399 #CJK UNIFIED IDEOGRAPH
+ {0xCCD8, 0x677B}, //6400 #CJK UNIFIED IDEOGRAPH
+ {0xCCD9, 0x6798}, //6401 #CJK UNIFIED IDEOGRAPH
+ {0xCCDA, 0x6786}, //6402 #CJK UNIFIED IDEOGRAPH
+ {0xCCDB, 0x6784}, //6403 #CJK UNIFIED IDEOGRAPH
+ {0xCCDC, 0x6774}, //6404 #CJK UNIFIED IDEOGRAPH
+ {0xCCDD, 0x678D}, //6405 #CJK UNIFIED IDEOGRAPH
+ {0xCCDE, 0x678C}, //6406 #CJK UNIFIED IDEOGRAPH
+ {0xCCDF, 0x677A}, //6407 #CJK UNIFIED IDEOGRAPH
+ {0xCCE0, 0x679F}, //6408 #CJK UNIFIED IDEOGRAPH
+ {0xCCE1, 0x6791}, //6409 #CJK UNIFIED IDEOGRAPH
+ {0xCCE2, 0x6799}, //6410 #CJK UNIFIED IDEOGRAPH
+ {0xCCE3, 0x6783}, //6411 #CJK UNIFIED IDEOGRAPH
+ {0xCCE4, 0x677D}, //6412 #CJK UNIFIED IDEOGRAPH
+ {0xCCE5, 0x6781}, //6413 #CJK UNIFIED IDEOGRAPH
+ {0xCCE6, 0x6778}, //6414 #CJK UNIFIED IDEOGRAPH
+ {0xCCE7, 0x6779}, //6415 #CJK UNIFIED IDEOGRAPH
+ {0xCCE8, 0x6794}, //6416 #CJK UNIFIED IDEOGRAPH
+ {0xCCE9, 0x6B25}, //6417 #CJK UNIFIED IDEOGRAPH
+ {0xCCEA, 0x6B80}, //6418 #CJK UNIFIED IDEOGRAPH
+ {0xCCEB, 0x6B7E}, //6419 #CJK UNIFIED IDEOGRAPH
+ {0xCCEC, 0x6BDE}, //6420 #CJK UNIFIED IDEOGRAPH
+ {0xCCED, 0x6C1D}, //6421 #CJK UNIFIED IDEOGRAPH
+ {0xCCEE, 0x6C93}, //6422 #CJK UNIFIED IDEOGRAPH
+ {0xCCEF, 0x6CEC}, //6423 #CJK UNIFIED IDEOGRAPH
+ {0xCCF0, 0x6CEB}, //6424 #CJK UNIFIED IDEOGRAPH
+ {0xCCF1, 0x6CEE}, //6425 #CJK UNIFIED IDEOGRAPH
+ {0xCCF2, 0x6CD9}, //6426 #CJK UNIFIED IDEOGRAPH
+ {0xCCF3, 0x6CB6}, //6427 #CJK UNIFIED IDEOGRAPH
+ {0xCCF4, 0x6CD4}, //6428 #CJK UNIFIED IDEOGRAPH
+ {0xCCF5, 0x6CAD}, //6429 #CJK UNIFIED IDEOGRAPH
+ {0xCCF6, 0x6CE7}, //6430 #CJK UNIFIED IDEOGRAPH
+ {0xCCF7, 0x6CB7}, //6431 #CJK UNIFIED IDEOGRAPH
+ {0xCCF8, 0x6CD0}, //6432 #CJK UNIFIED IDEOGRAPH
+ {0xCCF9, 0x6CC2}, //6433 #CJK UNIFIED IDEOGRAPH
+ {0xCCFA, 0x6CBA}, //6434 #CJK UNIFIED IDEOGRAPH
+ {0xCCFB, 0x6CC3}, //6435 #CJK UNIFIED IDEOGRAPH
+ {0xCCFC, 0x6CC6}, //6436 #CJK UNIFIED IDEOGRAPH
+ {0xCCFD, 0x6CED}, //6437 #CJK UNIFIED IDEOGRAPH
+ {0xCCFE, 0x6CF2}, //6438 #CJK UNIFIED IDEOGRAPH
+ {0xCD40, 0x6CD2}, //6439 #CJK UNIFIED IDEOGRAPH
+ {0xCD41, 0x6CDD}, //6440 #CJK UNIFIED IDEOGRAPH
+ {0xCD42, 0x6CB4}, //6441 #CJK UNIFIED IDEOGRAPH
+ {0xCD43, 0x6C8A}, //6442 #CJK UNIFIED IDEOGRAPH
+ {0xCD44, 0x6C9D}, //6443 #CJK UNIFIED IDEOGRAPH
+ {0xCD45, 0x6C80}, //6444 #CJK UNIFIED IDEOGRAPH
+ {0xCD46, 0x6CDE}, //6445 #CJK UNIFIED IDEOGRAPH
+ {0xCD47, 0x6CC0}, //6446 #CJK UNIFIED IDEOGRAPH
+ {0xCD48, 0x6D30}, //6447 #CJK UNIFIED IDEOGRAPH
+ {0xCD49, 0x6CCD}, //6448 #CJK UNIFIED IDEOGRAPH
+ {0xCD4A, 0x6CC7}, //6449 #CJK UNIFIED IDEOGRAPH
+ {0xCD4B, 0x6CB0}, //6450 #CJK UNIFIED IDEOGRAPH
+ {0xCD4C, 0x6CF9}, //6451 #CJK UNIFIED IDEOGRAPH
+ {0xCD4D, 0x6CCF}, //6452 #CJK UNIFIED IDEOGRAPH
+ {0xCD4E, 0x6CE9}, //6453 #CJK UNIFIED IDEOGRAPH
+ {0xCD4F, 0x6CD1}, //6454 #CJK UNIFIED IDEOGRAPH
+ {0xCD50, 0x7094}, //6455 #CJK UNIFIED IDEOGRAPH
+ {0xCD51, 0x7098}, //6456 #CJK UNIFIED IDEOGRAPH
+ {0xCD52, 0x7085}, //6457 #CJK UNIFIED IDEOGRAPH
+ {0xCD53, 0x7093}, //6458 #CJK UNIFIED IDEOGRAPH
+ {0xCD54, 0x7086}, //6459 #CJK UNIFIED IDEOGRAPH
+ {0xCD55, 0x7084}, //6460 #CJK UNIFIED IDEOGRAPH
+ {0xCD56, 0x7091}, //6461 #CJK UNIFIED IDEOGRAPH
+ {0xCD57, 0x7096}, //6462 #CJK UNIFIED IDEOGRAPH
+ {0xCD58, 0x7082}, //6463 #CJK UNIFIED IDEOGRAPH
+ {0xCD59, 0x709A}, //6464 #CJK UNIFIED IDEOGRAPH
+ {0xCD5A, 0x7083}, //6465 #CJK UNIFIED IDEOGRAPH
+ {0xCD5B, 0x726A}, //6466 #CJK UNIFIED IDEOGRAPH
+ {0xCD5C, 0x72D6}, //6467 #CJK UNIFIED IDEOGRAPH
+ {0xCD5D, 0x72CB}, //6468 #CJK UNIFIED IDEOGRAPH
+ {0xCD5E, 0x72D8}, //6469 #CJK UNIFIED IDEOGRAPH
+ {0xCD5F, 0x72C9}, //6470 #CJK UNIFIED IDEOGRAPH
+ {0xCD60, 0x72DC}, //6471 #CJK UNIFIED IDEOGRAPH
+ {0xCD61, 0x72D2}, //6472 #CJK UNIFIED IDEOGRAPH
+ {0xCD62, 0x72D4}, //6473 #CJK UNIFIED IDEOGRAPH
+ {0xCD63, 0x72DA}, //6474 #CJK UNIFIED IDEOGRAPH
+ {0xCD64, 0x72CC}, //6475 #CJK UNIFIED IDEOGRAPH
+ {0xCD65, 0x72D1}, //6476 #CJK UNIFIED IDEOGRAPH
+ {0xCD66, 0x73A4}, //6477 #CJK UNIFIED IDEOGRAPH
+ {0xCD67, 0x73A1}, //6478 #CJK UNIFIED IDEOGRAPH
+ {0xCD68, 0x73AD}, //6479 #CJK UNIFIED IDEOGRAPH
+ {0xCD69, 0x73A6}, //6480 #CJK UNIFIED IDEOGRAPH
+ {0xCD6A, 0x73A2}, //6481 #CJK UNIFIED IDEOGRAPH
+ {0xCD6B, 0x73A0}, //6482 #CJK UNIFIED IDEOGRAPH
+ {0xCD6C, 0x73AC}, //6483 #CJK UNIFIED IDEOGRAPH
+ {0xCD6D, 0x739D}, //6484 #CJK UNIFIED IDEOGRAPH
+ {0xCD6E, 0x74DD}, //6485 #CJK UNIFIED IDEOGRAPH
+ {0xCD6F, 0x74E8}, //6486 #CJK UNIFIED IDEOGRAPH
+ {0xCD70, 0x753F}, //6487 #CJK UNIFIED IDEOGRAPH
+ {0xCD71, 0x7540}, //6488 #CJK UNIFIED IDEOGRAPH
+ {0xCD72, 0x753E}, //6489 #CJK UNIFIED IDEOGRAPH
+ {0xCD73, 0x758C}, //6490 #CJK UNIFIED IDEOGRAPH
+ {0xCD74, 0x7598}, //6491 #CJK UNIFIED IDEOGRAPH
+ {0xCD75, 0x76AF}, //6492 #CJK UNIFIED IDEOGRAPH
+ {0xCD76, 0x76F3}, //6493 #CJK UNIFIED IDEOGRAPH
+ {0xCD77, 0x76F1}, //6494 #CJK UNIFIED IDEOGRAPH
+ {0xCD78, 0x76F0}, //6495 #CJK UNIFIED IDEOGRAPH
+ {0xCD79, 0x76F5}, //6496 #CJK UNIFIED IDEOGRAPH
+ {0xCD7A, 0x77F8}, //6497 #CJK UNIFIED IDEOGRAPH
+ {0xCD7B, 0x77FC}, //6498 #CJK UNIFIED IDEOGRAPH
+ {0xCD7C, 0x77F9}, //6499 #CJK UNIFIED IDEOGRAPH
+ {0xCD7D, 0x77FB}, //6500 #CJK UNIFIED IDEOGRAPH
+ {0xCD7E, 0x77FA}, //6501 #CJK UNIFIED IDEOGRAPH
+ {0xCDA1, 0x77F7}, //6502 #CJK UNIFIED IDEOGRAPH
+ {0xCDA2, 0x7942}, //6503 #CJK UNIFIED IDEOGRAPH
+ {0xCDA3, 0x793F}, //6504 #CJK UNIFIED IDEOGRAPH
+ {0xCDA4, 0x79C5}, //6505 #CJK UNIFIED IDEOGRAPH
+ {0xCDA5, 0x7A78}, //6506 #CJK UNIFIED IDEOGRAPH
+ {0xCDA6, 0x7A7B}, //6507 #CJK UNIFIED IDEOGRAPH
+ {0xCDA7, 0x7AFB}, //6508 #CJK UNIFIED IDEOGRAPH
+ {0xCDA8, 0x7C75}, //6509 #CJK UNIFIED IDEOGRAPH
+ {0xCDA9, 0x7CFD}, //6510 #CJK UNIFIED IDEOGRAPH
+ {0xCDAA, 0x8035}, //6511 #CJK UNIFIED IDEOGRAPH
+ {0xCDAB, 0x808F}, //6512 #CJK UNIFIED IDEOGRAPH
+ {0xCDAC, 0x80AE}, //6513 #CJK UNIFIED IDEOGRAPH
+ {0xCDAD, 0x80A3}, //6514 #CJK UNIFIED IDEOGRAPH
+ {0xCDAE, 0x80B8}, //6515 #CJK UNIFIED IDEOGRAPH
+ {0xCDAF, 0x80B5}, //6516 #CJK UNIFIED IDEOGRAPH
+ {0xCDB0, 0x80AD}, //6517 #CJK UNIFIED IDEOGRAPH
+ {0xCDB1, 0x8220}, //6518 #CJK UNIFIED IDEOGRAPH
+ {0xCDB2, 0x82A0}, //6519 #CJK UNIFIED IDEOGRAPH
+ {0xCDB3, 0x82C0}, //6520 #CJK UNIFIED IDEOGRAPH
+ {0xCDB4, 0x82AB}, //6521 #CJK UNIFIED IDEOGRAPH
+ {0xCDB5, 0x829A}, //6522 #CJK UNIFIED IDEOGRAPH
+ {0xCDB6, 0x8298}, //6523 #CJK UNIFIED IDEOGRAPH
+ {0xCDB7, 0x829B}, //6524 #CJK UNIFIED IDEOGRAPH
+ {0xCDB8, 0x82B5}, //6525 #CJK UNIFIED IDEOGRAPH
+ {0xCDB9, 0x82A7}, //6526 #CJK UNIFIED IDEOGRAPH
+ {0xCDBA, 0x82AE}, //6527 #CJK UNIFIED IDEOGRAPH
+ {0xCDBB, 0x82BC}, //6528 #CJK UNIFIED IDEOGRAPH
+ {0xCDBC, 0x829E}, //6529 #CJK UNIFIED IDEOGRAPH
+ {0xCDBD, 0x82BA}, //6530 #CJK UNIFIED IDEOGRAPH
+ {0xCDBE, 0x82B4}, //6531 #CJK UNIFIED IDEOGRAPH
+ {0xCDBF, 0x82A8}, //6532 #CJK UNIFIED IDEOGRAPH
+ {0xCDC0, 0x82A1}, //6533 #CJK UNIFIED IDEOGRAPH
+ {0xCDC1, 0x82A9}, //6534 #CJK UNIFIED IDEOGRAPH
+ {0xCDC2, 0x82C2}, //6535 #CJK UNIFIED IDEOGRAPH
+ {0xCDC3, 0x82A4}, //6536 #CJK UNIFIED IDEOGRAPH
+ {0xCDC4, 0x82C3}, //6537 #CJK UNIFIED IDEOGRAPH
+ {0xCDC5, 0x82B6}, //6538 #CJK UNIFIED IDEOGRAPH
+ {0xCDC6, 0x82A2}, //6539 #CJK UNIFIED IDEOGRAPH
+ {0xCDC7, 0x8670}, //6540 #CJK UNIFIED IDEOGRAPH
+ {0xCDC8, 0x866F}, //6541 #CJK UNIFIED IDEOGRAPH
+ {0xCDC9, 0x866D}, //6542 #CJK UNIFIED IDEOGRAPH
+ {0xCDCA, 0x866E}, //6543 #CJK UNIFIED IDEOGRAPH
+ {0xCDCB, 0x8C56}, //6544 #CJK UNIFIED IDEOGRAPH
+ {0xCDCC, 0x8FD2}, //6545 #CJK UNIFIED IDEOGRAPH
+ {0xCDCD, 0x8FCB}, //6546 #CJK UNIFIED IDEOGRAPH
+ {0xCDCE, 0x8FD3}, //6547 #CJK UNIFIED IDEOGRAPH
+ {0xCDCF, 0x8FCD}, //6548 #CJK UNIFIED IDEOGRAPH
+ {0xCDD0, 0x8FD6}, //6549 #CJK UNIFIED IDEOGRAPH
+ {0xCDD1, 0x8FD5}, //6550 #CJK UNIFIED IDEOGRAPH
+ {0xCDD2, 0x8FD7}, //6551 #CJK UNIFIED IDEOGRAPH
+ {0xCDD3, 0x90B2}, //6552 #CJK UNIFIED IDEOGRAPH
+ {0xCDD4, 0x90B4}, //6553 #CJK UNIFIED IDEOGRAPH
+ {0xCDD5, 0x90AF}, //6554 #CJK UNIFIED IDEOGRAPH
+ {0xCDD6, 0x90B3}, //6555 #CJK UNIFIED IDEOGRAPH
+ {0xCDD7, 0x90B0}, //6556 #CJK UNIFIED IDEOGRAPH
+ {0xCDD8, 0x9639}, //6557 #CJK UNIFIED IDEOGRAPH
+ {0xCDD9, 0x963D}, //6558 #CJK UNIFIED IDEOGRAPH
+ {0xCDDA, 0x963C}, //6559 #CJK UNIFIED IDEOGRAPH
+ {0xCDDB, 0x963A}, //6560 #CJK UNIFIED IDEOGRAPH
+ {0xCDDC, 0x9643}, //6561 #CJK UNIFIED IDEOGRAPH
+ {0xCDDD, 0x4FCD}, //6562 #CJK UNIFIED IDEOGRAPH
+ {0xCDDE, 0x4FC5}, //6563 #CJK UNIFIED IDEOGRAPH
+ {0xCDDF, 0x4FD3}, //6564 #CJK UNIFIED IDEOGRAPH
+ {0xCDE0, 0x4FB2}, //6565 #CJK UNIFIED IDEOGRAPH
+ {0xCDE1, 0x4FC9}, //6566 #CJK UNIFIED IDEOGRAPH
+ {0xCDE2, 0x4FCB}, //6567 #CJK UNIFIED IDEOGRAPH
+ {0xCDE3, 0x4FC1}, //6568 #CJK UNIFIED IDEOGRAPH
+ {0xCDE4, 0x4FD4}, //6569 #CJK UNIFIED IDEOGRAPH
+ {0xCDE5, 0x4FDC}, //6570 #CJK UNIFIED IDEOGRAPH
+ {0xCDE6, 0x4FD9}, //6571 #CJK UNIFIED IDEOGRAPH
+ {0xCDE7, 0x4FBB}, //6572 #CJK UNIFIED IDEOGRAPH
+ {0xCDE8, 0x4FB3}, //6573 #CJK UNIFIED IDEOGRAPH
+ {0xCDE9, 0x4FDB}, //6574 #CJK UNIFIED IDEOGRAPH
+ {0xCDEA, 0x4FC7}, //6575 #CJK UNIFIED IDEOGRAPH
+ {0xCDEB, 0x4FD6}, //6576 #CJK UNIFIED IDEOGRAPH
+ {0xCDEC, 0x4FBA}, //6577 #CJK UNIFIED IDEOGRAPH
+ {0xCDED, 0x4FC0}, //6578 #CJK UNIFIED IDEOGRAPH
+ {0xCDEE, 0x4FB9}, //6579 #CJK UNIFIED IDEOGRAPH
+ {0xCDEF, 0x4FEC}, //6580 #CJK UNIFIED IDEOGRAPH
+ {0xCDF0, 0x5244}, //6581 #CJK UNIFIED IDEOGRAPH
+ {0xCDF1, 0x5249}, //6582 #CJK UNIFIED IDEOGRAPH
+ {0xCDF2, 0x52C0}, //6583 #CJK UNIFIED IDEOGRAPH
+ {0xCDF3, 0x52C2}, //6584 #CJK UNIFIED IDEOGRAPH
+ {0xCDF4, 0x533D}, //6585 #CJK UNIFIED IDEOGRAPH
+ {0xCDF5, 0x537C}, //6586 #CJK UNIFIED IDEOGRAPH
+ {0xCDF6, 0x5397}, //6587 #CJK UNIFIED IDEOGRAPH
+ {0xCDF7, 0x5396}, //6588 #CJK UNIFIED IDEOGRAPH
+ {0xCDF8, 0x5399}, //6589 #CJK UNIFIED IDEOGRAPH
+ {0xCDF9, 0x5398}, //6590 #CJK UNIFIED IDEOGRAPH
+ {0xCDFA, 0x54BA}, //6591 #CJK UNIFIED IDEOGRAPH
+ {0xCDFB, 0x54A1}, //6592 #CJK UNIFIED IDEOGRAPH
+ {0xCDFC, 0x54AD}, //6593 #CJK UNIFIED IDEOGRAPH
+ {0xCDFD, 0x54A5}, //6594 #CJK UNIFIED IDEOGRAPH
+ {0xCDFE, 0x54CF}, //6595 #CJK UNIFIED IDEOGRAPH
+ {0xCE40, 0x54C3}, //6596 #CJK UNIFIED IDEOGRAPH
+ {0xCE41, 0x830D}, //6597 #CJK UNIFIED IDEOGRAPH
+ {0xCE42, 0x54B7}, //6598 #CJK UNIFIED IDEOGRAPH
+ {0xCE43, 0x54AE}, //6599 #CJK UNIFIED IDEOGRAPH
+ {0xCE44, 0x54D6}, //6600 #CJK UNIFIED IDEOGRAPH
+ {0xCE45, 0x54B6}, //6601 #CJK UNIFIED IDEOGRAPH
+ {0xCE46, 0x54C5}, //6602 #CJK UNIFIED IDEOGRAPH
+ {0xCE47, 0x54C6}, //6603 #CJK UNIFIED IDEOGRAPH
+ {0xCE48, 0x54A0}, //6604 #CJK UNIFIED IDEOGRAPH
+ {0xCE49, 0x5470}, //6605 #CJK UNIFIED IDEOGRAPH
+ {0xCE4A, 0x54BC}, //6606 #CJK UNIFIED IDEOGRAPH
+ {0xCE4B, 0x54A2}, //6607 #CJK UNIFIED IDEOGRAPH
+ {0xCE4C, 0x54BE}, //6608 #CJK UNIFIED IDEOGRAPH
+ {0xCE4D, 0x5472}, //6609 #CJK UNIFIED IDEOGRAPH
+ {0xCE4E, 0x54DE}, //6610 #CJK UNIFIED IDEOGRAPH
+ {0xCE4F, 0x54B0}, //6611 #CJK UNIFIED IDEOGRAPH
+ {0xCE50, 0x57B5}, //6612 #CJK UNIFIED IDEOGRAPH
+ {0xCE51, 0x579E}, //6613 #CJK UNIFIED IDEOGRAPH
+ {0xCE52, 0x579F}, //6614 #CJK UNIFIED IDEOGRAPH
+ {0xCE53, 0x57A4}, //6615 #CJK UNIFIED IDEOGRAPH
+ {0xCE54, 0x578C}, //6616 #CJK UNIFIED IDEOGRAPH
+ {0xCE55, 0x5797}, //6617 #CJK UNIFIED IDEOGRAPH
+ {0xCE56, 0x579D}, //6618 #CJK UNIFIED IDEOGRAPH
+ {0xCE57, 0x579B}, //6619 #CJK UNIFIED IDEOGRAPH
+ {0xCE58, 0x5794}, //6620 #CJK UNIFIED IDEOGRAPH
+ {0xCE59, 0x5798}, //6621 #CJK UNIFIED IDEOGRAPH
+ {0xCE5A, 0x578F}, //6622 #CJK UNIFIED IDEOGRAPH
+ {0xCE5B, 0x5799}, //6623 #CJK UNIFIED IDEOGRAPH
+ {0xCE5C, 0x57A5}, //6624 #CJK UNIFIED IDEOGRAPH
+ {0xCE5D, 0x579A}, //6625 #CJK UNIFIED IDEOGRAPH
+ {0xCE5E, 0x5795}, //6626 #CJK UNIFIED IDEOGRAPH
+ {0xCE5F, 0x58F4}, //6627 #CJK UNIFIED IDEOGRAPH
+ {0xCE60, 0x590D}, //6628 #CJK UNIFIED IDEOGRAPH
+ {0xCE61, 0x5953}, //6629 #CJK UNIFIED IDEOGRAPH
+ {0xCE62, 0x59E1}, //6630 #CJK UNIFIED IDEOGRAPH
+ {0xCE63, 0x59DE}, //6631 #CJK UNIFIED IDEOGRAPH
+ {0xCE64, 0x59EE}, //6632 #CJK UNIFIED IDEOGRAPH
+ {0xCE65, 0x5A00}, //6633 #CJK UNIFIED IDEOGRAPH
+ {0xCE66, 0x59F1}, //6634 #CJK UNIFIED IDEOGRAPH
+ {0xCE67, 0x59DD}, //6635 #CJK UNIFIED IDEOGRAPH
+ {0xCE68, 0x59FA}, //6636 #CJK UNIFIED IDEOGRAPH
+ {0xCE69, 0x59FD}, //6637 #CJK UNIFIED IDEOGRAPH
+ {0xCE6A, 0x59FC}, //6638 #CJK UNIFIED IDEOGRAPH
+ {0xCE6B, 0x59F6}, //6639 #CJK UNIFIED IDEOGRAPH
+ {0xCE6C, 0x59E4}, //6640 #CJK UNIFIED IDEOGRAPH
+ {0xCE6D, 0x59F2}, //6641 #CJK UNIFIED IDEOGRAPH
+ {0xCE6E, 0x59F7}, //6642 #CJK UNIFIED IDEOGRAPH
+ {0xCE6F, 0x59DB}, //6643 #CJK UNIFIED IDEOGRAPH
+ {0xCE70, 0x59E9}, //6644 #CJK UNIFIED IDEOGRAPH
+ {0xCE71, 0x59F3}, //6645 #CJK UNIFIED IDEOGRAPH
+ {0xCE72, 0x59F5}, //6646 #CJK UNIFIED IDEOGRAPH
+ {0xCE73, 0x59E0}, //6647 #CJK UNIFIED IDEOGRAPH
+ {0xCE74, 0x59FE}, //6648 #CJK UNIFIED IDEOGRAPH
+ {0xCE75, 0x59F4}, //6649 #CJK UNIFIED IDEOGRAPH
+ {0xCE76, 0x59ED}, //6650 #CJK UNIFIED IDEOGRAPH
+ {0xCE77, 0x5BA8}, //6651 #CJK UNIFIED IDEOGRAPH
+ {0xCE78, 0x5C4C}, //6652 #CJK UNIFIED IDEOGRAPH
+ {0xCE79, 0x5CD0}, //6653 #CJK UNIFIED IDEOGRAPH
+ {0xCE7A, 0x5CD8}, //6654 #CJK UNIFIED IDEOGRAPH
+ {0xCE7B, 0x5CCC}, //6655 #CJK UNIFIED IDEOGRAPH
+ {0xCE7C, 0x5CD7}, //6656 #CJK UNIFIED IDEOGRAPH
+ {0xCE7D, 0x5CCB}, //6657 #CJK UNIFIED IDEOGRAPH
+ {0xCE7E, 0x5CDB}, //6658 #CJK UNIFIED IDEOGRAPH
+ {0xCEA1, 0x5CDE}, //6659 #CJK UNIFIED IDEOGRAPH
+ {0xCEA2, 0x5CDA}, //6660 #CJK UNIFIED IDEOGRAPH
+ {0xCEA3, 0x5CC9}, //6661 #CJK UNIFIED IDEOGRAPH
+ {0xCEA4, 0x5CC7}, //6662 #CJK UNIFIED IDEOGRAPH
+ {0xCEA5, 0x5CCA}, //6663 #CJK UNIFIED IDEOGRAPH
+ {0xCEA6, 0x5CD6}, //6664 #CJK UNIFIED IDEOGRAPH
+ {0xCEA7, 0x5CD3}, //6665 #CJK UNIFIED IDEOGRAPH
+ {0xCEA8, 0x5CD4}, //6666 #CJK UNIFIED IDEOGRAPH
+ {0xCEA9, 0x5CCF}, //6667 #CJK UNIFIED IDEOGRAPH
+ {0xCEAA, 0x5CC8}, //6668 #CJK UNIFIED IDEOGRAPH
+ {0xCEAB, 0x5CC6}, //6669 #CJK UNIFIED IDEOGRAPH
+ {0xCEAC, 0x5CCE}, //6670 #CJK UNIFIED IDEOGRAPH
+ {0xCEAD, 0x5CDF}, //6671 #CJK UNIFIED IDEOGRAPH
+ {0xCEAE, 0x5CF8}, //6672 #CJK UNIFIED IDEOGRAPH
+ {0xCEAF, 0x5DF9}, //6673 #CJK UNIFIED IDEOGRAPH
+ {0xCEB0, 0x5E21}, //6674 #CJK UNIFIED IDEOGRAPH
+ {0xCEB1, 0x5E22}, //6675 #CJK UNIFIED IDEOGRAPH
+ {0xCEB2, 0x5E23}, //6676 #CJK UNIFIED IDEOGRAPH
+ {0xCEB3, 0x5E20}, //6677 #CJK UNIFIED IDEOGRAPH
+ {0xCEB4, 0x5E24}, //6678 #CJK UNIFIED IDEOGRAPH
+ {0xCEB5, 0x5EB0}, //6679 #CJK UNIFIED IDEOGRAPH
+ {0xCEB6, 0x5EA4}, //6680 #CJK UNIFIED IDEOGRAPH
+ {0xCEB7, 0x5EA2}, //6681 #CJK UNIFIED IDEOGRAPH
+ {0xCEB8, 0x5E9B}, //6682 #CJK UNIFIED IDEOGRAPH
+ {0xCEB9, 0x5EA3}, //6683 #CJK UNIFIED IDEOGRAPH
+ {0xCEBA, 0x5EA5}, //6684 #CJK UNIFIED IDEOGRAPH
+ {0xCEBB, 0x5F07}, //6685 #CJK UNIFIED IDEOGRAPH
+ {0xCEBC, 0x5F2E}, //6686 #CJK UNIFIED IDEOGRAPH
+ {0xCEBD, 0x5F56}, //6687 #CJK UNIFIED IDEOGRAPH
+ {0xCEBE, 0x5F86}, //6688 #CJK UNIFIED IDEOGRAPH
+ {0xCEBF, 0x6037}, //6689 #CJK UNIFIED IDEOGRAPH
+ {0xCEC0, 0x6039}, //6690 #CJK UNIFIED IDEOGRAPH
+ {0xCEC1, 0x6054}, //6691 #CJK UNIFIED IDEOGRAPH
+ {0xCEC2, 0x6072}, //6692 #CJK UNIFIED IDEOGRAPH
+ {0xCEC3, 0x605E}, //6693 #CJK UNIFIED IDEOGRAPH
+ {0xCEC4, 0x6045}, //6694 #CJK UNIFIED IDEOGRAPH
+ {0xCEC5, 0x6053}, //6695 #CJK UNIFIED IDEOGRAPH
+ {0xCEC6, 0x6047}, //6696 #CJK UNIFIED IDEOGRAPH
+ {0xCEC7, 0x6049}, //6697 #CJK UNIFIED IDEOGRAPH
+ {0xCEC8, 0x605B}, //6698 #CJK UNIFIED IDEOGRAPH
+ {0xCEC9, 0x604C}, //6699 #CJK UNIFIED IDEOGRAPH
+ {0xCECA, 0x6040}, //6700 #CJK UNIFIED IDEOGRAPH
+ {0xCECB, 0x6042}, //6701 #CJK UNIFIED IDEOGRAPH
+ {0xCECC, 0x605F}, //6702 #CJK UNIFIED IDEOGRAPH
+ {0xCECD, 0x6024}, //6703 #CJK UNIFIED IDEOGRAPH
+ {0xCECE, 0x6044}, //6704 #CJK UNIFIED IDEOGRAPH
+ {0xCECF, 0x6058}, //6705 #CJK UNIFIED IDEOGRAPH
+ {0xCED0, 0x6066}, //6706 #CJK UNIFIED IDEOGRAPH
+ {0xCED1, 0x606E}, //6707 #CJK UNIFIED IDEOGRAPH
+ {0xCED2, 0x6242}, //6708 #CJK UNIFIED IDEOGRAPH
+ {0xCED3, 0x6243}, //6709 #CJK UNIFIED IDEOGRAPH
+ {0xCED4, 0x62CF}, //6710 #CJK UNIFIED IDEOGRAPH
+ {0xCED5, 0x630D}, //6711 #CJK UNIFIED IDEOGRAPH
+ {0xCED6, 0x630B}, //6712 #CJK UNIFIED IDEOGRAPH
+ {0xCED7, 0x62F5}, //6713 #CJK UNIFIED IDEOGRAPH
+ {0xCED8, 0x630E}, //6714 #CJK UNIFIED IDEOGRAPH
+ {0xCED9, 0x6303}, //6715 #CJK UNIFIED IDEOGRAPH
+ {0xCEDA, 0x62EB}, //6716 #CJK UNIFIED IDEOGRAPH
+ {0xCEDB, 0x62F9}, //6717 #CJK UNIFIED IDEOGRAPH
+ {0xCEDC, 0x630F}, //6718 #CJK UNIFIED IDEOGRAPH
+ {0xCEDD, 0x630C}, //6719 #CJK UNIFIED IDEOGRAPH
+ {0xCEDE, 0x62F8}, //6720 #CJK UNIFIED IDEOGRAPH
+ {0xCEDF, 0x62F6}, //6721 #CJK UNIFIED IDEOGRAPH
+ {0xCEE0, 0x6300}, //6722 #CJK UNIFIED IDEOGRAPH
+ {0xCEE1, 0x6313}, //6723 #CJK UNIFIED IDEOGRAPH
+ {0xCEE2, 0x6314}, //6724 #CJK UNIFIED IDEOGRAPH
+ {0xCEE3, 0x62FA}, //6725 #CJK UNIFIED IDEOGRAPH
+ {0xCEE4, 0x6315}, //6726 #CJK UNIFIED IDEOGRAPH
+ {0xCEE5, 0x62FB}, //6727 #CJK UNIFIED IDEOGRAPH
+ {0xCEE6, 0x62F0}, //6728 #CJK UNIFIED IDEOGRAPH
+ {0xCEE7, 0x6541}, //6729 #CJK UNIFIED IDEOGRAPH
+ {0xCEE8, 0x6543}, //6730 #CJK UNIFIED IDEOGRAPH
+ {0xCEE9, 0x65AA}, //6731 #CJK UNIFIED IDEOGRAPH
+ {0xCEEA, 0x65BF}, //6732 #CJK UNIFIED IDEOGRAPH
+ {0xCEEB, 0x6636}, //6733 #CJK UNIFIED IDEOGRAPH
+ {0xCEEC, 0x6621}, //6734 #CJK UNIFIED IDEOGRAPH
+ {0xCEED, 0x6632}, //6735 #CJK UNIFIED IDEOGRAPH
+ {0xCEEE, 0x6635}, //6736 #CJK UNIFIED IDEOGRAPH
+ {0xCEEF, 0x661C}, //6737 #CJK UNIFIED IDEOGRAPH
+ {0xCEF0, 0x6626}, //6738 #CJK UNIFIED IDEOGRAPH
+ {0xCEF1, 0x6622}, //6739 #CJK UNIFIED IDEOGRAPH
+ {0xCEF2, 0x6633}, //6740 #CJK UNIFIED IDEOGRAPH
+ {0xCEF3, 0x662B}, //6741 #CJK UNIFIED IDEOGRAPH
+ {0xCEF4, 0x663A}, //6742 #CJK UNIFIED IDEOGRAPH
+ {0xCEF5, 0x661D}, //6743 #CJK UNIFIED IDEOGRAPH
+ {0xCEF6, 0x6634}, //6744 #CJK UNIFIED IDEOGRAPH
+ {0xCEF7, 0x6639}, //6745 #CJK UNIFIED IDEOGRAPH
+ {0xCEF8, 0x662E}, //6746 #CJK UNIFIED IDEOGRAPH
+ {0xCEF9, 0x670F}, //6747 #CJK UNIFIED IDEOGRAPH
+ {0xCEFA, 0x6710}, //6748 #CJK UNIFIED IDEOGRAPH
+ {0xCEFB, 0x67C1}, //6749 #CJK UNIFIED IDEOGRAPH
+ {0xCEFC, 0x67F2}, //6750 #CJK UNIFIED IDEOGRAPH
+ {0xCEFD, 0x67C8}, //6751 #CJK UNIFIED IDEOGRAPH
+ {0xCEFE, 0x67BA}, //6752 #CJK UNIFIED IDEOGRAPH
+ {0xCF40, 0x67DC}, //6753 #CJK UNIFIED IDEOGRAPH
+ {0xCF41, 0x67BB}, //6754 #CJK UNIFIED IDEOGRAPH
+ {0xCF42, 0x67F8}, //6755 #CJK UNIFIED IDEOGRAPH
+ {0xCF43, 0x67D8}, //6756 #CJK UNIFIED IDEOGRAPH
+ {0xCF44, 0x67C0}, //6757 #CJK UNIFIED IDEOGRAPH
+ {0xCF45, 0x67B7}, //6758 #CJK UNIFIED IDEOGRAPH
+ {0xCF46, 0x67C5}, //6759 #CJK UNIFIED IDEOGRAPH
+ {0xCF47, 0x67EB}, //6760 #CJK UNIFIED IDEOGRAPH
+ {0xCF48, 0x67E4}, //6761 #CJK UNIFIED IDEOGRAPH
+ {0xCF49, 0x67DF}, //6762 #CJK UNIFIED IDEOGRAPH
+ {0xCF4A, 0x67B5}, //6763 #CJK UNIFIED IDEOGRAPH
+ {0xCF4B, 0x67CD}, //6764 #CJK UNIFIED IDEOGRAPH
+ {0xCF4C, 0x67B3}, //6765 #CJK UNIFIED IDEOGRAPH
+ {0xCF4D, 0x67F7}, //6766 #CJK UNIFIED IDEOGRAPH
+ {0xCF4E, 0x67F6}, //6767 #CJK UNIFIED IDEOGRAPH
+ {0xCF4F, 0x67EE}, //6768 #CJK UNIFIED IDEOGRAPH
+ {0xCF50, 0x67E3}, //6769 #CJK UNIFIED IDEOGRAPH
+ {0xCF51, 0x67C2}, //6770 #CJK UNIFIED IDEOGRAPH
+ {0xCF52, 0x67B9}, //6771 #CJK UNIFIED IDEOGRAPH
+ {0xCF53, 0x67CE}, //6772 #CJK UNIFIED IDEOGRAPH
+ {0xCF54, 0x67E7}, //6773 #CJK UNIFIED IDEOGRAPH
+ {0xCF55, 0x67F0}, //6774 #CJK UNIFIED IDEOGRAPH
+ {0xCF56, 0x67B2}, //6775 #CJK UNIFIED IDEOGRAPH
+ {0xCF57, 0x67FC}, //6776 #CJK UNIFIED IDEOGRAPH
+ {0xCF58, 0x67C6}, //6777 #CJK UNIFIED IDEOGRAPH
+ {0xCF59, 0x67ED}, //6778 #CJK UNIFIED IDEOGRAPH
+ {0xCF5A, 0x67CC}, //6779 #CJK UNIFIED IDEOGRAPH
+ {0xCF5B, 0x67AE}, //6780 #CJK UNIFIED IDEOGRAPH
+ {0xCF5C, 0x67E6}, //6781 #CJK UNIFIED IDEOGRAPH
+ {0xCF5D, 0x67DB}, //6782 #CJK UNIFIED IDEOGRAPH
+ {0xCF5E, 0x67FA}, //6783 #CJK UNIFIED IDEOGRAPH
+ {0xCF5F, 0x67C9}, //6784 #CJK UNIFIED IDEOGRAPH
+ {0xCF60, 0x67CA}, //6785 #CJK UNIFIED IDEOGRAPH
+ {0xCF61, 0x67C3}, //6786 #CJK UNIFIED IDEOGRAPH
+ {0xCF62, 0x67EA}, //6787 #CJK UNIFIED IDEOGRAPH
+ {0xCF63, 0x67CB}, //6788 #CJK UNIFIED IDEOGRAPH
+ {0xCF64, 0x6B28}, //6789 #CJK UNIFIED IDEOGRAPH
+ {0xCF65, 0x6B82}, //6790 #CJK UNIFIED IDEOGRAPH
+ {0xCF66, 0x6B84}, //6791 #CJK UNIFIED IDEOGRAPH
+ {0xCF67, 0x6BB6}, //6792 #CJK UNIFIED IDEOGRAPH
+ {0xCF68, 0x6BD6}, //6793 #CJK UNIFIED IDEOGRAPH
+ {0xCF69, 0x6BD8}, //6794 #CJK UNIFIED IDEOGRAPH
+ {0xCF6A, 0x6BE0}, //6795 #CJK UNIFIED IDEOGRAPH
+ {0xCF6B, 0x6C20}, //6796 #CJK UNIFIED IDEOGRAPH
+ {0xCF6C, 0x6C21}, //6797 #CJK UNIFIED IDEOGRAPH
+ {0xCF6D, 0x6D28}, //6798 #CJK UNIFIED IDEOGRAPH
+ {0xCF6E, 0x6D34}, //6799 #CJK UNIFIED IDEOGRAPH
+ {0xCF6F, 0x6D2D}, //6800 #CJK UNIFIED IDEOGRAPH
+ {0xCF70, 0x6D1F}, //6801 #CJK UNIFIED IDEOGRAPH
+ {0xCF71, 0x6D3C}, //6802 #CJK UNIFIED IDEOGRAPH
+ {0xCF72, 0x6D3F}, //6803 #CJK UNIFIED IDEOGRAPH
+ {0xCF73, 0x6D12}, //6804 #CJK UNIFIED IDEOGRAPH
+ {0xCF74, 0x6D0A}, //6805 #CJK UNIFIED IDEOGRAPH
+ {0xCF75, 0x6CDA}, //6806 #CJK UNIFIED IDEOGRAPH
+ {0xCF76, 0x6D33}, //6807 #CJK UNIFIED IDEOGRAPH
+ {0xCF77, 0x6D04}, //6808 #CJK UNIFIED IDEOGRAPH
+ {0xCF78, 0x6D19}, //6809 #CJK UNIFIED IDEOGRAPH
+ {0xCF79, 0x6D3A}, //6810 #CJK UNIFIED IDEOGRAPH
+ {0xCF7A, 0x6D1A}, //6811 #CJK UNIFIED IDEOGRAPH
+ {0xCF7B, 0x6D11}, //6812 #CJK UNIFIED IDEOGRAPH
+ {0xCF7C, 0x6D00}, //6813 #CJK UNIFIED IDEOGRAPH
+ {0xCF7D, 0x6D1D}, //6814 #CJK UNIFIED IDEOGRAPH
+ {0xCF7E, 0x6D42}, //6815 #CJK UNIFIED IDEOGRAPH
+ {0xCFA1, 0x6D01}, //6816 #CJK UNIFIED IDEOGRAPH
+ {0xCFA2, 0x6D18}, //6817 #CJK UNIFIED IDEOGRAPH
+ {0xCFA3, 0x6D37}, //6818 #CJK UNIFIED IDEOGRAPH
+ {0xCFA4, 0x6D03}, //6819 #CJK UNIFIED IDEOGRAPH
+ {0xCFA5, 0x6D0F}, //6820 #CJK UNIFIED IDEOGRAPH
+ {0xCFA6, 0x6D40}, //6821 #CJK UNIFIED IDEOGRAPH
+ {0xCFA7, 0x6D07}, //6822 #CJK UNIFIED IDEOGRAPH
+ {0xCFA8, 0x6D20}, //6823 #CJK UNIFIED IDEOGRAPH
+ {0xCFA9, 0x6D2C}, //6824 #CJK UNIFIED IDEOGRAPH
+ {0xCFAA, 0x6D08}, //6825 #CJK UNIFIED IDEOGRAPH
+ {0xCFAB, 0x6D22}, //6826 #CJK UNIFIED IDEOGRAPH
+ {0xCFAC, 0x6D09}, //6827 #CJK UNIFIED IDEOGRAPH
+ {0xCFAD, 0x6D10}, //6828 #CJK UNIFIED IDEOGRAPH
+ {0xCFAE, 0x70B7}, //6829 #CJK UNIFIED IDEOGRAPH
+ {0xCFAF, 0x709F}, //6830 #CJK UNIFIED IDEOGRAPH
+ {0xCFB0, 0x70BE}, //6831 #CJK UNIFIED IDEOGRAPH
+ {0xCFB1, 0x70B1}, //6832 #CJK UNIFIED IDEOGRAPH
+ {0xCFB2, 0x70B0}, //6833 #CJK UNIFIED IDEOGRAPH
+ {0xCFB3, 0x70A1}, //6834 #CJK UNIFIED IDEOGRAPH
+ {0xCFB4, 0x70B4}, //6835 #CJK UNIFIED IDEOGRAPH
+ {0xCFB5, 0x70B5}, //6836 #CJK UNIFIED IDEOGRAPH
+ {0xCFB6, 0x70A9}, //6837 #CJK UNIFIED IDEOGRAPH
+ {0xCFB7, 0x7241}, //6838 #CJK UNIFIED IDEOGRAPH
+ {0xCFB8, 0x7249}, //6839 #CJK UNIFIED IDEOGRAPH
+ {0xCFB9, 0x724A}, //6840 #CJK UNIFIED IDEOGRAPH
+ {0xCFBA, 0x726C}, //6841 #CJK UNIFIED IDEOGRAPH
+ {0xCFBB, 0x7270}, //6842 #CJK UNIFIED IDEOGRAPH
+ {0xCFBC, 0x7273}, //6843 #CJK UNIFIED IDEOGRAPH
+ {0xCFBD, 0x726E}, //6844 #CJK UNIFIED IDEOGRAPH
+ {0xCFBE, 0x72CA}, //6845 #CJK UNIFIED IDEOGRAPH
+ {0xCFBF, 0x72E4}, //6846 #CJK UNIFIED IDEOGRAPH
+ {0xCFC0, 0x72E8}, //6847 #CJK UNIFIED IDEOGRAPH
+ {0xCFC1, 0x72EB}, //6848 #CJK UNIFIED IDEOGRAPH
+ {0xCFC2, 0x72DF}, //6849 #CJK UNIFIED IDEOGRAPH
+ {0xCFC3, 0x72EA}, //6850 #CJK UNIFIED IDEOGRAPH
+ {0xCFC4, 0x72E6}, //6851 #CJK UNIFIED IDEOGRAPH
+ {0xCFC5, 0x72E3}, //6852 #CJK UNIFIED IDEOGRAPH
+ {0xCFC6, 0x7385}, //6853 #CJK UNIFIED IDEOGRAPH
+ {0xCFC7, 0x73CC}, //6854 #CJK UNIFIED IDEOGRAPH
+ {0xCFC8, 0x73C2}, //6855 #CJK UNIFIED IDEOGRAPH
+ {0xCFC9, 0x73C8}, //6856 #CJK UNIFIED IDEOGRAPH
+ {0xCFCA, 0x73C5}, //6857 #CJK UNIFIED IDEOGRAPH
+ {0xCFCB, 0x73B9}, //6858 #CJK UNIFIED IDEOGRAPH
+ {0xCFCC, 0x73B6}, //6859 #CJK UNIFIED IDEOGRAPH
+ {0xCFCD, 0x73B5}, //6860 #CJK UNIFIED IDEOGRAPH
+ {0xCFCE, 0x73B4}, //6861 #CJK UNIFIED IDEOGRAPH
+ {0xCFCF, 0x73EB}, //6862 #CJK UNIFIED IDEOGRAPH
+ {0xCFD0, 0x73BF}, //6863 #CJK UNIFIED IDEOGRAPH
+ {0xCFD1, 0x73C7}, //6864 #CJK UNIFIED IDEOGRAPH
+ {0xCFD2, 0x73BE}, //6865 #CJK UNIFIED IDEOGRAPH
+ {0xCFD3, 0x73C3}, //6866 #CJK UNIFIED IDEOGRAPH
+ {0xCFD4, 0x73C6}, //6867 #CJK UNIFIED IDEOGRAPH
+ {0xCFD5, 0x73B8}, //6868 #CJK UNIFIED IDEOGRAPH
+ {0xCFD6, 0x73CB}, //6869 #CJK UNIFIED IDEOGRAPH
+ {0xCFD7, 0x74EC}, //6870 #CJK UNIFIED IDEOGRAPH
+ {0xCFD8, 0x74EE}, //6871 #CJK UNIFIED IDEOGRAPH
+ {0xCFD9, 0x752E}, //6872 #CJK UNIFIED IDEOGRAPH
+ {0xCFDA, 0x7547}, //6873 #CJK UNIFIED IDEOGRAPH
+ {0xCFDB, 0x7548}, //6874 #CJK UNIFIED IDEOGRAPH
+ {0xCFDC, 0x75A7}, //6875 #CJK UNIFIED IDEOGRAPH
+ {0xCFDD, 0x75AA}, //6876 #CJK UNIFIED IDEOGRAPH
+ {0xCFDE, 0x7679}, //6877 #CJK UNIFIED IDEOGRAPH
+ {0xCFDF, 0x76C4}, //6878 #CJK UNIFIED IDEOGRAPH
+ {0xCFE0, 0x7708}, //6879 #CJK UNIFIED IDEOGRAPH
+ {0xCFE1, 0x7703}, //6880 #CJK UNIFIED IDEOGRAPH
+ {0xCFE2, 0x7704}, //6881 #CJK UNIFIED IDEOGRAPH
+ {0xCFE3, 0x7705}, //6882 #CJK UNIFIED IDEOGRAPH
+ {0xCFE4, 0x770A}, //6883 #CJK UNIFIED IDEOGRAPH
+ {0xCFE5, 0x76F7}, //6884 #CJK UNIFIED IDEOGRAPH
+ {0xCFE6, 0x76FB}, //6885 #CJK UNIFIED IDEOGRAPH
+ {0xCFE7, 0x76FA}, //6886 #CJK UNIFIED IDEOGRAPH
+ {0xCFE8, 0x77E7}, //6887 #CJK UNIFIED IDEOGRAPH
+ {0xCFE9, 0x77E8}, //6888 #CJK UNIFIED IDEOGRAPH
+ {0xCFEA, 0x7806}, //6889 #CJK UNIFIED IDEOGRAPH
+ {0xCFEB, 0x7811}, //6890 #CJK UNIFIED IDEOGRAPH
+ {0xCFEC, 0x7812}, //6891 #CJK UNIFIED IDEOGRAPH
+ {0xCFED, 0x7805}, //6892 #CJK UNIFIED IDEOGRAPH
+ {0xCFEE, 0x7810}, //6893 #CJK UNIFIED IDEOGRAPH
+ {0xCFEF, 0x780F}, //6894 #CJK UNIFIED IDEOGRAPH
+ {0xCFF0, 0x780E}, //6895 #CJK UNIFIED IDEOGRAPH
+ {0xCFF1, 0x7809}, //6896 #CJK UNIFIED IDEOGRAPH
+ {0xCFF2, 0x7803}, //6897 #CJK UNIFIED IDEOGRAPH
+ {0xCFF3, 0x7813}, //6898 #CJK UNIFIED IDEOGRAPH
+ {0xCFF4, 0x794A}, //6899 #CJK UNIFIED IDEOGRAPH
+ {0xCFF5, 0x794C}, //6900 #CJK UNIFIED IDEOGRAPH
+ {0xCFF6, 0x794B}, //6901 #CJK UNIFIED IDEOGRAPH
+ {0xCFF7, 0x7945}, //6902 #CJK UNIFIED IDEOGRAPH
+ {0xCFF8, 0x7944}, //6903 #CJK UNIFIED IDEOGRAPH
+ {0xCFF9, 0x79D5}, //6904 #CJK UNIFIED IDEOGRAPH
+ {0xCFFA, 0x79CD}, //6905 #CJK UNIFIED IDEOGRAPH
+ {0xCFFB, 0x79CF}, //6906 #CJK UNIFIED IDEOGRAPH
+ {0xCFFC, 0x79D6}, //6907 #CJK UNIFIED IDEOGRAPH
+ {0xCFFD, 0x79CE}, //6908 #CJK UNIFIED IDEOGRAPH
+ {0xCFFE, 0x7A80}, //6909 #CJK UNIFIED IDEOGRAPH
+ {0xD040, 0x7A7E}, //6910 #CJK UNIFIED IDEOGRAPH
+ {0xD041, 0x7AD1}, //6911 #CJK UNIFIED IDEOGRAPH
+ {0xD042, 0x7B00}, //6912 #CJK UNIFIED IDEOGRAPH
+ {0xD043, 0x7B01}, //6913 #CJK UNIFIED IDEOGRAPH
+ {0xD044, 0x7C7A}, //6914 #CJK UNIFIED IDEOGRAPH
+ {0xD045, 0x7C78}, //6915 #CJK UNIFIED IDEOGRAPH
+ {0xD046, 0x7C79}, //6916 #CJK UNIFIED IDEOGRAPH
+ {0xD047, 0x7C7F}, //6917 #CJK UNIFIED IDEOGRAPH
+ {0xD048, 0x7C80}, //6918 #CJK UNIFIED IDEOGRAPH
+ {0xD049, 0x7C81}, //6919 #CJK UNIFIED IDEOGRAPH
+ {0xD04A, 0x7D03}, //6920 #CJK UNIFIED IDEOGRAPH
+ {0xD04B, 0x7D08}, //6921 #CJK UNIFIED IDEOGRAPH
+ {0xD04C, 0x7D01}, //6922 #CJK UNIFIED IDEOGRAPH
+ {0xD04D, 0x7F58}, //6923 #CJK UNIFIED IDEOGRAPH
+ {0xD04E, 0x7F91}, //6924 #CJK UNIFIED IDEOGRAPH
+ {0xD04F, 0x7F8D}, //6925 #CJK UNIFIED IDEOGRAPH
+ {0xD050, 0x7FBE}, //6926 #CJK UNIFIED IDEOGRAPH
+ {0xD051, 0x8007}, //6927 #CJK UNIFIED IDEOGRAPH
+ {0xD052, 0x800E}, //6928 #CJK UNIFIED IDEOGRAPH
+ {0xD053, 0x800F}, //6929 #CJK UNIFIED IDEOGRAPH
+ {0xD054, 0x8014}, //6930 #CJK UNIFIED IDEOGRAPH
+ {0xD055, 0x8037}, //6931 #CJK UNIFIED IDEOGRAPH
+ {0xD056, 0x80D8}, //6932 #CJK UNIFIED IDEOGRAPH
+ {0xD057, 0x80C7}, //6933 #CJK UNIFIED IDEOGRAPH
+ {0xD058, 0x80E0}, //6934 #CJK UNIFIED IDEOGRAPH
+ {0xD059, 0x80D1}, //6935 #CJK UNIFIED IDEOGRAPH
+ {0xD05A, 0x80C8}, //6936 #CJK UNIFIED IDEOGRAPH
+ {0xD05B, 0x80C2}, //6937 #CJK UNIFIED IDEOGRAPH
+ {0xD05C, 0x80D0}, //6938 #CJK UNIFIED IDEOGRAPH
+ {0xD05D, 0x80C5}, //6939 #CJK UNIFIED IDEOGRAPH
+ {0xD05E, 0x80E3}, //6940 #CJK UNIFIED IDEOGRAPH
+ {0xD05F, 0x80D9}, //6941 #CJK UNIFIED IDEOGRAPH
+ {0xD060, 0x80DC}, //6942 #CJK UNIFIED IDEOGRAPH
+ {0xD061, 0x80CA}, //6943 #CJK UNIFIED IDEOGRAPH
+ {0xD062, 0x80D5}, //6944 #CJK UNIFIED IDEOGRAPH
+ {0xD063, 0x80C9}, //6945 #CJK UNIFIED IDEOGRAPH
+ {0xD064, 0x80CF}, //6946 #CJK UNIFIED IDEOGRAPH
+ {0xD065, 0x80D7}, //6947 #CJK UNIFIED IDEOGRAPH
+ {0xD066, 0x80E6}, //6948 #CJK UNIFIED IDEOGRAPH
+ {0xD067, 0x80CD}, //6949 #CJK UNIFIED IDEOGRAPH
+ {0xD068, 0x81FF}, //6950 #CJK UNIFIED IDEOGRAPH
+ {0xD069, 0x8221}, //6951 #CJK UNIFIED IDEOGRAPH
+ {0xD06A, 0x8294}, //6952 #CJK UNIFIED IDEOGRAPH
+ {0xD06B, 0x82D9}, //6953 #CJK UNIFIED IDEOGRAPH
+ {0xD06C, 0x82FE}, //6954 #CJK UNIFIED IDEOGRAPH
+ {0xD06D, 0x82F9}, //6955 #CJK UNIFIED IDEOGRAPH
+ {0xD06E, 0x8307}, //6956 #CJK UNIFIED IDEOGRAPH
+ {0xD06F, 0x82E8}, //6957 #CJK UNIFIED IDEOGRAPH
+ {0xD070, 0x8300}, //6958 #CJK UNIFIED IDEOGRAPH
+ {0xD071, 0x82D5}, //6959 #CJK UNIFIED IDEOGRAPH
+ {0xD072, 0x833A}, //6960 #CJK UNIFIED IDEOGRAPH
+ {0xD073, 0x82EB}, //6961 #CJK UNIFIED IDEOGRAPH
+ {0xD074, 0x82D6}, //6962 #CJK UNIFIED IDEOGRAPH
+ {0xD075, 0x82F4}, //6963 #CJK UNIFIED IDEOGRAPH
+ {0xD076, 0x82EC}, //6964 #CJK UNIFIED IDEOGRAPH
+ {0xD077, 0x82E1}, //6965 #CJK UNIFIED IDEOGRAPH
+ {0xD078, 0x82F2}, //6966 #CJK UNIFIED IDEOGRAPH
+ {0xD079, 0x82F5}, //6967 #CJK UNIFIED IDEOGRAPH
+ {0xD07A, 0x830C}, //6968 #CJK UNIFIED IDEOGRAPH
+ {0xD07B, 0x82FB}, //6969 #CJK UNIFIED IDEOGRAPH
+ {0xD07C, 0x82F6}, //6970 #CJK UNIFIED IDEOGRAPH
+ {0xD07D, 0x82F0}, //6971 #CJK UNIFIED IDEOGRAPH
+ {0xD07E, 0x82EA}, //6972 #CJK UNIFIED IDEOGRAPH
+ {0xD0A1, 0x82E4}, //6973 #CJK UNIFIED IDEOGRAPH
+ {0xD0A2, 0x82E0}, //6974 #CJK UNIFIED IDEOGRAPH
+ {0xD0A3, 0x82FA}, //6975 #CJK UNIFIED IDEOGRAPH
+ {0xD0A4, 0x82F3}, //6976 #CJK UNIFIED IDEOGRAPH
+ {0xD0A5, 0x82ED}, //6977 #CJK UNIFIED IDEOGRAPH
+ {0xD0A6, 0x8677}, //6978 #CJK UNIFIED IDEOGRAPH
+ {0xD0A7, 0x8674}, //6979 #CJK UNIFIED IDEOGRAPH
+ {0xD0A8, 0x867C}, //6980 #CJK UNIFIED IDEOGRAPH
+ {0xD0A9, 0x8673}, //6981 #CJK UNIFIED IDEOGRAPH
+ {0xD0AA, 0x8841}, //6982 #CJK UNIFIED IDEOGRAPH
+ {0xD0AB, 0x884E}, //6983 #CJK UNIFIED IDEOGRAPH
+ {0xD0AC, 0x8867}, //6984 #CJK UNIFIED IDEOGRAPH
+ {0xD0AD, 0x886A}, //6985 #CJK UNIFIED IDEOGRAPH
+ {0xD0AE, 0x8869}, //6986 #CJK UNIFIED IDEOGRAPH
+ {0xD0AF, 0x89D3}, //6987 #CJK UNIFIED IDEOGRAPH
+ {0xD0B0, 0x8A04}, //6988 #CJK UNIFIED IDEOGRAPH
+ {0xD0B1, 0x8A07}, //6989 #CJK UNIFIED IDEOGRAPH
+ {0xD0B2, 0x8D72}, //6990 #CJK UNIFIED IDEOGRAPH
+ {0xD0B3, 0x8FE3}, //6991 #CJK UNIFIED IDEOGRAPH
+ {0xD0B4, 0x8FE1}, //6992 #CJK UNIFIED IDEOGRAPH
+ {0xD0B5, 0x8FEE}, //6993 #CJK UNIFIED IDEOGRAPH
+ {0xD0B6, 0x8FE0}, //6994 #CJK UNIFIED IDEOGRAPH
+ {0xD0B7, 0x90F1}, //6995 #CJK UNIFIED IDEOGRAPH
+ {0xD0B8, 0x90BD}, //6996 #CJK UNIFIED IDEOGRAPH
+ {0xD0B9, 0x90BF}, //6997 #CJK UNIFIED IDEOGRAPH
+ {0xD0BA, 0x90D5}, //6998 #CJK UNIFIED IDEOGRAPH
+ {0xD0BB, 0x90C5}, //6999 #CJK UNIFIED IDEOGRAPH
+ {0xD0BC, 0x90BE}, //7000 #CJK UNIFIED IDEOGRAPH
+ {0xD0BD, 0x90C7}, //7001 #CJK UNIFIED IDEOGRAPH
+ {0xD0BE, 0x90CB}, //7002 #CJK UNIFIED IDEOGRAPH
+ {0xD0BF, 0x90C8}, //7003 #CJK UNIFIED IDEOGRAPH
+ {0xD0C0, 0x91D4}, //7004 #CJK UNIFIED IDEOGRAPH
+ {0xD0C1, 0x91D3}, //7005 #CJK UNIFIED IDEOGRAPH
+ {0xD0C2, 0x9654}, //7006 #CJK UNIFIED IDEOGRAPH
+ {0xD0C3, 0x964F}, //7007 #CJK UNIFIED IDEOGRAPH
+ {0xD0C4, 0x9651}, //7008 #CJK UNIFIED IDEOGRAPH
+ {0xD0C5, 0x9653}, //7009 #CJK UNIFIED IDEOGRAPH
+ {0xD0C6, 0x964A}, //7010 #CJK UNIFIED IDEOGRAPH
+ {0xD0C7, 0x964E}, //7011 #CJK UNIFIED IDEOGRAPH
+ {0xD0C8, 0x501E}, //7012 #CJK UNIFIED IDEOGRAPH
+ {0xD0C9, 0x5005}, //7013 #CJK UNIFIED IDEOGRAPH
+ {0xD0CA, 0x5007}, //7014 #CJK UNIFIED IDEOGRAPH
+ {0xD0CB, 0x5013}, //7015 #CJK UNIFIED IDEOGRAPH
+ {0xD0CC, 0x5022}, //7016 #CJK UNIFIED IDEOGRAPH
+ {0xD0CD, 0x5030}, //7017 #CJK UNIFIED IDEOGRAPH
+ {0xD0CE, 0x501B}, //7018 #CJK UNIFIED IDEOGRAPH
+ {0xD0CF, 0x4FF5}, //7019 #CJK UNIFIED IDEOGRAPH
+ {0xD0D0, 0x4FF4}, //7020 #CJK UNIFIED IDEOGRAPH
+ {0xD0D1, 0x5033}, //7021 #CJK UNIFIED IDEOGRAPH
+ {0xD0D2, 0x5037}, //7022 #CJK UNIFIED IDEOGRAPH
+ {0xD0D3, 0x502C}, //7023 #CJK UNIFIED IDEOGRAPH
+ {0xD0D4, 0x4FF6}, //7024 #CJK UNIFIED IDEOGRAPH
+ {0xD0D5, 0x4FF7}, //7025 #CJK UNIFIED IDEOGRAPH
+ {0xD0D6, 0x5017}, //7026 #CJK UNIFIED IDEOGRAPH
+ {0xD0D7, 0x501C}, //7027 #CJK UNIFIED IDEOGRAPH
+ {0xD0D8, 0x5020}, //7028 #CJK UNIFIED IDEOGRAPH
+ {0xD0D9, 0x5027}, //7029 #CJK UNIFIED IDEOGRAPH
+ {0xD0DA, 0x5035}, //7030 #CJK UNIFIED IDEOGRAPH
+ {0xD0DB, 0x502F}, //7031 #CJK UNIFIED IDEOGRAPH
+ {0xD0DC, 0x5031}, //7032 #CJK UNIFIED IDEOGRAPH
+ {0xD0DD, 0x500E}, //7033 #CJK UNIFIED IDEOGRAPH
+ {0xD0DE, 0x515A}, //7034 #CJK UNIFIED IDEOGRAPH
+ {0xD0DF, 0x5194}, //7035 #CJK UNIFIED IDEOGRAPH
+ {0xD0E0, 0x5193}, //7036 #CJK UNIFIED IDEOGRAPH
+ {0xD0E1, 0x51CA}, //7037 #CJK UNIFIED IDEOGRAPH
+ {0xD0E2, 0x51C4}, //7038 #CJK UNIFIED IDEOGRAPH
+ {0xD0E3, 0x51C5}, //7039 #CJK UNIFIED IDEOGRAPH
+ {0xD0E4, 0x51C8}, //7040 #CJK UNIFIED IDEOGRAPH
+ {0xD0E5, 0x51CE}, //7041 #CJK UNIFIED IDEOGRAPH
+ {0xD0E6, 0x5261}, //7042 #CJK UNIFIED IDEOGRAPH
+ {0xD0E7, 0x525A}, //7043 #CJK UNIFIED IDEOGRAPH
+ {0xD0E8, 0x5252}, //7044 #CJK UNIFIED IDEOGRAPH
+ {0xD0E9, 0x525E}, //7045 #CJK UNIFIED IDEOGRAPH
+ {0xD0EA, 0x525F}, //7046 #CJK UNIFIED IDEOGRAPH
+ {0xD0EB, 0x5255}, //7047 #CJK UNIFIED IDEOGRAPH
+ {0xD0EC, 0x5262}, //7048 #CJK UNIFIED IDEOGRAPH
+ {0xD0ED, 0x52CD}, //7049 #CJK UNIFIED IDEOGRAPH
+ {0xD0EE, 0x530E}, //7050 #CJK UNIFIED IDEOGRAPH
+ {0xD0EF, 0x539E}, //7051 #CJK UNIFIED IDEOGRAPH
+ {0xD0F0, 0x5526}, //7052 #CJK UNIFIED IDEOGRAPH
+ {0xD0F1, 0x54E2}, //7053 #CJK UNIFIED IDEOGRAPH
+ {0xD0F2, 0x5517}, //7054 #CJK UNIFIED IDEOGRAPH
+ {0xD0F3, 0x5512}, //7055 #CJK UNIFIED IDEOGRAPH
+ {0xD0F4, 0x54E7}, //7056 #CJK UNIFIED IDEOGRAPH
+ {0xD0F5, 0x54F3}, //7057 #CJK UNIFIED IDEOGRAPH
+ {0xD0F6, 0x54E4}, //7058 #CJK UNIFIED IDEOGRAPH
+ {0xD0F7, 0x551A}, //7059 #CJK UNIFIED IDEOGRAPH
+ {0xD0F8, 0x54FF}, //7060 #CJK UNIFIED IDEOGRAPH
+ {0xD0F9, 0x5504}, //7061 #CJK UNIFIED IDEOGRAPH
+ {0xD0FA, 0x5508}, //7062 #CJK UNIFIED IDEOGRAPH
+ {0xD0FB, 0x54EB}, //7063 #CJK UNIFIED IDEOGRAPH
+ {0xD0FC, 0x5511}, //7064 #CJK UNIFIED IDEOGRAPH
+ {0xD0FD, 0x5505}, //7065 #CJK UNIFIED IDEOGRAPH
+ {0xD0FE, 0x54F1}, //7066 #CJK UNIFIED IDEOGRAPH
+ {0xD140, 0x550A}, //7067 #CJK UNIFIED IDEOGRAPH
+ {0xD141, 0x54FB}, //7068 #CJK UNIFIED IDEOGRAPH
+ {0xD142, 0x54F7}, //7069 #CJK UNIFIED IDEOGRAPH
+ {0xD143, 0x54F8}, //7070 #CJK UNIFIED IDEOGRAPH
+ {0xD144, 0x54E0}, //7071 #CJK UNIFIED IDEOGRAPH
+ {0xD145, 0x550E}, //7072 #CJK UNIFIED IDEOGRAPH
+ {0xD146, 0x5503}, //7073 #CJK UNIFIED IDEOGRAPH
+ {0xD147, 0x550B}, //7074 #CJK UNIFIED IDEOGRAPH
+ {0xD148, 0x5701}, //7075 #CJK UNIFIED IDEOGRAPH
+ {0xD149, 0x5702}, //7076 #CJK UNIFIED IDEOGRAPH
+ {0xD14A, 0x57CC}, //7077 #CJK UNIFIED IDEOGRAPH
+ {0xD14B, 0x5832}, //7078 #CJK UNIFIED IDEOGRAPH
+ {0xD14C, 0x57D5}, //7079 #CJK UNIFIED IDEOGRAPH
+ {0xD14D, 0x57D2}, //7080 #CJK UNIFIED IDEOGRAPH
+ {0xD14E, 0x57BA}, //7081 #CJK UNIFIED IDEOGRAPH
+ {0xD14F, 0x57C6}, //7082 #CJK UNIFIED IDEOGRAPH
+ {0xD150, 0x57BD}, //7083 #CJK UNIFIED IDEOGRAPH
+ {0xD151, 0x57BC}, //7084 #CJK UNIFIED IDEOGRAPH
+ {0xD152, 0x57B8}, //7085 #CJK UNIFIED IDEOGRAPH
+ {0xD153, 0x57B6}, //7086 #CJK UNIFIED IDEOGRAPH
+ {0xD154, 0x57BF}, //7087 #CJK UNIFIED IDEOGRAPH
+ {0xD155, 0x57C7}, //7088 #CJK UNIFIED IDEOGRAPH
+ {0xD156, 0x57D0}, //7089 #CJK UNIFIED IDEOGRAPH
+ {0xD157, 0x57B9}, //7090 #CJK UNIFIED IDEOGRAPH
+ {0xD158, 0x57C1}, //7091 #CJK UNIFIED IDEOGRAPH
+ {0xD159, 0x590E}, //7092 #CJK UNIFIED IDEOGRAPH
+ {0xD15A, 0x594A}, //7093 #CJK UNIFIED IDEOGRAPH
+ {0xD15B, 0x5A19}, //7094 #CJK UNIFIED IDEOGRAPH
+ {0xD15C, 0x5A16}, //7095 #CJK UNIFIED IDEOGRAPH
+ {0xD15D, 0x5A2D}, //7096 #CJK UNIFIED IDEOGRAPH
+ {0xD15E, 0x5A2E}, //7097 #CJK UNIFIED IDEOGRAPH
+ {0xD15F, 0x5A15}, //7098 #CJK UNIFIED IDEOGRAPH
+ {0xD160, 0x5A0F}, //7099 #CJK UNIFIED IDEOGRAPH
+ {0xD161, 0x5A17}, //7100 #CJK UNIFIED IDEOGRAPH
+ {0xD162, 0x5A0A}, //7101 #CJK UNIFIED IDEOGRAPH
+ {0xD163, 0x5A1E}, //7102 #CJK UNIFIED IDEOGRAPH
+ {0xD164, 0x5A33}, //7103 #CJK UNIFIED IDEOGRAPH
+ {0xD165, 0x5B6C}, //7104 #CJK UNIFIED IDEOGRAPH
+ {0xD166, 0x5BA7}, //7105 #CJK UNIFIED IDEOGRAPH
+ {0xD167, 0x5BAD}, //7106 #CJK UNIFIED IDEOGRAPH
+ {0xD168, 0x5BAC}, //7107 #CJK UNIFIED IDEOGRAPH
+ {0xD169, 0x5C03}, //7108 #CJK UNIFIED IDEOGRAPH
+ {0xD16A, 0x5C56}, //7109 #CJK UNIFIED IDEOGRAPH
+ {0xD16B, 0x5C54}, //7110 #CJK UNIFIED IDEOGRAPH
+ {0xD16C, 0x5CEC}, //7111 #CJK UNIFIED IDEOGRAPH
+ {0xD16D, 0x5CFF}, //7112 #CJK UNIFIED IDEOGRAPH
+ {0xD16E, 0x5CEE}, //7113 #CJK UNIFIED IDEOGRAPH
+ {0xD16F, 0x5CF1}, //7114 #CJK UNIFIED IDEOGRAPH
+ {0xD170, 0x5CF7}, //7115 #CJK UNIFIED IDEOGRAPH
+ {0xD171, 0x5D00}, //7116 #CJK UNIFIED IDEOGRAPH
+ {0xD172, 0x5CF9}, //7117 #CJK UNIFIED IDEOGRAPH
+ {0xD173, 0x5E29}, //7118 #CJK UNIFIED IDEOGRAPH
+ {0xD174, 0x5E28}, //7119 #CJK UNIFIED IDEOGRAPH
+ {0xD175, 0x5EA8}, //7120 #CJK UNIFIED IDEOGRAPH
+ {0xD176, 0x5EAE}, //7121 #CJK UNIFIED IDEOGRAPH
+ {0xD177, 0x5EAA}, //7122 #CJK UNIFIED IDEOGRAPH
+ {0xD178, 0x5EAC}, //7123 #CJK UNIFIED IDEOGRAPH
+ {0xD179, 0x5F33}, //7124 #CJK UNIFIED IDEOGRAPH
+ {0xD17A, 0x5F30}, //7125 #CJK UNIFIED IDEOGRAPH
+ {0xD17B, 0x5F67}, //7126 #CJK UNIFIED IDEOGRAPH
+ {0xD17C, 0x605D}, //7127 #CJK UNIFIED IDEOGRAPH
+ {0xD17D, 0x605A}, //7128 #CJK UNIFIED IDEOGRAPH
+ {0xD17E, 0x6067}, //7129 #CJK UNIFIED IDEOGRAPH
+ {0xD1A1, 0x6041}, //7130 #CJK UNIFIED IDEOGRAPH
+ {0xD1A2, 0x60A2}, //7131 #CJK UNIFIED IDEOGRAPH
+ {0xD1A3, 0x6088}, //7132 #CJK UNIFIED IDEOGRAPH
+ {0xD1A4, 0x6080}, //7133 #CJK UNIFIED IDEOGRAPH
+ {0xD1A5, 0x6092}, //7134 #CJK UNIFIED IDEOGRAPH
+ {0xD1A6, 0x6081}, //7135 #CJK UNIFIED IDEOGRAPH
+ {0xD1A7, 0x609D}, //7136 #CJK UNIFIED IDEOGRAPH
+ {0xD1A8, 0x6083}, //7137 #CJK UNIFIED IDEOGRAPH
+ {0xD1A9, 0x6095}, //7138 #CJK UNIFIED IDEOGRAPH
+ {0xD1AA, 0x609B}, //7139 #CJK UNIFIED IDEOGRAPH
+ {0xD1AB, 0x6097}, //7140 #CJK UNIFIED IDEOGRAPH
+ {0xD1AC, 0x6087}, //7141 #CJK UNIFIED IDEOGRAPH
+ {0xD1AD, 0x609C}, //7142 #CJK UNIFIED IDEOGRAPH
+ {0xD1AE, 0x608E}, //7143 #CJK UNIFIED IDEOGRAPH
+ {0xD1AF, 0x6219}, //7144 #CJK UNIFIED IDEOGRAPH
+ {0xD1B0, 0x6246}, //7145 #CJK UNIFIED IDEOGRAPH
+ {0xD1B1, 0x62F2}, //7146 #CJK UNIFIED IDEOGRAPH
+ {0xD1B2, 0x6310}, //7147 #CJK UNIFIED IDEOGRAPH
+ {0xD1B3, 0x6356}, //7148 #CJK UNIFIED IDEOGRAPH
+ {0xD1B4, 0x632C}, //7149 #CJK UNIFIED IDEOGRAPH
+ {0xD1B5, 0x6344}, //7150 #CJK UNIFIED IDEOGRAPH
+ {0xD1B6, 0x6345}, //7151 #CJK UNIFIED IDEOGRAPH
+ {0xD1B7, 0x6336}, //7152 #CJK UNIFIED IDEOGRAPH
+ {0xD1B8, 0x6343}, //7153 #CJK UNIFIED IDEOGRAPH
+ {0xD1B9, 0x63E4}, //7154 #CJK UNIFIED IDEOGRAPH
+ {0xD1BA, 0x6339}, //7155 #CJK UNIFIED IDEOGRAPH
+ {0xD1BB, 0x634B}, //7156 #CJK UNIFIED IDEOGRAPH
+ {0xD1BC, 0x634A}, //7157 #CJK UNIFIED IDEOGRAPH
+ {0xD1BD, 0x633C}, //7158 #CJK UNIFIED IDEOGRAPH
+ {0xD1BE, 0x6329}, //7159 #CJK UNIFIED IDEOGRAPH
+ {0xD1BF, 0x6341}, //7160 #CJK UNIFIED IDEOGRAPH
+ {0xD1C0, 0x6334}, //7161 #CJK UNIFIED IDEOGRAPH
+ {0xD1C1, 0x6358}, //7162 #CJK UNIFIED IDEOGRAPH
+ {0xD1C2, 0x6354}, //7163 #CJK UNIFIED IDEOGRAPH
+ {0xD1C3, 0x6359}, //7164 #CJK UNIFIED IDEOGRAPH
+ {0xD1C4, 0x632D}, //7165 #CJK UNIFIED IDEOGRAPH
+ {0xD1C5, 0x6347}, //7166 #CJK UNIFIED IDEOGRAPH
+ {0xD1C6, 0x6333}, //7167 #CJK UNIFIED IDEOGRAPH
+ {0xD1C7, 0x635A}, //7168 #CJK UNIFIED IDEOGRAPH
+ {0xD1C8, 0x6351}, //7169 #CJK UNIFIED IDEOGRAPH
+ {0xD1C9, 0x6338}, //7170 #CJK UNIFIED IDEOGRAPH
+ {0xD1CA, 0x6357}, //7171 #CJK UNIFIED IDEOGRAPH
+ {0xD1CB, 0x6340}, //7172 #CJK UNIFIED IDEOGRAPH
+ {0xD1CC, 0x6348}, //7173 #CJK UNIFIED IDEOGRAPH
+ {0xD1CD, 0x654A}, //7174 #CJK UNIFIED IDEOGRAPH
+ {0xD1CE, 0x6546}, //7175 #CJK UNIFIED IDEOGRAPH
+ {0xD1CF, 0x65C6}, //7176 #CJK UNIFIED IDEOGRAPH
+ {0xD1D0, 0x65C3}, //7177 #CJK UNIFIED IDEOGRAPH
+ {0xD1D1, 0x65C4}, //7178 #CJK UNIFIED IDEOGRAPH
+ {0xD1D2, 0x65C2}, //7179 #CJK UNIFIED IDEOGRAPH
+ {0xD1D3, 0x664A}, //7180 #CJK UNIFIED IDEOGRAPH
+ {0xD1D4, 0x665F}, //7181 #CJK UNIFIED IDEOGRAPH
+ {0xD1D5, 0x6647}, //7182 #CJK UNIFIED IDEOGRAPH
+ {0xD1D6, 0x6651}, //7183 #CJK UNIFIED IDEOGRAPH
+ {0xD1D7, 0x6712}, //7184 #CJK UNIFIED IDEOGRAPH
+ {0xD1D8, 0x6713}, //7185 #CJK UNIFIED IDEOGRAPH
+ {0xD1D9, 0x681F}, //7186 #CJK UNIFIED IDEOGRAPH
+ {0xD1DA, 0x681A}, //7187 #CJK UNIFIED IDEOGRAPH
+ {0xD1DB, 0x6849}, //7188 #CJK UNIFIED IDEOGRAPH
+ {0xD1DC, 0x6832}, //7189 #CJK UNIFIED IDEOGRAPH
+ {0xD1DD, 0x6833}, //7190 #CJK UNIFIED IDEOGRAPH
+ {0xD1DE, 0x683B}, //7191 #CJK UNIFIED IDEOGRAPH
+ {0xD1DF, 0x684B}, //7192 #CJK UNIFIED IDEOGRAPH
+ {0xD1E0, 0x684F}, //7193 #CJK UNIFIED IDEOGRAPH
+ {0xD1E1, 0x6816}, //7194 #CJK UNIFIED IDEOGRAPH
+ {0xD1E2, 0x6831}, //7195 #CJK UNIFIED IDEOGRAPH
+ {0xD1E3, 0x681C}, //7196 #CJK UNIFIED IDEOGRAPH
+ {0xD1E4, 0x6835}, //7197 #CJK UNIFIED IDEOGRAPH
+ {0xD1E5, 0x682B}, //7198 #CJK UNIFIED IDEOGRAPH
+ {0xD1E6, 0x682D}, //7199 #CJK UNIFIED IDEOGRAPH
+ {0xD1E7, 0x682F}, //7200 #CJK UNIFIED IDEOGRAPH
+ {0xD1E8, 0x684E}, //7201 #CJK UNIFIED IDEOGRAPH
+ {0xD1E9, 0x6844}, //7202 #CJK UNIFIED IDEOGRAPH
+ {0xD1EA, 0x6834}, //7203 #CJK UNIFIED IDEOGRAPH
+ {0xD1EB, 0x681D}, //7204 #CJK UNIFIED IDEOGRAPH
+ {0xD1EC, 0x6812}, //7205 #CJK UNIFIED IDEOGRAPH
+ {0xD1ED, 0x6814}, //7206 #CJK UNIFIED IDEOGRAPH
+ {0xD1EE, 0x6826}, //7207 #CJK UNIFIED IDEOGRAPH
+ {0xD1EF, 0x6828}, //7208 #CJK UNIFIED IDEOGRAPH
+ {0xD1F0, 0x682E}, //7209 #CJK UNIFIED IDEOGRAPH
+ {0xD1F1, 0x684D}, //7210 #CJK UNIFIED IDEOGRAPH
+ {0xD1F2, 0x683A}, //7211 #CJK UNIFIED IDEOGRAPH
+ {0xD1F3, 0x6825}, //7212 #CJK UNIFIED IDEOGRAPH
+ {0xD1F4, 0x6820}, //7213 #CJK UNIFIED IDEOGRAPH
+ {0xD1F5, 0x6B2C}, //7214 #CJK UNIFIED IDEOGRAPH
+ {0xD1F6, 0x6B2F}, //7215 #CJK UNIFIED IDEOGRAPH
+ {0xD1F7, 0x6B2D}, //7216 #CJK UNIFIED IDEOGRAPH
+ {0xD1F8, 0x6B31}, //7217 #CJK UNIFIED IDEOGRAPH
+ {0xD1F9, 0x6B34}, //7218 #CJK UNIFIED IDEOGRAPH
+ {0xD1FA, 0x6B6D}, //7219 #CJK UNIFIED IDEOGRAPH
+ {0xD1FB, 0x8082}, //7220 #CJK UNIFIED IDEOGRAPH
+ {0xD1FC, 0x6B88}, //7221 #CJK UNIFIED IDEOGRAPH
+ {0xD1FD, 0x6BE6}, //7222 #CJK UNIFIED IDEOGRAPH
+ {0xD1FE, 0x6BE4}, //7223 #CJK UNIFIED IDEOGRAPH
+ {0xD240, 0x6BE8}, //7224 #CJK UNIFIED IDEOGRAPH
+ {0xD241, 0x6BE3}, //7225 #CJK UNIFIED IDEOGRAPH
+ {0xD242, 0x6BE2}, //7226 #CJK UNIFIED IDEOGRAPH
+ {0xD243, 0x6BE7}, //7227 #CJK UNIFIED IDEOGRAPH
+ {0xD244, 0x6C25}, //7228 #CJK UNIFIED IDEOGRAPH
+ {0xD245, 0x6D7A}, //7229 #CJK UNIFIED IDEOGRAPH
+ {0xD246, 0x6D63}, //7230 #CJK UNIFIED IDEOGRAPH
+ {0xD247, 0x6D64}, //7231 #CJK UNIFIED IDEOGRAPH
+ {0xD248, 0x6D76}, //7232 #CJK UNIFIED IDEOGRAPH
+ {0xD249, 0x6D0D}, //7233 #CJK UNIFIED IDEOGRAPH
+ {0xD24A, 0x6D61}, //7234 #CJK UNIFIED IDEOGRAPH
+ {0xD24B, 0x6D92}, //7235 #CJK UNIFIED IDEOGRAPH
+ {0xD24C, 0x6D58}, //7236 #CJK UNIFIED IDEOGRAPH
+ {0xD24D, 0x6D62}, //7237 #CJK UNIFIED IDEOGRAPH
+ {0xD24E, 0x6D6D}, //7238 #CJK UNIFIED IDEOGRAPH
+ {0xD24F, 0x6D6F}, //7239 #CJK UNIFIED IDEOGRAPH
+ {0xD250, 0x6D91}, //7240 #CJK UNIFIED IDEOGRAPH
+ {0xD251, 0x6D8D}, //7241 #CJK UNIFIED IDEOGRAPH
+ {0xD252, 0x6DEF}, //7242 #CJK UNIFIED IDEOGRAPH
+ {0xD253, 0x6D7F}, //7243 #CJK UNIFIED IDEOGRAPH
+ {0xD254, 0x6D86}, //7244 #CJK UNIFIED IDEOGRAPH
+ {0xD255, 0x6D5E}, //7245 #CJK UNIFIED IDEOGRAPH
+ {0xD256, 0x6D67}, //7246 #CJK UNIFIED IDEOGRAPH
+ {0xD257, 0x6D60}, //7247 #CJK UNIFIED IDEOGRAPH
+ {0xD258, 0x6D97}, //7248 #CJK UNIFIED IDEOGRAPH
+ {0xD259, 0x6D70}, //7249 #CJK UNIFIED IDEOGRAPH
+ {0xD25A, 0x6D7C}, //7250 #CJK UNIFIED IDEOGRAPH
+ {0xD25B, 0x6D5F}, //7251 #CJK UNIFIED IDEOGRAPH
+ {0xD25C, 0x6D82}, //7252 #CJK UNIFIED IDEOGRAPH
+ {0xD25D, 0x6D98}, //7253 #CJK UNIFIED IDEOGRAPH
+ {0xD25E, 0x6D2F}, //7254 #CJK UNIFIED IDEOGRAPH
+ {0xD25F, 0x6D68}, //7255 #CJK UNIFIED IDEOGRAPH
+ {0xD260, 0x6D8B}, //7256 #CJK UNIFIED IDEOGRAPH
+ {0xD261, 0x6D7E}, //7257 #CJK UNIFIED IDEOGRAPH
+ {0xD262, 0x6D80}, //7258 #CJK UNIFIED IDEOGRAPH
+ {0xD263, 0x6D84}, //7259 #CJK UNIFIED IDEOGRAPH
+ {0xD264, 0x6D16}, //7260 #CJK UNIFIED IDEOGRAPH
+ {0xD265, 0x6D83}, //7261 #CJK UNIFIED IDEOGRAPH
+ {0xD266, 0x6D7B}, //7262 #CJK UNIFIED IDEOGRAPH
+ {0xD267, 0x6D7D}, //7263 #CJK UNIFIED IDEOGRAPH
+ {0xD268, 0x6D75}, //7264 #CJK UNIFIED IDEOGRAPH
+ {0xD269, 0x6D90}, //7265 #CJK UNIFIED IDEOGRAPH
+ {0xD26A, 0x70DC}, //7266 #CJK UNIFIED IDEOGRAPH
+ {0xD26B, 0x70D3}, //7267 #CJK UNIFIED IDEOGRAPH
+ {0xD26C, 0x70D1}, //7268 #CJK UNIFIED IDEOGRAPH
+ {0xD26D, 0x70DD}, //7269 #CJK UNIFIED IDEOGRAPH
+ {0xD26E, 0x70CB}, //7270 #CJK UNIFIED IDEOGRAPH
+ {0xD26F, 0x7F39}, //7271 #CJK UNIFIED IDEOGRAPH
+ {0xD270, 0x70E2}, //7272 #CJK UNIFIED IDEOGRAPH
+ {0xD271, 0x70D7}, //7273 #CJK UNIFIED IDEOGRAPH
+ {0xD272, 0x70D2}, //7274 #CJK UNIFIED IDEOGRAPH
+ {0xD273, 0x70DE}, //7275 #CJK UNIFIED IDEOGRAPH
+ {0xD274, 0x70E0}, //7276 #CJK UNIFIED IDEOGRAPH
+ {0xD275, 0x70D4}, //7277 #CJK UNIFIED IDEOGRAPH
+ {0xD276, 0x70CD}, //7278 #CJK UNIFIED IDEOGRAPH
+ {0xD277, 0x70C5}, //7279 #CJK UNIFIED IDEOGRAPH
+ {0xD278, 0x70C6}, //7280 #CJK UNIFIED IDEOGRAPH
+ {0xD279, 0x70C7}, //7281 #CJK UNIFIED IDEOGRAPH
+ {0xD27A, 0x70DA}, //7282 #CJK UNIFIED IDEOGRAPH
+ {0xD27B, 0x70CE}, //7283 #CJK UNIFIED IDEOGRAPH
+ {0xD27C, 0x70E1}, //7284 #CJK UNIFIED IDEOGRAPH
+ {0xD27D, 0x7242}, //7285 #CJK UNIFIED IDEOGRAPH
+ {0xD27E, 0x7278}, //7286 #CJK UNIFIED IDEOGRAPH
+ {0xD2A1, 0x7277}, //7287 #CJK UNIFIED IDEOGRAPH
+ {0xD2A2, 0x7276}, //7288 #CJK UNIFIED IDEOGRAPH
+ {0xD2A3, 0x7300}, //7289 #CJK UNIFIED IDEOGRAPH
+ {0xD2A4, 0x72FA}, //7290 #CJK UNIFIED IDEOGRAPH
+ {0xD2A5, 0x72F4}, //7291 #CJK UNIFIED IDEOGRAPH
+ {0xD2A6, 0x72FE}, //7292 #CJK UNIFIED IDEOGRAPH
+ {0xD2A7, 0x72F6}, //7293 #CJK UNIFIED IDEOGRAPH
+ {0xD2A8, 0x72F3}, //7294 #CJK UNIFIED IDEOGRAPH
+ {0xD2A9, 0x72FB}, //7295 #CJK UNIFIED IDEOGRAPH
+ {0xD2AA, 0x7301}, //7296 #CJK UNIFIED IDEOGRAPH
+ {0xD2AB, 0x73D3}, //7297 #CJK UNIFIED IDEOGRAPH
+ {0xD2AC, 0x73D9}, //7298 #CJK UNIFIED IDEOGRAPH
+ {0xD2AD, 0x73E5}, //7299 #CJK UNIFIED IDEOGRAPH
+ {0xD2AE, 0x73D6}, //7300 #CJK UNIFIED IDEOGRAPH
+ {0xD2AF, 0x73BC}, //7301 #CJK UNIFIED IDEOGRAPH
+ {0xD2B0, 0x73E7}, //7302 #CJK UNIFIED IDEOGRAPH
+ {0xD2B1, 0x73E3}, //7303 #CJK UNIFIED IDEOGRAPH
+ {0xD2B2, 0x73E9}, //7304 #CJK UNIFIED IDEOGRAPH
+ {0xD2B3, 0x73DC}, //7305 #CJK UNIFIED IDEOGRAPH
+ {0xD2B4, 0x73D2}, //7306 #CJK UNIFIED IDEOGRAPH
+ {0xD2B5, 0x73DB}, //7307 #CJK UNIFIED IDEOGRAPH
+ {0xD2B6, 0x73D4}, //7308 #CJK UNIFIED IDEOGRAPH
+ {0xD2B7, 0x73DD}, //7309 #CJK UNIFIED IDEOGRAPH
+ {0xD2B8, 0x73DA}, //7310 #CJK UNIFIED IDEOGRAPH
+ {0xD2B9, 0x73D7}, //7311 #CJK UNIFIED IDEOGRAPH
+ {0xD2BA, 0x73D8}, //7312 #CJK UNIFIED IDEOGRAPH
+ {0xD2BB, 0x73E8}, //7313 #CJK UNIFIED IDEOGRAPH
+ {0xD2BC, 0x74DE}, //7314 #CJK UNIFIED IDEOGRAPH
+ {0xD2BD, 0x74DF}, //7315 #CJK UNIFIED IDEOGRAPH
+ {0xD2BE, 0x74F4}, //7316 #CJK UNIFIED IDEOGRAPH
+ {0xD2BF, 0x74F5}, //7317 #CJK UNIFIED IDEOGRAPH
+ {0xD2C0, 0x7521}, //7318 #CJK UNIFIED IDEOGRAPH
+ {0xD2C1, 0x755B}, //7319 #CJK UNIFIED IDEOGRAPH
+ {0xD2C2, 0x755F}, //7320 #CJK UNIFIED IDEOGRAPH
+ {0xD2C3, 0x75B0}, //7321 #CJK UNIFIED IDEOGRAPH
+ {0xD2C4, 0x75C1}, //7322 #CJK UNIFIED IDEOGRAPH
+ {0xD2C5, 0x75BB}, //7323 #CJK UNIFIED IDEOGRAPH
+ {0xD2C6, 0x75C4}, //7324 #CJK UNIFIED IDEOGRAPH
+ {0xD2C7, 0x75C0}, //7325 #CJK UNIFIED IDEOGRAPH
+ {0xD2C8, 0x75BF}, //7326 #CJK UNIFIED IDEOGRAPH
+ {0xD2C9, 0x75B6}, //7327 #CJK UNIFIED IDEOGRAPH
+ {0xD2CA, 0x75BA}, //7328 #CJK UNIFIED IDEOGRAPH
+ {0xD2CB, 0x768A}, //7329 #CJK UNIFIED IDEOGRAPH
+ {0xD2CC, 0x76C9}, //7330 #CJK UNIFIED IDEOGRAPH
+ {0xD2CD, 0x771D}, //7331 #CJK UNIFIED IDEOGRAPH
+ {0xD2CE, 0x771B}, //7332 #CJK UNIFIED IDEOGRAPH
+ {0xD2CF, 0x7710}, //7333 #CJK UNIFIED IDEOGRAPH
+ {0xD2D0, 0x7713}, //7334 #CJK UNIFIED IDEOGRAPH
+ {0xD2D1, 0x7712}, //7335 #CJK UNIFIED IDEOGRAPH
+ {0xD2D2, 0x7723}, //7336 #CJK UNIFIED IDEOGRAPH
+ {0xD2D3, 0x7711}, //7337 #CJK UNIFIED IDEOGRAPH
+ {0xD2D4, 0x7715}, //7338 #CJK UNIFIED IDEOGRAPH
+ {0xD2D5, 0x7719}, //7339 #CJK UNIFIED IDEOGRAPH
+ {0xD2D6, 0x771A}, //7340 #CJK UNIFIED IDEOGRAPH
+ {0xD2D7, 0x7722}, //7341 #CJK UNIFIED IDEOGRAPH
+ {0xD2D8, 0x7727}, //7342 #CJK UNIFIED IDEOGRAPH
+ {0xD2D9, 0x7823}, //7343 #CJK UNIFIED IDEOGRAPH
+ {0xD2DA, 0x782C}, //7344 #CJK UNIFIED IDEOGRAPH
+ {0xD2DB, 0x7822}, //7345 #CJK UNIFIED IDEOGRAPH
+ {0xD2DC, 0x7835}, //7346 #CJK UNIFIED IDEOGRAPH
+ {0xD2DD, 0x782F}, //7347 #CJK UNIFIED IDEOGRAPH
+ {0xD2DE, 0x7828}, //7348 #CJK UNIFIED IDEOGRAPH
+ {0xD2DF, 0x782E}, //7349 #CJK UNIFIED IDEOGRAPH
+ {0xD2E0, 0x782B}, //7350 #CJK UNIFIED IDEOGRAPH
+ {0xD2E1, 0x7821}, //7351 #CJK UNIFIED IDEOGRAPH
+ {0xD2E2, 0x7829}, //7352 #CJK UNIFIED IDEOGRAPH
+ {0xD2E3, 0x7833}, //7353 #CJK UNIFIED IDEOGRAPH
+ {0xD2E4, 0x782A}, //7354 #CJK UNIFIED IDEOGRAPH
+ {0xD2E5, 0x7831}, //7355 #CJK UNIFIED IDEOGRAPH
+ {0xD2E6, 0x7954}, //7356 #CJK UNIFIED IDEOGRAPH
+ {0xD2E7, 0x795B}, //7357 #CJK UNIFIED IDEOGRAPH
+ {0xD2E8, 0x794F}, //7358 #CJK UNIFIED IDEOGRAPH
+ {0xD2E9, 0x795C}, //7359 #CJK UNIFIED IDEOGRAPH
+ {0xD2EA, 0x7953}, //7360 #CJK UNIFIED IDEOGRAPH
+ {0xD2EB, 0x7952}, //7361 #CJK UNIFIED IDEOGRAPH
+ {0xD2EC, 0x7951}, //7362 #CJK UNIFIED IDEOGRAPH
+ {0xD2ED, 0x79EB}, //7363 #CJK UNIFIED IDEOGRAPH
+ {0xD2EE, 0x79EC}, //7364 #CJK UNIFIED IDEOGRAPH
+ {0xD2EF, 0x79E0}, //7365 #CJK UNIFIED IDEOGRAPH
+ {0xD2F0, 0x79EE}, //7366 #CJK UNIFIED IDEOGRAPH
+ {0xD2F1, 0x79ED}, //7367 #CJK UNIFIED IDEOGRAPH
+ {0xD2F2, 0x79EA}, //7368 #CJK UNIFIED IDEOGRAPH
+ {0xD2F3, 0x79DC}, //7369 #CJK UNIFIED IDEOGRAPH
+ {0xD2F4, 0x79DE}, //7370 #CJK UNIFIED IDEOGRAPH
+ {0xD2F5, 0x79DD}, //7371 #CJK UNIFIED IDEOGRAPH
+ {0xD2F6, 0x7A86}, //7372 #CJK UNIFIED IDEOGRAPH
+ {0xD2F7, 0x7A89}, //7373 #CJK UNIFIED IDEOGRAPH
+ {0xD2F8, 0x7A85}, //7374 #CJK UNIFIED IDEOGRAPH
+ {0xD2F9, 0x7A8B}, //7375 #CJK UNIFIED IDEOGRAPH
+ {0xD2FA, 0x7A8C}, //7376 #CJK UNIFIED IDEOGRAPH
+ {0xD2FB, 0x7A8A}, //7377 #CJK UNIFIED IDEOGRAPH
+ {0xD2FC, 0x7A87}, //7378 #CJK UNIFIED IDEOGRAPH
+ {0xD2FD, 0x7AD8}, //7379 #CJK UNIFIED IDEOGRAPH
+ {0xD2FE, 0x7B10}, //7380 #CJK UNIFIED IDEOGRAPH
+ {0xD340, 0x7B04}, //7381 #CJK UNIFIED IDEOGRAPH
+ {0xD341, 0x7B13}, //7382 #CJK UNIFIED IDEOGRAPH
+ {0xD342, 0x7B05}, //7383 #CJK UNIFIED IDEOGRAPH
+ {0xD343, 0x7B0F}, //7384 #CJK UNIFIED IDEOGRAPH
+ {0xD344, 0x7B08}, //7385 #CJK UNIFIED IDEOGRAPH
+ {0xD345, 0x7B0A}, //7386 #CJK UNIFIED IDEOGRAPH
+ {0xD346, 0x7B0E}, //7387 #CJK UNIFIED IDEOGRAPH
+ {0xD347, 0x7B09}, //7388 #CJK UNIFIED IDEOGRAPH
+ {0xD348, 0x7B12}, //7389 #CJK UNIFIED IDEOGRAPH
+ {0xD349, 0x7C84}, //7390 #CJK UNIFIED IDEOGRAPH
+ {0xD34A, 0x7C91}, //7391 #CJK UNIFIED IDEOGRAPH
+ {0xD34B, 0x7C8A}, //7392 #CJK UNIFIED IDEOGRAPH
+ {0xD34C, 0x7C8C}, //7393 #CJK UNIFIED IDEOGRAPH
+ {0xD34D, 0x7C88}, //7394 #CJK UNIFIED IDEOGRAPH
+ {0xD34E, 0x7C8D}, //7395 #CJK UNIFIED IDEOGRAPH
+ {0xD34F, 0x7C85}, //7396 #CJK UNIFIED IDEOGRAPH
+ {0xD350, 0x7D1E}, //7397 #CJK UNIFIED IDEOGRAPH
+ {0xD351, 0x7D1D}, //7398 #CJK UNIFIED IDEOGRAPH
+ {0xD352, 0x7D11}, //7399 #CJK UNIFIED IDEOGRAPH
+ {0xD353, 0x7D0E}, //7400 #CJK UNIFIED IDEOGRAPH
+ {0xD354, 0x7D18}, //7401 #CJK UNIFIED IDEOGRAPH
+ {0xD355, 0x7D16}, //7402 #CJK UNIFIED IDEOGRAPH
+ {0xD356, 0x7D13}, //7403 #CJK UNIFIED IDEOGRAPH
+ {0xD357, 0x7D1F}, //7404 #CJK UNIFIED IDEOGRAPH
+ {0xD358, 0x7D12}, //7405 #CJK UNIFIED IDEOGRAPH
+ {0xD359, 0x7D0F}, //7406 #CJK UNIFIED IDEOGRAPH
+ {0xD35A, 0x7D0C}, //7407 #CJK UNIFIED IDEOGRAPH
+ {0xD35B, 0x7F5C}, //7408 #CJK UNIFIED IDEOGRAPH
+ {0xD35C, 0x7F61}, //7409 #CJK UNIFIED IDEOGRAPH
+ {0xD35D, 0x7F5E}, //7410 #CJK UNIFIED IDEOGRAPH
+ {0xD35E, 0x7F60}, //7411 #CJK UNIFIED IDEOGRAPH
+ {0xD35F, 0x7F5D}, //7412 #CJK UNIFIED IDEOGRAPH
+ {0xD360, 0x7F5B}, //7413 #CJK UNIFIED IDEOGRAPH
+ {0xD361, 0x7F96}, //7414 #CJK UNIFIED IDEOGRAPH
+ {0xD362, 0x7F92}, //7415 #CJK UNIFIED IDEOGRAPH
+ {0xD363, 0x7FC3}, //7416 #CJK UNIFIED IDEOGRAPH
+ {0xD364, 0x7FC2}, //7417 #CJK UNIFIED IDEOGRAPH
+ {0xD365, 0x7FC0}, //7418 #CJK UNIFIED IDEOGRAPH
+ {0xD366, 0x8016}, //7419 #CJK UNIFIED IDEOGRAPH
+ {0xD367, 0x803E}, //7420 #CJK UNIFIED IDEOGRAPH
+ {0xD368, 0x8039}, //7421 #CJK UNIFIED IDEOGRAPH
+ {0xD369, 0x80FA}, //7422 #CJK UNIFIED IDEOGRAPH
+ {0xD36A, 0x80F2}, //7423 #CJK UNIFIED IDEOGRAPH
+ {0xD36B, 0x80F9}, //7424 #CJK UNIFIED IDEOGRAPH
+ {0xD36C, 0x80F5}, //7425 #CJK UNIFIED IDEOGRAPH
+ {0xD36D, 0x8101}, //7426 #CJK UNIFIED IDEOGRAPH
+ {0xD36E, 0x80FB}, //7427 #CJK UNIFIED IDEOGRAPH
+ {0xD36F, 0x8100}, //7428 #CJK UNIFIED IDEOGRAPH
+ {0xD370, 0x8201}, //7429 #CJK UNIFIED IDEOGRAPH
+ {0xD371, 0x822F}, //7430 #CJK UNIFIED IDEOGRAPH
+ {0xD372, 0x8225}, //7431 #CJK UNIFIED IDEOGRAPH
+ {0xD373, 0x8333}, //7432 #CJK UNIFIED IDEOGRAPH
+ {0xD374, 0x832D}, //7433 #CJK UNIFIED IDEOGRAPH
+ {0xD375, 0x8344}, //7434 #CJK UNIFIED IDEOGRAPH
+ {0xD376, 0x8319}, //7435 #CJK UNIFIED IDEOGRAPH
+ {0xD377, 0x8351}, //7436 #CJK UNIFIED IDEOGRAPH
+ {0xD378, 0x8325}, //7437 #CJK UNIFIED IDEOGRAPH
+ {0xD379, 0x8356}, //7438 #CJK UNIFIED IDEOGRAPH
+ {0xD37A, 0x833F}, //7439 #CJK UNIFIED IDEOGRAPH
+ {0xD37B, 0x8341}, //7440 #CJK UNIFIED IDEOGRAPH
+ {0xD37C, 0x8326}, //7441 #CJK UNIFIED IDEOGRAPH
+ {0xD37D, 0x831C}, //7442 #CJK UNIFIED IDEOGRAPH
+ {0xD37E, 0x8322}, //7443 #CJK UNIFIED IDEOGRAPH
+ {0xD3A1, 0x8342}, //7444 #CJK UNIFIED IDEOGRAPH
+ {0xD3A2, 0x834E}, //7445 #CJK UNIFIED IDEOGRAPH
+ {0xD3A3, 0x831B}, //7446 #CJK UNIFIED IDEOGRAPH
+ {0xD3A4, 0x832A}, //7447 #CJK UNIFIED IDEOGRAPH
+ {0xD3A5, 0x8308}, //7448 #CJK UNIFIED IDEOGRAPH
+ {0xD3A6, 0x833C}, //7449 #CJK UNIFIED IDEOGRAPH
+ {0xD3A7, 0x834D}, //7450 #CJK UNIFIED IDEOGRAPH
+ {0xD3A8, 0x8316}, //7451 #CJK UNIFIED IDEOGRAPH
+ {0xD3A9, 0x8324}, //7452 #CJK UNIFIED IDEOGRAPH
+ {0xD3AA, 0x8320}, //7453 #CJK UNIFIED IDEOGRAPH
+ {0xD3AB, 0x8337}, //7454 #CJK UNIFIED IDEOGRAPH
+ {0xD3AC, 0x832F}, //7455 #CJK UNIFIED IDEOGRAPH
+ {0xD3AD, 0x8329}, //7456 #CJK UNIFIED IDEOGRAPH
+ {0xD3AE, 0x8347}, //7457 #CJK UNIFIED IDEOGRAPH
+ {0xD3AF, 0x8345}, //7458 #CJK UNIFIED IDEOGRAPH
+ {0xD3B0, 0x834C}, //7459 #CJK UNIFIED IDEOGRAPH
+ {0xD3B1, 0x8353}, //7460 #CJK UNIFIED IDEOGRAPH
+ {0xD3B2, 0x831E}, //7461 #CJK UNIFIED IDEOGRAPH
+ {0xD3B3, 0x832C}, //7462 #CJK UNIFIED IDEOGRAPH
+ {0xD3B4, 0x834B}, //7463 #CJK UNIFIED IDEOGRAPH
+ {0xD3B5, 0x8327}, //7464 #CJK UNIFIED IDEOGRAPH
+ {0xD3B6, 0x8348}, //7465 #CJK UNIFIED IDEOGRAPH
+ {0xD3B7, 0x8653}, //7466 #CJK UNIFIED IDEOGRAPH
+ {0xD3B8, 0x8652}, //7467 #CJK UNIFIED IDEOGRAPH
+ {0xD3B9, 0x86A2}, //7468 #CJK UNIFIED IDEOGRAPH
+ {0xD3BA, 0x86A8}, //7469 #CJK UNIFIED IDEOGRAPH
+ {0xD3BB, 0x8696}, //7470 #CJK UNIFIED IDEOGRAPH
+ {0xD3BC, 0x868D}, //7471 #CJK UNIFIED IDEOGRAPH
+ {0xD3BD, 0x8691}, //7472 #CJK UNIFIED IDEOGRAPH
+ {0xD3BE, 0x869E}, //7473 #CJK UNIFIED IDEOGRAPH
+ {0xD3BF, 0x8687}, //7474 #CJK UNIFIED IDEOGRAPH
+ {0xD3C0, 0x8697}, //7475 #CJK UNIFIED IDEOGRAPH
+ {0xD3C1, 0x8686}, //7476 #CJK UNIFIED IDEOGRAPH
+ {0xD3C2, 0x868B}, //7477 #CJK UNIFIED IDEOGRAPH
+ {0xD3C3, 0x869A}, //7478 #CJK UNIFIED IDEOGRAPH
+ {0xD3C4, 0x8685}, //7479 #CJK UNIFIED IDEOGRAPH
+ {0xD3C5, 0x86A5}, //7480 #CJK UNIFIED IDEOGRAPH
+ {0xD3C6, 0x8699}, //7481 #CJK UNIFIED IDEOGRAPH
+ {0xD3C7, 0x86A1}, //7482 #CJK UNIFIED IDEOGRAPH
+ {0xD3C8, 0x86A7}, //7483 #CJK UNIFIED IDEOGRAPH
+ {0xD3C9, 0x8695}, //7484 #CJK UNIFIED IDEOGRAPH
+ {0xD3CA, 0x8698}, //7485 #CJK UNIFIED IDEOGRAPH
+ {0xD3CB, 0x868E}, //7486 #CJK UNIFIED IDEOGRAPH
+ {0xD3CC, 0x869D}, //7487 #CJK UNIFIED IDEOGRAPH
+ {0xD3CD, 0x8690}, //7488 #CJK UNIFIED IDEOGRAPH
+ {0xD3CE, 0x8694}, //7489 #CJK UNIFIED IDEOGRAPH
+ {0xD3CF, 0x8843}, //7490 #CJK UNIFIED IDEOGRAPH
+ {0xD3D0, 0x8844}, //7491 #CJK UNIFIED IDEOGRAPH
+ {0xD3D1, 0x886D}, //7492 #CJK UNIFIED IDEOGRAPH
+ {0xD3D2, 0x8875}, //7493 #CJK UNIFIED IDEOGRAPH
+ {0xD3D3, 0x8876}, //7494 #CJK UNIFIED IDEOGRAPH
+ {0xD3D4, 0x8872}, //7495 #CJK UNIFIED IDEOGRAPH
+ {0xD3D5, 0x8880}, //7496 #CJK UNIFIED IDEOGRAPH
+ {0xD3D6, 0x8871}, //7497 #CJK UNIFIED IDEOGRAPH
+ {0xD3D7, 0x887F}, //7498 #CJK UNIFIED IDEOGRAPH
+ {0xD3D8, 0x886F}, //7499 #CJK UNIFIED IDEOGRAPH
+ {0xD3D9, 0x8883}, //7500 #CJK UNIFIED IDEOGRAPH
+ {0xD3DA, 0x887E}, //7501 #CJK UNIFIED IDEOGRAPH
+ {0xD3DB, 0x8874}, //7502 #CJK UNIFIED IDEOGRAPH
+ {0xD3DC, 0x887C}, //7503 #CJK UNIFIED IDEOGRAPH
+ {0xD3DD, 0x8A12}, //7504 #CJK UNIFIED IDEOGRAPH
+ {0xD3DE, 0x8C47}, //7505 #CJK UNIFIED IDEOGRAPH
+ {0xD3DF, 0x8C57}, //7506 #CJK UNIFIED IDEOGRAPH
+ {0xD3E0, 0x8C7B}, //7507 #CJK UNIFIED IDEOGRAPH
+ {0xD3E1, 0x8CA4}, //7508 #CJK UNIFIED IDEOGRAPH
+ {0xD3E2, 0x8CA3}, //7509 #CJK UNIFIED IDEOGRAPH
+ {0xD3E3, 0x8D76}, //7510 #CJK UNIFIED IDEOGRAPH
+ {0xD3E4, 0x8D78}, //7511 #CJK UNIFIED IDEOGRAPH
+ {0xD3E5, 0x8DB5}, //7512 #CJK UNIFIED IDEOGRAPH
+ {0xD3E6, 0x8DB7}, //7513 #CJK UNIFIED IDEOGRAPH
+ {0xD3E7, 0x8DB6}, //7514 #CJK UNIFIED IDEOGRAPH
+ {0xD3E8, 0x8ED1}, //7515 #CJK UNIFIED IDEOGRAPH
+ {0xD3E9, 0x8ED3}, //7516 #CJK UNIFIED IDEOGRAPH
+ {0xD3EA, 0x8FFE}, //7517 #CJK UNIFIED IDEOGRAPH
+ {0xD3EB, 0x8FF5}, //7518 #CJK UNIFIED IDEOGRAPH
+ {0xD3EC, 0x9002}, //7519 #CJK UNIFIED IDEOGRAPH
+ {0xD3ED, 0x8FFF}, //7520 #CJK UNIFIED IDEOGRAPH
+ {0xD3EE, 0x8FFB}, //7521 #CJK UNIFIED IDEOGRAPH
+ {0xD3EF, 0x9004}, //7522 #CJK UNIFIED IDEOGRAPH
+ {0xD3F0, 0x8FFC}, //7523 #CJK UNIFIED IDEOGRAPH
+ {0xD3F1, 0x8FF6}, //7524 #CJK UNIFIED IDEOGRAPH
+ {0xD3F2, 0x90D6}, //7525 #CJK UNIFIED IDEOGRAPH
+ {0xD3F3, 0x90E0}, //7526 #CJK UNIFIED IDEOGRAPH
+ {0xD3F4, 0x90D9}, //7527 #CJK UNIFIED IDEOGRAPH
+ {0xD3F5, 0x90DA}, //7528 #CJK UNIFIED IDEOGRAPH
+ {0xD3F6, 0x90E3}, //7529 #CJK UNIFIED IDEOGRAPH
+ {0xD3F7, 0x90DF}, //7530 #CJK UNIFIED IDEOGRAPH
+ {0xD3F8, 0x90E5}, //7531 #CJK UNIFIED IDEOGRAPH
+ {0xD3F9, 0x90D8}, //7532 #CJK UNIFIED IDEOGRAPH
+ {0xD3FA, 0x90DB}, //7533 #CJK UNIFIED IDEOGRAPH
+ {0xD3FB, 0x90D7}, //7534 #CJK UNIFIED IDEOGRAPH
+ {0xD3FC, 0x90DC}, //7535 #CJK UNIFIED IDEOGRAPH
+ {0xD3FD, 0x90E4}, //7536 #CJK UNIFIED IDEOGRAPH
+ {0xD3FE, 0x9150}, //7537 #CJK UNIFIED IDEOGRAPH
+ {0xD440, 0x914E}, //7538 #CJK UNIFIED IDEOGRAPH
+ {0xD441, 0x914F}, //7539 #CJK UNIFIED IDEOGRAPH
+ {0xD442, 0x91D5}, //7540 #CJK UNIFIED IDEOGRAPH
+ {0xD443, 0x91E2}, //7541 #CJK UNIFIED IDEOGRAPH
+ {0xD444, 0x91DA}, //7542 #CJK UNIFIED IDEOGRAPH
+ {0xD445, 0x965C}, //7543 #CJK UNIFIED IDEOGRAPH
+ {0xD446, 0x965F}, //7544 #CJK UNIFIED IDEOGRAPH
+ {0xD447, 0x96BC}, //7545 #CJK UNIFIED IDEOGRAPH
+ {0xD448, 0x98E3}, //7546 #CJK UNIFIED IDEOGRAPH
+ {0xD449, 0x9ADF}, //7547 #CJK UNIFIED IDEOGRAPH
+ {0xD44A, 0x9B2F}, //7548 #CJK UNIFIED IDEOGRAPH
+ {0xD44B, 0x4E7F}, //7549 #CJK UNIFIED IDEOGRAPH
+ {0xD44C, 0x5070}, //7550 #CJK UNIFIED IDEOGRAPH
+ {0xD44D, 0x506A}, //7551 #CJK UNIFIED IDEOGRAPH
+ {0xD44E, 0x5061}, //7552 #CJK UNIFIED IDEOGRAPH
+ {0xD44F, 0x505E}, //7553 #CJK UNIFIED IDEOGRAPH
+ {0xD450, 0x5060}, //7554 #CJK UNIFIED IDEOGRAPH
+ {0xD451, 0x5053}, //7555 #CJK UNIFIED IDEOGRAPH
+ {0xD452, 0x504B}, //7556 #CJK UNIFIED IDEOGRAPH
+ {0xD453, 0x505D}, //7557 #CJK UNIFIED IDEOGRAPH
+ {0xD454, 0x5072}, //7558 #CJK UNIFIED IDEOGRAPH
+ {0xD455, 0x5048}, //7559 #CJK UNIFIED IDEOGRAPH
+ {0xD456, 0x504D}, //7560 #CJK UNIFIED IDEOGRAPH
+ {0xD457, 0x5041}, //7561 #CJK UNIFIED IDEOGRAPH
+ {0xD458, 0x505B}, //7562 #CJK UNIFIED IDEOGRAPH
+ {0xD459, 0x504A}, //7563 #CJK UNIFIED IDEOGRAPH
+ {0xD45A, 0x5062}, //7564 #CJK UNIFIED IDEOGRAPH
+ {0xD45B, 0x5015}, //7565 #CJK UNIFIED IDEOGRAPH
+ {0xD45C, 0x5045}, //7566 #CJK UNIFIED IDEOGRAPH
+ {0xD45D, 0x505F}, //7567 #CJK UNIFIED IDEOGRAPH
+ {0xD45E, 0x5069}, //7568 #CJK UNIFIED IDEOGRAPH
+ {0xD45F, 0x506B}, //7569 #CJK UNIFIED IDEOGRAPH
+ {0xD460, 0x5063}, //7570 #CJK UNIFIED IDEOGRAPH
+ {0xD461, 0x5064}, //7571 #CJK UNIFIED IDEOGRAPH
+ {0xD462, 0x5046}, //7572 #CJK UNIFIED IDEOGRAPH
+ {0xD463, 0x5040}, //7573 #CJK UNIFIED IDEOGRAPH
+ {0xD464, 0x506E}, //7574 #CJK UNIFIED IDEOGRAPH
+ {0xD465, 0x5073}, //7575 #CJK UNIFIED IDEOGRAPH
+ {0xD466, 0x5057}, //7576 #CJK UNIFIED IDEOGRAPH
+ {0xD467, 0x5051}, //7577 #CJK UNIFIED IDEOGRAPH
+ {0xD468, 0x51D0}, //7578 #CJK UNIFIED IDEOGRAPH
+ {0xD469, 0x526B}, //7579 #CJK UNIFIED IDEOGRAPH
+ {0xD46A, 0x526D}, //7580 #CJK UNIFIED IDEOGRAPH
+ {0xD46B, 0x526C}, //7581 #CJK UNIFIED IDEOGRAPH
+ {0xD46C, 0x526E}, //7582 #CJK UNIFIED IDEOGRAPH
+ {0xD46D, 0x52D6}, //7583 #CJK UNIFIED IDEOGRAPH
+ {0xD46E, 0x52D3}, //7584 #CJK UNIFIED IDEOGRAPH
+ {0xD46F, 0x532D}, //7585 #CJK UNIFIED IDEOGRAPH
+ {0xD470, 0x539C}, //7586 #CJK UNIFIED IDEOGRAPH
+ {0xD471, 0x5575}, //7587 #CJK UNIFIED IDEOGRAPH
+ {0xD472, 0x5576}, //7588 #CJK UNIFIED IDEOGRAPH
+ {0xD473, 0x553C}, //7589 #CJK UNIFIED IDEOGRAPH
+ {0xD474, 0x554D}, //7590 #CJK UNIFIED IDEOGRAPH
+ {0xD475, 0x5550}, //7591 #CJK UNIFIED IDEOGRAPH
+ {0xD476, 0x5534}, //7592 #CJK UNIFIED IDEOGRAPH
+ {0xD477, 0x552A}, //7593 #CJK UNIFIED IDEOGRAPH
+ {0xD478, 0x5551}, //7594 #CJK UNIFIED IDEOGRAPH
+ {0xD479, 0x5562}, //7595 #CJK UNIFIED IDEOGRAPH
+ {0xD47A, 0x5536}, //7596 #CJK UNIFIED IDEOGRAPH
+ {0xD47B, 0x5535}, //7597 #CJK UNIFIED IDEOGRAPH
+ {0xD47C, 0x5530}, //7598 #CJK UNIFIED IDEOGRAPH
+ {0xD47D, 0x5552}, //7599 #CJK UNIFIED IDEOGRAPH
+ {0xD47E, 0x5545}, //7600 #CJK UNIFIED IDEOGRAPH
+ {0xD4A1, 0x550C}, //7601 #CJK UNIFIED IDEOGRAPH
+ {0xD4A2, 0x5532}, //7602 #CJK UNIFIED IDEOGRAPH
+ {0xD4A3, 0x5565}, //7603 #CJK UNIFIED IDEOGRAPH
+ {0xD4A4, 0x554E}, //7604 #CJK UNIFIED IDEOGRAPH
+ {0xD4A5, 0x5539}, //7605 #CJK UNIFIED IDEOGRAPH
+ {0xD4A6, 0x5548}, //7606 #CJK UNIFIED IDEOGRAPH
+ {0xD4A7, 0x552D}, //7607 #CJK UNIFIED IDEOGRAPH
+ {0xD4A8, 0x553B}, //7608 #CJK UNIFIED IDEOGRAPH
+ {0xD4A9, 0x5540}, //7609 #CJK UNIFIED IDEOGRAPH
+ {0xD4AA, 0x554B}, //7610 #CJK UNIFIED IDEOGRAPH
+ {0xD4AB, 0x570A}, //7611 #CJK UNIFIED IDEOGRAPH
+ {0xD4AC, 0x5707}, //7612 #CJK UNIFIED IDEOGRAPH
+ {0xD4AD, 0x57FB}, //7613 #CJK UNIFIED IDEOGRAPH
+ {0xD4AE, 0x5814}, //7614 #CJK UNIFIED IDEOGRAPH
+ {0xD4AF, 0x57E2}, //7615 #CJK UNIFIED IDEOGRAPH
+ {0xD4B0, 0x57F6}, //7616 #CJK UNIFIED IDEOGRAPH
+ {0xD4B1, 0x57DC}, //7617 #CJK UNIFIED IDEOGRAPH
+ {0xD4B2, 0x57F4}, //7618 #CJK UNIFIED IDEOGRAPH
+ {0xD4B3, 0x5800}, //7619 #CJK UNIFIED IDEOGRAPH
+ {0xD4B4, 0x57ED}, //7620 #CJK UNIFIED IDEOGRAPH
+ {0xD4B5, 0x57FD}, //7621 #CJK UNIFIED IDEOGRAPH
+ {0xD4B6, 0x5808}, //7622 #CJK UNIFIED IDEOGRAPH
+ {0xD4B7, 0x57F8}, //7623 #CJK UNIFIED IDEOGRAPH
+ {0xD4B8, 0x580B}, //7624 #CJK UNIFIED IDEOGRAPH
+ {0xD4B9, 0x57F3}, //7625 #CJK UNIFIED IDEOGRAPH
+ {0xD4BA, 0x57CF}, //7626 #CJK UNIFIED IDEOGRAPH
+ {0xD4BB, 0x5807}, //7627 #CJK UNIFIED IDEOGRAPH
+ {0xD4BC, 0x57EE}, //7628 #CJK UNIFIED IDEOGRAPH
+ {0xD4BD, 0x57E3}, //7629 #CJK UNIFIED IDEOGRAPH
+ {0xD4BE, 0x57F2}, //7630 #CJK UNIFIED IDEOGRAPH
+ {0xD4BF, 0x57E5}, //7631 #CJK UNIFIED IDEOGRAPH
+ {0xD4C0, 0x57EC}, //7632 #CJK UNIFIED IDEOGRAPH
+ {0xD4C1, 0x57E1}, //7633 #CJK UNIFIED IDEOGRAPH
+ {0xD4C2, 0x580E}, //7634 #CJK UNIFIED IDEOGRAPH
+ {0xD4C3, 0x57FC}, //7635 #CJK UNIFIED IDEOGRAPH
+ {0xD4C4, 0x5810}, //7636 #CJK UNIFIED IDEOGRAPH
+ {0xD4C5, 0x57E7}, //7637 #CJK UNIFIED IDEOGRAPH
+ {0xD4C6, 0x5801}, //7638 #CJK UNIFIED IDEOGRAPH
+ {0xD4C7, 0x580C}, //7639 #CJK UNIFIED IDEOGRAPH
+ {0xD4C8, 0x57F1}, //7640 #CJK UNIFIED IDEOGRAPH
+ {0xD4C9, 0x57E9}, //7641 #CJK UNIFIED IDEOGRAPH
+ {0xD4CA, 0x57F0}, //7642 #CJK UNIFIED IDEOGRAPH
+ {0xD4CB, 0x580D}, //7643 #CJK UNIFIED IDEOGRAPH
+ {0xD4CC, 0x5804}, //7644 #CJK UNIFIED IDEOGRAPH
+ {0xD4CD, 0x595C}, //7645 #CJK UNIFIED IDEOGRAPH
+ {0xD4CE, 0x5A60}, //7646 #CJK UNIFIED IDEOGRAPH
+ {0xD4CF, 0x5A58}, //7647 #CJK UNIFIED IDEOGRAPH
+ {0xD4D0, 0x5A55}, //7648 #CJK UNIFIED IDEOGRAPH
+ {0xD4D1, 0x5A67}, //7649 #CJK UNIFIED IDEOGRAPH
+ {0xD4D2, 0x5A5E}, //7650 #CJK UNIFIED IDEOGRAPH
+ {0xD4D3, 0x5A38}, //7651 #CJK UNIFIED IDEOGRAPH
+ {0xD4D4, 0x5A35}, //7652 #CJK UNIFIED IDEOGRAPH
+ {0xD4D5, 0x5A6D}, //7653 #CJK UNIFIED IDEOGRAPH
+ {0xD4D6, 0x5A50}, //7654 #CJK UNIFIED IDEOGRAPH
+ {0xD4D7, 0x5A5F}, //7655 #CJK UNIFIED IDEOGRAPH
+ {0xD4D8, 0x5A65}, //7656 #CJK UNIFIED IDEOGRAPH
+ {0xD4D9, 0x5A6C}, //7657 #CJK UNIFIED IDEOGRAPH
+ {0xD4DA, 0x5A53}, //7658 #CJK UNIFIED IDEOGRAPH
+ {0xD4DB, 0x5A64}, //7659 #CJK UNIFIED IDEOGRAPH
+ {0xD4DC, 0x5A57}, //7660 #CJK UNIFIED IDEOGRAPH
+ {0xD4DD, 0x5A43}, //7661 #CJK UNIFIED IDEOGRAPH
+ {0xD4DE, 0x5A5D}, //7662 #CJK UNIFIED IDEOGRAPH
+ {0xD4DF, 0x5A52}, //7663 #CJK UNIFIED IDEOGRAPH
+ {0xD4E0, 0x5A44}, //7664 #CJK UNIFIED IDEOGRAPH
+ {0xD4E1, 0x5A5B}, //7665 #CJK UNIFIED IDEOGRAPH
+ {0xD4E2, 0x5A48}, //7666 #CJK UNIFIED IDEOGRAPH
+ {0xD4E3, 0x5A8E}, //7667 #CJK UNIFIED IDEOGRAPH
+ {0xD4E4, 0x5A3E}, //7668 #CJK UNIFIED IDEOGRAPH
+ {0xD4E5, 0x5A4D}, //7669 #CJK UNIFIED IDEOGRAPH
+ {0xD4E6, 0x5A39}, //7670 #CJK UNIFIED IDEOGRAPH
+ {0xD4E7, 0x5A4C}, //7671 #CJK UNIFIED IDEOGRAPH
+ {0xD4E8, 0x5A70}, //7672 #CJK UNIFIED IDEOGRAPH
+ {0xD4E9, 0x5A69}, //7673 #CJK UNIFIED IDEOGRAPH
+ {0xD4EA, 0x5A47}, //7674 #CJK UNIFIED IDEOGRAPH
+ {0xD4EB, 0x5A51}, //7675 #CJK UNIFIED IDEOGRAPH
+ {0xD4EC, 0x5A56}, //7676 #CJK UNIFIED IDEOGRAPH
+ {0xD4ED, 0x5A42}, //7677 #CJK UNIFIED IDEOGRAPH
+ {0xD4EE, 0x5A5C}, //7678 #CJK UNIFIED IDEOGRAPH
+ {0xD4EF, 0x5B72}, //7679 #CJK UNIFIED IDEOGRAPH
+ {0xD4F0, 0x5B6E}, //7680 #CJK UNIFIED IDEOGRAPH
+ {0xD4F1, 0x5BC1}, //7681 #CJK UNIFIED IDEOGRAPH
+ {0xD4F2, 0x5BC0}, //7682 #CJK UNIFIED IDEOGRAPH
+ {0xD4F3, 0x5C59}, //7683 #CJK UNIFIED IDEOGRAPH
+ {0xD4F4, 0x5D1E}, //7684 #CJK UNIFIED IDEOGRAPH
+ {0xD4F5, 0x5D0B}, //7685 #CJK UNIFIED IDEOGRAPH
+ {0xD4F6, 0x5D1D}, //7686 #CJK UNIFIED IDEOGRAPH
+ {0xD4F7, 0x5D1A}, //7687 #CJK UNIFIED IDEOGRAPH
+ {0xD4F8, 0x5D20}, //7688 #CJK UNIFIED IDEOGRAPH
+ {0xD4F9, 0x5D0C}, //7689 #CJK UNIFIED IDEOGRAPH
+ {0xD4FA, 0x5D28}, //7690 #CJK UNIFIED IDEOGRAPH
+ {0xD4FB, 0x5D0D}, //7691 #CJK UNIFIED IDEOGRAPH
+ {0xD4FC, 0x5D26}, //7692 #CJK UNIFIED IDEOGRAPH
+ {0xD4FD, 0x5D25}, //7693 #CJK UNIFIED IDEOGRAPH
+ {0xD4FE, 0x5D0F}, //7694 #CJK UNIFIED IDEOGRAPH
+ {0xD540, 0x5D30}, //7695 #CJK UNIFIED IDEOGRAPH
+ {0xD541, 0x5D12}, //7696 #CJK UNIFIED IDEOGRAPH
+ {0xD542, 0x5D23}, //7697 #CJK UNIFIED IDEOGRAPH
+ {0xD543, 0x5D1F}, //7698 #CJK UNIFIED IDEOGRAPH
+ {0xD544, 0x5D2E}, //7699 #CJK UNIFIED IDEOGRAPH
+ {0xD545, 0x5E3E}, //7700 #CJK UNIFIED IDEOGRAPH
+ {0xD546, 0x5E34}, //7701 #CJK UNIFIED IDEOGRAPH
+ {0xD547, 0x5EB1}, //7702 #CJK UNIFIED IDEOGRAPH
+ {0xD548, 0x5EB4}, //7703 #CJK UNIFIED IDEOGRAPH
+ {0xD549, 0x5EB9}, //7704 #CJK UNIFIED IDEOGRAPH
+ {0xD54A, 0x5EB2}, //7705 #CJK UNIFIED IDEOGRAPH
+ {0xD54B, 0x5EB3}, //7706 #CJK UNIFIED IDEOGRAPH
+ {0xD54C, 0x5F36}, //7707 #CJK UNIFIED IDEOGRAPH
+ {0xD54D, 0x5F38}, //7708 #CJK UNIFIED IDEOGRAPH
+ {0xD54E, 0x5F9B}, //7709 #CJK UNIFIED IDEOGRAPH
+ {0xD54F, 0x5F96}, //7710 #CJK UNIFIED IDEOGRAPH
+ {0xD550, 0x5F9F}, //7711 #CJK UNIFIED IDEOGRAPH
+ {0xD551, 0x608A}, //7712 #CJK UNIFIED IDEOGRAPH
+ {0xD552, 0x6090}, //7713 #CJK UNIFIED IDEOGRAPH
+ {0xD553, 0x6086}, //7714 #CJK UNIFIED IDEOGRAPH
+ {0xD554, 0x60BE}, //7715 #CJK UNIFIED IDEOGRAPH
+ {0xD555, 0x60B0}, //7716 #CJK UNIFIED IDEOGRAPH
+ {0xD556, 0x60BA}, //7717 #CJK UNIFIED IDEOGRAPH
+ {0xD557, 0x60D3}, //7718 #CJK UNIFIED IDEOGRAPH
+ {0xD558, 0x60D4}, //7719 #CJK UNIFIED IDEOGRAPH
+ {0xD559, 0x60CF}, //7720 #CJK UNIFIED IDEOGRAPH
+ {0xD55A, 0x60E4}, //7721 #CJK UNIFIED IDEOGRAPH
+ {0xD55B, 0x60D9}, //7722 #CJK UNIFIED IDEOGRAPH
+ {0xD55C, 0x60DD}, //7723 #CJK UNIFIED IDEOGRAPH
+ {0xD55D, 0x60C8}, //7724 #CJK UNIFIED IDEOGRAPH
+ {0xD55E, 0x60B1}, //7725 #CJK UNIFIED IDEOGRAPH
+ {0xD55F, 0x60DB}, //7726 #CJK UNIFIED IDEOGRAPH
+ {0xD560, 0x60B7}, //7727 #CJK UNIFIED IDEOGRAPH
+ {0xD561, 0x60CA}, //7728 #CJK UNIFIED IDEOGRAPH
+ {0xD562, 0x60BF}, //7729 #CJK UNIFIED IDEOGRAPH
+ {0xD563, 0x60C3}, //7730 #CJK UNIFIED IDEOGRAPH
+ {0xD564, 0x60CD}, //7731 #CJK UNIFIED IDEOGRAPH
+ {0xD565, 0x60C0}, //7732 #CJK UNIFIED IDEOGRAPH
+ {0xD566, 0x6332}, //7733 #CJK UNIFIED IDEOGRAPH
+ {0xD567, 0x6365}, //7734 #CJK UNIFIED IDEOGRAPH
+ {0xD568, 0x638A}, //7735 #CJK UNIFIED IDEOGRAPH
+ {0xD569, 0x6382}, //7736 #CJK UNIFIED IDEOGRAPH
+ {0xD56A, 0x637D}, //7737 #CJK UNIFIED IDEOGRAPH
+ {0xD56B, 0x63BD}, //7738 #CJK UNIFIED IDEOGRAPH
+ {0xD56C, 0x639E}, //7739 #CJK UNIFIED IDEOGRAPH
+ {0xD56D, 0x63AD}, //7740 #CJK UNIFIED IDEOGRAPH
+ {0xD56E, 0x639D}, //7741 #CJK UNIFIED IDEOGRAPH
+ {0xD56F, 0x6397}, //7742 #CJK UNIFIED IDEOGRAPH
+ {0xD570, 0x63AB}, //7743 #CJK UNIFIED IDEOGRAPH
+ {0xD571, 0x638E}, //7744 #CJK UNIFIED IDEOGRAPH
+ {0xD572, 0x636F}, //7745 #CJK UNIFIED IDEOGRAPH
+ {0xD573, 0x6387}, //7746 #CJK UNIFIED IDEOGRAPH
+ {0xD574, 0x6390}, //7747 #CJK UNIFIED IDEOGRAPH
+ {0xD575, 0x636E}, //7748 #CJK UNIFIED IDEOGRAPH
+ {0xD576, 0x63AF}, //7749 #CJK UNIFIED IDEOGRAPH
+ {0xD577, 0x6375}, //7750 #CJK UNIFIED IDEOGRAPH
+ {0xD578, 0x639C}, //7751 #CJK UNIFIED IDEOGRAPH
+ {0xD579, 0x636D}, //7752 #CJK UNIFIED IDEOGRAPH
+ {0xD57A, 0x63AE}, //7753 #CJK UNIFIED IDEOGRAPH
+ {0xD57B, 0x637C}, //7754 #CJK UNIFIED IDEOGRAPH
+ {0xD57C, 0x63A4}, //7755 #CJK UNIFIED IDEOGRAPH
+ {0xD57D, 0x633B}, //7756 #CJK UNIFIED IDEOGRAPH
+ {0xD57E, 0x639F}, //7757 #CJK UNIFIED IDEOGRAPH
+ {0xD5A1, 0x6378}, //7758 #CJK UNIFIED IDEOGRAPH
+ {0xD5A2, 0x6385}, //7759 #CJK UNIFIED IDEOGRAPH
+ {0xD5A3, 0x6381}, //7760 #CJK UNIFIED IDEOGRAPH
+ {0xD5A4, 0x6391}, //7761 #CJK UNIFIED IDEOGRAPH
+ {0xD5A5, 0x638D}, //7762 #CJK UNIFIED IDEOGRAPH
+ {0xD5A6, 0x6370}, //7763 #CJK UNIFIED IDEOGRAPH
+ {0xD5A7, 0x6553}, //7764 #CJK UNIFIED IDEOGRAPH
+ {0xD5A8, 0x65CD}, //7765 #CJK UNIFIED IDEOGRAPH
+ {0xD5A9, 0x6665}, //7766 #CJK UNIFIED IDEOGRAPH
+ {0xD5AA, 0x6661}, //7767 #CJK UNIFIED IDEOGRAPH
+ {0xD5AB, 0x665B}, //7768 #CJK UNIFIED IDEOGRAPH
+ {0xD5AC, 0x6659}, //7769 #CJK UNIFIED IDEOGRAPH
+ {0xD5AD, 0x665C}, //7770 #CJK UNIFIED IDEOGRAPH
+ {0xD5AE, 0x6662}, //7771 #CJK UNIFIED IDEOGRAPH
+ {0xD5AF, 0x6718}, //7772 #CJK UNIFIED IDEOGRAPH
+ {0xD5B0, 0x6879}, //7773 #CJK UNIFIED IDEOGRAPH
+ {0xD5B1, 0x6887}, //7774 #CJK UNIFIED IDEOGRAPH
+ {0xD5B2, 0x6890}, //7775 #CJK UNIFIED IDEOGRAPH
+ {0xD5B3, 0x689C}, //7776 #CJK UNIFIED IDEOGRAPH
+ {0xD5B4, 0x686D}, //7777 #CJK UNIFIED IDEOGRAPH
+ {0xD5B5, 0x686E}, //7778 #CJK UNIFIED IDEOGRAPH
+ {0xD5B6, 0x68AE}, //7779 #CJK UNIFIED IDEOGRAPH
+ {0xD5B7, 0x68AB}, //7780 #CJK UNIFIED IDEOGRAPH
+ {0xD5B8, 0x6956}, //7781 #CJK UNIFIED IDEOGRAPH
+ {0xD5B9, 0x686F}, //7782 #CJK UNIFIED IDEOGRAPH
+ {0xD5BA, 0x68A3}, //7783 #CJK UNIFIED IDEOGRAPH
+ {0xD5BB, 0x68AC}, //7784 #CJK UNIFIED IDEOGRAPH
+ {0xD5BC, 0x68A9}, //7785 #CJK UNIFIED IDEOGRAPH
+ {0xD5BD, 0x6875}, //7786 #CJK UNIFIED IDEOGRAPH
+ {0xD5BE, 0x6874}, //7787 #CJK UNIFIED IDEOGRAPH
+ {0xD5BF, 0x68B2}, //7788 #CJK UNIFIED IDEOGRAPH
+ {0xD5C0, 0x688F}, //7789 #CJK UNIFIED IDEOGRAPH
+ {0xD5C1, 0x6877}, //7790 #CJK UNIFIED IDEOGRAPH
+ {0xD5C2, 0x6892}, //7791 #CJK UNIFIED IDEOGRAPH
+ {0xD5C3, 0x687C}, //7792 #CJK UNIFIED IDEOGRAPH
+ {0xD5C4, 0x686B}, //7793 #CJK UNIFIED IDEOGRAPH
+ {0xD5C5, 0x6872}, //7794 #CJK UNIFIED IDEOGRAPH
+ {0xD5C6, 0x68AA}, //7795 #CJK UNIFIED IDEOGRAPH
+ {0xD5C7, 0x6880}, //7796 #CJK UNIFIED IDEOGRAPH
+ {0xD5C8, 0x6871}, //7797 #CJK UNIFIED IDEOGRAPH
+ {0xD5C9, 0x687E}, //7798 #CJK UNIFIED IDEOGRAPH
+ {0xD5CA, 0x689B}, //7799 #CJK UNIFIED IDEOGRAPH
+ {0xD5CB, 0x6896}, //7800 #CJK UNIFIED IDEOGRAPH
+ {0xD5CC, 0x688B}, //7801 #CJK UNIFIED IDEOGRAPH
+ {0xD5CD, 0x68A0}, //7802 #CJK UNIFIED IDEOGRAPH
+ {0xD5CE, 0x6889}, //7803 #CJK UNIFIED IDEOGRAPH
+ {0xD5CF, 0x68A4}, //7804 #CJK UNIFIED IDEOGRAPH
+ {0xD5D0, 0x6878}, //7805 #CJK UNIFIED IDEOGRAPH
+ {0xD5D1, 0x687B}, //7806 #CJK UNIFIED IDEOGRAPH
+ {0xD5D2, 0x6891}, //7807 #CJK UNIFIED IDEOGRAPH
+ {0xD5D3, 0x688C}, //7808 #CJK UNIFIED IDEOGRAPH
+ {0xD5D4, 0x688A}, //7809 #CJK UNIFIED IDEOGRAPH
+ {0xD5D5, 0x687D}, //7810 #CJK UNIFIED IDEOGRAPH
+ {0xD5D6, 0x6B36}, //7811 #CJK UNIFIED IDEOGRAPH
+ {0xD5D7, 0x6B33}, //7812 #CJK UNIFIED IDEOGRAPH
+ {0xD5D8, 0x6B37}, //7813 #CJK UNIFIED IDEOGRAPH
+ {0xD5D9, 0x6B38}, //7814 #CJK UNIFIED IDEOGRAPH
+ {0xD5DA, 0x6B91}, //7815 #CJK UNIFIED IDEOGRAPH
+ {0xD5DB, 0x6B8F}, //7816 #CJK UNIFIED IDEOGRAPH
+ {0xD5DC, 0x6B8D}, //7817 #CJK UNIFIED IDEOGRAPH
+ {0xD5DD, 0x6B8E}, //7818 #CJK UNIFIED IDEOGRAPH
+ {0xD5DE, 0x6B8C}, //7819 #CJK UNIFIED IDEOGRAPH
+ {0xD5DF, 0x6C2A}, //7820 #CJK UNIFIED IDEOGRAPH
+ {0xD5E0, 0x6DC0}, //7821 #CJK UNIFIED IDEOGRAPH
+ {0xD5E1, 0x6DAB}, //7822 #CJK UNIFIED IDEOGRAPH
+ {0xD5E2, 0x6DB4}, //7823 #CJK UNIFIED IDEOGRAPH
+ {0xD5E3, 0x6DB3}, //7824 #CJK UNIFIED IDEOGRAPH
+ {0xD5E4, 0x6E74}, //7825 #CJK UNIFIED IDEOGRAPH
+ {0xD5E5, 0x6DAC}, //7826 #CJK UNIFIED IDEOGRAPH
+ {0xD5E6, 0x6DE9}, //7827 #CJK UNIFIED IDEOGRAPH
+ {0xD5E7, 0x6DE2}, //7828 #CJK UNIFIED IDEOGRAPH
+ {0xD5E8, 0x6DB7}, //7829 #CJK UNIFIED IDEOGRAPH
+ {0xD5E9, 0x6DF6}, //7830 #CJK UNIFIED IDEOGRAPH
+ {0xD5EA, 0x6DD4}, //7831 #CJK UNIFIED IDEOGRAPH
+ {0xD5EB, 0x6E00}, //7832 #CJK UNIFIED IDEOGRAPH
+ {0xD5EC, 0x6DC8}, //7833 #CJK UNIFIED IDEOGRAPH
+ {0xD5ED, 0x6DE0}, //7834 #CJK UNIFIED IDEOGRAPH
+ {0xD5EE, 0x6DDF}, //7835 #CJK UNIFIED IDEOGRAPH
+ {0xD5EF, 0x6DD6}, //7836 #CJK UNIFIED IDEOGRAPH
+ {0xD5F0, 0x6DBE}, //7837 #CJK UNIFIED IDEOGRAPH
+ {0xD5F1, 0x6DE5}, //7838 #CJK UNIFIED IDEOGRAPH
+ {0xD5F2, 0x6DDC}, //7839 #CJK UNIFIED IDEOGRAPH
+ {0xD5F3, 0x6DDD}, //7840 #CJK UNIFIED IDEOGRAPH
+ {0xD5F4, 0x6DDB}, //7841 #CJK UNIFIED IDEOGRAPH
+ {0xD5F5, 0x6DF4}, //7842 #CJK UNIFIED IDEOGRAPH
+ {0xD5F6, 0x6DCA}, //7843 #CJK UNIFIED IDEOGRAPH
+ {0xD5F7, 0x6DBD}, //7844 #CJK UNIFIED IDEOGRAPH
+ {0xD5F8, 0x6DED}, //7845 #CJK UNIFIED IDEOGRAPH
+ {0xD5F9, 0x6DF0}, //7846 #CJK UNIFIED IDEOGRAPH
+ {0xD5FA, 0x6DBA}, //7847 #CJK UNIFIED IDEOGRAPH
+ {0xD5FB, 0x6DD5}, //7848 #CJK UNIFIED IDEOGRAPH
+ {0xD5FC, 0x6DC2}, //7849 #CJK UNIFIED IDEOGRAPH
+ {0xD5FD, 0x6DCF}, //7850 #CJK UNIFIED IDEOGRAPH
+ {0xD5FE, 0x6DC9}, //7851 #CJK UNIFIED IDEOGRAPH
+ {0xD640, 0x6DD0}, //7852 #CJK UNIFIED IDEOGRAPH
+ {0xD641, 0x6DF2}, //7853 #CJK UNIFIED IDEOGRAPH
+ {0xD642, 0x6DD3}, //7854 #CJK UNIFIED IDEOGRAPH
+ {0xD643, 0x6DFD}, //7855 #CJK UNIFIED IDEOGRAPH
+ {0xD644, 0x6DD7}, //7856 #CJK UNIFIED IDEOGRAPH
+ {0xD645, 0x6DCD}, //7857 #CJK UNIFIED IDEOGRAPH
+ {0xD646, 0x6DE3}, //7858 #CJK UNIFIED IDEOGRAPH
+ {0xD647, 0x6DBB}, //7859 #CJK UNIFIED IDEOGRAPH
+ {0xD648, 0x70FA}, //7860 #CJK UNIFIED IDEOGRAPH
+ {0xD649, 0x710D}, //7861 #CJK UNIFIED IDEOGRAPH
+ {0xD64A, 0x70F7}, //7862 #CJK UNIFIED IDEOGRAPH
+ {0xD64B, 0x7117}, //7863 #CJK UNIFIED IDEOGRAPH
+ {0xD64C, 0x70F4}, //7864 #CJK UNIFIED IDEOGRAPH
+ {0xD64D, 0x710C}, //7865 #CJK UNIFIED IDEOGRAPH
+ {0xD64E, 0x70F0}, //7866 #CJK UNIFIED IDEOGRAPH
+ {0xD64F, 0x7104}, //7867 #CJK UNIFIED IDEOGRAPH
+ {0xD650, 0x70F3}, //7868 #CJK UNIFIED IDEOGRAPH
+ {0xD651, 0x7110}, //7869 #CJK UNIFIED IDEOGRAPH
+ {0xD652, 0x70FC}, //7870 #CJK UNIFIED IDEOGRAPH
+ {0xD653, 0x70FF}, //7871 #CJK UNIFIED IDEOGRAPH
+ {0xD654, 0x7106}, //7872 #CJK UNIFIED IDEOGRAPH
+ {0xD655, 0x7113}, //7873 #CJK UNIFIED IDEOGRAPH
+ {0xD656, 0x7100}, //7874 #CJK UNIFIED IDEOGRAPH
+ {0xD657, 0x70F8}, //7875 #CJK UNIFIED IDEOGRAPH
+ {0xD658, 0x70F6}, //7876 #CJK UNIFIED IDEOGRAPH
+ {0xD659, 0x710B}, //7877 #CJK UNIFIED IDEOGRAPH
+ {0xD65A, 0x7102}, //7878 #CJK UNIFIED IDEOGRAPH
+ {0xD65B, 0x710E}, //7879 #CJK UNIFIED IDEOGRAPH
+ {0xD65C, 0x727E}, //7880 #CJK UNIFIED IDEOGRAPH
+ {0xD65D, 0x727B}, //7881 #CJK UNIFIED IDEOGRAPH
+ {0xD65E, 0x727C}, //7882 #CJK UNIFIED IDEOGRAPH
+ {0xD65F, 0x727F}, //7883 #CJK UNIFIED IDEOGRAPH
+ {0xD660, 0x731D}, //7884 #CJK UNIFIED IDEOGRAPH
+ {0xD661, 0x7317}, //7885 #CJK UNIFIED IDEOGRAPH
+ {0xD662, 0x7307}, //7886 #CJK UNIFIED IDEOGRAPH
+ {0xD663, 0x7311}, //7887 #CJK UNIFIED IDEOGRAPH
+ {0xD664, 0x7318}, //7888 #CJK UNIFIED IDEOGRAPH
+ {0xD665, 0x730A}, //7889 #CJK UNIFIED IDEOGRAPH
+ {0xD666, 0x7308}, //7890 #CJK UNIFIED IDEOGRAPH
+ {0xD667, 0x72FF}, //7891 #CJK UNIFIED IDEOGRAPH
+ {0xD668, 0x730F}, //7892 #CJK UNIFIED IDEOGRAPH
+ {0xD669, 0x731E}, //7893 #CJK UNIFIED IDEOGRAPH
+ {0xD66A, 0x7388}, //7894 #CJK UNIFIED IDEOGRAPH
+ {0xD66B, 0x73F6}, //7895 #CJK UNIFIED IDEOGRAPH
+ {0xD66C, 0x73F8}, //7896 #CJK UNIFIED IDEOGRAPH
+ {0xD66D, 0x73F5}, //7897 #CJK UNIFIED IDEOGRAPH
+ {0xD66E, 0x7404}, //7898 #CJK UNIFIED IDEOGRAPH
+ {0xD66F, 0x7401}, //7899 #CJK UNIFIED IDEOGRAPH
+ {0xD670, 0x73FD}, //7900 #CJK UNIFIED IDEOGRAPH
+ {0xD671, 0x7407}, //7901 #CJK UNIFIED IDEOGRAPH
+ {0xD672, 0x7400}, //7902 #CJK UNIFIED IDEOGRAPH
+ {0xD673, 0x73FA}, //7903 #CJK UNIFIED IDEOGRAPH
+ {0xD674, 0x73FC}, //7904 #CJK UNIFIED IDEOGRAPH
+ {0xD675, 0x73FF}, //7905 #CJK UNIFIED IDEOGRAPH
+ {0xD676, 0x740C}, //7906 #CJK UNIFIED IDEOGRAPH
+ {0xD677, 0x740B}, //7907 #CJK UNIFIED IDEOGRAPH
+ {0xD678, 0x73F4}, //7908 #CJK UNIFIED IDEOGRAPH
+ {0xD679, 0x7408}, //7909 #CJK UNIFIED IDEOGRAPH
+ {0xD67A, 0x7564}, //7910 #CJK UNIFIED IDEOGRAPH
+ {0xD67B, 0x7563}, //7911 #CJK UNIFIED IDEOGRAPH
+ {0xD67C, 0x75CE}, //7912 #CJK UNIFIED IDEOGRAPH
+ {0xD67D, 0x75D2}, //7913 #CJK UNIFIED IDEOGRAPH
+ {0xD67E, 0x75CF}, //7914 #CJK UNIFIED IDEOGRAPH
+ {0xD6A1, 0x75CB}, //7915 #CJK UNIFIED IDEOGRAPH
+ {0xD6A2, 0x75CC}, //7916 #CJK UNIFIED IDEOGRAPH
+ {0xD6A3, 0x75D1}, //7917 #CJK UNIFIED IDEOGRAPH
+ {0xD6A4, 0x75D0}, //7918 #CJK UNIFIED IDEOGRAPH
+ {0xD6A5, 0x768F}, //7919 #CJK UNIFIED IDEOGRAPH
+ {0xD6A6, 0x7689}, //7920 #CJK UNIFIED IDEOGRAPH
+ {0xD6A7, 0x76D3}, //7921 #CJK UNIFIED IDEOGRAPH
+ {0xD6A8, 0x7739}, //7922 #CJK UNIFIED IDEOGRAPH
+ {0xD6A9, 0x772F}, //7923 #CJK UNIFIED IDEOGRAPH
+ {0xD6AA, 0x772D}, //7924 #CJK UNIFIED IDEOGRAPH
+ {0xD6AB, 0x7731}, //7925 #CJK UNIFIED IDEOGRAPH
+ {0xD6AC, 0x7732}, //7926 #CJK UNIFIED IDEOGRAPH
+ {0xD6AD, 0x7734}, //7927 #CJK UNIFIED IDEOGRAPH
+ {0xD6AE, 0x7733}, //7928 #CJK UNIFIED IDEOGRAPH
+ {0xD6AF, 0x773D}, //7929 #CJK UNIFIED IDEOGRAPH
+ {0xD6B0, 0x7725}, //7930 #CJK UNIFIED IDEOGRAPH
+ {0xD6B1, 0x773B}, //7931 #CJK UNIFIED IDEOGRAPH
+ {0xD6B2, 0x7735}, //7932 #CJK UNIFIED IDEOGRAPH
+ {0xD6B3, 0x7848}, //7933 #CJK UNIFIED IDEOGRAPH
+ {0xD6B4, 0x7852}, //7934 #CJK UNIFIED IDEOGRAPH
+ {0xD6B5, 0x7849}, //7935 #CJK UNIFIED IDEOGRAPH
+ {0xD6B6, 0x784D}, //7936 #CJK UNIFIED IDEOGRAPH
+ {0xD6B7, 0x784A}, //7937 #CJK UNIFIED IDEOGRAPH
+ {0xD6B8, 0x784C}, //7938 #CJK UNIFIED IDEOGRAPH
+ {0xD6B9, 0x7826}, //7939 #CJK UNIFIED IDEOGRAPH
+ {0xD6BA, 0x7845}, //7940 #CJK UNIFIED IDEOGRAPH
+ {0xD6BB, 0x7850}, //7941 #CJK UNIFIED IDEOGRAPH
+ {0xD6BC, 0x7964}, //7942 #CJK UNIFIED IDEOGRAPH
+ {0xD6BD, 0x7967}, //7943 #CJK UNIFIED IDEOGRAPH
+ {0xD6BE, 0x7969}, //7944 #CJK UNIFIED IDEOGRAPH
+ {0xD6BF, 0x796A}, //7945 #CJK UNIFIED IDEOGRAPH
+ {0xD6C0, 0x7963}, //7946 #CJK UNIFIED IDEOGRAPH
+ {0xD6C1, 0x796B}, //7947 #CJK UNIFIED IDEOGRAPH
+ {0xD6C2, 0x7961}, //7948 #CJK UNIFIED IDEOGRAPH
+ {0xD6C3, 0x79BB}, //7949 #CJK UNIFIED IDEOGRAPH
+ {0xD6C4, 0x79FA}, //7950 #CJK UNIFIED IDEOGRAPH
+ {0xD6C5, 0x79F8}, //7951 #CJK UNIFIED IDEOGRAPH
+ {0xD6C6, 0x79F6}, //7952 #CJK UNIFIED IDEOGRAPH
+ {0xD6C7, 0x79F7}, //7953 #CJK UNIFIED IDEOGRAPH
+ {0xD6C8, 0x7A8F}, //7954 #CJK UNIFIED IDEOGRAPH
+ {0xD6C9, 0x7A94}, //7955 #CJK UNIFIED IDEOGRAPH
+ {0xD6CA, 0x7A90}, //7956 #CJK UNIFIED IDEOGRAPH
+ {0xD6CB, 0x7B35}, //7957 #CJK UNIFIED IDEOGRAPH
+ {0xD6CC, 0x7B47}, //7958 #CJK UNIFIED IDEOGRAPH
+ {0xD6CD, 0x7B34}, //7959 #CJK UNIFIED IDEOGRAPH
+ {0xD6CE, 0x7B25}, //7960 #CJK UNIFIED IDEOGRAPH
+ {0xD6CF, 0x7B30}, //7961 #CJK UNIFIED IDEOGRAPH
+ {0xD6D0, 0x7B22}, //7962 #CJK UNIFIED IDEOGRAPH
+ {0xD6D1, 0x7B24}, //7963 #CJK UNIFIED IDEOGRAPH
+ {0xD6D2, 0x7B33}, //7964 #CJK UNIFIED IDEOGRAPH
+ {0xD6D3, 0x7B18}, //7965 #CJK UNIFIED IDEOGRAPH
+ {0xD6D4, 0x7B2A}, //7966 #CJK UNIFIED IDEOGRAPH
+ {0xD6D5, 0x7B1D}, //7967 #CJK UNIFIED IDEOGRAPH
+ {0xD6D6, 0x7B31}, //7968 #CJK UNIFIED IDEOGRAPH
+ {0xD6D7, 0x7B2B}, //7969 #CJK UNIFIED IDEOGRAPH
+ {0xD6D8, 0x7B2D}, //7970 #CJK UNIFIED IDEOGRAPH
+ {0xD6D9, 0x7B2F}, //7971 #CJK UNIFIED IDEOGRAPH
+ {0xD6DA, 0x7B32}, //7972 #CJK UNIFIED IDEOGRAPH
+ {0xD6DB, 0x7B38}, //7973 #CJK UNIFIED IDEOGRAPH
+ {0xD6DC, 0x7B1A}, //7974 #CJK UNIFIED IDEOGRAPH
+ {0xD6DD, 0x7B23}, //7975 #CJK UNIFIED IDEOGRAPH
+ {0xD6DE, 0x7C94}, //7976 #CJK UNIFIED IDEOGRAPH
+ {0xD6DF, 0x7C98}, //7977 #CJK UNIFIED IDEOGRAPH
+ {0xD6E0, 0x7C96}, //7978 #CJK UNIFIED IDEOGRAPH
+ {0xD6E1, 0x7CA3}, //7979 #CJK UNIFIED IDEOGRAPH
+ {0xD6E2, 0x7D35}, //7980 #CJK UNIFIED IDEOGRAPH
+ {0xD6E3, 0x7D3D}, //7981 #CJK UNIFIED IDEOGRAPH
+ {0xD6E4, 0x7D38}, //7982 #CJK UNIFIED IDEOGRAPH
+ {0xD6E5, 0x7D36}, //7983 #CJK UNIFIED IDEOGRAPH
+ {0xD6E6, 0x7D3A}, //7984 #CJK UNIFIED IDEOGRAPH
+ {0xD6E7, 0x7D45}, //7985 #CJK UNIFIED IDEOGRAPH
+ {0xD6E8, 0x7D2C}, //7986 #CJK UNIFIED IDEOGRAPH
+ {0xD6E9, 0x7D29}, //7987 #CJK UNIFIED IDEOGRAPH
+ {0xD6EA, 0x7D41}, //7988 #CJK UNIFIED IDEOGRAPH
+ {0xD6EB, 0x7D47}, //7989 #CJK UNIFIED IDEOGRAPH
+ {0xD6EC, 0x7D3E}, //7990 #CJK UNIFIED IDEOGRAPH
+ {0xD6ED, 0x7D3F}, //7991 #CJK UNIFIED IDEOGRAPH
+ {0xD6EE, 0x7D4A}, //7992 #CJK UNIFIED IDEOGRAPH
+ {0xD6EF, 0x7D3B}, //7993 #CJK UNIFIED IDEOGRAPH
+ {0xD6F0, 0x7D28}, //7994 #CJK UNIFIED IDEOGRAPH
+ {0xD6F1, 0x7F63}, //7995 #CJK UNIFIED IDEOGRAPH
+ {0xD6F2, 0x7F95}, //7996 #CJK UNIFIED IDEOGRAPH
+ {0xD6F3, 0x7F9C}, //7997 #CJK UNIFIED IDEOGRAPH
+ {0xD6F4, 0x7F9D}, //7998 #CJK UNIFIED IDEOGRAPH
+ {0xD6F5, 0x7F9B}, //7999 #CJK UNIFIED IDEOGRAPH
+ {0xD6F6, 0x7FCA}, //8000 #CJK UNIFIED IDEOGRAPH
+ {0xD6F7, 0x7FCB}, //8001 #CJK UNIFIED IDEOGRAPH
+ {0xD6F8, 0x7FCD}, //8002 #CJK UNIFIED IDEOGRAPH
+ {0xD6F9, 0x7FD0}, //8003 #CJK UNIFIED IDEOGRAPH
+ {0xD6FA, 0x7FD1}, //8004 #CJK UNIFIED IDEOGRAPH
+ {0xD6FB, 0x7FC7}, //8005 #CJK UNIFIED IDEOGRAPH
+ {0xD6FC, 0x7FCF}, //8006 #CJK UNIFIED IDEOGRAPH
+ {0xD6FD, 0x7FC9}, //8007 #CJK UNIFIED IDEOGRAPH
+ {0xD6FE, 0x801F}, //8008 #CJK UNIFIED IDEOGRAPH
+ {0xD740, 0x801E}, //8009 #CJK UNIFIED IDEOGRAPH
+ {0xD741, 0x801B}, //8010 #CJK UNIFIED IDEOGRAPH
+ {0xD742, 0x8047}, //8011 #CJK UNIFIED IDEOGRAPH
+ {0xD743, 0x8043}, //8012 #CJK UNIFIED IDEOGRAPH
+ {0xD744, 0x8048}, //8013 #CJK UNIFIED IDEOGRAPH
+ {0xD745, 0x8118}, //8014 #CJK UNIFIED IDEOGRAPH
+ {0xD746, 0x8125}, //8015 #CJK UNIFIED IDEOGRAPH
+ {0xD747, 0x8119}, //8016 #CJK UNIFIED IDEOGRAPH
+ {0xD748, 0x811B}, //8017 #CJK UNIFIED IDEOGRAPH
+ {0xD749, 0x812D}, //8018 #CJK UNIFIED IDEOGRAPH
+ {0xD74A, 0x811F}, //8019 #CJK UNIFIED IDEOGRAPH
+ {0xD74B, 0x812C}, //8020 #CJK UNIFIED IDEOGRAPH
+ {0xD74C, 0x811E}, //8021 #CJK UNIFIED IDEOGRAPH
+ {0xD74D, 0x8121}, //8022 #CJK UNIFIED IDEOGRAPH
+ {0xD74E, 0x8115}, //8023 #CJK UNIFIED IDEOGRAPH
+ {0xD74F, 0x8127}, //8024 #CJK UNIFIED IDEOGRAPH
+ {0xD750, 0x811D}, //8025 #CJK UNIFIED IDEOGRAPH
+ {0xD751, 0x8122}, //8026 #CJK UNIFIED IDEOGRAPH
+ {0xD752, 0x8211}, //8027 #CJK UNIFIED IDEOGRAPH
+ {0xD753, 0x8238}, //8028 #CJK UNIFIED IDEOGRAPH
+ {0xD754, 0x8233}, //8029 #CJK UNIFIED IDEOGRAPH
+ {0xD755, 0x823A}, //8030 #CJK UNIFIED IDEOGRAPH
+ {0xD756, 0x8234}, //8031 #CJK UNIFIED IDEOGRAPH
+ {0xD757, 0x8232}, //8032 #CJK UNIFIED IDEOGRAPH
+ {0xD758, 0x8274}, //8033 #CJK UNIFIED IDEOGRAPH
+ {0xD759, 0x8390}, //8034 #CJK UNIFIED IDEOGRAPH
+ {0xD75A, 0x83A3}, //8035 #CJK UNIFIED IDEOGRAPH
+ {0xD75B, 0x83A8}, //8036 #CJK UNIFIED IDEOGRAPH
+ {0xD75C, 0x838D}, //8037 #CJK UNIFIED IDEOGRAPH
+ {0xD75D, 0x837A}, //8038 #CJK UNIFIED IDEOGRAPH
+ {0xD75E, 0x8373}, //8039 #CJK UNIFIED IDEOGRAPH
+ {0xD75F, 0x83A4}, //8040 #CJK UNIFIED IDEOGRAPH
+ {0xD760, 0x8374}, //8041 #CJK UNIFIED IDEOGRAPH
+ {0xD761, 0x838F}, //8042 #CJK UNIFIED IDEOGRAPH
+ {0xD762, 0x8381}, //8043 #CJK UNIFIED IDEOGRAPH
+ {0xD763, 0x8395}, //8044 #CJK UNIFIED IDEOGRAPH
+ {0xD764, 0x8399}, //8045 #CJK UNIFIED IDEOGRAPH
+ {0xD765, 0x8375}, //8046 #CJK UNIFIED IDEOGRAPH
+ {0xD766, 0x8394}, //8047 #CJK UNIFIED IDEOGRAPH
+ {0xD767, 0x83A9}, //8048 #CJK UNIFIED IDEOGRAPH
+ {0xD768, 0x837D}, //8049 #CJK UNIFIED IDEOGRAPH
+ {0xD769, 0x8383}, //8050 #CJK UNIFIED IDEOGRAPH
+ {0xD76A, 0x838C}, //8051 #CJK UNIFIED IDEOGRAPH
+ {0xD76B, 0x839D}, //8052 #CJK UNIFIED IDEOGRAPH
+ {0xD76C, 0x839B}, //8053 #CJK UNIFIED IDEOGRAPH
+ {0xD76D, 0x83AA}, //8054 #CJK UNIFIED IDEOGRAPH
+ {0xD76E, 0x838B}, //8055 #CJK UNIFIED IDEOGRAPH
+ {0xD76F, 0x837E}, //8056 #CJK UNIFIED IDEOGRAPH
+ {0xD770, 0x83A5}, //8057 #CJK UNIFIED IDEOGRAPH
+ {0xD771, 0x83AF}, //8058 #CJK UNIFIED IDEOGRAPH
+ {0xD772, 0x8388}, //8059 #CJK UNIFIED IDEOGRAPH
+ {0xD773, 0x8397}, //8060 #CJK UNIFIED IDEOGRAPH
+ {0xD774, 0x83B0}, //8061 #CJK UNIFIED IDEOGRAPH
+ {0xD775, 0x837F}, //8062 #CJK UNIFIED IDEOGRAPH
+ {0xD776, 0x83A6}, //8063 #CJK UNIFIED IDEOGRAPH
+ {0xD777, 0x8387}, //8064 #CJK UNIFIED IDEOGRAPH
+ {0xD778, 0x83AE}, //8065 #CJK UNIFIED IDEOGRAPH
+ {0xD779, 0x8376}, //8066 #CJK UNIFIED IDEOGRAPH
+ {0xD77A, 0x839A}, //8067 #CJK UNIFIED IDEOGRAPH
+ {0xD77B, 0x8659}, //8068 #CJK UNIFIED IDEOGRAPH
+ {0xD77C, 0x8656}, //8069 #CJK UNIFIED IDEOGRAPH
+ {0xD77D, 0x86BF}, //8070 #CJK UNIFIED IDEOGRAPH
+ {0xD77E, 0x86B7}, //8071 #CJK UNIFIED IDEOGRAPH
+ {0xD7A1, 0x86C2}, //8072 #CJK UNIFIED IDEOGRAPH
+ {0xD7A2, 0x86C1}, //8073 #CJK UNIFIED IDEOGRAPH
+ {0xD7A3, 0x86C5}, //8074 #CJK UNIFIED IDEOGRAPH
+ {0xD7A4, 0x86BA}, //8075 #CJK UNIFIED IDEOGRAPH
+ {0xD7A5, 0x86B0}, //8076 #CJK UNIFIED IDEOGRAPH
+ {0xD7A6, 0x86C8}, //8077 #CJK UNIFIED IDEOGRAPH
+ {0xD7A7, 0x86B9}, //8078 #CJK UNIFIED IDEOGRAPH
+ {0xD7A8, 0x86B3}, //8079 #CJK UNIFIED IDEOGRAPH
+ {0xD7A9, 0x86B8}, //8080 #CJK UNIFIED IDEOGRAPH
+ {0xD7AA, 0x86CC}, //8081 #CJK UNIFIED IDEOGRAPH
+ {0xD7AB, 0x86B4}, //8082 #CJK UNIFIED IDEOGRAPH
+ {0xD7AC, 0x86BB}, //8083 #CJK UNIFIED IDEOGRAPH
+ {0xD7AD, 0x86BC}, //8084 #CJK UNIFIED IDEOGRAPH
+ {0xD7AE, 0x86C3}, //8085 #CJK UNIFIED IDEOGRAPH
+ {0xD7AF, 0x86BD}, //8086 #CJK UNIFIED IDEOGRAPH
+ {0xD7B0, 0x86BE}, //8087 #CJK UNIFIED IDEOGRAPH
+ {0xD7B1, 0x8852}, //8088 #CJK UNIFIED IDEOGRAPH
+ {0xD7B2, 0x8889}, //8089 #CJK UNIFIED IDEOGRAPH
+ {0xD7B3, 0x8895}, //8090 #CJK UNIFIED IDEOGRAPH
+ {0xD7B4, 0x88A8}, //8091 #CJK UNIFIED IDEOGRAPH
+ {0xD7B5, 0x88A2}, //8092 #CJK UNIFIED IDEOGRAPH
+ {0xD7B6, 0x88AA}, //8093 #CJK UNIFIED IDEOGRAPH
+ {0xD7B7, 0x889A}, //8094 #CJK UNIFIED IDEOGRAPH
+ {0xD7B8, 0x8891}, //8095 #CJK UNIFIED IDEOGRAPH
+ {0xD7B9, 0x88A1}, //8096 #CJK UNIFIED IDEOGRAPH
+ {0xD7BA, 0x889F}, //8097 #CJK UNIFIED IDEOGRAPH
+ {0xD7BB, 0x8898}, //8098 #CJK UNIFIED IDEOGRAPH
+ {0xD7BC, 0x88A7}, //8099 #CJK UNIFIED IDEOGRAPH
+ {0xD7BD, 0x8899}, //8100 #CJK UNIFIED IDEOGRAPH
+ {0xD7BE, 0x889B}, //8101 #CJK UNIFIED IDEOGRAPH
+ {0xD7BF, 0x8897}, //8102 #CJK UNIFIED IDEOGRAPH
+ {0xD7C0, 0x88A4}, //8103 #CJK UNIFIED IDEOGRAPH
+ {0xD7C1, 0x88AC}, //8104 #CJK UNIFIED IDEOGRAPH
+ {0xD7C2, 0x888C}, //8105 #CJK UNIFIED IDEOGRAPH
+ {0xD7C3, 0x8893}, //8106 #CJK UNIFIED IDEOGRAPH
+ {0xD7C4, 0x888E}, //8107 #CJK UNIFIED IDEOGRAPH
+ {0xD7C5, 0x8982}, //8108 #CJK UNIFIED IDEOGRAPH
+ {0xD7C6, 0x89D6}, //8109 #CJK UNIFIED IDEOGRAPH
+ {0xD7C7, 0x89D9}, //8110 #CJK UNIFIED IDEOGRAPH
+ {0xD7C8, 0x89D5}, //8111 #CJK UNIFIED IDEOGRAPH
+ {0xD7C9, 0x8A30}, //8112 #CJK UNIFIED IDEOGRAPH
+ {0xD7CA, 0x8A27}, //8113 #CJK UNIFIED IDEOGRAPH
+ {0xD7CB, 0x8A2C}, //8114 #CJK UNIFIED IDEOGRAPH
+ {0xD7CC, 0x8A1E}, //8115 #CJK UNIFIED IDEOGRAPH
+ {0xD7CD, 0x8C39}, //8116 #CJK UNIFIED IDEOGRAPH
+ {0xD7CE, 0x8C3B}, //8117 #CJK UNIFIED IDEOGRAPH
+ {0xD7CF, 0x8C5C}, //8118 #CJK UNIFIED IDEOGRAPH
+ {0xD7D0, 0x8C5D}, //8119 #CJK UNIFIED IDEOGRAPH
+ {0xD7D1, 0x8C7D}, //8120 #CJK UNIFIED IDEOGRAPH
+ {0xD7D2, 0x8CA5}, //8121 #CJK UNIFIED IDEOGRAPH
+ {0xD7D3, 0x8D7D}, //8122 #CJK UNIFIED IDEOGRAPH
+ {0xD7D4, 0x8D7B}, //8123 #CJK UNIFIED IDEOGRAPH
+ {0xD7D5, 0x8D79}, //8124 #CJK UNIFIED IDEOGRAPH
+ {0xD7D6, 0x8DBC}, //8125 #CJK UNIFIED IDEOGRAPH
+ {0xD7D7, 0x8DC2}, //8126 #CJK UNIFIED IDEOGRAPH
+ {0xD7D8, 0x8DB9}, //8127 #CJK UNIFIED IDEOGRAPH
+ {0xD7D9, 0x8DBF}, //8128 #CJK UNIFIED IDEOGRAPH
+ {0xD7DA, 0x8DC1}, //8129 #CJK UNIFIED IDEOGRAPH
+ {0xD7DB, 0x8ED8}, //8130 #CJK UNIFIED IDEOGRAPH
+ {0xD7DC, 0x8EDE}, //8131 #CJK UNIFIED IDEOGRAPH
+ {0xD7DD, 0x8EDD}, //8132 #CJK UNIFIED IDEOGRAPH
+ {0xD7DE, 0x8EDC}, //8133 #CJK UNIFIED IDEOGRAPH
+ {0xD7DF, 0x8ED7}, //8134 #CJK UNIFIED IDEOGRAPH
+ {0xD7E0, 0x8EE0}, //8135 #CJK UNIFIED IDEOGRAPH
+ {0xD7E1, 0x8EE1}, //8136 #CJK UNIFIED IDEOGRAPH
+ {0xD7E2, 0x9024}, //8137 #CJK UNIFIED IDEOGRAPH
+ {0xD7E3, 0x900B}, //8138 #CJK UNIFIED IDEOGRAPH
+ {0xD7E4, 0x9011}, //8139 #CJK UNIFIED IDEOGRAPH
+ {0xD7E5, 0x901C}, //8140 #CJK UNIFIED IDEOGRAPH
+ {0xD7E6, 0x900C}, //8141 #CJK UNIFIED IDEOGRAPH
+ {0xD7E7, 0x9021}, //8142 #CJK UNIFIED IDEOGRAPH
+ {0xD7E8, 0x90EF}, //8143 #CJK UNIFIED IDEOGRAPH
+ {0xD7E9, 0x90EA}, //8144 #CJK UNIFIED IDEOGRAPH
+ {0xD7EA, 0x90F0}, //8145 #CJK UNIFIED IDEOGRAPH
+ {0xD7EB, 0x90F4}, //8146 #CJK UNIFIED IDEOGRAPH
+ {0xD7EC, 0x90F2}, //8147 #CJK UNIFIED IDEOGRAPH
+ {0xD7ED, 0x90F3}, //8148 #CJK UNIFIED IDEOGRAPH
+ {0xD7EE, 0x90D4}, //8149 #CJK UNIFIED IDEOGRAPH
+ {0xD7EF, 0x90EB}, //8150 #CJK UNIFIED IDEOGRAPH
+ {0xD7F0, 0x90EC}, //8151 #CJK UNIFIED IDEOGRAPH
+ {0xD7F1, 0x90E9}, //8152 #CJK UNIFIED IDEOGRAPH
+ {0xD7F2, 0x9156}, //8153 #CJK UNIFIED IDEOGRAPH
+ {0xD7F3, 0x9158}, //8154 #CJK UNIFIED IDEOGRAPH
+ {0xD7F4, 0x915A}, //8155 #CJK UNIFIED IDEOGRAPH
+ {0xD7F5, 0x9153}, //8156 #CJK UNIFIED IDEOGRAPH
+ {0xD7F6, 0x9155}, //8157 #CJK UNIFIED IDEOGRAPH
+ {0xD7F7, 0x91EC}, //8158 #CJK UNIFIED IDEOGRAPH
+ {0xD7F8, 0x91F4}, //8159 #CJK UNIFIED IDEOGRAPH
+ {0xD7F9, 0x91F1}, //8160 #CJK UNIFIED IDEOGRAPH
+ {0xD7FA, 0x91F3}, //8161 #CJK UNIFIED IDEOGRAPH
+ {0xD7FB, 0x91F8}, //8162 #CJK UNIFIED IDEOGRAPH
+ {0xD7FC, 0x91E4}, //8163 #CJK UNIFIED IDEOGRAPH
+ {0xD7FD, 0x91F9}, //8164 #CJK UNIFIED IDEOGRAPH
+ {0xD7FE, 0x91EA}, //8165 #CJK UNIFIED IDEOGRAPH
+ {0xD840, 0x91EB}, //8166 #CJK UNIFIED IDEOGRAPH
+ {0xD841, 0x91F7}, //8167 #CJK UNIFIED IDEOGRAPH
+ {0xD842, 0x91E8}, //8168 #CJK UNIFIED IDEOGRAPH
+ {0xD843, 0x91EE}, //8169 #CJK UNIFIED IDEOGRAPH
+ {0xD844, 0x957A}, //8170 #CJK UNIFIED IDEOGRAPH
+ {0xD845, 0x9586}, //8171 #CJK UNIFIED IDEOGRAPH
+ {0xD846, 0x9588}, //8172 #CJK UNIFIED IDEOGRAPH
+ {0xD847, 0x967C}, //8173 #CJK UNIFIED IDEOGRAPH
+ {0xD848, 0x966D}, //8174 #CJK UNIFIED IDEOGRAPH
+ {0xD849, 0x966B}, //8175 #CJK UNIFIED IDEOGRAPH
+ {0xD84A, 0x9671}, //8176 #CJK UNIFIED IDEOGRAPH
+ {0xD84B, 0x966F}, //8177 #CJK UNIFIED IDEOGRAPH
+ {0xD84C, 0x96BF}, //8178 #CJK UNIFIED IDEOGRAPH
+ {0xD84D, 0x976A}, //8179 #CJK UNIFIED IDEOGRAPH
+ {0xD84E, 0x9804}, //8180 #CJK UNIFIED IDEOGRAPH
+ {0xD84F, 0x98E5}, //8181 #CJK UNIFIED IDEOGRAPH
+ {0xD850, 0x9997}, //8182 #CJK UNIFIED IDEOGRAPH
+ {0xD851, 0x509B}, //8183 #CJK UNIFIED IDEOGRAPH
+ {0xD852, 0x5095}, //8184 #CJK UNIFIED IDEOGRAPH
+ {0xD853, 0x5094}, //8185 #CJK UNIFIED IDEOGRAPH
+ {0xD854, 0x509E}, //8186 #CJK UNIFIED IDEOGRAPH
+ {0xD855, 0x508B}, //8187 #CJK UNIFIED IDEOGRAPH
+ {0xD856, 0x50A3}, //8188 #CJK UNIFIED IDEOGRAPH
+ {0xD857, 0x5083}, //8189 #CJK UNIFIED IDEOGRAPH
+ {0xD858, 0x508C}, //8190 #CJK UNIFIED IDEOGRAPH
+ {0xD859, 0x508E}, //8191 #CJK UNIFIED IDEOGRAPH
+ {0xD85A, 0x509D}, //8192 #CJK UNIFIED IDEOGRAPH
+ {0xD85B, 0x5068}, //8193 #CJK UNIFIED IDEOGRAPH
+ {0xD85C, 0x509C}, //8194 #CJK UNIFIED IDEOGRAPH
+ {0xD85D, 0x5092}, //8195 #CJK UNIFIED IDEOGRAPH
+ {0xD85E, 0x5082}, //8196 #CJK UNIFIED IDEOGRAPH
+ {0xD85F, 0x5087}, //8197 #CJK UNIFIED IDEOGRAPH
+ {0xD860, 0x515F}, //8198 #CJK UNIFIED IDEOGRAPH
+ {0xD861, 0x51D4}, //8199 #CJK UNIFIED IDEOGRAPH
+ {0xD862, 0x5312}, //8200 #CJK UNIFIED IDEOGRAPH
+ {0xD863, 0x5311}, //8201 #CJK UNIFIED IDEOGRAPH
+ {0xD864, 0x53A4}, //8202 #CJK UNIFIED IDEOGRAPH
+ {0xD865, 0x53A7}, //8203 #CJK UNIFIED IDEOGRAPH
+ {0xD866, 0x5591}, //8204 #CJK UNIFIED IDEOGRAPH
+ {0xD867, 0x55A8}, //8205 #CJK UNIFIED IDEOGRAPH
+ {0xD868, 0x55A5}, //8206 #CJK UNIFIED IDEOGRAPH
+ {0xD869, 0x55AD}, //8207 #CJK UNIFIED IDEOGRAPH
+ {0xD86A, 0x5577}, //8208 #CJK UNIFIED IDEOGRAPH
+ {0xD86B, 0x5645}, //8209 #CJK UNIFIED IDEOGRAPH
+ {0xD86C, 0x55A2}, //8210 #CJK UNIFIED IDEOGRAPH
+ {0xD86D, 0x5593}, //8211 #CJK UNIFIED IDEOGRAPH
+ {0xD86E, 0x5588}, //8212 #CJK UNIFIED IDEOGRAPH
+ {0xD86F, 0x558F}, //8213 #CJK UNIFIED IDEOGRAPH
+ {0xD870, 0x55B5}, //8214 #CJK UNIFIED IDEOGRAPH
+ {0xD871, 0x5581}, //8215 #CJK UNIFIED IDEOGRAPH
+ {0xD872, 0x55A3}, //8216 #CJK UNIFIED IDEOGRAPH
+ {0xD873, 0x5592}, //8217 #CJK UNIFIED IDEOGRAPH
+ {0xD874, 0x55A4}, //8218 #CJK UNIFIED IDEOGRAPH
+ {0xD875, 0x557D}, //8219 #CJK UNIFIED IDEOGRAPH
+ {0xD876, 0x558C}, //8220 #CJK UNIFIED IDEOGRAPH
+ {0xD877, 0x55A6}, //8221 #CJK UNIFIED IDEOGRAPH
+ {0xD878, 0x557F}, //8222 #CJK UNIFIED IDEOGRAPH
+ {0xD879, 0x5595}, //8223 #CJK UNIFIED IDEOGRAPH
+ {0xD87A, 0x55A1}, //8224 #CJK UNIFIED IDEOGRAPH
+ {0xD87B, 0x558E}, //8225 #CJK UNIFIED IDEOGRAPH
+ {0xD87C, 0x570C}, //8226 #CJK UNIFIED IDEOGRAPH
+ {0xD87D, 0x5829}, //8227 #CJK UNIFIED IDEOGRAPH
+ {0xD87E, 0x5837}, //8228 #CJK UNIFIED IDEOGRAPH
+ {0xD8A1, 0x5819}, //8229 #CJK UNIFIED IDEOGRAPH
+ {0xD8A2, 0x581E}, //8230 #CJK UNIFIED IDEOGRAPH
+ {0xD8A3, 0x5827}, //8231 #CJK UNIFIED IDEOGRAPH
+ {0xD8A4, 0x5823}, //8232 #CJK UNIFIED IDEOGRAPH
+ {0xD8A5, 0x5828}, //8233 #CJK UNIFIED IDEOGRAPH
+ {0xD8A6, 0x57F5}, //8234 #CJK UNIFIED IDEOGRAPH
+ {0xD8A7, 0x5848}, //8235 #CJK UNIFIED IDEOGRAPH
+ {0xD8A8, 0x5825}, //8236 #CJK UNIFIED IDEOGRAPH
+ {0xD8A9, 0x581C}, //8237 #CJK UNIFIED IDEOGRAPH
+ {0xD8AA, 0x581B}, //8238 #CJK UNIFIED IDEOGRAPH
+ {0xD8AB, 0x5833}, //8239 #CJK UNIFIED IDEOGRAPH
+ {0xD8AC, 0x583F}, //8240 #CJK UNIFIED IDEOGRAPH
+ {0xD8AD, 0x5836}, //8241 #CJK UNIFIED IDEOGRAPH
+ {0xD8AE, 0x582E}, //8242 #CJK UNIFIED IDEOGRAPH
+ {0xD8AF, 0x5839}, //8243 #CJK UNIFIED IDEOGRAPH
+ {0xD8B0, 0x5838}, //8244 #CJK UNIFIED IDEOGRAPH
+ {0xD8B1, 0x582D}, //8245 #CJK UNIFIED IDEOGRAPH
+ {0xD8B2, 0x582C}, //8246 #CJK UNIFIED IDEOGRAPH
+ {0xD8B3, 0x583B}, //8247 #CJK UNIFIED IDEOGRAPH
+ {0xD8B4, 0x5961}, //8248 #CJK UNIFIED IDEOGRAPH
+ {0xD8B5, 0x5AAF}, //8249 #CJK UNIFIED IDEOGRAPH
+ {0xD8B6, 0x5A94}, //8250 #CJK UNIFIED IDEOGRAPH
+ {0xD8B7, 0x5A9F}, //8251 #CJK UNIFIED IDEOGRAPH
+ {0xD8B8, 0x5A7A}, //8252 #CJK UNIFIED IDEOGRAPH
+ {0xD8B9, 0x5AA2}, //8253 #CJK UNIFIED IDEOGRAPH
+ {0xD8BA, 0x5A9E}, //8254 #CJK UNIFIED IDEOGRAPH
+ {0xD8BB, 0x5A78}, //8255 #CJK UNIFIED IDEOGRAPH
+ {0xD8BC, 0x5AA6}, //8256 #CJK UNIFIED IDEOGRAPH
+ {0xD8BD, 0x5A7C}, //8257 #CJK UNIFIED IDEOGRAPH
+ {0xD8BE, 0x5AA5}, //8258 #CJK UNIFIED IDEOGRAPH
+ {0xD8BF, 0x5AAC}, //8259 #CJK UNIFIED IDEOGRAPH
+ {0xD8C0, 0x5A95}, //8260 #CJK UNIFIED IDEOGRAPH
+ {0xD8C1, 0x5AAE}, //8261 #CJK UNIFIED IDEOGRAPH
+ {0xD8C2, 0x5A37}, //8262 #CJK UNIFIED IDEOGRAPH
+ {0xD8C3, 0x5A84}, //8263 #CJK UNIFIED IDEOGRAPH
+ {0xD8C4, 0x5A8A}, //8264 #CJK UNIFIED IDEOGRAPH
+ {0xD8C5, 0x5A97}, //8265 #CJK UNIFIED IDEOGRAPH
+ {0xD8C6, 0x5A83}, //8266 #CJK UNIFIED IDEOGRAPH
+ {0xD8C7, 0x5A8B}, //8267 #CJK UNIFIED IDEOGRAPH
+ {0xD8C8, 0x5AA9}, //8268 #CJK UNIFIED IDEOGRAPH
+ {0xD8C9, 0x5A7B}, //8269 #CJK UNIFIED IDEOGRAPH
+ {0xD8CA, 0x5A7D}, //8270 #CJK UNIFIED IDEOGRAPH
+ {0xD8CB, 0x5A8C}, //8271 #CJK UNIFIED IDEOGRAPH
+ {0xD8CC, 0x5A9C}, //8272 #CJK UNIFIED IDEOGRAPH
+ {0xD8CD, 0x5A8F}, //8273 #CJK UNIFIED IDEOGRAPH
+ {0xD8CE, 0x5A93}, //8274 #CJK UNIFIED IDEOGRAPH
+ {0xD8CF, 0x5A9D}, //8275 #CJK UNIFIED IDEOGRAPH
+ {0xD8D0, 0x5BEA}, //8276 #CJK UNIFIED IDEOGRAPH
+ {0xD8D1, 0x5BCD}, //8277 #CJK UNIFIED IDEOGRAPH
+ {0xD8D2, 0x5BCB}, //8278 #CJK UNIFIED IDEOGRAPH
+ {0xD8D3, 0x5BD4}, //8279 #CJK UNIFIED IDEOGRAPH
+ {0xD8D4, 0x5BD1}, //8280 #CJK UNIFIED IDEOGRAPH
+ {0xD8D5, 0x5BCA}, //8281 #CJK UNIFIED IDEOGRAPH
+ {0xD8D6, 0x5BCE}, //8282 #CJK UNIFIED IDEOGRAPH
+ {0xD8D7, 0x5C0C}, //8283 #CJK UNIFIED IDEOGRAPH
+ {0xD8D8, 0x5C30}, //8284 #CJK UNIFIED IDEOGRAPH
+ {0xD8D9, 0x5D37}, //8285 #CJK UNIFIED IDEOGRAPH
+ {0xD8DA, 0x5D43}, //8286 #CJK UNIFIED IDEOGRAPH
+ {0xD8DB, 0x5D6B}, //8287 #CJK UNIFIED IDEOGRAPH
+ {0xD8DC, 0x5D41}, //8288 #CJK UNIFIED IDEOGRAPH
+ {0xD8DD, 0x5D4B}, //8289 #CJK UNIFIED IDEOGRAPH
+ {0xD8DE, 0x5D3F}, //8290 #CJK UNIFIED IDEOGRAPH
+ {0xD8DF, 0x5D35}, //8291 #CJK UNIFIED IDEOGRAPH
+ {0xD8E0, 0x5D51}, //8292 #CJK UNIFIED IDEOGRAPH
+ {0xD8E1, 0x5D4E}, //8293 #CJK UNIFIED IDEOGRAPH
+ {0xD8E2, 0x5D55}, //8294 #CJK UNIFIED IDEOGRAPH
+ {0xD8E3, 0x5D33}, //8295 #CJK UNIFIED IDEOGRAPH
+ {0xD8E4, 0x5D3A}, //8296 #CJK UNIFIED IDEOGRAPH
+ {0xD8E5, 0x5D52}, //8297 #CJK UNIFIED IDEOGRAPH
+ {0xD8E6, 0x5D3D}, //8298 #CJK UNIFIED IDEOGRAPH
+ {0xD8E7, 0x5D31}, //8299 #CJK UNIFIED IDEOGRAPH
+ {0xD8E8, 0x5D59}, //8300 #CJK UNIFIED IDEOGRAPH
+ {0xD8E9, 0x5D42}, //8301 #CJK UNIFIED IDEOGRAPH
+ {0xD8EA, 0x5D39}, //8302 #CJK UNIFIED IDEOGRAPH
+ {0xD8EB, 0x5D49}, //8303 #CJK UNIFIED IDEOGRAPH
+ {0xD8EC, 0x5D38}, //8304 #CJK UNIFIED IDEOGRAPH
+ {0xD8ED, 0x5D3C}, //8305 #CJK UNIFIED IDEOGRAPH
+ {0xD8EE, 0x5D32}, //8306 #CJK UNIFIED IDEOGRAPH
+ {0xD8EF, 0x5D36}, //8307 #CJK UNIFIED IDEOGRAPH
+ {0xD8F0, 0x5D40}, //8308 #CJK UNIFIED IDEOGRAPH
+ {0xD8F1, 0x5D45}, //8309 #CJK UNIFIED IDEOGRAPH
+ {0xD8F2, 0x5E44}, //8310 #CJK UNIFIED IDEOGRAPH
+ {0xD8F3, 0x5E41}, //8311 #CJK UNIFIED IDEOGRAPH
+ {0xD8F4, 0x5F58}, //8312 #CJK UNIFIED IDEOGRAPH
+ {0xD8F5, 0x5FA6}, //8313 #CJK UNIFIED IDEOGRAPH
+ {0xD8F6, 0x5FA5}, //8314 #CJK UNIFIED IDEOGRAPH
+ {0xD8F7, 0x5FAB}, //8315 #CJK UNIFIED IDEOGRAPH
+ {0xD8F8, 0x60C9}, //8316 #CJK UNIFIED IDEOGRAPH
+ {0xD8F9, 0x60B9}, //8317 #CJK UNIFIED IDEOGRAPH
+ {0xD8FA, 0x60CC}, //8318 #CJK UNIFIED IDEOGRAPH
+ {0xD8FB, 0x60E2}, //8319 #CJK UNIFIED IDEOGRAPH
+ {0xD8FC, 0x60CE}, //8320 #CJK UNIFIED IDEOGRAPH
+ {0xD8FD, 0x60C4}, //8321 #CJK UNIFIED IDEOGRAPH
+ {0xD8FE, 0x6114}, //8322 #CJK UNIFIED IDEOGRAPH
+ {0xD940, 0x60F2}, //8323 #CJK UNIFIED IDEOGRAPH
+ {0xD941, 0x610A}, //8324 #CJK UNIFIED IDEOGRAPH
+ {0xD942, 0x6116}, //8325 #CJK UNIFIED IDEOGRAPH
+ {0xD943, 0x6105}, //8326 #CJK UNIFIED IDEOGRAPH
+ {0xD944, 0x60F5}, //8327 #CJK UNIFIED IDEOGRAPH
+ {0xD945, 0x6113}, //8328 #CJK UNIFIED IDEOGRAPH
+ {0xD946, 0x60F8}, //8329 #CJK UNIFIED IDEOGRAPH
+ {0xD947, 0x60FC}, //8330 #CJK UNIFIED IDEOGRAPH
+ {0xD948, 0x60FE}, //8331 #CJK UNIFIED IDEOGRAPH
+ {0xD949, 0x60C1}, //8332 #CJK UNIFIED IDEOGRAPH
+ {0xD94A, 0x6103}, //8333 #CJK UNIFIED IDEOGRAPH
+ {0xD94B, 0x6118}, //8334 #CJK UNIFIED IDEOGRAPH
+ {0xD94C, 0x611D}, //8335 #CJK UNIFIED IDEOGRAPH
+ {0xD94D, 0x6110}, //8336 #CJK UNIFIED IDEOGRAPH
+ {0xD94E, 0x60FF}, //8337 #CJK UNIFIED IDEOGRAPH
+ {0xD94F, 0x6104}, //8338 #CJK UNIFIED IDEOGRAPH
+ {0xD950, 0x610B}, //8339 #CJK UNIFIED IDEOGRAPH
+ {0xD951, 0x624A}, //8340 #CJK UNIFIED IDEOGRAPH
+ {0xD952, 0x6394}, //8341 #CJK UNIFIED IDEOGRAPH
+ {0xD953, 0x63B1}, //8342 #CJK UNIFIED IDEOGRAPH
+ {0xD954, 0x63B0}, //8343 #CJK UNIFIED IDEOGRAPH
+ {0xD955, 0x63CE}, //8344 #CJK UNIFIED IDEOGRAPH
+ {0xD956, 0x63E5}, //8345 #CJK UNIFIED IDEOGRAPH
+ {0xD957, 0x63E8}, //8346 #CJK UNIFIED IDEOGRAPH
+ {0xD958, 0x63EF}, //8347 #CJK UNIFIED IDEOGRAPH
+ {0xD959, 0x63C3}, //8348 #CJK UNIFIED IDEOGRAPH
+ {0xD95A, 0x649D}, //8349 #CJK UNIFIED IDEOGRAPH
+ {0xD95B, 0x63F3}, //8350 #CJK UNIFIED IDEOGRAPH
+ {0xD95C, 0x63CA}, //8351 #CJK UNIFIED IDEOGRAPH
+ {0xD95D, 0x63E0}, //8352 #CJK UNIFIED IDEOGRAPH
+ {0xD95E, 0x63F6}, //8353 #CJK UNIFIED IDEOGRAPH
+ {0xD95F, 0x63D5}, //8354 #CJK UNIFIED IDEOGRAPH
+ {0xD960, 0x63F2}, //8355 #CJK UNIFIED IDEOGRAPH
+ {0xD961, 0x63F5}, //8356 #CJK UNIFIED IDEOGRAPH
+ {0xD962, 0x6461}, //8357 #CJK UNIFIED IDEOGRAPH
+ {0xD963, 0x63DF}, //8358 #CJK UNIFIED IDEOGRAPH
+ {0xD964, 0x63BE}, //8359 #CJK UNIFIED IDEOGRAPH
+ {0xD965, 0x63DD}, //8360 #CJK UNIFIED IDEOGRAPH
+ {0xD966, 0x63DC}, //8361 #CJK UNIFIED IDEOGRAPH
+ {0xD967, 0x63C4}, //8362 #CJK UNIFIED IDEOGRAPH
+ {0xD968, 0x63D8}, //8363 #CJK UNIFIED IDEOGRAPH
+ {0xD969, 0x63D3}, //8364 #CJK UNIFIED IDEOGRAPH
+ {0xD96A, 0x63C2}, //8365 #CJK UNIFIED IDEOGRAPH
+ {0xD96B, 0x63C7}, //8366 #CJK UNIFIED IDEOGRAPH
+ {0xD96C, 0x63CC}, //8367 #CJK UNIFIED IDEOGRAPH
+ {0xD96D, 0x63CB}, //8368 #CJK UNIFIED IDEOGRAPH
+ {0xD96E, 0x63C8}, //8369 #CJK UNIFIED IDEOGRAPH
+ {0xD96F, 0x63F0}, //8370 #CJK UNIFIED IDEOGRAPH
+ {0xD970, 0x63D7}, //8371 #CJK UNIFIED IDEOGRAPH
+ {0xD971, 0x63D9}, //8372 #CJK UNIFIED IDEOGRAPH
+ {0xD972, 0x6532}, //8373 #CJK UNIFIED IDEOGRAPH
+ {0xD973, 0x6567}, //8374 #CJK UNIFIED IDEOGRAPH
+ {0xD974, 0x656A}, //8375 #CJK UNIFIED IDEOGRAPH
+ {0xD975, 0x6564}, //8376 #CJK UNIFIED IDEOGRAPH
+ {0xD976, 0x655C}, //8377 #CJK UNIFIED IDEOGRAPH
+ {0xD977, 0x6568}, //8378 #CJK UNIFIED IDEOGRAPH
+ {0xD978, 0x6565}, //8379 #CJK UNIFIED IDEOGRAPH
+ {0xD979, 0x658C}, //8380 #CJK UNIFIED IDEOGRAPH
+ {0xD97A, 0x659D}, //8381 #CJK UNIFIED IDEOGRAPH
+ {0xD97B, 0x659E}, //8382 #CJK UNIFIED IDEOGRAPH
+ {0xD97C, 0x65AE}, //8383 #CJK UNIFIED IDEOGRAPH
+ {0xD97D, 0x65D0}, //8384 #CJK UNIFIED IDEOGRAPH
+ {0xD97E, 0x65D2}, //8385 #CJK UNIFIED IDEOGRAPH
+ {0xD9A1, 0x667C}, //8386 #CJK UNIFIED IDEOGRAPH
+ {0xD9A2, 0x666C}, //8387 #CJK UNIFIED IDEOGRAPH
+ {0xD9A3, 0x667B}, //8388 #CJK UNIFIED IDEOGRAPH
+ {0xD9A4, 0x6680}, //8389 #CJK UNIFIED IDEOGRAPH
+ {0xD9A5, 0x6671}, //8390 #CJK UNIFIED IDEOGRAPH
+ {0xD9A6, 0x6679}, //8391 #CJK UNIFIED IDEOGRAPH
+ {0xD9A7, 0x666A}, //8392 #CJK UNIFIED IDEOGRAPH
+ {0xD9A8, 0x6672}, //8393 #CJK UNIFIED IDEOGRAPH
+ {0xD9A9, 0x6701}, //8394 #CJK UNIFIED IDEOGRAPH
+ {0xD9AA, 0x690C}, //8395 #CJK UNIFIED IDEOGRAPH
+ {0xD9AB, 0x68D3}, //8396 #CJK UNIFIED IDEOGRAPH
+ {0xD9AC, 0x6904}, //8397 #CJK UNIFIED IDEOGRAPH
+ {0xD9AD, 0x68DC}, //8398 #CJK UNIFIED IDEOGRAPH
+ {0xD9AE, 0x692A}, //8399 #CJK UNIFIED IDEOGRAPH
+ {0xD9AF, 0x68EC}, //8400 #CJK UNIFIED IDEOGRAPH
+ {0xD9B0, 0x68EA}, //8401 #CJK UNIFIED IDEOGRAPH
+ {0xD9B1, 0x68F1}, //8402 #CJK UNIFIED IDEOGRAPH
+ {0xD9B2, 0x690F}, //8403 #CJK UNIFIED IDEOGRAPH
+ {0xD9B3, 0x68D6}, //8404 #CJK UNIFIED IDEOGRAPH
+ {0xD9B4, 0x68F7}, //8405 #CJK UNIFIED IDEOGRAPH
+ {0xD9B5, 0x68EB}, //8406 #CJK UNIFIED IDEOGRAPH
+ {0xD9B6, 0x68E4}, //8407 #CJK UNIFIED IDEOGRAPH
+ {0xD9B7, 0x68F6}, //8408 #CJK UNIFIED IDEOGRAPH
+ {0xD9B8, 0x6913}, //8409 #CJK UNIFIED IDEOGRAPH
+ {0xD9B9, 0x6910}, //8410 #CJK UNIFIED IDEOGRAPH
+ {0xD9BA, 0x68F3}, //8411 #CJK UNIFIED IDEOGRAPH
+ {0xD9BB, 0x68E1}, //8412 #CJK UNIFIED IDEOGRAPH
+ {0xD9BC, 0x6907}, //8413 #CJK UNIFIED IDEOGRAPH
+ {0xD9BD, 0x68CC}, //8414 #CJK UNIFIED IDEOGRAPH
+ {0xD9BE, 0x6908}, //8415 #CJK UNIFIED IDEOGRAPH
+ {0xD9BF, 0x6970}, //8416 #CJK UNIFIED IDEOGRAPH
+ {0xD9C0, 0x68B4}, //8417 #CJK UNIFIED IDEOGRAPH
+ {0xD9C1, 0x6911}, //8418 #CJK UNIFIED IDEOGRAPH
+ {0xD9C2, 0x68EF}, //8419 #CJK UNIFIED IDEOGRAPH
+ {0xD9C3, 0x68C6}, //8420 #CJK UNIFIED IDEOGRAPH
+ {0xD9C4, 0x6914}, //8421 #CJK UNIFIED IDEOGRAPH
+ {0xD9C5, 0x68F8}, //8422 #CJK UNIFIED IDEOGRAPH
+ {0xD9C6, 0x68D0}, //8423 #CJK UNIFIED IDEOGRAPH
+ {0xD9C7, 0x68FD}, //8424 #CJK UNIFIED IDEOGRAPH
+ {0xD9C8, 0x68FC}, //8425 #CJK UNIFIED IDEOGRAPH
+ {0xD9C9, 0x68E8}, //8426 #CJK UNIFIED IDEOGRAPH
+ {0xD9CA, 0x690B}, //8427 #CJK UNIFIED IDEOGRAPH
+ {0xD9CB, 0x690A}, //8428 #CJK UNIFIED IDEOGRAPH
+ {0xD9CC, 0x6917}, //8429 #CJK UNIFIED IDEOGRAPH
+ {0xD9CD, 0x68CE}, //8430 #CJK UNIFIED IDEOGRAPH
+ {0xD9CE, 0x68C8}, //8431 #CJK UNIFIED IDEOGRAPH
+ {0xD9CF, 0x68DD}, //8432 #CJK UNIFIED IDEOGRAPH
+ {0xD9D0, 0x68DE}, //8433 #CJK UNIFIED IDEOGRAPH
+ {0xD9D1, 0x68E6}, //8434 #CJK UNIFIED IDEOGRAPH
+ {0xD9D2, 0x68F4}, //8435 #CJK UNIFIED IDEOGRAPH
+ {0xD9D3, 0x68D1}, //8436 #CJK UNIFIED IDEOGRAPH
+ {0xD9D4, 0x6906}, //8437 #CJK UNIFIED IDEOGRAPH
+ {0xD9D5, 0x68D4}, //8438 #CJK UNIFIED IDEOGRAPH
+ {0xD9D6, 0x68E9}, //8439 #CJK UNIFIED IDEOGRAPH
+ {0xD9D7, 0x6915}, //8440 #CJK UNIFIED IDEOGRAPH
+ {0xD9D8, 0x6925}, //8441 #CJK UNIFIED IDEOGRAPH
+ {0xD9D9, 0x68C7}, //8442 #CJK UNIFIED IDEOGRAPH
+ {0xD9DA, 0x6B39}, //8443 #CJK UNIFIED IDEOGRAPH
+ {0xD9DB, 0x6B3B}, //8444 #CJK UNIFIED IDEOGRAPH
+ {0xD9DC, 0x6B3F}, //8445 #CJK UNIFIED IDEOGRAPH
+ {0xD9DD, 0x6B3C}, //8446 #CJK UNIFIED IDEOGRAPH
+ {0xD9DE, 0x6B94}, //8447 #CJK UNIFIED IDEOGRAPH
+ {0xD9DF, 0x6B97}, //8448 #CJK UNIFIED IDEOGRAPH
+ {0xD9E0, 0x6B99}, //8449 #CJK UNIFIED IDEOGRAPH
+ {0xD9E1, 0x6B95}, //8450 #CJK UNIFIED IDEOGRAPH
+ {0xD9E2, 0x6BBD}, //8451 #CJK UNIFIED IDEOGRAPH
+ {0xD9E3, 0x6BF0}, //8452 #CJK UNIFIED IDEOGRAPH
+ {0xD9E4, 0x6BF2}, //8453 #CJK UNIFIED IDEOGRAPH
+ {0xD9E5, 0x6BF3}, //8454 #CJK UNIFIED IDEOGRAPH
+ {0xD9E6, 0x6C30}, //8455 #CJK UNIFIED IDEOGRAPH
+ {0xD9E7, 0x6DFC}, //8456 #CJK UNIFIED IDEOGRAPH
+ {0xD9E8, 0x6E46}, //8457 #CJK UNIFIED IDEOGRAPH
+ {0xD9E9, 0x6E47}, //8458 #CJK UNIFIED IDEOGRAPH
+ {0xD9EA, 0x6E1F}, //8459 #CJK UNIFIED IDEOGRAPH
+ {0xD9EB, 0x6E49}, //8460 #CJK UNIFIED IDEOGRAPH
+ {0xD9EC, 0x6E88}, //8461 #CJK UNIFIED IDEOGRAPH
+ {0xD9ED, 0x6E3C}, //8462 #CJK UNIFIED IDEOGRAPH
+ {0xD9EE, 0x6E3D}, //8463 #CJK UNIFIED IDEOGRAPH
+ {0xD9EF, 0x6E45}, //8464 #CJK UNIFIED IDEOGRAPH
+ {0xD9F0, 0x6E62}, //8465 #CJK UNIFIED IDEOGRAPH
+ {0xD9F1, 0x6E2B}, //8466 #CJK UNIFIED IDEOGRAPH
+ {0xD9F2, 0x6E3F}, //8467 #CJK UNIFIED IDEOGRAPH
+ {0xD9F3, 0x6E41}, //8468 #CJK UNIFIED IDEOGRAPH
+ {0xD9F4, 0x6E5D}, //8469 #CJK UNIFIED IDEOGRAPH
+ {0xD9F5, 0x6E73}, //8470 #CJK UNIFIED IDEOGRAPH
+ {0xD9F6, 0x6E1C}, //8471 #CJK UNIFIED IDEOGRAPH
+ {0xD9F7, 0x6E33}, //8472 #CJK UNIFIED IDEOGRAPH
+ {0xD9F8, 0x6E4B}, //8473 #CJK UNIFIED IDEOGRAPH
+ {0xD9F9, 0x6E40}, //8474 #CJK UNIFIED IDEOGRAPH
+ {0xD9FA, 0x6E51}, //8475 #CJK UNIFIED IDEOGRAPH
+ {0xD9FB, 0x6E3B}, //8476 #CJK UNIFIED IDEOGRAPH
+ {0xD9FC, 0x6E03}, //8477 #CJK UNIFIED IDEOGRAPH
+ {0xD9FD, 0x6E2E}, //8478 #CJK UNIFIED IDEOGRAPH
+ {0xD9FE, 0x6E5E}, //8479 #CJK UNIFIED IDEOGRAPH
+ {0xDA40, 0x6E68}, //8480 #CJK UNIFIED IDEOGRAPH
+ {0xDA41, 0x6E5C}, //8481 #CJK UNIFIED IDEOGRAPH
+ {0xDA42, 0x6E61}, //8482 #CJK UNIFIED IDEOGRAPH
+ {0xDA43, 0x6E31}, //8483 #CJK UNIFIED IDEOGRAPH
+ {0xDA44, 0x6E28}, //8484 #CJK UNIFIED IDEOGRAPH
+ {0xDA45, 0x6E60}, //8485 #CJK UNIFIED IDEOGRAPH
+ {0xDA46, 0x6E71}, //8486 #CJK UNIFIED IDEOGRAPH
+ {0xDA47, 0x6E6B}, //8487 #CJK UNIFIED IDEOGRAPH
+ {0xDA48, 0x6E39}, //8488 #CJK UNIFIED IDEOGRAPH
+ {0xDA49, 0x6E22}, //8489 #CJK UNIFIED IDEOGRAPH
+ {0xDA4A, 0x6E30}, //8490 #CJK UNIFIED IDEOGRAPH
+ {0xDA4B, 0x6E53}, //8491 #CJK UNIFIED IDEOGRAPH
+ {0xDA4C, 0x6E65}, //8492 #CJK UNIFIED IDEOGRAPH
+ {0xDA4D, 0x6E27}, //8493 #CJK UNIFIED IDEOGRAPH
+ {0xDA4E, 0x6E78}, //8494 #CJK UNIFIED IDEOGRAPH
+ {0xDA4F, 0x6E64}, //8495 #CJK UNIFIED IDEOGRAPH
+ {0xDA50, 0x6E77}, //8496 #CJK UNIFIED IDEOGRAPH
+ {0xDA51, 0x6E55}, //8497 #CJK UNIFIED IDEOGRAPH
+ {0xDA52, 0x6E79}, //8498 #CJK UNIFIED IDEOGRAPH
+ {0xDA53, 0x6E52}, //8499 #CJK UNIFIED IDEOGRAPH
+ {0xDA54, 0x6E66}, //8500 #CJK UNIFIED IDEOGRAPH
+ {0xDA55, 0x6E35}, //8501 #CJK UNIFIED IDEOGRAPH
+ {0xDA56, 0x6E36}, //8502 #CJK UNIFIED IDEOGRAPH
+ {0xDA57, 0x6E5A}, //8503 #CJK UNIFIED IDEOGRAPH
+ {0xDA58, 0x7120}, //8504 #CJK UNIFIED IDEOGRAPH
+ {0xDA59, 0x711E}, //8505 #CJK UNIFIED IDEOGRAPH
+ {0xDA5A, 0x712F}, //8506 #CJK UNIFIED IDEOGRAPH
+ {0xDA5B, 0x70FB}, //8507 #CJK UNIFIED IDEOGRAPH
+ {0xDA5C, 0x712E}, //8508 #CJK UNIFIED IDEOGRAPH
+ {0xDA5D, 0x7131}, //8509 #CJK UNIFIED IDEOGRAPH
+ {0xDA5E, 0x7123}, //8510 #CJK UNIFIED IDEOGRAPH
+ {0xDA5F, 0x7125}, //8511 #CJK UNIFIED IDEOGRAPH
+ {0xDA60, 0x7122}, //8512 #CJK UNIFIED IDEOGRAPH
+ {0xDA61, 0x7132}, //8513 #CJK UNIFIED IDEOGRAPH
+ {0xDA62, 0x711F}, //8514 #CJK UNIFIED IDEOGRAPH
+ {0xDA63, 0x7128}, //8515 #CJK UNIFIED IDEOGRAPH
+ {0xDA64, 0x713A}, //8516 #CJK UNIFIED IDEOGRAPH
+ {0xDA65, 0x711B}, //8517 #CJK UNIFIED IDEOGRAPH
+ {0xDA66, 0x724B}, //8518 #CJK UNIFIED IDEOGRAPH
+ {0xDA67, 0x725A}, //8519 #CJK UNIFIED IDEOGRAPH
+ {0xDA68, 0x7288}, //8520 #CJK UNIFIED IDEOGRAPH
+ {0xDA69, 0x7289}, //8521 #CJK UNIFIED IDEOGRAPH
+ {0xDA6A, 0x7286}, //8522 #CJK UNIFIED IDEOGRAPH
+ {0xDA6B, 0x7285}, //8523 #CJK UNIFIED IDEOGRAPH
+ {0xDA6C, 0x728B}, //8524 #CJK UNIFIED IDEOGRAPH
+ {0xDA6D, 0x7312}, //8525 #CJK UNIFIED IDEOGRAPH
+ {0xDA6E, 0x730B}, //8526 #CJK UNIFIED IDEOGRAPH
+ {0xDA6F, 0x7330}, //8527 #CJK UNIFIED IDEOGRAPH
+ {0xDA70, 0x7322}, //8528 #CJK UNIFIED IDEOGRAPH
+ {0xDA71, 0x7331}, //8529 #CJK UNIFIED IDEOGRAPH
+ {0xDA72, 0x7333}, //8530 #CJK UNIFIED IDEOGRAPH
+ {0xDA73, 0x7327}, //8531 #CJK UNIFIED IDEOGRAPH
+ {0xDA74, 0x7332}, //8532 #CJK UNIFIED IDEOGRAPH
+ {0xDA75, 0x732D}, //8533 #CJK UNIFIED IDEOGRAPH
+ {0xDA76, 0x7326}, //8534 #CJK UNIFIED IDEOGRAPH
+ {0xDA77, 0x7323}, //8535 #CJK UNIFIED IDEOGRAPH
+ {0xDA78, 0x7335}, //8536 #CJK UNIFIED IDEOGRAPH
+ {0xDA79, 0x730C}, //8537 #CJK UNIFIED IDEOGRAPH
+ {0xDA7A, 0x742E}, //8538 #CJK UNIFIED IDEOGRAPH
+ {0xDA7B, 0x742C}, //8539 #CJK UNIFIED IDEOGRAPH
+ {0xDA7C, 0x7430}, //8540 #CJK UNIFIED IDEOGRAPH
+ {0xDA7D, 0x742B}, //8541 #CJK UNIFIED IDEOGRAPH
+ {0xDA7E, 0x7416}, //8542 #CJK UNIFIED IDEOGRAPH
+ {0xDAA1, 0x741A}, //8543 #CJK UNIFIED IDEOGRAPH
+ {0xDAA2, 0x7421}, //8544 #CJK UNIFIED IDEOGRAPH
+ {0xDAA3, 0x742D}, //8545 #CJK UNIFIED IDEOGRAPH
+ {0xDAA4, 0x7431}, //8546 #CJK UNIFIED IDEOGRAPH
+ {0xDAA5, 0x7424}, //8547 #CJK UNIFIED IDEOGRAPH
+ {0xDAA6, 0x7423}, //8548 #CJK UNIFIED IDEOGRAPH
+ {0xDAA7, 0x741D}, //8549 #CJK UNIFIED IDEOGRAPH
+ {0xDAA8, 0x7429}, //8550 #CJK UNIFIED IDEOGRAPH
+ {0xDAA9, 0x7420}, //8551 #CJK UNIFIED IDEOGRAPH
+ {0xDAAA, 0x7432}, //8552 #CJK UNIFIED IDEOGRAPH
+ {0xDAAB, 0x74FB}, //8553 #CJK UNIFIED IDEOGRAPH
+ {0xDAAC, 0x752F}, //8554 #CJK UNIFIED IDEOGRAPH
+ {0xDAAD, 0x756F}, //8555 #CJK UNIFIED IDEOGRAPH
+ {0xDAAE, 0x756C}, //8556 #CJK UNIFIED IDEOGRAPH
+ {0xDAAF, 0x75E7}, //8557 #CJK UNIFIED IDEOGRAPH
+ {0xDAB0, 0x75DA}, //8558 #CJK UNIFIED IDEOGRAPH
+ {0xDAB1, 0x75E1}, //8559 #CJK UNIFIED IDEOGRAPH
+ {0xDAB2, 0x75E6}, //8560 #CJK UNIFIED IDEOGRAPH
+ {0xDAB3, 0x75DD}, //8561 #CJK UNIFIED IDEOGRAPH
+ {0xDAB4, 0x75DF}, //8562 #CJK UNIFIED IDEOGRAPH
+ {0xDAB5, 0x75E4}, //8563 #CJK UNIFIED IDEOGRAPH
+ {0xDAB6, 0x75D7}, //8564 #CJK UNIFIED IDEOGRAPH
+ {0xDAB7, 0x7695}, //8565 #CJK UNIFIED IDEOGRAPH
+ {0xDAB8, 0x7692}, //8566 #CJK UNIFIED IDEOGRAPH
+ {0xDAB9, 0x76DA}, //8567 #CJK UNIFIED IDEOGRAPH
+ {0xDABA, 0x7746}, //8568 #CJK UNIFIED IDEOGRAPH
+ {0xDABB, 0x7747}, //8569 #CJK UNIFIED IDEOGRAPH
+ {0xDABC, 0x7744}, //8570 #CJK UNIFIED IDEOGRAPH
+ {0xDABD, 0x774D}, //8571 #CJK UNIFIED IDEOGRAPH
+ {0xDABE, 0x7745}, //8572 #CJK UNIFIED IDEOGRAPH
+ {0xDABF, 0x774A}, //8573 #CJK UNIFIED IDEOGRAPH
+ {0xDAC0, 0x774E}, //8574 #CJK UNIFIED IDEOGRAPH
+ {0xDAC1, 0x774B}, //8575 #CJK UNIFIED IDEOGRAPH
+ {0xDAC2, 0x774C}, //8576 #CJK UNIFIED IDEOGRAPH
+ {0xDAC3, 0x77DE}, //8577 #CJK UNIFIED IDEOGRAPH
+ {0xDAC4, 0x77EC}, //8578 #CJK UNIFIED IDEOGRAPH
+ {0xDAC5, 0x7860}, //8579 #CJK UNIFIED IDEOGRAPH
+ {0xDAC6, 0x7864}, //8580 #CJK UNIFIED IDEOGRAPH
+ {0xDAC7, 0x7865}, //8581 #CJK UNIFIED IDEOGRAPH
+ {0xDAC8, 0x785C}, //8582 #CJK UNIFIED IDEOGRAPH
+ {0xDAC9, 0x786D}, //8583 #CJK UNIFIED IDEOGRAPH
+ {0xDACA, 0x7871}, //8584 #CJK UNIFIED IDEOGRAPH
+ {0xDACB, 0x786A}, //8585 #CJK UNIFIED IDEOGRAPH
+ {0xDACC, 0x786E}, //8586 #CJK UNIFIED IDEOGRAPH
+ {0xDACD, 0x7870}, //8587 #CJK UNIFIED IDEOGRAPH
+ {0xDACE, 0x7869}, //8588 #CJK UNIFIED IDEOGRAPH
+ {0xDACF, 0x7868}, //8589 #CJK UNIFIED IDEOGRAPH
+ {0xDAD0, 0x785E}, //8590 #CJK UNIFIED IDEOGRAPH
+ {0xDAD1, 0x7862}, //8591 #CJK UNIFIED IDEOGRAPH
+ {0xDAD2, 0x7974}, //8592 #CJK UNIFIED IDEOGRAPH
+ {0xDAD3, 0x7973}, //8593 #CJK UNIFIED IDEOGRAPH
+ {0xDAD4, 0x7972}, //8594 #CJK UNIFIED IDEOGRAPH
+ {0xDAD5, 0x7970}, //8595 #CJK UNIFIED IDEOGRAPH
+ {0xDAD6, 0x7A02}, //8596 #CJK UNIFIED IDEOGRAPH
+ {0xDAD7, 0x7A0A}, //8597 #CJK UNIFIED IDEOGRAPH
+ {0xDAD8, 0x7A03}, //8598 #CJK UNIFIED IDEOGRAPH
+ {0xDAD9, 0x7A0C}, //8599 #CJK UNIFIED IDEOGRAPH
+ {0xDADA, 0x7A04}, //8600 #CJK UNIFIED IDEOGRAPH
+ {0xDADB, 0x7A99}, //8601 #CJK UNIFIED IDEOGRAPH
+ {0xDADC, 0x7AE6}, //8602 #CJK UNIFIED IDEOGRAPH
+ {0xDADD, 0x7AE4}, //8603 #CJK UNIFIED IDEOGRAPH
+ {0xDADE, 0x7B4A}, //8604 #CJK UNIFIED IDEOGRAPH
+ {0xDADF, 0x7B3B}, //8605 #CJK UNIFIED IDEOGRAPH
+ {0xDAE0, 0x7B44}, //8606 #CJK UNIFIED IDEOGRAPH
+ {0xDAE1, 0x7B48}, //8607 #CJK UNIFIED IDEOGRAPH
+ {0xDAE2, 0x7B4C}, //8608 #CJK UNIFIED IDEOGRAPH
+ {0xDAE3, 0x7B4E}, //8609 #CJK UNIFIED IDEOGRAPH
+ {0xDAE4, 0x7B40}, //8610 #CJK UNIFIED IDEOGRAPH
+ {0xDAE5, 0x7B58}, //8611 #CJK UNIFIED IDEOGRAPH
+ {0xDAE6, 0x7B45}, //8612 #CJK UNIFIED IDEOGRAPH
+ {0xDAE7, 0x7CA2}, //8613 #CJK UNIFIED IDEOGRAPH
+ {0xDAE8, 0x7C9E}, //8614 #CJK UNIFIED IDEOGRAPH
+ {0xDAE9, 0x7CA8}, //8615 #CJK UNIFIED IDEOGRAPH
+ {0xDAEA, 0x7CA1}, //8616 #CJK UNIFIED IDEOGRAPH
+ {0xDAEB, 0x7D58}, //8617 #CJK UNIFIED IDEOGRAPH
+ {0xDAEC, 0x7D6F}, //8618 #CJK UNIFIED IDEOGRAPH
+ {0xDAED, 0x7D63}, //8619 #CJK UNIFIED IDEOGRAPH
+ {0xDAEE, 0x7D53}, //8620 #CJK UNIFIED IDEOGRAPH
+ {0xDAEF, 0x7D56}, //8621 #CJK UNIFIED IDEOGRAPH
+ {0xDAF0, 0x7D67}, //8622 #CJK UNIFIED IDEOGRAPH
+ {0xDAF1, 0x7D6A}, //8623 #CJK UNIFIED IDEOGRAPH
+ {0xDAF2, 0x7D4F}, //8624 #CJK UNIFIED IDEOGRAPH
+ {0xDAF3, 0x7D6D}, //8625 #CJK UNIFIED IDEOGRAPH
+ {0xDAF4, 0x7D5C}, //8626 #CJK UNIFIED IDEOGRAPH
+ {0xDAF5, 0x7D6B}, //8627 #CJK UNIFIED IDEOGRAPH
+ {0xDAF6, 0x7D52}, //8628 #CJK UNIFIED IDEOGRAPH
+ {0xDAF7, 0x7D54}, //8629 #CJK UNIFIED IDEOGRAPH
+ {0xDAF8, 0x7D69}, //8630 #CJK UNIFIED IDEOGRAPH
+ {0xDAF9, 0x7D51}, //8631 #CJK UNIFIED IDEOGRAPH
+ {0xDAFA, 0x7D5F}, //8632 #CJK UNIFIED IDEOGRAPH
+ {0xDAFB, 0x7D4E}, //8633 #CJK UNIFIED IDEOGRAPH
+ {0xDAFC, 0x7F3E}, //8634 #CJK UNIFIED IDEOGRAPH
+ {0xDAFD, 0x7F3F}, //8635 #CJK UNIFIED IDEOGRAPH
+ {0xDAFE, 0x7F65}, //8636 #CJK UNIFIED IDEOGRAPH
+ {0xDB40, 0x7F66}, //8637 #CJK UNIFIED IDEOGRAPH
+ {0xDB41, 0x7FA2}, //8638 #CJK UNIFIED IDEOGRAPH
+ {0xDB42, 0x7FA0}, //8639 #CJK UNIFIED IDEOGRAPH
+ {0xDB43, 0x7FA1}, //8640 #CJK UNIFIED IDEOGRAPH
+ {0xDB44, 0x7FD7}, //8641 #CJK UNIFIED IDEOGRAPH
+ {0xDB45, 0x8051}, //8642 #CJK UNIFIED IDEOGRAPH
+ {0xDB46, 0x804F}, //8643 #CJK UNIFIED IDEOGRAPH
+ {0xDB47, 0x8050}, //8644 #CJK UNIFIED IDEOGRAPH
+ {0xDB48, 0x80FE}, //8645 #CJK UNIFIED IDEOGRAPH
+ {0xDB49, 0x80D4}, //8646 #CJK UNIFIED IDEOGRAPH
+ {0xDB4A, 0x8143}, //8647 #CJK UNIFIED IDEOGRAPH
+ {0xDB4B, 0x814A}, //8648 #CJK UNIFIED IDEOGRAPH
+ {0xDB4C, 0x8152}, //8649 #CJK UNIFIED IDEOGRAPH
+ {0xDB4D, 0x814F}, //8650 #CJK UNIFIED IDEOGRAPH
+ {0xDB4E, 0x8147}, //8651 #CJK UNIFIED IDEOGRAPH
+ {0xDB4F, 0x813D}, //8652 #CJK UNIFIED IDEOGRAPH
+ {0xDB50, 0x814D}, //8653 #CJK UNIFIED IDEOGRAPH
+ {0xDB51, 0x813A}, //8654 #CJK UNIFIED IDEOGRAPH
+ {0xDB52, 0x81E6}, //8655 #CJK UNIFIED IDEOGRAPH
+ {0xDB53, 0x81EE}, //8656 #CJK UNIFIED IDEOGRAPH
+ {0xDB54, 0x81F7}, //8657 #CJK UNIFIED IDEOGRAPH
+ {0xDB55, 0x81F8}, //8658 #CJK UNIFIED IDEOGRAPH
+ {0xDB56, 0x81F9}, //8659 #CJK UNIFIED IDEOGRAPH
+ {0xDB57, 0x8204}, //8660 #CJK UNIFIED IDEOGRAPH
+ {0xDB58, 0x823C}, //8661 #CJK UNIFIED IDEOGRAPH
+ {0xDB59, 0x823D}, //8662 #CJK UNIFIED IDEOGRAPH
+ {0xDB5A, 0x823F}, //8663 #CJK UNIFIED IDEOGRAPH
+ {0xDB5B, 0x8275}, //8664 #CJK UNIFIED IDEOGRAPH
+ {0xDB5C, 0x833B}, //8665 #CJK UNIFIED IDEOGRAPH
+ {0xDB5D, 0x83CF}, //8666 #CJK UNIFIED IDEOGRAPH
+ {0xDB5E, 0x83F9}, //8667 #CJK UNIFIED IDEOGRAPH
+ {0xDB5F, 0x8423}, //8668 #CJK UNIFIED IDEOGRAPH
+ {0xDB60, 0x83C0}, //8669 #CJK UNIFIED IDEOGRAPH
+ {0xDB61, 0x83E8}, //8670 #CJK UNIFIED IDEOGRAPH
+ {0xDB62, 0x8412}, //8671 #CJK UNIFIED IDEOGRAPH
+ {0xDB63, 0x83E7}, //8672 #CJK UNIFIED IDEOGRAPH
+ {0xDB64, 0x83E4}, //8673 #CJK UNIFIED IDEOGRAPH
+ {0xDB65, 0x83FC}, //8674 #CJK UNIFIED IDEOGRAPH
+ {0xDB66, 0x83F6}, //8675 #CJK UNIFIED IDEOGRAPH
+ {0xDB67, 0x8410}, //8676 #CJK UNIFIED IDEOGRAPH
+ {0xDB68, 0x83C6}, //8677 #CJK UNIFIED IDEOGRAPH
+ {0xDB69, 0x83C8}, //8678 #CJK UNIFIED IDEOGRAPH
+ {0xDB6A, 0x83EB}, //8679 #CJK UNIFIED IDEOGRAPH
+ {0xDB6B, 0x83E3}, //8680 #CJK UNIFIED IDEOGRAPH
+ {0xDB6C, 0x83BF}, //8681 #CJK UNIFIED IDEOGRAPH
+ {0xDB6D, 0x8401}, //8682 #CJK UNIFIED IDEOGRAPH
+ {0xDB6E, 0x83DD}, //8683 #CJK UNIFIED IDEOGRAPH
+ {0xDB6F, 0x83E5}, //8684 #CJK UNIFIED IDEOGRAPH
+ {0xDB70, 0x83D8}, //8685 #CJK UNIFIED IDEOGRAPH
+ {0xDB71, 0x83FF}, //8686 #CJK UNIFIED IDEOGRAPH
+ {0xDB72, 0x83E1}, //8687 #CJK UNIFIED IDEOGRAPH
+ {0xDB73, 0x83CB}, //8688 #CJK UNIFIED IDEOGRAPH
+ {0xDB74, 0x83CE}, //8689 #CJK UNIFIED IDEOGRAPH
+ {0xDB75, 0x83D6}, //8690 #CJK UNIFIED IDEOGRAPH
+ {0xDB76, 0x83F5}, //8691 #CJK UNIFIED IDEOGRAPH
+ {0xDB77, 0x83C9}, //8692 #CJK UNIFIED IDEOGRAPH
+ {0xDB78, 0x8409}, //8693 #CJK UNIFIED IDEOGRAPH
+ {0xDB79, 0x840F}, //8694 #CJK UNIFIED IDEOGRAPH
+ {0xDB7A, 0x83DE}, //8695 #CJK UNIFIED IDEOGRAPH
+ {0xDB7B, 0x8411}, //8696 #CJK UNIFIED IDEOGRAPH
+ {0xDB7C, 0x8406}, //8697 #CJK UNIFIED IDEOGRAPH
+ {0xDB7D, 0x83C2}, //8698 #CJK UNIFIED IDEOGRAPH
+ {0xDB7E, 0x83F3}, //8699 #CJK UNIFIED IDEOGRAPH
+ {0xDBA1, 0x83D5}, //8700 #CJK UNIFIED IDEOGRAPH
+ {0xDBA2, 0x83FA}, //8701 #CJK UNIFIED IDEOGRAPH
+ {0xDBA3, 0x83C7}, //8702 #CJK UNIFIED IDEOGRAPH
+ {0xDBA4, 0x83D1}, //8703 #CJK UNIFIED IDEOGRAPH
+ {0xDBA5, 0x83EA}, //8704 #CJK UNIFIED IDEOGRAPH
+ {0xDBA6, 0x8413}, //8705 #CJK UNIFIED IDEOGRAPH
+ {0xDBA7, 0x83C3}, //8706 #CJK UNIFIED IDEOGRAPH
+ {0xDBA8, 0x83EC}, //8707 #CJK UNIFIED IDEOGRAPH
+ {0xDBA9, 0x83EE}, //8708 #CJK UNIFIED IDEOGRAPH
+ {0xDBAA, 0x83C4}, //8709 #CJK UNIFIED IDEOGRAPH
+ {0xDBAB, 0x83FB}, //8710 #CJK UNIFIED IDEOGRAPH
+ {0xDBAC, 0x83D7}, //8711 #CJK UNIFIED IDEOGRAPH
+ {0xDBAD, 0x83E2}, //8712 #CJK UNIFIED IDEOGRAPH
+ {0xDBAE, 0x841B}, //8713 #CJK UNIFIED IDEOGRAPH
+ {0xDBAF, 0x83DB}, //8714 #CJK UNIFIED IDEOGRAPH
+ {0xDBB0, 0x83FE}, //8715 #CJK UNIFIED IDEOGRAPH
+ {0xDBB1, 0x86D8}, //8716 #CJK UNIFIED IDEOGRAPH
+ {0xDBB2, 0x86E2}, //8717 #CJK UNIFIED IDEOGRAPH
+ {0xDBB3, 0x86E6}, //8718 #CJK UNIFIED IDEOGRAPH
+ {0xDBB4, 0x86D3}, //8719 #CJK UNIFIED IDEOGRAPH
+ {0xDBB5, 0x86E3}, //8720 #CJK UNIFIED IDEOGRAPH
+ {0xDBB6, 0x86DA}, //8721 #CJK UNIFIED IDEOGRAPH
+ {0xDBB7, 0x86EA}, //8722 #CJK UNIFIED IDEOGRAPH
+ {0xDBB8, 0x86DD}, //8723 #CJK UNIFIED IDEOGRAPH
+ {0xDBB9, 0x86EB}, //8724 #CJK UNIFIED IDEOGRAPH
+ {0xDBBA, 0x86DC}, //8725 #CJK UNIFIED IDEOGRAPH
+ {0xDBBB, 0x86EC}, //8726 #CJK UNIFIED IDEOGRAPH
+ {0xDBBC, 0x86E9}, //8727 #CJK UNIFIED IDEOGRAPH
+ {0xDBBD, 0x86D7}, //8728 #CJK UNIFIED IDEOGRAPH
+ {0xDBBE, 0x86E8}, //8729 #CJK UNIFIED IDEOGRAPH
+ {0xDBBF, 0x86D1}, //8730 #CJK UNIFIED IDEOGRAPH
+ {0xDBC0, 0x8848}, //8731 #CJK UNIFIED IDEOGRAPH
+ {0xDBC1, 0x8856}, //8732 #CJK UNIFIED IDEOGRAPH
+ {0xDBC2, 0x8855}, //8733 #CJK UNIFIED IDEOGRAPH
+ {0xDBC3, 0x88BA}, //8734 #CJK UNIFIED IDEOGRAPH
+ {0xDBC4, 0x88D7}, //8735 #CJK UNIFIED IDEOGRAPH
+ {0xDBC5, 0x88B9}, //8736 #CJK UNIFIED IDEOGRAPH
+ {0xDBC6, 0x88B8}, //8737 #CJK UNIFIED IDEOGRAPH
+ {0xDBC7, 0x88C0}, //8738 #CJK UNIFIED IDEOGRAPH
+ {0xDBC8, 0x88BE}, //8739 #CJK UNIFIED IDEOGRAPH
+ {0xDBC9, 0x88B6}, //8740 #CJK UNIFIED IDEOGRAPH
+ {0xDBCA, 0x88BC}, //8741 #CJK UNIFIED IDEOGRAPH
+ {0xDBCB, 0x88B7}, //8742 #CJK UNIFIED IDEOGRAPH
+ {0xDBCC, 0x88BD}, //8743 #CJK UNIFIED IDEOGRAPH
+ {0xDBCD, 0x88B2}, //8744 #CJK UNIFIED IDEOGRAPH
+ {0xDBCE, 0x8901}, //8745 #CJK UNIFIED IDEOGRAPH
+ {0xDBCF, 0x88C9}, //8746 #CJK UNIFIED IDEOGRAPH
+ {0xDBD0, 0x8995}, //8747 #CJK UNIFIED IDEOGRAPH
+ {0xDBD1, 0x8998}, //8748 #CJK UNIFIED IDEOGRAPH
+ {0xDBD2, 0x8997}, //8749 #CJK UNIFIED IDEOGRAPH
+ {0xDBD3, 0x89DD}, //8750 #CJK UNIFIED IDEOGRAPH
+ {0xDBD4, 0x89DA}, //8751 #CJK UNIFIED IDEOGRAPH
+ {0xDBD5, 0x89DB}, //8752 #CJK UNIFIED IDEOGRAPH
+ {0xDBD6, 0x8A4E}, //8753 #CJK UNIFIED IDEOGRAPH
+ {0xDBD7, 0x8A4D}, //8754 #CJK UNIFIED IDEOGRAPH
+ {0xDBD8, 0x8A39}, //8755 #CJK UNIFIED IDEOGRAPH
+ {0xDBD9, 0x8A59}, //8756 #CJK UNIFIED IDEOGRAPH
+ {0xDBDA, 0x8A40}, //8757 #CJK UNIFIED IDEOGRAPH
+ {0xDBDB, 0x8A57}, //8758 #CJK UNIFIED IDEOGRAPH
+ {0xDBDC, 0x8A58}, //8759 #CJK UNIFIED IDEOGRAPH
+ {0xDBDD, 0x8A44}, //8760 #CJK UNIFIED IDEOGRAPH
+ {0xDBDE, 0x8A45}, //8761 #CJK UNIFIED IDEOGRAPH
+ {0xDBDF, 0x8A52}, //8762 #CJK UNIFIED IDEOGRAPH
+ {0xDBE0, 0x8A48}, //8763 #CJK UNIFIED IDEOGRAPH
+ {0xDBE1, 0x8A51}, //8764 #CJK UNIFIED IDEOGRAPH
+ {0xDBE2, 0x8A4A}, //8765 #CJK UNIFIED IDEOGRAPH
+ {0xDBE3, 0x8A4C}, //8766 #CJK UNIFIED IDEOGRAPH
+ {0xDBE4, 0x8A4F}, //8767 #CJK UNIFIED IDEOGRAPH
+ {0xDBE5, 0x8C5F}, //8768 #CJK UNIFIED IDEOGRAPH
+ {0xDBE6, 0x8C81}, //8769 #CJK UNIFIED IDEOGRAPH
+ {0xDBE7, 0x8C80}, //8770 #CJK UNIFIED IDEOGRAPH
+ {0xDBE8, 0x8CBA}, //8771 #CJK UNIFIED IDEOGRAPH
+ {0xDBE9, 0x8CBE}, //8772 #CJK UNIFIED IDEOGRAPH
+ {0xDBEA, 0x8CB0}, //8773 #CJK UNIFIED IDEOGRAPH
+ {0xDBEB, 0x8CB9}, //8774 #CJK UNIFIED IDEOGRAPH
+ {0xDBEC, 0x8CB5}, //8775 #CJK UNIFIED IDEOGRAPH
+ {0xDBED, 0x8D84}, //8776 #CJK UNIFIED IDEOGRAPH
+ {0xDBEE, 0x8D80}, //8777 #CJK UNIFIED IDEOGRAPH
+ {0xDBEF, 0x8D89}, //8778 #CJK UNIFIED IDEOGRAPH
+ {0xDBF0, 0x8DD8}, //8779 #CJK UNIFIED IDEOGRAPH
+ {0xDBF1, 0x8DD3}, //8780 #CJK UNIFIED IDEOGRAPH
+ {0xDBF2, 0x8DCD}, //8781 #CJK UNIFIED IDEOGRAPH
+ {0xDBF3, 0x8DC7}, //8782 #CJK UNIFIED IDEOGRAPH
+ {0xDBF4, 0x8DD6}, //8783 #CJK UNIFIED IDEOGRAPH
+ {0xDBF5, 0x8DDC}, //8784 #CJK UNIFIED IDEOGRAPH
+ {0xDBF6, 0x8DCF}, //8785 #CJK UNIFIED IDEOGRAPH
+ {0xDBF7, 0x8DD5}, //8786 #CJK UNIFIED IDEOGRAPH
+ {0xDBF8, 0x8DD9}, //8787 #CJK UNIFIED IDEOGRAPH
+ {0xDBF9, 0x8DC8}, //8788 #CJK UNIFIED IDEOGRAPH
+ {0xDBFA, 0x8DD7}, //8789 #CJK UNIFIED IDEOGRAPH
+ {0xDBFB, 0x8DC5}, //8790 #CJK UNIFIED IDEOGRAPH
+ {0xDBFC, 0x8EEF}, //8791 #CJK UNIFIED IDEOGRAPH
+ {0xDBFD, 0x8EF7}, //8792 #CJK UNIFIED IDEOGRAPH
+ {0xDBFE, 0x8EFA}, //8793 #CJK UNIFIED IDEOGRAPH
+ {0xDC40, 0x8EF9}, //8794 #CJK UNIFIED IDEOGRAPH
+ {0xDC41, 0x8EE6}, //8795 #CJK UNIFIED IDEOGRAPH
+ {0xDC42, 0x8EEE}, //8796 #CJK UNIFIED IDEOGRAPH
+ {0xDC43, 0x8EE5}, //8797 #CJK UNIFIED IDEOGRAPH
+ {0xDC44, 0x8EF5}, //8798 #CJK UNIFIED IDEOGRAPH
+ {0xDC45, 0x8EE7}, //8799 #CJK UNIFIED IDEOGRAPH
+ {0xDC46, 0x8EE8}, //8800 #CJK UNIFIED IDEOGRAPH
+ {0xDC47, 0x8EF6}, //8801 #CJK UNIFIED IDEOGRAPH
+ {0xDC48, 0x8EEB}, //8802 #CJK UNIFIED IDEOGRAPH
+ {0xDC49, 0x8EF1}, //8803 #CJK UNIFIED IDEOGRAPH
+ {0xDC4A, 0x8EEC}, //8804 #CJK UNIFIED IDEOGRAPH
+ {0xDC4B, 0x8EF4}, //8805 #CJK UNIFIED IDEOGRAPH
+ {0xDC4C, 0x8EE9}, //8806 #CJK UNIFIED IDEOGRAPH
+ {0xDC4D, 0x902D}, //8807 #CJK UNIFIED IDEOGRAPH
+ {0xDC4E, 0x9034}, //8808 #CJK UNIFIED IDEOGRAPH
+ {0xDC4F, 0x902F}, //8809 #CJK UNIFIED IDEOGRAPH
+ {0xDC50, 0x9106}, //8810 #CJK UNIFIED IDEOGRAPH
+ {0xDC51, 0x912C}, //8811 #CJK UNIFIED IDEOGRAPH
+ {0xDC52, 0x9104}, //8812 #CJK UNIFIED IDEOGRAPH
+ {0xDC53, 0x90FF}, //8813 #CJK UNIFIED IDEOGRAPH
+ {0xDC54, 0x90FC}, //8814 #CJK UNIFIED IDEOGRAPH
+ {0xDC55, 0x9108}, //8815 #CJK UNIFIED IDEOGRAPH
+ {0xDC56, 0x90F9}, //8816 #CJK UNIFIED IDEOGRAPH
+ {0xDC57, 0x90FB}, //8817 #CJK UNIFIED IDEOGRAPH
+ {0xDC58, 0x9101}, //8818 #CJK UNIFIED IDEOGRAPH
+ {0xDC59, 0x9100}, //8819 #CJK UNIFIED IDEOGRAPH
+ {0xDC5A, 0x9107}, //8820 #CJK UNIFIED IDEOGRAPH
+ {0xDC5B, 0x9105}, //8821 #CJK UNIFIED IDEOGRAPH
+ {0xDC5C, 0x9103}, //8822 #CJK UNIFIED IDEOGRAPH
+ {0xDC5D, 0x9161}, //8823 #CJK UNIFIED IDEOGRAPH
+ {0xDC5E, 0x9164}, //8824 #CJK UNIFIED IDEOGRAPH
+ {0xDC5F, 0x915F}, //8825 #CJK UNIFIED IDEOGRAPH
+ {0xDC60, 0x9162}, //8826 #CJK UNIFIED IDEOGRAPH
+ {0xDC61, 0x9160}, //8827 #CJK UNIFIED IDEOGRAPH
+ {0xDC62, 0x9201}, //8828 #CJK UNIFIED IDEOGRAPH
+ {0xDC63, 0x920A}, //8829 #CJK UNIFIED IDEOGRAPH
+ {0xDC64, 0x9225}, //8830 #CJK UNIFIED IDEOGRAPH
+ {0xDC65, 0x9203}, //8831 #CJK UNIFIED IDEOGRAPH
+ {0xDC66, 0x921A}, //8832 #CJK UNIFIED IDEOGRAPH
+ {0xDC67, 0x9226}, //8833 #CJK UNIFIED IDEOGRAPH
+ {0xDC68, 0x920F}, //8834 #CJK UNIFIED IDEOGRAPH
+ {0xDC69, 0x920C}, //8835 #CJK UNIFIED IDEOGRAPH
+ {0xDC6A, 0x9200}, //8836 #CJK UNIFIED IDEOGRAPH
+ {0xDC6B, 0x9212}, //8837 #CJK UNIFIED IDEOGRAPH
+ {0xDC6C, 0x91FF}, //8838 #CJK UNIFIED IDEOGRAPH
+ {0xDC6D, 0x91FD}, //8839 #CJK UNIFIED IDEOGRAPH
+ {0xDC6E, 0x9206}, //8840 #CJK UNIFIED IDEOGRAPH
+ {0xDC6F, 0x9204}, //8841 #CJK UNIFIED IDEOGRAPH
+ {0xDC70, 0x9227}, //8842 #CJK UNIFIED IDEOGRAPH
+ {0xDC71, 0x9202}, //8843 #CJK UNIFIED IDEOGRAPH
+ {0xDC72, 0x921C}, //8844 #CJK UNIFIED IDEOGRAPH
+ {0xDC73, 0x9224}, //8845 #CJK UNIFIED IDEOGRAPH
+ {0xDC74, 0x9219}, //8846 #CJK UNIFIED IDEOGRAPH
+ {0xDC75, 0x9217}, //8847 #CJK UNIFIED IDEOGRAPH
+ {0xDC76, 0x9205}, //8848 #CJK UNIFIED IDEOGRAPH
+ {0xDC77, 0x9216}, //8849 #CJK UNIFIED IDEOGRAPH
+ {0xDC78, 0x957B}, //8850 #CJK UNIFIED IDEOGRAPH
+ {0xDC79, 0x958D}, //8851 #CJK UNIFIED IDEOGRAPH
+ {0xDC7A, 0x958C}, //8852 #CJK UNIFIED IDEOGRAPH
+ {0xDC7B, 0x9590}, //8853 #CJK UNIFIED IDEOGRAPH
+ {0xDC7C, 0x9687}, //8854 #CJK UNIFIED IDEOGRAPH
+ {0xDC7D, 0x967E}, //8855 #CJK UNIFIED IDEOGRAPH
+ {0xDC7E, 0x9688}, //8856 #CJK UNIFIED IDEOGRAPH
+ {0xDCA1, 0x9689}, //8857 #CJK UNIFIED IDEOGRAPH
+ {0xDCA2, 0x9683}, //8858 #CJK UNIFIED IDEOGRAPH
+ {0xDCA3, 0x9680}, //8859 #CJK UNIFIED IDEOGRAPH
+ {0xDCA4, 0x96C2}, //8860 #CJK UNIFIED IDEOGRAPH
+ {0xDCA5, 0x96C8}, //8861 #CJK UNIFIED IDEOGRAPH
+ {0xDCA6, 0x96C3}, //8862 #CJK UNIFIED IDEOGRAPH
+ {0xDCA7, 0x96F1}, //8863 #CJK UNIFIED IDEOGRAPH
+ {0xDCA8, 0x96F0}, //8864 #CJK UNIFIED IDEOGRAPH
+ {0xDCA9, 0x976C}, //8865 #CJK UNIFIED IDEOGRAPH
+ {0xDCAA, 0x9770}, //8866 #CJK UNIFIED IDEOGRAPH
+ {0xDCAB, 0x976E}, //8867 #CJK UNIFIED IDEOGRAPH
+ {0xDCAC, 0x9807}, //8868 #CJK UNIFIED IDEOGRAPH
+ {0xDCAD, 0x98A9}, //8869 #CJK UNIFIED IDEOGRAPH
+ {0xDCAE, 0x98EB}, //8870 #CJK UNIFIED IDEOGRAPH
+ {0xDCAF, 0x9CE6}, //8871 #CJK UNIFIED IDEOGRAPH
+ {0xDCB0, 0x9EF9}, //8872 #CJK UNIFIED IDEOGRAPH
+ {0xDCB1, 0x4E83}, //8873 #CJK UNIFIED IDEOGRAPH
+ {0xDCB2, 0x4E84}, //8874 #CJK UNIFIED IDEOGRAPH
+ {0xDCB3, 0x4EB6}, //8875 #CJK UNIFIED IDEOGRAPH
+ {0xDCB4, 0x50BD}, //8876 #CJK UNIFIED IDEOGRAPH
+ {0xDCB5, 0x50BF}, //8877 #CJK UNIFIED IDEOGRAPH
+ {0xDCB6, 0x50C6}, //8878 #CJK UNIFIED IDEOGRAPH
+ {0xDCB7, 0x50AE}, //8879 #CJK UNIFIED IDEOGRAPH
+ {0xDCB8, 0x50C4}, //8880 #CJK UNIFIED IDEOGRAPH
+ {0xDCB9, 0x50CA}, //8881 #CJK UNIFIED IDEOGRAPH
+ {0xDCBA, 0x50B4}, //8882 #CJK UNIFIED IDEOGRAPH
+ {0xDCBB, 0x50C8}, //8883 #CJK UNIFIED IDEOGRAPH
+ {0xDCBC, 0x50C2}, //8884 #CJK UNIFIED IDEOGRAPH
+ {0xDCBD, 0x50B0}, //8885 #CJK UNIFIED IDEOGRAPH
+ {0xDCBE, 0x50C1}, //8886 #CJK UNIFIED IDEOGRAPH
+ {0xDCBF, 0x50BA}, //8887 #CJK UNIFIED IDEOGRAPH
+ {0xDCC0, 0x50B1}, //8888 #CJK UNIFIED IDEOGRAPH
+ {0xDCC1, 0x50CB}, //8889 #CJK UNIFIED IDEOGRAPH
+ {0xDCC2, 0x50C9}, //8890 #CJK UNIFIED IDEOGRAPH
+ {0xDCC3, 0x50B6}, //8891 #CJK UNIFIED IDEOGRAPH
+ {0xDCC4, 0x50B8}, //8892 #CJK UNIFIED IDEOGRAPH
+ {0xDCC5, 0x51D7}, //8893 #CJK UNIFIED IDEOGRAPH
+ {0xDCC6, 0x527A}, //8894 #CJK UNIFIED IDEOGRAPH
+ {0xDCC7, 0x5278}, //8895 #CJK UNIFIED IDEOGRAPH
+ {0xDCC8, 0x527B}, //8896 #CJK UNIFIED IDEOGRAPH
+ {0xDCC9, 0x527C}, //8897 #CJK UNIFIED IDEOGRAPH
+ {0xDCCA, 0x55C3}, //8898 #CJK UNIFIED IDEOGRAPH
+ {0xDCCB, 0x55DB}, //8899 #CJK UNIFIED IDEOGRAPH
+ {0xDCCC, 0x55CC}, //8900 #CJK UNIFIED IDEOGRAPH
+ {0xDCCD, 0x55D0}, //8901 #CJK UNIFIED IDEOGRAPH
+ {0xDCCE, 0x55CB}, //8902 #CJK UNIFIED IDEOGRAPH
+ {0xDCCF, 0x55CA}, //8903 #CJK UNIFIED IDEOGRAPH
+ {0xDCD0, 0x55DD}, //8904 #CJK UNIFIED IDEOGRAPH
+ {0xDCD1, 0x55C0}, //8905 #CJK UNIFIED IDEOGRAPH
+ {0xDCD2, 0x55D4}, //8906 #CJK UNIFIED IDEOGRAPH
+ {0xDCD3, 0x55C4}, //8907 #CJK UNIFIED IDEOGRAPH
+ {0xDCD4, 0x55E9}, //8908 #CJK UNIFIED IDEOGRAPH
+ {0xDCD5, 0x55BF}, //8909 #CJK UNIFIED IDEOGRAPH
+ {0xDCD6, 0x55D2}, //8910 #CJK UNIFIED IDEOGRAPH
+ {0xDCD7, 0x558D}, //8911 #CJK UNIFIED IDEOGRAPH
+ {0xDCD8, 0x55CF}, //8912 #CJK UNIFIED IDEOGRAPH
+ {0xDCD9, 0x55D5}, //8913 #CJK UNIFIED IDEOGRAPH
+ {0xDCDA, 0x55E2}, //8914 #CJK UNIFIED IDEOGRAPH
+ {0xDCDB, 0x55D6}, //8915 #CJK UNIFIED IDEOGRAPH
+ {0xDCDC, 0x55C8}, //8916 #CJK UNIFIED IDEOGRAPH
+ {0xDCDD, 0x55F2}, //8917 #CJK UNIFIED IDEOGRAPH
+ {0xDCDE, 0x55CD}, //8918 #CJK UNIFIED IDEOGRAPH
+ {0xDCDF, 0x55D9}, //8919 #CJK UNIFIED IDEOGRAPH
+ {0xDCE0, 0x55C2}, //8920 #CJK UNIFIED IDEOGRAPH
+ {0xDCE1, 0x5714}, //8921 #CJK UNIFIED IDEOGRAPH
+ {0xDCE2, 0x5853}, //8922 #CJK UNIFIED IDEOGRAPH
+ {0xDCE3, 0x5868}, //8923 #CJK UNIFIED IDEOGRAPH
+ {0xDCE4, 0x5864}, //8924 #CJK UNIFIED IDEOGRAPH
+ {0xDCE5, 0x584F}, //8925 #CJK UNIFIED IDEOGRAPH
+ {0xDCE6, 0x584D}, //8926 #CJK UNIFIED IDEOGRAPH
+ {0xDCE7, 0x5849}, //8927 #CJK UNIFIED IDEOGRAPH
+ {0xDCE8, 0x586F}, //8928 #CJK UNIFIED IDEOGRAPH
+ {0xDCE9, 0x5855}, //8929 #CJK UNIFIED IDEOGRAPH
+ {0xDCEA, 0x584E}, //8930 #CJK UNIFIED IDEOGRAPH
+ {0xDCEB, 0x585D}, //8931 #CJK UNIFIED IDEOGRAPH
+ {0xDCEC, 0x5859}, //8932 #CJK UNIFIED IDEOGRAPH
+ {0xDCED, 0x5865}, //8933 #CJK UNIFIED IDEOGRAPH
+ {0xDCEE, 0x585B}, //8934 #CJK UNIFIED IDEOGRAPH
+ {0xDCEF, 0x583D}, //8935 #CJK UNIFIED IDEOGRAPH
+ {0xDCF0, 0x5863}, //8936 #CJK UNIFIED IDEOGRAPH
+ {0xDCF1, 0x5871}, //8937 #CJK UNIFIED IDEOGRAPH
+ {0xDCF2, 0x58FC}, //8938 #CJK UNIFIED IDEOGRAPH
+ {0xDCF3, 0x5AC7}, //8939 #CJK UNIFIED IDEOGRAPH
+ {0xDCF4, 0x5AC4}, //8940 #CJK UNIFIED IDEOGRAPH
+ {0xDCF5, 0x5ACB}, //8941 #CJK UNIFIED IDEOGRAPH
+ {0xDCF6, 0x5ABA}, //8942 #CJK UNIFIED IDEOGRAPH
+ {0xDCF7, 0x5AB8}, //8943 #CJK UNIFIED IDEOGRAPH
+ {0xDCF8, 0x5AB1}, //8944 #CJK UNIFIED IDEOGRAPH
+ {0xDCF9, 0x5AB5}, //8945 #CJK UNIFIED IDEOGRAPH
+ {0xDCFA, 0x5AB0}, //8946 #CJK UNIFIED IDEOGRAPH
+ {0xDCFB, 0x5ABF}, //8947 #CJK UNIFIED IDEOGRAPH
+ {0xDCFC, 0x5AC8}, //8948 #CJK UNIFIED IDEOGRAPH
+ {0xDCFD, 0x5ABB}, //8949 #CJK UNIFIED IDEOGRAPH
+ {0xDCFE, 0x5AC6}, //8950 #CJK UNIFIED IDEOGRAPH
+ {0xDD40, 0x5AB7}, //8951 #CJK UNIFIED IDEOGRAPH
+ {0xDD41, 0x5AC0}, //8952 #CJK UNIFIED IDEOGRAPH
+ {0xDD42, 0x5ACA}, //8953 #CJK UNIFIED IDEOGRAPH
+ {0xDD43, 0x5AB4}, //8954 #CJK UNIFIED IDEOGRAPH
+ {0xDD44, 0x5AB6}, //8955 #CJK UNIFIED IDEOGRAPH
+ {0xDD45, 0x5ACD}, //8956 #CJK UNIFIED IDEOGRAPH
+ {0xDD46, 0x5AB9}, //8957 #CJK UNIFIED IDEOGRAPH
+ {0xDD47, 0x5A90}, //8958 #CJK UNIFIED IDEOGRAPH
+ {0xDD48, 0x5BD6}, //8959 #CJK UNIFIED IDEOGRAPH
+ {0xDD49, 0x5BD8}, //8960 #CJK UNIFIED IDEOGRAPH
+ {0xDD4A, 0x5BD9}, //8961 #CJK UNIFIED IDEOGRAPH
+ {0xDD4B, 0x5C1F}, //8962 #CJK UNIFIED IDEOGRAPH
+ {0xDD4C, 0x5C33}, //8963 #CJK UNIFIED IDEOGRAPH
+ {0xDD4D, 0x5D71}, //8964 #CJK UNIFIED IDEOGRAPH
+ {0xDD4E, 0x5D63}, //8965 #CJK UNIFIED IDEOGRAPH
+ {0xDD4F, 0x5D4A}, //8966 #CJK UNIFIED IDEOGRAPH
+ {0xDD50, 0x5D65}, //8967 #CJK UNIFIED IDEOGRAPH
+ {0xDD51, 0x5D72}, //8968 #CJK UNIFIED IDEOGRAPH
+ {0xDD52, 0x5D6C}, //8969 #CJK UNIFIED IDEOGRAPH
+ {0xDD53, 0x5D5E}, //8970 #CJK UNIFIED IDEOGRAPH
+ {0xDD54, 0x5D68}, //8971 #CJK UNIFIED IDEOGRAPH
+ {0xDD55, 0x5D67}, //8972 #CJK UNIFIED IDEOGRAPH
+ {0xDD56, 0x5D62}, //8973 #CJK UNIFIED IDEOGRAPH
+ {0xDD57, 0x5DF0}, //8974 #CJK UNIFIED IDEOGRAPH
+ {0xDD58, 0x5E4F}, //8975 #CJK UNIFIED IDEOGRAPH
+ {0xDD59, 0x5E4E}, //8976 #CJK UNIFIED IDEOGRAPH
+ {0xDD5A, 0x5E4A}, //8977 #CJK UNIFIED IDEOGRAPH
+ {0xDD5B, 0x5E4D}, //8978 #CJK UNIFIED IDEOGRAPH
+ {0xDD5C, 0x5E4B}, //8979 #CJK UNIFIED IDEOGRAPH
+ {0xDD5D, 0x5EC5}, //8980 #CJK UNIFIED IDEOGRAPH
+ {0xDD5E, 0x5ECC}, //8981 #CJK UNIFIED IDEOGRAPH
+ {0xDD5F, 0x5EC6}, //8982 #CJK UNIFIED IDEOGRAPH
+ {0xDD60, 0x5ECB}, //8983 #CJK UNIFIED IDEOGRAPH
+ {0xDD61, 0x5EC7}, //8984 #CJK UNIFIED IDEOGRAPH
+ {0xDD62, 0x5F40}, //8985 #CJK UNIFIED IDEOGRAPH
+ {0xDD63, 0x5FAF}, //8986 #CJK UNIFIED IDEOGRAPH
+ {0xDD64, 0x5FAD}, //8987 #CJK UNIFIED IDEOGRAPH
+ {0xDD65, 0x60F7}, //8988 #CJK UNIFIED IDEOGRAPH
+ {0xDD66, 0x6149}, //8989 #CJK UNIFIED IDEOGRAPH
+ {0xDD67, 0x614A}, //8990 #CJK UNIFIED IDEOGRAPH
+ {0xDD68, 0x612B}, //8991 #CJK UNIFIED IDEOGRAPH
+ {0xDD69, 0x6145}, //8992 #CJK UNIFIED IDEOGRAPH
+ {0xDD6A, 0x6136}, //8993 #CJK UNIFIED IDEOGRAPH
+ {0xDD6B, 0x6132}, //8994 #CJK UNIFIED IDEOGRAPH
+ {0xDD6C, 0x612E}, //8995 #CJK UNIFIED IDEOGRAPH
+ {0xDD6D, 0x6146}, //8996 #CJK UNIFIED IDEOGRAPH
+ {0xDD6E, 0x612F}, //8997 #CJK UNIFIED IDEOGRAPH
+ {0xDD6F, 0x614F}, //8998 #CJK UNIFIED IDEOGRAPH
+ {0xDD70, 0x6129}, //8999 #CJK UNIFIED IDEOGRAPH
+ {0xDD71, 0x6140}, //9000 #CJK UNIFIED IDEOGRAPH
+ {0xDD72, 0x6220}, //9001 #CJK UNIFIED IDEOGRAPH
+ {0xDD73, 0x9168}, //9002 #CJK UNIFIED IDEOGRAPH
+ {0xDD74, 0x6223}, //9003 #CJK UNIFIED IDEOGRAPH
+ {0xDD75, 0x6225}, //9004 #CJK UNIFIED IDEOGRAPH
+ {0xDD76, 0x6224}, //9005 #CJK UNIFIED IDEOGRAPH
+ {0xDD77, 0x63C5}, //9006 #CJK UNIFIED IDEOGRAPH
+ {0xDD78, 0x63F1}, //9007 #CJK UNIFIED IDEOGRAPH
+ {0xDD79, 0x63EB}, //9008 #CJK UNIFIED IDEOGRAPH
+ {0xDD7A, 0x6410}, //9009 #CJK UNIFIED IDEOGRAPH
+ {0xDD7B, 0x6412}, //9010 #CJK UNIFIED IDEOGRAPH
+ {0xDD7C, 0x6409}, //9011 #CJK UNIFIED IDEOGRAPH
+ {0xDD7D, 0x6420}, //9012 #CJK UNIFIED IDEOGRAPH
+ {0xDD7E, 0x6424}, //9013 #CJK UNIFIED IDEOGRAPH
+ {0xDDA1, 0x6433}, //9014 #CJK UNIFIED IDEOGRAPH
+ {0xDDA2, 0x6443}, //9015 #CJK UNIFIED IDEOGRAPH
+ {0xDDA3, 0x641F}, //9016 #CJK UNIFIED IDEOGRAPH
+ {0xDDA4, 0x6415}, //9017 #CJK UNIFIED IDEOGRAPH
+ {0xDDA5, 0x6418}, //9018 #CJK UNIFIED IDEOGRAPH
+ {0xDDA6, 0x6439}, //9019 #CJK UNIFIED IDEOGRAPH
+ {0xDDA7, 0x6437}, //9020 #CJK UNIFIED IDEOGRAPH
+ {0xDDA8, 0x6422}, //9021 #CJK UNIFIED IDEOGRAPH
+ {0xDDA9, 0x6423}, //9022 #CJK UNIFIED IDEOGRAPH
+ {0xDDAA, 0x640C}, //9023 #CJK UNIFIED IDEOGRAPH
+ {0xDDAB, 0x6426}, //9024 #CJK UNIFIED IDEOGRAPH
+ {0xDDAC, 0x6430}, //9025 #CJK UNIFIED IDEOGRAPH
+ {0xDDAD, 0x6428}, //9026 #CJK UNIFIED IDEOGRAPH
+ {0xDDAE, 0x6441}, //9027 #CJK UNIFIED IDEOGRAPH
+ {0xDDAF, 0x6435}, //9028 #CJK UNIFIED IDEOGRAPH
+ {0xDDB0, 0x642F}, //9029 #CJK UNIFIED IDEOGRAPH
+ {0xDDB1, 0x640A}, //9030 #CJK UNIFIED IDEOGRAPH
+ {0xDDB2, 0x641A}, //9031 #CJK UNIFIED IDEOGRAPH
+ {0xDDB3, 0x6440}, //9032 #CJK UNIFIED IDEOGRAPH
+ {0xDDB4, 0x6425}, //9033 #CJK UNIFIED IDEOGRAPH
+ {0xDDB5, 0x6427}, //9034 #CJK UNIFIED IDEOGRAPH
+ {0xDDB6, 0x640B}, //9035 #CJK UNIFIED IDEOGRAPH
+ {0xDDB7, 0x63E7}, //9036 #CJK UNIFIED IDEOGRAPH
+ {0xDDB8, 0x641B}, //9037 #CJK UNIFIED IDEOGRAPH
+ {0xDDB9, 0x642E}, //9038 #CJK UNIFIED IDEOGRAPH
+ {0xDDBA, 0x6421}, //9039 #CJK UNIFIED IDEOGRAPH
+ {0xDDBB, 0x640E}, //9040 #CJK UNIFIED IDEOGRAPH
+ {0xDDBC, 0x656F}, //9041 #CJK UNIFIED IDEOGRAPH
+ {0xDDBD, 0x6592}, //9042 #CJK UNIFIED IDEOGRAPH
+ {0xDDBE, 0x65D3}, //9043 #CJK UNIFIED IDEOGRAPH
+ {0xDDBF, 0x6686}, //9044 #CJK UNIFIED IDEOGRAPH
+ {0xDDC0, 0x668C}, //9045 #CJK UNIFIED IDEOGRAPH
+ {0xDDC1, 0x6695}, //9046 #CJK UNIFIED IDEOGRAPH
+ {0xDDC2, 0x6690}, //9047 #CJK UNIFIED IDEOGRAPH
+ {0xDDC3, 0x668B}, //9048 #CJK UNIFIED IDEOGRAPH
+ {0xDDC4, 0x668A}, //9049 #CJK UNIFIED IDEOGRAPH
+ {0xDDC5, 0x6699}, //9050 #CJK UNIFIED IDEOGRAPH
+ {0xDDC6, 0x6694}, //9051 #CJK UNIFIED IDEOGRAPH
+ {0xDDC7, 0x6678}, //9052 #CJK UNIFIED IDEOGRAPH
+ {0xDDC8, 0x6720}, //9053 #CJK UNIFIED IDEOGRAPH
+ {0xDDC9, 0x6966}, //9054 #CJK UNIFIED IDEOGRAPH
+ {0xDDCA, 0x695F}, //9055 #CJK UNIFIED IDEOGRAPH
+ {0xDDCB, 0x6938}, //9056 #CJK UNIFIED IDEOGRAPH
+ {0xDDCC, 0x694E}, //9057 #CJK UNIFIED IDEOGRAPH
+ {0xDDCD, 0x6962}, //9058 #CJK UNIFIED IDEOGRAPH
+ {0xDDCE, 0x6971}, //9059 #CJK UNIFIED IDEOGRAPH
+ {0xDDCF, 0x693F}, //9060 #CJK UNIFIED IDEOGRAPH
+ {0xDDD0, 0x6945}, //9061 #CJK UNIFIED IDEOGRAPH
+ {0xDDD1, 0x696A}, //9062 #CJK UNIFIED IDEOGRAPH
+ {0xDDD2, 0x6939}, //9063 #CJK UNIFIED IDEOGRAPH
+ {0xDDD3, 0x6942}, //9064 #CJK UNIFIED IDEOGRAPH
+ {0xDDD4, 0x6957}, //9065 #CJK UNIFIED IDEOGRAPH
+ {0xDDD5, 0x6959}, //9066 #CJK UNIFIED IDEOGRAPH
+ {0xDDD6, 0x697A}, //9067 #CJK UNIFIED IDEOGRAPH
+ {0xDDD7, 0x6948}, //9068 #CJK UNIFIED IDEOGRAPH
+ {0xDDD8, 0x6949}, //9069 #CJK UNIFIED IDEOGRAPH
+ {0xDDD9, 0x6935}, //9070 #CJK UNIFIED IDEOGRAPH
+ {0xDDDA, 0x696C}, //9071 #CJK UNIFIED IDEOGRAPH
+ {0xDDDB, 0x6933}, //9072 #CJK UNIFIED IDEOGRAPH
+ {0xDDDC, 0x693D}, //9073 #CJK UNIFIED IDEOGRAPH
+ {0xDDDD, 0x6965}, //9074 #CJK UNIFIED IDEOGRAPH
+ {0xDDDE, 0x68F0}, //9075 #CJK UNIFIED IDEOGRAPH
+ {0xDDDF, 0x6978}, //9076 #CJK UNIFIED IDEOGRAPH
+ {0xDDE0, 0x6934}, //9077 #CJK UNIFIED IDEOGRAPH
+ {0xDDE1, 0x6969}, //9078 #CJK UNIFIED IDEOGRAPH
+ {0xDDE2, 0x6940}, //9079 #CJK UNIFIED IDEOGRAPH
+ {0xDDE3, 0x696F}, //9080 #CJK UNIFIED IDEOGRAPH
+ {0xDDE4, 0x6944}, //9081 #CJK UNIFIED IDEOGRAPH
+ {0xDDE5, 0x6976}, //9082 #CJK UNIFIED IDEOGRAPH
+ {0xDDE6, 0x6958}, //9083 #CJK UNIFIED IDEOGRAPH
+ {0xDDE7, 0x6941}, //9084 #CJK UNIFIED IDEOGRAPH
+ {0xDDE8, 0x6974}, //9085 #CJK UNIFIED IDEOGRAPH
+ {0xDDE9, 0x694C}, //9086 #CJK UNIFIED IDEOGRAPH
+ {0xDDEA, 0x693B}, //9087 #CJK UNIFIED IDEOGRAPH
+ {0xDDEB, 0x694B}, //9088 #CJK UNIFIED IDEOGRAPH
+ {0xDDEC, 0x6937}, //9089 #CJK UNIFIED IDEOGRAPH
+ {0xDDED, 0x695C}, //9090 #CJK UNIFIED IDEOGRAPH
+ {0xDDEE, 0x694F}, //9091 #CJK UNIFIED IDEOGRAPH
+ {0xDDEF, 0x6951}, //9092 #CJK UNIFIED IDEOGRAPH
+ {0xDDF0, 0x6932}, //9093 #CJK UNIFIED IDEOGRAPH
+ {0xDDF1, 0x6952}, //9094 #CJK UNIFIED IDEOGRAPH
+ {0xDDF2, 0x692F}, //9095 #CJK UNIFIED IDEOGRAPH
+ {0xDDF3, 0x697B}, //9096 #CJK UNIFIED IDEOGRAPH
+ {0xDDF4, 0x693C}, //9097 #CJK UNIFIED IDEOGRAPH
+ {0xDDF5, 0x6B46}, //9098 #CJK UNIFIED IDEOGRAPH
+ {0xDDF6, 0x6B45}, //9099 #CJK UNIFIED IDEOGRAPH
+ {0xDDF7, 0x6B43}, //9100 #CJK UNIFIED IDEOGRAPH
+ {0xDDF8, 0x6B42}, //9101 #CJK UNIFIED IDEOGRAPH
+ {0xDDF9, 0x6B48}, //9102 #CJK UNIFIED IDEOGRAPH
+ {0xDDFA, 0x6B41}, //9103 #CJK UNIFIED IDEOGRAPH
+ {0xDDFB, 0x6B9B}, //9104 #CJK UNIFIED IDEOGRAPH
+ {0xDDFC, 0xFA0D}, //9105 #CJK COMPATIBILITY IDEOGRAPH
+ {0xDDFD, 0x6BFB}, //9106 #CJK UNIFIED IDEOGRAPH
+ {0xDDFE, 0x6BFC}, //9107 #CJK UNIFIED IDEOGRAPH
+ {0xDE40, 0x6BF9}, //9108 #CJK UNIFIED IDEOGRAPH
+ {0xDE41, 0x6BF7}, //9109 #CJK UNIFIED IDEOGRAPH
+ {0xDE42, 0x6BF8}, //9110 #CJK UNIFIED IDEOGRAPH
+ {0xDE43, 0x6E9B}, //9111 #CJK UNIFIED IDEOGRAPH
+ {0xDE44, 0x6ED6}, //9112 #CJK UNIFIED IDEOGRAPH
+ {0xDE45, 0x6EC8}, //9113 #CJK UNIFIED IDEOGRAPH
+ {0xDE46, 0x6E8F}, //9114 #CJK UNIFIED IDEOGRAPH
+ {0xDE47, 0x6EC0}, //9115 #CJK UNIFIED IDEOGRAPH
+ {0xDE48, 0x6E9F}, //9116 #CJK UNIFIED IDEOGRAPH
+ {0xDE49, 0x6E93}, //9117 #CJK UNIFIED IDEOGRAPH
+ {0xDE4A, 0x6E94}, //9118 #CJK UNIFIED IDEOGRAPH
+ {0xDE4B, 0x6EA0}, //9119 #CJK UNIFIED IDEOGRAPH
+ {0xDE4C, 0x6EB1}, //9120 #CJK UNIFIED IDEOGRAPH
+ {0xDE4D, 0x6EB9}, //9121 #CJK UNIFIED IDEOGRAPH
+ {0xDE4E, 0x6EC6}, //9122 #CJK UNIFIED IDEOGRAPH
+ {0xDE4F, 0x6ED2}, //9123 #CJK UNIFIED IDEOGRAPH
+ {0xDE50, 0x6EBD}, //9124 #CJK UNIFIED IDEOGRAPH
+ {0xDE51, 0x6EC1}, //9125 #CJK UNIFIED IDEOGRAPH
+ {0xDE52, 0x6E9E}, //9126 #CJK UNIFIED IDEOGRAPH
+ {0xDE53, 0x6EC9}, //9127 #CJK UNIFIED IDEOGRAPH
+ {0xDE54, 0x6EB7}, //9128 #CJK UNIFIED IDEOGRAPH
+ {0xDE55, 0x6EB0}, //9129 #CJK UNIFIED IDEOGRAPH
+ {0xDE56, 0x6ECD}, //9130 #CJK UNIFIED IDEOGRAPH
+ {0xDE57, 0x6EA6}, //9131 #CJK UNIFIED IDEOGRAPH
+ {0xDE58, 0x6ECF}, //9132 #CJK UNIFIED IDEOGRAPH
+ {0xDE59, 0x6EB2}, //9133 #CJK UNIFIED IDEOGRAPH
+ {0xDE5A, 0x6EBE}, //9134 #CJK UNIFIED IDEOGRAPH
+ {0xDE5B, 0x6EC3}, //9135 #CJK UNIFIED IDEOGRAPH
+ {0xDE5C, 0x6EDC}, //9136 #CJK UNIFIED IDEOGRAPH
+ {0xDE5D, 0x6ED8}, //9137 #CJK UNIFIED IDEOGRAPH
+ {0xDE5E, 0x6E99}, //9138 #CJK UNIFIED IDEOGRAPH
+ {0xDE5F, 0x6E92}, //9139 #CJK UNIFIED IDEOGRAPH
+ {0xDE60, 0x6E8E}, //9140 #CJK UNIFIED IDEOGRAPH
+ {0xDE61, 0x6E8D}, //9141 #CJK UNIFIED IDEOGRAPH
+ {0xDE62, 0x6EA4}, //9142 #CJK UNIFIED IDEOGRAPH
+ {0xDE63, 0x6EA1}, //9143 #CJK UNIFIED IDEOGRAPH
+ {0xDE64, 0x6EBF}, //9144 #CJK UNIFIED IDEOGRAPH
+ {0xDE65, 0x6EB3}, //9145 #CJK UNIFIED IDEOGRAPH
+ {0xDE66, 0x6ED0}, //9146 #CJK UNIFIED IDEOGRAPH
+ {0xDE67, 0x6ECA}, //9147 #CJK UNIFIED IDEOGRAPH
+ {0xDE68, 0x6E97}, //9148 #CJK UNIFIED IDEOGRAPH
+ {0xDE69, 0x6EAE}, //9149 #CJK UNIFIED IDEOGRAPH
+ {0xDE6A, 0x6EA3}, //9150 #CJK UNIFIED IDEOGRAPH
+ {0xDE6B, 0x7147}, //9151 #CJK UNIFIED IDEOGRAPH
+ {0xDE6C, 0x7154}, //9152 #CJK UNIFIED IDEOGRAPH
+ {0xDE6D, 0x7152}, //9153 #CJK UNIFIED IDEOGRAPH
+ {0xDE6E, 0x7163}, //9154 #CJK UNIFIED IDEOGRAPH
+ {0xDE6F, 0x7160}, //9155 #CJK UNIFIED IDEOGRAPH
+ {0xDE70, 0x7141}, //9156 #CJK UNIFIED IDEOGRAPH
+ {0xDE71, 0x715D}, //9157 #CJK UNIFIED IDEOGRAPH
+ {0xDE72, 0x7162}, //9158 #CJK UNIFIED IDEOGRAPH
+ {0xDE73, 0x7172}, //9159 #CJK UNIFIED IDEOGRAPH
+ {0xDE74, 0x7178}, //9160 #CJK UNIFIED IDEOGRAPH
+ {0xDE75, 0x716A}, //9161 #CJK UNIFIED IDEOGRAPH
+ {0xDE76, 0x7161}, //9162 #CJK UNIFIED IDEOGRAPH
+ {0xDE77, 0x7142}, //9163 #CJK UNIFIED IDEOGRAPH
+ {0xDE78, 0x7158}, //9164 #CJK UNIFIED IDEOGRAPH
+ {0xDE79, 0x7143}, //9165 #CJK UNIFIED IDEOGRAPH
+ {0xDE7A, 0x714B}, //9166 #CJK UNIFIED IDEOGRAPH
+ {0xDE7B, 0x7170}, //9167 #CJK UNIFIED IDEOGRAPH
+ {0xDE7C, 0x715F}, //9168 #CJK UNIFIED IDEOGRAPH
+ {0xDE7D, 0x7150}, //9169 #CJK UNIFIED IDEOGRAPH
+ {0xDE7E, 0x7153}, //9170 #CJK UNIFIED IDEOGRAPH
+ {0xDEA1, 0x7144}, //9171 #CJK UNIFIED IDEOGRAPH
+ {0xDEA2, 0x714D}, //9172 #CJK UNIFIED IDEOGRAPH
+ {0xDEA3, 0x715A}, //9173 #CJK UNIFIED IDEOGRAPH
+ {0xDEA4, 0x724F}, //9174 #CJK UNIFIED IDEOGRAPH
+ {0xDEA5, 0x728D}, //9175 #CJK UNIFIED IDEOGRAPH
+ {0xDEA6, 0x728C}, //9176 #CJK UNIFIED IDEOGRAPH
+ {0xDEA7, 0x7291}, //9177 #CJK UNIFIED IDEOGRAPH
+ {0xDEA8, 0x7290}, //9178 #CJK UNIFIED IDEOGRAPH
+ {0xDEA9, 0x728E}, //9179 #CJK UNIFIED IDEOGRAPH
+ {0xDEAA, 0x733C}, //9180 #CJK UNIFIED IDEOGRAPH
+ {0xDEAB, 0x7342}, //9181 #CJK UNIFIED IDEOGRAPH
+ {0xDEAC, 0x733B}, //9182 #CJK UNIFIED IDEOGRAPH
+ {0xDEAD, 0x733A}, //9183 #CJK UNIFIED IDEOGRAPH
+ {0xDEAE, 0x7340}, //9184 #CJK UNIFIED IDEOGRAPH
+ {0xDEAF, 0x734A}, //9185 #CJK UNIFIED IDEOGRAPH
+ {0xDEB0, 0x7349}, //9186 #CJK UNIFIED IDEOGRAPH
+ {0xDEB1, 0x7444}, //9187 #CJK UNIFIED IDEOGRAPH
+ {0xDEB2, 0x744A}, //9188 #CJK UNIFIED IDEOGRAPH
+ {0xDEB3, 0x744B}, //9189 #CJK UNIFIED IDEOGRAPH
+ {0xDEB4, 0x7452}, //9190 #CJK UNIFIED IDEOGRAPH
+ {0xDEB5, 0x7451}, //9191 #CJK UNIFIED IDEOGRAPH
+ {0xDEB6, 0x7457}, //9192 #CJK UNIFIED IDEOGRAPH
+ {0xDEB7, 0x7440}, //9193 #CJK UNIFIED IDEOGRAPH
+ {0xDEB8, 0x744F}, //9194 #CJK UNIFIED IDEOGRAPH
+ {0xDEB9, 0x7450}, //9195 #CJK UNIFIED IDEOGRAPH
+ {0xDEBA, 0x744E}, //9196 #CJK UNIFIED IDEOGRAPH
+ {0xDEBB, 0x7442}, //9197 #CJK UNIFIED IDEOGRAPH
+ {0xDEBC, 0x7446}, //9198 #CJK UNIFIED IDEOGRAPH
+ {0xDEBD, 0x744D}, //9199 #CJK UNIFIED IDEOGRAPH
+ {0xDEBE, 0x7454}, //9200 #CJK UNIFIED IDEOGRAPH
+ {0xDEBF, 0x74E1}, //9201 #CJK UNIFIED IDEOGRAPH
+ {0xDEC0, 0x74FF}, //9202 #CJK UNIFIED IDEOGRAPH
+ {0xDEC1, 0x74FE}, //9203 #CJK UNIFIED IDEOGRAPH
+ {0xDEC2, 0x74FD}, //9204 #CJK UNIFIED IDEOGRAPH
+ {0xDEC3, 0x751D}, //9205 #CJK UNIFIED IDEOGRAPH
+ {0xDEC4, 0x7579}, //9206 #CJK UNIFIED IDEOGRAPH
+ {0xDEC5, 0x7577}, //9207 #CJK UNIFIED IDEOGRAPH
+ {0xDEC6, 0x6983}, //9208 #CJK UNIFIED IDEOGRAPH
+ {0xDEC7, 0x75EF}, //9209 #CJK UNIFIED IDEOGRAPH
+ {0xDEC8, 0x760F}, //9210 #CJK UNIFIED IDEOGRAPH
+ {0xDEC9, 0x7603}, //9211 #CJK UNIFIED IDEOGRAPH
+ {0xDECA, 0x75F7}, //9212 #CJK UNIFIED IDEOGRAPH
+ {0xDECB, 0x75FE}, //9213 #CJK UNIFIED IDEOGRAPH
+ {0xDECC, 0x75FC}, //9214 #CJK UNIFIED IDEOGRAPH
+ {0xDECD, 0x75F9}, //9215 #CJK UNIFIED IDEOGRAPH
+ {0xDECE, 0x75F8}, //9216 #CJK UNIFIED IDEOGRAPH
+ {0xDECF, 0x7610}, //9217 #CJK UNIFIED IDEOGRAPH
+ {0xDED0, 0x75FB}, //9218 #CJK UNIFIED IDEOGRAPH
+ {0xDED1, 0x75F6}, //9219 #CJK UNIFIED IDEOGRAPH
+ {0xDED2, 0x75ED}, //9220 #CJK UNIFIED IDEOGRAPH
+ {0xDED3, 0x75F5}, //9221 #CJK UNIFIED IDEOGRAPH
+ {0xDED4, 0x75FD}, //9222 #CJK UNIFIED IDEOGRAPH
+ {0xDED5, 0x7699}, //9223 #CJK UNIFIED IDEOGRAPH
+ {0xDED6, 0x76B5}, //9224 #CJK UNIFIED IDEOGRAPH
+ {0xDED7, 0x76DD}, //9225 #CJK UNIFIED IDEOGRAPH
+ {0xDED8, 0x7755}, //9226 #CJK UNIFIED IDEOGRAPH
+ {0xDED9, 0x775F}, //9227 #CJK UNIFIED IDEOGRAPH
+ {0xDEDA, 0x7760}, //9228 #CJK UNIFIED IDEOGRAPH
+ {0xDEDB, 0x7752}, //9229 #CJK UNIFIED IDEOGRAPH
+ {0xDEDC, 0x7756}, //9230 #CJK UNIFIED IDEOGRAPH
+ {0xDEDD, 0x775A}, //9231 #CJK UNIFIED IDEOGRAPH
+ {0xDEDE, 0x7769}, //9232 #CJK UNIFIED IDEOGRAPH
+ {0xDEDF, 0x7767}, //9233 #CJK UNIFIED IDEOGRAPH
+ {0xDEE0, 0x7754}, //9234 #CJK UNIFIED IDEOGRAPH
+ {0xDEE1, 0x7759}, //9235 #CJK UNIFIED IDEOGRAPH
+ {0xDEE2, 0x776D}, //9236 #CJK UNIFIED IDEOGRAPH
+ {0xDEE3, 0x77E0}, //9237 #CJK UNIFIED IDEOGRAPH
+ {0xDEE4, 0x7887}, //9238 #CJK UNIFIED IDEOGRAPH
+ {0xDEE5, 0x789A}, //9239 #CJK UNIFIED IDEOGRAPH
+ {0xDEE6, 0x7894}, //9240 #CJK UNIFIED IDEOGRAPH
+ {0xDEE7, 0x788F}, //9241 #CJK UNIFIED IDEOGRAPH
+ {0xDEE8, 0x7884}, //9242 #CJK UNIFIED IDEOGRAPH
+ {0xDEE9, 0x7895}, //9243 #CJK UNIFIED IDEOGRAPH
+ {0xDEEA, 0x7885}, //9244 #CJK UNIFIED IDEOGRAPH
+ {0xDEEB, 0x7886}, //9245 #CJK UNIFIED IDEOGRAPH
+ {0xDEEC, 0x78A1}, //9246 #CJK UNIFIED IDEOGRAPH
+ {0xDEED, 0x7883}, //9247 #CJK UNIFIED IDEOGRAPH
+ {0xDEEE, 0x7879}, //9248 #CJK UNIFIED IDEOGRAPH
+ {0xDEEF, 0x7899}, //9249 #CJK UNIFIED IDEOGRAPH
+ {0xDEF0, 0x7880}, //9250 #CJK UNIFIED IDEOGRAPH
+ {0xDEF1, 0x7896}, //9251 #CJK UNIFIED IDEOGRAPH
+ {0xDEF2, 0x787B}, //9252 #CJK UNIFIED IDEOGRAPH
+ {0xDEF3, 0x797C}, //9253 #CJK UNIFIED IDEOGRAPH
+ {0xDEF4, 0x7982}, //9254 #CJK UNIFIED IDEOGRAPH
+ {0xDEF5, 0x797D}, //9255 #CJK UNIFIED IDEOGRAPH
+ {0xDEF6, 0x7979}, //9256 #CJK UNIFIED IDEOGRAPH
+ {0xDEF7, 0x7A11}, //9257 #CJK UNIFIED IDEOGRAPH
+ {0xDEF8, 0x7A18}, //9258 #CJK UNIFIED IDEOGRAPH
+ {0xDEF9, 0x7A19}, //9259 #CJK UNIFIED IDEOGRAPH
+ {0xDEFA, 0x7A12}, //9260 #CJK UNIFIED IDEOGRAPH
+ {0xDEFB, 0x7A17}, //9261 #CJK UNIFIED IDEOGRAPH
+ {0xDEFC, 0x7A15}, //9262 #CJK UNIFIED IDEOGRAPH
+ {0xDEFD, 0x7A22}, //9263 #CJK UNIFIED IDEOGRAPH
+ {0xDEFE, 0x7A13}, //9264 #CJK UNIFIED IDEOGRAPH
+ {0xDF40, 0x7A1B}, //9265 #CJK UNIFIED IDEOGRAPH
+ {0xDF41, 0x7A10}, //9266 #CJK UNIFIED IDEOGRAPH
+ {0xDF42, 0x7AA3}, //9267 #CJK UNIFIED IDEOGRAPH
+ {0xDF43, 0x7AA2}, //9268 #CJK UNIFIED IDEOGRAPH
+ {0xDF44, 0x7A9E}, //9269 #CJK UNIFIED IDEOGRAPH
+ {0xDF45, 0x7AEB}, //9270 #CJK UNIFIED IDEOGRAPH
+ {0xDF46, 0x7B66}, //9271 #CJK UNIFIED IDEOGRAPH
+ {0xDF47, 0x7B64}, //9272 #CJK UNIFIED IDEOGRAPH
+ {0xDF48, 0x7B6D}, //9273 #CJK UNIFIED IDEOGRAPH
+ {0xDF49, 0x7B74}, //9274 #CJK UNIFIED IDEOGRAPH
+ {0xDF4A, 0x7B69}, //9275 #CJK UNIFIED IDEOGRAPH
+ {0xDF4B, 0x7B72}, //9276 #CJK UNIFIED IDEOGRAPH
+ {0xDF4C, 0x7B65}, //9277 #CJK UNIFIED IDEOGRAPH
+ {0xDF4D, 0x7B73}, //9278 #CJK UNIFIED IDEOGRAPH
+ {0xDF4E, 0x7B71}, //9279 #CJK UNIFIED IDEOGRAPH
+ {0xDF4F, 0x7B70}, //9280 #CJK UNIFIED IDEOGRAPH
+ {0xDF50, 0x7B61}, //9281 #CJK UNIFIED IDEOGRAPH
+ {0xDF51, 0x7B78}, //9282 #CJK UNIFIED IDEOGRAPH
+ {0xDF52, 0x7B76}, //9283 #CJK UNIFIED IDEOGRAPH
+ {0xDF53, 0x7B63}, //9284 #CJK UNIFIED IDEOGRAPH
+ {0xDF54, 0x7CB2}, //9285 #CJK UNIFIED IDEOGRAPH
+ {0xDF55, 0x7CB4}, //9286 #CJK UNIFIED IDEOGRAPH
+ {0xDF56, 0x7CAF}, //9287 #CJK UNIFIED IDEOGRAPH
+ {0xDF57, 0x7D88}, //9288 #CJK UNIFIED IDEOGRAPH
+ {0xDF58, 0x7D86}, //9289 #CJK UNIFIED IDEOGRAPH
+ {0xDF59, 0x7D80}, //9290 #CJK UNIFIED IDEOGRAPH
+ {0xDF5A, 0x7D8D}, //9291 #CJK UNIFIED IDEOGRAPH
+ {0xDF5B, 0x7D7F}, //9292 #CJK UNIFIED IDEOGRAPH
+ {0xDF5C, 0x7D85}, //9293 #CJK UNIFIED IDEOGRAPH
+ {0xDF5D, 0x7D7A}, //9294 #CJK UNIFIED IDEOGRAPH
+ {0xDF5E, 0x7D8E}, //9295 #CJK UNIFIED IDEOGRAPH
+ {0xDF5F, 0x7D7B}, //9296 #CJK UNIFIED IDEOGRAPH
+ {0xDF60, 0x7D83}, //9297 #CJK UNIFIED IDEOGRAPH
+ {0xDF61, 0x7D7C}, //9298 #CJK UNIFIED IDEOGRAPH
+ {0xDF62, 0x7D8C}, //9299 #CJK UNIFIED IDEOGRAPH
+ {0xDF63, 0x7D94}, //9300 #CJK UNIFIED IDEOGRAPH
+ {0xDF64, 0x7D84}, //9301 #CJK UNIFIED IDEOGRAPH
+ {0xDF65, 0x7D7D}, //9302 #CJK UNIFIED IDEOGRAPH
+ {0xDF66, 0x7D92}, //9303 #CJK UNIFIED IDEOGRAPH
+ {0xDF67, 0x7F6D}, //9304 #CJK UNIFIED IDEOGRAPH
+ {0xDF68, 0x7F6B}, //9305 #CJK UNIFIED IDEOGRAPH
+ {0xDF69, 0x7F67}, //9306 #CJK UNIFIED IDEOGRAPH
+ {0xDF6A, 0x7F68}, //9307 #CJK UNIFIED IDEOGRAPH
+ {0xDF6B, 0x7F6C}, //9308 #CJK UNIFIED IDEOGRAPH
+ {0xDF6C, 0x7FA6}, //9309 #CJK UNIFIED IDEOGRAPH
+ {0xDF6D, 0x7FA5}, //9310 #CJK UNIFIED IDEOGRAPH
+ {0xDF6E, 0x7FA7}, //9311 #CJK UNIFIED IDEOGRAPH
+ {0xDF6F, 0x7FDB}, //9312 #CJK UNIFIED IDEOGRAPH
+ {0xDF70, 0x7FDC}, //9313 #CJK UNIFIED IDEOGRAPH
+ {0xDF71, 0x8021}, //9314 #CJK UNIFIED IDEOGRAPH
+ {0xDF72, 0x8164}, //9315 #CJK UNIFIED IDEOGRAPH
+ {0xDF73, 0x8160}, //9316 #CJK UNIFIED IDEOGRAPH
+ {0xDF74, 0x8177}, //9317 #CJK UNIFIED IDEOGRAPH
+ {0xDF75, 0x815C}, //9318 #CJK UNIFIED IDEOGRAPH
+ {0xDF76, 0x8169}, //9319 #CJK UNIFIED IDEOGRAPH
+ {0xDF77, 0x815B}, //9320 #CJK UNIFIED IDEOGRAPH
+ {0xDF78, 0x8162}, //9321 #CJK UNIFIED IDEOGRAPH
+ {0xDF79, 0x8172}, //9322 #CJK UNIFIED IDEOGRAPH
+ {0xDF7A, 0x6721}, //9323 #CJK UNIFIED IDEOGRAPH
+ {0xDF7B, 0x815E}, //9324 #CJK UNIFIED IDEOGRAPH
+ {0xDF7C, 0x8176}, //9325 #CJK UNIFIED IDEOGRAPH
+ {0xDF7D, 0x8167}, //9326 #CJK UNIFIED IDEOGRAPH
+ {0xDF7E, 0x816F}, //9327 #CJK UNIFIED IDEOGRAPH
+ {0xDFA1, 0x8144}, //9328 #CJK UNIFIED IDEOGRAPH
+ {0xDFA2, 0x8161}, //9329 #CJK UNIFIED IDEOGRAPH
+ {0xDFA3, 0x821D}, //9330 #CJK UNIFIED IDEOGRAPH
+ {0xDFA4, 0x8249}, //9331 #CJK UNIFIED IDEOGRAPH
+ {0xDFA5, 0x8244}, //9332 #CJK UNIFIED IDEOGRAPH
+ {0xDFA6, 0x8240}, //9333 #CJK UNIFIED IDEOGRAPH
+ {0xDFA7, 0x8242}, //9334 #CJK UNIFIED IDEOGRAPH
+ {0xDFA8, 0x8245}, //9335 #CJK UNIFIED IDEOGRAPH
+ {0xDFA9, 0x84F1}, //9336 #CJK UNIFIED IDEOGRAPH
+ {0xDFAA, 0x843F}, //9337 #CJK UNIFIED IDEOGRAPH
+ {0xDFAB, 0x8456}, //9338 #CJK UNIFIED IDEOGRAPH
+ {0xDFAC, 0x8476}, //9339 #CJK UNIFIED IDEOGRAPH
+ {0xDFAD, 0x8479}, //9340 #CJK UNIFIED IDEOGRAPH
+ {0xDFAE, 0x848F}, //9341 #CJK UNIFIED IDEOGRAPH
+ {0xDFAF, 0x848D}, //9342 #CJK UNIFIED IDEOGRAPH
+ {0xDFB0, 0x8465}, //9343 #CJK UNIFIED IDEOGRAPH
+ {0xDFB1, 0x8451}, //9344 #CJK UNIFIED IDEOGRAPH
+ {0xDFB2, 0x8440}, //9345 #CJK UNIFIED IDEOGRAPH
+ {0xDFB3, 0x8486}, //9346 #CJK UNIFIED IDEOGRAPH
+ {0xDFB4, 0x8467}, //9347 #CJK UNIFIED IDEOGRAPH
+ {0xDFB5, 0x8430}, //9348 #CJK UNIFIED IDEOGRAPH
+ {0xDFB6, 0x844D}, //9349 #CJK UNIFIED IDEOGRAPH
+ {0xDFB7, 0x847D}, //9350 #CJK UNIFIED IDEOGRAPH
+ {0xDFB8, 0x845A}, //9351 #CJK UNIFIED IDEOGRAPH
+ {0xDFB9, 0x8459}, //9352 #CJK UNIFIED IDEOGRAPH
+ {0xDFBA, 0x8474}, //9353 #CJK UNIFIED IDEOGRAPH
+ {0xDFBB, 0x8473}, //9354 #CJK UNIFIED IDEOGRAPH
+ {0xDFBC, 0x845D}, //9355 #CJK UNIFIED IDEOGRAPH
+ {0xDFBD, 0x8507}, //9356 #CJK UNIFIED IDEOGRAPH
+ {0xDFBE, 0x845E}, //9357 #CJK UNIFIED IDEOGRAPH
+ {0xDFBF, 0x8437}, //9358 #CJK UNIFIED IDEOGRAPH
+ {0xDFC0, 0x843A}, //9359 #CJK UNIFIED IDEOGRAPH
+ {0xDFC1, 0x8434}, //9360 #CJK UNIFIED IDEOGRAPH
+ {0xDFC2, 0x847A}, //9361 #CJK UNIFIED IDEOGRAPH
+ {0xDFC3, 0x8443}, //9362 #CJK UNIFIED IDEOGRAPH
+ {0xDFC4, 0x8478}, //9363 #CJK UNIFIED IDEOGRAPH
+ {0xDFC5, 0x8432}, //9364 #CJK UNIFIED IDEOGRAPH
+ {0xDFC6, 0x8445}, //9365 #CJK UNIFIED IDEOGRAPH
+ {0xDFC7, 0x8429}, //9366 #CJK UNIFIED IDEOGRAPH
+ {0xDFC8, 0x83D9}, //9367 #CJK UNIFIED IDEOGRAPH
+ {0xDFC9, 0x844B}, //9368 #CJK UNIFIED IDEOGRAPH
+ {0xDFCA, 0x842F}, //9369 #CJK UNIFIED IDEOGRAPH
+ {0xDFCB, 0x8442}, //9370 #CJK UNIFIED IDEOGRAPH
+ {0xDFCC, 0x842D}, //9371 #CJK UNIFIED IDEOGRAPH
+ {0xDFCD, 0x845F}, //9372 #CJK UNIFIED IDEOGRAPH
+ {0xDFCE, 0x8470}, //9373 #CJK UNIFIED IDEOGRAPH
+ {0xDFCF, 0x8439}, //9374 #CJK UNIFIED IDEOGRAPH
+ {0xDFD0, 0x844E}, //9375 #CJK UNIFIED IDEOGRAPH
+ {0xDFD1, 0x844C}, //9376 #CJK UNIFIED IDEOGRAPH
+ {0xDFD2, 0x8452}, //9377 #CJK UNIFIED IDEOGRAPH
+ {0xDFD3, 0x846F}, //9378 #CJK UNIFIED IDEOGRAPH
+ {0xDFD4, 0x84C5}, //9379 #CJK UNIFIED IDEOGRAPH
+ {0xDFD5, 0x848E}, //9380 #CJK UNIFIED IDEOGRAPH
+ {0xDFD6, 0x843B}, //9381 #CJK UNIFIED IDEOGRAPH
+ {0xDFD7, 0x8447}, //9382 #CJK UNIFIED IDEOGRAPH
+ {0xDFD8, 0x8436}, //9383 #CJK UNIFIED IDEOGRAPH
+ {0xDFD9, 0x8433}, //9384 #CJK UNIFIED IDEOGRAPH
+ {0xDFDA, 0x8468}, //9385 #CJK UNIFIED IDEOGRAPH
+ {0xDFDB, 0x847E}, //9386 #CJK UNIFIED IDEOGRAPH
+ {0xDFDC, 0x8444}, //9387 #CJK UNIFIED IDEOGRAPH
+ {0xDFDD, 0x842B}, //9388 #CJK UNIFIED IDEOGRAPH
+ {0xDFDE, 0x8460}, //9389 #CJK UNIFIED IDEOGRAPH
+ {0xDFDF, 0x8454}, //9390 #CJK UNIFIED IDEOGRAPH
+ {0xDFE0, 0x846E}, //9391 #CJK UNIFIED IDEOGRAPH
+ {0xDFE1, 0x8450}, //9392 #CJK UNIFIED IDEOGRAPH
+ {0xDFE2, 0x870B}, //9393 #CJK UNIFIED IDEOGRAPH
+ {0xDFE3, 0x8704}, //9394 #CJK UNIFIED IDEOGRAPH
+ {0xDFE4, 0x86F7}, //9395 #CJK UNIFIED IDEOGRAPH
+ {0xDFE5, 0x870C}, //9396 #CJK UNIFIED IDEOGRAPH
+ {0xDFE6, 0x86FA}, //9397 #CJK UNIFIED IDEOGRAPH
+ {0xDFE7, 0x86D6}, //9398 #CJK UNIFIED IDEOGRAPH
+ {0xDFE8, 0x86F5}, //9399 #CJK UNIFIED IDEOGRAPH
+ {0xDFE9, 0x874D}, //9400 #CJK UNIFIED IDEOGRAPH
+ {0xDFEA, 0x86F8}, //9401 #CJK UNIFIED IDEOGRAPH
+ {0xDFEB, 0x870E}, //9402 #CJK UNIFIED IDEOGRAPH
+ {0xDFEC, 0x8709}, //9403 #CJK UNIFIED IDEOGRAPH
+ {0xDFED, 0x8701}, //9404 #CJK UNIFIED IDEOGRAPH
+ {0xDFEE, 0x86F6}, //9405 #CJK UNIFIED IDEOGRAPH
+ {0xDFEF, 0x870D}, //9406 #CJK UNIFIED IDEOGRAPH
+ {0xDFF0, 0x8705}, //9407 #CJK UNIFIED IDEOGRAPH
+ {0xDFF1, 0x88D6}, //9408 #CJK UNIFIED IDEOGRAPH
+ {0xDFF2, 0x88CB}, //9409 #CJK UNIFIED IDEOGRAPH
+ {0xDFF3, 0x88CD}, //9410 #CJK UNIFIED IDEOGRAPH
+ {0xDFF4, 0x88CE}, //9411 #CJK UNIFIED IDEOGRAPH
+ {0xDFF5, 0x88DE}, //9412 #CJK UNIFIED IDEOGRAPH
+ {0xDFF6, 0x88DB}, //9413 #CJK UNIFIED IDEOGRAPH
+ {0xDFF7, 0x88DA}, //9414 #CJK UNIFIED IDEOGRAPH
+ {0xDFF8, 0x88CC}, //9415 #CJK UNIFIED IDEOGRAPH
+ {0xDFF9, 0x88D0}, //9416 #CJK UNIFIED IDEOGRAPH
+ {0xDFFA, 0x8985}, //9417 #CJK UNIFIED IDEOGRAPH
+ {0xDFFB, 0x899B}, //9418 #CJK UNIFIED IDEOGRAPH
+ {0xDFFC, 0x89DF}, //9419 #CJK UNIFIED IDEOGRAPH
+ {0xDFFD, 0x89E5}, //9420 #CJK UNIFIED IDEOGRAPH
+ {0xDFFE, 0x89E4}, //9421 #CJK UNIFIED IDEOGRAPH
+ {0xE040, 0x89E1}, //9422 #CJK UNIFIED IDEOGRAPH
+ {0xE041, 0x89E0}, //9423 #CJK UNIFIED IDEOGRAPH
+ {0xE042, 0x89E2}, //9424 #CJK UNIFIED IDEOGRAPH
+ {0xE043, 0x89DC}, //9425 #CJK UNIFIED IDEOGRAPH
+ {0xE044, 0x89E6}, //9426 #CJK UNIFIED IDEOGRAPH
+ {0xE045, 0x8A76}, //9427 #CJK UNIFIED IDEOGRAPH
+ {0xE046, 0x8A86}, //9428 #CJK UNIFIED IDEOGRAPH
+ {0xE047, 0x8A7F}, //9429 #CJK UNIFIED IDEOGRAPH
+ {0xE048, 0x8A61}, //9430 #CJK UNIFIED IDEOGRAPH
+ {0xE049, 0x8A3F}, //9431 #CJK UNIFIED IDEOGRAPH
+ {0xE04A, 0x8A77}, //9432 #CJK UNIFIED IDEOGRAPH
+ {0xE04B, 0x8A82}, //9433 #CJK UNIFIED IDEOGRAPH
+ {0xE04C, 0x8A84}, //9434 #CJK UNIFIED IDEOGRAPH
+ {0xE04D, 0x8A75}, //9435 #CJK UNIFIED IDEOGRAPH
+ {0xE04E, 0x8A83}, //9436 #CJK UNIFIED IDEOGRAPH
+ {0xE04F, 0x8A81}, //9437 #CJK UNIFIED IDEOGRAPH
+ {0xE050, 0x8A74}, //9438 #CJK UNIFIED IDEOGRAPH
+ {0xE051, 0x8A7A}, //9439 #CJK UNIFIED IDEOGRAPH
+ {0xE052, 0x8C3C}, //9440 #CJK UNIFIED IDEOGRAPH
+ {0xE053, 0x8C4B}, //9441 #CJK UNIFIED IDEOGRAPH
+ {0xE054, 0x8C4A}, //9442 #CJK UNIFIED IDEOGRAPH
+ {0xE055, 0x8C65}, //9443 #CJK UNIFIED IDEOGRAPH
+ {0xE056, 0x8C64}, //9444 #CJK UNIFIED IDEOGRAPH
+ {0xE057, 0x8C66}, //9445 #CJK UNIFIED IDEOGRAPH
+ {0xE058, 0x8C86}, //9446 #CJK UNIFIED IDEOGRAPH
+ {0xE059, 0x8C84}, //9447 #CJK UNIFIED IDEOGRAPH
+ {0xE05A, 0x8C85}, //9448 #CJK UNIFIED IDEOGRAPH
+ {0xE05B, 0x8CCC}, //9449 #CJK UNIFIED IDEOGRAPH
+ {0xE05C, 0x8D68}, //9450 #CJK UNIFIED IDEOGRAPH
+ {0xE05D, 0x8D69}, //9451 #CJK UNIFIED IDEOGRAPH
+ {0xE05E, 0x8D91}, //9452 #CJK UNIFIED IDEOGRAPH
+ {0xE05F, 0x8D8C}, //9453 #CJK UNIFIED IDEOGRAPH
+ {0xE060, 0x8D8E}, //9454 #CJK UNIFIED IDEOGRAPH
+ {0xE061, 0x8D8F}, //9455 #CJK UNIFIED IDEOGRAPH
+ {0xE062, 0x8D8D}, //9456 #CJK UNIFIED IDEOGRAPH
+ {0xE063, 0x8D93}, //9457 #CJK UNIFIED IDEOGRAPH
+ {0xE064, 0x8D94}, //9458 #CJK UNIFIED IDEOGRAPH
+ {0xE065, 0x8D90}, //9459 #CJK UNIFIED IDEOGRAPH
+ {0xE066, 0x8D92}, //9460 #CJK UNIFIED IDEOGRAPH
+ {0xE067, 0x8DF0}, //9461 #CJK UNIFIED IDEOGRAPH
+ {0xE068, 0x8DE0}, //9462 #CJK UNIFIED IDEOGRAPH
+ {0xE069, 0x8DEC}, //9463 #CJK UNIFIED IDEOGRAPH
+ {0xE06A, 0x8DF1}, //9464 #CJK UNIFIED IDEOGRAPH
+ {0xE06B, 0x8DEE}, //9465 #CJK UNIFIED IDEOGRAPH
+ {0xE06C, 0x8DD0}, //9466 #CJK UNIFIED IDEOGRAPH
+ {0xE06D, 0x8DE9}, //9467 #CJK UNIFIED IDEOGRAPH
+ {0xE06E, 0x8DE3}, //9468 #CJK UNIFIED IDEOGRAPH
+ {0xE06F, 0x8DE2}, //9469 #CJK UNIFIED IDEOGRAPH
+ {0xE070, 0x8DE7}, //9470 #CJK UNIFIED IDEOGRAPH
+ {0xE071, 0x8DF2}, //9471 #CJK UNIFIED IDEOGRAPH
+ {0xE072, 0x8DEB}, //9472 #CJK UNIFIED IDEOGRAPH
+ {0xE073, 0x8DF4}, //9473 #CJK UNIFIED IDEOGRAPH
+ {0xE074, 0x8F06}, //9474 #CJK UNIFIED IDEOGRAPH
+ {0xE075, 0x8EFF}, //9475 #CJK UNIFIED IDEOGRAPH
+ {0xE076, 0x8F01}, //9476 #CJK UNIFIED IDEOGRAPH
+ {0xE077, 0x8F00}, //9477 #CJK UNIFIED IDEOGRAPH
+ {0xE078, 0x8F05}, //9478 #CJK UNIFIED IDEOGRAPH
+ {0xE079, 0x8F07}, //9479 #CJK UNIFIED IDEOGRAPH
+ {0xE07A, 0x8F08}, //9480 #CJK UNIFIED IDEOGRAPH
+ {0xE07B, 0x8F02}, //9481 #CJK UNIFIED IDEOGRAPH
+ {0xE07C, 0x8F0B}, //9482 #CJK UNIFIED IDEOGRAPH
+ {0xE07D, 0x9052}, //9483 #CJK UNIFIED IDEOGRAPH
+ {0xE07E, 0x903F}, //9484 #CJK UNIFIED IDEOGRAPH
+ {0xE0A1, 0x9044}, //9485 #CJK UNIFIED IDEOGRAPH
+ {0xE0A2, 0x9049}, //9486 #CJK UNIFIED IDEOGRAPH
+ {0xE0A3, 0x903D}, //9487 #CJK UNIFIED IDEOGRAPH
+ {0xE0A4, 0x9110}, //9488 #CJK UNIFIED IDEOGRAPH
+ {0xE0A5, 0x910D}, //9489 #CJK UNIFIED IDEOGRAPH
+ {0xE0A6, 0x910F}, //9490 #CJK UNIFIED IDEOGRAPH
+ {0xE0A7, 0x9111}, //9491 #CJK UNIFIED IDEOGRAPH
+ {0xE0A8, 0x9116}, //9492 #CJK UNIFIED IDEOGRAPH
+ {0xE0A9, 0x9114}, //9493 #CJK UNIFIED IDEOGRAPH
+ {0xE0AA, 0x910B}, //9494 #CJK UNIFIED IDEOGRAPH
+ {0xE0AB, 0x910E}, //9495 #CJK UNIFIED IDEOGRAPH
+ {0xE0AC, 0x916E}, //9496 #CJK UNIFIED IDEOGRAPH
+ {0xE0AD, 0x916F}, //9497 #CJK UNIFIED IDEOGRAPH
+ {0xE0AE, 0x9248}, //9498 #CJK UNIFIED IDEOGRAPH
+ {0xE0AF, 0x9252}, //9499 #CJK UNIFIED IDEOGRAPH
+ {0xE0B0, 0x9230}, //9500 #CJK UNIFIED IDEOGRAPH
+ {0xE0B1, 0x923A}, //9501 #CJK UNIFIED IDEOGRAPH
+ {0xE0B2, 0x9266}, //9502 #CJK UNIFIED IDEOGRAPH
+ {0xE0B3, 0x9233}, //9503 #CJK UNIFIED IDEOGRAPH
+ {0xE0B4, 0x9265}, //9504 #CJK UNIFIED IDEOGRAPH
+ {0xE0B5, 0x925E}, //9505 #CJK UNIFIED IDEOGRAPH
+ {0xE0B6, 0x9283}, //9506 #CJK UNIFIED IDEOGRAPH
+ {0xE0B7, 0x922E}, //9507 #CJK UNIFIED IDEOGRAPH
+ {0xE0B8, 0x924A}, //9508 #CJK UNIFIED IDEOGRAPH
+ {0xE0B9, 0x9246}, //9509 #CJK UNIFIED IDEOGRAPH
+ {0xE0BA, 0x926D}, //9510 #CJK UNIFIED IDEOGRAPH
+ {0xE0BB, 0x926C}, //9511 #CJK UNIFIED IDEOGRAPH
+ {0xE0BC, 0x924F}, //9512 #CJK UNIFIED IDEOGRAPH
+ {0xE0BD, 0x9260}, //9513 #CJK UNIFIED IDEOGRAPH
+ {0xE0BE, 0x9267}, //9514 #CJK UNIFIED IDEOGRAPH
+ {0xE0BF, 0x926F}, //9515 #CJK UNIFIED IDEOGRAPH
+ {0xE0C0, 0x9236}, //9516 #CJK UNIFIED IDEOGRAPH
+ {0xE0C1, 0x9261}, //9517 #CJK UNIFIED IDEOGRAPH
+ {0xE0C2, 0x9270}, //9518 #CJK UNIFIED IDEOGRAPH
+ {0xE0C3, 0x9231}, //9519 #CJK UNIFIED IDEOGRAPH
+ {0xE0C4, 0x9254}, //9520 #CJK UNIFIED IDEOGRAPH
+ {0xE0C5, 0x9263}, //9521 #CJK UNIFIED IDEOGRAPH
+ {0xE0C6, 0x9250}, //9522 #CJK UNIFIED IDEOGRAPH
+ {0xE0C7, 0x9272}, //9523 #CJK UNIFIED IDEOGRAPH
+ {0xE0C8, 0x924E}, //9524 #CJK UNIFIED IDEOGRAPH
+ {0xE0C9, 0x9253}, //9525 #CJK UNIFIED IDEOGRAPH
+ {0xE0CA, 0x924C}, //9526 #CJK UNIFIED IDEOGRAPH
+ {0xE0CB, 0x9256}, //9527 #CJK UNIFIED IDEOGRAPH
+ {0xE0CC, 0x9232}, //9528 #CJK UNIFIED IDEOGRAPH
+ {0xE0CD, 0x959F}, //9529 #CJK UNIFIED IDEOGRAPH
+ {0xE0CE, 0x959C}, //9530 #CJK UNIFIED IDEOGRAPH
+ {0xE0CF, 0x959E}, //9531 #CJK UNIFIED IDEOGRAPH
+ {0xE0D0, 0x959B}, //9532 #CJK UNIFIED IDEOGRAPH
+ {0xE0D1, 0x9692}, //9533 #CJK UNIFIED IDEOGRAPH
+ {0xE0D2, 0x9693}, //9534 #CJK UNIFIED IDEOGRAPH
+ {0xE0D3, 0x9691}, //9535 #CJK UNIFIED IDEOGRAPH
+ {0xE0D4, 0x9697}, //9536 #CJK UNIFIED IDEOGRAPH
+ {0xE0D5, 0x96CE}, //9537 #CJK UNIFIED IDEOGRAPH
+ {0xE0D6, 0x96FA}, //9538 #CJK UNIFIED IDEOGRAPH
+ {0xE0D7, 0x96FD}, //9539 #CJK UNIFIED IDEOGRAPH
+ {0xE0D8, 0x96F8}, //9540 #CJK UNIFIED IDEOGRAPH
+ {0xE0D9, 0x96F5}, //9541 #CJK UNIFIED IDEOGRAPH
+ {0xE0DA, 0x9773}, //9542 #CJK UNIFIED IDEOGRAPH
+ {0xE0DB, 0x9777}, //9543 #CJK UNIFIED IDEOGRAPH
+ {0xE0DC, 0x9778}, //9544 #CJK UNIFIED IDEOGRAPH
+ {0xE0DD, 0x9772}, //9545 #CJK UNIFIED IDEOGRAPH
+ {0xE0DE, 0x980F}, //9546 #CJK UNIFIED IDEOGRAPH
+ {0xE0DF, 0x980D}, //9547 #CJK UNIFIED IDEOGRAPH
+ {0xE0E0, 0x980E}, //9548 #CJK UNIFIED IDEOGRAPH
+ {0xE0E1, 0x98AC}, //9549 #CJK UNIFIED IDEOGRAPH
+ {0xE0E2, 0x98F6}, //9550 #CJK UNIFIED IDEOGRAPH
+ {0xE0E3, 0x98F9}, //9551 #CJK UNIFIED IDEOGRAPH
+ {0xE0E4, 0x99AF}, //9552 #CJK UNIFIED IDEOGRAPH
+ {0xE0E5, 0x99B2}, //9553 #CJK UNIFIED IDEOGRAPH
+ {0xE0E6, 0x99B0}, //9554 #CJK UNIFIED IDEOGRAPH
+ {0xE0E7, 0x99B5}, //9555 #CJK UNIFIED IDEOGRAPH
+ {0xE0E8, 0x9AAD}, //9556 #CJK UNIFIED IDEOGRAPH
+ {0xE0E9, 0x9AAB}, //9557 #CJK UNIFIED IDEOGRAPH
+ {0xE0EA, 0x9B5B}, //9558 #CJK UNIFIED IDEOGRAPH
+ {0xE0EB, 0x9CEA}, //9559 #CJK UNIFIED IDEOGRAPH
+ {0xE0EC, 0x9CED}, //9560 #CJK UNIFIED IDEOGRAPH
+ {0xE0ED, 0x9CE7}, //9561 #CJK UNIFIED IDEOGRAPH
+ {0xE0EE, 0x9E80}, //9562 #CJK UNIFIED IDEOGRAPH
+ {0xE0EF, 0x9EFD}, //9563 #CJK UNIFIED IDEOGRAPH
+ {0xE0F0, 0x50E6}, //9564 #CJK UNIFIED IDEOGRAPH
+ {0xE0F1, 0x50D4}, //9565 #CJK UNIFIED IDEOGRAPH
+ {0xE0F2, 0x50D7}, //9566 #CJK UNIFIED IDEOGRAPH
+ {0xE0F3, 0x50E8}, //9567 #CJK UNIFIED IDEOGRAPH
+ {0xE0F4, 0x50F3}, //9568 #CJK UNIFIED IDEOGRAPH
+ {0xE0F5, 0x50DB}, //9569 #CJK UNIFIED IDEOGRAPH
+ {0xE0F6, 0x50EA}, //9570 #CJK UNIFIED IDEOGRAPH
+ {0xE0F7, 0x50DD}, //9571 #CJK UNIFIED IDEOGRAPH
+ {0xE0F8, 0x50E4}, //9572 #CJK UNIFIED IDEOGRAPH
+ {0xE0F9, 0x50D3}, //9573 #CJK UNIFIED IDEOGRAPH
+ {0xE0FA, 0x50EC}, //9574 #CJK UNIFIED IDEOGRAPH
+ {0xE0FB, 0x50F0}, //9575 #CJK UNIFIED IDEOGRAPH
+ {0xE0FC, 0x50EF}, //9576 #CJK UNIFIED IDEOGRAPH
+ {0xE0FD, 0x50E3}, //9577 #CJK UNIFIED IDEOGRAPH
+ {0xE0FE, 0x50E0}, //9578 #CJK UNIFIED IDEOGRAPH
+ {0xE140, 0x51D8}, //9579 #CJK UNIFIED IDEOGRAPH
+ {0xE141, 0x5280}, //9580 #CJK UNIFIED IDEOGRAPH
+ {0xE142, 0x5281}, //9581 #CJK UNIFIED IDEOGRAPH
+ {0xE143, 0x52E9}, //9582 #CJK UNIFIED IDEOGRAPH
+ {0xE144, 0x52EB}, //9583 #CJK UNIFIED IDEOGRAPH
+ {0xE145, 0x5330}, //9584 #CJK UNIFIED IDEOGRAPH
+ {0xE146, 0x53AC}, //9585 #CJK UNIFIED IDEOGRAPH
+ {0xE147, 0x5627}, //9586 #CJK UNIFIED IDEOGRAPH
+ {0xE148, 0x5615}, //9587 #CJK UNIFIED IDEOGRAPH
+ {0xE149, 0x560C}, //9588 #CJK UNIFIED IDEOGRAPH
+ {0xE14A, 0x5612}, //9589 #CJK UNIFIED IDEOGRAPH
+ {0xE14B, 0x55FC}, //9590 #CJK UNIFIED IDEOGRAPH
+ {0xE14C, 0x560F}, //9591 #CJK UNIFIED IDEOGRAPH
+ {0xE14D, 0x561C}, //9592 #CJK UNIFIED IDEOGRAPH
+ {0xE14E, 0x5601}, //9593 #CJK UNIFIED IDEOGRAPH
+ {0xE14F, 0x5613}, //9594 #CJK UNIFIED IDEOGRAPH
+ {0xE150, 0x5602}, //9595 #CJK UNIFIED IDEOGRAPH
+ {0xE151, 0x55FA}, //9596 #CJK UNIFIED IDEOGRAPH
+ {0xE152, 0x561D}, //9597 #CJK UNIFIED IDEOGRAPH
+ {0xE153, 0x5604}, //9598 #CJK UNIFIED IDEOGRAPH
+ {0xE154, 0x55FF}, //9599 #CJK UNIFIED IDEOGRAPH
+ {0xE155, 0x55F9}, //9600 #CJK UNIFIED IDEOGRAPH
+ {0xE156, 0x5889}, //9601 #CJK UNIFIED IDEOGRAPH
+ {0xE157, 0x587C}, //9602 #CJK UNIFIED IDEOGRAPH
+ {0xE158, 0x5890}, //9603 #CJK UNIFIED IDEOGRAPH
+ {0xE159, 0x5898}, //9604 #CJK UNIFIED IDEOGRAPH
+ {0xE15A, 0x5886}, //9605 #CJK UNIFIED IDEOGRAPH
+ {0xE15B, 0x5881}, //9606 #CJK UNIFIED IDEOGRAPH
+ {0xE15C, 0x587F}, //9607 #CJK UNIFIED IDEOGRAPH
+ {0xE15D, 0x5874}, //9608 #CJK UNIFIED IDEOGRAPH
+ {0xE15E, 0x588B}, //9609 #CJK UNIFIED IDEOGRAPH
+ {0xE15F, 0x587A}, //9610 #CJK UNIFIED IDEOGRAPH
+ {0xE160, 0x5887}, //9611 #CJK UNIFIED IDEOGRAPH
+ {0xE161, 0x5891}, //9612 #CJK UNIFIED IDEOGRAPH
+ {0xE162, 0x588E}, //9613 #CJK UNIFIED IDEOGRAPH
+ {0xE163, 0x5876}, //9614 #CJK UNIFIED IDEOGRAPH
+ {0xE164, 0x5882}, //9615 #CJK UNIFIED IDEOGRAPH
+ {0xE165, 0x5888}, //9616 #CJK UNIFIED IDEOGRAPH
+ {0xE166, 0x587B}, //9617 #CJK UNIFIED IDEOGRAPH
+ {0xE167, 0x5894}, //9618 #CJK UNIFIED IDEOGRAPH
+ {0xE168, 0x588F}, //9619 #CJK UNIFIED IDEOGRAPH
+ {0xE169, 0x58FE}, //9620 #CJK UNIFIED IDEOGRAPH
+ {0xE16A, 0x596B}, //9621 #CJK UNIFIED IDEOGRAPH
+ {0xE16B, 0x5ADC}, //9622 #CJK UNIFIED IDEOGRAPH
+ {0xE16C, 0x5AEE}, //9623 #CJK UNIFIED IDEOGRAPH
+ {0xE16D, 0x5AE5}, //9624 #CJK UNIFIED IDEOGRAPH
+ {0xE16E, 0x5AD5}, //9625 #CJK UNIFIED IDEOGRAPH
+ {0xE16F, 0x5AEA}, //9626 #CJK UNIFIED IDEOGRAPH
+ {0xE170, 0x5ADA}, //9627 #CJK UNIFIED IDEOGRAPH
+ {0xE171, 0x5AED}, //9628 #CJK UNIFIED IDEOGRAPH
+ {0xE172, 0x5AEB}, //9629 #CJK UNIFIED IDEOGRAPH
+ {0xE173, 0x5AF3}, //9630 #CJK UNIFIED IDEOGRAPH
+ {0xE174, 0x5AE2}, //9631 #CJK UNIFIED IDEOGRAPH
+ {0xE175, 0x5AE0}, //9632 #CJK UNIFIED IDEOGRAPH
+ {0xE176, 0x5ADB}, //9633 #CJK UNIFIED IDEOGRAPH
+ {0xE177, 0x5AEC}, //9634 #CJK UNIFIED IDEOGRAPH
+ {0xE178, 0x5ADE}, //9635 #CJK UNIFIED IDEOGRAPH
+ {0xE179, 0x5ADD}, //9636 #CJK UNIFIED IDEOGRAPH
+ {0xE17A, 0x5AD9}, //9637 #CJK UNIFIED IDEOGRAPH
+ {0xE17B, 0x5AE8}, //9638 #CJK UNIFIED IDEOGRAPH
+ {0xE17C, 0x5ADF}, //9639 #CJK UNIFIED IDEOGRAPH
+ {0xE17D, 0x5B77}, //9640 #CJK UNIFIED IDEOGRAPH
+ {0xE17E, 0x5BE0}, //9641 #CJK UNIFIED IDEOGRAPH
+ {0xE1A1, 0x5BE3}, //9642 #CJK UNIFIED IDEOGRAPH
+ {0xE1A2, 0x5C63}, //9643 #CJK UNIFIED IDEOGRAPH
+ {0xE1A3, 0x5D82}, //9644 #CJK UNIFIED IDEOGRAPH
+ {0xE1A4, 0x5D80}, //9645 #CJK UNIFIED IDEOGRAPH
+ {0xE1A5, 0x5D7D}, //9646 #CJK UNIFIED IDEOGRAPH
+ {0xE1A6, 0x5D86}, //9647 #CJK UNIFIED IDEOGRAPH
+ {0xE1A7, 0x5D7A}, //9648 #CJK UNIFIED IDEOGRAPH
+ {0xE1A8, 0x5D81}, //9649 #CJK UNIFIED IDEOGRAPH
+ {0xE1A9, 0x5D77}, //9650 #CJK UNIFIED IDEOGRAPH
+ {0xE1AA, 0x5D8A}, //9651 #CJK UNIFIED IDEOGRAPH
+ {0xE1AB, 0x5D89}, //9652 #CJK UNIFIED IDEOGRAPH
+ {0xE1AC, 0x5D88}, //9653 #CJK UNIFIED IDEOGRAPH
+ {0xE1AD, 0x5D7E}, //9654 #CJK UNIFIED IDEOGRAPH
+ {0xE1AE, 0x5D7C}, //9655 #CJK UNIFIED IDEOGRAPH
+ {0xE1AF, 0x5D8D}, //9656 #CJK UNIFIED IDEOGRAPH
+ {0xE1B0, 0x5D79}, //9657 #CJK UNIFIED IDEOGRAPH
+ {0xE1B1, 0x5D7F}, //9658 #CJK UNIFIED IDEOGRAPH
+ {0xE1B2, 0x5E58}, //9659 #CJK UNIFIED IDEOGRAPH
+ {0xE1B3, 0x5E59}, //9660 #CJK UNIFIED IDEOGRAPH
+ {0xE1B4, 0x5E53}, //9661 #CJK UNIFIED IDEOGRAPH
+ {0xE1B5, 0x5ED8}, //9662 #CJK UNIFIED IDEOGRAPH
+ {0xE1B6, 0x5ED1}, //9663 #CJK UNIFIED IDEOGRAPH
+ {0xE1B7, 0x5ED7}, //9664 #CJK UNIFIED IDEOGRAPH
+ {0xE1B8, 0x5ECE}, //9665 #CJK UNIFIED IDEOGRAPH
+ {0xE1B9, 0x5EDC}, //9666 #CJK UNIFIED IDEOGRAPH
+ {0xE1BA, 0x5ED5}, //9667 #CJK UNIFIED IDEOGRAPH
+ {0xE1BB, 0x5ED9}, //9668 #CJK UNIFIED IDEOGRAPH
+ {0xE1BC, 0x5ED2}, //9669 #CJK UNIFIED IDEOGRAPH
+ {0xE1BD, 0x5ED4}, //9670 #CJK UNIFIED IDEOGRAPH
+ {0xE1BE, 0x5F44}, //9671 #CJK UNIFIED IDEOGRAPH
+ {0xE1BF, 0x5F43}, //9672 #CJK UNIFIED IDEOGRAPH
+ {0xE1C0, 0x5F6F}, //9673 #CJK UNIFIED IDEOGRAPH
+ {0xE1C1, 0x5FB6}, //9674 #CJK UNIFIED IDEOGRAPH
+ {0xE1C2, 0x612C}, //9675 #CJK UNIFIED IDEOGRAPH
+ {0xE1C3, 0x6128}, //9676 #CJK UNIFIED IDEOGRAPH
+ {0xE1C4, 0x6141}, //9677 #CJK UNIFIED IDEOGRAPH
+ {0xE1C5, 0x615E}, //9678 #CJK UNIFIED IDEOGRAPH
+ {0xE1C6, 0x6171}, //9679 #CJK UNIFIED IDEOGRAPH
+ {0xE1C7, 0x6173}, //9680 #CJK UNIFIED IDEOGRAPH
+ {0xE1C8, 0x6152}, //9681 #CJK UNIFIED IDEOGRAPH
+ {0xE1C9, 0x6153}, //9682 #CJK UNIFIED IDEOGRAPH
+ {0xE1CA, 0x6172}, //9683 #CJK UNIFIED IDEOGRAPH
+ {0xE1CB, 0x616C}, //9684 #CJK UNIFIED IDEOGRAPH
+ {0xE1CC, 0x6180}, //9685 #CJK UNIFIED IDEOGRAPH
+ {0xE1CD, 0x6174}, //9686 #CJK UNIFIED IDEOGRAPH
+ {0xE1CE, 0x6154}, //9687 #CJK UNIFIED IDEOGRAPH
+ {0xE1CF, 0x617A}, //9688 #CJK UNIFIED IDEOGRAPH
+ {0xE1D0, 0x615B}, //9689 #CJK UNIFIED IDEOGRAPH
+ {0xE1D1, 0x6165}, //9690 #CJK UNIFIED IDEOGRAPH
+ {0xE1D2, 0x613B}, //9691 #CJK UNIFIED IDEOGRAPH
+ {0xE1D3, 0x616A}, //9692 #CJK UNIFIED IDEOGRAPH
+ {0xE1D4, 0x6161}, //9693 #CJK UNIFIED IDEOGRAPH
+ {0xE1D5, 0x6156}, //9694 #CJK UNIFIED IDEOGRAPH
+ {0xE1D6, 0x6229}, //9695 #CJK UNIFIED IDEOGRAPH
+ {0xE1D7, 0x6227}, //9696 #CJK UNIFIED IDEOGRAPH
+ {0xE1D8, 0x622B}, //9697 #CJK UNIFIED IDEOGRAPH
+ {0xE1D9, 0x642B}, //9698 #CJK UNIFIED IDEOGRAPH
+ {0xE1DA, 0x644D}, //9699 #CJK UNIFIED IDEOGRAPH
+ {0xE1DB, 0x645B}, //9700 #CJK UNIFIED IDEOGRAPH
+ {0xE1DC, 0x645D}, //9701 #CJK UNIFIED IDEOGRAPH
+ {0xE1DD, 0x6474}, //9702 #CJK UNIFIED IDEOGRAPH
+ {0xE1DE, 0x6476}, //9703 #CJK UNIFIED IDEOGRAPH
+ {0xE1DF, 0x6472}, //9704 #CJK UNIFIED IDEOGRAPH
+ {0xE1E0, 0x6473}, //9705 #CJK UNIFIED IDEOGRAPH
+ {0xE1E1, 0x647D}, //9706 #CJK UNIFIED IDEOGRAPH
+ {0xE1E2, 0x6475}, //9707 #CJK UNIFIED IDEOGRAPH
+ {0xE1E3, 0x6466}, //9708 #CJK UNIFIED IDEOGRAPH
+ {0xE1E4, 0x64A6}, //9709 #CJK UNIFIED IDEOGRAPH
+ {0xE1E5, 0x644E}, //9710 #CJK UNIFIED IDEOGRAPH
+ {0xE1E6, 0x6482}, //9711 #CJK UNIFIED IDEOGRAPH
+ {0xE1E7, 0x645E}, //9712 #CJK UNIFIED IDEOGRAPH
+ {0xE1E8, 0x645C}, //9713 #CJK UNIFIED IDEOGRAPH
+ {0xE1E9, 0x644B}, //9714 #CJK UNIFIED IDEOGRAPH
+ {0xE1EA, 0x6453}, //9715 #CJK UNIFIED IDEOGRAPH
+ {0xE1EB, 0x6460}, //9716 #CJK UNIFIED IDEOGRAPH
+ {0xE1EC, 0x6450}, //9717 #CJK UNIFIED IDEOGRAPH
+ {0xE1ED, 0x647F}, //9718 #CJK UNIFIED IDEOGRAPH
+ {0xE1EE, 0x643F}, //9719 #CJK UNIFIED IDEOGRAPH
+ {0xE1EF, 0x646C}, //9720 #CJK UNIFIED IDEOGRAPH
+ {0xE1F0, 0x646B}, //9721 #CJK UNIFIED IDEOGRAPH
+ {0xE1F1, 0x6459}, //9722 #CJK UNIFIED IDEOGRAPH
+ {0xE1F2, 0x6465}, //9723 #CJK UNIFIED IDEOGRAPH
+ {0xE1F3, 0x6477}, //9724 #CJK UNIFIED IDEOGRAPH
+ {0xE1F4, 0x6573}, //9725 #CJK UNIFIED IDEOGRAPH
+ {0xE1F5, 0x65A0}, //9726 #CJK UNIFIED IDEOGRAPH
+ {0xE1F6, 0x66A1}, //9727 #CJK UNIFIED IDEOGRAPH
+ {0xE1F7, 0x66A0}, //9728 #CJK UNIFIED IDEOGRAPH
+ {0xE1F8, 0x669F}, //9729 #CJK UNIFIED IDEOGRAPH
+ {0xE1F9, 0x6705}, //9730 #CJK UNIFIED IDEOGRAPH
+ {0xE1FA, 0x6704}, //9731 #CJK UNIFIED IDEOGRAPH
+ {0xE1FB, 0x6722}, //9732 #CJK UNIFIED IDEOGRAPH
+ {0xE1FC, 0x69B1}, //9733 #CJK UNIFIED IDEOGRAPH
+ {0xE1FD, 0x69B6}, //9734 #CJK UNIFIED IDEOGRAPH
+ {0xE1FE, 0x69C9}, //9735 #CJK UNIFIED IDEOGRAPH
+ {0xE240, 0x69A0}, //9736 #CJK UNIFIED IDEOGRAPH
+ {0xE241, 0x69CE}, //9737 #CJK UNIFIED IDEOGRAPH
+ {0xE242, 0x6996}, //9738 #CJK UNIFIED IDEOGRAPH
+ {0xE243, 0x69B0}, //9739 #CJK UNIFIED IDEOGRAPH
+ {0xE244, 0x69AC}, //9740 #CJK UNIFIED IDEOGRAPH
+ {0xE245, 0x69BC}, //9741 #CJK UNIFIED IDEOGRAPH
+ {0xE246, 0x6991}, //9742 #CJK UNIFIED IDEOGRAPH
+ {0xE247, 0x6999}, //9743 #CJK UNIFIED IDEOGRAPH
+ {0xE248, 0x698E}, //9744 #CJK UNIFIED IDEOGRAPH
+ {0xE249, 0x69A7}, //9745 #CJK UNIFIED IDEOGRAPH
+ {0xE24A, 0x698D}, //9746 #CJK UNIFIED IDEOGRAPH
+ {0xE24B, 0x69A9}, //9747 #CJK UNIFIED IDEOGRAPH
+ {0xE24C, 0x69BE}, //9748 #CJK UNIFIED IDEOGRAPH
+ {0xE24D, 0x69AF}, //9749 #CJK UNIFIED IDEOGRAPH
+ {0xE24E, 0x69BF}, //9750 #CJK UNIFIED IDEOGRAPH
+ {0xE24F, 0x69C4}, //9751 #CJK UNIFIED IDEOGRAPH
+ {0xE250, 0x69BD}, //9752 #CJK UNIFIED IDEOGRAPH
+ {0xE251, 0x69A4}, //9753 #CJK UNIFIED IDEOGRAPH
+ {0xE252, 0x69D4}, //9754 #CJK UNIFIED IDEOGRAPH
+ {0xE253, 0x69B9}, //9755 #CJK UNIFIED IDEOGRAPH
+ {0xE254, 0x69CA}, //9756 #CJK UNIFIED IDEOGRAPH
+ {0xE255, 0x699A}, //9757 #CJK UNIFIED IDEOGRAPH
+ {0xE256, 0x69CF}, //9758 #CJK UNIFIED IDEOGRAPH
+ {0xE257, 0x69B3}, //9759 #CJK UNIFIED IDEOGRAPH
+ {0xE258, 0x6993}, //9760 #CJK UNIFIED IDEOGRAPH
+ {0xE259, 0x69AA}, //9761 #CJK UNIFIED IDEOGRAPH
+ {0xE25A, 0x69A1}, //9762 #CJK UNIFIED IDEOGRAPH
+ {0xE25B, 0x699E}, //9763 #CJK UNIFIED IDEOGRAPH
+ {0xE25C, 0x69D9}, //9764 #CJK UNIFIED IDEOGRAPH
+ {0xE25D, 0x6997}, //9765 #CJK UNIFIED IDEOGRAPH
+ {0xE25E, 0x6990}, //9766 #CJK UNIFIED IDEOGRAPH
+ {0xE25F, 0x69C2}, //9767 #CJK UNIFIED IDEOGRAPH
+ {0xE260, 0x69B5}, //9768 #CJK UNIFIED IDEOGRAPH
+ {0xE261, 0x69A5}, //9769 #CJK UNIFIED IDEOGRAPH
+ {0xE262, 0x69C6}, //9770 #CJK UNIFIED IDEOGRAPH
+ {0xE263, 0x6B4A}, //9771 #CJK UNIFIED IDEOGRAPH
+ {0xE264, 0x6B4D}, //9772 #CJK UNIFIED IDEOGRAPH
+ {0xE265, 0x6B4B}, //9773 #CJK UNIFIED IDEOGRAPH
+ {0xE266, 0x6B9E}, //9774 #CJK UNIFIED IDEOGRAPH
+ {0xE267, 0x6B9F}, //9775 #CJK UNIFIED IDEOGRAPH
+ {0xE268, 0x6BA0}, //9776 #CJK UNIFIED IDEOGRAPH
+ {0xE269, 0x6BC3}, //9777 #CJK UNIFIED IDEOGRAPH
+ {0xE26A, 0x6BC4}, //9778 #CJK UNIFIED IDEOGRAPH
+ {0xE26B, 0x6BFE}, //9779 #CJK UNIFIED IDEOGRAPH
+ {0xE26C, 0x6ECE}, //9780 #CJK UNIFIED IDEOGRAPH
+ {0xE26D, 0x6EF5}, //9781 #CJK UNIFIED IDEOGRAPH
+ {0xE26E, 0x6EF1}, //9782 #CJK UNIFIED IDEOGRAPH
+ {0xE26F, 0x6F03}, //9783 #CJK UNIFIED IDEOGRAPH
+ {0xE270, 0x6F25}, //9784 #CJK UNIFIED IDEOGRAPH
+ {0xE271, 0x6EF8}, //9785 #CJK UNIFIED IDEOGRAPH
+ {0xE272, 0x6F37}, //9786 #CJK UNIFIED IDEOGRAPH
+ {0xE273, 0x6EFB}, //9787 #CJK UNIFIED IDEOGRAPH
+ {0xE274, 0x6F2E}, //9788 #CJK UNIFIED IDEOGRAPH
+ {0xE275, 0x6F09}, //9789 #CJK UNIFIED IDEOGRAPH
+ {0xE276, 0x6F4E}, //9790 #CJK UNIFIED IDEOGRAPH
+ {0xE277, 0x6F19}, //9791 #CJK UNIFIED IDEOGRAPH
+ {0xE278, 0x6F1A}, //9792 #CJK UNIFIED IDEOGRAPH
+ {0xE279, 0x6F27}, //9793 #CJK UNIFIED IDEOGRAPH
+ {0xE27A, 0x6F18}, //9794 #CJK UNIFIED IDEOGRAPH
+ {0xE27B, 0x6F3B}, //9795 #CJK UNIFIED IDEOGRAPH
+ {0xE27C, 0x6F12}, //9796 #CJK UNIFIED IDEOGRAPH
+ {0xE27D, 0x6EED}, //9797 #CJK UNIFIED IDEOGRAPH
+ {0xE27E, 0x6F0A}, //9798 #CJK UNIFIED IDEOGRAPH
+ {0xE2A1, 0x6F36}, //9799 #CJK UNIFIED IDEOGRAPH
+ {0xE2A2, 0x6F73}, //9800 #CJK UNIFIED IDEOGRAPH
+ {0xE2A3, 0x6EF9}, //9801 #CJK UNIFIED IDEOGRAPH
+ {0xE2A4, 0x6EEE}, //9802 #CJK UNIFIED IDEOGRAPH
+ {0xE2A5, 0x6F2D}, //9803 #CJK UNIFIED IDEOGRAPH
+ {0xE2A6, 0x6F40}, //9804 #CJK UNIFIED IDEOGRAPH
+ {0xE2A7, 0x6F30}, //9805 #CJK UNIFIED IDEOGRAPH
+ {0xE2A8, 0x6F3C}, //9806 #CJK UNIFIED IDEOGRAPH
+ {0xE2A9, 0x6F35}, //9807 #CJK UNIFIED IDEOGRAPH
+ {0xE2AA, 0x6EEB}, //9808 #CJK UNIFIED IDEOGRAPH
+ {0xE2AB, 0x6F07}, //9809 #CJK UNIFIED IDEOGRAPH
+ {0xE2AC, 0x6F0E}, //9810 #CJK UNIFIED IDEOGRAPH
+ {0xE2AD, 0x6F43}, //9811 #CJK UNIFIED IDEOGRAPH
+ {0xE2AE, 0x6F05}, //9812 #CJK UNIFIED IDEOGRAPH
+ {0xE2AF, 0x6EFD}, //9813 #CJK UNIFIED IDEOGRAPH
+ {0xE2B0, 0x6EF6}, //9814 #CJK UNIFIED IDEOGRAPH
+ {0xE2B1, 0x6F39}, //9815 #CJK UNIFIED IDEOGRAPH
+ {0xE2B2, 0x6F1C}, //9816 #CJK UNIFIED IDEOGRAPH
+ {0xE2B3, 0x6EFC}, //9817 #CJK UNIFIED IDEOGRAPH
+ {0xE2B4, 0x6F3A}, //9818 #CJK UNIFIED IDEOGRAPH
+ {0xE2B5, 0x6F1F}, //9819 #CJK UNIFIED IDEOGRAPH
+ {0xE2B6, 0x6F0D}, //9820 #CJK UNIFIED IDEOGRAPH
+ {0xE2B7, 0x6F1E}, //9821 #CJK UNIFIED IDEOGRAPH
+ {0xE2B8, 0x6F08}, //9822 #CJK UNIFIED IDEOGRAPH
+ {0xE2B9, 0x6F21}, //9823 #CJK UNIFIED IDEOGRAPH
+ {0xE2BA, 0x7187}, //9824 #CJK UNIFIED IDEOGRAPH
+ {0xE2BB, 0x7190}, //9825 #CJK UNIFIED IDEOGRAPH
+ {0xE2BC, 0x7189}, //9826 #CJK UNIFIED IDEOGRAPH
+ {0xE2BD, 0x7180}, //9827 #CJK UNIFIED IDEOGRAPH
+ {0xE2BE, 0x7185}, //9828 #CJK UNIFIED IDEOGRAPH
+ {0xE2BF, 0x7182}, //9829 #CJK UNIFIED IDEOGRAPH
+ {0xE2C0, 0x718F}, //9830 #CJK UNIFIED IDEOGRAPH
+ {0xE2C1, 0x717B}, //9831 #CJK UNIFIED IDEOGRAPH
+ {0xE2C2, 0x7186}, //9832 #CJK UNIFIED IDEOGRAPH
+ {0xE2C3, 0x7181}, //9833 #CJK UNIFIED IDEOGRAPH
+ {0xE2C4, 0x7197}, //9834 #CJK UNIFIED IDEOGRAPH
+ {0xE2C5, 0x7244}, //9835 #CJK UNIFIED IDEOGRAPH
+ {0xE2C6, 0x7253}, //9836 #CJK UNIFIED IDEOGRAPH
+ {0xE2C7, 0x7297}, //9837 #CJK UNIFIED IDEOGRAPH
+ {0xE2C8, 0x7295}, //9838 #CJK UNIFIED IDEOGRAPH
+ {0xE2C9, 0x7293}, //9839 #CJK UNIFIED IDEOGRAPH
+ {0xE2CA, 0x7343}, //9840 #CJK UNIFIED IDEOGRAPH
+ {0xE2CB, 0x734D}, //9841 #CJK UNIFIED IDEOGRAPH
+ {0xE2CC, 0x7351}, //9842 #CJK UNIFIED IDEOGRAPH
+ {0xE2CD, 0x734C}, //9843 #CJK UNIFIED IDEOGRAPH
+ {0xE2CE, 0x7462}, //9844 #CJK UNIFIED IDEOGRAPH
+ {0xE2CF, 0x7473}, //9845 #CJK UNIFIED IDEOGRAPH
+ {0xE2D0, 0x7471}, //9846 #CJK UNIFIED IDEOGRAPH
+ {0xE2D1, 0x7475}, //9847 #CJK UNIFIED IDEOGRAPH
+ {0xE2D2, 0x7472}, //9848 #CJK UNIFIED IDEOGRAPH
+ {0xE2D3, 0x7467}, //9849 #CJK UNIFIED IDEOGRAPH
+ {0xE2D4, 0x746E}, //9850 #CJK UNIFIED IDEOGRAPH
+ {0xE2D5, 0x7500}, //9851 #CJK UNIFIED IDEOGRAPH
+ {0xE2D6, 0x7502}, //9852 #CJK UNIFIED IDEOGRAPH
+ {0xE2D7, 0x7503}, //9853 #CJK UNIFIED IDEOGRAPH
+ {0xE2D8, 0x757D}, //9854 #CJK UNIFIED IDEOGRAPH
+ {0xE2D9, 0x7590}, //9855 #CJK UNIFIED IDEOGRAPH
+ {0xE2DA, 0x7616}, //9856 #CJK UNIFIED IDEOGRAPH
+ {0xE2DB, 0x7608}, //9857 #CJK UNIFIED IDEOGRAPH
+ {0xE2DC, 0x760C}, //9858 #CJK UNIFIED IDEOGRAPH
+ {0xE2DD, 0x7615}, //9859 #CJK UNIFIED IDEOGRAPH
+ {0xE2DE, 0x7611}, //9860 #CJK UNIFIED IDEOGRAPH
+ {0xE2DF, 0x760A}, //9861 #CJK UNIFIED IDEOGRAPH
+ {0xE2E0, 0x7614}, //9862 #CJK UNIFIED IDEOGRAPH
+ {0xE2E1, 0x76B8}, //9863 #CJK UNIFIED IDEOGRAPH
+ {0xE2E2, 0x7781}, //9864 #CJK UNIFIED IDEOGRAPH
+ {0xE2E3, 0x777C}, //9865 #CJK UNIFIED IDEOGRAPH
+ {0xE2E4, 0x7785}, //9866 #CJK UNIFIED IDEOGRAPH
+ {0xE2E5, 0x7782}, //9867 #CJK UNIFIED IDEOGRAPH
+ {0xE2E6, 0x776E}, //9868 #CJK UNIFIED IDEOGRAPH
+ {0xE2E7, 0x7780}, //9869 #CJK UNIFIED IDEOGRAPH
+ {0xE2E8, 0x776F}, //9870 #CJK UNIFIED IDEOGRAPH
+ {0xE2E9, 0x777E}, //9871 #CJK UNIFIED IDEOGRAPH
+ {0xE2EA, 0x7783}, //9872 #CJK UNIFIED IDEOGRAPH
+ {0xE2EB, 0x78B2}, //9873 #CJK UNIFIED IDEOGRAPH
+ {0xE2EC, 0x78AA}, //9874 #CJK UNIFIED IDEOGRAPH
+ {0xE2ED, 0x78B4}, //9875 #CJK UNIFIED IDEOGRAPH
+ {0xE2EE, 0x78AD}, //9876 #CJK UNIFIED IDEOGRAPH
+ {0xE2EF, 0x78A8}, //9877 #CJK UNIFIED IDEOGRAPH
+ {0xE2F0, 0x787E}, //9878 #CJK UNIFIED IDEOGRAPH
+ {0xE2F1, 0x78AB}, //9879 #CJK UNIFIED IDEOGRAPH
+ {0xE2F2, 0x789E}, //9880 #CJK UNIFIED IDEOGRAPH
+ {0xE2F3, 0x78A5}, //9881 #CJK UNIFIED IDEOGRAPH
+ {0xE2F4, 0x78A0}, //9882 #CJK UNIFIED IDEOGRAPH
+ {0xE2F5, 0x78AC}, //9883 #CJK UNIFIED IDEOGRAPH
+ {0xE2F6, 0x78A2}, //9884 #CJK UNIFIED IDEOGRAPH
+ {0xE2F7, 0x78A4}, //9885 #CJK UNIFIED IDEOGRAPH
+ {0xE2F8, 0x7998}, //9886 #CJK UNIFIED IDEOGRAPH
+ {0xE2F9, 0x798A}, //9887 #CJK UNIFIED IDEOGRAPH
+ {0xE2FA, 0x798B}, //9888 #CJK UNIFIED IDEOGRAPH
+ {0xE2FB, 0x7996}, //9889 #CJK UNIFIED IDEOGRAPH
+ {0xE2FC, 0x7995}, //9890 #CJK UNIFIED IDEOGRAPH
+ {0xE2FD, 0x7994}, //9891 #CJK UNIFIED IDEOGRAPH
+ {0xE2FE, 0x7993}, //9892 #CJK UNIFIED IDEOGRAPH
+ {0xE340, 0x7997}, //9893 #CJK UNIFIED IDEOGRAPH
+ {0xE341, 0x7988}, //9894 #CJK UNIFIED IDEOGRAPH
+ {0xE342, 0x7992}, //9895 #CJK UNIFIED IDEOGRAPH
+ {0xE343, 0x7990}, //9896 #CJK UNIFIED IDEOGRAPH
+ {0xE344, 0x7A2B}, //9897 #CJK UNIFIED IDEOGRAPH
+ {0xE345, 0x7A4A}, //9898 #CJK UNIFIED IDEOGRAPH
+ {0xE346, 0x7A30}, //9899 #CJK UNIFIED IDEOGRAPH
+ {0xE347, 0x7A2F}, //9900 #CJK UNIFIED IDEOGRAPH
+ {0xE348, 0x7A28}, //9901 #CJK UNIFIED IDEOGRAPH
+ {0xE349, 0x7A26}, //9902 #CJK UNIFIED IDEOGRAPH
+ {0xE34A, 0x7AA8}, //9903 #CJK UNIFIED IDEOGRAPH
+ {0xE34B, 0x7AAB}, //9904 #CJK UNIFIED IDEOGRAPH
+ {0xE34C, 0x7AAC}, //9905 #CJK UNIFIED IDEOGRAPH
+ {0xE34D, 0x7AEE}, //9906 #CJK UNIFIED IDEOGRAPH
+ {0xE34E, 0x7B88}, //9907 #CJK UNIFIED IDEOGRAPH
+ {0xE34F, 0x7B9C}, //9908 #CJK UNIFIED IDEOGRAPH
+ {0xE350, 0x7B8A}, //9909 #CJK UNIFIED IDEOGRAPH
+ {0xE351, 0x7B91}, //9910 #CJK UNIFIED IDEOGRAPH
+ {0xE352, 0x7B90}, //9911 #CJK UNIFIED IDEOGRAPH
+ {0xE353, 0x7B96}, //9912 #CJK UNIFIED IDEOGRAPH
+ {0xE354, 0x7B8D}, //9913 #CJK UNIFIED IDEOGRAPH
+ {0xE355, 0x7B8C}, //9914 #CJK UNIFIED IDEOGRAPH
+ {0xE356, 0x7B9B}, //9915 #CJK UNIFIED IDEOGRAPH
+ {0xE357, 0x7B8E}, //9916 #CJK UNIFIED IDEOGRAPH
+ {0xE358, 0x7B85}, //9917 #CJK UNIFIED IDEOGRAPH
+ {0xE359, 0x7B98}, //9918 #CJK UNIFIED IDEOGRAPH
+ {0xE35A, 0x5284}, //9919 #CJK UNIFIED IDEOGRAPH
+ {0xE35B, 0x7B99}, //9920 #CJK UNIFIED IDEOGRAPH
+ {0xE35C, 0x7BA4}, //9921 #CJK UNIFIED IDEOGRAPH
+ {0xE35D, 0x7B82}, //9922 #CJK UNIFIED IDEOGRAPH
+ {0xE35E, 0x7CBB}, //9923 #CJK UNIFIED IDEOGRAPH
+ {0xE35F, 0x7CBF}, //9924 #CJK UNIFIED IDEOGRAPH
+ {0xE360, 0x7CBC}, //9925 #CJK UNIFIED IDEOGRAPH
+ {0xE361, 0x7CBA}, //9926 #CJK UNIFIED IDEOGRAPH
+ {0xE362, 0x7DA7}, //9927 #CJK UNIFIED IDEOGRAPH
+ {0xE363, 0x7DB7}, //9928 #CJK UNIFIED IDEOGRAPH
+ {0xE364, 0x7DC2}, //9929 #CJK UNIFIED IDEOGRAPH
+ {0xE365, 0x7DA3}, //9930 #CJK UNIFIED IDEOGRAPH
+ {0xE366, 0x7DAA}, //9931 #CJK UNIFIED IDEOGRAPH
+ {0xE367, 0x7DC1}, //9932 #CJK UNIFIED IDEOGRAPH
+ {0xE368, 0x7DC0}, //9933 #CJK UNIFIED IDEOGRAPH
+ {0xE369, 0x7DC5}, //9934 #CJK UNIFIED IDEOGRAPH
+ {0xE36A, 0x7D9D}, //9935 #CJK UNIFIED IDEOGRAPH
+ {0xE36B, 0x7DCE}, //9936 #CJK UNIFIED IDEOGRAPH
+ {0xE36C, 0x7DC4}, //9937 #CJK UNIFIED IDEOGRAPH
+ {0xE36D, 0x7DC6}, //9938 #CJK UNIFIED IDEOGRAPH
+ {0xE36E, 0x7DCB}, //9939 #CJK UNIFIED IDEOGRAPH
+ {0xE36F, 0x7DCC}, //9940 #CJK UNIFIED IDEOGRAPH
+ {0xE370, 0x7DAF}, //9941 #CJK UNIFIED IDEOGRAPH
+ {0xE371, 0x7DB9}, //9942 #CJK UNIFIED IDEOGRAPH
+ {0xE372, 0x7D96}, //9943 #CJK UNIFIED IDEOGRAPH
+ {0xE373, 0x7DBC}, //9944 #CJK UNIFIED IDEOGRAPH
+ {0xE374, 0x7D9F}, //9945 #CJK UNIFIED IDEOGRAPH
+ {0xE375, 0x7DA6}, //9946 #CJK UNIFIED IDEOGRAPH
+ {0xE376, 0x7DAE}, //9947 #CJK UNIFIED IDEOGRAPH
+ {0xE377, 0x7DA9}, //9948 #CJK UNIFIED IDEOGRAPH
+ {0xE378, 0x7DA1}, //9949 #CJK UNIFIED IDEOGRAPH
+ {0xE379, 0x7DC9}, //9950 #CJK UNIFIED IDEOGRAPH
+ {0xE37A, 0x7F73}, //9951 #CJK UNIFIED IDEOGRAPH
+ {0xE37B, 0x7FE2}, //9952 #CJK UNIFIED IDEOGRAPH
+ {0xE37C, 0x7FE3}, //9953 #CJK UNIFIED IDEOGRAPH
+ {0xE37D, 0x7FE5}, //9954 #CJK UNIFIED IDEOGRAPH
+ {0xE37E, 0x7FDE}, //9955 #CJK UNIFIED IDEOGRAPH
+ {0xE3A1, 0x8024}, //9956 #CJK UNIFIED IDEOGRAPH
+ {0xE3A2, 0x805D}, //9957 #CJK UNIFIED IDEOGRAPH
+ {0xE3A3, 0x805C}, //9958 #CJK UNIFIED IDEOGRAPH
+ {0xE3A4, 0x8189}, //9959 #CJK UNIFIED IDEOGRAPH
+ {0xE3A5, 0x8186}, //9960 #CJK UNIFIED IDEOGRAPH
+ {0xE3A6, 0x8183}, //9961 #CJK UNIFIED IDEOGRAPH
+ {0xE3A7, 0x8187}, //9962 #CJK UNIFIED IDEOGRAPH
+ {0xE3A8, 0x818D}, //9963 #CJK UNIFIED IDEOGRAPH
+ {0xE3A9, 0x818C}, //9964 #CJK UNIFIED IDEOGRAPH
+ {0xE3AA, 0x818B}, //9965 #CJK UNIFIED IDEOGRAPH
+ {0xE3AB, 0x8215}, //9966 #CJK UNIFIED IDEOGRAPH
+ {0xE3AC, 0x8497}, //9967 #CJK UNIFIED IDEOGRAPH
+ {0xE3AD, 0x84A4}, //9968 #CJK UNIFIED IDEOGRAPH
+ {0xE3AE, 0x84A1}, //9969 #CJK UNIFIED IDEOGRAPH
+ {0xE3AF, 0x849F}, //9970 #CJK UNIFIED IDEOGRAPH
+ {0xE3B0, 0x84BA}, //9971 #CJK UNIFIED IDEOGRAPH
+ {0xE3B1, 0x84CE}, //9972 #CJK UNIFIED IDEOGRAPH
+ {0xE3B2, 0x84C2}, //9973 #CJK UNIFIED IDEOGRAPH
+ {0xE3B3, 0x84AC}, //9974 #CJK UNIFIED IDEOGRAPH
+ {0xE3B4, 0x84AE}, //9975 #CJK UNIFIED IDEOGRAPH
+ {0xE3B5, 0x84AB}, //9976 #CJK UNIFIED IDEOGRAPH
+ {0xE3B6, 0x84B9}, //9977 #CJK UNIFIED IDEOGRAPH
+ {0xE3B7, 0x84B4}, //9978 #CJK UNIFIED IDEOGRAPH
+ {0xE3B8, 0x84C1}, //9979 #CJK UNIFIED IDEOGRAPH
+ {0xE3B9, 0x84CD}, //9980 #CJK UNIFIED IDEOGRAPH
+ {0xE3BA, 0x84AA}, //9981 #CJK UNIFIED IDEOGRAPH
+ {0xE3BB, 0x849A}, //9982 #CJK UNIFIED IDEOGRAPH
+ {0xE3BC, 0x84B1}, //9983 #CJK UNIFIED IDEOGRAPH
+ {0xE3BD, 0x84D0}, //9984 #CJK UNIFIED IDEOGRAPH
+ {0xE3BE, 0x849D}, //9985 #CJK UNIFIED IDEOGRAPH
+ {0xE3BF, 0x84A7}, //9986 #CJK UNIFIED IDEOGRAPH
+ {0xE3C0, 0x84BB}, //9987 #CJK UNIFIED IDEOGRAPH
+ {0xE3C1, 0x84A2}, //9988 #CJK UNIFIED IDEOGRAPH
+ {0xE3C2, 0x8494}, //9989 #CJK UNIFIED IDEOGRAPH
+ {0xE3C3, 0x84C7}, //9990 #CJK UNIFIED IDEOGRAPH
+ {0xE3C4, 0x84CC}, //9991 #CJK UNIFIED IDEOGRAPH
+ {0xE3C5, 0x849B}, //9992 #CJK UNIFIED IDEOGRAPH
+ {0xE3C6, 0x84A9}, //9993 #CJK UNIFIED IDEOGRAPH
+ {0xE3C7, 0x84AF}, //9994 #CJK UNIFIED IDEOGRAPH
+ {0xE3C8, 0x84A8}, //9995 #CJK UNIFIED IDEOGRAPH
+ {0xE3C9, 0x84D6}, //9996 #CJK UNIFIED IDEOGRAPH
+ {0xE3CA, 0x8498}, //9997 #CJK UNIFIED IDEOGRAPH
+ {0xE3CB, 0x84B6}, //9998 #CJK UNIFIED IDEOGRAPH
+ {0xE3CC, 0x84CF}, //9999 #CJK UNIFIED IDEOGRAPH
+ {0xE3CD, 0x84A0}, //10000 #CJK UNIFIED IDEOGRAPH
+ {0xE3CE, 0x84D7}, //10001 #CJK UNIFIED IDEOGRAPH
+ {0xE3CF, 0x84D4}, //10002 #CJK UNIFIED IDEOGRAPH
+ {0xE3D0, 0x84D2}, //10003 #CJK UNIFIED IDEOGRAPH
+ {0xE3D1, 0x84DB}, //10004 #CJK UNIFIED IDEOGRAPH
+ {0xE3D2, 0x84B0}, //10005 #CJK UNIFIED IDEOGRAPH
+ {0xE3D3, 0x8491}, //10006 #CJK UNIFIED IDEOGRAPH
+ {0xE3D4, 0x8661}, //10007 #CJK UNIFIED IDEOGRAPH
+ {0xE3D5, 0x8733}, //10008 #CJK UNIFIED IDEOGRAPH
+ {0xE3D6, 0x8723}, //10009 #CJK UNIFIED IDEOGRAPH
+ {0xE3D7, 0x8728}, //10010 #CJK UNIFIED IDEOGRAPH
+ {0xE3D8, 0x876B}, //10011 #CJK UNIFIED IDEOGRAPH
+ {0xE3D9, 0x8740}, //10012 #CJK UNIFIED IDEOGRAPH
+ {0xE3DA, 0x872E}, //10013 #CJK UNIFIED IDEOGRAPH
+ {0xE3DB, 0x871E}, //10014 #CJK UNIFIED IDEOGRAPH
+ {0xE3DC, 0x8721}, //10015 #CJK UNIFIED IDEOGRAPH
+ {0xE3DD, 0x8719}, //10016 #CJK UNIFIED IDEOGRAPH
+ {0xE3DE, 0x871B}, //10017 #CJK UNIFIED IDEOGRAPH
+ {0xE3DF, 0x8743}, //10018 #CJK UNIFIED IDEOGRAPH
+ {0xE3E0, 0x872C}, //10019 #CJK UNIFIED IDEOGRAPH
+ {0xE3E1, 0x8741}, //10020 #CJK UNIFIED IDEOGRAPH
+ {0xE3E2, 0x873E}, //10021 #CJK UNIFIED IDEOGRAPH
+ {0xE3E3, 0x8746}, //10022 #CJK UNIFIED IDEOGRAPH
+ {0xE3E4, 0x8720}, //10023 #CJK UNIFIED IDEOGRAPH
+ {0xE3E5, 0x8732}, //10024 #CJK UNIFIED IDEOGRAPH
+ {0xE3E6, 0x872A}, //10025 #CJK UNIFIED IDEOGRAPH
+ {0xE3E7, 0x872D}, //10026 #CJK UNIFIED IDEOGRAPH
+ {0xE3E8, 0x873C}, //10027 #CJK UNIFIED IDEOGRAPH
+ {0xE3E9, 0x8712}, //10028 #CJK UNIFIED IDEOGRAPH
+ {0xE3EA, 0x873A}, //10029 #CJK UNIFIED IDEOGRAPH
+ {0xE3EB, 0x8731}, //10030 #CJK UNIFIED IDEOGRAPH
+ {0xE3EC, 0x8735}, //10031 #CJK UNIFIED IDEOGRAPH
+ {0xE3ED, 0x8742}, //10032 #CJK UNIFIED IDEOGRAPH
+ {0xE3EE, 0x8726}, //10033 #CJK UNIFIED IDEOGRAPH
+ {0xE3EF, 0x8727}, //10034 #CJK UNIFIED IDEOGRAPH
+ {0xE3F0, 0x8738}, //10035 #CJK UNIFIED IDEOGRAPH
+ {0xE3F1, 0x8724}, //10036 #CJK UNIFIED IDEOGRAPH
+ {0xE3F2, 0x871A}, //10037 #CJK UNIFIED IDEOGRAPH
+ {0xE3F3, 0x8730}, //10038 #CJK UNIFIED IDEOGRAPH
+ {0xE3F4, 0x8711}, //10039 #CJK UNIFIED IDEOGRAPH
+ {0xE3F5, 0x88F7}, //10040 #CJK UNIFIED IDEOGRAPH
+ {0xE3F6, 0x88E7}, //10041 #CJK UNIFIED IDEOGRAPH
+ {0xE3F7, 0x88F1}, //10042 #CJK UNIFIED IDEOGRAPH
+ {0xE3F8, 0x88F2}, //10043 #CJK UNIFIED IDEOGRAPH
+ {0xE3F9, 0x88FA}, //10044 #CJK UNIFIED IDEOGRAPH
+ {0xE3FA, 0x88FE}, //10045 #CJK UNIFIED IDEOGRAPH
+ {0xE3FB, 0x88EE}, //10046 #CJK UNIFIED IDEOGRAPH
+ {0xE3FC, 0x88FC}, //10047 #CJK UNIFIED IDEOGRAPH
+ {0xE3FD, 0x88F6}, //10048 #CJK UNIFIED IDEOGRAPH
+ {0xE3FE, 0x88FB}, //10049 #CJK UNIFIED IDEOGRAPH
+ {0xE440, 0x88F0}, //10050 #CJK UNIFIED IDEOGRAPH
+ {0xE441, 0x88EC}, //10051 #CJK UNIFIED IDEOGRAPH
+ {0xE442, 0x88EB}, //10052 #CJK UNIFIED IDEOGRAPH
+ {0xE443, 0x899D}, //10053 #CJK UNIFIED IDEOGRAPH
+ {0xE444, 0x89A1}, //10054 #CJK UNIFIED IDEOGRAPH
+ {0xE445, 0x899F}, //10055 #CJK UNIFIED IDEOGRAPH
+ {0xE446, 0x899E}, //10056 #CJK UNIFIED IDEOGRAPH
+ {0xE447, 0x89E9}, //10057 #CJK UNIFIED IDEOGRAPH
+ {0xE448, 0x89EB}, //10058 #CJK UNIFIED IDEOGRAPH
+ {0xE449, 0x89E8}, //10059 #CJK UNIFIED IDEOGRAPH
+ {0xE44A, 0x8AAB}, //10060 #CJK UNIFIED IDEOGRAPH
+ {0xE44B, 0x8A99}, //10061 #CJK UNIFIED IDEOGRAPH
+ {0xE44C, 0x8A8B}, //10062 #CJK UNIFIED IDEOGRAPH
+ {0xE44D, 0x8A92}, //10063 #CJK UNIFIED IDEOGRAPH
+ {0xE44E, 0x8A8F}, //10064 #CJK UNIFIED IDEOGRAPH
+ {0xE44F, 0x8A96}, //10065 #CJK UNIFIED IDEOGRAPH
+ {0xE450, 0x8C3D}, //10066 #CJK UNIFIED IDEOGRAPH
+ {0xE451, 0x8C68}, //10067 #CJK UNIFIED IDEOGRAPH
+ {0xE452, 0x8C69}, //10068 #CJK UNIFIED IDEOGRAPH
+ {0xE453, 0x8CD5}, //10069 #CJK UNIFIED IDEOGRAPH
+ {0xE454, 0x8CCF}, //10070 #CJK UNIFIED IDEOGRAPH
+ {0xE455, 0x8CD7}, //10071 #CJK UNIFIED IDEOGRAPH
+ {0xE456, 0x8D96}, //10072 #CJK UNIFIED IDEOGRAPH
+ {0xE457, 0x8E09}, //10073 #CJK UNIFIED IDEOGRAPH
+ {0xE458, 0x8E02}, //10074 #CJK UNIFIED IDEOGRAPH
+ {0xE459, 0x8DFF}, //10075 #CJK UNIFIED IDEOGRAPH
+ {0xE45A, 0x8E0D}, //10076 #CJK UNIFIED IDEOGRAPH
+ {0xE45B, 0x8DFD}, //10077 #CJK UNIFIED IDEOGRAPH
+ {0xE45C, 0x8E0A}, //10078 #CJK UNIFIED IDEOGRAPH
+ {0xE45D, 0x8E03}, //10079 #CJK UNIFIED IDEOGRAPH
+ {0xE45E, 0x8E07}, //10080 #CJK UNIFIED IDEOGRAPH
+ {0xE45F, 0x8E06}, //10081 #CJK UNIFIED IDEOGRAPH
+ {0xE460, 0x8E05}, //10082 #CJK UNIFIED IDEOGRAPH
+ {0xE461, 0x8DFE}, //10083 #CJK UNIFIED IDEOGRAPH
+ {0xE462, 0x8E00}, //10084 #CJK UNIFIED IDEOGRAPH
+ {0xE463, 0x8E04}, //10085 #CJK UNIFIED IDEOGRAPH
+ {0xE464, 0x8F10}, //10086 #CJK UNIFIED IDEOGRAPH
+ {0xE465, 0x8F11}, //10087 #CJK UNIFIED IDEOGRAPH
+ {0xE466, 0x8F0E}, //10088 #CJK UNIFIED IDEOGRAPH
+ {0xE467, 0x8F0D}, //10089 #CJK UNIFIED IDEOGRAPH
+ {0xE468, 0x9123}, //10090 #CJK UNIFIED IDEOGRAPH
+ {0xE469, 0x911C}, //10091 #CJK UNIFIED IDEOGRAPH
+ {0xE46A, 0x9120}, //10092 #CJK UNIFIED IDEOGRAPH
+ {0xE46B, 0x9122}, //10093 #CJK UNIFIED IDEOGRAPH
+ {0xE46C, 0x911F}, //10094 #CJK UNIFIED IDEOGRAPH
+ {0xE46D, 0x911D}, //10095 #CJK UNIFIED IDEOGRAPH
+ {0xE46E, 0x911A}, //10096 #CJK UNIFIED IDEOGRAPH
+ {0xE46F, 0x9124}, //10097 #CJK UNIFIED IDEOGRAPH
+ {0xE470, 0x9121}, //10098 #CJK UNIFIED IDEOGRAPH
+ {0xE471, 0x911B}, //10099 #CJK UNIFIED IDEOGRAPH
+ {0xE472, 0x917A}, //10100 #CJK UNIFIED IDEOGRAPH
+ {0xE473, 0x9172}, //10101 #CJK UNIFIED IDEOGRAPH
+ {0xE474, 0x9179}, //10102 #CJK UNIFIED IDEOGRAPH
+ {0xE475, 0x9173}, //10103 #CJK UNIFIED IDEOGRAPH
+ {0xE476, 0x92A5}, //10104 #CJK UNIFIED IDEOGRAPH
+ {0xE477, 0x92A4}, //10105 #CJK UNIFIED IDEOGRAPH
+ {0xE478, 0x9276}, //10106 #CJK UNIFIED IDEOGRAPH
+ {0xE479, 0x929B}, //10107 #CJK UNIFIED IDEOGRAPH
+ {0xE47A, 0x927A}, //10108 #CJK UNIFIED IDEOGRAPH
+ {0xE47B, 0x92A0}, //10109 #CJK UNIFIED IDEOGRAPH
+ {0xE47C, 0x9294}, //10110 #CJK UNIFIED IDEOGRAPH
+ {0xE47D, 0x92AA}, //10111 #CJK UNIFIED IDEOGRAPH
+ {0xE47E, 0x928D}, //10112 #CJK UNIFIED IDEOGRAPH
+ {0xE4A1, 0x92A6}, //10113 #CJK UNIFIED IDEOGRAPH
+ {0xE4A2, 0x929A}, //10114 #CJK UNIFIED IDEOGRAPH
+ {0xE4A3, 0x92AB}, //10115 #CJK UNIFIED IDEOGRAPH
+ {0xE4A4, 0x9279}, //10116 #CJK UNIFIED IDEOGRAPH
+ {0xE4A5, 0x9297}, //10117 #CJK UNIFIED IDEOGRAPH
+ {0xE4A6, 0x927F}, //10118 #CJK UNIFIED IDEOGRAPH
+ {0xE4A7, 0x92A3}, //10119 #CJK UNIFIED IDEOGRAPH
+ {0xE4A8, 0x92EE}, //10120 #CJK UNIFIED IDEOGRAPH
+ {0xE4A9, 0x928E}, //10121 #CJK UNIFIED IDEOGRAPH
+ {0xE4AA, 0x9282}, //10122 #CJK UNIFIED IDEOGRAPH
+ {0xE4AB, 0x9295}, //10123 #CJK UNIFIED IDEOGRAPH
+ {0xE4AC, 0x92A2}, //10124 #CJK UNIFIED IDEOGRAPH
+ {0xE4AD, 0x927D}, //10125 #CJK UNIFIED IDEOGRAPH
+ {0xE4AE, 0x9288}, //10126 #CJK UNIFIED IDEOGRAPH
+ {0xE4AF, 0x92A1}, //10127 #CJK UNIFIED IDEOGRAPH
+ {0xE4B0, 0x928A}, //10128 #CJK UNIFIED IDEOGRAPH
+ {0xE4B1, 0x9286}, //10129 #CJK UNIFIED IDEOGRAPH
+ {0xE4B2, 0x928C}, //10130 #CJK UNIFIED IDEOGRAPH
+ {0xE4B3, 0x9299}, //10131 #CJK UNIFIED IDEOGRAPH
+ {0xE4B4, 0x92A7}, //10132 #CJK UNIFIED IDEOGRAPH
+ {0xE4B5, 0x927E}, //10133 #CJK UNIFIED IDEOGRAPH
+ {0xE4B6, 0x9287}, //10134 #CJK UNIFIED IDEOGRAPH
+ {0xE4B7, 0x92A9}, //10135 #CJK UNIFIED IDEOGRAPH
+ {0xE4B8, 0x929D}, //10136 #CJK UNIFIED IDEOGRAPH
+ {0xE4B9, 0x928B}, //10137 #CJK UNIFIED IDEOGRAPH
+ {0xE4BA, 0x922D}, //10138 #CJK UNIFIED IDEOGRAPH
+ {0xE4BB, 0x969E}, //10139 #CJK UNIFIED IDEOGRAPH
+ {0xE4BC, 0x96A1}, //10140 #CJK UNIFIED IDEOGRAPH
+ {0xE4BD, 0x96FF}, //10141 #CJK UNIFIED IDEOGRAPH
+ {0xE4BE, 0x9758}, //10142 #CJK UNIFIED IDEOGRAPH
+ {0xE4BF, 0x977D}, //10143 #CJK UNIFIED IDEOGRAPH
+ {0xE4C0, 0x977A}, //10144 #CJK UNIFIED IDEOGRAPH
+ {0xE4C1, 0x977E}, //10145 #CJK UNIFIED IDEOGRAPH
+ {0xE4C2, 0x9783}, //10146 #CJK UNIFIED IDEOGRAPH
+ {0xE4C3, 0x9780}, //10147 #CJK UNIFIED IDEOGRAPH
+ {0xE4C4, 0x9782}, //10148 #CJK UNIFIED IDEOGRAPH
+ {0xE4C5, 0x977B}, //10149 #CJK UNIFIED IDEOGRAPH
+ {0xE4C6, 0x9784}, //10150 #CJK UNIFIED IDEOGRAPH
+ {0xE4C7, 0x9781}, //10151 #CJK UNIFIED IDEOGRAPH
+ {0xE4C8, 0x977F}, //10152 #CJK UNIFIED IDEOGRAPH
+ {0xE4C9, 0x97CE}, //10153 #CJK UNIFIED IDEOGRAPH
+ {0xE4CA, 0x97CD}, //10154 #CJK UNIFIED IDEOGRAPH
+ {0xE4CB, 0x9816}, //10155 #CJK UNIFIED IDEOGRAPH
+ {0xE4CC, 0x98AD}, //10156 #CJK UNIFIED IDEOGRAPH
+ {0xE4CD, 0x98AE}, //10157 #CJK UNIFIED IDEOGRAPH
+ {0xE4CE, 0x9902}, //10158 #CJK UNIFIED IDEOGRAPH
+ {0xE4CF, 0x9900}, //10159 #CJK UNIFIED IDEOGRAPH
+ {0xE4D0, 0x9907}, //10160 #CJK UNIFIED IDEOGRAPH
+ {0xE4D1, 0x999D}, //10161 #CJK UNIFIED IDEOGRAPH
+ {0xE4D2, 0x999C}, //10162 #CJK UNIFIED IDEOGRAPH
+ {0xE4D3, 0x99C3}, //10163 #CJK UNIFIED IDEOGRAPH
+ {0xE4D4, 0x99B9}, //10164 #CJK UNIFIED IDEOGRAPH
+ {0xE4D5, 0x99BB}, //10165 #CJK UNIFIED IDEOGRAPH
+ {0xE4D6, 0x99BA}, //10166 #CJK UNIFIED IDEOGRAPH
+ {0xE4D7, 0x99C2}, //10167 #CJK UNIFIED IDEOGRAPH
+ {0xE4D8, 0x99BD}, //10168 #CJK UNIFIED IDEOGRAPH
+ {0xE4D9, 0x99C7}, //10169 #CJK UNIFIED IDEOGRAPH
+ {0xE4DA, 0x9AB1}, //10170 #CJK UNIFIED IDEOGRAPH
+ {0xE4DB, 0x9AE3}, //10171 #CJK UNIFIED IDEOGRAPH
+ {0xE4DC, 0x9AE7}, //10172 #CJK UNIFIED IDEOGRAPH
+ {0xE4DD, 0x9B3E}, //10173 #CJK UNIFIED IDEOGRAPH
+ {0xE4DE, 0x9B3F}, //10174 #CJK UNIFIED IDEOGRAPH
+ {0xE4DF, 0x9B60}, //10175 #CJK UNIFIED IDEOGRAPH
+ {0xE4E0, 0x9B61}, //10176 #CJK UNIFIED IDEOGRAPH
+ {0xE4E1, 0x9B5F}, //10177 #CJK UNIFIED IDEOGRAPH
+ {0xE4E2, 0x9CF1}, //10178 #CJK UNIFIED IDEOGRAPH
+ {0xE4E3, 0x9CF2}, //10179 #CJK UNIFIED IDEOGRAPH
+ {0xE4E4, 0x9CF5}, //10180 #CJK UNIFIED IDEOGRAPH
+ {0xE4E5, 0x9EA7}, //10181 #CJK UNIFIED IDEOGRAPH
+ {0xE4E6, 0x50FF}, //10182 #CJK UNIFIED IDEOGRAPH
+ {0xE4E7, 0x5103}, //10183 #CJK UNIFIED IDEOGRAPH
+ {0xE4E8, 0x5130}, //10184 #CJK UNIFIED IDEOGRAPH
+ {0xE4E9, 0x50F8}, //10185 #CJK UNIFIED IDEOGRAPH
+ {0xE4EA, 0x5106}, //10186 #CJK UNIFIED IDEOGRAPH
+ {0xE4EB, 0x5107}, //10187 #CJK UNIFIED IDEOGRAPH
+ {0xE4EC, 0x50F6}, //10188 #CJK UNIFIED IDEOGRAPH
+ {0xE4ED, 0x50FE}, //10189 #CJK UNIFIED IDEOGRAPH
+ {0xE4EE, 0x510B}, //10190 #CJK UNIFIED IDEOGRAPH
+ {0xE4EF, 0x510C}, //10191 #CJK UNIFIED IDEOGRAPH
+ {0xE4F0, 0x50FD}, //10192 #CJK UNIFIED IDEOGRAPH
+ {0xE4F1, 0x510A}, //10193 #CJK UNIFIED IDEOGRAPH
+ {0xE4F2, 0x528B}, //10194 #CJK UNIFIED IDEOGRAPH
+ {0xE4F3, 0x528C}, //10195 #CJK UNIFIED IDEOGRAPH
+ {0xE4F4, 0x52F1}, //10196 #CJK UNIFIED IDEOGRAPH
+ {0xE4F5, 0x52EF}, //10197 #CJK UNIFIED IDEOGRAPH
+ {0xE4F6, 0x5648}, //10198 #CJK UNIFIED IDEOGRAPH
+ {0xE4F7, 0x5642}, //10199 #CJK UNIFIED IDEOGRAPH
+ {0xE4F8, 0x564C}, //10200 #CJK UNIFIED IDEOGRAPH
+ {0xE4F9, 0x5635}, //10201 #CJK UNIFIED IDEOGRAPH
+ {0xE4FA, 0x5641}, //10202 #CJK UNIFIED IDEOGRAPH
+ {0xE4FB, 0x564A}, //10203 #CJK UNIFIED IDEOGRAPH
+ {0xE4FC, 0x5649}, //10204 #CJK UNIFIED IDEOGRAPH
+ {0xE4FD, 0x5646}, //10205 #CJK UNIFIED IDEOGRAPH
+ {0xE4FE, 0x5658}, //10206 #CJK UNIFIED IDEOGRAPH
+ {0xE540, 0x565A}, //10207 #CJK UNIFIED IDEOGRAPH
+ {0xE541, 0x5640}, //10208 #CJK UNIFIED IDEOGRAPH
+ {0xE542, 0x5633}, //10209 #CJK UNIFIED IDEOGRAPH
+ {0xE543, 0x563D}, //10210 #CJK UNIFIED IDEOGRAPH
+ {0xE544, 0x562C}, //10211 #CJK UNIFIED IDEOGRAPH
+ {0xE545, 0x563E}, //10212 #CJK UNIFIED IDEOGRAPH
+ {0xE546, 0x5638}, //10213 #CJK UNIFIED IDEOGRAPH
+ {0xE547, 0x562A}, //10214 #CJK UNIFIED IDEOGRAPH
+ {0xE548, 0x563A}, //10215 #CJK UNIFIED IDEOGRAPH
+ {0xE549, 0x571A}, //10216 #CJK UNIFIED IDEOGRAPH
+ {0xE54A, 0x58AB}, //10217 #CJK UNIFIED IDEOGRAPH
+ {0xE54B, 0x589D}, //10218 #CJK UNIFIED IDEOGRAPH
+ {0xE54C, 0x58B1}, //10219 #CJK UNIFIED IDEOGRAPH
+ {0xE54D, 0x58A0}, //10220 #CJK UNIFIED IDEOGRAPH
+ {0xE54E, 0x58A3}, //10221 #CJK UNIFIED IDEOGRAPH
+ {0xE54F, 0x58AF}, //10222 #CJK UNIFIED IDEOGRAPH
+ {0xE550, 0x58AC}, //10223 #CJK UNIFIED IDEOGRAPH
+ {0xE551, 0x58A5}, //10224 #CJK UNIFIED IDEOGRAPH
+ {0xE552, 0x58A1}, //10225 #CJK UNIFIED IDEOGRAPH
+ {0xE553, 0x58FF}, //10226 #CJK UNIFIED IDEOGRAPH
+ {0xE554, 0x5AFF}, //10227 #CJK UNIFIED IDEOGRAPH
+ {0xE555, 0x5AF4}, //10228 #CJK UNIFIED IDEOGRAPH
+ {0xE556, 0x5AFD}, //10229 #CJK UNIFIED IDEOGRAPH
+ {0xE557, 0x5AF7}, //10230 #CJK UNIFIED IDEOGRAPH
+ {0xE558, 0x5AF6}, //10231 #CJK UNIFIED IDEOGRAPH
+ {0xE559, 0x5B03}, //10232 #CJK UNIFIED IDEOGRAPH
+ {0xE55A, 0x5AF8}, //10233 #CJK UNIFIED IDEOGRAPH
+ {0xE55B, 0x5B02}, //10234 #CJK UNIFIED IDEOGRAPH
+ {0xE55C, 0x5AF9}, //10235 #CJK UNIFIED IDEOGRAPH
+ {0xE55D, 0x5B01}, //10236 #CJK UNIFIED IDEOGRAPH
+ {0xE55E, 0x5B07}, //10237 #CJK UNIFIED IDEOGRAPH
+ {0xE55F, 0x5B05}, //10238 #CJK UNIFIED IDEOGRAPH
+ {0xE560, 0x5B0F}, //10239 #CJK UNIFIED IDEOGRAPH
+ {0xE561, 0x5C67}, //10240 #CJK UNIFIED IDEOGRAPH
+ {0xE562, 0x5D99}, //10241 #CJK UNIFIED IDEOGRAPH
+ {0xE563, 0x5D97}, //10242 #CJK UNIFIED IDEOGRAPH
+ {0xE564, 0x5D9F}, //10243 #CJK UNIFIED IDEOGRAPH
+ {0xE565, 0x5D92}, //10244 #CJK UNIFIED IDEOGRAPH
+ {0xE566, 0x5DA2}, //10245 #CJK UNIFIED IDEOGRAPH
+ {0xE567, 0x5D93}, //10246 #CJK UNIFIED IDEOGRAPH
+ {0xE568, 0x5D95}, //10247 #CJK UNIFIED IDEOGRAPH
+ {0xE569, 0x5DA0}, //10248 #CJK UNIFIED IDEOGRAPH
+ {0xE56A, 0x5D9C}, //10249 #CJK UNIFIED IDEOGRAPH
+ {0xE56B, 0x5DA1}, //10250 #CJK UNIFIED IDEOGRAPH
+ {0xE56C, 0x5D9A}, //10251 #CJK UNIFIED IDEOGRAPH
+ {0xE56D, 0x5D9E}, //10252 #CJK UNIFIED IDEOGRAPH
+ {0xE56E, 0x5E69}, //10253 #CJK UNIFIED IDEOGRAPH
+ {0xE56F, 0x5E5D}, //10254 #CJK UNIFIED IDEOGRAPH
+ {0xE570, 0x5E60}, //10255 #CJK UNIFIED IDEOGRAPH
+ {0xE571, 0x5E5C}, //10256 #CJK UNIFIED IDEOGRAPH
+ {0xE572, 0x7DF3}, //10257 #CJK UNIFIED IDEOGRAPH
+ {0xE573, 0x5EDB}, //10258 #CJK UNIFIED IDEOGRAPH
+ {0xE574, 0x5EDE}, //10259 #CJK UNIFIED IDEOGRAPH
+ {0xE575, 0x5EE1}, //10260 #CJK UNIFIED IDEOGRAPH
+ {0xE576, 0x5F49}, //10261 #CJK UNIFIED IDEOGRAPH
+ {0xE577, 0x5FB2}, //10262 #CJK UNIFIED IDEOGRAPH
+ {0xE578, 0x618B}, //10263 #CJK UNIFIED IDEOGRAPH
+ {0xE579, 0x6183}, //10264 #CJK UNIFIED IDEOGRAPH
+ {0xE57A, 0x6179}, //10265 #CJK UNIFIED IDEOGRAPH
+ {0xE57B, 0x61B1}, //10266 #CJK UNIFIED IDEOGRAPH
+ {0xE57C, 0x61B0}, //10267 #CJK UNIFIED IDEOGRAPH
+ {0xE57D, 0x61A2}, //10268 #CJK UNIFIED IDEOGRAPH
+ {0xE57E, 0x6189}, //10269 #CJK UNIFIED IDEOGRAPH
+ {0xE5A1, 0x619B}, //10270 #CJK UNIFIED IDEOGRAPH
+ {0xE5A2, 0x6193}, //10271 #CJK UNIFIED IDEOGRAPH
+ {0xE5A3, 0x61AF}, //10272 #CJK UNIFIED IDEOGRAPH
+ {0xE5A4, 0x61AD}, //10273 #CJK UNIFIED IDEOGRAPH
+ {0xE5A5, 0x619F}, //10274 #CJK UNIFIED IDEOGRAPH
+ {0xE5A6, 0x6192}, //10275 #CJK UNIFIED IDEOGRAPH
+ {0xE5A7, 0x61AA}, //10276 #CJK UNIFIED IDEOGRAPH
+ {0xE5A8, 0x61A1}, //10277 #CJK UNIFIED IDEOGRAPH
+ {0xE5A9, 0x618D}, //10278 #CJK UNIFIED IDEOGRAPH
+ {0xE5AA, 0x6166}, //10279 #CJK UNIFIED IDEOGRAPH
+ {0xE5AB, 0x61B3}, //10280 #CJK UNIFIED IDEOGRAPH
+ {0xE5AC, 0x622D}, //10281 #CJK UNIFIED IDEOGRAPH
+ {0xE5AD, 0x646E}, //10282 #CJK UNIFIED IDEOGRAPH
+ {0xE5AE, 0x6470}, //10283 #CJK UNIFIED IDEOGRAPH
+ {0xE5AF, 0x6496}, //10284 #CJK UNIFIED IDEOGRAPH
+ {0xE5B0, 0x64A0}, //10285 #CJK UNIFIED IDEOGRAPH
+ {0xE5B1, 0x6485}, //10286 #CJK UNIFIED IDEOGRAPH
+ {0xE5B2, 0x6497}, //10287 #CJK UNIFIED IDEOGRAPH
+ {0xE5B3, 0x649C}, //10288 #CJK UNIFIED IDEOGRAPH
+ {0xE5B4, 0x648F}, //10289 #CJK UNIFIED IDEOGRAPH
+ {0xE5B5, 0x648B}, //10290 #CJK UNIFIED IDEOGRAPH
+ {0xE5B6, 0x648A}, //10291 #CJK UNIFIED IDEOGRAPH
+ {0xE5B7, 0x648C}, //10292 #CJK UNIFIED IDEOGRAPH
+ {0xE5B8, 0x64A3}, //10293 #CJK UNIFIED IDEOGRAPH
+ {0xE5B9, 0x649F}, //10294 #CJK UNIFIED IDEOGRAPH
+ {0xE5BA, 0x6468}, //10295 #CJK UNIFIED IDEOGRAPH
+ {0xE5BB, 0x64B1}, //10296 #CJK UNIFIED IDEOGRAPH
+ {0xE5BC, 0x6498}, //10297 #CJK UNIFIED IDEOGRAPH
+ {0xE5BD, 0x6576}, //10298 #CJK UNIFIED IDEOGRAPH
+ {0xE5BE, 0x657A}, //10299 #CJK UNIFIED IDEOGRAPH
+ {0xE5BF, 0x6579}, //10300 #CJK UNIFIED IDEOGRAPH
+ {0xE5C0, 0x657B}, //10301 #CJK UNIFIED IDEOGRAPH
+ {0xE5C1, 0x65B2}, //10302 #CJK UNIFIED IDEOGRAPH
+ {0xE5C2, 0x65B3}, //10303 #CJK UNIFIED IDEOGRAPH
+ {0xE5C3, 0x66B5}, //10304 #CJK UNIFIED IDEOGRAPH
+ {0xE5C4, 0x66B0}, //10305 #CJK UNIFIED IDEOGRAPH
+ {0xE5C5, 0x66A9}, //10306 #CJK UNIFIED IDEOGRAPH
+ {0xE5C6, 0x66B2}, //10307 #CJK UNIFIED IDEOGRAPH
+ {0xE5C7, 0x66B7}, //10308 #CJK UNIFIED IDEOGRAPH
+ {0xE5C8, 0x66AA}, //10309 #CJK UNIFIED IDEOGRAPH
+ {0xE5C9, 0x66AF}, //10310 #CJK UNIFIED IDEOGRAPH
+ {0xE5CA, 0x6A00}, //10311 #CJK UNIFIED IDEOGRAPH
+ {0xE5CB, 0x6A06}, //10312 #CJK UNIFIED IDEOGRAPH
+ {0xE5CC, 0x6A17}, //10313 #CJK UNIFIED IDEOGRAPH
+ {0xE5CD, 0x69E5}, //10314 #CJK UNIFIED IDEOGRAPH
+ {0xE5CE, 0x69F8}, //10315 #CJK UNIFIED IDEOGRAPH
+ {0xE5CF, 0x6A15}, //10316 #CJK UNIFIED IDEOGRAPH
+ {0xE5D0, 0x69F1}, //10317 #CJK UNIFIED IDEOGRAPH
+ {0xE5D1, 0x69E4}, //10318 #CJK UNIFIED IDEOGRAPH
+ {0xE5D2, 0x6A20}, //10319 #CJK UNIFIED IDEOGRAPH
+ {0xE5D3, 0x69FF}, //10320 #CJK UNIFIED IDEOGRAPH
+ {0xE5D4, 0x69EC}, //10321 #CJK UNIFIED IDEOGRAPH
+ {0xE5D5, 0x69E2}, //10322 #CJK UNIFIED IDEOGRAPH
+ {0xE5D6, 0x6A1B}, //10323 #CJK UNIFIED IDEOGRAPH
+ {0xE5D7, 0x6A1D}, //10324 #CJK UNIFIED IDEOGRAPH
+ {0xE5D8, 0x69FE}, //10325 #CJK UNIFIED IDEOGRAPH
+ {0xE5D9, 0x6A27}, //10326 #CJK UNIFIED IDEOGRAPH
+ {0xE5DA, 0x69F2}, //10327 #CJK UNIFIED IDEOGRAPH
+ {0xE5DB, 0x69EE}, //10328 #CJK UNIFIED IDEOGRAPH
+ {0xE5DC, 0x6A14}, //10329 #CJK UNIFIED IDEOGRAPH
+ {0xE5DD, 0x69F7}, //10330 #CJK UNIFIED IDEOGRAPH
+ {0xE5DE, 0x69E7}, //10331 #CJK UNIFIED IDEOGRAPH
+ {0xE5DF, 0x6A40}, //10332 #CJK UNIFIED IDEOGRAPH
+ {0xE5E0, 0x6A08}, //10333 #CJK UNIFIED IDEOGRAPH
+ {0xE5E1, 0x69E6}, //10334 #CJK UNIFIED IDEOGRAPH
+ {0xE5E2, 0x69FB}, //10335 #CJK UNIFIED IDEOGRAPH
+ {0xE5E3, 0x6A0D}, //10336 #CJK UNIFIED IDEOGRAPH
+ {0xE5E4, 0x69FC}, //10337 #CJK UNIFIED IDEOGRAPH
+ {0xE5E5, 0x69EB}, //10338 #CJK UNIFIED IDEOGRAPH
+ {0xE5E6, 0x6A09}, //10339 #CJK UNIFIED IDEOGRAPH
+ {0xE5E7, 0x6A04}, //10340 #CJK UNIFIED IDEOGRAPH
+ {0xE5E8, 0x6A18}, //10341 #CJK UNIFIED IDEOGRAPH
+ {0xE5E9, 0x6A25}, //10342 #CJK UNIFIED IDEOGRAPH
+ {0xE5EA, 0x6A0F}, //10343 #CJK UNIFIED IDEOGRAPH
+ {0xE5EB, 0x69F6}, //10344 #CJK UNIFIED IDEOGRAPH
+ {0xE5EC, 0x6A26}, //10345 #CJK UNIFIED IDEOGRAPH
+ {0xE5ED, 0x6A07}, //10346 #CJK UNIFIED IDEOGRAPH
+ {0xE5EE, 0x69F4}, //10347 #CJK UNIFIED IDEOGRAPH
+ {0xE5EF, 0x6A16}, //10348 #CJK UNIFIED IDEOGRAPH
+ {0xE5F0, 0x6B51}, //10349 #CJK UNIFIED IDEOGRAPH
+ {0xE5F1, 0x6BA5}, //10350 #CJK UNIFIED IDEOGRAPH
+ {0xE5F2, 0x6BA3}, //10351 #CJK UNIFIED IDEOGRAPH
+ {0xE5F3, 0x6BA2}, //10352 #CJK UNIFIED IDEOGRAPH
+ {0xE5F4, 0x6BA6}, //10353 #CJK UNIFIED IDEOGRAPH
+ {0xE5F5, 0x6C01}, //10354 #CJK UNIFIED IDEOGRAPH
+ {0xE5F6, 0x6C00}, //10355 #CJK UNIFIED IDEOGRAPH
+ {0xE5F7, 0x6BFF}, //10356 #CJK UNIFIED IDEOGRAPH
+ {0xE5F8, 0x6C02}, //10357 #CJK UNIFIED IDEOGRAPH
+ {0xE5F9, 0x6F41}, //10358 #CJK UNIFIED IDEOGRAPH
+ {0xE5FA, 0x6F26}, //10359 #CJK UNIFIED IDEOGRAPH
+ {0xE5FB, 0x6F7E}, //10360 #CJK UNIFIED IDEOGRAPH
+ {0xE5FC, 0x6F87}, //10361 #CJK UNIFIED IDEOGRAPH
+ {0xE5FD, 0x6FC6}, //10362 #CJK UNIFIED IDEOGRAPH
+ {0xE5FE, 0x6F92}, //10363 #CJK UNIFIED IDEOGRAPH
+ {0xE640, 0x6F8D}, //10364 #CJK UNIFIED IDEOGRAPH
+ {0xE641, 0x6F89}, //10365 #CJK UNIFIED IDEOGRAPH
+ {0xE642, 0x6F8C}, //10366 #CJK UNIFIED IDEOGRAPH
+ {0xE643, 0x6F62}, //10367 #CJK UNIFIED IDEOGRAPH
+ {0xE644, 0x6F4F}, //10368 #CJK UNIFIED IDEOGRAPH
+ {0xE645, 0x6F85}, //10369 #CJK UNIFIED IDEOGRAPH
+ {0xE646, 0x6F5A}, //10370 #CJK UNIFIED IDEOGRAPH
+ {0xE647, 0x6F96}, //10371 #CJK UNIFIED IDEOGRAPH
+ {0xE648, 0x6F76}, //10372 #CJK UNIFIED IDEOGRAPH
+ {0xE649, 0x6F6C}, //10373 #CJK UNIFIED IDEOGRAPH
+ {0xE64A, 0x6F82}, //10374 #CJK UNIFIED IDEOGRAPH
+ {0xE64B, 0x6F55}, //10375 #CJK UNIFIED IDEOGRAPH
+ {0xE64C, 0x6F72}, //10376 #CJK UNIFIED IDEOGRAPH
+ {0xE64D, 0x6F52}, //10377 #CJK UNIFIED IDEOGRAPH
+ {0xE64E, 0x6F50}, //10378 #CJK UNIFIED IDEOGRAPH
+ {0xE64F, 0x6F57}, //10379 #CJK UNIFIED IDEOGRAPH
+ {0xE650, 0x6F94}, //10380 #CJK UNIFIED IDEOGRAPH
+ {0xE651, 0x6F93}, //10381 #CJK UNIFIED IDEOGRAPH
+ {0xE652, 0x6F5D}, //10382 #CJK UNIFIED IDEOGRAPH
+ {0xE653, 0x6F00}, //10383 #CJK UNIFIED IDEOGRAPH
+ {0xE654, 0x6F61}, //10384 #CJK UNIFIED IDEOGRAPH
+ {0xE655, 0x6F6B}, //10385 #CJK UNIFIED IDEOGRAPH
+ {0xE656, 0x6F7D}, //10386 #CJK UNIFIED IDEOGRAPH
+ {0xE657, 0x6F67}, //10387 #CJK UNIFIED IDEOGRAPH
+ {0xE658, 0x6F90}, //10388 #CJK UNIFIED IDEOGRAPH
+ {0xE659, 0x6F53}, //10389 #CJK UNIFIED IDEOGRAPH
+ {0xE65A, 0x6F8B}, //10390 #CJK UNIFIED IDEOGRAPH
+ {0xE65B, 0x6F69}, //10391 #CJK UNIFIED IDEOGRAPH
+ {0xE65C, 0x6F7F}, //10392 #CJK UNIFIED IDEOGRAPH
+ {0xE65D, 0x6F95}, //10393 #CJK UNIFIED IDEOGRAPH
+ {0xE65E, 0x6F63}, //10394 #CJK UNIFIED IDEOGRAPH
+ {0xE65F, 0x6F77}, //10395 #CJK UNIFIED IDEOGRAPH
+ {0xE660, 0x6F6A}, //10396 #CJK UNIFIED IDEOGRAPH
+ {0xE661, 0x6F7B}, //10397 #CJK UNIFIED IDEOGRAPH
+ {0xE662, 0x71B2}, //10398 #CJK UNIFIED IDEOGRAPH
+ {0xE663, 0x71AF}, //10399 #CJK UNIFIED IDEOGRAPH
+ {0xE664, 0x719B}, //10400 #CJK UNIFIED IDEOGRAPH
+ {0xE665, 0x71B0}, //10401 #CJK UNIFIED IDEOGRAPH
+ {0xE666, 0x71A0}, //10402 #CJK UNIFIED IDEOGRAPH
+ {0xE667, 0x719A}, //10403 #CJK UNIFIED IDEOGRAPH
+ {0xE668, 0x71A9}, //10404 #CJK UNIFIED IDEOGRAPH
+ {0xE669, 0x71B5}, //10405 #CJK UNIFIED IDEOGRAPH
+ {0xE66A, 0x719D}, //10406 #CJK UNIFIED IDEOGRAPH
+ {0xE66B, 0x71A5}, //10407 #CJK UNIFIED IDEOGRAPH
+ {0xE66C, 0x719E}, //10408 #CJK UNIFIED IDEOGRAPH
+ {0xE66D, 0x71A4}, //10409 #CJK UNIFIED IDEOGRAPH
+ {0xE66E, 0x71A1}, //10410 #CJK UNIFIED IDEOGRAPH
+ {0xE66F, 0x71AA}, //10411 #CJK UNIFIED IDEOGRAPH
+ {0xE670, 0x719C}, //10412 #CJK UNIFIED IDEOGRAPH
+ {0xE671, 0x71A7}, //10413 #CJK UNIFIED IDEOGRAPH
+ {0xE672, 0x71B3}, //10414 #CJK UNIFIED IDEOGRAPH
+ {0xE673, 0x7298}, //10415 #CJK UNIFIED IDEOGRAPH
+ {0xE674, 0x729A}, //10416 #CJK UNIFIED IDEOGRAPH
+ {0xE675, 0x7358}, //10417 #CJK UNIFIED IDEOGRAPH
+ {0xE676, 0x7352}, //10418 #CJK UNIFIED IDEOGRAPH
+ {0xE677, 0x735E}, //10419 #CJK UNIFIED IDEOGRAPH
+ {0xE678, 0x735F}, //10420 #CJK UNIFIED IDEOGRAPH
+ {0xE679, 0x7360}, //10421 #CJK UNIFIED IDEOGRAPH
+ {0xE67A, 0x735D}, //10422 #CJK UNIFIED IDEOGRAPH
+ {0xE67B, 0x735B}, //10423 #CJK UNIFIED IDEOGRAPH
+ {0xE67C, 0x7361}, //10424 #CJK UNIFIED IDEOGRAPH
+ {0xE67D, 0x735A}, //10425 #CJK UNIFIED IDEOGRAPH
+ {0xE67E, 0x7359}, //10426 #CJK UNIFIED IDEOGRAPH
+ {0xE6A1, 0x7362}, //10427 #CJK UNIFIED IDEOGRAPH
+ {0xE6A2, 0x7487}, //10428 #CJK UNIFIED IDEOGRAPH
+ {0xE6A3, 0x7489}, //10429 #CJK UNIFIED IDEOGRAPH
+ {0xE6A4, 0x748A}, //10430 #CJK UNIFIED IDEOGRAPH
+ {0xE6A5, 0x7486}, //10431 #CJK UNIFIED IDEOGRAPH
+ {0xE6A6, 0x7481}, //10432 #CJK UNIFIED IDEOGRAPH
+ {0xE6A7, 0x747D}, //10433 #CJK UNIFIED IDEOGRAPH
+ {0xE6A8, 0x7485}, //10434 #CJK UNIFIED IDEOGRAPH
+ {0xE6A9, 0x7488}, //10435 #CJK UNIFIED IDEOGRAPH
+ {0xE6AA, 0x747C}, //10436 #CJK UNIFIED IDEOGRAPH
+ {0xE6AB, 0x7479}, //10437 #CJK UNIFIED IDEOGRAPH
+ {0xE6AC, 0x7508}, //10438 #CJK UNIFIED IDEOGRAPH
+ {0xE6AD, 0x7507}, //10439 #CJK UNIFIED IDEOGRAPH
+ {0xE6AE, 0x757E}, //10440 #CJK UNIFIED IDEOGRAPH
+ {0xE6AF, 0x7625}, //10441 #CJK UNIFIED IDEOGRAPH
+ {0xE6B0, 0x761E}, //10442 #CJK UNIFIED IDEOGRAPH
+ {0xE6B1, 0x7619}, //10443 #CJK UNIFIED IDEOGRAPH
+ {0xE6B2, 0x761D}, //10444 #CJK UNIFIED IDEOGRAPH
+ {0xE6B3, 0x761C}, //10445 #CJK UNIFIED IDEOGRAPH
+ {0xE6B4, 0x7623}, //10446 #CJK UNIFIED IDEOGRAPH
+ {0xE6B5, 0x761A}, //10447 #CJK UNIFIED IDEOGRAPH
+ {0xE6B6, 0x7628}, //10448 #CJK UNIFIED IDEOGRAPH
+ {0xE6B7, 0x761B}, //10449 #CJK UNIFIED IDEOGRAPH
+ {0xE6B8, 0x769C}, //10450 #CJK UNIFIED IDEOGRAPH
+ {0xE6B9, 0x769D}, //10451 #CJK UNIFIED IDEOGRAPH
+ {0xE6BA, 0x769E}, //10452 #CJK UNIFIED IDEOGRAPH
+ {0xE6BB, 0x769B}, //10453 #CJK UNIFIED IDEOGRAPH
+ {0xE6BC, 0x778D}, //10454 #CJK UNIFIED IDEOGRAPH
+ {0xE6BD, 0x778F}, //10455 #CJK UNIFIED IDEOGRAPH
+ {0xE6BE, 0x7789}, //10456 #CJK UNIFIED IDEOGRAPH
+ {0xE6BF, 0x7788}, //10457 #CJK UNIFIED IDEOGRAPH
+ {0xE6C0, 0x78CD}, //10458 #CJK UNIFIED IDEOGRAPH
+ {0xE6C1, 0x78BB}, //10459 #CJK UNIFIED IDEOGRAPH
+ {0xE6C2, 0x78CF}, //10460 #CJK UNIFIED IDEOGRAPH
+ {0xE6C3, 0x78CC}, //10461 #CJK UNIFIED IDEOGRAPH
+ {0xE6C4, 0x78D1}, //10462 #CJK UNIFIED IDEOGRAPH
+ {0xE6C5, 0x78CE}, //10463 #CJK UNIFIED IDEOGRAPH
+ {0xE6C6, 0x78D4}, //10464 #CJK UNIFIED IDEOGRAPH
+ {0xE6C7, 0x78C8}, //10465 #CJK UNIFIED IDEOGRAPH
+ {0xE6C8, 0x78C3}, //10466 #CJK UNIFIED IDEOGRAPH
+ {0xE6C9, 0x78C4}, //10467 #CJK UNIFIED IDEOGRAPH
+ {0xE6CA, 0x78C9}, //10468 #CJK UNIFIED IDEOGRAPH
+ {0xE6CB, 0x799A}, //10469 #CJK UNIFIED IDEOGRAPH
+ {0xE6CC, 0x79A1}, //10470 #CJK UNIFIED IDEOGRAPH
+ {0xE6CD, 0x79A0}, //10471 #CJK UNIFIED IDEOGRAPH
+ {0xE6CE, 0x799C}, //10472 #CJK UNIFIED IDEOGRAPH
+ {0xE6CF, 0x79A2}, //10473 #CJK UNIFIED IDEOGRAPH
+ {0xE6D0, 0x799B}, //10474 #CJK UNIFIED IDEOGRAPH
+ {0xE6D1, 0x6B76}, //10475 #CJK UNIFIED IDEOGRAPH
+ {0xE6D2, 0x7A39}, //10476 #CJK UNIFIED IDEOGRAPH
+ {0xE6D3, 0x7AB2}, //10477 #CJK UNIFIED IDEOGRAPH
+ {0xE6D4, 0x7AB4}, //10478 #CJK UNIFIED IDEOGRAPH
+ {0xE6D5, 0x7AB3}, //10479 #CJK UNIFIED IDEOGRAPH
+ {0xE6D6, 0x7BB7}, //10480 #CJK UNIFIED IDEOGRAPH
+ {0xE6D7, 0x7BCB}, //10481 #CJK UNIFIED IDEOGRAPH
+ {0xE6D8, 0x7BBE}, //10482 #CJK UNIFIED IDEOGRAPH
+ {0xE6D9, 0x7BAC}, //10483 #CJK UNIFIED IDEOGRAPH
+ {0xE6DA, 0x7BCE}, //10484 #CJK UNIFIED IDEOGRAPH
+ {0xE6DB, 0x7BAF}, //10485 #CJK UNIFIED IDEOGRAPH
+ {0xE6DC, 0x7BB9}, //10486 #CJK UNIFIED IDEOGRAPH
+ {0xE6DD, 0x7BCA}, //10487 #CJK UNIFIED IDEOGRAPH
+ {0xE6DE, 0x7BB5}, //10488 #CJK UNIFIED IDEOGRAPH
+ {0xE6DF, 0x7CC5}, //10489 #CJK UNIFIED IDEOGRAPH
+ {0xE6E0, 0x7CC8}, //10490 #CJK UNIFIED IDEOGRAPH
+ {0xE6E1, 0x7CCC}, //10491 #CJK UNIFIED IDEOGRAPH
+ {0xE6E2, 0x7CCB}, //10492 #CJK UNIFIED IDEOGRAPH
+ {0xE6E3, 0x7DF7}, //10493 #CJK UNIFIED IDEOGRAPH
+ {0xE6E4, 0x7DDB}, //10494 #CJK UNIFIED IDEOGRAPH
+ {0xE6E5, 0x7DEA}, //10495 #CJK UNIFIED IDEOGRAPH
+ {0xE6E6, 0x7DE7}, //10496 #CJK UNIFIED IDEOGRAPH
+ {0xE6E7, 0x7DD7}, //10497 #CJK UNIFIED IDEOGRAPH
+ {0xE6E8, 0x7DE1}, //10498 #CJK UNIFIED IDEOGRAPH
+ {0xE6E9, 0x7E03}, //10499 #CJK UNIFIED IDEOGRAPH
+ {0xE6EA, 0x7DFA}, //10500 #CJK UNIFIED IDEOGRAPH
+ {0xE6EB, 0x7DE6}, //10501 #CJK UNIFIED IDEOGRAPH
+ {0xE6EC, 0x7DF6}, //10502 #CJK UNIFIED IDEOGRAPH
+ {0xE6ED, 0x7DF1}, //10503 #CJK UNIFIED IDEOGRAPH
+ {0xE6EE, 0x7DF0}, //10504 #CJK UNIFIED IDEOGRAPH
+ {0xE6EF, 0x7DEE}, //10505 #CJK UNIFIED IDEOGRAPH
+ {0xE6F0, 0x7DDF}, //10506 #CJK UNIFIED IDEOGRAPH
+ {0xE6F1, 0x7F76}, //10507 #CJK UNIFIED IDEOGRAPH
+ {0xE6F2, 0x7FAC}, //10508 #CJK UNIFIED IDEOGRAPH
+ {0xE6F3, 0x7FB0}, //10509 #CJK UNIFIED IDEOGRAPH
+ {0xE6F4, 0x7FAD}, //10510 #CJK UNIFIED IDEOGRAPH
+ {0xE6F5, 0x7FED}, //10511 #CJK UNIFIED IDEOGRAPH
+ {0xE6F6, 0x7FEB}, //10512 #CJK UNIFIED IDEOGRAPH
+ {0xE6F7, 0x7FEA}, //10513 #CJK UNIFIED IDEOGRAPH
+ {0xE6F8, 0x7FEC}, //10514 #CJK UNIFIED IDEOGRAPH
+ {0xE6F9, 0x7FE6}, //10515 #CJK UNIFIED IDEOGRAPH
+ {0xE6FA, 0x7FE8}, //10516 #CJK UNIFIED IDEOGRAPH
+ {0xE6FB, 0x8064}, //10517 #CJK UNIFIED IDEOGRAPH
+ {0xE6FC, 0x8067}, //10518 #CJK UNIFIED IDEOGRAPH
+ {0xE6FD, 0x81A3}, //10519 #CJK UNIFIED IDEOGRAPH
+ {0xE6FE, 0x819F}, //10520 #CJK UNIFIED IDEOGRAPH
+ {0xE740, 0x819E}, //10521 #CJK UNIFIED IDEOGRAPH
+ {0xE741, 0x8195}, //10522 #CJK UNIFIED IDEOGRAPH
+ {0xE742, 0x81A2}, //10523 #CJK UNIFIED IDEOGRAPH
+ {0xE743, 0x8199}, //10524 #CJK UNIFIED IDEOGRAPH
+ {0xE744, 0x8197}, //10525 #CJK UNIFIED IDEOGRAPH
+ {0xE745, 0x8216}, //10526 #CJK UNIFIED IDEOGRAPH
+ {0xE746, 0x824F}, //10527 #CJK UNIFIED IDEOGRAPH
+ {0xE747, 0x8253}, //10528 #CJK UNIFIED IDEOGRAPH
+ {0xE748, 0x8252}, //10529 #CJK UNIFIED IDEOGRAPH
+ {0xE749, 0x8250}, //10530 #CJK UNIFIED IDEOGRAPH
+ {0xE74A, 0x824E}, //10531 #CJK UNIFIED IDEOGRAPH
+ {0xE74B, 0x8251}, //10532 #CJK UNIFIED IDEOGRAPH
+ {0xE74C, 0x8524}, //10533 #CJK UNIFIED IDEOGRAPH
+ {0xE74D, 0x853B}, //10534 #CJK UNIFIED IDEOGRAPH
+ {0xE74E, 0x850F}, //10535 #CJK UNIFIED IDEOGRAPH
+ {0xE74F, 0x8500}, //10536 #CJK UNIFIED IDEOGRAPH
+ {0xE750, 0x8529}, //10537 #CJK UNIFIED IDEOGRAPH
+ {0xE751, 0x850E}, //10538 #CJK UNIFIED IDEOGRAPH
+ {0xE752, 0x8509}, //10539 #CJK UNIFIED IDEOGRAPH
+ {0xE753, 0x850D}, //10540 #CJK UNIFIED IDEOGRAPH
+ {0xE754, 0x851F}, //10541 #CJK UNIFIED IDEOGRAPH
+ {0xE755, 0x850A}, //10542 #CJK UNIFIED IDEOGRAPH
+ {0xE756, 0x8527}, //10543 #CJK UNIFIED IDEOGRAPH
+ {0xE757, 0x851C}, //10544 #CJK UNIFIED IDEOGRAPH
+ {0xE758, 0x84FB}, //10545 #CJK UNIFIED IDEOGRAPH
+ {0xE759, 0x852B}, //10546 #CJK UNIFIED IDEOGRAPH
+ {0xE75A, 0x84FA}, //10547 #CJK UNIFIED IDEOGRAPH
+ {0xE75B, 0x8508}, //10548 #CJK UNIFIED IDEOGRAPH
+ {0xE75C, 0x850C}, //10549 #CJK UNIFIED IDEOGRAPH
+ {0xE75D, 0x84F4}, //10550 #CJK UNIFIED IDEOGRAPH
+ {0xE75E, 0x852A}, //10551 #CJK UNIFIED IDEOGRAPH
+ {0xE75F, 0x84F2}, //10552 #CJK UNIFIED IDEOGRAPH
+ {0xE760, 0x8515}, //10553 #CJK UNIFIED IDEOGRAPH
+ {0xE761, 0x84F7}, //10554 #CJK UNIFIED IDEOGRAPH
+ {0xE762, 0x84EB}, //10555 #CJK UNIFIED IDEOGRAPH
+ {0xE763, 0x84F3}, //10556 #CJK UNIFIED IDEOGRAPH
+ {0xE764, 0x84FC}, //10557 #CJK UNIFIED IDEOGRAPH
+ {0xE765, 0x8512}, //10558 #CJK UNIFIED IDEOGRAPH
+ {0xE766, 0x84EA}, //10559 #CJK UNIFIED IDEOGRAPH
+ {0xE767, 0x84E9}, //10560 #CJK UNIFIED IDEOGRAPH
+ {0xE768, 0x8516}, //10561 #CJK UNIFIED IDEOGRAPH
+ {0xE769, 0x84FE}, //10562 #CJK UNIFIED IDEOGRAPH
+ {0xE76A, 0x8528}, //10563 #CJK UNIFIED IDEOGRAPH
+ {0xE76B, 0x851D}, //10564 #CJK UNIFIED IDEOGRAPH
+ {0xE76C, 0x852E}, //10565 #CJK UNIFIED IDEOGRAPH
+ {0xE76D, 0x8502}, //10566 #CJK UNIFIED IDEOGRAPH
+ {0xE76E, 0x84FD}, //10567 #CJK UNIFIED IDEOGRAPH
+ {0xE76F, 0x851E}, //10568 #CJK UNIFIED IDEOGRAPH
+ {0xE770, 0x84F6}, //10569 #CJK UNIFIED IDEOGRAPH
+ {0xE771, 0x8531}, //10570 #CJK UNIFIED IDEOGRAPH
+ {0xE772, 0x8526}, //10571 #CJK UNIFIED IDEOGRAPH
+ {0xE773, 0x84E7}, //10572 #CJK UNIFIED IDEOGRAPH
+ {0xE774, 0x84E8}, //10573 #CJK UNIFIED IDEOGRAPH
+ {0xE775, 0x84F0}, //10574 #CJK UNIFIED IDEOGRAPH
+ {0xE776, 0x84EF}, //10575 #CJK UNIFIED IDEOGRAPH
+ {0xE777, 0x84F9}, //10576 #CJK UNIFIED IDEOGRAPH
+ {0xE778, 0x8518}, //10577 #CJK UNIFIED IDEOGRAPH
+ {0xE779, 0x8520}, //10578 #CJK UNIFIED IDEOGRAPH
+ {0xE77A, 0x8530}, //10579 #CJK UNIFIED IDEOGRAPH
+ {0xE77B, 0x850B}, //10580 #CJK UNIFIED IDEOGRAPH
+ {0xE77C, 0x8519}, //10581 #CJK UNIFIED IDEOGRAPH
+ {0xE77D, 0x852F}, //10582 #CJK UNIFIED IDEOGRAPH
+ {0xE77E, 0x8662}, //10583 #CJK UNIFIED IDEOGRAPH
+ {0xE7A1, 0x8756}, //10584 #CJK UNIFIED IDEOGRAPH
+ {0xE7A2, 0x8763}, //10585 #CJK UNIFIED IDEOGRAPH
+ {0xE7A3, 0x8764}, //10586 #CJK UNIFIED IDEOGRAPH
+ {0xE7A4, 0x8777}, //10587 #CJK UNIFIED IDEOGRAPH
+ {0xE7A5, 0x87E1}, //10588 #CJK UNIFIED IDEOGRAPH
+ {0xE7A6, 0x8773}, //10589 #CJK UNIFIED IDEOGRAPH
+ {0xE7A7, 0x8758}, //10590 #CJK UNIFIED IDEOGRAPH
+ {0xE7A8, 0x8754}, //10591 #CJK UNIFIED IDEOGRAPH
+ {0xE7A9, 0x875B}, //10592 #CJK UNIFIED IDEOGRAPH
+ {0xE7AA, 0x8752}, //10593 #CJK UNIFIED IDEOGRAPH
+ {0xE7AB, 0x8761}, //10594 #CJK UNIFIED IDEOGRAPH
+ {0xE7AC, 0x875A}, //10595 #CJK UNIFIED IDEOGRAPH
+ {0xE7AD, 0x8751}, //10596 #CJK UNIFIED IDEOGRAPH
+ {0xE7AE, 0x875E}, //10597 #CJK UNIFIED IDEOGRAPH
+ {0xE7AF, 0x876D}, //10598 #CJK UNIFIED IDEOGRAPH
+ {0xE7B0, 0x876A}, //10599 #CJK UNIFIED IDEOGRAPH
+ {0xE7B1, 0x8750}, //10600 #CJK UNIFIED IDEOGRAPH
+ {0xE7B2, 0x874E}, //10601 #CJK UNIFIED IDEOGRAPH
+ {0xE7B3, 0x875F}, //10602 #CJK UNIFIED IDEOGRAPH
+ {0xE7B4, 0x875D}, //10603 #CJK UNIFIED IDEOGRAPH
+ {0xE7B5, 0x876F}, //10604 #CJK UNIFIED IDEOGRAPH
+ {0xE7B6, 0x876C}, //10605 #CJK UNIFIED IDEOGRAPH
+ {0xE7B7, 0x877A}, //10606 #CJK UNIFIED IDEOGRAPH
+ {0xE7B8, 0x876E}, //10607 #CJK UNIFIED IDEOGRAPH
+ {0xE7B9, 0x875C}, //10608 #CJK UNIFIED IDEOGRAPH
+ {0xE7BA, 0x8765}, //10609 #CJK UNIFIED IDEOGRAPH
+ {0xE7BB, 0x874F}, //10610 #CJK UNIFIED IDEOGRAPH
+ {0xE7BC, 0x877B}, //10611 #CJK UNIFIED IDEOGRAPH
+ {0xE7BD, 0x8775}, //10612 #CJK UNIFIED IDEOGRAPH
+ {0xE7BE, 0x8762}, //10613 #CJK UNIFIED IDEOGRAPH
+ {0xE7BF, 0x8767}, //10614 #CJK UNIFIED IDEOGRAPH
+ {0xE7C0, 0x8769}, //10615 #CJK UNIFIED IDEOGRAPH
+ {0xE7C1, 0x885A}, //10616 #CJK UNIFIED IDEOGRAPH
+ {0xE7C2, 0x8905}, //10617 #CJK UNIFIED IDEOGRAPH
+ {0xE7C3, 0x890C}, //10618 #CJK UNIFIED IDEOGRAPH
+ {0xE7C4, 0x8914}, //10619 #CJK UNIFIED IDEOGRAPH
+ {0xE7C5, 0x890B}, //10620 #CJK UNIFIED IDEOGRAPH
+ {0xE7C6, 0x8917}, //10621 #CJK UNIFIED IDEOGRAPH
+ {0xE7C7, 0x8918}, //10622 #CJK UNIFIED IDEOGRAPH
+ {0xE7C8, 0x8919}, //10623 #CJK UNIFIED IDEOGRAPH
+ {0xE7C9, 0x8906}, //10624 #CJK UNIFIED IDEOGRAPH
+ {0xE7CA, 0x8916}, //10625 #CJK UNIFIED IDEOGRAPH
+ {0xE7CB, 0x8911}, //10626 #CJK UNIFIED IDEOGRAPH
+ {0xE7CC, 0x890E}, //10627 #CJK UNIFIED IDEOGRAPH
+ {0xE7CD, 0x8909}, //10628 #CJK UNIFIED IDEOGRAPH
+ {0xE7CE, 0x89A2}, //10629 #CJK UNIFIED IDEOGRAPH
+ {0xE7CF, 0x89A4}, //10630 #CJK UNIFIED IDEOGRAPH
+ {0xE7D0, 0x89A3}, //10631 #CJK UNIFIED IDEOGRAPH
+ {0xE7D1, 0x89ED}, //10632 #CJK UNIFIED IDEOGRAPH
+ {0xE7D2, 0x89F0}, //10633 #CJK UNIFIED IDEOGRAPH
+ {0xE7D3, 0x89EC}, //10634 #CJK UNIFIED IDEOGRAPH
+ {0xE7D4, 0x8ACF}, //10635 #CJK UNIFIED IDEOGRAPH
+ {0xE7D5, 0x8AC6}, //10636 #CJK UNIFIED IDEOGRAPH
+ {0xE7D6, 0x8AB8}, //10637 #CJK UNIFIED IDEOGRAPH
+ {0xE7D7, 0x8AD3}, //10638 #CJK UNIFIED IDEOGRAPH
+ {0xE7D8, 0x8AD1}, //10639 #CJK UNIFIED IDEOGRAPH
+ {0xE7D9, 0x8AD4}, //10640 #CJK UNIFIED IDEOGRAPH
+ {0xE7DA, 0x8AD5}, //10641 #CJK UNIFIED IDEOGRAPH
+ {0xE7DB, 0x8ABB}, //10642 #CJK UNIFIED IDEOGRAPH
+ {0xE7DC, 0x8AD7}, //10643 #CJK UNIFIED IDEOGRAPH
+ {0xE7DD, 0x8ABE}, //10644 #CJK UNIFIED IDEOGRAPH
+ {0xE7DE, 0x8AC0}, //10645 #CJK UNIFIED IDEOGRAPH
+ {0xE7DF, 0x8AC5}, //10646 #CJK UNIFIED IDEOGRAPH
+ {0xE7E0, 0x8AD8}, //10647 #CJK UNIFIED IDEOGRAPH
+ {0xE7E1, 0x8AC3}, //10648 #CJK UNIFIED IDEOGRAPH
+ {0xE7E2, 0x8ABA}, //10649 #CJK UNIFIED IDEOGRAPH
+ {0xE7E3, 0x8ABD}, //10650 #CJK UNIFIED IDEOGRAPH
+ {0xE7E4, 0x8AD9}, //10651 #CJK UNIFIED IDEOGRAPH
+ {0xE7E5, 0x8C3E}, //10652 #CJK UNIFIED IDEOGRAPH
+ {0xE7E6, 0x8C4D}, //10653 #CJK UNIFIED IDEOGRAPH
+ {0xE7E7, 0x8C8F}, //10654 #CJK UNIFIED IDEOGRAPH
+ {0xE7E8, 0x8CE5}, //10655 #CJK UNIFIED IDEOGRAPH
+ {0xE7E9, 0x8CDF}, //10656 #CJK UNIFIED IDEOGRAPH
+ {0xE7EA, 0x8CD9}, //10657 #CJK UNIFIED IDEOGRAPH
+ {0xE7EB, 0x8CE8}, //10658 #CJK UNIFIED IDEOGRAPH
+ {0xE7EC, 0x8CDA}, //10659 #CJK UNIFIED IDEOGRAPH
+ {0xE7ED, 0x8CDD}, //10660 #CJK UNIFIED IDEOGRAPH
+ {0xE7EE, 0x8CE7}, //10661 #CJK UNIFIED IDEOGRAPH
+ {0xE7EF, 0x8DA0}, //10662 #CJK UNIFIED IDEOGRAPH
+ {0xE7F0, 0x8D9C}, //10663 #CJK UNIFIED IDEOGRAPH
+ {0xE7F1, 0x8DA1}, //10664 #CJK UNIFIED IDEOGRAPH
+ {0xE7F2, 0x8D9B}, //10665 #CJK UNIFIED IDEOGRAPH
+ {0xE7F3, 0x8E20}, //10666 #CJK UNIFIED IDEOGRAPH
+ {0xE7F4, 0x8E23}, //10667 #CJK UNIFIED IDEOGRAPH
+ {0xE7F5, 0x8E25}, //10668 #CJK UNIFIED IDEOGRAPH
+ {0xE7F6, 0x8E24}, //10669 #CJK UNIFIED IDEOGRAPH
+ {0xE7F7, 0x8E2E}, //10670 #CJK UNIFIED IDEOGRAPH
+ {0xE7F8, 0x8E15}, //10671 #CJK UNIFIED IDEOGRAPH
+ {0xE7F9, 0x8E1B}, //10672 #CJK UNIFIED IDEOGRAPH
+ {0xE7FA, 0x8E16}, //10673 #CJK UNIFIED IDEOGRAPH
+ {0xE7FB, 0x8E11}, //10674 #CJK UNIFIED IDEOGRAPH
+ {0xE7FC, 0x8E19}, //10675 #CJK UNIFIED IDEOGRAPH
+ {0xE7FD, 0x8E26}, //10676 #CJK UNIFIED IDEOGRAPH
+ {0xE7FE, 0x8E27}, //10677 #CJK UNIFIED IDEOGRAPH
+ {0xE840, 0x8E14}, //10678 #CJK UNIFIED IDEOGRAPH
+ {0xE841, 0x8E12}, //10679 #CJK UNIFIED IDEOGRAPH
+ {0xE842, 0x8E18}, //10680 #CJK UNIFIED IDEOGRAPH
+ {0xE843, 0x8E13}, //10681 #CJK UNIFIED IDEOGRAPH
+ {0xE844, 0x8E1C}, //10682 #CJK UNIFIED IDEOGRAPH
+ {0xE845, 0x8E17}, //10683 #CJK UNIFIED IDEOGRAPH
+ {0xE846, 0x8E1A}, //10684 #CJK UNIFIED IDEOGRAPH
+ {0xE847, 0x8F2C}, //10685 #CJK UNIFIED IDEOGRAPH
+ {0xE848, 0x8F24}, //10686 #CJK UNIFIED IDEOGRAPH
+ {0xE849, 0x8F18}, //10687 #CJK UNIFIED IDEOGRAPH
+ {0xE84A, 0x8F1A}, //10688 #CJK UNIFIED IDEOGRAPH
+ {0xE84B, 0x8F20}, //10689 #CJK UNIFIED IDEOGRAPH
+ {0xE84C, 0x8F23}, //10690 #CJK UNIFIED IDEOGRAPH
+ {0xE84D, 0x8F16}, //10691 #CJK UNIFIED IDEOGRAPH
+ {0xE84E, 0x8F17}, //10692 #CJK UNIFIED IDEOGRAPH
+ {0xE84F, 0x9073}, //10693 #CJK UNIFIED IDEOGRAPH
+ {0xE850, 0x9070}, //10694 #CJK UNIFIED IDEOGRAPH
+ {0xE851, 0x906F}, //10695 #CJK UNIFIED IDEOGRAPH
+ {0xE852, 0x9067}, //10696 #CJK UNIFIED IDEOGRAPH
+ {0xE853, 0x906B}, //10697 #CJK UNIFIED IDEOGRAPH
+ {0xE854, 0x912F}, //10698 #CJK UNIFIED IDEOGRAPH
+ {0xE855, 0x912B}, //10699 #CJK UNIFIED IDEOGRAPH
+ {0xE856, 0x9129}, //10700 #CJK UNIFIED IDEOGRAPH
+ {0xE857, 0x912A}, //10701 #CJK UNIFIED IDEOGRAPH
+ {0xE858, 0x9132}, //10702 #CJK UNIFIED IDEOGRAPH
+ {0xE859, 0x9126}, //10703 #CJK UNIFIED IDEOGRAPH
+ {0xE85A, 0x912E}, //10704 #CJK UNIFIED IDEOGRAPH
+ {0xE85B, 0x9185}, //10705 #CJK UNIFIED IDEOGRAPH
+ {0xE85C, 0x9186}, //10706 #CJK UNIFIED IDEOGRAPH
+ {0xE85D, 0x918A}, //10707 #CJK UNIFIED IDEOGRAPH
+ {0xE85E, 0x9181}, //10708 #CJK UNIFIED IDEOGRAPH
+ {0xE85F, 0x9182}, //10709 #CJK UNIFIED IDEOGRAPH
+ {0xE860, 0x9184}, //10710 #CJK UNIFIED IDEOGRAPH
+ {0xE861, 0x9180}, //10711 #CJK UNIFIED IDEOGRAPH
+ {0xE862, 0x92D0}, //10712 #CJK UNIFIED IDEOGRAPH
+ {0xE863, 0x92C3}, //10713 #CJK UNIFIED IDEOGRAPH
+ {0xE864, 0x92C4}, //10714 #CJK UNIFIED IDEOGRAPH
+ {0xE865, 0x92C0}, //10715 #CJK UNIFIED IDEOGRAPH
+ {0xE866, 0x92D9}, //10716 #CJK UNIFIED IDEOGRAPH
+ {0xE867, 0x92B6}, //10717 #CJK UNIFIED IDEOGRAPH
+ {0xE868, 0x92CF}, //10718 #CJK UNIFIED IDEOGRAPH
+ {0xE869, 0x92F1}, //10719 #CJK UNIFIED IDEOGRAPH
+ {0xE86A, 0x92DF}, //10720 #CJK UNIFIED IDEOGRAPH
+ {0xE86B, 0x92D8}, //10721 #CJK UNIFIED IDEOGRAPH
+ {0xE86C, 0x92E9}, //10722 #CJK UNIFIED IDEOGRAPH
+ {0xE86D, 0x92D7}, //10723 #CJK UNIFIED IDEOGRAPH
+ {0xE86E, 0x92DD}, //10724 #CJK UNIFIED IDEOGRAPH
+ {0xE86F, 0x92CC}, //10725 #CJK UNIFIED IDEOGRAPH
+ {0xE870, 0x92EF}, //10726 #CJK UNIFIED IDEOGRAPH
+ {0xE871, 0x92C2}, //10727 #CJK UNIFIED IDEOGRAPH
+ {0xE872, 0x92E8}, //10728 #CJK UNIFIED IDEOGRAPH
+ {0xE873, 0x92CA}, //10729 #CJK UNIFIED IDEOGRAPH
+ {0xE874, 0x92C8}, //10730 #CJK UNIFIED IDEOGRAPH
+ {0xE875, 0x92CE}, //10731 #CJK UNIFIED IDEOGRAPH
+ {0xE876, 0x92E6}, //10732 #CJK UNIFIED IDEOGRAPH
+ {0xE877, 0x92CD}, //10733 #CJK UNIFIED IDEOGRAPH
+ {0xE878, 0x92D5}, //10734 #CJK UNIFIED IDEOGRAPH
+ {0xE879, 0x92C9}, //10735 #CJK UNIFIED IDEOGRAPH
+ {0xE87A, 0x92E0}, //10736 #CJK UNIFIED IDEOGRAPH
+ {0xE87B, 0x92DE}, //10737 #CJK UNIFIED IDEOGRAPH
+ {0xE87C, 0x92E7}, //10738 #CJK UNIFIED IDEOGRAPH
+ {0xE87D, 0x92D1}, //10739 #CJK UNIFIED IDEOGRAPH
+ {0xE87E, 0x92D3}, //10740 #CJK UNIFIED IDEOGRAPH
+ {0xE8A1, 0x92B5}, //10741 #CJK UNIFIED IDEOGRAPH
+ {0xE8A2, 0x92E1}, //10742 #CJK UNIFIED IDEOGRAPH
+ {0xE8A3, 0x92C6}, //10743 #CJK UNIFIED IDEOGRAPH
+ {0xE8A4, 0x92B4}, //10744 #CJK UNIFIED IDEOGRAPH
+ {0xE8A5, 0x957C}, //10745 #CJK UNIFIED IDEOGRAPH
+ {0xE8A6, 0x95AC}, //10746 #CJK UNIFIED IDEOGRAPH
+ {0xE8A7, 0x95AB}, //10747 #CJK UNIFIED IDEOGRAPH
+ {0xE8A8, 0x95AE}, //10748 #CJK UNIFIED IDEOGRAPH
+ {0xE8A9, 0x95B0}, //10749 #CJK UNIFIED IDEOGRAPH
+ {0xE8AA, 0x96A4}, //10750 #CJK UNIFIED IDEOGRAPH
+ {0xE8AB, 0x96A2}, //10751 #CJK UNIFIED IDEOGRAPH
+ {0xE8AC, 0x96D3}, //10752 #CJK UNIFIED IDEOGRAPH
+ {0xE8AD, 0x9705}, //10753 #CJK UNIFIED IDEOGRAPH
+ {0xE8AE, 0x9708}, //10754 #CJK UNIFIED IDEOGRAPH
+ {0xE8AF, 0x9702}, //10755 #CJK UNIFIED IDEOGRAPH
+ {0xE8B0, 0x975A}, //10756 #CJK UNIFIED IDEOGRAPH
+ {0xE8B1, 0x978A}, //10757 #CJK UNIFIED IDEOGRAPH
+ {0xE8B2, 0x978E}, //10758 #CJK UNIFIED IDEOGRAPH
+ {0xE8B3, 0x9788}, //10759 #CJK UNIFIED IDEOGRAPH
+ {0xE8B4, 0x97D0}, //10760 #CJK UNIFIED IDEOGRAPH
+ {0xE8B5, 0x97CF}, //10761 #CJK UNIFIED IDEOGRAPH
+ {0xE8B6, 0x981E}, //10762 #CJK UNIFIED IDEOGRAPH
+ {0xE8B7, 0x981D}, //10763 #CJK UNIFIED IDEOGRAPH
+ {0xE8B8, 0x9826}, //10764 #CJK UNIFIED IDEOGRAPH
+ {0xE8B9, 0x9829}, //10765 #CJK UNIFIED IDEOGRAPH
+ {0xE8BA, 0x9828}, //10766 #CJK UNIFIED IDEOGRAPH
+ {0xE8BB, 0x9820}, //10767 #CJK UNIFIED IDEOGRAPH
+ {0xE8BC, 0x981B}, //10768 #CJK UNIFIED IDEOGRAPH
+ {0xE8BD, 0x9827}, //10769 #CJK UNIFIED IDEOGRAPH
+ {0xE8BE, 0x98B2}, //10770 #CJK UNIFIED IDEOGRAPH
+ {0xE8BF, 0x9908}, //10771 #CJK UNIFIED IDEOGRAPH
+ {0xE8C0, 0x98FA}, //10772 #CJK UNIFIED IDEOGRAPH
+ {0xE8C1, 0x9911}, //10773 #CJK UNIFIED IDEOGRAPH
+ {0xE8C2, 0x9914}, //10774 #CJK UNIFIED IDEOGRAPH
+ {0xE8C3, 0x9916}, //10775 #CJK UNIFIED IDEOGRAPH
+ {0xE8C4, 0x9917}, //10776 #CJK UNIFIED IDEOGRAPH
+ {0xE8C5, 0x9915}, //10777 #CJK UNIFIED IDEOGRAPH
+ {0xE8C6, 0x99DC}, //10778 #CJK UNIFIED IDEOGRAPH
+ {0xE8C7, 0x99CD}, //10779 #CJK UNIFIED IDEOGRAPH
+ {0xE8C8, 0x99CF}, //10780 #CJK UNIFIED IDEOGRAPH
+ {0xE8C9, 0x99D3}, //10781 #CJK UNIFIED IDEOGRAPH
+ {0xE8CA, 0x99D4}, //10782 #CJK UNIFIED IDEOGRAPH
+ {0xE8CB, 0x99CE}, //10783 #CJK UNIFIED IDEOGRAPH
+ {0xE8CC, 0x99C9}, //10784 #CJK UNIFIED IDEOGRAPH
+ {0xE8CD, 0x99D6}, //10785 #CJK UNIFIED IDEOGRAPH
+ {0xE8CE, 0x99D8}, //10786 #CJK UNIFIED IDEOGRAPH
+ {0xE8CF, 0x99CB}, //10787 #CJK UNIFIED IDEOGRAPH
+ {0xE8D0, 0x99D7}, //10788 #CJK UNIFIED IDEOGRAPH
+ {0xE8D1, 0x99CC}, //10789 #CJK UNIFIED IDEOGRAPH
+ {0xE8D2, 0x9AB3}, //10790 #CJK UNIFIED IDEOGRAPH
+ {0xE8D3, 0x9AEC}, //10791 #CJK UNIFIED IDEOGRAPH
+ {0xE8D4, 0x9AEB}, //10792 #CJK UNIFIED IDEOGRAPH
+ {0xE8D5, 0x9AF3}, //10793 #CJK UNIFIED IDEOGRAPH
+ {0xE8D6, 0x9AF2}, //10794 #CJK UNIFIED IDEOGRAPH
+ {0xE8D7, 0x9AF1}, //10795 #CJK UNIFIED IDEOGRAPH
+ {0xE8D8, 0x9B46}, //10796 #CJK UNIFIED IDEOGRAPH
+ {0xE8D9, 0x9B43}, //10797 #CJK UNIFIED IDEOGRAPH
+ {0xE8DA, 0x9B67}, //10798 #CJK UNIFIED IDEOGRAPH
+ {0xE8DB, 0x9B74}, //10799 #CJK UNIFIED IDEOGRAPH
+ {0xE8DC, 0x9B71}, //10800 #CJK UNIFIED IDEOGRAPH
+ {0xE8DD, 0x9B66}, //10801 #CJK UNIFIED IDEOGRAPH
+ {0xE8DE, 0x9B76}, //10802 #CJK UNIFIED IDEOGRAPH
+ {0xE8DF, 0x9B75}, //10803 #CJK UNIFIED IDEOGRAPH
+ {0xE8E0, 0x9B70}, //10804 #CJK UNIFIED IDEOGRAPH
+ {0xE8E1, 0x9B68}, //10805 #CJK UNIFIED IDEOGRAPH
+ {0xE8E2, 0x9B64}, //10806 #CJK UNIFIED IDEOGRAPH
+ {0xE8E3, 0x9B6C}, //10807 #CJK UNIFIED IDEOGRAPH
+ {0xE8E4, 0x9CFC}, //10808 #CJK UNIFIED IDEOGRAPH
+ {0xE8E5, 0x9CFA}, //10809 #CJK UNIFIED IDEOGRAPH
+ {0xE8E6, 0x9CFD}, //10810 #CJK UNIFIED IDEOGRAPH
+ {0xE8E7, 0x9CFF}, //10811 #CJK UNIFIED IDEOGRAPH
+ {0xE8E8, 0x9CF7}, //10812 #CJK UNIFIED IDEOGRAPH
+ {0xE8E9, 0x9D07}, //10813 #CJK UNIFIED IDEOGRAPH
+ {0xE8EA, 0x9D00}, //10814 #CJK UNIFIED IDEOGRAPH
+ {0xE8EB, 0x9CF9}, //10815 #CJK UNIFIED IDEOGRAPH
+ {0xE8EC, 0x9CFB}, //10816 #CJK UNIFIED IDEOGRAPH
+ {0xE8ED, 0x9D08}, //10817 #CJK UNIFIED IDEOGRAPH
+ {0xE8EE, 0x9D05}, //10818 #CJK UNIFIED IDEOGRAPH
+ {0xE8EF, 0x9D04}, //10819 #CJK UNIFIED IDEOGRAPH
+ {0xE8F0, 0x9E83}, //10820 #CJK UNIFIED IDEOGRAPH
+ {0xE8F1, 0x9ED3}, //10821 #CJK UNIFIED IDEOGRAPH
+ {0xE8F2, 0x9F0F}, //10822 #CJK UNIFIED IDEOGRAPH
+ {0xE8F3, 0x9F10}, //10823 #CJK UNIFIED IDEOGRAPH
+ {0xE8F4, 0x511C}, //10824 #CJK UNIFIED IDEOGRAPH
+ {0xE8F5, 0x5113}, //10825 #CJK UNIFIED IDEOGRAPH
+ {0xE8F6, 0x5117}, //10826 #CJK UNIFIED IDEOGRAPH
+ {0xE8F7, 0x511A}, //10827 #CJK UNIFIED IDEOGRAPH
+ {0xE8F8, 0x5111}, //10828 #CJK UNIFIED IDEOGRAPH
+ {0xE8F9, 0x51DE}, //10829 #CJK UNIFIED IDEOGRAPH
+ {0xE8FA, 0x5334}, //10830 #CJK UNIFIED IDEOGRAPH
+ {0xE8FB, 0x53E1}, //10831 #CJK UNIFIED IDEOGRAPH
+ {0xE8FC, 0x5670}, //10832 #CJK UNIFIED IDEOGRAPH
+ {0xE8FD, 0x5660}, //10833 #CJK UNIFIED IDEOGRAPH
+ {0xE8FE, 0x566E}, //10834 #CJK UNIFIED IDEOGRAPH
+ {0xE940, 0x5673}, //10835 #CJK UNIFIED IDEOGRAPH
+ {0xE941, 0x5666}, //10836 #CJK UNIFIED IDEOGRAPH
+ {0xE942, 0x5663}, //10837 #CJK UNIFIED IDEOGRAPH
+ {0xE943, 0x566D}, //10838 #CJK UNIFIED IDEOGRAPH
+ {0xE944, 0x5672}, //10839 #CJK UNIFIED IDEOGRAPH
+ {0xE945, 0x565E}, //10840 #CJK UNIFIED IDEOGRAPH
+ {0xE946, 0x5677}, //10841 #CJK UNIFIED IDEOGRAPH
+ {0xE947, 0x571C}, //10842 #CJK UNIFIED IDEOGRAPH
+ {0xE948, 0x571B}, //10843 #CJK UNIFIED IDEOGRAPH
+ {0xE949, 0x58C8}, //10844 #CJK UNIFIED IDEOGRAPH
+ {0xE94A, 0x58BD}, //10845 #CJK UNIFIED IDEOGRAPH
+ {0xE94B, 0x58C9}, //10846 #CJK UNIFIED IDEOGRAPH
+ {0xE94C, 0x58BF}, //10847 #CJK UNIFIED IDEOGRAPH
+ {0xE94D, 0x58BA}, //10848 #CJK UNIFIED IDEOGRAPH
+ {0xE94E, 0x58C2}, //10849 #CJK UNIFIED IDEOGRAPH
+ {0xE94F, 0x58BC}, //10850 #CJK UNIFIED IDEOGRAPH
+ {0xE950, 0x58C6}, //10851 #CJK UNIFIED IDEOGRAPH
+ {0xE951, 0x5B17}, //10852 #CJK UNIFIED IDEOGRAPH
+ {0xE952, 0x5B19}, //10853 #CJK UNIFIED IDEOGRAPH
+ {0xE953, 0x5B1B}, //10854 #CJK UNIFIED IDEOGRAPH
+ {0xE954, 0x5B21}, //10855 #CJK UNIFIED IDEOGRAPH
+ {0xE955, 0x5B14}, //10856 #CJK UNIFIED IDEOGRAPH
+ {0xE956, 0x5B13}, //10857 #CJK UNIFIED IDEOGRAPH
+ {0xE957, 0x5B10}, //10858 #CJK UNIFIED IDEOGRAPH
+ {0xE958, 0x5B16}, //10859 #CJK UNIFIED IDEOGRAPH
+ {0xE959, 0x5B28}, //10860 #CJK UNIFIED IDEOGRAPH
+ {0xE95A, 0x5B1A}, //10861 #CJK UNIFIED IDEOGRAPH
+ {0xE95B, 0x5B20}, //10862 #CJK UNIFIED IDEOGRAPH
+ {0xE95C, 0x5B1E}, //10863 #CJK UNIFIED IDEOGRAPH
+ {0xE95D, 0x5BEF}, //10864 #CJK UNIFIED IDEOGRAPH
+ {0xE95E, 0x5DAC}, //10865 #CJK UNIFIED IDEOGRAPH
+ {0xE95F, 0x5DB1}, //10866 #CJK UNIFIED IDEOGRAPH
+ {0xE960, 0x5DA9}, //10867 #CJK UNIFIED IDEOGRAPH
+ {0xE961, 0x5DA7}, //10868 #CJK UNIFIED IDEOGRAPH
+ {0xE962, 0x5DB5}, //10869 #CJK UNIFIED IDEOGRAPH
+ {0xE963, 0x5DB0}, //10870 #CJK UNIFIED IDEOGRAPH
+ {0xE964, 0x5DAE}, //10871 #CJK UNIFIED IDEOGRAPH
+ {0xE965, 0x5DAA}, //10872 #CJK UNIFIED IDEOGRAPH
+ {0xE966, 0x5DA8}, //10873 #CJK UNIFIED IDEOGRAPH
+ {0xE967, 0x5DB2}, //10874 #CJK UNIFIED IDEOGRAPH
+ {0xE968, 0x5DAD}, //10875 #CJK UNIFIED IDEOGRAPH
+ {0xE969, 0x5DAF}, //10876 #CJK UNIFIED IDEOGRAPH
+ {0xE96A, 0x5DB4}, //10877 #CJK UNIFIED IDEOGRAPH
+ {0xE96B, 0x5E67}, //10878 #CJK UNIFIED IDEOGRAPH
+ {0xE96C, 0x5E68}, //10879 #CJK UNIFIED IDEOGRAPH
+ {0xE96D, 0x5E66}, //10880 #CJK UNIFIED IDEOGRAPH
+ {0xE96E, 0x5E6F}, //10881 #CJK UNIFIED IDEOGRAPH
+ {0xE96F, 0x5EE9}, //10882 #CJK UNIFIED IDEOGRAPH
+ {0xE970, 0x5EE7}, //10883 #CJK UNIFIED IDEOGRAPH
+ {0xE971, 0x5EE6}, //10884 #CJK UNIFIED IDEOGRAPH
+ {0xE972, 0x5EE8}, //10885 #CJK UNIFIED IDEOGRAPH
+ {0xE973, 0x5EE5}, //10886 #CJK UNIFIED IDEOGRAPH
+ {0xE974, 0x5F4B}, //10887 #CJK UNIFIED IDEOGRAPH
+ {0xE975, 0x5FBC}, //10888 #CJK UNIFIED IDEOGRAPH
+ {0xE976, 0x619D}, //10889 #CJK UNIFIED IDEOGRAPH
+ {0xE977, 0x61A8}, //10890 #CJK UNIFIED IDEOGRAPH
+ {0xE978, 0x6196}, //10891 #CJK UNIFIED IDEOGRAPH
+ {0xE979, 0x61C5}, //10892 #CJK UNIFIED IDEOGRAPH
+ {0xE97A, 0x61B4}, //10893 #CJK UNIFIED IDEOGRAPH
+ {0xE97B, 0x61C6}, //10894 #CJK UNIFIED IDEOGRAPH
+ {0xE97C, 0x61C1}, //10895 #CJK UNIFIED IDEOGRAPH
+ {0xE97D, 0x61CC}, //10896 #CJK UNIFIED IDEOGRAPH
+ {0xE97E, 0x61BA}, //10897 #CJK UNIFIED IDEOGRAPH
+ {0xE9A1, 0x61BF}, //10898 #CJK UNIFIED IDEOGRAPH
+ {0xE9A2, 0x61B8}, //10899 #CJK UNIFIED IDEOGRAPH
+ {0xE9A3, 0x618C}, //10900 #CJK UNIFIED IDEOGRAPH
+ {0xE9A4, 0x64D7}, //10901 #CJK UNIFIED IDEOGRAPH
+ {0xE9A5, 0x64D6}, //10902 #CJK UNIFIED IDEOGRAPH
+ {0xE9A6, 0x64D0}, //10903 #CJK UNIFIED IDEOGRAPH
+ {0xE9A7, 0x64CF}, //10904 #CJK UNIFIED IDEOGRAPH
+ {0xE9A8, 0x64C9}, //10905 #CJK UNIFIED IDEOGRAPH
+ {0xE9A9, 0x64BD}, //10906 #CJK UNIFIED IDEOGRAPH
+ {0xE9AA, 0x6489}, //10907 #CJK UNIFIED IDEOGRAPH
+ {0xE9AB, 0x64C3}, //10908 #CJK UNIFIED IDEOGRAPH
+ {0xE9AC, 0x64DB}, //10909 #CJK UNIFIED IDEOGRAPH
+ {0xE9AD, 0x64F3}, //10910 #CJK UNIFIED IDEOGRAPH
+ {0xE9AE, 0x64D9}, //10911 #CJK UNIFIED IDEOGRAPH
+ {0xE9AF, 0x6533}, //10912 #CJK UNIFIED IDEOGRAPH
+ {0xE9B0, 0x657F}, //10913 #CJK UNIFIED IDEOGRAPH
+ {0xE9B1, 0x657C}, //10914 #CJK UNIFIED IDEOGRAPH
+ {0xE9B2, 0x65A2}, //10915 #CJK UNIFIED IDEOGRAPH
+ {0xE9B3, 0x66C8}, //10916 #CJK UNIFIED IDEOGRAPH
+ {0xE9B4, 0x66BE}, //10917 #CJK UNIFIED IDEOGRAPH
+ {0xE9B5, 0x66C0}, //10918 #CJK UNIFIED IDEOGRAPH
+ {0xE9B6, 0x66CA}, //10919 #CJK UNIFIED IDEOGRAPH
+ {0xE9B7, 0x66CB}, //10920 #CJK UNIFIED IDEOGRAPH
+ {0xE9B8, 0x66CF}, //10921 #CJK UNIFIED IDEOGRAPH
+ {0xE9B9, 0x66BD}, //10922 #CJK UNIFIED IDEOGRAPH
+ {0xE9BA, 0x66BB}, //10923 #CJK UNIFIED IDEOGRAPH
+ {0xE9BB, 0x66BA}, //10924 #CJK UNIFIED IDEOGRAPH
+ {0xE9BC, 0x66CC}, //10925 #CJK UNIFIED IDEOGRAPH
+ {0xE9BD, 0x6723}, //10926 #CJK UNIFIED IDEOGRAPH
+ {0xE9BE, 0x6A34}, //10927 #CJK UNIFIED IDEOGRAPH
+ {0xE9BF, 0x6A66}, //10928 #CJK UNIFIED IDEOGRAPH
+ {0xE9C0, 0x6A49}, //10929 #CJK UNIFIED IDEOGRAPH
+ {0xE9C1, 0x6A67}, //10930 #CJK UNIFIED IDEOGRAPH
+ {0xE9C2, 0x6A32}, //10931 #CJK UNIFIED IDEOGRAPH
+ {0xE9C3, 0x6A68}, //10932 #CJK UNIFIED IDEOGRAPH
+ {0xE9C4, 0x6A3E}, //10933 #CJK UNIFIED IDEOGRAPH
+ {0xE9C5, 0x6A5D}, //10934 #CJK UNIFIED IDEOGRAPH
+ {0xE9C6, 0x6A6D}, //10935 #CJK UNIFIED IDEOGRAPH
+ {0xE9C7, 0x6A76}, //10936 #CJK UNIFIED IDEOGRAPH
+ {0xE9C8, 0x6A5B}, //10937 #CJK UNIFIED IDEOGRAPH
+ {0xE9C9, 0x6A51}, //10938 #CJK UNIFIED IDEOGRAPH
+ {0xE9CA, 0x6A28}, //10939 #CJK UNIFIED IDEOGRAPH
+ {0xE9CB, 0x6A5A}, //10940 #CJK UNIFIED IDEOGRAPH
+ {0xE9CC, 0x6A3B}, //10941 #CJK UNIFIED IDEOGRAPH
+ {0xE9CD, 0x6A3F}, //10942 #CJK UNIFIED IDEOGRAPH
+ {0xE9CE, 0x6A41}, //10943 #CJK UNIFIED IDEOGRAPH
+ {0xE9CF, 0x6A6A}, //10944 #CJK UNIFIED IDEOGRAPH
+ {0xE9D0, 0x6A64}, //10945 #CJK UNIFIED IDEOGRAPH
+ {0xE9D1, 0x6A50}, //10946 #CJK UNIFIED IDEOGRAPH
+ {0xE9D2, 0x6A4F}, //10947 #CJK UNIFIED IDEOGRAPH
+ {0xE9D3, 0x6A54}, //10948 #CJK UNIFIED IDEOGRAPH
+ {0xE9D4, 0x6A6F}, //10949 #CJK UNIFIED IDEOGRAPH
+ {0xE9D5, 0x6A69}, //10950 #CJK UNIFIED IDEOGRAPH
+ {0xE9D6, 0x6A60}, //10951 #CJK UNIFIED IDEOGRAPH
+ {0xE9D7, 0x6A3C}, //10952 #CJK UNIFIED IDEOGRAPH
+ {0xE9D8, 0x6A5E}, //10953 #CJK UNIFIED IDEOGRAPH
+ {0xE9D9, 0x6A56}, //10954 #CJK UNIFIED IDEOGRAPH
+ {0xE9DA, 0x6A55}, //10955 #CJK UNIFIED IDEOGRAPH
+ {0xE9DB, 0x6A4D}, //10956 #CJK UNIFIED IDEOGRAPH
+ {0xE9DC, 0x6A4E}, //10957 #CJK UNIFIED IDEOGRAPH
+ {0xE9DD, 0x6A46}, //10958 #CJK UNIFIED IDEOGRAPH
+ {0xE9DE, 0x6B55}, //10959 #CJK UNIFIED IDEOGRAPH
+ {0xE9DF, 0x6B54}, //10960 #CJK UNIFIED IDEOGRAPH
+ {0xE9E0, 0x6B56}, //10961 #CJK UNIFIED IDEOGRAPH
+ {0xE9E1, 0x6BA7}, //10962 #CJK UNIFIED IDEOGRAPH
+ {0xE9E2, 0x6BAA}, //10963 #CJK UNIFIED IDEOGRAPH
+ {0xE9E3, 0x6BAB}, //10964 #CJK UNIFIED IDEOGRAPH
+ {0xE9E4, 0x6BC8}, //10965 #CJK UNIFIED IDEOGRAPH
+ {0xE9E5, 0x6BC7}, //10966 #CJK UNIFIED IDEOGRAPH
+ {0xE9E6, 0x6C04}, //10967 #CJK UNIFIED IDEOGRAPH
+ {0xE9E7, 0x6C03}, //10968 #CJK UNIFIED IDEOGRAPH
+ {0xE9E8, 0x6C06}, //10969 #CJK UNIFIED IDEOGRAPH
+ {0xE9E9, 0x6FAD}, //10970 #CJK UNIFIED IDEOGRAPH
+ {0xE9EA, 0x6FCB}, //10971 #CJK UNIFIED IDEOGRAPH
+ {0xE9EB, 0x6FA3}, //10972 #CJK UNIFIED IDEOGRAPH
+ {0xE9EC, 0x6FC7}, //10973 #CJK UNIFIED IDEOGRAPH
+ {0xE9ED, 0x6FBC}, //10974 #CJK UNIFIED IDEOGRAPH
+ {0xE9EE, 0x6FCE}, //10975 #CJK UNIFIED IDEOGRAPH
+ {0xE9EF, 0x6FC8}, //10976 #CJK UNIFIED IDEOGRAPH
+ {0xE9F0, 0x6F5E}, //10977 #CJK UNIFIED IDEOGRAPH
+ {0xE9F1, 0x6FC4}, //10978 #CJK UNIFIED IDEOGRAPH
+ {0xE9F2, 0x6FBD}, //10979 #CJK UNIFIED IDEOGRAPH
+ {0xE9F3, 0x6F9E}, //10980 #CJK UNIFIED IDEOGRAPH
+ {0xE9F4, 0x6FCA}, //10981 #CJK UNIFIED IDEOGRAPH
+ {0xE9F5, 0x6FA8}, //10982 #CJK UNIFIED IDEOGRAPH
+ {0xE9F6, 0x7004}, //10983 #CJK UNIFIED IDEOGRAPH
+ {0xE9F7, 0x6FA5}, //10984 #CJK UNIFIED IDEOGRAPH
+ {0xE9F8, 0x6FAE}, //10985 #CJK UNIFIED IDEOGRAPH
+ {0xE9F9, 0x6FBA}, //10986 #CJK UNIFIED IDEOGRAPH
+ {0xE9FA, 0x6FAC}, //10987 #CJK UNIFIED IDEOGRAPH
+ {0xE9FB, 0x6FAA}, //10988 #CJK UNIFIED IDEOGRAPH
+ {0xE9FC, 0x6FCF}, //10989 #CJK UNIFIED IDEOGRAPH
+ {0xE9FD, 0x6FBF}, //10990 #CJK UNIFIED IDEOGRAPH
+ {0xE9FE, 0x6FB8}, //10991 #CJK UNIFIED IDEOGRAPH
+ {0xEA40, 0x6FA2}, //10992 #CJK UNIFIED IDEOGRAPH
+ {0xEA41, 0x6FC9}, //10993 #CJK UNIFIED IDEOGRAPH
+ {0xEA42, 0x6FAB}, //10994 #CJK UNIFIED IDEOGRAPH
+ {0xEA43, 0x6FCD}, //10995 #CJK UNIFIED IDEOGRAPH
+ {0xEA44, 0x6FAF}, //10996 #CJK UNIFIED IDEOGRAPH
+ {0xEA45, 0x6FB2}, //10997 #CJK UNIFIED IDEOGRAPH
+ {0xEA46, 0x6FB0}, //10998 #CJK UNIFIED IDEOGRAPH
+ {0xEA47, 0x71C5}, //10999 #CJK UNIFIED IDEOGRAPH
+ {0xEA48, 0x71C2}, //11000 #CJK UNIFIED IDEOGRAPH
+ {0xEA49, 0x71BF}, //11001 #CJK UNIFIED IDEOGRAPH
+ {0xEA4A, 0x71B8}, //11002 #CJK UNIFIED IDEOGRAPH
+ {0xEA4B, 0x71D6}, //11003 #CJK UNIFIED IDEOGRAPH
+ {0xEA4C, 0x71C0}, //11004 #CJK UNIFIED IDEOGRAPH
+ {0xEA4D, 0x71C1}, //11005 #CJK UNIFIED IDEOGRAPH
+ {0xEA4E, 0x71CB}, //11006 #CJK UNIFIED IDEOGRAPH
+ {0xEA4F, 0x71D4}, //11007 #CJK UNIFIED IDEOGRAPH
+ {0xEA50, 0x71CA}, //11008 #CJK UNIFIED IDEOGRAPH
+ {0xEA51, 0x71C7}, //11009 #CJK UNIFIED IDEOGRAPH
+ {0xEA52, 0x71CF}, //11010 #CJK UNIFIED IDEOGRAPH
+ {0xEA53, 0x71BD}, //11011 #CJK UNIFIED IDEOGRAPH
+ {0xEA54, 0x71D8}, //11012 #CJK UNIFIED IDEOGRAPH
+ {0xEA55, 0x71BC}, //11013 #CJK UNIFIED IDEOGRAPH
+ {0xEA56, 0x71C6}, //11014 #CJK UNIFIED IDEOGRAPH
+ {0xEA57, 0x71DA}, //11015 #CJK UNIFIED IDEOGRAPH
+ {0xEA58, 0x71DB}, //11016 #CJK UNIFIED IDEOGRAPH
+ {0xEA59, 0x729D}, //11017 #CJK UNIFIED IDEOGRAPH
+ {0xEA5A, 0x729E}, //11018 #CJK UNIFIED IDEOGRAPH
+ {0xEA5B, 0x7369}, //11019 #CJK UNIFIED IDEOGRAPH
+ {0xEA5C, 0x7366}, //11020 #CJK UNIFIED IDEOGRAPH
+ {0xEA5D, 0x7367}, //11021 #CJK UNIFIED IDEOGRAPH
+ {0xEA5E, 0x736C}, //11022 #CJK UNIFIED IDEOGRAPH
+ {0xEA5F, 0x7365}, //11023 #CJK UNIFIED IDEOGRAPH
+ {0xEA60, 0x736B}, //11024 #CJK UNIFIED IDEOGRAPH
+ {0xEA61, 0x736A}, //11025 #CJK UNIFIED IDEOGRAPH
+ {0xEA62, 0x747F}, //11026 #CJK UNIFIED IDEOGRAPH
+ {0xEA63, 0x749A}, //11027 #CJK UNIFIED IDEOGRAPH
+ {0xEA64, 0x74A0}, //11028 #CJK UNIFIED IDEOGRAPH
+ {0xEA65, 0x7494}, //11029 #CJK UNIFIED IDEOGRAPH
+ {0xEA66, 0x7492}, //11030 #CJK UNIFIED IDEOGRAPH
+ {0xEA67, 0x7495}, //11031 #CJK UNIFIED IDEOGRAPH
+ {0xEA68, 0x74A1}, //11032 #CJK UNIFIED IDEOGRAPH
+ {0xEA69, 0x750B}, //11033 #CJK UNIFIED IDEOGRAPH
+ {0xEA6A, 0x7580}, //11034 #CJK UNIFIED IDEOGRAPH
+ {0xEA6B, 0x762F}, //11035 #CJK UNIFIED IDEOGRAPH
+ {0xEA6C, 0x762D}, //11036 #CJK UNIFIED IDEOGRAPH
+ {0xEA6D, 0x7631}, //11037 #CJK UNIFIED IDEOGRAPH
+ {0xEA6E, 0x763D}, //11038 #CJK UNIFIED IDEOGRAPH
+ {0xEA6F, 0x7633}, //11039 #CJK UNIFIED IDEOGRAPH
+ {0xEA70, 0x763C}, //11040 #CJK UNIFIED IDEOGRAPH
+ {0xEA71, 0x7635}, //11041 #CJK UNIFIED IDEOGRAPH
+ {0xEA72, 0x7632}, //11042 #CJK UNIFIED IDEOGRAPH
+ {0xEA73, 0x7630}, //11043 #CJK UNIFIED IDEOGRAPH
+ {0xEA74, 0x76BB}, //11044 #CJK UNIFIED IDEOGRAPH
+ {0xEA75, 0x76E6}, //11045 #CJK UNIFIED IDEOGRAPH
+ {0xEA76, 0x779A}, //11046 #CJK UNIFIED IDEOGRAPH
+ {0xEA77, 0x779D}, //11047 #CJK UNIFIED IDEOGRAPH
+ {0xEA78, 0x77A1}, //11048 #CJK UNIFIED IDEOGRAPH
+ {0xEA79, 0x779C}, //11049 #CJK UNIFIED IDEOGRAPH
+ {0xEA7A, 0x779B}, //11050 #CJK UNIFIED IDEOGRAPH
+ {0xEA7B, 0x77A2}, //11051 #CJK UNIFIED IDEOGRAPH
+ {0xEA7C, 0x77A3}, //11052 #CJK UNIFIED IDEOGRAPH
+ {0xEA7D, 0x7795}, //11053 #CJK UNIFIED IDEOGRAPH
+ {0xEA7E, 0x7799}, //11054 #CJK UNIFIED IDEOGRAPH
+ {0xEAA1, 0x7797}, //11055 #CJK UNIFIED IDEOGRAPH
+ {0xEAA2, 0x78DD}, //11056 #CJK UNIFIED IDEOGRAPH
+ {0xEAA3, 0x78E9}, //11057 #CJK UNIFIED IDEOGRAPH
+ {0xEAA4, 0x78E5}, //11058 #CJK UNIFIED IDEOGRAPH
+ {0xEAA5, 0x78EA}, //11059 #CJK UNIFIED IDEOGRAPH
+ {0xEAA6, 0x78DE}, //11060 #CJK UNIFIED IDEOGRAPH
+ {0xEAA7, 0x78E3}, //11061 #CJK UNIFIED IDEOGRAPH
+ {0xEAA8, 0x78DB}, //11062 #CJK UNIFIED IDEOGRAPH
+ {0xEAA9, 0x78E1}, //11063 #CJK UNIFIED IDEOGRAPH
+ {0xEAAA, 0x78E2}, //11064 #CJK UNIFIED IDEOGRAPH
+ {0xEAAB, 0x78ED}, //11065 #CJK UNIFIED IDEOGRAPH
+ {0xEAAC, 0x78DF}, //11066 #CJK UNIFIED IDEOGRAPH
+ {0xEAAD, 0x78E0}, //11067 #CJK UNIFIED IDEOGRAPH
+ {0xEAAE, 0x79A4}, //11068 #CJK UNIFIED IDEOGRAPH
+ {0xEAAF, 0x7A44}, //11069 #CJK UNIFIED IDEOGRAPH
+ {0xEAB0, 0x7A48}, //11070 #CJK UNIFIED IDEOGRAPH
+ {0xEAB1, 0x7A47}, //11071 #CJK UNIFIED IDEOGRAPH
+ {0xEAB2, 0x7AB6}, //11072 #CJK UNIFIED IDEOGRAPH
+ {0xEAB3, 0x7AB8}, //11073 #CJK UNIFIED IDEOGRAPH
+ {0xEAB4, 0x7AB5}, //11074 #CJK UNIFIED IDEOGRAPH
+ {0xEAB5, 0x7AB1}, //11075 #CJK UNIFIED IDEOGRAPH
+ {0xEAB6, 0x7AB7}, //11076 #CJK UNIFIED IDEOGRAPH
+ {0xEAB7, 0x7BDE}, //11077 #CJK UNIFIED IDEOGRAPH
+ {0xEAB8, 0x7BE3}, //11078 #CJK UNIFIED IDEOGRAPH
+ {0xEAB9, 0x7BE7}, //11079 #CJK UNIFIED IDEOGRAPH
+ {0xEABA, 0x7BDD}, //11080 #CJK UNIFIED IDEOGRAPH
+ {0xEABB, 0x7BD5}, //11081 #CJK UNIFIED IDEOGRAPH
+ {0xEABC, 0x7BE5}, //11082 #CJK UNIFIED IDEOGRAPH
+ {0xEABD, 0x7BDA}, //11083 #CJK UNIFIED IDEOGRAPH
+ {0xEABE, 0x7BE8}, //11084 #CJK UNIFIED IDEOGRAPH
+ {0xEABF, 0x7BF9}, //11085 #CJK UNIFIED IDEOGRAPH
+ {0xEAC0, 0x7BD4}, //11086 #CJK UNIFIED IDEOGRAPH
+ {0xEAC1, 0x7BEA}, //11087 #CJK UNIFIED IDEOGRAPH
+ {0xEAC2, 0x7BE2}, //11088 #CJK UNIFIED IDEOGRAPH
+ {0xEAC3, 0x7BDC}, //11089 #CJK UNIFIED IDEOGRAPH
+ {0xEAC4, 0x7BEB}, //11090 #CJK UNIFIED IDEOGRAPH
+ {0xEAC5, 0x7BD8}, //11091 #CJK UNIFIED IDEOGRAPH
+ {0xEAC6, 0x7BDF}, //11092 #CJK UNIFIED IDEOGRAPH
+ {0xEAC7, 0x7CD2}, //11093 #CJK UNIFIED IDEOGRAPH
+ {0xEAC8, 0x7CD4}, //11094 #CJK UNIFIED IDEOGRAPH
+ {0xEAC9, 0x7CD7}, //11095 #CJK UNIFIED IDEOGRAPH
+ {0xEACA, 0x7CD0}, //11096 #CJK UNIFIED IDEOGRAPH
+ {0xEACB, 0x7CD1}, //11097 #CJK UNIFIED IDEOGRAPH
+ {0xEACC, 0x7E12}, //11098 #CJK UNIFIED IDEOGRAPH
+ {0xEACD, 0x7E21}, //11099 #CJK UNIFIED IDEOGRAPH
+ {0xEACE, 0x7E17}, //11100 #CJK UNIFIED IDEOGRAPH
+ {0xEACF, 0x7E0C}, //11101 #CJK UNIFIED IDEOGRAPH
+ {0xEAD0, 0x7E1F}, //11102 #CJK UNIFIED IDEOGRAPH
+ {0xEAD1, 0x7E20}, //11103 #CJK UNIFIED IDEOGRAPH
+ {0xEAD2, 0x7E13}, //11104 #CJK UNIFIED IDEOGRAPH
+ {0xEAD3, 0x7E0E}, //11105 #CJK UNIFIED IDEOGRAPH
+ {0xEAD4, 0x7E1C}, //11106 #CJK UNIFIED IDEOGRAPH
+ {0xEAD5, 0x7E15}, //11107 #CJK UNIFIED IDEOGRAPH
+ {0xEAD6, 0x7E1A}, //11108 #CJK UNIFIED IDEOGRAPH
+ {0xEAD7, 0x7E22}, //11109 #CJK UNIFIED IDEOGRAPH
+ {0xEAD8, 0x7E0B}, //11110 #CJK UNIFIED IDEOGRAPH
+ {0xEAD9, 0x7E0F}, //11111 #CJK UNIFIED IDEOGRAPH
+ {0xEADA, 0x7E16}, //11112 #CJK UNIFIED IDEOGRAPH
+ {0xEADB, 0x7E0D}, //11113 #CJK UNIFIED IDEOGRAPH
+ {0xEADC, 0x7E14}, //11114 #CJK UNIFIED IDEOGRAPH
+ {0xEADD, 0x7E25}, //11115 #CJK UNIFIED IDEOGRAPH
+ {0xEADE, 0x7E24}, //11116 #CJK UNIFIED IDEOGRAPH
+ {0xEADF, 0x7F43}, //11117 #CJK UNIFIED IDEOGRAPH
+ {0xEAE0, 0x7F7B}, //11118 #CJK UNIFIED IDEOGRAPH
+ {0xEAE1, 0x7F7C}, //11119 #CJK UNIFIED IDEOGRAPH
+ {0xEAE2, 0x7F7A}, //11120 #CJK UNIFIED IDEOGRAPH
+ {0xEAE3, 0x7FB1}, //11121 #CJK UNIFIED IDEOGRAPH
+ {0xEAE4, 0x7FEF}, //11122 #CJK UNIFIED IDEOGRAPH
+ {0xEAE5, 0x802A}, //11123 #CJK UNIFIED IDEOGRAPH
+ {0xEAE6, 0x8029}, //11124 #CJK UNIFIED IDEOGRAPH
+ {0xEAE7, 0x806C}, //11125 #CJK UNIFIED IDEOGRAPH
+ {0xEAE8, 0x81B1}, //11126 #CJK UNIFIED IDEOGRAPH
+ {0xEAE9, 0x81A6}, //11127 #CJK UNIFIED IDEOGRAPH
+ {0xEAEA, 0x81AE}, //11128 #CJK UNIFIED IDEOGRAPH
+ {0xEAEB, 0x81B9}, //11129 #CJK UNIFIED IDEOGRAPH
+ {0xEAEC, 0x81B5}, //11130 #CJK UNIFIED IDEOGRAPH
+ {0xEAED, 0x81AB}, //11131 #CJK UNIFIED IDEOGRAPH
+ {0xEAEE, 0x81B0}, //11132 #CJK UNIFIED IDEOGRAPH
+ {0xEAEF, 0x81AC}, //11133 #CJK UNIFIED IDEOGRAPH
+ {0xEAF0, 0x81B4}, //11134 #CJK UNIFIED IDEOGRAPH
+ {0xEAF1, 0x81B2}, //11135 #CJK UNIFIED IDEOGRAPH
+ {0xEAF2, 0x81B7}, //11136 #CJK UNIFIED IDEOGRAPH
+ {0xEAF3, 0x81A7}, //11137 #CJK UNIFIED IDEOGRAPH
+ {0xEAF4, 0x81F2}, //11138 #CJK UNIFIED IDEOGRAPH
+ {0xEAF5, 0x8255}, //11139 #CJK UNIFIED IDEOGRAPH
+ {0xEAF6, 0x8256}, //11140 #CJK UNIFIED IDEOGRAPH
+ {0xEAF7, 0x8257}, //11141 #CJK UNIFIED IDEOGRAPH
+ {0xEAF8, 0x8556}, //11142 #CJK UNIFIED IDEOGRAPH
+ {0xEAF9, 0x8545}, //11143 #CJK UNIFIED IDEOGRAPH
+ {0xEAFA, 0x856B}, //11144 #CJK UNIFIED IDEOGRAPH
+ {0xEAFB, 0x854D}, //11145 #CJK UNIFIED IDEOGRAPH
+ {0xEAFC, 0x8553}, //11146 #CJK UNIFIED IDEOGRAPH
+ {0xEAFD, 0x8561}, //11147 #CJK UNIFIED IDEOGRAPH
+ {0xEAFE, 0x8558}, //11148 #CJK UNIFIED IDEOGRAPH
+ {0xEB40, 0x8540}, //11149 #CJK UNIFIED IDEOGRAPH
+ {0xEB41, 0x8546}, //11150 #CJK UNIFIED IDEOGRAPH
+ {0xEB42, 0x8564}, //11151 #CJK UNIFIED IDEOGRAPH
+ {0xEB43, 0x8541}, //11152 #CJK UNIFIED IDEOGRAPH
+ {0xEB44, 0x8562}, //11153 #CJK UNIFIED IDEOGRAPH
+ {0xEB45, 0x8544}, //11154 #CJK UNIFIED IDEOGRAPH
+ {0xEB46, 0x8551}, //11155 #CJK UNIFIED IDEOGRAPH
+ {0xEB47, 0x8547}, //11156 #CJK UNIFIED IDEOGRAPH
+ {0xEB48, 0x8563}, //11157 #CJK UNIFIED IDEOGRAPH
+ {0xEB49, 0x853E}, //11158 #CJK UNIFIED IDEOGRAPH
+ {0xEB4A, 0x855B}, //11159 #CJK UNIFIED IDEOGRAPH
+ {0xEB4B, 0x8571}, //11160 #CJK UNIFIED IDEOGRAPH
+ {0xEB4C, 0x854E}, //11161 #CJK UNIFIED IDEOGRAPH
+ {0xEB4D, 0x856E}, //11162 #CJK UNIFIED IDEOGRAPH
+ {0xEB4E, 0x8575}, //11163 #CJK UNIFIED IDEOGRAPH
+ {0xEB4F, 0x8555}, //11164 #CJK UNIFIED IDEOGRAPH
+ {0xEB50, 0x8567}, //11165 #CJK UNIFIED IDEOGRAPH
+ {0xEB51, 0x8560}, //11166 #CJK UNIFIED IDEOGRAPH
+ {0xEB52, 0x858C}, //11167 #CJK UNIFIED IDEOGRAPH
+ {0xEB53, 0x8566}, //11168 #CJK UNIFIED IDEOGRAPH
+ {0xEB54, 0x855D}, //11169 #CJK UNIFIED IDEOGRAPH
+ {0xEB55, 0x8554}, //11170 #CJK UNIFIED IDEOGRAPH
+ {0xEB56, 0x8565}, //11171 #CJK UNIFIED IDEOGRAPH
+ {0xEB57, 0x856C}, //11172 #CJK UNIFIED IDEOGRAPH
+ {0xEB58, 0x8663}, //11173 #CJK UNIFIED IDEOGRAPH
+ {0xEB59, 0x8665}, //11174 #CJK UNIFIED IDEOGRAPH
+ {0xEB5A, 0x8664}, //11175 #CJK UNIFIED IDEOGRAPH
+ {0xEB5B, 0x879B}, //11176 #CJK UNIFIED IDEOGRAPH
+ {0xEB5C, 0x878F}, //11177 #CJK UNIFIED IDEOGRAPH
+ {0xEB5D, 0x8797}, //11178 #CJK UNIFIED IDEOGRAPH
+ {0xEB5E, 0x8793}, //11179 #CJK UNIFIED IDEOGRAPH
+ {0xEB5F, 0x8792}, //11180 #CJK UNIFIED IDEOGRAPH
+ {0xEB60, 0x8788}, //11181 #CJK UNIFIED IDEOGRAPH
+ {0xEB61, 0x8781}, //11182 #CJK UNIFIED IDEOGRAPH
+ {0xEB62, 0x8796}, //11183 #CJK UNIFIED IDEOGRAPH
+ {0xEB63, 0x8798}, //11184 #CJK UNIFIED IDEOGRAPH
+ {0xEB64, 0x8779}, //11185 #CJK UNIFIED IDEOGRAPH
+ {0xEB65, 0x8787}, //11186 #CJK UNIFIED IDEOGRAPH
+ {0xEB66, 0x87A3}, //11187 #CJK UNIFIED IDEOGRAPH
+ {0xEB67, 0x8785}, //11188 #CJK UNIFIED IDEOGRAPH
+ {0xEB68, 0x8790}, //11189 #CJK UNIFIED IDEOGRAPH
+ {0xEB69, 0x8791}, //11190 #CJK UNIFIED IDEOGRAPH
+ {0xEB6A, 0x879D}, //11191 #CJK UNIFIED IDEOGRAPH
+ {0xEB6B, 0x8784}, //11192 #CJK UNIFIED IDEOGRAPH
+ {0xEB6C, 0x8794}, //11193 #CJK UNIFIED IDEOGRAPH
+ {0xEB6D, 0x879C}, //11194 #CJK UNIFIED IDEOGRAPH
+ {0xEB6E, 0x879A}, //11195 #CJK UNIFIED IDEOGRAPH
+ {0xEB6F, 0x8789}, //11196 #CJK UNIFIED IDEOGRAPH
+ {0xEB70, 0x891E}, //11197 #CJK UNIFIED IDEOGRAPH
+ {0xEB71, 0x8926}, //11198 #CJK UNIFIED IDEOGRAPH
+ {0xEB72, 0x8930}, //11199 #CJK UNIFIED IDEOGRAPH
+ {0xEB73, 0x892D}, //11200 #CJK UNIFIED IDEOGRAPH
+ {0xEB74, 0x892E}, //11201 #CJK UNIFIED IDEOGRAPH
+ {0xEB75, 0x8927}, //11202 #CJK UNIFIED IDEOGRAPH
+ {0xEB76, 0x8931}, //11203 #CJK UNIFIED IDEOGRAPH
+ {0xEB77, 0x8922}, //11204 #CJK UNIFIED IDEOGRAPH
+ {0xEB78, 0x8929}, //11205 #CJK UNIFIED IDEOGRAPH
+ {0xEB79, 0x8923}, //11206 #CJK UNIFIED IDEOGRAPH
+ {0xEB7A, 0x892F}, //11207 #CJK UNIFIED IDEOGRAPH
+ {0xEB7B, 0x892C}, //11208 #CJK UNIFIED IDEOGRAPH
+ {0xEB7C, 0x891F}, //11209 #CJK UNIFIED IDEOGRAPH
+ {0xEB7D, 0x89F1}, //11210 #CJK UNIFIED IDEOGRAPH
+ {0xEB7E, 0x8AE0}, //11211 #CJK UNIFIED IDEOGRAPH
+ {0xEBA1, 0x8AE2}, //11212 #CJK UNIFIED IDEOGRAPH
+ {0xEBA2, 0x8AF2}, //11213 #CJK UNIFIED IDEOGRAPH
+ {0xEBA3, 0x8AF4}, //11214 #CJK UNIFIED IDEOGRAPH
+ {0xEBA4, 0x8AF5}, //11215 #CJK UNIFIED IDEOGRAPH
+ {0xEBA5, 0x8ADD}, //11216 #CJK UNIFIED IDEOGRAPH
+ {0xEBA6, 0x8B14}, //11217 #CJK UNIFIED IDEOGRAPH
+ {0xEBA7, 0x8AE4}, //11218 #CJK UNIFIED IDEOGRAPH
+ {0xEBA8, 0x8ADF}, //11219 #CJK UNIFIED IDEOGRAPH
+ {0xEBA9, 0x8AF0}, //11220 #CJK UNIFIED IDEOGRAPH
+ {0xEBAA, 0x8AC8}, //11221 #CJK UNIFIED IDEOGRAPH
+ {0xEBAB, 0x8ADE}, //11222 #CJK UNIFIED IDEOGRAPH
+ {0xEBAC, 0x8AE1}, //11223 #CJK UNIFIED IDEOGRAPH
+ {0xEBAD, 0x8AE8}, //11224 #CJK UNIFIED IDEOGRAPH
+ {0xEBAE, 0x8AFF}, //11225 #CJK UNIFIED IDEOGRAPH
+ {0xEBAF, 0x8AEF}, //11226 #CJK UNIFIED IDEOGRAPH
+ {0xEBB0, 0x8AFB}, //11227 #CJK UNIFIED IDEOGRAPH
+ {0xEBB1, 0x8C91}, //11228 #CJK UNIFIED IDEOGRAPH
+ {0xEBB2, 0x8C92}, //11229 #CJK UNIFIED IDEOGRAPH
+ {0xEBB3, 0x8C90}, //11230 #CJK UNIFIED IDEOGRAPH
+ {0xEBB4, 0x8CF5}, //11231 #CJK UNIFIED IDEOGRAPH
+ {0xEBB5, 0x8CEE}, //11232 #CJK UNIFIED IDEOGRAPH
+ {0xEBB6, 0x8CF1}, //11233 #CJK UNIFIED IDEOGRAPH
+ {0xEBB7, 0x8CF0}, //11234 #CJK UNIFIED IDEOGRAPH
+ {0xEBB8, 0x8CF3}, //11235 #CJK UNIFIED IDEOGRAPH
+ {0xEBB9, 0x8D6C}, //11236 #CJK UNIFIED IDEOGRAPH
+ {0xEBBA, 0x8D6E}, //11237 #CJK UNIFIED IDEOGRAPH
+ {0xEBBB, 0x8DA5}, //11238 #CJK UNIFIED IDEOGRAPH
+ {0xEBBC, 0x8DA7}, //11239 #CJK UNIFIED IDEOGRAPH
+ {0xEBBD, 0x8E33}, //11240 #CJK UNIFIED IDEOGRAPH
+ {0xEBBE, 0x8E3E}, //11241 #CJK UNIFIED IDEOGRAPH
+ {0xEBBF, 0x8E38}, //11242 #CJK UNIFIED IDEOGRAPH
+ {0xEBC0, 0x8E40}, //11243 #CJK UNIFIED IDEOGRAPH
+ {0xEBC1, 0x8E45}, //11244 #CJK UNIFIED IDEOGRAPH
+ {0xEBC2, 0x8E36}, //11245 #CJK UNIFIED IDEOGRAPH
+ {0xEBC3, 0x8E3C}, //11246 #CJK UNIFIED IDEOGRAPH
+ {0xEBC4, 0x8E3D}, //11247 #CJK UNIFIED IDEOGRAPH
+ {0xEBC5, 0x8E41}, //11248 #CJK UNIFIED IDEOGRAPH
+ {0xEBC6, 0x8E30}, //11249 #CJK UNIFIED IDEOGRAPH
+ {0xEBC7, 0x8E3F}, //11250 #CJK UNIFIED IDEOGRAPH
+ {0xEBC8, 0x8EBD}, //11251 #CJK UNIFIED IDEOGRAPH
+ {0xEBC9, 0x8F36}, //11252 #CJK UNIFIED IDEOGRAPH
+ {0xEBCA, 0x8F2E}, //11253 #CJK UNIFIED IDEOGRAPH
+ {0xEBCB, 0x8F35}, //11254 #CJK UNIFIED IDEOGRAPH
+ {0xEBCC, 0x8F32}, //11255 #CJK UNIFIED IDEOGRAPH
+ {0xEBCD, 0x8F39}, //11256 #CJK UNIFIED IDEOGRAPH
+ {0xEBCE, 0x8F37}, //11257 #CJK UNIFIED IDEOGRAPH
+ {0xEBCF, 0x8F34}, //11258 #CJK UNIFIED IDEOGRAPH
+ {0xEBD0, 0x9076}, //11259 #CJK UNIFIED IDEOGRAPH
+ {0xEBD1, 0x9079}, //11260 #CJK UNIFIED IDEOGRAPH
+ {0xEBD2, 0x907B}, //11261 #CJK UNIFIED IDEOGRAPH
+ {0xEBD3, 0x9086}, //11262 #CJK UNIFIED IDEOGRAPH
+ {0xEBD4, 0x90FA}, //11263 #CJK UNIFIED IDEOGRAPH
+ {0xEBD5, 0x9133}, //11264 #CJK UNIFIED IDEOGRAPH
+ {0xEBD6, 0x9135}, //11265 #CJK UNIFIED IDEOGRAPH
+ {0xEBD7, 0x9136}, //11266 #CJK UNIFIED IDEOGRAPH
+ {0xEBD8, 0x9193}, //11267 #CJK UNIFIED IDEOGRAPH
+ {0xEBD9, 0x9190}, //11268 #CJK UNIFIED IDEOGRAPH
+ {0xEBDA, 0x9191}, //11269 #CJK UNIFIED IDEOGRAPH
+ {0xEBDB, 0x918D}, //11270 #CJK UNIFIED IDEOGRAPH
+ {0xEBDC, 0x918F}, //11271 #CJK UNIFIED IDEOGRAPH
+ {0xEBDD, 0x9327}, //11272 #CJK UNIFIED IDEOGRAPH
+ {0xEBDE, 0x931E}, //11273 #CJK UNIFIED IDEOGRAPH
+ {0xEBDF, 0x9308}, //11274 #CJK UNIFIED IDEOGRAPH
+ {0xEBE0, 0x931F}, //11275 #CJK UNIFIED IDEOGRAPH
+ {0xEBE1, 0x9306}, //11276 #CJK UNIFIED IDEOGRAPH
+ {0xEBE2, 0x930F}, //11277 #CJK UNIFIED IDEOGRAPH
+ {0xEBE3, 0x937A}, //11278 #CJK UNIFIED IDEOGRAPH
+ {0xEBE4, 0x9338}, //11279 #CJK UNIFIED IDEOGRAPH
+ {0xEBE5, 0x933C}, //11280 #CJK UNIFIED IDEOGRAPH
+ {0xEBE6, 0x931B}, //11281 #CJK UNIFIED IDEOGRAPH
+ {0xEBE7, 0x9323}, //11282 #CJK UNIFIED IDEOGRAPH
+ {0xEBE8, 0x9312}, //11283 #CJK UNIFIED IDEOGRAPH
+ {0xEBE9, 0x9301}, //11284 #CJK UNIFIED IDEOGRAPH
+ {0xEBEA, 0x9346}, //11285 #CJK UNIFIED IDEOGRAPH
+ {0xEBEB, 0x932D}, //11286 #CJK UNIFIED IDEOGRAPH
+ {0xEBEC, 0x930E}, //11287 #CJK UNIFIED IDEOGRAPH
+ {0xEBED, 0x930D}, //11288 #CJK UNIFIED IDEOGRAPH
+ {0xEBEE, 0x92CB}, //11289 #CJK UNIFIED IDEOGRAPH
+ {0xEBEF, 0x931D}, //11290 #CJK UNIFIED IDEOGRAPH
+ {0xEBF0, 0x92FA}, //11291 #CJK UNIFIED IDEOGRAPH
+ {0xEBF1, 0x9325}, //11292 #CJK UNIFIED IDEOGRAPH
+ {0xEBF2, 0x9313}, //11293 #CJK UNIFIED IDEOGRAPH
+ {0xEBF3, 0x92F9}, //11294 #CJK UNIFIED IDEOGRAPH
+ {0xEBF4, 0x92F7}, //11295 #CJK UNIFIED IDEOGRAPH
+ {0xEBF5, 0x9334}, //11296 #CJK UNIFIED IDEOGRAPH
+ {0xEBF6, 0x9302}, //11297 #CJK UNIFIED IDEOGRAPH
+ {0xEBF7, 0x9324}, //11298 #CJK UNIFIED IDEOGRAPH
+ {0xEBF8, 0x92FF}, //11299 #CJK UNIFIED IDEOGRAPH
+ {0xEBF9, 0x9329}, //11300 #CJK UNIFIED IDEOGRAPH
+ {0xEBFA, 0x9339}, //11301 #CJK UNIFIED IDEOGRAPH
+ {0xEBFB, 0x9335}, //11302 #CJK UNIFIED IDEOGRAPH
+ {0xEBFC, 0x932A}, //11303 #CJK UNIFIED IDEOGRAPH
+ {0xEBFD, 0x9314}, //11304 #CJK UNIFIED IDEOGRAPH
+ {0xEBFE, 0x930C}, //11305 #CJK UNIFIED IDEOGRAPH
+ {0xEC40, 0x930B}, //11306 #CJK UNIFIED IDEOGRAPH
+ {0xEC41, 0x92FE}, //11307 #CJK UNIFIED IDEOGRAPH
+ {0xEC42, 0x9309}, //11308 #CJK UNIFIED IDEOGRAPH
+ {0xEC43, 0x9300}, //11309 #CJK UNIFIED IDEOGRAPH
+ {0xEC44, 0x92FB}, //11310 #CJK UNIFIED IDEOGRAPH
+ {0xEC45, 0x9316}, //11311 #CJK UNIFIED IDEOGRAPH
+ {0xEC46, 0x95BC}, //11312 #CJK UNIFIED IDEOGRAPH
+ {0xEC47, 0x95CD}, //11313 #CJK UNIFIED IDEOGRAPH
+ {0xEC48, 0x95BE}, //11314 #CJK UNIFIED IDEOGRAPH
+ {0xEC49, 0x95B9}, //11315 #CJK UNIFIED IDEOGRAPH
+ {0xEC4A, 0x95BA}, //11316 #CJK UNIFIED IDEOGRAPH
+ {0xEC4B, 0x95B6}, //11317 #CJK UNIFIED IDEOGRAPH
+ {0xEC4C, 0x95BF}, //11318 #CJK UNIFIED IDEOGRAPH
+ {0xEC4D, 0x95B5}, //11319 #CJK UNIFIED IDEOGRAPH
+ {0xEC4E, 0x95BD}, //11320 #CJK UNIFIED IDEOGRAPH
+ {0xEC4F, 0x96A9}, //11321 #CJK UNIFIED IDEOGRAPH
+ {0xEC50, 0x96D4}, //11322 #CJK UNIFIED IDEOGRAPH
+ {0xEC51, 0x970B}, //11323 #CJK UNIFIED IDEOGRAPH
+ {0xEC52, 0x9712}, //11324 #CJK UNIFIED IDEOGRAPH
+ {0xEC53, 0x9710}, //11325 #CJK UNIFIED IDEOGRAPH
+ {0xEC54, 0x9799}, //11326 #CJK UNIFIED IDEOGRAPH
+ {0xEC55, 0x9797}, //11327 #CJK UNIFIED IDEOGRAPH
+ {0xEC56, 0x9794}, //11328 #CJK UNIFIED IDEOGRAPH
+ {0xEC57, 0x97F0}, //11329 #CJK UNIFIED IDEOGRAPH
+ {0xEC58, 0x97F8}, //11330 #CJK UNIFIED IDEOGRAPH
+ {0xEC59, 0x9835}, //11331 #CJK UNIFIED IDEOGRAPH
+ {0xEC5A, 0x982F}, //11332 #CJK UNIFIED IDEOGRAPH
+ {0xEC5B, 0x9832}, //11333 #CJK UNIFIED IDEOGRAPH
+ {0xEC5C, 0x9924}, //11334 #CJK UNIFIED IDEOGRAPH
+ {0xEC5D, 0x991F}, //11335 #CJK UNIFIED IDEOGRAPH
+ {0xEC5E, 0x9927}, //11336 #CJK UNIFIED IDEOGRAPH
+ {0xEC5F, 0x9929}, //11337 #CJK UNIFIED IDEOGRAPH
+ {0xEC60, 0x999E}, //11338 #CJK UNIFIED IDEOGRAPH
+ {0xEC61, 0x99EE}, //11339 #CJK UNIFIED IDEOGRAPH
+ {0xEC62, 0x99EC}, //11340 #CJK UNIFIED IDEOGRAPH
+ {0xEC63, 0x99E5}, //11341 #CJK UNIFIED IDEOGRAPH
+ {0xEC64, 0x99E4}, //11342 #CJK UNIFIED IDEOGRAPH
+ {0xEC65, 0x99F0}, //11343 #CJK UNIFIED IDEOGRAPH
+ {0xEC66, 0x99E3}, //11344 #CJK UNIFIED IDEOGRAPH
+ {0xEC67, 0x99EA}, //11345 #CJK UNIFIED IDEOGRAPH
+ {0xEC68, 0x99E9}, //11346 #CJK UNIFIED IDEOGRAPH
+ {0xEC69, 0x99E7}, //11347 #CJK UNIFIED IDEOGRAPH
+ {0xEC6A, 0x9AB9}, //11348 #CJK UNIFIED IDEOGRAPH
+ {0xEC6B, 0x9ABF}, //11349 #CJK UNIFIED IDEOGRAPH
+ {0xEC6C, 0x9AB4}, //11350 #CJK UNIFIED IDEOGRAPH
+ {0xEC6D, 0x9ABB}, //11351 #CJK UNIFIED IDEOGRAPH
+ {0xEC6E, 0x9AF6}, //11352 #CJK UNIFIED IDEOGRAPH
+ {0xEC6F, 0x9AFA}, //11353 #CJK UNIFIED IDEOGRAPH
+ {0xEC70, 0x9AF9}, //11354 #CJK UNIFIED IDEOGRAPH
+ {0xEC71, 0x9AF7}, //11355 #CJK UNIFIED IDEOGRAPH
+ {0xEC72, 0x9B33}, //11356 #CJK UNIFIED IDEOGRAPH
+ {0xEC73, 0x9B80}, //11357 #CJK UNIFIED IDEOGRAPH
+ {0xEC74, 0x9B85}, //11358 #CJK UNIFIED IDEOGRAPH
+ {0xEC75, 0x9B87}, //11359 #CJK UNIFIED IDEOGRAPH
+ {0xEC76, 0x9B7C}, //11360 #CJK UNIFIED IDEOGRAPH
+ {0xEC77, 0x9B7E}, //11361 #CJK UNIFIED IDEOGRAPH
+ {0xEC78, 0x9B7B}, //11362 #CJK UNIFIED IDEOGRAPH
+ {0xEC79, 0x9B82}, //11363 #CJK UNIFIED IDEOGRAPH
+ {0xEC7A, 0x9B93}, //11364 #CJK UNIFIED IDEOGRAPH
+ {0xEC7B, 0x9B92}, //11365 #CJK UNIFIED IDEOGRAPH
+ {0xEC7C, 0x9B90}, //11366 #CJK UNIFIED IDEOGRAPH
+ {0xEC7D, 0x9B7A}, //11367 #CJK UNIFIED IDEOGRAPH
+ {0xEC7E, 0x9B95}, //11368 #CJK UNIFIED IDEOGRAPH
+ {0xECA1, 0x9B7D}, //11369 #CJK UNIFIED IDEOGRAPH
+ {0xECA2, 0x9B88}, //11370 #CJK UNIFIED IDEOGRAPH
+ {0xECA3, 0x9D25}, //11371 #CJK UNIFIED IDEOGRAPH
+ {0xECA4, 0x9D17}, //11372 #CJK UNIFIED IDEOGRAPH
+ {0xECA5, 0x9D20}, //11373 #CJK UNIFIED IDEOGRAPH
+ {0xECA6, 0x9D1E}, //11374 #CJK UNIFIED IDEOGRAPH
+ {0xECA7, 0x9D14}, //11375 #CJK UNIFIED IDEOGRAPH
+ {0xECA8, 0x9D29}, //11376 #CJK UNIFIED IDEOGRAPH
+ {0xECA9, 0x9D1D}, //11377 #CJK UNIFIED IDEOGRAPH
+ {0xECAA, 0x9D18}, //11378 #CJK UNIFIED IDEOGRAPH
+ {0xECAB, 0x9D22}, //11379 #CJK UNIFIED IDEOGRAPH
+ {0xECAC, 0x9D10}, //11380 #CJK UNIFIED IDEOGRAPH
+ {0xECAD, 0x9D19}, //11381 #CJK UNIFIED IDEOGRAPH
+ {0xECAE, 0x9D1F}, //11382 #CJK UNIFIED IDEOGRAPH
+ {0xECAF, 0x9E88}, //11383 #CJK UNIFIED IDEOGRAPH
+ {0xECB0, 0x9E86}, //11384 #CJK UNIFIED IDEOGRAPH
+ {0xECB1, 0x9E87}, //11385 #CJK UNIFIED IDEOGRAPH
+ {0xECB2, 0x9EAE}, //11386 #CJK UNIFIED IDEOGRAPH
+ {0xECB3, 0x9EAD}, //11387 #CJK UNIFIED IDEOGRAPH
+ {0xECB4, 0x9ED5}, //11388 #CJK UNIFIED IDEOGRAPH
+ {0xECB5, 0x9ED6}, //11389 #CJK UNIFIED IDEOGRAPH
+ {0xECB6, 0x9EFA}, //11390 #CJK UNIFIED IDEOGRAPH
+ {0xECB7, 0x9F12}, //11391 #CJK UNIFIED IDEOGRAPH
+ {0xECB8, 0x9F3D}, //11392 #CJK UNIFIED IDEOGRAPH
+ {0xECB9, 0x5126}, //11393 #CJK UNIFIED IDEOGRAPH
+ {0xECBA, 0x5125}, //11394 #CJK UNIFIED IDEOGRAPH
+ {0xECBB, 0x5122}, //11395 #CJK UNIFIED IDEOGRAPH
+ {0xECBC, 0x5124}, //11396 #CJK UNIFIED IDEOGRAPH
+ {0xECBD, 0x5120}, //11397 #CJK UNIFIED IDEOGRAPH
+ {0xECBE, 0x5129}, //11398 #CJK UNIFIED IDEOGRAPH
+ {0xECBF, 0x52F4}, //11399 #CJK UNIFIED IDEOGRAPH
+ {0xECC0, 0x5693}, //11400 #CJK UNIFIED IDEOGRAPH
+ {0xECC1, 0x568C}, //11401 #CJK UNIFIED IDEOGRAPH
+ {0xECC2, 0x568D}, //11402 #CJK UNIFIED IDEOGRAPH
+ {0xECC3, 0x5686}, //11403 #CJK UNIFIED IDEOGRAPH
+ {0xECC4, 0x5684}, //11404 #CJK UNIFIED IDEOGRAPH
+ {0xECC5, 0x5683}, //11405 #CJK UNIFIED IDEOGRAPH
+ {0xECC6, 0x567E}, //11406 #CJK UNIFIED IDEOGRAPH
+ {0xECC7, 0x5682}, //11407 #CJK UNIFIED IDEOGRAPH
+ {0xECC8, 0x567F}, //11408 #CJK UNIFIED IDEOGRAPH
+ {0xECC9, 0x5681}, //11409 #CJK UNIFIED IDEOGRAPH
+ {0xECCA, 0x58D6}, //11410 #CJK UNIFIED IDEOGRAPH
+ {0xECCB, 0x58D4}, //11411 #CJK UNIFIED IDEOGRAPH
+ {0xECCC, 0x58CF}, //11412 #CJK UNIFIED IDEOGRAPH
+ {0xECCD, 0x58D2}, //11413 #CJK UNIFIED IDEOGRAPH
+ {0xECCE, 0x5B2D}, //11414 #CJK UNIFIED IDEOGRAPH
+ {0xECCF, 0x5B25}, //11415 #CJK UNIFIED IDEOGRAPH
+ {0xECD0, 0x5B32}, //11416 #CJK UNIFIED IDEOGRAPH
+ {0xECD1, 0x5B23}, //11417 #CJK UNIFIED IDEOGRAPH
+ {0xECD2, 0x5B2C}, //11418 #CJK UNIFIED IDEOGRAPH
+ {0xECD3, 0x5B27}, //11419 #CJK UNIFIED IDEOGRAPH
+ {0xECD4, 0x5B26}, //11420 #CJK UNIFIED IDEOGRAPH
+ {0xECD5, 0x5B2F}, //11421 #CJK UNIFIED IDEOGRAPH
+ {0xECD6, 0x5B2E}, //11422 #CJK UNIFIED IDEOGRAPH
+ {0xECD7, 0x5B7B}, //11423 #CJK UNIFIED IDEOGRAPH
+ {0xECD8, 0x5BF1}, //11424 #CJK UNIFIED IDEOGRAPH
+ {0xECD9, 0x5BF2}, //11425 #CJK UNIFIED IDEOGRAPH
+ {0xECDA, 0x5DB7}, //11426 #CJK UNIFIED IDEOGRAPH
+ {0xECDB, 0x5E6C}, //11427 #CJK UNIFIED IDEOGRAPH
+ {0xECDC, 0x5E6A}, //11428 #CJK UNIFIED IDEOGRAPH
+ {0xECDD, 0x5FBE}, //11429 #CJK UNIFIED IDEOGRAPH
+ {0xECDE, 0x5FBB}, //11430 #CJK UNIFIED IDEOGRAPH
+ {0xECDF, 0x61C3}, //11431 #CJK UNIFIED IDEOGRAPH
+ {0xECE0, 0x61B5}, //11432 #CJK UNIFIED IDEOGRAPH
+ {0xECE1, 0x61BC}, //11433 #CJK UNIFIED IDEOGRAPH
+ {0xECE2, 0x61E7}, //11434 #CJK UNIFIED IDEOGRAPH
+ {0xECE3, 0x61E0}, //11435 #CJK UNIFIED IDEOGRAPH
+ {0xECE4, 0x61E5}, //11436 #CJK UNIFIED IDEOGRAPH
+ {0xECE5, 0x61E4}, //11437 #CJK UNIFIED IDEOGRAPH
+ {0xECE6, 0x61E8}, //11438 #CJK UNIFIED IDEOGRAPH
+ {0xECE7, 0x61DE}, //11439 #CJK UNIFIED IDEOGRAPH
+ {0xECE8, 0x64EF}, //11440 #CJK UNIFIED IDEOGRAPH
+ {0xECE9, 0x64E9}, //11441 #CJK UNIFIED IDEOGRAPH
+ {0xECEA, 0x64E3}, //11442 #CJK UNIFIED IDEOGRAPH
+ {0xECEB, 0x64EB}, //11443 #CJK UNIFIED IDEOGRAPH
+ {0xECEC, 0x64E4}, //11444 #CJK UNIFIED IDEOGRAPH
+ {0xECED, 0x64E8}, //11445 #CJK UNIFIED IDEOGRAPH
+ {0xECEE, 0x6581}, //11446 #CJK UNIFIED IDEOGRAPH
+ {0xECEF, 0x6580}, //11447 #CJK UNIFIED IDEOGRAPH
+ {0xECF0, 0x65B6}, //11448 #CJK UNIFIED IDEOGRAPH
+ {0xECF1, 0x65DA}, //11449 #CJK UNIFIED IDEOGRAPH
+ {0xECF2, 0x66D2}, //11450 #CJK UNIFIED IDEOGRAPH
+ {0xECF3, 0x6A8D}, //11451 #CJK UNIFIED IDEOGRAPH
+ {0xECF4, 0x6A96}, //11452 #CJK UNIFIED IDEOGRAPH
+ {0xECF5, 0x6A81}, //11453 #CJK UNIFIED IDEOGRAPH
+ {0xECF6, 0x6AA5}, //11454 #CJK UNIFIED IDEOGRAPH
+ {0xECF7, 0x6A89}, //11455 #CJK UNIFIED IDEOGRAPH
+ {0xECF8, 0x6A9F}, //11456 #CJK UNIFIED IDEOGRAPH
+ {0xECF9, 0x6A9B}, //11457 #CJK UNIFIED IDEOGRAPH
+ {0xECFA, 0x6AA1}, //11458 #CJK UNIFIED IDEOGRAPH
+ {0xECFB, 0x6A9E}, //11459 #CJK UNIFIED IDEOGRAPH
+ {0xECFC, 0x6A87}, //11460 #CJK UNIFIED IDEOGRAPH
+ {0xECFD, 0x6A93}, //11461 #CJK UNIFIED IDEOGRAPH
+ {0xECFE, 0x6A8E}, //11462 #CJK UNIFIED IDEOGRAPH
+ {0xED40, 0x6A95}, //11463 #CJK UNIFIED IDEOGRAPH
+ {0xED41, 0x6A83}, //11464 #CJK UNIFIED IDEOGRAPH
+ {0xED42, 0x6AA8}, //11465 #CJK UNIFIED IDEOGRAPH
+ {0xED43, 0x6AA4}, //11466 #CJK UNIFIED IDEOGRAPH
+ {0xED44, 0x6A91}, //11467 #CJK UNIFIED IDEOGRAPH
+ {0xED45, 0x6A7F}, //11468 #CJK UNIFIED IDEOGRAPH
+ {0xED46, 0x6AA6}, //11469 #CJK UNIFIED IDEOGRAPH
+ {0xED47, 0x6A9A}, //11470 #CJK UNIFIED IDEOGRAPH
+ {0xED48, 0x6A85}, //11471 #CJK UNIFIED IDEOGRAPH
+ {0xED49, 0x6A8C}, //11472 #CJK UNIFIED IDEOGRAPH
+ {0xED4A, 0x6A92}, //11473 #CJK UNIFIED IDEOGRAPH
+ {0xED4B, 0x6B5B}, //11474 #CJK UNIFIED IDEOGRAPH
+ {0xED4C, 0x6BAD}, //11475 #CJK UNIFIED IDEOGRAPH
+ {0xED4D, 0x6C09}, //11476 #CJK UNIFIED IDEOGRAPH
+ {0xED4E, 0x6FCC}, //11477 #CJK UNIFIED IDEOGRAPH
+ {0xED4F, 0x6FA9}, //11478 #CJK UNIFIED IDEOGRAPH
+ {0xED50, 0x6FF4}, //11479 #CJK UNIFIED IDEOGRAPH
+ {0xED51, 0x6FD4}, //11480 #CJK UNIFIED IDEOGRAPH
+ {0xED52, 0x6FE3}, //11481 #CJK UNIFIED IDEOGRAPH
+ {0xED53, 0x6FDC}, //11482 #CJK UNIFIED IDEOGRAPH
+ {0xED54, 0x6FED}, //11483 #CJK UNIFIED IDEOGRAPH
+ {0xED55, 0x6FE7}, //11484 #CJK UNIFIED IDEOGRAPH
+ {0xED56, 0x6FE6}, //11485 #CJK UNIFIED IDEOGRAPH
+ {0xED57, 0x6FDE}, //11486 #CJK UNIFIED IDEOGRAPH
+ {0xED58, 0x6FF2}, //11487 #CJK UNIFIED IDEOGRAPH
+ {0xED59, 0x6FDD}, //11488 #CJK UNIFIED IDEOGRAPH
+ {0xED5A, 0x6FE2}, //11489 #CJK UNIFIED IDEOGRAPH
+ {0xED5B, 0x6FE8}, //11490 #CJK UNIFIED IDEOGRAPH
+ {0xED5C, 0x71E1}, //11491 #CJK UNIFIED IDEOGRAPH
+ {0xED5D, 0x71F1}, //11492 #CJK UNIFIED IDEOGRAPH
+ {0xED5E, 0x71E8}, //11493 #CJK UNIFIED IDEOGRAPH
+ {0xED5F, 0x71F2}, //11494 #CJK UNIFIED IDEOGRAPH
+ {0xED60, 0x71E4}, //11495 #CJK UNIFIED IDEOGRAPH
+ {0xED61, 0x71F0}, //11496 #CJK UNIFIED IDEOGRAPH
+ {0xED62, 0x71E2}, //11497 #CJK UNIFIED IDEOGRAPH
+ {0xED63, 0x7373}, //11498 #CJK UNIFIED IDEOGRAPH
+ {0xED64, 0x736E}, //11499 #CJK UNIFIED IDEOGRAPH
+ {0xED65, 0x736F}, //11500 #CJK UNIFIED IDEOGRAPH
+ {0xED66, 0x7497}, //11501 #CJK UNIFIED IDEOGRAPH
+ {0xED67, 0x74B2}, //11502 #CJK UNIFIED IDEOGRAPH
+ {0xED68, 0x74AB}, //11503 #CJK UNIFIED IDEOGRAPH
+ {0xED69, 0x7490}, //11504 #CJK UNIFIED IDEOGRAPH
+ {0xED6A, 0x74AA}, //11505 #CJK UNIFIED IDEOGRAPH
+ {0xED6B, 0x74AD}, //11506 #CJK UNIFIED IDEOGRAPH
+ {0xED6C, 0x74B1}, //11507 #CJK UNIFIED IDEOGRAPH
+ {0xED6D, 0x74A5}, //11508 #CJK UNIFIED IDEOGRAPH
+ {0xED6E, 0x74AF}, //11509 #CJK UNIFIED IDEOGRAPH
+ {0xED6F, 0x7510}, //11510 #CJK UNIFIED IDEOGRAPH
+ {0xED70, 0x7511}, //11511 #CJK UNIFIED IDEOGRAPH
+ {0xED71, 0x7512}, //11512 #CJK UNIFIED IDEOGRAPH
+ {0xED72, 0x750F}, //11513 #CJK UNIFIED IDEOGRAPH
+ {0xED73, 0x7584}, //11514 #CJK UNIFIED IDEOGRAPH
+ {0xED74, 0x7643}, //11515 #CJK UNIFIED IDEOGRAPH
+ {0xED75, 0x7648}, //11516 #CJK UNIFIED IDEOGRAPH
+ {0xED76, 0x7649}, //11517 #CJK UNIFIED IDEOGRAPH
+ {0xED77, 0x7647}, //11518 #CJK UNIFIED IDEOGRAPH
+ {0xED78, 0x76A4}, //11519 #CJK UNIFIED IDEOGRAPH
+ {0xED79, 0x76E9}, //11520 #CJK UNIFIED IDEOGRAPH
+ {0xED7A, 0x77B5}, //11521 #CJK UNIFIED IDEOGRAPH
+ {0xED7B, 0x77AB}, //11522 #CJK UNIFIED IDEOGRAPH
+ {0xED7C, 0x77B2}, //11523 #CJK UNIFIED IDEOGRAPH
+ {0xED7D, 0x77B7}, //11524 #CJK UNIFIED IDEOGRAPH
+ {0xED7E, 0x77B6}, //11525 #CJK UNIFIED IDEOGRAPH
+ {0xEDA1, 0x77B4}, //11526 #CJK UNIFIED IDEOGRAPH
+ {0xEDA2, 0x77B1}, //11527 #CJK UNIFIED IDEOGRAPH
+ {0xEDA3, 0x77A8}, //11528 #CJK UNIFIED IDEOGRAPH
+ {0xEDA4, 0x77F0}, //11529 #CJK UNIFIED IDEOGRAPH
+ {0xEDA5, 0x78F3}, //11530 #CJK UNIFIED IDEOGRAPH
+ {0xEDA6, 0x78FD}, //11531 #CJK UNIFIED IDEOGRAPH
+ {0xEDA7, 0x7902}, //11532 #CJK UNIFIED IDEOGRAPH
+ {0xEDA8, 0x78FB}, //11533 #CJK UNIFIED IDEOGRAPH
+ {0xEDA9, 0x78FC}, //11534 #CJK UNIFIED IDEOGRAPH
+ {0xEDAA, 0x78F2}, //11535 #CJK UNIFIED IDEOGRAPH
+ {0xEDAB, 0x7905}, //11536 #CJK UNIFIED IDEOGRAPH
+ {0xEDAC, 0x78F9}, //11537 #CJK UNIFIED IDEOGRAPH
+ {0xEDAD, 0x78FE}, //11538 #CJK UNIFIED IDEOGRAPH
+ {0xEDAE, 0x7904}, //11539 #CJK UNIFIED IDEOGRAPH
+ {0xEDAF, 0x79AB}, //11540 #CJK UNIFIED IDEOGRAPH
+ {0xEDB0, 0x79A8}, //11541 #CJK UNIFIED IDEOGRAPH
+ {0xEDB1, 0x7A5C}, //11542 #CJK UNIFIED IDEOGRAPH
+ {0xEDB2, 0x7A5B}, //11543 #CJK UNIFIED IDEOGRAPH
+ {0xEDB3, 0x7A56}, //11544 #CJK UNIFIED IDEOGRAPH
+ {0xEDB4, 0x7A58}, //11545 #CJK UNIFIED IDEOGRAPH
+ {0xEDB5, 0x7A54}, //11546 #CJK UNIFIED IDEOGRAPH
+ {0xEDB6, 0x7A5A}, //11547 #CJK UNIFIED IDEOGRAPH
+ {0xEDB7, 0x7ABE}, //11548 #CJK UNIFIED IDEOGRAPH
+ {0xEDB8, 0x7AC0}, //11549 #CJK UNIFIED IDEOGRAPH
+ {0xEDB9, 0x7AC1}, //11550 #CJK UNIFIED IDEOGRAPH
+ {0xEDBA, 0x7C05}, //11551 #CJK UNIFIED IDEOGRAPH
+ {0xEDBB, 0x7C0F}, //11552 #CJK UNIFIED IDEOGRAPH
+ {0xEDBC, 0x7BF2}, //11553 #CJK UNIFIED IDEOGRAPH
+ {0xEDBD, 0x7C00}, //11554 #CJK UNIFIED IDEOGRAPH
+ {0xEDBE, 0x7BFF}, //11555 #CJK UNIFIED IDEOGRAPH
+ {0xEDBF, 0x7BFB}, //11556 #CJK UNIFIED IDEOGRAPH
+ {0xEDC0, 0x7C0E}, //11557 #CJK UNIFIED IDEOGRAPH
+ {0xEDC1, 0x7BF4}, //11558 #CJK UNIFIED IDEOGRAPH
+ {0xEDC2, 0x7C0B}, //11559 #CJK UNIFIED IDEOGRAPH
+ {0xEDC3, 0x7BF3}, //11560 #CJK UNIFIED IDEOGRAPH
+ {0xEDC4, 0x7C02}, //11561 #CJK UNIFIED IDEOGRAPH
+ {0xEDC5, 0x7C09}, //11562 #CJK UNIFIED IDEOGRAPH
+ {0xEDC6, 0x7C03}, //11563 #CJK UNIFIED IDEOGRAPH
+ {0xEDC7, 0x7C01}, //11564 #CJK UNIFIED IDEOGRAPH
+ {0xEDC8, 0x7BF8}, //11565 #CJK UNIFIED IDEOGRAPH
+ {0xEDC9, 0x7BFD}, //11566 #CJK UNIFIED IDEOGRAPH
+ {0xEDCA, 0x7C06}, //11567 #CJK UNIFIED IDEOGRAPH
+ {0xEDCB, 0x7BF0}, //11568 #CJK UNIFIED IDEOGRAPH
+ {0xEDCC, 0x7BF1}, //11569 #CJK UNIFIED IDEOGRAPH
+ {0xEDCD, 0x7C10}, //11570 #CJK UNIFIED IDEOGRAPH
+ {0xEDCE, 0x7C0A}, //11571 #CJK UNIFIED IDEOGRAPH
+ {0xEDCF, 0x7CE8}, //11572 #CJK UNIFIED IDEOGRAPH
+ {0xEDD0, 0x7E2D}, //11573 #CJK UNIFIED IDEOGRAPH
+ {0xEDD1, 0x7E3C}, //11574 #CJK UNIFIED IDEOGRAPH
+ {0xEDD2, 0x7E42}, //11575 #CJK UNIFIED IDEOGRAPH
+ {0xEDD3, 0x7E33}, //11576 #CJK UNIFIED IDEOGRAPH
+ {0xEDD4, 0x9848}, //11577 #CJK UNIFIED IDEOGRAPH
+ {0xEDD5, 0x7E38}, //11578 #CJK UNIFIED IDEOGRAPH
+ {0xEDD6, 0x7E2A}, //11579 #CJK UNIFIED IDEOGRAPH
+ {0xEDD7, 0x7E49}, //11580 #CJK UNIFIED IDEOGRAPH
+ {0xEDD8, 0x7E40}, //11581 #CJK UNIFIED IDEOGRAPH
+ {0xEDD9, 0x7E47}, //11582 #CJK UNIFIED IDEOGRAPH
+ {0xEDDA, 0x7E29}, //11583 #CJK UNIFIED IDEOGRAPH
+ {0xEDDB, 0x7E4C}, //11584 #CJK UNIFIED IDEOGRAPH
+ {0xEDDC, 0x7E30}, //11585 #CJK UNIFIED IDEOGRAPH
+ {0xEDDD, 0x7E3B}, //11586 #CJK UNIFIED IDEOGRAPH
+ {0xEDDE, 0x7E36}, //11587 #CJK UNIFIED IDEOGRAPH
+ {0xEDDF, 0x7E44}, //11588 #CJK UNIFIED IDEOGRAPH
+ {0xEDE0, 0x7E3A}, //11589 #CJK UNIFIED IDEOGRAPH
+ {0xEDE1, 0x7F45}, //11590 #CJK UNIFIED IDEOGRAPH
+ {0xEDE2, 0x7F7F}, //11591 #CJK UNIFIED IDEOGRAPH
+ {0xEDE3, 0x7F7E}, //11592 #CJK UNIFIED IDEOGRAPH
+ {0xEDE4, 0x7F7D}, //11593 #CJK UNIFIED IDEOGRAPH
+ {0xEDE5, 0x7FF4}, //11594 #CJK UNIFIED IDEOGRAPH
+ {0xEDE6, 0x7FF2}, //11595 #CJK UNIFIED IDEOGRAPH
+ {0xEDE7, 0x802C}, //11596 #CJK UNIFIED IDEOGRAPH
+ {0xEDE8, 0x81BB}, //11597 #CJK UNIFIED IDEOGRAPH
+ {0xEDE9, 0x81C4}, //11598 #CJK UNIFIED IDEOGRAPH
+ {0xEDEA, 0x81CC}, //11599 #CJK UNIFIED IDEOGRAPH
+ {0xEDEB, 0x81CA}, //11600 #CJK UNIFIED IDEOGRAPH
+ {0xEDEC, 0x81C5}, //11601 #CJK UNIFIED IDEOGRAPH
+ {0xEDED, 0x81C7}, //11602 #CJK UNIFIED IDEOGRAPH
+ {0xEDEE, 0x81BC}, //11603 #CJK UNIFIED IDEOGRAPH
+ {0xEDEF, 0x81E9}, //11604 #CJK UNIFIED IDEOGRAPH
+ {0xEDF0, 0x825B}, //11605 #CJK UNIFIED IDEOGRAPH
+ {0xEDF1, 0x825A}, //11606 #CJK UNIFIED IDEOGRAPH
+ {0xEDF2, 0x825C}, //11607 #CJK UNIFIED IDEOGRAPH
+ {0xEDF3, 0x8583}, //11608 #CJK UNIFIED IDEOGRAPH
+ {0xEDF4, 0x8580}, //11609 #CJK UNIFIED IDEOGRAPH
+ {0xEDF5, 0x858F}, //11610 #CJK UNIFIED IDEOGRAPH
+ {0xEDF6, 0x85A7}, //11611 #CJK UNIFIED IDEOGRAPH
+ {0xEDF7, 0x8595}, //11612 #CJK UNIFIED IDEOGRAPH
+ {0xEDF8, 0x85A0}, //11613 #CJK UNIFIED IDEOGRAPH
+ {0xEDF9, 0x858B}, //11614 #CJK UNIFIED IDEOGRAPH
+ {0xEDFA, 0x85A3}, //11615 #CJK UNIFIED IDEOGRAPH
+ {0xEDFB, 0x857B}, //11616 #CJK UNIFIED IDEOGRAPH
+ {0xEDFC, 0x85A4}, //11617 #CJK UNIFIED IDEOGRAPH
+ {0xEDFD, 0x859A}, //11618 #CJK UNIFIED IDEOGRAPH
+ {0xEDFE, 0x859E}, //11619 #CJK UNIFIED IDEOGRAPH
+ {0xEE40, 0x8577}, //11620 #CJK UNIFIED IDEOGRAPH
+ {0xEE41, 0x857C}, //11621 #CJK UNIFIED IDEOGRAPH
+ {0xEE42, 0x8589}, //11622 #CJK UNIFIED IDEOGRAPH
+ {0xEE43, 0x85A1}, //11623 #CJK UNIFIED IDEOGRAPH
+ {0xEE44, 0x857A}, //11624 #CJK UNIFIED IDEOGRAPH
+ {0xEE45, 0x8578}, //11625 #CJK UNIFIED IDEOGRAPH
+ {0xEE46, 0x8557}, //11626 #CJK UNIFIED IDEOGRAPH
+ {0xEE47, 0x858E}, //11627 #CJK UNIFIED IDEOGRAPH
+ {0xEE48, 0x8596}, //11628 #CJK UNIFIED IDEOGRAPH
+ {0xEE49, 0x8586}, //11629 #CJK UNIFIED IDEOGRAPH
+ {0xEE4A, 0x858D}, //11630 #CJK UNIFIED IDEOGRAPH
+ {0xEE4B, 0x8599}, //11631 #CJK UNIFIED IDEOGRAPH
+ {0xEE4C, 0x859D}, //11632 #CJK UNIFIED IDEOGRAPH
+ {0xEE4D, 0x8581}, //11633 #CJK UNIFIED IDEOGRAPH
+ {0xEE4E, 0x85A2}, //11634 #CJK UNIFIED IDEOGRAPH
+ {0xEE4F, 0x8582}, //11635 #CJK UNIFIED IDEOGRAPH
+ {0xEE50, 0x8588}, //11636 #CJK UNIFIED IDEOGRAPH
+ {0xEE51, 0x8585}, //11637 #CJK UNIFIED IDEOGRAPH
+ {0xEE52, 0x8579}, //11638 #CJK UNIFIED IDEOGRAPH
+ {0xEE53, 0x8576}, //11639 #CJK UNIFIED IDEOGRAPH
+ {0xEE54, 0x8598}, //11640 #CJK UNIFIED IDEOGRAPH
+ {0xEE55, 0x8590}, //11641 #CJK UNIFIED IDEOGRAPH
+ {0xEE56, 0x859F}, //11642 #CJK UNIFIED IDEOGRAPH
+ {0xEE57, 0x8668}, //11643 #CJK UNIFIED IDEOGRAPH
+ {0xEE58, 0x87BE}, //11644 #CJK UNIFIED IDEOGRAPH
+ {0xEE59, 0x87AA}, //11645 #CJK UNIFIED IDEOGRAPH
+ {0xEE5A, 0x87AD}, //11646 #CJK UNIFIED IDEOGRAPH
+ {0xEE5B, 0x87C5}, //11647 #CJK UNIFIED IDEOGRAPH
+ {0xEE5C, 0x87B0}, //11648 #CJK UNIFIED IDEOGRAPH
+ {0xEE5D, 0x87AC}, //11649 #CJK UNIFIED IDEOGRAPH
+ {0xEE5E, 0x87B9}, //11650 #CJK UNIFIED IDEOGRAPH
+ {0xEE5F, 0x87B5}, //11651 #CJK UNIFIED IDEOGRAPH
+ {0xEE60, 0x87BC}, //11652 #CJK UNIFIED IDEOGRAPH
+ {0xEE61, 0x87AE}, //11653 #CJK UNIFIED IDEOGRAPH
+ {0xEE62, 0x87C9}, //11654 #CJK UNIFIED IDEOGRAPH
+ {0xEE63, 0x87C3}, //11655 #CJK UNIFIED IDEOGRAPH
+ {0xEE64, 0x87C2}, //11656 #CJK UNIFIED IDEOGRAPH
+ {0xEE65, 0x87CC}, //11657 #CJK UNIFIED IDEOGRAPH
+ {0xEE66, 0x87B7}, //11658 #CJK UNIFIED IDEOGRAPH
+ {0xEE67, 0x87AF}, //11659 #CJK UNIFIED IDEOGRAPH
+ {0xEE68, 0x87C4}, //11660 #CJK UNIFIED IDEOGRAPH
+ {0xEE69, 0x87CA}, //11661 #CJK UNIFIED IDEOGRAPH
+ {0xEE6A, 0x87B4}, //11662 #CJK UNIFIED IDEOGRAPH
+ {0xEE6B, 0x87B6}, //11663 #CJK UNIFIED IDEOGRAPH
+ {0xEE6C, 0x87BF}, //11664 #CJK UNIFIED IDEOGRAPH
+ {0xEE6D, 0x87B8}, //11665 #CJK UNIFIED IDEOGRAPH
+ {0xEE6E, 0x87BD}, //11666 #CJK UNIFIED IDEOGRAPH
+ {0xEE6F, 0x87DE}, //11667 #CJK UNIFIED IDEOGRAPH
+ {0xEE70, 0x87B2}, //11668 #CJK UNIFIED IDEOGRAPH
+ {0xEE71, 0x8935}, //11669 #CJK UNIFIED IDEOGRAPH
+ {0xEE72, 0x8933}, //11670 #CJK UNIFIED IDEOGRAPH
+ {0xEE73, 0x893C}, //11671 #CJK UNIFIED IDEOGRAPH
+ {0xEE74, 0x893E}, //11672 #CJK UNIFIED IDEOGRAPH
+ {0xEE75, 0x8941}, //11673 #CJK UNIFIED IDEOGRAPH
+ {0xEE76, 0x8952}, //11674 #CJK UNIFIED IDEOGRAPH
+ {0xEE77, 0x8937}, //11675 #CJK UNIFIED IDEOGRAPH
+ {0xEE78, 0x8942}, //11676 #CJK UNIFIED IDEOGRAPH
+ {0xEE79, 0x89AD}, //11677 #CJK UNIFIED IDEOGRAPH
+ {0xEE7A, 0x89AF}, //11678 #CJK UNIFIED IDEOGRAPH
+ {0xEE7B, 0x89AE}, //11679 #CJK UNIFIED IDEOGRAPH
+ {0xEE7C, 0x89F2}, //11680 #CJK UNIFIED IDEOGRAPH
+ {0xEE7D, 0x89F3}, //11681 #CJK UNIFIED IDEOGRAPH
+ {0xEE7E, 0x8B1E}, //11682 #CJK UNIFIED IDEOGRAPH
+ {0xEEA1, 0x8B18}, //11683 #CJK UNIFIED IDEOGRAPH
+ {0xEEA2, 0x8B16}, //11684 #CJK UNIFIED IDEOGRAPH
+ {0xEEA3, 0x8B11}, //11685 #CJK UNIFIED IDEOGRAPH
+ {0xEEA4, 0x8B05}, //11686 #CJK UNIFIED IDEOGRAPH
+ {0xEEA5, 0x8B0B}, //11687 #CJK UNIFIED IDEOGRAPH
+ {0xEEA6, 0x8B22}, //11688 #CJK UNIFIED IDEOGRAPH
+ {0xEEA7, 0x8B0F}, //11689 #CJK UNIFIED IDEOGRAPH
+ {0xEEA8, 0x8B12}, //11690 #CJK UNIFIED IDEOGRAPH
+ {0xEEA9, 0x8B15}, //11691 #CJK UNIFIED IDEOGRAPH
+ {0xEEAA, 0x8B07}, //11692 #CJK UNIFIED IDEOGRAPH
+ {0xEEAB, 0x8B0D}, //11693 #CJK UNIFIED IDEOGRAPH
+ {0xEEAC, 0x8B08}, //11694 #CJK UNIFIED IDEOGRAPH
+ {0xEEAD, 0x8B06}, //11695 #CJK UNIFIED IDEOGRAPH
+ {0xEEAE, 0x8B1C}, //11696 #CJK UNIFIED IDEOGRAPH
+ {0xEEAF, 0x8B13}, //11697 #CJK UNIFIED IDEOGRAPH
+ {0xEEB0, 0x8B1A}, //11698 #CJK UNIFIED IDEOGRAPH
+ {0xEEB1, 0x8C4F}, //11699 #CJK UNIFIED IDEOGRAPH
+ {0xEEB2, 0x8C70}, //11700 #CJK UNIFIED IDEOGRAPH
+ {0xEEB3, 0x8C72}, //11701 #CJK UNIFIED IDEOGRAPH
+ {0xEEB4, 0x8C71}, //11702 #CJK UNIFIED IDEOGRAPH
+ {0xEEB5, 0x8C6F}, //11703 #CJK UNIFIED IDEOGRAPH
+ {0xEEB6, 0x8C95}, //11704 #CJK UNIFIED IDEOGRAPH
+ {0xEEB7, 0x8C94}, //11705 #CJK UNIFIED IDEOGRAPH
+ {0xEEB8, 0x8CF9}, //11706 #CJK UNIFIED IDEOGRAPH
+ {0xEEB9, 0x8D6F}, //11707 #CJK UNIFIED IDEOGRAPH
+ {0xEEBA, 0x8E4E}, //11708 #CJK UNIFIED IDEOGRAPH
+ {0xEEBB, 0x8E4D}, //11709 #CJK UNIFIED IDEOGRAPH
+ {0xEEBC, 0x8E53}, //11710 #CJK UNIFIED IDEOGRAPH
+ {0xEEBD, 0x8E50}, //11711 #CJK UNIFIED IDEOGRAPH
+ {0xEEBE, 0x8E4C}, //11712 #CJK UNIFIED IDEOGRAPH
+ {0xEEBF, 0x8E47}, //11713 #CJK UNIFIED IDEOGRAPH
+ {0xEEC0, 0x8F43}, //11714 #CJK UNIFIED IDEOGRAPH
+ {0xEEC1, 0x8F40}, //11715 #CJK UNIFIED IDEOGRAPH
+ {0xEEC2, 0x9085}, //11716 #CJK UNIFIED IDEOGRAPH
+ {0xEEC3, 0x907E}, //11717 #CJK UNIFIED IDEOGRAPH
+ {0xEEC4, 0x9138}, //11718 #CJK UNIFIED IDEOGRAPH
+ {0xEEC5, 0x919A}, //11719 #CJK UNIFIED IDEOGRAPH
+ {0xEEC6, 0x91A2}, //11720 #CJK UNIFIED IDEOGRAPH
+ {0xEEC7, 0x919B}, //11721 #CJK UNIFIED IDEOGRAPH
+ {0xEEC8, 0x9199}, //11722 #CJK UNIFIED IDEOGRAPH
+ {0xEEC9, 0x919F}, //11723 #CJK UNIFIED IDEOGRAPH
+ {0xEECA, 0x91A1}, //11724 #CJK UNIFIED IDEOGRAPH
+ {0xEECB, 0x919D}, //11725 #CJK UNIFIED IDEOGRAPH
+ {0xEECC, 0x91A0}, //11726 #CJK UNIFIED IDEOGRAPH
+ {0xEECD, 0x93A1}, //11727 #CJK UNIFIED IDEOGRAPH
+ {0xEECE, 0x9383}, //11728 #CJK UNIFIED IDEOGRAPH
+ {0xEECF, 0x93AF}, //11729 #CJK UNIFIED IDEOGRAPH
+ {0xEED0, 0x9364}, //11730 #CJK UNIFIED IDEOGRAPH
+ {0xEED1, 0x9356}, //11731 #CJK UNIFIED IDEOGRAPH
+ {0xEED2, 0x9347}, //11732 #CJK UNIFIED IDEOGRAPH
+ {0xEED3, 0x937C}, //11733 #CJK UNIFIED IDEOGRAPH
+ {0xEED4, 0x9358}, //11734 #CJK UNIFIED IDEOGRAPH
+ {0xEED5, 0x935C}, //11735 #CJK UNIFIED IDEOGRAPH
+ {0xEED6, 0x9376}, //11736 #CJK UNIFIED IDEOGRAPH
+ {0xEED7, 0x9349}, //11737 #CJK UNIFIED IDEOGRAPH
+ {0xEED8, 0x9350}, //11738 #CJK UNIFIED IDEOGRAPH
+ {0xEED9, 0x9351}, //11739 #CJK UNIFIED IDEOGRAPH
+ {0xEEDA, 0x9360}, //11740 #CJK UNIFIED IDEOGRAPH
+ {0xEEDB, 0x936D}, //11741 #CJK UNIFIED IDEOGRAPH
+ {0xEEDC, 0x938F}, //11742 #CJK UNIFIED IDEOGRAPH
+ {0xEEDD, 0x934C}, //11743 #CJK UNIFIED IDEOGRAPH
+ {0xEEDE, 0x936A}, //11744 #CJK UNIFIED IDEOGRAPH
+ {0xEEDF, 0x9379}, //11745 #CJK UNIFIED IDEOGRAPH
+ {0xEEE0, 0x9357}, //11746 #CJK UNIFIED IDEOGRAPH
+ {0xEEE1, 0x9355}, //11747 #CJK UNIFIED IDEOGRAPH
+ {0xEEE2, 0x9352}, //11748 #CJK UNIFIED IDEOGRAPH
+ {0xEEE3, 0x934F}, //11749 #CJK UNIFIED IDEOGRAPH
+ {0xEEE4, 0x9371}, //11750 #CJK UNIFIED IDEOGRAPH
+ {0xEEE5, 0x9377}, //11751 #CJK UNIFIED IDEOGRAPH
+ {0xEEE6, 0x937B}, //11752 #CJK UNIFIED IDEOGRAPH
+ {0xEEE7, 0x9361}, //11753 #CJK UNIFIED IDEOGRAPH
+ {0xEEE8, 0x935E}, //11754 #CJK UNIFIED IDEOGRAPH
+ {0xEEE9, 0x9363}, //11755 #CJK UNIFIED IDEOGRAPH
+ {0xEEEA, 0x9367}, //11756 #CJK UNIFIED IDEOGRAPH
+ {0xEEEB, 0x9380}, //11757 #CJK UNIFIED IDEOGRAPH
+ {0xEEEC, 0x934E}, //11758 #CJK UNIFIED IDEOGRAPH
+ {0xEEED, 0x9359}, //11759 #CJK UNIFIED IDEOGRAPH
+ {0xEEEE, 0x95C7}, //11760 #CJK UNIFIED IDEOGRAPH
+ {0xEEEF, 0x95C0}, //11761 #CJK UNIFIED IDEOGRAPH
+ {0xEEF0, 0x95C9}, //11762 #CJK UNIFIED IDEOGRAPH
+ {0xEEF1, 0x95C3}, //11763 #CJK UNIFIED IDEOGRAPH
+ {0xEEF2, 0x95C5}, //11764 #CJK UNIFIED IDEOGRAPH
+ {0xEEF3, 0x95B7}, //11765 #CJK UNIFIED IDEOGRAPH
+ {0xEEF4, 0x96AE}, //11766 #CJK UNIFIED IDEOGRAPH
+ {0xEEF5, 0x96B0}, //11767 #CJK UNIFIED IDEOGRAPH
+ {0xEEF6, 0x96AC}, //11768 #CJK UNIFIED IDEOGRAPH
+ {0xEEF7, 0x9720}, //11769 #CJK UNIFIED IDEOGRAPH
+ {0xEEF8, 0x971F}, //11770 #CJK UNIFIED IDEOGRAPH
+ {0xEEF9, 0x9718}, //11771 #CJK UNIFIED IDEOGRAPH
+ {0xEEFA, 0x971D}, //11772 #CJK UNIFIED IDEOGRAPH
+ {0xEEFB, 0x9719}, //11773 #CJK UNIFIED IDEOGRAPH
+ {0xEEFC, 0x979A}, //11774 #CJK UNIFIED IDEOGRAPH
+ {0xEEFD, 0x97A1}, //11775 #CJK UNIFIED IDEOGRAPH
+ {0xEEFE, 0x979C}, //11776 #CJK UNIFIED IDEOGRAPH
+ {0xEF40, 0x979E}, //11777 #CJK UNIFIED IDEOGRAPH
+ {0xEF41, 0x979D}, //11778 #CJK UNIFIED IDEOGRAPH
+ {0xEF42, 0x97D5}, //11779 #CJK UNIFIED IDEOGRAPH
+ {0xEF43, 0x97D4}, //11780 #CJK UNIFIED IDEOGRAPH
+ {0xEF44, 0x97F1}, //11781 #CJK UNIFIED IDEOGRAPH
+ {0xEF45, 0x9841}, //11782 #CJK UNIFIED IDEOGRAPH
+ {0xEF46, 0x9844}, //11783 #CJK UNIFIED IDEOGRAPH
+ {0xEF47, 0x984A}, //11784 #CJK UNIFIED IDEOGRAPH
+ {0xEF48, 0x9849}, //11785 #CJK UNIFIED IDEOGRAPH
+ {0xEF49, 0x9845}, //11786 #CJK UNIFIED IDEOGRAPH
+ {0xEF4A, 0x9843}, //11787 #CJK UNIFIED IDEOGRAPH
+ {0xEF4B, 0x9925}, //11788 #CJK UNIFIED IDEOGRAPH
+ {0xEF4C, 0x992B}, //11789 #CJK UNIFIED IDEOGRAPH
+ {0xEF4D, 0x992C}, //11790 #CJK UNIFIED IDEOGRAPH
+ {0xEF4E, 0x992A}, //11791 #CJK UNIFIED IDEOGRAPH
+ {0xEF4F, 0x9933}, //11792 #CJK UNIFIED IDEOGRAPH
+ {0xEF50, 0x9932}, //11793 #CJK UNIFIED IDEOGRAPH
+ {0xEF51, 0x992F}, //11794 #CJK UNIFIED IDEOGRAPH
+ {0xEF52, 0x992D}, //11795 #CJK UNIFIED IDEOGRAPH
+ {0xEF53, 0x9931}, //11796 #CJK UNIFIED IDEOGRAPH
+ {0xEF54, 0x9930}, //11797 #CJK UNIFIED IDEOGRAPH
+ {0xEF55, 0x9998}, //11798 #CJK UNIFIED IDEOGRAPH
+ {0xEF56, 0x99A3}, //11799 #CJK UNIFIED IDEOGRAPH
+ {0xEF57, 0x99A1}, //11800 #CJK UNIFIED IDEOGRAPH
+ {0xEF58, 0x9A02}, //11801 #CJK UNIFIED IDEOGRAPH
+ {0xEF59, 0x99FA}, //11802 #CJK UNIFIED IDEOGRAPH
+ {0xEF5A, 0x99F4}, //11803 #CJK UNIFIED IDEOGRAPH
+ {0xEF5B, 0x99F7}, //11804 #CJK UNIFIED IDEOGRAPH
+ {0xEF5C, 0x99F9}, //11805 #CJK UNIFIED IDEOGRAPH
+ {0xEF5D, 0x99F8}, //11806 #CJK UNIFIED IDEOGRAPH
+ {0xEF5E, 0x99F6}, //11807 #CJK UNIFIED IDEOGRAPH
+ {0xEF5F, 0x99FB}, //11808 #CJK UNIFIED IDEOGRAPH
+ {0xEF60, 0x99FD}, //11809 #CJK UNIFIED IDEOGRAPH
+ {0xEF61, 0x99FE}, //11810 #CJK UNIFIED IDEOGRAPH
+ {0xEF62, 0x99FC}, //11811 #CJK UNIFIED IDEOGRAPH
+ {0xEF63, 0x9A03}, //11812 #CJK UNIFIED IDEOGRAPH
+ {0xEF64, 0x9ABE}, //11813 #CJK UNIFIED IDEOGRAPH
+ {0xEF65, 0x9AFE}, //11814 #CJK UNIFIED IDEOGRAPH
+ {0xEF66, 0x9AFD}, //11815 #CJK UNIFIED IDEOGRAPH
+ {0xEF67, 0x9B01}, //11816 #CJK UNIFIED IDEOGRAPH
+ {0xEF68, 0x9AFC}, //11817 #CJK UNIFIED IDEOGRAPH
+ {0xEF69, 0x9B48}, //11818 #CJK UNIFIED IDEOGRAPH
+ {0xEF6A, 0x9B9A}, //11819 #CJK UNIFIED IDEOGRAPH
+ {0xEF6B, 0x9BA8}, //11820 #CJK UNIFIED IDEOGRAPH
+ {0xEF6C, 0x9B9E}, //11821 #CJK UNIFIED IDEOGRAPH
+ {0xEF6D, 0x9B9B}, //11822 #CJK UNIFIED IDEOGRAPH
+ {0xEF6E, 0x9BA6}, //11823 #CJK UNIFIED IDEOGRAPH
+ {0xEF6F, 0x9BA1}, //11824 #CJK UNIFIED IDEOGRAPH
+ {0xEF70, 0x9BA5}, //11825 #CJK UNIFIED IDEOGRAPH
+ {0xEF71, 0x9BA4}, //11826 #CJK UNIFIED IDEOGRAPH
+ {0xEF72, 0x9B86}, //11827 #CJK UNIFIED IDEOGRAPH
+ {0xEF73, 0x9BA2}, //11828 #CJK UNIFIED IDEOGRAPH
+ {0xEF74, 0x9BA0}, //11829 #CJK UNIFIED IDEOGRAPH
+ {0xEF75, 0x9BAF}, //11830 #CJK UNIFIED IDEOGRAPH
+ {0xEF76, 0x9D33}, //11831 #CJK UNIFIED IDEOGRAPH
+ {0xEF77, 0x9D41}, //11832 #CJK UNIFIED IDEOGRAPH
+ {0xEF78, 0x9D67}, //11833 #CJK UNIFIED IDEOGRAPH
+ {0xEF79, 0x9D36}, //11834 #CJK UNIFIED IDEOGRAPH
+ {0xEF7A, 0x9D2E}, //11835 #CJK UNIFIED IDEOGRAPH
+ {0xEF7B, 0x9D2F}, //11836 #CJK UNIFIED IDEOGRAPH
+ {0xEF7C, 0x9D31}, //11837 #CJK UNIFIED IDEOGRAPH
+ {0xEF7D, 0x9D38}, //11838 #CJK UNIFIED IDEOGRAPH
+ {0xEF7E, 0x9D30}, //11839 #CJK UNIFIED IDEOGRAPH
+ {0xEFA1, 0x9D45}, //11840 #CJK UNIFIED IDEOGRAPH
+ {0xEFA2, 0x9D42}, //11841 #CJK UNIFIED IDEOGRAPH
+ {0xEFA3, 0x9D43}, //11842 #CJK UNIFIED IDEOGRAPH
+ {0xEFA4, 0x9D3E}, //11843 #CJK UNIFIED IDEOGRAPH
+ {0xEFA5, 0x9D37}, //11844 #CJK UNIFIED IDEOGRAPH
+ {0xEFA6, 0x9D40}, //11845 #CJK UNIFIED IDEOGRAPH
+ {0xEFA7, 0x9D3D}, //11846 #CJK UNIFIED IDEOGRAPH
+ {0xEFA8, 0x7FF5}, //11847 #CJK UNIFIED IDEOGRAPH
+ {0xEFA9, 0x9D2D}, //11848 #CJK UNIFIED IDEOGRAPH
+ {0xEFAA, 0x9E8A}, //11849 #CJK UNIFIED IDEOGRAPH
+ {0xEFAB, 0x9E89}, //11850 #CJK UNIFIED IDEOGRAPH
+ {0xEFAC, 0x9E8D}, //11851 #CJK UNIFIED IDEOGRAPH
+ {0xEFAD, 0x9EB0}, //11852 #CJK UNIFIED IDEOGRAPH
+ {0xEFAE, 0x9EC8}, //11853 #CJK UNIFIED IDEOGRAPH
+ {0xEFAF, 0x9EDA}, //11854 #CJK UNIFIED IDEOGRAPH
+ {0xEFB0, 0x9EFB}, //11855 #CJK UNIFIED IDEOGRAPH
+ {0xEFB1, 0x9EFF}, //11856 #CJK UNIFIED IDEOGRAPH
+ {0xEFB2, 0x9F24}, //11857 #CJK UNIFIED IDEOGRAPH
+ {0xEFB3, 0x9F23}, //11858 #CJK UNIFIED IDEOGRAPH
+ {0xEFB4, 0x9F22}, //11859 #CJK UNIFIED IDEOGRAPH
+ {0xEFB5, 0x9F54}, //11860 #CJK UNIFIED IDEOGRAPH
+ {0xEFB6, 0x9FA0}, //11861 #CJK UNIFIED IDEOGRAPH
+ {0xEFB7, 0x5131}, //11862 #CJK UNIFIED IDEOGRAPH
+ {0xEFB8, 0x512D}, //11863 #CJK UNIFIED IDEOGRAPH
+ {0xEFB9, 0x512E}, //11864 #CJK UNIFIED IDEOGRAPH
+ {0xEFBA, 0x5698}, //11865 #CJK UNIFIED IDEOGRAPH
+ {0xEFBB, 0x569C}, //11866 #CJK UNIFIED IDEOGRAPH
+ {0xEFBC, 0x5697}, //11867 #CJK UNIFIED IDEOGRAPH
+ {0xEFBD, 0x569A}, //11868 #CJK UNIFIED IDEOGRAPH
+ {0xEFBE, 0x569D}, //11869 #CJK UNIFIED IDEOGRAPH
+ {0xEFBF, 0x5699}, //11870 #CJK UNIFIED IDEOGRAPH
+ {0xEFC0, 0x5970}, //11871 #CJK UNIFIED IDEOGRAPH
+ {0xEFC1, 0x5B3C}, //11872 #CJK UNIFIED IDEOGRAPH
+ {0xEFC2, 0x5C69}, //11873 #CJK UNIFIED IDEOGRAPH
+ {0xEFC3, 0x5C6A}, //11874 #CJK UNIFIED IDEOGRAPH
+ {0xEFC4, 0x5DC0}, //11875 #CJK UNIFIED IDEOGRAPH
+ {0xEFC5, 0x5E6D}, //11876 #CJK UNIFIED IDEOGRAPH
+ {0xEFC6, 0x5E6E}, //11877 #CJK UNIFIED IDEOGRAPH
+ {0xEFC7, 0x61D8}, //11878 #CJK UNIFIED IDEOGRAPH
+ {0xEFC8, 0x61DF}, //11879 #CJK UNIFIED IDEOGRAPH
+ {0xEFC9, 0x61ED}, //11880 #CJK UNIFIED IDEOGRAPH
+ {0xEFCA, 0x61EE}, //11881 #CJK UNIFIED IDEOGRAPH
+ {0xEFCB, 0x61F1}, //11882 #CJK UNIFIED IDEOGRAPH
+ {0xEFCC, 0x61EA}, //11883 #CJK UNIFIED IDEOGRAPH
+ {0xEFCD, 0x61F0}, //11884 #CJK UNIFIED IDEOGRAPH
+ {0xEFCE, 0x61EB}, //11885 #CJK UNIFIED IDEOGRAPH
+ {0xEFCF, 0x61D6}, //11886 #CJK UNIFIED IDEOGRAPH
+ {0xEFD0, 0x61E9}, //11887 #CJK UNIFIED IDEOGRAPH
+ {0xEFD1, 0x64FF}, //11888 #CJK UNIFIED IDEOGRAPH
+ {0xEFD2, 0x6504}, //11889 #CJK UNIFIED IDEOGRAPH
+ {0xEFD3, 0x64FD}, //11890 #CJK UNIFIED IDEOGRAPH
+ {0xEFD4, 0x64F8}, //11891 #CJK UNIFIED IDEOGRAPH
+ {0xEFD5, 0x6501}, //11892 #CJK UNIFIED IDEOGRAPH
+ {0xEFD6, 0x6503}, //11893 #CJK UNIFIED IDEOGRAPH
+ {0xEFD7, 0x64FC}, //11894 #CJK UNIFIED IDEOGRAPH
+ {0xEFD8, 0x6594}, //11895 #CJK UNIFIED IDEOGRAPH
+ {0xEFD9, 0x65DB}, //11896 #CJK UNIFIED IDEOGRAPH
+ {0xEFDA, 0x66DA}, //11897 #CJK UNIFIED IDEOGRAPH
+ {0xEFDB, 0x66DB}, //11898 #CJK UNIFIED IDEOGRAPH
+ {0xEFDC, 0x66D8}, //11899 #CJK UNIFIED IDEOGRAPH
+ {0xEFDD, 0x6AC5}, //11900 #CJK UNIFIED IDEOGRAPH
+ {0xEFDE, 0x6AB9}, //11901 #CJK UNIFIED IDEOGRAPH
+ {0xEFDF, 0x6ABD}, //11902 #CJK UNIFIED IDEOGRAPH
+ {0xEFE0, 0x6AE1}, //11903 #CJK UNIFIED IDEOGRAPH
+ {0xEFE1, 0x6AC6}, //11904 #CJK UNIFIED IDEOGRAPH
+ {0xEFE2, 0x6ABA}, //11905 #CJK UNIFIED IDEOGRAPH
+ {0xEFE3, 0x6AB6}, //11906 #CJK UNIFIED IDEOGRAPH
+ {0xEFE4, 0x6AB7}, //11907 #CJK UNIFIED IDEOGRAPH
+ {0xEFE5, 0x6AC7}, //11908 #CJK UNIFIED IDEOGRAPH
+ {0xEFE6, 0x6AB4}, //11909 #CJK UNIFIED IDEOGRAPH
+ {0xEFE7, 0x6AAD}, //11910 #CJK UNIFIED IDEOGRAPH
+ {0xEFE8, 0x6B5E}, //11911 #CJK UNIFIED IDEOGRAPH
+ {0xEFE9, 0x6BC9}, //11912 #CJK UNIFIED IDEOGRAPH
+ {0xEFEA, 0x6C0B}, //11913 #CJK UNIFIED IDEOGRAPH
+ {0xEFEB, 0x7007}, //11914 #CJK UNIFIED IDEOGRAPH
+ {0xEFEC, 0x700C}, //11915 #CJK UNIFIED IDEOGRAPH
+ {0xEFED, 0x700D}, //11916 #CJK UNIFIED IDEOGRAPH
+ {0xEFEE, 0x7001}, //11917 #CJK UNIFIED IDEOGRAPH
+ {0xEFEF, 0x7005}, //11918 #CJK UNIFIED IDEOGRAPH
+ {0xEFF0, 0x7014}, //11919 #CJK UNIFIED IDEOGRAPH
+ {0xEFF1, 0x700E}, //11920 #CJK UNIFIED IDEOGRAPH
+ {0xEFF2, 0x6FFF}, //11921 #CJK UNIFIED IDEOGRAPH
+ {0xEFF3, 0x7000}, //11922 #CJK UNIFIED IDEOGRAPH
+ {0xEFF4, 0x6FFB}, //11923 #CJK UNIFIED IDEOGRAPH
+ {0xEFF5, 0x7026}, //11924 #CJK UNIFIED IDEOGRAPH
+ {0xEFF6, 0x6FFC}, //11925 #CJK UNIFIED IDEOGRAPH
+ {0xEFF7, 0x6FF7}, //11926 #CJK UNIFIED IDEOGRAPH
+ {0xEFF8, 0x700A}, //11927 #CJK UNIFIED IDEOGRAPH
+ {0xEFF9, 0x7201}, //11928 #CJK UNIFIED IDEOGRAPH
+ {0xEFFA, 0x71FF}, //11929 #CJK UNIFIED IDEOGRAPH
+ {0xEFFB, 0x71F9}, //11930 #CJK UNIFIED IDEOGRAPH
+ {0xEFFC, 0x7203}, //11931 #CJK UNIFIED IDEOGRAPH
+ {0xEFFD, 0x71FD}, //11932 #CJK UNIFIED IDEOGRAPH
+ {0xEFFE, 0x7376}, //11933 #CJK UNIFIED IDEOGRAPH
+ {0xF040, 0x74B8}, //11934 #CJK UNIFIED IDEOGRAPH
+ {0xF041, 0x74C0}, //11935 #CJK UNIFIED IDEOGRAPH
+ {0xF042, 0x74B5}, //11936 #CJK UNIFIED IDEOGRAPH
+ {0xF043, 0x74C1}, //11937 #CJK UNIFIED IDEOGRAPH
+ {0xF044, 0x74BE}, //11938 #CJK UNIFIED IDEOGRAPH
+ {0xF045, 0x74B6}, //11939 #CJK UNIFIED IDEOGRAPH
+ {0xF046, 0x74BB}, //11940 #CJK UNIFIED IDEOGRAPH
+ {0xF047, 0x74C2}, //11941 #CJK UNIFIED IDEOGRAPH
+ {0xF048, 0x7514}, //11942 #CJK UNIFIED IDEOGRAPH
+ {0xF049, 0x7513}, //11943 #CJK UNIFIED IDEOGRAPH
+ {0xF04A, 0x765C}, //11944 #CJK UNIFIED IDEOGRAPH
+ {0xF04B, 0x7664}, //11945 #CJK UNIFIED IDEOGRAPH
+ {0xF04C, 0x7659}, //11946 #CJK UNIFIED IDEOGRAPH
+ {0xF04D, 0x7650}, //11947 #CJK UNIFIED IDEOGRAPH
+ {0xF04E, 0x7653}, //11948 #CJK UNIFIED IDEOGRAPH
+ {0xF04F, 0x7657}, //11949 #CJK UNIFIED IDEOGRAPH
+ {0xF050, 0x765A}, //11950 #CJK UNIFIED IDEOGRAPH
+ {0xF051, 0x76A6}, //11951 #CJK UNIFIED IDEOGRAPH
+ {0xF052, 0x76BD}, //11952 #CJK UNIFIED IDEOGRAPH
+ {0xF053, 0x76EC}, //11953 #CJK UNIFIED IDEOGRAPH
+ {0xF054, 0x77C2}, //11954 #CJK UNIFIED IDEOGRAPH
+ {0xF055, 0x77BA}, //11955 #CJK UNIFIED IDEOGRAPH
+ {0xF056, 0x78FF}, //11956 #CJK UNIFIED IDEOGRAPH
+ {0xF057, 0x790C}, //11957 #CJK UNIFIED IDEOGRAPH
+ {0xF058, 0x7913}, //11958 #CJK UNIFIED IDEOGRAPH
+ {0xF059, 0x7914}, //11959 #CJK UNIFIED IDEOGRAPH
+ {0xF05A, 0x7909}, //11960 #CJK UNIFIED IDEOGRAPH
+ {0xF05B, 0x7910}, //11961 #CJK UNIFIED IDEOGRAPH
+ {0xF05C, 0x7912}, //11962 #CJK UNIFIED IDEOGRAPH
+ {0xF05D, 0x7911}, //11963 #CJK UNIFIED IDEOGRAPH
+ {0xF05E, 0x79AD}, //11964 #CJK UNIFIED IDEOGRAPH
+ {0xF05F, 0x79AC}, //11965 #CJK UNIFIED IDEOGRAPH
+ {0xF060, 0x7A5F}, //11966 #CJK UNIFIED IDEOGRAPH
+ {0xF061, 0x7C1C}, //11967 #CJK UNIFIED IDEOGRAPH
+ {0xF062, 0x7C29}, //11968 #CJK UNIFIED IDEOGRAPH
+ {0xF063, 0x7C19}, //11969 #CJK UNIFIED IDEOGRAPH
+ {0xF064, 0x7C20}, //11970 #CJK UNIFIED IDEOGRAPH
+ {0xF065, 0x7C1F}, //11971 #CJK UNIFIED IDEOGRAPH
+ {0xF066, 0x7C2D}, //11972 #CJK UNIFIED IDEOGRAPH
+ {0xF067, 0x7C1D}, //11973 #CJK UNIFIED IDEOGRAPH
+ {0xF068, 0x7C26}, //11974 #CJK UNIFIED IDEOGRAPH
+ {0xF069, 0x7C28}, //11975 #CJK UNIFIED IDEOGRAPH
+ {0xF06A, 0x7C22}, //11976 #CJK UNIFIED IDEOGRAPH
+ {0xF06B, 0x7C25}, //11977 #CJK UNIFIED IDEOGRAPH
+ {0xF06C, 0x7C30}, //11978 #CJK UNIFIED IDEOGRAPH
+ {0xF06D, 0x7E5C}, //11979 #CJK UNIFIED IDEOGRAPH
+ {0xF06E, 0x7E50}, //11980 #CJK UNIFIED IDEOGRAPH
+ {0xF06F, 0x7E56}, //11981 #CJK UNIFIED IDEOGRAPH
+ {0xF070, 0x7E63}, //11982 #CJK UNIFIED IDEOGRAPH
+ {0xF071, 0x7E58}, //11983 #CJK UNIFIED IDEOGRAPH
+ {0xF072, 0x7E62}, //11984 #CJK UNIFIED IDEOGRAPH
+ {0xF073, 0x7E5F}, //11985 #CJK UNIFIED IDEOGRAPH
+ {0xF074, 0x7E51}, //11986 #CJK UNIFIED IDEOGRAPH
+ {0xF075, 0x7E60}, //11987 #CJK UNIFIED IDEOGRAPH
+ {0xF076, 0x7E57}, //11988 #CJK UNIFIED IDEOGRAPH
+ {0xF077, 0x7E53}, //11989 #CJK UNIFIED IDEOGRAPH
+ {0xF078, 0x7FB5}, //11990 #CJK UNIFIED IDEOGRAPH
+ {0xF079, 0x7FB3}, //11991 #CJK UNIFIED IDEOGRAPH
+ {0xF07A, 0x7FF7}, //11992 #CJK UNIFIED IDEOGRAPH
+ {0xF07B, 0x7FF8}, //11993 #CJK UNIFIED IDEOGRAPH
+ {0xF07C, 0x8075}, //11994 #CJK UNIFIED IDEOGRAPH
+ {0xF07D, 0x81D1}, //11995 #CJK UNIFIED IDEOGRAPH
+ {0xF07E, 0x81D2}, //11996 #CJK UNIFIED IDEOGRAPH
+ {0xF0A1, 0x81D0}, //11997 #CJK UNIFIED IDEOGRAPH
+ {0xF0A2, 0x825F}, //11998 #CJK UNIFIED IDEOGRAPH
+ {0xF0A3, 0x825E}, //11999 #CJK UNIFIED IDEOGRAPH
+ {0xF0A4, 0x85B4}, //12000 #CJK UNIFIED IDEOGRAPH
+ {0xF0A5, 0x85C6}, //12001 #CJK UNIFIED IDEOGRAPH
+ {0xF0A6, 0x85C0}, //12002 #CJK UNIFIED IDEOGRAPH
+ {0xF0A7, 0x85C3}, //12003 #CJK UNIFIED IDEOGRAPH
+ {0xF0A8, 0x85C2}, //12004 #CJK UNIFIED IDEOGRAPH
+ {0xF0A9, 0x85B3}, //12005 #CJK UNIFIED IDEOGRAPH
+ {0xF0AA, 0x85B5}, //12006 #CJK UNIFIED IDEOGRAPH
+ {0xF0AB, 0x85BD}, //12007 #CJK UNIFIED IDEOGRAPH
+ {0xF0AC, 0x85C7}, //12008 #CJK UNIFIED IDEOGRAPH
+ {0xF0AD, 0x85C4}, //12009 #CJK UNIFIED IDEOGRAPH
+ {0xF0AE, 0x85BF}, //12010 #CJK UNIFIED IDEOGRAPH
+ {0xF0AF, 0x85CB}, //12011 #CJK UNIFIED IDEOGRAPH
+ {0xF0B0, 0x85CE}, //12012 #CJK UNIFIED IDEOGRAPH
+ {0xF0B1, 0x85C8}, //12013 #CJK UNIFIED IDEOGRAPH
+ {0xF0B2, 0x85C5}, //12014 #CJK UNIFIED IDEOGRAPH
+ {0xF0B3, 0x85B1}, //12015 #CJK UNIFIED IDEOGRAPH
+ {0xF0B4, 0x85B6}, //12016 #CJK UNIFIED IDEOGRAPH
+ {0xF0B5, 0x85D2}, //12017 #CJK UNIFIED IDEOGRAPH
+ {0xF0B6, 0x8624}, //12018 #CJK UNIFIED IDEOGRAPH
+ {0xF0B7, 0x85B8}, //12019 #CJK UNIFIED IDEOGRAPH
+ {0xF0B8, 0x85B7}, //12020 #CJK UNIFIED IDEOGRAPH
+ {0xF0B9, 0x85BE}, //12021 #CJK UNIFIED IDEOGRAPH
+ {0xF0BA, 0x8669}, //12022 #CJK UNIFIED IDEOGRAPH
+ {0xF0BB, 0x87E7}, //12023 #CJK UNIFIED IDEOGRAPH
+ {0xF0BC, 0x87E6}, //12024 #CJK UNIFIED IDEOGRAPH
+ {0xF0BD, 0x87E2}, //12025 #CJK UNIFIED IDEOGRAPH
+ {0xF0BE, 0x87DB}, //12026 #CJK UNIFIED IDEOGRAPH
+ {0xF0BF, 0x87EB}, //12027 #CJK UNIFIED IDEOGRAPH
+ {0xF0C0, 0x87EA}, //12028 #CJK UNIFIED IDEOGRAPH
+ {0xF0C1, 0x87E5}, //12029 #CJK UNIFIED IDEOGRAPH
+ {0xF0C2, 0x87DF}, //12030 #CJK UNIFIED IDEOGRAPH
+ {0xF0C3, 0x87F3}, //12031 #CJK UNIFIED IDEOGRAPH
+ {0xF0C4, 0x87E4}, //12032 #CJK UNIFIED IDEOGRAPH
+ {0xF0C5, 0x87D4}, //12033 #CJK UNIFIED IDEOGRAPH
+ {0xF0C6, 0x87DC}, //12034 #CJK UNIFIED IDEOGRAPH
+ {0xF0C7, 0x87D3}, //12035 #CJK UNIFIED IDEOGRAPH
+ {0xF0C8, 0x87ED}, //12036 #CJK UNIFIED IDEOGRAPH
+ {0xF0C9, 0x87D8}, //12037 #CJK UNIFIED IDEOGRAPH
+ {0xF0CA, 0x87E3}, //12038 #CJK UNIFIED IDEOGRAPH
+ {0xF0CB, 0x87A4}, //12039 #CJK UNIFIED IDEOGRAPH
+ {0xF0CC, 0x87D7}, //12040 #CJK UNIFIED IDEOGRAPH
+ {0xF0CD, 0x87D9}, //12041 #CJK UNIFIED IDEOGRAPH
+ {0xF0CE, 0x8801}, //12042 #CJK UNIFIED IDEOGRAPH
+ {0xF0CF, 0x87F4}, //12043 #CJK UNIFIED IDEOGRAPH
+ {0xF0D0, 0x87E8}, //12044 #CJK UNIFIED IDEOGRAPH
+ {0xF0D1, 0x87DD}, //12045 #CJK UNIFIED IDEOGRAPH
+ {0xF0D2, 0x8953}, //12046 #CJK UNIFIED IDEOGRAPH
+ {0xF0D3, 0x894B}, //12047 #CJK UNIFIED IDEOGRAPH
+ {0xF0D4, 0x894F}, //12048 #CJK UNIFIED IDEOGRAPH
+ {0xF0D5, 0x894C}, //12049 #CJK UNIFIED IDEOGRAPH
+ {0xF0D6, 0x8946}, //12050 #CJK UNIFIED IDEOGRAPH
+ {0xF0D7, 0x8950}, //12051 #CJK UNIFIED IDEOGRAPH
+ {0xF0D8, 0x8951}, //12052 #CJK UNIFIED IDEOGRAPH
+ {0xF0D9, 0x8949}, //12053 #CJK UNIFIED IDEOGRAPH
+ {0xF0DA, 0x8B2A}, //12054 #CJK UNIFIED IDEOGRAPH
+ {0xF0DB, 0x8B27}, //12055 #CJK UNIFIED IDEOGRAPH
+ {0xF0DC, 0x8B23}, //12056 #CJK UNIFIED IDEOGRAPH
+ {0xF0DD, 0x8B33}, //12057 #CJK UNIFIED IDEOGRAPH
+ {0xF0DE, 0x8B30}, //12058 #CJK UNIFIED IDEOGRAPH
+ {0xF0DF, 0x8B35}, //12059 #CJK UNIFIED IDEOGRAPH
+ {0xF0E0, 0x8B47}, //12060 #CJK UNIFIED IDEOGRAPH
+ {0xF0E1, 0x8B2F}, //12061 #CJK UNIFIED IDEOGRAPH
+ {0xF0E2, 0x8B3C}, //12062 #CJK UNIFIED IDEOGRAPH
+ {0xF0E3, 0x8B3E}, //12063 #CJK UNIFIED IDEOGRAPH
+ {0xF0E4, 0x8B31}, //12064 #CJK UNIFIED IDEOGRAPH
+ {0xF0E5, 0x8B25}, //12065 #CJK UNIFIED IDEOGRAPH
+ {0xF0E6, 0x8B37}, //12066 #CJK UNIFIED IDEOGRAPH
+ {0xF0E7, 0x8B26}, //12067 #CJK UNIFIED IDEOGRAPH
+ {0xF0E8, 0x8B36}, //12068 #CJK UNIFIED IDEOGRAPH
+ {0xF0E9, 0x8B2E}, //12069 #CJK UNIFIED IDEOGRAPH
+ {0xF0EA, 0x8B24}, //12070 #CJK UNIFIED IDEOGRAPH
+ {0xF0EB, 0x8B3B}, //12071 #CJK UNIFIED IDEOGRAPH
+ {0xF0EC, 0x8B3D}, //12072 #CJK UNIFIED IDEOGRAPH
+ {0xF0ED, 0x8B3A}, //12073 #CJK UNIFIED IDEOGRAPH
+ {0xF0EE, 0x8C42}, //12074 #CJK UNIFIED IDEOGRAPH
+ {0xF0EF, 0x8C75}, //12075 #CJK UNIFIED IDEOGRAPH
+ {0xF0F0, 0x8C99}, //12076 #CJK UNIFIED IDEOGRAPH
+ {0xF0F1, 0x8C98}, //12077 #CJK UNIFIED IDEOGRAPH
+ {0xF0F2, 0x8C97}, //12078 #CJK UNIFIED IDEOGRAPH
+ {0xF0F3, 0x8CFE}, //12079 #CJK UNIFIED IDEOGRAPH
+ {0xF0F4, 0x8D04}, //12080 #CJK UNIFIED IDEOGRAPH
+ {0xF0F5, 0x8D02}, //12081 #CJK UNIFIED IDEOGRAPH
+ {0xF0F6, 0x8D00}, //12082 #CJK UNIFIED IDEOGRAPH
+ {0xF0F7, 0x8E5C}, //12083 #CJK UNIFIED IDEOGRAPH
+ {0xF0F8, 0x8E62}, //12084 #CJK UNIFIED IDEOGRAPH
+ {0xF0F9, 0x8E60}, //12085 #CJK UNIFIED IDEOGRAPH
+ {0xF0FA, 0x8E57}, //12086 #CJK UNIFIED IDEOGRAPH
+ {0xF0FB, 0x8E56}, //12087 #CJK UNIFIED IDEOGRAPH
+ {0xF0FC, 0x8E5E}, //12088 #CJK UNIFIED IDEOGRAPH
+ {0xF0FD, 0x8E65}, //12089 #CJK UNIFIED IDEOGRAPH
+ {0xF0FE, 0x8E67}, //12090 #CJK UNIFIED IDEOGRAPH
+ {0xF140, 0x8E5B}, //12091 #CJK UNIFIED IDEOGRAPH
+ {0xF141, 0x8E5A}, //12092 #CJK UNIFIED IDEOGRAPH
+ {0xF142, 0x8E61}, //12093 #CJK UNIFIED IDEOGRAPH
+ {0xF143, 0x8E5D}, //12094 #CJK UNIFIED IDEOGRAPH
+ {0xF144, 0x8E69}, //12095 #CJK UNIFIED IDEOGRAPH
+ {0xF145, 0x8E54}, //12096 #CJK UNIFIED IDEOGRAPH
+ {0xF146, 0x8F46}, //12097 #CJK UNIFIED IDEOGRAPH
+ {0xF147, 0x8F47}, //12098 #CJK UNIFIED IDEOGRAPH
+ {0xF148, 0x8F48}, //12099 #CJK UNIFIED IDEOGRAPH
+ {0xF149, 0x8F4B}, //12100 #CJK UNIFIED IDEOGRAPH
+ {0xF14A, 0x9128}, //12101 #CJK UNIFIED IDEOGRAPH
+ {0xF14B, 0x913A}, //12102 #CJK UNIFIED IDEOGRAPH
+ {0xF14C, 0x913B}, //12103 #CJK UNIFIED IDEOGRAPH
+ {0xF14D, 0x913E}, //12104 #CJK UNIFIED IDEOGRAPH
+ {0xF14E, 0x91A8}, //12105 #CJK UNIFIED IDEOGRAPH
+ {0xF14F, 0x91A5}, //12106 #CJK UNIFIED IDEOGRAPH
+ {0xF150, 0x91A7}, //12107 #CJK UNIFIED IDEOGRAPH
+ {0xF151, 0x91AF}, //12108 #CJK UNIFIED IDEOGRAPH
+ {0xF152, 0x91AA}, //12109 #CJK UNIFIED IDEOGRAPH
+ {0xF153, 0x93B5}, //12110 #CJK UNIFIED IDEOGRAPH
+ {0xF154, 0x938C}, //12111 #CJK UNIFIED IDEOGRAPH
+ {0xF155, 0x9392}, //12112 #CJK UNIFIED IDEOGRAPH
+ {0xF156, 0x93B7}, //12113 #CJK UNIFIED IDEOGRAPH
+ {0xF157, 0x939B}, //12114 #CJK UNIFIED IDEOGRAPH
+ {0xF158, 0x939D}, //12115 #CJK UNIFIED IDEOGRAPH
+ {0xF159, 0x9389}, //12116 #CJK UNIFIED IDEOGRAPH
+ {0xF15A, 0x93A7}, //12117 #CJK UNIFIED IDEOGRAPH
+ {0xF15B, 0x938E}, //12118 #CJK UNIFIED IDEOGRAPH
+ {0xF15C, 0x93AA}, //12119 #CJK UNIFIED IDEOGRAPH
+ {0xF15D, 0x939E}, //12120 #CJK UNIFIED IDEOGRAPH
+ {0xF15E, 0x93A6}, //12121 #CJK UNIFIED IDEOGRAPH
+ {0xF15F, 0x9395}, //12122 #CJK UNIFIED IDEOGRAPH
+ {0xF160, 0x9388}, //12123 #CJK UNIFIED IDEOGRAPH
+ {0xF161, 0x9399}, //12124 #CJK UNIFIED IDEOGRAPH
+ {0xF162, 0x939F}, //12125 #CJK UNIFIED IDEOGRAPH
+ {0xF163, 0x938D}, //12126 #CJK UNIFIED IDEOGRAPH
+ {0xF164, 0x93B1}, //12127 #CJK UNIFIED IDEOGRAPH
+ {0xF165, 0x9391}, //12128 #CJK UNIFIED IDEOGRAPH
+ {0xF166, 0x93B2}, //12129 #CJK UNIFIED IDEOGRAPH
+ {0xF167, 0x93A4}, //12130 #CJK UNIFIED IDEOGRAPH
+ {0xF168, 0x93A8}, //12131 #CJK UNIFIED IDEOGRAPH
+ {0xF169, 0x93B4}, //12132 #CJK UNIFIED IDEOGRAPH
+ {0xF16A, 0x93A3}, //12133 #CJK UNIFIED IDEOGRAPH
+ {0xF16B, 0x93A5}, //12134 #CJK UNIFIED IDEOGRAPH
+ {0xF16C, 0x95D2}, //12135 #CJK UNIFIED IDEOGRAPH
+ {0xF16D, 0x95D3}, //12136 #CJK UNIFIED IDEOGRAPH
+ {0xF16E, 0x95D1}, //12137 #CJK UNIFIED IDEOGRAPH
+ {0xF16F, 0x96B3}, //12138 #CJK UNIFIED IDEOGRAPH
+ {0xF170, 0x96D7}, //12139 #CJK UNIFIED IDEOGRAPH
+ {0xF171, 0x96DA}, //12140 #CJK UNIFIED IDEOGRAPH
+ {0xF172, 0x5DC2}, //12141 #CJK UNIFIED IDEOGRAPH
+ {0xF173, 0x96DF}, //12142 #CJK UNIFIED IDEOGRAPH
+ {0xF174, 0x96D8}, //12143 #CJK UNIFIED IDEOGRAPH
+ {0xF175, 0x96DD}, //12144 #CJK UNIFIED IDEOGRAPH
+ {0xF176, 0x9723}, //12145 #CJK UNIFIED IDEOGRAPH
+ {0xF177, 0x9722}, //12146 #CJK UNIFIED IDEOGRAPH
+ {0xF178, 0x9725}, //12147 #CJK UNIFIED IDEOGRAPH
+ {0xF179, 0x97AC}, //12148 #CJK UNIFIED IDEOGRAPH
+ {0xF17A, 0x97AE}, //12149 #CJK UNIFIED IDEOGRAPH
+ {0xF17B, 0x97A8}, //12150 #CJK UNIFIED IDEOGRAPH
+ {0xF17C, 0x97AB}, //12151 #CJK UNIFIED IDEOGRAPH
+ {0xF17D, 0x97A4}, //12152 #CJK UNIFIED IDEOGRAPH
+ {0xF17E, 0x97AA}, //12153 #CJK UNIFIED IDEOGRAPH
+ {0xF1A1, 0x97A2}, //12154 #CJK UNIFIED IDEOGRAPH
+ {0xF1A2, 0x97A5}, //12155 #CJK UNIFIED IDEOGRAPH
+ {0xF1A3, 0x97D7}, //12156 #CJK UNIFIED IDEOGRAPH
+ {0xF1A4, 0x97D9}, //12157 #CJK UNIFIED IDEOGRAPH
+ {0xF1A5, 0x97D6}, //12158 #CJK UNIFIED IDEOGRAPH
+ {0xF1A6, 0x97D8}, //12159 #CJK UNIFIED IDEOGRAPH
+ {0xF1A7, 0x97FA}, //12160 #CJK UNIFIED IDEOGRAPH
+ {0xF1A8, 0x9850}, //12161 #CJK UNIFIED IDEOGRAPH
+ {0xF1A9, 0x9851}, //12162 #CJK UNIFIED IDEOGRAPH
+ {0xF1AA, 0x9852}, //12163 #CJK UNIFIED IDEOGRAPH
+ {0xF1AB, 0x98B8}, //12164 #CJK UNIFIED IDEOGRAPH
+ {0xF1AC, 0x9941}, //12165 #CJK UNIFIED IDEOGRAPH
+ {0xF1AD, 0x993C}, //12166 #CJK UNIFIED IDEOGRAPH
+ {0xF1AE, 0x993A}, //12167 #CJK UNIFIED IDEOGRAPH
+ {0xF1AF, 0x9A0F}, //12168 #CJK UNIFIED IDEOGRAPH
+ {0xF1B0, 0x9A0B}, //12169 #CJK UNIFIED IDEOGRAPH
+ {0xF1B1, 0x9A09}, //12170 #CJK UNIFIED IDEOGRAPH
+ {0xF1B2, 0x9A0D}, //12171 #CJK UNIFIED IDEOGRAPH
+ {0xF1B3, 0x9A04}, //12172 #CJK UNIFIED IDEOGRAPH
+ {0xF1B4, 0x9A11}, //12173 #CJK UNIFIED IDEOGRAPH
+ {0xF1B5, 0x9A0A}, //12174 #CJK UNIFIED IDEOGRAPH
+ {0xF1B6, 0x9A05}, //12175 #CJK UNIFIED IDEOGRAPH
+ {0xF1B7, 0x9A07}, //12176 #CJK UNIFIED IDEOGRAPH
+ {0xF1B8, 0x9A06}, //12177 #CJK UNIFIED IDEOGRAPH
+ {0xF1B9, 0x9AC0}, //12178 #CJK UNIFIED IDEOGRAPH
+ {0xF1BA, 0x9ADC}, //12179 #CJK UNIFIED IDEOGRAPH
+ {0xF1BB, 0x9B08}, //12180 #CJK UNIFIED IDEOGRAPH
+ {0xF1BC, 0x9B04}, //12181 #CJK UNIFIED IDEOGRAPH
+ {0xF1BD, 0x9B05}, //12182 #CJK UNIFIED IDEOGRAPH
+ {0xF1BE, 0x9B29}, //12183 #CJK UNIFIED IDEOGRAPH
+ {0xF1BF, 0x9B35}, //12184 #CJK UNIFIED IDEOGRAPH
+ {0xF1C0, 0x9B4A}, //12185 #CJK UNIFIED IDEOGRAPH
+ {0xF1C1, 0x9B4C}, //12186 #CJK UNIFIED IDEOGRAPH
+ {0xF1C2, 0x9B4B}, //12187 #CJK UNIFIED IDEOGRAPH
+ {0xF1C3, 0x9BC7}, //12188 #CJK UNIFIED IDEOGRAPH
+ {0xF1C4, 0x9BC6}, //12189 #CJK UNIFIED IDEOGRAPH
+ {0xF1C5, 0x9BC3}, //12190 #CJK UNIFIED IDEOGRAPH
+ {0xF1C6, 0x9BBF}, //12191 #CJK UNIFIED IDEOGRAPH
+ {0xF1C7, 0x9BC1}, //12192 #CJK UNIFIED IDEOGRAPH
+ {0xF1C8, 0x9BB5}, //12193 #CJK UNIFIED IDEOGRAPH
+ {0xF1C9, 0x9BB8}, //12194 #CJK UNIFIED IDEOGRAPH
+ {0xF1CA, 0x9BD3}, //12195 #CJK UNIFIED IDEOGRAPH
+ {0xF1CB, 0x9BB6}, //12196 #CJK UNIFIED IDEOGRAPH
+ {0xF1CC, 0x9BC4}, //12197 #CJK UNIFIED IDEOGRAPH
+ {0xF1CD, 0x9BB9}, //12198 #CJK UNIFIED IDEOGRAPH
+ {0xF1CE, 0x9BBD}, //12199 #CJK UNIFIED IDEOGRAPH
+ {0xF1CF, 0x9D5C}, //12200 #CJK UNIFIED IDEOGRAPH
+ {0xF1D0, 0x9D53}, //12201 #CJK UNIFIED IDEOGRAPH
+ {0xF1D1, 0x9D4F}, //12202 #CJK UNIFIED IDEOGRAPH
+ {0xF1D2, 0x9D4A}, //12203 #CJK UNIFIED IDEOGRAPH
+ {0xF1D3, 0x9D5B}, //12204 #CJK UNIFIED IDEOGRAPH
+ {0xF1D4, 0x9D4B}, //12205 #CJK UNIFIED IDEOGRAPH
+ {0xF1D5, 0x9D59}, //12206 #CJK UNIFIED IDEOGRAPH
+ {0xF1D6, 0x9D56}, //12207 #CJK UNIFIED IDEOGRAPH
+ {0xF1D7, 0x9D4C}, //12208 #CJK UNIFIED IDEOGRAPH
+ {0xF1D8, 0x9D57}, //12209 #CJK UNIFIED IDEOGRAPH
+ {0xF1D9, 0x9D52}, //12210 #CJK UNIFIED IDEOGRAPH
+ {0xF1DA, 0x9D54}, //12211 #CJK UNIFIED IDEOGRAPH
+ {0xF1DB, 0x9D5F}, //12212 #CJK UNIFIED IDEOGRAPH
+ {0xF1DC, 0x9D58}, //12213 #CJK UNIFIED IDEOGRAPH
+ {0xF1DD, 0x9D5A}, //12214 #CJK UNIFIED IDEOGRAPH
+ {0xF1DE, 0x9E8E}, //12215 #CJK UNIFIED IDEOGRAPH
+ {0xF1DF, 0x9E8C}, //12216 #CJK UNIFIED IDEOGRAPH
+ {0xF1E0, 0x9EDF}, //12217 #CJK UNIFIED IDEOGRAPH
+ {0xF1E1, 0x9F01}, //12218 #CJK UNIFIED IDEOGRAPH
+ {0xF1E2, 0x9F00}, //12219 #CJK UNIFIED IDEOGRAPH
+ {0xF1E3, 0x9F16}, //12220 #CJK UNIFIED IDEOGRAPH
+ {0xF1E4, 0x9F25}, //12221 #CJK UNIFIED IDEOGRAPH
+ {0xF1E5, 0x9F2B}, //12222 #CJK UNIFIED IDEOGRAPH
+ {0xF1E6, 0x9F2A}, //12223 #CJK UNIFIED IDEOGRAPH
+ {0xF1E7, 0x9F29}, //12224 #CJK UNIFIED IDEOGRAPH
+ {0xF1E8, 0x9F28}, //12225 #CJK UNIFIED IDEOGRAPH
+ {0xF1E9, 0x9F4C}, //12226 #CJK UNIFIED IDEOGRAPH
+ {0xF1EA, 0x9F55}, //12227 #CJK UNIFIED IDEOGRAPH
+ {0xF1EB, 0x5134}, //12228 #CJK UNIFIED IDEOGRAPH
+ {0xF1EC, 0x5135}, //12229 #CJK UNIFIED IDEOGRAPH
+ {0xF1ED, 0x5296}, //12230 #CJK UNIFIED IDEOGRAPH
+ {0xF1EE, 0x52F7}, //12231 #CJK UNIFIED IDEOGRAPH
+ {0xF1EF, 0x53B4}, //12232 #CJK UNIFIED IDEOGRAPH
+ {0xF1F0, 0x56AB}, //12233 #CJK UNIFIED IDEOGRAPH
+ {0xF1F1, 0x56AD}, //12234 #CJK UNIFIED IDEOGRAPH
+ {0xF1F2, 0x56A6}, //12235 #CJK UNIFIED IDEOGRAPH
+ {0xF1F3, 0x56A7}, //12236 #CJK UNIFIED IDEOGRAPH
+ {0xF1F4, 0x56AA}, //12237 #CJK UNIFIED IDEOGRAPH
+ {0xF1F5, 0x56AC}, //12238 #CJK UNIFIED IDEOGRAPH
+ {0xF1F6, 0x58DA}, //12239 #CJK UNIFIED IDEOGRAPH
+ {0xF1F7, 0x58DD}, //12240 #CJK UNIFIED IDEOGRAPH
+ {0xF1F8, 0x58DB}, //12241 #CJK UNIFIED IDEOGRAPH
+ {0xF1F9, 0x5912}, //12242 #CJK UNIFIED IDEOGRAPH
+ {0xF1FA, 0x5B3D}, //12243 #CJK UNIFIED IDEOGRAPH
+ {0xF1FB, 0x5B3E}, //12244 #CJK UNIFIED IDEOGRAPH
+ {0xF1FC, 0x5B3F}, //12245 #CJK UNIFIED IDEOGRAPH
+ {0xF1FD, 0x5DC3}, //12246 #CJK UNIFIED IDEOGRAPH
+ {0xF1FE, 0x5E70}, //12247 #CJK UNIFIED IDEOGRAPH
+ {0xF240, 0x5FBF}, //12248 #CJK UNIFIED IDEOGRAPH
+ {0xF241, 0x61FB}, //12249 #CJK UNIFIED IDEOGRAPH
+ {0xF242, 0x6507}, //12250 #CJK UNIFIED IDEOGRAPH
+ {0xF243, 0x6510}, //12251 #CJK UNIFIED IDEOGRAPH
+ {0xF244, 0x650D}, //12252 #CJK UNIFIED IDEOGRAPH
+ {0xF245, 0x6509}, //12253 #CJK UNIFIED IDEOGRAPH
+ {0xF246, 0x650C}, //12254 #CJK UNIFIED IDEOGRAPH
+ {0xF247, 0x650E}, //12255 #CJK UNIFIED IDEOGRAPH
+ {0xF248, 0x6584}, //12256 #CJK UNIFIED IDEOGRAPH
+ {0xF249, 0x65DE}, //12257 #CJK UNIFIED IDEOGRAPH
+ {0xF24A, 0x65DD}, //12258 #CJK UNIFIED IDEOGRAPH
+ {0xF24B, 0x66DE}, //12259 #CJK UNIFIED IDEOGRAPH
+ {0xF24C, 0x6AE7}, //12260 #CJK UNIFIED IDEOGRAPH
+ {0xF24D, 0x6AE0}, //12261 #CJK UNIFIED IDEOGRAPH
+ {0xF24E, 0x6ACC}, //12262 #CJK UNIFIED IDEOGRAPH
+ {0xF24F, 0x6AD1}, //12263 #CJK UNIFIED IDEOGRAPH
+ {0xF250, 0x6AD9}, //12264 #CJK UNIFIED IDEOGRAPH
+ {0xF251, 0x6ACB}, //12265 #CJK UNIFIED IDEOGRAPH
+ {0xF252, 0x6ADF}, //12266 #CJK UNIFIED IDEOGRAPH
+ {0xF253, 0x6ADC}, //12267 #CJK UNIFIED IDEOGRAPH
+ {0xF254, 0x6AD0}, //12268 #CJK UNIFIED IDEOGRAPH
+ {0xF255, 0x6AEB}, //12269 #CJK UNIFIED IDEOGRAPH
+ {0xF256, 0x6ACF}, //12270 #CJK UNIFIED IDEOGRAPH
+ {0xF257, 0x6ACD}, //12271 #CJK UNIFIED IDEOGRAPH
+ {0xF258, 0x6ADE}, //12272 #CJK UNIFIED IDEOGRAPH
+ {0xF259, 0x6B60}, //12273 #CJK UNIFIED IDEOGRAPH
+ {0xF25A, 0x6BB0}, //12274 #CJK UNIFIED IDEOGRAPH
+ {0xF25B, 0x6C0C}, //12275 #CJK UNIFIED IDEOGRAPH
+ {0xF25C, 0x7019}, //12276 #CJK UNIFIED IDEOGRAPH
+ {0xF25D, 0x7027}, //12277 #CJK UNIFIED IDEOGRAPH
+ {0xF25E, 0x7020}, //12278 #CJK UNIFIED IDEOGRAPH
+ {0xF25F, 0x7016}, //12279 #CJK UNIFIED IDEOGRAPH
+ {0xF260, 0x702B}, //12280 #CJK UNIFIED IDEOGRAPH
+ {0xF261, 0x7021}, //12281 #CJK UNIFIED IDEOGRAPH
+ {0xF262, 0x7022}, //12282 #CJK UNIFIED IDEOGRAPH
+ {0xF263, 0x7023}, //12283 #CJK UNIFIED IDEOGRAPH
+ {0xF264, 0x7029}, //12284 #CJK UNIFIED IDEOGRAPH
+ {0xF265, 0x7017}, //12285 #CJK UNIFIED IDEOGRAPH
+ {0xF266, 0x7024}, //12286 #CJK UNIFIED IDEOGRAPH
+ {0xF267, 0x701C}, //12287 #CJK UNIFIED IDEOGRAPH
+ {0xF268, 0x702A}, //12288 #CJK UNIFIED IDEOGRAPH
+ {0xF269, 0x720C}, //12289 #CJK UNIFIED IDEOGRAPH
+ {0xF26A, 0x720A}, //12290 #CJK UNIFIED IDEOGRAPH
+ {0xF26B, 0x7207}, //12291 #CJK UNIFIED IDEOGRAPH
+ {0xF26C, 0x7202}, //12292 #CJK UNIFIED IDEOGRAPH
+ {0xF26D, 0x7205}, //12293 #CJK UNIFIED IDEOGRAPH
+ {0xF26E, 0x72A5}, //12294 #CJK UNIFIED IDEOGRAPH
+ {0xF26F, 0x72A6}, //12295 #CJK UNIFIED IDEOGRAPH
+ {0xF270, 0x72A4}, //12296 #CJK UNIFIED IDEOGRAPH
+ {0xF271, 0x72A3}, //12297 #CJK UNIFIED IDEOGRAPH
+ {0xF272, 0x72A1}, //12298 #CJK UNIFIED IDEOGRAPH
+ {0xF273, 0x74CB}, //12299 #CJK UNIFIED IDEOGRAPH
+ {0xF274, 0x74C5}, //12300 #CJK UNIFIED IDEOGRAPH
+ {0xF275, 0x74B7}, //12301 #CJK UNIFIED IDEOGRAPH
+ {0xF276, 0x74C3}, //12302 #CJK UNIFIED IDEOGRAPH
+ {0xF277, 0x7516}, //12303 #CJK UNIFIED IDEOGRAPH
+ {0xF278, 0x7660}, //12304 #CJK UNIFIED IDEOGRAPH
+ {0xF279, 0x77C9}, //12305 #CJK UNIFIED IDEOGRAPH
+ {0xF27A, 0x77CA}, //12306 #CJK UNIFIED IDEOGRAPH
+ {0xF27B, 0x77C4}, //12307 #CJK UNIFIED IDEOGRAPH
+ {0xF27C, 0x77F1}, //12308 #CJK UNIFIED IDEOGRAPH
+ {0xF27D, 0x791D}, //12309 #CJK UNIFIED IDEOGRAPH
+ {0xF27E, 0x791B}, //12310 #CJK UNIFIED IDEOGRAPH
+ {0xF2A1, 0x7921}, //12311 #CJK UNIFIED IDEOGRAPH
+ {0xF2A2, 0x791C}, //12312 #CJK UNIFIED IDEOGRAPH
+ {0xF2A3, 0x7917}, //12313 #CJK UNIFIED IDEOGRAPH
+ {0xF2A4, 0x791E}, //12314 #CJK UNIFIED IDEOGRAPH
+ {0xF2A5, 0x79B0}, //12315 #CJK UNIFIED IDEOGRAPH
+ {0xF2A6, 0x7A67}, //12316 #CJK UNIFIED IDEOGRAPH
+ {0xF2A7, 0x7A68}, //12317 #CJK UNIFIED IDEOGRAPH
+ {0xF2A8, 0x7C33}, //12318 #CJK UNIFIED IDEOGRAPH
+ {0xF2A9, 0x7C3C}, //12319 #CJK UNIFIED IDEOGRAPH
+ {0xF2AA, 0x7C39}, //12320 #CJK UNIFIED IDEOGRAPH
+ {0xF2AB, 0x7C2C}, //12321 #CJK UNIFIED IDEOGRAPH
+ {0xF2AC, 0x7C3B}, //12322 #CJK UNIFIED IDEOGRAPH
+ {0xF2AD, 0x7CEC}, //12323 #CJK UNIFIED IDEOGRAPH
+ {0xF2AE, 0x7CEA}, //12324 #CJK UNIFIED IDEOGRAPH
+ {0xF2AF, 0x7E76}, //12325 #CJK UNIFIED IDEOGRAPH
+ {0xF2B0, 0x7E75}, //12326 #CJK UNIFIED IDEOGRAPH
+ {0xF2B1, 0x7E78}, //12327 #CJK UNIFIED IDEOGRAPH
+ {0xF2B2, 0x7E70}, //12328 #CJK UNIFIED IDEOGRAPH
+ {0xF2B3, 0x7E77}, //12329 #CJK UNIFIED IDEOGRAPH
+ {0xF2B4, 0x7E6F}, //12330 #CJK UNIFIED IDEOGRAPH
+ {0xF2B5, 0x7E7A}, //12331 #CJK UNIFIED IDEOGRAPH
+ {0xF2B6, 0x7E72}, //12332 #CJK UNIFIED IDEOGRAPH
+ {0xF2B7, 0x7E74}, //12333 #CJK UNIFIED IDEOGRAPH
+ {0xF2B8, 0x7E68}, //12334 #CJK UNIFIED IDEOGRAPH
+ {0xF2B9, 0x7F4B}, //12335 #CJK UNIFIED IDEOGRAPH
+ {0xF2BA, 0x7F4A}, //12336 #CJK UNIFIED IDEOGRAPH
+ {0xF2BB, 0x7F83}, //12337 #CJK UNIFIED IDEOGRAPH
+ {0xF2BC, 0x7F86}, //12338 #CJK UNIFIED IDEOGRAPH
+ {0xF2BD, 0x7FB7}, //12339 #CJK UNIFIED IDEOGRAPH
+ {0xF2BE, 0x7FFD}, //12340 #CJK UNIFIED IDEOGRAPH
+ {0xF2BF, 0x7FFE}, //12341 #CJK UNIFIED IDEOGRAPH
+ {0xF2C0, 0x8078}, //12342 #CJK UNIFIED IDEOGRAPH
+ {0xF2C1, 0x81D7}, //12343 #CJK UNIFIED IDEOGRAPH
+ {0xF2C2, 0x81D5}, //12344 #CJK UNIFIED IDEOGRAPH
+ {0xF2C3, 0x8264}, //12345 #CJK UNIFIED IDEOGRAPH
+ {0xF2C4, 0x8261}, //12346 #CJK UNIFIED IDEOGRAPH
+ {0xF2C5, 0x8263}, //12347 #CJK UNIFIED IDEOGRAPH
+ {0xF2C6, 0x85EB}, //12348 #CJK UNIFIED IDEOGRAPH
+ {0xF2C7, 0x85F1}, //12349 #CJK UNIFIED IDEOGRAPH
+ {0xF2C8, 0x85ED}, //12350 #CJK UNIFIED IDEOGRAPH
+ {0xF2C9, 0x85D9}, //12351 #CJK UNIFIED IDEOGRAPH
+ {0xF2CA, 0x85E1}, //12352 #CJK UNIFIED IDEOGRAPH
+ {0xF2CB, 0x85E8}, //12353 #CJK UNIFIED IDEOGRAPH
+ {0xF2CC, 0x85DA}, //12354 #CJK UNIFIED IDEOGRAPH
+ {0xF2CD, 0x85D7}, //12355 #CJK UNIFIED IDEOGRAPH
+ {0xF2CE, 0x85EC}, //12356 #CJK UNIFIED IDEOGRAPH
+ {0xF2CF, 0x85F2}, //12357 #CJK UNIFIED IDEOGRAPH
+ {0xF2D0, 0x85F8}, //12358 #CJK UNIFIED IDEOGRAPH
+ {0xF2D1, 0x85D8}, //12359 #CJK UNIFIED IDEOGRAPH
+ {0xF2D2, 0x85DF}, //12360 #CJK UNIFIED IDEOGRAPH
+ {0xF2D3, 0x85E3}, //12361 #CJK UNIFIED IDEOGRAPH
+ {0xF2D4, 0x85DC}, //12362 #CJK UNIFIED IDEOGRAPH
+ {0xF2D5, 0x85D1}, //12363 #CJK UNIFIED IDEOGRAPH
+ {0xF2D6, 0x85F0}, //12364 #CJK UNIFIED IDEOGRAPH
+ {0xF2D7, 0x85E6}, //12365 #CJK UNIFIED IDEOGRAPH
+ {0xF2D8, 0x85EF}, //12366 #CJK UNIFIED IDEOGRAPH
+ {0xF2D9, 0x85DE}, //12367 #CJK UNIFIED IDEOGRAPH
+ {0xF2DA, 0x85E2}, //12368 #CJK UNIFIED IDEOGRAPH
+ {0xF2DB, 0x8800}, //12369 #CJK UNIFIED IDEOGRAPH
+ {0xF2DC, 0x87FA}, //12370 #CJK UNIFIED IDEOGRAPH
+ {0xF2DD, 0x8803}, //12371 #CJK UNIFIED IDEOGRAPH
+ {0xF2DE, 0x87F6}, //12372 #CJK UNIFIED IDEOGRAPH
+ {0xF2DF, 0x87F7}, //12373 #CJK UNIFIED IDEOGRAPH
+ {0xF2E0, 0x8809}, //12374 #CJK UNIFIED IDEOGRAPH
+ {0xF2E1, 0x880C}, //12375 #CJK UNIFIED IDEOGRAPH
+ {0xF2E2, 0x880B}, //12376 #CJK UNIFIED IDEOGRAPH
+ {0xF2E3, 0x8806}, //12377 #CJK UNIFIED IDEOGRAPH
+ {0xF2E4, 0x87FC}, //12378 #CJK UNIFIED IDEOGRAPH
+ {0xF2E5, 0x8808}, //12379 #CJK UNIFIED IDEOGRAPH
+ {0xF2E6, 0x87FF}, //12380 #CJK UNIFIED IDEOGRAPH
+ {0xF2E7, 0x880A}, //12381 #CJK UNIFIED IDEOGRAPH
+ {0xF2E8, 0x8802}, //12382 #CJK UNIFIED IDEOGRAPH
+ {0xF2E9, 0x8962}, //12383 #CJK UNIFIED IDEOGRAPH
+ {0xF2EA, 0x895A}, //12384 #CJK UNIFIED IDEOGRAPH
+ {0xF2EB, 0x895B}, //12385 #CJK UNIFIED IDEOGRAPH
+ {0xF2EC, 0x8957}, //12386 #CJK UNIFIED IDEOGRAPH
+ {0xF2ED, 0x8961}, //12387 #CJK UNIFIED IDEOGRAPH
+ {0xF2EE, 0x895C}, //12388 #CJK UNIFIED IDEOGRAPH
+ {0xF2EF, 0x8958}, //12389 #CJK UNIFIED IDEOGRAPH
+ {0xF2F0, 0x895D}, //12390 #CJK UNIFIED IDEOGRAPH
+ {0xF2F1, 0x8959}, //12391 #CJK UNIFIED IDEOGRAPH
+ {0xF2F2, 0x8988}, //12392 #CJK UNIFIED IDEOGRAPH
+ {0xF2F3, 0x89B7}, //12393 #CJK UNIFIED IDEOGRAPH
+ {0xF2F4, 0x89B6}, //12394 #CJK UNIFIED IDEOGRAPH
+ {0xF2F5, 0x89F6}, //12395 #CJK UNIFIED IDEOGRAPH
+ {0xF2F6, 0x8B50}, //12396 #CJK UNIFIED IDEOGRAPH
+ {0xF2F7, 0x8B48}, //12397 #CJK UNIFIED IDEOGRAPH
+ {0xF2F8, 0x8B4A}, //12398 #CJK UNIFIED IDEOGRAPH
+ {0xF2F9, 0x8B40}, //12399 #CJK UNIFIED IDEOGRAPH
+ {0xF2FA, 0x8B53}, //12400 #CJK UNIFIED IDEOGRAPH
+ {0xF2FB, 0x8B56}, //12401 #CJK UNIFIED IDEOGRAPH
+ {0xF2FC, 0x8B54}, //12402 #CJK UNIFIED IDEOGRAPH
+ {0xF2FD, 0x8B4B}, //12403 #CJK UNIFIED IDEOGRAPH
+ {0xF2FE, 0x8B55}, //12404 #CJK UNIFIED IDEOGRAPH
+ {0xF340, 0x8B51}, //12405 #CJK UNIFIED IDEOGRAPH
+ {0xF341, 0x8B42}, //12406 #CJK UNIFIED IDEOGRAPH
+ {0xF342, 0x8B52}, //12407 #CJK UNIFIED IDEOGRAPH
+ {0xF343, 0x8B57}, //12408 #CJK UNIFIED IDEOGRAPH
+ {0xF344, 0x8C43}, //12409 #CJK UNIFIED IDEOGRAPH
+ {0xF345, 0x8C77}, //12410 #CJK UNIFIED IDEOGRAPH
+ {0xF346, 0x8C76}, //12411 #CJK UNIFIED IDEOGRAPH
+ {0xF347, 0x8C9A}, //12412 #CJK UNIFIED IDEOGRAPH
+ {0xF348, 0x8D06}, //12413 #CJK UNIFIED IDEOGRAPH
+ {0xF349, 0x8D07}, //12414 #CJK UNIFIED IDEOGRAPH
+ {0xF34A, 0x8D09}, //12415 #CJK UNIFIED IDEOGRAPH
+ {0xF34B, 0x8DAC}, //12416 #CJK UNIFIED IDEOGRAPH
+ {0xF34C, 0x8DAA}, //12417 #CJK UNIFIED IDEOGRAPH
+ {0xF34D, 0x8DAD}, //12418 #CJK UNIFIED IDEOGRAPH
+ {0xF34E, 0x8DAB}, //12419 #CJK UNIFIED IDEOGRAPH
+ {0xF34F, 0x8E6D}, //12420 #CJK UNIFIED IDEOGRAPH
+ {0xF350, 0x8E78}, //12421 #CJK UNIFIED IDEOGRAPH
+ {0xF351, 0x8E73}, //12422 #CJK UNIFIED IDEOGRAPH
+ {0xF352, 0x8E6A}, //12423 #CJK UNIFIED IDEOGRAPH
+ {0xF353, 0x8E6F}, //12424 #CJK UNIFIED IDEOGRAPH
+ {0xF354, 0x8E7B}, //12425 #CJK UNIFIED IDEOGRAPH
+ {0xF355, 0x8EC2}, //12426 #CJK UNIFIED IDEOGRAPH
+ {0xF356, 0x8F52}, //12427 #CJK UNIFIED IDEOGRAPH
+ {0xF357, 0x8F51}, //12428 #CJK UNIFIED IDEOGRAPH
+ {0xF358, 0x8F4F}, //12429 #CJK UNIFIED IDEOGRAPH
+ {0xF359, 0x8F50}, //12430 #CJK UNIFIED IDEOGRAPH
+ {0xF35A, 0x8F53}, //12431 #CJK UNIFIED IDEOGRAPH
+ {0xF35B, 0x8FB4}, //12432 #CJK UNIFIED IDEOGRAPH
+ {0xF35C, 0x9140}, //12433 #CJK UNIFIED IDEOGRAPH
+ {0xF35D, 0x913F}, //12434 #CJK UNIFIED IDEOGRAPH
+ {0xF35E, 0x91B0}, //12435 #CJK UNIFIED IDEOGRAPH
+ {0xF35F, 0x91AD}, //12436 #CJK UNIFIED IDEOGRAPH
+ {0xF360, 0x93DE}, //12437 #CJK UNIFIED IDEOGRAPH
+ {0xF361, 0x93C7}, //12438 #CJK UNIFIED IDEOGRAPH
+ {0xF362, 0x93CF}, //12439 #CJK UNIFIED IDEOGRAPH
+ {0xF363, 0x93C2}, //12440 #CJK UNIFIED IDEOGRAPH
+ {0xF364, 0x93DA}, //12441 #CJK UNIFIED IDEOGRAPH
+ {0xF365, 0x93D0}, //12442 #CJK UNIFIED IDEOGRAPH
+ {0xF366, 0x93F9}, //12443 #CJK UNIFIED IDEOGRAPH
+ {0xF367, 0x93EC}, //12444 #CJK UNIFIED IDEOGRAPH
+ {0xF368, 0x93CC}, //12445 #CJK UNIFIED IDEOGRAPH
+ {0xF369, 0x93D9}, //12446 #CJK UNIFIED IDEOGRAPH
+ {0xF36A, 0x93A9}, //12447 #CJK UNIFIED IDEOGRAPH
+ {0xF36B, 0x93E6}, //12448 #CJK UNIFIED IDEOGRAPH
+ {0xF36C, 0x93CA}, //12449 #CJK UNIFIED IDEOGRAPH
+ {0xF36D, 0x93D4}, //12450 #CJK UNIFIED IDEOGRAPH
+ {0xF36E, 0x93EE}, //12451 #CJK UNIFIED IDEOGRAPH
+ {0xF36F, 0x93E3}, //12452 #CJK UNIFIED IDEOGRAPH
+ {0xF370, 0x93D5}, //12453 #CJK UNIFIED IDEOGRAPH
+ {0xF371, 0x93C4}, //12454 #CJK UNIFIED IDEOGRAPH
+ {0xF372, 0x93CE}, //12455 #CJK UNIFIED IDEOGRAPH
+ {0xF373, 0x93C0}, //12456 #CJK UNIFIED IDEOGRAPH
+ {0xF374, 0x93D2}, //12457 #CJK UNIFIED IDEOGRAPH
+ {0xF375, 0x93E7}, //12458 #CJK UNIFIED IDEOGRAPH
+ {0xF376, 0x957D}, //12459 #CJK UNIFIED IDEOGRAPH
+ {0xF377, 0x95DA}, //12460 #CJK UNIFIED IDEOGRAPH
+ {0xF378, 0x95DB}, //12461 #CJK UNIFIED IDEOGRAPH
+ {0xF379, 0x96E1}, //12462 #CJK UNIFIED IDEOGRAPH
+ {0xF37A, 0x9729}, //12463 #CJK UNIFIED IDEOGRAPH
+ {0xF37B, 0x972B}, //12464 #CJK UNIFIED IDEOGRAPH
+ {0xF37C, 0x972C}, //12465 #CJK UNIFIED IDEOGRAPH
+ {0xF37D, 0x9728}, //12466 #CJK UNIFIED IDEOGRAPH
+ {0xF37E, 0x9726}, //12467 #CJK UNIFIED IDEOGRAPH
+ {0xF3A1, 0x97B3}, //12468 #CJK UNIFIED IDEOGRAPH
+ {0xF3A2, 0x97B7}, //12469 #CJK UNIFIED IDEOGRAPH
+ {0xF3A3, 0x97B6}, //12470 #CJK UNIFIED IDEOGRAPH
+ {0xF3A4, 0x97DD}, //12471 #CJK UNIFIED IDEOGRAPH
+ {0xF3A5, 0x97DE}, //12472 #CJK UNIFIED IDEOGRAPH
+ {0xF3A6, 0x97DF}, //12473 #CJK UNIFIED IDEOGRAPH
+ {0xF3A7, 0x985C}, //12474 #CJK UNIFIED IDEOGRAPH
+ {0xF3A8, 0x9859}, //12475 #CJK UNIFIED IDEOGRAPH
+ {0xF3A9, 0x985D}, //12476 #CJK UNIFIED IDEOGRAPH
+ {0xF3AA, 0x9857}, //12477 #CJK UNIFIED IDEOGRAPH
+ {0xF3AB, 0x98BF}, //12478 #CJK UNIFIED IDEOGRAPH
+ {0xF3AC, 0x98BD}, //12479 #CJK UNIFIED IDEOGRAPH
+ {0xF3AD, 0x98BB}, //12480 #CJK UNIFIED IDEOGRAPH
+ {0xF3AE, 0x98BE}, //12481 #CJK UNIFIED IDEOGRAPH
+ {0xF3AF, 0x9948}, //12482 #CJK UNIFIED IDEOGRAPH
+ {0xF3B0, 0x9947}, //12483 #CJK UNIFIED IDEOGRAPH
+ {0xF3B1, 0x9943}, //12484 #CJK UNIFIED IDEOGRAPH
+ {0xF3B2, 0x99A6}, //12485 #CJK UNIFIED IDEOGRAPH
+ {0xF3B3, 0x99A7}, //12486 #CJK UNIFIED IDEOGRAPH
+ {0xF3B4, 0x9A1A}, //12487 #CJK UNIFIED IDEOGRAPH
+ {0xF3B5, 0x9A15}, //12488 #CJK UNIFIED IDEOGRAPH
+ {0xF3B6, 0x9A25}, //12489 #CJK UNIFIED IDEOGRAPH
+ {0xF3B7, 0x9A1D}, //12490 #CJK UNIFIED IDEOGRAPH
+ {0xF3B8, 0x9A24}, //12491 #CJK UNIFIED IDEOGRAPH
+ {0xF3B9, 0x9A1B}, //12492 #CJK UNIFIED IDEOGRAPH
+ {0xF3BA, 0x9A22}, //12493 #CJK UNIFIED IDEOGRAPH
+ {0xF3BB, 0x9A20}, //12494 #CJK UNIFIED IDEOGRAPH
+ {0xF3BC, 0x9A27}, //12495 #CJK UNIFIED IDEOGRAPH
+ {0xF3BD, 0x9A23}, //12496 #CJK UNIFIED IDEOGRAPH
+ {0xF3BE, 0x9A1E}, //12497 #CJK UNIFIED IDEOGRAPH
+ {0xF3BF, 0x9A1C}, //12498 #CJK UNIFIED IDEOGRAPH
+ {0xF3C0, 0x9A14}, //12499 #CJK UNIFIED IDEOGRAPH
+ {0xF3C1, 0x9AC2}, //12500 #CJK UNIFIED IDEOGRAPH
+ {0xF3C2, 0x9B0B}, //12501 #CJK UNIFIED IDEOGRAPH
+ {0xF3C3, 0x9B0A}, //12502 #CJK UNIFIED IDEOGRAPH
+ {0xF3C4, 0x9B0E}, //12503 #CJK UNIFIED IDEOGRAPH
+ {0xF3C5, 0x9B0C}, //12504 #CJK UNIFIED IDEOGRAPH
+ {0xF3C6, 0x9B37}, //12505 #CJK UNIFIED IDEOGRAPH
+ {0xF3C7, 0x9BEA}, //12506 #CJK UNIFIED IDEOGRAPH
+ {0xF3C8, 0x9BEB}, //12507 #CJK UNIFIED IDEOGRAPH
+ {0xF3C9, 0x9BE0}, //12508 #CJK UNIFIED IDEOGRAPH
+ {0xF3CA, 0x9BDE}, //12509 #CJK UNIFIED IDEOGRAPH
+ {0xF3CB, 0x9BE4}, //12510 #CJK UNIFIED IDEOGRAPH
+ {0xF3CC, 0x9BE6}, //12511 #CJK UNIFIED IDEOGRAPH
+ {0xF3CD, 0x9BE2}, //12512 #CJK UNIFIED IDEOGRAPH
+ {0xF3CE, 0x9BF0}, //12513 #CJK UNIFIED IDEOGRAPH
+ {0xF3CF, 0x9BD4}, //12514 #CJK UNIFIED IDEOGRAPH
+ {0xF3D0, 0x9BD7}, //12515 #CJK UNIFIED IDEOGRAPH
+ {0xF3D1, 0x9BEC}, //12516 #CJK UNIFIED IDEOGRAPH
+ {0xF3D2, 0x9BDC}, //12517 #CJK UNIFIED IDEOGRAPH
+ {0xF3D3, 0x9BD9}, //12518 #CJK UNIFIED IDEOGRAPH
+ {0xF3D4, 0x9BE5}, //12519 #CJK UNIFIED IDEOGRAPH
+ {0xF3D5, 0x9BD5}, //12520 #CJK UNIFIED IDEOGRAPH
+ {0xF3D6, 0x9BE1}, //12521 #CJK UNIFIED IDEOGRAPH
+ {0xF3D7, 0x9BDA}, //12522 #CJK UNIFIED IDEOGRAPH
+ {0xF3D8, 0x9D77}, //12523 #CJK UNIFIED IDEOGRAPH
+ {0xF3D9, 0x9D81}, //12524 #CJK UNIFIED IDEOGRAPH
+ {0xF3DA, 0x9D8A}, //12525 #CJK UNIFIED IDEOGRAPH
+ {0xF3DB, 0x9D84}, //12526 #CJK UNIFIED IDEOGRAPH
+ {0xF3DC, 0x9D88}, //12527 #CJK UNIFIED IDEOGRAPH
+ {0xF3DD, 0x9D71}, //12528 #CJK UNIFIED IDEOGRAPH
+ {0xF3DE, 0x9D80}, //12529 #CJK UNIFIED IDEOGRAPH
+ {0xF3DF, 0x9D78}, //12530 #CJK UNIFIED IDEOGRAPH
+ {0xF3E0, 0x9D86}, //12531 #CJK UNIFIED IDEOGRAPH
+ {0xF3E1, 0x9D8B}, //12532 #CJK UNIFIED IDEOGRAPH
+ {0xF3E2, 0x9D8C}, //12533 #CJK UNIFIED IDEOGRAPH
+ {0xF3E3, 0x9D7D}, //12534 #CJK UNIFIED IDEOGRAPH
+ {0xF3E4, 0x9D6B}, //12535 #CJK UNIFIED IDEOGRAPH
+ {0xF3E5, 0x9D74}, //12536 #CJK UNIFIED IDEOGRAPH
+ {0xF3E6, 0x9D75}, //12537 #CJK UNIFIED IDEOGRAPH
+ {0xF3E7, 0x9D70}, //12538 #CJK UNIFIED IDEOGRAPH
+ {0xF3E8, 0x9D69}, //12539 #CJK UNIFIED IDEOGRAPH
+ {0xF3E9, 0x9D85}, //12540 #CJK UNIFIED IDEOGRAPH
+ {0xF3EA, 0x9D73}, //12541 #CJK UNIFIED IDEOGRAPH
+ {0xF3EB, 0x9D7B}, //12542 #CJK UNIFIED IDEOGRAPH
+ {0xF3EC, 0x9D82}, //12543 #CJK UNIFIED IDEOGRAPH
+ {0xF3ED, 0x9D6F}, //12544 #CJK UNIFIED IDEOGRAPH
+ {0xF3EE, 0x9D79}, //12545 #CJK UNIFIED IDEOGRAPH
+ {0xF3EF, 0x9D7F}, //12546 #CJK UNIFIED IDEOGRAPH
+ {0xF3F0, 0x9D87}, //12547 #CJK UNIFIED IDEOGRAPH
+ {0xF3F1, 0x9D68}, //12548 #CJK UNIFIED IDEOGRAPH
+ {0xF3F2, 0x9E94}, //12549 #CJK UNIFIED IDEOGRAPH
+ {0xF3F3, 0x9E91}, //12550 #CJK UNIFIED IDEOGRAPH
+ {0xF3F4, 0x9EC0}, //12551 #CJK UNIFIED IDEOGRAPH
+ {0xF3F5, 0x9EFC}, //12552 #CJK UNIFIED IDEOGRAPH
+ {0xF3F6, 0x9F2D}, //12553 #CJK UNIFIED IDEOGRAPH
+ {0xF3F7, 0x9F40}, //12554 #CJK UNIFIED IDEOGRAPH
+ {0xF3F8, 0x9F41}, //12555 #CJK UNIFIED IDEOGRAPH
+ {0xF3F9, 0x9F4D}, //12556 #CJK UNIFIED IDEOGRAPH
+ {0xF3FA, 0x9F56}, //12557 #CJK UNIFIED IDEOGRAPH
+ {0xF3FB, 0x9F57}, //12558 #CJK UNIFIED IDEOGRAPH
+ {0xF3FC, 0x9F58}, //12559 #CJK UNIFIED IDEOGRAPH
+ {0xF3FD, 0x5337}, //12560 #CJK UNIFIED IDEOGRAPH
+ {0xF3FE, 0x56B2}, //12561 #CJK UNIFIED IDEOGRAPH
+ {0xF440, 0x56B5}, //12562 #CJK UNIFIED IDEOGRAPH
+ {0xF441, 0x56B3}, //12563 #CJK UNIFIED IDEOGRAPH
+ {0xF442, 0x58E3}, //12564 #CJK UNIFIED IDEOGRAPH
+ {0xF443, 0x5B45}, //12565 #CJK UNIFIED IDEOGRAPH
+ {0xF444, 0x5DC6}, //12566 #CJK UNIFIED IDEOGRAPH
+ {0xF445, 0x5DC7}, //12567 #CJK UNIFIED IDEOGRAPH
+ {0xF446, 0x5EEE}, //12568 #CJK UNIFIED IDEOGRAPH
+ {0xF447, 0x5EEF}, //12569 #CJK UNIFIED IDEOGRAPH
+ {0xF448, 0x5FC0}, //12570 #CJK UNIFIED IDEOGRAPH
+ {0xF449, 0x5FC1}, //12571 #CJK UNIFIED IDEOGRAPH
+ {0xF44A, 0x61F9}, //12572 #CJK UNIFIED IDEOGRAPH
+ {0xF44B, 0x6517}, //12573 #CJK UNIFIED IDEOGRAPH
+ {0xF44C, 0x6516}, //12574 #CJK UNIFIED IDEOGRAPH
+ {0xF44D, 0x6515}, //12575 #CJK UNIFIED IDEOGRAPH
+ {0xF44E, 0x6513}, //12576 #CJK UNIFIED IDEOGRAPH
+ {0xF44F, 0x65DF}, //12577 #CJK UNIFIED IDEOGRAPH
+ {0xF450, 0x66E8}, //12578 #CJK UNIFIED IDEOGRAPH
+ {0xF451, 0x66E3}, //12579 #CJK UNIFIED IDEOGRAPH
+ {0xF452, 0x66E4}, //12580 #CJK UNIFIED IDEOGRAPH
+ {0xF453, 0x6AF3}, //12581 #CJK UNIFIED IDEOGRAPH
+ {0xF454, 0x6AF0}, //12582 #CJK UNIFIED IDEOGRAPH
+ {0xF455, 0x6AEA}, //12583 #CJK UNIFIED IDEOGRAPH
+ {0xF456, 0x6AE8}, //12584 #CJK UNIFIED IDEOGRAPH
+ {0xF457, 0x6AF9}, //12585 #CJK UNIFIED IDEOGRAPH
+ {0xF458, 0x6AF1}, //12586 #CJK UNIFIED IDEOGRAPH
+ {0xF459, 0x6AEE}, //12587 #CJK UNIFIED IDEOGRAPH
+ {0xF45A, 0x6AEF}, //12588 #CJK UNIFIED IDEOGRAPH
+ {0xF45B, 0x703C}, //12589 #CJK UNIFIED IDEOGRAPH
+ {0xF45C, 0x7035}, //12590 #CJK UNIFIED IDEOGRAPH
+ {0xF45D, 0x702F}, //12591 #CJK UNIFIED IDEOGRAPH
+ {0xF45E, 0x7037}, //12592 #CJK UNIFIED IDEOGRAPH
+ {0xF45F, 0x7034}, //12593 #CJK UNIFIED IDEOGRAPH
+ {0xF460, 0x7031}, //12594 #CJK UNIFIED IDEOGRAPH
+ {0xF461, 0x7042}, //12595 #CJK UNIFIED IDEOGRAPH
+ {0xF462, 0x7038}, //12596 #CJK UNIFIED IDEOGRAPH
+ {0xF463, 0x703F}, //12597 #CJK UNIFIED IDEOGRAPH
+ {0xF464, 0x703A}, //12598 #CJK UNIFIED IDEOGRAPH
+ {0xF465, 0x7039}, //12599 #CJK UNIFIED IDEOGRAPH
+ {0xF466, 0x7040}, //12600 #CJK UNIFIED IDEOGRAPH
+ {0xF467, 0x703B}, //12601 #CJK UNIFIED IDEOGRAPH
+ {0xF468, 0x7033}, //12602 #CJK UNIFIED IDEOGRAPH
+ {0xF469, 0x7041}, //12603 #CJK UNIFIED IDEOGRAPH
+ {0xF46A, 0x7213}, //12604 #CJK UNIFIED IDEOGRAPH
+ {0xF46B, 0x7214}, //12605 #CJK UNIFIED IDEOGRAPH
+ {0xF46C, 0x72A8}, //12606 #CJK UNIFIED IDEOGRAPH
+ {0xF46D, 0x737D}, //12607 #CJK UNIFIED IDEOGRAPH
+ {0xF46E, 0x737C}, //12608 #CJK UNIFIED IDEOGRAPH
+ {0xF46F, 0x74BA}, //12609 #CJK UNIFIED IDEOGRAPH
+ {0xF470, 0x76AB}, //12610 #CJK UNIFIED IDEOGRAPH
+ {0xF471, 0x76AA}, //12611 #CJK UNIFIED IDEOGRAPH
+ {0xF472, 0x76BE}, //12612 #CJK UNIFIED IDEOGRAPH
+ {0xF473, 0x76ED}, //12613 #CJK UNIFIED IDEOGRAPH
+ {0xF474, 0x77CC}, //12614 #CJK UNIFIED IDEOGRAPH
+ {0xF475, 0x77CE}, //12615 #CJK UNIFIED IDEOGRAPH
+ {0xF476, 0x77CF}, //12616 #CJK UNIFIED IDEOGRAPH
+ {0xF477, 0x77CD}, //12617 #CJK UNIFIED IDEOGRAPH
+ {0xF478, 0x77F2}, //12618 #CJK UNIFIED IDEOGRAPH
+ {0xF479, 0x7925}, //12619 #CJK UNIFIED IDEOGRAPH
+ {0xF47A, 0x7923}, //12620 #CJK UNIFIED IDEOGRAPH
+ {0xF47B, 0x7927}, //12621 #CJK UNIFIED IDEOGRAPH
+ {0xF47C, 0x7928}, //12622 #CJK UNIFIED IDEOGRAPH
+ {0xF47D, 0x7924}, //12623 #CJK UNIFIED IDEOGRAPH
+ {0xF47E, 0x7929}, //12624 #CJK UNIFIED IDEOGRAPH
+ {0xF4A1, 0x79B2}, //12625 #CJK UNIFIED IDEOGRAPH
+ {0xF4A2, 0x7A6E}, //12626 #CJK UNIFIED IDEOGRAPH
+ {0xF4A3, 0x7A6C}, //12627 #CJK UNIFIED IDEOGRAPH
+ {0xF4A4, 0x7A6D}, //12628 #CJK UNIFIED IDEOGRAPH
+ {0xF4A5, 0x7AF7}, //12629 #CJK UNIFIED IDEOGRAPH
+ {0xF4A6, 0x7C49}, //12630 #CJK UNIFIED IDEOGRAPH
+ {0xF4A7, 0x7C48}, //12631 #CJK UNIFIED IDEOGRAPH
+ {0xF4A8, 0x7C4A}, //12632 #CJK UNIFIED IDEOGRAPH
+ {0xF4A9, 0x7C47}, //12633 #CJK UNIFIED IDEOGRAPH
+ {0xF4AA, 0x7C45}, //12634 #CJK UNIFIED IDEOGRAPH
+ {0xF4AB, 0x7CEE}, //12635 #CJK UNIFIED IDEOGRAPH
+ {0xF4AC, 0x7E7B}, //12636 #CJK UNIFIED IDEOGRAPH
+ {0xF4AD, 0x7E7E}, //12637 #CJK UNIFIED IDEOGRAPH
+ {0xF4AE, 0x7E81}, //12638 #CJK UNIFIED IDEOGRAPH
+ {0xF4AF, 0x7E80}, //12639 #CJK UNIFIED IDEOGRAPH
+ {0xF4B0, 0x7FBA}, //12640 #CJK UNIFIED IDEOGRAPH
+ {0xF4B1, 0x7FFF}, //12641 #CJK UNIFIED IDEOGRAPH
+ {0xF4B2, 0x8079}, //12642 #CJK UNIFIED IDEOGRAPH
+ {0xF4B3, 0x81DB}, //12643 #CJK UNIFIED IDEOGRAPH
+ {0xF4B4, 0x81D9}, //12644 #CJK UNIFIED IDEOGRAPH
+ {0xF4B5, 0x820B}, //12645 #CJK UNIFIED IDEOGRAPH
+ {0xF4B6, 0x8268}, //12646 #CJK UNIFIED IDEOGRAPH
+ {0xF4B7, 0x8269}, //12647 #CJK UNIFIED IDEOGRAPH
+ {0xF4B8, 0x8622}, //12648 #CJK UNIFIED IDEOGRAPH
+ {0xF4B9, 0x85FF}, //12649 #CJK UNIFIED IDEOGRAPH
+ {0xF4BA, 0x8601}, //12650 #CJK UNIFIED IDEOGRAPH
+ {0xF4BB, 0x85FE}, //12651 #CJK UNIFIED IDEOGRAPH
+ {0xF4BC, 0x861B}, //12652 #CJK UNIFIED IDEOGRAPH
+ {0xF4BD, 0x8600}, //12653 #CJK UNIFIED IDEOGRAPH
+ {0xF4BE, 0x85F6}, //12654 #CJK UNIFIED IDEOGRAPH
+ {0xF4BF, 0x8604}, //12655 #CJK UNIFIED IDEOGRAPH
+ {0xF4C0, 0x8609}, //12656 #CJK UNIFIED IDEOGRAPH
+ {0xF4C1, 0x8605}, //12657 #CJK UNIFIED IDEOGRAPH
+ {0xF4C2, 0x860C}, //12658 #CJK UNIFIED IDEOGRAPH
+ {0xF4C3, 0x85FD}, //12659 #CJK UNIFIED IDEOGRAPH
+ {0xF4C4, 0x8819}, //12660 #CJK UNIFIED IDEOGRAPH
+ {0xF4C5, 0x8810}, //12661 #CJK UNIFIED IDEOGRAPH
+ {0xF4C6, 0x8811}, //12662 #CJK UNIFIED IDEOGRAPH
+ {0xF4C7, 0x8817}, //12663 #CJK UNIFIED IDEOGRAPH
+ {0xF4C8, 0x8813}, //12664 #CJK UNIFIED IDEOGRAPH
+ {0xF4C9, 0x8816}, //12665 #CJK UNIFIED IDEOGRAPH
+ {0xF4CA, 0x8963}, //12666 #CJK UNIFIED IDEOGRAPH
+ {0xF4CB, 0x8966}, //12667 #CJK UNIFIED IDEOGRAPH
+ {0xF4CC, 0x89B9}, //12668 #CJK UNIFIED IDEOGRAPH
+ {0xF4CD, 0x89F7}, //12669 #CJK UNIFIED IDEOGRAPH
+ {0xF4CE, 0x8B60}, //12670 #CJK UNIFIED IDEOGRAPH
+ {0xF4CF, 0x8B6A}, //12671 #CJK UNIFIED IDEOGRAPH
+ {0xF4D0, 0x8B5D}, //12672 #CJK UNIFIED IDEOGRAPH
+ {0xF4D1, 0x8B68}, //12673 #CJK UNIFIED IDEOGRAPH
+ {0xF4D2, 0x8B63}, //12674 #CJK UNIFIED IDEOGRAPH
+ {0xF4D3, 0x8B65}, //12675 #CJK UNIFIED IDEOGRAPH
+ {0xF4D4, 0x8B67}, //12676 #CJK UNIFIED IDEOGRAPH
+ {0xF4D5, 0x8B6D}, //12677 #CJK UNIFIED IDEOGRAPH
+ {0xF4D6, 0x8DAE}, //12678 #CJK UNIFIED IDEOGRAPH
+ {0xF4D7, 0x8E86}, //12679 #CJK UNIFIED IDEOGRAPH
+ {0xF4D8, 0x8E88}, //12680 #CJK UNIFIED IDEOGRAPH
+ {0xF4D9, 0x8E84}, //12681 #CJK UNIFIED IDEOGRAPH
+ {0xF4DA, 0x8F59}, //12682 #CJK UNIFIED IDEOGRAPH
+ {0xF4DB, 0x8F56}, //12683 #CJK UNIFIED IDEOGRAPH
+ {0xF4DC, 0x8F57}, //12684 #CJK UNIFIED IDEOGRAPH
+ {0xF4DD, 0x8F55}, //12685 #CJK UNIFIED IDEOGRAPH
+ {0xF4DE, 0x8F58}, //12686 #CJK UNIFIED IDEOGRAPH
+ {0xF4DF, 0x8F5A}, //12687 #CJK UNIFIED IDEOGRAPH
+ {0xF4E0, 0x908D}, //12688 #CJK UNIFIED IDEOGRAPH
+ {0xF4E1, 0x9143}, //12689 #CJK UNIFIED IDEOGRAPH
+ {0xF4E2, 0x9141}, //12690 #CJK UNIFIED IDEOGRAPH
+ {0xF4E3, 0x91B7}, //12691 #CJK UNIFIED IDEOGRAPH
+ {0xF4E4, 0x91B5}, //12692 #CJK UNIFIED IDEOGRAPH
+ {0xF4E5, 0x91B2}, //12693 #CJK UNIFIED IDEOGRAPH
+ {0xF4E6, 0x91B3}, //12694 #CJK UNIFIED IDEOGRAPH
+ {0xF4E7, 0x940B}, //12695 #CJK UNIFIED IDEOGRAPH
+ {0xF4E8, 0x9413}, //12696 #CJK UNIFIED IDEOGRAPH
+ {0xF4E9, 0x93FB}, //12697 #CJK UNIFIED IDEOGRAPH
+ {0xF4EA, 0x9420}, //12698 #CJK UNIFIED IDEOGRAPH
+ {0xF4EB, 0x940F}, //12699 #CJK UNIFIED IDEOGRAPH
+ {0xF4EC, 0x9414}, //12700 #CJK UNIFIED IDEOGRAPH
+ {0xF4ED, 0x93FE}, //12701 #CJK UNIFIED IDEOGRAPH
+ {0xF4EE, 0x9415}, //12702 #CJK UNIFIED IDEOGRAPH
+ {0xF4EF, 0x9410}, //12703 #CJK UNIFIED IDEOGRAPH
+ {0xF4F0, 0x9428}, //12704 #CJK UNIFIED IDEOGRAPH
+ {0xF4F1, 0x9419}, //12705 #CJK UNIFIED IDEOGRAPH
+ {0xF4F2, 0x940D}, //12706 #CJK UNIFIED IDEOGRAPH
+ {0xF4F3, 0x93F5}, //12707 #CJK UNIFIED IDEOGRAPH
+ {0xF4F4, 0x9400}, //12708 #CJK UNIFIED IDEOGRAPH
+ {0xF4F5, 0x93F7}, //12709 #CJK UNIFIED IDEOGRAPH
+ {0xF4F6, 0x9407}, //12710 #CJK UNIFIED IDEOGRAPH
+ {0xF4F7, 0x940E}, //12711 #CJK UNIFIED IDEOGRAPH
+ {0xF4F8, 0x9416}, //12712 #CJK UNIFIED IDEOGRAPH
+ {0xF4F9, 0x9412}, //12713 #CJK UNIFIED IDEOGRAPH
+ {0xF4FA, 0x93FA}, //12714 #CJK UNIFIED IDEOGRAPH
+ {0xF4FB, 0x9409}, //12715 #CJK UNIFIED IDEOGRAPH
+ {0xF4FC, 0x93F8}, //12716 #CJK UNIFIED IDEOGRAPH
+ {0xF4FD, 0x940A}, //12717 #CJK UNIFIED IDEOGRAPH
+ {0xF4FE, 0x93FF}, //12718 #CJK UNIFIED IDEOGRAPH
+ {0xF540, 0x93FC}, //12719 #CJK UNIFIED IDEOGRAPH
+ {0xF541, 0x940C}, //12720 #CJK UNIFIED IDEOGRAPH
+ {0xF542, 0x93F6}, //12721 #CJK UNIFIED IDEOGRAPH
+ {0xF543, 0x9411}, //12722 #CJK UNIFIED IDEOGRAPH
+ {0xF544, 0x9406}, //12723 #CJK UNIFIED IDEOGRAPH
+ {0xF545, 0x95DE}, //12724 #CJK UNIFIED IDEOGRAPH
+ {0xF546, 0x95E0}, //12725 #CJK UNIFIED IDEOGRAPH
+ {0xF547, 0x95DF}, //12726 #CJK UNIFIED IDEOGRAPH
+ {0xF548, 0x972E}, //12727 #CJK UNIFIED IDEOGRAPH
+ {0xF549, 0x972F}, //12728 #CJK UNIFIED IDEOGRAPH
+ {0xF54A, 0x97B9}, //12729 #CJK UNIFIED IDEOGRAPH
+ {0xF54B, 0x97BB}, //12730 #CJK UNIFIED IDEOGRAPH
+ {0xF54C, 0x97FD}, //12731 #CJK UNIFIED IDEOGRAPH
+ {0xF54D, 0x97FE}, //12732 #CJK UNIFIED IDEOGRAPH
+ {0xF54E, 0x9860}, //12733 #CJK UNIFIED IDEOGRAPH
+ {0xF54F, 0x9862}, //12734 #CJK UNIFIED IDEOGRAPH
+ {0xF550, 0x9863}, //12735 #CJK UNIFIED IDEOGRAPH
+ {0xF551, 0x985F}, //12736 #CJK UNIFIED IDEOGRAPH
+ {0xF552, 0x98C1}, //12737 #CJK UNIFIED IDEOGRAPH
+ {0xF553, 0x98C2}, //12738 #CJK UNIFIED IDEOGRAPH
+ {0xF554, 0x9950}, //12739 #CJK UNIFIED IDEOGRAPH
+ {0xF555, 0x994E}, //12740 #CJK UNIFIED IDEOGRAPH
+ {0xF556, 0x9959}, //12741 #CJK UNIFIED IDEOGRAPH
+ {0xF557, 0x994C}, //12742 #CJK UNIFIED IDEOGRAPH
+ {0xF558, 0x994B}, //12743 #CJK UNIFIED IDEOGRAPH
+ {0xF559, 0x9953}, //12744 #CJK UNIFIED IDEOGRAPH
+ {0xF55A, 0x9A32}, //12745 #CJK UNIFIED IDEOGRAPH
+ {0xF55B, 0x9A34}, //12746 #CJK UNIFIED IDEOGRAPH
+ {0xF55C, 0x9A31}, //12747 #CJK UNIFIED IDEOGRAPH
+ {0xF55D, 0x9A2C}, //12748 #CJK UNIFIED IDEOGRAPH
+ {0xF55E, 0x9A2A}, //12749 #CJK UNIFIED IDEOGRAPH
+ {0xF55F, 0x9A36}, //12750 #CJK UNIFIED IDEOGRAPH
+ {0xF560, 0x9A29}, //12751 #CJK UNIFIED IDEOGRAPH
+ {0xF561, 0x9A2E}, //12752 #CJK UNIFIED IDEOGRAPH
+ {0xF562, 0x9A38}, //12753 #CJK UNIFIED IDEOGRAPH
+ {0xF563, 0x9A2D}, //12754 #CJK UNIFIED IDEOGRAPH
+ {0xF564, 0x9AC7}, //12755 #CJK UNIFIED IDEOGRAPH
+ {0xF565, 0x9ACA}, //12756 #CJK UNIFIED IDEOGRAPH
+ {0xF566, 0x9AC6}, //12757 #CJK UNIFIED IDEOGRAPH
+ {0xF567, 0x9B10}, //12758 #CJK UNIFIED IDEOGRAPH
+ {0xF568, 0x9B12}, //12759 #CJK UNIFIED IDEOGRAPH
+ {0xF569, 0x9B11}, //12760 #CJK UNIFIED IDEOGRAPH
+ {0xF56A, 0x9C0B}, //12761 #CJK UNIFIED IDEOGRAPH
+ {0xF56B, 0x9C08}, //12762 #CJK UNIFIED IDEOGRAPH
+ {0xF56C, 0x9BF7}, //12763 #CJK UNIFIED IDEOGRAPH
+ {0xF56D, 0x9C05}, //12764 #CJK UNIFIED IDEOGRAPH
+ {0xF56E, 0x9C12}, //12765 #CJK UNIFIED IDEOGRAPH
+ {0xF56F, 0x9BF8}, //12766 #CJK UNIFIED IDEOGRAPH
+ {0xF570, 0x9C40}, //12767 #CJK UNIFIED IDEOGRAPH
+ {0xF571, 0x9C07}, //12768 #CJK UNIFIED IDEOGRAPH
+ {0xF572, 0x9C0E}, //12769 #CJK UNIFIED IDEOGRAPH
+ {0xF573, 0x9C06}, //12770 #CJK UNIFIED IDEOGRAPH
+ {0xF574, 0x9C17}, //12771 #CJK UNIFIED IDEOGRAPH
+ {0xF575, 0x9C14}, //12772 #CJK UNIFIED IDEOGRAPH
+ {0xF576, 0x9C09}, //12773 #CJK UNIFIED IDEOGRAPH
+ {0xF577, 0x9D9F}, //12774 #CJK UNIFIED IDEOGRAPH
+ {0xF578, 0x9D99}, //12775 #CJK UNIFIED IDEOGRAPH
+ {0xF579, 0x9DA4}, //12776 #CJK UNIFIED IDEOGRAPH
+ {0xF57A, 0x9D9D}, //12777 #CJK UNIFIED IDEOGRAPH
+ {0xF57B, 0x9D92}, //12778 #CJK UNIFIED IDEOGRAPH
+ {0xF57C, 0x9D98}, //12779 #CJK UNIFIED IDEOGRAPH
+ {0xF57D, 0x9D90}, //12780 #CJK UNIFIED IDEOGRAPH
+ {0xF57E, 0x9D9B}, //12781 #CJK UNIFIED IDEOGRAPH
+ {0xF5A1, 0x9DA0}, //12782 #CJK UNIFIED IDEOGRAPH
+ {0xF5A2, 0x9D94}, //12783 #CJK UNIFIED IDEOGRAPH
+ {0xF5A3, 0x9D9C}, //12784 #CJK UNIFIED IDEOGRAPH
+ {0xF5A4, 0x9DAA}, //12785 #CJK UNIFIED IDEOGRAPH
+ {0xF5A5, 0x9D97}, //12786 #CJK UNIFIED IDEOGRAPH
+ {0xF5A6, 0x9DA1}, //12787 #CJK UNIFIED IDEOGRAPH
+ {0xF5A7, 0x9D9A}, //12788 #CJK UNIFIED IDEOGRAPH
+ {0xF5A8, 0x9DA2}, //12789 #CJK UNIFIED IDEOGRAPH
+ {0xF5A9, 0x9DA8}, //12790 #CJK UNIFIED IDEOGRAPH
+ {0xF5AA, 0x9D9E}, //12791 #CJK UNIFIED IDEOGRAPH
+ {0xF5AB, 0x9DA3}, //12792 #CJK UNIFIED IDEOGRAPH
+ {0xF5AC, 0x9DBF}, //12793 #CJK UNIFIED IDEOGRAPH
+ {0xF5AD, 0x9DA9}, //12794 #CJK UNIFIED IDEOGRAPH
+ {0xF5AE, 0x9D96}, //12795 #CJK UNIFIED IDEOGRAPH
+ {0xF5AF, 0x9DA6}, //12796 #CJK UNIFIED IDEOGRAPH
+ {0xF5B0, 0x9DA7}, //12797 #CJK UNIFIED IDEOGRAPH
+ {0xF5B1, 0x9E99}, //12798 #CJK UNIFIED IDEOGRAPH
+ {0xF5B2, 0x9E9B}, //12799 #CJK UNIFIED IDEOGRAPH
+ {0xF5B3, 0x9E9A}, //12800 #CJK UNIFIED IDEOGRAPH
+ {0xF5B4, 0x9EE5}, //12801 #CJK UNIFIED IDEOGRAPH
+ {0xF5B5, 0x9EE4}, //12802 #CJK UNIFIED IDEOGRAPH
+ {0xF5B6, 0x9EE7}, //12803 #CJK UNIFIED IDEOGRAPH
+ {0xF5B7, 0x9EE6}, //12804 #CJK UNIFIED IDEOGRAPH
+ {0xF5B8, 0x9F30}, //12805 #CJK UNIFIED IDEOGRAPH
+ {0xF5B9, 0x9F2E}, //12806 #CJK UNIFIED IDEOGRAPH
+ {0xF5BA, 0x9F5B}, //12807 #CJK UNIFIED IDEOGRAPH
+ {0xF5BB, 0x9F60}, //12808 #CJK UNIFIED IDEOGRAPH
+ {0xF5BC, 0x9F5E}, //12809 #CJK UNIFIED IDEOGRAPH
+ {0xF5BD, 0x9F5D}, //12810 #CJK UNIFIED IDEOGRAPH
+ {0xF5BE, 0x9F59}, //12811 #CJK UNIFIED IDEOGRAPH
+ {0xF5BF, 0x9F91}, //12812 #CJK UNIFIED IDEOGRAPH
+ {0xF5C0, 0x513A}, //12813 #CJK UNIFIED IDEOGRAPH
+ {0xF5C1, 0x5139}, //12814 #CJK UNIFIED IDEOGRAPH
+ {0xF5C2, 0x5298}, //12815 #CJK UNIFIED IDEOGRAPH
+ {0xF5C3, 0x5297}, //12816 #CJK UNIFIED IDEOGRAPH
+ {0xF5C4, 0x56C3}, //12817 #CJK UNIFIED IDEOGRAPH
+ {0xF5C5, 0x56BD}, //12818 #CJK UNIFIED IDEOGRAPH
+ {0xF5C6, 0x56BE}, //12819 #CJK UNIFIED IDEOGRAPH
+ {0xF5C7, 0x5B48}, //12820 #CJK UNIFIED IDEOGRAPH
+ {0xF5C8, 0x5B47}, //12821 #CJK UNIFIED IDEOGRAPH
+ {0xF5C9, 0x5DCB}, //12822 #CJK UNIFIED IDEOGRAPH
+ {0xF5CA, 0x5DCF}, //12823 #CJK UNIFIED IDEOGRAPH
+ {0xF5CB, 0x5EF1}, //12824 #CJK UNIFIED IDEOGRAPH
+ {0xF5CC, 0x61FD}, //12825 #CJK UNIFIED IDEOGRAPH
+ {0xF5CD, 0x651B}, //12826 #CJK UNIFIED IDEOGRAPH
+ {0xF5CE, 0x6B02}, //12827 #CJK UNIFIED IDEOGRAPH
+ {0xF5CF, 0x6AFC}, //12828 #CJK UNIFIED IDEOGRAPH
+ {0xF5D0, 0x6B03}, //12829 #CJK UNIFIED IDEOGRAPH
+ {0xF5D1, 0x6AF8}, //12830 #CJK UNIFIED IDEOGRAPH
+ {0xF5D2, 0x6B00}, //12831 #CJK UNIFIED IDEOGRAPH
+ {0xF5D3, 0x7043}, //12832 #CJK UNIFIED IDEOGRAPH
+ {0xF5D4, 0x7044}, //12833 #CJK UNIFIED IDEOGRAPH
+ {0xF5D5, 0x704A}, //12834 #CJK UNIFIED IDEOGRAPH
+ {0xF5D6, 0x7048}, //12835 #CJK UNIFIED IDEOGRAPH
+ {0xF5D7, 0x7049}, //12836 #CJK UNIFIED IDEOGRAPH
+ {0xF5D8, 0x7045}, //12837 #CJK UNIFIED IDEOGRAPH
+ {0xF5D9, 0x7046}, //12838 #CJK UNIFIED IDEOGRAPH
+ {0xF5DA, 0x721D}, //12839 #CJK UNIFIED IDEOGRAPH
+ {0xF5DB, 0x721A}, //12840 #CJK UNIFIED IDEOGRAPH
+ {0xF5DC, 0x7219}, //12841 #CJK UNIFIED IDEOGRAPH
+ {0xF5DD, 0x737E}, //12842 #CJK UNIFIED IDEOGRAPH
+ {0xF5DE, 0x7517}, //12843 #CJK UNIFIED IDEOGRAPH
+ {0xF5DF, 0x766A}, //12844 #CJK UNIFIED IDEOGRAPH
+ {0xF5E0, 0x77D0}, //12845 #CJK UNIFIED IDEOGRAPH
+ {0xF5E1, 0x792D}, //12846 #CJK UNIFIED IDEOGRAPH
+ {0xF5E2, 0x7931}, //12847 #CJK UNIFIED IDEOGRAPH
+ {0xF5E3, 0x792F}, //12848 #CJK UNIFIED IDEOGRAPH
+ {0xF5E4, 0x7C54}, //12849 #CJK UNIFIED IDEOGRAPH
+ {0xF5E5, 0x7C53}, //12850 #CJK UNIFIED IDEOGRAPH
+ {0xF5E6, 0x7CF2}, //12851 #CJK UNIFIED IDEOGRAPH
+ {0xF5E7, 0x7E8A}, //12852 #CJK UNIFIED IDEOGRAPH
+ {0xF5E8, 0x7E87}, //12853 #CJK UNIFIED IDEOGRAPH
+ {0xF5E9, 0x7E88}, //12854 #CJK UNIFIED IDEOGRAPH
+ {0xF5EA, 0x7E8B}, //12855 #CJK UNIFIED IDEOGRAPH
+ {0xF5EB, 0x7E86}, //12856 #CJK UNIFIED IDEOGRAPH
+ {0xF5EC, 0x7E8D}, //12857 #CJK UNIFIED IDEOGRAPH
+ {0xF5ED, 0x7F4D}, //12858 #CJK UNIFIED IDEOGRAPH
+ {0xF5EE, 0x7FBB}, //12859 #CJK UNIFIED IDEOGRAPH
+ {0xF5EF, 0x8030}, //12860 #CJK UNIFIED IDEOGRAPH
+ {0xF5F0, 0x81DD}, //12861 #CJK UNIFIED IDEOGRAPH
+ {0xF5F1, 0x8618}, //12862 #CJK UNIFIED IDEOGRAPH
+ {0xF5F2, 0x862A}, //12863 #CJK UNIFIED IDEOGRAPH
+ {0xF5F3, 0x8626}, //12864 #CJK UNIFIED IDEOGRAPH
+ {0xF5F4, 0x861F}, //12865 #CJK UNIFIED IDEOGRAPH
+ {0xF5F5, 0x8623}, //12866 #CJK UNIFIED IDEOGRAPH
+ {0xF5F6, 0x861C}, //12867 #CJK UNIFIED IDEOGRAPH
+ {0xF5F7, 0x8619}, //12868 #CJK UNIFIED IDEOGRAPH
+ {0xF5F8, 0x8627}, //12869 #CJK UNIFIED IDEOGRAPH
+ {0xF5F9, 0x862E}, //12870 #CJK UNIFIED IDEOGRAPH
+ {0xF5FA, 0x8621}, //12871 #CJK UNIFIED IDEOGRAPH
+ {0xF5FB, 0x8620}, //12872 #CJK UNIFIED IDEOGRAPH
+ {0xF5FC, 0x8629}, //12873 #CJK UNIFIED IDEOGRAPH
+ {0xF5FD, 0x861E}, //12874 #CJK UNIFIED IDEOGRAPH
+ {0xF5FE, 0x8625}, //12875 #CJK UNIFIED IDEOGRAPH
+ {0xF640, 0x8829}, //12876 #CJK UNIFIED IDEOGRAPH
+ {0xF641, 0x881D}, //12877 #CJK UNIFIED IDEOGRAPH
+ {0xF642, 0x881B}, //12878 #CJK UNIFIED IDEOGRAPH
+ {0xF643, 0x8820}, //12879 #CJK UNIFIED IDEOGRAPH
+ {0xF644, 0x8824}, //12880 #CJK UNIFIED IDEOGRAPH
+ {0xF645, 0x881C}, //12881 #CJK UNIFIED IDEOGRAPH
+ {0xF646, 0x882B}, //12882 #CJK UNIFIED IDEOGRAPH
+ {0xF647, 0x884A}, //12883 #CJK UNIFIED IDEOGRAPH
+ {0xF648, 0x896D}, //12884 #CJK UNIFIED IDEOGRAPH
+ {0xF649, 0x8969}, //12885 #CJK UNIFIED IDEOGRAPH
+ {0xF64A, 0x896E}, //12886 #CJK UNIFIED IDEOGRAPH
+ {0xF64B, 0x896B}, //12887 #CJK UNIFIED IDEOGRAPH
+ {0xF64C, 0x89FA}, //12888 #CJK UNIFIED IDEOGRAPH
+ {0xF64D, 0x8B79}, //12889 #CJK UNIFIED IDEOGRAPH
+ {0xF64E, 0x8B78}, //12890 #CJK UNIFIED IDEOGRAPH
+ {0xF64F, 0x8B45}, //12891 #CJK UNIFIED IDEOGRAPH
+ {0xF650, 0x8B7A}, //12892 #CJK UNIFIED IDEOGRAPH
+ {0xF651, 0x8B7B}, //12893 #CJK UNIFIED IDEOGRAPH
+ {0xF652, 0x8D10}, //12894 #CJK UNIFIED IDEOGRAPH
+ {0xF653, 0x8D14}, //12895 #CJK UNIFIED IDEOGRAPH
+ {0xF654, 0x8DAF}, //12896 #CJK UNIFIED IDEOGRAPH
+ {0xF655, 0x8E8E}, //12897 #CJK UNIFIED IDEOGRAPH
+ {0xF656, 0x8E8C}, //12898 #CJK UNIFIED IDEOGRAPH
+ {0xF657, 0x8F5E}, //12899 #CJK UNIFIED IDEOGRAPH
+ {0xF658, 0x8F5B}, //12900 #CJK UNIFIED IDEOGRAPH
+ {0xF659, 0x8F5D}, //12901 #CJK UNIFIED IDEOGRAPH
+ {0xF65A, 0x9146}, //12902 #CJK UNIFIED IDEOGRAPH
+ {0xF65B, 0x9144}, //12903 #CJK UNIFIED IDEOGRAPH
+ {0xF65C, 0x9145}, //12904 #CJK UNIFIED IDEOGRAPH
+ {0xF65D, 0x91B9}, //12905 #CJK UNIFIED IDEOGRAPH
+ {0xF65E, 0x943F}, //12906 #CJK UNIFIED IDEOGRAPH
+ {0xF65F, 0x943B}, //12907 #CJK UNIFIED IDEOGRAPH
+ {0xF660, 0x9436}, //12908 #CJK UNIFIED IDEOGRAPH
+ {0xF661, 0x9429}, //12909 #CJK UNIFIED IDEOGRAPH
+ {0xF662, 0x943D}, //12910 #CJK UNIFIED IDEOGRAPH
+ {0xF663, 0x943C}, //12911 #CJK UNIFIED IDEOGRAPH
+ {0xF664, 0x9430}, //12912 #CJK UNIFIED IDEOGRAPH
+ {0xF665, 0x9439}, //12913 #CJK UNIFIED IDEOGRAPH
+ {0xF666, 0x942A}, //12914 #CJK UNIFIED IDEOGRAPH
+ {0xF667, 0x9437}, //12915 #CJK UNIFIED IDEOGRAPH
+ {0xF668, 0x942C}, //12916 #CJK UNIFIED IDEOGRAPH
+ {0xF669, 0x9440}, //12917 #CJK UNIFIED IDEOGRAPH
+ {0xF66A, 0x9431}, //12918 #CJK UNIFIED IDEOGRAPH
+ {0xF66B, 0x95E5}, //12919 #CJK UNIFIED IDEOGRAPH
+ {0xF66C, 0x95E4}, //12920 #CJK UNIFIED IDEOGRAPH
+ {0xF66D, 0x95E3}, //12921 #CJK UNIFIED IDEOGRAPH
+ {0xF66E, 0x9735}, //12922 #CJK UNIFIED IDEOGRAPH
+ {0xF66F, 0x973A}, //12923 #CJK UNIFIED IDEOGRAPH
+ {0xF670, 0x97BF}, //12924 #CJK UNIFIED IDEOGRAPH
+ {0xF671, 0x97E1}, //12925 #CJK UNIFIED IDEOGRAPH
+ {0xF672, 0x9864}, //12926 #CJK UNIFIED IDEOGRAPH
+ {0xF673, 0x98C9}, //12927 #CJK UNIFIED IDEOGRAPH
+ {0xF674, 0x98C6}, //12928 #CJK UNIFIED IDEOGRAPH
+ {0xF675, 0x98C0}, //12929 #CJK UNIFIED IDEOGRAPH
+ {0xF676, 0x9958}, //12930 #CJK UNIFIED IDEOGRAPH
+ {0xF677, 0x9956}, //12931 #CJK UNIFIED IDEOGRAPH
+ {0xF678, 0x9A39}, //12932 #CJK UNIFIED IDEOGRAPH
+ {0xF679, 0x9A3D}, //12933 #CJK UNIFIED IDEOGRAPH
+ {0xF67A, 0x9A46}, //12934 #CJK UNIFIED IDEOGRAPH
+ {0xF67B, 0x9A44}, //12935 #CJK UNIFIED IDEOGRAPH
+ {0xF67C, 0x9A42}, //12936 #CJK UNIFIED IDEOGRAPH
+ {0xF67D, 0x9A41}, //12937 #CJK UNIFIED IDEOGRAPH
+ {0xF67E, 0x9A3A}, //12938 #CJK UNIFIED IDEOGRAPH
+ {0xF6A1, 0x9A3F}, //12939 #CJK UNIFIED IDEOGRAPH
+ {0xF6A2, 0x9ACD}, //12940 #CJK UNIFIED IDEOGRAPH
+ {0xF6A3, 0x9B15}, //12941 #CJK UNIFIED IDEOGRAPH
+ {0xF6A4, 0x9B17}, //12942 #CJK UNIFIED IDEOGRAPH
+ {0xF6A5, 0x9B18}, //12943 #CJK UNIFIED IDEOGRAPH
+ {0xF6A6, 0x9B16}, //12944 #CJK UNIFIED IDEOGRAPH
+ {0xF6A7, 0x9B3A}, //12945 #CJK UNIFIED IDEOGRAPH
+ {0xF6A8, 0x9B52}, //12946 #CJK UNIFIED IDEOGRAPH
+ {0xF6A9, 0x9C2B}, //12947 #CJK UNIFIED IDEOGRAPH
+ {0xF6AA, 0x9C1D}, //12948 #CJK UNIFIED IDEOGRAPH
+ {0xF6AB, 0x9C1C}, //12949 #CJK UNIFIED IDEOGRAPH
+ {0xF6AC, 0x9C2C}, //12950 #CJK UNIFIED IDEOGRAPH
+ {0xF6AD, 0x9C23}, //12951 #CJK UNIFIED IDEOGRAPH
+ {0xF6AE, 0x9C28}, //12952 #CJK UNIFIED IDEOGRAPH
+ {0xF6AF, 0x9C29}, //12953 #CJK UNIFIED IDEOGRAPH
+ {0xF6B0, 0x9C24}, //12954 #CJK UNIFIED IDEOGRAPH
+ {0xF6B1, 0x9C21}, //12955 #CJK UNIFIED IDEOGRAPH
+ {0xF6B2, 0x9DB7}, //12956 #CJK UNIFIED IDEOGRAPH
+ {0xF6B3, 0x9DB6}, //12957 #CJK UNIFIED IDEOGRAPH
+ {0xF6B4, 0x9DBC}, //12958 #CJK UNIFIED IDEOGRAPH
+ {0xF6B5, 0x9DC1}, //12959 #CJK UNIFIED IDEOGRAPH
+ {0xF6B6, 0x9DC7}, //12960 #CJK UNIFIED IDEOGRAPH
+ {0xF6B7, 0x9DCA}, //12961 #CJK UNIFIED IDEOGRAPH
+ {0xF6B8, 0x9DCF}, //12962 #CJK UNIFIED IDEOGRAPH
+ {0xF6B9, 0x9DBE}, //12963 #CJK UNIFIED IDEOGRAPH
+ {0xF6BA, 0x9DC5}, //12964 #CJK UNIFIED IDEOGRAPH
+ {0xF6BB, 0x9DC3}, //12965 #CJK UNIFIED IDEOGRAPH
+ {0xF6BC, 0x9DBB}, //12966 #CJK UNIFIED IDEOGRAPH
+ {0xF6BD, 0x9DB5}, //12967 #CJK UNIFIED IDEOGRAPH
+ {0xF6BE, 0x9DCE}, //12968 #CJK UNIFIED IDEOGRAPH
+ {0xF6BF, 0x9DB9}, //12969 #CJK UNIFIED IDEOGRAPH
+ {0xF6C0, 0x9DBA}, //12970 #CJK UNIFIED IDEOGRAPH
+ {0xF6C1, 0x9DAC}, //12971 #CJK UNIFIED IDEOGRAPH
+ {0xF6C2, 0x9DC8}, //12972 #CJK UNIFIED IDEOGRAPH
+ {0xF6C3, 0x9DB1}, //12973 #CJK UNIFIED IDEOGRAPH
+ {0xF6C4, 0x9DAD}, //12974 #CJK UNIFIED IDEOGRAPH
+ {0xF6C5, 0x9DCC}, //12975 #CJK UNIFIED IDEOGRAPH
+ {0xF6C6, 0x9DB3}, //12976 #CJK UNIFIED IDEOGRAPH
+ {0xF6C7, 0x9DCD}, //12977 #CJK UNIFIED IDEOGRAPH
+ {0xF6C8, 0x9DB2}, //12978 #CJK UNIFIED IDEOGRAPH
+ {0xF6C9, 0x9E7A}, //12979 #CJK UNIFIED IDEOGRAPH
+ {0xF6CA, 0x9E9C}, //12980 #CJK UNIFIED IDEOGRAPH
+ {0xF6CB, 0x9EEB}, //12981 #CJK UNIFIED IDEOGRAPH
+ {0xF6CC, 0x9EEE}, //12982 #CJK UNIFIED IDEOGRAPH
+ {0xF6CD, 0x9EED}, //12983 #CJK UNIFIED IDEOGRAPH
+ {0xF6CE, 0x9F1B}, //12984 #CJK UNIFIED IDEOGRAPH
+ {0xF6CF, 0x9F18}, //12985 #CJK UNIFIED IDEOGRAPH
+ {0xF6D0, 0x9F1A}, //12986 #CJK UNIFIED IDEOGRAPH
+ {0xF6D1, 0x9F31}, //12987 #CJK UNIFIED IDEOGRAPH
+ {0xF6D2, 0x9F4E}, //12988 #CJK UNIFIED IDEOGRAPH
+ {0xF6D3, 0x9F65}, //12989 #CJK UNIFIED IDEOGRAPH
+ {0xF6D4, 0x9F64}, //12990 #CJK UNIFIED IDEOGRAPH
+ {0xF6D5, 0x9F92}, //12991 #CJK UNIFIED IDEOGRAPH
+ {0xF6D6, 0x4EB9}, //12992 #CJK UNIFIED IDEOGRAPH
+ {0xF6D7, 0x56C6}, //12993 #CJK UNIFIED IDEOGRAPH
+ {0xF6D8, 0x56C5}, //12994 #CJK UNIFIED IDEOGRAPH
+ {0xF6D9, 0x56CB}, //12995 #CJK UNIFIED IDEOGRAPH
+ {0xF6DA, 0x5971}, //12996 #CJK UNIFIED IDEOGRAPH
+ {0xF6DB, 0x5B4B}, //12997 #CJK UNIFIED IDEOGRAPH
+ {0xF6DC, 0x5B4C}, //12998 #CJK UNIFIED IDEOGRAPH
+ {0xF6DD, 0x5DD5}, //12999 #CJK UNIFIED IDEOGRAPH
+ {0xF6DE, 0x5DD1}, //13000 #CJK UNIFIED IDEOGRAPH
+ {0xF6DF, 0x5EF2}, //13001 #CJK UNIFIED IDEOGRAPH
+ {0xF6E0, 0x6521}, //13002 #CJK UNIFIED IDEOGRAPH
+ {0xF6E1, 0x6520}, //13003 #CJK UNIFIED IDEOGRAPH
+ {0xF6E2, 0x6526}, //13004 #CJK UNIFIED IDEOGRAPH
+ {0xF6E3, 0x6522}, //13005 #CJK UNIFIED IDEOGRAPH
+ {0xF6E4, 0x6B0B}, //13006 #CJK UNIFIED IDEOGRAPH
+ {0xF6E5, 0x6B08}, //13007 #CJK UNIFIED IDEOGRAPH
+ {0xF6E6, 0x6B09}, //13008 #CJK UNIFIED IDEOGRAPH
+ {0xF6E7, 0x6C0D}, //13009 #CJK UNIFIED IDEOGRAPH
+ {0xF6E8, 0x7055}, //13010 #CJK UNIFIED IDEOGRAPH
+ {0xF6E9, 0x7056}, //13011 #CJK UNIFIED IDEOGRAPH
+ {0xF6EA, 0x7057}, //13012 #CJK UNIFIED IDEOGRAPH
+ {0xF6EB, 0x7052}, //13013 #CJK UNIFIED IDEOGRAPH
+ {0xF6EC, 0x721E}, //13014 #CJK UNIFIED IDEOGRAPH
+ {0xF6ED, 0x721F}, //13015 #CJK UNIFIED IDEOGRAPH
+ {0xF6EE, 0x72A9}, //13016 #CJK UNIFIED IDEOGRAPH
+ {0xF6EF, 0x737F}, //13017 #CJK UNIFIED IDEOGRAPH
+ {0xF6F0, 0x74D8}, //13018 #CJK UNIFIED IDEOGRAPH
+ {0xF6F1, 0x74D5}, //13019 #CJK UNIFIED IDEOGRAPH
+ {0xF6F2, 0x74D9}, //13020 #CJK UNIFIED IDEOGRAPH
+ {0xF6F3, 0x74D7}, //13021 #CJK UNIFIED IDEOGRAPH
+ {0xF6F4, 0x766D}, //13022 #CJK UNIFIED IDEOGRAPH
+ {0xF6F5, 0x76AD}, //13023 #CJK UNIFIED IDEOGRAPH
+ {0xF6F6, 0x7935}, //13024 #CJK UNIFIED IDEOGRAPH
+ {0xF6F7, 0x79B4}, //13025 #CJK UNIFIED IDEOGRAPH
+ {0xF6F8, 0x7A70}, //13026 #CJK UNIFIED IDEOGRAPH
+ {0xF6F9, 0x7A71}, //13027 #CJK UNIFIED IDEOGRAPH
+ {0xF6FA, 0x7C57}, //13028 #CJK UNIFIED IDEOGRAPH
+ {0xF6FB, 0x7C5C}, //13029 #CJK UNIFIED IDEOGRAPH
+ {0xF6FC, 0x7C59}, //13030 #CJK UNIFIED IDEOGRAPH
+ {0xF6FD, 0x7C5B}, //13031 #CJK UNIFIED IDEOGRAPH
+ {0xF6FE, 0x7C5A}, //13032 #CJK UNIFIED IDEOGRAPH
+ {0xF740, 0x7CF4}, //13033 #CJK UNIFIED IDEOGRAPH
+ {0xF741, 0x7CF1}, //13034 #CJK UNIFIED IDEOGRAPH
+ {0xF742, 0x7E91}, //13035 #CJK UNIFIED IDEOGRAPH
+ {0xF743, 0x7F4F}, //13036 #CJK UNIFIED IDEOGRAPH
+ {0xF744, 0x7F87}, //13037 #CJK UNIFIED IDEOGRAPH
+ {0xF745, 0x81DE}, //13038 #CJK UNIFIED IDEOGRAPH
+ {0xF746, 0x826B}, //13039 #CJK UNIFIED IDEOGRAPH
+ {0xF747, 0x8634}, //13040 #CJK UNIFIED IDEOGRAPH
+ {0xF748, 0x8635}, //13041 #CJK UNIFIED IDEOGRAPH
+ {0xF749, 0x8633}, //13042 #CJK UNIFIED IDEOGRAPH
+ {0xF74A, 0x862C}, //13043 #CJK UNIFIED IDEOGRAPH
+ {0xF74B, 0x8632}, //13044 #CJK UNIFIED IDEOGRAPH
+ {0xF74C, 0x8636}, //13045 #CJK UNIFIED IDEOGRAPH
+ {0xF74D, 0x882C}, //13046 #CJK UNIFIED IDEOGRAPH
+ {0xF74E, 0x8828}, //13047 #CJK UNIFIED IDEOGRAPH
+ {0xF74F, 0x8826}, //13048 #CJK UNIFIED IDEOGRAPH
+ {0xF750, 0x882A}, //13049 #CJK UNIFIED IDEOGRAPH
+ {0xF751, 0x8825}, //13050 #CJK UNIFIED IDEOGRAPH
+ {0xF752, 0x8971}, //13051 #CJK UNIFIED IDEOGRAPH
+ {0xF753, 0x89BF}, //13052 #CJK UNIFIED IDEOGRAPH
+ {0xF754, 0x89BE}, //13053 #CJK UNIFIED IDEOGRAPH
+ {0xF755, 0x89FB}, //13054 #CJK UNIFIED IDEOGRAPH
+ {0xF756, 0x8B7E}, //13055 #CJK UNIFIED IDEOGRAPH
+ {0xF757, 0x8B84}, //13056 #CJK UNIFIED IDEOGRAPH
+ {0xF758, 0x8B82}, //13057 #CJK UNIFIED IDEOGRAPH
+ {0xF759, 0x8B86}, //13058 #CJK UNIFIED IDEOGRAPH
+ {0xF75A, 0x8B85}, //13059 #CJK UNIFIED IDEOGRAPH
+ {0xF75B, 0x8B7F}, //13060 #CJK UNIFIED IDEOGRAPH
+ {0xF75C, 0x8D15}, //13061 #CJK UNIFIED IDEOGRAPH
+ {0xF75D, 0x8E95}, //13062 #CJK UNIFIED IDEOGRAPH
+ {0xF75E, 0x8E94}, //13063 #CJK UNIFIED IDEOGRAPH
+ {0xF75F, 0x8E9A}, //13064 #CJK UNIFIED IDEOGRAPH
+ {0xF760, 0x8E92}, //13065 #CJK UNIFIED IDEOGRAPH
+ {0xF761, 0x8E90}, //13066 #CJK UNIFIED IDEOGRAPH
+ {0xF762, 0x8E96}, //13067 #CJK UNIFIED IDEOGRAPH
+ {0xF763, 0x8E97}, //13068 #CJK UNIFIED IDEOGRAPH
+ {0xF764, 0x8F60}, //13069 #CJK UNIFIED IDEOGRAPH
+ {0xF765, 0x8F62}, //13070 #CJK UNIFIED IDEOGRAPH
+ {0xF766, 0x9147}, //13071 #CJK UNIFIED IDEOGRAPH
+ {0xF767, 0x944C}, //13072 #CJK UNIFIED IDEOGRAPH
+ {0xF768, 0x9450}, //13073 #CJK UNIFIED IDEOGRAPH
+ {0xF769, 0x944A}, //13074 #CJK UNIFIED IDEOGRAPH
+ {0xF76A, 0x944B}, //13075 #CJK UNIFIED IDEOGRAPH
+ {0xF76B, 0x944F}, //13076 #CJK UNIFIED IDEOGRAPH
+ {0xF76C, 0x9447}, //13077 #CJK UNIFIED IDEOGRAPH
+ {0xF76D, 0x9445}, //13078 #CJK UNIFIED IDEOGRAPH
+ {0xF76E, 0x9448}, //13079 #CJK UNIFIED IDEOGRAPH
+ {0xF76F, 0x9449}, //13080 #CJK UNIFIED IDEOGRAPH
+ {0xF770, 0x9446}, //13081 #CJK UNIFIED IDEOGRAPH
+ {0xF771, 0x973F}, //13082 #CJK UNIFIED IDEOGRAPH
+ {0xF772, 0x97E3}, //13083 #CJK UNIFIED IDEOGRAPH
+ {0xF773, 0x986A}, //13084 #CJK UNIFIED IDEOGRAPH
+ {0xF774, 0x9869}, //13085 #CJK UNIFIED IDEOGRAPH
+ {0xF775, 0x98CB}, //13086 #CJK UNIFIED IDEOGRAPH
+ {0xF776, 0x9954}, //13087 #CJK UNIFIED IDEOGRAPH
+ {0xF777, 0x995B}, //13088 #CJK UNIFIED IDEOGRAPH
+ {0xF778, 0x9A4E}, //13089 #CJK UNIFIED IDEOGRAPH
+ {0xF779, 0x9A53}, //13090 #CJK UNIFIED IDEOGRAPH
+ {0xF77A, 0x9A54}, //13091 #CJK UNIFIED IDEOGRAPH
+ {0xF77B, 0x9A4C}, //13092 #CJK UNIFIED IDEOGRAPH
+ {0xF77C, 0x9A4F}, //13093 #CJK UNIFIED IDEOGRAPH
+ {0xF77D, 0x9A48}, //13094 #CJK UNIFIED IDEOGRAPH
+ {0xF77E, 0x9A4A}, //13095 #CJK UNIFIED IDEOGRAPH
+ {0xF7A1, 0x9A49}, //13096 #CJK UNIFIED IDEOGRAPH
+ {0xF7A2, 0x9A52}, //13097 #CJK UNIFIED IDEOGRAPH
+ {0xF7A3, 0x9A50}, //13098 #CJK UNIFIED IDEOGRAPH
+ {0xF7A4, 0x9AD0}, //13099 #CJK UNIFIED IDEOGRAPH
+ {0xF7A5, 0x9B19}, //13100 #CJK UNIFIED IDEOGRAPH
+ {0xF7A6, 0x9B2B}, //13101 #CJK UNIFIED IDEOGRAPH
+ {0xF7A7, 0x9B3B}, //13102 #CJK UNIFIED IDEOGRAPH
+ {0xF7A8, 0x9B56}, //13103 #CJK UNIFIED IDEOGRAPH
+ {0xF7A9, 0x9B55}, //13104 #CJK UNIFIED IDEOGRAPH
+ {0xF7AA, 0x9C46}, //13105 #CJK UNIFIED IDEOGRAPH
+ {0xF7AB, 0x9C48}, //13106 #CJK UNIFIED IDEOGRAPH
+ {0xF7AC, 0x9C3F}, //13107 #CJK UNIFIED IDEOGRAPH
+ {0xF7AD, 0x9C44}, //13108 #CJK UNIFIED IDEOGRAPH
+ {0xF7AE, 0x9C39}, //13109 #CJK UNIFIED IDEOGRAPH
+ {0xF7AF, 0x9C33}, //13110 #CJK UNIFIED IDEOGRAPH
+ {0xF7B0, 0x9C41}, //13111 #CJK UNIFIED IDEOGRAPH
+ {0xF7B1, 0x9C3C}, //13112 #CJK UNIFIED IDEOGRAPH
+ {0xF7B2, 0x9C37}, //13113 #CJK UNIFIED IDEOGRAPH
+ {0xF7B3, 0x9C34}, //13114 #CJK UNIFIED IDEOGRAPH
+ {0xF7B4, 0x9C32}, //13115 #CJK UNIFIED IDEOGRAPH
+ {0xF7B5, 0x9C3D}, //13116 #CJK UNIFIED IDEOGRAPH
+ {0xF7B6, 0x9C36}, //13117 #CJK UNIFIED IDEOGRAPH
+ {0xF7B7, 0x9DDB}, //13118 #CJK UNIFIED IDEOGRAPH
+ {0xF7B8, 0x9DD2}, //13119 #CJK UNIFIED IDEOGRAPH
+ {0xF7B9, 0x9DDE}, //13120 #CJK UNIFIED IDEOGRAPH
+ {0xF7BA, 0x9DDA}, //13121 #CJK UNIFIED IDEOGRAPH
+ {0xF7BB, 0x9DCB}, //13122 #CJK UNIFIED IDEOGRAPH
+ {0xF7BC, 0x9DD0}, //13123 #CJK UNIFIED IDEOGRAPH
+ {0xF7BD, 0x9DDC}, //13124 #CJK UNIFIED IDEOGRAPH
+ {0xF7BE, 0x9DD1}, //13125 #CJK UNIFIED IDEOGRAPH
+ {0xF7BF, 0x9DDF}, //13126 #CJK UNIFIED IDEOGRAPH
+ {0xF7C0, 0x9DE9}, //13127 #CJK UNIFIED IDEOGRAPH
+ {0xF7C1, 0x9DD9}, //13128 #CJK UNIFIED IDEOGRAPH
+ {0xF7C2, 0x9DD8}, //13129 #CJK UNIFIED IDEOGRAPH
+ {0xF7C3, 0x9DD6}, //13130 #CJK UNIFIED IDEOGRAPH
+ {0xF7C4, 0x9DF5}, //13131 #CJK UNIFIED IDEOGRAPH
+ {0xF7C5, 0x9DD5}, //13132 #CJK UNIFIED IDEOGRAPH
+ {0xF7C6, 0x9DDD}, //13133 #CJK UNIFIED IDEOGRAPH
+ {0xF7C7, 0x9EB6}, //13134 #CJK UNIFIED IDEOGRAPH
+ {0xF7C8, 0x9EF0}, //13135 #CJK UNIFIED IDEOGRAPH
+ {0xF7C9, 0x9F35}, //13136 #CJK UNIFIED IDEOGRAPH
+ {0xF7CA, 0x9F33}, //13137 #CJK UNIFIED IDEOGRAPH
+ {0xF7CB, 0x9F32}, //13138 #CJK UNIFIED IDEOGRAPH
+ {0xF7CC, 0x9F42}, //13139 #CJK UNIFIED IDEOGRAPH
+ {0xF7CD, 0x9F6B}, //13140 #CJK UNIFIED IDEOGRAPH
+ {0xF7CE, 0x9F95}, //13141 #CJK UNIFIED IDEOGRAPH
+ {0xF7CF, 0x9FA2}, //13142 #CJK UNIFIED IDEOGRAPH
+ {0xF7D0, 0x513D}, //13143 #CJK UNIFIED IDEOGRAPH
+ {0xF7D1, 0x5299}, //13144 #CJK UNIFIED IDEOGRAPH
+ {0xF7D2, 0x58E8}, //13145 #CJK UNIFIED IDEOGRAPH
+ {0xF7D3, 0x58E7}, //13146 #CJK UNIFIED IDEOGRAPH
+ {0xF7D4, 0x5972}, //13147 #CJK UNIFIED IDEOGRAPH
+ {0xF7D5, 0x5B4D}, //13148 #CJK UNIFIED IDEOGRAPH
+ {0xF7D6, 0x5DD8}, //13149 #CJK UNIFIED IDEOGRAPH
+ {0xF7D7, 0x882F}, //13150 #CJK UNIFIED IDEOGRAPH
+ {0xF7D8, 0x5F4F}, //13151 #CJK UNIFIED IDEOGRAPH
+ {0xF7D9, 0x6201}, //13152 #CJK UNIFIED IDEOGRAPH
+ {0xF7DA, 0x6203}, //13153 #CJK UNIFIED IDEOGRAPH
+ {0xF7DB, 0x6204}, //13154 #CJK UNIFIED IDEOGRAPH
+ {0xF7DC, 0x6529}, //13155 #CJK UNIFIED IDEOGRAPH
+ {0xF7DD, 0x6525}, //13156 #CJK UNIFIED IDEOGRAPH
+ {0xF7DE, 0x6596}, //13157 #CJK UNIFIED IDEOGRAPH
+ {0xF7DF, 0x66EB}, //13158 #CJK UNIFIED IDEOGRAPH
+ {0xF7E0, 0x6B11}, //13159 #CJK UNIFIED IDEOGRAPH
+ {0xF7E1, 0x6B12}, //13160 #CJK UNIFIED IDEOGRAPH
+ {0xF7E2, 0x6B0F}, //13161 #CJK UNIFIED IDEOGRAPH
+ {0xF7E3, 0x6BCA}, //13162 #CJK UNIFIED IDEOGRAPH
+ {0xF7E4, 0x705B}, //13163 #CJK UNIFIED IDEOGRAPH
+ {0xF7E5, 0x705A}, //13164 #CJK UNIFIED IDEOGRAPH
+ {0xF7E6, 0x7222}, //13165 #CJK UNIFIED IDEOGRAPH
+ {0xF7E7, 0x7382}, //13166 #CJK UNIFIED IDEOGRAPH
+ {0xF7E8, 0x7381}, //13167 #CJK UNIFIED IDEOGRAPH
+ {0xF7E9, 0x7383}, //13168 #CJK UNIFIED IDEOGRAPH
+ {0xF7EA, 0x7670}, //13169 #CJK UNIFIED IDEOGRAPH
+ {0xF7EB, 0x77D4}, //13170 #CJK UNIFIED IDEOGRAPH
+ {0xF7EC, 0x7C67}, //13171 #CJK UNIFIED IDEOGRAPH
+ {0xF7ED, 0x7C66}, //13172 #CJK UNIFIED IDEOGRAPH
+ {0xF7EE, 0x7E95}, //13173 #CJK UNIFIED IDEOGRAPH
+ {0xF7EF, 0x826C}, //13174 #CJK UNIFIED IDEOGRAPH
+ {0xF7F0, 0x863A}, //13175 #CJK UNIFIED IDEOGRAPH
+ {0xF7F1, 0x8640}, //13176 #CJK UNIFIED IDEOGRAPH
+ {0xF7F2, 0x8639}, //13177 #CJK UNIFIED IDEOGRAPH
+ {0xF7F3, 0x863C}, //13178 #CJK UNIFIED IDEOGRAPH
+ {0xF7F4, 0x8631}, //13179 #CJK UNIFIED IDEOGRAPH
+ {0xF7F5, 0x863B}, //13180 #CJK UNIFIED IDEOGRAPH
+ {0xF7F6, 0x863E}, //13181 #CJK UNIFIED IDEOGRAPH
+ {0xF7F7, 0x8830}, //13182 #CJK UNIFIED IDEOGRAPH
+ {0xF7F8, 0x8832}, //13183 #CJK UNIFIED IDEOGRAPH
+ {0xF7F9, 0x882E}, //13184 #CJK UNIFIED IDEOGRAPH
+ {0xF7FA, 0x8833}, //13185 #CJK UNIFIED IDEOGRAPH
+ {0xF7FB, 0x8976}, //13186 #CJK UNIFIED IDEOGRAPH
+ {0xF7FC, 0x8974}, //13187 #CJK UNIFIED IDEOGRAPH
+ {0xF7FD, 0x8973}, //13188 #CJK UNIFIED IDEOGRAPH
+ {0xF7FE, 0x89FE}, //13189 #CJK UNIFIED IDEOGRAPH
+ {0xF840, 0x8B8C}, //13190 #CJK UNIFIED IDEOGRAPH
+ {0xF841, 0x8B8E}, //13191 #CJK UNIFIED IDEOGRAPH
+ {0xF842, 0x8B8B}, //13192 #CJK UNIFIED IDEOGRAPH
+ {0xF843, 0x8B88}, //13193 #CJK UNIFIED IDEOGRAPH
+ {0xF844, 0x8C45}, //13194 #CJK UNIFIED IDEOGRAPH
+ {0xF845, 0x8D19}, //13195 #CJK UNIFIED IDEOGRAPH
+ {0xF846, 0x8E98}, //13196 #CJK UNIFIED IDEOGRAPH
+ {0xF847, 0x8F64}, //13197 #CJK UNIFIED IDEOGRAPH
+ {0xF848, 0x8F63}, //13198 #CJK UNIFIED IDEOGRAPH
+ {0xF849, 0x91BC}, //13199 #CJK UNIFIED IDEOGRAPH
+ {0xF84A, 0x9462}, //13200 #CJK UNIFIED IDEOGRAPH
+ {0xF84B, 0x9455}, //13201 #CJK UNIFIED IDEOGRAPH
+ {0xF84C, 0x945D}, //13202 #CJK UNIFIED IDEOGRAPH
+ {0xF84D, 0x9457}, //13203 #CJK UNIFIED IDEOGRAPH
+ {0xF84E, 0x945E}, //13204 #CJK UNIFIED IDEOGRAPH
+ {0xF84F, 0x97C4}, //13205 #CJK UNIFIED IDEOGRAPH
+ {0xF850, 0x97C5}, //13206 #CJK UNIFIED IDEOGRAPH
+ {0xF851, 0x9800}, //13207 #CJK UNIFIED IDEOGRAPH
+ {0xF852, 0x9A56}, //13208 #CJK UNIFIED IDEOGRAPH
+ {0xF853, 0x9A59}, //13209 #CJK UNIFIED IDEOGRAPH
+ {0xF854, 0x9B1E}, //13210 #CJK UNIFIED IDEOGRAPH
+ {0xF855, 0x9B1F}, //13211 #CJK UNIFIED IDEOGRAPH
+ {0xF856, 0x9B20}, //13212 #CJK UNIFIED IDEOGRAPH
+ {0xF857, 0x9C52}, //13213 #CJK UNIFIED IDEOGRAPH
+ {0xF858, 0x9C58}, //13214 #CJK UNIFIED IDEOGRAPH
+ {0xF859, 0x9C50}, //13215 #CJK UNIFIED IDEOGRAPH
+ {0xF85A, 0x9C4A}, //13216 #CJK UNIFIED IDEOGRAPH
+ {0xF85B, 0x9C4D}, //13217 #CJK UNIFIED IDEOGRAPH
+ {0xF85C, 0x9C4B}, //13218 #CJK UNIFIED IDEOGRAPH
+ {0xF85D, 0x9C55}, //13219 #CJK UNIFIED IDEOGRAPH
+ {0xF85E, 0x9C59}, //13220 #CJK UNIFIED IDEOGRAPH
+ {0xF85F, 0x9C4C}, //13221 #CJK UNIFIED IDEOGRAPH
+ {0xF860, 0x9C4E}, //13222 #CJK UNIFIED IDEOGRAPH
+ {0xF861, 0x9DFB}, //13223 #CJK UNIFIED IDEOGRAPH
+ {0xF862, 0x9DF7}, //13224 #CJK UNIFIED IDEOGRAPH
+ {0xF863, 0x9DEF}, //13225 #CJK UNIFIED IDEOGRAPH
+ {0xF864, 0x9DE3}, //13226 #CJK UNIFIED IDEOGRAPH
+ {0xF865, 0x9DEB}, //13227 #CJK UNIFIED IDEOGRAPH
+ {0xF866, 0x9DF8}, //13228 #CJK UNIFIED IDEOGRAPH
+ {0xF867, 0x9DE4}, //13229 #CJK UNIFIED IDEOGRAPH
+ {0xF868, 0x9DF6}, //13230 #CJK UNIFIED IDEOGRAPH
+ {0xF869, 0x9DE1}, //13231 #CJK UNIFIED IDEOGRAPH
+ {0xF86A, 0x9DEE}, //13232 #CJK UNIFIED IDEOGRAPH
+ {0xF86B, 0x9DE6}, //13233 #CJK UNIFIED IDEOGRAPH
+ {0xF86C, 0x9DF2}, //13234 #CJK UNIFIED IDEOGRAPH
+ {0xF86D, 0x9DF0}, //13235 #CJK UNIFIED IDEOGRAPH
+ {0xF86E, 0x9DE2}, //13236 #CJK UNIFIED IDEOGRAPH
+ {0xF86F, 0x9DEC}, //13237 #CJK UNIFIED IDEOGRAPH
+ {0xF870, 0x9DF4}, //13238 #CJK UNIFIED IDEOGRAPH
+ {0xF871, 0x9DF3}, //13239 #CJK UNIFIED IDEOGRAPH
+ {0xF872, 0x9DE8}, //13240 #CJK UNIFIED IDEOGRAPH
+ {0xF873, 0x9DED}, //13241 #CJK UNIFIED IDEOGRAPH
+ {0xF874, 0x9EC2}, //13242 #CJK UNIFIED IDEOGRAPH
+ {0xF875, 0x9ED0}, //13243 #CJK UNIFIED IDEOGRAPH
+ {0xF876, 0x9EF2}, //13244 #CJK UNIFIED IDEOGRAPH
+ {0xF877, 0x9EF3}, //13245 #CJK UNIFIED IDEOGRAPH
+ {0xF878, 0x9F06}, //13246 #CJK UNIFIED IDEOGRAPH
+ {0xF879, 0x9F1C}, //13247 #CJK UNIFIED IDEOGRAPH
+ {0xF87A, 0x9F38}, //13248 #CJK UNIFIED IDEOGRAPH
+ {0xF87B, 0x9F37}, //13249 #CJK UNIFIED IDEOGRAPH
+ {0xF87C, 0x9F36}, //13250 #CJK UNIFIED IDEOGRAPH
+ {0xF87D, 0x9F43}, //13251 #CJK UNIFIED IDEOGRAPH
+ {0xF87E, 0x9F4F}, //13252 #CJK UNIFIED IDEOGRAPH
+ {0xF8A1, 0x9F71}, //13253 #CJK UNIFIED IDEOGRAPH
+ {0xF8A2, 0x9F70}, //13254 #CJK UNIFIED IDEOGRAPH
+ {0xF8A3, 0x9F6E}, //13255 #CJK UNIFIED IDEOGRAPH
+ {0xF8A4, 0x9F6F}, //13256 #CJK UNIFIED IDEOGRAPH
+ {0xF8A5, 0x56D3}, //13257 #CJK UNIFIED IDEOGRAPH
+ {0xF8A6, 0x56CD}, //13258 #CJK UNIFIED IDEOGRAPH
+ {0xF8A7, 0x5B4E}, //13259 #CJK UNIFIED IDEOGRAPH
+ {0xF8A8, 0x5C6D}, //13260 #CJK UNIFIED IDEOGRAPH
+ {0xF8A9, 0x652D}, //13261 #CJK UNIFIED IDEOGRAPH
+ {0xF8AA, 0x66ED}, //13262 #CJK UNIFIED IDEOGRAPH
+ {0xF8AB, 0x66EE}, //13263 #CJK UNIFIED IDEOGRAPH
+ {0xF8AC, 0x6B13}, //13264 #CJK UNIFIED IDEOGRAPH
+ {0xF8AD, 0x705F}, //13265 #CJK UNIFIED IDEOGRAPH
+ {0xF8AE, 0x7061}, //13266 #CJK UNIFIED IDEOGRAPH
+ {0xF8AF, 0x705D}, //13267 #CJK UNIFIED IDEOGRAPH
+ {0xF8B0, 0x7060}, //13268 #CJK UNIFIED IDEOGRAPH
+ {0xF8B1, 0x7223}, //13269 #CJK UNIFIED IDEOGRAPH
+ {0xF8B2, 0x74DB}, //13270 #CJK UNIFIED IDEOGRAPH
+ {0xF8B3, 0x74E5}, //13271 #CJK UNIFIED IDEOGRAPH
+ {0xF8B4, 0x77D5}, //13272 #CJK UNIFIED IDEOGRAPH
+ {0xF8B5, 0x7938}, //13273 #CJK UNIFIED IDEOGRAPH
+ {0xF8B6, 0x79B7}, //13274 #CJK UNIFIED IDEOGRAPH
+ {0xF8B7, 0x79B6}, //13275 #CJK UNIFIED IDEOGRAPH
+ {0xF8B8, 0x7C6A}, //13276 #CJK UNIFIED IDEOGRAPH
+ {0xF8B9, 0x7E97}, //13277 #CJK UNIFIED IDEOGRAPH
+ {0xF8BA, 0x7F89}, //13278 #CJK UNIFIED IDEOGRAPH
+ {0xF8BB, 0x826D}, //13279 #CJK UNIFIED IDEOGRAPH
+ {0xF8BC, 0x8643}, //13280 #CJK UNIFIED IDEOGRAPH
+ {0xF8BD, 0x8838}, //13281 #CJK UNIFIED IDEOGRAPH
+ {0xF8BE, 0x8837}, //13282 #CJK UNIFIED IDEOGRAPH
+ {0xF8BF, 0x8835}, //13283 #CJK UNIFIED IDEOGRAPH
+ {0xF8C0, 0x884B}, //13284 #CJK UNIFIED IDEOGRAPH
+ {0xF8C1, 0x8B94}, //13285 #CJK UNIFIED IDEOGRAPH
+ {0xF8C2, 0x8B95}, //13286 #CJK UNIFIED IDEOGRAPH
+ {0xF8C3, 0x8E9E}, //13287 #CJK UNIFIED IDEOGRAPH
+ {0xF8C4, 0x8E9F}, //13288 #CJK UNIFIED IDEOGRAPH
+ {0xF8C5, 0x8EA0}, //13289 #CJK UNIFIED IDEOGRAPH
+ {0xF8C6, 0x8E9D}, //13290 #CJK UNIFIED IDEOGRAPH
+ {0xF8C7, 0x91BE}, //13291 #CJK UNIFIED IDEOGRAPH
+ {0xF8C8, 0x91BD}, //13292 #CJK UNIFIED IDEOGRAPH
+ {0xF8C9, 0x91C2}, //13293 #CJK UNIFIED IDEOGRAPH
+ {0xF8CA, 0x946B}, //13294 #CJK UNIFIED IDEOGRAPH
+ {0xF8CB, 0x9468}, //13295 #CJK UNIFIED IDEOGRAPH
+ {0xF8CC, 0x9469}, //13296 #CJK UNIFIED IDEOGRAPH
+ {0xF8CD, 0x96E5}, //13297 #CJK UNIFIED IDEOGRAPH
+ {0xF8CE, 0x9746}, //13298 #CJK UNIFIED IDEOGRAPH
+ {0xF8CF, 0x9743}, //13299 #CJK UNIFIED IDEOGRAPH
+ {0xF8D0, 0x9747}, //13300 #CJK UNIFIED IDEOGRAPH
+ {0xF8D1, 0x97C7}, //13301 #CJK UNIFIED IDEOGRAPH
+ {0xF8D2, 0x97E5}, //13302 #CJK UNIFIED IDEOGRAPH
+ {0xF8D3, 0x9A5E}, //13303 #CJK UNIFIED IDEOGRAPH
+ {0xF8D4, 0x9AD5}, //13304 #CJK UNIFIED IDEOGRAPH
+ {0xF8D5, 0x9B59}, //13305 #CJK UNIFIED IDEOGRAPH
+ {0xF8D6, 0x9C63}, //13306 #CJK UNIFIED IDEOGRAPH
+ {0xF8D7, 0x9C67}, //13307 #CJK UNIFIED IDEOGRAPH
+ {0xF8D8, 0x9C66}, //13308 #CJK UNIFIED IDEOGRAPH
+ {0xF8D9, 0x9C62}, //13309 #CJK UNIFIED IDEOGRAPH
+ {0xF8DA, 0x9C5E}, //13310 #CJK UNIFIED IDEOGRAPH
+ {0xF8DB, 0x9C60}, //13311 #CJK UNIFIED IDEOGRAPH
+ {0xF8DC, 0x9E02}, //13312 #CJK UNIFIED IDEOGRAPH
+ {0xF8DD, 0x9DFE}, //13313 #CJK UNIFIED IDEOGRAPH
+ {0xF8DE, 0x9E07}, //13314 #CJK UNIFIED IDEOGRAPH
+ {0xF8DF, 0x9E03}, //13315 #CJK UNIFIED IDEOGRAPH
+ {0xF8E0, 0x9E06}, //13316 #CJK UNIFIED IDEOGRAPH
+ {0xF8E1, 0x9E05}, //13317 #CJK UNIFIED IDEOGRAPH
+ {0xF8E2, 0x9E00}, //13318 #CJK UNIFIED IDEOGRAPH
+ {0xF8E3, 0x9E01}, //13319 #CJK UNIFIED IDEOGRAPH
+ {0xF8E4, 0x9E09}, //13320 #CJK UNIFIED IDEOGRAPH
+ {0xF8E5, 0x9DFF}, //13321 #CJK UNIFIED IDEOGRAPH
+ {0xF8E6, 0x9DFD}, //13322 #CJK UNIFIED IDEOGRAPH
+ {0xF8E7, 0x9E04}, //13323 #CJK UNIFIED IDEOGRAPH
+ {0xF8E8, 0x9EA0}, //13324 #CJK UNIFIED IDEOGRAPH
+ {0xF8E9, 0x9F1E}, //13325 #CJK UNIFIED IDEOGRAPH
+ {0xF8EA, 0x9F46}, //13326 #CJK UNIFIED IDEOGRAPH
+ {0xF8EB, 0x9F74}, //13327 #CJK UNIFIED IDEOGRAPH
+ {0xF8EC, 0x9F75}, //13328 #CJK UNIFIED IDEOGRAPH
+ {0xF8ED, 0x9F76}, //13329 #CJK UNIFIED IDEOGRAPH
+ {0xF8EE, 0x56D4}, //13330 #CJK UNIFIED IDEOGRAPH
+ {0xF8EF, 0x652E}, //13331 #CJK UNIFIED IDEOGRAPH
+ {0xF8F0, 0x65B8}, //13332 #CJK UNIFIED IDEOGRAPH
+ {0xF8F1, 0x6B18}, //13333 #CJK UNIFIED IDEOGRAPH
+ {0xF8F2, 0x6B19}, //13334 #CJK UNIFIED IDEOGRAPH
+ {0xF8F3, 0x6B17}, //13335 #CJK UNIFIED IDEOGRAPH
+ {0xF8F4, 0x6B1A}, //13336 #CJK UNIFIED IDEOGRAPH
+ {0xF8F5, 0x7062}, //13337 #CJK UNIFIED IDEOGRAPH
+ {0xF8F6, 0x7226}, //13338 #CJK UNIFIED IDEOGRAPH
+ {0xF8F7, 0x72AA}, //13339 #CJK UNIFIED IDEOGRAPH
+ {0xF8F8, 0x77D8}, //13340 #CJK UNIFIED IDEOGRAPH
+ {0xF8F9, 0x77D9}, //13341 #CJK UNIFIED IDEOGRAPH
+ {0xF8FA, 0x7939}, //13342 #CJK UNIFIED IDEOGRAPH
+ {0xF8FB, 0x7C69}, //13343 #CJK UNIFIED IDEOGRAPH
+ {0xF8FC, 0x7C6B}, //13344 #CJK UNIFIED IDEOGRAPH
+ {0xF8FD, 0x7CF6}, //13345 #CJK UNIFIED IDEOGRAPH
+ {0xF8FE, 0x7E9A}, //13346 #CJK UNIFIED IDEOGRAPH
+ {0xF940, 0x7E98}, //13347 #CJK UNIFIED IDEOGRAPH
+ {0xF941, 0x7E9B}, //13348 #CJK UNIFIED IDEOGRAPH
+ {0xF942, 0x7E99}, //13349 #CJK UNIFIED IDEOGRAPH
+ {0xF943, 0x81E0}, //13350 #CJK UNIFIED IDEOGRAPH
+ {0xF944, 0x81E1}, //13351 #CJK UNIFIED IDEOGRAPH
+ {0xF945, 0x8646}, //13352 #CJK UNIFIED IDEOGRAPH
+ {0xF946, 0x8647}, //13353 #CJK UNIFIED IDEOGRAPH
+ {0xF947, 0x8648}, //13354 #CJK UNIFIED IDEOGRAPH
+ {0xF948, 0x8979}, //13355 #CJK UNIFIED IDEOGRAPH
+ {0xF949, 0x897A}, //13356 #CJK UNIFIED IDEOGRAPH
+ {0xF94A, 0x897C}, //13357 #CJK UNIFIED IDEOGRAPH
+ {0xF94B, 0x897B}, //13358 #CJK UNIFIED IDEOGRAPH
+ {0xF94C, 0x89FF}, //13359 #CJK UNIFIED IDEOGRAPH
+ {0xF94D, 0x8B98}, //13360 #CJK UNIFIED IDEOGRAPH
+ {0xF94E, 0x8B99}, //13361 #CJK UNIFIED IDEOGRAPH
+ {0xF94F, 0x8EA5}, //13362 #CJK UNIFIED IDEOGRAPH
+ {0xF950, 0x8EA4}, //13363 #CJK UNIFIED IDEOGRAPH
+ {0xF951, 0x8EA3}, //13364 #CJK UNIFIED IDEOGRAPH
+ {0xF952, 0x946E}, //13365 #CJK UNIFIED IDEOGRAPH
+ {0xF953, 0x946D}, //13366 #CJK UNIFIED IDEOGRAPH
+ {0xF954, 0x946F}, //13367 #CJK UNIFIED IDEOGRAPH
+ {0xF955, 0x9471}, //13368 #CJK UNIFIED IDEOGRAPH
+ {0xF956, 0x9473}, //13369 #CJK UNIFIED IDEOGRAPH
+ {0xF957, 0x9749}, //13370 #CJK UNIFIED IDEOGRAPH
+ {0xF958, 0x9872}, //13371 #CJK UNIFIED IDEOGRAPH
+ {0xF959, 0x995F}, //13372 #CJK UNIFIED IDEOGRAPH
+ {0xF95A, 0x9C68}, //13373 #CJK UNIFIED IDEOGRAPH
+ {0xF95B, 0x9C6E}, //13374 #CJK UNIFIED IDEOGRAPH
+ {0xF95C, 0x9C6D}, //13375 #CJK UNIFIED IDEOGRAPH
+ {0xF95D, 0x9E0B}, //13376 #CJK UNIFIED IDEOGRAPH
+ {0xF95E, 0x9E0D}, //13377 #CJK UNIFIED IDEOGRAPH
+ {0xF95F, 0x9E10}, //13378 #CJK UNIFIED IDEOGRAPH
+ {0xF960, 0x9E0F}, //13379 #CJK UNIFIED IDEOGRAPH
+ {0xF961, 0x9E12}, //13380 #CJK UNIFIED IDEOGRAPH
+ {0xF962, 0x9E11}, //13381 #CJK UNIFIED IDEOGRAPH
+ {0xF963, 0x9EA1}, //13382 #CJK UNIFIED IDEOGRAPH
+ {0xF964, 0x9EF5}, //13383 #CJK UNIFIED IDEOGRAPH
+ {0xF965, 0x9F09}, //13384 #CJK UNIFIED IDEOGRAPH
+ {0xF966, 0x9F47}, //13385 #CJK UNIFIED IDEOGRAPH
+ {0xF967, 0x9F78}, //13386 #CJK UNIFIED IDEOGRAPH
+ {0xF968, 0x9F7B}, //13387 #CJK UNIFIED IDEOGRAPH
+ {0xF969, 0x9F7A}, //13388 #CJK UNIFIED IDEOGRAPH
+ {0xF96A, 0x9F79}, //13389 #CJK UNIFIED IDEOGRAPH
+ {0xF96B, 0x571E}, //13390 #CJK UNIFIED IDEOGRAPH
+ {0xF96C, 0x7066}, //13391 #CJK UNIFIED IDEOGRAPH
+ {0xF96D, 0x7C6F}, //13392 #CJK UNIFIED IDEOGRAPH
+ {0xF96E, 0x883C}, //13393 #CJK UNIFIED IDEOGRAPH
+ {0xF96F, 0x8DB2}, //13394 #CJK UNIFIED IDEOGRAPH
+ {0xF970, 0x8EA6}, //13395 #CJK UNIFIED IDEOGRAPH
+ {0xF971, 0x91C3}, //13396 #CJK UNIFIED IDEOGRAPH
+ {0xF972, 0x9474}, //13397 #CJK UNIFIED IDEOGRAPH
+ {0xF973, 0x9478}, //13398 #CJK UNIFIED IDEOGRAPH
+ {0xF974, 0x9476}, //13399 #CJK UNIFIED IDEOGRAPH
+ {0xF975, 0x9475}, //13400 #CJK UNIFIED IDEOGRAPH
+ {0xF976, 0x9A60}, //13401 #CJK UNIFIED IDEOGRAPH
+ {0xF977, 0x9C74}, //13402 #CJK UNIFIED IDEOGRAPH
+ {0xF978, 0x9C73}, //13403 #CJK UNIFIED IDEOGRAPH
+ {0xF979, 0x9C71}, //13404 #CJK UNIFIED IDEOGRAPH
+ {0xF97A, 0x9C75}, //13405 #CJK UNIFIED IDEOGRAPH
+ {0xF97B, 0x9E14}, //13406 #CJK UNIFIED IDEOGRAPH
+ {0xF97C, 0x9E13}, //13407 #CJK UNIFIED IDEOGRAPH
+ {0xF97D, 0x9EF6}, //13408 #CJK UNIFIED IDEOGRAPH
+ {0xF97E, 0x9F0A}, //13409 #CJK UNIFIED IDEOGRAPH
+ {0xF9A1, 0x9FA4}, //13410 #CJK UNIFIED IDEOGRAPH
+ {0xF9A2, 0x7068}, //13411 #CJK UNIFIED IDEOGRAPH
+ {0xF9A3, 0x7065}, //13412 #CJK UNIFIED IDEOGRAPH
+ {0xF9A4, 0x7CF7}, //13413 #CJK UNIFIED IDEOGRAPH
+ {0xF9A5, 0x866A}, //13414 #CJK UNIFIED IDEOGRAPH
+ {0xF9A6, 0x883E}, //13415 #CJK UNIFIED IDEOGRAPH
+ {0xF9A7, 0x883D}, //13416 #CJK UNIFIED IDEOGRAPH
+ {0xF9A8, 0x883F}, //13417 #CJK UNIFIED IDEOGRAPH
+ {0xF9A9, 0x8B9E}, //13418 #CJK UNIFIED IDEOGRAPH
+ {0xF9AA, 0x8C9C}, //13419 #CJK UNIFIED IDEOGRAPH
+ {0xF9AB, 0x8EA9}, //13420 #CJK UNIFIED IDEOGRAPH
+ {0xF9AC, 0x8EC9}, //13421 #CJK UNIFIED IDEOGRAPH
+ {0xF9AD, 0x974B}, //13422 #CJK UNIFIED IDEOGRAPH
+ {0xF9AE, 0x9873}, //13423 #CJK UNIFIED IDEOGRAPH
+ {0xF9AF, 0x9874}, //13424 #CJK UNIFIED IDEOGRAPH
+ {0xF9B0, 0x98CC}, //13425 #CJK UNIFIED IDEOGRAPH
+ {0xF9B1, 0x9961}, //13426 #CJK UNIFIED IDEOGRAPH
+ {0xF9B2, 0x99AB}, //13427 #CJK UNIFIED IDEOGRAPH
+ {0xF9B3, 0x9A64}, //13428 #CJK UNIFIED IDEOGRAPH
+ {0xF9B4, 0x9A66}, //13429 #CJK UNIFIED IDEOGRAPH
+ {0xF9B5, 0x9A67}, //13430 #CJK UNIFIED IDEOGRAPH
+ {0xF9B6, 0x9B24}, //13431 #CJK UNIFIED IDEOGRAPH
+ {0xF9B7, 0x9E15}, //13432 #CJK UNIFIED IDEOGRAPH
+ {0xF9B8, 0x9E17}, //13433 #CJK UNIFIED IDEOGRAPH
+ {0xF9B9, 0x9F48}, //13434 #CJK UNIFIED IDEOGRAPH
+ {0xF9BA, 0x6207}, //13435 #CJK UNIFIED IDEOGRAPH
+ {0xF9BB, 0x6B1E}, //13436 #CJK UNIFIED IDEOGRAPH
+ {0xF9BC, 0x7227}, //13437 #CJK UNIFIED IDEOGRAPH
+ {0xF9BD, 0x864C}, //13438 #CJK UNIFIED IDEOGRAPH
+ {0xF9BE, 0x8EA8}, //13439 #CJK UNIFIED IDEOGRAPH
+ {0xF9BF, 0x9482}, //13440 #CJK UNIFIED IDEOGRAPH
+ {0xF9C0, 0x9480}, //13441 #CJK UNIFIED IDEOGRAPH
+ {0xF9C1, 0x9481}, //13442 #CJK UNIFIED IDEOGRAPH
+ {0xF9C2, 0x9A69}, //13443 #CJK UNIFIED IDEOGRAPH
+ {0xF9C3, 0x9A68}, //13444 #CJK UNIFIED IDEOGRAPH
+ {0xF9C4, 0x9B2E}, //13445 #CJK UNIFIED IDEOGRAPH
+ {0xF9C5, 0x9E19}, //13446 #CJK UNIFIED IDEOGRAPH
+ {0xF9C6, 0x7229}, //13447 #CJK UNIFIED IDEOGRAPH
+ {0xF9C7, 0x864B}, //13448 #CJK UNIFIED IDEOGRAPH
+ {0xF9C8, 0x8B9F}, //13449 #CJK UNIFIED IDEOGRAPH
+ {0xF9C9, 0x9483}, //13450 #CJK UNIFIED IDEOGRAPH
+ {0xF9CA, 0x9C79}, //13451 #CJK UNIFIED IDEOGRAPH
+ {0xF9CB, 0x9EB7}, //13452 #CJK UNIFIED IDEOGRAPH
+ {0xF9CC, 0x7675}, //13453 #CJK UNIFIED IDEOGRAPH
+ {0xF9CD, 0x9A6B}, //13454 #CJK UNIFIED IDEOGRAPH
+ {0xF9CE, 0x9C7A}, //13455 #CJK UNIFIED IDEOGRAPH
+ {0xF9CF, 0x9E1D}, //13456 #CJK UNIFIED IDEOGRAPH
+ {0xF9D0, 0x7069}, //13457 #CJK UNIFIED IDEOGRAPH
+ {0xF9D1, 0x706A}, //13458 #CJK UNIFIED IDEOGRAPH
+ {0xF9D2, 0x9EA4}, //13459 #CJK UNIFIED IDEOGRAPH
+ {0xF9D3, 0x9F7E}, //13460 #CJK UNIFIED IDEOGRAPH
+ {0xF9D4, 0x9F49}, //13461 #CJK UNIFIED IDEOGRAPH
+ {0xF9D5, 0x9F98}, //13462 #CJK UNIFIED IDEOGRAPH
+ {0xF9D6, 0x7881}, //13463 #CJK UNIFIED IDEOGRAPH
+ {0xF9D7, 0x92B9}, //13464 #CJK UNIFIED IDEOGRAPH
+ {0xF9D8, 0x88CF}, //13465 #CJK UNIFIED IDEOGRAPH
+ {0xF9D9, 0x58BB}, //13466 #CJK UNIFIED IDEOGRAPH
+ {0xF9DA, 0x6052}, //13467 #CJK UNIFIED IDEOGRAPH
+ {0xF9DB, 0x7CA7}, //13468 #CJK UNIFIED IDEOGRAPH
+ {0xF9DC, 0x5AFA}, //13469 #CJK UNIFIED IDEOGRAPH
+ {0xF9DD, 0x2554}, //13470 #BOX DRAWINGS DOUBLE DOWN AND RIGHT
+ {0xF9DE, 0x2566}, //13471 #BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
+ {0xF9DF, 0x2557}, //13472 #BOX DRAWINGS DOUBLE DOWN AND LEFT
+ {0xF9E0, 0x2560}, //13473 #BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
+ {0xF9E1, 0x256C}, //13474 #BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
+ {0xF9E2, 0x2563}, //13475 #BOX DRAWINGS DOUBLE VERTICAL AND LEFT
+ {0xF9E3, 0x255A}, //13476 #BOX DRAWINGS DOUBLE UP AND RIGHT
+ {0xF9E4, 0x2569}, //13477 #BOX DRAWINGS DOUBLE UP AND HORIZONTAL
+ {0xF9E5, 0x255D}, //13478 #BOX DRAWINGS DOUBLE UP AND LEFT
+ {0xF9E6, 0x2552}, //13479 #BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE
+ {0xF9E7, 0x2564}, //13480 #BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE
+ {0xF9E8, 0x2555}, //13481 #BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE
+ {0xF9E9, 0x255E}, //13482 #BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE
+ {0xF9EA, 0x256A}, //13483 #BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE
+ {0xF9EB, 0x2561}, //13484 #BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE
+ {0xF9EC, 0x2558}, //13485 #BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE
+ {0xF9ED, 0x2567}, //13486 #BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE
+ {0xF9EE, 0x255B}, //13487 #BOX DRAWINGS UP SINGLE AND LEFT DOUBLE
+ {0xF9EF, 0x2553}, //13488 #BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE
+ {0xF9F0, 0x2565}, //13489 #BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE
+ {0xF9F1, 0x2556}, //13490 #BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE
+ {0xF9F2, 0x255F}, //13491 #BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE
+ {0xF9F3, 0x256B}, //13492 #BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE
+ {0xF9F4, 0x2562}, //13493 #BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE
+ {0xF9F5, 0x2559}, //13494 #BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE
+ {0xF9F6, 0x2568}, //13495 #BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE
+ {0xF9F7, 0x255C}, //13496 #BOX DRAWINGS UP DOUBLE AND LEFT SINGLE
+ {0xF9F8, 0x2551}, //13497 #BOX DRAWINGS DOUBLE VERTICAL
+ {0xF9F9, 0x2550}, //13498 #BOX DRAWINGS DOUBLE HORIZONTAL
+ {0xF9FA, 0x256D}, //13499 #BOX DRAWINGS LIGHT ARC DOWN AND RIGHT
+ {0xF9FB, 0x256E}, //13500 #BOX DRAWINGS LIGHT ARC DOWN AND LEFT
+ {0xF9FC, 0x2570}, //13501 #BOX DRAWINGS LIGHT ARC UP AND RIGHT
+ {0xF9FD, 0x256F}, //13502 #BOX DRAWINGS LIGHT ARC UP AND LEFT
+ {0xF9FE, 0x2593}, //13503 #DARK SHADE
+};
+
+#endif // DRW_CPTABLE950_H
--- /dev/null
+#ifndef DRW_CPTABLES_H
+#define DRW_CPTABLES_H
+
+//first entry in all tables are 0x80
+#define CPOFFSET 0x80
+#define CPLENGHTCOMMON 128
+
+//Table 874
+static const int DRW_Table874[] = {
+ 0x20AC, //1 #EURO SIGN
+ 0x00 , //2 #UNDEFINED
+ 0x00 , //3 #UNDEFINED
+ 0x00 , //4 #UNDEFINED
+ 0x00 , //5 #UNDEFINED
+ 0x2026, //6 #HORIZONTAL ELLIPSIS
+ 0x00 , //7 #UNDEFINED
+ 0x00 , //8 #UNDEFINED
+ 0x00 , //9 #UNDEFINED
+ 0x00 , //10 #UNDEFINED
+ 0x00 , //11 #UNDEFINED
+ 0x00 , //12 #UNDEFINED
+ 0x00 , //13 #UNDEFINED
+ 0x00 , //14 #UNDEFINED
+ 0x00 , //15 #UNDEFINED
+ 0x00 , //16 #UNDEFINED
+ 0x00 , //17 #UNDEFINED
+ 0x2018, //18 #LEFT SINGLE QUOTATION MARK
+ 0x2019, //19 #RIGHT SINGLE QUOTATION MARK
+ 0x201C, //20 #LEFT DOUBLE QUOTATION MARK
+ 0x201D, //21 #RIGHT DOUBLE QUOTATION MARK
+ 0x2022, //22 #BULLET
+ 0x2013, //23 #EN DASH
+ 0x2014, //24 #EM DASH
+ 0x00 , //25 #UNDEFINED
+ 0x00 , //26 #UNDEFINED
+ 0x00 , //27 #UNDEFINED
+ 0x00 , //28 #UNDEFINED
+ 0x00 , //29 #UNDEFINED
+ 0x00 , //30 #UNDEFINED
+ 0x00 , //31 #UNDEFINED
+ 0x00 , //32 #UNDEFINED
+ 0x00A0, //33 #NO-BREAK SPACE
+ 0x0E01, //34 #THAI CHARACTER KO KAI
+ 0x0E02, //35 #THAI CHARACTER KHO KHAI
+ 0x0E03, //36 #THAI CHARACTER KHO KHUAT
+ 0x0E04, //37 #THAI CHARACTER KHO KHWAI
+ 0x0E05, //38 #THAI CHARACTER KHO KHON
+ 0x0E06, //39 #THAI CHARACTER KHO RAKHANG
+ 0x0E07, //40 #THAI CHARACTER NGO NGU
+ 0x0E08, //41 #THAI CHARACTER CHO CHAN
+ 0x0E09, //42 #THAI CHARACTER CHO CHING
+ 0x0E0A, //43 #THAI CHARACTER CHO CHANG
+ 0x0E0B, //44 #THAI CHARACTER SO SO
+ 0x0E0C, //45 #THAI CHARACTER CHO CHOE
+ 0x0E0D, //46 #THAI CHARACTER YO YING
+ 0x0E0E, //47 #THAI CHARACTER DO CHADA
+ 0x0E0F, //48 #THAI CHARACTER TO PATAK
+ 0x0E10, //49 #THAI CHARACTER THO THAN
+ 0x0E11, //50 #THAI CHARACTER THO NANGMONTHO
+ 0x0E12, //51 #THAI CHARACTER THO PHUTHAO
+ 0x0E13, //52 #THAI CHARACTER NO NEN
+ 0x0E14, //53 #THAI CHARACTER DO DEK
+ 0x0E15, //54 #THAI CHARACTER TO TAO
+ 0x0E16, //55 #THAI CHARACTER THO THUNG
+ 0x0E17, //56 #THAI CHARACTER THO THAHAN
+ 0x0E18, //57 #THAI CHARACTER THO THONG
+ 0x0E19, //58 #THAI CHARACTER NO NU
+ 0x0E1A, //59 #THAI CHARACTER BO BAIMAI
+ 0x0E1B, //60 #THAI CHARACTER PO PLA
+ 0x0E1C, //61 #THAI CHARACTER PHO PHUNG
+ 0x0E1D, //62 #THAI CHARACTER FO FA
+ 0x0E1E, //63 #THAI CHARACTER PHO PHAN
+ 0x0E1F, //64 #THAI CHARACTER FO FAN
+ 0x0E20, //65 #THAI CHARACTER PHO SAMPHAO
+ 0x0E21, //66 #THAI CHARACTER MO MA
+ 0x0E22, //67 #THAI CHARACTER YO YAK
+ 0x0E23, //68 #THAI CHARACTER RO RUA
+ 0x0E24, //69 #THAI CHARACTER RU
+ 0x0E25, //70 #THAI CHARACTER LO LING
+ 0x0E26, //71 #THAI CHARACTER LU
+ 0x0E27, //72 #THAI CHARACTER WO WAEN
+ 0x0E28, //73 #THAI CHARACTER SO SALA
+ 0x0E29, //74 #THAI CHARACTER SO RUSI
+ 0x0E2A, //75 #THAI CHARACTER SO SUA
+ 0x0E2B, //76 #THAI CHARACTER HO HIP
+ 0x0E2C, //77 #THAI CHARACTER LO CHULA
+ 0x0E2D, //78 #THAI CHARACTER O ANG
+ 0x0E2E, //79 #THAI CHARACTER HO NOKHUK
+ 0x0E2F, //80 #THAI CHARACTER PAIYANNOI
+ 0x0E30, //81 #THAI CHARACTER SARA A
+ 0x0E31, //82 #THAI CHARACTER MAI HAN-AKAT
+ 0x0E32, //83 #THAI CHARACTER SARA AA
+ 0x0E33, //84 #THAI CHARACTER SARA AM
+ 0x0E34, //85 #THAI CHARACTER SARA I
+ 0x0E35, //86 #THAI CHARACTER SARA II
+ 0x0E36, //87 #THAI CHARACTER SARA UE
+ 0x0E37, //88 #THAI CHARACTER SARA UEE
+ 0x0E38, //89 #THAI CHARACTER SARA U
+ 0x0E39, //90 #THAI CHARACTER SARA UU
+ 0x0E3A, //91 #THAI CHARACTER PHINTHU
+ 0x00 , //92 #UNDEFINED
+ 0x00 , //93 #UNDEFINED
+ 0x00 , //94 #UNDEFINED
+ 0x00 , //95 #UNDEFINED
+ 0x0E3F, //96 #THAI CURRENCY SYMBOL BAHT
+ 0x0E40, //97 #THAI CHARACTER SARA E
+ 0x0E41, //98 #THAI CHARACTER SARA AE
+ 0x0E42, //99 #THAI CHARACTER SARA O
+ 0x0E43, //100 #THAI CHARACTER SARA AI MAIMUAN
+ 0x0E44, //101 #THAI CHARACTER SARA AI MAIMALAI
+ 0x0E45, //102 #THAI CHARACTER LAKKHANGYAO
+ 0x0E46, //103 #THAI CHARACTER MAIYAMOK
+ 0x0E47, //104 #THAI CHARACTER MAITAIKHU
+ 0x0E48, //105 #THAI CHARACTER MAI EK
+ 0x0E49, //106 #THAI CHARACTER MAI THO
+ 0x0E4A, //107 #THAI CHARACTER MAI TRI
+ 0x0E4B, //108 #THAI CHARACTER MAI CHATTAWA
+ 0x0E4C, //109 #THAI CHARACTER THANTHAKHAT
+ 0x0E4D, //110 #THAI CHARACTER NIKHAHIT
+ 0x0E4E, //111 #THAI CHARACTER YAMAKKAN
+ 0x0E4F, //112 #THAI CHARACTER FONGMAN
+ 0x0E50, //113 #THAI DIGIT ZERO
+ 0x0E51, //114 #THAI DIGIT ONE
+ 0x0E52, //115 #THAI DIGIT TWO
+ 0x0E53, //116 #THAI DIGIT THREE
+ 0x0E54, //117 #THAI DIGIT FOUR
+ 0x0E55, //118 #THAI DIGIT FIVE
+ 0x0E56, //119 #THAI DIGIT SIX
+ 0x0E57, //120 #THAI DIGIT SEVEN
+ 0x0E58, //121 #THAI DIGIT EIGHT
+ 0x0E59, //122 #THAI DIGIT NINE
+ 0x0E5A, //123 #THAI CHARACTER ANGKHANKHU
+ 0x0E5B, //124 #THAI CHARACTER KHOMUT
+ 0x00 , //125 #UNDEFINED
+ 0x00 , //126 #UNDEFINED
+ 0x00 , //127 #UNDEFINED
+ 0x00 //128 #UNDEFINED
+};
+
+//Table 1250
+static const int DRW_Table1250[] = {
+0x20AC, //1 #EURO SIGN
+0x00, //2 #UNDEFINED
+0x201A, //3 #SINGLE LOW-9 QUOTATION MARK
+0x00, //4 #UNDEFINED
+0x201E, //5 #DOUBLE LOW-9 QUOTATION MARK
+0x2026, //6 #HORIZONTAL ELLIPSIS
+0x2020, //7 #DAGGER
+0x2021, //8 #DOUBLE DAGGER
+0x00, //9 #UNDEFINED
+0x2030, //10 #PER MILLE SIGN
+0x0160, //11 #LATIN CAPITAL LETTER S WITH CARON
+0x2039, //12 #SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+0x015A, //13 #LATIN CAPITAL LETTER S WITH ACUTE
+0x0164, //14 #LATIN CAPITAL LETTER T WITH CARON
+0x017D, //15 #LATIN CAPITAL LETTER Z WITH CARON
+0x0179, //16 #LATIN CAPITAL LETTER Z WITH ACUTE
+0x00, //17 #UNDEFINED
+0x2018, //18 #LEFT SINGLE QUOTATION MARK
+0x2019, //19 #RIGHT SINGLE QUOTATION MARK
+0x201C, //20 #LEFT DOUBLE QUOTATION MARK
+0x201D, //21 #RIGHT DOUBLE QUOTATION MARK
+0x2022, //22 #BULLET
+0x2013, //23 #EN DASH
+0x2014, //24 #EM DASH
+0x00, //25 #UNDEFINED
+0x2122, //26 #TRADE MARK SIGN
+0x0161, //27 #LATIN SMALL LETTER S WITH CARON
+0x203A, //28 #SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+0x015B, //29 #LATIN SMALL LETTER S WITH ACUTE
+0x0165, //30 #LATIN SMALL LETTER T WITH CARON
+0x017E, //31 #LATIN SMALL LETTER Z WITH CARON
+0x017A, //32 #LATIN SMALL LETTER Z WITH ACUTE
+0x00A0, //33 #NO-BREAK SPACE
+0x02C7, //34 #CARON
+0x02D8, //35 #BREVE
+0x0141, //36 #LATIN CAPITAL LETTER L WITH STROKE
+0x00A4, //37 #CURRENCY SIGN
+0x0104, //38 #LATIN CAPITAL LETTER A WITH OGONEK
+0x00A6, //39 #BROKEN BAR
+0x00A7, //40 #SECTION SIGN
+0x00A8, //41 #DIAERESIS
+0x00A9, //42 #COPYRIGHT SIGN
+0x015E, //43 #LATIN CAPITAL LETTER S WITH CEDILLA
+0x00AB, //44 #LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+0x00AC, //45 #NOT SIGN
+0x00AD, //46 #SOFT HYPHEN
+0x00AE, //47 #REGISTERED SIGN
+0x017B, //48 #LATIN CAPITAL LETTER Z WITH DOT ABOVE
+0x00B0, //49 #DEGREE SIGN
+0x00B1, //50 #PLUS-MINUS SIGN
+0x02DB, //51 #OGONEK
+0x0142, //52 #LATIN SMALL LETTER L WITH STROKE
+0x00B4, //53 #ACUTE ACCENT
+0x00B5, //54 #MICRO SIGN
+0x00B6, //55 #PILCROW SIGN
+0x00B7, //56 #MIDDLE DOT
+0x00B8, //57 #CEDILLA
+0x0105, //58 #LATIN SMALL LETTER A WITH OGONEK
+0x015F, //59 #LATIN SMALL LETTER S WITH CEDILLA
+0x00BB, //60 #RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+0x013D, //61 #LATIN CAPITAL LETTER L WITH CARON
+0x02DD, //62 #DOUBLE ACUTE ACCENT
+0x013E, //63 #LATIN SMALL LETTER L WITH CARON
+0x017C, //64 #LATIN SMALL LETTER Z WITH DOT ABOVE
+0x0154, //65 #LATIN CAPITAL LETTER R WITH ACUTE
+0x00C1, //66 #LATIN CAPITAL LETTER A WITH ACUTE
+0x00C2, //67 #LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+0x0102, //68 #LATIN CAPITAL LETTER A WITH BREVE
+0x00C4, //69 #LATIN CAPITAL LETTER A WITH DIAERESIS
+0x0139, //70 #LATIN CAPITAL LETTER L WITH ACUTE
+0x0106, //71 #LATIN CAPITAL LETTER C WITH ACUTE
+0x00C7, //72 #LATIN CAPITAL LETTER C WITH CEDILLA
+0x010C, //73 #LATIN CAPITAL LETTER C WITH CARON
+0x00C9, //74 #LATIN CAPITAL LETTER E WITH ACUTE
+0x0118, //75 #LATIN CAPITAL LETTER E WITH OGONEK
+0x00CB, //76 #LATIN CAPITAL LETTER E WITH DIAERESIS
+0x011A, //77 #LATIN CAPITAL LETTER E WITH CARON
+0x00CD, //78 #LATIN CAPITAL LETTER I WITH ACUTE
+0x00CE, //79 #LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+0x010E, //80 #LATIN CAPITAL LETTER D WITH CARON
+0x0110, //81 #LATIN CAPITAL LETTER D WITH STROKE
+0x0143, //82 #LATIN CAPITAL LETTER N WITH ACUTE
+0x0147, //83 #LATIN CAPITAL LETTER N WITH CARON
+0x00D3, //84 #LATIN CAPITAL LETTER O WITH ACUTE
+0x00D4, //85 #LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+0x0150, //86 #LATIN CAPITAL LETTER O WITH DOUBLE ACUTE
+0x00D6, //87 #LATIN CAPITAL LETTER O WITH DIAERESIS
+0x00D7, //88 #MULTIPLICATION SIGN
+0x0158, //89 #LATIN CAPITAL LETTER R WITH CARON
+0x016E, //90 #LATIN CAPITAL LETTER U WITH RING ABOVE
+0x00DA, //91 #LATIN CAPITAL LETTER U WITH ACUTE
+0x0170, //92 #LATIN CAPITAL LETTER U WITH DOUBLE ACUTE
+0x00DC, //93 #LATIN CAPITAL LETTER U WITH DIAERESIS
+0x00DD, //94 #LATIN CAPITAL LETTER Y WITH ACUTE
+0x0162, //95 #LATIN CAPITAL LETTER T WITH CEDILLA
+0x00DF, //96 #LATIN SMALL LETTER SHARP S
+0x0155, //97 #LATIN SMALL LETTER R WITH ACUTE
+0x00E1, //98 #LATIN SMALL LETTER A WITH ACUTE
+0x00E2, //99 #LATIN SMALL LETTER A WITH CIRCUMFLEX
+0x0103, //100 #LATIN SMALL LETTER A WITH BREVE
+0x00E4, //101 #LATIN SMALL LETTER A WITH DIAERESIS
+0x013A, //102 #LATIN SMALL LETTER L WITH ACUTE
+0x0107, //103 #LATIN SMALL LETTER C WITH ACUTE
+0x00E7, //104 #LATIN SMALL LETTER C WITH CEDILLA
+0x010D, //105 #LATIN SMALL LETTER C WITH CARON
+0x00E9, //106 #LATIN SMALL LETTER E WITH ACUTE
+0x0119, //107 #LATIN SMALL LETTER E WITH OGONEK
+0x00EB, //108 #LATIN SMALL LETTER E WITH DIAERESIS
+0x011B, //109 #LATIN SMALL LETTER E WITH CARON
+0x00ED, //110 #LATIN SMALL LETTER I WITH ACUTE
+0x00EE, //111 #LATIN SMALL LETTER I WITH CIRCUMFLEX
+0x010F, //112 #LATIN SMALL LETTER D WITH CARON
+0x0111, //113 #LATIN SMALL LETTER D WITH STROKE
+0x0144, //114 #LATIN SMALL LETTER N WITH ACUTE
+0x0148, //115 #LATIN SMALL LETTER N WITH CARON
+0x00F3, //116 #LATIN SMALL LETTER O WITH ACUTE
+0x00F4, //117 #LATIN SMALL LETTER O WITH CIRCUMFLEX
+0x0151, //118 #LATIN SMALL LETTER O WITH DOUBLE ACUTE
+0x00F6, //119 #LATIN SMALL LETTER O WITH DIAERESIS
+0x00F7, //120 #DIVISION SIGN
+0x0159, //121 #LATIN SMALL LETTER R WITH CARON
+0x016F, //122 #LATIN SMALL LETTER U WITH RING ABOVE
+0x00FA, //123 #LATIN SMALL LETTER U WITH ACUTE
+0x0171, //124 #LATIN SMALL LETTER U WITH DOUBLE ACUTE
+0x00FC, //125 #LATIN SMALL LETTER U WITH DIAERESIS
+0x00FD, //126 #LATIN SMALL LETTER Y WITH ACUTE
+0x0163, //127 #LATIN SMALL LETTER T WITH CEDILLA
+0x02D9 //128 #DOT ABOVE
+};
+
+
+//Table 1251
+static const int DRW_Table1251[] = {
+ 0x0402, //1 #CYRILLIC CAPITAL LETTER DJE
+ 0x0403, //2 #CYRILLIC CAPITAL LETTER GJE
+ 0x201A, //3 #SINGLE LOW-9 QUOTATION MARK
+ 0x0453, //4 #CYRILLIC SMALL LETTER GJE
+ 0x201E, //5 #DOUBLE LOW-9 QUOTATION MARK
+ 0x2026, //6 #HORIZONTAL ELLIPSIS
+ 0x2020, //7 #DAGGER
+ 0x2021, //8 #DOUBLE DAGGER
+ 0x20AC, //9 #EURO SIGN
+ 0x2030, //10 #PER MILLE SIGN
+ 0x0409, //11 #CYRILLIC CAPITAL LETTER LJE
+ 0x2039, //12 #SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+ 0x040A, //13 #CYRILLIC CAPITAL LETTER NJE
+ 0x040C, //14 #CYRILLIC CAPITAL LETTER KJE
+ 0x040B, //15 #CYRILLIC CAPITAL LETTER TSHE
+ 0x040F, //16 #CYRILLIC CAPITAL LETTER DZHE
+ 0x0452, //17 #CYRILLIC SMALL LETTER DJE
+ 0x2018, //18 #LEFT SINGLE QUOTATION MARK
+ 0x2019, //19 #RIGHT SINGLE QUOTATION MARK
+ 0x201C, //20 #LEFT DOUBLE QUOTATION MARK
+ 0x201D, //21 #RIGHT DOUBLE QUOTATION MARK
+ 0x2022, //22 #BULLET
+ 0x2013, //23 #EN DASH
+ 0x2014, //24 #EM DASH
+ 0x00, //25 #UNDEFINED
+ 0x2122, //26 #TRADE MARK SIGN
+ 0x0459, //27 #CYRILLIC SMALL LETTER LJE
+ 0x203A, //28 #SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+ 0x045A, //29 #CYRILLIC SMALL LETTER NJE
+ 0x045C, //30 #CYRILLIC SMALL LETTER KJE
+ 0x045B, //31 #CYRILLIC SMALL LETTER TSHE
+ 0x045F, //32 #CYRILLIC SMALL LETTER DZHE
+ 0x00A0, //33 #NO-BREAK SPACE
+ 0x040E, //34 #CYRILLIC CAPITAL LETTER SHORT U
+ 0x045E, //35 #CYRILLIC SMALL LETTER SHORT U
+ 0x0408, //36 #CYRILLIC CAPITAL LETTER JE
+ 0x00A4, //37 #CURRENCY SIGN
+ 0x0490, //38 #CYRILLIC CAPITAL LETTER GHE WITH UPTURN
+ 0x00A6, //39 #BROKEN BAR
+ 0x00A7, //40 #SECTION SIGN
+ 0x0401, //41 #CYRILLIC CAPITAL LETTER IO
+ 0x00A9, //42 #COPYRIGHT SIGN
+ 0x0404, //43 #CYRILLIC CAPITAL LETTER UKRAINIAN IE
+ 0x00AB, //44 #LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+ 0x00AC, //45 #NOT SIGN
+ 0x00AD, //46 #SOFT HYPHEN
+ 0x00AE, //47 #REGISTERED SIGN
+ 0x0407, //48 #CYRILLIC CAPITAL LETTER YI
+ 0x00B0, //49 #DEGREE SIGN
+ 0x00B1, //50 #PLUS-MINUS SIGN
+ 0x0406, //51 #CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I
+ 0x0456, //52 #CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
+ 0x0491, //53 #CYRILLIC SMALL LETTER GHE WITH UPTURN
+ 0x00B5, //54 #MICRO SIGN
+ 0x00B6, //55 #PILCROW SIGN
+ 0x00B7, //56 #MIDDLE DOT
+ 0x0451, //57 #CYRILLIC SMALL LETTER IO
+ 0x2116, //58 #NUMERO SIGN
+ 0x0454, //59 #CYRILLIC SMALL LETTER UKRAINIAN IE
+ 0x00BB, //60 #RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+ 0x0458, //61 #CYRILLIC SMALL LETTER JE
+ 0x0405, //62 #CYRILLIC CAPITAL LETTER DZE
+ 0x0455, //63 #CYRILLIC SMALL LETTER DZE
+ 0x0457, //64 #CYRILLIC SMALL LETTER YI
+ 0x0410, //65 #CYRILLIC CAPITAL LETTER A
+ 0x0411, //66 #CYRILLIC CAPITAL LETTER BE
+ 0x0412, //67 #CYRILLIC CAPITAL LETTER VE
+ 0x0413, //68 #CYRILLIC CAPITAL LETTER GHE
+ 0x0414, //69 #CYRILLIC CAPITAL LETTER DE
+ 0x0415, //70 #CYRILLIC CAPITAL LETTER IE
+ 0x0416, //71 #CYRILLIC CAPITAL LETTER ZHE
+ 0x0417, //72 #CYRILLIC CAPITAL LETTER ZE
+ 0x0418, //73 #CYRILLIC CAPITAL LETTER I
+ 0x0419, //74 #CYRILLIC CAPITAL LETTER SHORT I
+ 0x041A, //75 #CYRILLIC CAPITAL LETTER KA
+ 0x041B, //76 #CYRILLIC CAPITAL LETTER EL
+ 0x041C, //77 #CYRILLIC CAPITAL LETTER EM
+ 0x041D, //78 #CYRILLIC CAPITAL LETTER EN
+ 0x041E, //79 #CYRILLIC CAPITAL LETTER O
+ 0x041F, //80 #CYRILLIC CAPITAL LETTER PE
+ 0x0420, //81 #CYRILLIC CAPITAL LETTER ER
+ 0x0421, //82 #CYRILLIC CAPITAL LETTER ES
+ 0x0422, //83 #CYRILLIC CAPITAL LETTER TE
+ 0x0423, //84 #CYRILLIC CAPITAL LETTER U
+ 0x0424, //85 #CYRILLIC CAPITAL LETTER EF
+ 0x0425, //86 #CYRILLIC CAPITAL LETTER HA
+ 0x0426, //87 #CYRILLIC CAPITAL LETTER TSE
+ 0x0427, //88 #CYRILLIC CAPITAL LETTER CHE
+ 0x0428, //89 #CYRILLIC CAPITAL LETTER SHA
+ 0x0429, //90 #CYRILLIC CAPITAL LETTER SHCHA
+ 0x042A, //91 #CYRILLIC CAPITAL LETTER HARD SIGN
+ 0x042B, //92 #CYRILLIC CAPITAL LETTER YERU
+ 0x042C, //93 #CYRILLIC CAPITAL LETTER SOFT SIGN
+ 0x042D, //94 #CYRILLIC CAPITAL LETTER E
+ 0x042E, //95 #CYRILLIC CAPITAL LETTER YU
+ 0x042F, //96 #CYRILLIC CAPITAL LETTER YA
+ 0x0430, //97 #CYRILLIC SMALL LETTER A
+ 0x0431, //98 #CYRILLIC SMALL LETTER BE
+ 0x0432, //99 #CYRILLIC SMALL LETTER VE
+ 0x0433, //100 #CYRILLIC SMALL LETTER GHE
+ 0x0434, //101 #CYRILLIC SMALL LETTER DE
+ 0x0435, //102 #CYRILLIC SMALL LETTER IE
+ 0x0436, //103 #CYRILLIC SMALL LETTER ZHE
+ 0x0437, //104 #CYRILLIC SMALL LETTER ZE
+ 0x0438, //105 #CYRILLIC SMALL LETTER I
+ 0x0439, //106 #CYRILLIC SMALL LETTER SHORT I
+ 0x043A, //107 #CYRILLIC SMALL LETTER KA
+ 0x043B, //108 #CYRILLIC SMALL LETTER EL
+ 0x043C, //109 #CYRILLIC SMALL LETTER EM
+ 0x043D, //110 #CYRILLIC SMALL LETTER EN
+ 0x043E, //111 #CYRILLIC SMALL LETTER O
+ 0x043F, //112 #CYRILLIC SMALL LETTER PE
+ 0x0440, //113 #CYRILLIC SMALL LETTER ER
+ 0x0441, //114 #CYRILLIC SMALL LETTER ES
+ 0x0442, //115 #CYRILLIC SMALL LETTER TE
+ 0x0443, //116 #CYRILLIC SMALL LETTER U
+ 0x0444, //117 #CYRILLIC SMALL LETTER EF
+ 0x0445, //118 #CYRILLIC SMALL LETTER HA
+ 0x0446, //119 #CYRILLIC SMALL LETTER TSE
+ 0x0447, //120 #CYRILLIC SMALL LETTER CHE
+ 0x0448, //121 #CYRILLIC SMALL LETTER SHA
+ 0x0449, //122 #CYRILLIC SMALL LETTER SHCHA
+ 0x044A, //123 #CYRILLIC SMALL LETTER HARD SIGN
+ 0x044B, //124 #CYRILLIC SMALL LETTER YERU
+ 0x044C, //125 #CYRILLIC SMALL LETTER SOFT SIGN
+ 0x044D, //126 #CYRILLIC SMALL LETTER E
+ 0x044E, //127 #CYRILLIC SMALL LETTER YU
+ 0x044F //128 #CYRILLIC SMALL LETTER YA
+};
+
+
+//Table 1252
+static const int DRW_Table1252[] = {
+ 0x20AC, //1 #EURO SIGN
+ 0x00, //2 #UNDEFINED
+ 0x201A, //3 #SINGLE LOW-9 QUOTATION MARK
+ 0x0192, //4 #LATIN SMALL LETTER F WITH HOOK
+ 0x201E, //5 #DOUBLE LOW-9 QUOTATION MARK
+ 0x2026, //6 #HORIZONTAL ELLIPSIS
+ 0x2020, //7 #DAGGER
+ 0x2021, //8 #DOUBLE DAGGER
+ 0x02C6, //9 #MODIFIER LETTER CIRCUMFLEX ACCENT
+ 0x2030, //10 #PER MILLE SIGN
+ 0x0160, //11 #LATIN CAPITAL LETTER S WITH CARON
+ 0x2039, //12 #SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+ 0x0152, //13 #LATIN CAPITAL LIGATURE OE
+ 0x00, //14 #UNDEFINED
+ 0x017D, //15 #LATIN CAPITAL LETTER Z WITH CARON
+ 0x00, //16 #UNDEFINED
+ 0x00, //17 #UNDEFINED
+ 0x2018, //18 #LEFT SINGLE QUOTATION MARK
+ 0x2019, //19 #RIGHT SINGLE QUOTATION MARK
+ 0x201C, //20 #LEFT DOUBLE QUOTATION MARK
+ 0x201D, //21 #RIGHT DOUBLE QUOTATION MARK
+ 0x2022, //22 #BULLET
+ 0x2013, //23 #EN DASH
+ 0x2014, //24 #EM DASH
+ 0x02DC, //25 #SMALL TILDE
+ 0x2122, //26 #TRADE MARK SIGN
+ 0x0161, //27 #LATIN SMALL LETTER S WITH CARON
+ 0x203A, //28 #SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+ 0x0153, //29 #LATIN SMALL LIGATURE OE
+ 0x00, //30 #UNDEFINED
+ 0x017E, //31 #LATIN SMALL LETTER Z WITH CARON
+ 0x0178, //32 #LATIN CAPITAL LETTER Y WITH DIAERESIS
+ 0x00A0, //33 #NO-BREAK SPACE
+ 0x00A1, //34 #INVERTED EXCLAMATION MARK
+ 0x00A2, //35 #CENT SIGN
+ 0x00A3, //36 #POUND SIGN
+ 0x00A4, //37 #CURRENCY SIGN
+ 0x00A5, //38 #YEN SIGN
+ 0x00A6, //39 #BROKEN BAR
+ 0x00A7, //40 #SECTION SIGN
+ 0x00A8, //41 #DIAERESIS
+ 0x00A9, //42 #COPYRIGHT SIGN
+ 0x00AA, //43 #FEMININE ORDINAL INDICATOR
+ 0x00AB, //44 #LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+ 0x00AC, //45 #NOT SIGN
+ 0x00AD, //46 #SOFT HYPHEN
+ 0x00AE, //47 #REGISTERED SIGN
+ 0x00AF, //48 #MACRON
+ 0x00B0, //49 #DEGREE SIGN
+ 0x00B1, //50 #PLUS-MINUS SIGN
+ 0x00B2, //51 #SUPERSCRIPT TWO
+ 0x00B3, //52 #SUPERSCRIPT THREE
+ 0x00B4, //53 #ACUTE ACCENT
+ 0x00B5, //54 #MICRO SIGN
+ 0x00B6, //55 #PILCROW SIGN
+ 0x00B7, //56 #MIDDLE DOT
+ 0x00B8, //57 #CEDILLA
+ 0x00B9, //58 #SUPERSCRIPT ONE
+ 0x00BA, //59 #MASCULINE ORDINAL INDICATOR
+ 0x00BB, //60 #RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+ 0x00BC, //61 #VULGAR FRACTION ONE QUARTER
+ 0x00BD, //62 #VULGAR FRACTION ONE HALF
+ 0x00BE, //63 #VULGAR FRACTION THREE QUARTERS
+ 0x00BF, //64 #INVERTED QUESTION MARK
+ 0x00C0, //65 #LATIN CAPITAL LETTER A WITH GRAVE
+ 0x00C1, //66 #LATIN CAPITAL LETTER A WITH ACUTE
+ 0x00C2, //67 #LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+ 0x00C3, //68 #LATIN CAPITAL LETTER A WITH TILDE
+ 0x00C4, //69 #LATIN CAPITAL LETTER A WITH DIAERESIS
+ 0x00C5, //70 #LATIN CAPITAL LETTER A WITH RING ABOVE
+ 0x00C6, //71 #LATIN CAPITAL LETTER AE
+ 0x00C7, //72 #LATIN CAPITAL LETTER C WITH CEDILLA
+ 0x00C8, //73 #LATIN CAPITAL LETTER E WITH GRAVE
+ 0x00C9, //74 #LATIN CAPITAL LETTER E WITH ACUTE
+ 0x00CA, //75 #LATIN CAPITAL LETTER E WITH CIRCUMFLEX
+ 0x00CB, //76 #LATIN CAPITAL LETTER E WITH DIAERESIS
+ 0x00CC, //77 #LATIN CAPITAL LETTER I WITH GRAVE
+ 0x00CD, //78 #LATIN CAPITAL LETTER I WITH ACUTE
+ 0x00CE, //79 #LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+ 0x00CF, //80 #LATIN CAPITAL LETTER I WITH DIAERESIS
+ 0x00D0, //81 #LATIN CAPITAL LETTER ETH
+ 0x00D1, //82 #LATIN CAPITAL LETTER N WITH TILDE
+ 0x00D2, //83 #LATIN CAPITAL LETTER O WITH GRAVE
+ 0x00D3, //84 #LATIN CAPITAL LETTER O WITH ACUTE
+ 0x00D4, //85 #LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+ 0x00D5, //86 #LATIN CAPITAL LETTER O WITH TILDE
+ 0x00D6, //87 #LATIN CAPITAL LETTER O WITH DIAERESIS
+ 0x00D7, //88 #MULTIPLICATION SIGN
+ 0x00D8, //89 #LATIN CAPITAL LETTER O WITH STROKE
+ 0x00D9, //90 #LATIN CAPITAL LETTER U WITH GRAVE
+ 0x00DA, //91 #LATIN CAPITAL LETTER U WITH ACUTE
+ 0x00DB, //92 #LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+ 0x00DC, //93 #LATIN CAPITAL LETTER U WITH DIAERESIS
+ 0x00DD, //94 #LATIN CAPITAL LETTER Y WITH ACUTE
+ 0x00DE, //95 #LATIN CAPITAL LETTER THORN
+ 0x00DF, //96 #LATIN SMALL LETTER SHARP S
+ 0x00E0, //97 #LATIN SMALL LETTER A WITH GRAVE
+ 0x00E1, //98 #LATIN SMALL LETTER A WITH ACUTE
+ 0x00E2, //99 #LATIN SMALL LETTER A WITH CIRCUMFLEX
+ 0x00E3, //100 #LATIN SMALL LETTER A WITH TILDE
+ 0x00E4, //101 #LATIN SMALL LETTER A WITH DIAERESIS
+ 0x00E5, //102 #LATIN SMALL LETTER A WITH RING ABOVE
+ 0x00E6, //103 #LATIN SMALL LETTER AE
+ 0x00E7, //104 #LATIN SMALL LETTER C WITH CEDILLA
+ 0x00E8, //105 #LATIN SMALL LETTER E WITH GRAVE
+ 0x00E9, //106 #LATIN SMALL LETTER E WITH ACUTE
+ 0x00EA, //107 #LATIN SMALL LETTER E WITH CIRCUMFLEX
+ 0x00EB, //108 #LATIN SMALL LETTER E WITH DIAERESIS
+ 0x00EC, //109 #LATIN SMALL LETTER I WITH GRAVE
+ 0x00ED, //110 #LATIN SMALL LETTER I WITH ACUTE
+ 0x00EE, //111 #LATIN SMALL LETTER I WITH CIRCUMFLEX
+ 0x00EF, //112 #LATIN SMALL LETTER I WITH DIAERESIS
+ 0x00F0, //113 #LATIN SMALL LETTER ETH
+ 0x00F1, //114 #LATIN SMALL LETTER N WITH TILDE
+ 0x00F2, //115 #LATIN SMALL LETTER O WITH GRAVE
+ 0x00F3, //116 #LATIN SMALL LETTER O WITH ACUTE
+ 0x00F4, //117 #LATIN SMALL LETTER O WITH CIRCUMFLEX
+ 0x00F5, //118 #LATIN SMALL LETTER O WITH TILDE
+ 0x00F6, //119 #LATIN SMALL LETTER O WITH DIAERESIS
+ 0x00F7, //120 #DIVISION SIGN
+ 0x00F8, //121 #LATIN SMALL LETTER O WITH STROKE
+ 0x00F9, //122 #LATIN SMALL LETTER U WITH GRAVE
+ 0x00FA, //123 #LATIN SMALL LETTER U WITH ACUTE
+ 0x00FB, //124 #LATIN SMALL LETTER U WITH CIRCUMFLEX
+ 0x00FC, //125 #LATIN SMALL LETTER U WITH DIAERESIS
+ 0x00FD, //126 #LATIN SMALL LETTER Y WITH ACUTE
+ 0x00FE, //127 #LATIN SMALL LETTER THORN
+ 0x00FF //128 #LATIN SMALL LETTER Y WITH DIAERESIS
+};
+
+//Table 1253
+static const int DRW_Table1253[] = {
+ 0x20AC, //1 #EURO SIGN
+ 0x00 , //2 #UNDEFINED
+ 0x201A, //3 #SINGLE LOW-9 QUOTATION MARK
+ 0x0192, //4 #LATIN SMALL LETTER F WITH HOOK
+ 0x201E, //5 #DOUBLE LOW-9 QUOTATION MARK
+ 0x2026, //6 #HORIZONTAL ELLIPSIS
+ 0x2020, //7 #DAGGER
+ 0x2021, //8 #DOUBLE DAGGER
+ 0x00 , //9 #UNDEFINED
+ 0x2030, //10 #PER MILLE SIGN
+ 0x00 , //11 #UNDEFINED
+ 0x2039, //12 #SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+ 0x00 , //13 #UNDEFINED
+ 0x00 , //14 #UNDEFINED
+ 0x00 , //15 #UNDEFINED
+ 0x00 , //16 #UNDEFINED
+ 0x00 , //17 #UNDEFINED
+ 0x2018, //18 #LEFT SINGLE QUOTATION MARK
+ 0x2019, //19 #RIGHT SINGLE QUOTATION MARK
+ 0x201C, //20 #LEFT DOUBLE QUOTATION MARK
+ 0x201D, //21 #RIGHT DOUBLE QUOTATION MARK
+ 0x2022, //22 #BULLET
+ 0x2013, //23 #EN DASH
+ 0x2014, //24 #EM DASH
+ 0x00 , //25 #UNDEFINED
+ 0x2122, //26 #TRADE MARK SIGN
+ 0x00 , //27 #UNDEFINED
+ 0x203A, //28 #SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+ 0x00 , //29 #UNDEFINED
+ 0x00 , //30 #UNDEFINED
+ 0x00 , //31 #UNDEFINED
+ 0x00 , //32 #UNDEFINED
+ 0x00A0, //33 #NO-BREAK SPACE
+ 0x0385, //34 #GREEK DIALYTIKA TONOS
+ 0x0386, //35 #GREEK CAPITAL LETTER ALPHA WITH TONOS
+ 0x00A3, //36 #POUND SIGN
+ 0x00A4, //37 #CURRENCY SIGN
+ 0x00A5, //38 #YEN SIGN
+ 0x00A6, //39 #BROKEN BAR
+ 0x00A7, //40 #SECTION SIGN
+ 0x00A8, //41 #DIAERESIS
+ 0x00A9, //42 #COPYRIGHT SIGN
+ 0x00 , //43 #UNDEFINED
+ 0x00AB, //44 #LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+ 0x00AC, //45 #NOT SIGN
+ 0x00AD, //46 #SOFT HYPHEN
+ 0x00AE, //47 #REGISTERED SIGN
+ 0x2015, //48 #HORIZONTAL BAR
+ 0x00B0, //49 #DEGREE SIGN
+ 0x00B1, //50 #PLUS-MINUS SIGN
+ 0x00B2, //51 #SUPERSCRIPT TWO
+ 0x00B3, //52 #SUPERSCRIPT THREE
+ 0x0384, //53 #GREEK TONOS
+ 0x00B5, //54 #MICRO SIGN
+ 0x00B6, //55 #PILCROW SIGN
+ 0x00B7, //56 #MIDDLE DOT
+ 0x0388, //57 #GREEK CAPITAL LETTER EPSILON WITH TONOS
+ 0x0389, //58 #GREEK CAPITAL LETTER ETA WITH TONOS
+ 0x038A, //59 #GREEK CAPITAL LETTER IOTA WITH TONOS
+ 0x00BB, //60 #RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+ 0x038C, //61 #GREEK CAPITAL LETTER OMICRON WITH TONOS
+ 0x00BD, //62 #VULGAR FRACTION ONE HALF
+ 0x038E, //63 #GREEK CAPITAL LETTER UPSILON WITH TONOS
+ 0x038F, //64 #GREEK CAPITAL LETTER OMEGA WITH TONOS
+ 0x0390, //65 #GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS
+ 0x0391, //66 #GREEK CAPITAL LETTER ALPHA
+ 0x0392, //67 #GREEK CAPITAL LETTER BETA
+ 0x0393, //68 #GREEK CAPITAL LETTER GAMMA
+ 0x0394, //69 #GREEK CAPITAL LETTER DELTA
+ 0x0395, //70 #GREEK CAPITAL LETTER EPSILON
+ 0x0396, //71 #GREEK CAPITAL LETTER ZETA
+ 0x0397, //72 #GREEK CAPITAL LETTER ETA
+ 0x0398, //73 #GREEK CAPITAL LETTER THETA
+ 0x0399, //74 #GREEK CAPITAL LETTER IOTA
+ 0x039A, //75 #GREEK CAPITAL LETTER KAPPA
+ 0x039B, //76 #GREEK CAPITAL LETTER LAMDA
+ 0x039C, //77 #GREEK CAPITAL LETTER MU
+ 0x039D, //78 #GREEK CAPITAL LETTER NU
+ 0x039E, //79 #GREEK CAPITAL LETTER XI
+ 0x039F, //80 #GREEK CAPITAL LETTER OMICRON
+ 0x03A0, //81 #GREEK CAPITAL LETTER PI
+ 0x03A1, //82 #GREEK CAPITAL LETTER RHO
+ 0x00 , //83 #UNDEFINED
+ 0x03A3, //84 #GREEK CAPITAL LETTER SIGMA
+ 0x03A4, //85 #GREEK CAPITAL LETTER TAU
+ 0x03A5, //86 #GREEK CAPITAL LETTER UPSILON
+ 0x03A6, //87 #GREEK CAPITAL LETTER PHI
+ 0x03A7, //88 #GREEK CAPITAL LETTER CHI
+ 0x03A8, //89 #GREEK CAPITAL LETTER PSI
+ 0x03A9, //90 #GREEK CAPITAL LETTER OMEGA
+ 0x03AA, //91 #GREEK CAPITAL LETTER IOTA WITH DIALYTIKA
+ 0x03AB, //92 #GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA
+ 0x03AC, //93 #GREEK SMALL LETTER ALPHA WITH TONOS
+ 0x03AD, //94 #GREEK SMALL LETTER EPSILON WITH TONOS
+ 0x03AE, //95 #GREEK SMALL LETTER ETA WITH TONOS
+ 0x03AF, //96 #GREEK SMALL LETTER IOTA WITH TONOS
+ 0x03B0, //97 #GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS
+ 0x03B1, //98 #GREEK SMALL LETTER ALPHA
+ 0x03B2, //99 #GREEK SMALL LETTER BETA
+ 0x03B3, //100 #GREEK SMALL LETTER GAMMA
+ 0x03B4, //101 #GREEK SMALL LETTER DELTA
+ 0x03B5, //102 #GREEK SMALL LETTER EPSILON
+ 0x03B6, //103 #GREEK SMALL LETTER ZETA
+ 0x03B7, //104 #GREEK SMALL LETTER ETA
+ 0x03B8, //105 #GREEK SMALL LETTER THETA
+ 0x03B9, //106 #GREEK SMALL LETTER IOTA
+ 0x03BA, //107 #GREEK SMALL LETTER KAPPA
+ 0x03BB, //108 #GREEK SMALL LETTER LAMDA
+ 0x03BC, //109 #GREEK SMALL LETTER MU
+ 0x03BD, //110 #GREEK SMALL LETTER NU
+ 0x03BE, //111 #GREEK SMALL LETTER XI
+ 0x03BF, //112 #GREEK SMALL LETTER OMICRON
+ 0x03C0, //113 #GREEK SMALL LETTER PI
+ 0x03C1, //114 #GREEK SMALL LETTER RHO
+ 0x03C2, //115 #GREEK SMALL LETTER FINAL SIGMA
+ 0x03C3, //116 #GREEK SMALL LETTER SIGMA
+ 0x03C4, //117 #GREEK SMALL LETTER TAU
+ 0x03C5, //118 #GREEK SMALL LETTER UPSILON
+ 0x03C6, //119 #GREEK SMALL LETTER PHI
+ 0x03C7, //120 #GREEK SMALL LETTER CHI
+ 0x03C8, //121 #GREEK SMALL LETTER PSI
+ 0x03C9, //122 #GREEK SMALL LETTER OMEGA
+ 0x03CA, //123 #GREEK SMALL LETTER IOTA WITH DIALYTIKA
+ 0x03CB, //124 #GREEK SMALL LETTER UPSILON WITH DIALYTIKA
+ 0x03CC, //125 #GREEK SMALL LETTER OMICRON WITH TONOS
+ 0x03CD, //126 #GREEK SMALL LETTER UPSILON WITH TONOS
+ 0x03CE, //127 #GREEK SMALL LETTER OMEGA WITH TONOS
+ 0x00 //128 #UNDEFINED
+};
+
+//Table 1254
+static const int DRW_Table1254[] = {
+ 0x20AC, //1 #EURO SIGN
+ 0x00 , //2 #UNDEFINED
+ 0x201A, //3 #SINGLE LOW-9 QUOTATION MARK
+ 0x0192, //4 #LATIN SMALL LETTER F WITH HOOK
+ 0x201E, //5 #DOUBLE LOW-9 QUOTATION MARK
+ 0x2026, //6 #HORIZONTAL ELLIPSIS
+ 0x2020, //7 #DAGGER
+ 0x2021, //8 #DOUBLE DAGGER
+ 0x02C6, //9 #MODIFIER LETTER CIRCUMFLEX ACCENT
+ 0x2030, //10 #PER MILLE SIGN
+ 0x0160, //11 #LATIN CAPITAL LETTER S WITH CARON
+ 0x2039, //12 #SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+ 0x0152, //13 #LATIN CAPITAL LIGATURE OE
+ 0x00 , //14 #UNDEFINED
+ 0x00 , //15 #UNDEFINED
+ 0x00 , //16 #UNDEFINED
+ 0x00 , //17 #UNDEFINED
+ 0x2018, //18 #LEFT SINGLE QUOTATION MARK
+ 0x2019, //19 #RIGHT SINGLE QUOTATION MARK
+ 0x201C, //20 #LEFT DOUBLE QUOTATION MARK
+ 0x201D, //21 #RIGHT DOUBLE QUOTATION MARK
+ 0x2022, //22 #BULLET
+ 0x2013, //23 #EN DASH
+ 0x2014, //24 #EM DASH
+ 0x02DC, //25 #SMALL TILDE
+ 0x2122, //26 #TRADE MARK SIGN
+ 0x0161, //27 #LATIN SMALL LETTER S WITH CARON
+ 0x203A, //28 #SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+ 0x0153, //29 #LATIN SMALL LIGATURE OE
+ 0x00 , //30 #UNDEFINED
+ 0x00 , //31 #UNDEFINED
+ 0x0178, //32 #LATIN CAPITAL LETTER Y WITH DIAERESIS
+ 0x00A0, //33 #NO-BREAK SPACE
+ 0x00A1, //34 #INVERTED EXCLAMATION MARK
+ 0x00A2, //35 #CENT SIGN
+ 0x00A3, //36 #POUND SIGN
+ 0x00A4, //37 #CURRENCY SIGN
+ 0x00A5, //38 #YEN SIGN
+ 0x00A6, //39 #BROKEN BAR
+ 0x00A7, //40 #SECTION SIGN
+ 0x00A8, //41 #DIAERESIS
+ 0x00A9, //42 #COPYRIGHT SIGN
+ 0x00AA, //43 #FEMININE ORDINAL INDICATOR
+ 0x00AB, //44 #LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+ 0x00AC, //45 #NOT SIGN
+ 0x00AD, //46 #SOFT HYPHEN
+ 0x00AE, //47 #REGISTERED SIGN
+ 0x00AF, //48 #MACRON
+ 0x00B0, //49 #DEGREE SIGN
+ 0x00B1, //50 #PLUS-MINUS SIGN
+ 0x00B2, //51 #SUPERSCRIPT TWO
+ 0x00B3, //52 #SUPERSCRIPT THREE
+ 0x00B4, //53 #ACUTE ACCENT
+ 0x00B5, //54 #MICRO SIGN
+ 0x00B6, //55 #PILCROW SIGN
+ 0x00B7, //56 #MIDDLE DOT
+ 0x00B8, //57 #CEDILLA
+ 0x00B9, //58 #SUPERSCRIPT ONE
+ 0x00BA, //59 #MASCULINE ORDINAL INDICATOR
+ 0x00BB, //60 #RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+ 0x00BC, //61 #VULGAR FRACTION ONE QUARTER
+ 0x00BD, //62 #VULGAR FRACTION ONE HALF
+ 0x00BE, //63 #VULGAR FRACTION THREE QUARTERS
+ 0x00BF, //64 #INVERTED QUESTION MARK
+ 0x00C0, //65 #LATIN CAPITAL LETTER A WITH GRAVE
+ 0x00C1, //66 #LATIN CAPITAL LETTER A WITH ACUTE
+ 0x00C2, //67 #LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+ 0x00C3, //68 #LATIN CAPITAL LETTER A WITH TILDE
+ 0x00C4, //69 #LATIN CAPITAL LETTER A WITH DIAERESIS
+ 0x00C5, //70 #LATIN CAPITAL LETTER A WITH RING ABOVE
+ 0x00C6, //71 #LATIN CAPITAL LETTER AE
+ 0x00C7, //72 #LATIN CAPITAL LETTER C WITH CEDILLA
+ 0x00C8, //73 #LATIN CAPITAL LETTER E WITH GRAVE
+ 0x00C9, //74 #LATIN CAPITAL LETTER E WITH ACUTE
+ 0x00CA, //75 #LATIN CAPITAL LETTER E WITH CIRCUMFLEX
+ 0x00CB, //76 #LATIN CAPITAL LETTER E WITH DIAERESIS
+ 0x00CC, //77 #LATIN CAPITAL LETTER I WITH GRAVE
+ 0x00CD, //78 #LATIN CAPITAL LETTER I WITH ACUTE
+ 0x00CE, //79 #LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+ 0x00CF, //80 #LATIN CAPITAL LETTER I WITH DIAERESIS
+ 0x011E, //81 #LATIN CAPITAL LETTER G WITH BREVE
+ 0x00D1, //82 #LATIN CAPITAL LETTER N WITH TILDE
+ 0x00D2, //83 #LATIN CAPITAL LETTER O WITH GRAVE
+ 0x00D3, //84 #LATIN CAPITAL LETTER O WITH ACUTE
+ 0x00D4, //85 #LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+ 0x00D5, //86 #LATIN CAPITAL LETTER O WITH TILDE
+ 0x00D6, //87 #LATIN CAPITAL LETTER O WITH DIAERESIS
+ 0x00D7, //88 #MULTIPLICATION SIGN
+ 0x00D8, //89 #LATIN CAPITAL LETTER O WITH STROKE
+ 0x00D9, //90 #LATIN CAPITAL LETTER U WITH GRAVE
+ 0x00DA, //91 #LATIN CAPITAL LETTER U WITH ACUTE
+ 0x00DB, //92 #LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+ 0x00DC, //93 #LATIN CAPITAL LETTER U WITH DIAERESIS
+ 0x0130, //94 #LATIN CAPITAL LETTER I WITH DOT ABOVE
+ 0x015E, //95 #LATIN CAPITAL LETTER S WITH CEDILLA
+ 0x00DF, //96 #LATIN SMALL LETTER SHARP S
+ 0x00E0, //97 #LATIN SMALL LETTER A WITH GRAVE
+ 0x00E1, //98 #LATIN SMALL LETTER A WITH ACUTE
+ 0x00E2, //99 #LATIN SMALL LETTER A WITH CIRCUMFLEX
+ 0x00E3, //100 #LATIN SMALL LETTER A WITH TILDE
+ 0x00E4, //101 #LATIN SMALL LETTER A WITH DIAERESIS
+ 0x00E5, //102 #LATIN SMALL LETTER A WITH RING ABOVE
+ 0x00E6, //103 #LATIN SMALL LETTER AE
+ 0x00E7, //104 #LATIN SMALL LETTER C WITH CEDILLA
+ 0x00E8, //105 #LATIN SMALL LETTER E WITH GRAVE
+ 0x00E9, //106 #LATIN SMALL LETTER E WITH ACUTE
+ 0x00EA, //107 #LATIN SMALL LETTER E WITH CIRCUMFLEX
+ 0x00EB, //108 #LATIN SMALL LETTER E WITH DIAERESIS
+ 0x00EC, //109 #LATIN SMALL LETTER I WITH GRAVE
+ 0x00ED, //110 #LATIN SMALL LETTER I WITH ACUTE
+ 0x00EE, //111 #LATIN SMALL LETTER I WITH CIRCUMFLEX
+ 0x00EF, //112 #LATIN SMALL LETTER I WITH DIAERESIS
+ 0x011F, //113 #LATIN SMALL LETTER G WITH BREVE
+ 0x00F1, //114 #LATIN SMALL LETTER N WITH TILDE
+ 0x00F2, //115 #LATIN SMALL LETTER O WITH GRAVE
+ 0x00F3, //116 #LATIN SMALL LETTER O WITH ACUTE
+ 0x00F4, //117 #LATIN SMALL LETTER O WITH CIRCUMFLEX
+ 0x00F5, //118 #LATIN SMALL LETTER O WITH TILDE
+ 0x00F6, //119 #LATIN SMALL LETTER O WITH DIAERESIS
+ 0x00F7, //120 #DIVISION SIGN
+ 0x00F8, //121 #LATIN SMALL LETTER O WITH STROKE
+ 0x00F9, //122 #LATIN SMALL LETTER U WITH GRAVE
+ 0x00FA, //123 #LATIN SMALL LETTER U WITH ACUTE
+ 0x00FB, //124 #LATIN SMALL LETTER U WITH CIRCUMFLEX
+ 0x00FC, //125 #LATIN SMALL LETTER U WITH DIAERESIS
+ 0x0131, //126 #LATIN SMALL LETTER DOTLESS I
+ 0x015F, //127 #LATIN SMALL LETTER S WITH CEDILLA
+ 0x00FF //128 #LATIN SMALL LETTER Y WITH DIAERESIS
+};
+
+//Table 1255
+static const int DRW_Table1255[] = {
+ 0x20AC, //1 #EURO SIGN
+ 0x00 , //2 #UNDEFINED
+ 0x201A, //3 #SINGLE LOW-9 QUOTATION MARK
+ 0x0192, //4 #LATIN SMALL LETTER F WITH HOOK
+ 0x201E, //5 #DOUBLE LOW-9 QUOTATION MARK
+ 0x2026, //6 #HORIZONTAL ELLIPSIS
+ 0x2020, //7 #DAGGER
+ 0x2021, //8 #DOUBLE DAGGER
+ 0x02C6, //9 #MODIFIER LETTER CIRCUMFLEX ACCENT
+ 0x2030, //10 #PER MILLE SIGN
+ 0x00 , //11 #UNDEFINED
+ 0x2039, //12 #SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+ 0x00 , //13 #UNDEFINED
+ 0x00 , //14 #UNDEFINED
+ 0x00 , //15 #UNDEFINED
+ 0x00 , //16 #UNDEFINED
+ 0x00 , //17 #UNDEFINED
+ 0x2018, //18 #LEFT SINGLE QUOTATION MARK
+ 0x2019, //19 #RIGHT SINGLE QUOTATION MARK
+ 0x201C, //20 #LEFT DOUBLE QUOTATION MARK
+ 0x201D, //21 #RIGHT DOUBLE QUOTATION MARK
+ 0x2022, //22 #BULLET
+ 0x2013, //23 #EN DASH
+ 0x2014, //24 #EM DASH
+ 0x02DC, //25 #SMALL TILDE
+ 0x2122, //26 #TRADE MARK SIGN
+ 0x00 , //27 #UNDEFINED
+ 0x203A, //28 #SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+ 0x00 , //29 #UNDEFINED
+ 0x00 , //30 #UNDEFINED
+ 0x00 , //31 #UNDEFINED
+ 0x00 , //32 #UNDEFINED
+ 0x00A0, //33 #NO-BREAK SPACE
+ 0x00A1, //34 #INVERTED EXCLAMATION MARK
+ 0x00A2, //35 #CENT SIGN
+ 0x00A3, //36 #POUND SIGN
+ 0x20AA, //37 #NEW SHEQEL SIGN
+ 0x00A5, //38 #YEN SIGN
+ 0x00A6, //39 #BROKEN BAR
+ 0x00A7, //40 #SECTION SIGN
+ 0x00A8, //41 #DIAERESIS
+ 0x00A9, //42 #COPYRIGHT SIGN
+ 0x00D7, //43 #MULTIPLICATION SIGN
+ 0x00AB, //44 #LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+ 0x00AC, //45 #NOT SIGN
+ 0x00AD, //46 #SOFT HYPHEN
+ 0x00AE, //47 #REGISTERED SIGN
+ 0x00AF, //48 #MACRON
+ 0x00B0, //49 #DEGREE SIGN
+ 0x00B1, //50 #PLUS-MINUS SIGN
+ 0x00B2, //51 #SUPERSCRIPT TWO
+ 0x00B3, //52 #SUPERSCRIPT THREE
+ 0x00B4, //53 #ACUTE ACCENT
+ 0x00B5, //54 #MICRO SIGN
+ 0x00B6, //55 #PILCROW SIGN
+ 0x00B7, //56 #MIDDLE DOT
+ 0x00B8, //57 #CEDILLA
+ 0x00B9, //58 #SUPERSCRIPT ONE
+ 0x00F7, //59 #DIVISION SIGN
+ 0x00BB, //60 #RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+ 0x00BC, //61 #VULGAR FRACTION ONE QUARTER
+ 0x00BD, //62 #VULGAR FRACTION ONE HALF
+ 0x00BE, //63 #VULGAR FRACTION THREE QUARTERS
+ 0x00BF, //64 #INVERTED QUESTION MARK
+ 0x05B0, //65 #HEBREW POINT SHEVA
+ 0x05B1, //66 #HEBREW POINT HATAF SEGOL
+ 0x05B2, //67 #HEBREW POINT HATAF PATAH
+ 0x05B3, //68 #HEBREW POINT HATAF QAMATS
+ 0x05B4, //69 #HEBREW POINT HIRIQ
+ 0x05B5, //70 #HEBREW POINT TSERE
+ 0x05B6, //71 #HEBREW POINT SEGOL
+ 0x05B7, //72 #HEBREW POINT PATAH
+ 0x05B8, //73 #HEBREW POINT QAMATS
+ 0x05B9, //74 #HEBREW POINT HOLAM
+ 0x00 , //75 #UNDEFINED
+ 0x05BB, //76 #HEBREW POINT QUBUTS
+ 0x05BC, //77 #HEBREW POINT DAGESH OR MAPIQ
+ 0x05BD, //78 #HEBREW POINT METEG
+ 0x05BE, //79 #HEBREW PUNCTUATION MAQAF
+ 0x05BF, //80 #HEBREW POINT RAFE
+ 0x05C0, //81 #HEBREW PUNCTUATION PASEQ
+ 0x05C1, //82 #HEBREW POINT SHIN DOT
+ 0x05C2, //83 #HEBREW POINT SIN DOT
+ 0x05C3, //84 #HEBREW PUNCTUATION SOF PASUQ
+ 0x05F0, //85 #HEBREW LIGATURE YIDDISH DOUBLE VAV
+ 0x05F1, //86 #HEBREW LIGATURE YIDDISH VAV YOD
+ 0x05F2, //87 #HEBREW LIGATURE YIDDISH DOUBLE YOD
+ 0x05F3, //88 #HEBREW PUNCTUATION GERESH
+ 0x05F4, //89 #HEBREW PUNCTUATION GERSHAYIM
+ 0x00 , //90 #UNDEFINED
+ 0x00 , //91 #UNDEFINED
+ 0x00 , //92 #UNDEFINED
+ 0x00 , //93 #UNDEFINED
+ 0x00 , //94 #UNDEFINED
+ 0x00 , //95 #UNDEFINED
+ 0x00 , //96 #UNDEFINED
+ 0x05D0, //97 #HEBREW LETTER ALEF
+ 0x05D1, //98 #HEBREW LETTER BET
+ 0x05D2, //99 #HEBREW LETTER GIMEL
+ 0x05D3, //100 #HEBREW LETTER DALET
+ 0x05D4, //101 #HEBREW LETTER HE
+ 0x05D5, //102 #HEBREW LETTER VAV
+ 0x05D6, //103 #HEBREW LETTER ZAYIN
+ 0x05D7, //104 #HEBREW LETTER HET
+ 0x05D8, //105 #HEBREW LETTER TET
+ 0x05D9, //106 #HEBREW LETTER YOD
+ 0x05DA, //107 #HEBREW LETTER FINAL KAF
+ 0x05DB, //108 #HEBREW LETTER KAF
+ 0x05DC, //109 #HEBREW LETTER LAMED
+ 0x05DD, //110 #HEBREW LETTER FINAL MEM
+ 0x05DE, //111 #HEBREW LETTER MEM
+ 0x05DF, //112 #HEBREW LETTER FINAL NUN
+ 0x05E0, //113 #HEBREW LETTER NUN
+ 0x05E1, //114 #HEBREW LETTER SAMEKH
+ 0x05E2, //115 #HEBREW LETTER AYIN
+ 0x05E3, //116 #HEBREW LETTER FINAL PE
+ 0x05E4, //117 #HEBREW LETTER PE
+ 0x05E5, //118 #HEBREW LETTER FINAL TSADI
+ 0x05E6, //119 #HEBREW LETTER TSADI
+ 0x05E7, //120 #HEBREW LETTER QOF
+ 0x05E8, //121 #HEBREW LETTER RESH
+ 0x05E9, //122 #HEBREW LETTER SHIN
+ 0x05EA, //123 #HEBREW LETTER TAV
+ 0x00 , //124 #UNDEFINED
+ 0x00 , //125 #UNDEFINED
+ 0x200E, //126 #LEFT-TO-RIGHT MARK
+ 0x200F, //127 #RIGHT-TO-LEFT MARK
+ 0x00 //128 #UNDEFINED
+};
+
+//Table 1256
+static const int DRW_Table1256[] = {
+ 0x20AC, //1 #EURO SIGN
+ 0x067E, //2 #ARABIC LETTER PEH
+ 0x201A, //3 #SINGLE LOW-9 QUOTATION MARK
+ 0x0192, //4 #LATIN SMALL LETTER F WITH HOOK
+ 0x201E, //5 #DOUBLE LOW-9 QUOTATION MARK
+ 0x2026, //6 #HORIZONTAL ELLIPSIS
+ 0x2020, //7 #DAGGER
+ 0x2021, //8 #DOUBLE DAGGER
+ 0x02C6, //9 #MODIFIER LETTER CIRCUMFLEX ACCENT
+ 0x2030, //10 #PER MILLE SIGN
+ 0x0679, //11 #ARABIC LETTER TTEH
+ 0x2039, //12 #SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+ 0x0152, //13 #LATIN CAPITAL LIGATURE OE
+ 0x0686, //14 #ARABIC LETTER TCHEH
+ 0x0698, //15 #ARABIC LETTER JEH
+ 0x0688, //16 #ARABIC LETTER DDAL
+ 0x06AF, //17 #ARABIC LETTER GAF
+ 0x2018, //18 #LEFT SINGLE QUOTATION MARK
+ 0x2019, //19 #RIGHT SINGLE QUOTATION MARK
+ 0x201C, //20 #LEFT DOUBLE QUOTATION MARK
+ 0x201D, //21 #RIGHT DOUBLE QUOTATION MARK
+ 0x2022, //22 #BULLET
+ 0x2013, //23 #EN DASH
+ 0x2014, //24 #EM DASH
+ 0x06A9, //25 #ARABIC LETTER KEHEH
+ 0x2122, //26 #TRADE MARK SIGN
+ 0x0691, //27 #ARABIC LETTER RREH
+ 0x203A, //28 #SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+ 0x0153, //29 #LATIN SMALL LIGATURE OE
+ 0x200C, //30 #ZERO WIDTH NON-JOINER
+ 0x200D, //31 #ZERO WIDTH JOINER
+ 0x06BA, //32 #ARABIC LETTER NOON GHUNNA
+ 0x00A0, //33 #NO-BREAK SPACE
+ 0x060C, //34 #ARABIC COMMA
+ 0x00A2, //35 #CENT SIGN
+ 0x00A3, //36 #POUND SIGN
+ 0x00A4, //37 #CURRENCY SIGN
+ 0x00A5, //38 #YEN SIGN
+ 0x00A6, //39 #BROKEN BAR
+ 0x00A7, //40 #SECTION SIGN
+ 0x00A8, //41 #DIAERESIS
+ 0x00A9, //42 #COPYRIGHT SIGN
+ 0x06BE, //43 #ARABIC LETTER HEH DOACHASHMEE
+ 0x00AB, //44 #LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+ 0x00AC, //45 #NOT SIGN
+ 0x00AD, //46 #SOFT HYPHEN
+ 0x00AE, //47 #REGISTERED SIGN
+ 0x00AF, //48 #MACRON
+ 0x00B0, //49 #DEGREE SIGN
+ 0x00B1, //50 #PLUS-MINUS SIGN
+ 0x00B2, //51 #SUPERSCRIPT TWO
+ 0x00B3, //52 #SUPERSCRIPT THREE
+ 0x00B4, //53 #ACUTE ACCENT
+ 0x00B5, //54 #MICRO SIGN
+ 0x00B6, //55 #PILCROW SIGN
+ 0x00B7, //56 #MIDDLE DOT
+ 0x00B8, //57 #CEDILLA
+ 0x00B9, //58 #SUPERSCRIPT ONE
+ 0x061B, //59 #ARABIC SEMICOLON
+ 0x00BB, //60 #RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+ 0x00BC, //61 #VULGAR FRACTION ONE QUARTER
+ 0x00BD, //62 #VULGAR FRACTION ONE HALF
+ 0x00BE, //63 #VULGAR FRACTION THREE QUARTERS
+ 0x061F, //64 #ARABIC QUESTION MARK
+ 0x06C1, //65 #ARABIC LETTER HEH GOAL
+ 0x0621, //66 #ARABIC LETTER HAMZA
+ 0x0622, //67 #ARABIC LETTER ALEF WITH MADDA ABOVE
+ 0x0623, //68 #ARABIC LETTER ALEF WITH HAMZA ABOVE
+ 0x0624, //69 #ARABIC LETTER WAW WITH HAMZA ABOVE
+ 0x0625, //70 #ARABIC LETTER ALEF WITH HAMZA BELOW
+ 0x0626, //71 #ARABIC LETTER YEH WITH HAMZA ABOVE
+ 0x0627, //72 #ARABIC LETTER ALEF
+ 0x0628, //73 #ARABIC LETTER BEH
+ 0x0629, //74 #ARABIC LETTER TEH MARBUTA
+ 0x062A, //75 #ARABIC LETTER TEH
+ 0x062B, //76 #ARABIC LETTER THEH
+ 0x062C, //77 #ARABIC LETTER JEEM
+ 0x062D, //78 #ARABIC LETTER HAH
+ 0x062E, //79 #ARABIC LETTER KHAH
+ 0x062F, //80 #ARABIC LETTER DAL
+ 0x0630, //81 #ARABIC LETTER THAL
+ 0x0631, //82 #ARABIC LETTER REH
+ 0x0632, //83 #ARABIC LETTER ZAIN
+ 0x0633, //84 #ARABIC LETTER SEEN
+ 0x0634, //85 #ARABIC LETTER SHEEN
+ 0x0635, //86 #ARABIC LETTER SAD
+ 0x0636, //87 #ARABIC LETTER DAD
+ 0x00D7, //88 #MULTIPLICATION SIGN
+ 0x0637, //89 #ARABIC LETTER TAH
+ 0x0638, //90 #ARABIC LETTER ZAH
+ 0x0639, //91 #ARABIC LETTER AIN
+ 0x063A, //92 #ARABIC LETTER GHAIN
+ 0x0640, //93 #ARABIC TATWEEL
+ 0x0641, //94 #ARABIC LETTER FEH
+ 0x0642, //95 #ARABIC LETTER QAF
+ 0x0643, //96 #ARABIC LETTER KAF
+ 0x00E0, //97 #LATIN SMALL LETTER A WITH GRAVE
+ 0x0644, //98 #ARABIC LETTER LAM
+ 0x00E2, //99 #LATIN SMALL LETTER A WITH CIRCUMFLEX
+ 0x0645, //100 #ARABIC LETTER MEEM
+ 0x0646, //101 #ARABIC LETTER NOON
+ 0x0647, //102 #ARABIC LETTER HEH
+ 0x0648, //103 #ARABIC LETTER WAW
+ 0x00E7, //104 #LATIN SMALL LETTER C WITH CEDILLA
+ 0x00E8, //105 #LATIN SMALL LETTER E WITH GRAVE
+ 0x00E9, //106 #LATIN SMALL LETTER E WITH ACUTE
+ 0x00EA, //107 #LATIN SMALL LETTER E WITH CIRCUMFLEX
+ 0x00EB, //108 #LATIN SMALL LETTER E WITH DIAERESIS
+ 0x0649, //109 #ARABIC LETTER ALEF MAKSURA
+ 0x064A, //110 #ARABIC LETTER YEH
+ 0x00EE, //111 #LATIN SMALL LETTER I WITH CIRCUMFLEX
+ 0x00EF, //112 #LATIN SMALL LETTER I WITH DIAERESIS
+ 0x064B, //113 #ARABIC FATHATAN
+ 0x064C, //114 #ARABIC DAMMATAN
+ 0x064D, //115 #ARABIC KASRATAN
+ 0x064E, //116 #ARABIC FATHA
+ 0x00F4, //117 #LATIN SMALL LETTER O WITH CIRCUMFLEX
+ 0x064F, //118 #ARABIC DAMMA
+ 0x0650, //119 #ARABIC KASRA
+ 0x00F7, //120 #DIVISION SIGN
+ 0x0651, //121 #ARABIC SHADDA
+ 0x00F9, //122 #LATIN SMALL LETTER U WITH GRAVE
+ 0x0652, //123 #ARABIC SUKUN
+ 0x00FB, //124 #LATIN SMALL LETTER U WITH CIRCUMFLEX
+ 0x00FC, //125 #LATIN SMALL LETTER U WITH DIAERESIS
+ 0x200E, //126 #LEFT-TO-RIGHT MARK
+ 0x200F, //127 #RIGHT-TO-LEFT MARK
+ 0x06D2 //128 #ARABIC LETTER YEH BARREE
+};
+
+//Table 1257
+static const int DRW_Table1257[] = {
+ 0x20AC, //1 #EURO SIGN
+ 0x00 , //2 #UNDEFINED
+ 0x201A, //3 #SINGLE LOW-9 QUOTATION MARK
+ 0x00 , //4 #UNDEFINED
+ 0x201E, //5 #DOUBLE LOW-9 QUOTATION MARK
+ 0x2026, //6 #HORIZONTAL ELLIPSIS
+ 0x2020, //7 #DAGGER
+ 0x2021, //8 #DOUBLE DAGGER
+ 0x00 , //9 #UNDEFINED
+ 0x2030, //10 #PER MILLE SIGN
+ 0x00 , //11 #UNDEFINED
+ 0x2039, //12 #SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+ 0x00 , //13 #UNDEFINED
+ 0x00A8, //14 #DIAERESIS
+ 0x02C7, //15 #CARON
+ 0x00B8, //16 #CEDILLA
+ 0x00 , //17 #UNDEFINED
+ 0x2018, //18 #LEFT SINGLE QUOTATION MARK
+ 0x2019, //19 #RIGHT SINGLE QUOTATION MARK
+ 0x201C, //20 #LEFT DOUBLE QUOTATION MARK
+ 0x201D, //21 #RIGHT DOUBLE QUOTATION MARK
+ 0x2022, //22 #BULLET
+ 0x2013, //23 #EN DASH
+ 0x2014, //24 #EM DASH
+ 0x00 , //25 #UNDEFINED
+ 0x2122, //26 #TRADE MARK SIGN
+ 0x00 , //27 #UNDEFINED
+ 0x203A, //28 #SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+ 0x00 , //29 #UNDEFINED
+ 0x00AF, //30 #MACRON
+ 0x02DB, //31 #OGONEK
+ 0x00 , //32 #UNDEFINED
+ 0x00A0, //33 #NO-BREAK SPACE
+ 0x00 , //34 #UNDEFINED
+ 0x00A2, //35 #CENT SIGN
+ 0x00A3, //36 #POUND SIGN
+ 0x00A4, //37 #CURRENCY SIGN
+ 0x00 , //38 #UNDEFINED
+ 0x00A6, //39 #BROKEN BAR
+ 0x00A7, //40 #SECTION SIGN
+ 0x00D8, //41 #LATIN CAPITAL LETTER O WITH STROKE
+ 0x00A9, //42 #COPYRIGHT SIGN
+ 0x0156, //43 #LATIN CAPITAL LETTER R WITH CEDILLA
+ 0x00AB, //44 #LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+ 0x00AC, //45 #NOT SIGN
+ 0x00AD, //46 #SOFT HYPHEN
+ 0x00AE, //47 #REGISTERED SIGN
+ 0x00C6, //48 #LATIN CAPITAL LETTER AE
+ 0x00B0, //49 #DEGREE SIGN
+ 0x00B1, //50 #PLUS-MINUS SIGN
+ 0x00B2, //51 #SUPERSCRIPT TWO
+ 0x00B3, //52 #SUPERSCRIPT THREE
+ 0x00B4, //53 #ACUTE ACCENT
+ 0x00B5, //54 #MICRO SIGN
+ 0x00B6, //55 #PILCROW SIGN
+ 0x00B7, //56 #MIDDLE DOT
+ 0x00F8, //57 #LATIN SMALL LETTER O WITH STROKE
+ 0x00B9, //58 #SUPERSCRIPT ONE
+ 0x0157, //59 #LATIN SMALL LETTER R WITH CEDILLA
+ 0x00BB, //60 #RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+ 0x00BC, //61 #VULGAR FRACTION ONE QUARTER
+ 0x00BD, //62 #VULGAR FRACTION ONE HALF
+ 0x00BE, //63 #VULGAR FRACTION THREE QUARTERS
+ 0x00E6, //64 #LATIN SMALL LETTER AE
+ 0x0104, //65 #LATIN CAPITAL LETTER A WITH OGONEK
+ 0x012E, //66 #LATIN CAPITAL LETTER I WITH OGONEK
+ 0x0100, //67 #LATIN CAPITAL LETTER A WITH MACRON
+ 0x0106, //68 #LATIN CAPITAL LETTER C WITH ACUTE
+ 0x00C4, //69 #LATIN CAPITAL LETTER A WITH DIAERESIS
+ 0x00C5, //70 #LATIN CAPITAL LETTER A WITH RING ABOVE
+ 0x0118, //71 #LATIN CAPITAL LETTER E WITH OGONEK
+ 0x0112, //72 #LATIN CAPITAL LETTER E WITH MACRON
+ 0x010C, //73 #LATIN CAPITAL LETTER C WITH CARON
+ 0x00C9, //74 #LATIN CAPITAL LETTER E WITH ACUTE
+ 0x0179, //75 #LATIN CAPITAL LETTER Z WITH ACUTE
+ 0x0116, //76 #LATIN CAPITAL LETTER E WITH DOT ABOVE
+ 0x0122, //77 #LATIN CAPITAL LETTER G WITH CEDILLA
+ 0x0136, //78 #LATIN CAPITAL LETTER K WITH CEDILLA
+ 0x012A, //79 #LATIN CAPITAL LETTER I WITH MACRON
+ 0x013B, //80 #LATIN CAPITAL LETTER L WITH CEDILLA
+ 0x0160, //81 #LATIN CAPITAL LETTER S WITH CARON
+ 0x0143, //82 #LATIN CAPITAL LETTER N WITH ACUTE
+ 0x0145, //83 #LATIN CAPITAL LETTER N WITH CEDILLA
+ 0x00D3, //84 #LATIN CAPITAL LETTER O WITH ACUTE
+ 0x014C, //85 #LATIN CAPITAL LETTER O WITH MACRON
+ 0x00D5, //86 #LATIN CAPITAL LETTER O WITH TILDE
+ 0x00D6, //87 #LATIN CAPITAL LETTER O WITH DIAERESIS
+ 0x00D7, //88 #MULTIPLICATION SIGN
+ 0x0172, //89 #LATIN CAPITAL LETTER U WITH OGONEK
+ 0x0141, //90 #LATIN CAPITAL LETTER L WITH STROKE
+ 0x015A, //91 #LATIN CAPITAL LETTER S WITH ACUTE
+ 0x016A, //92 #LATIN CAPITAL LETTER U WITH MACRON
+ 0x00DC, //93 #LATIN CAPITAL LETTER U WITH DIAERESIS
+ 0x017B, //94 #LATIN CAPITAL LETTER Z WITH DOT ABOVE
+ 0x017D, //95 #LATIN CAPITAL LETTER Z WITH CARON
+ 0x00DF, //96 #LATIN SMALL LETTER SHARP S
+ 0x0105, //97 #LATIN SMALL LETTER A WITH OGONEK
+ 0x012F, //98 #LATIN SMALL LETTER I WITH OGONEK
+ 0x0101, //99 #LATIN SMALL LETTER A WITH MACRON
+ 0x0107, //100 #LATIN SMALL LETTER C WITH ACUTE
+ 0x00E4, //101 #LATIN SMALL LETTER A WITH DIAERESIS
+ 0x00E5, //102 #LATIN SMALL LETTER A WITH RING ABOVE
+ 0x0119, //103 #LATIN SMALL LETTER E WITH OGONEK
+ 0x0113, //104 #LATIN SMALL LETTER E WITH MACRON
+ 0x010D, //105 #LATIN SMALL LETTER C WITH CARON
+ 0x00E9, //106 #LATIN SMALL LETTER E WITH ACUTE
+ 0x017A, //107 #LATIN SMALL LETTER Z WITH ACUTE
+ 0x0117, //108 #LATIN SMALL LETTER E WITH DOT ABOVE
+ 0x0123, //109 #LATIN SMALL LETTER G WITH CEDILLA
+ 0x0137, //110 #LATIN SMALL LETTER K WITH CEDILLA
+ 0x012B, //111 #LATIN SMALL LETTER I WITH MACRON
+ 0x013C, //112 #LATIN SMALL LETTER L WITH CEDILLA
+ 0x0161, //113 #LATIN SMALL LETTER S WITH CARON
+ 0x0144, //114 #LATIN SMALL LETTER N WITH ACUTE
+ 0x0146, //115 #LATIN SMALL LETTER N WITH CEDILLA
+ 0x00F3, //116 #LATIN SMALL LETTER O WITH ACUTE
+ 0x014D, //117 #LATIN SMALL LETTER O WITH MACRON
+ 0x00F5, //118 #LATIN SMALL LETTER O WITH TILDE
+ 0x00F6, //119 #LATIN SMALL LETTER O WITH DIAERESIS
+ 0x00F7, //120 #DIVISION SIGN
+ 0x0173, //121 #LATIN SMALL LETTER U WITH OGONEK
+ 0x0142, //122 #LATIN SMALL LETTER L WITH STROKE
+ 0x015B, //123 #LATIN SMALL LETTER S WITH ACUTE
+ 0x016B, //124 #LATIN SMALL LETTER U WITH MACRON
+ 0x00FC, //125 #LATIN SMALL LETTER U WITH DIAERESIS
+ 0x017C, //126 #LATIN SMALL LETTER Z WITH DOT ABOVE
+ 0x017E, //127 #LATIN SMALL LETTER Z WITH CARON
+ 0x02D9 //128 #DOT ABOVE
+};
+
+//Table 1258
+static const int DRW_Table1258[] = {
+ 0x20AC, //1 #EURO SIGN
+ 0x00 , //2 #UNDEFINED
+ 0x201A, //3 #SINGLE LOW-9 QUOTATION MARK
+ 0x0192, //4 #LATIN SMALL LETTER F WITH HOOK
+ 0x201E, //5 #DOUBLE LOW-9 QUOTATION MARK
+ 0x2026, //6 #HORIZONTAL ELLIPSIS
+ 0x2020, //7 #DAGGER
+ 0x2021, //8 #DOUBLE DAGGER
+ 0x02C6, //9 #MODIFIER LETTER CIRCUMFLEX ACCENT
+ 0x2030, //10 #PER MILLE SIGN
+ 0x00 , //11 #UNDEFINED
+ 0x2039, //12 #SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+ 0x0152, //13 #LATIN CAPITAL LIGATURE OE
+ 0x00 , //14 #UNDEFINED
+ 0x00 , //15 #UNDEFINED
+ 0x00 , //16 #UNDEFINED
+ 0x00 , //17 #UNDEFINED
+ 0x2018, //18 #LEFT SINGLE QUOTATION MARK
+ 0x2019, //19 #RIGHT SINGLE QUOTATION MARK
+ 0x201C, //20 #LEFT DOUBLE QUOTATION MARK
+ 0x201D, //21 #RIGHT DOUBLE QUOTATION MARK
+ 0x2022, //22 #BULLET
+ 0x2013, //23 #EN DASH
+ 0x2014, //24 #EM DASH
+ 0x02DC, //25 #SMALL TILDE
+ 0x2122, //26 #TRADE MARK SIGN
+ 0x00 , //27 #UNDEFINED
+ 0x203A, //28 #SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+ 0x0153, //29 #LATIN SMALL LIGATURE OE
+ 0x00 , //30 #UNDEFINED
+ 0x00 , //31 #UNDEFINED
+ 0x0178, //32 #LATIN CAPITAL LETTER Y WITH DIAERESIS
+ 0x00A0, //33 #NO-BREAK SPACE
+ 0x00A1, //34 #INVERTED EXCLAMATION MARK
+ 0x00A2, //35 #CENT SIGN
+ 0x00A3, //36 #POUND SIGN
+ 0x00A4, //37 #CURRENCY SIGN
+ 0x00A5, //38 #YEN SIGN
+ 0x00A6, //39 #BROKEN BAR
+ 0x00A7, //40 #SECTION SIGN
+ 0x00A8, //41 #DIAERESIS
+ 0x00A9, //42 #COPYRIGHT SIGN
+ 0x00AA, //43 #FEMININE ORDINAL INDICATOR
+ 0x00AB, //44 #LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+ 0x00AC, //45 #NOT SIGN
+ 0x00AD, //46 #SOFT HYPHEN
+ 0x00AE, //47 #REGISTERED SIGN
+ 0x00AF, //48 #MACRON
+ 0x00B0, //49 #DEGREE SIGN
+ 0x00B1, //50 #PLUS-MINUS SIGN
+ 0x00B2, //51 #SUPERSCRIPT TWO
+ 0x00B3, //52 #SUPERSCRIPT THREE
+ 0x00B4, //53 #ACUTE ACCENT
+ 0x00B5, //54 #MICRO SIGN
+ 0x00B6, //55 #PILCROW SIGN
+ 0x00B7, //56 #MIDDLE DOT
+ 0x00B8, //57 #CEDILLA
+ 0x00B9, //58 #SUPERSCRIPT ONE
+ 0x00BA, //59 #MASCULINE ORDINAL INDICATOR
+ 0x00BB, //60 #RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+ 0x00BC, //61 #VULGAR FRACTION ONE QUARTER
+ 0x00BD, //62 #VULGAR FRACTION ONE HALF
+ 0x00BE, //63 #VULGAR FRACTION THREE QUARTERS
+ 0x00BF, //64 #INVERTED QUESTION MARK
+ 0x00C0, //65 #LATIN CAPITAL LETTER A WITH GRAVE
+ 0x00C1, //66 #LATIN CAPITAL LETTER A WITH ACUTE
+ 0x00C2, //67 #LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+ 0x0102, //68 #LATIN CAPITAL LETTER A WITH BREVE
+ 0x00C4, //69 #LATIN CAPITAL LETTER A WITH DIAERESIS
+ 0x00C5, //70 #LATIN CAPITAL LETTER A WITH RING ABOVE
+ 0x00C6, //71 #LATIN CAPITAL LETTER AE
+ 0x00C7, //72 #LATIN CAPITAL LETTER C WITH CEDILLA
+ 0x00C8, //73 #LATIN CAPITAL LETTER E WITH GRAVE
+ 0x00C9, //74 #LATIN CAPITAL LETTER E WITH ACUTE
+ 0x00CA, //75 #LATIN CAPITAL LETTER E WITH CIRCUMFLEX
+ 0x00CB, //76 #LATIN CAPITAL LETTER E WITH DIAERESIS
+ 0x0300, //77 #COMBINING GRAVE ACCENT
+ 0x00CD, //78 #LATIN CAPITAL LETTER I WITH ACUTE
+ 0x00CE, //79 #LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+ 0x00CF, //80 #LATIN CAPITAL LETTER I WITH DIAERESIS
+ 0x0110, //81 #LATIN CAPITAL LETTER D WITH STROKE
+ 0x00D1, //82 #LATIN CAPITAL LETTER N WITH TILDE
+ 0x0309, //83 #COMBINING HOOK ABOVE
+ 0x00D3, //84 #LATIN CAPITAL LETTER O WITH ACUTE
+ 0x00D4, //85 #LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+ 0x01A0, //86 #LATIN CAPITAL LETTER O WITH HORN
+ 0x00D6, //87 #LATIN CAPITAL LETTER O WITH DIAERESIS
+ 0x00D7, //88 #MULTIPLICATION SIGN
+ 0x00D8, //89 #LATIN CAPITAL LETTER O WITH STROKE
+ 0x00D9, //90 #LATIN CAPITAL LETTER U WITH GRAVE
+ 0x00DA, //91 #LATIN CAPITAL LETTER U WITH ACUTE
+ 0x00DB, //92 #LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+ 0x00DC, //93 #LATIN CAPITAL LETTER U WITH DIAERESIS
+ 0x01AF, //94 #LATIN CAPITAL LETTER U WITH HORN
+ 0x0303, //95 #COMBINING TILDE
+ 0x00DF, //96 #LATIN SMALL LETTER SHARP S
+ 0x00E0, //97 #LATIN SMALL LETTER A WITH GRAVE
+ 0x00E1, //98 #LATIN SMALL LETTER A WITH ACUTE
+ 0x00E2, //99 #LATIN SMALL LETTER A WITH CIRCUMFLEX
+ 0x0103, //100 #LATIN SMALL LETTER A WITH BREVE
+ 0x00E4, //101 #LATIN SMALL LETTER A WITH DIAERESIS
+ 0x00E5, //102 #LATIN SMALL LETTER A WITH RING ABOVE
+ 0x00E6, //103 #LATIN SMALL LETTER AE
+ 0x00E7, //104 #LATIN SMALL LETTER C WITH CEDILLA
+ 0x00E8, //105 #LATIN SMALL LETTER E WITH GRAVE
+ 0x00E9, //106 #LATIN SMALL LETTER E WITH ACUTE
+ 0x00EA, //107 #LATIN SMALL LETTER E WITH CIRCUMFLEX
+ 0x00EB, //108 #LATIN SMALL LETTER E WITH DIAERESIS
+ 0x0301, //109 #COMBINING ACUTE ACCENT
+ 0x00ED, //110 #LATIN SMALL LETTER I WITH ACUTE
+ 0x00EE, //111 #LATIN SMALL LETTER I WITH CIRCUMFLEX
+ 0x00EF, //112 #LATIN SMALL LETTER I WITH DIAERESIS
+ 0x0111, //113 #LATIN SMALL LETTER D WITH STROKE
+ 0x00F1, //114 #LATIN SMALL LETTER N WITH TILDE
+ 0x0323, //115 #COMBINING DOT BELOW
+ 0x00F3, //116 #LATIN SMALL LETTER O WITH ACUTE
+ 0x00F4, //117 #LATIN SMALL LETTER O WITH CIRCUMFLEX
+ 0x01A1, //118 #LATIN SMALL LETTER O WITH HORN
+ 0x00F6, //119 #LATIN SMALL LETTER O WITH DIAERESIS
+ 0x00F7, //120 #DIVISION SIGN
+ 0x00F8, //121 #LATIN SMALL LETTER O WITH STROKE
+ 0x00F9, //122 #LATIN SMALL LETTER U WITH GRAVE
+ 0x00FA, //123 #LATIN SMALL LETTER U WITH ACUTE
+ 0x00FB, //124 #LATIN SMALL LETTER U WITH CIRCUMFLEX
+ 0x00FC, //125 #LATIN SMALL LETTER U WITH DIAERESIS
+ 0x01B0, //126 #LATIN SMALL LETTER U WITH HORN
+ 0x20AB, //127 #DONG SIGN
+ 0x00FF //128 #LATIN SMALL LETTER Y WITH DIAERESIS
+};
+
+#endif // DRW_CPTABLES_H
--- /dev/null
+/******************************************************************************
+** libDXFrw - Library to read/write DXF files (ascii & binary) **
+** **
+** Copyright (C) 2011-2015 José F. Soriano, rallazz@gmail.com **
+** **
+** This library is free software, licensed under the terms of the GNU **
+** General Public License as published by the Free Software Foundation, **
+** either version 2 of the License, or (at your option) any later version. **
+** You should have received a copy of the GNU General Public License **
+** along with this program. If not, see <http://www.gnu.org/licenses/>. **
+******************************************************************************/
+
+#include <iostream>
+#include <iomanip>
+#include "drw_dbg.h"
+
+DRW_dbg *DRW_dbg::instance= NULL;
+
+/*********private clases*************/
+class print_none {
+public:
+ virtual void printS(std::string s){(void)s;}
+ virtual void printI(long long int i){(void)i;}
+ virtual void printUI(long long unsigned int i){(void)i;}
+ virtual void printD(double d){(void)d;}
+ virtual void printH(long long int i){(void)i;}
+ virtual void printB(int i){(void)i;}
+ virtual void printHL(int c, int s, int h){(void)c;(void)s;(void)h;}
+ virtual void printPT(double x, double y, double z){(void)x;(void)y;(void)z;}
+ print_none(){}
+ virtual ~print_none(){}
+};
+
+class print_debug : public print_none {
+public:
+ virtual void printS(std::string s);
+ virtual void printI(long long int i);
+ virtual void printUI(long long unsigned int i);
+ virtual void printD(double d);
+ virtual void printH(long long int i);
+ virtual void printB(int i);
+ virtual void printHL(int c, int s, int h);
+ virtual void printPT(double x, double y, double z);
+ print_debug();
+ virtual ~print_debug(){}
+private:
+ std::ios_base::fmtflags flags;
+};
+
+/********* debug class *************/
+DRW_dbg *DRW_dbg::getInstance(){
+ if (instance == NULL){
+ instance = new DRW_dbg;
+ }
+ return instance;
+}
+
+DRW_dbg::DRW_dbg(){
+ level = NONE;
+ prClass = new print_none;
+ flags = std::cerr.flags();
+}
+
+void DRW_dbg::setLevel(LEVEL lvl){
+ level = lvl;
+ delete prClass;
+ switch (level){
+ case DEBUG:
+ prClass = new print_debug;
+ break;
+ default:
+ prClass = new print_none;
+ }
+}
+
+DRW_dbg::LEVEL DRW_dbg::getLevel(){
+ return level;
+}
+
+void DRW_dbg::print(std::string s){
+ prClass->printS(s);
+}
+
+void DRW_dbg::print(int i){
+ prClass->printI(i);
+}
+
+void DRW_dbg::print(unsigned int i){
+ prClass->printUI(i);
+}
+
+void DRW_dbg::print(long long int i){
+ prClass->printI(i);
+}
+
+void DRW_dbg::print(long unsigned int i){
+ prClass->printUI(i);
+}
+
+void DRW_dbg::print(long long unsigned int i){
+ prClass->printUI(i);
+}
+
+void DRW_dbg::print(double d){
+ prClass->printD(d);
+}
+
+void DRW_dbg::printH(long long int i){
+ prClass->printH(i);
+}
+
+void DRW_dbg::printB(int i){
+ prClass->printB(i);
+}
+void DRW_dbg::printHL(int c, int s, int h){
+ prClass->printHL(c, s, h);
+}
+
+void DRW_dbg::printPT(double x, double y, double z){
+ prClass->printPT(x, y, z);
+}
+
+print_debug::print_debug(){
+ flags = std::cerr.flags();
+}
+
+void print_debug::printS(std::string s){
+ std::cerr << s;
+}
+
+void print_debug::printI(long long int i){
+ std::cerr << i;
+}
+
+void print_debug::printUI(long long unsigned int i){
+ std::cerr << i;
+}
+
+void print_debug::printD(double d){
+ std::cerr << std::fixed << d;
+}
+
+void print_debug::printH(long long i){
+ std::cerr << "0x" << std::setw(2) << std::setfill('0');
+ std::cerr << std::hex << i;
+ std::cerr.flags(flags);
+}
+
+void print_debug::printB(int i){
+ std::cerr << std::setw(8) << std::setfill('0');
+ std::cerr << std::setbase(2) << i;
+ std::cerr.flags(flags);
+}
+
+void print_debug::printHL(int c, int s, int h){
+ std::cerr << c << '.' << s << '.';
+ std::cerr << "0x" << std::setw(2) << std::setfill('0');
+ std::cerr << std::hex << h;
+ std::cerr.flags(flags);
+}
+
+void print_debug::printPT(double x, double y, double z){
+ std::cerr << std::fixed << "x: " << x << ", y: " << y << ", z: "<< z;
+}
--- /dev/null
+/******************************************************************************
+** libDXFrw - Library to read/write DXF files (ascii & binary) **
+** **
+** Copyright (C) 2011-2015 José F. Soriano, rallazz@gmail.com **
+** **
+** This library is free software, licensed under the terms of the GNU **
+** General Public License as published by the Free Software Foundation, **
+** either version 2 of the License, or (at your option) any later version. **
+** You should have received a copy of the GNU General Public License **
+** along with this program. If not, see <http://www.gnu.org/licenses/>. **
+******************************************************************************/
+
+#ifndef DRW_DBG_H
+#define DRW_DBG_H
+
+#include <string>
+#include <iostream>
+//#include <iomanip>
+
+#define DRW_DBGSL(a) DRW_dbg::getInstance()->setLevel(a)
+#define DRW_DBGGL DRW_dbg::getInstance()->getLevel()
+#define DRW_DBG(a) DRW_dbg::getInstance()->print(a)
+#define DRW_DBGH(a) DRW_dbg::getInstance()->printH(a)
+#define DRW_DBGB(a) DRW_dbg::getInstance()->printB(a)
+#define DRW_DBGHL(a, b, c) DRW_dbg::getInstance()->printHL(a, b ,c)
+#define DRW_DBGPT(a, b, c) DRW_dbg::getInstance()->printPT(a, b, c)
+
+
+class print_none;
+
+class DRW_dbg {
+public:
+ enum LEVEL {
+ NONE,
+ DEBUG
+ };
+ void setLevel(LEVEL lvl);
+ LEVEL getLevel();
+ static DRW_dbg *getInstance();
+ void print(std::string s);
+ void print(int i);
+ void print(unsigned int i);
+ void print(long long int i);
+ void print(long unsigned int i);
+ void print(long long unsigned int i);
+ void print(double d);
+ void printH(long long int i);
+ void printB(int i);
+ void printHL(int c, int s, int h);
+ void printPT(double x, double y, double z);
+
+private:
+ DRW_dbg();
+ static DRW_dbg *instance;
+ LEVEL level;
+ std::ios_base::fmtflags flags;
+ print_none* prClass;
+};
+
+
+#endif // DRW_DBG_H
--- /dev/null
+#include "drw_textcodec.h"
+#include <sstream>
+#include <iomanip>
+#include <algorithm>
+#include "../drw_base.h"
+#include "drw_cptables.h"
+#include "drw_cptable932.h"
+#include "drw_cptable936.h"
+#include "drw_cptable949.h"
+#include "drw_cptable950.h"
+
+DRW_TextCodec::DRW_TextCodec() {
+ version = DRW::AC1021;
+ conv = new DRW_Converter(NULL, 0);
+}
+
+DRW_TextCodec::~DRW_TextCodec() {
+ delete conv;
+}
+
+void DRW_TextCodec::setVersion(int v, bool dxfFormat){
+ if (v == DRW::AC1009 || v == DRW::AC1006) {
+ version = DRW::AC1009;
+ cp = "ANSI_1252";
+ setCodePage(&cp, dxfFormat);
+ } else if (v == DRW::AC1012 || v == DRW::AC1014
+ || v == DRW::AC1015 || v == DRW::AC1018) {
+ version = DRW::AC1015;
+// if (cp.empty()) { //codepage not set, initialize
+ cp = "ANSI_1252";
+ setCodePage(&cp, dxfFormat);
+// }
+ } else {
+ version = DRW::AC1021;
+ if (dxfFormat)
+ cp = "UTF-8";//RLZ: can be UCS2 or UTF-16 16bits per char
+ else
+ cp = "UTF-16";//RLZ: can be UCS2 or UTF-16 16bits per char
+ setCodePage(&cp, dxfFormat);
+ }
+}
+
+void DRW_TextCodec::setVersion(std::string *v, bool dxfFormat){
+ std::string versionStr = *v;
+ if (versionStr == "AC1009" || versionStr == "AC1006") {
+ setVersion(DRW::AC1009, dxfFormat);
+ } else if (versionStr == "AC1012" || versionStr == "AC1014"
+ || versionStr == "AC1015" || versionStr == "AC1018") {
+ setVersion(DRW::AC1015, dxfFormat);
+ }
+ setVersion(DRW::AC1021, dxfFormat);
+}
+
+void DRW_TextCodec::setCodePage(std::string *c, bool dxfFormat){
+ cp = correctCodePage(*c);
+ delete conv;
+ if (version == DRW::AC1009 || version == DRW::AC1015) {
+ if (cp == "ANSI_874")
+ conv = new DRW_ConvTable(DRW_Table874, CPLENGHTCOMMON);
+ else if (cp == "ANSI_932")
+ conv = new DRW_Conv932Table(DRW_Table932, DRW_LeadTable932,
+ DRW_DoubleTable932, CPLENGHT932);
+ else if (cp == "ANSI_936")
+ conv = new DRW_ConvDBCSTable(DRW_Table936, DRW_LeadTable936,
+ DRW_DoubleTable936, CPLENGHT936);
+ else if (cp == "ANSI_949")
+ conv = new DRW_ConvDBCSTable(DRW_Table949, DRW_LeadTable949,
+ DRW_DoubleTable949, CPLENGHT949);
+ else if (cp == "ANSI_950")
+ conv = new DRW_ConvDBCSTable(DRW_Table950, DRW_LeadTable950,
+ DRW_DoubleTable950, CPLENGHT950);
+ else if (cp == "ANSI_1250")
+ conv = new DRW_ConvTable(DRW_Table1250, CPLENGHTCOMMON);
+ else if (cp == "ANSI_1251")
+ conv = new DRW_ConvTable(DRW_Table1251, CPLENGHTCOMMON);
+ else if (cp == "ANSI_1253")
+ conv = new DRW_ConvTable(DRW_Table1253, CPLENGHTCOMMON);
+ else if (cp == "ANSI_1254")
+ conv = new DRW_ConvTable(DRW_Table1254, CPLENGHTCOMMON);
+ else if (cp == "ANSI_1255")
+ conv = new DRW_ConvTable(DRW_Table1255, CPLENGHTCOMMON);
+ else if (cp == "ANSI_1256")
+ conv = new DRW_ConvTable(DRW_Table1256, CPLENGHTCOMMON);
+ else if (cp == "ANSI_1257")
+ conv = new DRW_ConvTable(DRW_Table1257, CPLENGHTCOMMON);
+ else if (cp == "ANSI_1258")
+ conv = new DRW_ConvTable(DRW_Table1258, CPLENGHTCOMMON);
+ else if (cp == "UTF-8") { //DXF older than 2007 are write in win codepages
+ cp = "ANSI_1252";
+ conv = new DRW_Converter(NULL, 0);
+ } else
+ conv = new DRW_ConvTable(DRW_Table1252, CPLENGHTCOMMON);
+ } else {
+ if (dxfFormat)
+ conv = new DRW_Converter(NULL, 0);//utf16 to utf8
+ else
+ conv = new DRW_ConvUTF16();//utf16 to utf8
+ }
+}
+
+std::string DRW_TextCodec::toUtf8(std::string s) {
+ return conv->toUtf8(&s);
+}
+
+std::string DRW_TextCodec::fromUtf8(std::string s) {
+ return conv->fromUtf8(&s);
+}
+
+std::string DRW_Converter::toUtf8(std::string *s) {
+ std::string result;
+ int j = 0;
+ unsigned int i= 0;
+ for (i=0; i < s->length(); i++) {
+ unsigned char c = s->at(i);
+ if (c < 0x80) { //ascii check for /U+????
+ if (c == '\\' && i+6 < s->length() && s->at(i+1) == 'U' && s->at(i+2) == '+') {
+ result += s->substr(j,i-j);
+ result += encodeText(s->substr(i,7));
+ i +=6;
+ j = i+1;
+ }
+ } else if (c < 0xE0 ) {//2 bits
+ i++;
+ } else if (c < 0xF0 ) {//3 bits
+ i +=2;
+ } else if (c < 0xF8 ) {//4 bits
+ i +=3;
+ }
+ }
+ result += s->substr(j);
+
+ return result;
+}
+
+std::string DRW_ConvTable::fromUtf8(std::string *s) {
+ std::string result;
+ bool notFound;
+ int code;
+
+ int j = 0;
+ for (unsigned int i=0; i < s->length(); i++) {
+ unsigned char c = s->at(i);
+ if (c > 0x7F) { //need to decode
+ result += s->substr(j,i-j);
+ std::string part1 = s->substr(i,4);
+ int l;
+ code = decodeNum(part1, &l);
+ j = i+l;
+ i = j - 1;
+ notFound = true;
+ for (int k=0; k<cpLenght; k++){
+ if(table[k] == code) {
+ result += CPOFFSET + k; //translate from table
+ notFound = false;
+ break;
+ }
+ }
+ if (notFound)
+ result += decodeText(code);
+ }
+ }
+ result += s->substr(j);
+
+ return result;
+}
+
+std::string DRW_ConvTable::toUtf8(std::string *s) {
+ std::string res;
+ std::string::iterator it;
+ for ( it=s->begin() ; it < s->end(); ++it ) {
+ unsigned char c = *it;
+ if (c < 0x80) {
+ //check for \U+ encoded text
+ if (c == '\\') {
+ if (it+6 < s->end() && *(it+1) == 'U' && *(it+2) == '+') {
+ res += encodeText(std::string(it, it+7));
+ it +=6;
+ } else {
+ res +=c; //no \U+ encoded text write
+ }
+ } else
+ res +=c; //c!='\' ascii char write
+ } else {//end c < 0x80
+ res += encodeNum(table[c-0x80]); //translate from table
+ }
+ } //end for
+
+ return res;
+}
+
+std::string DRW_Converter::encodeText(std::string stmp){
+ int code;
+#if defined(__APPLE__)
+ int Succeeded = sscanf (&( stmp.substr(3,4)[0]), "%x", &code );
+ if ( !Succeeded || Succeeded == EOF )
+ code = 0;
+#else
+ std::istringstream sd(stmp.substr(3,4));
+ sd >> std::hex >> code;
+#endif
+ return encodeNum(code);
+}
+
+std::string DRW_Converter::decodeText(int c){
+ std::string res = "\\U+";
+ std::string num;
+#if defined(__APPLE__)
+ std::string str(16, '\0');
+ snprintf (&(str[0]), 16, "%04X", c );
+ num = str;
+#else
+ std::stringstream ss;
+ ss << std::uppercase << std::setfill('0') << std::setw(4) << std::hex << c;
+ ss >> num;
+#endif
+ res += num;
+ return res;
+}
+
+std::string DRW_Converter::encodeNum(int c){
+ unsigned char ret[5];
+ if (c < 128) { // 0-7F US-ASCII 7 bits
+ ret[0] = c;
+ ret[1] = 0;
+ } else if (c < 0x800) { //80-07FF 2 bytes
+ ret[0] = 0xC0 | (c >> 6);
+ ret[1] = 0x80 | (c & 0x3f);
+ ret[2] = 0;
+ } else if (c< 0x10000) { //800-FFFF 3 bytes
+ ret[0] = 0xe0 | (c >> 12);
+ ret[1] = 0x80 | ((c >> 6) & 0x3f);
+ ret[2] = 0x80 | (c & 0x3f);
+ ret[3] = 0;
+ } else { //10000-10FFFF 4 bytes
+ ret[0] = 0xf0 | (c >> 18);
+ ret[1] = 0x80 | ((c >> 12) & 0x3f);
+ ret[2] = 0x80 | ((c >> 6) & 0x3f);
+ ret[3] = 0x80 | (c & 0x3f);
+ ret[4] = 0;
+ }
+ return std::string((char*)ret);
+}
+
+/** 's' is a string with at least 4 bytes lenght
+** returned 'b' is byte lenght of encoded char: 2,3 or 4
+**/
+int DRW_Converter::decodeNum(std::string s, int *b){
+ int code= 0;
+ unsigned char c = s.at(0);
+ if ( (c& 0xE0) == 0xC0) { //2 bytes
+ code = ( c&0x1F)<<6;
+ code = (s.at(1) &0x3F) | code;
+ *b = 2;
+ } else if ( (c& 0xF0) == 0xE0) { //3 bytes
+ code = ( c&0x0F)<<12;
+ code = ((s.at(1) &0x3F)<<6) | code;
+ code = (s.at(2) &0x3F) | code;
+ *b = 3;
+ } else if ( (c& 0xF8) == 0xF0) { //4 bytes
+ code = ( c&0x07)<<18;
+ code = ((s.at(1) &0x3F)<<12) | code;
+ code = ((s.at(2) &0x3F)<<6) | code;
+ code = (s.at(3) &0x3F) | code;
+ *b = 4;
+ }
+
+ return code;
+}
+
+
+std::string DRW_ConvDBCSTable::fromUtf8(std::string *s) {
+ std::string result;
+ bool notFound;
+ int code;
+
+ int j = 0;
+ for (unsigned int i=0; i < s->length(); i++) {
+ unsigned char c = s->at(i);
+ if (c > 0x7F) { //need to decode
+ result += s->substr(j,i-j);
+ std::string part1 = s->substr(i,4);
+ int l;
+ code = decodeNum(part1, &l);
+ j = i+l;
+ i = j - 1;
+ notFound = true;
+ for (int k=0; k<cpLenght; k++){
+ if(doubleTable[k][1] == code) {
+ int data = doubleTable[k][0];
+ char d[3];
+ d[0] = data >> 8;
+ d[1] = data & 0xFF;
+ d[2]= '\0';
+ result += d; //translate from table
+ notFound = false;
+ break;
+ }
+ }
+ if (notFound)
+ result += decodeText(code);
+ } //direct conversion
+ }
+ result += s->substr(j);
+
+ return result;
+}
+
+std::string DRW_ConvDBCSTable::toUtf8(std::string *s) {
+ std::string res;
+ std::string::iterator it;
+ for ( it=s->begin() ; it < s->end(); ++it ) {
+ bool notFound = true;
+ unsigned char c = *it;
+ if (c < 0x80) {
+ notFound = false;
+ //check for \U+ encoded text
+ if (c == '\\') {
+ if (it+6 < s->end() && *(it+1) == 'U' && *(it+2) == '+') {
+ res += encodeText(std::string(it, it+7));
+ it +=6;
+ } else {
+ res +=c; //no \U+ encoded text write
+ }
+ } else
+ res +=c; //c!='\' ascii char write
+ } else if(c == 0x80 ){//1 byte table
+ notFound = false;
+ res += encodeNum(0x20AC);//euro sign
+ } else {//2 bytes
+ ++it;
+ int code = (c << 8) | (unsigned char )(*it);
+ int sta = leadTable[c-0x81];
+ int end = leadTable[c-0x80];
+ for (int k=sta; k<end; k++){
+ if(doubleTable[k][0] == code) {
+ res += encodeNum(doubleTable[k][1]); //translate from table
+ notFound = false;
+ break;
+ }
+ }
+ }
+ //not found
+ if (notFound) res += encodeNum(NOTFOUND936);
+ } //end for
+
+ return res;
+}
+
+std::string DRW_Conv932Table::fromUtf8(std::string *s) {
+ std::string result;
+ bool notFound;
+ int code;
+
+ int j = 0;
+ for (unsigned int i=0; i < s->length(); i++) {
+ unsigned char c = s->at(i);
+ if (c > 0x7F) { //need to decode
+ result += s->substr(j,i-j);
+ std::string part1 = s->substr(i,4);
+ int l;
+ code = decodeNum(part1, &l);
+ j = i+l;
+ i = j - 1;
+ notFound = true;
+ // 1 byte table
+ if (code > 0xff60 && code < 0xFFA0) {
+ result += code - CPOFFSET932; //translate from table
+ notFound = false;
+ }
+ if (notFound && ( code<0xF8 || (code>0x390 && code<0x542) ||
+ (code>0x200F && code<0x9FA1) || code>0xF928 )) {
+ for (int k=0; k<cpLenght; k++){
+ if(doubleTable[k][1] == code) {
+ int data = doubleTable[k][0];
+ char d[3];
+ d[0] = data >> 8;
+ d[1] = data & 0xFF;
+ d[2]= '\0';
+ result += d; //translate from table
+ notFound = false;
+ break;
+ }
+ }
+ }
+ if (notFound)
+ result += decodeText(code);
+ } //direct conversion
+ }
+ result += s->substr(j);
+
+ return result;
+}
+
+std::string DRW_Conv932Table::toUtf8(std::string *s) {
+ std::string res;
+ std::string::iterator it;
+ for ( it=s->begin() ; it < s->end(); ++it ) {
+ bool notFound = true;
+ unsigned char c = *it;
+ if (c < 0x80) {
+ notFound = false;
+ //check for \U+ encoded text
+ if (c == '\\') {
+ if (it+6 < s->end() && *(it+1) == 'U' && *(it+2) == '+') {
+ res += encodeText(std::string(it, it+7));
+ it +=6;
+ } else {
+ res +=c; //no \U+ encoded text write
+ }
+ } else
+ res +=c; //c!='\' ascii char write
+ } else if(c > 0xA0 && c < 0xE0 ){//1 byte table
+ notFound = false;
+ res += encodeNum(c + CPOFFSET932); //translate from table
+ } else {//2 bytes
+ ++it;
+ int code = (c << 8) | (unsigned char )(*it);
+ int sta;
+ int end=0;
+ if (c > 0x80 && c < 0xA0) {
+ sta = DRW_LeadTable932[c-0x81];
+ end = DRW_LeadTable932[c-0x80];
+ } else if (c > 0xDF && c < 0xFD){
+ sta = DRW_LeadTable932[c-0xC1];
+ end = DRW_LeadTable932[c-0xC0];
+ }
+ if (end > 0) {
+ for (int k=sta; k<end; k++){
+ if(DRW_DoubleTable932[k][0] == code) {
+ res += encodeNum(DRW_DoubleTable932[k][1]); //translate from table
+ notFound = false;
+ break;
+ }
+ }
+ }
+ }
+ //not found
+ if (notFound) res += encodeNum(NOTFOUND932);
+ } //end for
+
+ return res;
+}
+
+std::string DRW_ConvUTF16::fromUtf8(std::string *s){
+ DRW_UNUSED(s);
+ //RLZ: to be writen (only needed for write dwg 2007+)
+ return std::string();
+}
+
+std::string DRW_ConvUTF16::toUtf8(std::string *s){//RLZ: pending to write
+ std::string res;
+ std::string::iterator it;
+ for ( it=s->begin() ; it < s->end(); ++it ) {
+ unsigned char c1 = *it;
+ unsigned char c2 = *(++it);
+ duint16 ch = (c2 <<8) | c1;
+ res +=encodeNum(ch);
+ } //end for
+
+ return res;
+}
+
+std::string DRW_TextCodec::correctCodePage(const std::string& s) {
+ //stringstream cause crash in OS/X, bug#3597944
+ std::string cp=s;
+ transform(cp.begin(), cp.end(), cp.begin(), toupper);
+ //Latin/Thai
+ if (cp=="ANSI_874" || cp=="CP874" || cp=="ISO8859-11" || cp=="TIS-620") {
+ return "ANSI_874";
+ //Central Europe and Eastern Europe
+ } else if (cp=="ANSI_1250" || cp=="CP1250" || cp=="ISO8859-2") {
+ return "ANSI_1250";
+ //Cyrillic script
+ } else if (cp=="ANSI_1251" || cp=="CP1251" || cp=="ISO8859-5" || cp=="KOI8-R" ||
+ cp=="KOI8-U" || cp=="IBM 866") {
+ return "ANSI_1251";
+ //Western Europe
+ } else if (cp=="ANSI_1252" || cp=="CP1252" || cp=="LATIN1" || cp=="ISO-8859-1" ||
+ cp=="CP819" || cp=="CSISO" || cp=="IBM819" || cp=="ISO_8859-1" || cp=="APPLE ROMAN" ||
+ cp=="ISO8859-1" || cp=="ISO8859-15" || cp=="ISO-IR-100" || cp=="L1" || cp=="IBM 850") {
+ return "ANSI_1252";
+ //Greek
+ } else if (cp=="ANSI_1253" || cp=="CP1253" || cp=="iso8859-7") {
+ return "ANSI_1253";
+ //Turkish
+ } else if (cp=="ANSI_1254" || cp=="CP1254" || cp=="iso8859-9" || cp=="iso8859-3") {
+ return "ANSI_1254";
+ //Hebrew
+ } else if (cp=="ANSI_1255" || cp=="CP1255" || cp=="iso8859-8") {
+ return "ANSI_1255";
+ //Arabic
+ } else if (cp=="ANSI_1256" || cp=="CP1256" || cp=="ISO8859-6") {
+ return "ANSI_1256";
+ //Baltic
+ } else if (cp=="ANSI_1257" || cp=="CP1257" || cp=="ISO8859-4" || cp=="ISO8859-10" || cp=="ISO8859-13") {
+ return "ANSI_1257";
+ //Vietnamese
+ } else if (cp=="ANSI_1258" || cp=="CP1258") {
+ return "ANSI_1258";
+
+ //Japanese
+ } else if (cp=="ANSI_932" || cp=="SHIFT-JIS" || cp=="SHIFT_JIS" || cp=="CSSHIFTJIS" ||
+ cp=="CSWINDOWS31J" || cp=="MS_KANJI" || cp=="X-MS-CP932" || cp=="X-SJIS" ||
+ cp=="EUCJP" || cp=="EUC-JP" || cp=="CSEUCPKDFMTJAPANESE" || cp=="X-EUC" ||
+ cp=="X-EUC-JP" || cp=="JIS7") {
+ return "ANSI_932";
+ //Chinese PRC GBK (XGB) simplified
+ } else if (cp=="ANSI_936" || cp=="GBK" || cp=="GB2312" || cp=="CHINESE" || cp=="CN-GB" ||
+ cp=="CSGB2312" || cp=="CSGB231280" || cp=="CSISO58BG231280" ||
+ cp=="GB_2312-80" || cp=="GB231280" || cp=="GB2312-80" ||
+ cp=="ISO-IR-58" || cp=="GB18030") {
+ return "ANSI_936";
+ //Korean
+ } else if (cp=="ANSI_949" || cp=="EUCKR") {
+ return "ANSI_949";
+ //Chinese Big5 (Taiwan, Hong Kong SAR)
+ } else if (cp=="ANSI_950" || cp=="BIG5" || cp=="CN-BIG5" || cp=="CSBIG5" ||
+ cp=="X-X-BIG5" || cp=="BIG5-HKSCS") {
+ return "ANSI_950";
+
+//celtic
+/* } else if (cp=="ISO8859-14") {
+ return "ISO8859-14";
+ } else if (cp=="TSCII") {
+ return "TSCII"; //tamil
+ }*/
+
+ } else if (cp=="UTF-8" || cp=="UTF8" || cp=="UTF8-BIT") {
+ return "UTF-8";
+ } else if (cp=="UTF-16" || cp=="UTF16" || cp=="UTF16-BIT") {
+ return "UTF-16";
+ }
+
+ return "ANSI_1252";
+}
--- /dev/null
+#ifndef DRW_TEXTCODEC_H
+#define DRW_TEXTCODEC_H
+
+#include <string>
+
+class DRW_Converter;
+
+class DRW_TextCodec
+{
+public:
+ DRW_TextCodec();
+ ~DRW_TextCodec();
+ std::string fromUtf8(std::string s);
+ std::string toUtf8(std::string s);
+ int getVersion(){return version;}
+ void setVersion(std::string *v, bool dxfFormat);
+ void setVersion(int v, bool dxfFormat);
+ void setCodePage(std::string *c, bool dxfFormat);
+ void setCodePage(std::string c, bool dxfFormat){setCodePage(&c, dxfFormat);}
+ std::string getCodePage(){return cp;}
+
+private:
+ std::string correctCodePage(const std::string& s);
+
+private:
+ int version;
+ std::string cp;
+ DRW_Converter *conv;
+};
+
+class DRW_Converter
+{
+public:
+ DRW_Converter(const int *t, int l){table = t;
+ cpLenght = l;}
+ virtual ~DRW_Converter(){}
+ virtual std::string fromUtf8(std::string *s) {return *s;}
+ virtual std::string toUtf8(std::string *s);
+ std::string encodeText(std::string stmp);
+ std::string decodeText(int c);
+ std::string encodeNum(int c);
+ int decodeNum(std::string s, int *b);
+ const int *table;
+ int cpLenght;
+};
+
+class DRW_ConvUTF16 : public DRW_Converter {
+public:
+ DRW_ConvUTF16():DRW_Converter(NULL, 0) {}
+ virtual std::string fromUtf8(std::string *s);
+ virtual std::string toUtf8(std::string *s);
+};
+
+class DRW_ConvTable : public DRW_Converter {
+public:
+ DRW_ConvTable(const int *t, int l):DRW_Converter(t, l) {}
+ virtual std::string fromUtf8(std::string *s);
+ virtual std::string toUtf8(std::string *s);
+};
+
+class DRW_ConvDBCSTable : public DRW_Converter {
+public:
+ DRW_ConvDBCSTable(const int *t, const int *lt, const int dt[][2], int l):DRW_Converter(t, l) {
+ leadTable = lt;
+ doubleTable = dt;
+ }
+
+ virtual std::string fromUtf8(std::string *s);
+ virtual std::string toUtf8(std::string *s);
+private:
+ const int *leadTable;
+ const int (*doubleTable)[2];
+
+};
+
+class DRW_Conv932Table : public DRW_Converter {
+public:
+ DRW_Conv932Table(const int *t, const int *lt, const int dt[][2], int l):DRW_Converter(t, l) {
+ leadTable = lt;
+ doubleTable = dt;
+ }
+
+ virtual std::string fromUtf8(std::string *s);
+ virtual std::string toUtf8(std::string *s);
+private:
+ const int *leadTable;
+ const int (*doubleTable)[2];
+
+};
+
+#endif // DRW_TEXTCODEC_H
--- /dev/null
+/******************************************************************************
+** libDXFrw - Library to read/write DXF files (ascii & binary) **
+** **
+** Copyright (C) 2011-2015 José F. Soriano, rallazz@gmail.com **
+** **
+** This library is free software, licensed under the terms of the GNU **
+** General Public License as published by the Free Software Foundation, **
+** either version 2 of the License, or (at your option) any later version. **
+** You should have received a copy of the GNU General Public License **
+** along with this program. If not, see <http://www.gnu.org/licenses/>. **
+******************************************************************************/
+
+
+#include "dwgbuffer.h"
+#include "../libdwgr.h"
+#include "drw_textcodec.h"
+#include "drw_dbg.h"
+//#include <bitset>
+/*#include <fstream>
+#include <algorithm>
+#include <sstream>
+#include "dwgreader.h"*/
+//#include "dxfwriter.h"
+
+
+//#define FIRSTHANDLE 48
+
+/*enum sections {
+ secUnknown,
+ secHeader,
+ secTables,
+ secBlocks,
+ secEntities,
+ secObjects
+};*/
+
+static unsigned int crctable[256]= {
+0x0000,0xC0C1,0xC181,0x0140,0xC301,0x03C0,0x0280,0xC241,
+0xC601,0x06C0,0x0780,0xC741,0x0500,0xC5C1,0xC481,0x0440,
+0xCC01,0x0CC0,0x0D80,0xCD41,0x0F00,0xCFC1,0xCE81,0x0E40,
+0x0A00,0xCAC1,0xCB81,0x0B40,0xC901,0x09C0,0x0880,0xC841,
+0xD801,0x18C0,0x1980,0xD941,0x1B00,0xDBC1,0xDA81,0x1A40,
+0x1E00,0xDEC1,0xDF81,0x1F40,0xDD01,0x1DC0,0x1C80,0xDC41,
+0x1400,0xD4C1,0xD581,0x1540,0xD701,0x17C0,0x1680,0xD641,
+0xD201,0x12C0,0x1380,0xD341,0x1100,0xD1C1,0xD081,0x1040,
+0xF001,0x30C0,0x3180,0xF141,0x3300,0xF3C1,0xF281,0x3240,
+0x3600,0xF6C1,0xF781,0x3740,0xF501,0x35C0,0x3480,0xF441,
+0x3C00,0xFCC1,0xFD81,0x3D40,0xFF01,0x3FC0,0x3E80,0xFE41,
+0xFA01,0x3AC0,0x3B80,0xFB41,0x3900,0xF9C1,0xF881,0x3840,
+0x2800,0xE8C1,0xE981,0x2940,0xEB01,0x2BC0,0x2A80,0xEA41,
+0xEE01,0x2EC0,0x2F80,0xEF41,0x2D00,0xEDC1,0xEC81,0x2C40,
+0xE401,0x24C0,0x2580,0xE541,0x2700,0xE7C1,0xE681,0x2640,
+0x2200,0xE2C1,0xE381,0x2340,0xE101,0x21C0,0x2080,0xE041,
+0xA001,0x60C0,0x6180,0xA141,0x6300,0xA3C1,0xA281,0x6240,
+0x6600,0xA6C1,0xA781,0x6740,0xA501,0x65C0,0x6480,0xA441,
+0x6C00,0xACC1,0xAD81,0x6D40,0xAF01,0x6FC0,0x6E80,0xAE41,
+0xAA01,0x6AC0,0x6B80,0xAB41,0x6900,0xA9C1,0xA881,0x6840,
+0x7800,0xB8C1,0xB981,0x7940,0xBB01,0x7BC0,0x7A80,0xBA41,
+0xBE01,0x7EC0,0x7F80,0xBF41,0x7D00,0xBDC1,0xBC81,0x7C40,
+0xB401,0x74C0,0x7580,0xB541,0x7700,0xB7C1,0xB681,0x7640,
+0x7200,0xB2C1,0xB381,0x7340,0xB101,0x71C0,0x7080,0xB041,
+0x5000,0x90C1,0x9181,0x5140,0x9301,0x53C0,0x5280,0x9241,
+0x9601,0x56C0,0x5780,0x9741,0x5500,0x95C1,0x9481,0x5440,
+0x9C01,0x5CC0,0x5D80,0x9D41,0x5F00,0x9FC1,0x9E81,0x5E40,
+0x5A00,0x9AC1,0x9B81,0x5B40,0x9901,0x59C0,0x5880,0x9841,
+0x8801,0x48C0,0x4980,0x8941,0x4B00,0x8BC1,0x8A81,0x4A40,
+0x4E00,0x8EC1,0x8F81,0x4F40,0x8D01,0x4DC0,0x4C80,0x8C41,
+0x4400,0x84C1,0x8581,0x4540,0x8701,0x47C0,0x4680,0x8641,
+0x8201,0x42C0,0x4380,0x8341,0x4100,0x81C1,0x8081,0x4040 };
+
+static unsigned int crc32Table[256] ={
+0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3,
+0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91,
+0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
+0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5,
+0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,
+0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
+0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f,
+0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d,
+0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
+0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01,
+0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457,
+0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
+0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb,
+0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9,
+0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
+0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad,
+0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683,
+0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
+0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7,
+0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5,
+0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
+0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79,
+0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f,
+0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
+0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713,
+0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21,
+0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
+0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45,
+0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db,
+0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
+0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf,
+0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d};
+
+union typeCast {
+ char buf[8];
+ duint16 i16;
+ duint32 i32;
+ duint64 i64;
+ ddouble64 d64;
+};
+
+bool dwgFileStream::setPos(duint64 p){
+ if (p >= sz)
+ return false;
+
+ stream->seekg(p);
+ return stream->good();
+}
+
+bool dwgFileStream::read(duint8* s, duint64 n){
+ stream->read (reinterpret_cast<char*>(s),n);
+ return stream->good();
+}
+
+bool dwgCharStream::setPos(duint64 p){
+ if (p > size()) {
+ isOk = false;
+ return false;
+ }
+
+ pos = p;
+ return true;
+}
+
+bool dwgCharStream::read(duint8* s, duint64 n){
+ if ( n > (sz - pos) ) {
+ isOk = false;
+ return false;
+ }
+ for (duint64 i=0; i<n; i++){
+ s[i]= stream[pos++];
+ }
+ return true;
+}
+
+dwgBuffer::dwgBuffer(duint8 *buf, int size, DRW_TextCodec *dc){
+ filestr = new dwgCharStream(buf, size);
+ decoder = dc;
+ maxSize = size;
+ bitPos = 0;
+}
+
+dwgBuffer::dwgBuffer(std::istream *stream, DRW_TextCodec *dc){
+ filestr = new dwgFileStream(stream);
+ decoder = dc;
+ maxSize = filestr->size();
+ bitPos = 0;
+}
+
+dwgBuffer::dwgBuffer( const dwgBuffer& org ){
+ filestr = org.filestr->clone();
+ decoder = org.decoder;
+ maxSize = filestr->size();
+ currByte = org.currByte;
+ bitPos = org.bitPos;
+}
+
+dwgBuffer& dwgBuffer::operator=( const dwgBuffer& org ){
+ filestr = org.filestr->clone();
+ decoder = org.decoder;
+ maxSize = filestr->size();
+ currByte = org.currByte;
+ bitPos = org.bitPos;
+ return *this;
+}
+
+dwgBuffer::~dwgBuffer(){
+ delete filestr;
+}
+
+/**Gets the current byte position in buffer **/
+duint64 dwgBuffer::getPosition(){
+ if (bitPos != 0)
+ return filestr->getPos() -1;
+ return filestr->getPos();
+ }
+
+/**Sets the buffer position in pos byte, reset the bit position **/
+bool dwgBuffer::setPosition(duint64 pos){
+ bitPos = 0;
+/* if (pos>=maxSize)
+ return false;*/
+ return filestr->setPos(pos);
+// return true;
+}
+
+//RLZ: Fails if ... ???
+void dwgBuffer::setBitPos(duint8 pos){
+ if (pos>7)
+ return;
+ if (pos != 0 && bitPos == 0){
+ duint8 buffer;
+ filestr->read (&buffer,1);
+ currByte = buffer;
+ }
+ if (pos == 0 && bitPos != 0){//reset current byte
+ filestr->setPos(filestr->getPos()-1);
+ }
+ bitPos = pos;
+}
+
+bool dwgBuffer::moveBitPos(dint32 size){
+ if (size == 0) return true;
+
+ dint32 b= size + bitPos;
+ filestr->setPos(getPosition() + (b >> 3) );
+ bitPos = b & 7;
+
+ if (bitPos != 0){
+ filestr->read (&currByte,1);
+ }
+ return filestr->good();
+}
+
+/**Reads one Bit returns a char with value 0/1 (B) **/
+duint8 dwgBuffer::getBit(){
+ duint8 buffer;
+ duint8 ret = 0;
+ if (bitPos == 0){
+ filestr->read (&buffer,1);
+ currByte = buffer;
+ }
+
+ ret = (currByte >> (7 - bitPos) & 1);
+ bitPos +=1;
+ if (bitPos == 8)
+ bitPos = 0;
+
+ return ret;
+}
+
+/**Reads one Bit returns a bool value 0==false 1==true (B) **/
+bool dwgBuffer::getBoolBit(){
+ return (getBit() != 0);
+}
+
+/**Reads two Bits returns a char (BB) **/
+duint8 dwgBuffer::get2Bits(){
+ duint8 buffer;
+ duint8 ret = 0;
+ if (bitPos == 0){
+ filestr->read (&buffer,1);
+ currByte = buffer;
+ }
+
+ bitPos +=2;
+ if (bitPos < 9)
+ ret = currByte >>(8 - bitPos);
+ else {//read one bit per byte
+ ret = currByte << 1;
+ filestr->read (&buffer,1);
+ currByte = buffer;
+ bitPos = 1;
+ ret = ret | currByte >> 7;
+ }
+ if (bitPos == 8)
+ bitPos = 0;
+ ret = ret & 3;
+ return ret;
+}
+
+/**Reads thee Bits returns a char (3B) **/
+//RLZ: todo verify this
+duint8 dwgBuffer::get3Bits(){
+ duint8 buffer;
+ duint8 ret = 0;
+ if (bitPos == 0){
+ filestr->read (&buffer,1);
+ currByte = buffer;
+ }
+
+ bitPos +=3;
+ if (bitPos < 9)
+ ret = currByte >>(8 - bitPos);
+ else {//read one bit per byte
+ ret = currByte << 1;
+ filestr->read (&buffer,1);
+ currByte = buffer;
+ bitPos = 1;
+ ret = ret | currByte >> 7;
+ }
+ if (bitPos == 8)
+ bitPos = 0;
+ ret = ret & 7;
+ return ret;
+}
+
+/**Reads tree Bits returns a char (3B) for R24 **/
+//to be written
+
+/**Reads compresed Short (max. 16 + 2 bits) little-endian order, returns a UNsigned 16 bits (BS) **/
+duint16 dwgBuffer::getBitShort(){
+ duint8 b = get2Bits();
+ if (b == 0)
+ return getRawShort16();
+ else if (b== 1)
+ return getRawChar8();
+ else if (b == 2)
+ return 0;
+ else
+ return 256;
+}
+/**Reads compresed Short (max. 16 + 2 bits) little-endian order, returns a signed 16 bits (BS) **/
+dint16 dwgBuffer::getSBitShort(){
+ duint8 b = get2Bits();
+ if (b == 0)
+ return (dint16)getRawShort16();
+ else if (b== 1)
+ return (dint16)getRawChar8();
+ else if (b == 2)
+ return 0;
+ else
+ return 256;
+}
+
+/**Reads compresed 32 bits Int (max. 32 + 2 bits) little-endian order, returns a signed 32 bits (BL) **/
+//to be written
+dint32 dwgBuffer::getBitLong(){
+ dint8 b = get2Bits();
+ if (b == 0)
+ return getRawLong32();
+ else if (b== 1)
+ return getRawChar8();
+ else //if (b == 2)
+ return 0;
+}
+
+/**Reads compresed 64 bits Int (max. 56 + 3 bits) little-endian order, returns a unsigned 64 bits (BLL) **/
+duint64 dwgBuffer::getBitLongLong(){
+ dint8 b = get3Bits();
+ duint64 ret=0;
+ for (duint8 i=0; i<b; i++){
+ ret = ret << 8;
+ ret |= getRawChar8();
+ }
+ return ret;
+}
+
+/**Reads compresed Double (max. 64 + 2 bits) returns a floating point double of 64 bits (BD) **/
+double dwgBuffer::getBitDouble(){
+ dint8 b = get2Bits();
+ if (b == 1)
+ return 1.0;
+ else if (b == 0){
+ duint8 buffer[8];
+ if (bitPos != 0) {
+ for (int i = 0; i < 8; i++)
+ buffer[i] = getRawChar8();
+ } else {
+ filestr->read (buffer,8);
+ }
+ double* ret = reinterpret_cast<double*>( buffer );
+ return *ret;
+ }
+ // if (b == 2)
+ return 0.0;
+}
+
+/**Reads 3 compresed Double (max. 64 + 2 bits) returns a DRW_Coord of floating point double of 64 bits (3BD) **/
+DRW_Coord dwgBuffer::get3BitDouble(){
+ DRW_Coord crd;
+ crd.x = getBitDouble();
+ crd.y = getBitDouble();
+ crd.z = getBitDouble();
+ return crd;
+}
+
+/**Reads raw char 8 bits returns a unsigned char (RC) **/
+duint8 dwgBuffer::getRawChar8(){
+ duint8 ret;
+ duint8 buffer;
+ filestr->read (&buffer,1);
+ if (bitPos == 0)
+ return buffer;
+ else {
+ ret = currByte << bitPos;
+ currByte = buffer;
+ ret = ret | (currByte >>(8 - bitPos));
+ }
+ return ret;
+}
+
+/**Reads raw short 16 bits little-endian order, returns a unsigned short (RS) **/
+duint16 dwgBuffer::getRawShort16(){
+ duint8 buffer[2];
+ duint16 ret;
+
+ filestr->read (buffer,2);
+ if (bitPos == 0) {
+ /* no offset directly swap bytes for little-endian */
+ ret = (buffer[1] << 8) | (buffer[0] & 0x00FF);
+ } else {
+ ret = (buffer[0] << 8) | (buffer[1] & 0x00FF);
+ /* apply offset */
+ ret = ret >> (8 - bitPos);
+ ret = ret | (currByte << (8 + bitPos));
+ currByte = buffer[1];
+ /* swap bytes for little-endian */
+ ret = (ret << 8) | (ret >> 8);
+ }
+ return ret;
+}
+
+/**Reads raw double IEEE standard 64 bits returns a double (RD) **/
+double dwgBuffer::getRawDouble(){
+ duint8 buffer[8];
+ if (bitPos == 0)
+ filestr->read (buffer,8);
+ else {
+ for (int i = 0; i < 8; i++)
+ buffer[i] = getRawChar8();
+ }
+ double* nOffset = reinterpret_cast<double*>( buffer );
+ return *nOffset;
+}
+
+/**Reads 2 raw double IEEE standard 64 bits returns a DRW_Coord of floating point double 64 bits (2RD) **/
+DRW_Coord dwgBuffer::get2RawDouble(){
+ DRW_Coord crd;
+ crd.x = getRawDouble();
+ crd.y = getRawDouble();
+ return crd;
+}
+
+
+/**Reads raw int 32 bits little-endian order, returns a unsigned int (RL) **/
+duint32 dwgBuffer::getRawLong32(){
+ duint16 tmp1 = getRawShort16();
+ duint16 tmp2 = getRawShort16();
+ duint32 ret = (tmp2 << 16) | (tmp1 & 0x0000FFFF);
+
+ return ret;
+}
+
+/**Reads raw int 64 bits little-endian order, returns a unsigned long long (RLL) **/
+duint64 dwgBuffer::getRawLong64(){
+ duint32 tmp1 = getRawLong32();
+ duint64 tmp2 = getRawLong32();
+ duint64 ret = (tmp2 << 32) | (tmp1 & 0x00000000FFFFFFFF);
+
+ return ret;
+}
+
+/**Reads modular unsigner int, char based, compresed form, little-endian order, returns a unsigned int (U-MC) **/
+duint32 dwgBuffer::getUModularChar(){
+ std::vector<duint8> buffer;
+ duint32 result =0;
+ for (int i=0; i<4;i++){
+ duint8 b= getRawChar8();
+ buffer.push_back(b & 0x7F);
+ if (! (b & 0x80))
+ break;
+ }
+ int offset = 0;
+ for (unsigned int i=0; i<buffer.size();i++){
+ result += buffer[i] << offset;
+ offset +=7;
+ }
+//RLZ: WARNING!!! needed to verify on read handles
+ //result = result & 0x7F;
+ return result;
+}
+
+/**Reads modular int, char based, compresed form, little-endian order, returns a signed int (MC) **/
+dint32 dwgBuffer::getModularChar(){
+ bool negative = false;
+ std::vector<dint8> buffer;
+ dint32 result =0;
+ for (int i=0; i<4;i++){
+ duint8 b= getRawChar8();
+ buffer.push_back(b & 0x7F);
+ if (! (b & 0x80))
+ break;
+ }
+ dint8 b= buffer.back();
+ if (b & 0x40) {
+ negative = true;
+ buffer.pop_back();
+ buffer.push_back(b & 0x3F);
+ }
+
+ int offset = 0;
+ for (unsigned int i=0; i<buffer.size();i++){
+ result += buffer[i] << offset;
+ offset +=7;
+ }
+ if (negative)
+ result = -result;
+ return result;
+}
+
+/**Reads modular int, short based, compresed form, little-endian order, returns a unsigned int (MC) **/
+dint32 dwgBuffer::getModularShort(){
+// bool negative = false;
+ std::vector<dint16> buffer;
+ dint32 result =0;
+ for (int i=0; i<2;i++){
+ duint16 b= getRawShort16();
+ buffer.push_back(b & 0x7FFF);
+ if (! (b & 0x8000))
+ break;
+ }
+
+ //only positive ?
+/* dint8 b= buffer.back();
+ if (! (b & 0x40)) {
+ negative = true;
+ buffer.pop_back();
+ buffer.push_back(b & 0x3F);
+ }*/
+
+ int offset = 0;
+ for (unsigned int i=0; i<buffer.size();i++){
+ result += buffer[i] << offset;
+ offset +=15;
+ }
+/* if (negative)
+ result = -result;*/
+ return result;
+}
+
+dwgHandle dwgBuffer::getHandle(){ //H
+ dwgHandle hl;
+ duint8 data = getRawChar8();
+ hl.code = (data >> 4) & 0x0F;
+ hl.size = data & 0x0F;
+ hl.ref=0;
+ for (int i=0; i< hl.size;i++){
+ hl.ref = (hl.ref << 8) | getRawChar8();
+ }
+ return hl;
+}
+
+dwgHandle dwgBuffer::getOffsetHandle(duint32 href){ //H
+ dwgHandle hl = getHandle();
+
+ if (hl.code > 5){
+ if (hl.code == 0x0C)
+ hl.ref = href - hl.ref;
+ else if (hl.code == 0x0A)
+ hl.ref = href + hl.ref;
+ else if (hl.code == 0x08)
+ hl.ref = href - 1;
+ else if (hl.code == 0x06)
+ hl.ref = href + 1;
+//all are soft pointer reference change to 7 (without offset)
+ hl.code = 7;
+ }
+ return hl;
+}
+
+//internal until 2004
+std::string dwgBuffer::get8bitStr(){
+ duint16 textSize = getBitShort();
+ if (textSize == 0)
+ return std::string();
+ duint8 *tmpBuffer = new duint8[textSize];
+ bool good = getBytes(tmpBuffer, textSize);
+ if (!good)
+ return std::string();
+
+/* filestr->read (buffer,textSize);
+ if (!filestr->good())
+ return std::string();
+
+ duint8 tmp;
+ if (bitPos != 0){
+ for (int i=0; i<textSize;i++){
+ tmp = buffer[i];
+ buffer[i] = (currByte << bitPos) | (tmp >> (8 - bitPos));
+ currByte = tmp;
+ }
+ }*/
+ std::string str(reinterpret_cast<char*>(tmpBuffer), textSize);
+ delete[]tmpBuffer;
+
+ return str;
+}
+
+//internal since 2007 //pending: are 2 bytes null terminated??
+//nullTerm = true if string are 2 bytes null terminated from the stream
+std::string dwgBuffer::get16bitStr(duint16 textSize, bool nullTerm){
+ if (textSize == 0)
+ return std::string();
+ textSize *=2;
+ duint16 ts = textSize;
+ if (nullTerm)
+ ts += 2;
+ duint8 *tmpBuffer = new duint8[textSize + 2];
+ bool good = getBytes(tmpBuffer, ts);
+ if (!good)
+ return std::string();
+ if (!nullTerm) {
+ tmpBuffer[textSize] = '\0';
+ tmpBuffer[textSize + 1] = '\0';
+ }
+ std::string str(reinterpret_cast<char*>(tmpBuffer), ts);
+ delete[]tmpBuffer;
+
+ return str;
+}
+
+//T 8 bit text converted from codepage to utf8
+std::string dwgBuffer::getCP8Text(){
+ std::string strData;
+ strData = get8bitStr();//RLZ correct these function
+ if (decoder == NULL)
+ return strData;
+
+ return decoder->toUtf8(strData);
+}
+
+//TU unicode 16 bit (UCS) text converted to utf8
+/**Reads 2-bytes char (UCS2, NULL terminated) and convert to std::string (only for Latin-1)
+ ts= total input size in bytes.
+**/
+std::string dwgBuffer::getUCSStr(duint16 ts){
+ std::string strData;
+ if (ts<4) //at least 1 char
+ return std::string();
+ strData = get16bitStr(ts/2, false);
+ if (decoder == NULL)
+ return strData;
+
+ return decoder->toUtf8(strData);
+}
+
+//TU unicode 16 bit (UCS) text converted to utf8
+//nullTerm = true if string are 2 bytes null terminated from the stream
+std::string dwgBuffer::getUCSText(bool nullTerm){
+ std::string strData;
+ duint16 ts = getBitShort();
+ if (ts == 0)
+ return std::string();
+
+ strData = get16bitStr(ts, nullTerm);
+ if (decoder == NULL)
+ return strData;
+
+ return decoder->toUtf8(strData);
+}
+
+//RLZ: read a T or TU if version is 2007+
+//nullTerm = true if string are 2 bytes null terminated from the stream
+std::string dwgBuffer::getVariableText(DRW::Version v, bool nullTerm){//TV
+ if (v > DRW::AC1018)
+ return getUCSText(nullTerm);
+ return getCP8Text();
+}
+duint16 dwgBuffer::getObjType(DRW::Version v){//OT
+ if (v > DRW::AC1021) {
+ duint8 b = get2Bits();
+ if (b == 0)
+ return getRawChar8();
+ else if (b== 1){
+ return (getRawChar8() + 0x01F0);
+ } else //b == 2
+ return getRawShort16();
+ }
+ return getBitShort();
+}
+
+/* Bit Extrusion
+* For R2000+, this is a single bit, If the single bit is 1,
+* the extrusion value is assumed to be 0,0,1 and no explicit
+* extrusion is stored. If the single bit is 0, then it will
+* be followed by 3BD.
+* For R13-R14 this is 3BD.
+*/
+DRW_Coord dwgBuffer::getExtrusion(bool b_R2000_style) {
+ DRW_Coord ext(0.0,0.0,1.0);
+ if ( b_R2000_style )
+ /* If the bit is one, the extrusion value is assumed to be 0,0,1*/
+ if ( getBit() == 1 )
+ return ext;
+ /*R13-R14 or bit == 0*/
+ ext.x = getBitDouble();
+ ext.y = getBitDouble();
+ ext.z = getBitDouble();
+ return ext;
+}
+
+/**Reads compresed Double with default (max. 64 + 2 bits) returns a floating point double of 64 bits (DD) **/
+double dwgBuffer::getDefaultDouble(double d){
+ dint8 b = get2Bits();
+ if (b == 0)
+ return d;
+ else if (b == 1){
+ duint8 buffer[4];
+ char *tmp;
+ if (bitPos != 0) {
+ for (int i = 0; i < 4; i++)
+ buffer[i] = getRawChar8();
+ } else {
+ filestr->read (buffer,4);
+ }
+ tmp = reinterpret_cast<char*>(&d);
+ for (int i = 0; i < 4; i++)
+ tmp[i] = buffer[i];
+ double ret = *reinterpret_cast<double*>( tmp );
+ return ret;
+ } else if (b == 2){
+ duint8 buffer[6];
+ char *tmp;
+ if (bitPos != 0) {
+ for (int i = 0; i < 6; i++)
+ buffer[i] = getRawChar8();
+ } else {
+ filestr->read (buffer,6);
+ }
+ tmp = reinterpret_cast<char*>(&d);
+ for (int i = 2; i < 6; i++)
+ tmp[i-2] = buffer[i];
+ tmp[4] = buffer[0];
+ tmp[5] = buffer[1];
+ double ret = *reinterpret_cast<double*>( tmp );
+ return ret;
+ }
+ // if (b == 3) return a full raw double
+ return getRawDouble();
+}
+
+
+/* BitThickness
+* For R13-R14, this is a BD.
+* For R2000+, this is a single bit, If the bit is one,
+* the thickness value is assumed to be 0.0, if not a BD follow
+*/
+double dwgBuffer::getThickness(bool b_R2000_style) {
+ if ( b_R2000_style )
+ /* If the bit is one, the thickness value is assumed to be 0.0.*/
+ if ( getBit() == 1 )
+ return 0.0;
+ /*R13-R14 or bit == 0*/
+ return getBitDouble();
+}
+
+/* CmColor (CMC)
+* For R15 and earlier call directly BS as ACIS color.
+* For R2004+, can be CMC or ENC
+* RGB value, first 4bits 0xC0 => ByLayer, 0xC1 => ByBlock, 0xC2 => RGB, 0xC3 => last 4 are ACIS
+*/
+duint32 dwgBuffer::getCmColor(DRW::Version v) {
+ if (v < DRW::AC1018) //2000-
+ return getSBitShort();
+ duint16 idx = getBitShort();
+ duint32 rgb = getBitLong();
+ duint8 cb = getRawChar8();
+ duint8 type = rgb >> 24;
+ DRW_DBG("\ntype COLOR: "); DRW_DBGH(type);
+ DRW_DBG("\nindex COLOR: "); DRW_DBGH(idx);
+ DRW_DBG("\nRGB COLOR: "); DRW_DBGH(rgb);
+ DRW_DBG("\nbyte COLOR: "); DRW_DBGH(cb);
+ if (cb&1){
+ std::string colorName = getVariableText(v, false);
+ DRW_DBG("\ncolorName: "); DRW_DBG(colorName);
+ }
+ if (cb&2){
+ std::string bookName = getVariableText(v, false);
+ DRW_DBG("\nbookName: "); DRW_DBG(bookName);
+ }
+ switch (type) {
+ case 0xC0:
+ return 256;//ByLayer
+ break;
+ case 0xC1:
+ return 0;//ByBlock
+ break;
+ case 0xC2:
+ return 256;//RGB RLZ TODO
+ break;
+ case 0xC3:
+ return rgb&0xFF;//ACIS
+ break;
+ default:
+ break;
+ }
+ //check cb if strings follows RLZ TODO
+ return 256; //default return ByLayer
+}
+
+/* EnColor (ENC)
+* For R15 and earlier call directly BS as ACIS color.
+* For R2004+, can be CMC or ENC
+* RGB value, first 4bits 0xC0 => ByLayer, 0xC1 => ByBlock, 0xC2 => RGB, 0xC3 => last 4 are ACIS
+*/
+duint32 dwgBuffer::getEnColor(DRW::Version v) {
+ if (v < DRW::AC1018) //2000-
+ return getSBitShort();
+ duint32 rgb = 0;
+ duint32 cb = 0;
+ duint16 idx = getBitShort();
+ DRW_DBG("idx reads COLOR: "); DRW_DBGH(idx);
+ duint16 flags = idx>>8;
+ idx = idx & 0x1FF; //RLZ: warning this is correct?
+ DRW_DBG("\nflag COLOR: "); DRW_DBGH(flags);
+ DRW_DBG(", index COLOR: "); DRW_DBGH(idx);
+// if (flags & 0x80) {
+// rgb = getBitLong();
+// DRW_DBG("\nRGB COLOR: "); DRW_DBGH(rgb);
+// }
+ if (flags & 0x20) {
+ cb = getBitLong();
+ DRW_DBG("\nTransparency COLOR: "); DRW_DBGH(cb);
+ }
+ if (flags & 0x40)
+ DRW_DBG("\nacdbColor COLOR are present");
+ else {
+ if (flags & 0x80) {
+ rgb = getBitLong();
+ DRW_DBG("\nRGB COLOR: "); DRW_DBGH(rgb);
+ }
+ }
+
+/* if (flags & 0x80)
+ return getBitLong();*/
+
+ return idx; //default return ByLayer
+}
+
+
+/**Reads raw short 16 bits big-endian order, returns a unsigned short crc & size **/
+duint16 dwgBuffer::getBERawShort16(){
+ char buffer[2];
+ buffer[0] = getRawChar8();
+ buffer[1] = getRawChar8();
+ duint16 size = (buffer[0] << 8) | (buffer[1] & 0xFF);
+ return size;
+}
+
+/* reads "size" bytes and stores in "buf" return false if fail */
+bool dwgBuffer::getBytes(unsigned char *buf, int size){
+ duint8 tmp;
+ filestr->read (buf,size);
+ if (!filestr->good())
+ return false;
+
+ if (bitPos != 0){
+ for (int i=0; i<size;i++){
+ tmp = buf[i];
+ buf[i] = (currByte << bitPos) | (tmp >> (8 - bitPos));
+ currByte = tmp;
+ }
+ }
+ return true;
+}
+
+duint16 dwgBuffer::crc8(duint16 dx,dint32 start,dint32 end){
+ int pos = filestr->getPos();
+ filestr->setPos(start);
+ int n = end-start;
+ duint8 *tmpBuf = new duint8[n];
+ duint8 *p = tmpBuf;
+ filestr->read (tmpBuf,n);
+ filestr->setPos(pos);
+ if (!filestr->good())
+ return 0;
+
+ duint8 al;
+
+ while (n-- > 0) {
+ al = (duint8)((*p) ^ ((dint8)(dx & 0xFF)));
+ dx = (dx>>8) & 0xFF;
+ dx = dx ^ crctable[al & 0xFF];
+ p++;
+ }
+ delete[]tmpBuf;
+ return(dx);
+}
+
+duint32 dwgBuffer::crc32(duint32 seed,dint32 start,dint32 end){
+ int pos = filestr->getPos();
+ filestr->setPos(start);
+ int n = end-start;
+ duint8 *tmpBuf = new duint8[n];
+ duint8 *p = tmpBuf;
+ filestr->read (tmpBuf,n);
+ filestr->setPos(pos);
+ if (!filestr->good())
+ return 0;
+
+ duint32 invertedCrc = ~seed;
+ while (n-- > 0) {
+ duint8 data = *p++;
+ invertedCrc = (invertedCrc >> 8) ^ crc32Table[(invertedCrc ^ data) & 0xff];
+ }
+ delete[]tmpBuf;
+ return ~invertedCrc;
+}
+
+
+/*std::string dwgBuffer::getBytes(int size){
+ char buffer[size];
+ char tmp;
+ filestr->read (buffer,size);
+ if (!filestr->good())
+ return NULL;
+
+ if (bitPos != 0){
+ for (int i=0; i<=size;i++){
+ tmp = buffer[i];
+ buffer[i] = (currByte << bitPos) | (tmp >> (8 - bitPos));
+ currByte = tmp;
+ }
+ }
+ std::string st;
+ for (int i=0; i<size;i++) {
+ st.push_back(buffer[i]);
+ }
+ return st;
+// return std::string(buffer);
+}*/
--- /dev/null
+/******************************************************************************
+** libDXFrw - Library to read/write DXF files (ascii & binary) **
+** **
+** Copyright (C) 2011-2015 José F. Soriano, rallazz@gmail.com **
+** **
+** This library is free software, licensed under the terms of the GNU **
+** General Public License as published by the Free Software Foundation, **
+** either version 2 of the License, or (at your option) any later version. **
+** You should have received a copy of the GNU General Public License **
+** along with this program. If not, see <http://www.gnu.org/licenses/>. **
+******************************************************************************/
+
+#ifndef DWGBUFFER_H
+#define DWGBUFFER_H
+
+#include <fstream>
+#include <sstream>
+#include "../drw_base.h"
+
+class DRW_Coord;
+class DRW_TextCodec;
+
+class dwgBasicStream{
+protected:
+ dwgBasicStream(){}
+public:
+ virtual ~dwgBasicStream(){}
+ virtual bool read(duint8* s, duint64 n) = 0;
+ virtual duint64 size() = 0;
+ virtual duint64 getPos() = 0;
+ virtual bool setPos(duint64 p) = 0;
+ virtual bool good() = 0;
+ virtual dwgBasicStream* clone() = 0;
+};
+
+class dwgFileStream: public dwgBasicStream{
+public:
+ dwgFileStream(std::istream *s){
+ stream =s;
+ stream->seekg (0, std::ios::end);
+ sz = stream->tellg();
+ stream->seekg(0, std::ios_base::beg);
+ }
+ virtual ~dwgFileStream(){}
+ virtual bool read(duint8* s, duint64 n);
+ virtual duint64 size(){return sz;}
+ virtual duint64 getPos(){return stream->tellg();}
+ virtual bool setPos(duint64 p);
+ virtual bool good(){return stream->good();}
+ virtual dwgBasicStream* clone(){return new dwgFileStream(stream);}
+private:
+ std::istream *stream;
+ duint64 sz;
+};
+
+class dwgCharStream: public dwgBasicStream{
+public:
+ dwgCharStream(duint8 *buf, int s){
+ stream =buf;
+ sz = s;
+ pos = 0;
+ isOk = true;
+ }
+ virtual ~dwgCharStream(){}
+ virtual bool read(duint8* s, duint64 n);
+ virtual duint64 size(){return sz;}
+ virtual duint64 getPos(){return pos;}
+ virtual bool setPos(duint64 p);
+ virtual bool good(){return isOk;}
+ virtual dwgBasicStream* clone(){return new dwgCharStream(stream, sz);}
+private:
+ duint8 *stream;
+ duint64 sz;
+ duint64 pos;
+ bool isOk;
+};
+
+class dwgBuffer {
+public:
+ dwgBuffer(std::istream *stream, DRW_TextCodec *decoder = NULL);
+ dwgBuffer(duint8 *buf, int size, DRW_TextCodec *decoder= NULL);
+ dwgBuffer( const dwgBuffer& org );
+ dwgBuffer& operator=( const dwgBuffer& org );
+ ~dwgBuffer();
+ duint64 size(){return filestr->size();}
+ bool setPosition(duint64 pos);
+ duint64 getPosition();
+ void resetPosition(){setPosition(0); setBitPos(0);}
+ void setBitPos(duint8 pos);
+ duint8 getBitPos(){return bitPos;}
+ bool moveBitPos(dint32 size);
+
+ duint8 getBit(); //B
+ bool getBoolBit(); //B as bool
+ duint8 get2Bits(); //BB
+ duint8 get3Bits(); //3B
+ duint16 getBitShort(); //BS
+ dint16 getSBitShort(); //BS
+ dint32 getBitLong(); //BL
+ duint64 getBitLongLong(); //BLL (R24)
+ double getBitDouble(); //BD
+ //2BD => call BD 2 times
+ DRW_Coord get3BitDouble(); //3BD
+ duint8 getRawChar8(); //RC
+ duint16 getRawShort16(); //RS
+ double getRawDouble(); //RD
+ duint32 getRawLong32(); //RL
+ duint64 getRawLong64(); //RLL
+ DRW_Coord get2RawDouble(); //2RD
+ //3RD => call RD 3 times
+ duint32 getUModularChar(); //UMC, unsigned for offsets in 1015
+ dint32 getModularChar(); //MC
+ dint32 getModularShort(); //MS
+ dwgHandle getHandle(); //H
+ dwgHandle getOffsetHandle(duint32 href); //H converted to hard
+ UTF8STRING getVariableText(DRW::Version v, bool nullTerm = true); //TV => call TU for 2007+ or T for previous versions
+ UTF8STRING getCP8Text(); //T 8 bit text converted from codepage to utf8
+ UTF8STRING getUCSText(bool nullTerm = true); //TU unicode 16 bit (UCS) text converted to utf8
+ UTF8STRING getUCSStr(duint16 ts);
+
+ duint16 getObjType(DRW::Version v); //OT
+
+ //X, U, SN,
+
+ DRW_Coord getExtrusion(bool b_R2000_style); //BE
+ double getDefaultDouble(double d); //DD
+ double getThickness(bool b_R2000_style);//BT
+ //3DD
+ duint32 getCmColor(DRW::Version v); //CMC
+ duint32 getEnColor(DRW::Version v); //ENC
+ //TC
+
+ duint16 getBERawShort16(); //RS big-endian order
+
+ bool isGood(){return filestr->good();}
+ bool getBytes(duint8 *buf, int size);
+ int numRemainingBytes(){return (maxSize- filestr->getPos());}
+
+ duint16 crc8(duint16 dx,dint32 start,dint32 end);
+ duint32 crc32(duint32 seed,dint32 start,dint32 end);
+
+// duint8 getCurrByte(){return currByte;}
+ DRW_TextCodec *decoder;
+
+private:
+ dwgBasicStream *filestr;
+ int maxSize;
+ duint8 currByte;
+ duint8 bitPos;
+
+ UTF8STRING get8bitStr();
+ UTF8STRING get16bitStr(duint16 textSize, bool nullTerm = true);
+};
+
+#endif // DWGBUFFER_H
--- /dev/null
+/******************************************************************************
+** libDXFrw - Library to read/write DXF files (ascii & binary) **
+** **
+** Copyright (C) 2011-2015 José F. Soriano, rallazz@gmail.com **
+** **
+** This library is free software, licensed under the terms of the GNU **
+** General Public License as published by the Free Software Foundation, **
+** either version 2 of the License, or (at your option) any later version. **
+** You should have received a copy of the GNU General Public License **
+** along with this program. If not, see <http://www.gnu.org/licenses/>. **
+******************************************************************************/
+
+#include <cstdlib>
+#include <iostream>
+#include <fstream>
+#include <string>
+#include <sstream>
+#include "dwgreader.h"
+#include "drw_textcodec.h"
+#include "drw_dbg.h"
+
+dwgReader::~dwgReader(){
+ for (std::map<duint32, DRW_LType*>::iterator it=ltypemap.begin(); it!=ltypemap.end(); ++it)
+ delete(it->second);
+ for (std::map<duint32, DRW_Layer*>::iterator it=layermap.begin(); it!=layermap.end(); ++it)
+ delete(it->second);
+ for (std::map<duint32, DRW_Block*>::iterator it=blockmap.begin(); it!=blockmap.end(); ++it)
+ delete(it->second);
+ for (std::map<duint32, DRW_Textstyle*>::iterator it=stylemap.begin(); it!=stylemap.end(); ++it)
+ delete(it->second);
+ for (std::map<duint32, DRW_Dimstyle*>::iterator it=dimstylemap.begin(); it!=dimstylemap.end(); ++it)
+ delete(it->second);
+ for (std::map<duint32, DRW_Vport*>::iterator it=vportmap.begin(); it!=vportmap.end(); ++it)
+ delete(it->second);
+ for (std::map<duint32, DRW_Class*>::iterator it=classesmap.begin(); it!=classesmap.end(); ++it)
+ delete(it->second);
+ for (std::map<duint32, DRW_Block_Record*>::iterator it=blockRecordmap.begin(); it!=blockRecordmap.end(); ++it)
+ delete(it->second);
+ for (std::map<duint32, DRW_AppId*>::iterator it=appIdmap.begin(); it!=appIdmap.end(); ++it)
+ delete(it->second);
+
+ delete fileBuf;
+}
+
+void dwgReader::parseAttribs(DRW_Entity* e){
+ if (e != NULL){
+ duint32 ltref =e->lTypeH.ref;
+ duint32 lyref =e->layerH.ref;
+ std::map<duint32, DRW_LType*>::iterator lt_it = ltypemap.find(ltref);
+ if (lt_it != ltypemap.end()){
+ e->lineType = (lt_it->second)->name;
+ }
+ std::map<duint32, DRW_Layer*>::iterator ly_it = layermap.find(lyref);
+ if (ly_it != layermap.end()){
+ e->layer = (ly_it->second)->name;
+ }
+ }
+}
+
+std::string dwgReader::findTableName(DRW::TTYPE table, dint32 handle){
+ std::string name;
+ switch (table){
+ case DRW::STYLE:{
+ std::map<duint32, DRW_Textstyle*>::iterator st_it = stylemap.find(handle);
+ if (st_it != stylemap.end())
+ name = (st_it->second)->name;
+ break;}
+ case DRW::DIMSTYLE:{
+ std::map<duint32, DRW_Dimstyle*>::iterator ds_it = dimstylemap.find(handle);
+ if (ds_it != dimstylemap.end())
+ name = (ds_it->second)->name;
+ break;}
+ case DRW::BLOCK_RECORD:{ //use DRW_Block because name are more correct
+// std::map<duint32, DRW_Block*>::iterator bk_it = blockmap.find(handle);
+// if (bk_it != blockmap.end())
+ std::map<duint32, DRW_Block_Record*>::iterator bk_it = blockRecordmap.find(handle);
+ if (bk_it != blockRecordmap.end())
+ name = (bk_it->second)->name;
+ break;}
+/* case DRW::VPORT:{
+ std::map<duint32, DRW_Vport*>::iterator vp_it = vportmap.find(handle);
+ if (vp_it != vportmap.end())
+ name = (vp_it->second)->name;
+ break;}*/
+ case DRW::LAYER:{
+ std::map<duint32, DRW_Layer*>::iterator ly_it = layermap.find(handle);
+ if (ly_it != layermap.end())
+ name = (ly_it->second)->name;
+ break;}
+ case DRW::LTYPE:{
+ std::map<duint32, DRW_LType*>::iterator lt_it = ltypemap.find(handle);
+ if (lt_it != ltypemap.end())
+ name = (lt_it->second)->name;
+ break;}
+ default:
+ break;
+ }
+ return name;
+}
+
+bool dwgReader::readDwgHeader(DRW_Header& hdr, dwgBuffer *buf, dwgBuffer *hBuf){
+ bool ret = hdr.parseDwg(version, buf, hBuf, maintenanceVersion);
+ //RLZ: copy objectControl handles
+ return ret;
+}
+
+//RLZ: TODO add check instead print
+bool dwgReader::checkSentinel(dwgBuffer *buf, enum secEnum::DWGSection, bool start){
+ DRW_UNUSED(start);
+ for (int i=0; i<16;i++) {
+ DRW_DBGH(buf->getRawChar8()); DRW_DBG(" ");
+ }
+ return true;
+}
+
+/*********** objects map ************************/
+/** Note: object map are split in sections with max size 2035?
+ * heach section are 2 bytes size + data bytes + 2 bytes crc
+ * size value are data bytes + 2 and to calculate crc are used
+ * 2 bytes size + data bytes
+ * last section are 2 bytes size + 2 bytes crc (size value always 2)
+**/
+bool dwgReader::readDwgHandles(dwgBuffer *dbuf, duint32 offset, duint32 size) {
+ DRW_DBG("\ndwgReader::readDwgHandles\n");
+ if (!dbuf->setPosition(offset))
+ return false;
+
+ duint32 maxPos = offset + size;
+ DRW_DBG("\nSection HANDLES offset= "); DRW_DBG(offset);
+ DRW_DBG("\nSection HANDLES size= "); DRW_DBG(size);
+ DRW_DBG("\nSection HANDLES maxPos= "); DRW_DBG(maxPos);
+
+ int startPos = offset;
+
+ while (maxPos > dbuf->getPosition()) {
+ DRW_DBG("\nstart handles section buf->curPosition()= "); DRW_DBG(dbuf->getPosition()); DRW_DBG("\n");
+ duint16 size = dbuf->getBERawShort16();
+ DRW_DBG("object map section size= "); DRW_DBG(size); DRW_DBG("\n");
+ dbuf->setPosition(startPos);
+ duint8 *tmpByteStr = new duint8[size];
+ dbuf->getBytes(tmpByteStr, size);
+ dwgBuffer buff(tmpByteStr, size, &decoder);
+ if (size != 2){
+ buff.setPosition(2);
+ int lastHandle = 0;
+ int lastLoc = 0;
+ //read data
+ while(buff.getPosition()< size){
+ lastHandle += buff.getUModularChar();
+ DRW_DBG("object map lastHandle= "); DRW_DBGH(lastHandle);
+ lastLoc += buff.getModularChar();
+ DRW_DBG(" lastLoc= "); DRW_DBG(lastLoc); DRW_DBG("\n");
+ ObjectMap[lastHandle]= objHandle(0, lastHandle, lastLoc);
+ }
+ }
+ //verify crc
+ duint16 crcCalc = buff.crc8(0xc0c1,0,size);
+ delete[]tmpByteStr;
+ duint16 crcRead = dbuf->getBERawShort16();
+ DRW_DBG("object map section crc8 read= "); DRW_DBG(crcRead);
+ DRW_DBG("\nobject map section crc8 calculated= "); DRW_DBG(crcCalc);
+ DRW_DBG("\nobject section buf->curPosition()= "); DRW_DBG(dbuf->getPosition()); DRW_DBG("\n");
+ startPos = dbuf->getPosition();
+ }
+
+ bool ret = dbuf->isGood();
+ return ret;
+}
+
+/*********** objects ************************/
+/**
+ * Reads all the object referenced in the object map section of the DWG file
+ * (using their object file offsets)
+ */
+bool dwgReader::readDwgTables(DRW_Header& hdr, dwgBuffer *dbuf) {
+ DRW_DBG("\ndwgReader::readDwgTables start\n");
+ bool ret = true;
+ bool ret2 = true;
+ objHandle oc;
+ std::map<duint32, objHandle>::iterator mit;
+ dint16 oType;
+ duint32 bs = 0; //bit size of handle stream 2010+
+ duint8 *tmpByteStr;
+
+ //parse linetypes, start with linetype Control
+ mit = ObjectMap.find(hdr.linetypeCtrl);
+ if (mit==ObjectMap.end()) {
+ DRW_DBG("\nWARNING: LineType control not found\n");
+ ret = false;
+ } else {
+ DRW_DBG("\n**********Parsing LineType control*******\n");
+ oc = mit->second;
+ ObjectMap.erase(mit);
+ DRW_ObjControl ltControl;
+ dbuf->setPosition(oc.loc);
+ int csize = dbuf->getModularShort();
+ if (version > DRW::AC1021) //2010+
+ bs = dbuf->getUModularChar();
+ else
+ bs = 0;
+ tmpByteStr = new duint8[csize];
+ dbuf->getBytes(tmpByteStr, csize);
+ dwgBuffer cbuff(tmpByteStr, csize, &decoder);
+ //verify if object are correct
+ oType = cbuff.getObjType(version);
+ if (oType != 0x38) {
+ DRW_DBG("\nWARNING: Not LineType control object, found oType ");
+ DRW_DBG(oType); DRW_DBG(" instead 0x38\n");
+ ret = false;
+ } else { //reset position
+ cbuff.resetPosition();
+ ret2 = ltControl.parseDwg(version, &cbuff, bs);
+ if(ret)
+ ret = ret2;
+ }
+ delete[]tmpByteStr;
+ for (std::list<duint32>::iterator it=ltControl.hadlesList.begin(); it != ltControl.hadlesList.end(); ++it){
+ mit = ObjectMap.find(*it);
+ if (mit==ObjectMap.end()) {
+ DRW_DBG("\nWARNING: LineType not found\n");
+ ret = false;
+ } else {
+ oc = mit->second;
+ ObjectMap.erase(mit);
+ DRW_DBG("\nLineType Handle= "); DRW_DBGH(oc.handle); DRW_DBG(" loc.: "); DRW_DBG(oc.loc); DRW_DBG("\n");
+ DRW_LType *lt = new DRW_LType();
+ dbuf->setPosition(oc.loc);
+ int lsize = dbuf->getModularShort();
+ DRW_DBG("LineType size in bytes= "); DRW_DBG(lsize);
+ if (version > DRW::AC1021) //2010+
+ bs = dbuf->getUModularChar();
+ else
+ bs = 0;
+ tmpByteStr = new duint8[lsize];
+ dbuf->getBytes(tmpByteStr, lsize);
+ dwgBuffer lbuff(tmpByteStr, lsize, &decoder);
+ ret2 = lt->parseDwg(version, &lbuff, bs);
+ ltypemap[lt->handle] = lt;
+ if(ret)
+ ret = ret2;
+ delete[]tmpByteStr;
+ }
+ }
+ }
+
+ //parse layers, start with layer Control
+ mit = ObjectMap.find(hdr.layerCtrl);
+ if (mit==ObjectMap.end()) {
+ DRW_DBG("\nWARNING: Layer control not found\n");
+ ret = false;
+ } else {
+ DRW_DBG("\n**********Parsing Layer control*******\n");
+ oc = mit->second;
+ ObjectMap.erase(mit);
+ DRW_ObjControl layControl;
+ dbuf->setPosition(oc.loc);
+ int size = dbuf->getModularShort();
+ if (version > DRW::AC1021) //2010+
+ bs = dbuf->getUModularChar();
+ else
+ bs = 0;
+ tmpByteStr = new duint8[size];
+ dbuf->getBytes(tmpByteStr, size);
+ dwgBuffer buff(tmpByteStr, size, &decoder);
+ //verify if object are correct
+ oType = buff.getObjType(version);
+ if (oType != 0x32) {
+ DRW_DBG("\nWARNING: Not Layer control object, found oType ");
+ DRW_DBG(oType); DRW_DBG(" instead 0x32\n");
+ ret = false;
+ } else { //reset position
+ buff.resetPosition();
+ ret2 = layControl.parseDwg(version, &buff, bs);
+ if(ret)
+ ret = ret2;
+ }
+ delete[]tmpByteStr;
+ for (std::list<duint32>::iterator it=layControl.hadlesList.begin(); it != layControl.hadlesList.end(); ++it){
+ mit = ObjectMap.find(*it);
+ if (mit==ObjectMap.end()) {
+ DRW_DBG("\nWARNING: Layer not found\n");
+ ret = false;
+ } else {
+ oc = mit->second;
+ ObjectMap.erase(mit);
+ DRW_DBG("Layer Handle= "); DRW_DBGH(oc.handle); DRW_DBG(" "); DRW_DBG(oc.loc); DRW_DBG("\n");
+ DRW_Layer *la = new DRW_Layer();
+ dbuf->setPosition(oc.loc);
+ int size = dbuf->getModularShort();
+ if (version > DRW::AC1021) //2010+
+ bs = dbuf->getUModularChar();
+ else
+ bs = 0;
+ tmpByteStr = new duint8[size];
+ dbuf->getBytes(tmpByteStr, size);
+ dwgBuffer buff(tmpByteStr, size, &decoder);
+ ret2 = la->parseDwg(version, &buff, bs);
+ layermap[la->handle] = la;
+ if(ret)
+ ret = ret2;
+ delete[]tmpByteStr;
+ }
+ }
+ }
+
+ //set linetype in layer
+ for (std::map<duint32, DRW_Layer*>::iterator it=layermap.begin(); it!=layermap.end(); ++it) {
+ DRW_Layer *ly = it->second;
+ duint32 ref =ly->lTypeH.ref;
+ std::map<duint32, DRW_LType*>::iterator lt_it = ltypemap.find(ref);
+ if (lt_it != ltypemap.end()){
+ ly->lineType = (lt_it->second)->name;
+ }
+ }
+
+ //parse text styles, start with style Control
+ mit = ObjectMap.find(hdr.styleCtrl);
+ if (mit==ObjectMap.end()) {
+ DRW_DBG("\nWARNING: Style control not found\n");
+ ret = false;
+ } else {
+ DRW_DBG("\n**********Parsing Style control*******\n");
+ oc = mit->second;
+ ObjectMap.erase(mit);
+ DRW_ObjControl styControl;
+ dbuf->setPosition(oc.loc);
+ int size = dbuf->getModularShort();
+ if (version > DRW::AC1021) //2010+
+ bs = dbuf->getUModularChar();
+ else
+ bs = 0;
+ tmpByteStr = new duint8[size];
+ dbuf->getBytes(tmpByteStr, size);
+ dwgBuffer buff(tmpByteStr, size, &decoder);
+ //verify if object are correct
+ oType = buff.getObjType(version);
+ if (oType != 0x34) {
+ DRW_DBG("\nWARNING: Not Text Style control object, found oType ");
+ DRW_DBG(oType); DRW_DBG(" instead 0x34\n");
+ ret = false;
+ } else { //reset position
+ buff.resetPosition();
+ ret2 = styControl.parseDwg(version, &buff, bs);
+ if(ret)
+ ret = ret2;
+ }
+ delete[]tmpByteStr;
+ for (std::list<duint32>::iterator it=styControl.hadlesList.begin(); it != styControl.hadlesList.end(); ++it){
+ mit = ObjectMap.find(*it);
+ if (mit==ObjectMap.end()) {
+ DRW_DBG("\nWARNING: Style not found\n");
+ ret = false;
+ } else {
+ oc = mit->second;
+ ObjectMap.erase(mit);
+ DRW_DBG("Style Handle= "); DRW_DBGH(oc.handle); DRW_DBG(" "); DRW_DBG(oc.loc); DRW_DBG("\n");
+ DRW_Textstyle *sty = new DRW_Textstyle();
+ dbuf->setPosition(oc.loc);
+ int size = dbuf->getModularShort();
+ if (version > DRW::AC1021) //2010+
+ bs = dbuf->getUModularChar();
+ else
+ bs = 0;
+ tmpByteStr = new duint8[size];
+ dbuf->getBytes(tmpByteStr, size);
+ dwgBuffer buff(tmpByteStr, size, &decoder);
+ ret2 = sty->parseDwg(version, &buff, bs);
+ stylemap[sty->handle] = sty;
+ if(ret)
+ ret = ret2;
+ delete[]tmpByteStr;
+ }
+ }
+ }
+
+ //parse dim styles, start with dimstyle Control
+ mit = ObjectMap.find(hdr.dimstyleCtrl);
+ if (mit==ObjectMap.end()) {
+ DRW_DBG("\nWARNING: Dimension Style control not found\n");
+ ret = false;
+ } else {
+ DRW_DBG("\n**********Parsing Dimension Style control*******\n");
+ oc = mit->second;
+ ObjectMap.erase(mit);
+ DRW_ObjControl dimstyControl;
+ dbuf->setPosition(oc.loc);
+ duint32 size = dbuf->getModularShort();
+ if (version > DRW::AC1021) //2010+
+ bs = dbuf->getUModularChar();
+ else
+ bs = 0;
+ tmpByteStr = new duint8[size];
+ dbuf->getBytes(tmpByteStr, size);
+ dwgBuffer buff(tmpByteStr, size, &decoder);
+ //verify if object are correct
+ oType = buff.getObjType(version);
+ if (oType != 0x44) {
+ DRW_DBG("\nWARNING: Not Dim Style control object, found oType ");
+ DRW_DBG(oType); DRW_DBG(" instead 0x44\n");
+ ret = false;
+ } else { //reset position
+ buff.resetPosition();
+ ret2 = dimstyControl.parseDwg(version, &buff, bs);
+ if(ret)
+ ret = ret2;
+ }
+ delete[]tmpByteStr;
+ for (std::list<duint32>::iterator it=dimstyControl.hadlesList.begin(); it != dimstyControl.hadlesList.end(); ++it){
+ mit = ObjectMap.find(*it);
+ if (mit==ObjectMap.end()) {
+ DRW_DBG("\nWARNING: Dimension Style not found\n");
+ ret = false;
+ } else {
+ oc = mit->second;
+ ObjectMap.erase(mit);
+ DRW_DBG("Dimstyle Handle= "); DRW_DBGH(oc.handle); DRW_DBG(" "); DRW_DBG(oc.loc); DRW_DBG("\n");
+ DRW_Dimstyle *sty = new DRW_Dimstyle();
+ dbuf->setPosition(oc.loc);
+ int size = dbuf->getModularShort();
+ if (version > DRW::AC1021) //2010+
+ bs = dbuf->getUModularChar();
+ else
+ bs = 0;
+ tmpByteStr = new duint8[size];
+ dbuf->getBytes(tmpByteStr, size);
+ dwgBuffer buff(tmpByteStr, size, &decoder);
+ ret2 = sty->parseDwg(version, &buff, bs);
+ dimstylemap[sty->handle] = sty;
+ if(ret)
+ ret = ret2;
+ delete[]tmpByteStr;
+ }
+ }
+ }
+
+ //parse vports, start with vports Control
+ mit = ObjectMap.find(hdr.vportCtrl);
+ if (mit==ObjectMap.end()) {
+ DRW_DBG("\nWARNING: vports control not found\n");
+ ret = false;
+ } else {
+ DRW_DBG("\n**********Parsing vports control*******\n");
+ oc = mit->second;
+ ObjectMap.erase(mit);
+ DRW_ObjControl vportControl;
+ dbuf->setPosition(oc.loc);
+ int size = dbuf->getModularShort();
+ if (version > DRW::AC1021) //2010+
+ bs = dbuf->getUModularChar();
+ else
+ bs = 0;
+ tmpByteStr = new duint8[size];
+ dbuf->getBytes(tmpByteStr, size);
+ dwgBuffer buff(tmpByteStr, size, &decoder);
+ //verify if object are correct
+ oType = buff.getObjType(version);
+ if (oType != 0x40) {
+ DRW_DBG("\nWARNING: Not VPorts control object, found oType: ");
+ DRW_DBG(oType); DRW_DBG(" instead 0x40\n");
+ ret = false;
+ } else { //reset position
+ buff.resetPosition();
+ ret2 = vportControl.parseDwg(version, &buff, bs);
+ if(ret)
+ ret = ret2;
+ }
+ delete[]tmpByteStr;
+ for (std::list<duint32>::iterator it=vportControl.hadlesList.begin(); it != vportControl.hadlesList.end(); ++it){
+ mit = ObjectMap.find(*it);
+ if (mit==ObjectMap.end()) {
+ DRW_DBG("\nWARNING: vport not found\n");
+ ret = false;
+ } else {
+ oc = mit->second;
+ ObjectMap.erase(mit);
+ DRW_DBG("Vport Handle= "); DRW_DBGH(oc.handle); DRW_DBG(" "); DRW_DBG(oc.loc); DRW_DBG("\n");
+ DRW_Vport *vp = new DRW_Vport();
+ dbuf->setPosition(oc.loc);
+ int size = dbuf->getModularShort();
+ if (version > DRW::AC1021) //2010+
+ bs = dbuf->getUModularChar();
+ else
+ bs = 0;
+ tmpByteStr = new duint8[size];
+ dbuf->getBytes(tmpByteStr, size);
+ dwgBuffer buff(tmpByteStr, size, &decoder);
+ ret2 = vp->parseDwg(version, &buff, bs);
+ vportmap[vp->handle] = vp;
+ if(ret)
+ ret = ret2;
+ delete[]tmpByteStr;
+ }
+ }
+ }
+
+ //parse Block_records , start with Block_record Control
+ mit = ObjectMap.find(hdr.blockCtrl);
+ if (mit==ObjectMap.end()) {
+ DRW_DBG("\nWARNING: Block_record control not found\n");
+ ret = false;
+ } else {
+ DRW_DBG("\n**********Parsing Block_record control*******\n");
+ oc = mit->second;
+ ObjectMap.erase(mit);
+ DRW_ObjControl blockControl;
+ dbuf->setPosition(oc.loc);
+ int csize = dbuf->getModularShort();
+ if (version > DRW::AC1021) //2010+
+ bs = dbuf->getUModularChar();
+ else
+ bs = 0;
+ tmpByteStr = new duint8[csize];
+ dbuf->getBytes(tmpByteStr, csize);
+ dwgBuffer buff(tmpByteStr, csize, &decoder);
+ //verify if object are correct
+ oType = buff.getObjType(version);
+ if (oType != 0x30) {
+ DRW_DBG("\nWARNING: Not Block Record control object, found oType ");
+ DRW_DBG(oType); DRW_DBG(" instead 0x30\n");
+ ret = false;
+ } else { //reset position
+ buff.resetPosition();
+ ret2 = blockControl.parseDwg(version, &buff, bs);
+ if(ret)
+ ret = ret2;
+ }
+ delete[]tmpByteStr;
+ for (std::list<duint32>::iterator it=blockControl.hadlesList.begin(); it != blockControl.hadlesList.end(); ++it){
+ mit = ObjectMap.find(*it);
+ if (mit==ObjectMap.end()) {
+ DRW_DBG("\nWARNING: block record not found\n");
+ ret = false;
+ } else {
+ oc = mit->second;
+ ObjectMap.erase(mit);
+ DRW_DBG("block record Handle= "); DRW_DBGH(oc.handle); DRW_DBG(" "); DRW_DBG(oc.loc); DRW_DBG("\n");
+ DRW_Block_Record *br = new DRW_Block_Record();
+ dbuf->setPosition(oc.loc);
+ int size = dbuf->getModularShort();
+ if (version > DRW::AC1021) //2010+
+ bs = dbuf->getUModularChar();
+ else
+ bs = 0;
+ tmpByteStr = new duint8[size];
+ dbuf->getBytes(tmpByteStr, size);
+ dwgBuffer buff(tmpByteStr, size, &decoder);
+ ret2 = br->parseDwg(version, &buff, bs);
+ blockRecordmap[br->handle] = br;
+ if(ret)
+ ret = ret2;
+ delete[]tmpByteStr;
+ }
+ }
+ }
+
+ //parse appId , start with appId Control
+ mit = ObjectMap.find(hdr.appidCtrl);
+ if (mit==ObjectMap.end()) {
+ DRW_DBG("\nWARNING: AppId control not found\n");
+ ret = false;
+ } else {
+ DRW_DBG("\n**********Parsing AppId control*******\n");
+ oc = mit->second;
+ ObjectMap.erase(mit);
+ DRW_DBG("AppId Control Obj Handle= "); DRW_DBGH(oc.handle); DRW_DBG(" "); DRW_DBG(oc.loc); DRW_DBG("\n");
+ DRW_ObjControl appIdControl;
+ dbuf->setPosition(oc.loc);
+ int size = dbuf->getModularShort();
+ if (version > DRW::AC1021) //2010+
+ bs = dbuf->getUModularChar();
+ else
+ bs = 0;
+ tmpByteStr = new duint8[size];
+ dbuf->getBytes(tmpByteStr, size);
+ dwgBuffer buff(tmpByteStr, size, &decoder);
+ //verify if object are correct
+ oType = buff.getObjType(version);
+ if (oType != 0x42) {
+ DRW_DBG("\nWARNING: Not AppId control object, found oType ");
+ DRW_DBG(oType); DRW_DBG(" instead 0x42\n");
+ ret = false;
+ } else { //reset position
+ buff.resetPosition();
+ ret2 = appIdControl.parseDwg(version, &buff, bs);
+ if(ret)
+ ret = ret2;
+ }
+ delete[]tmpByteStr;
+ for (std::list<duint32>::iterator it=appIdControl.hadlesList.begin(); it != appIdControl.hadlesList.end(); ++it){
+ mit = ObjectMap.find(*it);
+ if (mit==ObjectMap.end()) {
+ DRW_DBG("\nWARNING: AppId not found\n");
+ ret = false;
+ } else {
+ oc = mit->second;
+ ObjectMap.erase(mit);
+ DRW_DBG("AppId Handle= "); DRW_DBGH(oc.handle); DRW_DBG(" "); DRW_DBG(oc.loc); DRW_DBG("\n");
+ DRW_AppId *ai = new DRW_AppId();
+ dbuf->setPosition(oc.loc);
+ int size = dbuf->getModularShort();
+ if (version > DRW::AC1021) //2010+
+ bs = dbuf->getUModularChar();
+ else
+ bs = 0;
+ tmpByteStr = new duint8[size];
+ dbuf->getBytes(tmpByteStr, size);
+ dwgBuffer buff(tmpByteStr, size, &decoder);
+ ret2 = ai->parseDwg(version, &buff, bs);
+ appIdmap[ai->handle] = ai;
+ if(ret)
+ ret = ret2;
+ delete[]tmpByteStr;
+ }
+ }
+ }
+
+ //RLZ: parse remaining object controls, TODO: implement all
+ if (DRW_DBGGL == DRW_dbg::DEBUG){
+ mit = ObjectMap.find(hdr.viewCtrl);
+ if (mit==ObjectMap.end()) {
+ DRW_DBG("\nWARNING: View control not found\n");
+ ret = false;
+ } else {
+ DRW_DBG("\n**********Parsing View control*******\n");
+ oc = mit->second;
+ ObjectMap.erase(mit);
+ DRW_DBG("View Control Obj Handle= "); DRW_DBGH(oc.handle); DRW_DBG(" "); DRW_DBG(oc.loc); DRW_DBG("\n");
+ DRW_ObjControl viewControl;
+ dbuf->setPosition(oc.loc);
+ int size = dbuf->getModularShort();
+ if (version > DRW::AC1021) //2010+
+ bs = dbuf->getUModularChar();
+ else
+ bs = 0;
+ tmpByteStr = new duint8[size];
+ dbuf->getBytes(tmpByteStr, size);
+ dwgBuffer buff(tmpByteStr, size, &decoder);
+ //verify if object are correct
+ oType = buff.getObjType(version);
+ if (oType != 0x3C) {
+ DRW_DBG("\nWARNING: Not View control object, found oType ");
+ DRW_DBG(oType); DRW_DBG(" instead 0x3C\n");
+ ret = false;
+ } else { //reset position
+ buff.resetPosition();
+ ret2 = viewControl.parseDwg(version, &buff, bs);
+ if(ret)
+ ret = ret2;
+ }
+ delete[]tmpByteStr;
+ }
+
+ mit = ObjectMap.find(hdr.ucsCtrl);
+ if (mit==ObjectMap.end()) {
+ DRW_DBG("\nWARNING: Ucs control not found\n");
+ ret = false;
+ } else {
+ oc = mit->second;
+ ObjectMap.erase(mit);
+ DRW_DBG("\n**********Parsing Ucs control*******\n");
+ DRW_DBG("Ucs Control Obj Handle= "); DRW_DBGH(oc.handle); DRW_DBG(" "); DRW_DBG(oc.loc); DRW_DBG("\n");
+ DRW_ObjControl ucsControl;
+ dbuf->setPosition(oc.loc);
+ int size = dbuf->getModularShort();
+ if (version > DRW::AC1021) //2010+
+ bs = dbuf->getUModularChar();
+ else
+ bs = 0;
+ tmpByteStr = new duint8[size];
+ dbuf->getBytes(tmpByteStr, size);
+ dwgBuffer buff(tmpByteStr, size, &decoder);
+ //verify if object are correct
+ oType = buff.getObjType(version);
+ if (oType != 0x3E) {
+ DRW_DBG("\nWARNING: Not Ucs control object, found oType ");
+ DRW_DBG(oType); DRW_DBG(" instead 0x3E\n");
+ ret = false;
+ } else { //reset position
+ buff.resetPosition();
+ ret2 = ucsControl.parseDwg(version, &buff, bs);
+ if(ret)
+ ret = ret2;
+ }
+ delete[]tmpByteStr;
+ }
+
+ if (version < DRW::AC1018) {//r2000-
+ mit = ObjectMap.find(hdr.vpEntHeaderCtrl);
+ if (mit==ObjectMap.end()) {
+ DRW_DBG("\nWARNING: vpEntHeader control not found\n");
+ ret = false;
+ } else {
+ DRW_DBG("\n**********Parsing vpEntHeader control*******\n");
+ oc = mit->second;
+ ObjectMap.erase(mit);
+ DRW_DBG("vpEntHeader Control Obj Handle= "); DRW_DBGH(oc.handle); DRW_DBG(" "); DRW_DBG(oc.loc); DRW_DBG("\n");
+ DRW_ObjControl vpEntHeaderCtrl;
+ dbuf->setPosition(oc.loc);
+ int size = dbuf->getModularShort();
+ if (version > DRW::AC1021) //2010+
+ bs = dbuf->getUModularChar();
+ else
+ bs = 0;
+ tmpByteStr = new duint8[size];
+ dbuf->getBytes(tmpByteStr, size);
+ dwgBuffer buff(tmpByteStr, size, &decoder);
+ //verify if object are correct
+ oType = buff.getObjType(version);
+ if (oType != 0x46) {
+ DRW_DBG("\nWARNING: Not vpEntHeader control object, found oType ");
+ DRW_DBG(oType); DRW_DBG(" instead 0x46\n");
+ ret = false;
+ } else { //reset position
+ buff.resetPosition();
+/* RLZ: writeme ret2 = vpEntHeader.parseDwg(version, &buff, bs);
+ if(ret)
+ ret = ret2;*/
+ }
+ delete[]tmpByteStr;
+ }
+ }
+ }
+
+ return ret;
+}
+
+bool dwgReader::readDwgBlocks(DRW_Interface& intfa, dwgBuffer *dbuf){
+ bool ret = true;
+ bool ret2 = true;
+ duint32 bs =0;
+ duint8 *tmpByteStr;
+ std::map<duint32, objHandle>::iterator mit;
+ DRW_DBG("\nobject map total size= "); DRW_DBG(ObjectMap.size());
+
+ for (std::map<duint32, DRW_Block_Record*>::iterator it=blockRecordmap.begin(); it != blockRecordmap.end(); ++it){
+ DRW_Block_Record* bkr= it->second;
+ DRW_DBG("\nParsing Block, record handle= "); DRW_DBGH(it->first); DRW_DBG(" Name= "); DRW_DBG(bkr->name); DRW_DBG("\n");
+ DRW_DBG("\nFinding Block, handle= "); DRW_DBGH(bkr->block); DRW_DBG("\n");
+ mit = ObjectMap.find(bkr->block);
+ if (mit==ObjectMap.end()) {
+ DRW_DBG("\nWARNING: block entity not found\n");
+ ret = false;
+ continue;
+ }
+ objHandle oc = mit->second;
+ ObjectMap.erase(mit);
+ DRW_DBG("Block Handle= "); DRW_DBGH(oc.handle); DRW_DBG(" Location: "); DRW_DBG(oc.loc); DRW_DBG("\n");
+ if ( !(dbuf->setPosition(oc.loc)) ){
+ DRW_DBG("Bad Location reading blocks\n");
+ ret = false;
+ continue;
+ }
+ int size = dbuf->getModularShort();
+ if (version > DRW::AC1021) //2010+
+ bs = dbuf->getUModularChar();
+ else
+ bs = 0;
+ tmpByteStr = new duint8[size];
+ dbuf->getBytes(tmpByteStr, size);
+ dwgBuffer buff(tmpByteStr, size, &decoder);
+ DRW_Block bk;
+ ret2 = bk.parseDwg(version, &buff, bs);
+ delete[]tmpByteStr;
+ ret = ret && ret2;
+ parseAttribs(&bk);
+ //complete block entity with block record data
+ bk.basePoint = bkr->basePoint;
+ bk.flags = bkr->flags;
+ intfa.addBlock(bk);
+ //and update block record name
+ bkr->name = bk.name;
+
+ /**read & send block entities**/
+ // in dwg code 330 are not set like dxf in ModelSpace & PaperSpace, set it (RLZ: only tested in 2000)
+ if (bk.parentHandle == DRW::NoHandle) {
+ // in dwg code 330 are not set like dxf in ModelSpace & PaperSpace, set it
+ bk.parentHandle= bkr->handle;
+ //and do not send block entities like dxf
+ } else {
+ if (version < DRW::AC1018) { //pre 2004
+ duint32 nextH = bkr->firstEH;
+ while (nextH != 0){
+ mit = ObjectMap.find(nextH);
+ if (mit==ObjectMap.end()) {
+ nextH = bkr->lastEH;//end while if entity not foud
+ DRW_DBG("\nWARNING: Entity of block not found\n");
+ ret = false;
+ continue;
+ } else {//foud entity reads it
+ oc = mit->second;
+ ObjectMap.erase(mit);
+ ret2 = readDwgEntity(dbuf, oc, intfa);
+ ret = ret && ret2;
+ }
+ if (nextH == bkr->lastEH)
+ nextH = 0; //redundant, but prevent read errors
+ else
+ nextH = nextEntLink;
+ }
+ } else {//2004+
+ for (std::vector<duint32>::iterator it = bkr->entMap.begin() ; it != bkr->entMap.end(); ++it){
+ duint32 nextH = *it;
+ mit = ObjectMap.find(nextH);
+ if (mit==ObjectMap.end()) {
+ DRW_DBG("\nWARNING: Entity of block not found\n");
+ ret = false;
+ continue;
+ } else {//foud entity reads it
+ oc = mit->second;
+ ObjectMap.erase(mit);
+ DRW_DBG("\nBlocks, parsing entity: "); DRW_DBGH(oc.handle); DRW_DBG(", pos: "); DRW_DBG(oc.loc); DRW_DBG("\n");
+ ret2 = readDwgEntity(dbuf, oc, intfa);
+ ret = ret && ret2;
+ }
+ }
+ }//end 2004+
+ }
+
+ //end block entity, really needed to parse a dummy entity??
+ mit = ObjectMap.find(bkr->endBlock);
+ if (mit==ObjectMap.end()) {
+ DRW_DBG("\nWARNING: end block entity not found\n");
+ ret = false;
+ continue;
+ }
+ oc = mit->second;
+ ObjectMap.erase(mit);
+ DRW_DBG("End block Handle= "); DRW_DBGH(oc.handle); DRW_DBG(" Location: "); DRW_DBG(oc.loc); DRW_DBG("\n");
+ dbuf->setPosition(oc.loc);
+ size = dbuf->getModularShort();
+ if (version > DRW::AC1021) //2010+
+ bs = dbuf->getUModularChar();
+ else
+ bs = 0;
+ tmpByteStr = new duint8[size];
+ dbuf->getBytes(tmpByteStr, size);
+ dwgBuffer buff1(tmpByteStr, size, &decoder);
+ DRW_Block end;
+ end.isEnd = true;
+ ret2 = end.parseDwg(version, &buff1, bs);
+ delete[]tmpByteStr;
+ ret = ret && ret2;
+ if (bk.parentHandle == DRW::NoHandle) bk.parentHandle= bkr->handle;
+ parseAttribs(&end);
+ intfa.endBlock();
+ }
+
+ return ret;
+}
+
+bool dwgReader::readPlineVertex(DRW_Polyline& pline, dwgBuffer *dbuf){
+ bool ret = true;
+ bool ret2 = true;
+ objHandle oc;
+ duint32 bs = 0;
+ std::map<duint32, objHandle>::iterator mit;
+
+ if (version < DRW::AC1018) { //pre 2004
+ duint32 nextH = pline.firstEH;
+ while (nextH != 0){
+ mit = ObjectMap.find(nextH);
+ if (mit==ObjectMap.end()) {
+ nextH = pline.lastEH;//end while if entity not foud
+ DRW_DBG("\nWARNING: pline vertex not found\n");
+ ret = false;
+ continue;
+ } else {//foud entity reads it
+ oc = mit->second;
+ ObjectMap.erase(mit);
+ DRW_Vertex vt;
+ dbuf->setPosition(oc.loc);
+ //RLZ: verify if pos is ok
+ int size = dbuf->getModularShort();
+ if (version > DRW::AC1021) {//2010+
+ bs = dbuf->getUModularChar();
+ }
+ duint8 *tmpByteStr = new duint8[size];
+ dbuf->getBytes(tmpByteStr, size);
+ dwgBuffer buff(tmpByteStr, size, &decoder);
+ dint16 oType = buff.getObjType(version);
+ buff.resetPosition();
+ DRW_DBG(" object type= "); DRW_DBG(oType); DRW_DBG("\n");
+ ret2 = vt.parseDwg(version, &buff, bs, pline.basePoint.z);
+ delete[]tmpByteStr;
+ pline.addVertex(vt);
+ nextEntLink = vt.nextEntLink; \
+ prevEntLink = vt.prevEntLink;
+ ret = ret && ret2;
+ }
+ if (nextH == pline.lastEH)
+ nextH = 0; //redundant, but prevent read errors
+ else
+ nextH = nextEntLink;
+ }
+ } else {//2004+
+ for (std::list<duint32>::iterator it = pline.hadlesList.begin() ; it != pline.hadlesList.end(); ++it){
+ duint32 nextH = *it;
+ mit = ObjectMap.find(nextH);
+ if (mit==ObjectMap.end()) {
+ DRW_DBG("\nWARNING: Entity of block not found\n");
+ ret = false;
+ continue;
+ } else {//foud entity reads it
+ oc = mit->second;
+ ObjectMap.erase(mit);
+ DRW_DBG("\nPline vertex, parsing entity: "); DRW_DBGH(oc.handle); DRW_DBG(", pos: "); DRW_DBG(oc.loc); DRW_DBG("\n");
+ DRW_Vertex vt;
+ dbuf->setPosition(oc.loc);
+ //RLZ: verify if pos is ok
+ int size = dbuf->getModularShort();
+ if (version > DRW::AC1021) {//2010+
+ bs = dbuf->getUModularChar();
+ }
+ duint8 *tmpByteStr = new duint8[size];
+ dbuf->getBytes(tmpByteStr, size);
+ dwgBuffer buff(tmpByteStr, size, &decoder);
+ dint16 oType = buff.getObjType(version);
+ buff.resetPosition();
+ DRW_DBG(" object type= "); DRW_DBG(oType); DRW_DBG("\n");
+ ret2 = vt.parseDwg(version, &buff, bs, pline.basePoint.z);
+ delete[]tmpByteStr;
+ pline.addVertex(vt);
+ nextEntLink = vt.nextEntLink; \
+ prevEntLink = vt.prevEntLink;
+ ret = ret && ret2;
+ }
+ }
+ }//end 2004+
+ DRW_DBG("\nRemoved SEQEND entity: "); DRW_DBGH(pline.seqEndH.ref);DRW_DBG("\n");
+ ObjectMap.erase(pline.seqEndH.ref);
+
+ return ret;
+}
+
+bool dwgReader::readDwgEntities(DRW_Interface& intfa, dwgBuffer *dbuf){
+ bool ret = true;
+ bool ret2 = true;
+
+ DRW_DBG("\nobject map total size= "); DRW_DBG(ObjectMap.size());
+ std::map<duint32, objHandle>::iterator itB=ObjectMap.begin();
+ std::map<duint32, objHandle>::iterator itE=ObjectMap.end();
+ while (itB != itE){
+ ret2 = readDwgEntity(dbuf, itB->second, intfa);
+ ObjectMap.erase(itB);
+ itB=ObjectMap.begin();
+ if (ret)
+ ret = ret2;
+ }
+ return ret;
+}
+
+/**
+ * Reads a dwg drawing entity (dwg object entity) given its offset in the file
+ */
+bool dwgReader::readDwgEntity(dwgBuffer *dbuf, objHandle& obj, DRW_Interface& intfa){
+ bool ret = true;
+ duint32 bs = 0;
+
+#define ENTRY_PARSE(e) \
+ ret = e.parseDwg(version, &buff, bs); \
+ parseAttribs(&e); \
+ nextEntLink = e.nextEntLink; \
+ prevEntLink = e.prevEntLink;
+
+ nextEntLink = prevEntLink = 0;// set to 0 to skip unimplemented entities
+ dbuf->setPosition(obj.loc);
+ //verify if position is ok:
+ if (!dbuf->isGood()){
+ DRW_DBG(" Warning: readDwgEntity, bad location\n");
+ return false;
+ }
+ int size = dbuf->getModularShort();
+ if (version > DRW::AC1021) {//2010+
+ bs = dbuf->getUModularChar();
+ }
+ duint8 *tmpByteStr = new duint8[size];
+ dbuf->getBytes(tmpByteStr, size);
+ //verify if getBytes is ok:
+ if (!dbuf->isGood()){
+ DRW_DBG(" Warning: readDwgEntity, bad size\n");
+ delete[]tmpByteStr;
+ return false;
+ }
+ dwgBuffer buff(tmpByteStr, size, &decoder);
+ dint16 oType = buff.getObjType(version);
+ buff.resetPosition();
+
+ if (oType > 499){
+ std::map<duint32, DRW_Class*>::iterator it = classesmap.find(oType);
+ if (it == classesmap.end()){//fail, not found in classes set error
+ DRW_DBG("Class "); DRW_DBG(oType);DRW_DBG("not found, handle: "); DRW_DBG(obj.handle); DRW_DBG("\n");
+ delete[]tmpByteStr;
+ return false;
+ } else {
+ DRW_Class *cl = it->second;
+ if (cl->dwgType != 0)
+ oType = cl->dwgType;
+ }
+ }
+
+ obj.type = oType;
+ switch (oType){
+ case 17: {
+ DRW_Arc e;
+ ENTRY_PARSE(e)
+ intfa.addArc(e);
+ break; }
+ case 18: {
+ DRW_Circle e;
+ ENTRY_PARSE(e)
+ intfa.addCircle(e);
+ break; }
+ case 19:{
+ DRW_Line e;
+ ENTRY_PARSE(e)
+ intfa.addLine(e);
+ break;}
+ case 27: {
+ DRW_Point e;
+ ENTRY_PARSE(e)
+ intfa.addPoint(e);
+ break; }
+ case 35: {
+ DRW_Ellipse e;
+ ENTRY_PARSE(e)
+ intfa.addEllipse(e);
+ break; }
+ case 7:
+ case 8: {//minsert = 8
+ DRW_Insert e;
+ ENTRY_PARSE(e)
+ e.name = findTableName(DRW::BLOCK_RECORD, e.blockRecH.ref);//RLZ: find as block or blockrecord (ps & ps0)
+ intfa.addInsert(e);
+ break; }
+ case 77: {
+ DRW_LWPolyline e;
+ ENTRY_PARSE(e)
+ intfa.addLWPolyline(e);
+ break; }
+ case 1: {
+ DRW_Text e;
+ ENTRY_PARSE(e)
+ e.style = findTableName(DRW::STYLE, e.styleH.ref);
+ intfa.addText(e);
+ break; }
+ case 44: {
+ DRW_MText e;
+ ENTRY_PARSE(e)
+ e.style = findTableName(DRW::STYLE, e.styleH.ref);
+ intfa.addMText(e);
+ break; }
+ case 28: {
+ DRW_3Dface e;
+ ENTRY_PARSE(e)
+ intfa.add3dFace(e);
+ break; }
+ case 20: {
+ DRW_DimOrdinate e;
+ ENTRY_PARSE(e)
+ e.style = findTableName(DRW::DIMSTYLE, e.dimStyleH.ref);
+ intfa.addDimOrdinate(&e);
+ break; }
+ case 21: {
+ DRW_DimLinear e;
+ ENTRY_PARSE(e)
+ e.style = findTableName(DRW::DIMSTYLE, e.dimStyleH.ref);
+ intfa.addDimLinear(&e);
+ break; }
+ case 22: {
+ DRW_DimAligned e;
+ ENTRY_PARSE(e)
+ e.style = findTableName(DRW::DIMSTYLE, e.dimStyleH.ref);
+ intfa.addDimAlign(&e);
+ break; }
+ case 23: {
+ DRW_DimAngular3p e;
+ ENTRY_PARSE(e)
+ e.style = findTableName(DRW::DIMSTYLE, e.dimStyleH.ref);
+ intfa.addDimAngular3P(&e);
+ break; }
+ case 24: {
+ DRW_DimAngular e;
+ ENTRY_PARSE(e)
+ e.style = findTableName(DRW::DIMSTYLE, e.dimStyleH.ref);
+ intfa.addDimAngular(&e);
+ break; }
+ case 25: {
+ DRW_DimRadial e;
+ ENTRY_PARSE(e)
+ e.style = findTableName(DRW::DIMSTYLE, e.dimStyleH.ref);
+ intfa.addDimRadial(&e);
+ break; }
+ case 26: {
+ DRW_DimDiametric e;
+ ENTRY_PARSE(e)
+ e.style = findTableName(DRW::DIMSTYLE, e.dimStyleH.ref);
+ intfa.addDimDiametric(&e);
+ break; }
+ case 45: {
+ DRW_Leader e;
+ ENTRY_PARSE(e)
+ e.style = findTableName(DRW::DIMSTYLE, e.dimStyleH.ref);
+ intfa.addLeader(&e);
+ break; }
+ case 31: {
+ DRW_Solid e;
+ ENTRY_PARSE(e)
+ intfa.addSolid(e);
+ break; }
+ case 78: {
+ DRW_Hatch e;
+ ENTRY_PARSE(e)
+ intfa.addHatch(&e);
+ break; }
+ case 32: {
+ DRW_Trace e;
+ ENTRY_PARSE(e)
+ intfa.addTrace(e);
+ break; }
+ case 34: {
+ DRW_Viewport e;
+ ENTRY_PARSE(e)
+ intfa.addViewport(e);
+ break; }
+ case 36: {
+ DRW_Spline e;
+ ENTRY_PARSE(e)
+ intfa.addSpline(&e);
+ break; }
+ case 40: {
+ DRW_Ray e;
+ ENTRY_PARSE(e)
+ intfa.addRay(e);
+ break; }
+ case 15: // pline 2D
+ case 16: // pline 3D
+ case 29: { // pline PFACE
+ DRW_Polyline e;
+ ENTRY_PARSE(e)
+ readPlineVertex(e, dbuf);
+ intfa.addPolyline(e);
+ break; }
+// case 30: {
+// DRW_Polyline e;// MESH (not pline)
+// ENTRY_PARSE(e)
+// intfa.addRay(e);
+// break; }
+ case 41: {
+ DRW_Xline e;
+ ENTRY_PARSE(e)
+ intfa.addXline(e);
+ break; }
+ case 101: {
+ DRW_Image e;
+ ENTRY_PARSE(e)
+ intfa.addImage(&e);
+ break; }
+
+ default:
+ //not supported or are object add to remaining map
+ objObjectMap[obj.handle]= obj;
+ break;
+ }
+ if (!ret){
+ DRW_DBG("Warning: Entity type "); DRW_DBG(oType);DRW_DBG("has failed, handle: "); DRW_DBG(obj.handle); DRW_DBG("\n");
+ }
+ delete[]tmpByteStr;
+ return ret;
+}
+
+bool dwgReader::readDwgObjects(DRW_Interface& intfa, dwgBuffer *dbuf){
+ bool ret = true;
+ bool ret2 = true;
+
+ duint32 i=0;
+ DRW_DBG("\nentities map total size= "); DRW_DBG(ObjectMap.size());
+ DRW_DBG("\nobjects map total size= "); DRW_DBG(objObjectMap.size());
+ std::map<duint32, objHandle>::iterator itB=objObjectMap.begin();
+ std::map<duint32, objHandle>::iterator itE=objObjectMap.end();
+ while (itB != itE){
+ ret2 = readDwgObject(dbuf, itB->second, intfa);
+ objObjectMap.erase(itB);
+ itB=objObjectMap.begin();
+ if (ret)
+ ret = ret2;
+ }
+ if (DRW_DBGGL == DRW_dbg::DEBUG) {
+ for (std::map<duint32, objHandle>::iterator it=remainingMap.begin(); it != remainingMap.end(); ++it){
+ DRW_DBG("\nnum.# "); DRW_DBG(i++); DRW_DBG(" Remaining object Handle, loc, type= "); DRW_DBG(it->first);
+ DRW_DBG(" "); DRW_DBG(it->second.loc); DRW_DBG(" "); DRW_DBG(it->second.type);
+ }
+ DRW_DBG("\n");
+ }
+ return ret;
+}
+
+/**
+ * Reads a dwg drawing object (dwg object object) given its offset in the file
+ */
+bool dwgReader::readDwgObject(dwgBuffer *dbuf, objHandle& obj, DRW_Interface& intfa){
+ bool ret = true;
+ duint32 bs = 0;
+
+ dbuf->setPosition(obj.loc);
+ //verify if position is ok:
+ if (!dbuf->isGood()){
+ DRW_DBG(" Warning: readDwgObject, bad location\n");
+ return false;
+ }
+ int size = dbuf->getModularShort();
+ if (version > DRW::AC1021) {//2010+
+ bs = dbuf->getUModularChar();
+ }
+ duint8 *tmpByteStr = new duint8[size];
+ dbuf->getBytes(tmpByteStr, size);
+ //verify if getBytes is ok:
+ if (!dbuf->isGood()){
+ DRW_DBG(" Warning: readDwgObject, bad size\n");
+ delete[]tmpByteStr;
+ return false;
+ }
+ dwgBuffer buff(tmpByteStr, size, &decoder);
+ //oType are set parsing entities
+ dint16 oType = obj.type;
+
+ switch (oType){
+ case 102: {
+ DRW_ImageDef e;
+ ret = e.parseDwg(version, &buff, bs);
+ intfa.linkImage(&e);
+ break; }
+ default:
+ //not supported object or entity add to remaining map for debug
+ remainingMap[obj.handle]= obj;
+ break;
+ }
+ if (!ret){
+ DRW_DBG("Warning: Object type "); DRW_DBG(oType);DRW_DBG("has failed, handle: "); DRW_DBG(obj.handle); DRW_DBG("\n");
+ }
+ delete[]tmpByteStr;
+ return ret;
+}
+
+
+
+bool DRW_ObjControl::parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs){
+int unkData=0;
+ bool ret = DRW_TableEntry::parseDwg(version, buf, NULL, bs);
+ DRW_DBG("\n***************************** parsing object control entry *********************************************\n");
+ if (!ret)
+ return ret;
+ //last parsed is: XDic Missing Flag 2004+
+ int numEntries = buf->getBitLong();
+ DRW_DBG(" num entries: "); DRW_DBG(numEntries); DRW_DBG("\n");
+ DRW_DBG("Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n");
+
+// if (oType == 68 && version== DRW::AC1015){//V2000 dimstyle seems have one unknown byte hard handle counter??
+ if (oType == 68 && version > DRW::AC1014){//dimstyle seems have one unknown byte hard handle counter??
+ unkData = buf->getRawChar8();
+ DRW_DBG(" unknown v2000 byte: "); DRW_DBG( unkData); DRW_DBG("\n");
+ }
+ if (version > DRW::AC1018){//from v2007+ have a bit for strings follows (ObjControl do not have)
+ int stringBit = buf->getBit();
+ DRW_DBG(" string bit for v2007+: "); DRW_DBG( stringBit); DRW_DBG("\n");
+ }
+
+ dwgHandle objectH = buf->getHandle();
+ DRW_DBG(" NULL Handle: "); DRW_DBGHL(objectH.code, objectH.size, objectH.ref); DRW_DBG("\n");
+ DRW_DBG("Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n");
+
+// if (oType == 56 && version== DRW::AC1015){//linetype in 2004 seems not have XDicObjH or NULL handle
+ if (xDictFlag !=1){//linetype in 2004 seems not have XDicObjH or NULL handle
+ dwgHandle XDicObjH = buf->getHandle();
+ DRW_DBG(" XDicObj control Handle: "); DRW_DBGHL(XDicObjH.code, XDicObjH.size, XDicObjH.ref); DRW_DBG("\n");
+ DRW_DBG("Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n");
+ }
+//add 2 for modelspace, paperspace blocks & bylayer, byblock linetypes
+ numEntries = ((oType == 48) || (oType == 56)) ? (numEntries +2) : numEntries;
+
+ for (int i =0; i< numEntries; i++){
+ objectH = buf->getOffsetHandle(handle);
+ if (objectH.ref != 0) //in vports R14 I found some NULL handles
+ hadlesList.push_back (objectH.ref);
+ DRW_DBG(" objectH Handle: "); DRW_DBGHL(objectH.code, objectH.size, objectH.ref); DRW_DBG("\n");
+ DRW_DBG("Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n");
+ }
+
+ for (int i =0; i< unkData; i++){
+ objectH = buf->getOffsetHandle(handle);
+ DRW_DBG(" unknown Handle: "); DRW_DBGHL(objectH.code, objectH.size, objectH.ref); DRW_DBG("\n");
+ DRW_DBG("Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n");
+ }
+ return buf->isGood();
+}
--- /dev/null
+/******************************************************************************
+** libDXFrw - Library to read/write DXF files (ascii & binary) **
+** **
+** Copyright (C) 2011-2015 José F. Soriano, rallazz@gmail.com **
+** **
+** This library is free software, licensed under the terms of the GNU **
+** General Public License as published by the Free Software Foundation, **
+** either version 2 of the License, or (at your option) any later version. **
+** You should have received a copy of the GNU General Public License **
+** along with this program. If not, see <http://www.gnu.org/licenses/>. **
+******************************************************************************/
+
+#ifndef DWGREADER_H
+#define DWGREADER_H
+
+#include <map>
+#include <list>
+#include "drw_textcodec.h"
+#include "dwgutil.h"
+#include "dwgbuffer.h"
+#include "../libdwgr.h"
+
+class objHandle{
+public:
+ objHandle(){ handle = type = loc = 0; }
+ objHandle(duint32 t, duint32 h, duint32 l){
+ type = t;
+ handle = h;
+ loc = l;
+ }
+ duint32 type;
+ duint32 handle;
+ duint32 loc;
+};
+
+//until 2000 = 2000-
+//since 2004 except 2007 = 2004+
+// 2007 = 2007
+// pages of section
+/* 2000-: No pages, only sections
+ * 2004+: Id, page number (index)
+ * size, size of page in file stream
+ * address, address in file stream
+ * dataSize, data size for this page
+ * startOffset, start offset for this page
+ * cSize, compresed size of data
+ * uSize, uncompresed size of data
+ * 2007: page Id, pageCount & pages
+ * size, size in file
+ * dataSize
+ * startOffset, start position in decompresed data stream
+ * cSize, compresed size of data
+ * uSize, uncompresed size of data
+ * address, address in file stream
+ * */
+class dwgPageInfo {
+public:
+ dwgPageInfo(){}
+ dwgPageInfo(duint64 i, duint64 ad, duint32 sz){
+ Id=i; address=ad; size=sz;
+ }
+ ~dwgPageInfo(){}
+ duint64 Id;
+ duint64 address; //in file stream, for rd18, rd21
+ duint64 size; //in file stream, for rd18, rd21
+ duint64 dataSize; //for rd18, rd21
+ duint32 startOffset; //for rd18, rd21
+ duint64 cSize; //compresed page size, for rd21
+ duint64 uSize; //uncompresed page size, for rd21
+};
+
+// sections of file
+/* 2000-: No pages, only section Id, size & address in file
+ * 2004+: Id, Section Id
+ * size, total size of uncompresed data
+ * pageCount & pages, number of pages in section
+ * maxSize, max decompressed Size per page
+ * compresed, (1 = no, 2 = yes, normally 2)
+ * encrypted, (0 = no, 1 = yes, 2 = unknown)
+ * name, read & stored but not used
+ * 2007: same as 2004+ except encoding, saved in compresed field
+ * */
+class dwgSectionInfo {
+public:
+ dwgSectionInfo(){
+ compresed = 1;//1=no, 2=yes
+ encrypted = 0;//???
+ pageCount = 0;
+ Id=-1;
+ }
+ ~dwgSectionInfo(){}
+ dint32 Id; //section Id, 2000- rd15 rd18
+ std::string name; //section name rd18
+ duint32 compresed;//is compresed? 1=no, 2=yes rd18, rd21(encoding)
+ duint32 encrypted;//encrypted (doc: 0=no, 1=yes, 2=unkn) on read: objects 0 and encrypted yes rd18
+ std::map<duint32, dwgPageInfo >pages;//index, size, offset
+ duint64 size;//size of section, 2000- rd15, rd18, rd21 (data size)
+ duint64 pageCount; //number of pages (dwgPageInfo) in section rd18, rd21
+ duint64 maxSize; //max decompressed size (needed??) rd18 rd21
+ duint64 address; //address (seek) , 2000-
+};
+
+
+//! Class to handle dwg obj control entries
+/*!
+* Class to handle dwg obj control entries
+* @author Rallaz
+*/
+class DRW_ObjControl : public DRW_TableEntry {
+public:
+ DRW_ObjControl() { reset();}
+
+ void reset(){
+ }
+ bool parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs=0);
+ std::list<duint32>hadlesList;
+};
+
+
+class dwgReader {
+ friend class dwgR;
+public:
+ dwgReader(std::istream *stream, dwgR *p){
+ fileBuf = new dwgBuffer(stream);
+ parent = p;
+ decoder.setVersion(DRW::AC1021, false);//default 2007 in utf8(no convert)
+ decoder.setCodePage("UTF-16", false);
+// blockCtrl=0; //RLZ: temporary
+// blockCtrl=layerCtrl=styleCtrl=linetypeCtrl=viewCtrl=0;
+// ucsCtrl=vportCtrl=appidCtrl=dimstyleCtrl=vpEntHeaderCtrl=0;
+ nextEntLink = prevEntLink = 0;
+ maintenanceVersion=0;
+ }
+ virtual ~dwgReader();
+
+protected:
+ virtual bool readMetaData() = 0;
+ virtual bool readPreview(){return false;}
+ virtual bool readFileHeader() = 0;
+ virtual bool readDwgHeader(DRW_Header& hdr)=0;
+ virtual bool readDwgClasses() = 0;
+ virtual bool readDwgHandles() = 0;
+ virtual bool readDwgTables(DRW_Header& hdr)=0;
+ virtual bool readDwgBlocks(DRW_Interface& intfa) = 0;
+ virtual bool readDwgEntities(DRW_Interface& intfa) = 0;
+ virtual bool readDwgObjects(DRW_Interface& intfa) = 0;
+
+ virtual bool readDwgEntity(dwgBuffer *dbuf, objHandle& obj, DRW_Interface& intfa);
+ bool readDwgObject(dwgBuffer *dbuf, objHandle& obj, DRW_Interface& intfa);
+ void parseAttribs(DRW_Entity* e);
+ std::string findTableName(DRW::TTYPE table, dint32 handle);
+
+ void setCodePage(std::string *c){decoder.setCodePage(c, false);}
+ std::string getCodePage(){ return decoder.getCodePage();}
+ bool readDwgHeader(DRW_Header& hdr, dwgBuffer *buf, dwgBuffer *hBuf);
+ bool readDwgHandles(dwgBuffer *dbuf, duint32 offset, duint32 size);
+ bool readDwgTables(DRW_Header& hdr, dwgBuffer *dbuf);
+ bool checkSentinel(dwgBuffer *buf, enum secEnum::DWGSection, bool start);
+
+ bool readDwgBlocks(DRW_Interface& intfa, dwgBuffer *dbuf);
+ bool readDwgEntities(DRW_Interface& intfa, dwgBuffer *dbuf);
+ bool readDwgObjects(DRW_Interface& intfa, dwgBuffer *dbuf);
+ bool readPlineVertex(DRW_Polyline& pline, dwgBuffer *dbuf);
+
+public:
+ std::map<duint32, objHandle>ObjectMap;
+ std::map<duint32, objHandle>objObjectMap; //stores the ojects & entities not read in readDwgEntities
+ std::map<duint32, objHandle>remainingMap; //stores the ojects & entities not read in all proces, for debug only
+ std::map<duint32, DRW_LType*> ltypemap;
+ std::map<duint32, DRW_Layer*> layermap;
+ std::map<duint32, DRW_Block*> blockmap;
+ std::map<duint32, DRW_Textstyle*> stylemap;
+ std::map<duint32, DRW_Dimstyle*> dimstylemap;
+ std::map<duint32, DRW_Vport*> vportmap;
+ std::map<duint32, DRW_Block_Record*> blockRecordmap;
+ std::map<duint32, DRW_AppId*> appIdmap;
+// duint32 currBlock;
+ duint8 maintenanceVersion;
+
+protected:
+ dwgBuffer *fileBuf;
+ dwgR *parent;
+ DRW::Version version;
+
+//seeker (position) for the beginning sentinel of the image data (R13 to R15)
+ duint32 previewImagePos;
+
+//sections map
+ std::map<enum secEnum::DWGSection, dwgSectionInfo >sections;
+ std::map<duint32, DRW_Class*> classesmap;
+
+protected:
+ DRW_TextCodec decoder;
+
+protected:
+// duint32 blockCtrl;
+ duint32 nextEntLink;
+ duint32 prevEntLink;
+};
+
+
+
+#endif // DWGREADER_H
--- /dev/null
+/******************************************************************************
+** libDXFrw - Library to read/write DXF files (ascii & binary) **
+** **
+** Copyright (C) 2011-2015 José F. Soriano, rallazz@gmail.com **
+** **
+** This library is free software, licensed under the terms of the GNU **
+** General Public License as published by the Free Software Foundation, **
+** either version 2 of the License, or (at your option) any later version. **
+** You should have received a copy of the GNU General Public License **
+** along with this program. If not, see <http://www.gnu.org/licenses/>. **
+******************************************************************************/
+
+#include <cstdlib>
+#include <iostream>
+#include <fstream>
+#include <string>
+#include <sstream>
+#include "drw_dbg.h"
+#include "dwgreader15.h"
+#include "drw_textcodec.h"
+#include "../libdwgr.h"
+
+bool dwgReader15::readMetaData() {
+ version = parent->getVersion();
+ decoder.setVersion(version, false);
+ DRW_DBG("dwgReader15::readMetaData\n");
+ if (! fileBuf->setPosition(13))
+ return false;
+ previewImagePos = fileBuf->getRawLong32();
+ DRW_DBG("previewImagePos (seekerImageData) = "); DRW_DBG(previewImagePos);
+ /* MEASUREMENT system variable 2 bytes*/
+ duint16 meas = fileBuf->getRawShort16();
+ DRW_DBG("\nMEASUREMENT (0 = English, 1 = Metric)= "); DRW_DBG(meas);
+ duint16 cp = fileBuf->getRawShort16();
+ DRW_DBG("\ncodepage= "); DRW_DBG(cp); DRW_DBG("\n");
+ if (cp == 29) //TODO RLZ: locate wath code page and correct this
+ decoder.setCodePage("ANSI_1252", false);
+ if (cp == 30)
+ decoder.setCodePage("ANSI_1252", false);
+ return true;
+}
+
+bool dwgReader15::readFileHeader() {
+ bool ret = true;
+ DRW_DBG("dwgReader15::readFileHeader\n");
+ if (! fileBuf->setPosition(21))
+ return false;
+ duint32 count = fileBuf->getRawLong32();
+ DRW_DBG("count records= "); DRW_DBG(count); DRW_DBG("\n");
+
+ for (unsigned int i = 0; i < count; i++) {
+ duint8 rec = fileBuf->getRawChar8();
+ duint32 address = fileBuf->getRawLong32();
+ duint32 size = fileBuf->getRawLong32();
+ dwgSectionInfo si;
+ si.Id = rec;
+ si.size = size;
+ si.address = address;
+ if (rec == 0) {
+ DRW_DBG("\nSection HEADERS address= ");
+ DRW_DBG(address); DRW_DBG(" size= "); DRW_DBG(size);
+ sections[secEnum::HEADER] = si;
+ } else if (rec == 1) {
+ DRW_DBG("\nSection CLASSES address= ");
+ DRW_DBG(address); DRW_DBG(" size= "); DRW_DBG(size);
+ sections[secEnum::CLASSES] = si;
+ } else if (rec == 2) {
+ DRW_DBG("\nSection OBJECTS (handles) address= ");
+ DRW_DBG(address); DRW_DBG(" size= "); DRW_DBG(size);
+ sections[secEnum::HANDLES] = si;
+ } else if (rec == 3) {
+ DRW_DBG("\nSection UNKNOWN address= ");
+ DRW_DBG(address); DRW_DBG(" size= "); DRW_DBG(size);
+ sections[secEnum::UNKNOWNS] = si;
+ } else if (rec == 4) {
+ DRW_DBG("\nSection R14DATA (AcDb:Template) address= ");
+ DRW_DBG(address); DRW_DBG(" size= "); DRW_DBG(size);
+ sections[secEnum::TEMPLATE] = si;
+ } else if (rec == 5) {
+ DRW_DBG("\nSection R14REC5 (AcDb:AuxHeader) address= ");
+ DRW_DBG(address); DRW_DBG(" size= "); DRW_DBG(size);
+ sections[secEnum::AUXHEADER] = si;
+ } else {
+ std::cerr << "\nUnsupported section number\n";
+ }
+ }
+ if (! fileBuf->isGood())
+ return false;
+ DRW_DBG("\nposition after read section locator records= "); DRW_DBG(fileBuf->getPosition());
+ DRW_DBG(", bit are= "); DRW_DBG(fileBuf->getBitPos());
+ duint32 ckcrc = fileBuf->crc8(0,0,fileBuf->getPosition());
+ DRW_DBG("\nfile header crc8 0 result= "); DRW_DBG(ckcrc);
+ switch (count){
+ case 3:
+ ckcrc = ckcrc ^ 0xA598;
+ break;
+ case 4:
+ ckcrc = ckcrc ^ 0x8101;
+ break;
+ case 5:
+ ckcrc = ckcrc ^ 0x3CC4;
+ break;
+ case 6:
+ ckcrc = ckcrc ^ 0x8461;
+ }
+ DRW_DBG("\nfile header crc8 xor result= "); DRW_DBG(ckcrc);
+ DRW_DBG("\nfile header CRC= "); DRW_DBG(fileBuf->getRawShort16());
+ DRW_DBG("\nfile header sentinel= ");
+ checkSentinel(fileBuf, secEnum::FILEHEADER, false);
+
+ DRW_DBG("\nposition after read file header sentinel= "); DRW_DBG(fileBuf->getPosition());
+ DRW_DBG(", bit are= "); DRW_DBG(fileBuf->getBitPos());
+
+ DRW_DBG("\ndwgReader15::readFileHeader END\n");
+ return ret;
+}
+
+bool dwgReader15::readDwgHeader(DRW_Header& hdr){
+ DRW_DBG("dwgReader15::readDwgHeader\n");
+ dwgSectionInfo si = sections[secEnum::HEADER];
+ if (si.Id<0)//not found, ends
+ return false;
+ if (!fileBuf->setPosition(si.address))
+ return false;
+ duint8 *tmpByteStr = new duint8[si.size];
+ fileBuf->getBytes(tmpByteStr, si.size);
+ dwgBuffer buff(tmpByteStr, si.size, &decoder);
+ DRW_DBG("Header section sentinel= ");
+ checkSentinel(&buff, secEnum::HEADER, true);
+ bool ret = dwgReader::readDwgHeader(hdr, &buff, &buff);
+ delete[]tmpByteStr;
+ return ret;
+}
+
+
+bool dwgReader15::readDwgClasses(){
+ DRW_DBG("\ndwgReader15::readDwgClasses\n");
+ dwgSectionInfo si = sections[secEnum::CLASSES];
+ if (si.Id<0)//not found, ends
+ return false;
+ if (!fileBuf->setPosition(si.address))
+ return false;
+
+ DRW_DBG("classes section sentinel= ");
+ checkSentinel(fileBuf, secEnum::CLASSES, true);
+
+ duint32 size = fileBuf->getRawLong32();
+ if (size != (si.size - 38)) {
+ DRW_DBG("\nWARNING dwgReader15::readDwgClasses size are "); DRW_DBG(size);
+ DRW_DBG(" and secSize - 38 are "); DRW_DBG(si.size - 38); DRW_DBG("\n");
+ }
+ duint8 *tmpByteStr = new duint8[size];
+ fileBuf->getBytes(tmpByteStr, size);
+ dwgBuffer buff(tmpByteStr, size, &decoder);
+ size--; //reduce 1 byte instead of check pos + bitPos
+ while (size > buff.getPosition()) {
+ DRW_Class *cl = new DRW_Class();
+ cl->parseDwg(version, &buff, &buff);
+ classesmap[cl->classNum] = cl;
+ }
+ DRW_DBG("\nCRC: "); DRW_DBGH(fileBuf->getRawShort16());
+ DRW_DBG("\nclasses section end sentinel= ");
+ checkSentinel(fileBuf, secEnum::CLASSES, false);
+ bool ret = buff.isGood();
+ delete[]tmpByteStr;
+ return ret;
+}
+
+bool dwgReader15::readDwgHandles() {
+ DRW_DBG("\ndwgReader15::readDwgHandles\n");
+ dwgSectionInfo si = sections[secEnum::HANDLES];
+ if (si.Id<0)//not found, ends
+ return false;
+
+ bool ret = dwgReader::readDwgHandles(fileBuf, si.address, si.size);
+ return ret;
+}
+
+/*********** objects ************************/
+/**
+ * Reads all the object referenced in the object map section of the DWG file
+ * (using their object file offsets)
+ */
+bool dwgReader15::readDwgTables(DRW_Header& hdr) {
+ bool ret = dwgReader::readDwgTables(hdr, fileBuf);
+
+ return ret;
+}
+
+/**
+ * Reads all the object referenced in the object map section of the DWG file
+ * (using their object file offsets)
+ */
+bool dwgReader15::readDwgBlocks(DRW_Interface& intfa) {
+ bool ret = true;
+ ret = dwgReader::readDwgBlocks(intfa, fileBuf);
+ return ret;
+}
--- /dev/null
+/******************************************************************************
+** libDXFrw - Library to read/write DXF files (ascii & binary) **
+** **
+** Copyright (C) 2011-2015 José F. Soriano, rallazz@gmail.com **
+** **
+** This library is free software, licensed under the terms of the GNU **
+** General Public License as published by the Free Software Foundation, **
+** either version 2 of the License, or (at your option) any later version. **
+** You should have received a copy of the GNU General Public License **
+** along with this program. If not, see <http://www.gnu.org/licenses/>. **
+******************************************************************************/
+
+#ifndef DWGREADER15_H
+#define DWGREADER15_H
+
+#include <map>
+#include <list>
+#include "drw_textcodec.h"
+#include "dwgbuffer.h"
+#include "dwgreader.h"
+
+class dwgReader15 : public dwgReader {
+public:
+ dwgReader15(std::istream *stream, dwgR *p):dwgReader(stream, p){ }
+ virtual ~dwgReader15() {}
+ bool readMetaData();
+ bool readFileHeader();
+ bool readDwgHeader(DRW_Header& hdr);
+ bool readDwgClasses();
+ bool readDwgHandles();
+ bool readDwgTables(DRW_Header& hdr);
+ bool readDwgBlocks(DRW_Interface& intfa);
+ bool readDwgEntities(DRW_Interface& intfa){
+ bool ret = true;
+ ret = dwgReader::readDwgEntities(intfa, fileBuf);
+ return ret;
+ }
+ bool readDwgObjects(DRW_Interface& intfa){
+ bool ret = true;
+ ret = dwgReader::readDwgObjects(intfa, fileBuf);
+ return ret;
+ }
+// bool readDwgEntity(objHandle& obj, DRW_Interface& intfa);
+};
+
+
+#endif // DWGREADER15_H
--- /dev/null
+/******************************************************************************
+** libDXFrw - Library to read/write DXF files (ascii & binary) **
+** **
+** Copyright (C) 2011-2015 José F. Soriano, rallazz@gmail.com **
+** **
+** This library is free software, licensed under the terms of the GNU **
+** General Public License as published by the Free Software Foundation, **
+** either version 2 of the License, or (at your option) any later version. **
+** You should have received a copy of the GNU General Public License **
+** along with this program. If not, see <http://www.gnu.org/licenses/>. **
+******************************************************************************/
+
+#include <cstdlib>
+#include <iostream>
+#include <fstream>
+#include <string>
+#include <sstream>
+#include "drw_dbg.h"
+#include "dwgreader18.h"
+#include "dwgutil.h"
+#include "drw_textcodec.h"
+#include "../libdwgr.h"
+
+void dwgReader18::genMagicNumber(){
+ int size =0x114;
+ duint8 *tmpMagicStr = new duint8[size];
+ duint8 *p = tmpMagicStr;
+ int rSeed =1;
+ while (size--) {
+ rSeed *= 0x343fd;
+ rSeed += 0x269ec3;
+ *p++ = static_cast<duint8>(rSeed >> 0x10);
+ }
+ int j = 0;
+ size =0x114;
+ for (int i=0; i< size;i++) {
+ DRW_DBGH(tmpMagicStr[i]);
+ if (j == 15) {
+ DRW_DBG("\n");
+ j = 0;
+ } else {
+ DRW_DBG(", ");
+ j++;
+ }
+ }
+ delete[]tmpMagicStr;
+}
+
+duint32 dwgReader18::checksum(duint32 seed, duint8* data, duint32 sz){
+ duint32 size = sz;
+ duint32 sum1 = seed & 0xffff;
+ duint32 sum2 = seed >> 0x10;
+ while (size != 0) {
+// duint32 chunkSize = min(0x15b0, size);
+ duint32 chunkSize = 0x15b0 < size? 0x15b0:size;
+ size -= chunkSize;
+ for (duint32 i = 0; i < chunkSize; i++) {
+ sum1 += *data++;
+ sum2 += sum1;
+ }
+ sum1 %= 0xFFF1;
+ sum2 %= 0xFFF1;
+ }
+ return (sum2 << 0x10) | (sum1 & 0xffff);
+}
+
+ //called: Section page map: 0x41630e3b
+void dwgReader18::parseSysPage(duint8 *decompSec, duint32 decompSize){
+ DRW_DBG("\nparseSysPage:\n ");
+ duint32 compSize = fileBuf->getRawLong32();
+ DRW_DBG("Compressed size= "); DRW_DBG(compSize); DRW_DBG(", "); DRW_DBGH(compSize);
+ DRW_DBG("\nCompression type= "); DRW_DBGH(fileBuf->getRawLong32());
+ DRW_DBG("\nSection page checksum= "); DRW_DBGH(fileBuf->getRawLong32()); DRW_DBG("\n");
+
+ duint8 hdrData[20];
+ fileBuf->moveBitPos(-160);
+ fileBuf->getBytes(hdrData, 20);
+ for (duint8 i= 16; i<20; ++i)
+ hdrData[i]=0;
+ duint32 calcsH = checksum(0, hdrData, 20);
+ DRW_DBG("Calc hdr checksum= "); DRW_DBGH(calcsH);
+ duint8 *tmpCompSec = new duint8[compSize];
+ fileBuf->getBytes(tmpCompSec, compSize);
+ duint32 calcsD = checksum(calcsH, tmpCompSec, compSize);
+ DRW_DBG("\nCalc data checksum= "); DRW_DBGH(calcsD); DRW_DBG("\n");
+
+#ifdef DRW_DBG_DUMP
+ for (unsigned int i=0, j=0; i< compSize;i++) {
+ DRW_DBGH( (unsigned char)compSec[i]);
+ if (j == 7) { DRW_DBG("\n"); j = 0;
+ } else { DRW_DBG(", "); j++; }
+ } DRW_DBG("\n");
+#endif
+ DRW_DBG("decompresing "); DRW_DBG(compSize); DRW_DBG(" bytes in "); DRW_DBG(decompSize); DRW_DBG(" bytes\n");
+ dwgCompressor comp;
+ comp.decompress18(tmpCompSec, decompSec, compSize, decompSize);
+#ifdef DRW_DBG_DUMP
+ for (unsigned int i=0, j=0; i< decompSize;i++) {
+ DRW_DBGH( decompSec[i]);
+ if (j == 7) { DRW_DBG("\n"); j = 0;
+ } else { DRW_DBG(", "); j++; }
+ } DRW_DBG("\n");
+#endif
+ delete[]tmpCompSec;
+}
+
+ //called ???: Section map: 0x4163003b
+bool dwgReader18::parseDataPage(dwgSectionInfo si/*, duint8 *dData*/){
+ DRW_DBG("\nparseDataPage\n ");
+ objData = new duint8 [si.pageCount * si.maxSize];
+
+ for (std::map<duint32, dwgPageInfo>::iterator it=si.pages.begin(); it!=si.pages.end(); ++it){
+ dwgPageInfo pi = it->second;
+ if (!fileBuf->setPosition(pi.address))
+ return false;
+ //decript section header
+ duint8 hdrData[32];
+ fileBuf->getBytes(hdrData, 32);
+ dwgCompressor::decrypt18Hdr(hdrData, 32, pi.address);
+ DRW_DBG("Section "); DRW_DBG(si.name); DRW_DBG(" page header=\n");
+ for (unsigned int i=0, j=0; i< 32;i++) {
+ DRW_DBGH( (unsigned char)hdrData[i]);
+ if (j == 7) {
+ DRW_DBG("\n");
+ j = 0;
+ } else {
+ DRW_DBG(", ");
+ j++;
+ }
+ } DRW_DBG("\n");
+
+ DRW_DBG("\n Page number= "); DRW_DBGH(pi.Id);
+ DRW_DBG("\n size in file= "); DRW_DBGH(pi.size);
+ DRW_DBG("\n address in file= "); DRW_DBGH(pi.address);
+ DRW_DBG("\n Data size= "); DRW_DBGH(pi.dataSize);
+ DRW_DBG("\n Start offset= "); DRW_DBGH(pi.startOffset); DRW_DBG("\n");
+ dwgBuffer bufHdr(hdrData, 32, &decoder);
+ DRW_DBG(" section page type= "); DRW_DBGH(bufHdr.getRawLong32());
+ DRW_DBG("\n section number= "); DRW_DBGH(bufHdr.getRawLong32());
+ pi.cSize = bufHdr.getRawLong32();
+ DRW_DBG("\n data size (compressed)= "); DRW_DBGH(pi.cSize); DRW_DBG(" dec "); DRW_DBG(pi.cSize);
+ pi.uSize = bufHdr.getRawLong32();
+ DRW_DBG("\n page size (decompressed)= "); DRW_DBGH(pi.uSize); DRW_DBG(" dec "); DRW_DBG(pi.uSize);
+ DRW_DBG("\n start offset (in decompressed buffer)= "); DRW_DBGH(bufHdr.getRawLong32());
+ DRW_DBG("\n unknown= "); DRW_DBGH(bufHdr.getRawLong32());
+ DRW_DBG("\n header checksum= "); DRW_DBGH(bufHdr.getRawLong32());
+ DRW_DBG("\n data checksum= "); DRW_DBGH(bufHdr.getRawLong32()); DRW_DBG("\n");
+
+ //get compresed data
+ duint8 *cData = new duint8[pi.cSize];
+ if (!fileBuf->setPosition(pi.address+32))
+ return false;
+ fileBuf->getBytes(cData, pi.cSize);
+
+ //calculate checksum
+ duint32 calcsD = checksum(0, cData, pi.cSize);
+ for (duint8 i= 24; i<28; ++i)
+ hdrData[i]=0;
+ duint32 calcsH = checksum(calcsD, hdrData, 32);
+ DRW_DBG("Calc header checksum= "); DRW_DBGH(calcsH);
+ DRW_DBG("\nCalc data checksum= "); DRW_DBGH(calcsD); DRW_DBG("\n");
+
+ duint8* oData = objData + pi.startOffset;
+ pi.uSize = si.maxSize;
+ DRW_DBG("decompresing "); DRW_DBG(pi.cSize); DRW_DBG(" bytes in "); DRW_DBG(pi.uSize); DRW_DBG(" bytes\n");
+ dwgCompressor comp;
+ comp.decompress18(cData, oData, pi.cSize, pi.uSize);
+ delete[]cData;
+ }
+ return true;
+}
+
+bool dwgReader18::readMetaData() {
+ version = parent->getVersion();
+ decoder.setVersion(version, false);
+ DRW_DBG("dwgReader18::readMetaData\n");
+ if (! fileBuf->setPosition(11))
+ return false;
+ maintenanceVersion = fileBuf->getRawChar8();
+ DRW_DBG("maintenance verion= "); DRW_DBGH(maintenanceVersion);
+ DRW_DBG("\nbyte at 0x0C= "); DRW_DBGH(fileBuf->getRawChar8());
+ previewImagePos = fileBuf->getRawLong32(); //+ page header size (0x20).
+ DRW_DBG("\npreviewImagePos (seekerImageData) = "); DRW_DBG(previewImagePos);
+ DRW_DBG("\napp Dwg version= "); DRW_DBGH(fileBuf->getRawChar8()); DRW_DBG(", ");
+ DRW_DBG("\napp maintenance version= "); DRW_DBGH(fileBuf->getRawChar8());
+ duint16 cp = fileBuf->getRawShort16();
+ DRW_DBG("\ncodepage= "); DRW_DBG(cp);
+ if (cp == 30)
+ decoder.setCodePage("ANSI_1252", false);
+ DRW_DBG("\n3 0x00 bytes(seems 0x00, appDwgV & appMaintV) = "); DRW_DBGH(fileBuf->getRawChar8()); DRW_DBG(", ");
+ DRW_DBGH(fileBuf->getRawChar8()); DRW_DBG(", "); DRW_DBGH(fileBuf->getRawChar8());
+ securityFlags = fileBuf->getRawLong32();
+ DRW_DBG("\nsecurity flags= "); DRW_DBG(securityFlags);
+ // UNKNOWN SECTION 4 bytes
+ duint32 uk = fileBuf->getRawLong32();
+ DRW_DBG("\nUNKNOWN SECTION ( 4 bytes) = "); DRW_DBG(uk);
+ duint32 sumInfoAddr = fileBuf->getRawLong32();
+ DRW_DBG("\nsummary Info Address= "); DRW_DBG(sumInfoAddr);
+ duint32 vbaAdd = fileBuf->getRawLong32();
+ DRW_DBG("\nVBA address= "); DRW_DBGH(vbaAdd);
+ DRW_DBG("\npos 0x28 are 0x00000080= "); DRW_DBGH(fileBuf->getRawLong32());
+ DRW_DBG("\n");
+ return true;
+}
+
+bool dwgReader18::readFileHeader() {
+
+ if (! fileBuf->setPosition(0x80))
+ return false;
+
+// genMagicNumber(); DBG("\n"); DBG("\n");
+ DRW_DBG("Encripted Header Data=\n");
+ duint8 byteStr[0x6C];
+ int size =0x6C;
+ for (int i=0, j=0; i< 0x6C;i++) {
+ duint8 ch = fileBuf->getRawChar8();
+ DRW_DBGH(ch);
+ if (j == 15) {
+ DRW_DBG("\n");
+ j = 0;
+ } else {
+ DRW_DBG(", ");
+ j++;
+ }
+ byteStr[i] = DRW_magicNum18[i] ^ ch;
+ }
+ DRW_DBG("\n");
+
+// size =0x6C;
+ DRW_DBG("Decripted Header Data=\n");
+ for (int i=0, j = 0; i< size;i++) {
+ DRW_DBGH( (unsigned char)byteStr[i]);
+ if (j == 15) {
+ DRW_DBG("\n");
+ j = 0;
+ } else {
+ DRW_DBG(", ");
+ j++;
+ }
+ }
+ dwgBuffer buff(byteStr, 0x6C, &decoder);
+ std::string name = reinterpret_cast<char*>(byteStr);
+ DRW_DBG("\nFile ID string (AcFssFcAJMB)= "); DRW_DBG(name.c_str());
+ //ID string + NULL = 12
+ buff.setPosition(12);
+ DRW_DBG("\n0x00 long= "); DRW_DBGH(buff.getRawLong32());
+ DRW_DBG("\n0x6c long= "); DRW_DBGH(buff.getRawLong32());
+ DRW_DBG("\n0x04 long= "); DRW_DBGH(buff.getRawLong32());
+ DRW_DBG("\nRoot tree node gap= "); DRW_DBGH(buff.getRawLong32());
+ DRW_DBG("\nLowermost left tree node gap= "); DRW_DBGH(buff.getRawLong32());
+ DRW_DBG("\nLowermost right tree node gap= "); DRW_DBGH(buff.getRawLong32());
+ DRW_DBG("\nUnknown long (1)= "); DRW_DBGH(buff.getRawLong32());
+ DRW_DBG("\nLast section page Id= "); DRW_DBGH(buff.getRawLong32());
+ DRW_DBG("\nLast section page end address 64b= "); DRW_DBGH(buff.getRawLong64());
+ DRW_DBG("\nStart of second header data address 64b= "); DRW_DBGH(buff.getRawLong64());
+ DRW_DBG("\nGap amount= "); DRW_DBGH(buff.getRawLong32());
+ DRW_DBG("\nSection page amount= "); DRW_DBGH(buff.getRawLong32());
+ DRW_DBG("\n0x20 long= "); DRW_DBGH(buff.getRawLong32());
+ DRW_DBG("\n0x80 long= "); DRW_DBGH(buff.getRawLong32());
+ DRW_DBG("\n0x40 long= "); DRW_DBGH(buff.getRawLong32());
+ dint32 secPageMapId = buff.getRawLong32();
+ DRW_DBG("\nSection Page Map Id= "); DRW_DBGH(secPageMapId);
+ duint64 secPageMapAddr = buff.getRawLong64()+0x100;
+ DRW_DBG("\nSection Page Map address 64b= "); DRW_DBGH(secPageMapAddr);
+ DRW_DBG("\nSection Page Map address 64b dec= "); DRW_DBG(secPageMapAddr);
+ duint32 secMapId = buff.getRawLong32();
+ DRW_DBG("\nSection Map Id= "); DRW_DBGH(secMapId);
+ DRW_DBG("\nSection page array size= "); DRW_DBGH(buff.getRawLong32());
+ DRW_DBG("\nGap array size= "); DRW_DBGH(buff.getRawLong32());
+ //TODO: verify CRC
+ DRW_DBG("\nCRC32= "); DRW_DBGH(buff.getRawLong32());
+ for (duint8 i = 0x68; i < 0x6c; ++i)
+ byteStr[i] = '\0';
+// byteStr[i] = '\0';
+ duint32 crcCalc = buff.crc32(0x00,0,0x6C);
+ DRW_DBG("\nCRC32 calculated= "); DRW_DBGH(crcCalc);
+
+ DRW_DBG("\nEnd Encrypted Data. Reads 0x14 bytes, equal to magic number:\n");
+ for (int i=0, j=0; i< 0x14;i++) {
+ DRW_DBG("magic num: "); DRW_DBGH( (unsigned char)DRW_magicNumEnd18[i]);
+ DRW_DBG(",read "); DRW_DBGH( (unsigned char)fileBuf->getRawChar8());
+ if (j == 3) {
+ DRW_DBG("\n");
+ j = 0;
+ } else {
+ DRW_DBG(", ");
+ j++;
+ }
+ }
+// At this point are parsed the first 256 bytes
+ DRW_DBG("\nJump to Section Page Map address: "); DRW_DBGH(secPageMapAddr);
+
+ if (! fileBuf->setPosition(secPageMapAddr))
+ return false;
+ duint32 pageType = fileBuf->getRawLong32();
+ DRW_DBG("\nSection page type= "); DRW_DBGH(pageType);
+ duint32 decompSize = fileBuf->getRawLong32();
+ DRW_DBG("\nDecompressed size= "); DRW_DBG(decompSize); DRW_DBG(", "); DRW_DBGH(decompSize);
+ if (pageType != 0x41630e3b){
+ //bad page type, ends
+ DRW_DBG("Warning, bad page type, was expected 0x41630e3b instead of"); DRW_DBGH(pageType); DRW_DBG("\n");
+ return false;
+ }
+ duint8 *tmpDecompSec = new duint8[decompSize];
+ parseSysPage(tmpDecompSec, decompSize);
+
+//parses "Section page map" decompresed data
+ dwgBuffer buff2(tmpDecompSec, decompSize, &decoder);
+ duint32 address = 0x100;
+ //stores temporaly info of all pages:
+ std::map<duint32, dwgPageInfo >sectionPageMapTmp;
+
+ for (unsigned int i = 0; i < decompSize;) {
+ dint32 id = buff2.getRawLong32();//RLZ bad can be +/-
+ duint32 size = buff2.getRawLong32();
+ i += 8;
+ DRW_DBG("Page num= "); DRW_DBG(id); DRW_DBG(" size= "); DRW_DBGH(size);
+ DRW_DBG(" address= "); DRW_DBGH(address); DRW_DBG("\n");
+ //TODO num can be negative indicating gap
+// duint64 ind = id > 0 ? id : -id;
+ if (id < 0){
+ DRW_DBG("Parent= "); DRW_DBG(buff2.getRawLong32());
+ DRW_DBG("\nLeft= "); DRW_DBG(buff2.getRawLong32());
+ DRW_DBG(", Right= "); DRW_DBG(buff2.getRawLong32());
+ DRW_DBG(", 0x00= ");DRW_DBGH(buff2.getRawLong32()); DRW_DBG("\n");
+ i += 16;
+ }
+
+ sectionPageMapTmp[id] = dwgPageInfo(id, address, size);
+ address += size;
+ }
+ delete[]tmpDecompSec;
+
+ DRW_DBG("\n*** dwgReader18: Processing Data Section Map ***\n");
+ dwgPageInfo sectionMap = sectionPageMapTmp[secMapId];
+ if (!fileBuf->setPosition(sectionMap.address))
+ return false;
+ pageType = fileBuf->getRawLong32();
+ DRW_DBG("\nSection page type= "); DRW_DBGH(pageType);
+ decompSize = fileBuf->getRawLong32();
+ DRW_DBG("\nDecompressed size= "); DRW_DBG(decompSize); DRW_DBG(", "); DRW_DBGH(decompSize);
+ if (pageType != 0x4163003b){
+ //bad page type, ends
+ DRW_DBG("Warning, bad page type, was expected 0x4163003b instead of"); DRW_DBGH(pageType); DRW_DBG("\n");
+ return false;
+ }
+ tmpDecompSec = new duint8[decompSize];
+ parseSysPage(tmpDecompSec, decompSize);
+
+//reads sections:
+ DRW_DBG("\n*** dwgReader18: reads sections:");
+ dwgBuffer buff3(tmpDecompSec, decompSize, &decoder);
+ duint32 numDescriptions = buff3.getRawLong32();
+ DRW_DBG("\nnumDescriptions (sections)= "); DRW_DBG(numDescriptions);
+ DRW_DBG("\n0x02 long= "); DRW_DBGH(buff3.getRawLong32());
+ DRW_DBG("\n0x00007400 long= "); DRW_DBGH(buff3.getRawLong32());
+ DRW_DBG("\n0x00 long= "); DRW_DBGH(buff3.getRawLong32());
+ DRW_DBG("\nunknown long (numDescriptions?)= "); DRW_DBG(buff3.getRawLong32()); DRW_DBG("\n");
+
+ for (unsigned int i = 0; i < numDescriptions; i++) {
+ dwgSectionInfo secInfo;
+ secInfo.size = buff3.getRawLong64();
+ DRW_DBG("\nSize of section= "); DRW_DBGH(secInfo.size);
+ secInfo.pageCount = buff3.getRawLong32();
+ DRW_DBG("\nPage count= "); DRW_DBGH(secInfo.pageCount);
+ secInfo.maxSize = buff3.getRawLong32();
+ DRW_DBG("\nMax Decompressed Size= "); DRW_DBGH(secInfo.maxSize);
+ DRW_DBG("\nunknown long= "); DRW_DBGH(buff3.getRawLong32());
+ secInfo.compresed = buff3.getRawLong32();
+ DRW_DBG("\nis Compressed? 1:no, 2:yes= "); DRW_DBGH(secInfo.compresed);
+ secInfo.Id = buff3.getRawLong32();
+ DRW_DBG("\nSection Id= "); DRW_DBGH(secInfo.Id);
+ secInfo.encrypted = buff3.getRawLong32();
+ //encrypted (doc: 0 no, 1 yes, 2 unkn) on read: objects 0 and encrypted yes
+ DRW_DBG("\nEncrypted= "); DRW_DBGH(secInfo.encrypted);
+ duint8 nameCStr[64];
+ buff3.getBytes(nameCStr, 64);
+ secInfo.name = reinterpret_cast<char*>(nameCStr);
+ DRW_DBG("\nSection std::Name= "); DRW_DBG( secInfo.name.c_str() ); DRW_DBG("\n");
+ for (unsigned int i = 0; i < secInfo.pageCount; i++){
+ duint32 pn = buff3.getRawLong32();
+ dwgPageInfo pi = sectionPageMapTmp[pn]; //get a copy
+ DRW_DBG(" reading pag num = "); DRW_DBGH(pn);
+ pi.dataSize = buff3.getRawLong32();
+ pi.startOffset = buff3.getRawLong64();
+ secInfo.pages[pn]= pi;//complete copy in secInfo
+ DRW_DBG("\n Page number= "); DRW_DBGH(secInfo.pages[pn].Id);
+ DRW_DBG("\n size in file= "); DRW_DBGH(secInfo.pages[pn].size);
+ DRW_DBG("\n address in file= "); DRW_DBGH(secInfo.pages[pn].address);
+ DRW_DBG("\n Data size= "); DRW_DBGH(secInfo.pages[pn].dataSize);
+ DRW_DBG("\n Start offset= "); DRW_DBGH(secInfo.pages[pn].startOffset); DRW_DBG("\n");
+ }
+ //do not save empty section
+ if (!secInfo.name.empty()) {
+ DRW_DBG("Saved section Name= "); DRW_DBG( secInfo.name.c_str() ); DRW_DBG("\n");
+ sections[secEnum::getEnum(secInfo.name)] = secInfo;
+ }
+ }
+ delete[]tmpDecompSec;
+
+ if (! fileBuf->isGood())
+ return false;
+ DRW_DBG("\ndwgReader18::readFileHeader END\n\n");
+ return true;
+}
+
+bool dwgReader18::readDwgHeader(DRW_Header& hdr){
+ DRW_DBG("dwgReader18::readDwgHeader\n");
+ dwgSectionInfo si = sections[secEnum::HEADER];
+ if (si.Id<0)//not found, ends
+ return false;
+ bool ret = parseDataPage(si/*, objData*/);
+ //global store for uncompressed data of all pages
+ uncompSize=si.size;
+ if (ret) {
+ dwgBuffer dataBuf(objData, si.size, &decoder);
+ DRW_DBG("Header section sentinel= ");
+ checkSentinel(&dataBuf, secEnum::HEADER, true);
+ if (version == DRW::AC1018){
+ ret = dwgReader::readDwgHeader(hdr, &dataBuf, &dataBuf);
+ } else {
+ dwgBuffer handleBuf(objData, si.size, &decoder);
+ ret = dwgReader::readDwgHeader(hdr, &dataBuf, &handleBuf);
+ }
+ }
+ //Cleanup: global store for uncompressed data of all pages
+ if (objData != NULL){
+ delete[] objData;
+ objData = NULL;
+ }
+ return ret;
+}
+
+
+bool dwgReader18::readDwgClasses(){
+ DRW_DBG("\ndwgReader18::readDwgClasses\n");
+ dwgSectionInfo si = sections[secEnum::CLASSES];
+ if (si.Id<0)//not found, ends
+ return false;
+ bool ret = parseDataPage(si/*, objData*/);
+ //global store for uncompressed data of all pages
+ uncompSize=si.size;
+ if (ret) {
+
+ dwgBuffer dataBuf(objData, uncompSize, &decoder);
+
+ DRW_DBG("classes section sentinel= ");
+ checkSentinel(&dataBuf, secEnum::CLASSES, true);
+
+ duint32 size = dataBuf.getRawLong32();
+ DRW_DBG("\ndata size in bytes "); DRW_DBG(size);
+ if (version > DRW::AC1021 && maintenanceVersion > 3) { //2010+
+ duint32 hSize = dataBuf.getRawLong32();
+ DRW_DBG("\n2010+ & MV> 3, higth 32b: "); DRW_DBG(hSize);
+ }
+ duint32 bitSize = 0;
+ if (version > DRW::AC1021) {//2007+
+ bitSize = dataBuf.getRawLong32();
+ DRW_DBG("\ntotal size in bits "); DRW_DBG(bitSize);
+}
+ duint32 maxClassNum = dataBuf.getBitShort();
+ DRW_DBG("\nMaximum class number "); DRW_DBG(maxClassNum);
+ DRW_DBG("\nRc 1 "); DRW_DBG(dataBuf.getRawChar8());
+ DRW_DBG("\nRc 2 "); DRW_DBG(dataBuf.getRawChar8());
+ DRW_DBG("\nBit "); DRW_DBG(dataBuf.getBit());
+
+ /*******************************/
+ dwgBuffer *strBuf = &dataBuf;
+ dwgBuffer strBuff(objData, uncompSize, &decoder);
+ //prepare string stream for 2007+
+ if (version > DRW::AC1021) {//2007+
+ strBuf = &strBuff;
+ duint32 strStartPos = bitSize+191;//size in bits + 24 bytes (sn+size+hSize) - 1 bit (endbit)
+ DRW_DBG("\nstrStartPos: "); DRW_DBG(strStartPos);
+ strBuff.setPosition(strStartPos >> 3);
+ strBuff.setBitPos(strStartPos & 7);
+ DRW_DBG("\nclasses strings buff.getPosition: "); DRW_DBG(strBuff.getPosition());
+ DRW_DBG("\nclasses strings buff.getBitPos: "); DRW_DBG(strBuff.getBitPos());
+ DRW_DBG("\nendBit "); DRW_DBG(strBuff.getBit());
+ strStartPos -= 16;//decrement 16 bits
+ DRW_DBG("\nstrStartPos: "); DRW_DBG(strStartPos);
+ strBuff.setPosition(strStartPos >> 3);
+ strBuff.setBitPos(strStartPos & 7);
+ DRW_DBG("\nclasses strings buff.getPosition: "); DRW_DBG(strBuff.getPosition());
+ DRW_DBG("\nclasses strings buff.getBitPos: "); DRW_DBG(strBuff.getBitPos());
+ duint32 strDataSize = strBuff.getRawShort16();
+ DRW_DBG("\nstrDataSize: "); DRW_DBG(strDataSize);
+ if (strDataSize & 0x8000) {
+ strStartPos -= 16;//decrement 16 bits
+ strDataSize &= 0x7FFF; //strip 0x8000;
+ strBuff.setPosition(strStartPos >> 3);
+ strBuff.setBitPos(strStartPos & 7);
+ duint32 hiSize = strBuff.getRawShort16();
+ strDataSize |= (hiSize << 15);
+ }
+ strStartPos -= strDataSize;
+ DRW_DBG("\nstrStartPos: "); DRW_DBG(strStartPos);
+ strBuff.setPosition(strStartPos >> 3);
+ strBuff.setBitPos(strStartPos & 7);
+ DRW_DBG("\nclasses strings buff.getPosition: "); DRW_DBG(strBuff.getPosition());
+ DRW_DBG("\nclasses strings buff.getBitPos: "); DRW_DBG(strBuff.getBitPos());
+ }
+
+ /*******************************/
+
+ duint32 endDataPos = maxClassNum-499;
+ DRW_DBG("\nbuff.getPosition: "); DRW_DBG(dataBuf.getPosition());
+ for (duint32 i= 0; i<endDataPos;i++) {
+ DRW_Class *cl = new DRW_Class();
+ cl->parseDwg(version, &dataBuf, strBuf);
+ classesmap[cl->classNum] = cl;
+ DRW_DBG("\nbuff.getPosition: "); DRW_DBG(dataBuf.getPosition());
+ }
+ DRW_DBG("\nend classes data buff.getPosition: "); DRW_DBG(dataBuf.getPosition());
+ DRW_DBG("\nend classes data buff.getBitPos: "); DRW_DBG(dataBuf.getBitPos());
+ DRW_DBG("\nend classes strings buff.getPosition: "); DRW_DBG(strBuf->getPosition());
+ DRW_DBG("\nend classes strings buff.getBitPos: "); DRW_DBG(strBuf->getBitPos());
+
+/***************/
+
+ strBuf->setPosition(strBuf->getPosition()+1);//skip remaining bits
+ DRW_DBG("\nCRC: "); DRW_DBGH(strBuf->getRawShort16());
+ if (version > DRW::AC1018){
+ DRW_DBG("\nunknown CRC: "); DRW_DBGH(strBuf->getRawShort16());
+ }
+ DRW_DBG("\nclasses section end sentinel= ");
+ checkSentinel(strBuf, secEnum::CLASSES, false);
+
+ ret = strBuf->isGood();
+ }
+ //Cleanup: global store for uncompressed data of all pages
+ if (objData != NULL){
+ delete[] objData;
+ objData = NULL;
+ }
+ return ret;
+}
+
+
+/*********** objects map ************************/
+/** Note: object map are split in sections with max size 2035?
+ * heach section are 2 bytes size + data bytes + 2 bytes crc
+ * size value are data bytes + 2 and to calculate crc are used
+ * 2 bytes size + data bytes
+ * last section are 2 bytes size + 2 bytes crc (size value always 2)
+**/
+bool dwgReader18::readDwgHandles() {
+ DRW_DBG("\ndwgReader18::readDwgHandles\n");
+ dwgSectionInfo si = sections[secEnum::HANDLES];
+ if (si.Id<0)//not found, ends
+ return false;
+ bool ret = parseDataPage(si);
+ //global store for uncompressed data of all pages
+ uncompSize=si.size;
+ if (ret) {
+
+ dwgBuffer dataBuf(objData, uncompSize, &decoder);
+
+ ret = dwgReader::readDwgHandles(&dataBuf, 0, si.size);
+ }
+ //Cleanup: global store for uncompressed data of all pages
+ if (objData != NULL){
+ delete[] objData;
+ objData = NULL;
+ uncompSize = 0;
+ }
+ return ret;
+}
+
+
+/*********** objects ************************/
+/**
+ * Reads all the object referenced in the object map section of the DWG file
+ * (using their object file offsets)
+ */
+bool dwgReader18::readDwgTables(DRW_Header& hdr) {
+ DRW_DBG("\ndwgReader18::readDwgTables\n");
+ dwgSectionInfo si = sections[secEnum::OBJECTS];
+
+ if (si.Id<0)//not found, ends
+ return false;
+ bool ret = parseDataPage(si/*, objData*/);
+ //global store for uncompressed data of all pages
+ uncompSize=si.size;
+ if (ret) {
+
+ dwgBuffer dataBuf(objData, uncompSize, &decoder);
+
+ ret = dwgReader::readDwgTables(hdr, &dataBuf);
+
+ }
+ //Do not delete objData in this point, needed in the remaining code
+ return ret;
+}
--- /dev/null
+/******************************************************************************
+** libDXFrw - Library to read/write DXF files (ascii & binary) **
+** **
+** Copyright (C) 2011-2015 José F. Soriano, rallazz@gmail.com **
+** **
+** This library is free software, licensed under the terms of the GNU **
+** General Public License as published by the Free Software Foundation, **
+** either version 2 of the License, or (at your option) any later version. **
+** You should have received a copy of the GNU General Public License **
+** along with this program. If not, see <http://www.gnu.org/licenses/>. **
+******************************************************************************/
+
+#ifndef DWGREADER18_H
+#define DWGREADER18_H
+
+#include <map>
+#include <list>
+#include "dwgreader.h"
+//#include "../drw_textcodec.h"
+#include "dwgbuffer.h"
+
+static const int DRW_magicNum18[] = {
+ 0x29, 0x23, 0xbe, 0x84, 0xe1, 0x6c, 0xd6, 0xae,
+ 0x52, 0x90, 0x49, 0xf1, 0xf1, 0xbb, 0xe9, 0xeb,
+ 0xb3, 0xa6, 0xdb, 0x3c, 0x87, 0x0c, 0x3e, 0x99,
+ 0x24, 0x5e, 0x0d, 0x1c, 0x06, 0xb7, 0x47, 0xde,
+ 0xb3, 0x12, 0x4d, 0xc8, 0x43, 0xbb, 0x8b, 0xa6,
+ 0x1f, 0x03, 0x5a, 0x7d, 0x09, 0x38, 0x25, 0x1f,
+ 0x5d, 0xd4, 0xcb, 0xfc, 0x96, 0xf5, 0x45, 0x3b,
+ 0x13, 0x0d, 0x89, 0x0a, 0x1c, 0xdb, 0xae, 0x32,
+ 0x20, 0x9a, 0x50, 0xee, 0x40, 0x78, 0x36, 0xfd,
+ 0x12, 0x49, 0x32, 0xf6, 0x9e, 0x7d, 0x49, 0xdc,
+ 0xad, 0x4f, 0x14, 0xf2, 0x44, 0x40, 0x66, 0xd0,
+ 0x6b, 0xc4, 0x30, 0xb7, 0x32, 0x3b, 0xa1, 0x22,
+ 0xf6, 0x22, 0x91, 0x9d, 0xe1, 0x8b, 0x1f, 0xda,
+ 0xb0, 0xca, 0x99, 0x02
+};
+
+static const int DRW_magicNumEnd18[] = {
+ 0xf8, 0x46, 0x6a, 0x04, 0x96, 0x73, 0x0e, 0xd9,
+ 0x16, 0x2f, 0x67, 0x68, 0xd4, 0xf7, 0x4a, 0x4a,
+ 0xd0, 0x57, 0x68, 0x76};
+
+class dwgReader18 : public dwgReader {
+public:
+ dwgReader18(std::istream *stream, dwgR *p):dwgReader(stream, p){
+ objData = NULL;
+ }
+ virtual ~dwgReader18(){
+ if (objData != NULL)
+ delete[] objData;
+ }
+ bool readMetaData();
+ bool readFileHeader();
+ bool readDwgHeader(DRW_Header& hdr);
+ bool readDwgClasses();
+ bool readDwgHandles();
+ bool readDwgTables(DRW_Header& hdr);
+ bool readDwgBlocks(DRW_Interface& intfa){
+ bool ret = true;
+ dwgBuffer dataBuf(objData, uncompSize, &decoder);
+ ret = dwgReader::readDwgBlocks(intfa, &dataBuf);
+ return ret;
+ }
+
+ virtual bool readDwgEntities(DRW_Interface& intfa){
+ bool ret = true;
+ dwgBuffer dataBuf(objData, uncompSize, &decoder);
+ ret = dwgReader::readDwgEntities(intfa, &dataBuf);
+ return ret;
+ }
+ virtual bool readDwgObjects(DRW_Interface& intfa){
+ bool ret = true;
+ dwgBuffer dataBuf(objData, uncompSize, &decoder);
+ ret = dwgReader::readDwgObjects(intfa, &dataBuf);
+ return ret;
+ }
+
+// bool readDwgEntity(objHandle& obj, DRW_Interface& intfa){
+// bool ret = true;
+// return ret;
+// }
+
+protected:
+ duint8 *objData;
+ duint64 uncompSize;
+
+private:
+ void genMagicNumber();
+// dwgBuffer* bufObj;
+ void parseSysPage(duint8 *decompSec, duint32 decompSize); //called: Section page map: 0x41630e3b
+ bool parseDataPage(dwgSectionInfo si/*, duint8 *dData*/); //called ???: Section map: 0x4163003b
+ duint32 checksum(duint32 seed, duint8* data, duint32 sz);
+
+private:
+duint32 securityFlags;
+};
+
+#endif // DWGREADER18_H
--- /dev/null
+/******************************************************************************
+** libDXFrw - Library to read/write DXF files (ascii & binary) **
+** **
+** Copyright (C) 2011-2015 José F. Soriano, rallazz@gmail.com **
+** **
+** This library is free software, licensed under the terms of the GNU **
+** General Public License as published by the Free Software Foundation, **
+** either version 2 of the License, or (at your option) any later version. **
+** You should have received a copy of the GNU General Public License **
+** along with this program. If not, see <http://www.gnu.org/licenses/>. **
+******************************************************************************/
+
+#include <cstdlib>
+#include <iostream>
+#include <fstream>
+#include <string>
+#include <sstream>
+#include "drw_dbg.h"
+#include "dwgreader21.h"
+#include "drw_textcodec.h"
+#include "../libdwgr.h"
+
+bool dwgReader21::readMetaData() {
+ version = parent->getVersion();
+ decoder.setVersion(version, false);
+ DRW_DBG("dwgReader21::readFileHeader()\n");
+ DRW_DBG("dwgReader21::parsing metadata\n");
+ if (! fileBuf->setPosition(11))
+ return false;
+ maintenanceVersion = fileBuf->getRawChar8();
+ DRW_DBG("maintenance verion= "); DRW_DBGH(maintenanceVersion);
+ DRW_DBG("\nbyte at 0x0C= "); DRW_DBG(fileBuf->getRawChar8());
+ previewImagePos = fileBuf->getRawLong32();
+ DRW_DBG("previewImagePos (seekerImageData) = "); DRW_DBG(previewImagePos);
+ DRW_DBG("\n\napp writer version= "); DRW_DBGH(fileBuf->getRawChar8());
+ DRW_DBG("\napp writer maintenance version= "); DRW_DBGH(fileBuf->getRawChar8());
+ duint16 cp = fileBuf->getRawShort16();
+ DRW_DBG("\ncodepage= "); DRW_DBG(cp);
+ if (cp == 30)
+ decoder.setCodePage("ANSI_1252", false);
+ /* UNKNOUWN SECTION 2 bytes*/
+ DRW_DBG("\nUNKNOWN SECTION= "); DRW_DBG(fileBuf->getRawShort16());
+ DRW_DBG("\nUNKNOUWN SECTION 3b= "); DRW_DBG(fileBuf->getRawChar8());
+ duint32 secType = fileBuf->getRawLong32();
+ DRW_DBG("\nsecurity type flag= "); DRW_DBGH(secType);
+ /* UNKNOWN2 SECTION 4 bytes*/
+ DRW_DBG("\nUNKNOWN SECTION 4bytes= "); DRW_DBG(fileBuf->getRawLong32());
+
+ DRW_DBG("\nSummary info address= "); DRW_DBGH(fileBuf->getRawLong32());
+ DRW_DBG("\nVBA project address= "); DRW_DBGH(fileBuf->getRawLong32());
+ DRW_DBG("\n0x00000080 32b= "); DRW_DBGH(fileBuf->getRawLong32());
+ DRW_DBG("\nApp info address= "); DRW_DBGH(fileBuf->getRawLong32());
+ //current position are 0x30 from here to 0x80 are undocumented
+ DRW_DBG("\nAnother address? = "); DRW_DBGH(fileBuf->getRawLong32());
+ return true;
+}
+
+bool dwgReader21::parseSysPage(duint64 sizeCompressed, duint64 sizeUncompressed, duint64 correctionFactor, duint64 offset, duint8 *decompData){
+ //round to 8
+ duint64 alsize = (sizeCompressed + 7) &(-8);
+ //minimum RS chunk:
+ duint32 chunks = (((alsize * correctionFactor)+238)/239);
+ duint64 fpsize = chunks * 255;
+
+ if (! fileBuf->setPosition(offset))
+ return false;
+ duint8 *tmpDataRaw = new duint8[fpsize];
+ fileBuf->getBytes(tmpDataRaw, fpsize);
+ duint8 *tmpDataRS = new duint8[fpsize];
+ dwgRSCodec::decode239I(tmpDataRaw, tmpDataRS, fpsize/255);
+ dwgCompressor::decompress21(tmpDataRS, decompData, sizeCompressed, sizeUncompressed);
+ delete[]tmpDataRaw;
+ delete[]tmpDataRS;
+ return true;
+}
+
+bool dwgReader21::parseDataPage(dwgSectionInfo si, duint8 *dData){
+ DRW_DBG("parseDataPage, section size: "); DRW_DBG(si.size);
+ for (std::map<duint32, dwgPageInfo>::iterator it=si.pages.begin(); it!=si.pages.end(); ++it){
+ dwgPageInfo pi = it->second;
+ if (!fileBuf->setPosition(pi.address))
+ return false;
+
+ duint8 *tmpPageRaw = new duint8[pi.size];
+ fileBuf->getBytes(tmpPageRaw, pi.size);
+ #ifdef DRW_DBG_DUMP
+ DRW_DBG("\nSection OBJECTS raw data=\n");
+ for (unsigned int i=0, j=0; i< pi.size;i++) {
+ DRW_DBGH( (unsigned char)tmpPageRaw[i]);
+ if (j == 7) { DRW_DBG("\n"); j = 0;
+ } else { DRW_DBG(", "); j++; }
+ } DRW_DBG("\n");
+ #endif
+
+ duint8 *tmpPageRS = new duint8[pi.size];
+ duint8 chunks =pi.size / 255;
+ dwgRSCodec::decode251I(tmpPageRaw, tmpPageRS, chunks);
+ #ifdef DRW_DBG_DUMP
+ DRW_DBG("\nSection OBJECTS RS data=\n");
+ for (unsigned int i=0, j=0; i< pi.size;i++) {
+ DRW_DBGH( (unsigned char)tmpPageRS[i]);
+ if (j == 7) { DRW_DBG("\n"); j = 0;
+ } else { DRW_DBG(", "); j++; }
+ } DRW_DBG("\n");
+ #endif
+
+ DRW_DBG("\npage uncomp size: "); DRW_DBG(pi.uSize); DRW_DBG(" comp size: "); DRW_DBG(pi.cSize);
+ DRW_DBG("\noffset: "); DRW_DBG(pi.startOffset);
+ duint8 *pageData = dData + pi.startOffset;
+ dwgCompressor::decompress21(tmpPageRS, pageData, pi.cSize, pi.uSize);
+
+ #ifdef DRW_DBG_DUMP
+ DRW_DBG("\n\nSection OBJECTS decompresed data=\n");
+ for (unsigned int i=0, j=0; i< pi.uSize;i++) {
+ DRW_DBGH( (unsigned char)pageData[i]);
+ if (j == 7) { DRW_DBG("\n"); j = 0;
+ } else { DRW_DBG(", "); j++; }
+ } DRW_DBG("\n");
+ #endif
+
+ delete[]tmpPageRaw;
+ delete[]tmpPageRS;
+ }
+ DRW_DBG("\n");
+ return true;
+}
+
+bool dwgReader21::readFileHeader() {
+
+ DRW_DBG("\n\ndwgReader21::parsing file header\n");
+ if (! fileBuf->setPosition(0x80))
+ return false;
+ duint8 fileHdrRaw[0x2FD];//0x3D8
+ fileBuf->getBytes(fileHdrRaw, 0x2FD);
+ duint8 fileHdrdRS[0x2CD];
+ dwgRSCodec::decode239I(fileHdrRaw, fileHdrdRS, 3);
+
+#ifdef DRW_DBG_DUMP
+ DRW_DBG("\ndwgReader21::parsed Reed Solomon decode:\n");
+ int j = 0;
+ for (int i=0, j=0; i<0x2CD; i++){
+ DRW_DBGH( (unsigned char)fileHdrdRS[i]);
+ if (j== 15){ j=0; DRW_DBG("\n");
+ } else{ j++; DRW_DBG(", "); }
+ } DRW_DBG("\n");
+#endif
+
+ dwgBuffer fileHdrBuf(fileHdrdRS, 0x2CD, &decoder);
+ DRW_DBG("\nCRC 64b= "); DRW_DBGH(fileHdrBuf.getRawLong64());
+ DRW_DBG("\nunknown key 64b= "); DRW_DBGH(fileHdrBuf.getRawLong64());
+ DRW_DBG("\ncomp data CRC 64b= "); DRW_DBGH(fileHdrBuf.getRawLong64());
+ dint32 fileHdrCompLength = fileHdrBuf.getRawLong32();
+ DRW_DBG("\ncompr len 4bytes= "); DRW_DBG(fileHdrCompLength);
+ dint32 fileHdrCompLength2 = fileHdrBuf.getRawLong32();
+ DRW_DBG("\nlength2 4bytes= "); DRW_DBG(fileHdrCompLength2);
+
+ int fileHdrDataLength = 0x110;
+ duint8 *fileHdrData;
+ if (fileHdrCompLength < 0) {
+ fileHdrDataLength = fileHdrCompLength * -1;
+ fileHdrData = new duint8[fileHdrDataLength];
+ fileHdrBuf.getBytes(fileHdrData, fileHdrDataLength);
+ }else {
+ DRW_DBG("\ndwgReader21:: file header are compresed:\n");
+ duint8 *compByteStr = new duint8[fileHdrCompLength];
+ fileHdrBuf.getBytes(compByteStr, fileHdrCompLength);
+ fileHdrData = new duint8[fileHdrDataLength];
+ dwgCompressor::decompress21(compByteStr, fileHdrData, fileHdrCompLength, fileHdrDataLength);
+ delete[] compByteStr;
+ }
+
+#ifdef DRW_DBG_DUMP
+ DRW_DBG("\ndwgReader21::parsed file header:\n");
+ for (int i=0, j=0; i<fileHdrDataLength; i++){
+ DRW_DBGH( (unsigned char)fileHdrData[i]);
+ if (j== 15){ j=0; DRW_DBG("\n");
+ } else{ j++; DRW_DBG(", "); }
+ } DRW_DBG("\n");
+#endif
+
+ dwgBuffer fileHdrDataBuf(fileHdrData, fileHdrDataLength, &decoder);
+ DRW_DBG("\nHeader size = "); DRW_DBGH(fileHdrDataBuf.getRawLong64());
+ DRW_DBG("\nFile size = "); DRW_DBGH(fileHdrDataBuf.getRawLong64());
+ DRW_DBG("\nPagesMapCrcCompressed = "); DRW_DBGH(fileHdrDataBuf.getRawLong64());
+ duint64 PagesMapCorrectionFactor = fileHdrDataBuf.getRawLong64();
+ DRW_DBG("\nPagesMapCorrectionFactor = "); DRW_DBG(PagesMapCorrectionFactor);
+ DRW_DBG("\nPagesMapCrcSeed = "); DRW_DBGH(fileHdrDataBuf.getRawLong64());
+ DRW_DBG("\nPages map2offset = "); DRW_DBGH(fileHdrDataBuf.getRawLong64()); //relative to data page map 1, add 0x480 to get stream position
+ DRW_DBG("\nPages map2Id = "); DRW_DBG(fileHdrDataBuf.getRawLong64());
+ duint64 PagesMapOffset = fileHdrDataBuf.getRawLong64();
+ DRW_DBG("\nPagesMapOffset = "); DRW_DBGH(PagesMapOffset); //relative to data page map 1, add 0x480 to get stream position
+ DRW_DBG("\nPagesMapId = "); DRW_DBG(fileHdrDataBuf.getRawLong64());
+ DRW_DBG("\nHeader2offset = "); DRW_DBGH(fileHdrDataBuf.getRawLong64()); //relative to data page map 1, add 0x480 to get stream position
+ duint64 PagesMapSizeCompressed = fileHdrDataBuf.getRawLong64();
+ DRW_DBG("\nPagesMapSizeCompressed = "); DRW_DBG(PagesMapSizeCompressed);
+ duint64 PagesMapSizeUncompressed = fileHdrDataBuf.getRawLong64();
+ DRW_DBG("\nPagesMapSizeUncompressed = "); DRW_DBG(PagesMapSizeUncompressed);
+ DRW_DBG("\nPagesAmount = "); DRW_DBGH(fileHdrDataBuf.getRawLong64());
+ duint64 PagesMaxId = fileHdrDataBuf.getRawLong64();
+ DRW_DBG("\nPagesMaxId = "); DRW_DBG(PagesMaxId);
+ DRW_DBG("\nUnknown (normally 0x20) = "); DRW_DBGH(fileHdrDataBuf.getRawLong64());
+ DRW_DBG("\nUnknown (normally 0x40) = "); DRW_DBGH(fileHdrDataBuf.getRawLong64());
+ DRW_DBG("\nPagesMapCrcUncompressed = "); DRW_DBGH(fileHdrDataBuf.getRawLong64());
+ DRW_DBG("\nUnknown (normally 0xf800) = "); DRW_DBGH(fileHdrDataBuf.getRawLong64());
+ DRW_DBG("\nUnknown (normally 4) = "); DRW_DBGH(fileHdrDataBuf.getRawLong64());
+ DRW_DBG("\nUnknown (normally 1) = "); DRW_DBGH(fileHdrDataBuf.getRawLong64());
+ DRW_DBG("\nSectionsAmount (number of sections + 1) = "); DRW_DBGH(fileHdrDataBuf.getRawLong64());
+ DRW_DBG("\nSectionsMapCrcUncompressed = "); DRW_DBGH(fileHdrDataBuf.getRawLong64());
+ duint64 SectionsMapSizeCompressed = fileHdrDataBuf.getRawLong64();
+ DRW_DBG("\nSectionsMapSizeCompressed = "); DRW_DBGH(SectionsMapSizeCompressed);
+ DRW_DBG("\nSectionsMap2Id = "); DRW_DBG(fileHdrDataBuf.getRawLong64());
+ duint64 SectionsMapId = fileHdrDataBuf.getRawLong64();
+ DRW_DBG("\nSectionsMapId = "); DRW_DBG(SectionsMapId);
+ duint64 SectionsMapSizeUncompressed = fileHdrDataBuf.getRawLong64();
+ DRW_DBG("\nSectionsMapSizeUncompressed = "); DRW_DBGH(SectionsMapSizeUncompressed);
+ DRW_DBG("\nSectionsMapCrcCompressed = "); DRW_DBGH(fileHdrDataBuf.getRawLong64());
+ duint64 SectionsMapCorrectionFactor = fileHdrDataBuf.getRawLong64();
+ DRW_DBG("\nSectionsMapCorrectionFactor = "); DRW_DBG(SectionsMapCorrectionFactor);
+ DRW_DBG("\nSectionsMapCrcSeed = "); DRW_DBGH(fileHdrDataBuf.getRawLong64());
+ DRW_DBG("\nStreamVersion (normally 0x60100) = "); DRW_DBGH(fileHdrDataBuf.getRawLong64());
+ DRW_DBG("\nCrcSeed = "); DRW_DBGH(fileHdrDataBuf.getRawLong64());
+ DRW_DBG("\nCrcSeedEncoded = "); DRW_DBGH(fileHdrDataBuf.getRawLong64());
+ DRW_DBG("\nRandomSeed = "); DRW_DBGH(fileHdrDataBuf.getRawLong64());
+ DRW_DBG("\nHeader CRC64 = "); DRW_DBGH(fileHdrDataBuf.getRawLong64()); DRW_DBG("\n");
+
+ delete[] fileHdrData;
+
+ DRW_DBG("\ndwgReader21::parse page map:\n");
+ duint8 *PagesMapData = new duint8[PagesMapSizeUncompressed];
+
+ bool ret = parseSysPage(PagesMapSizeCompressed, PagesMapSizeUncompressed, PagesMapCorrectionFactor, 0x480+PagesMapOffset, PagesMapData);
+ if (!ret) {
+ delete[]PagesMapData;
+ return false;
+ }
+
+ duint64 address = 0x480;
+ duint64 i = 0;
+ dwgBuffer PagesMapBuf(PagesMapData, PagesMapSizeUncompressed, &decoder);
+ //stores temporaly info of all pages:
+ std::map<duint32, dwgPageInfo >sectionPageMapTmp;
+
+// dwgPageInfo *m_pages= new dwgPageInfo[PagesMaxId+1];
+ while (PagesMapSizeUncompressed > i ) {
+ duint64 size = PagesMapBuf.getRawLong64();
+ dint64 id = PagesMapBuf.getRawLong64();
+ duint64 ind = id > 0 ? id : -id;
+ i += 16;
+
+ DRW_DBG("Page gap= "); DRW_DBG(id); DRW_DBG(" Page num= "); DRW_DBG(ind); DRW_DBG(" size= "); DRW_DBGH(size);
+ DRW_DBG(" address= "); DRW_DBGH(address); DRW_DBG("\n");
+ sectionPageMapTmp[ind] = dwgPageInfo(ind, address,size);
+ address += size;
+ //TODO num can be negative indicating gap
+// seek += offset;
+ }
+ delete[]PagesMapData;
+
+ DRW_DBG("\n*** dwgReader21: Processing Section Map ***\n");
+ duint8 *SectionsMapData = new duint8[SectionsMapSizeUncompressed];
+ dwgPageInfo sectionMap = sectionPageMapTmp[SectionsMapId];
+ ret = parseSysPage(SectionsMapSizeCompressed, SectionsMapSizeUncompressed, SectionsMapCorrectionFactor, sectionMap.address, SectionsMapData);
+ if (!ret)
+ return false;
+
+//reads sections:
+ //Note: compressed value are not stored in file then, commpresed field are use to store
+ // encoding value
+ dwgBuffer SectionsMapBuf(SectionsMapData, SectionsMapSizeUncompressed, &decoder);
+ duint8 nextId =1;
+ while(SectionsMapBuf.getPosition() < SectionsMapBuf.size()){
+ dwgSectionInfo secInfo;
+ secInfo.size = SectionsMapBuf.getRawLong64();
+ DRW_DBG("\nSize of section (data size)= "); DRW_DBGH(secInfo.size);
+ secInfo.maxSize = SectionsMapBuf.getRawLong64();
+ DRW_DBG("\nMax Decompressed Size= "); DRW_DBGH(secInfo.maxSize);
+ secInfo.encrypted = SectionsMapBuf.getRawLong64();
+ //encrypted (doc: 0 no, 1 yes, 2 unkn) on read: objects 0 and encrypted yes
+ DRW_DBG("\nencription= "); DRW_DBGH(secInfo.encrypted);
+ DRW_DBG("\nHashCode = "); DRW_DBGH(SectionsMapBuf.getRawLong64());
+ duint64 SectionNameLength = SectionsMapBuf.getRawLong64();
+ DRW_DBG("\nSectionNameLength = "); DRW_DBG(SectionNameLength);
+ DRW_DBG("\nUnknown = "); DRW_DBGH(SectionsMapBuf.getRawLong64());
+ secInfo.compresed = SectionsMapBuf.getRawLong64();
+ DRW_DBG("\nEncoding (compresed) = "); DRW_DBGH(secInfo.compresed);
+ secInfo.pageCount = SectionsMapBuf.getRawLong64();
+ DRW_DBG("\nPage count= "); DRW_DBGH(secInfo.pageCount);
+ secInfo.name = SectionsMapBuf.getUCSStr(SectionNameLength);
+ DRW_DBG("\nSection name = "); DRW_DBG(secInfo.name); DRW_DBG("\n");
+
+ for (unsigned int i=0; i< secInfo.pageCount; i++){
+ duint64 po = SectionsMapBuf.getRawLong64();
+ duint32 ds = SectionsMapBuf.getRawLong64();
+ duint32 pn = SectionsMapBuf.getRawLong64();
+ DRW_DBG(" pag Id = "); DRW_DBGH(pn); DRW_DBG(" data size = "); DRW_DBGH(ds);
+ dwgPageInfo pi = sectionPageMapTmp[pn]; //get a copy
+ pi.dataSize = ds;
+ pi.startOffset = po;
+ pi.uSize = SectionsMapBuf.getRawLong64();
+ pi.cSize = SectionsMapBuf.getRawLong64();
+ secInfo.pages[pn]= pi;//complete copy in secInfo
+ DRW_DBG("\n Page number= "); DRW_DBGH(secInfo.pages[pn].Id);
+ DRW_DBG("\n address in file= "); DRW_DBGH(secInfo.pages[pn].address);
+ DRW_DBG("\n size in file= "); DRW_DBGH(secInfo.pages[pn].size);
+ DRW_DBG("\n Data size= "); DRW_DBGH(secInfo.pages[pn].dataSize);
+ DRW_DBG("\n Start offset= "); DRW_DBGH(secInfo.pages[pn].startOffset);
+ DRW_DBG("\n Page uncompressed size = "); DRW_DBGH(secInfo.pages[pn].uSize);
+ DRW_DBG("\n Page compressed size = "); DRW_DBGH(secInfo.pages[pn].cSize);
+
+ DRW_DBG("\n Page checksum = "); DRW_DBGH(SectionsMapBuf.getRawLong64());
+ DRW_DBG("\n Page CRC = "); DRW_DBGH(SectionsMapBuf.getRawLong64()); DRW_DBG("\n");
+ }
+
+ if (!secInfo.name.empty()) {
+ secInfo.Id = nextId++;
+ DRW_DBG("Saved section Name= "); DRW_DBG( secInfo.name.c_str() ); DRW_DBG("\n");
+ sections[secEnum::getEnum(secInfo.name)] = secInfo;
+ }
+ }
+ delete[]SectionsMapData;
+
+ if (! fileBuf->isGood())
+ return false;
+
+ DRW_DBG("\ndwgReader21::readFileHeader END\n");
+ return true;
+}
+
+bool dwgReader21::readDwgHeader(DRW_Header& hdr){
+ DRW_DBG("\ndwgReader21::readDwgHeader\n");
+ dwgSectionInfo si = sections[secEnum::HEADER];
+ if (si.Id<0)//not found, ends
+ return false;
+ DRW_DBG("\nprepare section of size "); DRW_DBG(si.size);DRW_DBG("\n");
+ duint8 *tmpHeaderData = new duint8[si.size];
+ bool ret = dwgReader21::parseDataPage(si, tmpHeaderData);
+ if (!ret) {
+ delete[]tmpHeaderData;
+ return ret;
+ }
+
+ dwgBuffer dataBuf(tmpHeaderData, si.size, &decoder);
+ dwgBuffer handleBuf(tmpHeaderData, si.size, &decoder);
+ DRW_DBG("Header section sentinel= ");
+ checkSentinel(&dataBuf, secEnum::HEADER, true);
+ ret = dwgReader::readDwgHeader(hdr, &dataBuf, &handleBuf);
+ delete[]tmpHeaderData;
+ return ret;
+}
+
+bool dwgReader21::readDwgClasses(){
+ DRW_DBG("\ndwgReader21::readDwgClasses");
+ dwgSectionInfo si = sections[secEnum::CLASSES];
+ if (si.Id<0)//not found, ends
+ return false;
+
+ DRW_DBG("\nprepare section of size "); DRW_DBG(si.size);DRW_DBG("\n");
+ duint8 *tmpClassesData = new duint8[si.size];
+ bool ret = dwgReader21::parseDataPage(si, tmpClassesData);
+ if (!ret)
+ return ret;
+
+ dwgBuffer buff(tmpClassesData, si.size, &decoder);
+ DRW_DBG("classes section sentinel= ");
+ checkSentinel(&buff, secEnum::CLASSES, true);
+
+ duint32 size = buff.getRawLong32();
+ DRW_DBG("\ndata size in bytes "); DRW_DBG(size);
+
+ duint32 bitSize = buff.getRawLong32();
+ DRW_DBG("\ntotal size in bits "); DRW_DBG(bitSize);
+
+ duint32 maxClassNum = buff.getBitShort();
+ DRW_DBG("\nMaximum class number "); DRW_DBG(maxClassNum);
+ DRW_DBG("\nRc 1 "); DRW_DBG(buff.getRawChar8());
+ DRW_DBG("\nRc 2 "); DRW_DBG(buff.getRawChar8());
+ DRW_DBG("\nBit "); DRW_DBG(buff.getBit());
+
+ /*******************************/
+ //prepare string stream
+ dwgBuffer strBuff(tmpClassesData, si.size, &decoder);
+ duint32 strStartPos = bitSize + 159;//size in bits + 20 bytes (sn+size) - 1 bit (endbit)
+ DRW_DBG("\nstrStartPos: "); DRW_DBG(strStartPos);
+ strBuff.setPosition(strStartPos >> 3);
+ strBuff.setBitPos(strStartPos & 7);
+ DRW_DBG("\nclasses strings buff.getPosition: "); DRW_DBG(strBuff.getPosition());
+ DRW_DBG("\nclasses strings buff.getBitPos: "); DRW_DBG(strBuff.getBitPos());
+ DRW_DBG("\nendBit "); DRW_DBG(strBuff.getBit());
+ strStartPos -= 16;//decrement 16 bits
+ DRW_DBG("\nstrStartPos: "); DRW_DBG(strStartPos);
+ strBuff.setPosition(strStartPos >> 3);
+ strBuff.setBitPos(strStartPos & 7);
+ DRW_DBG("\nclasses strings buff.getPosition: "); DRW_DBG(strBuff.getPosition());
+ DRW_DBG("\nclasses strings buff.getBitPos: "); DRW_DBG(strBuff.getBitPos());
+ duint32 strDataSize = strBuff.getRawShort16();
+ DRW_DBG("\nstrDataSize: "); DRW_DBG(strDataSize);
+ if (strDataSize & 0x8000) {
+ strStartPos -= 16;//decrement 16 bits
+ strDataSize &= 0x7FFF; //strip 0x8000;
+ strBuff.setPosition(strStartPos >> 3);
+ strBuff.setBitPos(strStartPos & 7);
+ duint32 hiSize = strBuff.getRawShort16();
+ strDataSize |= (hiSize << 15);
+ }
+ strStartPos -= strDataSize;
+ DRW_DBG("\nstrStartPos: "); DRW_DBG(strStartPos);
+ strBuff.setPosition(strStartPos >> 3);
+ strBuff.setBitPos(strStartPos & 7);
+ DRW_DBG("\nclasses strings buff.getPosition: "); DRW_DBG(strBuff.getPosition());
+ DRW_DBG("\nclasses strings buff.getBitPos: "); DRW_DBG(strBuff.getBitPos());
+
+
+ /*******************************/
+
+ duint32 endDataPos = maxClassNum-499;
+ DRW_DBG("\nbuff.getPosition: "); DRW_DBG(buff.getPosition());
+ for (duint32 i= 0; i<endDataPos;i++) {
+ DRW_Class *cl = new DRW_Class();
+ cl->parseDwg(version, &buff, &strBuff);
+ classesmap[cl->classNum] = cl;
+ DRW_DBG("\nbuff.getPosition: "); DRW_DBG(buff.getPosition());
+ }
+ DRW_DBG("\nend classes data buff.getPosition: "); DRW_DBG(buff.getPosition());
+ DRW_DBG("\nend classes data buff.getBitPos: "); DRW_DBG(buff.getBitPos());
+
+ buff.setPosition(size+20);//sizeVal+sn+32bSize
+ DRW_DBG("\nCRC: "); DRW_DBGH(buff.getRawShort16());
+ DRW_DBG("\nclasses section end sentinel= ");
+ checkSentinel(&buff, secEnum::CLASSES, true);
+ delete[]tmpClassesData;
+ return buff.isGood();
+}
+
+
+bool dwgReader21::readDwgHandles(){
+ DRW_DBG("\ndwgReader21::readDwgHandles");
+ dwgSectionInfo si = sections[secEnum::HANDLES];
+ if (si.Id<0)//not found, ends
+ return false;
+
+ DRW_DBG("\nprepare section of size "); DRW_DBG(si.size);DRW_DBG("\n");
+ duint8 *tmpHandlesData = new duint8[si.size];
+ bool ret = dwgReader21::parseDataPage(si, tmpHandlesData);
+ if (!ret)
+ return ret;
+
+ dwgBuffer dataBuf(tmpHandlesData, si.size, &decoder);
+
+ ret = dwgReader::readDwgHandles(&dataBuf, 0, si.size);
+ delete[]tmpHandlesData;
+ return ret;
+}
+
+/*********** objects ************************/
+/**
+ * Reads all the object referenced in the object map section of the DWG file
+ * (using their object file offsets)
+ */
+bool dwgReader21::readDwgTables(DRW_Header& hdr) {
+ DRW_DBG("\ndwgReader21::readDwgTables\n");
+ dwgSectionInfo si = sections[secEnum::OBJECTS];
+ if (si.Id<0)//not found, ends
+ return false;
+
+ DRW_DBG("\nprepare section of size "); DRW_DBG(si.size);DRW_DBG("\n");
+ dataSize = si.size;
+ objData = new duint8 [dataSize];
+ bool ret = dwgReader21::parseDataPage(si, objData);
+ if (!ret)
+ return ret;
+
+ DRW_DBG("readDwgTables total data size= "); DRW_DBG(dataSize); DRW_DBG("\n");
+ dwgBuffer dataBuf(objData, dataSize, &decoder);
+ ret = dwgReader::readDwgTables(hdr, &dataBuf);
+
+ return ret;
+}
+
+
+bool dwgReader21::readDwgBlocks(DRW_Interface& intfa){
+ bool ret = true;
+ dwgBuffer dataBuf(objData, dataSize, &decoder);
+ ret = dwgReader::readDwgBlocks(intfa, &dataBuf);
+ return ret;
+
+ return false;
+}
--- /dev/null
+/******************************************************************************
+** libDXFrw - Library to read/write DXF files (ascii & binary) **
+** **
+** Copyright (C) 2011-2015 José F. Soriano, rallazz@gmail.com **
+** **
+** This library is free software, licensed under the terms of the GNU **
+** General Public License as published by the Free Software Foundation, **
+** either version 2 of the License, or (at your option) any later version. **
+** You should have received a copy of the GNU General Public License **
+** along with this program. If not, see <http://www.gnu.org/licenses/>. **
+******************************************************************************/
+
+#ifndef DWGREADER21_H
+#define DWGREADER21_H
+
+#include <map>
+#include <list>
+#include "drw_textcodec.h"
+#include "dwgbuffer.h"
+#include "dwgreader.h"
+
+//reader for AC1021 aka v2007, chapter 5
+class dwgReader21 : public dwgReader {
+public:
+ dwgReader21(std::istream *stream, dwgR *p):dwgReader(stream, p){
+ objData = NULL;
+ dataSize = 0;
+ }
+ virtual ~dwgReader21(){
+ if (objData != NULL)
+ delete[] objData;
+ }
+ bool readMetaData();
+ bool readFileHeader();
+ bool readDwgHeader(DRW_Header& hdr);
+ bool readDwgClasses();
+ bool readDwgHandles();
+ bool readDwgTables(DRW_Header& hdr);
+ bool readDwgBlocks(DRW_Interface& intfa);
+ virtual bool readDwgEntities(DRW_Interface& intfa){
+ bool ret = true;
+ dwgBuffer dataBuf(objData, dataSize, &decoder);
+ ret = dwgReader::readDwgEntities(intfa, &dataBuf);
+ return ret;
+ }
+ virtual bool readDwgObjects(DRW_Interface& intfa){
+ bool ret = true;
+ dwgBuffer dataBuf(objData, dataSize, &decoder);
+ ret = dwgReader::readDwgObjects(intfa, &dataBuf);
+ return ret;
+ }
+//bool readDwgEntity(objHandle& obj, DRW_Interface& intfa){
+// return false;
+//}
+
+private:
+ bool parseSysPage(duint64 sizeCompressed, duint64 sizeUncompressed, duint64 correctionFactor, duint64 offset, duint8 *decompData);
+ bool parseDataPage(dwgSectionInfo si, duint8 *dData);
+
+ duint8 *objData;
+ duint64 dataSize;
+
+};
+
+#endif // DWGREADER21_H
--- /dev/null
+/******************************************************************************
+** libDXFrw - Library to read/write DXF files (ascii & binary) **
+** **
+** Copyright (C) 2011-2015 José F. Soriano, rallazz@gmail.com **
+** **
+** This library is free software, licensed under the terms of the GNU **
+** General Public License as published by the Free Software Foundation, **
+** either version 2 of the License, or (at your option) any later version. **
+** You should have received a copy of the GNU General Public License **
+** along with this program. If not, see <http://www.gnu.org/licenses/>. **
+******************************************************************************/
+
+#include <cstdlib>
+#include <iostream>
+#include <fstream>
+#include <string>
+#include <sstream>
+#include "drw_dbg.h"
+#include "dwgreader24.h"
+#include "drw_textcodec.h"
+#include "../libdwgr.h"
+
+
+bool dwgReader24::readFileHeader() {
+ DRW_DBG("dwgReader24::readFileHeader\n");
+ bool ret = dwgReader18::readFileHeader();
+ DRW_DBG("dwgReader24::readFileHeader END\n");
+ return ret;
+}
+
+bool dwgReader24::readDwgHeader(DRW_Header& hdr){
+ DRW_DBG("dwgReader24::readDwgHeader\n");
+ bool ret = dwgReader18::readDwgHeader(hdr);
+ DRW_DBG("dwgReader24::readDwgHeader END\n");
+ return ret;
+}
+
+bool dwgReader24::readDwgClasses(){
+ DRW_DBG("\ndwgReader24::readDwgClasses");
+ bool ret = dwgReader18::readDwgClasses();
+ DRW_DBG("\ndwgReader24::readDwgClasses END\n");
+ return ret;
+}
--- /dev/null
+/******************************************************************************
+** libDXFrw - Library to read/write DXF files (ascii & binary) **
+** **
+** Copyright (C) 2011-2015 José F. Soriano, rallazz@gmail.com **
+** **
+** This library is free software, licensed under the terms of the GNU **
+** General Public License as published by the Free Software Foundation, **
+** either version 2 of the License, or (at your option) any later version. **
+** You should have received a copy of the GNU General Public License **
+** along with this program. If not, see <http://www.gnu.org/licenses/>. **
+******************************************************************************/
+
+#ifndef DWGREADER24_H
+#define DWGREADER24_H
+
+#include <map>
+#include <list>
+#include "drw_textcodec.h"
+#include "dwgbuffer.h"
+#include "dwgreader18.h"
+
+class dwgReader24 : public dwgReader18 {
+public:
+ dwgReader24(std::istream *stream, dwgR *p):dwgReader18(stream, p){ }
+ virtual ~dwgReader24(){}
+ bool readFileHeader();
+ bool readDwgHeader(DRW_Header& hdr);
+ bool readDwgClasses();
+// bool readDwgHandles(){return false;}
+// bool readDwgTables(){return false;}
+ bool readDwgBlocks(DRW_Interface& intfa){
+ bool ret = true;
+ dwgBuffer dataBuf(objData, uncompSize, &decoder);
+ ret = dwgReader::readDwgBlocks(intfa, &dataBuf);
+ return ret;
+ }
+ virtual bool readDwgEntities(DRW_Interface& intfa){
+ bool ret = true;
+ dwgBuffer dataBuf(objData, uncompSize, &decoder);
+ ret = dwgReader::readDwgEntities(intfa, &dataBuf);
+ return ret;
+ }
+ virtual bool readDwgObjects(DRW_Interface& intfa){
+ bool ret = true;
+ dwgBuffer dataBuf(objData, uncompSize, &decoder);
+ ret = dwgReader::readDwgObjects(intfa, &dataBuf);
+ return ret;
+ }
+
+// bool readDwgEntity(objHandle& obj, DRW_Interface& intfa){
+// DRW_UNUSED(obj);
+// DRW_UNUSED(intfa);
+// return false;}
+};
+
+#endif // DWGREADER24_H
--- /dev/null
+/******************************************************************************
+** libDXFrw - Library to read/write DXF files (ascii & binary) **
+** **
+** Copyright (C) 2011-2015 José F. Soriano, rallazz@gmail.com **
+** **
+** This library is free software, licensed under the terms of the GNU **
+** General Public License as published by the Free Software Foundation, **
+** either version 2 of the License, or (at your option) any later version. **
+** You should have received a copy of the GNU General Public License **
+** along with this program. If not, see <http://www.gnu.org/licenses/>. **
+******************************************************************************/
+
+#include <cstdlib>
+#include <iostream>
+#include <fstream>
+#include <string>
+#include <sstream>
+#include "drw_dbg.h"
+#include "dwgreader27.h"
+#include "drw_textcodec.h"
+#include "../libdwgr.h"
+
+
+bool dwgReader27::readFileHeader() {
+ DRW_DBG("dwgReader27::readFileHeader\n");
+ bool ret = dwgReader18::readFileHeader();
+ DRW_DBG("dwgReader27::readFileHeader END\n");
+ return ret;
+}
+
+bool dwgReader27::readDwgHeader(DRW_Header& hdr){
+ DRW_DBG("dwgReader27::readDwgHeader\n");
+ bool ret = dwgReader18::readDwgHeader(hdr);
+ DRW_DBG("dwgReader27::readDwgHeader END\n");
+ return ret;
+}
+
+bool dwgReader27::readDwgClasses(){
+ DRW_DBG("dwgReader27::readDwgClasses");
+ bool ret = dwgReader18::readDwgClasses();
+ DRW_DBG("\ndwgReader27::readDwgClasses END\n");
+ return ret;
+}
--- /dev/null
+/******************************************************************************
+** libDXFrw - Library to read/write DXF files (ascii & binary) **
+** **
+** Copyright (C) 2011-2015 José F. Soriano, rallazz@gmail.com **
+** **
+** This library is free software, licensed under the terms of the GNU **
+** General Public License as published by the Free Software Foundation, **
+** either version 2 of the License, or (at your option) any later version. **
+** You should have received a copy of the GNU General Public License **
+** along with this program. If not, see <http://www.gnu.org/licenses/>. **
+******************************************************************************/
+
+#ifndef DWGREADER27_H
+#define DWGREADER27_H
+
+#include <map>
+#include <list>
+#include "drw_textcodec.h"
+#include "dwgbuffer.h"
+#include "dwgreader18.h"
+
+class dwgReader27 : public dwgReader18 {
+public:
+ dwgReader27(std::istream *stream, dwgR *p):dwgReader18(stream, p){ }
+ virtual ~dwgReader27(){}
+ bool readFileHeader();
+ bool readDwgHeader(DRW_Header& hdr);
+ bool readDwgClasses();
+// bool readDwgHandles(){return false;}
+// bool readDwgTables(){return false;}
+ bool readDwgBlocks(DRW_Interface& intfa){
+ bool ret = true;
+ dwgBuffer dataBuf(objData, uncompSize, &decoder);
+ ret = dwgReader::readDwgBlocks(intfa, &dataBuf);
+ return ret;
+ }
+ virtual bool readDwgEntities(DRW_Interface& intfa){
+ bool ret = true;
+ dwgBuffer dataBuf(objData, uncompSize, &decoder);
+ ret = dwgReader::readDwgEntities(intfa, &dataBuf);
+ return ret;
+ }
+ virtual bool readDwgObjects(DRW_Interface& intfa){
+ bool ret = true;
+ dwgBuffer dataBuf(objData, uncompSize, &decoder);
+ ret = dwgReader::readDwgObjects(intfa, &dataBuf);
+ return ret;
+ }
+// bool readDwgEntity(objHandle& obj, DRW_Interface& intfa){
+// DRW_UNUSED(obj);
+// DRW_UNUSED(intfa);
+// return false;}
+};
+
+#endif // DWGREADER21_H
--- /dev/null
+/******************************************************************************
+** libDXFrw - Library to read/write DXF files (ascii & binary) **
+** **
+** Copyright (C) 2011-2015 José F. Soriano, rallazz@gmail.com **
+** **
+** This library is free software, licensed under the terms of the GNU **
+** General Public License as published by the Free Software Foundation, **
+** either version 2 of the License, or (at your option) any later version. **
+** You should have received a copy of the GNU General Public License **
+** along with this program. If not, see <http://www.gnu.org/licenses/>. **
+******************************************************************************/
+
+#include <sstream>
+#include "drw_dbg.h"
+#include "dwgutil.h"
+#include "rscodec.h"
+#include "../libdwgr.h"
+
+/** utility function
+ * convert a int to string in hex
+ **/
+namespace DRW {
+std::string toHexStr(int n){
+#if defined(__APPLE__)
+ char buffer[9]= {'\0'};
+ snprintf(buffer,9, "%X", n);
+ return std::string(buffer);
+#else
+ std::ostringstream Convert;
+ Convert << std::uppercase << std::hex << n;
+ return Convert.str();
+#endif
+}
+}
+
+/**
+ * @brief dwgRSCodec::decode239I
+ * @param in : input data (at least 255*blk bytes)
+ * @param out : output data (at least 239*blk bytes)
+ * @param blk number of codewords ( 1 cw == 255 bytes)
+ */
+void dwgRSCodec::decode239I(unsigned char *in, unsigned char *out, duint32 blk){
+ int k=0;
+ unsigned char data[255];
+ RScodec rsc(0x96, 8, 8); //(255, 239)
+ for (duint32 i=0; i<blk; i++){
+ k = i;
+ for (int j=0; j<255; j++) {
+ data[j] = in[k];
+ k +=blk;
+ }
+ int r = rsc.decode(data);
+ if (r<0)
+ DRW_DBG("\nWARNING: dwgRSCodec::decode239I, can't correct all errors");
+ k = i*239;
+ for (int j=0; j<239; j++) {
+ out[k++] = data[j];
+ }
+ }
+}
+
+/**
+ * @brief dwgRSCodec::decode251I
+ * @param in : input data (at least 255*blk bytes)
+ * @param out : output data (at least 251*blk bytes)
+ * @param blk number of codewords ( 1 cw == 255 bytes)
+ */
+void dwgRSCodec::decode251I(unsigned char *in, unsigned char *out, duint32 blk){
+ int k=0;
+ unsigned char data[255];
+ RScodec rsc(0xB8, 8, 2); //(255, 251)
+ for (duint32 i=0; i<blk; i++){
+ k = i;
+ for (int j=0; j<255; j++) {
+ data[j] = in[k];
+ k +=blk;
+ }
+ int r = rsc.decode(data);
+ if (r<0)
+ DRW_DBG("\nWARNING: dwgRSCodec::decode251I, can't correct all errors");
+ k = i*251;
+ for (int j=0; j<251; j++) {
+ out[k++] = data[j];
+ }
+ }
+}
+
+duint32 dwgCompressor::twoByteOffset(duint32 *ll){
+ duint32 cont = 0;
+ duint8 fb = bufC[pos++];
+ cont = (fb >> 2) | (bufC[pos++] << 6);
+ *ll = (fb & 0x03);
+ return cont;
+}
+
+duint32 dwgCompressor::longCompressionOffset(){
+ duint32 cont = 0;
+ duint8 ll = bufC[pos++];
+ while (ll == 0x00){
+ cont += 0xFF;
+ ll = bufC[pos++];
+ }
+ cont += ll;
+ return cont;
+}
+
+duint32 dwgCompressor::long20CompressionOffset(){
+// duint32 cont = 0;
+ duint32 cont = 0x0F;
+ duint8 ll = bufC[pos++];
+ while (ll == 0x00){
+// cont += 0xFF;
+ ll = bufC[pos++];
+ }
+ cont += ll;
+ return cont;
+}
+
+duint32 dwgCompressor::litLength18(){
+ duint32 cont=0;
+ duint8 ll = bufC[pos++];
+ //no literal length, this byte is next opCode
+ if (ll > 0x0F) {
+ pos--;
+ return 0;
+ }
+
+ if (ll == 0x00) {
+ cont = 0x0F;
+ ll = bufC[pos++];
+ while (ll == 0x00){//repeat until ll != 0x00
+ cont +=0xFF;
+ ll = bufC[pos++];
+ }
+ }
+ cont +=ll;
+ cont +=3; //already sum 3
+ return cont;
+}
+
+void dwgCompressor::decompress18(duint8 *cbuf, duint8 *dbuf, duint32 csize, duint32 dsize){
+ bufC = cbuf;
+ bufD = dbuf;
+ sizeC = csize -2;
+ sizeD = dsize;
+ DRW_DBG("dwgCompressor::decompress, last 2 bytes: ");
+ DRW_DBGH(bufC[sizeC]);DRW_DBGH(bufC[sizeC+1]);DRW_DBG("\n");
+ sizeC = csize;
+
+ duint32 compBytes;
+ duint32 compOffset;
+ duint32 litCount;
+
+ pos=0; //current position in compresed buffer
+ rpos=0; //current position in resulting decompresed buffer
+ litCount = litLength18();
+ //copy first lileral lenght
+ for (duint32 i=0; i < litCount; ++i) {
+ bufD[rpos++] = bufC[pos++];
+ }
+
+ while (pos < csize && (rpos < dsize+1)){//rpos < dsize to prevent crash more robust are needed
+ duint8 oc = bufC[pos++]; //next opcode
+ if (oc == 0x10){
+ compBytes = longCompressionOffset()+ 9;
+ compOffset = twoByteOffset(&litCount) + 0x3FFF;
+ if (litCount == 0)
+ litCount= litLength18();
+ } else if (oc > 0x11 && oc< 0x20){
+ compBytes = (oc & 0x0F) + 2;
+ compOffset = twoByteOffset(&litCount) + 0x3FFF;
+ if (litCount == 0)
+ litCount= litLength18();
+ } else if (oc == 0x20){
+ compBytes = longCompressionOffset() + 0x21;
+ compOffset = twoByteOffset(&litCount);
+ if (litCount == 0)
+ litCount= litLength18();
+ else
+ oc = 0x00;
+ } else if (oc > 0x20 && oc< 0x40){
+ compBytes = oc - 0x1E;
+ compOffset = twoByteOffset(&litCount);
+ if (litCount == 0)
+ litCount= litLength18();
+ } else if ( oc > 0x3F){
+ compBytes = ((oc & 0xF0) >> 4) - 1;
+ duint8 ll2 = bufC[pos++];
+ compOffset = (ll2 << 2) | ((oc & 0x0C) >> 2);
+ litCount = oc & 0x03;
+ if (litCount < 1){
+ litCount= litLength18();}
+ } else if (oc == 0x11){
+ DRW_DBG("dwgCompressor::decompress, end of input stream, Cpos: ");
+ DRW_DBG(pos);DRW_DBG(", Dpos: ");DRW_DBG(rpos);DRW_DBG("\n");
+ return; //end of input stream
+ } else { //ll < 0x10
+ DRW_DBG("WARNING dwgCompressor::decompress, failed, illegal char, Cpos: ");
+ DRW_DBG(pos);DRW_DBG(", Dpos: ");DRW_DBG(rpos);DRW_DBG("\n");
+ return; //fails, not valid
+ }
+ //copy "compresed data", TODO Needed verify out of bounds
+ duint32 remaining = sizeD - (litCount+rpos);
+ if (remaining < compBytes){
+ compBytes = remaining;
+ DRW_DBG("WARNING dwgCompressor::decompress, bad compBytes size, Cpos: ");
+ DRW_DBG(pos);DRW_DBG(", Dpos: ");DRW_DBG(rpos);DRW_DBG("\n");
+ }
+ for (duint32 i=0, j= rpos - compOffset -1; i < compBytes; i++) {
+ bufD[rpos++] = bufD[j++];
+ }
+ //copy "uncompresed data", TODO Needed verify out of bounds
+ for (duint32 i=0; i < litCount; i++) {
+ bufD[rpos++] = bufC[pos++];
+ }
+ }
+ DRW_DBG("WARNING dwgCompressor::decompress, bad out, Cpos: ");DRW_DBG(pos);DRW_DBG(", Dpos: ");DRW_DBG(rpos);DRW_DBG("\n");
+}
+
+
+void dwgCompressor::decrypt18Hdr(duint8 *buf, duint32 size, duint32 offset){
+ duint8 max = size / 4;
+ duint32 secMask = 0x4164536b ^ offset;
+ duint32* pHdr = (duint32*)buf;
+ for (duint8 j = 0; j < max; j++)
+ *pHdr++ ^= secMask;
+}
+
+/*void dwgCompressor::decrypt18Data(duint8 *buf, duint32 size, duint32 offset){
+ duint8 max = size / 4;
+ duint32 secMask = 0x4164536b ^ offset;
+ duint32* pHdr = (duint32*)buf;
+ for (duint8 j = 0; j < max; j++)
+ *pHdr++ ^= secMask;
+}*/
+
+duint32 dwgCompressor::litLength21(duint8 *cbuf, duint8 oc, duint32 *si){
+
+ duint32 srcIndex=*si;
+
+ duint32 length = oc + 8;
+ if (length == 0x17) {
+ duint32 n = cbuf[srcIndex++];
+ length += n;
+ if (n == 0xff) {
+ do {
+ n = cbuf[srcIndex++];
+ n |= (duint32)(cbuf[srcIndex++] << 8);
+ length += n;
+ } while (n == 0xffff);
+ }
+ }
+
+ *si = srcIndex;
+ return length;
+}
+
+void dwgCompressor::decompress21(duint8 *cbuf, duint8 *dbuf, duint32 csize, duint32 dsize){
+ duint32 srcIndex=0;
+ duint32 dstIndex=0;
+ duint32 length=0;
+ duint32 sourceOffset;
+ duint8 opCode;
+
+ opCode = cbuf[srcIndex++];
+ if ((opCode >> 4) == 2){
+ srcIndex = srcIndex +2;
+ length = cbuf[srcIndex++] & 0x07;
+ }
+
+ while (srcIndex < csize && (dstIndex < dsize+1)){//dstIndex < dsize to prevent crash more robust are needed
+ if (length == 0)
+ length = litLength21(cbuf, opCode, &srcIndex);
+ copyCompBytes21(cbuf, dbuf, length, srcIndex, dstIndex);
+ srcIndex += length;
+ dstIndex += length;
+ if (dstIndex >=dsize) break; //check if last chunk are compresed & terminate
+
+ length = 0;
+ opCode = cbuf[srcIndex++];
+ readInstructions21(cbuf, &srcIndex, &opCode, &sourceOffset, &length);
+ while (true) {
+ //prevent crash with corrupted data
+ if (sourceOffset > dstIndex){
+ DRW_DBG("\nWARNING dwgCompressor::decompress21 => sourceOffset> dstIndex.\n");
+ DRW_DBG("csize = "); DRW_DBG(csize); DRW_DBG(" srcIndex = "); DRW_DBG(srcIndex);
+ DRW_DBG("\ndsize = "); DRW_DBG(dsize); DRW_DBG(" dstIndex = "); DRW_DBG(dstIndex);
+ sourceOffset = dstIndex;
+ }
+ //prevent crash with corrupted data
+ if (length > dsize - dstIndex){
+ DRW_DBG("\nWARNING dwgCompressor::decompress21 => length > dsize - dstIndex.\n");
+ DRW_DBG("csize = "); DRW_DBG(csize); DRW_DBG(" srcIndex = "); DRW_DBG(srcIndex);
+ DRW_DBG("\ndsize = "); DRW_DBG(dsize); DRW_DBG(" dstIndex = "); DRW_DBG(dstIndex);
+ length = dsize - dstIndex;
+ srcIndex = csize;//force exit
+ }
+ sourceOffset = dstIndex-sourceOffset;
+ for (duint32 i=0; i< length; i++)
+ dbuf[dstIndex++] = dbuf[sourceOffset+i];
+
+ length = opCode & 7;
+ if ((length != 0) || (srcIndex >= csize)) {
+ break;
+ }
+ opCode = cbuf[srcIndex++];
+ if ((opCode >> 4) == 0) {
+ break;
+ }
+ if ((opCode >> 4) == 15) {
+ opCode &= 15;
+ }
+ readInstructions21(cbuf, &srcIndex, &opCode, &sourceOffset, &length);
+ }
+ }
+ DRW_DBG("\ncsize = "); DRW_DBG(csize); DRW_DBG(" srcIndex = "); DRW_DBG(srcIndex);
+ DRW_DBG("\ndsize = "); DRW_DBG(dsize); DRW_DBG(" dstIndex = "); DRW_DBG(dstIndex);DRW_DBG("\n");
+}
+
+void dwgCompressor::readInstructions21(duint8 *cbuf, duint32 *si, duint8 *oc, duint32 *so, duint32 *l){
+ duint32 length;
+ duint32 srcIndex = *si;
+ duint32 sourceOffset;
+ unsigned char opCode = *oc;
+ switch ((opCode >> 4)) {
+ case 0:
+ length = (opCode & 0xf) + 0x13;
+ sourceOffset = cbuf[srcIndex++];
+ opCode = cbuf[srcIndex++];
+ length = ((opCode >> 3) & 0x10) + length;
+ sourceOffset = ((opCode & 0x78) << 5) + 1 + sourceOffset;
+ break;
+ case 1:
+ length = (opCode & 0xf) + 3;
+ sourceOffset = cbuf[srcIndex++];
+ opCode = cbuf[srcIndex++];
+ sourceOffset = ((opCode & 0xf8) << 5) + 1 + sourceOffset;
+ break;
+ case 2:
+ sourceOffset = cbuf[srcIndex++];
+ sourceOffset = ((cbuf[srcIndex++] << 8) & 0xff00) | sourceOffset;
+ length = opCode & 7;
+ if ((opCode & 8) == 0) {
+ opCode = cbuf[srcIndex++];
+ length = (opCode & 0xf8) + length;
+ } else {
+ sourceOffset++;
+ length = (cbuf[srcIndex++] << 3) + length;
+ opCode = cbuf[srcIndex++];
+ length = (((opCode & 0xf8) << 8) + length) + 0x100;
+ }
+ break;
+ default:
+ length = opCode >> 4;
+ sourceOffset = opCode & 15;
+ opCode = cbuf[srcIndex++];
+ sourceOffset = (((opCode & 0xf8) << 1) + sourceOffset) + 1;
+ break;
+ }
+ *oc = opCode;
+ *si = srcIndex;
+ *so = sourceOffset;
+ *l = length;
+}
+
+
+void dwgCompressor::copyCompBytes21(duint8 *cbuf, duint8 *dbuf, duint32 l, duint32 si, duint32 di){
+ duint32 length =l;
+ duint32 dix = di;
+ duint32 six = si;
+
+ while (length > 31){
+ //in doc: 16-31, 0-15
+ for (duint32 i = six+24; i<six+32; i++)
+ dbuf[dix++] = cbuf[i];
+ for (duint32 i = six+16; i<six+24; i++)
+ dbuf[dix++] = cbuf[i];
+ for (duint32 i = six+8; i<six+16; i++)
+ dbuf[dix++] = cbuf[i];
+ for (duint32 i = six; i<six+8; i++)
+ dbuf[dix++] = cbuf[i];
+ six = six + 32;
+ length = length -32;
+ }
+
+ switch (length) {
+ case 0:
+ break;
+ case 1: //Ok
+ dbuf[dix] = cbuf[six];
+ break;
+ case 2: //Ok
+ dbuf[dix++] = cbuf[six+1];
+ dbuf[dix] = cbuf[six];
+ break;
+ case 3: //Ok
+ dbuf[dix++] = cbuf[six+2];
+ dbuf[dix++] = cbuf[six+1];
+ dbuf[dix] = cbuf[six];
+ break;
+ case 4: //Ok
+ for (int i = 0; i<4;i++) //RLZ is OK, or are inverse?, OK
+ dbuf[dix++] = cbuf[six++];
+ break;
+ case 5: //Ok
+ dbuf[dix++] = cbuf[six+4];
+ for (int i = 0; i<4;i++)
+ dbuf[dix++] = cbuf[six++];
+ break;
+ case 6: //Ok
+ dbuf[dix++] = cbuf[six+5];
+ for (int i = 1; i<5;i++)
+ dbuf[dix++] = cbuf[six+i];
+ dbuf[dix] = cbuf[six];
+ break;
+ case 7:
+ //in doc: six+5, six+6, 1-5, six+0
+ dbuf[dix++] = cbuf[six+6];
+ dbuf[dix++] = cbuf[six+5];
+ for (int i = 1; i<5;i++)
+ dbuf[dix++] = cbuf[six+i];
+ dbuf[dix] = cbuf[six];
+ case 8: //Ok
+ for (int i = 0; i<8;i++) //RLZ 4[0],4[4] or 4[4],4[0]
+ dbuf[dix++] = cbuf[six++];
+ break;
+ case 9: //Ok
+ dbuf[dix++] = cbuf[six+8];
+ for (int i = 0; i<8;i++)
+ dbuf[dix++] = cbuf[six++];
+ break;
+ case 10: //Ok
+ dbuf[dix++] = cbuf[six+9];
+ for (int i = 1; i<9;i++)
+ dbuf[dix++] = cbuf[six+i];
+ dbuf[dix] = cbuf[six];
+ break;
+ case 11:
+ //in doc: six+9, six+10, 1-9, six+0
+ dbuf[dix++] = cbuf[six+10];
+ dbuf[dix++] = cbuf[six+9];
+ for (int i = 1; i<9;i++)
+ dbuf[dix++] = cbuf[six+i];
+ dbuf[dix] = cbuf[six];
+ break;
+ case 12: //Ok
+ for (int i = 8; i<12;i++)
+ dbuf[dix++] = cbuf[six+i];
+ for (int i = 0; i<8;i++)
+ dbuf[dix++] = cbuf[six++];
+ break;
+ case 13: //Ok
+ dbuf[dix++] = cbuf[six+12];
+ for (int i = 8; i<12;i++)
+ dbuf[dix++] = cbuf[six+i];
+ for (int i = 0; i<8;i++)
+ dbuf[dix++] = cbuf[six++];
+ break;
+ case 14: //Ok
+ dbuf[dix++] = cbuf[six+13];
+ for (int i = 9; i<13; i++)
+ dbuf[dix++] = cbuf[six+i];
+ for (int i = 1; i<9; i++)
+ dbuf[dix++] = cbuf[six+i];
+ dbuf[dix] = cbuf[six];
+ break;
+ case 15:
+ //in doc: six+13, six+14, 9-12, 1-8, six+0
+ dbuf[dix++] = cbuf[six+14];
+ dbuf[dix++] = cbuf[six+13];
+ for (int i = 9; i<13; i++)
+ dbuf[dix++] = cbuf[six+i];
+ for (int i = 1; i<9; i++)
+ dbuf[dix++] = cbuf[six+i];
+ dbuf[dix] = cbuf[six];
+ break;
+ case 16: //Ok
+ for (int i = 8; i<16;i++)
+ dbuf[dix++] = cbuf[six+i];
+ for (int i = 0; i<8;i++)
+ dbuf[dix++] = cbuf[six++];
+ break;
+ case 17: //Seems Ok
+ for (int i = 9; i<17;i++)
+ dbuf[dix++] = cbuf[six+i];
+ dbuf[dix++] = cbuf[six+8];
+ for (int i = 0; i<8;i++)
+ dbuf[dix++] = cbuf[six++];
+ break;
+ case 18:
+ //in doc: six+17, 1-16, six+0
+ dbuf[dix++] = cbuf[six+17];
+ for (int i = 9; i<17;i++)
+ dbuf[dix++] = cbuf[six+i];
+ for (int i = 1; i<9;i++)
+ dbuf[dix++] = cbuf[six+i];
+ dbuf[dix] = cbuf[six];
+ break;
+ case 19:
+ //in doc: 16-18, 0-15
+ dbuf[dix++] = cbuf[six+18];
+ dbuf[dix++] = cbuf[six+17];
+ dbuf[dix++] = cbuf[six+16];
+ for (int i = 8; i<16;i++)
+ dbuf[dix++] = cbuf[six+i];
+ for (int i = 0; i<8;i++)
+ dbuf[dix++] = cbuf[six++];
+ break;
+ case 20:
+ //in doc: 16-19, 0-15
+ for (int i = 16; i<20;i++)
+ dbuf[dix++] = cbuf[six+i];
+ for (int i = 8; i<16;i++)
+ dbuf[dix++] = cbuf[six+i];
+ for (int i = 0; i<8;i++)
+ dbuf[dix++] = cbuf[six++];
+ break;
+ case 21:
+ //in doc: six+20, 16-19, 0-15
+ dbuf[dix++] = cbuf[six+20];
+ for (int i = 16; i<20;i++)
+ dbuf[dix++] = cbuf[six+i];
+ for (int i = 8; i<16;i++)
+ dbuf[dix++] = cbuf[six+i];
+ for (int i = 0; i<8;i++)
+ dbuf[dix++] = cbuf[six+i];
+ break;
+ case 22:
+ //in doc: six+20, six+21, 16-19, 0-15
+ dbuf[dix++] = cbuf[six+21];
+ dbuf[dix++] = cbuf[six+20];
+ for (int i = 16; i<20;i++)
+ dbuf[dix++] = cbuf[six+i];
+ for (int i = 8; i<16;i++)
+ dbuf[dix++] = cbuf[six+i];
+ for (int i = 0; i<8;i++)
+ dbuf[dix++] = cbuf[six++];
+ break;
+ case 23:
+ //in doc: six+20, six+21, six+22, 16-19, 0-15
+ dbuf[dix++] = cbuf[six+22];
+ dbuf[dix++] = cbuf[six+21];
+ dbuf[dix++] = cbuf[six+20];
+ for (int i = 16; i<20;i++)
+ dbuf[dix++] = cbuf[six+i];
+ for (int i = 8; i<16;i++)
+ dbuf[dix++] = cbuf[six+i];
+ for (int i = 0; i<8;i++)
+ dbuf[dix++] = cbuf[six+i];
+ break;
+ case 24:
+ //in doc: 16-23, 0-15
+ for (int i = 16; i<24;i++)
+ dbuf[dix++] = cbuf[six+i];
+ for (int i = 8; i<16;i++)
+ dbuf[dix++] = cbuf[six+i];
+ for (int i = 0; i<8; i++)
+ dbuf[dix++] = cbuf[six++];
+ break;
+ case 25:
+ //in doc: 17-24, six+16, 0-15
+ for (int i = 17; i<25;i++)
+ dbuf[dix++] = cbuf[six+i];
+ dbuf[dix++] = cbuf[six+16];
+ for (int i = 8; i<16; i++)
+ dbuf[dix++] = cbuf[six+i];
+ for (int i = 0; i<8; i++)
+ dbuf[dix++] = cbuf[six++];
+ break;
+ case 26:
+ //in doc: six+25, 17-24, six+16, 0-15
+ dbuf[dix++] = cbuf[six+25];
+ for (int i = 17; i<25;i++)
+ dbuf[dix++] = cbuf[six+i];
+ dbuf[dix++] = cbuf[six+16];
+ for (int i = 8; i<16;i++)
+ dbuf[dix++] = cbuf[six+i];
+ for (int i = 0; i<8; i++)
+ dbuf[dix++] = cbuf[six++];
+ break;
+ case 27:
+ //in doc: six+25, six+26, 17-24, six+16, 0-15
+ dbuf[dix++] = cbuf[six+26];
+ dbuf[dix++] = cbuf[six+25];
+ for (int i = 17; i<25;i++)
+ dbuf[dix++] = cbuf[six+i];
+ dbuf[dix++] = cbuf[six+16];
+ for (int i = 8; i<16;i++)
+ dbuf[dix++] = cbuf[six+i];
+ for (int i = 0; i<8; i++)
+ dbuf[dix++] = cbuf[six++];
+ break;
+ case 28:
+ //in doc: 24-27, 16-23, 0-15
+ for (int i = 24; i<28; i++)
+ dbuf[dix++] = cbuf[six+i];
+ for (int i = 16; i<24;i++)
+ dbuf[dix++] = cbuf[six+i];
+ for (int i = 8; i<16; i++)
+ dbuf[dix++] = cbuf[six+i];
+ for (int i = 0; i<8; i++)
+ dbuf[dix++] = cbuf[six++];
+ break;
+ case 29:
+ //in doc: six+28, 24-27, 16-23, 0-15
+ dbuf[dix++] = cbuf[six+28];
+ for (int i = 24; i<28; i++)
+ dbuf[dix++] = cbuf[six+i];
+ for (int i = 16; i<24;i++)
+ dbuf[dix++] = cbuf[six+i];
+ for (int i = 8; i<16;i++)
+ dbuf[dix++] = cbuf[six+i];
+ for (int i = 0; i<8; i++)
+ dbuf[dix++] = cbuf[six++];
+ break;
+ case 30:
+ //in doc: six+28, six+29, 24-27, 16-23, 0-15
+ dbuf[dix++] = cbuf[six+29];
+ dbuf[dix++] = cbuf[six+28];
+ for (int i = 24; i<28; i++)
+ dbuf[dix++] = cbuf[six+i];
+ for (int i = 16; i<24;i++)
+ dbuf[dix++] = cbuf[six+i];
+ for (int i = 8; i<16;i++)
+ dbuf[dix++] = cbuf[six+i];
+ for (int i = 0; i<8; i++)
+ dbuf[dix++] = cbuf[six++];
+ break;
+ case 31:
+ //in doc: six+30, 26-29, 18-25, 2-17, 0-1
+ dbuf[dix++] = cbuf[six+30];
+ for (int i = 26; i<30;i++)
+ dbuf[dix++] = cbuf[six+i];
+ for (int i = 18; i<26;i++)
+ dbuf[dix++] = cbuf[six+i];
+/* for (int i = 2; i<18; i++)
+ dbuf[dix++] = cbuf[six+i];*/
+ for (int i = 10; i<18; i++)
+ dbuf[dix++] = cbuf[six+i];
+ for (int i = 2; i<10; i++)
+ dbuf[dix++] = cbuf[six+i];
+ dbuf[dix++] = cbuf[six+1];
+ dbuf[dix] = cbuf[six];
+ break;
+ default:
+ DRW_DBG("WARNING dwgCompressor::copyCompBytes21, bad output.\n");
+ break;
+ }
+}
+
+
+secEnum::DWGSection secEnum::getEnum(std::string nameSec){
+ //TODO: complete it
+ if (nameSec=="AcDb:Header"){
+ return HEADER;
+ } else if (nameSec=="AcDb:Classes"){
+ return CLASSES;
+ } else if (nameSec=="AcDb:SummaryInfo"){
+ return SUMARYINFO;
+ } else if (nameSec=="AcDb:Preview"){
+ return PREVIEW;
+ } else if (nameSec=="AcDb:VBAProject"){
+ return VBAPROY;
+ } else if (nameSec=="AcDb:AppInfo"){
+ return APPINFO;
+ } else if (nameSec=="AcDb:FileDepList"){
+ return FILEDEP;
+ } else if (nameSec=="AcDb:RevHistory"){
+ return REVHISTORY;
+ } else if (nameSec=="AcDb:Security"){
+ return SECURITY;
+ } else if (nameSec=="AcDb:AcDbObjects"){
+ return OBJECTS;
+ } else if (nameSec=="AcDb:ObjFreeSpace"){
+ return OBJFREESPACE;
+ } else if (nameSec=="AcDb:Template"){
+ return TEMPLATE;
+ } else if (nameSec=="AcDb:Handles"){
+ return HANDLES;
+ } else if (nameSec=="AcDb:AcDsPrototype_1b"){
+ return PROTOTYPE;
+ } else if (nameSec=="AcDb:AuxHeader"){
+ return AUXHEADER;
+ } else if (nameSec=="AcDb:Signature"){
+ return SIGNATURE;
+ } else if (nameSec=="AcDb:AppInfoHistory"){ //in ac1021
+ return APPINFOHISTORY;
+// } else if (nameSec=="AcDb:Extended Entity Data"){
+// return EXTEDATA;
+// } else if (nameSec=="AcDb:PROXY ENTITY GRAPHICS"){
+// return PROXYGRAPHICS;
+ }
+ return UNKNOWNS;
+}
--- /dev/null
+/******************************************************************************
+** libDXFrw - Library to read/write DXF files (ascii & binary) **
+** **
+** Copyright (C) 2011-2015 José F. Soriano, rallazz@gmail.com **
+** **
+** This library is free software, licensed under the terms of the GNU **
+** General Public License as published by the Free Software Foundation, **
+** either version 2 of the License, or (at your option) any later version. **
+** You should have received a copy of the GNU General Public License **
+** along with this program. If not, see <http://www.gnu.org/licenses/>. **
+******************************************************************************/
+
+#ifndef DWGUTIL_H
+#define DWGUTIL_H
+
+#include "../drw_base.h"
+
+namespace DRW {
+std::string toHexStr(int n);
+}
+
+class dwgRSCodec {
+public:
+ dwgRSCodec(){}
+ ~dwgRSCodec(){}
+ static void decode239I(duint8 *in, duint8 *out, duint32 blk);
+ static void decode251I(duint8 *in, duint8 *out, duint32 blk);
+};
+
+class dwgCompressor {
+public:
+ dwgCompressor(){}
+ ~dwgCompressor(){}
+
+ void decompress18(duint8 *cbuf, duint8 *dbuf, duint32 csize, duint32 dsize);
+ static void decrypt18Hdr(duint8 *buf, duint32 size, duint32 offset);
+// static void decrypt18Data(duint8 *buf, duint32 size, duint32 offset);
+ static void decompress21(duint8 *cbuf, duint8 *dbuf, duint32 csize, duint32 dsize);
+
+private:
+ duint32 litLength18();
+ static duint32 litLength21(duint8 *cbuf, duint8 oc, duint32 *si);
+ static void copyCompBytes21(duint8 *cbuf, duint8 *dbuf, duint32 l, duint32 si, duint32 di);
+ static void readInstructions21(duint8 *cbuf, duint32 *si, duint8 *oc, duint32 *so, duint32 *l);
+
+ duint32 longCompressionOffset();
+ duint32 long20CompressionOffset();
+ duint32 twoByteOffset(duint32 *ll);
+
+ duint8 *bufC;
+ duint8 *bufD;
+ duint32 sizeC;
+ duint32 sizeD;
+ duint32 pos;
+ duint32 rpos;
+
+};
+
+class secEnum {
+public:
+ enum DWGSection {
+ UNKNOWNS, /*!< UNKNOWN section. */
+ FILEHEADER, /*!< File Header (in R3-R15*/
+ HEADER, /*!< AcDb:Header */
+ CLASSES, /*!< AcDb:Classes */
+ SUMARYINFO, /*!< AcDb:SummaryInfo */
+ PREVIEW, /*!< AcDb:Preview */
+ VBAPROY, /*!< AcDb:VBAProject */
+ APPINFO, /*!< AcDb:AppInfo */
+ FILEDEP, /*!< AcDb:FileDepList */
+ REVHISTORY, /*!< AcDb:RevHistory */
+ SECURITY, /*!< AcDb:Security */
+ OBJECTS, /*!< AcDb:AcDbObjects */
+ OBJFREESPACE, /*!< AcDb:ObjFreeSpace */
+ TEMPLATE, /*!< AcDb:Template */
+ HANDLES, /*!< AcDb:Handles */
+ PROTOTYPE, /*!< AcDb:AcDsPrototype_1b */
+ AUXHEADER, /*!< AcDb:AuxHeader, in (R13-R15) second file header */
+ SIGNATURE, /*!< AcDb:Signature */
+ APPINFOHISTORY, /*!< AcDb:AppInfoHistory (in ac1021 may be a renamed section?*/
+ EXTEDATA, /*!< Extended Entity Data */
+ PROXYGRAPHICS /*!< PROXY ENTITY GRAPHICS */
+ };
+
+ secEnum(){}
+ ~secEnum(){}
+
+ static DWGSection getEnum(std::string nameSec);
+};
+
+#endif // DWGUTIL_H
--- /dev/null
+/******************************************************************************
+** libDXFrw - Library to read/write DXF files (ascii & binary) **
+** **
+** Copyright (C) 2011-2015 José F. Soriano, rallazz@gmail.com **
+** **
+** This library is free software, licensed under the terms of the GNU **
+** General Public License as published by the Free Software Foundation, **
+** either version 2 of the License, or (at your option) any later version. **
+** You should have received a copy of the GNU General Public License **
+** along with this program. If not, see <http://www.gnu.org/licenses/>. **
+******************************************************************************/
+
+#include <cstdlib>
+#include <fstream>
+#include <string>
+#include <sstream>
+#include "dxfreader.h"
+#include "drw_textcodec.h"
+#include "drw_dbg.h"
+
+bool dxfReader::readRec(int *codeData) {
+// std::string text;
+ int code;
+
+ if (!readCode(&code))
+ return false;
+ *codeData = code;
+
+ if (code < 10)
+ readString();
+ else if (code < 60)
+ readDouble();
+ else if (code < 80)
+ readInt16();
+ else if (code > 89 && code < 100) //TODO this is an int 32b
+ readInt32();
+ else if (code == 100 || code == 102 || code == 105)
+ readString();
+ else if (code > 109 && code < 150) //skip not used at the v2012
+ readDouble();
+ else if (code > 159 && code < 170) //skip not used at the v2012
+ readInt64();
+ else if (code < 180)
+ readInt16();
+ else if (code > 209 && code < 240) //skip not used at the v2012
+ readDouble();
+ else if (code > 269 && code < 290) //skip not used at the v2012
+ readInt16();
+ else if (code < 300) //TODO this is a boolean indicator, int in Binary?
+ readBool();
+ else if (code < 370)
+ readString();
+ else if (code < 390)
+ readInt16();
+ else if (code < 400)
+ readString();
+ else if (code < 410)
+ readInt16();
+ else if (code < 420)
+ readString();
+ else if (code < 430) //TODO this is an int 32b
+ readInt32();
+ else if (code < 440)
+ readString();
+ else if (code < 450) //TODO this is an int 32b
+ readInt32();
+ else if (code < 460) //TODO this is long??
+ readInt32();
+ else if (code < 470) //TODO this is a floating point double precision??
+ readDouble();
+ else if (code < 481)
+ readString();
+ else if (code > 998 && code < 1009) //skip not used at the v2012
+ readString();
+ else if (code < 1060) //TODO this is a floating point double precision??
+ readDouble();
+ else if (code < 1071)
+ readInt16();
+ else if (code == 1071) //TODO this is an int 32b
+ readInt32();
+ else if (skip)
+ //skip safely this dxf entry ( ok for ascii dxf)
+ readString();
+ else
+ //break in binary files because the conduct is unpredictable
+ return false;
+
+ return (filestr->good());
+}
+int dxfReader::getHandleString(){
+ int res;
+#if defined(__APPLE__)
+ int Succeeded = sscanf ( strData.c_str(), "%x", &res );
+ if ( !Succeeded || Succeeded == EOF )
+ res = 0;
+#else
+ std::istringstream Convert(strData);
+ if ( !(Convert >> std::hex >>res) )
+ res = 0;
+#endif
+ return res;
+}
+
+bool dxfReaderBinary::readCode(int *code) {
+ unsigned short *int16p;
+ char buffer[2];
+ filestr->read(buffer,2);
+ int16p = (unsigned short *) buffer;
+//exist a 32bits int (code 90) with 2 bytes???
+ if ((*code == 90) && (*int16p>2000)){
+ DRW_DBG(*code); DRW_DBG(" de 16bits\n");
+ filestr->seekg(-4, std::ios_base::cur);
+ filestr->read(buffer,2);
+ int16p = (unsigned short *) buffer;
+ }
+ *code = *int16p;
+ DRW_DBG(*code); DRW_DBG("\n");
+
+ return (filestr->good());
+}
+
+bool dxfReaderBinary::readString() {
+ type = STRING;
+ std::getline(*filestr, strData, '\0');
+ DRW_DBG(strData); DRW_DBG("\n");
+ return (filestr->good());
+}
+
+bool dxfReaderBinary::readString(std::string *text) {
+ type = STRING;
+ std::getline(*filestr, *text, '\0');
+ DRW_DBG(*text); DRW_DBG("\n");
+ return (filestr->good());
+}
+
+bool dxfReaderBinary::readInt16() {
+ type = INT32;
+ char buffer[2];
+ filestr->read(buffer,2);
+ intData = (int)((buffer[1] << 8) | buffer[0]);
+ DRW_DBG(intData); DRW_DBG("\n");
+ return (filestr->good());
+}
+
+bool dxfReaderBinary::readInt32() {
+ type = INT32;
+ unsigned int *int32p;
+ char buffer[4];
+ filestr->read(buffer,4);
+ int32p = (unsigned int *) buffer;
+ intData = *int32p;
+ DRW_DBG(intData); DRW_DBG("\n");
+ return (filestr->good());
+}
+
+bool dxfReaderBinary::readInt64() {
+ type = INT64;
+ unsigned long long int *int64p; //64 bits integer pointer
+ char buffer[8];
+ filestr->read(buffer,8);
+ int64p = (unsigned long long int *) buffer;
+ int64 = *int64p;
+ DRW_DBG(int64); DRW_DBG(" int64\n");
+ return (filestr->good());
+}
+
+bool dxfReaderBinary::readDouble() {
+ type = DOUBLE;
+ double *result;
+ char buffer[8];
+ filestr->read(buffer,8);
+ result = (double *) buffer;
+ doubleData = *result;
+ DRW_DBG(doubleData); DRW_DBG("\n");
+ return (filestr->good());
+}
+
+//saved as int or add a bool member??
+bool dxfReaderBinary::readBool() {
+ char buffer[1];
+ filestr->read(buffer,1);
+ intData = (int)(buffer[0]);
+ DRW_DBG(intData); DRW_DBG("\n");
+ return (filestr->good());
+}
+
+bool dxfReaderAscii::readCode(int *code) {
+ std::string text;
+ std::getline(*filestr, text);
+ *code = atoi(text.c_str());
+ DRW_DBG(*code); DRW_DBG("\n");
+ return (filestr->good());
+}
+bool dxfReaderAscii::readString(std::string *text) {
+ type = STRING;
+ std::getline(*filestr, *text);
+ if (!text->empty() && text->at(text->size()-1) == '\r')
+ text->erase(text->size()-1);
+ return (filestr->good());
+}
+
+bool dxfReaderAscii::readString() {
+ type = STRING;
+ std::getline(*filestr, strData);
+ if (!strData.empty() && strData.at(strData.size()-1) == '\r')
+ strData.erase(strData.size()-1);
+ DRW_DBG(strData); DRW_DBG("\n");
+ return (filestr->good());
+}
+
+bool dxfReaderAscii::readInt16() {
+ type = INT32;
+ std::string text;
+ if (readString(&text)){
+ intData = atoi(text.c_str());
+ DRW_DBG(intData); DRW_DBG("\n");
+ return true;
+ } else
+ return false;
+}
+
+bool dxfReaderAscii::readInt32() {
+ type = INT32;
+ return readInt16();
+}
+
+bool dxfReaderAscii::readInt64() {
+ type = INT64;
+ return readInt16();
+}
+
+bool dxfReaderAscii::readDouble() {
+ type = DOUBLE;
+ std::string text;
+ if (readString(&text)){
+#if defined(__APPLE__)
+ int succeeded=sscanf( & (text[0]), "%lg", &doubleData);
+ if(succeeded != 1) {
+ DRW_DBG("dxfReaderAscii::readDouble(): reading double error: ");
+ DRW_DBG(text);
+ DRW_DBG('\n');
+ }
+#else
+ std::istringstream sd(text);
+ sd >> doubleData;
+ DRW_DBG(doubleData); DRW_DBG('\n');
+#endif
+ return true;
+ } else
+ return false;
+}
+
+//saved as int or add a bool member??
+bool dxfReaderAscii::readBool() {
+ type = BOOL;
+ std::string text;
+ if (readString(&text)){
+ intData = atoi(text.c_str());
+ DRW_DBG(intData); DRW_DBG("\n");
+ return true;
+ } else
+ return false;
+}
--- /dev/null
+/******************************************************************************
+** libDXFrw - Library to read/write DXF files (ascii & binary) **
+** **
+** Copyright (C) 2011-2015 José F. Soriano, rallazz@gmail.com **
+** **
+** This library is free software, licensed under the terms of the GNU **
+** General Public License as published by the Free Software Foundation, **
+** either version 2 of the License, or (at your option) any later version. **
+** You should have received a copy of the GNU General Public License **
+** along with this program. If not, see <http://www.gnu.org/licenses/>. **
+******************************************************************************/
+
+#ifndef DXFREADER_H
+#define DXFREADER_H
+
+#include "drw_textcodec.h"
+
+class dxfReader {
+public:
+ enum TYPE {
+ STRING,
+ INT32,
+ INT64,
+ DOUBLE,
+ BOOL,
+ INVALID
+ };
+ enum TYPE type;
+public:
+ dxfReader(std::istream *stream){
+ filestr = stream;
+ type = INVALID;
+ }
+ virtual ~dxfReader(){}
+ bool readRec(int *code);
+
+ std::string getString() {return strData;}
+ int getHandleString();//Convert hex string to int
+ std::string toUtf8String(std::string t) {return decoder.toUtf8(t);}
+ std::string getUtf8String() {return decoder.toUtf8(strData);}
+ double getDouble() {return doubleData;}
+ int getInt32() {return intData;}
+ unsigned long long int getInt64() {return int64;}
+ bool getBool() { return (intData==0) ? false : true;}
+ int getVersion(){return decoder.getVersion();}
+ void setVersion(std::string *v, bool dxfFormat){decoder.setVersion(v, dxfFormat);}
+ void setCodePage(std::string *c){decoder.setCodePage(c, true);}
+ std::string getCodePage(){ return decoder.getCodePage();}
+
+protected:
+ virtual bool readCode(int *code) = 0; //return true if sucesful (not EOF)
+ virtual bool readString(std::string *text) = 0;
+ virtual bool readString() = 0;
+ virtual bool readInt16() = 0;
+ virtual bool readInt32() = 0;
+ virtual bool readInt64() = 0;
+ virtual bool readDouble() = 0;
+ virtual bool readBool() = 0;
+
+protected:
+ std::istream *filestr;
+ std::string strData;
+ double doubleData;
+ signed int intData; //32 bits integer
+ unsigned long long int int64; //64 bits integer
+ bool skip; //set to true for ascii dxf, false for binary
+private:
+ DRW_TextCodec decoder;
+};
+
+class dxfReaderBinary : public dxfReader {
+public:
+ dxfReaderBinary(std::istream *stream):dxfReader(stream){skip = false; }
+ virtual ~dxfReaderBinary() {}
+ virtual bool readCode(int *code);
+ virtual bool readString(std::string *text);
+ virtual bool readString();
+ virtual bool readInt16();
+ virtual bool readInt32();
+ virtual bool readInt64();
+ virtual bool readDouble();
+ virtual bool readBool();
+};
+
+class dxfReaderAscii : public dxfReader {
+public:
+ dxfReaderAscii(std::istream *stream):dxfReader(stream){skip = true; }
+ virtual ~dxfReaderAscii(){}
+ virtual bool readCode(int *code);
+ virtual bool readString(std::string *text);
+ virtual bool readString();
+ virtual bool readInt16();
+ virtual bool readDouble();
+ virtual bool readInt32();
+ virtual bool readInt64();
+ virtual bool readBool();
+};
+
+#endif // DXFREADER_H
--- /dev/null
+/******************************************************************************
+** libDXFrw - Library to read/write DXF files (ascii & binary) **
+** **
+** Copyright (C) 2011-2015 José F. Soriano, rallazz@gmail.com **
+** **
+** This library is free software, licensed under the terms of the GNU **
+** General Public License as published by the Free Software Foundation, **
+** either version 2 of the License, or (at your option) any later version. **
+** You should have received a copy of the GNU General Public License **
+** along with this program. If not, see <http://www.gnu.org/licenses/>. **
+******************************************************************************/
+
+#include <cstdlib>
+#include <fstream>
+#include <string>
+#include <algorithm>
+#include "dxfwriter.h"
+
+//RLZ TODO change std::endl to x0D x0A (13 10)
+/*bool dxfWriter::readRec(int *codeData, bool skip) {
+// std::string text;
+ int code;
+
+#ifdef DRW_DBG
+ count = count+2; //DBG
+#endif
+
+ if (!readCode(&code))
+ return false;
+ *codeData = code;
+
+ if (code < 10)
+ readString();
+ else if (code < 60)
+ readDouble();
+ else if (code < 80)
+ readInt();
+ else if (code > 89 && code < 100) //TODO this is an int 32b
+ readInt32();
+ else if (code == 100 || code == 102 || code == 105)
+ readString();
+ else if (code > 109 && code < 150) //skip not used at the v2012
+ readDouble();
+ else if (code > 159 && code < 170) //skip not used at the v2012
+ readInt64();
+ else if (code < 180)
+ readInt();
+ else if (code > 209 && code < 240) //skip not used at the v2012
+ readDouble();
+ else if (code > 269 && code < 290) //skip not used at the v2012
+ readInt();
+ else if (code < 300) //TODO this is a boolean indicator, int in Binary?
+ readBool();
+ else if (code < 370)
+ readString();
+ else if (code < 390)
+ readInt();
+ else if (code < 400)
+ readString();
+ else if (code < 410)
+ readInt();
+ else if (code < 420)
+ readString();
+ else if (code < 430) //TODO this is an int 32b
+ readInt32();
+ else if (code < 440)
+ readString();
+ else if (code < 450) //TODO this is an int 32b
+ readInt32();
+ else if (code < 460) //TODO this is long??
+ readInt();
+ else if (code < 470) //TODO this is a floating point double precision??
+ readDouble();
+ else if (code < 481)
+ readString();
+ else if (code > 998 && code < 1009) //skip not used at the v2012
+ readString();
+ else if (code < 1060) //TODO this is a floating point double precision??
+ readDouble();
+ else if (code < 1071)
+ readInt();
+ else if (code == 1071) //TODO this is an int 32b
+ readInt32();
+ else if (skip)
+ //skip safely this dxf entry ( ok for ascii dxf)
+ readString();
+ else
+ //break in binary files because the conduct is unpredictable
+ return false;
+
+ return (filestr->good());
+}*/
+
+bool dxfWriter::writeUtf8String(int code, std::string text) {
+ std::string t = encoder.fromUtf8(text);
+ return writeString(code, t);
+}
+
+bool dxfWriter::writeUtf8Caps(int code, std::string text) {
+ std::string strname = text;
+ std::transform(strname.begin(), strname.end(), strname.begin(),::toupper);
+ std::string t = encoder.fromUtf8(strname);
+ return writeString(code, t);
+}
+
+bool dxfWriterBinary::writeString(int code, std::string text) {
+ char bufcode[2];
+ bufcode[0] =code & 0xFF;
+ bufcode[1] =code >> 8;
+ filestr->write(bufcode, 2);
+ *filestr << text << '\0';
+ return (filestr->good());
+}
+
+/*bool dxfWriterBinary::readCode(int *code) {
+ unsigned short *int16p;
+ char buffer[2];
+ filestr->read(buffer,2);
+ int16p = (unsigned short *) buffer;
+//exist a 32bits int (code 90) with 2 bytes???
+ if ((*code == 90) && (*int16p>2000)){
+ DBG(*code); DBG(" de 16bits\n");
+ filestr->seekg(-4, std::ios_base::cur);
+ filestr->read(buffer,2);
+ int16p = (unsigned short *) buffer;
+ }
+ *code = *int16p;
+ DBG(*code); DBG("\n");
+
+ return (filestr->good());
+}*/
+
+/*bool dxfWriterBinary::readString() {
+ std::getline(*filestr, strData, '\0');
+ DBG(strData); DBG("\n");
+ return (filestr->good());
+}*/
+
+/*bool dxfWriterBinary::readString(std::string *text) {
+ std::getline(*filestr, *text, '\0');
+ DBG(*text); DBG("\n");
+ return (filestr->good());
+}*/
+
+bool dxfWriterBinary::writeInt16(int code, int data) {
+ char bufcode[2];
+ char buffer[2];
+ bufcode[0] =code & 0xFF;
+ bufcode[1] =code >> 8;
+ buffer[0] =data & 0xFF;
+ buffer[1] =data >> 8;
+ filestr->write(bufcode, 2);
+ filestr->write(buffer, 2);
+ return (filestr->good());
+}
+
+bool dxfWriterBinary::writeInt32(int code, int data) {
+ char buffer[4];
+ buffer[0] =code & 0xFF;
+ buffer[1] =code >> 8;
+ filestr->write(buffer, 2);
+
+ buffer[0] =data & 0xFF;
+ buffer[1] =data >> 8;
+ buffer[2] =data >> 16;
+ buffer[3] =data >> 24;
+ filestr->write(buffer, 4);
+ return (filestr->good());
+}
+
+bool dxfWriterBinary::writeInt64(int code, unsigned long long int data) {
+ char buffer[8];
+ buffer[0] =code & 0xFF;
+ buffer[1] =code >> 8;
+ filestr->write(buffer, 2);
+
+ buffer[0] =data & 0xFF;
+ buffer[1] =data >> 8;
+ buffer[2] =data >> 16;
+ buffer[3] =data >> 24;
+ buffer[4] =data >> 32;
+ buffer[5] =data >> 40;
+ buffer[6] =data >> 48;
+ buffer[7] =data >> 56;
+ filestr->write(buffer, 8);
+ return (filestr->good());
+}
+
+bool dxfWriterBinary::writeDouble(int code, double data) {
+ char bufcode[2];
+ char buffer[8];
+ bufcode[0] =code & 0xFF;
+ bufcode[1] =code >> 8;
+ filestr->write(bufcode, 2);
+
+ unsigned char *val;
+ val = (unsigned char *) &data;
+ for (int i=0; i<8; i++) {
+ buffer[i] =val[i];
+ }
+ filestr->write(buffer, 8);
+ return (filestr->good());
+}
+
+//saved as int or add a bool member??
+bool dxfWriterBinary::writeBool(int code, bool data) {
+ char buffer[1];
+ char bufcode[2];
+ bufcode[0] =code & 0xFF;
+ bufcode[1] =code >> 8;
+ filestr->write(bufcode, 2);
+ buffer[0] = data;
+ filestr->write(buffer, 1);
+ return (filestr->good());
+}
+
+dxfWriterAscii::dxfWriterAscii(std::ostream *stream):dxfWriter(stream){
+ filestr->precision(16);
+}
+
+bool dxfWriterAscii::writeString(int code, std::string text) {
+// *filestr << code << std::endl << text << std::endl ;
+ filestr->width(3);
+ *filestr << std::right << code << std::endl;
+ filestr->width(0);
+ *filestr << std::left << text << std::endl;
+ /* std::getline(*filestr, strData, '\0');
+ DBG(strData); DBG("\n");*/
+ return (filestr->good());
+}
+
+bool dxfWriterAscii::writeInt16(int code, int data) {
+// *filestr << std::right << code << std::endl << data << std::endl;
+ filestr->width(3);
+ *filestr << std::right << code << std::endl;
+ filestr->width(5);
+ *filestr << data << std::endl;
+ return (filestr->good());
+}
+
+bool dxfWriterAscii::writeInt32(int code, int data) {
+ return writeInt16(code, data);
+}
+
+bool dxfWriterAscii::writeInt64(int code, unsigned long long int data) {
+// *filestr << code << std::endl << data << std::endl;
+ filestr->width(3);
+ *filestr << std::right << code << std::endl;
+ filestr->width(5);
+ *filestr << data << std::endl;
+ return (filestr->good());
+}
+
+bool dxfWriterAscii::writeDouble(int code, double data) {
+// std::streamsize prec = filestr->precision();
+// filestr->precision(12);
+// *filestr << code << std::endl << data << std::endl;
+ filestr->width(3);
+ *filestr << std::right << code << std::endl;
+ *filestr << data << std::endl;
+// filestr->precision(prec);
+ return (filestr->good());
+}
+
+//saved as int or add a bool member??
+bool dxfWriterAscii::writeBool(int code, bool data) {
+ *filestr << code << std::endl << data << std::endl;
+ return (filestr->good());
+}
--- /dev/null
+/******************************************************************************
+** libDXFrw - Library to read/write DXF files (ascii & binary) **
+** **
+** Copyright (C) 2011-2015 José F. Soriano, rallazz@gmail.com **
+** **
+** This library is free software, licensed under the terms of the GNU **
+** General Public License as published by the Free Software Foundation, **
+** either version 2 of the License, or (at your option) any later version. **
+** You should have received a copy of the GNU General Public License **
+** along with this program. If not, see <http://www.gnu.org/licenses/>. **
+******************************************************************************/
+
+#ifndef DXFWRITER_H
+#define DXFWRITER_H
+
+#include "drw_textcodec.h"
+
+class dxfWriter {
+public:
+ dxfWriter(std::ostream *stream){filestr = stream; /*count =0;*/}
+ virtual ~dxfWriter(){}
+ virtual bool writeString(int code, std::string text) = 0;
+ bool writeUtf8String(int code, std::string text);
+ bool writeUtf8Caps(int code, std::string text);
+ std::string fromUtf8String(std::string t) {return encoder.fromUtf8(t);}
+ virtual bool writeInt16(int code, int data) = 0;
+ virtual bool writeInt32(int code, int data) = 0;
+ virtual bool writeInt64(int code, unsigned long long int data) = 0;
+ virtual bool writeDouble(int code, double data) = 0;
+ virtual bool writeBool(int code, bool data) = 0;
+ void setVersion(std::string *v, bool dxfFormat){encoder.setVersion(v, dxfFormat);}
+ void setCodePage(std::string *c){encoder.setCodePage(c, true);}
+ std::string getCodePage(){return encoder.getCodePage();}
+protected:
+ std::ostream *filestr;
+private:
+ DRW_TextCodec encoder;
+};
+
+class dxfWriterBinary : public dxfWriter {
+public:
+ dxfWriterBinary(std::ostream *stream):dxfWriter(stream){}
+ virtual ~dxfWriterBinary() {}
+ virtual bool writeString(int code, std::string text);
+ virtual bool writeInt16(int code, int data);
+ virtual bool writeInt32(int code, int data);
+ virtual bool writeInt64(int code, unsigned long long int data);
+ virtual bool writeDouble(int code, double data);
+ virtual bool writeBool(int code, bool data);
+};
+
+class dxfWriterAscii : public dxfWriter {
+public:
+ dxfWriterAscii(std::ostream *stream);
+ virtual ~dxfWriterAscii(){}
+ virtual bool writeString(int code, std::string text);
+ virtual bool writeInt16(int code, int data);
+ virtual bool writeInt32(int code, int data);
+ virtual bool writeInt64(int code, unsigned long long int data);
+ virtual bool writeDouble(int code, double data);
+ virtual bool writeBool(int code, bool data);
+};
+
+#endif // DXFWRITER_H
--- /dev/null
+/******************************************************************************
+** libDXFrw - Library to read/write DXF files (ascii & binary) **
+** **
+** Copyright (C) 2011-2014 J.F. Soriano (Rallaz), rallazz@gmail.com **
+** **
+** This library is free software, licensed under the terms of the GNU **
+** General Public License as published by the Free Software Foundation, **
+** either version 2 of the License, or (at your option) any later version. **
+** You should have received a copy of the GNU General Public License **
+** along with this program. If not, see <http://www.gnu.org/licenses/>. **
+******************************************************************************/
+
+/**
+ * Reed-Solomon codec
+ * Reed Solomon code lifted from encoder/decoder for Reed-Solomon written by Simon Rockliff
+ *
+ * Original code:
+ * This program may be freely modified and/or given to whoever wants it.
+ * A condition of such distribution is that the author's contribution be
+ * acknowledged by his name being left in the comments heading the program,
+ * however no responsibility is accepted for any financial or other loss which
+ * may result from some unforseen errors or malfunctioning of the program
+ * during use.
+ * Simon Rockliff, 26th June 1991
+ */
+
+
+#include "rscodec.h"
+#include <new> // std::nothrow
+#include <fstream>
+
+RScodec::RScodec(unsigned int pp, int mm, int tt) {
+ this->mm = mm;
+ this->tt = tt;
+ nn = (1<<mm) -1; //mm==8 nn=255
+ kk = nn -(tt*2);
+ isOk = true;
+
+ alpha_to = new (std::nothrow) int[nn+1];
+ index_of = new (std::nothrow) unsigned int[nn+1];
+ gg = new (std::nothrow) int[nn-kk+1];
+
+ RSgenerate_gf(pp) ;
+ /* compute the generator polynomial for this RS code */
+ RSgen_poly() ;
+}
+
+RScodec::~RScodec() {
+ delete[] alpha_to;
+ delete[] index_of;
+ delete[] gg;
+}
+
+
+/* generate GF(2^mm) from the irreducible polynomial p(X) in pp[0]..pp[mm]
+ lookup tables: index->polynomial form alpha_to[] contains j=alpha**i;
+ polynomial form -> index form index_of[j=alpha**i] = i
+ alpha=2 is the primitive element of GF(2^mm)
+*/
+void RScodec::RSgenerate_gf(unsigned int pp) {
+ int i, mask ;
+ int pb;
+
+ mask = 1 ;
+ alpha_to[mm] = 0 ;
+ for (i=0; i<mm; i++) {
+ alpha_to[i] = mask ;
+ index_of[alpha_to[i]] = i ;
+ pb = (pp >>(mm-1-i)) & 1;
+ if (pb!=0) {
+ alpha_to[mm] ^= mask;
+ }
+ mask <<= 1 ;
+ }
+ index_of[alpha_to[mm]] = mm ;
+ mask >>= 1 ;
+ for (i=mm+1; i<nn; i++) {
+ if (alpha_to[i-1] >= mask) {
+ alpha_to[i] = alpha_to[mm] ^ ((alpha_to[i-1]^mask)<<1) ;
+ } else alpha_to[i] = alpha_to[i-1]<<1 ;
+ index_of[alpha_to[i]] = i ;
+ }
+ index_of[0] = -1 ;
+}
+
+
+/* Obtain the generator polynomial of the tt-error correcting, length
+ nn=(2^mm -1) Reed Solomon code from the product of (X+alpha**i), i=1..2*tt
+*/
+void RScodec::RSgen_poly() {
+ int i,j ;
+ int tmp;
+ int bb = nn-kk;; //nn-kk length of parity data
+
+ gg[0] = 2 ; /* primitive element alpha = 2 for GF(2**mm) */
+ gg[1] = 1 ; /* g(x) = (X+alpha) initially */
+ for (i=2; i<=bb; i++) {
+ gg[i] = 1 ;
+ for (j=i-1; j>0; j--)
+ if (gg[j] != 0) {
+ if (gg[j]<0) { isOk=false; return; }
+ tmp = (index_of[gg[j]]+i)%nn;
+ if (tmp<0) { isOk=false; return; }
+ gg[j] = gg[j-1]^ alpha_to[tmp] ;
+ } else {
+ gg[j] = gg[j-1] ;
+ }
+ gg[0] = alpha_to[(index_of[gg[0]]+i)%nn] ; /* gg[0] can never be zero */
+ }
+ /* convert gg[] to index form for quicker encoding */
+ for (i=0; i<=bb; i++) gg[i] = index_of[gg[i]] ;
+}
+
+int RScodec::calcDecode(unsigned char* data, int* recd, int** elp, int* d, int* l, int* u_lu, int* s, int* root, int* loc, int* z, int* err, int* reg, int bb)
+{
+ if (!isOk) return -1;
+ int count = 0;
+ int syn_error = 0;
+ int i, j, u, q;
+
+ // for (int i=0; i<nn; i++)
+ // recd[i] = index_of[recd[i]] ; /* put recd[i] into index form */
+ for (int i = 0, j = bb; i<kk; i++, j++)
+ recd[j] = index_of[data[j]]; /* put data in recd[i] into index form */
+ for (int i = kk, j = 0; i<nn; i++, j++)
+ recd[j] = index_of[data[j]]; /* put data in recd[i] into index form */
+
+ /* first form the syndromes */
+ for (i = 1; i <= bb; i++) {
+ s[i] = 0;
+ for (j = 0; j<nn; j++) {
+ if (recd[j] != -1) {
+ s[i] ^= alpha_to[(recd[j] + i*j) % nn]; /* recd[j] in index form */
+ }
+ }
+ /* convert syndrome from polynomial form to index form */
+ if (s[i] != 0) syn_error = 1; /* set flag if non-zero syndrome => error */
+ s[i] = index_of[s[i]];
+ }
+
+ if (!syn_error) { /* if no errors, ends */
+ /* no non-zero syndromes => no errors: output is received codeword */
+ return 0;
+ }
+
+ /* errors are present, try and correct */
+ /* compute the error location polynomial via the Berlekamp iterative algorithm,
+ following the terminology of Lin and Costello : d[u] is the 'mu'th
+ discrepancy, where u='mu'+1 and 'mu' (the Greek letter!) is the step number
+ ranging from -1 to 2*tt (see L&C), l[u] is the
+ degree of the elp at that step, and u_l[u] is the difference between the
+ step number and the degree of the elp.
+ */
+ /* initialise table entries */
+ d[0] = 0; /* index form */
+ d[1] = s[1]; /* index form */
+ elp[0][0] = 0; /* index form */
+ elp[1][0] = 1; /* polynomial form */
+ for (i = 1; i<bb; i++) {
+ elp[0][i] = -1; /* index form */
+ elp[1][i] = 0; /* polynomial form */
+ }
+ l[0] = 0;
+ l[1] = 0;
+ u_lu[0] = -1;
+ u_lu[1] = 0;
+ u = 0;
+
+ do {
+ u++;
+ if (d[u] == -1) {
+ l[u + 1] = l[u];
+ for (i = 0; i <= l[u]; i++) {
+ elp[u + 1][i] = elp[u][i];
+ elp[u][i] = index_of[elp[u][i]];
+ }
+ }
+ else {
+ /* search for words with greatest u_lu[q] for which d[q]!=0 */
+ q = u - 1;
+ while ((d[q] == -1) && (q>0)) q--;
+ /* have found first non-zero d[q] */
+ if (q>0) {
+ j = q;
+ do {
+ j--;
+ if ((d[j] != -1) && (u_lu[q]<u_lu[j]))
+ q = j;
+ } while (j>0);
+ }
+
+ /* have now found q such that d[u]!=0 and u_lu[q] is maximum */
+ /* store degree of new elp polynomial */
+ if (l[u]>l[q] + u - q) {
+ l[u + 1] = l[u];
+ }
+ else {
+ l[u + 1] = l[q] + u - q;
+ }
+
+ /* form new elp(x) */
+ for (i = 0; i<bb; i++) elp[u + 1][i] = 0;
+ for (i = 0; i <= l[q]; i++){
+ if (elp[q][i] != -1) {
+ elp[u + 1][i + u - q] = alpha_to[(d[u] + nn - d[q] + elp[q][i]) % nn];
+ }
+ }
+ for (i = 0; i <= l[u]; i++) {
+ elp[u + 1][i] ^= elp[u][i];
+ elp[u][i] = index_of[elp[u][i]]; /*convert old elp value to index*/
+ }
+ }
+ u_lu[u + 1] = u - l[u + 1];
+
+ /* form (u+1)th discrepancy */
+ if (u<bb){ /* no discrepancy computed on last iteration */
+ if (s[u + 1] != -1) {
+ d[u + 1] = alpha_to[s[u + 1]];
+ }
+ else {
+ d[u + 1] = 0;
+ }
+ for (i = 1; i <= l[u + 1]; i++){
+ if ((s[u + 1 - i] != -1) && (elp[u + 1][i] != 0)) {
+ d[u + 1] ^= alpha_to[(s[u + 1 - i] + index_of[elp[u + 1][i]]) % nn];
+ }
+ }
+ d[u + 1] = index_of[d[u + 1]]; /* put d[u+1] into index form */
+ }
+ } while ((u<bb) && (l[u + 1] <= tt));
+
+ u++;
+ if (l[u]>tt) { /* elp has degree has degree >tt hence cannot solve */
+ return -1; /* just output is received codeword as is */
+ }
+
+ /* can correct error */
+ /* put elp into index form */
+ for (i = 0; i <= l[u]; i++) elp[u][i] = index_of[elp[u][i]];
+
+ /* find roots of the error location polynomial */
+ for (i = 1; i <= l[u]; i++) {
+ reg[i] = elp[u][i];
+ }
+ count = 0;
+ for (i = 1; i <= nn; i++) {
+ q = 1;
+ for (j = 1; j <= l[u]; j++) {
+ if (reg[j] != -1) {
+ reg[j] = (reg[j] + j) % nn;
+ q ^= alpha_to[reg[j]];
+ }
+ }
+ if (!q) { /* store root and error location number indices */
+ root[count] = i;
+ loc[count] = nn - i;
+ count++;
+ }
+ }
+
+ if (count != l[u]) { /* no. roots != degree of elp => >tt errors and cannot solve */
+ return -1; /* just output is received codeword as is */
+ }
+
+ /* no. roots = degree of elp hence <= tt errors */
+ /* form polynomial z(x) */
+ for (i = 1; i <= l[u]; i++) { /* Z[0] = 1 always - do not need */
+ if ((s[i] != -1) && (elp[u][i] != -1)) {
+ z[i] = alpha_to[s[i]] ^ alpha_to[elp[u][i]];
+ }
+ else if ((s[i] != -1) && (elp[u][i] == -1)) {
+ z[i] = alpha_to[s[i]];
+ }
+ else if ((s[i] == -1) && (elp[u][i] != -1)) {
+ z[i] = alpha_to[elp[u][i]];
+ }
+ else {
+ z[i] = 0;
+ }
+ for (j = 1; j<i; j++) {
+ if ((s[j] != -1) && (elp[u][i - j] != -1)) {
+ z[i] ^= alpha_to[(elp[u][i - j] + s[j]) % nn];
+ }
+ }
+ z[i] = index_of[z[i]]; /* put into index form */
+ }
+
+ /* evaluate errors at locations given by error location numbers loc[i] */
+ for (i = 0; i<nn; i++) err[i] = 0;
+ for (i = 0; i<l[u]; i++) { /* compute numerator of error term first */
+ err[loc[i]] = 1; /* accounts for z[0] */
+ for (j = 1; j <= l[u]; j++) {
+ if (z[j] != -1) {
+ err[loc[i]] ^= alpha_to[(z[j] + j*root[i]) % nn];
+ }
+ }
+ if (err[loc[i]] != 0) {
+ err[loc[i]] = index_of[err[loc[i]]];
+ q = 0; /* form denominator of error term */
+ for (j = 0; j<l[u]; j++) {
+ if (j != i) {
+ q += index_of[1 ^ alpha_to[(loc[j] + root[i]) % nn]];
+ }
+ }
+ q = q % nn;
+ err[loc[i]] = alpha_to[(err[loc[i]] - q + nn) % nn];
+ data[loc[i]] ^= err[loc[i]]; /*change errors by correct data, in polynomial form */
+ }
+ }
+ return count;
+}
+
+/** take the string of symbols in data[i], i=0..(k-1) and encode systematically
+ to produce 2*tt parity symbols in bd[0]..bd[2*tt-1]
+ data[] is input and bd[] is output in polynomial form.
+ Encoding is done by using a feedback shift register with appropriate
+ connections specified by the elements of gg[], which was generated above.
+ Codeword is c(X) = data(X)*X**(nn-kk)+ b(X) */
+bool RScodec::encode(unsigned char *data, unsigned char *parity) {
+ if (!isOk) return false;
+ int i,j ;
+ int feedback ;
+ unsigned char *idata = data;
+ unsigned char *bd = parity;
+ int bb = nn-kk;; //nn-kk length of parity data
+
+ for (i=0; i<bb; i++) bd[i] = 0 ;
+ for (i=kk-1; i>=0; i--) {
+ feedback = index_of[idata[i]^bd[bb-1]] ;
+ if (feedback != -1) {
+ for (j=bb-1; j>0; j--)
+ if (gg[j] != -1)
+ bd[j] = bd[j-1]^alpha_to[(gg[j]+feedback)%nn] ;
+ else
+ bd[j] = bd[j-1] ;
+ bd[0] = alpha_to[(gg[0]+feedback)%nn] ;
+ } else {
+ for (j=bb-1; j>0; j--)
+ bd[j] = bd[j-1] ;
+ bd[0] = 0 ;
+ }
+ }
+ return true;
+}
+
+
+/* assume we have received bits grouped into mm-bit symbols in recd[i],
+ i=0..(nn-1), and recd[i] is index form (ie as powers of alpha).
+ We first compute the 2*tt syndromes by substituting alpha**i into rec(X) and
+ evaluating, storing the syndromes in s[i], i=1..2tt (leave s[0] zero) .
+ Then we use the Berlekamp iteration to find the error location polynomial
+ elp[i]. If the degree of the elp is >tt, we cannot correct all the errors
+ and hence just put out the information symbols uncorrected. If the degree of
+ elp is <=tt, we substitute alpha**i , i=1..n into the elp to get the roots,
+ hence the inverse roots, the error location numbers. If the number of errors
+ located does not equal the degree of the elp, we have more than tt errors
+ and cannot correct them. Otherwise, we then solve for the error value at
+ the error location and correct the error. The procedure is that found in
+ Lin and Costello. For the cases where the number of errors is known to be too
+ large to correct, the information symbols as received are output (the
+ advantage of systematic encoding is that hopefully some of the information
+ symbols will be okay and that if we are in luck, the errors are in the
+ parity part of the transmitted codeword). Of course, these insoluble cases
+ can be returned as error flags to the calling routine if desired. */
+/** return value: number of corrected errors or -1 if can't correct it */
+int RScodec::decode(unsigned char *data) {
+ if (!isOk) return -1;
+ int bb = nn-kk;; //nn-kk length of parity data
+
+ int *recd = new (std::nothrow) int[nn];
+ int **elp = new int*[bb + 2];
+ for (int i = 0; i < bb + 2; ++i)
+ elp[i] = new int[bb];
+ int *d = new int[bb + 2];
+ int *l = new int[bb + 2];
+ int *u_lu = new int[bb + 2];
+ int *s = new int[bb + 1];
+ int *root = new int[tt];
+ int *loc = new int[tt];
+ int *z = new int[tt+1];
+ int *err = new int[nn];
+ int *reg = new int[tt + 1];
+
+ int res = calcDecode(data, recd, elp ,d ,l, u_lu, s, root, loc ,z, err, reg, bb);
+
+ delete[] recd;
+ for (int i = 0; i < bb + 2; ++i)
+ delete[] elp[i];
+ delete[] elp;
+ delete[] d;
+ delete[] l;
+ delete[] u_lu;
+ delete[] s;
+ delete[] root;
+ delete[] loc;
+ delete[] z;
+ delete[] err;
+ delete[] reg;
+
+ return res;
+}
--- /dev/null
+/******************************************************************************
+** libDXFrw - Library to read/write DXF files (ascii & binary) **
+** **
+** Copyright (C) 2011-2014 J.F. Soriano (Rallaz), rallazz@gmail.com **
+** **
+** This library is free software, licensed under the terms of the GNU **
+** General Public License as published by the Free Software Foundation, **
+** either version 2 of the License, or (at your option) any later version. **
+** You should have received a copy of the GNU General Public License **
+** along with this program. If not, see <http://www.gnu.org/licenses/>. **
+******************************************************************************/
+
+/**
+ * Reed-Solomon codec
+ * Reed Solomon code lifted from encoder/decoder for Reed-Solomon written by Simon Rockliff
+ *
+ * Original code:
+ * This program may be freely modified and/or given to whoever wants it.
+ * A condition of such distribution is that the author's contribution be
+ * acknowledged by his name being left in the comments heading the program,
+ * however no responsibility is accepted for any financial or other loss which
+ * may result from some unforseen errors or malfunctioning of the program
+ * during use.
+ * Simon Rockliff, 26th June 1991
+ */
+
+
+
+#ifndef RSCODEC_H
+#define RSCODEC_H
+/**
+mm: RS code over GF(2^4)
+nn: nn= (2^mm) - 1 length of codeword
+tt: number of errors that can be corrected
+kk: kk = nn-2*tt
+pp: irreducible polynomial coeffts, pp [mm] send as int
+*/
+class RScodec {
+public:
+ RScodec(unsigned int pp, int mm, int tt);
+
+ ~RScodec();
+// bool encode(int *data, int *parity);
+// int decode(int *recd);
+ bool encode(unsigned char *data, unsigned char *parity);
+ int decode(unsigned char *data);
+ bool isOkey(){return isOk;}
+ const unsigned int* indexOf() {return index_of;}
+ const int* alphaTo() {return alpha_to;}
+
+private:
+ void RSgenerate_gf(unsigned int pp);
+ void RSgen_poly();
+ int calcDecode(unsigned char* data, int* recd, int** elp, int* d, int* l, int* u_lu, int* s, int* root, int* loc, int* z, int* err, int* reg, int bb);
+
+
+private:
+ int mm; //RS code over GF(2^4)
+ int tt; //number of errors that can be corrected
+ int nn; //(2^mm) - 1 length of codeword
+ int kk; //nn-2*tt length of original data
+
+ int *gg;
+ bool isOk;
+ unsigned int *index_of;
+ int *alpha_to;
+};
+
+#endif // RSCODEC_H
--- /dev/null
+/******************************************************************************
+** libDXFrw - Library to read/write DXF files (ascii & binary) **
+** **
+** Copyright (C) 2011-2015 José F. Soriano, rallazz@gmail.com **
+** **
+** This library is free software, licensed under the terms of the GNU **
+** General Public License as published by the Free Software Foundation, **
+** either version 2 of the License, or (at your option) any later version. **
+** You should have received a copy of the GNU General Public License **
+** along with this program. If not, see <http://www.gnu.org/licenses/>. **
+******************************************************************************/
+
+
+#include "libdwgr.h"
+#include <fstream>
+#include <algorithm>
+#include <sstream>
+#include "intern/drw_dbg.h"
+#include "intern/drw_textcodec.h"
+#include "intern/dwgreader.h"
+#include "intern/dwgreader15.h"
+#include "intern/dwgreader18.h"
+#include "intern/dwgreader21.h"
+#include "intern/dwgreader24.h"
+#include "intern/dwgreader27.h"
+
+#define FIRSTHANDLE 48
+
+/*enum sections {
+ secUnknown,
+ secHeader,
+ secTables,
+ secBlocks,
+ secEntities,
+ secObjects
+};*/
+
+dwgR::dwgR(){
+ DRW_DBGSL(DRW_dbg::NONE);
+ reader = NULL;
+// writer = NULL;
+ applyExt = false;
+ version = DRW::UNKNOWNV;
+ error = DRW::BAD_NONE;
+}
+
+dwgR::~dwgR(){
+ if (reader != NULL)
+ delete reader;
+
+}
+
+void dwgR::setDebug(DRW::DBG_LEVEL lvl){
+ switch (lvl){
+ case DRW::DEBUG:
+ DRW_DBGSL(DRW_dbg::DEBUG);
+ break;
+ default:
+ DRW_DBGSL(DRW_dbg::NONE);
+ }
+}
+
+/*reads metadata and loads image preview*/
+bool dwgR::getPreview(std::istream &stream){
+ bool isOk = false;
+
+ isOk = open(&stream);
+ if (!isOk)
+ return false;
+
+ isOk = reader->readMetaData();
+ if (isOk) {
+ isOk = reader->readPreview();
+ } else
+ error = DRW::BAD_READ_METADATA;
+
+ if (reader != NULL) {
+ delete reader;
+ reader = NULL;
+ }
+ return isOk;
+}
+
+bool dwgR::read(std::istream &stream, DRW_Interface *interface_, bool ext){
+ applyExt = ext;
+ iface = interface_;
+
+ bool isOk = false;
+
+ isOk = open(&stream);
+ if (!isOk)
+ return false;
+
+ isOk = reader->readMetaData();
+ if (isOk) {
+ isOk = reader->readFileHeader();
+ if (isOk) {
+ isOk = processDwg();
+ } else
+ error = DRW::BAD_READ_FILE_HEADER;
+ } else
+ error = DRW::BAD_READ_METADATA;
+
+ if (reader != NULL) {
+ delete reader;
+ reader = NULL;
+ }
+
+ return isOk;
+}
+
+bool dwgR::open(std::istream *stream){
+ char line[7];
+ stream->read (line, 6);
+ line[6]='\0';
+ DRW_DBG("dwgR::read 2\n");
+ DRW_DBG("dwgR::read line version: ");
+ DRW_DBG(line);
+ DRW_DBG("\n");
+
+ if (strcmp(line, "AC1006") == 0)
+ version = DRW::AC1006;
+ else if (strcmp(line, "AC1009") == 0) {
+ version = DRW::AC1009;
+// reader = new dwgReader09(&filestr, this);
+ }else if (strcmp(line, "AC1012") == 0){
+ version = DRW::AC1012;
+ reader = new dwgReader15(stream, this);
+ } else if (strcmp(line, "AC1014") == 0) {
+ version = DRW::AC1014;
+ reader = new dwgReader15(stream, this);
+ } else if (strcmp(line, "AC1015") == 0) {
+ version = DRW::AC1015;
+ reader = new dwgReader15(stream, this);
+ } else if (strcmp(line, "AC1018") == 0){
+ version = DRW::AC1018;
+ reader = new dwgReader18(stream, this);
+ } else if (strcmp(line, "AC1021") == 0) {
+ version = DRW::AC1021;
+ reader = new dwgReader21(stream, this);
+ } else if (strcmp(line, "AC1024") == 0) {
+ version = DRW::AC1024;
+ reader = new dwgReader24(stream, this);
+ } else if (strcmp(line, "AC1027") == 0) {
+ version = DRW::AC1027;
+ reader = new dwgReader27(stream, this);
+ } else
+ version = DRW::UNKNOWNV;
+
+ if (reader == NULL) {
+ error = DRW::BAD_VERSION;
+ return false;
+ }
+ return true;
+}
+
+/********* Reader Process *********/
+
+bool dwgR::processDwg() {
+ DRW_DBG("dwgR::processDwg() start processing dwg\n");
+ bool ret;
+ bool ret2;
+ DRW_Header hdr;
+ ret = reader->readDwgHeader(hdr);
+ if (!ret) {
+ error = DRW::BAD_READ_HEADER;
+ }
+
+ ret2 = reader->readDwgClasses();
+ if (ret && !ret2) {
+ error = DRW::BAD_READ_CLASSES;
+ ret = ret2;
+ }
+
+ ret2 = reader->readDwgHandles();
+ if (ret && !ret2) {
+ error = DRW::BAD_READ_HANDLES;
+ ret = ret2;
+ }
+
+ ret2 = reader->readDwgTables(hdr);
+ if (ret && !ret2) {
+ error = DRW::BAD_READ_TABLES;
+ ret = ret2;
+ }
+
+ iface->addHeader(&hdr);
+
+ for (std::map<duint32, DRW_LType*>::iterator it=reader->ltypemap.begin(); it!=reader->ltypemap.end(); ++it) {
+ DRW_LType *lt = it->second;
+ iface->addLType(const_cast<DRW_LType&>(*lt) );
+ }
+ for (std::map<duint32, DRW_Layer*>::iterator it=reader->layermap.begin(); it!=reader->layermap.end(); ++it) {
+ DRW_Layer *ly = it->second;
+ iface->addLayer(const_cast<DRW_Layer&>(*ly));
+ }
+
+ for (std::map<duint32, DRW_Textstyle*>::iterator it=reader->stylemap.begin(); it!=reader->stylemap.end(); ++it) {
+ DRW_Textstyle *ly = it->second;
+ iface->addTextStyle(const_cast<DRW_Textstyle&>(*ly));
+ }
+
+ for (std::map<duint32, DRW_Dimstyle*>::iterator it=reader->dimstylemap.begin(); it!=reader->dimstylemap.end(); ++it) {
+ DRW_Dimstyle *ly = it->second;
+ iface->addDimStyle(const_cast<DRW_Dimstyle&>(*ly));
+ }
+
+ for (std::map<duint32, DRW_Vport*>::iterator it=reader->vportmap.begin(); it!=reader->vportmap.end(); ++it) {
+ DRW_Vport *ly = it->second;
+ iface->addVport(const_cast<DRW_Vport&>(*ly));
+ }
+
+ for (std::map<duint32, DRW_AppId*>::iterator it=reader->appIdmap.begin(); it!=reader->appIdmap.end(); ++it) {
+ DRW_AppId *ly = it->second;
+ iface->addAppId(const_cast<DRW_AppId&>(*ly));
+ }
+
+ ret2 = reader->readDwgBlocks(*iface);
+ if (ret && !ret2) {
+ error = DRW::BAD_READ_BLOCKS;
+ ret = ret2;
+ }
+
+ ret2 = reader->readDwgEntities(*iface);
+ if (ret && !ret2) {
+ error = DRW::BAD_READ_ENTITIES;
+ ret = ret2;
+ }
+
+ ret2 = reader->readDwgObjects(*iface);
+ if (ret && !ret2) {
+ error = DRW::BAD_READ_OBJECTS;
+ ret = ret2;
+ }
+
+ return ret;
+}
--- /dev/null
+/******************************************************************************
+** libDXFrw - Library to read/write DXF files (ascii & binary) **
+** **
+** Copyright (C) 2011-2015 José F. Soriano, rallazz@gmail.com **
+** **
+** This library is free software, licensed under the terms of the GNU **
+** General Public License as published by the Free Software Foundation, **
+** either version 2 of the License, or (at your option) any later version. **
+** You should have received a copy of the GNU General Public License **
+** along with this program. If not, see <http://www.gnu.org/licenses/>. **
+******************************************************************************/
+
+#ifndef LIBDWGR_H
+#define LIBDWGR_H
+
+#include <string>
+//#include <deque>
+#include "drw_entities.h"
+#include "drw_objects.h"
+#include "drw_classes.h"
+#include "drw_interface.h"
+
+class dwgReader;
+
+class dwgR {
+public:
+ dwgR();
+ ~dwgR();
+ //read: return true if all ok
+ bool read(std::istream &stream, DRW_Interface *interface_, bool ext);
+ bool getPreview(std::istream &stream);
+ DRW::Version getVersion(){return version;}
+ DRW::error getError(){return error;}
+ void setDebug(DRW::DBG_LEVEL lvl);
+
+private:
+ bool open(std::istream *stream);
+ bool processDwg();
+private:
+ DRW::Version version;
+ DRW::error error;
+ std::string fileName;
+ bool applyExt; /*apply extrusion in entities to conv in 2D?*/
+ std::string codePage;
+ DRW_Interface *iface;
+ dwgReader *reader;
+
+};
+
+#endif // LIBDWGR_H
--- /dev/null
+/******************************************************************************
+** libDXFrw - Library to read/write DXF files (ascii & binary) **
+** **
+** Copyright (C) 2011-2015 José F. Soriano, rallazz@gmail.com **
+** **
+** This library is free software, licensed under the terms of the GNU **
+** General Public License as published by the Free Software Foundation, **
+** either version 2 of the License, or (at your option) any later version. **
+** You should have received a copy of the GNU General Public License **
+** along with this program. If not, see <http://www.gnu.org/licenses/>. **
+******************************************************************************/
+
+
+#include "libdxfrw.h"
+#include <fstream>
+#include <algorithm>
+#include <sstream>
+#include <cassert>
+#include "intern/drw_textcodec.h"
+#include "intern/dxfreader.h"
+#include "intern/dxfwriter.h"
+#include "intern/drw_dbg.h"
+
+#define FIRSTHANDLE 48
+
+/*enum sections {
+ secUnknown,
+ secHeader,
+ secTables,
+ secBlocks,
+ secEntities,
+ secObjects
+};*/
+
+dxfRW::dxfRW(){
+ DRW_DBGSL(DRW_dbg::NONE);
+ reader = NULL;
+ writer = NULL;
+ applyExt = false;
+ elParts = 128; //parts munber when convert ellipse to polyline
+}
+dxfRW::~dxfRW(){
+ if (reader != NULL)
+ delete reader;
+ if (writer != NULL)
+ delete writer;
+ for (std::vector<DRW_ImageDef*>::iterator it=imageDef.begin(); it!=imageDef.end(); ++it)
+ delete *it;
+
+ imageDef.clear();
+}
+
+void dxfRW::setDebug(DRW::DBG_LEVEL lvl){
+ switch (lvl){
+ case DRW::DEBUG:
+ DRW_DBGSL(DRW_dbg::DEBUG);
+ break;
+ default:
+ DRW_DBGSL(DRW_dbg::NONE);
+ }
+}
+
+bool dxfRW::read(std::istream &stream, DRW_Interface *interface_, bool ext){
+ applyExt = ext;
+
+ if(interface_ == NULL)
+ return false;
+
+ char line[22];
+ char line2[22] = "AutoCAD Binary DXF\r\n";
+ line2[20] = (char)26;
+ line2[21] = '\0';
+ stream.read (line, 22);
+ iface = interface_;
+ DRW_DBG("dxfRW::read 2\n");
+ if (strcmp(line, line2) == 0) {
+ binFile = true;
+ reader = new dxfReaderBinary(&stream);
+ DRW_DBG("dxfRW::read binary file\n");
+ } else {
+ binFile = false;
+ stream.seekg(0, std::ios::beg);
+ reader = new dxfReaderAscii(&stream);
+ }
+
+ bool isOk = processDxf();
+ delete reader;
+ reader = NULL;
+ return isOk;
+}
+
+bool dxfRW::write(std::ostream &stream, DRW_Interface *interface_, DRW::Version ver, bool bin){
+ version = ver;
+ binFile = bin;
+ iface = interface_;
+ if (binFile) {
+ //write sentinel
+ stream << "AutoCAD Binary DXF\r\n" << (char)26 << '\0';
+ writer = new dxfWriterBinary(&stream);
+ DRW_DBG("dxfRW::read binary file\n");
+ } else {
+ writer = new dxfWriterAscii(&stream);
+ std::string comm = std::string("dxfrw ") + std::string(DRW_VERSION);
+ writer->writeString(999, comm);
+ }
+ DRW_Header header;
+ iface->writeHeader(header);
+ writer->writeString(0, "SECTION");
+ entCount =FIRSTHANDLE;
+ header.write(writer, version);
+ writer->writeString(0, "ENDSEC");
+ if (ver > DRW::AC1009) {
+ writer->writeString(0, "SECTION");
+ writer->writeString(2, "CLASSES");
+ writer->writeString(0, "ENDSEC");
+ }
+ writer->writeString(0, "SECTION");
+ writer->writeString(2, "TABLES");
+ writeTables();
+ writer->writeString(0, "ENDSEC");
+ writer->writeString(0, "SECTION");
+ writer->writeString(2, "BLOCKS");
+ writeBlocks();
+ writer->writeString(0, "ENDSEC");
+
+ writer->writeString(0, "SECTION");
+ writer->writeString(2, "ENTITIES");
+ iface->writeEntities();
+ writer->writeString(0, "ENDSEC");
+
+ if (version > DRW::AC1009) {
+ writer->writeString(0, "SECTION");
+ writer->writeString(2, "OBJECTS");
+ writeObjects();
+ writer->writeString(0, "ENDSEC");
+ }
+ writer->writeString(0, "EOF");
+ stream.flush();
+ delete writer;
+ writer = NULL;
+ return true;
+}
+
+bool dxfRW::writeEntity(DRW_Entity *ent) {
+ ent->handle = ++entCount;
+ writer->writeString(5, toHexStr(ent->handle));
+ if (version > DRW::AC1009) {
+ writer->writeString(100, "AcDbEntity");
+ }
+ if (ent->space == 1)
+ writer->writeInt16(67, 1);
+ if (version > DRW::AC1009) {
+ writer->writeUtf8String(8, ent->layer);
+ writer->writeUtf8String(6, ent->lineType);
+ } else {
+ writer->writeUtf8Caps(8, ent->layer);
+ writer->writeUtf8Caps(6, ent->lineType);
+ }
+ writer->writeInt16(62, ent->color);
+ if (version > DRW::AC1015 && ent->color24 >= 0) {
+ writer->writeInt32(420, ent->color24);
+ }
+ if (version > DRW::AC1014) {
+ writer->writeInt16(370, DRW_LW_Conv::lineWidth2dxfInt(ent->lWeight));
+ }
+ return true;
+}
+
+bool dxfRW::writeLineType(DRW_LType *ent){
+ std::string strname = ent->name;
+
+ transform(strname.begin(), strname.end(), strname.begin(),::toupper);
+//do not write linetypes handled by library
+ if (strname == "BYLAYER" || strname == "BYBLOCK" || strname == "CONTINUOUS") {
+ return true;
+ }
+ writer->writeString(0, "LTYPE");
+ if (version > DRW::AC1009) {
+ writer->writeString(5, toHexStr(++entCount));
+ if (version > DRW::AC1012) {
+ writer->writeString(330, "5");
+ }
+ writer->writeString(100, "AcDbSymbolTableRecord");
+ writer->writeString(100, "AcDbLinetypeTableRecord");
+ writer->writeUtf8String(2, ent->name);
+ } else
+ writer->writeUtf8Caps(2, ent->name);
+ writer->writeInt16(70, ent->flags);
+ writer->writeUtf8String(3, ent->desc);
+ ent->update();
+ writer->writeInt16(72, 65);
+ writer->writeInt16(73, ent->size);
+ writer->writeDouble(40, ent->length);
+
+ for (unsigned int i = 0; i< ent->path.size(); i++){
+ writer->writeDouble(49, ent->path.at(i));
+ if (version > DRW::AC1009) {
+ writer->writeInt16(74, 0);
+ }
+ }
+ return true;
+}
+
+bool dxfRW::writeLayer(DRW_Layer *ent){
+ writer->writeString(0, "LAYER");
+ if (!wlayer0 && ent->name == "0") {
+ wlayer0 = true;
+ if (version > DRW::AC1009) {
+ writer->writeString(5, "10");
+ }
+ } else {
+ if (version > DRW::AC1009) {
+ writer->writeString(5, toHexStr(++entCount));
+ }
+ }
+ if (version > DRW::AC1012) {
+ writer->writeString(330, "2");
+ }
+ if (version > DRW::AC1009) {
+ writer->writeString(100, "AcDbSymbolTableRecord");
+ writer->writeString(100, "AcDbLayerTableRecord");
+ writer->writeUtf8String(2, ent->name);
+ } else {
+ writer->writeUtf8Caps(2, ent->name);
+ }
+ writer->writeInt16(70, ent->flags);
+ writer->writeInt16(62, ent->color);
+ if (version > DRW::AC1015 && ent->color24 >= 0) {
+ writer->writeInt32(420, ent->color24);
+ }
+ if (version > DRW::AC1009) {
+ writer->writeUtf8String(6, ent->lineType);
+ if (! ent->plotF)
+ writer->writeBool(290, ent->plotF);
+ writer->writeInt16(370, DRW_LW_Conv::lineWidth2dxfInt(ent->lWeight));
+ writer->writeString(390, "F");
+ } else
+ writer->writeUtf8Caps(6, ent->lineType);
+ if (!ent->extData.empty()){
+ writeExtData(ent->extData);
+ }
+// writer->writeString(347, "10012");
+ return true;
+}
+
+bool dxfRW::writeTextstyle(DRW_Textstyle *ent){
+ writer->writeString(0, "STYLE");
+ if (!dimstyleStd) {
+ //stringstream cause crash in OS/X, bug#3597944
+ std::string name=ent->name;
+ transform(name.begin(), name.end(), name.begin(), toupper);
+ if (name == "STANDARD")
+ dimstyleStd = true;
+ }
+ if (version > DRW::AC1009) {
+ writer->writeString(5, toHexStr(++entCount));
+ }
+
+ if (version > DRW::AC1012) {
+ writer->writeString(330, "2");
+ }
+ if (version > DRW::AC1009) {
+ writer->writeString(100, "AcDbSymbolTableRecord");
+ writer->writeString(100, "AcDbTextStyleTableRecord");
+ writer->writeUtf8String(2, ent->name);
+ } else {
+ writer->writeUtf8Caps(2, ent->name);
+ }
+ writer->writeInt16(70, ent->flags);
+ writer->writeDouble(40, ent->height);
+ writer->writeDouble(41, ent->width);
+ writer->writeDouble(50, ent->oblique);
+ writer->writeInt16(71, ent->genFlag);
+ writer->writeDouble(42, ent->lastHeight);
+ if (version > DRW::AC1009) {
+ writer->writeUtf8String(3, ent->font);
+ writer->writeUtf8String(4, ent->bigFont);
+ if (ent->fontFamily != 0)
+ writer->writeInt32(1071, ent->fontFamily);
+ } else {
+ writer->writeUtf8Caps(3, ent->font);
+ writer->writeUtf8Caps(4, ent->bigFont);
+ }
+ return true;
+}
+
+bool dxfRW::writeVport(DRW_Vport *ent){
+ if (!dimstyleStd) {
+ ent->name = "*ACTIVE";
+ dimstyleStd = true;
+ }
+ writer->writeString(0, "VPORT");
+ if (version > DRW::AC1009) {
+ writer->writeString(5, toHexStr(++entCount));
+ if (version > DRW::AC1012)
+ writer->writeString(330, "2");
+ writer->writeString(100, "AcDbSymbolTableRecord");
+ writer->writeString(100, "AcDbViewportTableRecord");
+ writer->writeUtf8String(2, ent->name);
+ } else
+ writer->writeUtf8Caps(2, ent->name);
+ writer->writeInt16(70, ent->flags);
+ writer->writeDouble(10, ent->lowerLeft.x);
+ writer->writeDouble(20, ent->lowerLeft.y);
+ writer->writeDouble(11, ent->UpperRight.x);
+ writer->writeDouble(21, ent->UpperRight.y);
+ writer->writeDouble(12, ent->center.x);
+ writer->writeDouble(22, ent->center.y);
+ writer->writeDouble(13, ent->snapBase.x);
+ writer->writeDouble(23, ent->snapBase.y);
+ writer->writeDouble(14, ent->snapSpacing.x);
+ writer->writeDouble(24, ent->snapSpacing.y);
+ writer->writeDouble(15, ent->gridSpacing.x);
+ writer->writeDouble(25, ent->gridSpacing.y);
+ writer->writeDouble(16, ent->viewDir.x);
+ writer->writeDouble(26, ent->viewDir.y);
+ writer->writeDouble(36, ent->viewDir.z);
+ writer->writeDouble(17, ent->viewTarget.z);
+ writer->writeDouble(27, ent->viewTarget.z);
+ writer->writeDouble(37, ent->viewTarget.z);
+ writer->writeDouble(40, ent->height);
+ writer->writeDouble(41, ent->ratio);
+ writer->writeDouble(42, ent->lensHeight);
+ writer->writeDouble(43, ent->frontClip);
+ writer->writeDouble(44, ent->backClip);
+ writer->writeDouble(50, ent->snapAngle);
+ writer->writeDouble(51, ent->twistAngle);
+ writer->writeInt16(71, ent->viewMode);
+ writer->writeInt16(72, ent->circleZoom);
+ writer->writeInt16(73, ent->fastZoom);
+ writer->writeInt16(74, ent->ucsIcon);
+ writer->writeInt16(75, ent->snap);
+ writer->writeInt16(76, ent->grid);
+ writer->writeInt16(77, ent->snapStyle);
+ writer->writeInt16(78, ent->snapIsopair);
+ if (version > DRW::AC1014) {
+ writer->writeInt16(281, 0);
+ writer->writeInt16(65, 1);
+ writer->writeDouble(110, 0.0);
+ writer->writeDouble(120, 0.0);
+ writer->writeDouble(130, 0.0);
+ writer->writeDouble(111, 1.0);
+ writer->writeDouble(121, 0.0);
+ writer->writeDouble(131, 0.0);
+ writer->writeDouble(112, 0.0);
+ writer->writeDouble(122, 1.0);
+ writer->writeDouble(132, 0.0);
+ writer->writeInt16(79, 0);
+ writer->writeDouble(146, 0.0);
+ if (version > DRW::AC1018) {
+ writer->writeString(348, "10020");
+ writer->writeInt16(60, ent->gridBehavior);//v2007 undocummented see DRW_Vport class
+ writer->writeInt16(61, 5);
+ writer->writeBool(292, 1);
+ writer->writeInt16(282, 1);
+ writer->writeDouble(141, 0.0);
+ writer->writeDouble(142, 0.0);
+ writer->writeInt16(63, 250);
+ writer->writeInt32(421, 3358443);
+ }
+ }
+ return true;
+}
+
+bool dxfRW::writeDimstyle(DRW_Dimstyle *ent){
+ writer->writeString(0, "DIMSTYLE");
+ if (!dimstyleStd) {
+ std::string name = ent->name;
+ std::transform(name.begin(), name.end(), name.begin(),::toupper);
+ if (name == "STANDARD")
+ dimstyleStd = true;
+ }
+ if (version > DRW::AC1009) {
+ writer->writeString(105, toHexStr(++entCount));
+ }
+
+ if (version > DRW::AC1012) {
+ writer->writeString(330, "A");
+ }
+ if (version > DRW::AC1009) {
+ writer->writeString(100, "AcDbSymbolTableRecord");
+ writer->writeString(100, "AcDbDimStyleTableRecord");
+ writer->writeUtf8String(2, ent->name);
+ } else
+ writer->writeUtf8Caps(2, ent->name);
+ writer->writeInt16(70, ent->flags);
+ if ( version == DRW::AC1009 || !(ent->dimpost.empty()) )
+ writer->writeUtf8String(3, ent->dimpost);
+ if ( version == DRW::AC1009 || !(ent->dimapost.empty()) )
+ writer->writeUtf8String(4, ent->dimapost);
+ if ( version == DRW::AC1009 || !(ent->dimblk.empty()) )
+ writer->writeUtf8String(5, ent->dimblk);
+ if ( version == DRW::AC1009 || !(ent->dimblk1.empty()) )
+ writer->writeUtf8String(6, ent->dimblk1);
+ if ( version == DRW::AC1009 || !(ent->dimblk2.empty()) )
+ writer->writeUtf8String(7, ent->dimblk2);
+ writer->writeDouble(40, ent->dimscale);
+ writer->writeDouble(41, ent->dimasz);
+ writer->writeDouble(42, ent->dimexo);
+ writer->writeDouble(43, ent->dimdli);
+ writer->writeDouble(44, ent->dimexe);
+ writer->writeDouble(45, ent->dimrnd);
+ writer->writeDouble(46, ent->dimdle);
+ writer->writeDouble(47, ent->dimtp);
+ writer->writeDouble(48, ent->dimtm);
+ writer->writeDouble(140, ent->dimtxt);
+ writer->writeDouble(141, ent->dimcen);
+ writer->writeDouble(142, ent->dimtsz);
+ writer->writeDouble(143, ent->dimaltf);
+ writer->writeDouble(144, ent->dimlfac);
+ writer->writeDouble(145, ent->dimtvp);
+ writer->writeDouble(146, ent->dimtfac);
+ writer->writeDouble(147, ent->dimgap);
+ if (version > DRW::AC1014) {
+ writer->writeDouble(148, ent->dimaltrnd);
+ }
+ writer->writeInt16(71, ent->dimtol);
+ writer->writeInt16(72, ent->dimlim);
+ writer->writeInt16(73, ent->dimtih);
+ writer->writeInt16(74, ent->dimtoh);
+ writer->writeInt16(75, ent->dimse1);
+ writer->writeInt16(76, ent->dimse2);
+ writer->writeInt16(77, ent->dimtad);
+ writer->writeInt16(78, ent->dimzin);
+ if (version > DRW::AC1014) {
+ writer->writeInt16(79, ent->dimazin);
+ }
+ writer->writeInt16(170, ent->dimalt);
+ writer->writeInt16(171, ent->dimaltd);
+ writer->writeInt16(172, ent->dimtofl);
+ writer->writeInt16(173, ent->dimsah);
+ writer->writeInt16(174, ent->dimtix);
+ writer->writeInt16(175, ent->dimsoxd);
+ writer->writeInt16(176, ent->dimclrd);
+ writer->writeInt16(177, ent->dimclre);
+ writer->writeInt16(178, ent->dimclrt);
+ if (version > DRW::AC1014) {
+ writer->writeInt16(179, ent->dimadec);
+ }
+ if (version > DRW::AC1009) {
+ if (version < DRW::AC1015)
+ writer->writeInt16(270, ent->dimunit);
+ writer->writeInt16(271, ent->dimdec);
+ writer->writeInt16(272, ent->dimtdec);
+ writer->writeInt16(273, ent->dimaltu);
+ writer->writeInt16(274, ent->dimalttd);
+ writer->writeInt16(275, ent->dimaunit);
+ }
+ if (version > DRW::AC1014) {
+ writer->writeInt16(276, ent->dimfrac);
+ writer->writeInt16(277, ent->dimlunit);
+ writer->writeInt16(278, ent->dimdsep);
+ writer->writeInt16(279, ent->dimtmove);
+ }
+ if (version > DRW::AC1009) {
+ writer->writeInt16(280, ent->dimjust);
+ writer->writeInt16(281, ent->dimsd1);
+ writer->writeInt16(282, ent->dimsd2);
+ writer->writeInt16(283, ent->dimtolj);
+ writer->writeInt16(284, ent->dimtzin);
+ writer->writeInt16(285, ent->dimaltz);
+ writer->writeInt16(286, ent->dimaltttz);
+ if (version < DRW::AC1015)
+ writer->writeInt16(287, ent->dimfit);
+ writer->writeInt16(288, ent->dimupt);
+ }
+ if (version > DRW::AC1014) {
+ writer->writeInt16(289, ent->dimatfit);
+ }
+ if (version > DRW::AC1009 && !ent->dimtxsty.empty()) {
+ writer->writeUtf8String(340, ent->dimtxsty);
+ }
+ if (version > DRW::AC1014) {
+ writer->writeUtf8String(341, ent->dimldrblk);
+ writer->writeInt16(371, ent->dimlwd);
+ writer->writeInt16(372, ent->dimlwe);
+ }
+ return true;
+}
+
+bool dxfRW::writeAppId(DRW_AppId *ent){
+ std::string strname = ent->name;
+ transform(strname.begin(), strname.end(), strname.begin(),::toupper);
+//do not write mandatory ACAD appId, handled by library
+ if (strname == "ACAD")
+ return true;
+ writer->writeString(0, "APPID");
+ if (version > DRW::AC1009) {
+ writer->writeString(5, toHexStr(++entCount));
+ if (version > DRW::AC1014) {
+ writer->writeString(330, "9");
+ }
+ writer->writeString(100, "AcDbSymbolTableRecord");
+ writer->writeString(100, "AcDbRegAppTableRecord");
+ writer->writeUtf8String(2, ent->name);
+ } else {
+ writer->writeUtf8Caps(2, ent->name);
+ }
+ writer->writeInt16(70, ent->flags);
+ return true;
+}
+
+bool dxfRW::writePoint(DRW_Point *ent) {
+ writer->writeString(0, "POINT");
+ writeEntity(ent);
+ if (version > DRW::AC1009) {
+ writer->writeString(100, "AcDbPoint");
+ }
+ writer->writeDouble(10, ent->basePoint.x);
+ writer->writeDouble(20, ent->basePoint.y);
+ if (ent->basePoint.z != 0.0) {
+ writer->writeDouble(30, ent->basePoint.z);
+ }
+ return true;
+}
+
+bool dxfRW::writeLine(DRW_Line *ent) {
+ writer->writeString(0, "LINE");
+ writeEntity(ent);
+ if (version > DRW::AC1009) {
+ writer->writeString(100, "AcDbLine");
+ }
+ writer->writeDouble(10, ent->basePoint.x);
+ writer->writeDouble(20, ent->basePoint.y);
+ if (ent->basePoint.z != 0.0 || ent->secPoint.z != 0.0) {
+ writer->writeDouble(30, ent->basePoint.z);
+ writer->writeDouble(11, ent->secPoint.x);
+ writer->writeDouble(21, ent->secPoint.y);
+ writer->writeDouble(31, ent->secPoint.z);
+ } else {
+ writer->writeDouble(11, ent->secPoint.x);
+ writer->writeDouble(21, ent->secPoint.y);
+ }
+ return true;
+}
+
+bool dxfRW::writeRay(DRW_Ray *ent) {
+ writer->writeString(0, "RAY");
+ writeEntity(ent);
+ if (version > DRW::AC1009) {
+ writer->writeString(100, "AcDbRay");
+ }
+ DRW_Coord crd = ent->secPoint;
+ crd.unitize();
+ writer->writeDouble(10, ent->basePoint.x);
+ writer->writeDouble(20, ent->basePoint.y);
+ if (ent->basePoint.z != 0.0 || ent->secPoint.z != 0.0) {
+ writer->writeDouble(30, ent->basePoint.z);
+ writer->writeDouble(11, crd.x);
+ writer->writeDouble(21, crd.y);
+ writer->writeDouble(31, crd.z);
+ } else {
+ writer->writeDouble(11, crd.x);
+ writer->writeDouble(21, crd.y);
+ }
+ return true;
+}
+
+bool dxfRW::writeXline(DRW_Xline *ent) {
+ writer->writeString(0, "XLINE");
+ writeEntity(ent);
+ if (version > DRW::AC1009) {
+ writer->writeString(100, "AcDbXline");
+ }
+ DRW_Coord crd = ent->secPoint;
+ crd.unitize();
+ writer->writeDouble(10, ent->basePoint.x);
+ writer->writeDouble(20, ent->basePoint.y);
+ if (ent->basePoint.z != 0.0 || ent->secPoint.z != 0.0) {
+ writer->writeDouble(30, ent->basePoint.z);
+ writer->writeDouble(11, crd.x);
+ writer->writeDouble(21, crd.y);
+ writer->writeDouble(31, crd.z);
+ } else {
+ writer->writeDouble(11, crd.x);
+ writer->writeDouble(21, crd.y);
+ }
+ return true;
+}
+
+bool dxfRW::writeCircle(DRW_Circle *ent) {
+ writer->writeString(0, "CIRCLE");
+ writeEntity(ent);
+ if (version > DRW::AC1009) {
+ writer->writeString(100, "AcDbCircle");
+ }
+ writer->writeDouble(10, ent->basePoint.x);
+ writer->writeDouble(20, ent->basePoint.y);
+ if (ent->basePoint.z != 0.0) {
+ writer->writeDouble(30, ent->basePoint.z);
+ }
+ writer->writeDouble(40, ent->radious);
+ return true;
+}
+
+bool dxfRW::writeArc(DRW_Arc *ent) {
+ writer->writeString(0, "ARC");
+ writeEntity(ent);
+ if (version > DRW::AC1009) {
+ writer->writeString(100, "AcDbCircle");
+ }
+ writer->writeDouble(10, ent->basePoint.x);
+ writer->writeDouble(20, ent->basePoint.y);
+ if (ent->basePoint.z != 0.0) {
+ writer->writeDouble(30, ent->basePoint.z);
+ }
+ writer->writeDouble(40, ent->radious);
+ if (version > DRW::AC1009) {
+ writer->writeString(100, "AcDbArc");
+ }
+ writer->writeDouble(50, ent->staangle*ARAD);
+ writer->writeDouble(51, ent->endangle*ARAD);
+ return true;
+}
+
+bool dxfRW::writeEllipse(DRW_Ellipse *ent){
+ //verify axis/ratio and params for full ellipse
+ ent->correctAxis();
+ if (version > DRW::AC1009) {
+ writer->writeString(0, "ELLIPSE");
+ writeEntity(ent);
+ if (version > DRW::AC1009) {
+ writer->writeString(100, "AcDbEllipse");
+ }
+ writer->writeDouble(10, ent->basePoint.x);
+ writer->writeDouble(20, ent->basePoint.y);
+ writer->writeDouble(30, ent->basePoint.z);
+ writer->writeDouble(11, ent->secPoint.x);
+ writer->writeDouble(21, ent->secPoint.y);
+ writer->writeDouble(31, ent->secPoint.z);
+ writer->writeDouble(40, ent->ratio);
+ writer->writeDouble(41, ent->staparam);
+ writer->writeDouble(42, ent->endparam);
+ } else {
+ DRW_Polyline pol;
+ //RLZ: copy properties
+ ent->toPolyline(&pol, elParts);
+ writePolyline(&pol);
+ }
+ return true;
+}
+
+bool dxfRW::writeTrace(DRW_Trace *ent){
+ writer->writeString(0, "TRACE");
+ writeEntity(ent);
+ if (version > DRW::AC1009) {
+ writer->writeString(100, "AcDbTrace");
+ }
+ writer->writeDouble(10, ent->basePoint.x);
+ writer->writeDouble(20, ent->basePoint.y);
+ writer->writeDouble(30, ent->basePoint.z);
+ writer->writeDouble(11, ent->secPoint.x);
+ writer->writeDouble(21, ent->secPoint.y);
+ writer->writeDouble(31, ent->secPoint.z);
+ writer->writeDouble(12, ent->thirdPoint.x);
+ writer->writeDouble(22, ent->thirdPoint.y);
+ writer->writeDouble(32, ent->thirdPoint.z);
+ writer->writeDouble(13, ent->fourPoint.x);
+ writer->writeDouble(23, ent->fourPoint.y);
+ writer->writeDouble(33, ent->fourPoint.z);
+ return true;
+}
+
+bool dxfRW::writeSolid(DRW_Solid *ent){
+ writer->writeString(0, "SOLID");
+ writeEntity(ent);
+ if (version > DRW::AC1009) {
+ writer->writeString(100, "AcDbTrace");
+ }
+ writer->writeDouble(10, ent->basePoint.x);
+ writer->writeDouble(20, ent->basePoint.y);
+ writer->writeDouble(30, ent->basePoint.z);
+ writer->writeDouble(11, ent->secPoint.x);
+ writer->writeDouble(21, ent->secPoint.y);
+ writer->writeDouble(31, ent->secPoint.z);
+ writer->writeDouble(12, ent->thirdPoint.x);
+ writer->writeDouble(22, ent->thirdPoint.y);
+ writer->writeDouble(32, ent->thirdPoint.z);
+ writer->writeDouble(13, ent->fourPoint.x);
+ writer->writeDouble(23, ent->fourPoint.y);
+ writer->writeDouble(33, ent->fourPoint.z);
+ return true;
+}
+
+bool dxfRW::write3dface(DRW_3Dface *ent){
+ writer->writeString(0, "3DFACE");
+ writeEntity(ent);
+ if (version > DRW::AC1009) {
+ writer->writeString(100, "AcDbFace");
+ }
+ writer->writeDouble(10, ent->basePoint.x);
+ writer->writeDouble(20, ent->basePoint.y);
+ writer->writeDouble(30, ent->basePoint.z);
+ writer->writeDouble(11, ent->secPoint.x);
+ writer->writeDouble(21, ent->secPoint.y);
+ writer->writeDouble(31, ent->secPoint.z);
+ writer->writeDouble(12, ent->thirdPoint.x);
+ writer->writeDouble(22, ent->thirdPoint.y);
+ writer->writeDouble(32, ent->thirdPoint.z);
+ writer->writeDouble(13, ent->fourPoint.x);
+ writer->writeDouble(23, ent->fourPoint.y);
+ writer->writeDouble(33, ent->fourPoint.z);
+ writer->writeInt16(70, ent->invisibleflag);
+ return true;
+}
+
+bool dxfRW::writeLWPolyline(DRW_LWPolyline *ent){
+ if (version > DRW::AC1009) {
+ writer->writeString(0, "LWPOLYLINE");
+ writeEntity(ent);
+ if (version > DRW::AC1009) {
+ writer->writeString(100, "AcDbPolyline");
+ }
+ ent->vertexnum = ent->vertlist.size();
+ writer->writeInt32(90, ent->vertexnum);
+ writer->writeInt16(70, ent->flags);
+ writer->writeDouble(43, ent->width);
+ if (ent->elevation != 0)
+ writer->writeDouble(38, ent->elevation);
+ if (ent->thickness != 0)
+ writer->writeDouble(39, ent->thickness);
+ for (int i = 0; i< ent->vertexnum; i++){
+ DRW_Vertex2D *v = ent->vertlist.at(i);
+ writer->writeDouble(10, v->x);
+ writer->writeDouble(20, v->y);
+ if (v->stawidth != 0)
+ writer->writeDouble(40, v->stawidth);
+ if (v->endwidth != 0)
+ writer->writeDouble(41, v->endwidth);
+ if (v->bulge != 0)
+ writer->writeDouble(42, v->bulge);
+ }
+ } else {
+ //RLZ: TODO convert lwpolyline in polyline (not exist in acad 12)
+ }
+ return true;
+}
+
+bool dxfRW::writePolyline(DRW_Polyline *ent) {
+ writer->writeString(0, "POLYLINE");
+ writeEntity(ent);
+ if (version > DRW::AC1009) {
+ if (ent->flags & 8 || ent->flags & 16)
+ writer->writeString(100, "AcDb2dPolyline");
+ else
+ writer->writeString(100, "AcDb3dPolyline");
+ } else
+ writer->writeInt16(66, 1);
+ writer->writeDouble(10, 0.0);
+ writer->writeDouble(20, 0.0);
+ writer->writeDouble(30, ent->basePoint.z);
+ if (ent->thickness != 0) {
+ writer->writeDouble(39, ent->thickness);
+ }
+ writer->writeInt16(70, ent->flags);
+ if (ent->defstawidth != 0) {
+ writer->writeDouble(40, ent->defstawidth);
+ }
+ if (ent->defendwidth != 0) {
+ writer->writeDouble(41, ent->defendwidth);
+ }
+ if (ent->flags & 16 || ent->flags & 32) {
+ writer->writeInt16(71, ent->vertexcount);
+ writer->writeInt16(72, ent->facecount);
+ }
+ if (ent->smoothM != 0) {
+ writer->writeInt16(73, ent->smoothM);
+ }
+ if (ent->smoothN != 0) {
+ writer->writeInt16(74, ent->smoothN);
+ }
+ if (ent->curvetype != 0) {
+ writer->writeInt16(75, ent->curvetype);
+ }
+ DRW_Coord crd = ent->extPoint;
+ if (crd.x != 0 || crd.y != 0 || crd.z != 1) {
+ writer->writeDouble(210, crd.x);
+ writer->writeDouble(220, crd.y);
+ writer->writeDouble(230, crd.z);
+ }
+
+ int vertexnum = ent->vertlist.size();
+ for (int i = 0; i< vertexnum; i++){
+ DRW_Vertex *v = ent->vertlist.at(i);
+ writer->writeString(0, "VERTEX");
+ writeEntity(ent);
+ if (version > DRW::AC1009)
+ writer->writeString(100, "AcDbVertex");
+ if ( (v->flags & 128) && !(v->flags & 64) ) {
+ writer->writeDouble(10, 0);
+ writer->writeDouble(20, 0);
+ writer->writeDouble(30, 0);
+ } else {
+ writer->writeDouble(10, v->basePoint.x);
+ writer->writeDouble(20, v->basePoint.y);
+ writer->writeDouble(30, v->basePoint.z);
+ }
+ if (v->stawidth != 0)
+ writer->writeDouble(40, v->stawidth);
+ if (v->endwidth != 0)
+ writer->writeDouble(41, v->endwidth);
+ if (v->bulge != 0)
+ writer->writeDouble(42, v->bulge);
+ if (v->flags != 0) {
+ writer->writeInt16(70, ent->flags);
+ }
+ if (v->flags & 2) {
+ writer->writeDouble(50, v->tgdir);
+ }
+ if ( v->flags & 128 ) {
+ if (v->vindex1 != 0) {
+ writer->writeInt16(71, v->vindex1);
+ }
+ if (v->vindex2 != 0) {
+ writer->writeInt16(72, v->vindex2);
+ }
+ if (v->vindex3 != 0) {
+ writer->writeInt16(73, v->vindex3);
+ }
+ if (v->vindex4 != 0) {
+ writer->writeInt16(74, v->vindex4);
+ }
+ if ( !(v->flags & 64) ) {
+ writer->writeInt32(91, v->identifier);
+ }
+ }
+ }
+ writer->writeString(0, "SEQEND");
+ writeEntity(ent);
+ return true;
+}
+
+bool dxfRW::writeSpline(DRW_Spline *ent){
+ if (version > DRW::AC1009) {
+ writer->writeString(0, "SPLINE");
+ writeEntity(ent);
+ if (version > DRW::AC1009) {
+ writer->writeString(100, "AcDbSpline");
+ }
+ writer->writeDouble(210, ent->normalVec.x);
+ writer->writeDouble(220, ent->normalVec.y);
+ writer->writeDouble(230, ent->normalVec.z);
+ writer->writeInt16(70, ent->flags);
+ writer->writeInt16(71, ent->degree);
+ writer->writeInt16(72, ent->nknots);
+ writer->writeInt16(73, ent->ncontrol);
+ writer->writeInt16(74, ent->nfit);
+ writer->writeDouble(42, ent->tolknot);
+ writer->writeDouble(43, ent->tolcontrol);
+ //RLZ: warning check if nknots are correct and ncontrol
+ for (int i = 0; i< ent->nknots; i++){
+ writer->writeDouble(40, ent->knotslist.at(i));
+ }
+ for (int i = 0; i< (int)ent->weightlist.size(); i++) {
+ writer->writeDouble(41, ent->weightlist.at(i));
+ }
+ for (int i = 0; i< ent->ncontrol; i++){
+ DRW_Coord *crd = ent->controllist.at(i);
+ writer->writeDouble(10, crd->x);
+ writer->writeDouble(20, crd->y);
+ writer->writeDouble(30, crd->z);
+ }
+ } else {
+ //RLZ: TODO convert spline in polyline (not exist in acad 12)
+ }
+ return true;
+}
+
+bool dxfRW::writeHatch(DRW_Hatch *ent){
+ if (version > DRW::AC1009) {
+ writer->writeString(0, "HATCH");
+ writeEntity(ent);
+ writer->writeString(100, "AcDbHatch");
+ writer->writeDouble(10, 0.0);
+ writer->writeDouble(20, 0.0);
+ writer->writeDouble(30, ent->basePoint.z);
+ writer->writeDouble(210, ent->extPoint.x);
+ writer->writeDouble(220, ent->extPoint.y);
+ writer->writeDouble(230, ent->extPoint.z);
+ writer->writeString(2, ent->name);
+ writer->writeInt16(70, ent->solid);
+ writer->writeInt16(71, ent->associative);
+ ent->loopsnum = ent->looplist.size();
+ writer->writeInt16(91, ent->loopsnum);
+ //write paths data
+ for (int i = 0; i< ent->loopsnum; i++){
+ DRW_HatchLoop *loop = ent->looplist.at(i);
+ writer->writeInt16(92, loop->type);
+ if ( (loop->type & 2) == 2){
+ //RLZ: polyline boundary writeme
+ } else {
+ //boundary path
+ loop->update();
+ writer->writeInt16(93, loop->numedges);
+ for (int j = 0; j<loop->numedges; ++j) {
+ switch ( (loop->objlist.at(j))->eType) {
+ case DRW::LINE: {
+ writer->writeInt16(72, 1);
+ DRW_Line* l = (DRW_Line*)loop->objlist.at(j);
+ writer->writeDouble(10, l->basePoint.x);
+ writer->writeDouble(20, l->basePoint.y);
+ writer->writeDouble(11, l->secPoint.x);
+ writer->writeDouble(21, l->secPoint.y);
+ break; }
+ case DRW::ARC: {
+ writer->writeInt16(72, 2);
+ DRW_Arc* a = (DRW_Arc*)loop->objlist.at(j);
+ writer->writeDouble(10, a->basePoint.x);
+ writer->writeDouble(20, a->basePoint.y);
+ writer->writeDouble(40, a->radious);
+ writer->writeDouble(50, a->staangle*ARAD);
+ writer->writeDouble(51, a->endangle*ARAD);
+ writer->writeInt16(73, a->isccw);
+ break; }
+ case DRW::ELLIPSE: {
+ writer->writeInt16(72, 3);
+ DRW_Ellipse* a = (DRW_Ellipse*)loop->objlist.at(j);
+ a->correctAxis();
+ writer->writeDouble(10, a->basePoint.x);
+ writer->writeDouble(20, a->basePoint.y);
+ writer->writeDouble(11, a->secPoint.x);
+ writer->writeDouble(21, a->secPoint.y);
+ writer->writeDouble(40, a->ratio);
+ writer->writeDouble(50, a->staparam*ARAD);
+ writer->writeDouble(51, a->endparam*ARAD);
+ writer->writeInt16(73, a->isccw);
+ break; }
+ case DRW::SPLINE:
+ //RLZ: spline boundary writeme
+// writer->writeInt16(72, 4);
+ break;
+ default:
+ break;
+ }
+ }
+ writer->writeInt16(97, 0);
+ }
+ }
+ writer->writeInt16(75, ent->hstyle);
+ writer->writeInt16(76, ent->hpattern);
+ if (!ent->solid){
+ writer->writeDouble(52, ent->angle);
+ writer->writeDouble(41, ent->scale);
+ writer->writeInt16(77, ent->doubleflag);
+ writer->writeInt16(78, ent->deflines);
+ }
+/* if (ent->deflines > 0){
+ writer->writeInt16(78, ent->deflines);
+ }*/
+ writer->writeInt32(98, 0);
+ } else {
+ //RLZ: TODO verify in acad12
+ }
+ return true;
+}
+
+bool dxfRW::writeLeader(DRW_Leader *ent){
+ if (version > DRW::AC1009) {
+ writer->writeString(0, "LEADER");
+ writeEntity(ent);
+ writer->writeString(100, "AcDbLeader");
+ writer->writeUtf8String(3, ent->style);
+ writer->writeInt16(71, ent->arrow);
+ writer->writeInt16(72, ent->leadertype);
+ writer->writeInt16(73, ent->flag);
+ writer->writeInt16(74, ent->hookline);
+ writer->writeInt16(75, ent->hookflag);
+ writer->writeDouble(40, ent->textheight);
+ writer->writeDouble(41, ent->textwidth);
+ writer->writeDouble(76, ent->vertnum);
+ writer->writeDouble(76, ent->vertexlist.size());
+ for (unsigned int i=0; i<ent->vertexlist.size(); i++) {
+ DRW_Coord *vert = ent->vertexlist.at(i);
+ writer->writeDouble(10, vert->x);
+ writer->writeDouble(20, vert->y);
+ writer->writeDouble(30, vert->z);
+ }
+ } else {
+ //RLZ: todo not supported by acad 12 saved as unnamed block
+ }
+ return true;
+}
+bool dxfRW::writeDimension(DRW_Dimension *ent) {
+ if (version > DRW::AC1009) {
+ writer->writeString(0, "DIMENSION");
+ writeEntity(ent);
+ writer->writeString(100, "AcDbDimension");
+ if (!ent->getName().empty()){
+ writer->writeString(2, ent->getName());
+ }
+ writer->writeDouble(10, ent->getDefPoint().x);
+ writer->writeDouble(20, ent->getDefPoint().y);
+ writer->writeDouble(30, ent->getDefPoint().z);
+ writer->writeDouble(11, ent->getTextPoint().x);
+ writer->writeDouble(21, ent->getTextPoint().y);
+ writer->writeDouble(31, ent->getTextPoint().z);
+ if ( !(ent->type & 32))
+ ent->type = ent->type +32;
+ writer->writeInt16(70, ent->type);
+ if ( !(ent->getText().empty()) )
+ writer->writeUtf8String(1, ent->getText());
+ writer->writeInt16(71, ent->getAlign());
+ if ( ent->getTextLineStyle() != 1)
+ writer->writeInt16(72, ent->getTextLineStyle());
+ if ( ent->getTextLineFactor() != 1)
+ writer->writeDouble(41, ent->getTextLineFactor());
+ writer->writeUtf8String(3, ent->getStyle());
+ if ( ent->getTextLineFactor() != 0)
+ writer->writeDouble(53, ent->getDir());
+ writer->writeDouble(210, ent->getExtrusion().x);
+ writer->writeDouble(220, ent->getExtrusion().y);
+ writer->writeDouble(230, ent->getExtrusion().z);
+ if ( ent->hasActualMeasurement())
+ writer->writeDouble(42, ent->getActualMeasurement());
+
+ switch (ent->eType) {
+ case DRW::DIMALIGNED:
+ case DRW::DIMLINEAR: {
+ DRW_DimAligned * dd = (DRW_DimAligned*)ent;
+ writer->writeString(100, "AcDbAlignedDimension");
+ DRW_Coord crd = dd->getClonepoint();
+ if (crd.x != 0 || crd.y != 0 || crd.z != 0) {
+ writer->writeDouble(12, crd.x);
+ writer->writeDouble(22, crd.y);
+ writer->writeDouble(32, crd.z);
+ }
+ writer->writeDouble(13, dd->getDef1Point().x);
+ writer->writeDouble(23, dd->getDef1Point().y);
+ writer->writeDouble(33, dd->getDef1Point().z);
+ writer->writeDouble(14, dd->getDef2Point().x);
+ writer->writeDouble(24, dd->getDef2Point().y);
+ writer->writeDouble(34, dd->getDef2Point().z);
+ if (ent->eType == DRW::DIMLINEAR) {
+ DRW_DimLinear * dl = (DRW_DimLinear*)ent;
+ if (dl->getAngle() != 0)
+ writer->writeDouble(50, dl->getAngle());
+ if (dl->getOblique() != 0)
+ writer->writeDouble(52, dl->getOblique());
+ writer->writeString(100, "AcDbRotatedDimension");
+ }
+ break; }
+ case DRW::DIMRADIAL: {
+ DRW_DimRadial * dd = (DRW_DimRadial*)ent;
+ writer->writeString(100, "AcDbRadialDimension");
+ writer->writeDouble(15, dd->getDiameterPoint().x);
+ writer->writeDouble(25, dd->getDiameterPoint().y);
+ writer->writeDouble(35, dd->getDiameterPoint().z);
+ writer->writeDouble(40, dd->getLeaderLength());
+ break; }
+ case DRW::DIMDIAMETRIC: {
+ DRW_DimDiametric * dd = (DRW_DimDiametric*)ent;
+ writer->writeString(100, "AcDbDiametricDimension");
+ writer->writeDouble(15, dd->getDiameter1Point().x);
+ writer->writeDouble(25, dd->getDiameter1Point().y);
+ writer->writeDouble(35, dd->getDiameter1Point().z);
+ writer->writeDouble(40, dd->getLeaderLength());
+ break; }
+ case DRW::DIMANGULAR: {
+ DRW_DimAngular * dd = (DRW_DimAngular*)ent;
+ writer->writeString(100, "AcDb2LineAngularDimension");
+ writer->writeDouble(13, dd->getFirstLine1().x);
+ writer->writeDouble(23, dd->getFirstLine1().y);
+ writer->writeDouble(33, dd->getFirstLine1().z);
+ writer->writeDouble(14, dd->getFirstLine2().x);
+ writer->writeDouble(24, dd->getFirstLine2().y);
+ writer->writeDouble(34, dd->getFirstLine2().z);
+ writer->writeDouble(15, dd->getSecondLine1().x);
+ writer->writeDouble(25, dd->getSecondLine1().y);
+ writer->writeDouble(35, dd->getSecondLine1().z);
+ writer->writeDouble(16, dd->getDimPoint().x);
+ writer->writeDouble(26, dd->getDimPoint().y);
+ writer->writeDouble(36, dd->getDimPoint().z);
+ break; }
+ case DRW::DIMANGULAR3P: {
+ DRW_DimAngular3p * dd = (DRW_DimAngular3p*)ent;
+ writer->writeDouble(13, dd->getFirstLine().x);
+ writer->writeDouble(23, dd->getFirstLine().y);
+ writer->writeDouble(33, dd->getFirstLine().z);
+ writer->writeDouble(14, dd->getSecondLine().x);
+ writer->writeDouble(24, dd->getSecondLine().y);
+ writer->writeDouble(34, dd->getSecondLine().z);
+ writer->writeDouble(15, dd->getVertexPoint().x);
+ writer->writeDouble(25, dd->getVertexPoint().y);
+ writer->writeDouble(35, dd->getVertexPoint().z);
+ break; }
+ case DRW::DIMORDINATE: {
+ DRW_DimOrdinate * dd = (DRW_DimOrdinate*)ent;
+ writer->writeString(100, "AcDbOrdinateDimension");
+ writer->writeDouble(13, dd->getFirstLine().x);
+ writer->writeDouble(23, dd->getFirstLine().y);
+ writer->writeDouble(33, dd->getFirstLine().z);
+ writer->writeDouble(14, dd->getSecondLine().x);
+ writer->writeDouble(24, dd->getSecondLine().y);
+ writer->writeDouble(34, dd->getSecondLine().z);
+ break; }
+ default:
+ break;
+ }
+ } else {
+ //RLZ: todo not supported by acad 12 saved as unnamed block
+ }
+ return true;
+}
+
+bool dxfRW::writeInsert(DRW_Insert *ent){
+ writer->writeString(0, "INSERT");
+ writeEntity(ent);
+ if (version > DRW::AC1009) {
+ writer->writeString(100, "AcDbBlockReference");
+ writer->writeUtf8String(2, ent->name);
+ } else
+ writer->writeUtf8Caps(2, ent->name);
+ writer->writeDouble(10, ent->basePoint.x);
+ writer->writeDouble(20, ent->basePoint.y);
+ writer->writeDouble(30, ent->basePoint.z);
+ writer->writeDouble(41, ent->xscale);
+ writer->writeDouble(42, ent->yscale);
+ writer->writeDouble(43, ent->zscale);
+ writer->writeDouble(50, (ent->angle)*ARAD); //in dxf angle is writed in degrees
+ writer->writeInt16(70, ent->colcount);
+ writer->writeInt16(71, ent->rowcount);
+ writer->writeDouble(44, ent->colspace);
+ writer->writeDouble(45, ent->rowspace);
+ return true;
+}
+
+bool dxfRW::writeText(DRW_Text *ent){
+ writer->writeString(0, "TEXT");
+ writeEntity(ent);
+ if (version > DRW::AC1009) {
+ writer->writeString(100, "AcDbText");
+ }
+// writer->writeDouble(39, ent->thickness);
+ writer->writeDouble(10, ent->basePoint.x);
+ writer->writeDouble(20, ent->basePoint.y);
+ writer->writeDouble(30, ent->basePoint.z);
+ writer->writeDouble(40, ent->height);
+ writer->writeUtf8String(1, ent->text);
+ writer->writeDouble(50, ent->angle);
+ writer->writeDouble(41, ent->widthscale);
+ writer->writeDouble(51, ent->oblique);
+ if (version > DRW::AC1009)
+ writer->writeUtf8String(7, ent->style);
+ else
+ writer->writeUtf8Caps(7, ent->style);
+ writer->writeInt16(71, ent->textgen);
+ if (ent->alignH != DRW_Text::HLeft) {
+ writer->writeInt16(72, ent->alignH);
+ }
+ if (ent->alignH != DRW_Text::HLeft || ent->alignV != DRW_Text::VBaseLine) {
+ writer->writeDouble(11, ent->secPoint.x);
+ writer->writeDouble(21, ent->secPoint.y);
+ writer->writeDouble(31, ent->secPoint.z);
+ }
+ writer->writeDouble(210, ent->extPoint.x);
+ writer->writeDouble(220, ent->extPoint.y);
+ writer->writeDouble(230, ent->extPoint.z);
+ if (version > DRW::AC1009) {
+ writer->writeString(100, "AcDbText");
+ }
+ if (ent->alignV != DRW_Text::VBaseLine) {
+ writer->writeInt16(73, ent->alignV);
+ }
+ return true;
+}
+
+bool dxfRW::writeMText(DRW_MText *ent){
+ if (version > DRW::AC1009) {
+ writer->writeString(0, "MTEXT");
+ writeEntity(ent);
+ writer->writeString(100, "AcDbMText");
+ writer->writeDouble(10, ent->basePoint.x);
+ writer->writeDouble(20, ent->basePoint.y);
+ writer->writeDouble(30, ent->basePoint.z);
+ writer->writeDouble(40, ent->height);
+ writer->writeDouble(41, ent->widthscale);
+ writer->writeInt16(71, ent->textgen);
+ writer->writeInt16(72, ent->alignH);
+ std::string text = writer->fromUtf8String(ent->text);
+
+ int i;
+ for(i =0; (text.size()-i) > 250; ) {
+ writer->writeString(3, text.substr(i, 250));
+ i +=250;
+ }
+ writer->writeString(1, text.substr(i));
+ writer->writeString(7, ent->style);
+ writer->writeDouble(210, ent->extPoint.x);
+ writer->writeDouble(220, ent->extPoint.y);
+ writer->writeDouble(230, ent->extPoint.z);
+ writer->writeDouble(50, ent->angle);
+ writer->writeInt16(73, ent->alignV);
+ writer->writeDouble(44, ent->interlin);
+//RLZ ... 11, 21, 31 needed?
+ } else {
+ //RLZ: TODO convert mtext in text lines (not exist in acad 12)
+ }
+ return true;
+}
+
+bool dxfRW::writeViewport(DRW_Viewport *ent) {
+ writer->writeString(0, "VIEWPORT");
+ writeEntity(ent);
+ if (version > DRW::AC1009) {
+ writer->writeString(100, "AcDbViewport");
+ }
+ writer->writeDouble(10, ent->basePoint.x);
+ writer->writeDouble(20, ent->basePoint.y);
+ if (ent->basePoint.z != 0.0)
+ writer->writeDouble(30, ent->basePoint.z);
+ writer->writeDouble(40, ent->pswidth);
+ writer->writeDouble(41, ent->psheight);
+ writer->writeInt16(68, ent->vpstatus);
+ writer->writeInt16(69, ent->vpID);
+ writer->writeDouble(12, ent->centerPX);//RLZ: verify if exist in V12
+ writer->writeDouble(22, ent->centerPY);//RLZ: verify if exist in V12
+ return true;
+}
+
+DRW_ImageDef* dxfRW::writeImage(DRW_Image *ent, std::string name){
+ if (version > DRW::AC1009) {
+ //search if exist imagedef with this mane (image inserted more than 1 time)
+ //RLZ: imagedef_reactor seem needed to read in acad
+ DRW_ImageDef *id = NULL;
+ for (unsigned int i=0; i<imageDef.size(); i++) {
+ if (imageDef.at(i)->name == name ) {
+ id = imageDef.at(i);
+ continue;
+ }
+ }
+ if (id == NULL) {
+ id = new DRW_ImageDef();
+ imageDef.push_back(id);
+ id->handle = ++entCount;
+ }
+ id->name = name;
+ std::string idReactor = toHexStr(++entCount);
+
+ writer->writeString(0, "IMAGE");
+ writeEntity(ent);
+ writer->writeString(100, "AcDbRasterImage");
+ writer->writeDouble(10, ent->basePoint.x);
+ writer->writeDouble(20, ent->basePoint.y);
+ writer->writeDouble(30, ent->basePoint.z);
+ writer->writeDouble(11, ent->secPoint.x);
+ writer->writeDouble(21, ent->secPoint.y);
+ writer->writeDouble(31, ent->secPoint.z);
+ writer->writeDouble(12, ent->vVector.x);
+ writer->writeDouble(22, ent->vVector.y);
+ writer->writeDouble(32, ent->vVector.z);
+ writer->writeDouble(13, ent->sizeu);
+ writer->writeDouble(23, ent->sizev);
+ writer->writeString(340, toHexStr(id->handle));
+ writer->writeInt16(70, 1);
+ writer->writeInt16(280, ent->clip);
+ writer->writeInt16(281, ent->brightness);
+ writer->writeInt16(282, ent->contrast);
+ writer->writeInt16(283, ent->fade);
+ writer->writeString(360, idReactor);
+ id->reactors[idReactor] = toHexStr(ent->handle);
+ return id;
+ }
+ return NULL; //not exist in acad 12
+}
+
+bool dxfRW::writeBlockRecord(std::string name){
+ if (version > DRW::AC1009) {
+ writer->writeString(0, "BLOCK_RECORD");
+ writer->writeString(5, toHexStr(++entCount));
+
+ blockMap[name] = entCount;
+ entCount = 2+entCount;//reserve 2 for BLOCK & ENDBLOCK
+ if (version > DRW::AC1014) {
+ writer->writeString(330, "1");
+ }
+ writer->writeString(100, "AcDbSymbolTableRecord");
+ writer->writeString(100, "AcDbBlockTableRecord");
+ writer->writeUtf8String(2, name);
+ if (version > DRW::AC1018) {
+ // writer->writeInt16(340, 22);
+ writer->writeInt16(70, 0);
+ writer->writeInt16(280, 1);
+ writer->writeInt16(281, 0);
+ }
+ }
+ return true;
+}
+
+bool dxfRW::writeBlock(DRW_Block *bk){
+ if (writingBlock) {
+ writer->writeString(0, "ENDBLK");
+ if (version > DRW::AC1009) {
+ writer->writeString(5, toHexStr(currHandle+2));
+ if (version > DRW::AC1014) {
+ writer->writeString(330, toHexStr(currHandle));
+ }
+ writer->writeString(100, "AcDbEntity");
+ }
+ writer->writeString(8, "0");
+ if (version > DRW::AC1009) {
+ writer->writeString(100, "AcDbBlockEnd");
+ }
+ }
+ writingBlock = true;
+ writer->writeString(0, "BLOCK");
+ if (version > DRW::AC1009) {
+ currHandle = (*(blockMap.find(bk->name))).second;
+ writer->writeString(5, toHexStr(currHandle+1));
+ if (version > DRW::AC1014) {
+ writer->writeString(330, toHexStr(currHandle));
+ }
+ writer->writeString(100, "AcDbEntity");
+ }
+ writer->writeString(8, "0");
+ if (version > DRW::AC1009) {
+ writer->writeString(100, "AcDbBlockBegin");
+ writer->writeUtf8String(2, bk->name);
+ } else
+ writer->writeUtf8Caps(2, bk->name);
+ writer->writeInt16(70, bk->flags);
+ writer->writeDouble(10, bk->basePoint.x);
+ writer->writeDouble(20, bk->basePoint.y);
+ if (bk->basePoint.z != 0.0) {
+ writer->writeDouble(30, bk->basePoint.z);
+ }
+ if (version > DRW::AC1009)
+ writer->writeUtf8String(3, bk->name);
+ else
+ writer->writeUtf8Caps(3, bk->name);
+ writer->writeString(1, "");
+
+ return true;
+}
+
+bool dxfRW::writeTables() {
+ writer->writeString(0, "TABLE");
+ writer->writeString(2, "VPORT");
+ if (version > DRW::AC1009) {
+ writer->writeString(5, "8");
+ if (version > DRW::AC1014) {
+ writer->writeString(330, "0");
+ }
+ writer->writeString(100, "AcDbSymbolTable");
+ }
+ writer->writeInt16(70, 1); //end table def
+/*** VPORT ***/
+ dimstyleStd =false;
+ iface->writeVports();
+ if (!dimstyleStd) {
+ DRW_Vport portact;
+ portact.name = "*ACTIVE";
+ writeVport(&portact);
+ }
+ writer->writeString(0, "ENDTAB");
+/*** LTYPE ***/
+ writer->writeString(0, "TABLE");
+ writer->writeString(2, "LTYPE");
+ if (version > DRW::AC1009) {
+ writer->writeString(5, "5");
+ if (version > DRW::AC1014) {
+ writer->writeString(330, "0");
+ }
+ writer->writeString(100, "AcDbSymbolTable");
+ }
+ writer->writeInt16(70, 4); //end table def
+//Mandatory linetypes
+ writer->writeString(0, "LTYPE");
+ if (version > DRW::AC1009) {
+ writer->writeString(5, "14");
+ if (version > DRW::AC1014) {
+ writer->writeString(330, "5");
+ }
+ writer->writeString(100, "AcDbSymbolTableRecord");
+ writer->writeString(100, "AcDbLinetypeTableRecord");
+ writer->writeString(2, "ByBlock");
+ } else
+ writer->writeString(2, "BYBLOCK");
+ writer->writeInt16(70, 0);
+ writer->writeString(3, "");
+ writer->writeInt16(72, 65);
+ writer->writeInt16(73, 0);
+ writer->writeDouble(40, 0.0);
+
+ writer->writeString(0, "LTYPE");
+ if (version > DRW::AC1009) {
+ writer->writeString(5, "15");
+ if (version > DRW::AC1014) {
+ writer->writeString(330, "5");
+ }
+ writer->writeString(100, "AcDbSymbolTableRecord");
+ writer->writeString(100, "AcDbLinetypeTableRecord");
+ writer->writeString(2, "ByLayer");
+ } else
+ writer->writeString(2, "BYLAYER");
+ writer->writeInt16(70, 0);
+ writer->writeString(3, "");
+ writer->writeInt16(72, 65);
+ writer->writeInt16(73, 0);
+ writer->writeDouble(40, 0.0);
+
+ writer->writeString(0, "LTYPE");
+ if (version > DRW::AC1009) {
+ writer->writeString(5, "16");
+ if (version > DRW::AC1014) {
+ writer->writeString(330, "5");
+ }
+ writer->writeString(100, "AcDbSymbolTableRecord");
+ writer->writeString(100, "AcDbLinetypeTableRecord");
+ writer->writeString(2, "Continuous");
+ } else {
+ writer->writeString(2, "CONTINUOUS");
+ }
+ writer->writeInt16(70, 0);
+ writer->writeString(3, "Solid line");
+ writer->writeInt16(72, 65);
+ writer->writeInt16(73, 0);
+ writer->writeDouble(40, 0.0);
+//Aplication linetypes
+ iface->writeLTypes();
+ writer->writeString(0, "ENDTAB");
+/*** LAYER ***/
+ writer->writeString(0, "TABLE");
+ writer->writeString(2, "LAYER");
+ if (version > DRW::AC1009) {
+ writer->writeString(5, "2");
+ if (version > DRW::AC1014) {
+ writer->writeString(330, "0");
+ }
+ writer->writeString(100, "AcDbSymbolTable");
+ }
+ writer->writeInt16(70, 1); //end table def
+ wlayer0 =false;
+ iface->writeLayers();
+ if (!wlayer0) {
+ DRW_Layer lay0;
+ lay0.name = "0";
+ writeLayer(&lay0);
+ }
+ writer->writeString(0, "ENDTAB");
+/*** STYLE ***/
+ writer->writeString(0, "TABLE");
+ writer->writeString(2, "STYLE");
+ if (version > DRW::AC1009) {
+ writer->writeString(5, "3");
+ if (version > DRW::AC1014) {
+ writer->writeString(330, "0");
+ }
+ writer->writeString(100, "AcDbSymbolTable");
+ }
+ writer->writeInt16(70, 3); //end table def
+ dimstyleStd =false;
+ iface->writeTextstyles();
+ if (!dimstyleStd) {
+ DRW_Textstyle tsty;
+ tsty.name = "Standard";
+ writeTextstyle(&tsty);
+ }
+ writer->writeString(0, "ENDTAB");
+
+ writer->writeString(0, "TABLE");
+ writer->writeString(2, "VIEW");
+ if (version > DRW::AC1009) {
+ writer->writeString(5, "6");
+ if (version > DRW::AC1014) {
+ writer->writeString(330, "0");
+ }
+ writer->writeString(100, "AcDbSymbolTable");
+ }
+ writer->writeInt16(70, 0); //end table def
+ writer->writeString(0, "ENDTAB");
+
+ writer->writeString(0, "TABLE");
+ writer->writeString(2, "UCS");
+ if (version > DRW::AC1009) {
+ writer->writeString(5, "7");
+ if (version > DRW::AC1014) {
+ writer->writeString(330, "0");
+ }
+ writer->writeString(100, "AcDbSymbolTable");
+ }
+ writer->writeInt16(70, 0); //end table def
+ writer->writeString(0, "ENDTAB");
+
+ writer->writeString(0, "TABLE");
+ writer->writeString(2, "APPID");
+ if (version > DRW::AC1009) {
+ writer->writeString(5, "9");
+ if (version > DRW::AC1014) {
+ writer->writeString(330, "0");
+ }
+ writer->writeString(100, "AcDbSymbolTable");
+ }
+ writer->writeInt16(70, 1); //end table def
+ writer->writeString(0, "APPID");
+ if (version > DRW::AC1009) {
+ writer->writeString(5, "12");
+ if (version > DRW::AC1014) {
+ writer->writeString(330, "9");
+ }
+ writer->writeString(100, "AcDbSymbolTableRecord");
+ writer->writeString(100, "AcDbRegAppTableRecord");
+ }
+ writer->writeString(2, "ACAD");
+ writer->writeInt16(70, 0);
+ iface->writeAppId();
+ writer->writeString(0, "ENDTAB");
+
+ writer->writeString(0, "TABLE");
+ writer->writeString(2, "DIMSTYLE");
+ if (version > DRW::AC1009) {
+ writer->writeString(5, "A");
+ if (version > DRW::AC1014) {
+ writer->writeString(330, "0");
+ }
+ writer->writeString(100, "AcDbSymbolTable");
+ }
+ writer->writeInt16(70, 1); //end table def
+ if (version > DRW::AC1014) {
+ writer->writeString(100, "AcDbDimStyleTable");
+ writer->writeInt16(71, 1); //end table def
+ }
+ dimstyleStd =false;
+ iface->writeDimstyles();
+ if (!dimstyleStd) {
+ DRW_Dimstyle dsty;
+ dsty.name = "Standard";
+ writeDimstyle(&dsty);
+ }
+ writer->writeString(0, "ENDTAB");
+
+ if (version > DRW::AC1009) {
+ writer->writeString(0, "TABLE");
+ writer->writeString(2, "BLOCK_RECORD");
+ writer->writeString(5, "1");
+ if (version > DRW::AC1014) {
+ writer->writeString(330, "0");
+ }
+ writer->writeString(100, "AcDbSymbolTable");
+ writer->writeInt16(70, 2); //end table def
+ writer->writeString(0, "BLOCK_RECORD");
+ writer->writeString(5, "1F");
+ if (version > DRW::AC1014) {
+ writer->writeString(330, "1");
+ }
+ writer->writeString(100, "AcDbSymbolTableRecord");
+ writer->writeString(100, "AcDbBlockTableRecord");
+ writer->writeString(2, "*Model_Space");
+ if (version > DRW::AC1018) {
+ // writer->writeInt16(340, 22);
+ writer->writeInt16(70, 0);
+ writer->writeInt16(280, 1);
+ writer->writeInt16(281, 0);
+ }
+ writer->writeString(0, "BLOCK_RECORD");
+ writer->writeString(5, "1E");
+ if (version > DRW::AC1014) {
+ writer->writeString(330, "1");
+ }
+ writer->writeString(100, "AcDbSymbolTableRecord");
+ writer->writeString(100, "AcDbBlockTableRecord");
+ writer->writeString(2, "*Paper_Space");
+ if (version > DRW::AC1018) {
+ // writer->writeInt16(340, 22);
+ writer->writeInt16(70, 0);
+ writer->writeInt16(280, 1);
+ writer->writeInt16(281, 0);
+ }
+ }
+ /* allways call writeBlockRecords to iface for prepare unnamed blocks */
+ iface->writeBlockRecords();
+ if (version > DRW::AC1009) {
+ writer->writeString(0, "ENDTAB");
+ }
+return true;
+}
+
+bool dxfRW::writeBlocks() {
+ writer->writeString(0, "BLOCK");
+ if (version > DRW::AC1009) {
+ writer->writeString(5, "20");
+ if (version > DRW::AC1014) {
+ writer->writeString(330, "1F");
+ }
+ writer->writeString(100, "AcDbEntity");
+ }
+ writer->writeString(8, "0");
+ if (version > DRW::AC1009) {
+ writer->writeString(100, "AcDbBlockBegin");
+ writer->writeString(2, "*Model_Space");
+ } else
+ writer->writeString(2, "$MODEL_SPACE");
+ writer->writeInt16(70, 0);
+ writer->writeDouble(10, 0.0);
+ writer->writeDouble(20, 0.0);
+ writer->writeDouble(30, 0.0);
+ if (version > DRW::AC1009)
+ writer->writeString(3, "*Model_Space");
+ else
+ writer->writeString(3, "$MODEL_SPACE");
+ writer->writeString(1, "");
+ writer->writeString(0, "ENDBLK");
+ if (version > DRW::AC1009) {
+ writer->writeString(5, "21");
+ if (version > DRW::AC1014) {
+ writer->writeString(330, "1F");
+ }
+ writer->writeString(100, "AcDbEntity");
+ }
+ writer->writeString(8, "0");
+ if (version > DRW::AC1009)
+ writer->writeString(100, "AcDbBlockEnd");
+
+ writer->writeString(0, "BLOCK");
+ if (version > DRW::AC1009) {
+ writer->writeString(5, "1C");
+ if (version > DRW::AC1014) {
+ writer->writeString(330, "1B");
+ }
+ writer->writeString(100, "AcDbEntity");
+ }
+ writer->writeString(8, "0");
+ if (version > DRW::AC1009) {
+ writer->writeString(100, "AcDbBlockBegin");
+ writer->writeString(2, "*Paper_Space");
+ } else
+ writer->writeString(2, "$PAPER_SPACE");
+ writer->writeInt16(70, 0);
+ writer->writeDouble(10, 0.0);
+ writer->writeDouble(20, 0.0);
+ writer->writeDouble(30, 0.0);
+ if (version > DRW::AC1009)
+ writer->writeString(3, "*Paper_Space");
+ else
+ writer->writeString(3, "$PAPER_SPACE");
+ writer->writeString(1, "");
+ writer->writeString(0, "ENDBLK");
+ if (version > DRW::AC1009) {
+ writer->writeString(5, "1D");
+ if (version > DRW::AC1014) {
+ writer->writeString(330, "1F");
+ }
+ writer->writeString(100, "AcDbEntity");
+ }
+ writer->writeString(8, "0");
+ if (version > DRW::AC1009)
+ writer->writeString(100, "AcDbBlockEnd");
+ writingBlock = false;
+ iface->writeBlocks();
+ if (writingBlock) {
+ writingBlock = false;
+ writer->writeString(0, "ENDBLK");
+ if (version > DRW::AC1009) {
+ writer->writeString(5, toHexStr(currHandle+2));
+// writer->writeString(5, "1D");
+ if (version > DRW::AC1014) {
+ writer->writeString(330, toHexStr(currHandle));
+ }
+ writer->writeString(100, "AcDbEntity");
+ }
+ writer->writeString(8, "0");
+ if (version > DRW::AC1009)
+ writer->writeString(100, "AcDbBlockEnd");
+ }
+ return true;
+}
+
+bool dxfRW::writeObjects() {
+ writer->writeString(0, "DICTIONARY");
+ std::string imgDictH;
+ writer->writeString(5, "C");
+ if (version > DRW::AC1014) {
+ writer->writeString(330, "0");
+ }
+ writer->writeString(100, "AcDbDictionary");
+ writer->writeInt16(281, 1);
+ writer->writeString(3, "ACAD_GROUP");
+ writer->writeString(350, "D");
+ if (imageDef.size() != 0) {
+ writer->writeString(3, "ACAD_IMAGE_DICT");
+ imgDictH = toHexStr(++entCount);
+ writer->writeString(350, imgDictH);
+ }
+ writer->writeString(0, "DICTIONARY");
+ writer->writeString(5, "D");
+ writer->writeString(330, "C");
+ writer->writeString(100, "AcDbDictionary");
+ writer->writeInt16(281, 1);
+//write IMAGEDEF_REACTOR
+ for (unsigned int i=0; i<imageDef.size(); i++) {
+ DRW_ImageDef *id = imageDef.at(i);
+ std::map<std::string, std::string>::iterator it;
+ for ( it=id->reactors.begin() ; it != id->reactors.end(); ++it ) {
+ writer->writeString(0, "IMAGEDEF_REACTOR");
+ writer->writeString(5, (*it).first);
+ writer->writeString(330, (*it).second);
+ writer->writeString(100, "AcDbRasterImageDefReactor");
+ writer->writeInt16(90, 2); //version 2=R14 to v2010
+ writer->writeString(330, (*it).second);
+ }
+ }
+ if (imageDef.size() != 0) {
+ writer->writeString(0, "DICTIONARY");
+ writer->writeString(5, imgDictH);
+ writer->writeString(330, "C");
+ writer->writeString(100, "AcDbDictionary");
+ writer->writeInt16(281, 1);
+ for (unsigned int i=0; i<imageDef.size(); i++) {
+ size_t f1, f2;
+ f1 = imageDef.at(i)->name.find_last_of("/\\");
+ f2 =imageDef.at(i)->name.find_last_of('.');
+ ++f1;
+ writer->writeString(3, imageDef.at(i)->name.substr(f1,f2-f1));
+ writer->writeString(350, toHexStr(imageDef.at(i)->handle) );
+ }
+ }
+ for (unsigned int i=0; i<imageDef.size(); i++) {
+ DRW_ImageDef *id = imageDef.at(i);
+ writer->writeString(0, "IMAGEDEF");
+ writer->writeString(5, toHexStr(id->handle) );
+ if (version > DRW::AC1014) {
+// writer->writeString(330, "0"); handle to DICTIONARY
+ }
+ writer->writeString(102, "{ACAD_REACTORS");
+ std::map<std::string, std::string>::iterator it;
+ for ( it=id->reactors.begin() ; it != id->reactors.end(); ++it ) {
+ writer->writeString(330, (*it).first);
+ }
+ writer->writeString(102, "}");
+ writer->writeString(100, "AcDbRasterImageDef");
+ writer->writeInt16(90, 0); //version 0=R14 to v2010
+ writer->writeUtf8String(1, id->name);
+ writer->writeDouble(10, id->u);
+ writer->writeDouble(20, id->v);
+ writer->writeDouble(11, id->up);
+ writer->writeDouble(21, id->vp);
+ writer->writeInt16(280, id->loaded);
+ writer->writeInt16(281, id->resolution);
+ }
+ //no more needed imageDef, delete it
+ while (!imageDef.empty()) {
+ imageDef.pop_back();
+ }
+
+ return true;
+}
+
+bool dxfRW::writeExtData(const std::vector<DRW_Variant*> &ed){
+ for (std::vector<DRW_Variant*>::const_iterator it=ed.begin(); it!=ed.end(); ++it){
+ switch ((*it)->code) {
+ case 1000:
+ case 1001:
+ case 1002:
+ case 1003:
+ case 1004:
+ case 1005:
+ {int cc = (*it)->code;
+ if ((*it)->type == DRW_Variant::STRING)
+ writer->writeUtf8String(cc, *(*it)->content.s);
+// writer->writeUtf8String((*it)->code, (*it)->content.s);
+ break;}
+ case 1010:
+ case 1011:
+ case 1012:
+ case 1013:
+ if ((*it)->type == DRW_Variant::COORD) {
+ writer->writeDouble((*it)->code, (*it)->content.v->x);
+ writer->writeDouble((*it)->code+10 , (*it)->content.v->y);
+ writer->writeDouble((*it)->code+20 , (*it)->content.v->z);
+ }
+ break;
+ case 1040:
+ case 1041:
+ case 1042:
+ if ((*it)->type == DRW_Variant::DOUBLE)
+ writer->writeDouble((*it)->code, (*it)->content.d);
+ break;
+ case 1070:
+ if ((*it)->type == DRW_Variant::INTEGER)
+ writer->writeInt16((*it)->code, (*it)->content.i);
+ break;
+ case 1071:
+ if ((*it)->type == DRW_Variant::INTEGER)
+ writer->writeInt32((*it)->code, (*it)->content.i);
+ break;
+ default:
+ break;
+ }
+ }
+ return true;
+}
+
+/********* Reader Process *********/
+
+bool dxfRW::processDxf() {
+ DRW_DBG("dxfRW::processDxf() start processing dxf\n");
+ int code;
+ bool more = true;
+ std::string sectionstr;
+// section = secUnknown;
+ while (reader->readRec(&code)) {
+ DRW_DBG(code); DRW_DBG(" processDxf\n");
+ if (code == 999) {
+ header.addComment(reader->getString());
+ } else if (code == 0) {
+ sectionstr = reader->getString();
+ DRW_DBG(sectionstr); DRW_DBG(" processDxf\n");
+ if (sectionstr == "EOF") {
+ return true; //found EOF terminate
+ }
+ if (sectionstr == "SECTION") {
+ more = reader->readRec(&code);
+ DRW_DBG(code); DRW_DBG(" processDxf\n");
+ if (!more)
+ return false; //wrong dxf file
+ if (code == 2) {
+ sectionstr = reader->getString();
+ DRW_DBG(sectionstr); DRW_DBG(" processDxf\n");
+ //found section, process it
+ if (sectionstr == "HEADER") {
+ processHeader();
+ } else if (sectionstr == "CLASSES") {
+// processClasses();
+ } else if (sectionstr == "TABLES") {
+ processTables();
+ } else if (sectionstr == "BLOCKS") {
+ processBlocks();
+ } else if (sectionstr == "ENTITIES") {
+ processEntities(false);
+ } else if (sectionstr == "OBJECTS") {
+ processObjects();
+ }
+ }
+ }
+ }
+/* if (!more)
+ return true;*/
+ }
+ return true;
+}
+
+/********* Header Section *********/
+
+bool dxfRW::processHeader() {
+ DRW_DBG("dxfRW::processHeader\n");
+ int code;
+ std::string sectionstr;
+ while (reader->readRec(&code)) {
+ DRW_DBG(code); DRW_DBG(" processHeader\n");
+ if (code == 0) {
+ sectionstr = reader->getString();
+ DRW_DBG(sectionstr); DRW_DBG(" processHeader\n\n");
+ if (sectionstr == "ENDSEC") {
+ iface->addHeader(&header);
+ return true; //found ENDSEC terminate
+ }
+ } else header.parseCode(code, reader);
+ }
+ return true;
+}
+
+/********* Tables Section *********/
+
+bool dxfRW::processTables() {
+ DRW_DBG("dxfRW::processTables\n");
+ int code;
+ std::string sectionstr;
+ bool more = true;
+ while (reader->readRec(&code)) {
+ DRW_DBG(code); DRW_DBG("\n");
+ if (code == 0) {
+ sectionstr = reader->getString();
+ DRW_DBG(sectionstr); DRW_DBG(" processHeader\n\n");
+ if (sectionstr == "TABLE") {
+ more = reader->readRec(&code);
+ DRW_DBG(code); DRW_DBG("\n");
+ if (!more)
+ return false; //wrong dxf file
+ if (code == 2) {
+ sectionstr = reader->getString();
+ DRW_DBG(sectionstr); DRW_DBG(" processHeader\n\n");
+ //found section, process it
+ if (sectionstr == "LTYPE") {
+ processLType();
+ } else if (sectionstr == "LAYER") {
+ processLayer();
+ } else if (sectionstr == "STYLE") {
+ processTextStyle();
+ } else if (sectionstr == "VPORT") {
+ processVports();
+ } else if (sectionstr == "VIEW") {
+// processView();
+ } else if (sectionstr == "UCS") {
+// processUCS();
+ } else if (sectionstr == "APPID") {
+ processAppId();
+ } else if (sectionstr == "DIMSTYLE") {
+ processDimStyle();
+ } else if (sectionstr == "BLOCK_RECORD") {
+// processBlockRecord();
+ }
+ }
+ } else if (sectionstr == "ENDSEC") {
+ return true; //found ENDSEC terminate
+ }
+ }
+ }
+ return true;
+}
+
+bool dxfRW::processLType() {
+ DRW_DBG("dxfRW::processLType\n");
+ int code;
+ std::string sectionstr;
+ bool reading = false;
+ DRW_LType ltype;
+ while (reader->readRec(&code)) {
+ DRW_DBG(code); DRW_DBG("\n");
+ if (code == 0) {
+ if (reading) {
+ ltype.update();
+ iface->addLType(ltype);
+ }
+ sectionstr = reader->getString();
+ DRW_DBG(sectionstr); DRW_DBG("\n");
+ if (sectionstr == "LTYPE") {
+ reading = true;
+ ltype.reset();
+ } else if (sectionstr == "ENDTAB") {
+ return true; //found ENDTAB terminate
+ }
+ } else if (reading)
+ ltype.parseCode(code, reader);
+ }
+ return true;
+}
+
+bool dxfRW::processLayer() {
+ DRW_DBG("dxfRW::processLayer\n");
+ int code;
+ std::string sectionstr;
+ bool reading = false;
+ DRW_Layer layer;
+ while (reader->readRec(&code)) {
+ DRW_DBG(code); DRW_DBG("\n");
+ if (code == 0) {
+ if (reading)
+ iface->addLayer(layer);
+ sectionstr = reader->getString();
+ DRW_DBG(sectionstr); DRW_DBG("\n");
+ if (sectionstr == "LAYER") {
+ reading = true;
+ layer.reset();
+ } else if (sectionstr == "ENDTAB") {
+ return true; //found ENDTAB terminate
+ }
+ } else if (reading)
+ layer.parseCode(code, reader);
+ }
+ return true;
+}
+
+bool dxfRW::processDimStyle() {
+ DRW_DBG("dxfRW::processDimStyle");
+ int code;
+ std::string sectionstr;
+ bool reading = false;
+ DRW_Dimstyle dimSty;
+ while (reader->readRec(&code)) {
+ DRW_DBG(code); DRW_DBG("\n");
+ if (code == 0) {
+ if (reading)
+ iface->addDimStyle(dimSty);
+ sectionstr = reader->getString();
+ DRW_DBG(sectionstr); DRW_DBG("\n");
+ if (sectionstr == "DIMSTYLE") {
+ reading = true;
+ dimSty.reset();
+ } else if (sectionstr == "ENDTAB") {
+ return true; //found ENDTAB terminate
+ }
+ } else if (reading)
+ dimSty.parseCode(code, reader);
+ }
+ return true;
+}
+
+bool dxfRW::processTextStyle(){
+ DRW_DBG("dxfRW::processTextStyle");
+ int code;
+ std::string sectionstr;
+ bool reading = false;
+ DRW_Textstyle TxtSty;
+ while (reader->readRec(&code)) {
+ DRW_DBG(code); DRW_DBG("\n");
+ if (code == 0) {
+ if (reading)
+ iface->addTextStyle(TxtSty);
+ sectionstr = reader->getString();
+ DRW_DBG(sectionstr); DRW_DBG("\n");
+ if (sectionstr == "STYLE") {
+ reading = true;
+ TxtSty.reset();
+ } else if (sectionstr == "ENDTAB") {
+ return true; //found ENDTAB terminate
+ }
+ } else if (reading)
+ TxtSty.parseCode(code, reader);
+ }
+ return true;
+}
+
+bool dxfRW::processVports(){
+ DRW_DBG("dxfRW::processVports");
+ int code;
+ std::string sectionstr;
+ bool reading = false;
+ DRW_Vport vp;
+ while (reader->readRec(&code)) {
+ DRW_DBG(code); DRW_DBG("\n");
+ if (code == 0) {
+ if (reading)
+ iface->addVport(vp);
+ sectionstr = reader->getString();
+ DRW_DBG(sectionstr); DRW_DBG("\n");
+ if (sectionstr == "VPORT") {
+ reading = true;
+ vp.reset();
+ } else if (sectionstr == "ENDTAB") {
+ return true; //found ENDTAB terminate
+ }
+ } else if (reading)
+ vp.parseCode(code, reader);
+ }
+ return true;
+}
+
+bool dxfRW::processAppId(){
+ DRW_DBG("dxfRW::processAppId");
+ int code;
+ std::string sectionstr;
+ bool reading = false;
+ DRW_AppId vp;
+ while (reader->readRec(&code)) {
+ DRW_DBG(code); DRW_DBG("\n");
+ if (code == 0) {
+ if (reading)
+ iface->addAppId(vp);
+ sectionstr = reader->getString();
+ DRW_DBG(sectionstr); DRW_DBG("\n");
+ if (sectionstr == "APPID") {
+ reading = true;
+ vp.reset();
+ } else if (sectionstr == "ENDTAB") {
+ return true; //found ENDTAB terminate
+ }
+ } else if (reading)
+ vp.parseCode(code, reader);
+ }
+ return true;
+}
+
+/********* Block Section *********/
+
+bool dxfRW::processBlocks() {
+ DRW_DBG("dxfRW::processBlocks\n");
+ int code;
+ std::string sectionstr;
+ while (reader->readRec(&code)) {
+ DRW_DBG(code); DRW_DBG("\n");
+ if (code == 0) {
+ sectionstr = reader->getString();
+ DRW_DBG(sectionstr); DRW_DBG("\n");
+ if (sectionstr == "BLOCK") {
+ processBlock();
+ } else if (sectionstr == "ENDSEC") {
+ return true; //found ENDSEC terminate
+ }
+ }
+ }
+ return true;
+}
+
+bool dxfRW::processBlock() {
+ DRW_DBG("dxfRW::processBlock");
+ int code;
+ DRW_Block block;
+ while (reader->readRec(&code)) {
+ DRW_DBG(code); DRW_DBG("\n");
+ switch (code) {
+ case 0: {
+ nextentity = reader->getString();
+ DRW_DBG(nextentity); DRW_DBG("\n");
+ iface->addBlock(block);
+ if (nextentity == "ENDBLK") {
+ iface->endBlock();
+ return true; //found ENDBLK, terminate
+ } else {
+ processEntities(true);
+ iface->endBlock();
+ return true; //found ENDBLK, terminate
+ }
+ }
+ default:
+ block.parseCode(code, reader);
+ break;
+ }
+ }
+ return true;
+}
+
+
+/********* Entities Section *********/
+
+bool dxfRW::processEntities(bool isblock) {
+ DRW_DBG("dxfRW::processEntities\n");
+ int code;
+ if (!reader->readRec(&code)){
+ return false;
+ }
+ bool next = true;
+ if (code == 0) {
+ nextentity = reader->getString();
+ } else if (!isblock) {
+ return false; //first record in entities is 0
+ }
+ do {
+ if (nextentity == "ENDSEC" || nextentity == "ENDBLK") {
+ return true; //found ENDSEC or ENDBLK terminate
+ } else if (nextentity == "POINT") {
+ processPoint();
+ } else if (nextentity == "LINE") {
+ processLine();
+ } else if (nextentity == "CIRCLE") {
+ processCircle();
+ } else if (nextentity == "ARC") {
+ processArc();
+ } else if (nextentity == "ELLIPSE") {
+ processEllipse();
+ } else if (nextentity == "TRACE") {
+ processTrace();
+ } else if (nextentity == "SOLID") {
+ processSolid();
+ } else if (nextentity == "INSERT") {
+ processInsert();
+ } else if (nextentity == "LWPOLYLINE") {
+ processLWPolyline();
+ } else if (nextentity == "POLYLINE") {
+ processPolyline();
+ } else if (nextentity == "TEXT") {
+ processText();
+ } else if (nextentity == "MTEXT") {
+ processMText();
+ } else if (nextentity == "HATCH") {
+ processHatch();
+ } else if (nextentity == "SPLINE") {
+ processSpline();
+ } else if (nextentity == "3DFACE") {
+ process3dface();
+ } else if (nextentity == "VIEWPORT") {
+ processViewport();
+ } else if (nextentity == "IMAGE") {
+ processImage();
+ } else if (nextentity == "DIMENSION") {
+ processDimension();
+ } else if (nextentity == "LEADER") {
+ processLeader();
+ } else if (nextentity == "RAY") {
+ processRay();
+ } else if (nextentity == "XLINE") {
+ processXline();
+ } else {
+ if (reader->readRec(&code)){
+ if (code == 0)
+ nextentity = reader->getString();
+ } else
+ return false; //end of file without ENDSEC
+ }
+
+ } while (next);
+ return true;
+}
+
+bool dxfRW::processEllipse() {
+ DRW_DBG("dxfRW::processEllipse");
+ int code;
+ DRW_Ellipse ellipse;
+ while (reader->readRec(&code)) {
+ DRW_DBG(code); DRW_DBG("\n");
+ switch (code) {
+ case 0: {
+ nextentity = reader->getString();
+ DRW_DBG(nextentity); DRW_DBG("\n");
+ if (applyExt)
+ ellipse.applyExtrusion();
+ iface->addEllipse(ellipse);
+ return true; //found new entity or ENDSEC, terminate
+ }
+ default:
+ ellipse.parseCode(code, reader);
+ break;
+ }
+ }
+ return true;
+}
+
+bool dxfRW::processTrace() {
+ DRW_DBG("dxfRW::processTrace");
+ int code;
+ DRW_Trace trace;
+ while (reader->readRec(&code)) {
+ DRW_DBG(code); DRW_DBG("\n");
+ switch (code) {
+ case 0: {
+ nextentity = reader->getString();
+ DRW_DBG(nextentity); DRW_DBG("\n");
+ if (applyExt)
+ trace.applyExtrusion();
+ iface->addTrace(trace);
+ return true; //found new entity or ENDSEC, terminate
+ }
+ default:
+ trace.parseCode(code, reader);
+ break;
+ }
+ }
+ return true;
+}
+
+bool dxfRW::processSolid() {
+ DRW_DBG("dxfRW::processSolid");
+ int code;
+ DRW_Solid solid;
+ while (reader->readRec(&code)) {
+ DRW_DBG(code); DRW_DBG("\n");
+ switch (code) {
+ case 0: {
+ nextentity = reader->getString();
+ DRW_DBG(nextentity); DRW_DBG("\n");
+ if (applyExt)
+ solid.applyExtrusion();
+ iface->addSolid(solid);
+ return true; //found new entity or ENDSEC, terminate
+ }
+ default:
+ solid.parseCode(code, reader);
+ break;
+ }
+ }
+ return true;
+}
+
+bool dxfRW::process3dface() {
+ DRW_DBG("dxfRW::process3dface");
+ int code;
+ DRW_3Dface face;
+ while (reader->readRec(&code)) {
+ DRW_DBG(code); DRW_DBG("\n");
+ switch (code) {
+ case 0: {
+ nextentity = reader->getString();
+ DRW_DBG(nextentity); DRW_DBG("\n");
+ iface->add3dFace(face);
+ return true; //found new entity or ENDSEC, terminate
+ }
+ default:
+ face.parseCode(code, reader);
+ break;
+ }
+ }
+ return true;
+}
+
+bool dxfRW::processViewport() {
+ DRW_DBG("dxfRW::processViewport");
+ int code;
+ DRW_Viewport vp;
+ while (reader->readRec(&code)) {
+ DRW_DBG(code); DRW_DBG("\n");
+ switch (code) {
+ case 0: {
+ nextentity = reader->getString();
+ DRW_DBG(nextentity); DRW_DBG("\n");
+ iface->addViewport(vp);
+ return true; //found new entity or ENDSEC, terminate
+ }
+ default:
+ vp.parseCode(code, reader);
+ break;
+ }
+ }
+ return true;
+}
+
+bool dxfRW::processPoint() {
+ DRW_DBG("dxfRW::processPoint\n");
+ int code;
+ DRW_Point point;
+ while (reader->readRec(&code)) {
+ DRW_DBG(code); DRW_DBG("\n");
+ switch (code) {
+ case 0: {
+ nextentity = reader->getString();
+ DRW_DBG(nextentity); DRW_DBG("\n");
+ iface->addPoint(point);
+ return true; //found new entity or ENDSEC, terminate
+ }
+ default:
+ point.parseCode(code, reader);
+ break;
+ }
+ }
+ return true;
+}
+
+bool dxfRW::processLine() {
+ DRW_DBG("dxfRW::processLine\n");
+ int code;
+ DRW_Line line;
+ while (reader->readRec(&code)) {
+ DRW_DBG(code); DRW_DBG("\n");
+ switch (code) {
+ case 0: {
+ nextentity = reader->getString();
+ DRW_DBG(nextentity); DRW_DBG("\n");
+ iface->addLine(line);
+ return true; //found new entity or ENDSEC, terminate
+ }
+ default:
+ line.parseCode(code, reader);
+ break;
+ }
+ }
+ return true;
+}
+
+bool dxfRW::processRay() {
+ DRW_DBG("dxfRW::processRay\n");
+ int code;
+ DRW_Ray line;
+ while (reader->readRec(&code)) {
+ DRW_DBG(code); DRW_DBG("\n");
+ switch (code) {
+ case 0: {
+ nextentity = reader->getString();
+ DRW_DBG(nextentity); DRW_DBG("\n");
+ iface->addRay(line);
+ return true; //found new entity or ENDSEC, terminate
+ }
+ default:
+ line.parseCode(code, reader);
+ break;
+ }
+ }
+ return true;
+}
+
+bool dxfRW::processXline() {
+ DRW_DBG("dxfRW::processXline\n");
+ int code;
+ DRW_Xline line;
+ while (reader->readRec(&code)) {
+ DRW_DBG(code); DRW_DBG("\n");
+ switch (code) {
+ case 0: {
+ nextentity = reader->getString();
+ DRW_DBG(nextentity); DRW_DBG("\n");
+ iface->addXline(line);
+ return true; //found new entity or ENDSEC, terminate
+ }
+ default:
+ line.parseCode(code, reader);
+ break;
+ }
+ }
+ return true;
+}
+
+bool dxfRW::processCircle() {
+ DRW_DBG("dxfRW::processPoint\n");
+ int code;
+ DRW_Circle circle;
+ while (reader->readRec(&code)) {
+ DRW_DBG(code); DRW_DBG("\n");
+ switch (code) {
+ case 0: {
+ nextentity = reader->getString();
+ DRW_DBG(nextentity); DRW_DBG("\n");
+ if (applyExt)
+ circle.applyExtrusion();
+ iface->addCircle(circle);
+ return true; //found new entity or ENDSEC, terminate
+ }
+ default:
+ circle.parseCode(code, reader);
+ break;
+ }
+ }
+ return true;
+}
+
+bool dxfRW::processArc() {
+ DRW_DBG("dxfRW::processPoint\n");
+ int code;
+ DRW_Arc arc;
+ while (reader->readRec(&code)) {
+ DRW_DBG(code); DRW_DBG("\n");
+ switch (code) {
+ case 0: {
+ nextentity = reader->getString();
+ DRW_DBG(nextentity); DRW_DBG("\n");
+ if (applyExt)
+ arc.applyExtrusion();
+ iface->addArc(arc);
+ return true; //found new entity or ENDSEC, terminate
+ }
+ default:
+ arc.parseCode(code, reader);
+ break;
+ }
+ }
+ return true;
+}
+
+bool dxfRW::processInsert() {
+ DRW_DBG("dxfRW::processInsert");
+ int code;
+ DRW_Insert insert;
+ while (reader->readRec(&code)) {
+ DRW_DBG(code); DRW_DBG("\n");
+ switch (code) {
+ case 0: {
+ nextentity = reader->getString();
+ DRW_DBG(nextentity); DRW_DBG("\n");
+ iface->addInsert(insert);
+ return true; //found new entity or ENDSEC, terminate
+ }
+ default:
+ insert.parseCode(code, reader);
+ break;
+ }
+ }
+ return true;
+}
+
+bool dxfRW::processLWPolyline() {
+ DRW_DBG("dxfRW::processLWPolyline");
+ int code;
+ DRW_LWPolyline pl;
+ while (reader->readRec(&code)) {
+ DRW_DBG(code); DRW_DBG("\n");
+ switch (code) {
+ case 0: {
+ nextentity = reader->getString();
+ DRW_DBG(nextentity); DRW_DBG("\n");
+ if (applyExt)
+ pl.applyExtrusion();
+ iface->addLWPolyline(pl);
+ return true; //found new entity or ENDSEC, terminate
+ }
+ default:
+ pl.parseCode(code, reader);
+ break;
+ }
+ }
+ return true;
+}
+
+bool dxfRW::processPolyline() {
+ DRW_DBG("dxfRW::processPolyline");
+ int code;
+ DRW_Polyline pl;
+ while (reader->readRec(&code)) {
+ DRW_DBG(code); DRW_DBG("\n");
+ switch (code) {
+ case 0: {
+ nextentity = reader->getString();
+ DRW_DBG(nextentity); DRW_DBG("\n");
+ if (nextentity != "VERTEX") {
+ iface->addPolyline(pl);
+ return true; //found new entity or ENDSEC, terminate
+ } else {
+ processVertex(&pl);
+ }
+ }
+ default:
+ pl.parseCode(code, reader);
+ break;
+ }
+ }
+ return true;
+}
+
+bool dxfRW::processVertex(DRW_Polyline *pl) {
+ DRW_DBG("dxfRW::processVertex");
+ int code;
+ DRW_Vertex *v = new DRW_Vertex();
+ while (reader->readRec(&code)) {
+ DRW_DBG(code); DRW_DBG("\n");
+ switch (code) {
+ case 0: {
+ pl->appendVertex(v);
+ nextentity = reader->getString();
+ DRW_DBG(nextentity); DRW_DBG("\n");
+ if (nextentity == "SEQEND") {
+ return true; //found SEQEND no more vertex, terminate
+ } else if (nextentity == "VERTEX"){
+ v = new DRW_Vertex(); //another vertex
+ }
+ }
+ default:
+ v->parseCode(code, reader);
+ break;
+ }
+ }
+ return true;
+}
+
+bool dxfRW::processText() {
+ DRW_DBG("dxfRW::processText");
+ int code;
+ DRW_Text txt;
+ while (reader->readRec(&code)) {
+ DRW_DBG(code); DRW_DBG("\n");
+ switch (code) {
+ case 0: {
+ nextentity = reader->getString();
+ DRW_DBG(nextentity); DRW_DBG("\n");
+ iface->addText(txt);
+ return true; //found new entity or ENDSEC, terminate
+ }
+ default:
+ txt.parseCode(code, reader);
+ break;
+ }
+ }
+ return true;
+}
+
+bool dxfRW::processMText() {
+ DRW_DBG("dxfRW::processMText");
+ int code;
+ DRW_MText txt;
+ while (reader->readRec(&code)) {
+ DRW_DBG(code); DRW_DBG("\n");
+ switch (code) {
+ case 0: {
+ nextentity = reader->getString();
+ DRW_DBG(nextentity); DRW_DBG("\n");
+ txt.updateAngle();
+ iface->addMText(txt);
+ return true; //found new entity or ENDSEC, terminate
+ }
+ default:
+ txt.parseCode(code, reader);
+ break;
+ }
+ }
+ return true;
+}
+
+bool dxfRW::processHatch() {
+ DRW_DBG("dxfRW::processHatch");
+ int code;
+ DRW_Hatch hatch;
+ while (reader->readRec(&code)) {
+ DRW_DBG(code); DRW_DBG("\n");
+ switch (code) {
+ case 0: {
+ nextentity = reader->getString();
+ DRW_DBG(nextentity); DRW_DBG("\n");
+ iface->addHatch(&hatch);
+ return true; //found new entity or ENDSEC, terminate
+ }
+ default:
+ hatch.parseCode(code, reader);
+ break;
+ }
+ }
+ return true;
+}
+
+
+bool dxfRW::processSpline() {
+ DRW_DBG("dxfRW::processSpline");
+ int code;
+ DRW_Spline sp;
+ while (reader->readRec(&code)) {
+ DRW_DBG(code); DRW_DBG("\n");
+ switch (code) {
+ case 0: {
+ nextentity = reader->getString();
+ DRW_DBG(nextentity); DRW_DBG("\n");
+ iface->addSpline(&sp);
+ return true; //found new entity or ENDSEC, terminate
+ }
+ default:
+ sp.parseCode(code, reader);
+ break;
+ }
+ }
+ return true;
+}
+
+
+bool dxfRW::processImage() {
+ DRW_DBG("dxfRW::processImage");
+ int code;
+ DRW_Image img;
+ while (reader->readRec(&code)) {
+ DRW_DBG(code); DRW_DBG("\n");
+ switch (code) {
+ case 0: {
+ nextentity = reader->getString();
+ DRW_DBG(nextentity); DRW_DBG("\n");
+ iface->addImage(&img);
+ return true; //found new entity or ENDSEC, terminate
+ }
+ default:
+ img.parseCode(code, reader);
+ break;
+ }
+ }
+ return true;
+}
+
+
+bool dxfRW::processDimension() {
+ DRW_DBG("dxfRW::processDimension");
+ int code;
+ DRW_Dimension dim;
+ while (reader->readRec(&code)) {
+ DRW_DBG(code); DRW_DBG("\n");
+ switch (code) {
+ case 0: {
+ nextentity = reader->getString();
+ DRW_DBG(nextentity); DRW_DBG("\n");
+ int type = dim.type & 0x0F;
+ switch (type) {
+ case 0: {
+ DRW_DimLinear d(dim);
+ iface->addDimLinear(&d);
+ break; }
+ case 1: {
+ DRW_DimAligned d(dim);
+ iface->addDimAlign(&d);
+ break; }
+ case 2: {
+ DRW_DimAngular d(dim);
+ iface->addDimAngular(&d);
+ break;}
+ case 3: {
+ DRW_DimDiametric d(dim);
+ iface->addDimDiametric(&d);
+ break; }
+ case 4: {
+ DRW_DimRadial d(dim);
+ iface->addDimRadial(&d);
+ break; }
+ case 5: {
+ DRW_DimAngular3p d(dim);
+ iface->addDimAngular3P(&d);
+ break; }
+ case 6: {
+ DRW_DimOrdinate d(dim);
+ iface->addDimOrdinate(&d);
+ break; }
+ }
+ return true; //found new entity or ENDSEC, terminate
+ }
+ default:
+ dim.parseCode(code, reader);
+ break;
+ }
+ }
+ return true;
+}
+
+bool dxfRW::processLeader() {
+ DRW_DBG("dxfRW::processLeader");
+ int code;
+ DRW_Leader leader;
+ while (reader->readRec(&code)) {
+ DRW_DBG(code); DRW_DBG("\n");
+ switch (code) {
+ case 0: {
+ nextentity = reader->getString();
+ DRW_DBG(nextentity); DRW_DBG("\n");
+ iface->addLeader(&leader);
+ return true; //found new entity or ENDSEC, terminate
+ }
+ default:
+ leader.parseCode(code, reader);
+ break;
+ }
+ }
+ return true;
+}
+
+
+/********* Objects Section *********/
+
+bool dxfRW::processObjects() {
+ DRW_DBG("dxfRW::processObjects\n");
+ int code;
+ if (!reader->readRec(&code)){
+ return false;
+ }
+ bool next = true;
+ if (code == 0) {
+ nextentity = reader->getString();
+ } else {
+ return false; //first record in objects is 0
+ }
+ do {
+ if (nextentity == "ENDSEC") {
+ return true; //found ENDSEC terminate
+ } else if (nextentity == "IMAGEDEF") {
+ processImageDef();
+ } else {
+ if (reader->readRec(&code)){
+ if (code == 0)
+ nextentity = reader->getString();
+ } else
+ return false; //end of file without ENDSEC
+ }
+
+ } while (next);
+ return true;
+}
+
+bool dxfRW::processImageDef() {
+ DRW_DBG("dxfRW::processImageDef");
+ int code;
+ DRW_ImageDef img;
+ while (reader->readRec(&code)) {
+ DRW_DBG(code); DRW_DBG("\n");
+ switch (code) {
+ case 0: {
+ nextentity = reader->getString();
+ DRW_DBG(nextentity); DRW_DBG("\n");
+ iface->linkImage(&img);
+ return true; //found new entity or ENDSEC, terminate
+ }
+ default:
+ img.parseCode(code, reader);
+ break;
+ }
+ }
+ return true;
+}
+
+/** utility function
+ * convert a int to string in hex
+ **/
+std::string dxfRW::toHexStr(int n){
+#if defined(__APPLE__)
+ char buffer[9]= {'\0'};
+ snprintf(buffer,9, "%X", n);
+ return std::string(buffer);
+#else
+ std::ostringstream Convert;
+ Convert << std::uppercase << std::hex << n;
+ return Convert.str();
+#endif
+}
--- /dev/null
+/******************************************************************************
+** libDXFrw - Library to read/write DXF files (ascii & binary) **
+** **
+** Copyright (C) 2011-2015 José F. Soriano, rallazz@gmail.com **
+** **
+** This library is free software, licensed under the terms of the GNU **
+** General Public License as published by the Free Software Foundation, **
+** either version 2 of the License, or (at your option) any later version. **
+** You should have received a copy of the GNU General Public License **
+** along with this program. If not, see <http://www.gnu.org/licenses/>. **
+******************************************************************************/
+
+#ifndef LIBDXFRW_H
+#define LIBDXFRW_H
+
+#include <string>
+#include "drw_entities.h"
+#include "drw_objects.h"
+#include "drw_header.h"
+#include "drw_interface.h"
+
+
+class dxfReader;
+class dxfWriter;
+
+class dxfRW {
+public:
+ dxfRW();
+ ~dxfRW();
+ void setDebug(DRW::DBG_LEVEL lvl);
+ /// reads the file specified in constructor
+ /*!
+ * An interface must be provided. It is used by the class to signal various
+ * components being added.
+ * @param interface_ the interface to use
+ * @param ext should the extrusion be applied to convert in 2D?
+ * @return true for success
+ */
+ bool read(std::istream &stream, DRW_Interface *interface_, bool ext);
+ void setBinary(bool b) {binFile = b;}
+
+ bool write(std::ostream &stream, DRW_Interface *interface_, DRW::Version ver, bool bin);
+ bool writeLineType(DRW_LType *ent);
+ bool writeLayer(DRW_Layer *ent);
+ bool writeDimstyle(DRW_Dimstyle *ent);
+ bool writeTextstyle(DRW_Textstyle *ent);
+ bool writeVport(DRW_Vport *ent);
+ bool writeAppId(DRW_AppId *ent);
+ bool writePoint(DRW_Point *ent);
+ bool writeLine(DRW_Line *ent);
+ bool writeRay(DRW_Ray *ent);
+ bool writeXline(DRW_Xline *ent);
+ bool writeCircle(DRW_Circle *ent);
+ bool writeArc(DRW_Arc *ent);
+ bool writeEllipse(DRW_Ellipse *ent);
+ bool writeTrace(DRW_Trace *ent);
+ bool writeSolid(DRW_Solid *ent);
+ bool write3dface(DRW_3Dface *ent);
+ bool writeLWPolyline(DRW_LWPolyline *ent);
+ bool writePolyline(DRW_Polyline *ent);
+ bool writeSpline(DRW_Spline *ent);
+ bool writeBlockRecord(std::string name);
+ bool writeBlock(DRW_Block *ent);
+ bool writeInsert(DRW_Insert *ent);
+ bool writeMText(DRW_MText *ent);
+ bool writeText(DRW_Text *ent);
+ bool writeHatch(DRW_Hatch *ent);
+ bool writeViewport(DRW_Viewport *ent);
+ DRW_ImageDef *writeImage(DRW_Image *ent, std::string name);
+ bool writeLeader(DRW_Leader *ent);
+ bool writeDimension(DRW_Dimension *ent);
+ void setEllipseParts(int parts){elParts = parts;} /*!< set parts munber when convert ellipse to polyline */
+
+private:
+ /// used by read() to parse the content of the file
+ bool processDxf();
+ bool processHeader();
+ bool processTables();
+ bool processBlocks();
+ bool processBlock();
+ bool processEntities(bool isblock);
+ bool processObjects();
+
+ bool processLType();
+ bool processLayer();
+ bool processDimStyle();
+ bool processTextStyle();
+ bool processVports();
+ bool processAppId();
+
+ bool processPoint();
+ bool processLine();
+ bool processRay();
+ bool processXline();
+ bool processCircle();
+ bool processArc();
+ bool processEllipse();
+ bool processTrace();
+ bool processSolid();
+ bool processInsert();
+ bool processLWPolyline();
+ bool processPolyline();
+ bool processVertex(DRW_Polyline* pl);
+ bool processText();
+ bool processMText();
+ bool processHatch();
+ bool processSpline();
+ bool process3dface();
+ bool processViewport();
+ bool processImage();
+ bool processImageDef();
+ bool processDimension();
+ bool processLeader();
+
+// bool writeHeader();
+ bool writeEntity(DRW_Entity *ent);
+ bool writeTables();
+ bool writeBlocks();
+ bool writeObjects();
+ bool writeExtData(const std::vector<DRW_Variant*> &ed);
+ /*use version from dwgutil.h*/
+ std::string toHexStr(int n);//RLZ removeme
+
+private:
+ DRW::Version version;
+ std::string fileName;
+ std::string codePage;
+ bool binFile;
+ dxfReader *reader;
+ dxfWriter *writer;
+ DRW_Interface *iface;
+ DRW_Header header;
+// int section;
+ std::string nextentity;
+ int entCount;
+ bool wlayer0;
+ bool dimstyleStd;
+ bool applyExt;
+ bool writingBlock;
+ int elParts; /*!< parts munber when convert ellipse to polyline */
+ std::map<std::string,int> blockMap;
+ std::vector<DRW_ImageDef*> imageDef; /*!< imageDef list */
+
+ int currHandle;
+
+};
+
+#endif // LIBDXFRW_H
--- /dev/null
+/*-----------------------------------------------------------------------------
+ * Data structures and prototypes for slvs.lib, a geometric constraint solver.
+ *
+ * See the comments in this file, the accompanying sample code that uses
+ * this library, and the accompanying documentation (DOC.txt).
+ *
+ * Copyright 2009-2013 Jonathan Westhues.
+ *---------------------------------------------------------------------------*/
+
+#ifndef __SLVS_H
+#define __SLVS_H
+
+#ifdef WIN32
+# ifdef EXPORT_DLL
+# define DLL __declspec( dllexport )
+# else
+# define DLL __declspec( dllimport )
+# endif
+#else
+# define DLL
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifdef _MSC_VER
+typedef unsigned __int32 uint32_t;
+#else
+#include <stdint.h>
+#endif
+
+typedef uint32_t Slvs_hParam;
+typedef uint32_t Slvs_hEntity;
+typedef uint32_t Slvs_hConstraint;
+typedef uint32_t Slvs_hGroup;
+
+/* To obtain the 3d (not projected into a workplane) of a constraint or
+ * an entity, specify this instead of the workplane. */
+#define SLVS_FREE_IN_3D 0
+
+
+typedef struct {
+ Slvs_hParam h;
+ Slvs_hGroup group;
+ double val;
+} Slvs_Param;
+
+
+#define SLVS_E_POINT_IN_3D 50000
+#define SLVS_E_POINT_IN_2D 50001
+
+#define SLVS_E_NORMAL_IN_3D 60000
+#define SLVS_E_NORMAL_IN_2D 60001
+
+#define SLVS_E_DISTANCE 70000
+
+/* The special point, normal, and distance types used for parametric step
+ * and repeat, extrude, and assembly are currently not exposed. Please
+ * contact us if you are interested in using these. */
+
+#define SLVS_E_WORKPLANE 80000
+#define SLVS_E_LINE_SEGMENT 80001
+#define SLVS_E_CUBIC 80002
+#define SLVS_E_CIRCLE 80003
+#define SLVS_E_ARC_OF_CIRCLE 80004
+
+typedef struct {
+ Slvs_hEntity h;
+ Slvs_hGroup group;
+
+ int type;
+
+ Slvs_hEntity wrkpl;
+ Slvs_hEntity point[4];
+ Slvs_hEntity normal;
+ Slvs_hEntity distance;
+
+ Slvs_hParam param[4];
+} Slvs_Entity;
+
+#define SLVS_C_POINTS_COINCIDENT 100000
+#define SLVS_C_PT_PT_DISTANCE 100001
+#define SLVS_C_PT_PLANE_DISTANCE 100002
+#define SLVS_C_PT_LINE_DISTANCE 100003
+#define SLVS_C_PT_FACE_DISTANCE 100004
+#define SLVS_C_PT_IN_PLANE 100005
+#define SLVS_C_PT_ON_LINE 100006
+#define SLVS_C_PT_ON_FACE 100007
+#define SLVS_C_EQUAL_LENGTH_LINES 100008
+#define SLVS_C_LENGTH_RATIO 100009
+#define SLVS_C_EQ_LEN_PT_LINE_D 100010
+#define SLVS_C_EQ_PT_LN_DISTANCES 100011
+#define SLVS_C_EQUAL_ANGLE 100012
+#define SLVS_C_EQUAL_LINE_ARC_LEN 100013
+#define SLVS_C_SYMMETRIC 100014
+#define SLVS_C_SYMMETRIC_HORIZ 100015
+#define SLVS_C_SYMMETRIC_VERT 100016
+#define SLVS_C_SYMMETRIC_LINE 100017
+#define SLVS_C_AT_MIDPOINT 100018
+#define SLVS_C_HORIZONTAL 100019
+#define SLVS_C_VERTICAL 100020
+#define SLVS_C_DIAMETER 100021
+#define SLVS_C_PT_ON_CIRCLE 100022
+#define SLVS_C_SAME_ORIENTATION 100023
+#define SLVS_C_ANGLE 100024
+#define SLVS_C_PARALLEL 100025
+#define SLVS_C_PERPENDICULAR 100026
+#define SLVS_C_ARC_LINE_TANGENT 100027
+#define SLVS_C_CUBIC_LINE_TANGENT 100028
+#define SLVS_C_EQUAL_RADIUS 100029
+#define SLVS_C_PROJ_PT_DISTANCE 100030
+#define SLVS_C_WHERE_DRAGGED 100031
+#define SLVS_C_CURVE_CURVE_TANGENT 100032
+#define SLVS_C_LENGTH_DIFFERENCE 100033
+
+typedef struct {
+ Slvs_hConstraint h;
+ Slvs_hGroup group;
+
+ int type;
+
+ Slvs_hEntity wrkpl;
+
+ double valA;
+ Slvs_hEntity ptA;
+ Slvs_hEntity ptB;
+ Slvs_hEntity entityA;
+ Slvs_hEntity entityB;
+ Slvs_hEntity entityC;
+ Slvs_hEntity entityD;
+
+ int other;
+ int other2;
+} Slvs_Constraint;
+
+
+typedef struct {
+ /*** INPUT VARIABLES
+ *
+ * Here, we specify the parameters and their initial values, the entities,
+ * and the constraints. For example, param[] points to the array of
+ * parameters, which has length params, so that the last valid element
+ * is param[params-1].
+ *
+ * param[] is actually an in/out variable; if the solver is successful,
+ * then the new values (that satisfy the constraints) are written to it. */
+ Slvs_Param *param;
+ int params;
+ Slvs_Entity *entity;
+ int entities;
+ Slvs_Constraint *constraint;
+ int constraints;
+
+ /* If a parameter corresponds to a point (distance, normal, etc.) being
+ * dragged, then specify it here. This will cause the solver to favor
+ * that parameter, and attempt to change it as little as possible even
+ * if that requires it to change other parameters more.
+ *
+ * Unused members of this array should be set to zero. */
+ Slvs_hParam dragged[4];
+
+ /* If the solver fails, then it can determine which constraints are
+ * causing the problem. But this is a relatively slow process (for
+ * a system with n constraints, about n times as long as just solving).
+ * If calculateFaileds is true, then the solver will do so, otherwise
+ * not. */
+ int calculateFaileds;
+
+ /*** OUTPUT VARIABLES
+ *
+ * If the solver fails, then it can report which constraints are causing
+ * the problem. The caller should allocate the array failed[], and pass
+ * its size in faileds.
+ *
+ * The solver will set faileds equal to the number of problematic
+ * constraints, and write their Slvs_hConstraints into failed[]. To
+ * ensure that there is sufficient space for any possible set of
+ * failing constraints, faileds should be greater than or equal to
+ * constraints. */
+ Slvs_hConstraint *failed;
+ int faileds;
+
+ /* The solver indicates the number of unconstrained degrees of freedom. */
+ int dof;
+
+ /* The solver indicates whether the solution succeeded. */
+#define SLVS_RESULT_OKAY 0
+#define SLVS_RESULT_INCONSISTENT 1
+#define SLVS_RESULT_DIDNT_CONVERGE 2
+#define SLVS_RESULT_TOO_MANY_UNKNOWNS 3
+ int result;
+} Slvs_System;
+
+DLL void Slvs_Solve(Slvs_System *sys, Slvs_hGroup hg);
+
+
+/* Our base coordinate system has basis vectors
+ * (1, 0, 0) (0, 1, 0) (0, 0, 1)
+ * A unit quaternion defines a rotation to a new coordinate system with
+ * basis vectors
+ * U V N
+ * which these functions compute from the quaternion. */
+DLL void Slvs_QuaternionU(double qw, double qx, double qy, double qz,
+ double *x, double *y, double *z);
+DLL void Slvs_QuaternionV(double qw, double qx, double qy, double qz,
+ double *x, double *y, double *z);
+DLL void Slvs_QuaternionN(double qw, double qx, double qy, double qz,
+ double *x, double *y, double *z);
+
+/* Similarly, compute a unit quaternion in terms of two basis vectors. */
+DLL void Slvs_MakeQuaternion(double ux, double uy, double uz,
+ double vx, double vy, double vz,
+ double *qw, double *qx, double *qy, double *qz);
+
+
+/*-------------------------------------
+ * These are just convenience functions, to save you the trouble of filling
+ * out the structures by hand. The code is included in the header file to
+ * let the compiler inline them if possible. */
+
+static inline Slvs_Param Slvs_MakeParam(Slvs_hParam h, Slvs_hGroup group, double val)
+{
+ Slvs_Param r;
+ r.h = h;
+ r.group = group;
+ r.val = val;
+ return r;
+}
+static inline Slvs_Entity Slvs_MakePoint2d(Slvs_hEntity h, Slvs_hGroup group,
+ Slvs_hEntity wrkpl,
+ Slvs_hParam u, Slvs_hParam v)
+{
+ Slvs_Entity r;
+ memset(&r, 0, sizeof(r));
+ r.h = h;
+ r.group = group;
+ r.type = SLVS_E_POINT_IN_2D;
+ r.wrkpl = wrkpl;
+ r.param[0] = u;
+ r.param[1] = v;
+ return r;
+}
+static inline Slvs_Entity Slvs_MakePoint3d(Slvs_hEntity h, Slvs_hGroup group,
+ Slvs_hParam x, Slvs_hParam y, Slvs_hParam z)
+{
+ Slvs_Entity r;
+ memset(&r, 0, sizeof(r));
+ r.h = h;
+ r.group = group;
+ r.type = SLVS_E_POINT_IN_3D;
+ r.wrkpl = SLVS_FREE_IN_3D;
+ r.param[0] = x;
+ r.param[1] = y;
+ r.param[2] = z;
+ return r;
+}
+static inline Slvs_Entity Slvs_MakeNormal3d(Slvs_hEntity h, Slvs_hGroup group,
+ Slvs_hParam qw, Slvs_hParam qx,
+ Slvs_hParam qy, Slvs_hParam qz)
+{
+ Slvs_Entity r;
+ memset(&r, 0, sizeof(r));
+ r.h = h;
+ r.group = group;
+ r.type = SLVS_E_NORMAL_IN_3D;
+ r.wrkpl = SLVS_FREE_IN_3D;
+ r.param[0] = qw;
+ r.param[1] = qx;
+ r.param[2] = qy;
+ r.param[3] = qz;
+ return r;
+}
+static inline Slvs_Entity Slvs_MakeNormal2d(Slvs_hEntity h, Slvs_hGroup group,
+ Slvs_hEntity wrkpl)
+{
+ Slvs_Entity r;
+ memset(&r, 0, sizeof(r));
+ r.h = h;
+ r.group = group;
+ r.type = SLVS_E_NORMAL_IN_2D;
+ r.wrkpl = wrkpl;
+ return r;
+}
+static inline Slvs_Entity Slvs_MakeDistance(Slvs_hEntity h, Slvs_hGroup group,
+ Slvs_hEntity wrkpl, Slvs_hParam d)
+{
+ Slvs_Entity r;
+ memset(&r, 0, sizeof(r));
+ r.h = h;
+ r.group = group;
+ r.type = SLVS_E_DISTANCE;
+ r.wrkpl = wrkpl;
+ r.param[0] = d;
+ return r;
+}
+static inline Slvs_Entity Slvs_MakeLineSegment(Slvs_hEntity h, Slvs_hGroup group,
+ Slvs_hEntity wrkpl,
+ Slvs_hEntity ptA, Slvs_hEntity ptB)
+{
+ Slvs_Entity r;
+ memset(&r, 0, sizeof(r));
+ r.h = h;
+ r.group = group;
+ r.type = SLVS_E_LINE_SEGMENT;
+ r.wrkpl = wrkpl;
+ r.point[0] = ptA;
+ r.point[1] = ptB;
+ return r;
+}
+static inline Slvs_Entity Slvs_MakeCubic(Slvs_hEntity h, Slvs_hGroup group,
+ Slvs_hEntity wrkpl,
+ Slvs_hEntity pt0, Slvs_hEntity pt1,
+ Slvs_hEntity pt2, Slvs_hEntity pt3)
+{
+ Slvs_Entity r;
+ memset(&r, 0, sizeof(r));
+ r.h = h;
+ r.group = group;
+ r.type = SLVS_E_CUBIC;
+ r.wrkpl = wrkpl;
+ r.point[0] = pt0;
+ r.point[1] = pt1;
+ r.point[2] = pt2;
+ r.point[3] = pt3;
+ return r;
+}
+static inline Slvs_Entity Slvs_MakeArcOfCircle(Slvs_hEntity h, Slvs_hGroup group,
+ Slvs_hEntity wrkpl,
+ Slvs_hEntity normal,
+ Slvs_hEntity center,
+ Slvs_hEntity start, Slvs_hEntity end)
+{
+ Slvs_Entity r;
+ memset(&r, 0, sizeof(r));
+ r.h = h;
+ r.group = group;
+ r.type = SLVS_E_ARC_OF_CIRCLE;
+ r.wrkpl = wrkpl;
+ r.normal = normal;
+ r.point[0] = center;
+ r.point[1] = start;
+ r.point[2] = end;
+ return r;
+}
+static inline Slvs_Entity Slvs_MakeCircle(Slvs_hEntity h, Slvs_hGroup group,
+ Slvs_hEntity wrkpl,
+ Slvs_hEntity center,
+ Slvs_hEntity normal, Slvs_hEntity radius)
+{
+ Slvs_Entity r;
+ memset(&r, 0, sizeof(r));
+ r.h = h;
+ r.group = group;
+ r.type = SLVS_E_CIRCLE;
+ r.wrkpl = wrkpl;
+ r.point[0] = center;
+ r.normal = normal;
+ r.distance = radius;
+ return r;
+}
+static inline Slvs_Entity Slvs_MakeWorkplane(Slvs_hEntity h, Slvs_hGroup group,
+ Slvs_hEntity origin, Slvs_hEntity normal)
+{
+ Slvs_Entity r;
+ memset(&r, 0, sizeof(r));
+ r.h = h;
+ r.group = group;
+ r.type = SLVS_E_WORKPLANE;
+ r.wrkpl = SLVS_FREE_IN_3D;
+ r.point[0] = origin;
+ r.normal = normal;
+ return r;
+}
+
+static inline Slvs_Constraint Slvs_MakeConstraint(Slvs_hConstraint h,
+ Slvs_hGroup group,
+ int type,
+ Slvs_hEntity wrkpl,
+ double valA,
+ Slvs_hEntity ptA,
+ Slvs_hEntity ptB,
+ Slvs_hEntity entityA,
+ Slvs_hEntity entityB)
+{
+ Slvs_Constraint r;
+ memset(&r, 0, sizeof(r));
+ r.h = h;
+ r.group = group;
+ r.type = type;
+ r.wrkpl = wrkpl;
+ r.valA = valA;
+ r.ptA = ptA;
+ r.ptB = ptB;
+ r.entityA = entityA;
+ r.entityB = entityB;
+ return r;
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
--- /dev/null
+# global
+
+include(GNUInstallDirs)
+
+include_directories(
+ ${OPENGL_INCLUDE_DIR}
+ ${PNG_INCLUDE_DIRS}
+ ${FREETYPE_INCLUDE_DIRS})
+
+link_directories(
+ ${PNG_LIBRARY_DIRS}
+ ${FREETYPE_LIBRARY_DIRS})
+
+add_definitions(
+ ${PNG_CFLAGS_OTHER})
+
+include_directories(
+ ${CMAKE_CURRENT_SOURCE_DIR}
+ ${CMAKE_CURRENT_SOURCE_DIR}/built
+ ${CMAKE_CURRENT_BINARY_DIR})
+
+if(SPACEWARE_FOUND)
+ include_directories(
+ ${SPACEWARE_INCLUDE_DIR})
+endif()
+
+set(HAVE_SPACEWARE ${SPACEWARE_FOUND})
+set(HAVE_GTK ${GTKMM_FOUND})
+configure_file(${CMAKE_CURRENT_SOURCE_DIR}/config.h.in
+ ${CMAKE_CURRENT_BINARY_DIR}/config.h)
+
+# platform utilities
+
+if(WIN32)
+ set(util_SOURCES
+ win32/w32util.cpp)
+else()
+ set(util_SOURCES
+ unix/unixutil.cpp)
+endif()
+
+# libslvs
+
+set(libslvs_SOURCES
+ util.cpp
+ entity.cpp
+ expr.cpp
+ constraint.cpp
+ constrainteq.cpp
+ system.cpp)
+
+set(libslvs_HEADERS
+ solvespace.h)
+
+add_library(slvs SHARED
+ ${libslvs_SOURCES}
+ ${libslvs_HEADERS}
+ ${util_SOURCES}
+ lib.cpp)
+
+target_compile_definitions(slvs
+ PRIVATE -DLIBRARY)
+
+target_include_directories(slvs
+ PUBLIC ${CMAKE_SOURCE_DIR}/include)
+
+set_target_properties(slvs PROPERTIES
+ PUBLIC_HEADER ${CMAKE_SOURCE_DIR}/include/slvs.h
+ VERSION ${solvespace_VERSION_MAJOR}.${solvespace_VERSION_MINOR}
+ SOVERSION 1)
+
+if(NOT WIN32)
+ install(TARGETS slvs
+ LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
+ PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
+endif()
+
+# generated files
+
+# `$<TARGET_FILE:tool>` allows us to use binfmt support on Linux
+# without special-casing anything; running `tool.exe` would succeed
+# but unlike Windows, Linux does not have the machinery to map
+# an invocation of `tool` to an executable `tool.exe` in $PATH.
+
+file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/generated)
+
+file(GLOB icons ${CMAKE_CURRENT_SOURCE_DIR}/icons/*.png)
+add_custom_command(
+ OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/generated/icons.cpp
+ ${CMAKE_CURRENT_BINARY_DIR}/generated/icons.h
+ COMMAND $<TARGET_FILE:png2c>
+ ${CMAKE_CURRENT_BINARY_DIR}/generated/icons.cpp
+ ${CMAKE_CURRENT_BINARY_DIR}/generated/icons.h
+ ${icons}
+ DEPENDS png2c ${icons}
+ VERBATIM)
+
+file(GLOB chars ${CMAKE_CURRENT_SOURCE_DIR}/fonts/private/*.png)
+list(SORT chars)
+add_custom_command(
+ OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/generated/bitmapfont.table.h
+ COMMAND $<TARGET_FILE:unifont2c>
+ ${CMAKE_CURRENT_BINARY_DIR}/generated/bitmapfont.table.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/fonts/unifont-8.0.01.hex.gz
+ ${chars}
+ DEPENDS unifont2c
+ ${CMAKE_CURRENT_SOURCE_DIR}/fonts/unifont-8.0.01.hex.gz
+ ${chars}
+ VERBATIM)
+
+add_custom_command(
+ OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/generated/vectorfont.table.h
+ COMMAND $<TARGET_FILE:lff2c>
+ ${CMAKE_CURRENT_BINARY_DIR}/generated/vectorfont.table.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/fonts/unicode.lff.gz
+ DEPENDS lff2c
+ ${CMAKE_CURRENT_SOURCE_DIR}/fonts/unicode.lff.gz
+ VERBATIM)
+
+set(generated_HEADERS
+ ${CMAKE_CURRENT_BINARY_DIR}/generated/vectorfont.table.h
+ ${CMAKE_CURRENT_BINARY_DIR}/generated/bitmapfont.table.h
+ ${CMAKE_CURRENT_BINARY_DIR}/generated/icons.h)
+
+set(generated_SOURCES
+ ${CMAKE_CURRENT_BINARY_DIR}/generated/icons.cpp)
+
+# platform dependencies
+
+if(WIN32)
+ set(platform_SOURCES
+ win32/w32main.cpp
+ win32/resource.rc)
+
+ set(platform_LIBRARIES
+ comctl32)
+elseif(APPLE)
+ add_definitions(
+ -fobjc-arc)
+
+ set(platform_SOURCES
+ cocoa/cocoamain.mm
+ unix/gloffscreen.cpp)
+
+ set(platform_XIBS
+ cocoa/MainMenu.xib
+ cocoa/SaveFormatAccessory.xib)
+
+ set(platform_ICONS
+ cocoa/AppIcon.iconset)
+
+ set(platform_RESOURCES
+ unix/solvespace-48x48.png)
+
+ set(platform_BUNDLED_LIBS
+ ${PNG_LIBRARIES}
+ ${FREETYPE_LIBRARIES})
+
+ set(platform_LIBRARIES
+ ${APPKIT_LIBRARY})
+elseif(HAVE_GTK)
+ include_directories(
+ ${GTKMM_INCLUDE_DIRS}
+ ${JSONC_INCLUDE_DIRS}
+ ${FONTCONFIG_INCLUDE_DIRS}
+ ${GLEW_INCLUDE_DIRS})
+
+ link_directories(
+ ${GTKMM_LIBRARY_DIRS}
+ ${JSONC_LIBRARY_DIRS}
+ ${FONTCONFIG_LIBRARY_DIRS}
+ ${GLEW_LIBRARY_DIRS})
+
+ add_definitions(
+ ${GTKMM_CFLAGS_OTHER}
+ ${JSONC_CFLAGS_OTHER}
+ ${FONTCONFIG_CFLAGS_OTHER}
+ ${GLEW_CFLAGS_OTHER})
+
+ set(platform_SOURCES
+ gtk/gtkmain.cpp
+ unix/gloffscreen.cpp)
+
+ set(platform_LIBRARIES
+ ${GTKMM_LIBRARIES}
+ ${JSONC_LIBRARIES}
+ ${FONTCONFIG_LIBRARIES}
+ ${GLEW_LIBRARIES})
+endif()
+
+set(platform_BUNDLED_RESOURCES)
+
+foreach(xib ${platform_XIBS})
+ get_filename_component(nib ${xib} NAME_WE)
+ set(source ${CMAKE_CURRENT_SOURCE_DIR}/${xib})
+ set(target ${CMAKE_CURRENT_BINARY_DIR}/solvespace.app/Contents/Resources/${nib}.nib)
+ list(APPEND platform_BUNDLED_RESOURCES ${target})
+
+ add_custom_command(
+ OUTPUT ${target}
+ COMMAND mkdir -p ${CMAKE_CURRENT_BINARY_DIR}/solvespace.app/Contents/Resources
+ COMMAND ibtool --errors --warnings --notices
+ --output-format human-readable-text --compile
+ ${target} ${source}
+ COMMENT "Building Interface Builder file ${xib}"
+ DEPENDS ${xib}
+ VERBATIM)
+endforeach()
+
+foreach(icon ${platform_ICONS})
+ get_filename_component(name ${icon} NAME_WE)
+ set(source ${CMAKE_CURRENT_SOURCE_DIR}/${icon})
+ set(target ${CMAKE_CURRENT_BINARY_DIR}/solvespace.app/Contents/Resources/${name}.icns)
+ list(APPEND platform_BUNDLED_RESOURCES ${target})
+
+ add_custom_command(
+ OUTPUT ${target}
+ COMMAND mkdir -p ${CMAKE_CURRENT_BINARY_DIR}/solvespace.app/Contents/Resources
+ COMMAND iconutil -c icns -o ${target} ${source}
+ COMMENT "Building icon set ${icon}"
+ DEPENDS ${source}
+ VERBATIM)
+endforeach()
+
+foreach(res ${platform_RESOURCES})
+ get_filename_component(name ${res} NAME)
+ set(source ${CMAKE_CURRENT_SOURCE_DIR}/${res})
+ set(target ${CMAKE_CURRENT_BINARY_DIR}/solvespace.app/Contents/Resources/${name})
+ list(APPEND platform_BUNDLED_RESOURCES ${target})
+
+ add_custom_command(
+ OUTPUT ${target}
+ COMMAND mkdir -p ${CMAKE_CURRENT_BINARY_DIR}/solvespace.app/Contents/Resources
+ COMMAND ${CMAKE_COMMAND} -E copy ${source} ${target}
+ COMMENT "Copying resource file ${res}"
+ DEPENDS ${res}
+ VERBATIM)
+endforeach()
+
+foreach(lib ${platform_BUNDLED_LIBS})
+ get_filename_component(name ${lib} NAME)
+ set(target ${CMAKE_CURRENT_BINARY_DIR}/solvespace.app/Contents/MacOS/${name})
+ list(APPEND platform_BUNDLED_RESOURCES ${target})
+
+ add_custom_command(
+ OUTPUT ${target}
+ COMMAND mkdir -p ${CMAKE_CURRENT_BINARY_DIR}/solvespace.app/Contents/Resources
+ COMMAND ${CMAKE_COMMAND} -E copy ${lib} ${target}
+ COMMENT "Bundling shared library ${lib}"
+ DEPENDS ${lib}
+ VERBATIM)
+endforeach()
+
+# solvespace executable
+
+set(solvespace_HEADERS
+ config.h
+ dsc.h
+ expr.h
+ polygon.h
+ sketch.h
+ solvespace.h
+ ui.h
+ srf/surface.h)
+
+set(solvespace_SOURCES
+ bsp.cpp
+ clipboard.cpp
+ confscreen.cpp
+ constraint.cpp
+ constrainteq.cpp
+ describescreen.cpp
+ draw.cpp
+ drawconstraint.cpp
+ drawentity.cpp
+ entity.cpp
+ export.cpp
+ exportstep.cpp
+ exportvector.cpp
+ expr.cpp
+ file.cpp
+ generate.cpp
+ glhelper.cpp
+ graphicswin.cpp
+ group.cpp
+ groupmesh.cpp
+ importdxf.cpp
+ mesh.cpp
+ modify.cpp
+ mouse.cpp
+ polygon.cpp
+ request.cpp
+ solvespace.cpp
+ style.cpp
+ system.cpp
+ textscreens.cpp
+ textwin.cpp
+ toolbar.cpp
+ ttf.cpp
+ undoredo.cpp
+ util.cpp
+ view.cpp
+ srf/boolean.cpp
+ srf/curve.cpp
+ srf/merge.cpp
+ srf/ratpoly.cpp
+ srf/raycast.cpp
+ srf/surface.cpp
+ srf/surfinter.cpp
+ srf/triangulate.cpp)
+
+add_executable(solvespace WIN32 MACOSX_BUNDLE
+ ${libslvs_HEADERS}
+ ${libslvs_SOURCES}
+ ${util_SOURCES}
+ ${platform_SOURCES}
+ ${platform_BUNDLED_RESOURCES}
+ ${generated_SOURCES}
+ ${generated_HEADERS}
+ ${solvespace_HEADERS}
+ ${solvespace_SOURCES})
+
+target_link_libraries(solvespace
+ dxfrw
+ ${OPENGL_LIBRARIES}
+ ${PNG_LIBRARIES}
+ ${ZLIB_LIBRARIES}
+ ${FREETYPE_LIBRARIES}
+ ${platform_LIBRARIES})
+
+if(WIN32 AND NOT MINGW)
+ set_target_properties(solvespace PROPERTIES
+ LINK_FLAGS "/MANIFEST:NO /SAFESEH:NO")
+endif()
+
+if(SPACEWARE_FOUND)
+ target_link_libraries(solvespace
+ ${SPACEWARE_LIBRARIES})
+endif()
+
+if(APPLE)
+ set(fixups)
+ foreach(lib ${platform_BUNDLED_LIBS})
+ get_filename_component(name ${lib} NAME)
+ execute_process(COMMAND otool -D ${lib}
+ OUTPUT_VARIABLE canonical_lib OUTPUT_STRIP_TRAILING_WHITESPACE)
+ string(REGEX REPLACE "^.+:\n" "" canonical_lib ${canonical_lib})
+ add_custom_command(TARGET solvespace POST_BUILD
+ COMMAND install_name_tool -change ${canonical_lib} @executable_path/${name}
+ $<TARGET_FILE:solvespace>
+ COMMENT "Fixing up rpath for dylib ${name}"
+ VERBATIM)
+ endforeach()
+
+ set(bundle solvespace)
+ add_custom_command(OUTPUT ${CMAKE_BINARY_DIR}/${bundle}.dmg
+ COMMAND ${CMAKE_COMMAND} -E remove ${CMAKE_BINARY_DIR}/${bundle}.dmg
+ COMMAND hdiutil create -srcfolder ${CMAKE_CURRENT_BINARY_DIR}/${bundle}.app
+ ${CMAKE_BINARY_DIR}/${bundle}.dmg
+ DEPENDS $<TARGET_FILE:${bundle}>
+ COMMENT "Building ${bundle}.dmg"
+ VERBATIM)
+
+ add_custom_target(${bundle}-dmg ALL
+ DEPENDS ${CMAKE_BINARY_DIR}/${bundle}.dmg)
+endif()
+
+if(NOT WIN32)
+ install(TARGETS solvespace
+ RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
+ BUNDLE DESTINATION .)
+endif()
+
+install(FILES unix/solvespace.desktop
+ DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/applications)
+foreach(SIZE 16x16 24x24 32x32 48x48)
+ install(FILES unix/solvespace-${SIZE}.png
+ DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/${SIZE}/apps
+ RENAME solvespace.png)
+ install(FILES unix/solvespace-${SIZE}.png
+ DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/${SIZE}/mimetypes
+ RENAME application.x-solvespace.png)
+endforeach()
+foreach(SIZE 16x16 24x24 32x32 48x48)
+ install(FILES unix/solvespace-${SIZE}.xpm
+ DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/pixmaps/)
+endforeach()
+
+# valgrind
+
+add_custom_target(solvespace-valgrind
+ valgrind
+ --tool=memcheck
+ --verbose
+ --track-fds=yes
+ --log-file=vg.%p.out
+ --num-callers=50
+ --error-limit=no
+ --read-var-info=yes
+ --leak-check=full
+ --leak-resolution=high
+ --show-reachable=yes
+ --track-origins=yes
+ --malloc-fill=0xac
+ --free-fill=0xde
+ $<TARGET_FILE:solvespace>)
--- /dev/null
+//-----------------------------------------------------------------------------
+// Binary space partitioning tree, used to represent a volume in 3-space
+// bounded by a triangle mesh. These are used to compute Boolean operations
+// on meshes. These aren't used for anything relating to an SShell of
+// ratpoly surfaces.
+//
+// Copyright 2008-2013 Jonathan Westhues.
+//-----------------------------------------------------------------------------
+#include "solvespace.h"
+
+SBsp2 *SBsp2::Alloc(void) { return (SBsp2 *)AllocTemporary(sizeof(SBsp2)); }
+SBsp3 *SBsp3::Alloc(void) { return (SBsp3 *)AllocTemporary(sizeof(SBsp3)); }
+
+SBsp3 *SBsp3::FromMesh(SMesh *m) {
+ SBsp3 *bsp3 = NULL;
+ int i;
+
+ SMesh mc = {};
+ for(i = 0; i < m->l.n; i++) {
+ mc.AddTriangle(&(m->l.elem[i]));
+ }
+
+ srand(0); // Let's be deterministic, at least!
+ int n = mc.l.n;
+ while(n > 1) {
+ int k = rand() % n;
+ n--;
+ swap(mc.l.elem[k], mc.l.elem[n]);
+ }
+
+ for(i = 0; i < mc.l.n; i++) {
+ bsp3 = InsertOrCreate(bsp3, &(mc.l.elem[i]), NULL);
+ }
+
+ mc.Clear();
+ return bsp3;
+}
+
+Vector SBsp3::IntersectionWith(Vector a, Vector b) {
+ double da = a.Dot(n) - d;
+ double db = b.Dot(n) - d;
+ if(da*db > 0) oops();
+
+ double dab = (db - da);
+ return (a.ScaledBy(db/dab)).Plus(b.ScaledBy(-da/dab));
+}
+
+void SBsp3::InsertInPlane(bool pos2, STriangle *tr, SMesh *m) {
+ Vector tc = ((tr->a).Plus(tr->b).Plus(tr->c)).ScaledBy(1.0/3);
+
+ bool onFace = false;
+ bool sameNormal = false;
+ double maxNormalMag = -1;
+
+ Vector lln, trn = tr->Normal();
+
+ SBsp3 *ll = this;
+ while(ll) {
+ if((ll->tri).ContainsPoint(tc)) {
+ onFace = true;
+ // If the mesh contains almost-zero-area triangles, and we're
+ // just on the edge of one of those, then don't trust its normal.
+ lln = (ll->tri).Normal();
+ if(lln.Magnitude() > maxNormalMag) {
+ sameNormal = trn.Dot(lln) > 0;
+ maxNormalMag = lln.Magnitude();
+ }
+ }
+ ll = ll->more;
+ }
+
+ if(m->flipNormal && ((!pos2 && !onFace) ||
+ (onFace && !sameNormal && m->keepCoplanar)))
+ {
+ m->AddTriangle(tr->meta, tr->c, tr->b, tr->a);
+ } else if(!(m->flipNormal) && ((pos2 && !onFace) ||
+ (onFace && sameNormal && m->keepCoplanar)))
+ {
+ m->AddTriangle(tr->meta, tr->a, tr->b, tr->c);
+ } else {
+ m->atLeastOneDiscarded = true;
+ }
+}
+
+void SBsp3::InsertHow(int how, STriangle *tr, SMesh *instead) {
+ switch(how) {
+ case POS:
+ if(instead && !pos) goto alt;
+ pos = InsertOrCreate(pos, tr, instead);
+ break;
+
+ case NEG:
+ if(instead && !neg) goto alt;
+ neg = InsertOrCreate(neg, tr, instead);
+ break;
+
+ case COPLANAR: {
+ if(instead) goto alt;
+ SBsp3 *m = Alloc();
+ m->n = n;
+ m->d = d;
+ m->tri = *tr;
+ m->more = more;
+ more = m;
+ break;
+ }
+ default: oops();
+ }
+ return;
+
+alt:
+ if(how == POS && !(instead->flipNormal)) {
+ instead->AddTriangle(tr->meta, tr->a, tr->b, tr->c);
+ } else if(how == NEG && instead->flipNormal) {
+ instead->AddTriangle(tr->meta, tr->c, tr->b, tr->a);
+ } else if(how == COPLANAR) {
+ if(edges) {
+ edges->InsertTriangle(tr, instead, this);
+ } else {
+ // I suppose this actually is allowed to happen, if the coplanar
+ // face is the leaf, and all of its neighbors are earlier in tree?
+ InsertInPlane(false, tr, instead);
+ }
+ } else {
+ instead->atLeastOneDiscarded = true;
+ }
+}
+
+void SBsp3::InsertConvexHow(int how, STriMeta meta, Vector *vertex, int n,
+ SMesh *instead)
+{
+ switch(how) {
+ case POS:
+ if(pos) {
+ pos = pos->InsertConvex(meta, vertex, n, instead);
+ return;
+ }
+ break;
+
+ case NEG:
+ if(neg) {
+ neg = neg->InsertConvex(meta, vertex, n, instead);
+ return;
+ }
+ break;
+
+ default: oops();
+ }
+ int i;
+ for(i = 0; i < n - 2; i++) {
+ STriangle tr = STriangle::From(meta,
+ vertex[0], vertex[i+1], vertex[i+2]);
+ InsertHow(how, &tr, instead);
+ }
+}
+
+SBsp3 *SBsp3::InsertConvex(STriMeta meta, Vector *vertex, int cnt,
+ SMesh *instead)
+{
+ Vector e01 = (vertex[1]).Minus(vertex[0]);
+ Vector e12 = (vertex[2]).Minus(vertex[1]);
+ Vector out = e01.Cross(e12);
+
+#define MAX_VERTICES 50
+ if(cnt+1 >= MAX_VERTICES) goto triangulate;
+
+ int i;
+ Vector on[2];
+ bool isPos[MAX_VERTICES];
+ bool isNeg[MAX_VERTICES];
+ bool isOn[MAX_VERTICES];
+ int posc, negc, onc; posc = negc = onc = 0;
+ for(i = 0; i < cnt; i++) {
+ double dt = n.Dot(vertex[i]);
+ isPos[i] = isNeg[i] = isOn[i] = false;
+ if(fabs(dt - d) < LENGTH_EPS) {
+ isOn[i] = true;
+ if(onc < 2) {
+ on[onc] = vertex[i];
+ }
+ onc++;
+ } else if(dt > d) {
+ isPos[i] = true;
+ posc++;
+ } else {
+ isNeg[i] = true;
+ negc++;
+ }
+ }
+ if(onc != 2 && onc != 1 && onc != 0) goto triangulate;
+
+ if(onc == 2) {
+ if(!instead) {
+ SEdge se = SEdge::From(on[0], on[1]);
+ edges = SBsp2::InsertOrCreateEdge(edges, &se, n, out);
+ }
+ }
+
+ if(posc == 0) {
+ InsertConvexHow(NEG, meta, vertex, cnt, instead);
+ return this;
+ }
+ if(negc == 0) {
+ InsertConvexHow(POS, meta, vertex, cnt, instead);
+ return this;
+ }
+
+ Vector vpos[MAX_VERTICES];
+ Vector vneg[MAX_VERTICES];
+ int npos, nneg; npos = nneg = 0;
+
+ Vector inter[2];
+ int inters; inters = 0;
+
+ for(i = 0; i < cnt; i++) {
+ int ip = WRAP((i + 1), cnt);
+
+ if(isPos[i]) {
+ vpos[npos++] = vertex[i];
+ }
+ if(isNeg[i]) {
+ vneg[nneg++] = vertex[i];
+ }
+ if(isOn[i]) {
+ vneg[nneg++] = vertex[i];
+ vpos[npos++] = vertex[i];
+ }
+ if((isPos[i] && isNeg[ip]) || (isNeg[i] && isPos[ip])) {
+ Vector vi = IntersectionWith(vertex[i], vertex[ip]);
+ vpos[npos++] = vi;
+ vneg[nneg++] = vi;
+
+ if(inters >= 2) goto triangulate; // XXX shouldn't happen but does
+ inter[inters++] = vi;
+ }
+ }
+ if(npos > cnt + 1 || nneg > cnt + 1) oops();
+
+ if(!instead) {
+ if(inters == 2) {
+ SEdge se = SEdge::From(inter[0], inter[1]);
+ edges = SBsp2::InsertOrCreateEdge(edges, &se, n, out);
+ } else if(inters == 1 && onc == 1) {
+ SEdge se = SEdge::From(inter[0], on[0]);
+ edges = SBsp2::InsertOrCreateEdge(edges, &se, n, out);
+ } else if(inters == 0 && onc == 2) {
+ // We already handled this on-plane existing edge
+ } else {
+ goto triangulate;
+ }
+ }
+ if(nneg < 3 || npos < 3) goto triangulate; // XXX
+
+ InsertConvexHow(NEG, meta, vneg, nneg, instead);
+ InsertConvexHow(POS, meta, vpos, npos, instead);
+ return this;
+
+triangulate:
+ // We don't handle the special case for this; do it as triangles
+ SBsp3 *r = this;
+ for(i = 0; i < cnt - 2; i++) {
+ STriangle tr = STriangle::From(meta,
+ vertex[0], vertex[i+1], vertex[i+2]);
+ r = InsertOrCreate(r, &tr, instead);
+ }
+ return r;
+}
+
+SBsp3 *SBsp3::InsertOrCreate(SBsp3 *where, STriangle *tr, SMesh *instead) {
+ if(where == NULL) {
+ if(instead) {
+ if(instead->flipNormal) {
+ instead->atLeastOneDiscarded = true;
+ } else {
+ instead->AddTriangle(tr->meta, tr->a, tr->b, tr->c);
+ }
+ return NULL;
+ }
+
+ // Brand new node; so allocate for it, and fill us in.
+ SBsp3 *r = Alloc();
+ r->n = (tr->Normal()).WithMagnitude(1);
+ r->d = (tr->a).Dot(r->n);
+ r->tri = *tr;
+ return r;
+ }
+ where->Insert(tr, instead);
+ return where;
+}
+
+void SBsp3::Insert(STriangle *tr, SMesh *instead) {
+ double dt[3] = { (tr->a).Dot(n), (tr->b).Dot(n), (tr->c).Dot(n) };
+
+ int inc = 0, posc = 0, negc = 0;
+ bool isPos[3] = {}, isNeg[3] = {}, isOn[3] = {};
+ // Count vertices in the plane
+ for(int i = 0; i < 3; i++) {
+ if(fabs(dt[i] - d) < LENGTH_EPS) {
+ inc++;
+ isOn[i] = true;
+ } else if(dt[i] > d) {
+ posc++;
+ isPos[i] = true;
+ } else {
+ negc++;
+ isNeg[i] = true;
+ }
+ }
+
+ // All vertices in-plane
+ if(inc == 3) {
+ InsertHow(COPLANAR, tr, instead);
+ return;
+ }
+
+ // No split required
+ if(posc == 0 || negc == 0) {
+ if(inc == 2) {
+ Vector a, b;
+ if (!isOn[0]) { a = tr->b; b = tr->c; }
+ else if(!isOn[1]) { a = tr->c; b = tr->a; }
+ else if(!isOn[2]) { a = tr->a; b = tr->b; }
+ else oops();
+ if(!instead) {
+ SEdge se = SEdge::From(a, b);
+ edges = SBsp2::InsertOrCreateEdge(edges, &se, n, tr->Normal());
+ }
+ }
+
+ if(posc > 0) {
+ InsertHow(POS, tr, instead);
+ } else {
+ InsertHow(NEG, tr, instead);
+ }
+ return;
+ }
+
+ // The polygon must be split into two pieces, one above, one below.
+ Vector a, b, c;
+
+ if(posc == 1 && negc == 1 && inc == 1) {
+ bool bpos;
+ // Standardize so that a is on the plane
+ if (isOn[0]) { a = tr->a; b = tr->b; c = tr->c; bpos = isPos[1];
+ } else if(isOn[1]) { a = tr->b; b = tr->c; c = tr->a; bpos = isPos[2];
+ } else if(isOn[2]) { a = tr->c; b = tr->a; c = tr->b; bpos = isPos[0];
+ } else oops();
+
+ Vector bPc = IntersectionWith(b, c);
+ STriangle btri = STriangle::From(tr->meta, a, b, bPc);
+ STriangle ctri = STriangle::From(tr->meta, c, a, bPc);
+
+ if(bpos) {
+ InsertHow(POS, &btri, instead);
+ InsertHow(NEG, &ctri, instead);
+ } else {
+ InsertHow(POS, &ctri, instead);
+ InsertHow(NEG, &btri, instead);
+ }
+
+ if(!instead) {
+ SEdge se = SEdge::From(a, bPc);
+ edges = SBsp2::InsertOrCreateEdge(edges, &se, n, tr->Normal());
+ }
+
+ return;
+ }
+
+ if(posc == 2 && negc == 1) {
+ // Standardize so that a is on one side, and b and c are on the other.
+ if (isNeg[0]) { a = tr->a; b = tr->b; c = tr->c;
+ } else if(isNeg[1]) { a = tr->b; b = tr->c; c = tr->a;
+ } else if(isNeg[2]) { a = tr->c; b = tr->a; c = tr->b;
+ } else oops();
+
+ } else if(posc == 1 && negc == 2) {
+ if (isPos[0]) { a = tr->a; b = tr->b; c = tr->c;
+ } else if(isPos[1]) { a = tr->b; b = tr->c; c = tr->a;
+ } else if(isPos[2]) { a = tr->c; b = tr->a; c = tr->b;
+ } else oops();
+ } else oops();
+
+ Vector aPb = IntersectionWith(a, b);
+ Vector cPa = IntersectionWith(c, a);
+
+ STriangle alone = STriangle::From(tr->meta, a, aPb, cPa);
+ Vector quad[4] = { aPb, b, c, cPa };
+
+ if(posc == 2 && negc == 1) {
+ InsertConvexHow(POS, tr->meta, quad, 4, instead);
+ InsertHow(NEG, &alone, instead);
+ } else {
+ InsertConvexHow(NEG, tr->meta, quad, 4, instead);
+ InsertHow(POS, &alone, instead);
+ }
+ if(!instead) {
+ SEdge se = SEdge::From(aPb, cPa);
+ edges = SBsp2::InsertOrCreateEdge(edges, &se, n, alone.Normal());
+ }
+
+ return;
+}
+
+void SBsp3::GenerateInPaintOrder(SMesh *m) {
+
+ // Doesn't matter which branch we take if the normal has zero z
+ // component, so don't need a separate case for that.
+ if(n.z < 0) {
+ if(pos) pos->GenerateInPaintOrder(m);
+ } else {
+ if(neg) neg->GenerateInPaintOrder(m);
+ }
+
+ SBsp3 *flip = this;
+ while(flip) {
+ m->AddTriangle(&(flip->tri));
+ flip = flip->more;
+ }
+
+ if(n.z < 0) {
+ if(neg) neg->GenerateInPaintOrder(m);
+ } else {
+ if(pos) pos->GenerateInPaintOrder(m);
+ }
+}
+
+void SBsp3::DebugDraw(void) {
+
+ if(pos) pos->DebugDraw();
+ Vector norm = tri.Normal();
+ glNormal3d(norm.x, norm.y, norm.z);
+
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_LIGHTING);
+ glBegin(GL_TRIANGLES);
+ ssglVertex3v(tri.a);
+ ssglVertex3v(tri.b);
+ ssglVertex3v(tri.c);
+ glEnd();
+
+ glDisable(GL_LIGHTING);
+ glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
+ ssglDepthRangeOffset(2);
+ glBegin(GL_TRIANGLES);
+ ssglVertex3v(tri.a);
+ ssglVertex3v(tri.b);
+ ssglVertex3v(tri.c);
+ glEnd();
+
+ glDisable(GL_LIGHTING);
+ glPolygonMode(GL_FRONT_AND_BACK, GL_POINT);
+ glPointSize(10);
+ ssglDepthRangeOffset(2);
+ glBegin(GL_TRIANGLES);
+ ssglVertex3v(tri.a);
+ ssglVertex3v(tri.b);
+ ssglVertex3v(tri.c);
+ glEnd();
+
+ ssglDepthRangeOffset(0);
+ glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
+
+ if(more) more->DebugDraw();
+ if(neg) neg->DebugDraw();
+
+ if(edges) edges->DebugDraw(n, d);
+}
+
+/////////////////////////////////
+
+Vector SBsp2::IntersectionWith(Vector a, Vector b) {
+ double da = a.Dot(no) - d;
+ double db = b.Dot(no) - d;
+ if(da*db > 0) oops();
+
+ double dab = (db - da);
+ return (a.ScaledBy(db/dab)).Plus(b.ScaledBy(-da/dab));
+}
+
+SBsp2 *SBsp2::InsertOrCreateEdge(SBsp2 *where, SEdge *nedge, Vector nnp, Vector out) {
+ if(where == NULL) {
+ // Brand new node; so allocate for it, and fill us in.
+ SBsp2 *r = Alloc();
+ r->np = nnp;
+ r->no = ((r->np).Cross((nedge->b).Minus(nedge->a))).WithMagnitude(1);
+ if(out.Dot(r->no) < 0) {
+ r->no = (r->no).ScaledBy(-1);
+ }
+ r->d = (nedge->a).Dot(r->no);
+ r->edge = *nedge;
+ return r;
+ }
+ where->InsertEdge(nedge, nnp, out);
+ return where;
+}
+
+void SBsp2::InsertEdge(SEdge *nedge, Vector nnp, Vector out) {
+
+ double dt[2] = { (nedge->a).Dot(no), (nedge->b).Dot(no) };
+
+ bool isPos[2] = {}, isNeg[2] = {}, isOn[2] = {};
+ for(int i = 0; i < 2; i++) {
+ if(fabs(dt[i] - d) < LENGTH_EPS) {
+ isOn[i] = true;
+ } else if(dt[i] > d) {
+ isPos[i] = true;
+ } else {
+ isNeg[i] = true;
+ }
+ }
+
+ if((isPos[0] && isPos[1])||(isPos[0] && isOn[1])||(isOn[0] && isPos[1])) {
+ pos = InsertOrCreateEdge(pos, nedge, nnp, out);
+ return;
+ }
+ if((isNeg[0] && isNeg[1])||(isNeg[0] && isOn[1])||(isOn[0] && isNeg[1])) {
+ neg = InsertOrCreateEdge(neg, nedge, nnp, out);
+ return;
+ }
+ if(isOn[0] && isOn[1]) {
+ SBsp2 *m = Alloc();
+
+ m->np = nnp;
+ m->no = ((m->np).Cross((nedge->b).Minus(nedge->a))).WithMagnitude(1);
+ if(out.Dot(m->no) < 0) {
+ m->no = (m->no).ScaledBy(-1);
+ }
+ m->d = (nedge->a).Dot(m->no);
+ m->edge = *nedge;
+
+ m->more = more;
+ more = m;
+ return;
+ }
+ if((isPos[0] && isNeg[1]) || (isNeg[0] && isPos[1])) {
+ Vector aPb = IntersectionWith(nedge->a, nedge->b);
+
+ SEdge ea = SEdge::From(nedge->a, aPb);
+ SEdge eb = SEdge::From(aPb, nedge->b);
+
+ if(isPos[0]) {
+ pos = InsertOrCreateEdge(pos, &ea, nnp, out);
+ neg = InsertOrCreateEdge(neg, &eb, nnp, out);
+ } else {
+ neg = InsertOrCreateEdge(neg, &ea, nnp, out);
+ pos = InsertOrCreateEdge(pos, &eb, nnp, out);
+ }
+ return;
+ }
+ oops();
+}
+
+void SBsp2::InsertTriangleHow(int how, STriangle *tr, SMesh *m, SBsp3 *bsp3) {
+ switch(how) {
+ case POS:
+ if(pos) {
+ pos->InsertTriangle(tr, m, bsp3);
+ } else {
+ bsp3->InsertInPlane(true, tr, m);
+ }
+ break;
+
+ case NEG:
+ if(neg) {
+ neg->InsertTriangle(tr, m, bsp3);
+ } else {
+ bsp3->InsertInPlane(false, tr, m);
+ }
+ break;
+
+ default: oops();
+ }
+}
+
+void SBsp2::InsertTriangle(STriangle *tr, SMesh *m, SBsp3 *bsp3) {
+ double dt[3] = { (tr->a).Dot(no), (tr->b).Dot(no), (tr->c).Dot(no) };
+
+ bool isPos[3] = {}, isNeg[3] = {}, isOn[3] = {};
+ int inc = 0, posc = 0, negc = 0;
+ for(int i = 0; i < 3; i++) {
+ if(fabs(dt[i] - d) < LENGTH_EPS) {
+ isOn[i] = true;
+ inc++;
+ } else if(dt[i] > d) {
+ isPos[i] = true;
+ posc++;
+ } else {
+ isNeg[i] = true;
+ negc++;
+ }
+ }
+
+ if(inc == 3) {
+ // All vertices on-line; so it's a degenerate triangle, to ignore.
+ return;
+ }
+
+ // No split required
+ if(posc == 0 || negc == 0) {
+ if(posc > 0) {
+ InsertTriangleHow(POS, tr, m, bsp3);
+ } else {
+ InsertTriangleHow(NEG, tr, m, bsp3);
+ }
+ return;
+ }
+
+ // The polygon must be split into two pieces, one above, one below.
+ Vector a, b, c;
+
+ if(posc == 1 && negc == 1 && inc == 1) {
+ bool bpos;
+ // Standardize so that a is on the plane
+ if (isOn[0]) { a = tr->a; b = tr->b; c = tr->c; bpos = isPos[1];
+ } else if(isOn[1]) { a = tr->b; b = tr->c; c = tr->a; bpos = isPos[2];
+ } else if(isOn[2]) { a = tr->c; b = tr->a; c = tr->b; bpos = isPos[0];
+ } else oops();
+
+ Vector bPc = IntersectionWith(b, c);
+ STriangle btri = STriangle::From(tr->meta, a, b, bPc);
+ STriangle ctri = STriangle::From(tr->meta, c, a, bPc);
+
+ if(bpos) {
+ InsertTriangleHow(POS, &btri, m, bsp3);
+ InsertTriangleHow(NEG, &ctri, m, bsp3);
+ } else {
+ InsertTriangleHow(POS, &ctri, m, bsp3);
+ InsertTriangleHow(NEG, &btri, m, bsp3);
+ }
+
+ return;
+ }
+
+ if(posc == 2 && negc == 1) {
+ // Standardize so that a is on one side, and b and c are on the other.
+ if (isNeg[0]) { a = tr->a; b = tr->b; c = tr->c;
+ } else if(isNeg[1]) { a = tr->b; b = tr->c; c = tr->a;
+ } else if(isNeg[2]) { a = tr->c; b = tr->a; c = tr->b;
+ } else oops();
+
+ } else if(posc == 1 && negc == 2) {
+ if (isPos[0]) { a = tr->a; b = tr->b; c = tr->c;
+ } else if(isPos[1]) { a = tr->b; b = tr->c; c = tr->a;
+ } else if(isPos[2]) { a = tr->c; b = tr->a; c = tr->b;
+ } else oops();
+ } else oops();
+
+ Vector aPb = IntersectionWith(a, b);
+ Vector cPa = IntersectionWith(c, a);
+
+ STriangle alone = STriangle::From(tr->meta, a, aPb, cPa);
+ STriangle quad1 = STriangle::From(tr->meta, aPb, b, c );
+ STriangle quad2 = STriangle::From(tr->meta, aPb, c, cPa);
+
+ if(posc == 2 && negc == 1) {
+ InsertTriangleHow(POS, &quad1, m, bsp3);
+ InsertTriangleHow(POS, &quad2, m, bsp3);
+ InsertTriangleHow(NEG, &alone, m, bsp3);
+ } else {
+ InsertTriangleHow(NEG, &quad1, m, bsp3);
+ InsertTriangleHow(NEG, &quad2, m, bsp3);
+ InsertTriangleHow(POS, &alone, m, bsp3);
+ }
+
+ return;
+}
+
+void SBsp2::DebugDraw(Vector n, double d) {
+ if(fabs((edge.a).Dot(n) - d) > LENGTH_EPS) oops();
+ if(fabs((edge.b).Dot(n) - d) > LENGTH_EPS) oops();
+
+ ssglLineWidth(10);
+ glBegin(GL_LINES);
+ ssglVertex3v(edge.a);
+ ssglVertex3v(edge.b);
+ glEnd();
+ if(pos) pos->DebugDraw(n, d);
+ if(neg) neg->DebugDraw(n, d);
+ if(more) more->DebugDraw(n, d);
+ ssglLineWidth(1);
+}
+
--- /dev/null
+//-----------------------------------------------------------------------------
+// The clipboard that gets manipulated when the user selects Edit -> Cut,
+// Copy, Paste, etc.; may contain entities only, not constraints.
+//
+// Copyright 2008-2013 Jonathan Westhues.
+//-----------------------------------------------------------------------------
+#include "solvespace.h"
+
+void SolveSpaceUI::Clipboard::Clear(void) {
+ c.Clear();
+ r.Clear();
+}
+
+bool SolveSpaceUI::Clipboard::ContainsEntity(hEntity he) {
+ if(he.v == Entity::NO_ENTITY.v)
+ return true;
+
+ ClipboardRequest *cr;
+ for(cr = r.First(); cr; cr = r.NextAfter(cr)) {
+ if(cr->oldEnt.v == he.v)
+ return true;
+
+ for(int i = 0; i < MAX_POINTS_IN_ENTITY; i++) {
+ if(cr->oldPointEnt[i].v == he.v)
+ return true;
+ }
+ }
+ return false;
+}
+
+hEntity SolveSpaceUI::Clipboard::NewEntityFor(hEntity he) {
+ if(he.v == Entity::NO_ENTITY.v)
+ return Entity::NO_ENTITY;
+
+ ClipboardRequest *cr;
+ for(cr = r.First(); cr; cr = r.NextAfter(cr)) {
+ if(cr->oldEnt.v == he.v)
+ return cr->newReq.entity(0);
+
+ for(int i = 0; i < MAX_POINTS_IN_ENTITY; i++) {
+ if(cr->oldPointEnt[i].v == he.v)
+ return cr->newReq.entity(1+i);
+ }
+ }
+ oops();
+}
+
+void GraphicsWindow::DeleteSelection(void) {
+ SK.request.ClearTags();
+ SK.constraint.ClearTags();
+ List<Selection> *ls = &(selection);
+ for(Selection *s = ls->First(); s; s = ls->NextAfter(s)) {
+ hRequest r = { 0 };
+ if(s->entity.v && s->entity.isFromRequest()) {
+ r = s->entity.request();
+ }
+ if(r.v && !r.IsFromReferences()) {
+ SK.request.Tag(r, 1);
+ }
+ if(s->constraint.v) {
+ SK.constraint.Tag(s->constraint, 1);
+ }
+ }
+
+ SK.constraint.RemoveTagged();
+ // Note that this regenerates and clears the selection, to avoid
+ // lingering references to the just-deleted items.
+ DeleteTaggedRequests();
+}
+
+void GraphicsWindow::CopySelection(void) {
+ SS.clipboard.Clear();
+
+ Entity *wrkpl = SK.GetEntity(ActiveWorkplane());
+ Entity *wrkpln = SK.GetEntity(wrkpl->normal);
+ Vector u = wrkpln->NormalU(),
+ v = wrkpln->NormalV(),
+ n = wrkpln->NormalN(),
+ p = SK.GetEntity(wrkpl->point[0])->PointGetNum();
+
+ List<Selection> *ls = &(selection);
+ for(Selection *s = ls->First(); s; s = ls->NextAfter(s)) {
+ if(!s->entity.v) continue;
+ // Work only on entities that have requests that will generate them.
+ Entity *e = SK.GetEntity(s->entity);
+ bool hasDistance;
+ int req, pts;
+ if(!EntReqTable::GetEntityInfo(e->type, e->extraPoints,
+ &req, &pts, NULL, &hasDistance))
+ {
+ continue;
+ }
+ if(req == Request::WORKPLANE) continue;
+
+ ClipboardRequest cr = {};
+ cr.type = req;
+ cr.extraPoints = e->extraPoints;
+ cr.style = e->style;
+ cr.str = e->str;
+ cr.font = e->font;
+ cr.construction = e->construction;
+ {for(int i = 0; i < pts; i++) {
+ Vector pt = SK.GetEntity(e->point[i])->PointGetNum();
+ pt = pt.Minus(p);
+ pt = pt.DotInToCsys(u, v, n);
+ cr.point[i] = pt;
+ }}
+ if(hasDistance) {
+ cr.distance = SK.GetEntity(e->distance)->DistanceGetNum();
+ }
+
+ cr.oldEnt = e->h;
+ for(int i = 0; i < pts; i++) {
+ cr.oldPointEnt[i] = e->point[i];
+ }
+
+ SS.clipboard.r.Add(&cr);
+ }
+
+ for(Selection *s = ls->First(); s; s = ls->NextAfter(s)) {
+ if(!s->constraint.v) continue;
+
+ Constraint *c = SK.GetConstraint(s->constraint);
+ if(c->type == Constraint::COMMENT) {
+ SS.clipboard.c.Add(c);
+ }
+ }
+
+ Constraint *c;
+ for(c = SK.constraint.First(); c; c = SK.constraint.NextAfter(c)) {
+ if(!SS.clipboard.ContainsEntity(c->ptA) ||
+ !SS.clipboard.ContainsEntity(c->ptB) ||
+ !SS.clipboard.ContainsEntity(c->entityA) ||
+ !SS.clipboard.ContainsEntity(c->entityB) ||
+ !SS.clipboard.ContainsEntity(c->entityC) ||
+ !SS.clipboard.ContainsEntity(c->entityD) ||
+ c->type == Constraint::COMMENT) {
+ continue;
+ }
+ SS.clipboard.c.Add(c);
+ }
+}
+
+void GraphicsWindow::PasteClipboard(Vector trans, double theta, double scale) {
+ Entity *wrkpl = SK.GetEntity(ActiveWorkplane());
+ Entity *wrkpln = SK.GetEntity(wrkpl->normal);
+ Vector u = wrkpln->NormalU(),
+ v = wrkpln->NormalV(),
+ n = wrkpln->NormalN(),
+ p = SK.GetEntity(wrkpl->point[0])->PointGetNum();
+
+ ClipboardRequest *cr;
+ for(cr = SS.clipboard.r.First(); cr; cr = SS.clipboard.r.NextAfter(cr)) {
+ hRequest hr = AddRequest(cr->type, false);
+ Request *r = SK.GetRequest(hr);
+ r->extraPoints = cr->extraPoints;
+ r->style = cr->style;
+ r->str = cr->str;
+ r->font = cr->font;
+ r->construction = cr->construction;
+ // Need to regen to get the right number of points, if extraPoints
+ // changed.
+ SS.GenerateAll(SolveSpaceUI::GENERATE_REGEN);
+ SS.MarkGroupDirty(r->group);
+ bool hasDistance;
+ int i, pts;
+ EntReqTable::GetRequestInfo(r->type, r->extraPoints,
+ NULL, &pts, NULL, &hasDistance);
+ for(i = 0; i < pts; i++) {
+ Vector pt = cr->point[i];
+ // We need the reflection to occur within the workplane; it may
+ // otherwise correspond to just a rotation as projected.
+ if(scale < 0) {
+ pt.x *= -1;
+ }
+ // Likewise the scale, which could otherwise take us out of the
+ // workplane.
+ pt = pt.ScaledBy(fabs(scale));
+ pt = pt.ScaleOutOfCsys(u, v, Vector::From(0, 0, 0));
+ pt = pt.Plus(p);
+ pt = pt.RotatedAbout(n, theta);
+ pt = pt.Plus(trans);
+ SK.GetEntity(hr.entity(i+1))->PointForceTo(pt);
+ }
+ if(hasDistance) {
+ SK.GetEntity(hr.entity(64))->DistanceForceTo(
+ cr->distance*fabs(scale));
+ }
+
+ cr->newReq = hr;
+ MakeSelected(hr.entity(0));
+ for(i = 0; i < pts; i++) {
+ MakeSelected(hr.entity(i+1));
+ }
+ }
+
+ Constraint *cc;
+ for(cc = SS.clipboard.c.First(); cc; cc = SS.clipboard.c.NextAfter(cc)) {
+ Constraint c = {};
+ c.group = SS.GW.activeGroup;
+ c.workplane = SS.GW.ActiveWorkplane();
+ c.type = cc->type;
+ c.valA = cc->valA;
+ c.ptA = SS.clipboard.NewEntityFor(cc->ptA);
+ c.ptB = SS.clipboard.NewEntityFor(cc->ptB);
+ c.entityA = SS.clipboard.NewEntityFor(cc->entityA);
+ c.entityB = SS.clipboard.NewEntityFor(cc->entityB);
+ c.entityC = SS.clipboard.NewEntityFor(cc->entityC);
+ c.entityD = SS.clipboard.NewEntityFor(cc->entityD);
+ c.other = cc->other;
+ c.other2 = cc->other2;
+ c.reference = cc->reference;
+ c.disp = cc->disp;
+ c.comment = cc->comment;
+ switch(c.type) {
+ case Constraint::COMMENT:
+ c.disp.offset = c.disp.offset.Plus(trans);
+ break;
+
+ case Constraint::PT_PT_DISTANCE:
+ case Constraint::PT_LINE_DISTANCE:
+ case Constraint::PROJ_PT_DISTANCE:
+ case Constraint::DIAMETER:
+ c.valA *= fabs(scale);
+ break;
+
+ default:
+ break;
+ }
+
+ hConstraint hc = Constraint::AddConstraint(&c, /*rememberForUndo=*/false);
+ if(c.type == Constraint::COMMENT) {
+ MakeSelected(hc);
+ }
+ }
+
+ SS.ScheduleGenerateAll();
+}
+
+void GraphicsWindow::MenuClipboard(int id) {
+ if(id != MNU_DELETE && !SS.GW.LockedInWorkplane()) {
+ Error("Cut, paste, and copy work only in a workplane.\n\n"
+ "Select one with Sketch -> In Workplane.");
+ return;
+ }
+
+ switch(id) {
+ case MNU_PASTE: {
+ SS.UndoRemember();
+ Vector trans = SS.GW.projRight.ScaledBy(80/SS.GW.scale).Plus(
+ SS.GW.projUp .ScaledBy(40/SS.GW.scale));
+ SS.GW.ClearSelection();
+ SS.GW.PasteClipboard(trans, 0, 1);
+ break;
+ }
+
+ case MNU_PASTE_TRANSFORM: {
+ if(SS.clipboard.r.n == 0) {
+ Error("Clipboard is empty; nothing to paste.");
+ break;
+ }
+
+ Entity *wrkpl = SK.GetEntity(SS.GW.ActiveWorkplane());
+ Vector p = SK.GetEntity(wrkpl->point[0])->PointGetNum();
+ SS.TW.shown.paste.times = 1;
+ SS.TW.shown.paste.trans = Vector::From(0, 0, 0);
+ SS.TW.shown.paste.theta = 0;
+ SS.TW.shown.paste.origin = p;
+ SS.TW.shown.paste.scale = 1;
+ SS.TW.GoToScreen(TextWindow::SCREEN_PASTE_TRANSFORMED);
+ SS.GW.ForceTextWindowShown();
+ SS.ScheduleShowTW();
+ break;
+ }
+
+ case MNU_COPY:
+ SS.GW.CopySelection();
+ SS.GW.ClearSelection();
+ break;
+
+ case MNU_CUT:
+ SS.UndoRemember();
+ SS.GW.CopySelection();
+ SS.GW.DeleteSelection();
+ break;
+
+ case MNU_DELETE:
+ SS.UndoRemember();
+ SS.GW.DeleteSelection();
+ break;
+
+ default: oops();
+ }
+}
+
+bool TextWindow::EditControlDoneForPaste(const char *s) {
+ Expr *e;
+ switch(edit.meaning) {
+ case EDIT_PASTE_TIMES_REPEATED: {
+ e = Expr::From(s, true);
+ if(!e) break;
+ int v = (int)e->Eval();
+ if(v > 0) {
+ shown.paste.times = v;
+ } else {
+ Error("Number of copies to paste must be at least one.");
+ }
+ break;
+ }
+ case EDIT_PASTE_ANGLE:
+ e = Expr::From(s, true);
+ if(!e) break;
+ shown.paste.theta = WRAP_SYMMETRIC((e->Eval())*PI/180, 2*PI);
+ break;
+
+ case EDIT_PASTE_SCALE: {
+ e = Expr::From(s, true);
+ double v = e->Eval();
+ if(fabs(v) > 1e-6) {
+ shown.paste.scale = v;
+ } else {
+ Error("Scale cannot be zero.");
+ }
+ break;
+ }
+
+ default:
+ return false;
+ }
+ return true;
+}
+
+void TextWindow::ScreenChangePasteTransformed(int link, uint32_t v) {
+ switch(link) {
+ case 't':
+ SS.TW.ShowEditControl(13, ssprintf("%d", SS.TW.shown.paste.times));
+ SS.TW.edit.meaning = EDIT_PASTE_TIMES_REPEATED;
+ break;
+
+ case 'r':
+ SS.TW.ShowEditControl(13, ssprintf("%.3f", SS.TW.shown.paste.theta*180/PI));
+ SS.TW.edit.meaning = EDIT_PASTE_ANGLE;
+ break;
+
+ case 's':
+ SS.TW.ShowEditControl(13, ssprintf("%.3f", SS.TW.shown.paste.scale));
+ SS.TW.edit.meaning = EDIT_PASTE_SCALE;
+ break;
+ }
+}
+
+void TextWindow::ScreenPasteTransformed(int link, uint32_t v) {
+ SS.GW.GroupSelection();
+ switch(link) {
+ case 'o':
+ if(SS.GW.gs.points == 1 && SS.GW.gs.n == 1) {
+ Entity *e = SK.GetEntity(SS.GW.gs.point[0]);
+ SS.TW.shown.paste.origin = e->PointGetNum();
+ } else {
+ Error("Select one point to define origin of rotation.");
+ }
+ SS.GW.ClearSelection();
+ break;
+
+ case 't':
+ if(SS.GW.gs.points == 2 && SS.GW.gs.n == 2) {
+ Entity *pa = SK.GetEntity(SS.GW.gs.point[0]),
+ *pb = SK.GetEntity(SS.GW.gs.point[1]);
+ SS.TW.shown.paste.trans =
+ (pb->PointGetNum()).Minus(pa->PointGetNum());
+ } else {
+ Error("Select two points to define translation vector.");
+ }
+ SS.GW.ClearSelection();
+ break;
+
+ case 'g': {
+ if(fabs(SS.TW.shown.paste.theta) < LENGTH_EPS &&
+ SS.TW.shown.paste.trans.Magnitude() < LENGTH_EPS &&
+ SS.TW.shown.paste.times != 1)
+ {
+ Message("Transformation is identity. So all copies will be "
+ "exactly on top of each other.");
+ }
+ if(SS.TW.shown.paste.times*SS.clipboard.r.n > 100) {
+ Error("Too many items to paste; split this into smaller "
+ "pastes.");
+ break;
+ }
+ if(!SS.GW.LockedInWorkplane()) {
+ Error("No workplane active.");
+ break;
+ }
+ Entity *wrkpl = SK.GetEntity(SS.GW.ActiveWorkplane());
+ Entity *wrkpln = SK.GetEntity(wrkpl->normal);
+ Vector wn = wrkpln->NormalN();
+ SS.UndoRemember();
+ SS.GW.ClearSelection();
+ for(int i = 0; i < SS.TW.shown.paste.times; i++) {
+ Vector trans = SS.TW.shown.paste.trans.ScaledBy(i+1),
+ origin = SS.TW.shown.paste.origin;
+ double theta = SS.TW.shown.paste.theta*(i+1);
+ // desired transformation is Q*(p - o) + o + t =
+ // Q*p - Q*o + o + t = Q*p + (t + o - Q*o)
+ Vector t = trans.Plus(
+ origin).Minus(
+ origin.RotatedAbout(wn, theta));
+
+ SS.GW.PasteClipboard(t, theta, SS.TW.shown.paste.scale);
+ }
+ SS.TW.GoToScreen(SCREEN_LIST_OF_GROUPS);
+ SS.ScheduleShowTW();
+ break;
+ }
+ }
+}
+
+void TextWindow::ShowPasteTransformed(void) {
+ Printf(true, "%FtPASTE TRANSFORMED%E");
+ Printf(true, "%Ba %Ftrepeat%E %d time%s %Fl%Lt%f[change]%E",
+ shown.paste.times, (shown.paste.times == 1) ? "" : "s",
+ &ScreenChangePasteTransformed);
+ Printf(false, "%Bd %Ftrotate%E %@ degrees %Fl%Lr%f[change]%E",
+ shown.paste.theta*180/PI,
+ &ScreenChangePasteTransformed);
+ Printf(false, "%Ba %Ftabout pt%E (%s, %s, %s) %Fl%Lo%f[use selected]%E",
+ SS.MmToString(shown.paste.origin.x).c_str(),
+ SS.MmToString(shown.paste.origin.y).c_str(),
+ SS.MmToString(shown.paste.origin.z).c_str(),
+ &ScreenPasteTransformed);
+ Printf(false, "%Bd %Fttranslate%E (%s, %s, %s) %Fl%Lt%f[use selected]%E",
+ SS.MmToString(shown.paste.trans.x).c_str(),
+ SS.MmToString(shown.paste.trans.y).c_str(),
+ SS.MmToString(shown.paste.trans.z).c_str(),
+ &ScreenPasteTransformed);
+ Printf(false, "%Ba %Ftscale%E %@ %Fl%Ls%f[change]%E",
+ shown.paste.scale,
+ &ScreenChangePasteTransformed);
+
+ Printf(true, " %Fl%Lg%fpaste transformed now%E", &ScreenPasteTransformed);
+
+ Printf(true, "(or %Fl%Ll%fcancel operation%E)", &ScreenHome);
+}
+
--- /dev/null
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="5056" systemVersion="12F45" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
+ <dependencies>
+ <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="5056"/>
+ </dependencies>
+ <objects>
+ <customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
+ <customObject id="-2" userLabel="File's Owner" customClass="NSApplication"/>
+ <customObject id="-3" userLabel="Application"/>
+ <customObject id="-4" userLabel="Application Delegate" customClass="ApplicationDelegate"/>
+ <customObject id="YLy-65-1bz" customClass="NSFontManager"/>
+ <menu title="Main Menu" systemMenu="main" id="AYu-sK-qS6">
+ <items>
+ <menuItem title="SolveSpace" id="1Xt-HY-uBw">
+ <modifierMask key="keyEquivalentModifierMask"/>
+ <menu key="submenu" title="SolveSpace" systemMenu="apple" id="uQy-DD-JDr">
+ <items>
+ <menuItem title="About SolveSpace" id="5kV-Vb-QxS">
+ <modifierMask key="keyEquivalentModifierMask"/>
+ <connections>
+ <action selector="orderFrontStandardAboutPanel:" target="-1" id="Exp-CZ-Vem"/>
+ </connections>
+ </menuItem>
+ <menuItem isSeparatorItem="YES" id="VOq-y0-SEH"/>
+ <menuItem title="Preferences…" keyEquivalent="," id="BOF-NM-1cW">
+ <connections>
+ <action selector="preferences:" target="-4" id="xyv-2f-7kO"/>
+ </connections>
+ </menuItem>
+ <menuItem isSeparatorItem="YES" id="wFC-TO-SCJ"/>
+ <menuItem title="Services" id="NMo-om-nkz">
+ <modifierMask key="keyEquivalentModifierMask"/>
+ <menu key="submenu" title="Services" systemMenu="services" id="hz9-B4-Xy5"/>
+ </menuItem>
+ <menuItem isSeparatorItem="YES" id="4je-JR-u6R"/>
+ <menuItem title="Hide SolveSpace" keyEquivalent="h" id="Olw-nP-bQN">
+ <connections>
+ <action selector="hide:" target="-1" id="PnN-Uc-m68"/>
+ </connections>
+ </menuItem>
+ <menuItem title="Hide Others" keyEquivalent="h" id="Vdr-fp-XzO">
+ <modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
+ <connections>
+ <action selector="hideOtherApplications:" target="-1" id="VT4-aY-XCT"/>
+ </connections>
+ </menuItem>
+ <menuItem title="Show All" id="Kd2-mp-pUS">
+ <modifierMask key="keyEquivalentModifierMask"/>
+ <connections>
+ <action selector="unhideAllApplications:" target="-1" id="Dhg-Le-xox"/>
+ </connections>
+ </menuItem>
+ <menuItem isSeparatorItem="YES" id="kCx-OE-vgT"/>
+ <menuItem title="Quit SolveSpace" keyEquivalent="q" id="4sb-4s-VLi">
+ <connections>
+ <action selector="terminate:" target="-3" id="Te7-pn-YzF"/>
+ </connections>
+ </menuItem>
+ </items>
+ </menu>
+ </menuItem>
+ </items>
+ </menu>
+ </objects>
+</document>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="5056" systemVersion="12F45" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
+ <dependencies>
+ <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="5056"/>
+ <capability name="Alignment constraints with different attributes" minToolsVersion="5.1"/>
+ </dependencies>
+ <objects>
+ <customObject id="-2" userLabel="File's Owner" customClass="NSViewController">
+ <connections>
+ <outlet property="button" destination="nNy-fR-AhK" id="w3z-a4-Khs"/>
+ <outlet property="view" destination="c22-O7-iKe" id="w2z-a4-Khs"/>
+ </connections>
+ </customObject>
+ <customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
+ <customObject id="-3" userLabel="Application"/>
+ <customView id="c22-O7-iKe">
+ <rect key="frame" x="0.0" y="0.0" width="294" height="51"/>
+ <subviews>
+ <popUpButton verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="nNy-fR-AhK">
+ <rect key="frame" x="105" y="12" width="34" height="26"/>
+ <popUpButtonCell key="cell" type="push" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" borderStyle="borderAndBezel" imageScaling="proportionallyDown" inset="2" id="f8z-Qp-Igm">
+ <behavior key="behavior" lightByBackground="YES" lightByGray="YES"/>
+ <font key="font" metaFont="menu"/>
+ <menu key="menu" title="OtherViews" id="VgN-HZ-Q4a"/>
+ </popUpButtonCell>
+ <connections>
+ <binding destination="-2" name="selectedIndex" keyPath="index" id="AXx-uh-tee"/>
+ </connections>
+ </popUpButton>
+ <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="z9Z-cA-QIW">
+ <rect key="frame" x="17" y="17" width="73" height="17"/>
+ <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="File Format:" id="2vD-ht-BhF">
+ <font key="font" metaFont="system"/>
+ <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
+ <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
+ </textFieldCell>
+ </textField>
+ </subviews>
+ <constraints>
+ <constraint firstItem="nNy-fR-AhK" firstAttribute="top" secondItem="c22-O7-iKe" secondAttribute="top" constant="15" id="B3P-9V-lvu"/>
+ <constraint firstItem="nNy-fR-AhK" firstAttribute="leading" secondItem="z9Z-cA-QIW" secondAttribute="trailing" constant="20" id="Uex-s1-7UF"/>
+ <constraint firstAttribute="bottom" secondItem="nNy-fR-AhK" secondAttribute="bottom" constant="15" id="pPM-eQ-gOD"/>
+ <constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="nNy-fR-AhK" secondAttribute="trailing" constant="20" id="rPT-bl-Md7"/>
+ <constraint firstItem="z9Z-cA-QIW" firstAttribute="baseline" secondItem="nNy-fR-AhK" secondAttribute="baseline" constant="1" id="spD-eU-Frq"/>
+ <constraint firstItem="nNy-fR-AhK" firstAttribute="leading" secondItem="c22-O7-iKe" secondAttribute="centerX" constant="-40" id="whX-1w-qMB"/>
+ </constraints>
+ </customView>
+ <userDefaultsController representsSharedInstance="YES" id="ybp-e7-hms"/>
+ </objects>
+</document>
--- /dev/null
+//-----------------------------------------------------------------------------
+// Our main() function, and Cocoa-specific stuff to set up our windows and
+// otherwise handle our interface to the operating system. Everything
+// outside gtk/... should be standard C++ and OpenGL.
+//
+// Copyright 2015 <whitequark@whitequark.org>
+//-----------------------------------------------------------------------------
+#include <mach/mach.h>
+#include <mach/clock.h>
+
+#import <AppKit/AppKit.h>
+
+#include <iostream>
+#include <map>
+
+#include "solvespace.h"
+#include "../unix/gloffscreen.h"
+#include <config.h>
+
+using SolveSpace::dbp;
+
+#define GL_CHECK() \
+ do { \
+ int err = (int)glGetError(); \
+ if(err) dbp("%s:%d: glGetError() == 0x%X", __FILE__, __LINE__, err); \
+ } while (0)
+
+/* Settings */
+
+namespace SolveSpace {
+void CnfFreezeInt(uint32_t val, const std::string &key) {
+ [[NSUserDefaults standardUserDefaults]
+ setInteger:val forKey:[NSString stringWithUTF8String:key.c_str()]];
+}
+
+uint32_t CnfThawInt(uint32_t val, const std::string &key) {
+ NSString *nsKey = [NSString stringWithUTF8String:key.c_str()];
+ if([[NSUserDefaults standardUserDefaults] objectForKey:nsKey])
+ return [[NSUserDefaults standardUserDefaults] integerForKey:nsKey];
+ return val;
+}
+
+void CnfFreezeFloat(float val, const std::string &key) {
+ [[NSUserDefaults standardUserDefaults]
+ setFloat:val forKey:[NSString stringWithUTF8String:key.c_str()]];
+}
+
+float CnfThawFloat(float val, const std::string &key) {
+ NSString *nsKey = [NSString stringWithUTF8String:key.c_str()];
+ if([[NSUserDefaults standardUserDefaults] objectForKey:nsKey])
+ return [[NSUserDefaults standardUserDefaults] floatForKey:nsKey];
+ return val;
+}
+
+void CnfFreezeString(const std::string &val, const std::string &key) {
+ [[NSUserDefaults standardUserDefaults]
+ setObject:[NSString stringWithUTF8String:val.c_str()]
+ forKey:[NSString stringWithUTF8String:key.c_str()]];
+}
+
+std::string CnfThawString(const std::string &val, const std::string &key) {
+ NSString *nsKey = [NSString stringWithUTF8String:key.c_str()];
+ if([[NSUserDefaults standardUserDefaults] objectForKey:nsKey]) {
+ NSString *nsNewVal = [[NSUserDefaults standardUserDefaults] stringForKey:nsKey];
+ return [nsNewVal UTF8String];
+ }
+ return val;
+}
+};
+
+/* Timer */
+
+int64_t SolveSpace::GetMilliseconds(void) {
+ clock_serv_t cclock;
+ mach_timespec_t mts;
+
+ host_get_clock_service(mach_host_self(), SYSTEM_CLOCK, &cclock);
+ clock_get_time(cclock, &mts);
+ mach_port_deallocate(mach_task_self(), cclock);
+
+ return mts.tv_sec * 1000 + mts.tv_nsec / 1000000;
+}
+
+@interface DeferredHandler : NSObject
++ (void) runLater:(id)dummy;
++ (void) runCallback;
++ (void) doAutosave;
+@end
+
+@implementation DeferredHandler
++ (void) runLater:(id)dummy {
+ SolveSpace::SS.DoLater();
+}
++ (void) runCallback {
+ SolveSpace::SS.GW.TimerCallback();
+ SolveSpace::SS.TW.TimerCallback();
+}
++ (void) doAutosave {
+ SolveSpace::SS.Autosave();
+}
+@end
+
+static void Schedule(SEL selector, double interval) {
+ NSMethodSignature *signature = [[DeferredHandler class]
+ methodSignatureForSelector:selector];
+ NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];
+ [invocation setSelector:selector];
+ [invocation setTarget:[DeferredHandler class]];
+ [NSTimer scheduledTimerWithTimeInterval:interval
+ invocation:invocation repeats:NO];
+}
+
+void SolveSpace::SetTimerFor(int milliseconds) {
+ Schedule(@selector(runCallback), milliseconds / 1000.0);
+}
+
+void SolveSpace::SetAutosaveTimerFor(int minutes) {
+ Schedule(@selector(doAutosave), minutes * 60.0);
+}
+
+void SolveSpace::ScheduleLater() {
+ [[NSRunLoop currentRunLoop]
+ performSelector:@selector(runLater:)
+ target:[DeferredHandler class] argument:nil
+ order:0 modes:@[NSDefaultRunLoopMode]];
+}
+
+/* OpenGL view */
+
+@interface GLViewWithEditor : NSView
+- (void)drawGL;
+
+@property BOOL wantsBackingStoreScaling;
+
+@property(readonly, getter=isEditing) BOOL editing;
+- (void)startEditing:(NSString*)text at:(NSPoint)origin withHeight:(double)fontHeight
+ usingMonospace:(BOOL)isMonospace;
+- (void)stopEditing;
+- (void)didEdit:(NSString*)text;
+@end
+
+@implementation GLViewWithEditor
+{
+ GLOffscreen *offscreen;
+ NSOpenGLContext *glContext;
+@protected
+ NSTextField *editor;
+}
+
+- initWithFrame:(NSRect)frameRect {
+ self = [super initWithFrame:frameRect];
+ [self setWantsLayer:YES];
+
+ NSOpenGLPixelFormatAttribute attrs[] = {
+ NSOpenGLPFAColorSize, 24,
+ NSOpenGLPFADepthSize, 24,
+ 0
+ };
+ NSOpenGLPixelFormat *pixelFormat = [[NSOpenGLPixelFormat alloc] initWithAttributes:attrs];
+ glContext = [[NSOpenGLContext alloc] initWithFormat:pixelFormat shareContext:NULL];
+
+ editor = [[NSTextField alloc] init];
+ [editor setEditable:YES];
+ [[editor cell] setWraps:NO];
+ [[editor cell] setScrollable:YES];
+ [editor setBezeled:NO];
+ [editor setTarget:self];
+ [editor setAction:@selector(editorAction:)];
+
+ return self;
+}
+
+- (void)dealloc {
+ delete offscreen;
+}
+
+#define CONVERT1(name, to_from) \
+ - (NS##name)convert##name##to_from##Backing:(NS##name)input { \
+ return _wantsBackingStoreScaling ? [super convert##name##to_from##Backing:input] : input; }
+#define CONVERT(name) CONVERT1(name, To) CONVERT1(name, From)
+CONVERT(Size)
+CONVERT(Rect)
+#undef CONVERT
+#undef CONVERT1
+
+- (NSPoint)convertPointToBacking:(NSPoint)input {
+ if(_wantsBackingStoreScaling) return [super convertPointToBacking:input];
+ else {
+ input.y *= -1;
+ return input;
+ }
+}
+
+- (NSPoint)convertPointFromBacking:(NSPoint)input {
+ if(_wantsBackingStoreScaling) return [super convertPointFromBacking:input];
+ else {
+ input.y *= -1;
+ return input;
+ }
+}
+
+- (void)drawRect:(NSRect)aRect {
+ [glContext makeCurrentContext];
+
+ if(!offscreen)
+ offscreen = new GLOffscreen;
+
+ NSSize size = [self convertSizeToBacking:[self bounds].size];
+ offscreen->begin(size.width, size.height);
+
+ [self drawGL];
+ GL_CHECK();
+
+ uint8_t *pixels = offscreen->end(![self isFlipped]);
+ CGDataProviderRef provider = CGDataProviderCreateWithData(
+ NULL, pixels, size.width * size.height * 4, NULL);
+ CGColorSpaceRef colorspace = CGColorSpaceCreateDeviceRGB();
+ CGImageRef image = CGImageCreate(size.width, size.height, 8, 32,
+ size.width * 4, colorspace, kCGBitmapByteOrder32Little | kCGImageAlphaNoneSkipFirst,
+ provider, NULL, true, kCGRenderingIntentDefault);
+
+ CGContextDrawImage((CGContextRef) [[NSGraphicsContext currentContext] graphicsPort],
+ [self bounds], image);
+
+ CGImageRelease(image);
+ CGDataProviderRelease(provider);
+}
+
+- (void)drawGL {
+}
+
+@synthesize editing;
+
+- (void)startEditing:(NSString*)text at:(NSPoint)origin withHeight:(double)fontHeight
+ usingMonospace:(BOOL)isMonospace {
+ if(!self->editing) {
+ [self addSubview:editor];
+ self->editing = YES;
+ }
+
+ NSFont *font;
+ if(isMonospace)
+ font = [NSFont fontWithName:@"Monaco" size:fontHeight];
+ else
+ font = [NSFont controlContentFontOfSize:fontHeight];
+ [editor setFont:font];
+
+ origin.x -= 3; /* left padding; no way to get it from NSTextField */
+ origin.y -= [editor intrinsicContentSize].height;
+ origin.y += [editor baselineOffsetFromBottom];
+
+ [editor setFrameOrigin:origin];
+ [editor setStringValue:text];
+ [[self window] makeFirstResponder:editor];
+}
+
+- (void)stopEditing {
+ if(self->editing) {
+ [editor removeFromSuperview];
+ self->editing = NO;
+ }
+}
+
+- (void)editorAction:(id)sender {
+ [self didEdit:[editor stringValue]];
+ [self stopEditing];
+}
+
+- (void)didEdit:(NSString*)text {
+}
+@end
+
+/* Graphics window */
+
+@interface GraphicsWindowView : GLViewWithEditor
+{
+ NSTrackingArea *trackingArea;
+}
+
+@property(readonly) NSEvent *lastContextMenuEvent;
+@end
+
+@implementation GraphicsWindowView
+- (BOOL)isFlipped {
+ return YES;
+}
+
+- (void)drawGL {
+ SolveSpace::SS.GW.Paint();
+}
+
+- (BOOL)acceptsFirstResponder {
+ return YES;
+}
+
+- (void) createTrackingArea {
+ trackingArea = [[NSTrackingArea alloc] initWithRect:[self bounds]
+ options:(NSTrackingMouseEnteredAndExited | NSTrackingMouseMoved |
+ NSTrackingActiveInKeyWindow)
+ owner:self userInfo:nil];
+ [self addTrackingArea:trackingArea];
+}
+
+- (void) updateTrackingAreas
+{
+ [self removeTrackingArea:trackingArea];
+ [self createTrackingArea];
+ [super updateTrackingAreas];
+}
+
+- (void)mouseMoved:(NSEvent*)event {
+ NSPoint point = [self ij_to_xy:[self convertPoint:[event locationInWindow] fromView:nil]];
+ NSUInteger flags = [event modifierFlags];
+ NSUInteger buttons = [NSEvent pressedMouseButtons];
+ SolveSpace::SS.GW.MouseMoved(point.x, point.y,
+ buttons & (1 << 0),
+ buttons & (1 << 2),
+ buttons & (1 << 1),
+ flags & NSShiftKeyMask,
+ flags & NSCommandKeyMask);
+}
+
+- (void)mouseDragged:(NSEvent*)event {
+ [self mouseMoved:event];
+}
+
+- (void)rightMouseDragged:(NSEvent*)event {
+ [self mouseMoved:event];
+}
+
+- (void)otherMouseDragged:(NSEvent*)event {
+ [self mouseMoved:event];
+}
+
+- (void)mouseDown:(NSEvent*)event {
+ NSPoint point = [self ij_to_xy:[self convertPoint:[event locationInWindow] fromView:nil]];
+ if([event clickCount] == 1)
+ SolveSpace::SS.GW.MouseLeftDown(point.x, point.y);
+ else if([event clickCount] == 2)
+ SolveSpace::SS.GW.MouseLeftDoubleClick(point.x, point.y);
+}
+
+- (void)rightMouseDown:(NSEvent*)event {
+ NSPoint point = [self ij_to_xy:[self convertPoint:[event locationInWindow] fromView:nil]];
+ SolveSpace::SS.GW.MouseMiddleOrRightDown(point.x, point.y);
+}
+
+- (void)otherMouseDown:(NSEvent*)event {
+ [self rightMouseDown:event];
+}
+
+- (void)mouseUp:(NSEvent*)event {
+ NSPoint point = [self ij_to_xy:[self convertPoint:[event locationInWindow] fromView:nil]];
+ SolveSpace::SS.GW.MouseLeftUp(point.x, point.y);
+}
+
+- (void)rightMouseUp:(NSEvent*)event {
+ NSPoint point = [self ij_to_xy:[self convertPoint:[event locationInWindow] fromView:nil]];
+ self->_lastContextMenuEvent = event;
+ SolveSpace::SS.GW.MouseRightUp(point.x, point.y);
+}
+
+- (void)scrollWheel:(NSEvent*)event {
+ NSPoint point = [self ij_to_xy:[self convertPoint:[event locationInWindow] fromView:nil]];
+ SolveSpace::SS.GW.MouseScroll(point.x, point.y, -[event deltaY]);
+}
+
+- (void)mouseExited:(NSEvent*)event {
+ SolveSpace::SS.GW.MouseLeave();
+}
+
+- (void)keyDown:(NSEvent*)event {
+ int chr = 0;
+ if(NSString *nsChr = [event charactersIgnoringModifiers])
+ chr = [nsChr characterAtIndex:0];
+
+ if(chr >= NSF1FunctionKey && chr <= NSF12FunctionKey)
+ chr = SolveSpace::GraphicsWindow::FUNCTION_KEY_BASE + (chr - NSF1FunctionKey);
+
+ NSUInteger flags = [event modifierFlags];
+ if(flags & NSShiftKeyMask)
+ chr |= SolveSpace::GraphicsWindow::SHIFT_MASK;
+ if(flags & NSCommandKeyMask)
+ chr |= SolveSpace::GraphicsWindow::CTRL_MASK;
+
+ // override builtin behavior: "focus on next cell", "close window"
+ if(chr == '\t' || chr == '\x1b')
+ [[NSApp mainMenu] performKeyEquivalent:event];
+ else if(!chr || !SolveSpace::SS.GW.KeyDown(chr))
+ [super keyDown:event];
+}
+
+- (void)startEditing:(NSString*)text at:(NSPoint)xy withHeight:(double)fontHeight
+ withMinWidthInChars:(int)minWidthChars {
+ // Convert to ij (vs. xy) style coordinates
+ NSSize size = [self convertSizeToBacking:[self bounds].size];
+ NSPoint point = {
+ .x = xy.x + size.width / 2,
+ .y = xy.y - size.height / 2
+ };
+ [[self window] makeKeyWindow];
+ [super startEditing:text at:[self convertPointFromBacking:point]
+ withHeight:fontHeight usingMonospace:FALSE];
+ [self prepareEditorWithMinWidthInChars:minWidthChars];
+}
+
+- (void)prepareEditorWithMinWidthInChars:(int)minWidthChars {
+ NSFont *font = [editor font];
+ NSGlyph glyphA = [font glyphWithName:@"a"];
+ if(glyphA == -1) oops();
+ CGFloat glyphAWidth = [font advancementForGlyph:glyphA].width;
+
+ [editor sizeToFit];
+
+ NSSize frameSize = [editor frame].size;
+ frameSize.width = std::max(frameSize.width, glyphAWidth * minWidthChars);
+ [editor setFrameSize:frameSize];
+}
+
+- (void)didEdit:(NSString*)text {
+ SolveSpace::SS.GW.EditControlDone([text UTF8String]);
+ [self setNeedsDisplay:YES];
+}
+
+- (void)cancelOperation:(id)sender {
+ [self stopEditing];
+}
+
+- (NSPoint)ij_to_xy:(NSPoint)ij {
+ // Convert to xy (vs. ij) style coordinates,
+ // with (0, 0) at center
+ NSSize size = [self bounds].size;
+ return [self convertPointToBacking:(NSPoint){
+ .x = ij.x - size.width / 2, .y = ij.y - size.height / 2 }];
+}
+@end
+
+@interface GraphicsWindowDelegate : NSObject<NSWindowDelegate>
+- (BOOL)windowShouldClose:(id)sender;
+
+@property(readonly, getter=isFullscreen) BOOL fullscreen;
+- (void)windowDidEnterFullScreen:(NSNotification *)notification;
+- (void)windowDidExitFullScreen:(NSNotification *)notification;
+@end
+
+@implementation GraphicsWindowDelegate
+- (BOOL)windowShouldClose:(id)sender {
+ [NSApp terminate:sender];
+ return FALSE; /* in case NSApp changes its mind */
+}
+
+@synthesize fullscreen;
+- (void)windowDidEnterFullScreen:(NSNotification *)notification {
+ fullscreen = true;
+ /* Update the menus */
+ SolveSpace::SS.GW.EnsureValidActives();
+}
+- (void)windowDidExitFullScreen:(NSNotification *)notification {
+ fullscreen = false;
+ /* Update the menus */
+ SolveSpace::SS.GW.EnsureValidActives();
+}
+@end
+
+static NSWindow *GW;
+static GraphicsWindowView *GWView;
+static GraphicsWindowDelegate *GWDelegate;
+
+namespace SolveSpace {
+void InitGraphicsWindow() {
+ GW = [[NSWindow alloc] init];
+ GWDelegate = [[GraphicsWindowDelegate alloc] init];
+ [GW setDelegate:GWDelegate];
+ [GW setStyleMask:(NSTitledWindowMask | NSClosableWindowMask |
+ NSMiniaturizableWindowMask | NSResizableWindowMask)];
+ [GW setFrameAutosaveName:@"GraphicsWindow"];
+ [GW setCollectionBehavior:NSWindowCollectionBehaviorFullScreenPrimary];
+ if(![GW setFrameUsingName:[GW frameAutosaveName]])
+ [GW setContentSize:(NSSize){ .width = 600, .height = 600 }];
+ GWView = [[GraphicsWindowView alloc] init];
+ [GW setContentView:GWView];
+}
+
+void GetGraphicsWindowSize(int *w, int *h) {
+ NSSize size = [GWView convertSizeToBacking:[GWView frame].size];
+ *w = size.width;
+ *h = size.height;
+}
+
+void InvalidateGraphics(void) {
+ [GWView setNeedsDisplay:YES];
+}
+
+void PaintGraphics(void) {
+ [GWView setNeedsDisplay:YES];
+ CFRunLoopRunInMode(kCFRunLoopDefaultMode, 0, YES);
+}
+
+void SetCurrentFilename(const std::string &filename) {
+ if(!filename.empty()) {
+ [GW setTitleWithRepresentedFilename:[NSString stringWithUTF8String:filename.c_str()]];
+ } else {
+ [GW setTitle:@"(new sketch)"];
+ [GW setRepresentedFilename:@""];
+ }
+}
+
+void ToggleFullScreen(void) {
+ [GW toggleFullScreen:nil];
+}
+
+bool FullScreenIsActive(void) {
+ return [GWDelegate isFullscreen];
+}
+
+void ShowGraphicsEditControl(int x, int y, int fontHeight, int minWidthChars,
+ const std::string &str) {
+ [GWView startEditing:[NSString stringWithUTF8String:str.c_str()]
+ at:(NSPoint){(CGFloat)x, (CGFloat)y}
+ withHeight:fontHeight
+ withMinWidthInChars:minWidthChars];
+}
+
+void HideGraphicsEditControl(void) {
+ [GWView stopEditing];
+}
+
+bool GraphicsEditControlIsVisible(void) {
+ return [GWView isEditing];
+}
+}
+
+/* Context menus */
+
+static int contextMenuChoice;
+
+@interface ContextMenuResponder : NSObject
++ (void)handleClick:(id)sender;
+@end
+
+@implementation ContextMenuResponder
++ (void)handleClick:(id)sender {
+ contextMenuChoice = [sender tag];
+}
+@end
+
+namespace SolveSpace {
+NSMenu *contextMenu, *contextSubmenu;
+
+void AddContextMenuItem(const char *label, int id_) {
+ NSMenuItem *menuItem;
+ if(label) {
+ menuItem = [[NSMenuItem alloc] initWithTitle:[NSString stringWithUTF8String:label]
+ action:@selector(handleClick:) keyEquivalent:@""];
+ [menuItem setTarget:[ContextMenuResponder class]];
+ [menuItem setTag:id_];
+ } else {
+ menuItem = [NSMenuItem separatorItem];
+ }
+
+ if(id_ == CONTEXT_SUBMENU) {
+ [menuItem setSubmenu:contextSubmenu];
+ contextSubmenu = nil;
+ }
+
+ if(contextSubmenu) {
+ [contextSubmenu addItem:menuItem];
+ } else {
+ if(!contextMenu) {
+ contextMenu = [[NSMenu alloc]
+ initWithTitle:[NSString stringWithUTF8String:label]];
+ }
+
+ [contextMenu addItem:menuItem];
+ }
+}
+
+void CreateContextSubmenu(void) {
+ if(contextSubmenu) oops();
+
+ contextSubmenu = [[NSMenu alloc] initWithTitle:@""];
+}
+
+int ShowContextMenu(void) {
+ if(!contextMenu)
+ return -1;
+
+ [NSMenu popUpContextMenu:contextMenu
+ withEvent:[GWView lastContextMenuEvent] forView:GWView];
+
+ contextMenu = nil;
+
+ return contextMenuChoice;
+}
+};
+
+/* Main menu */
+
+@interface MainMenuResponder : NSObject
++ (void)handleStatic:(id)sender;
++ (void)handleRecent:(id)sender;
+@end
+
+@implementation MainMenuResponder
++ (void)handleStatic:(id)sender {
+ SolveSpace::GraphicsWindow::MenuEntry *entry =
+ (SolveSpace::GraphicsWindow::MenuEntry*)[sender tag];
+
+ if(entry->fn && ![(NSMenuItem*)sender hasSubmenu])
+ entry->fn(entry->id);
+}
+
++ (void)handleRecent:(id)sender {
+ int id_ = [sender tag];
+ if(id_ >= RECENT_OPEN && id_ < (RECENT_OPEN + MAX_RECENT))
+ SolveSpace::SolveSpaceUI::MenuFile(id_);
+ else if(id_ >= RECENT_LINK && id_ < (RECENT_LINK + MAX_RECENT))
+ SolveSpace::Group::MenuGroup(id_);
+}
+@end
+
+namespace SolveSpace {
+std::map<int, NSMenuItem*> mainMenuItems;
+
+void InitMainMenu(NSMenu *mainMenu) {
+ NSMenuItem *menuItem = NULL;
+ NSMenu *levels[5] = {mainMenu, 0};
+ NSString *label;
+
+ const GraphicsWindow::MenuEntry *entry = &GraphicsWindow::menu[0];
+ int current_level = 0;
+ while(entry->level >= 0) {
+ if(entry->level > current_level) {
+ NSMenu *menu = [[NSMenu alloc] initWithTitle:label];
+ [menu setAutoenablesItems:NO];
+ [menuItem setSubmenu:menu];
+
+ if(entry->level >= sizeof(levels) / sizeof(levels[0]))
+ oops();
+
+ levels[entry->level] = menu;
+ }
+
+ current_level = entry->level;
+
+ if(entry->label) {
+ /* OS X does not support mnemonics */
+ label = [[NSString stringWithUTF8String:entry->label]
+ stringByReplacingOccurrencesOfString:@"&" withString:@""];
+
+ unichar accelChar = entry->accel &
+ ~(GraphicsWindow::SHIFT_MASK | GraphicsWindow::CTRL_MASK);
+ if(accelChar > GraphicsWindow::FUNCTION_KEY_BASE &&
+ accelChar <= GraphicsWindow::FUNCTION_KEY_BASE + 12) {
+ accelChar = NSF1FunctionKey + (accelChar - GraphicsWindow::FUNCTION_KEY_BASE - 1);
+ } else if(accelChar == GraphicsWindow::DELETE_KEY) {
+ accelChar = NSBackspaceCharacter;
+ }
+ NSString *accel = [NSString stringWithCharacters:&accelChar length:1];
+
+ menuItem = [levels[entry->level] addItemWithTitle:label
+ action:NULL keyEquivalent:[accel lowercaseString]];
+
+ NSUInteger modifierMask = 0;
+ if(entry->accel & GraphicsWindow::SHIFT_MASK)
+ modifierMask |= NSShiftKeyMask;
+ else if(entry->accel & GraphicsWindow::CTRL_MASK)
+ modifierMask |= NSCommandKeyMask;
+ [menuItem setKeyEquivalentModifierMask:modifierMask];
+
+ [menuItem setTag:(NSInteger)entry];
+ [menuItem setTarget:[MainMenuResponder class]];
+ [menuItem setAction:@selector(handleStatic:)];
+ } else {
+ [levels[entry->level] addItem:[NSMenuItem separatorItem]];
+ }
+
+ mainMenuItems[entry->id] = menuItem;
+
+ ++entry;
+ }
+}
+
+void EnableMenuById(int id_, bool enabled) {
+ [mainMenuItems[id_] setEnabled:enabled];
+}
+
+void CheckMenuById(int id_, bool checked) {
+ [mainMenuItems[id_] setState:(checked ? NSOnState : NSOffState)];
+}
+
+void RadioMenuById(int id_, bool selected) {
+ CheckMenuById(id_, selected);
+}
+
+static void RefreshRecentMenu(int id_, int base) {
+ NSMenuItem *recent = mainMenuItems[id_];
+ NSMenu *menu = [[NSMenu alloc] initWithTitle:@""];
+ [recent setSubmenu:menu];
+
+ if(std::string(RecentFile[0]).empty()) {
+ NSMenuItem *placeholder = [[NSMenuItem alloc]
+ initWithTitle:@"(no recent files)" action:nil keyEquivalent:@""];
+ [placeholder setEnabled:NO];
+ [menu addItem:placeholder];
+ } else {
+ for(int i = 0; i < MAX_RECENT; i++) {
+ if(std::string(RecentFile[i]).empty())
+ break;
+
+ NSMenuItem *item = [[NSMenuItem alloc]
+ initWithTitle:[[NSString stringWithUTF8String:RecentFile[i].c_str()]
+ stringByAbbreviatingWithTildeInPath]
+ action:nil keyEquivalent:@""];
+ [item setTag:(base + i)];
+ [item setAction:@selector(handleRecent:)];
+ [item setTarget:[MainMenuResponder class]];
+ [menu addItem:item];
+ }
+ }
+}
+
+void RefreshRecentMenus(void) {
+ RefreshRecentMenu(GraphicsWindow::MNU_OPEN_RECENT, RECENT_OPEN);
+ RefreshRecentMenu(GraphicsWindow::MNU_GROUP_RECENT, RECENT_LINK);
+}
+
+void ToggleMenuBar(void) {
+ [NSMenu setMenuBarVisible:![NSMenu menuBarVisible]];
+}
+
+bool MenuBarIsVisible(void) {
+ return [NSMenu menuBarVisible];
+}
+}
+
+/* Save/load */
+
+bool SolveSpace::GetOpenFile(std::string *file, const std::string &defExtension,
+ const FileFilter ssFilters[]) {
+ NSOpenPanel *panel = [NSOpenPanel openPanel];
+ NSMutableArray *filters = [[NSMutableArray alloc] init];
+ for(const FileFilter *ssFilter = ssFilters; ssFilter->name; ssFilter++) {
+ for(const char *const *ssPattern = ssFilter->patterns; *ssPattern; ssPattern++) {
+ [filters addObject:[NSString stringWithUTF8String:*ssPattern]];
+ }
+ }
+ [filters removeObjectIdenticalTo:@"*"];
+ [panel setAllowedFileTypes:filters];
+
+ if([panel runModal] == NSFileHandlingPanelOKButton) {
+ *file = [[NSFileManager defaultManager]
+ fileSystemRepresentationWithPath:[[panel URL] path]];
+ return true;
+ } else {
+ return false;
+ }
+}
+
+@interface SaveFormatController : NSViewController
+@property NSSavePanel *panel;
+@property NSArray *extensions;
+@property (nonatomic) IBOutlet NSPopUpButton *button;
+@property (nonatomic) NSInteger index;
+@end
+
+@implementation SaveFormatController
+@synthesize panel, extensions, button, index;
+- (void)setIndex:(NSInteger)newIndex {
+ self->index = newIndex;
+ NSString *extension = [extensions objectAtIndex:newIndex];
+ if(![extension isEqual:@"*"]) {
+ NSString *filename = [panel nameFieldStringValue];
+ NSString *basename = [[filename componentsSeparatedByString:@"."] objectAtIndex:0];
+ [panel setNameFieldStringValue:[basename stringByAppendingPathExtension:extension]];
+ }
+}
+@end
+
+bool SolveSpace::GetSaveFile(std::string *file, const std::string &defExtension,
+ const FileFilter ssFilters[]) {
+ NSSavePanel *panel = [NSSavePanel savePanel];
+
+ SaveFormatController *controller =
+ [[SaveFormatController alloc] initWithNibName:@"SaveFormatAccessory" bundle:nil];
+ [controller setPanel:panel];
+ [panel setAccessoryView:[controller view]];
+
+ NSMutableArray *extensions = [[NSMutableArray alloc] init];
+ [controller setExtensions:extensions];
+
+ NSPopUpButton *button = [controller button];
+ [button removeAllItems];
+ for(const FileFilter *ssFilter = ssFilters; ssFilter->name; ssFilter++) {
+ std::string desc;
+ for(const char *const *ssPattern = ssFilter->patterns; *ssPattern; ssPattern++) {
+ if(desc == "") {
+ desc = *ssPattern;
+ } else {
+ desc += ", ";
+ desc += *ssPattern;
+ }
+ }
+ std::string title = std::string(ssFilter->name) + " (" + desc + ")";
+ [button addItemWithTitle:[NSString stringWithUTF8String:title.c_str()]];
+ [extensions addObject:[NSString stringWithUTF8String:ssFilter->patterns[0]]];
+ }
+
+ int extensionIndex = 0;
+ if(defExtension != "") {
+ extensionIndex = [extensions indexOfObject:
+ [NSString stringWithUTF8String:defExtension.c_str()]];
+ if(extensionIndex == -1) {
+ extensionIndex = 0;
+ }
+ }
+
+ [button selectItemAtIndex:extensionIndex];
+ [panel setNameFieldStringValue:[@"untitled"
+ stringByAppendingPathExtension:[extensions objectAtIndex:extensionIndex]]];
+
+ if([panel runModal] == NSFileHandlingPanelOKButton) {
+ *file = [[NSFileManager defaultManager]
+ fileSystemRepresentationWithPath:[[panel URL] path]];
+ return true;
+ } else {
+ return false;
+ }
+}
+
+SolveSpace::DialogChoice SolveSpace::SaveFileYesNoCancel(void) {
+ NSAlert *alert = [[NSAlert alloc] init];
+ if(!std::string(SolveSpace::SS.saveFile).empty()) {
+ [alert setMessageText:
+ [[@"Do you want to save the changes you made to the sketch “"
+ stringByAppendingString:
+ [[NSString stringWithUTF8String:SolveSpace::SS.saveFile.c_str()]
+ stringByAbbreviatingWithTildeInPath]]
+ stringByAppendingString:@"”?"]];
+ } else {
+ [alert setMessageText:@"Do you want to save the changes you made to the new sketch?"];
+ }
+ [alert setInformativeText:@"Your changes will be lost if you don't save them."];
+ [alert addButtonWithTitle:@"Save"];
+ [alert addButtonWithTitle:@"Cancel"];
+ [alert addButtonWithTitle:@"Don't Save"];
+ switch([alert runModal]) {
+ case NSAlertFirstButtonReturn:
+ return DIALOG_YES;
+ case NSAlertSecondButtonReturn:
+ default:
+ return DIALOG_CANCEL;
+ case NSAlertThirdButtonReturn:
+ return DIALOG_NO;
+ }
+}
+
+SolveSpace::DialogChoice SolveSpace::LoadAutosaveYesNo(void) {
+ NSAlert *alert = [[NSAlert alloc] init];
+ [alert setMessageText:
+ @"An autosave file is availible for this project."];
+ [alert setInformativeText:
+ @"Do you want to load the autosave file instead?"];
+ [alert addButtonWithTitle:@"Load"];
+ [alert addButtonWithTitle:@"Don't Load"];
+ switch([alert runModal]) {
+ case NSAlertFirstButtonReturn:
+ return DIALOG_YES;
+ case NSAlertSecondButtonReturn:
+ default:
+ return DIALOG_NO;
+ }
+}
+
+SolveSpace::DialogChoice SolveSpace::LocateImportedFileYesNoCancel(
+ const std::string &filename, bool canCancel) {
+ NSAlert *alert = [[NSAlert alloc] init];
+ [alert setMessageText:[NSString stringWithUTF8String:
+ ("The linked file " + filename + " is not present.").c_str()]];
+ [alert setInformativeText:
+ @"Do you want to locate it manually?\n"
+ "If you select \"No\", any geometry that depends on "
+ "the missing file will be removed."];
+ [alert addButtonWithTitle:@"Yes"];
+ if(canCancel)
+ [alert addButtonWithTitle:@"Cancel"];
+ [alert addButtonWithTitle:@"No"];
+ switch([alert runModal]) {
+ case NSAlertFirstButtonReturn:
+ return DIALOG_YES;
+ case NSAlertSecondButtonReturn:
+ default:
+ if(canCancel)
+ return DIALOG_CANCEL;
+ /* fallthrough */
+ case NSAlertThirdButtonReturn:
+ return DIALOG_NO;
+ }
+}
+
+/* Text window */
+
+@interface TextWindowView : GLViewWithEditor
+{
+ NSTrackingArea *trackingArea;
+}
+
+@property (nonatomic, getter=isCursorHand) BOOL cursorHand;
+@end
+
+@implementation TextWindowView
+- (BOOL)isFlipped {
+ return YES;
+}
+
+- (void)drawGL {
+ SolveSpace::SS.TW.Paint();
+}
+
+- (BOOL)acceptsFirstMouse:(NSEvent*)event {
+ return YES;
+}
+
+- (void) createTrackingArea {
+ trackingArea = [[NSTrackingArea alloc] initWithRect:[self bounds]
+ options:(NSTrackingMouseEnteredAndExited | NSTrackingMouseMoved |
+ NSTrackingActiveAlways)
+ owner:self userInfo:nil];
+ [self addTrackingArea:trackingArea];
+}
+
+- (void) updateTrackingAreas
+{
+ [self removeTrackingArea:trackingArea];
+ [self createTrackingArea];
+ [super updateTrackingAreas];
+}
+
+- (void)mouseMoved:(NSEvent*)event {
+ NSPoint point = [self convertPointToBacking:
+ [self convertPoint:[event locationInWindow] fromView:nil]];
+ SolveSpace::SS.TW.MouseEvent(/*leftClick*/ false, /*leftDown*/ false,
+ point.x, -point.y);
+}
+
+- (void)mouseDown:(NSEvent*)event {
+ NSPoint point = [self convertPointToBacking:
+ [self convertPoint:[event locationInWindow] fromView:nil]];
+ SolveSpace::SS.TW.MouseEvent(/*leftClick*/ true, /*leftDown*/ true,
+ point.x, -point.y);
+}
+
+- (void)mouseDragged:(NSEvent*)event {
+ NSPoint point = [self convertPointToBacking:
+ [self convertPoint:[event locationInWindow] fromView:nil]];
+ SolveSpace::SS.TW.MouseEvent(/*leftClick*/ false, /*leftDown*/ true,
+ point.x, -point.y);
+}
+
+- (void)setCursorHand:(BOOL)cursorHand {
+ if(_cursorHand != cursorHand) {
+ if(cursorHand)
+ [[NSCursor pointingHandCursor] push];
+ else
+ [NSCursor pop];
+ }
+ _cursorHand = cursorHand;
+}
+
+- (void)mouseExited:(NSEvent*)event {
+ [self setCursorHand:FALSE];
+ SolveSpace::SS.TW.MouseLeave();
+}
+
+- (void)startEditing:(NSString*)text at:(NSPoint)point {
+ point = [self convertPointFromBacking:point];
+ point.y = -point.y + 2;
+ [[self window] makeKeyWindow];
+ [super startEditing:text at:point withHeight:15.0 usingMonospace:TRUE];
+ [editor setFrameSize:(NSSize){
+ .width = [self bounds].size.width - [editor frame].origin.x,
+ .height = [editor intrinsicContentSize].height }];
+}
+
+- (void)stopEditing {
+ [super stopEditing];
+ [GW makeKeyWindow];
+}
+
+- (void)didEdit:(NSString*)text {
+ SolveSpace::SS.TW.EditControlDone([text UTF8String]);
+}
+
+- (void)cancelOperation:(id)sender {
+ [self stopEditing];
+}
+@end
+
+@interface TextWindowDelegate : NSObject<NSWindowDelegate>
+- (BOOL)windowShouldClose:(id)sender;
+- (void)windowDidResize:(NSNotification *)notification;
+@end
+
+@implementation TextWindowDelegate
+- (BOOL)windowShouldClose:(id)sender {
+ SolveSpace::GraphicsWindow::MenuView(SolveSpace::GraphicsWindow::MNU_SHOW_TEXT_WND);
+ return NO;
+}
+
+- (void)windowDidResize:(NSNotification *)notification {
+ NSClipView *view = [[[notification object] contentView] contentView];
+ NSView *document = [view documentView];
+ NSSize size = [document frame].size;
+ size.width = [view frame].size.width;
+ [document setFrameSize:size];
+}
+@end
+
+static NSPanel *TW;
+static TextWindowView *TWView;
+static TextWindowDelegate *TWDelegate;
+
+namespace SolveSpace {
+void InitTextWindow() {
+ TW = [[NSPanel alloc] init];
+ TWDelegate = [[TextWindowDelegate alloc] init];
+ [TW setStyleMask:(NSTitledWindowMask | NSClosableWindowMask | NSResizableWindowMask |
+ NSUtilityWindowMask)];
+ [[TW standardWindowButton:NSWindowMiniaturizeButton] setHidden:YES];
+ [[TW standardWindowButton:NSWindowZoomButton] setHidden:YES];
+ [TW setTitle:@"Property Browser"];
+ [TW setFrameAutosaveName:@"TextWindow"];
+ [TW setFloatingPanel:YES];
+ [TW setBecomesKeyOnlyIfNeeded:YES];
+
+ NSScrollView *scrollView = [[NSScrollView alloc] init];
+ [TW setContentView:scrollView];
+ [scrollView setBackgroundColor:[NSColor blackColor]];
+ [scrollView setHasVerticalScroller:YES];
+ [scrollView setScrollerKnobStyle:NSScrollerKnobStyleLight];
+ [[scrollView contentView] setCopiesOnScroll:YES];
+
+ TWView = [[TextWindowView alloc] init];
+ [scrollView setDocumentView:TWView];
+
+ [TW setDelegate:TWDelegate];
+ if(![TW setFrameUsingName:[TW frameAutosaveName]])
+ [TW setContentSize:(NSSize){ .width = 420, .height = 300 }];
+ [TWView setFrame:[[scrollView contentView] frame]];
+}
+
+void ShowTextWindow(bool visible) {
+ if(visible)
+ [TW orderFront:nil];
+ else
+ [TW close];
+}
+
+void GetTextWindowSize(int *w, int *h) {
+ NSSize size = [TWView convertSizeToBacking:[TWView frame].size];
+ *w = size.width;
+ *h = size.height;
+}
+
+void InvalidateText(void) {
+ NSSize size = [TWView convertSizeToBacking:[TWView frame].size];
+ size.height = (SS.TW.top[SS.TW.rows - 1] + 1) * TextWindow::LINE_HEIGHT / 2;
+ [TWView setFrameSize:[TWView convertSizeFromBacking:size]];
+ [TWView setNeedsDisplay:YES];
+}
+
+void MoveTextScrollbarTo(int pos, int maxPos, int page) {
+ /* unused; we draw the entire text window and scroll in Cocoa */
+}
+
+void SetMousePointerToHand(bool is_hand) {
+ [TWView setCursorHand:is_hand];
+}
+
+void ShowTextEditControl(int x, int y, const std::string &str) {
+ return [TWView startEditing:[NSString stringWithUTF8String:str.c_str()]
+ at:(NSPoint){(CGFloat)x, (CGFloat)y}];
+}
+
+void HideTextEditControl(void) {
+ return [TWView stopEditing];
+}
+
+bool TextEditControlIsVisible(void) {
+ return [TWView isEditing];
+}
+};
+
+/* Miscellanea */
+
+void SolveSpace::DoMessageBox(const char *str, int rows, int cols, bool error) {
+ NSAlert *alert = [[NSAlert alloc] init];
+ [alert setAlertStyle:(error ? NSWarningAlertStyle : NSInformationalAlertStyle)];
+ [alert addButtonWithTitle:@"OK"];
+
+ /* do some additional formatting of the message these are
+ heuristics, but they are made failsafe and lead to nice results. */
+ NSString *input = [NSString stringWithUTF8String:str];
+ NSRange dot = [input rangeOfCharacterFromSet:
+ [NSCharacterSet characterSetWithCharactersInString:@".:"]];
+ if(dot.location != NSNotFound) {
+ [alert setMessageText:[[input substringToIndex:dot.location + 1]
+ stringByReplacingOccurrencesOfString:@"\n" withString:@" "]];
+ [alert setInformativeText:
+ [[input substringFromIndex:dot.location + 1]
+ stringByTrimmingCharactersInSet:[NSCharacterSet newlineCharacterSet]]];
+ } else {
+ [alert setMessageText:[input
+ stringByReplacingOccurrencesOfString:@"\n" withString:@" "]];
+ }
+
+ [alert runModal];
+}
+
+void SolveSpace::OpenWebsite(const char *url) {
+ [[NSWorkspace sharedWorkspace] openURL:
+ [NSURL URLWithString:[NSString stringWithUTF8String:url]]];
+}
+
+std::vector<std::string> SolveSpace::GetFontFiles() {
+ std::vector<std::string> fonts;
+
+ NSArray *fontNames = [[NSFontManager sharedFontManager] availableFonts];
+ for(NSString *fontName in fontNames) {
+ CTFontDescriptorRef fontRef =
+ CTFontDescriptorCreateWithNameAndSize ((__bridge CFStringRef)fontName, 10.0);
+ CFURLRef url = (CFURLRef)CTFontDescriptorCopyAttribute(fontRef, kCTFontURLAttribute);
+ NSString *fontPath = [NSString stringWithString:[(NSURL *)CFBridgingRelease(url) path]];
+ fonts.push_back([[NSFileManager defaultManager]
+ fileSystemRepresentationWithPath:fontPath]);
+ }
+
+ return fonts;
+}
+
+/* Application lifecycle */
+
+@interface ApplicationDelegate : NSObject<NSApplicationDelegate>
+- (BOOL)applicationShouldTerminateAfterLastWindowClosed:(NSApplication *)theApplication;
+- (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender;
+- (void)applicationWillTerminate:(NSNotification *)aNotification;
+- (BOOL)application:(NSApplication *)theApplication openFile:(NSString *)filename;
+- (IBAction)preferences:(id)sender;
+@end
+
+@implementation ApplicationDelegate
+- (BOOL)applicationShouldTerminateAfterLastWindowClosed:(NSApplication *)theApplication {
+ return YES;
+}
+
+- (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender {
+ if(SolveSpace::SS.OkayToStartNewFile())
+ return NSTerminateNow;
+ else
+ return NSTerminateCancel;
+}
+
+- (void)applicationWillTerminate:(NSNotification *)aNotification {
+ SolveSpace::SS.Exit();
+}
+
+- (BOOL)application:(NSApplication *)theApplication openFile:(NSString *)filename {
+ return SolveSpace::SS.OpenFile([filename UTF8String]);
+}
+
+- (IBAction)preferences:(id)sender {
+ SolveSpace::SS.TW.GoToScreen(SolveSpace::TextWindow::SCREEN_CONFIGURATION);
+ SolveSpace::SS.ScheduleShowTW();
+}
+@end
+
+void SolveSpace::ExitNow(void) {
+ [NSApp stop:nil];
+}
+
+/*
+ * Normally we would just link to the 3DconnexionClient framework.
+ * We don't want to (are not allowed to) distribute the official
+ * framework, so we're trying to use the one installed on the users
+ * computer. There are some different versions of the framework,
+ * the official one and re-implementations using an open source driver
+ * for older devices (spacenav-plus). So weak-linking isn't an option,
+ * either. The only remaining way is using CFBundle to dynamically
+ * load the library at runtime, and also detect its availability.
+ *
+ * We're also defining everything needed from the 3DconnexionClientAPI,
+ * so we're not depending on the API headers.
+ */
+
+#pragma pack(push,2)
+
+enum {
+ kConnexionClientModeTakeOver = 1,
+ kConnexionClientModePlugin = 2
+};
+
+#define kConnexionMsgDeviceState '3dSR'
+#define kConnexionMaskButtons 0x00FF
+#define kConnexionMaskAxis 0x3F00
+
+typedef struct {
+ uint16_t version;
+ uint16_t client;
+ uint16_t command;
+ int16_t param;
+ int32_t value;
+ UInt64 time;
+ uint8_t report[8];
+ uint16_t buttons8;
+ int16_t axis[6];
+ uint16_t address;
+ uint32_t buttons;
+} ConnexionDeviceState, *ConnexionDeviceStatePtr;
+
+#pragma pack(pop)
+
+typedef void (*ConnexionAddedHandlerProc)(io_connect_t);
+typedef void (*ConnexionRemovedHandlerProc)(io_connect_t);
+typedef void (*ConnexionMessageHandlerProc)(io_connect_t, natural_t, void *);
+
+typedef OSErr (*InstallConnexionHandlersProc)(ConnexionMessageHandlerProc, ConnexionAddedHandlerProc, ConnexionRemovedHandlerProc);
+typedef void (*CleanupConnexionHandlersProc)(void);
+typedef UInt16 (*RegisterConnexionClientProc)(UInt32, UInt8 *, UInt16, UInt32);
+typedef void (*UnregisterConnexionClientProc)(UInt16);
+
+static BOOL connexionShiftIsDown = NO;
+static UInt16 connexionClient = 0;
+static UInt32 connexionSignature = 'SoSp';
+static UInt8 *connexionName = (UInt8 *)"SolveSpace";
+static CFBundleRef spaceBundle = NULL;
+static InstallConnexionHandlersProc installConnexionHandlers = NULL;
+static CleanupConnexionHandlersProc cleanupConnexionHandlers = NULL;
+static RegisterConnexionClientProc registerConnexionClient = NULL;
+static UnregisterConnexionClientProc unregisterConnexionClient = NULL;
+
+static void connexionAdded(io_connect_t con) {}
+static void connexionRemoved(io_connect_t con) {}
+static void connexionMessage(io_connect_t con, natural_t type, void *arg) {
+ if (type != kConnexionMsgDeviceState) {
+ return;
+ }
+
+ ConnexionDeviceState *device = (ConnexionDeviceState *)arg;
+
+ dispatch_async(dispatch_get_main_queue(), ^(void){
+ SolveSpace::SS.GW.SpaceNavigatorMoved(
+ (double)device->axis[0] * -0.25,
+ (double)device->axis[1] * -0.25,
+ (double)device->axis[2] * 0.25,
+ (double)device->axis[3] * -0.0005,
+ (double)device->axis[4] * -0.0005,
+ (double)device->axis[5] * -0.0005,
+ (connexionShiftIsDown == YES) ? 1 : 0
+ );
+ });
+}
+
+static void connexionInit() {
+ NSString *bundlePath = @"/Library/Frameworks/3DconnexionClient.framework";
+ NSURL *bundleURL = [NSURL fileURLWithPath:bundlePath];
+ spaceBundle = CFBundleCreate(kCFAllocatorDefault, (__bridge CFURLRef)bundleURL);
+
+ // Don't continue if no Spacemouse driver is installed on this machine
+ if (spaceBundle == NULL) {
+ return;
+ }
+
+ installConnexionHandlers = (InstallConnexionHandlersProc)
+ CFBundleGetFunctionPointerForName(spaceBundle,
+ CFSTR("InstallConnexionHandlers"));
+
+ cleanupConnexionHandlers = (CleanupConnexionHandlersProc)
+ CFBundleGetFunctionPointerForName(spaceBundle,
+ CFSTR("CleanupConnexionHandlers"));
+
+ registerConnexionClient = (RegisterConnexionClientProc)
+ CFBundleGetFunctionPointerForName(spaceBundle,
+ CFSTR("RegisterConnexionClient"));
+
+ unregisterConnexionClient = (UnregisterConnexionClientProc)
+ CFBundleGetFunctionPointerForName(spaceBundle,
+ CFSTR("UnregisterConnexionClient"));
+
+ // Only continue if all required symbols have been loaded
+ if ((installConnexionHandlers == NULL) || (cleanupConnexionHandlers == NULL)
+ || (registerConnexionClient == NULL) || (unregisterConnexionClient == NULL)) {
+ CFRelease(spaceBundle);
+ spaceBundle = NULL;
+ return;
+ }
+
+ installConnexionHandlers(&connexionMessage, &connexionAdded, &connexionRemoved);
+ connexionClient = registerConnexionClient(connexionSignature, connexionName,
+ kConnexionClientModeTakeOver, kConnexionMaskButtons | kConnexionMaskAxis);
+
+ // Monitor modifier flags to detect Shift button state changes
+ [NSEvent addLocalMonitorForEventsMatchingMask:(NSKeyDownMask | NSFlagsChangedMask)
+ handler:^(NSEvent *event) {
+ if (event.modifierFlags & NSShiftKeyMask) {
+ connexionShiftIsDown = YES;
+ }
+ return event;
+ }];
+
+ [NSEvent addLocalMonitorForEventsMatchingMask:(NSKeyUpMask | NSFlagsChangedMask)
+ handler:^(NSEvent *event) {
+ if (!(event.modifierFlags & NSShiftKeyMask)) {
+ connexionShiftIsDown = NO;
+ }
+ return event;
+ }];
+}
+
+static void connexionClose() {
+ if (spaceBundle == NULL) {
+ return;
+ }
+
+ unregisterConnexionClient(connexionClient);
+ cleanupConnexionHandlers();
+
+ CFRelease(spaceBundle);
+}
+
+int main(int argc, const char *argv[]) {
+ [NSApplication sharedApplication];
+ ApplicationDelegate *delegate = [[ApplicationDelegate alloc] init];
+ [NSApp setDelegate:delegate];
+
+ SolveSpace::InitGraphicsWindow();
+ SolveSpace::InitTextWindow();
+ [[NSBundle mainBundle] loadNibNamed:@"MainMenu" owner:nil topLevelObjects:nil];
+ SolveSpace::InitMainMenu([NSApp mainMenu]);
+
+ connexionInit();
+ SolveSpace::SS.Init();
+
+ [GW makeKeyAndOrderFront:nil];
+ [NSApp run];
+
+ connexionClose();
+ SolveSpace::SK.Clear();
+ SolveSpace::SS.Clear();
+
+ return 0;
+}
--- /dev/null
+#ifndef __CONFIG_H
+#define __CONFIG_H
+
+#define PACKAGE_VERSION "@solvespace_VERSION_MAJOR@.@solvespace_VERSION_MINOR@~@solvespace_GIT_HASH@"
+
+/* Do we have the si library on win32, or libspnav on *nix? */
+#cmakedefine HAVE_SPACEWARE
+
+#cmakedefine HAVE_GTK
+#cmakedefine HAVE_GTK2
+#cmakedefine HAVE_GTK3
+
+#endif
--- /dev/null
+//-----------------------------------------------------------------------------
+// For the configuration screen, setup items that are not specific to the
+// file being edited right now.
+//
+// Copyright 2008-2013 Jonathan Westhues.
+//-----------------------------------------------------------------------------
+#include "solvespace.h"
+
+void TextWindow::ScreenChangeLightDirection(int link, uint32_t v) {
+ SS.TW.ShowEditControl(8, ssprintf("%.2f, %.2f, %.2f", CO(SS.lightDir[v])));
+ SS.TW.edit.meaning = EDIT_LIGHT_DIRECTION;
+ SS.TW.edit.i = v;
+}
+
+void TextWindow::ScreenChangeLightIntensity(int link, uint32_t v) {
+ SS.TW.ShowEditControl(31, ssprintf("%.2f", SS.lightIntensity[v]));
+ SS.TW.edit.meaning = EDIT_LIGHT_INTENSITY;
+ SS.TW.edit.i = v;
+}
+
+void TextWindow::ScreenChangeColor(int link, uint32_t v) {
+ SS.TW.ShowEditControlWithColorPicker(13, SS.modelColor[v]);
+
+ SS.TW.edit.meaning = EDIT_COLOR;
+ SS.TW.edit.i = v;
+}
+
+void TextWindow::ScreenChangeChordTolerance(int link, uint32_t v) {
+ SS.TW.ShowEditControl(3, ssprintf("%lg", SS.chordTol));
+ SS.TW.edit.meaning = EDIT_CHORD_TOLERANCE;
+ SS.TW.edit.i = 0;
+}
+
+void TextWindow::ScreenChangeMaxSegments(int link, uint32_t v) {
+ SS.TW.ShowEditControl(3, ssprintf("%d", SS.maxSegments));
+ SS.TW.edit.meaning = EDIT_MAX_SEGMENTS;
+ SS.TW.edit.i = 0;
+}
+
+void TextWindow::ScreenChangeExportChordTolerance(int link, uint32_t v) {
+ SS.TW.ShowEditControl(3, ssprintf("%lg", SS.exportChordTol));
+ SS.TW.edit.meaning = EDIT_CHORD_TOLERANCE;
+ SS.TW.edit.i = 1;
+}
+
+void TextWindow::ScreenChangeExportMaxSegments(int link, uint32_t v) {
+ SS.TW.ShowEditControl(3, ssprintf("%d", SS.exportMaxSegments));
+ SS.TW.edit.meaning = EDIT_MAX_SEGMENTS;
+ SS.TW.edit.i = 1;
+}
+
+void TextWindow::ScreenChangeCameraTangent(int link, uint32_t v) {
+ SS.TW.ShowEditControl(3, ssprintf("%.3f", 1000*SS.cameraTangent));
+ SS.TW.edit.meaning = EDIT_CAMERA_TANGENT;
+}
+
+void TextWindow::ScreenChangeGridSpacing(int link, uint32_t v) {
+ SS.TW.ShowEditControl(3, SS.MmToString(SS.gridSpacing));
+ SS.TW.edit.meaning = EDIT_GRID_SPACING;
+}
+
+void TextWindow::ScreenChangeDigitsAfterDecimal(int link, uint32_t v) {
+ SS.TW.ShowEditControl(3, ssprintf("%d", SS.UnitDigitsAfterDecimal()));
+ SS.TW.edit.meaning = EDIT_DIGITS_AFTER_DECIMAL;
+}
+
+void TextWindow::ScreenChangeExportScale(int link, uint32_t v) {
+ SS.TW.ShowEditControl(5, ssprintf("%.3f", (double)SS.exportScale));
+ SS.TW.edit.meaning = EDIT_EXPORT_SCALE;
+}
+
+void TextWindow::ScreenChangeExportOffset(int link, uint32_t v) {
+ SS.TW.ShowEditControl(3, SS.MmToString(SS.exportOffset));
+ SS.TW.edit.meaning = EDIT_EXPORT_OFFSET;
+}
+
+void TextWindow::ScreenChangeFixExportColors(int link, uint32_t v) {
+ SS.fixExportColors = !SS.fixExportColors;
+}
+
+void TextWindow::ScreenChangeBackFaces(int link, uint32_t v) {
+ SS.drawBackFaces = !SS.drawBackFaces;
+ InvalidateGraphics();
+}
+
+void TextWindow::ScreenChangeCheckClosedContour(int link, uint32_t v) {
+ SS.checkClosedContour = !SS.checkClosedContour;
+ InvalidateGraphics();
+}
+
+void TextWindow::ScreenChangeShadedTriangles(int link, uint32_t v) {
+ SS.exportShadedTriangles = !SS.exportShadedTriangles;
+ InvalidateGraphics();
+}
+
+void TextWindow::ScreenChangePwlCurves(int link, uint32_t v) {
+ SS.exportPwlCurves = !SS.exportPwlCurves;
+ InvalidateGraphics();
+}
+
+void TextWindow::ScreenChangeCanvasSizeAuto(int link, uint32_t v) {
+ if(link == 't') {
+ SS.exportCanvasSizeAuto = true;
+ } else {
+ SS.exportCanvasSizeAuto = false;
+ }
+ InvalidateGraphics();
+}
+
+void TextWindow::ScreenChangeCanvasSize(int link, uint32_t v) {
+ double d;
+ switch(v) {
+ case 0: d = SS.exportMargin.left; break;
+ case 1: d = SS.exportMargin.right; break;
+ case 2: d = SS.exportMargin.bottom; break;
+ case 3: d = SS.exportMargin.top; break;
+
+ case 10: d = SS.exportCanvas.width; break;
+ case 11: d = SS.exportCanvas.height; break;
+ case 12: d = SS.exportCanvas.dx; break;
+ case 13: d = SS.exportCanvas.dy; break;
+
+ default: return;
+ }
+ int col = 13;
+ if(v < 10) col = 11;
+ SS.TW.ShowEditControl(col, SS.MmToString(d));
+ SS.TW.edit.meaning = EDIT_CANVAS_SIZE;
+ SS.TW.edit.i = v;
+}
+
+void TextWindow::ScreenChangeGCodeParameter(int link, uint32_t v) {
+ std::string buf;
+ switch(link) {
+ case 'd':
+ SS.TW.edit.meaning = EDIT_G_CODE_DEPTH;
+ buf += SS.MmToString(SS.gCode.depth);
+ break;
+
+ case 's':
+ SS.TW.edit.meaning = EDIT_G_CODE_PASSES;
+ buf += std::to_string(SS.gCode.passes);
+ break;
+
+ case 'F':
+ SS.TW.edit.meaning = EDIT_G_CODE_FEED;
+ buf += SS.MmToString(SS.gCode.feed);
+ break;
+
+ case 'P':
+ SS.TW.edit.meaning = EDIT_G_CODE_PLUNGE_FEED;
+ buf += SS.MmToString(SS.gCode.plungeFeed);
+ break;
+ }
+ SS.TW.ShowEditControl(14, buf);
+}
+
+void TextWindow::ScreenChangeAutosaveInterval(int link, uint32_t v) {
+ SS.TW.ShowEditControl(3, std::to_string(SS.autosaveInterval));
+ SS.TW.edit.meaning = EDIT_AUTOSAVE_INTERVAL;
+}
+
+void TextWindow::ShowConfiguration(void) {
+ int i;
+ Printf(true, "%Ft user color (r, g, b)");
+
+ for(i = 0; i < SS.MODEL_COLORS; i++) {
+ Printf(false, "%Bp #%d: %Bz %Bp (%@, %@, %@) %f%D%Ll%Fl[change]%E",
+ (i & 1) ? 'd' : 'a',
+ i, &SS.modelColor[i],
+ (i & 1) ? 'd' : 'a',
+ SS.modelColor[i].redF(),
+ SS.modelColor[i].greenF(),
+ SS.modelColor[i].blueF(),
+ &ScreenChangeColor, i);
+ }
+
+ Printf(false, "");
+ Printf(false, "%Ft light direction intensity");
+ for(i = 0; i < 2; i++) {
+ Printf(false, "%Bp #%d (%2,%2,%2)%Fl%D%f%Ll[c]%E "
+ "%2 %Fl%D%f%Ll[c]%E",
+ (i & 1) ? 'd' : 'a', i,
+ CO(SS.lightDir[i]), i, &ScreenChangeLightDirection,
+ SS.lightIntensity[i], i, &ScreenChangeLightIntensity);
+ }
+
+ Printf(false, "");
+ Printf(false, "%Ft chord tolerance (in percents)%E");
+ Printf(false, "%Ba %@ %% %Fl%Ll%f%D[change]%E; %@ mm, %d triangles",
+ SS.chordTol,
+ &ScreenChangeChordTolerance, 0, SS.chordTolCalculated,
+ SK.GetGroup(SS.GW.activeGroup)->displayMesh.l.n);
+ Printf(false, "%Ft max piecewise linear segments%E");
+ Printf(false, "%Ba %d %Fl%Ll%f[change]%E",
+ SS.maxSegments,
+ &ScreenChangeMaxSegments);
+
+ Printf(false, "");
+ Printf(false, "%Ft export chord tolerance (in mm)%E");
+ Printf(false, "%Ba %@ %Fl%Ll%f%D[change]%E",
+ SS.exportChordTol,
+ &ScreenChangeExportChordTolerance, 0);
+ Printf(false, "%Ft export max piecewise linear segments%E");
+ Printf(false, "%Ba %d %Fl%Ll%f[change]%E",
+ SS.exportMaxSegments,
+ &ScreenChangeExportMaxSegments);
+
+ Printf(false, "");
+ Printf(false, "%Ft perspective factor (0 for parallel)%E");
+ Printf(false, "%Ba %# %Fl%Ll%f%D[change]%E",
+ SS.cameraTangent*1000,
+ &ScreenChangeCameraTangent, 0);
+ Printf(false, "%Ft snap grid spacing%E");
+ Printf(false, "%Ba %s %Fl%Ll%f%D[change]%E",
+ SS.MmToString(SS.gridSpacing).c_str(),
+ &ScreenChangeGridSpacing, 0);
+ Printf(false, "%Ft digits after decimal point to show%E");
+ Printf(false, "%Ba %d %Fl%Ll%f%D[change]%E (e.g. '%s')",
+ SS.UnitDigitsAfterDecimal(),
+ &ScreenChangeDigitsAfterDecimal, 0,
+ SS.MmToString(SS.StringToMm("1.23456789")).c_str());
+
+ Printf(false, "");
+ Printf(false, "%Ft export scale factor (1:1=mm, 1:25.4=inch)");
+ Printf(false, "%Ba 1:%# %Fl%Ll%f%D[change]%E",
+ (double)SS.exportScale,
+ &ScreenChangeExportScale, 0);
+ Printf(false, "%Ft cutter radius offset (0=no offset) ");
+ Printf(false, "%Ba %s %Fl%Ll%f%D[change]%E",
+ SS.MmToString(SS.exportOffset).c_str(),
+ &ScreenChangeExportOffset, 0);
+
+ Printf(false, "");
+ Printf(false, " %Fd%f%Ll%s export shaded 2d triangles%E",
+ &ScreenChangeShadedTriangles,
+ SS.exportShadedTriangles ? CHECK_TRUE : CHECK_FALSE);
+ if(fabs(SS.exportOffset) > LENGTH_EPS) {
+ Printf(false, " %Fd%s curves as piecewise linear%E "
+ "(since cutter radius is not zero)", CHECK_TRUE);
+ } else {
+ Printf(false, " %Fd%f%Ll%s export curves as piecewise linear%E",
+ &ScreenChangePwlCurves,
+ SS.exportPwlCurves ? CHECK_TRUE : CHECK_FALSE);
+ }
+ Printf(false, " %Fd%f%Ll%s fix white exported lines%E",
+ &ScreenChangeFixExportColors,
+ SS.fixExportColors ? CHECK_TRUE : CHECK_FALSE);
+
+ Printf(false, "");
+ Printf(false, "%Ft export canvas size: "
+ "%f%Fd%Lf%s fixed%E "
+ "%f%Fd%Lt%s auto%E",
+ &ScreenChangeCanvasSizeAuto,
+ !SS.exportCanvasSizeAuto ? RADIO_TRUE : RADIO_FALSE,
+ &ScreenChangeCanvasSizeAuto,
+ SS.exportCanvasSizeAuto ? RADIO_TRUE : RADIO_FALSE);
+
+ if(SS.exportCanvasSizeAuto) {
+ Printf(false, "%Ft (by margins around exported geometry)");
+ Printf(false, "%Ba%Ft left: %Fd%s %Fl%Ll%f%D[change]%E",
+ SS.MmToString(SS.exportMargin.left).c_str(), &ScreenChangeCanvasSize, 0);
+ Printf(false, "%Bd%Ft right: %Fd%s %Fl%Ll%f%D[change]%E",
+ SS.MmToString(SS.exportMargin.right).c_str(), &ScreenChangeCanvasSize, 1);
+ Printf(false, "%Ba%Ft bottom: %Fd%s %Fl%Ll%f%D[change]%E",
+ SS.MmToString(SS.exportMargin.bottom).c_str(), &ScreenChangeCanvasSize, 2);
+ Printf(false, "%Bd%Ft top: %Fd%s %Fl%Ll%f%D[change]%E",
+ SS.MmToString(SS.exportMargin.top).c_str(), &ScreenChangeCanvasSize, 3);
+ } else {
+ Printf(false, "%Ft (by absolute dimensions and offsets)");
+ Printf(false, "%Ba%Ft width: %Fd%s %Fl%Ll%f%D[change]%E",
+ SS.MmToString(SS.exportCanvas.width).c_str(), &ScreenChangeCanvasSize, 10);
+ Printf(false, "%Bd%Ft height: %Fd%s %Fl%Ll%f%D[change]%E",
+ SS.MmToString(SS.exportCanvas.height).c_str(), &ScreenChangeCanvasSize, 11);
+ Printf(false, "%Ba%Ft offset x: %Fd%s %Fl%Ll%f%D[change]%E",
+ SS.MmToString(SS.exportCanvas.dx).c_str(), &ScreenChangeCanvasSize, 12);
+ Printf(false, "%Bd%Ft offset y: %Fd%s %Fl%Ll%f%D[change]%E",
+ SS.MmToString(SS.exportCanvas.dy).c_str(), &ScreenChangeCanvasSize, 13);
+ }
+
+ Printf(false, "");
+ Printf(false, "%Ft exported g code parameters");
+ Printf(false, "%Ba%Ft depth: %Fd%s %Fl%Ld%f[change]%E",
+ SS.MmToString(SS.gCode.depth).c_str(), &ScreenChangeGCodeParameter);
+ Printf(false, "%Bd%Ft passes: %Fd%d %Fl%Ls%f[change]%E",
+ SS.gCode.passes, &ScreenChangeGCodeParameter);
+ Printf(false, "%Ba%Ft feed: %Fd%s %Fl%LF%f[change]%E",
+ SS.MmToString(SS.gCode.feed).c_str(), &ScreenChangeGCodeParameter);
+ Printf(false, "%Bd%Ft plunge fd: %Fd%s %Fl%LP%f[change]%E",
+ SS.MmToString(SS.gCode.plungeFeed).c_str(), &ScreenChangeGCodeParameter);
+
+ Printf(false, "");
+ Printf(false, " %Fd%f%Ll%s draw triangle back faces in red%E",
+ &ScreenChangeBackFaces,
+ SS.drawBackFaces ? CHECK_TRUE : CHECK_FALSE);
+ Printf(false, " %Fd%f%Ll%s check sketch for closed contour%E",
+ &ScreenChangeCheckClosedContour,
+ SS.checkClosedContour ? CHECK_TRUE : CHECK_FALSE);
+
+ Printf(false, "");
+ Printf(false, "%Ft autosave interval (in minutes)%E");
+ Printf(false, "%Ba %d %Fl%Ll%f[change]%E",
+ SS.autosaveInterval, &ScreenChangeAutosaveInterval);
+
+ Printf(false, "");
+ Printf(false, " %Ftgl vendor %E%s", glGetString(GL_VENDOR));
+ Printf(false, " %Ft renderer %E%s", glGetString(GL_RENDERER));
+ Printf(false, " %Ft version %E%s", glGetString(GL_VERSION));
+}
+
+bool TextWindow::EditControlDoneForConfiguration(const char *s) {
+ switch(edit.meaning) {
+ case EDIT_LIGHT_INTENSITY:
+ SS.lightIntensity[edit.i] = min(1.0, max(0.0, atof(s)));
+ InvalidateGraphics();
+ break;
+
+ case EDIT_LIGHT_DIRECTION: {
+ double x, y, z;
+ if(sscanf(s, "%lf, %lf, %lf", &x, &y, &z)==3) {
+ SS.lightDir[edit.i] = Vector::From(x, y, z);
+ } else {
+ Error("Bad format: specify coordinates as x, y, z");
+ }
+ InvalidateGraphics();
+ break;
+ }
+ case EDIT_COLOR: {
+ Vector rgb;
+ if(sscanf(s, "%lf, %lf, %lf", &rgb.x, &rgb.y, &rgb.z)==3) {
+ rgb = rgb.ClampWithin(0, 1);
+ SS.modelColor[edit.i] = RGBf(rgb.x, rgb.y, rgb.z);
+ } else {
+ Error("Bad format: specify color as r, g, b");
+ }
+ break;
+ }
+ case EDIT_CHORD_TOLERANCE: {
+ if(edit.i == 0) {
+ SS.chordTol = max(0.0, atof(s));
+ SS.GenerateAll(SolveSpaceUI::GENERATE_ALL);
+ } else {
+ SS.exportChordTol = max(0.0, atof(s));
+ }
+ break;
+ }
+ case EDIT_MAX_SEGMENTS: {
+ if(edit.i == 0) {
+ SS.maxSegments = min(1000, max(7, atoi(s)));
+ SS.GenerateAll(SolveSpaceUI::GENERATE_ALL);
+ } else {
+ SS.exportMaxSegments = min(1000, max(7, atoi(s)));
+ }
+ break;
+ }
+ case EDIT_CAMERA_TANGENT: {
+ SS.cameraTangent = (min(2.0, max(0.0, atof(s))))/1000.0;
+ if(!SS.usePerspectiveProj) {
+ Message("The perspective factor will have no effect until you "
+ "enable View -> Use Perspective Projection.");
+ }
+ InvalidateGraphics();
+ break;
+ }
+ case EDIT_GRID_SPACING: {
+ SS.gridSpacing = (float)min(1e4, max(1e-3, SS.StringToMm(s)));
+ InvalidateGraphics();
+ break;
+ }
+ case EDIT_DIGITS_AFTER_DECIMAL: {
+ int v = atoi(s);
+ if(v < 0 || v > 8) {
+ Error("Specify between 0 and 8 digits after the decimal.");
+ } else {
+ SS.SetUnitDigitsAfterDecimal(v);
+ }
+ InvalidateGraphics();
+ break;
+ }
+ case EDIT_EXPORT_SCALE: {
+ Expr *e = Expr::From(s, true);
+ if(e) {
+ double ev = e->Eval();
+ if(fabs(ev) < 0.001 || isnan(ev)) {
+ Error("Export scale must not be zero!");
+ } else {
+ SS.exportScale = (float)ev;
+ }
+ }
+ break;
+ }
+ case EDIT_EXPORT_OFFSET: {
+ Expr *e = Expr::From(s, true);
+ if(e) {
+ double ev = SS.ExprToMm(e);
+ if(isnan(ev) || ev < 0) {
+ Error("Cutter radius offset must not be negative!");
+ } else {
+ SS.exportOffset = (float)ev;
+ }
+ }
+ break;
+ }
+ case EDIT_CANVAS_SIZE: {
+ Expr *e = Expr::From(s, true);
+ if(!e) {
+ break;
+ }
+ float d = (float)SS.ExprToMm(e);
+ switch(edit.i) {
+ case 0: SS.exportMargin.left = d; break;
+ case 1: SS.exportMargin.right = d; break;
+ case 2: SS.exportMargin.bottom = d; break;
+ case 3: SS.exportMargin.top = d; break;
+
+ case 10: SS.exportCanvas.width = d; break;
+ case 11: SS.exportCanvas.height = d; break;
+ case 12: SS.exportCanvas.dx = d; break;
+ case 13: SS.exportCanvas.dy = d; break;
+ }
+ break;
+ }
+ case EDIT_G_CODE_DEPTH: {
+ Expr *e = Expr::From(s, true);
+ if(e) SS.gCode.depth = (float)SS.ExprToMm(e);
+ break;
+ }
+ case EDIT_G_CODE_PASSES: {
+ Expr *e = Expr::From(s, true);
+ if(e) SS.gCode.passes = (int)(e->Eval());
+ SS.gCode.passes = max(1, min(1000, SS.gCode.passes));
+ break;
+ }
+ case EDIT_G_CODE_FEED: {
+ Expr *e = Expr::From(s, true);
+ if(e) SS.gCode.feed = (float)SS.ExprToMm(e);
+ break;
+ }
+ case EDIT_G_CODE_PLUNGE_FEED: {
+ Expr *e = Expr::From(s, true);
+ if(e) SS.gCode.plungeFeed = (float)SS.ExprToMm(e);
+ break;
+ }
+ case EDIT_AUTOSAVE_INTERVAL: {
+ int interval;
+ if(sscanf(s, "%d", &interval)==1) {
+ if(interval >= 1) {
+ SS.autosaveInterval = interval;
+ SetAutosaveTimerFor(interval);
+ } else {
+ Error("Bad value: autosave interval should be positive");
+ }
+ } else {
+ Error("Bad format: specify interval in integral minutes");
+ }
+ break;
+ }
+
+ default: return false;
+ }
+ return true;
+}
+
--- /dev/null
+//-----------------------------------------------------------------------------
+// Implementation of the Constraint menu, to create new constraints in
+// the sketch.
+//
+// Copyright 2008-2013 Jonathan Westhues.
+//-----------------------------------------------------------------------------
+#include "solvespace.h"
+
+std::string Constraint::DescriptionString(void) {
+ const char *s;
+ switch(type) {
+ case POINTS_COINCIDENT: s = "pts-coincident"; break;
+ case PT_PT_DISTANCE: s = "pt-pt-distance"; break;
+ case PT_LINE_DISTANCE: s = "pt-line-distance"; break;
+ case PT_PLANE_DISTANCE: s = "pt-plane-distance"; break;
+ case PT_FACE_DISTANCE: s = "pt-face-distance"; break;
+ case PROJ_PT_DISTANCE: s = "proj-pt-pt-distance"; break;
+ case PT_IN_PLANE: s = "pt-in-plane"; break;
+ case PT_ON_LINE: s = "pt-on-line"; break;
+ case PT_ON_FACE: s = "pt-on-face"; break;
+ case EQUAL_LENGTH_LINES: s = "eq-length"; break;
+ case EQ_LEN_PT_LINE_D: s = "eq-length-and-pt-ln-dist"; break;
+ case EQ_PT_LN_DISTANCES: s = "eq-pt-line-distances"; break;
+ case LENGTH_RATIO: s = "length-ratio"; break;
+ case LENGTH_DIFFERENCE: s = "length-difference"; break;
+ case SYMMETRIC: s = "symmetric"; break;
+ case SYMMETRIC_HORIZ: s = "symmetric-h"; break;
+ case SYMMETRIC_VERT: s = "symmetric-v"; break;
+ case SYMMETRIC_LINE: s = "symmetric-line"; break;
+ case AT_MIDPOINT: s = "at-midpoint"; break;
+ case HORIZONTAL: s = "horizontal"; break;
+ case VERTICAL: s = "vertical"; break;
+ case DIAMETER: s = "diameter"; break;
+ case PT_ON_CIRCLE: s = "pt-on-circle"; break;
+ case SAME_ORIENTATION: s = "same-orientation"; break;
+ case ANGLE: s = "angle"; break;
+ case PARALLEL: s = "parallel"; break;
+ case ARC_LINE_TANGENT: s = "arc-line-tangent"; break;
+ case CUBIC_LINE_TANGENT: s = "cubic-line-tangent"; break;
+ case CURVE_CURVE_TANGENT: s = "curve-curve-tangent"; break;
+ case PERPENDICULAR: s = "perpendicular"; break;
+ case EQUAL_RADIUS: s = "eq-radius"; break;
+ case EQUAL_ANGLE: s = "eq-angle"; break;
+ case EQUAL_LINE_ARC_LEN: s = "eq-line-len-arc-len"; break;
+ case WHERE_DRAGGED: s = "lock-where-dragged"; break;
+ case COMMENT: s = "comment"; break;
+ default: s = "???"; break;
+ }
+
+ return ssprintf("c%03x-%s", h.v, s);
+}
+
+#ifndef LIBRARY
+
+//-----------------------------------------------------------------------------
+// Delete all constraints with the specified type, entityA, ptA. We use this
+// when auto-removing constraints that would become redundant.
+//-----------------------------------------------------------------------------
+void Constraint::DeleteAllConstraintsFor(int type, hEntity entityA, hEntity ptA)
+{
+ SK.constraint.ClearTags();
+ for(int i = 0; i < SK.constraint.n; i++) {
+ ConstraintBase *ct = &(SK.constraint.elem[i]);
+ if(ct->type != type) continue;
+
+ if(ct->entityA.v != entityA.v) continue;
+ if(ct->ptA.v != ptA.v) continue;
+ ct->tag = 1;
+ }
+ SK.constraint.RemoveTagged();
+ // And no need to do anything special, since nothing
+ // ever depends on a constraint. But do clear the
+ // hover, in case the just-deleted constraint was
+ // hovered.
+ SS.GW.hover.Clear();
+}
+
+hConstraint Constraint::AddConstraint(Constraint *c) {
+ return AddConstraint(c, true);
+}
+
+hConstraint Constraint::AddConstraint(Constraint *c, bool rememberForUndo) {
+ if(rememberForUndo) SS.UndoRemember();
+
+ SK.constraint.AddAndAssignId(c);
+
+ SS.MarkGroupDirty(c->group);
+ SS.ScheduleGenerateAll();
+ return c->h;
+}
+
+hConstraint Constraint::Constrain(int type, hEntity ptA, hEntity ptB,
+ hEntity entityA, hEntity entityB,
+ bool other, bool other2)
+{
+ Constraint c = {};
+ c.group = SS.GW.activeGroup;
+ c.workplane = SS.GW.ActiveWorkplane();
+ c.type = type;
+ c.ptA = ptA;
+ c.ptB = ptB;
+ c.entityA = entityA;
+ c.entityB = entityB;
+ c.other = other;
+ c.other2 = other2;
+ return AddConstraint(&c, false);
+}
+
+hConstraint Constraint::Constrain(int type, hEntity ptA, hEntity ptB, hEntity entityA){
+ return Constrain(type, ptA, ptB, entityA, Entity::NO_ENTITY, false, false);
+}
+
+hConstraint Constraint::ConstrainCoincident(hEntity ptA, hEntity ptB) {
+ return Constrain(POINTS_COINCIDENT, ptA, ptB,
+ Entity::NO_ENTITY, Entity::NO_ENTITY, false, false);
+}
+
+void Constraint::MenuConstrain(int id) {
+ Constraint c = {};
+ c.group = SS.GW.activeGroup;
+ c.workplane = SS.GW.ActiveWorkplane();
+
+ SS.GW.GroupSelection();
+#define gs (SS.GW.gs)
+
+ switch(id) {
+ case GraphicsWindow::MNU_DISTANCE_DIA:
+ case GraphicsWindow::MNU_REF_DISTANCE: {
+ if(gs.points == 2 && gs.n == 2) {
+ c.type = PT_PT_DISTANCE;
+ c.ptA = gs.point[0];
+ c.ptB = gs.point[1];
+ } else if(gs.lineSegments == 1 && gs.n == 1) {
+ c.type = PT_PT_DISTANCE;
+ Entity *e = SK.GetEntity(gs.entity[0]);
+ c.ptA = e->point[0];
+ c.ptB = e->point[1];
+ } else if(gs.vectors == 1 && gs.points == 2 && gs.n == 3) {
+ c.type = PROJ_PT_DISTANCE;
+ c.ptA = gs.point[0];
+ c.ptB = gs.point[1];
+ c.entityA = gs.vector[0];
+ } else if(gs.workplanes == 1 && gs.points == 1 && gs.n == 2) {
+ c.type = PT_PLANE_DISTANCE;
+ c.ptA = gs.point[0];
+ c.entityA = gs.entity[0];
+ } else if(gs.lineSegments == 1 && gs.points == 1 && gs.n == 2) {
+ c.type = PT_LINE_DISTANCE;
+ c.ptA = gs.point[0];
+ c.entityA = gs.entity[0];
+ } else if(gs.faces == 1 && gs.points == 1 && gs.n == 2) {
+ c.type = PT_FACE_DISTANCE;
+ c.ptA = gs.point[0];
+ c.entityA = gs.face[0];
+ } else if(gs.circlesOrArcs == 1 && gs.n == 1) {
+ c.type = DIAMETER;
+ c.entityA = gs.entity[0];
+ } else {
+ Error(
+"Bad selection for distance / diameter constraint. This "
+"constraint can apply to:\n\n"
+" * two points (distance between points)\n"
+" * a line segment (length)\n"
+" * two points and a line segment or normal (projected distance)\n"
+" * a workplane and a point (minimum distance)\n"
+" * a line segment and a point (minimum distance)\n"
+" * a plane face and a point (minimum distance)\n"
+" * a circle or an arc (diameter)\n");
+ return;
+ }
+ if(c.type == PT_PT_DISTANCE || c.type == PROJ_PT_DISTANCE) {
+ Vector n = SS.GW.projRight.Cross(SS.GW.projUp);
+ Vector a = SK.GetEntity(c.ptA)->PointGetNum();
+ Vector b = SK.GetEntity(c.ptB)->PointGetNum();
+ c.disp.offset = n.Cross(a.Minus(b));
+ c.disp.offset = (c.disp.offset).WithMagnitude(50/SS.GW.scale);
+ } else {
+ c.disp.offset = Vector::From(0, 0, 0);
+ }
+
+ if(id == GraphicsWindow::MNU_REF_DISTANCE) {
+ c.reference = true;
+ }
+
+ c.valA = 0;
+ c.ModifyToSatisfy();
+ AddConstraint(&c);
+ break;
+ }
+
+ case GraphicsWindow::MNU_ON_ENTITY:
+ if(gs.points == 2 && gs.n == 2) {
+ c.type = POINTS_COINCIDENT;
+ c.ptA = gs.point[0];
+ c.ptB = gs.point[1];
+ } else if(gs.points == 1 && gs.workplanes == 1 && gs.n == 2) {
+ c.type = PT_IN_PLANE;
+ c.ptA = gs.point[0];
+ c.entityA = gs.entity[0];
+ } else if(gs.points == 1 && gs.lineSegments == 1 && gs.n == 2) {
+ c.type = PT_ON_LINE;
+ c.ptA = gs.point[0];
+ c.entityA = gs.entity[0];
+ } else if(gs.points == 1 && gs.circlesOrArcs == 1 && gs.n == 2) {
+ c.type = PT_ON_CIRCLE;
+ c.ptA = gs.point[0];
+ c.entityA = gs.entity[0];
+ } else if(gs.points == 1 && gs.faces == 1 && gs.n == 2) {
+ c.type = PT_ON_FACE;
+ c.ptA = gs.point[0];
+ c.entityA = gs.face[0];
+ } else {
+ Error("Bad selection for on point / curve / plane constraint. "
+ "This constraint can apply to:\n\n"
+ " * two points (points coincident)\n"
+ " * a point and a workplane (point in plane)\n"
+ " * a point and a line segment (point on line)\n"
+ " * a point and a circle or arc (point on curve)\n"
+ " * a point and a plane face (point on face)\n");
+ return;
+ }
+ AddConstraint(&c);
+ break;
+
+ case GraphicsWindow::MNU_EQUAL:
+ if(gs.lineSegments == 2 && gs.n == 2) {
+ c.type = EQUAL_LENGTH_LINES;
+ c.entityA = gs.entity[0];
+ c.entityB = gs.entity[1];
+ } else if(gs.lineSegments == 2 && gs.points == 2 && gs.n == 4) {
+ c.type = EQ_PT_LN_DISTANCES;
+ c.entityA = gs.entity[0];
+ c.ptA = gs.point[0];
+ c.entityB = gs.entity[1];
+ c.ptB = gs.point[1];
+ } else if(gs.lineSegments == 1 && gs.points == 2 && gs.n == 3) {
+ // The same line segment for the distances, but different
+ // points.
+ c.type = EQ_PT_LN_DISTANCES;
+ c.entityA = gs.entity[0];
+ c.ptA = gs.point[0];
+ c.entityB = gs.entity[0];
+ c.ptB = gs.point[1];
+ } else if(gs.lineSegments == 2 && gs.points == 1 && gs.n == 3) {
+ c.type = EQ_LEN_PT_LINE_D;
+ c.entityA = gs.entity[0];
+ c.entityB = gs.entity[1];
+ c.ptA = gs.point[0];
+ } else if(gs.vectors == 4 && gs.n == 4) {
+ c.type = EQUAL_ANGLE;
+ c.entityA = gs.vector[0];
+ c.entityB = gs.vector[1];
+ c.entityC = gs.vector[2];
+ c.entityD = gs.vector[3];
+ } else if(gs.vectors == 3 && gs.n == 3) {
+ c.type = EQUAL_ANGLE;
+ c.entityA = gs.vector[0];
+ c.entityB = gs.vector[1];
+ c.entityC = gs.vector[1];
+ c.entityD = gs.vector[2];
+ } else if(gs.circlesOrArcs == 2 && gs.n == 2) {
+ c.type = EQUAL_RADIUS;
+ c.entityA = gs.entity[0];
+ c.entityB = gs.entity[1];
+ } else if(gs.arcs == 1 && gs.lineSegments == 1 && gs.n == 2) {
+ c.type = EQUAL_LINE_ARC_LEN;
+ if(SK.GetEntity(gs.entity[0])->type == Entity::ARC_OF_CIRCLE) {
+ c.entityA = gs.entity[1];
+ c.entityB = gs.entity[0];
+ } else {
+ c.entityA = gs.entity[0];
+ c.entityB = gs.entity[1];
+ }
+ } else {
+ Error("Bad selection for equal length / radius constraint. "
+ "This constraint can apply to:\n\n"
+ " * two line segments (equal length)\n"
+ " * two line segments and two points "
+ "(equal point-line distances)\n"
+ " * a line segment and two points "
+ "(equal point-line distances)\n"
+ " * a line segment, and a point and line segment "
+ "(point-line distance equals length)\n"
+ " * four line segments or normals "
+ "(equal angle between A,B and C,D)\n"
+ " * three line segments or normals "
+ "(equal angle between A,B and B,C)\n"
+ " * two circles or arcs (equal radius)\n"
+ " * a line segment and an arc "
+ "(line segment length equals arc length)\n");
+ return;
+ }
+ if(c.type == EQUAL_ANGLE) {
+ // Infer the nearest supplementary angle from the sketch.
+ Vector a1 = SK.GetEntity(c.entityA)->VectorGetNum(),
+ b1 = SK.GetEntity(c.entityB)->VectorGetNum(),
+ a2 = SK.GetEntity(c.entityC)->VectorGetNum(),
+ b2 = SK.GetEntity(c.entityD)->VectorGetNum();
+ double d1 = a1.Dot(b1), d2 = a2.Dot(b2);
+
+ if(d1*d2 < 0) {
+ c.other = true;
+ }
+ }
+ AddConstraint(&c);
+ break;
+
+ case GraphicsWindow::MNU_RATIO:
+ if(gs.lineSegments == 2 && gs.n == 2) {
+ c.type = LENGTH_RATIO;
+ c.entityA = gs.entity[0];
+ c.entityB = gs.entity[1];
+ } else {
+ Error("Bad selection for length ratio constraint. This "
+ "constraint can apply to:\n\n"
+ " * two line segments\n");
+ return;
+ }
+
+ c.valA = 0;
+ c.ModifyToSatisfy();
+ AddConstraint(&c);
+ break;
+
+ case GraphicsWindow::MNU_DIFFERENCE:
+ if(gs.lineSegments == 2 && gs.n == 2) {
+ c.type = LENGTH_DIFFERENCE;
+ c.entityA = gs.entity[0];
+ c.entityB = gs.entity[1];
+ } else {
+ Error("Bad selection for length difference constraint. This "
+ "constraint can apply to:\n\n"
+ " * two line segments\n");
+ return;
+ }
+
+ c.valA = 0;
+ c.ModifyToSatisfy();
+ AddConstraint(&c);
+ break;
+
+ case GraphicsWindow::MNU_AT_MIDPOINT:
+ if(gs.lineSegments == 1 && gs.points == 1 && gs.n == 2) {
+ c.type = AT_MIDPOINT;
+ c.entityA = gs.entity[0];
+ c.ptA = gs.point[0];
+
+ // If a point is at-midpoint, then no reason to also constrain
+ // it on-line; so auto-remove that.
+ DeleteAllConstraintsFor(PT_ON_LINE, c.entityA, c.ptA);
+ } else if(gs.lineSegments == 1 && gs.workplanes == 1 && gs.n == 2) {
+ c.type = AT_MIDPOINT;
+ int i = SK.GetEntity(gs.entity[0])->IsWorkplane() ? 1 : 0;
+ c.entityA = gs.entity[i];
+ c.entityB = gs.entity[1-i];
+ } else {
+ Error("Bad selection for at midpoint constraint. This "
+ "constraint can apply to:\n\n"
+ " * a line segment and a point "
+ "(point at midpoint)\n"
+ " * a line segment and a workplane "
+ "(line's midpoint on plane)\n");
+ return;
+ }
+ AddConstraint(&c);
+ break;
+
+ case GraphicsWindow::MNU_SYMMETRIC:
+ if(gs.points == 2 &&
+ ((gs.workplanes == 1 && gs.n == 3) ||
+ (gs.n == 2)))
+ {
+ if(gs.entities > 0)
+ c.entityA = gs.entity[0];
+ c.ptA = gs.point[0];
+ c.ptB = gs.point[1];
+ } else if(gs.lineSegments == 1 &&
+ ((gs.workplanes == 1 && gs.n == 2) ||
+ (gs.n == 1)))
+ {
+ Entity *line;
+ if(SK.GetEntity(gs.entity[0])->IsWorkplane()) {
+ line = SK.GetEntity(gs.entity[1]);
+ c.entityA = gs.entity[0];
+ } else {
+ line = SK.GetEntity(gs.entity[0]);
+ }
+ c.ptA = line->point[0];
+ c.ptB = line->point[1];
+ } else if(SS.GW.LockedInWorkplane()
+ && gs.lineSegments == 2 && gs.n == 2)
+ {
+ Entity *l0 = SK.GetEntity(gs.entity[0]),
+ *l1 = SK.GetEntity(gs.entity[1]);
+
+ if((l1->group.v != SS.GW.activeGroup.v) ||
+ (l1->construction && !(l0->construction)))
+ {
+ swap(l0, l1);
+ }
+ c.ptA = l1->point[0];
+ c.ptB = l1->point[1];
+ c.entityA = l0->h;
+ c.type = SYMMETRIC_LINE;
+ } else if(SS.GW.LockedInWorkplane()
+ && gs.lineSegments == 1 && gs.points == 2 && gs.n == 3)
+ {
+ c.ptA = gs.point[0];
+ c.ptB = gs.point[1];
+ c.entityA = gs.entity[0];
+ c.type = SYMMETRIC_LINE;
+ } else {
+ Error("Bad selection for symmetric constraint. This constraint "
+ "can apply to:\n\n"
+ " * two points or a line segment "
+ "(symmetric about workplane's coordinate axis)\n"
+ " * line segment, and two points or a line segment "
+ "(symmetric about line segment)\n"
+ " * workplane, and two points or a line segment "
+ "(symmetric about workplane)\n");
+ return;
+ }
+ if(c.type != 0) {
+ // Already done, symmetry about a line segment in a workplane
+ } else if(c.entityA.v == Entity::NO_ENTITY.v) {
+ // Horizontal / vertical symmetry, implicit symmetry plane
+ // normal to the workplane
+ if(c.workplane.v == Entity::FREE_IN_3D.v) {
+ Error("Must be locked in to workplane when constraining "
+ "symmetric without an explicit symmetry plane.");
+ return;
+ }
+ Vector pa = SK.GetEntity(c.ptA)->PointGetNum();
+ Vector pb = SK.GetEntity(c.ptB)->PointGetNum();
+ Vector dp = pa.Minus(pb);
+ EntityBase *norm = SK.GetEntity(c.workplane)->Normal();;
+ Vector u = norm->NormalU(), v = norm->NormalV();
+ if(fabs(dp.Dot(u)) > fabs(dp.Dot(v))) {
+ c.type = SYMMETRIC_HORIZ;
+ } else {
+ c.type = SYMMETRIC_VERT;
+ }
+ if(gs.lineSegments == 1) {
+ // If this line segment is already constrained horiz or
+ // vert, then auto-remove that redundant constraint.
+ DeleteAllConstraintsFor(HORIZONTAL, (gs.entity[0]),
+ Entity::NO_ENTITY);
+ DeleteAllConstraintsFor(VERTICAL, (gs.entity[0]),
+ Entity::NO_ENTITY);
+
+ }
+ } else {
+ // Symmetry with a symmetry plane specified explicitly.
+ c.type = SYMMETRIC;
+ }
+ AddConstraint(&c);
+ break;
+
+ case GraphicsWindow::MNU_VERTICAL:
+ case GraphicsWindow::MNU_HORIZONTAL: {
+ hEntity ha, hb;
+ if(c.workplane.v == Entity::FREE_IN_3D.v) {
+ Error("Select workplane before constraining horiz/vert.");
+ return;
+ }
+ if(gs.lineSegments == 1 && gs.n == 1) {
+ c.entityA = gs.entity[0];
+ Entity *e = SK.GetEntity(c.entityA);
+ ha = e->point[0];
+ hb = e->point[1];
+ } else if(gs.points == 2 && gs.n == 2) {
+ ha = c.ptA = gs.point[0];
+ hb = c.ptB = gs.point[1];
+ } else {
+ Error("Bad selection for horizontal / vertical constraint. "
+ "This constraint can apply to:\n\n"
+ " * two points\n"
+ " * a line segment\n");
+ return;
+ }
+ if(id == GraphicsWindow::MNU_HORIZONTAL) {
+ c.type = HORIZONTAL;
+ } else {
+ c.type = VERTICAL;
+ }
+ AddConstraint(&c);
+ break;
+ }
+
+ case GraphicsWindow::MNU_ORIENTED_SAME: {
+ if(gs.anyNormals == 2 && gs.n == 2) {
+ c.type = SAME_ORIENTATION;
+ c.entityA = gs.anyNormal[0];
+ c.entityB = gs.anyNormal[1];
+ } else {
+ Error("Bad selection for same orientation constraint. This "
+ "constraint can apply to:\n\n"
+ " * two normals\n");
+ return;
+ }
+ SS.UndoRemember();
+
+ Entity *nfree = SK.GetEntity(c.entityA);
+ Entity *nref = SK.GetEntity(c.entityB);
+ if(nref->group.v == SS.GW.activeGroup.v) {
+ swap(nref, nfree);
+ }
+ if(nfree->group.v == SS.GW.activeGroup.v &&
+ nref ->group.v != SS.GW.activeGroup.v)
+ {
+ // nfree is free, and nref is locked (since it came from a
+ // previous group); so let's force nfree aligned to nref,
+ // and make convergence easy
+ Vector ru = nref ->NormalU(), rv = nref ->NormalV();
+ Vector fu = nfree->NormalU(), fv = nfree->NormalV();
+
+ if(fabs(fu.Dot(ru)) < fabs(fu.Dot(rv))) {
+ // There might be an odd*90 degree rotation about the
+ // normal vector; allow that, since the numerical
+ // constraint does
+ swap(ru, rv);
+ }
+ fu = fu.Dot(ru) > 0 ? ru : ru.ScaledBy(-1);
+ fv = fv.Dot(rv) > 0 ? rv : rv.ScaledBy(-1);
+
+ nfree->NormalForceTo(Quaternion::From(fu, fv));
+ }
+ AddConstraint(&c, false);
+ break;
+ }
+
+ case GraphicsWindow::MNU_OTHER_ANGLE:
+ if(gs.constraints == 1 && gs.n == 0) {
+ Constraint *c = SK.GetConstraint(gs.constraint[0]);
+ if(c->type == ANGLE) {
+ SS.UndoRemember();
+ c->other = !(c->other);
+ c->ModifyToSatisfy();
+ break;
+ }
+ if(c->type == EQUAL_ANGLE) {
+ SS.UndoRemember();
+ c->other = !(c->other);
+ SS.MarkGroupDirty(c->group);
+ SS.ScheduleGenerateAll();
+ break;
+ }
+ }
+ Error("Must select an angle constraint.");
+ return;
+
+ case GraphicsWindow::MNU_REFERENCE:
+ if(gs.constraints == 1 && gs.n == 0) {
+ Constraint *c = SK.GetConstraint(gs.constraint[0]);
+ if(c->HasLabel() && c->type != COMMENT) {
+ (c->reference) = !(c->reference);
+ SK.GetGroup(c->group)->clean = false;
+ SS.GenerateAll();
+ break;
+ }
+ }
+ Error("Must select a constraint with associated label.");
+ return;
+
+ case GraphicsWindow::MNU_ANGLE:
+ case GraphicsWindow::MNU_REF_ANGLE: {
+ if(gs.vectors == 2 && gs.n == 2) {
+ c.type = ANGLE;
+ c.entityA = gs.vector[0];
+ c.entityB = gs.vector[1];
+ c.valA = 0;
+ } else {
+ Error("Bad selection for angle constraint. This constraint "
+ "can apply to:\n\n"
+ " * two line segments\n"
+ " * a line segment and a normal\n"
+ " * two normals\n");
+ return;
+ }
+
+ Entity *ea = SK.GetEntity(c.entityA),
+ *eb = SK.GetEntity(c.entityB);
+ if(ea->type == Entity::LINE_SEGMENT &&
+ eb->type == Entity::LINE_SEGMENT)
+ {
+ Vector a0 = SK.GetEntity(ea->point[0])->PointGetNum(),
+ a1 = SK.GetEntity(ea->point[1])->PointGetNum(),
+ b0 = SK.GetEntity(eb->point[0])->PointGetNum(),
+ b1 = SK.GetEntity(eb->point[1])->PointGetNum();
+ if(a0.Equals(b0) || a1.Equals(b1)) {
+ // okay, vectors should be drawn in same sense
+ } else if(a0.Equals(b1) || a1.Equals(b0)) {
+ // vectors are in opposite sense
+ c.other = true;
+ } else {
+ // no shared point; not clear which intersection to draw
+ }
+ }
+
+ if(id == GraphicsWindow::MNU_REF_ANGLE) {
+ c.reference = true;
+ }
+
+ c.ModifyToSatisfy();
+ AddConstraint(&c);
+ break;
+ }
+
+ case GraphicsWindow::MNU_PARALLEL:
+ if(gs.vectors == 2 && gs.n == 2) {
+ c.type = PARALLEL;
+ c.entityA = gs.vector[0];
+ c.entityB = gs.vector[1];
+ } else if(gs.lineSegments == 1 && gs.arcs == 1 && gs.n == 2) {
+ Entity *line = SK.GetEntity(gs.entity[0]);
+ Entity *arc = SK.GetEntity(gs.entity[1]);
+ if(line->type == Entity::ARC_OF_CIRCLE) {
+ swap(line, arc);
+ }
+ Vector l0 = SK.GetEntity(line->point[0])->PointGetNum(),
+ l1 = SK.GetEntity(line->point[1])->PointGetNum();
+ Vector a1 = SK.GetEntity(arc->point[1])->PointGetNum(),
+ a2 = SK.GetEntity(arc->point[2])->PointGetNum();
+
+ if(l0.Equals(a1) || l1.Equals(a1)) {
+ c.other = false;
+ } else if(l0.Equals(a2) || l1.Equals(a2)) {
+ c.other = true;
+ } else {
+ Error("The tangent arc and line segment must share an "
+ "endpoint. Constrain them with Constrain -> "
+ "On Point before constraining tangent.");
+ return;
+ }
+ c.type = ARC_LINE_TANGENT;
+ c.entityA = arc->h;
+ c.entityB = line->h;
+ } else if(gs.lineSegments == 1 && gs.cubics == 1 && gs.n == 2) {
+ Entity *line = SK.GetEntity(gs.entity[0]);
+ Entity *cubic = SK.GetEntity(gs.entity[1]);
+ if(line->type == Entity::CUBIC) {
+ swap(line, cubic);
+ }
+ Vector l0 = SK.GetEntity(line->point[0])->PointGetNum(),
+ l1 = SK.GetEntity(line->point[1])->PointGetNum();
+ Vector as = cubic->CubicGetStartNum(),
+ af = cubic->CubicGetFinishNum();
+
+ if(l0.Equals(as) || l1.Equals(as)) {
+ c.other = false;
+ } else if(l0.Equals(af) || l1.Equals(af)) {
+ c.other = true;
+ } else {
+ Error("The tangent cubic and line segment must share an "
+ "endpoint. Constrain them with Constrain -> "
+ "On Point before constraining tangent.");
+ return;
+ }
+ c.type = CUBIC_LINE_TANGENT;
+ c.entityA = cubic->h;
+ c.entityB = line->h;
+ } else if(gs.cubics + gs.arcs == 2 && gs.n == 2) {
+ if(!SS.GW.LockedInWorkplane()) {
+ Error("Curve-curve tangency must apply in workplane.");
+ return;
+ }
+ Entity *eA = SK.GetEntity(gs.entity[0]),
+ *eB = SK.GetEntity(gs.entity[1]);
+ Vector as = eA->EndpointStart(),
+ af = eA->EndpointFinish(),
+ bs = eB->EndpointStart(),
+ bf = eB->EndpointFinish();
+ if(as.Equals(bs)) {
+ c.other = false; c.other2 = false;
+ } else if(as.Equals(bf)) {
+ c.other = false; c.other2 = true;
+ } else if(af.Equals(bs)) {
+ c.other = true; c.other2 = false;
+ } else if(af.Equals(bf)) {
+ c.other = true; c.other2 = true;
+ } else {
+ Error("The curves must share an endpoint. Constrain them "
+ "with Constrain -> On Point before constraining "
+ "tangent.");
+ return;
+ }
+ c.type = CURVE_CURVE_TANGENT;
+ c.entityA = eA->h;
+ c.entityB = eB->h;
+ } else {
+ Error("Bad selection for parallel / tangent constraint. This "
+ "constraint can apply to:\n\n"
+ " * two line segments (parallel)\n"
+ " * a line segment and a normal (parallel)\n"
+ " * two normals (parallel)\n"
+ " * two line segments, arcs, or beziers, that share "
+ "an endpoint (tangent)\n");
+ return;
+ }
+ AddConstraint(&c);
+ break;
+
+ case GraphicsWindow::MNU_PERPENDICULAR:
+ if(gs.vectors == 2 && gs.n == 2) {
+ c.type = PERPENDICULAR;
+ c.entityA = gs.vector[0];
+ c.entityB = gs.vector[1];
+ } else {
+ Error("Bad selection for perpendicular constraint. This "
+ "constraint can apply to:\n\n"
+ " * two line segments\n"
+ " * a line segment and a normal\n"
+ " * two normals\n");
+ return;
+ }
+ AddConstraint(&c);
+ break;
+
+ case GraphicsWindow::MNU_WHERE_DRAGGED:
+ if(gs.points == 1 && gs.n == 1) {
+ c.type = WHERE_DRAGGED;
+ c.ptA = gs.point[0];
+ } else {
+ Error("Bad selection for lock point where dragged constraint. "
+ "This constraint can apply to:\n\n"
+ " * a point\n");
+ return;
+ }
+ AddConstraint(&c);
+ break;
+
+ case GraphicsWindow::MNU_COMMENT:
+ SS.GW.pending.operation = GraphicsWindow::MNU_COMMENT;
+ SS.GW.pending.description = "click center of comment text";
+ SS.ScheduleShowTW();
+ break;
+
+ default: oops();
+ }
+
+ SS.GW.ClearSelection();
+ InvalidateGraphics();
+}
+
+#endif /* ! LIBRARY */
--- /dev/null
+//-----------------------------------------------------------------------------
+// Given a constraint, generate one or more equations in our symbolic algebra
+// system to represent that constraint; also various geometric helper
+// functions for that.
+//
+// Copyright 2008-2013 Jonathan Westhues.
+//-----------------------------------------------------------------------------
+#include "solvespace.h"
+
+const hConstraint ConstraintBase::NO_CONSTRAINT = { 0 };
+
+bool ConstraintBase::HasLabel(void) {
+ switch(type) {
+ case PT_LINE_DISTANCE:
+ case PT_PLANE_DISTANCE:
+ case PT_FACE_DISTANCE:
+ case PT_PT_DISTANCE:
+ case PROJ_PT_DISTANCE:
+ case DIAMETER:
+ case LENGTH_RATIO:
+ case LENGTH_DIFFERENCE:
+ case ANGLE:
+ case COMMENT:
+ return true;
+
+ default:
+ return false;
+ }
+}
+
+Expr *ConstraintBase::VectorsParallel(int eq, ExprVector a, ExprVector b) {
+ ExprVector r = a.Cross(b);
+ // Hairy ball theorem screws me here. There's no clean solution that I
+ // know, so let's pivot on the initial numerical guess. Our caller
+ // has ensured that if one of our input vectors is already known (e.g.
+ // it's from a previous group), then that one's in a; so that one's
+ // not going to move, and we should pivot on that one.
+ double mx = fabs((a.x)->Eval());
+ double my = fabs((a.y)->Eval());
+ double mz = fabs((a.z)->Eval());
+ // The basis vector in which the vectors have the LEAST energy is the
+ // one that we should look at most (e.g. if both vectors lie in the xy
+ // plane, then the z component of the cross product is most important).
+ // So find the strongest component of a and b, and that's the component
+ // of the cross product to ignore.
+ Expr *e0, *e1;
+ if(mx > my && mx > mz) {
+ e0 = r.y; e1 = r.z;
+ } else if(my > mz) {
+ e0 = r.z; e1 = r.x;
+ } else {
+ e0 = r.x; e1 = r.y;
+ }
+
+ if(eq == 0) return e0;
+ if(eq == 1) return e1;
+ oops();
+}
+
+Expr *ConstraintBase::PointLineDistance(hEntity wrkpl, hEntity hpt, hEntity hln)
+{
+ EntityBase *ln = SK.GetEntity(hln);
+ EntityBase *a = SK.GetEntity(ln->point[0]);
+ EntityBase *b = SK.GetEntity(ln->point[1]);
+
+ EntityBase *p = SK.GetEntity(hpt);
+
+ if(wrkpl.v == EntityBase::FREE_IN_3D.v) {
+ ExprVector ep = p->PointGetExprs();
+
+ ExprVector ea = a->PointGetExprs();
+ ExprVector eb = b->PointGetExprs();
+ ExprVector eab = ea.Minus(eb);
+ Expr *m = eab.Magnitude();
+
+ return ((eab.Cross(ea.Minus(ep))).Magnitude())->Div(m);
+ } else {
+ Expr *ua, *va, *ub, *vb;
+ a->PointGetExprsInWorkplane(wrkpl, &ua, &va);
+ b->PointGetExprsInWorkplane(wrkpl, &ub, &vb);
+
+ Expr *du = ua->Minus(ub);
+ Expr *dv = va->Minus(vb);
+
+ Expr *u, *v;
+ p->PointGetExprsInWorkplane(wrkpl, &u, &v);
+
+ Expr *m = ((du->Square())->Plus(dv->Square()))->Sqrt();
+
+ Expr *proj = (dv->Times(ua->Minus(u)))->Minus(
+ (du->Times(va->Minus(v))));
+
+ return proj->Div(m);
+ }
+}
+
+Expr *ConstraintBase::PointPlaneDistance(ExprVector p, hEntity hpl) {
+ ExprVector n;
+ Expr *d;
+ SK.GetEntity(hpl)->WorkplaneGetPlaneExprs(&n, &d);
+ return (p.Dot(n))->Minus(d);
+}
+
+Expr *ConstraintBase::Distance(hEntity wrkpl, hEntity hpa, hEntity hpb) {
+ EntityBase *pa = SK.GetEntity(hpa);
+ EntityBase *pb = SK.GetEntity(hpb);
+ if(!(pa->IsPoint() && pb->IsPoint())) oops();
+
+ if(wrkpl.v == EntityBase::FREE_IN_3D.v) {
+ // This is true distance
+ ExprVector ea, eb, eab;
+ ea = pa->PointGetExprs();
+ eb = pb->PointGetExprs();
+ eab = ea.Minus(eb);
+
+ return eab.Magnitude();
+ } else {
+ // This is projected distance, in the given workplane.
+ Expr *au, *av, *bu, *bv;
+
+ pa->PointGetExprsInWorkplane(wrkpl, &au, &av);
+ pb->PointGetExprsInWorkplane(wrkpl, &bu, &bv);
+
+ Expr *du = au->Minus(bu);
+ Expr *dv = av->Minus(bv);
+
+ return ((du->Square())->Plus(dv->Square()))->Sqrt();
+ }
+}
+
+//-----------------------------------------------------------------------------
+// Return the cosine of the angle between two vectors. If a workplane is
+// specified, then it's the cosine of their projections into that workplane.
+//-----------------------------------------------------------------------------
+Expr *ConstraintBase::DirectionCosine(hEntity wrkpl,
+ ExprVector ae, ExprVector be)
+{
+ if(wrkpl.v == EntityBase::FREE_IN_3D.v) {
+ Expr *mags = (ae.Magnitude())->Times(be.Magnitude());
+ return (ae.Dot(be))->Div(mags);
+ } else {
+ EntityBase *w = SK.GetEntity(wrkpl);
+ ExprVector u = w->Normal()->NormalExprsU();
+ ExprVector v = w->Normal()->NormalExprsV();
+ Expr *ua = u.Dot(ae);
+ Expr *va = v.Dot(ae);
+ Expr *ub = u.Dot(be);
+ Expr *vb = v.Dot(be);
+ Expr *maga = (ua->Square()->Plus(va->Square()))->Sqrt();
+ Expr *magb = (ub->Square()->Plus(vb->Square()))->Sqrt();
+ Expr *dot = (ua->Times(ub))->Plus(va->Times(vb));
+ return dot->Div(maga->Times(magb));
+ }
+}
+
+ExprVector ConstraintBase::PointInThreeSpace(hEntity workplane,
+ Expr *u, Expr *v)
+{
+ EntityBase *w = SK.GetEntity(workplane);
+
+ ExprVector ub = w->Normal()->NormalExprsU();
+ ExprVector vb = w->Normal()->NormalExprsV();
+ ExprVector ob = w->WorkplaneGetOffsetExprs();
+
+ return (ub.ScaledBy(u)).Plus(vb.ScaledBy(v)).Plus(ob);
+}
+
+void ConstraintBase::ModifyToSatisfy(void) {
+ if(type == ANGLE) {
+ Vector a = SK.GetEntity(entityA)->VectorGetNum();
+ Vector b = SK.GetEntity(entityB)->VectorGetNum();
+ if(other) a = a.ScaledBy(-1);
+ if(workplane.v != EntityBase::FREE_IN_3D.v) {
+ a = a.ProjectVectorInto(workplane);
+ b = b.ProjectVectorInto(workplane);
+ }
+ double c = (a.Dot(b))/(a.Magnitude() * b.Magnitude());
+ valA = acos(c)*180/PI;
+ } else {
+ // We'll fix these ones up by looking at their symbolic equation;
+ // that means no extra work.
+ IdList<Equation,hEquation> l = {};
+ // Generate the equations even if this is a reference dimension
+ GenerateReal(&l);
+ if(l.n != 1) oops();
+
+ // These equations are written in the form f(...) - d = 0, where
+ // d is the value of the valA.
+ valA += (l.elem[0].e)->Eval();
+
+ l.Clear();
+ }
+}
+
+void ConstraintBase::AddEq(IdList<Equation,hEquation> *l, Expr *expr, int index)
+{
+ Equation eq;
+ eq.e = expr;
+ eq.h = h.equation(index);
+ l->Add(&eq);
+}
+
+void ConstraintBase::Generate(IdList<Equation,hEquation> *l) {
+ if(!reference) {
+ GenerateReal(l);
+ }
+}
+void ConstraintBase::GenerateReal(IdList<Equation,hEquation> *l) {
+ Expr *exA = Expr::From(valA);
+
+ switch(type) {
+ case PT_PT_DISTANCE:
+ AddEq(l, Distance(workplane, ptA, ptB)->Minus(exA), 0);
+ break;
+
+ case PROJ_PT_DISTANCE: {
+ ExprVector pA = SK.GetEntity(ptA)->PointGetExprs(),
+ pB = SK.GetEntity(ptB)->PointGetExprs(),
+ dp = pB.Minus(pA);
+
+ ExprVector pp = SK.GetEntity(entityA)->VectorGetExprs();
+ pp = pp.WithMagnitude(Expr::From(1.0));
+
+ AddEq(l, (dp.Dot(pp))->Minus(exA), 0);
+ break;
+ }
+
+ case PT_LINE_DISTANCE:
+ AddEq(l,
+ PointLineDistance(workplane, ptA, entityA)->Minus(exA), 0);
+ break;
+
+ case PT_PLANE_DISTANCE: {
+ ExprVector pt = SK.GetEntity(ptA)->PointGetExprs();
+ AddEq(l, (PointPlaneDistance(pt, entityA))->Minus(exA), 0);
+ break;
+ }
+
+ case PT_FACE_DISTANCE: {
+ ExprVector pt = SK.GetEntity(ptA)->PointGetExprs();
+ EntityBase *f = SK.GetEntity(entityA);
+ ExprVector p0 = f->FaceGetPointExprs();
+ ExprVector n = f->FaceGetNormalExprs();
+ AddEq(l, (pt.Minus(p0)).Dot(n)->Minus(exA), 0);
+ break;
+ }
+
+ case EQUAL_LENGTH_LINES: {
+ EntityBase *a = SK.GetEntity(entityA);
+ EntityBase *b = SK.GetEntity(entityB);
+ AddEq(l, Distance(workplane, a->point[0], a->point[1])->Minus(
+ Distance(workplane, b->point[0], b->point[1])), 0);
+ break;
+ }
+
+ // These work on distance squared, since the pt-line distances are
+ // signed, and we want the absolute value.
+ case EQ_LEN_PT_LINE_D: {
+ EntityBase *forLen = SK.GetEntity(entityA);
+ Expr *d1 = Distance(workplane, forLen->point[0], forLen->point[1]);
+ Expr *d2 = PointLineDistance(workplane, ptA, entityB);
+ AddEq(l, (d1->Square())->Minus(d2->Square()), 0);
+ break;
+ }
+ case EQ_PT_LN_DISTANCES: {
+ Expr *d1 = PointLineDistance(workplane, ptA, entityA);
+ Expr *d2 = PointLineDistance(workplane, ptB, entityB);
+ AddEq(l, (d1->Square())->Minus(d2->Square()), 0);
+ break;
+ }
+
+ case LENGTH_RATIO: {
+ EntityBase *a = SK.GetEntity(entityA);
+ EntityBase *b = SK.GetEntity(entityB);
+ Expr *la = Distance(workplane, a->point[0], a->point[1]);
+ Expr *lb = Distance(workplane, b->point[0], b->point[1]);
+ AddEq(l, (la->Div(lb))->Minus(exA), 0);
+ break;
+ }
+
+ case LENGTH_DIFFERENCE: {
+ EntityBase *a = SK.GetEntity(entityA);
+ EntityBase *b = SK.GetEntity(entityB);
+ Expr *la = Distance(workplane, a->point[0], a->point[1]);
+ Expr *lb = Distance(workplane, b->point[0], b->point[1]);
+ AddEq(l, (la->Minus(lb))->Minus(exA), 0);
+ break;
+ }
+
+ case DIAMETER: {
+ EntityBase *circle = SK.GetEntity(entityA);
+ Expr *r = circle->CircleGetRadiusExpr();
+ AddEq(l, (r->Times(Expr::From(2)))->Minus(exA), 0);
+ break;
+ }
+
+ case EQUAL_RADIUS: {
+ EntityBase *c1 = SK.GetEntity(entityA);
+ EntityBase *c2 = SK.GetEntity(entityB);
+ AddEq(l, (c1->CircleGetRadiusExpr())->Minus(
+ c2->CircleGetRadiusExpr()), 0);
+ break;
+ }
+
+ case EQUAL_LINE_ARC_LEN: {
+ EntityBase *line = SK.GetEntity(entityA),
+ *arc = SK.GetEntity(entityB);
+
+ // Get the line length
+ ExprVector l0 = SK.GetEntity(line->point[0])->PointGetExprs(),
+ l1 = SK.GetEntity(line->point[1])->PointGetExprs();
+ Expr *ll = (l1.Minus(l0)).Magnitude();
+
+ // And get the arc radius, and the cosine of its angle
+ EntityBase *ao = SK.GetEntity(arc->point[0]),
+ *as = SK.GetEntity(arc->point[1]),
+ *af = SK.GetEntity(arc->point[2]);
+
+ ExprVector aos = (as->PointGetExprs()).Minus(ao->PointGetExprs()),
+ aof = (af->PointGetExprs()).Minus(ao->PointGetExprs());
+ Expr *r = aof.Magnitude();
+
+ ExprVector n = arc->Normal()->NormalExprsN();
+ ExprVector u = aos.WithMagnitude(Expr::From(1.0));
+ ExprVector v = n.Cross(u);
+ // so in our new csys, we start at (1, 0, 0)
+ Expr *costheta = aof.Dot(u)->Div(r);
+ Expr *sintheta = aof.Dot(v)->Div(r);
+
+ double thetas, thetaf, dtheta;
+ arc->ArcGetAngles(&thetas, &thetaf, &dtheta);
+ Expr *theta;
+ if(dtheta < 3*PI/4) {
+ theta = costheta->ACos();
+ } else if(dtheta < 5*PI/4) {
+ // As the angle crosses pi, cos theta is not invertible;
+ // so use the sine to stop blowing up
+ theta = Expr::From(PI)->Minus(sintheta->ASin());
+ } else {
+ theta = (Expr::From(2*PI))->Minus(costheta->ACos());
+ }
+
+ // And write the equation; r*theta = L
+ AddEq(l, (r->Times(theta))->Minus(ll), 0);
+ break;
+ }
+
+ case POINTS_COINCIDENT: {
+ EntityBase *a = SK.GetEntity(ptA);
+ EntityBase *b = SK.GetEntity(ptB);
+ if(workplane.v == EntityBase::FREE_IN_3D.v) {
+ ExprVector pa = a->PointGetExprs();
+ ExprVector pb = b->PointGetExprs();
+ AddEq(l, pa.x->Minus(pb.x), 0);
+ AddEq(l, pa.y->Minus(pb.y), 1);
+ AddEq(l, pa.z->Minus(pb.z), 2);
+ } else {
+ Expr *au, *av;
+ Expr *bu, *bv;
+ a->PointGetExprsInWorkplane(workplane, &au, &av);
+ b->PointGetExprsInWorkplane(workplane, &bu, &bv);
+ AddEq(l, au->Minus(bu), 0);
+ AddEq(l, av->Minus(bv), 1);
+ }
+ break;
+ }
+
+ case PT_IN_PLANE:
+ // This one works the same, whether projected or not.
+ AddEq(l, PointPlaneDistance(
+ SK.GetEntity(ptA)->PointGetExprs(), entityA), 0);
+ break;
+
+ case PT_ON_FACE: {
+ // a plane, n dot (p - p0) = 0
+ ExprVector p = SK.GetEntity(ptA)->PointGetExprs();
+ EntityBase *f = SK.GetEntity(entityA);
+ ExprVector p0 = f->FaceGetPointExprs();
+ ExprVector n = f->FaceGetNormalExprs();
+ AddEq(l, (p.Minus(p0)).Dot(n), 0);
+ break;
+ }
+
+ case PT_ON_LINE:
+ if(workplane.v == EntityBase::FREE_IN_3D.v) {
+ EntityBase *ln = SK.GetEntity(entityA);
+ EntityBase *a = SK.GetEntity(ln->point[0]);
+ EntityBase *b = SK.GetEntity(ln->point[1]);
+ EntityBase *p = SK.GetEntity(ptA);
+
+ ExprVector ep = p->PointGetExprs();
+ ExprVector ea = a->PointGetExprs();
+ ExprVector eb = b->PointGetExprs();
+ ExprVector eab = ea.Minus(eb);
+
+ // Construct a vector from the point to either endpoint of
+ // the line segment, and choose the longer of these.
+ ExprVector eap = ea.Minus(ep);
+ ExprVector ebp = eb.Minus(ep);
+ ExprVector elp =
+ (ebp.Magnitude()->Eval() > eap.Magnitude()->Eval()) ?
+ ebp : eap;
+
+ if(p->group.v == group.v) {
+ AddEq(l, VectorsParallel(0, eab, elp), 0);
+ AddEq(l, VectorsParallel(1, eab, elp), 1);
+ } else {
+ AddEq(l, VectorsParallel(0, elp, eab), 0);
+ AddEq(l, VectorsParallel(1, elp, eab), 1);
+ }
+ } else {
+ AddEq(l, PointLineDistance(workplane, ptA, entityA), 0);
+ }
+ break;
+
+ case PT_ON_CIRCLE: {
+ // This actually constrains the point to lie on the cylinder.
+ EntityBase *circle = SK.GetEntity(entityA);
+ ExprVector center = SK.GetEntity(circle->point[0])->PointGetExprs();
+ ExprVector pt = SK.GetEntity(ptA)->PointGetExprs();
+ EntityBase *normal = SK.GetEntity(circle->normal);
+ ExprVector u = normal->NormalExprsU(),
+ v = normal->NormalExprsV();
+
+ Expr *du = (center.Minus(pt)).Dot(u),
+ *dv = (center.Minus(pt)).Dot(v);
+
+ Expr *r = circle->CircleGetRadiusExpr();
+
+ AddEq(l,
+ ((du->Square())->Plus(dv->Square()))->Minus(r->Square()), 0);
+ break;
+ }
+
+ case AT_MIDPOINT:
+ if(workplane.v == EntityBase::FREE_IN_3D.v) {
+ EntityBase *ln = SK.GetEntity(entityA);
+ ExprVector a = SK.GetEntity(ln->point[0])->PointGetExprs();
+ ExprVector b = SK.GetEntity(ln->point[1])->PointGetExprs();
+ ExprVector m = (a.Plus(b)).ScaledBy(Expr::From(0.5));
+
+ if(ptA.v) {
+ ExprVector p = SK.GetEntity(ptA)->PointGetExprs();
+ AddEq(l, (m.x)->Minus(p.x), 0);
+ AddEq(l, (m.y)->Minus(p.y), 1);
+ AddEq(l, (m.z)->Minus(p.z), 2);
+ } else {
+ AddEq(l, PointPlaneDistance(m, entityB), 0);
+ }
+ } else {
+ EntityBase *ln = SK.GetEntity(entityA);
+ EntityBase *a = SK.GetEntity(ln->point[0]);
+ EntityBase *b = SK.GetEntity(ln->point[1]);
+
+ Expr *au, *av, *bu, *bv;
+ a->PointGetExprsInWorkplane(workplane, &au, &av);
+ b->PointGetExprsInWorkplane(workplane, &bu, &bv);
+ Expr *mu = Expr::From(0.5)->Times(au->Plus(bu));
+ Expr *mv = Expr::From(0.5)->Times(av->Plus(bv));
+
+ if(ptA.v) {
+ EntityBase *p = SK.GetEntity(ptA);
+ Expr *pu, *pv;
+ p->PointGetExprsInWorkplane(workplane, &pu, &pv);
+ AddEq(l, pu->Minus(mu), 0);
+ AddEq(l, pv->Minus(mv), 1);
+ } else {
+ ExprVector m = PointInThreeSpace(workplane, mu, mv);
+ AddEq(l, PointPlaneDistance(m, entityB), 0);
+ }
+ }
+ break;
+
+ case SYMMETRIC:
+ if(workplane.v == EntityBase::FREE_IN_3D.v) {
+ EntityBase *plane = SK.GetEntity(entityA);
+ EntityBase *ea = SK.GetEntity(ptA);
+ EntityBase *eb = SK.GetEntity(ptB);
+ ExprVector a = ea->PointGetExprs();
+ ExprVector b = eb->PointGetExprs();
+
+ // The midpoint of the line connecting the symmetric points
+ // lies on the plane of the symmetry.
+ ExprVector m = (a.Plus(b)).ScaledBy(Expr::From(0.5));
+ AddEq(l, PointPlaneDistance(m, plane->h), 0);
+
+ // And projected into the plane of symmetry, the points are
+ // coincident.
+ Expr *au, *av, *bu, *bv;
+ ea->PointGetExprsInWorkplane(plane->h, &au, &av);
+ eb->PointGetExprsInWorkplane(plane->h, &bu, &bv);
+ AddEq(l, au->Minus(bu), 1);
+ AddEq(l, av->Minus(bv), 2);
+ } else {
+ EntityBase *plane = SK.GetEntity(entityA);
+ EntityBase *a = SK.GetEntity(ptA);
+ EntityBase *b = SK.GetEntity(ptB);
+
+ Expr *au, *av, *bu, *bv;
+ a->PointGetExprsInWorkplane(workplane, &au, &av);
+ b->PointGetExprsInWorkplane(workplane, &bu, &bv);
+ Expr *mu = Expr::From(0.5)->Times(au->Plus(bu));
+ Expr *mv = Expr::From(0.5)->Times(av->Plus(bv));
+
+ ExprVector m = PointInThreeSpace(workplane, mu, mv);
+ AddEq(l, PointPlaneDistance(m, plane->h), 0);
+
+ // Construct a vector within the workplane that is normal
+ // to the symmetry pane's normal (i.e., that lies in the
+ // plane of symmetry). The line connecting the points is
+ // perpendicular to that constructed vector.
+ EntityBase *w = SK.GetEntity(workplane);
+ ExprVector u = w->Normal()->NormalExprsU();
+ ExprVector v = w->Normal()->NormalExprsV();
+
+ ExprVector pa = a->PointGetExprs();
+ ExprVector pb = b->PointGetExprs();
+ ExprVector n;
+ Expr *d;
+ plane->WorkplaneGetPlaneExprs(&n, &d);
+ AddEq(l, (n.Cross(u.Cross(v))).Dot(pa.Minus(pb)), 1);
+ }
+ break;
+
+ case SYMMETRIC_HORIZ:
+ case SYMMETRIC_VERT: {
+ EntityBase *a = SK.GetEntity(ptA);
+ EntityBase *b = SK.GetEntity(ptB);
+
+ Expr *au, *av, *bu, *bv;
+ a->PointGetExprsInWorkplane(workplane, &au, &av);
+ b->PointGetExprsInWorkplane(workplane, &bu, &bv);
+
+ if(type == SYMMETRIC_HORIZ) {
+ AddEq(l, av->Minus(bv), 0);
+ AddEq(l, au->Plus(bu), 1);
+ } else {
+ AddEq(l, au->Minus(bu), 0);
+ AddEq(l, av->Plus(bv), 1);
+ }
+ break;
+ }
+
+ case SYMMETRIC_LINE: {
+ EntityBase *pa = SK.GetEntity(ptA);
+ EntityBase *pb = SK.GetEntity(ptB);
+
+ Expr *pau, *pav, *pbu, *pbv;
+ pa->PointGetExprsInWorkplane(workplane, &pau, &pav);
+ pb->PointGetExprsInWorkplane(workplane, &pbu, &pbv);
+
+ EntityBase *ln = SK.GetEntity(entityA);
+ EntityBase *la = SK.GetEntity(ln->point[0]);
+ EntityBase *lb = SK.GetEntity(ln->point[1]);
+ Expr *lau, *lav, *lbu, *lbv;
+ la->PointGetExprsInWorkplane(workplane, &lau, &lav);
+ lb->PointGetExprsInWorkplane(workplane, &lbu, &lbv);
+
+ Expr *dpu = pbu->Minus(pau), *dpv = pbv->Minus(pav);
+ Expr *dlu = lbu->Minus(lau), *dlv = lbv->Minus(lav);
+
+ // The line through the points is perpendicular to the line
+ // of symmetry.
+ AddEq(l, (dlu->Times(dpu))->Plus(dlv->Times(dpv)), 0);
+
+ // And the signed distances of the points to the line are
+ // equal in magnitude and opposite in sign, so sum to zero
+ Expr *dista = (dlv->Times(lau->Minus(pau)))->Minus(
+ (dlu->Times(lav->Minus(pav))));
+ Expr *distb = (dlv->Times(lau->Minus(pbu)))->Minus(
+ (dlu->Times(lav->Minus(pbv))));
+ AddEq(l, dista->Plus(distb), 1);
+
+ break;
+ }
+
+ case HORIZONTAL:
+ case VERTICAL: {
+ hEntity ha, hb;
+ if(entityA.v) {
+ EntityBase *e = SK.GetEntity(entityA);
+ ha = e->point[0];
+ hb = e->point[1];
+ } else {
+ ha = ptA;
+ hb = ptB;
+ }
+ EntityBase *a = SK.GetEntity(ha);
+ EntityBase *b = SK.GetEntity(hb);
+
+ Expr *au, *av, *bu, *bv;
+ a->PointGetExprsInWorkplane(workplane, &au, &av);
+ b->PointGetExprsInWorkplane(workplane, &bu, &bv);
+
+ AddEq(l, (type == HORIZONTAL) ? av->Minus(bv) : au->Minus(bu), 0);
+ break;
+ }
+
+ case SAME_ORIENTATION: {
+ EntityBase *a = SK.GetEntity(entityA);
+ EntityBase *b = SK.GetEntity(entityB);
+ if(b->group.v != group.v) {
+ swap(a, b);
+ }
+
+ ExprVector au = a->NormalExprsU(),
+ an = a->NormalExprsN();
+ ExprVector bu = b->NormalExprsU(),
+ bv = b->NormalExprsV(),
+ bn = b->NormalExprsN();
+
+ AddEq(l, VectorsParallel(0, an, bn), 0);
+ AddEq(l, VectorsParallel(1, an, bn), 1);
+ Expr *d1 = au.Dot(bv);
+ Expr *d2 = au.Dot(bu);
+ // Allow either orientation for the coordinate system, depending
+ // on how it was drawn.
+ if(fabs(d1->Eval()) < fabs(d2->Eval())) {
+ AddEq(l, d1, 2);
+ } else {
+ AddEq(l, d2, 2);
+ }
+ break;
+ }
+
+ case PERPENDICULAR:
+ case ANGLE: {
+ EntityBase *a = SK.GetEntity(entityA);
+ EntityBase *b = SK.GetEntity(entityB);
+ ExprVector ae = a->VectorGetExprs();
+ ExprVector be = b->VectorGetExprs();
+ if(other) ae = ae.ScaledBy(Expr::From(-1));
+ Expr *c = DirectionCosine(workplane, ae, be);
+
+ if(type == ANGLE) {
+ // The direction cosine is equal to the cosine of the
+ // specified angle
+ Expr *rads = exA->Times(Expr::From(PI/180)),
+ *rc = rads->Cos();
+ double arc = fabs(rc->Eval());
+ // avoid false detection of inconsistent systems by gaining
+ // up as the difference in dot products gets small at small
+ // angles; doubles still have plenty of precision, only
+ // problem is that rank test
+ Expr *mult = Expr::From(arc > 0.99 ? 0.01/(1.00001 - arc) : 1);
+ AddEq(l, (c->Minus(rc))->Times(mult), 0);
+ } else {
+ // The dot product (and therefore the direction cosine)
+ // is equal to zero, perpendicular.
+ AddEq(l, c, 0);
+ }
+ break;
+ }
+
+ case EQUAL_ANGLE: {
+ EntityBase *a = SK.GetEntity(entityA);
+ EntityBase *b = SK.GetEntity(entityB);
+ EntityBase *c = SK.GetEntity(entityC);
+ EntityBase *d = SK.GetEntity(entityD);
+ ExprVector ae = a->VectorGetExprs();
+ ExprVector be = b->VectorGetExprs();
+ ExprVector ce = c->VectorGetExprs();
+ ExprVector de = d->VectorGetExprs();
+
+ if(other) ae = ae.ScaledBy(Expr::From(-1));
+
+ Expr *cab = DirectionCosine(workplane, ae, be);
+ Expr *ccd = DirectionCosine(workplane, ce, de);
+
+ AddEq(l, cab->Minus(ccd), 0);
+ break;
+ }
+
+ case ARC_LINE_TANGENT: {
+ EntityBase *arc = SK.GetEntity(entityA);
+ EntityBase *line = SK.GetEntity(entityB);
+
+ ExprVector ac = SK.GetEntity(arc->point[0])->PointGetExprs();
+ ExprVector ap =
+ SK.GetEntity(arc->point[other ? 2 : 1])->PointGetExprs();
+
+ ExprVector ld = line->VectorGetExprs();
+
+ // The line is perpendicular to the radius
+ AddEq(l, ld.Dot(ac.Minus(ap)), 0);
+ break;
+ }
+
+ case CUBIC_LINE_TANGENT: {
+ EntityBase *cubic = SK.GetEntity(entityA);
+ EntityBase *line = SK.GetEntity(entityB);
+
+ ExprVector a;
+ if(other) {
+ a = cubic->CubicGetFinishTangentExprs();
+ } else {
+ a = cubic->CubicGetStartTangentExprs();
+ }
+
+ ExprVector b = line->VectorGetExprs();
+
+ if(workplane.v == EntityBase::FREE_IN_3D.v) {
+ AddEq(l, VectorsParallel(0, a, b), 0);
+ AddEq(l, VectorsParallel(1, a, b), 1);
+ } else {
+ EntityBase *w = SK.GetEntity(workplane);
+ ExprVector wn = w->Normal()->NormalExprsN();
+ AddEq(l, (a.Cross(b)).Dot(wn), 0);
+ }
+ break;
+ }
+
+ case CURVE_CURVE_TANGENT: {
+ bool parallel = true;
+ int i;
+ ExprVector dir[2];
+ for(i = 0; i < 2; i++) {
+ EntityBase *e = SK.GetEntity((i == 0) ? entityA : entityB);
+ bool oth = (i == 0) ? other : other2;
+
+ if(e->type == Entity::ARC_OF_CIRCLE) {
+ ExprVector center, endpoint;
+ center = SK.GetEntity(e->point[0])->PointGetExprs();
+ endpoint =
+ SK.GetEntity(e->point[oth ? 2 : 1])->PointGetExprs();
+ dir[i] = endpoint.Minus(center);
+ // We're using the vector from the center of the arc to
+ // an endpoint; so that's normal to the tangent, not
+ // parallel.
+ parallel = !parallel;
+ } else if(e->type == Entity::CUBIC) {
+ if(oth) {
+ dir[i] = e->CubicGetFinishTangentExprs();
+ } else {
+ dir[i] = e->CubicGetStartTangentExprs();
+ }
+ } else {
+ oops();
+ }
+ }
+ if(parallel) {
+ EntityBase *w = SK.GetEntity(workplane);
+ ExprVector wn = w->Normal()->NormalExprsN();
+ AddEq(l, ((dir[0]).Cross(dir[1])).Dot(wn), 0);
+ } else {
+ AddEq(l, (dir[0]).Dot(dir[1]), 0);
+ }
+ break;
+ }
+
+ case PARALLEL: {
+ EntityBase *ea = SK.GetEntity(entityA), *eb = SK.GetEntity(entityB);
+ if(eb->group.v != group.v) {
+ swap(ea, eb);
+ }
+ ExprVector a = ea->VectorGetExprs();
+ ExprVector b = eb->VectorGetExprs();
+
+ if(workplane.v == EntityBase::FREE_IN_3D.v) {
+ AddEq(l, VectorsParallel(0, a, b), 0);
+ AddEq(l, VectorsParallel(1, a, b), 1);
+ } else {
+ EntityBase *w = SK.GetEntity(workplane);
+ ExprVector wn = w->Normal()->NormalExprsN();
+ AddEq(l, (a.Cross(b)).Dot(wn), 0);
+ }
+ break;
+ }
+
+ case WHERE_DRAGGED: {
+ EntityBase *ep = SK.GetEntity(ptA);
+ if(workplane.v == EntityBase::FREE_IN_3D.v) {
+ ExprVector ev = ep->PointGetExprs();
+ Vector v = ep->PointGetNum();
+
+ AddEq(l, ev.x->Minus(Expr::From(v.x)), 0);
+ AddEq(l, ev.y->Minus(Expr::From(v.y)), 1);
+ AddEq(l, ev.z->Minus(Expr::From(v.z)), 2);
+ } else {
+ Expr *u, *v;
+ ep->PointGetExprsInWorkplane(workplane, &u, &v);
+ AddEq(l, u->Minus(Expr::From(u->Eval())), 0);
+ AddEq(l, v->Minus(Expr::From(v->Eval())), 1);
+ }
+ break;
+ }
+
+ case COMMENT:
+ break;
+
+ default: oops();
+ }
+}
+
--- /dev/null
+//-----------------------------------------------------------------------------
+// The screens when an entity is selected, that show some description of it--
+// endpoints of the lines, diameter of the circle, etc.
+//
+// Copyright 2008-2013 Jonathan Westhues.
+//-----------------------------------------------------------------------------
+#include "solvespace.h"
+
+void TextWindow::ScreenUnselectAll(int link, uint32_t v) {
+ GraphicsWindow::MenuEdit(GraphicsWindow::MNU_UNSELECT_ALL);
+}
+
+void TextWindow::ScreenEditTtfText(int link, uint32_t v) {
+ hRequest hr = { v };
+ Request *r = SK.GetRequest(hr);
+
+ SS.TW.ShowEditControl(10, r->str);
+ SS.TW.edit.meaning = EDIT_TTF_TEXT;
+ SS.TW.edit.request = hr;
+}
+
+#define gs (SS.GW.gs)
+void TextWindow::ScreenSetTtfFont(int link, uint32_t v) {
+ int i = (int)v;
+ if(i < 0) return;
+ if(i >= SS.fonts.l.n) return;
+
+ SS.GW.GroupSelection();
+ if(gs.entities != 1 || gs.n != 1) return;
+
+ Entity *e = SK.entity.FindByIdNoOops(gs.entity[0]);
+ if(!e || e->type != Entity::TTF_TEXT || !e->h.isFromRequest()) return;
+
+ Request *r = SK.request.FindByIdNoOops(e->h.request());
+ if(!r) return;
+
+ SS.UndoRemember();
+ r->font = SS.fonts.l.elem[i].FontFileBaseName();
+ SS.MarkGroupDirty(r->group);
+ SS.ScheduleGenerateAll();
+ SS.ScheduleShowTW();
+}
+
+void TextWindow::ScreenConstraintShowAsRadius(int link, uint32_t v) {
+ hConstraint hc = { v };
+ Constraint *c = SK.GetConstraint(hc);
+
+ SS.UndoRemember();
+ c->other = !c->other;
+
+ SS.ScheduleShowTW();
+}
+
+void TextWindow::DescribeSelection(void) {
+ Entity *e;
+ Vector p;
+ int i;
+ Printf(false, "");
+
+ if(gs.n == 1 && (gs.points == 1 || gs.entities == 1)) {
+ e = SK.GetEntity(gs.points == 1 ? gs.point[0] : gs.entity[0]);
+
+#define COSTR(p) \
+ SS.MmToString((p).x).c_str(), \
+ SS.MmToString((p).y).c_str(), \
+ SS.MmToString((p).z).c_str()
+#define PT_AS_STR "(%Fi%s%E, %Fi%s%E, %Fi%s%E)"
+#define PT_AS_NUM "(%Fi%3%E, %Fi%3%E, %Fi%3%E)"
+ switch(e->type) {
+ case Entity::POINT_IN_3D:
+ case Entity::POINT_IN_2D:
+ case Entity::POINT_N_TRANS:
+ case Entity::POINT_N_ROT_TRANS:
+ case Entity::POINT_N_COPY:
+ case Entity::POINT_N_ROT_AA:
+ p = e->PointGetNum();
+ Printf(false, "%FtPOINT%E at " PT_AS_STR, COSTR(p));
+ break;
+
+ case Entity::NORMAL_IN_3D:
+ case Entity::NORMAL_IN_2D:
+ case Entity::NORMAL_N_COPY:
+ case Entity::NORMAL_N_ROT:
+ case Entity::NORMAL_N_ROT_AA: {
+ Quaternion q = e->NormalGetNum();
+ p = q.RotationN();
+ Printf(false, "%FtNORMAL / COORDINATE SYSTEM%E");
+ Printf(true, " basis n = " PT_AS_NUM, CO(p));
+ p = q.RotationU();
+ Printf(false, " u = " PT_AS_NUM, CO(p));
+ p = q.RotationV();
+ Printf(false, " v = " PT_AS_NUM, CO(p));
+ break;
+ }
+ case Entity::WORKPLANE: {
+ p = SK.GetEntity(e->point[0])->PointGetNum();
+ Printf(false, "%FtWORKPLANE%E");
+ Printf(true, " origin = " PT_AS_STR, COSTR(p));
+ Quaternion q = e->Normal()->NormalGetNum();
+ p = q.RotationN();
+ Printf(true, " normal = " PT_AS_NUM, CO(p));
+ break;
+ }
+ case Entity::LINE_SEGMENT: {
+ Vector p0 = SK.GetEntity(e->point[0])->PointGetNum();
+ p = p0;
+ Printf(false, "%FtLINE SEGMENT%E");
+ Printf(true, " thru " PT_AS_STR, COSTR(p));
+ Vector p1 = SK.GetEntity(e->point[1])->PointGetNum();
+ p = p1;
+ Printf(false, " " PT_AS_STR, COSTR(p));
+ Printf(true, " len = %Fi%s%E",
+ SS.MmToString((p1.Minus(p0).Magnitude())).c_str());
+ break;
+ }
+ case Entity::CUBIC_PERIODIC:
+ case Entity::CUBIC:
+ int pts;
+ if(e->type == Entity::CUBIC_PERIODIC) {
+ Printf(false, "%FtPERIODIC C2 CUBIC SPLINE%E");
+ pts = (3 + e->extraPoints);
+ } else if(e->extraPoints > 0) {
+ Printf(false, "%FtINTERPOLATING C2 CUBIC SPLINE%E");
+ pts = (4 + e->extraPoints);
+ } else {
+ Printf(false, "%FtCUBIC BEZIER CURVE%E");
+ pts = 4;
+ }
+ for(i = 0; i < pts; i++) {
+ p = SK.GetEntity(e->point[i])->PointGetNum();
+ Printf((i==0), " p%d = " PT_AS_STR, i, COSTR(p));
+ }
+ break;
+
+ case Entity::ARC_OF_CIRCLE: {
+ Printf(false, "%FtARC OF A CIRCLE%E");
+ p = SK.GetEntity(e->point[0])->PointGetNum();
+ Printf(true, " center = " PT_AS_STR, COSTR(p));
+ p = SK.GetEntity(e->point[1])->PointGetNum();
+ Printf(true, " endpoints = " PT_AS_STR, COSTR(p));
+ p = SK.GetEntity(e->point[2])->PointGetNum();
+ Printf(false, " " PT_AS_STR, COSTR(p));
+ double r = e->CircleGetRadiusNum();
+ Printf(true, " diameter = %Fi%s", SS.MmToString(r*2).c_str());
+ Printf(false, " radius = %Fi%s", SS.MmToString(r).c_str());
+ double thetas, thetaf, dtheta;
+ e->ArcGetAngles(&thetas, &thetaf, &dtheta);
+ Printf(false, " arc len = %Fi%s", SS.MmToString(dtheta*r).c_str());
+ break;
+ }
+ case Entity::CIRCLE: {
+ Printf(false, "%FtCIRCLE%E");
+ p = SK.GetEntity(e->point[0])->PointGetNum();
+ Printf(true, " center = " PT_AS_STR, COSTR(p));
+ double r = e->CircleGetRadiusNum();
+ Printf(true, " diameter = %Fi%s", SS.MmToString(r*2).c_str());
+ Printf(false, " radius = %Fi%s", SS.MmToString(r).c_str());
+ break;
+ }
+ case Entity::FACE_NORMAL_PT:
+ case Entity::FACE_XPROD:
+ case Entity::FACE_N_ROT_TRANS:
+ case Entity::FACE_N_ROT_AA:
+ case Entity::FACE_N_TRANS:
+ Printf(false, "%FtPLANE FACE%E");
+ p = e->FaceGetNormalNum();
+ Printf(true, " normal = " PT_AS_NUM, CO(p));
+ p = e->FaceGetPointNum();
+ Printf(false, " thru = " PT_AS_STR, COSTR(p));
+ break;
+
+ case Entity::TTF_TEXT: {
+ Printf(false, "%FtTRUETYPE FONT TEXT%E");
+ Printf(true, " font = '%Fi%s%E'", e->font.c_str());
+ if(e->h.isFromRequest()) {
+ Printf(false, " text = '%Fi%s%E' %Fl%Ll%f%D[change]%E",
+ e->str.c_str(), &ScreenEditTtfText, e->h.request().v);
+ Printf(true, " select new font");
+ SS.fonts.LoadAll();
+ int i;
+ for(i = 0; i < SS.fonts.l.n; i++) {
+ TtfFont *tf = &(SS.fonts.l.elem[i]);
+ if(e->font == tf->FontFileBaseName()) {
+ Printf(false, "%Bp %s",
+ (i & 1) ? 'd' : 'a',
+ tf->name.c_str());
+ } else {
+ Printf(false, "%Bp %f%D%Fl%Ll%s%E%Bp",
+ (i & 1) ? 'd' : 'a',
+ &ScreenSetTtfFont, i,
+ tf->name.c_str(),
+ (i & 1) ? 'd' : 'a');
+ }
+ }
+ } else {
+ Printf(false, " text = '%Fi%s%E'", e->str.c_str());
+ }
+ break;
+ }
+
+ default:
+ Printf(true, "%Ft?? ENTITY%E");
+ break;
+ }
+
+ Group *g = SK.GetGroup(e->group);
+ Printf(false, "");
+ Printf(false, "%FtIN GROUP%E %s", g->DescriptionString().c_str());
+ if(e->workplane.v == Entity::FREE_IN_3D.v) {
+ Printf(false, "%FtNOT LOCKED IN WORKPLANE%E");
+ } else {
+ Entity *w = SK.GetEntity(e->workplane);
+ Printf(false, "%FtIN WORKPLANE%E %s", w->DescriptionString().c_str());
+ }
+ if(e->style.v) {
+ Style *s = Style::Get(e->style);
+ Printf(false, "%FtIN STYLE%E %s", s->DescriptionString().c_str());
+ } else {
+ Printf(false, "%FtIN STYLE%E none");
+ }
+ if(e->construction) {
+ Printf(false, "%FtCONSTRUCTION");
+ }
+ } else if(gs.n == 2 && gs.points == 2) {
+ Printf(false, "%FtTWO POINTS");
+ Vector p0 = SK.GetEntity(gs.point[0])->PointGetNum();
+ Printf(true, " at " PT_AS_STR, COSTR(p0));
+ Vector p1 = SK.GetEntity(gs.point[1])->PointGetNum();
+ Printf(false, " " PT_AS_STR, COSTR(p1));
+ double d = (p1.Minus(p0)).Magnitude();
+ Printf(true, " d = %Fi%s", SS.MmToString(d).c_str());
+ } else if(gs.n == 2 && gs.points == 1 && gs.circlesOrArcs == 1) {
+ Entity *ec = SK.GetEntity(gs.entity[0]);
+ if(ec->type == Entity::CIRCLE) {
+ Printf(false, "%FtPOINT AND A CIRCLE");
+ } else if(ec->type == Entity::ARC_OF_CIRCLE) {
+ Printf(false, "%FtPOINT AND AN ARC");
+ } else oops();
+ Vector p = SK.GetEntity(gs.point[0])->PointGetNum();
+ Printf(true, " pt at " PT_AS_STR, COSTR(p));
+ Vector c = SK.GetEntity(ec->point[0])->PointGetNum();
+ Printf(true, " center = " PT_AS_STR, COSTR(c));
+ double r = ec->CircleGetRadiusNum();
+ Printf(false, " diameter = %Fi%s", SS.MmToString(r*2).c_str());
+ Printf(false, " radius = %Fi%s", SS.MmToString(r).c_str());
+ double d = (p.Minus(c)).Magnitude() - r;
+ Printf(true, " distance = %Fi%s", SS.MmToString(d).c_str());
+ } else if(gs.n == 2 && gs.faces == 1 && gs.points == 1) {
+ Printf(false, "%FtA POINT AND A PLANE FACE");
+ Vector pt = SK.GetEntity(gs.point[0])->PointGetNum();
+ Printf(true, " point = " PT_AS_STR, COSTR(pt));
+ Vector n = SK.GetEntity(gs.face[0])->FaceGetNormalNum();
+ Printf(true, " plane normal = " PT_AS_NUM, CO(n));
+ Vector pl = SK.GetEntity(gs.face[0])->FaceGetPointNum();
+ Printf(false, " plane thru = " PT_AS_STR, COSTR(pl));
+ double dd = n.Dot(pl) - n.Dot(pt);
+ Printf(true, " distance = %Fi%s", SS.MmToString(dd).c_str());
+ } else if(gs.n == 3 && gs.points == 2 && gs.vectors == 1) {
+ Printf(false, "%FtTWO POINTS AND A VECTOR");
+ Vector p0 = SK.GetEntity(gs.point[0])->PointGetNum();
+ Printf(true, " pointA = " PT_AS_STR, COSTR(p0));
+ Vector p1 = SK.GetEntity(gs.point[1])->PointGetNum();
+ Printf(false, " pointB = " PT_AS_STR, COSTR(p1));
+ Vector v = SK.GetEntity(gs.vector[0])->VectorGetNum();
+ v = v.WithMagnitude(1);
+ Printf(true, " vector = " PT_AS_NUM, CO(v));
+ double d = (p1.Minus(p0)).Dot(v);
+ Printf(true, " proj_d = %Fi%s", SS.MmToString(d).c_str());
+ } else if(gs.n == 2 && gs.lineSegments == 1 && gs.points == 1) {
+ Entity *ln = SK.GetEntity(gs.entity[0]);
+ Vector lp0 = SK.GetEntity(ln->point[0])->PointGetNum(),
+ lp1 = SK.GetEntity(ln->point[1])->PointGetNum();
+ Printf(false, "%FtLINE SEGMENT AND POINT%E");
+ Printf(true, " ln thru " PT_AS_STR, COSTR(lp0));
+ Printf(false, " " PT_AS_STR, COSTR(lp1));
+ Vector pp = SK.GetEntity(gs.point[0])->PointGetNum();
+ Printf(true, " point " PT_AS_STR, COSTR(pp));
+ Printf(true, " pt-ln distance = %Fi%s%E",
+ SS.MmToString(pp.DistanceToLine(lp0, lp1.Minus(lp0))).c_str());
+ } else if(gs.n == 2 && gs.vectors == 2) {
+ Printf(false, "%FtTWO VECTORS");
+
+ Vector v0 = SK.GetEntity(gs.entity[0])->VectorGetNum(),
+ v1 = SK.GetEntity(gs.entity[1])->VectorGetNum();
+ v0 = v0.WithMagnitude(1);
+ v1 = v1.WithMagnitude(1);
+
+ Printf(true, " vectorA = " PT_AS_NUM, CO(v0));
+ Printf(false, " vectorB = " PT_AS_NUM, CO(v1));
+
+ double theta = acos(v0.Dot(v1));
+ Printf(true, " angle = %Fi%2%E degrees", theta*180/PI);
+ while(theta < PI/2) theta += PI;
+ while(theta > PI/2) theta -= PI;
+ Printf(false, " or angle = %Fi%2%E (mod 180)", theta*180/PI);
+ } else if(gs.n == 2 && gs.faces == 2) {
+ Printf(false, "%FtTWO PLANE FACES");
+
+ Vector n0 = SK.GetEntity(gs.face[0])->FaceGetNormalNum();
+ Printf(true, " planeA normal = " PT_AS_NUM, CO(n0));
+ Vector p0 = SK.GetEntity(gs.face[0])->FaceGetPointNum();
+ Printf(false, " planeA thru = " PT_AS_STR, COSTR(p0));
+
+ Vector n1 = SK.GetEntity(gs.face[1])->FaceGetNormalNum();
+ Printf(true, " planeB normal = " PT_AS_NUM, CO(n1));
+ Vector p1 = SK.GetEntity(gs.face[1])->FaceGetPointNum();
+ Printf(false, " planeB thru = " PT_AS_STR, COSTR(p1));
+
+ double theta = acos(n0.Dot(n1));
+ Printf(true, " angle = %Fi%2%E degrees", theta*180/PI);
+ while(theta < PI/2) theta += PI;
+ while(theta > PI/2) theta -= PI;
+ Printf(false, " or angle = %Fi%2%E (mod 180)", theta*180/PI);
+
+ if(fabs(theta) < 0.01) {
+ double d = (p1.Minus(p0)).Dot(n0);
+ Printf(true, " distance = %Fi%s", SS.MmToString(d).c_str());
+ }
+ } else if(gs.n == 0 && gs.stylables > 0) {
+ Printf(false, "%FtSELECTED:%E comment text");
+ } else if(gs.n == 0 && gs.constraints == 1) {
+ Constraint *c = SK.GetConstraint(gs.constraint[0]);
+
+ if(c->type == Constraint::DIAMETER) {
+ Printf(false, "%FtDIAMETER CONSTRAINT");
+
+ Printf(true, " %Fd%f%D%Ll%s show as radius",
+ &ScreenConstraintShowAsRadius, gs.constraint[0].v,
+ c->other ? CHECK_TRUE : CHECK_FALSE);
+ } else {
+ Printf(false, "%FtSELECTED:%E %s",
+ c->DescriptionString().c_str());
+ }
+ } else {
+ int n = SS.GW.selection.n;
+ Printf(false, "%FtSELECTED:%E %d item%s", n, n == 1 ? "" : "s");
+ }
+
+ if(shown.screen == SCREEN_STYLE_INFO &&
+ shown.style.v >= Style::FIRST_CUSTOM && gs.stylables > 0)
+ {
+ // If we are showing a screen for a particular style, then offer the
+ // option to assign our selected entities to that style.
+ Style *s = Style::Get(shown.style);
+ Printf(true, "%Fl%D%f%Ll(assign to style %s)%E",
+ shown.style.v,
+ &ScreenAssignSelectionToStyle,
+ s->DescriptionString().c_str());
+ }
+ // If any of the selected entities have an assigned style, then offer
+ // the option to remove that style.
+ bool styleAssigned = false;
+ for(i = 0; i < gs.entities; i++) {
+ Entity *e = SK.GetEntity(gs.entity[i]);
+ if(e->style.v != 0) {
+ styleAssigned = true;
+ }
+ }
+ for(i = 0; i < gs.constraints; i++) {
+ Constraint *c = SK.GetConstraint(gs.constraint[i]);
+ if(c->type == Constraint::COMMENT && c->disp.style.v != 0) {
+ styleAssigned = true;
+ }
+ }
+ if(styleAssigned) {
+ Printf(true, "%Fl%D%f%Ll(remove assigned style)%E",
+ 0,
+ &ScreenAssignSelectionToStyle);
+ }
+
+ Printf(true, "%Fl%f%Ll(unselect all)%E", &TextWindow::ScreenUnselectAll);
+}
+
+void TextWindow::GoToScreen(int screen) {
+ shown.screen = screen;
+}
+
--- /dev/null
+//-----------------------------------------------------------------------------
+// The root function to paint our graphics window, after setting up all the
+// views and such appropriately. Also contains all the stuff to manage the
+// selection.
+//
+// Copyright 2008-2013 Jonathan Westhues.
+//-----------------------------------------------------------------------------
+#include "solvespace.h"
+
+bool GraphicsWindow::Selection::Equals(Selection *b) {
+ if(entity.v != b->entity.v) return false;
+ if(constraint.v != b->constraint.v) return false;
+ return true;
+}
+
+bool GraphicsWindow::Selection::IsEmpty(void) {
+ if(entity.v) return false;
+ if(constraint.v) return false;
+ return true;
+}
+
+bool GraphicsWindow::Selection::HasEndpoints(void) {
+ if(!entity.v) return false;
+ Entity *e = SK.GetEntity(entity);
+ return e->HasEndpoints();
+}
+
+void GraphicsWindow::Selection::Clear(void) {
+ entity.v = constraint.v = 0;
+ emphasized = false;
+}
+
+void GraphicsWindow::Selection::Draw(void) {
+ Vector refp = Vector::From(0, 0, 0);
+ if(entity.v) {
+ Entity *e = SK.GetEntity(entity);
+ e->Draw(/*drawAsHidden=*/false);
+ if(emphasized) refp = e->GetReferencePos();
+ }
+ if(constraint.v) {
+ Constraint *c = SK.GetConstraint(constraint);
+ c->Draw();
+ if(emphasized) refp = c->GetReferencePos();
+ }
+ if(emphasized && (constraint.v || entity.v)) {
+ // We want to emphasize this constraint or entity, by drawing a thick
+ // line from the top left corner of the screen to the reference point
+ // of that entity or constraint.
+ double s = 0.501/SS.GW.scale;
+ Vector topLeft = SS.GW.projRight.ScaledBy(-SS.GW.width*s);
+ topLeft = topLeft.Plus(SS.GW.projUp.ScaledBy(SS.GW.height*s));
+ topLeft = topLeft.Minus(SS.GW.offset);
+
+ ssglLineWidth(40);
+ RgbaColor rgb = Style::Color(Style::HOVERED);
+ glColor4d(rgb.redF(), rgb.greenF(), rgb.blueF(), 0.2);
+ glBegin(GL_LINES);
+ ssglVertex3v(topLeft);
+ ssglVertex3v(refp);
+ glEnd();
+ ssglLineWidth(1);
+ }
+}
+
+void GraphicsWindow::ClearSelection(void) {
+ selection.Clear();
+ SS.ScheduleShowTW();
+ InvalidateGraphics();
+}
+
+void GraphicsWindow::ClearNonexistentSelectionItems(void) {
+ bool change = false;
+ Selection *s;
+ selection.ClearTags();
+ for(s = selection.First(); s; s = selection.NextAfter(s)) {
+ if(s->constraint.v && !(SK.constraint.FindByIdNoOops(s->constraint))) {
+ s->tag = 1;
+ change = true;
+ }
+ if(s->entity.v && !(SK.entity.FindByIdNoOops(s->entity))) {
+ s->tag = 1;
+ change = true;
+ }
+ }
+ selection.RemoveTagged();
+ if(change) InvalidateGraphics();
+}
+
+//-----------------------------------------------------------------------------
+// Is this entity/constraint selected?
+//-----------------------------------------------------------------------------
+bool GraphicsWindow::IsSelected(hEntity he) {
+ Selection s = {};
+ s.entity = he;
+ return IsSelected(&s);
+}
+bool GraphicsWindow::IsSelected(Selection *st) {
+ Selection *s;
+ for(s = selection.First(); s; s = selection.NextAfter(s)) {
+ if(s->Equals(st)) {
+ return true;
+ }
+ }
+ return false;
+}
+
+//-----------------------------------------------------------------------------
+// Unselect an item, if it is selected. We can either unselect just that item,
+// or also unselect any coincident points. The latter is useful if the user
+// somehow selects two coincident points (like with select all), because it
+// would otherwise be impossible to de-select the lower of the two.
+//-----------------------------------------------------------------------------
+void GraphicsWindow::MakeUnselected(hEntity he, bool coincidentPointTrick) {
+ Selection stog = {};
+ stog.entity = he;
+ MakeUnselected(&stog, coincidentPointTrick);
+}
+void GraphicsWindow::MakeUnselected(Selection *stog, bool coincidentPointTrick){
+ if(stog->IsEmpty()) return;
+
+ Selection *s;
+
+ // If an item was selected, then we just un-select it.
+ selection.ClearTags();
+ for(s = selection.First(); s; s = selection.NextAfter(s)) {
+ if(s->Equals(stog)) {
+ s->tag = 1;
+ }
+ }
+ // If two points are coincident, then it's impossible to hover one of
+ // them. But make sure to deselect both, to avoid mysterious seeming
+ // inability to deselect if the bottom one did somehow get selected.
+ if(stog->entity.v && coincidentPointTrick) {
+ Entity *e = SK.GetEntity(stog->entity);
+ if(e->IsPoint()) {
+ Vector ep = e->PointGetNum();
+ for(s = selection.First(); s; s = selection.NextAfter(s)) {
+ if(!s->entity.v) continue;
+ if(s->entity.v == stog->entity.v) continue;
+ Entity *se = SK.GetEntity(s->entity);
+ if(!se->IsPoint()) continue;
+ if(ep.Equals(se->PointGetNum())) {
+ s->tag = 1;
+ }
+ }
+ }
+ }
+ selection.RemoveTagged();
+}
+
+//-----------------------------------------------------------------------------
+// Select an item, if it isn't selected already.
+//-----------------------------------------------------------------------------
+void GraphicsWindow::MakeSelected(hEntity he) {
+ Selection stog = {};
+ stog.entity = he;
+ MakeSelected(&stog);
+}
+
+void GraphicsWindow::MakeSelected(hConstraint hc) {
+ Selection stog = {};
+ stog.constraint = hc;
+ MakeSelected(&stog);
+}
+
+void GraphicsWindow::MakeSelected(Selection *stog) {
+ if(stog->IsEmpty()) return;
+ if(IsSelected(stog)) return;
+
+ if(stog->entity.v != 0 && SK.GetEntity(stog->entity)->IsFace()) {
+ // In the interest of speed for the triangle drawing code,
+ // only two faces may be selected at a time.
+ int c = 0;
+ Selection *s;
+ selection.ClearTags();
+ for(s = selection.First(); s; s = selection.NextAfter(s)) {
+ hEntity he = s->entity;
+ if(he.v != 0 && SK.GetEntity(he)->IsFace()) {
+ c++;
+ if(c >= 2) s->tag = 1;
+ }
+ }
+ selection.RemoveTagged();
+ }
+
+ selection.Add(stog);
+}
+
+//-----------------------------------------------------------------------------
+// Select everything that lies within the marquee view-aligned rectangle. For
+// points, we test by the point location. For normals, we test by the normal's
+// associated point. For anything else, we test by any piecewise linear edge.
+//-----------------------------------------------------------------------------
+void GraphicsWindow::SelectByMarquee(void) {
+ Point2d begin = ProjectPoint(orig.marqueePoint);
+ double xmin = min(orig.mouse.x, begin.x),
+ xmax = max(orig.mouse.x, begin.x),
+ ymin = min(orig.mouse.y, begin.y),
+ ymax = max(orig.mouse.y, begin.y);
+
+ Entity *e;
+ for(e = SK.entity.First(); e; e = SK.entity.NextAfter(e)) {
+ if(e->group.v != SS.GW.activeGroup.v) continue;
+ if(e->IsFace() || e->IsDistance()) continue;
+ if(!e->IsVisible()) continue;
+
+ if(e->IsPoint() || e->IsNormal()) {
+ Vector p = e->IsPoint() ? e->PointGetNum() :
+ SK.GetEntity(e->point[0])->PointGetNum();
+ Point2d pp = ProjectPoint(p);
+ if(pp.x >= xmin && pp.x <= xmax &&
+ pp.y >= ymin && pp.y <= ymax)
+ {
+ MakeSelected(e->h);
+ }
+ } else {
+ // Use the 3d bounding box test routines, to avoid duplication;
+ // so let our bounding square become a bounding box that certainly
+ // includes the z = 0 plane.
+ Vector ptMin = Vector::From(xmin, ymin, -1),
+ ptMax = Vector::From(xmax, ymax, 1);
+ SEdgeList sel = {};
+ e->GenerateEdges(&sel, true);
+ SEdge *se;
+ for(se = sel.l.First(); se; se = sel.l.NextAfter(se)) {
+ Point2d ppa = ProjectPoint(se->a),
+ ppb = ProjectPoint(se->b);
+ Vector ptA = Vector::From(ppa.x, ppa.y, 0),
+ ptB = Vector::From(ppb.x, ppb.y, 0);
+ if(Vector::BoundingBoxIntersectsLine(ptMax, ptMin,
+ ptA, ptB, true) ||
+ !ptA.OutsideAndNotOn(ptMax, ptMin) ||
+ !ptB.OutsideAndNotOn(ptMax, ptMin))
+ {
+ MakeSelected(e->h);
+ break;
+ }
+ }
+ sel.Clear();
+ }
+ }
+}
+
+//-----------------------------------------------------------------------------
+// Sort the selection according to various critieria: the entities and
+// constraints separately, counts of certain types of entities (circles,
+// lines, etc.), and so on.
+//-----------------------------------------------------------------------------
+void GraphicsWindow::GroupSelection(void) {
+ gs = {};
+ int i;
+ for(i = 0; i < selection.n; i++) {
+ Selection *s = &(selection.elem[i]);
+ if(s->entity.v) {
+ (gs.n)++;
+
+ Entity *e = SK.entity.FindById(s->entity);
+
+ if(e->IsStylable()) gs.stylables++;
+
+ // A list of points, and a list of all entities that aren't points.
+ if(e->IsPoint()) {
+ gs.points++;
+ gs.point.push_back(s->entity);
+ } else {
+ gs.entities++;
+ gs.entity.push_back(s->entity);
+ }
+
+ // And an auxiliary list of normals, including normals from
+ // workplanes.
+ if(e->IsNormal()) {
+ gs.anyNormals++;
+ gs.anyNormal.push_back(s->entity);
+ } else if(e->IsWorkplane()) {
+ gs.anyNormals++;
+ gs.anyNormal.push_back(e->Normal()->h);
+ }
+
+ // And of vectors (i.e., stuff with a direction to constrain)
+ if(e->HasVector()) {
+ gs.vectors++;
+ gs.vector.push_back(s->entity);
+ }
+
+ // Faces (which are special, associated/drawn with triangles)
+ if(e->IsFace()) {
+ gs.faces++;
+ gs.face.push_back(s->entity);
+ }
+
+ if(e->HasEndpoints()) {
+ (gs.withEndpoints)++;
+ }
+
+ // And some aux counts too
+ switch(e->type) {
+ case Entity::WORKPLANE: (gs.workplanes)++; break;
+ case Entity::LINE_SEGMENT: (gs.lineSegments)++; break;
+ case Entity::CUBIC: (gs.cubics)++; break;
+ case Entity::CUBIC_PERIODIC: (gs.periodicCubics)++; break;
+
+ case Entity::ARC_OF_CIRCLE:
+ (gs.circlesOrArcs)++;
+ (gs.arcs)++;
+ break;
+
+ case Entity::CIRCLE: (gs.circlesOrArcs)++; break;
+ }
+ }
+ if(s->constraint.v) {
+ gs.constraints++;
+ gs.constraint.push_back(s->constraint);
+ Constraint *c = SK.GetConstraint(s->constraint);
+ if(c->IsStylable()) gs.stylables++;
+ if(c->HasLabel()) gs.constraintLabels++;
+ }
+ }
+}
+
+void GraphicsWindow::HitTestMakeSelection(Point2d mp) {
+ int i;
+ double d, dmin = 1e12;
+ Selection s = {};
+
+ // Did the view projection change? If so, invalidate bounding boxes.
+ if(!offset.EqualsExactly(cached.offset) ||
+ !projRight.EqualsExactly(cached.projRight) ||
+ !projUp.EqualsExactly(cached.projUp) ||
+ EXACT(scale != cached.scale)) {
+ cached.offset = offset;
+ cached.projRight = projRight;
+ cached.projUp = projUp;
+ cached.scale = scale;
+ for(Entity *e = SK.entity.First(); e; e = SK.entity.NextAfter(e)) {
+ e->screenBBoxValid = false;
+ }
+ }
+
+ // Always do the entities; we might be dragging something that should
+ // be auto-constrained, and we need the hover for that.
+ for(i = 0; i < SK.entity.n; i++) {
+ Entity *e = &(SK.entity.elem[i]);
+ // Don't hover whatever's being dragged.
+ if(e->h.request().v == pending.point.request().v) {
+ // The one exception is when we're creating a new cubic; we
+ // want to be able to hover the first point, because that's
+ // how we turn it into a periodic spline.
+ if(!e->IsPoint()) continue;
+ if(!e->h.isFromRequest()) continue;
+ Request *r = SK.GetRequest(e->h.request());
+ if(r->type != Request::CUBIC) continue;
+ if(r->extraPoints < 2) continue;
+ if(e->h.v != r->h.entity(1).v) continue;
+ }
+
+ d = e->GetDistance(mp);
+ if(d < SELECTION_RADIUS && d < dmin) {
+ s = {};
+ s.entity = e->h;
+ dmin = d;
+ }
+ }
+
+ // The constraints and faces happen only when nothing's in progress.
+ if(pending.operation == 0) {
+ // Constraints
+ for(i = 0; i < SK.constraint.n; i++) {
+ d = SK.constraint.elem[i].GetDistance(mp);
+ if(d < SELECTION_RADIUS && d < dmin) {
+ s = {};
+ s.constraint = SK.constraint.elem[i].h;
+ dmin = d;
+ }
+ }
+
+ // Faces, from the triangle mesh; these are lowest priority
+ if(s.constraint.v == 0 && s.entity.v == 0 && showShaded && showFaces) {
+ Group *g = SK.GetGroup(activeGroup);
+ SMesh *m = &(g->displayMesh);
+
+ uint32_t v = m->FirstIntersectionWith(mp);
+ if(v) {
+ s.entity.v = v;
+ }
+ }
+ }
+
+ if(!s.Equals(&hover)) {
+ hover = s;
+ PaintGraphics();
+ }
+}
+
+//-----------------------------------------------------------------------------
+// Project a point in model space to screen space, exactly as gl would; return
+// units are pixels.
+//-----------------------------------------------------------------------------
+Point2d GraphicsWindow::ProjectPoint(Vector p) {
+ Vector p3 = ProjectPoint3(p);
+ Point2d p2 = { p3.x, p3.y };
+ return p2;
+}
+//-----------------------------------------------------------------------------
+// Project a point in model space to screen space, exactly as gl would; return
+// units are pixels. The z coordinate is also returned, also in pixels.
+//-----------------------------------------------------------------------------
+Vector GraphicsWindow::ProjectPoint3(Vector p) {
+ double w;
+ Vector r = ProjectPoint4(p, &w);
+ return r.ScaledBy(scale/w);
+}
+//-----------------------------------------------------------------------------
+// Project a point in model space halfway into screen space. The scale is
+// not applied, and the perspective divide isn't applied; instead the w
+// coordinate is returned separately.
+//-----------------------------------------------------------------------------
+Vector GraphicsWindow::ProjectPoint4(Vector p, double *w) {
+ p = p.Plus(offset);
+
+ Vector r;
+ r.x = p.Dot(projRight);
+ r.y = p.Dot(projUp);
+ r.z = p.Dot(projUp.Cross(projRight));
+
+ *w = 1 + r.z*SS.CameraTangent()*scale;
+ return r;
+}
+
+//-----------------------------------------------------------------------------
+// Return a point in the plane parallel to the screen and through the offset,
+// that projects onto the specified (x, y) coordinates.
+//-----------------------------------------------------------------------------
+Vector GraphicsWindow::UnProjectPoint(Point2d p) {
+ Vector orig = offset.ScaledBy(-1);
+
+ // Note that we ignoring the effects of perspective. Since our returned
+ // point has the same component normal to the screen as the offset, it
+ // will have z = 0 after the rotation is applied, thus w = 1. So this is
+ // correct.
+ orig = orig.Plus(projRight.ScaledBy(p.x / scale)).Plus(
+ projUp. ScaledBy(p.y / scale));
+ return orig;
+}
+
+Vector GraphicsWindow::UnProjectPoint3(Vector p) {
+ p.z = p.z / (scale - p.z * SS.CameraTangent() * scale);
+ double w = 1 + p.z * SS.CameraTangent() * scale;
+ p.x *= w / scale;
+ p.y *= w / scale;
+
+ Vector orig = offset.ScaledBy(-1);
+ orig = orig.Plus(projRight.ScaledBy(p.x)).Plus(
+ projUp. ScaledBy(p.y).Plus(
+ projRight.Cross(projUp). ScaledBy(p.z)));
+ return orig;
+}
+
+void GraphicsWindow::NormalizeProjectionVectors(void) {
+ if(projRight.Magnitude() < LENGTH_EPS) {
+ projRight = Vector::From(1, 0, 0);
+ }
+
+ Vector norm = projRight.Cross(projUp);
+ // If projRight and projUp somehow ended up parallel, then pick an
+ // arbitrary projUp normal to projRight.
+ if(norm.Magnitude() < LENGTH_EPS) {
+ norm = projRight.Normal(0);
+ }
+ projUp = norm.Cross(projRight);
+
+ projUp = projUp.WithMagnitude(1);
+ projRight = projRight.WithMagnitude(1);
+}
+
+Vector GraphicsWindow::VectorFromProjs(Vector rightUpForward) {
+ Vector n = projRight.Cross(projUp);
+
+ Vector r = (projRight.ScaledBy(rightUpForward.x));
+ r = r.Plus(projUp.ScaledBy(rightUpForward.y));
+ r = r.Plus(n.ScaledBy(rightUpForward.z));
+ return r;
+}
+
+void GraphicsWindow::Paint(void) {
+ int i;
+ havePainted = true;
+
+ int w, h;
+ GetGraphicsWindowSize(&w, &h);
+ width = w; height = h;
+ glViewport(0, 0, w, h);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+
+ glScaled(scale*2.0/w, scale*2.0/h, scale*1.0/30000);
+
+ double mat[16];
+ // Last thing before display is to apply the perspective
+ double clp = SS.CameraTangent()*scale;
+ MakeMatrix(mat, 1, 0, 0, 0,
+ 0, 1, 0, 0,
+ 0, 0, 1, 0,
+ 0, 0, clp, 1);
+ glMultMatrixd(mat);
+ // Before that, we apply the rotation
+ Vector n = projUp.Cross(projRight);
+ MakeMatrix(mat, projRight.x, projRight.y, projRight.z, 0,
+ projUp.x, projUp.y, projUp.z, 0,
+ n.x, n.y, n.z, 0,
+ 0, 0, 0, 1);
+ glMultMatrixd(mat);
+ // And before that, the translation
+ MakeMatrix(mat, 1, 0, 0, offset.x,
+ 0, 1, 0, offset.y,
+ 0, 0, 1, offset.z,
+ 0, 0, 0, 1);
+ glMultMatrixd(mat);
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+
+ glShadeModel(GL_SMOOTH);
+
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ glEnable(GL_BLEND);
+ glEnable(GL_LINE_SMOOTH);
+ // don't enable GL_POLYGON_SMOOTH; that looks ugly on some graphics cards,
+ // drawn with leaks in the mesh
+ glEnable(GL_POLYGON_OFFSET_LINE);
+ glEnable(GL_POLYGON_OFFSET_FILL);
+ glEnable(GL_DEPTH_TEST);
+ glHint(GL_LINE_SMOOTH_HINT, GL_NICEST);
+ glEnable(GL_NORMALIZE);
+
+ // At the same depth, we want later lines drawn over earlier.
+ glDepthFunc(GL_LEQUAL);
+
+ if(SS.ActiveGroupsOkay()) {
+ glClearColor(SS.backgroundColor.redF(),
+ SS.backgroundColor.greenF(),
+ SS.backgroundColor.blueF(), 1.0f);
+ } else {
+ // Draw a different background whenever we're having solve problems.
+ RgbaColor rgb = Style::Color(Style::DRAW_ERROR);
+ glClearColor(0.4f*rgb.redF(), 0.4f*rgb.greenF(), 0.4f*rgb.blueF(), 1.0f);
+ // And show the text window, which has info to debug it
+ ForceTextWindowShown();
+ }
+ glClear(GL_COLOR_BUFFER_BIT);
+ glClearDepth(1.0);
+ glClear(GL_DEPTH_BUFFER_BIT);
+
+ if(SS.bgImage.fromFile) {
+ // If a background image is loaded, then we draw it now as a texture.
+ // This handles the resizing for us nicely.
+ glBindTexture(GL_TEXTURE_2D, TEXTURE_BACKGROUND_IMG);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
+ glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB,
+ SS.bgImage.rw, SS.bgImage.rh,
+ 0,
+ GL_RGB, GL_UNSIGNED_BYTE,
+ SS.bgImage.fromFile);
+
+ double tw = ((double)SS.bgImage.w) / SS.bgImage.rw,
+ th = ((double)SS.bgImage.h) / SS.bgImage.rh;
+
+ double mmw = SS.bgImage.w / SS.bgImage.scale,
+ mmh = SS.bgImage.h / SS.bgImage.scale;
+
+ Vector origin = SS.bgImage.origin;
+ origin = origin.DotInToCsys(projRight, projUp, n);
+ // Place the depth of our origin at the point that corresponds to
+ // w = 1, so that it's unaffected by perspective.
+ origin.z = (offset.ScaledBy(-1)).Dot(n);
+ origin = origin.ScaleOutOfCsys(projRight, projUp, n);
+
+ // Place the background at the very back of the Z order, though, by
+ // mucking with the depth range.
+ glDepthRange(1, 1);
+ glEnable(GL_TEXTURE_2D);
+ glBegin(GL_QUADS);
+ glTexCoord2d(0, 0);
+ ssglVertex3v(origin);
+
+ glTexCoord2d(0, th);
+ ssglVertex3v(origin.Plus(projUp.ScaledBy(mmh)));
+
+ glTexCoord2d(tw, th);
+ ssglVertex3v(origin.Plus(projRight.ScaledBy(mmw).Plus(
+ projUp. ScaledBy(mmh))));
+
+ glTexCoord2d(tw, 0);
+ ssglVertex3v(origin.Plus(projRight.ScaledBy(mmw)));
+ glEnd();
+ glDisable(GL_TEXTURE_2D);
+ }
+ ssglDepthRangeOffset(0);
+
+ // Nasty case when we're reloading the linked files; could be that
+ // we get an error, so a dialog pops up, and a message loop starts, and
+ // we have to get called to paint ourselves. If the sketch is screwed
+ // up, then we could trigger an oops trying to draw.
+ if(!SS.allConsistent) return;
+
+ // Let's use two lights, at the user-specified locations
+ GLfloat f;
+ glEnable(GL_LIGHT0);
+ f = (GLfloat)SS.lightIntensity[0];
+ GLfloat li0[] = { f, f, f, 1.0f };
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, li0);
+ glLightfv(GL_LIGHT0, GL_SPECULAR, li0);
+
+ glEnable(GL_LIGHT1);
+ f = (GLfloat)SS.lightIntensity[1];
+ GLfloat li1[] = { f, f, f, 1.0f };
+ glLightfv(GL_LIGHT1, GL_DIFFUSE, li1);
+ glLightfv(GL_LIGHT1, GL_SPECULAR, li1);
+
+ Vector ld;
+ ld = VectorFromProjs(SS.lightDir[0]);
+ GLfloat ld0[4] = { (GLfloat)ld.x, (GLfloat)ld.y, (GLfloat)ld.z, 0 };
+ glLightfv(GL_LIGHT0, GL_POSITION, ld0);
+ ld = VectorFromProjs(SS.lightDir[1]);
+ GLfloat ld1[4] = { (GLfloat)ld.x, (GLfloat)ld.y, (GLfloat)ld.z, 0 };
+ glLightfv(GL_LIGHT1, GL_POSITION, ld1);
+
+ GLfloat ambient[4] = { (float)SS.ambientIntensity,
+ (float)SS.ambientIntensity,
+ (float)SS.ambientIntensity, 1 };
+ glLightModelfv(GL_LIGHT_MODEL_AMBIENT, ambient);
+
+ ssglUnlockColor();
+
+ if(showSnapGrid && LockedInWorkplane()) {
+ hEntity he = ActiveWorkplane();
+ EntityBase *wrkpl = SK.GetEntity(he),
+ *norm = wrkpl->Normal();
+ Vector wu, wv, wn, wp;
+ wp = SK.GetEntity(wrkpl->point[0])->PointGetNum();
+ wu = norm->NormalU();
+ wv = norm->NormalV();
+ wn = norm->NormalN();
+
+ double g = SS.gridSpacing;
+
+ double umin = VERY_POSITIVE, umax = VERY_NEGATIVE,
+ vmin = VERY_POSITIVE, vmax = VERY_NEGATIVE;
+ int a;
+ for(a = 0; a < 4; a++) {
+ // Ideally, we would just do +/- half the width and height; but
+ // allow some extra slop for rounding.
+ Vector horiz = projRight.ScaledBy((0.6*width)/scale + 2*g),
+ vert = projUp. ScaledBy((0.6*height)/scale + 2*g);
+ if(a == 2 || a == 3) horiz = horiz.ScaledBy(-1);
+ if(a == 1 || a == 3) vert = vert. ScaledBy(-1);
+ Vector tp = horiz.Plus(vert).Minus(offset);
+
+ // Project the point into our grid plane, normal to the screen
+ // (not to the grid plane). If the plane is on edge then this is
+ // impossible so don't try to draw the grid.
+ bool parallel;
+ Vector tpp = Vector::AtIntersectionOfPlaneAndLine(
+ wn, wn.Dot(wp),
+ tp, tp.Plus(n),
+ ¶llel);
+ if(parallel) goto nogrid;
+
+ tpp = tpp.Minus(wp);
+ double uu = tpp.Dot(wu),
+ vv = tpp.Dot(wv);
+
+ umin = min(uu, umin);
+ umax = max(uu, umax);
+ vmin = min(vv, vmin);
+ vmax = max(vv, vmax);
+ }
+
+ int i, j, i0, i1, j0, j1;
+
+ i0 = (int)(umin / g);
+ i1 = (int)(umax / g);
+ j0 = (int)(vmin / g);
+ j1 = (int)(vmax / g);
+
+ if(i0 > i1 || i1 - i0 > 400) goto nogrid;
+ if(j0 > j1 || j1 - j0 > 400) goto nogrid;
+
+ ssglLineWidth(1);
+ ssglColorRGBa(Style::Color(Style::DATUM), 0.3);
+ glBegin(GL_LINES);
+ for(i = i0 + 1; i < i1; i++) {
+ ssglVertex3v(wp.Plus(wu.ScaledBy(i*g)).Plus(wv.ScaledBy(j0*g)));
+ ssglVertex3v(wp.Plus(wu.ScaledBy(i*g)).Plus(wv.ScaledBy(j1*g)));
+ }
+ for(j = j0 + 1; j < j1; j++) {
+ ssglVertex3v(wp.Plus(wu.ScaledBy(i0*g)).Plus(wv.ScaledBy(j*g)));
+ ssglVertex3v(wp.Plus(wu.ScaledBy(i1*g)).Plus(wv.ScaledBy(j*g)));
+ }
+ glEnd();
+
+ // Clear the depth buffer, so that the grid is at the very back of
+ // the Z order.
+ glClear(GL_DEPTH_BUFFER_BIT);
+nogrid:;
+ }
+
+ // Draw the active group; this does stuff like the mesh and edges.
+ (SK.GetGroup(activeGroup))->Draw();
+
+ // Now draw the entities.
+ if(SS.GW.showHdnLines) {
+ ssglDepthRangeOffset(2);
+ glDepthFunc(GL_GREATER);
+ Entity::DrawAll(/*drawAsHidden=*/true);
+ glDepthFunc(GL_LEQUAL);
+ }
+ ssglDepthRangeOffset(0);
+ Entity::DrawAll(/*drawAsHidden=*/false);
+
+ // Draw filled paths in all groups, when those filled paths were requested
+ // specially by assigning a style with a fill color, or when the filled
+ // paths are just being filled by default. This should go last, to make
+ // the transparency work.
+ for(i = 0; i < SK.groupOrder.n; i++) {
+ Group *g = SK.GetGroup(SK.groupOrder.elem[i]);
+ if(!(g->IsVisible())) continue;
+ g->DrawFilledPaths();
+ }
+
+
+ glDisable(GL_DEPTH_TEST);
+ // Draw the constraints
+ for(i = 0; i < SK.constraint.n; i++) {
+ SK.constraint.elem[i].Draw();
+ }
+
+ // Draw the "pending" constraint, i.e. a constraint that would be
+ // placed on a line that is almost horizontal or vertical
+ if(SS.GW.pending.operation == DRAGGING_NEW_LINE_POINT) {
+ if(SS.GW.pending.suggestion != GraphicsWindow::SUGGESTED_NONE) {
+ Constraint c = {};
+ c.group = SS.GW.activeGroup;
+ c.workplane = SS.GW.ActiveWorkplane();
+ c.type = SS.GW.pending.suggestion;
+ c.ptA = Entity::NO_ENTITY;
+ c.ptB = Entity::NO_ENTITY;
+ c.entityA = SS.GW.pending.request.entity(0);
+ c.entityB = Entity::NO_ENTITY;
+ c.other = false;
+ c.other2 = false;
+ // Only draw.
+ c.Draw();
+ }
+ }
+
+ // Draw the traced path, if one exists
+ ssglLineWidth(Style::Width(Style::ANALYZE));
+ ssglColorRGB(Style::Color(Style::ANALYZE));
+ SContour *sc = &(SS.traced.path);
+ glBegin(GL_LINE_STRIP);
+ for(i = 0; i < sc->l.n; i++) {
+ ssglVertex3v(sc->l.elem[i].p);
+ }
+ glEnd();
+
+ // And the naked edges, if the user did Analyze -> Show Naked Edges.
+ ssglDrawEdges(&(SS.nakedEdges), true, { Style::DRAW_ERROR });
+
+ // Then redraw whatever the mouse is hovering over, highlighted.
+ glDisable(GL_DEPTH_TEST);
+ ssglLockColorTo(Style::Color(Style::HOVERED));
+ hover.Draw();
+
+ // And finally draw the selection, same mechanism.
+ ssglLockColorTo(Style::Color(Style::SELECTED));
+ for(Selection *s = selection.First(); s; s = selection.NextAfter(s)) {
+ s->Draw();
+ }
+
+ ssglUnlockColor();
+
+ // If a marquee selection is in progress, then draw the selection
+ // rectangle, as an outline and a transparent fill.
+ if(pending.operation == DRAGGING_MARQUEE) {
+ Point2d begin = ProjectPoint(orig.marqueePoint);
+ double xmin = min(orig.mouse.x, begin.x),
+ xmax = max(orig.mouse.x, begin.x),
+ ymin = min(orig.mouse.y, begin.y),
+ ymax = max(orig.mouse.y, begin.y);
+
+ Vector tl = UnProjectPoint(Point2d::From(xmin, ymin)),
+ tr = UnProjectPoint(Point2d::From(xmax, ymin)),
+ br = UnProjectPoint(Point2d::From(xmax, ymax)),
+ bl = UnProjectPoint(Point2d::From(xmin, ymax));
+
+ ssglLineWidth((GLfloat)1.3);
+ ssglColorRGB(Style::Color(Style::HOVERED));
+ glBegin(GL_LINE_LOOP);
+ ssglVertex3v(tl);
+ ssglVertex3v(tr);
+ ssglVertex3v(br);
+ ssglVertex3v(bl);
+ glEnd();
+ ssglColorRGBa(Style::Color(Style::HOVERED), 0.10);
+ glBegin(GL_QUADS);
+ ssglVertex3v(tl);
+ ssglVertex3v(tr);
+ ssglVertex3v(br);
+ ssglVertex3v(bl);
+ glEnd();
+ }
+
+ // An extra line, used to indicate the origin when rotating within the
+ // plane of the monitor.
+ if(SS.extraLine.draw) {
+ ssglLineWidth(1);
+ ssglLockColorTo(Style::Color(Style::DATUM));
+ glBegin(GL_LINES);
+ ssglVertex3v(SS.extraLine.ptA);
+ ssglVertex3v(SS.extraLine.ptB);
+ glEnd();
+ }
+
+ // A note to indicate the origin in the just-exported file.
+ if(SS.justExportedInfo.draw) {
+ Vector p, u, v;
+ if(SS.justExportedInfo.showOrigin) {
+ p = SS.justExportedInfo.pt,
+ u = SS.justExportedInfo.u,
+ v = SS.justExportedInfo.v;
+ } else {
+ p = SS.GW.offset.ScaledBy(-1);
+ u = SS.GW.projRight;
+ v = SS.GW.projUp;
+ }
+
+ ssglColorRGB(Style::Color(Style::DATUM));
+
+ ssglWriteText("previewing exported geometry; press Esc to return",
+ Style::DefaultTextHeight(),
+ p.Plus(u.ScaledBy(10/scale)).Plus(v.ScaledBy(10/scale)),
+ u, v, NULL, NULL);
+
+ if(SS.justExportedInfo.showOrigin) {
+ ssglLineWidth(1.5);
+ glBegin(GL_LINES);
+ ssglVertex3v(p.Plus(u.WithMagnitude(-15/scale)));
+ ssglVertex3v(p.Plus(u.WithMagnitude(30/scale)));
+ ssglVertex3v(p.Plus(v.WithMagnitude(-15/scale)));
+ ssglVertex3v(p.Plus(v.WithMagnitude(30/scale)));
+ glEnd();
+
+ ssglWriteText("(x, y) = (0, 0) for file just exported",
+ Style::DefaultTextHeight(),
+ p.Plus(u.ScaledBy(40/scale)).Plus(
+ v.ScaledBy(-(Style::DefaultTextHeight())/scale)),
+ u, v, NULL, NULL);
+ }
+ }
+
+ // And finally the toolbar.
+ if(SS.showToolbar) {
+ ToolbarDraw();
+ }
+}
+
--- /dev/null
+//-----------------------------------------------------------------------------
+// Given a constraint, draw a graphical and user-selectable representation
+// of that constraint on-screen. We can either draw with gl, or compute the
+// distance from a point (the location of the mouse pointer) to the lines
+// that we would have drawn, for selection.
+//
+// Copyright 2008-2013 Jonathan Westhues.
+//-----------------------------------------------------------------------------
+#include "solvespace.h"
+
+void Constraint::LineDrawOrGetDistance(Vector a, Vector b) {
+ if(dogd.drawing) {
+ hStyle hs = GetStyle();
+
+ if(dogd.sel) {
+ dogd.sel->AddEdge(a, b, hs.v);
+ } else {
+ if(Style::Width(hs) >= 3.0) {
+ ssglFatLine(a, b, Style::Width(hs) / SS.GW.scale);
+ } else {
+ glBegin(GL_LINE_STRIP);
+ ssglVertex3v(a);
+ ssglVertex3v(b);
+ glEnd();
+ }
+ }
+ } else {
+ Point2d ap = SS.GW.ProjectPoint(a);
+ Point2d bp = SS.GW.ProjectPoint(b);
+
+ double d = dogd.mp.DistanceToLine(ap, bp.Minus(ap), true);
+ dogd.dmin = min(dogd.dmin, d);
+ }
+ dogd.refp = (a.Plus(b)).ScaledBy(0.5);
+}
+
+static void LineCallback(void *fndata, Vector a, Vector b)
+{
+ Constraint *c = (Constraint *)fndata;
+ c->LineDrawOrGetDistance(a, b);
+}
+
+std::string Constraint::Label(void) {
+ std::string result;
+ if(type == ANGLE) {
+ if(valA == floor(valA)) {
+ result = ssprintf("%.0f°", valA);
+ } else {
+ result = ssprintf("%.2f°", valA);
+ }
+ } else if(type == LENGTH_RATIO) {
+ result = ssprintf("%.3f:1", valA);
+ } else if(type == COMMENT) {
+ result = comment;
+ } else if(type == DIAMETER) {
+ if(!other) {
+ result = "⌀" + SS.MmToString(valA);
+ } else {
+ result = "R" + SS.MmToString(valA / 2);
+ }
+ } else {
+ // valA has units of distance
+ result = SS.MmToString(fabs(valA));
+ }
+ if(reference) {
+ result += " REF";
+ }
+ return result;
+}
+
+void Constraint::DoLabel(Vector ref, Vector *labelPos, Vector gr, Vector gu) {
+ hStyle hs = GetStyle();
+ double th = Style::TextHeight(hs);
+
+ std::string s = Label();
+ double swidth = ssglStrWidth(s, th),
+ sheight = ssglStrCapHeight(th);
+
+ // By default, the reference is from the center; but the style could
+ // specify otherwise if one is present, and it could also specify a
+ // rotation.
+ if(type == COMMENT && disp.style.v) {
+ Style *st = Style::Get(disp.style);
+ // rotation first
+ double rads = st->textAngle*PI/180;
+ double c = cos(rads), s = sin(rads);
+ Vector pr = gr, pu = gu;
+ gr = pr.ScaledBy( c).Plus(pu.ScaledBy(s));
+ gu = pr.ScaledBy(-s).Plus(pu.ScaledBy(c));
+ // then origin
+ int o = st->textOrigin;
+ if(o & Style::ORIGIN_LEFT) ref = ref.Plus(gr.WithMagnitude(swidth/2));
+ if(o & Style::ORIGIN_RIGHT) ref = ref.Minus(gr.WithMagnitude(swidth/2));
+ if(o & Style::ORIGIN_BOT) ref = ref.Plus(gu.WithMagnitude(sheight/2));
+ if(o & Style::ORIGIN_TOP) ref = ref.Minus(gu.WithMagnitude(sheight/2));
+ }
+
+ if(labelPos) {
+ // labelPos is from the top left corner (for the text box used to
+ // edit things), but ref is from the center.
+ *labelPos = ref.Minus(gr.WithMagnitude(swidth/2)).Minus(
+ gu.WithMagnitude(sheight/2));
+ }
+
+
+ if(dogd.drawing) {
+ ssglWriteTextRefCenter(s, th, ref, gr, gu, LineCallback, this);
+ } else {
+ double l = swidth/2 - sheight/2;
+ l = max(l, 5/SS.GW.scale);
+ Point2d a = SS.GW.ProjectPoint(ref.Minus(gr.WithMagnitude(l)));
+ Point2d b = SS.GW.ProjectPoint(ref.Plus (gr.WithMagnitude(l)));
+ double d = dogd.mp.DistanceToLine(a, b.Minus(a), true);
+
+ dogd.dmin = min(dogd.dmin, d - (th / 2));
+ dogd.refp = ref;
+ }
+}
+
+void Constraint::StippledLine(Vector a, Vector b) {
+ glLineStipple(4, 0x5555);
+ glEnable(GL_LINE_STIPPLE);
+ LineDrawOrGetDistance(a, b);
+ glDisable(GL_LINE_STIPPLE);
+}
+
+void Constraint::DoProjectedPoint(Vector *r) {
+ Vector p = r->ProjectInto(workplane);
+ StippledLine(p, *r);
+ *r = p;
+}
+
+//-----------------------------------------------------------------------------
+// There is a rectangular box, aligned to our display axes (projRight, projUp)
+// centered at ref. This is where a dimension label will be drawn. We want to
+// draw a line from A to B. If that line would intersect the label box, then
+// trim the line to leave a gap for it, and return zero. If not, then extend
+// the line to almost meet the box, and return either positive or negative,
+// depending whether that extension was from A or from B.
+//-----------------------------------------------------------------------------
+int Constraint::DoLineTrimmedAgainstBox(Vector ref, Vector a, Vector b, bool extend) {
+ hStyle hs = GetStyle();
+ double th = Style::TextHeight(hs);
+ Vector gu = SS.GW.projUp.WithMagnitude(1),
+ gr = SS.GW.projRight.WithMagnitude(1);
+
+ double pixels = 1.0 / SS.GW.scale;
+ std::string s = Label();
+ double swidth = ssglStrWidth(s, th) + 4*pixels,
+ sheight = ssglStrCapHeight(th) + 8*pixels;
+
+ return DoLineTrimmedAgainstBox(ref, a, b, extend, gr, gu, swidth, sheight);
+}
+
+int Constraint::DoLineTrimmedAgainstBox(Vector ref, Vector a, Vector b, bool extend,
+ Vector gr, Vector gu, double swidth, double sheight) {
+ struct {
+ Vector n;
+ double d;
+ } planes[4];
+ // reference pos is the center of box occupied by text; build a rectangle
+ // around that, aligned to axes gr and gu, from four planes will all four
+ // normals pointing inward
+ planes[0].n = gu.ScaledBy(-1); planes[0].d = -(gu.Dot(ref) + sheight/2);
+ planes[1].n = gu; planes[1].d = gu.Dot(ref) - sheight/2;
+ planes[2].n = gr; planes[2].d = gr.Dot(ref) - swidth/2;
+ planes[3].n = gr.ScaledBy(-1); planes[3].d = -(gr.Dot(ref) + swidth/2);
+
+ double tmin = VERY_POSITIVE, tmax = VERY_NEGATIVE;
+ Vector dl = b.Minus(a);
+
+ for(int i = 0; i < 4; i++) {
+ bool parallel;
+ Vector p = Vector::AtIntersectionOfPlaneAndLine(
+ planes[i].n, planes[i].d,
+ a, b, ¶llel);
+ if(parallel) continue;
+
+ int j;
+ for(j = 0; j < 4; j++) {
+ double d = (planes[j].n).Dot(p) - planes[j].d;
+ if(d < -LENGTH_EPS) break;
+ }
+ if(j < 4) continue;
+
+ double t = (p.Minus(a)).DivPivoting(dl);
+ tmin = min(t, tmin);
+ tmax = max(t, tmax);
+ }
+
+ // Both in range; so there's pieces of the line on both sides of the label box.
+ if(tmin >= 0.0 && tmin <= 1.0 && tmax >= 0.0 && tmax <= 1.0) {
+ LineDrawOrGetDistance(a, a.Plus(dl.ScaledBy(tmin)));
+ LineDrawOrGetDistance(a.Plus(dl.ScaledBy(tmax)), b);
+ return 0;
+ }
+
+ // Only one intersection in range; so the box is right on top of the endpoint
+ if(tmin >= 0.0 && tmin <= 1.0) {
+ LineDrawOrGetDistance(a, a.Plus(dl.ScaledBy(tmin)));
+ return 0;
+ }
+
+ // Likewise.
+ if(tmax >= 0.0 && tmax <= 1.0) {
+ LineDrawOrGetDistance(a.Plus(dl.ScaledBy(tmax)), b);
+ return 0;
+ }
+
+ // The line does not intersect the label; so the line should get
+ // extended to just barely meet the label.
+ // 0 means the label lies within the line, negative means it's outside
+ // and closer to b, positive means outside and closer to a.
+ if(tmax < 0.0) {
+ if(extend) a = a.Plus(dl.ScaledBy(tmax));
+ LineDrawOrGetDistance(a, b);
+ return 1;
+ }
+
+ if(tmin > 1.0) {
+ if(extend) b = a.Plus(dl.ScaledBy(tmin));
+ LineDrawOrGetDistance(a, b);
+ return -1;
+ }
+
+ // This will happen if the entire line lies within the box.
+ return 0;
+}
+
+void Constraint::DoArrow(Vector p, Vector dir, Vector n, double width, double angle, double da) {
+ dir = dir.WithMagnitude(width / cos(angle));
+ dir = dir.RotatedAbout(n, da);
+ LineDrawOrGetDistance(p, p.Plus(dir.RotatedAbout(n, angle)));
+ LineDrawOrGetDistance(p, p.Plus(dir.RotatedAbout(n, -angle)));
+}
+
+//-----------------------------------------------------------------------------
+// Draw a line with arrows on both ends, and possibly a gap in the middle for
+// the dimension. We will use these for most length dimensions. The length
+// being dimensioned is from A to B; but those points get extended perpendicular
+// to the line AB, until the line between the extensions crosses ref (the
+// center of the label).
+//-----------------------------------------------------------------------------
+void Constraint::DoLineWithArrows(Vector ref, Vector a, Vector b,
+ bool onlyOneExt)
+{
+ double pixels = 1.0 / SS.GW.scale;
+
+ Vector ab = a.Minus(b);
+ Vector ar = a.Minus(ref);
+ // Normal to a plane containing the line and the label origin.
+ Vector n = ab.Cross(ar);
+ // Within that plane, and normal to the line AB; so that's our extension
+ // line.
+ Vector out = ab.Cross(n).WithMagnitude(1);
+ out = out.ScaledBy(-out.Dot(ar));
+
+ Vector ae = a.Plus(out), be = b.Plus(out);
+
+ // Extension lines extend 10 pixels beyond where the arrows get
+ // drawn (which is at the same offset perpendicular from AB as the
+ // label).
+ LineDrawOrGetDistance(a, ae.Plus(out.WithMagnitude(10*pixels)));
+ if(!onlyOneExt) {
+ LineDrawOrGetDistance(b, be.Plus(out.WithMagnitude(10*pixels)));
+ }
+
+ int within = DoLineTrimmedAgainstBox(ref, ae, be);
+
+ // Arrow heads are 13 pixels long, with an 18 degree half-angle.
+ double theta = 18*PI/180;
+ Vector arrow = (be.Minus(ae)).WithMagnitude(13*pixels);
+
+ if(within != 0) {
+ arrow = arrow.ScaledBy(-1);
+ Vector seg = (be.Minus(ae)).WithMagnitude(18*pixels);
+ if(within < 0) LineDrawOrGetDistance(ae, ae.Minus(seg));
+ if(within > 0) LineDrawOrGetDistance(be, be.Plus(seg));
+ }
+
+ DoArrow(ae, arrow, n, 13.0 * pixels, theta, 0.0);
+ DoArrow(be, arrow.Negated(), n, 13.0 * pixels, theta, 0.0);
+}
+
+void Constraint::DoEqualLenTicks(Vector a, Vector b, Vector gn) {
+ Vector m = (a.ScaledBy(1.0/3)).Plus(b.ScaledBy(2.0/3));
+ Vector ab = a.Minus(b);
+ Vector n = (gn.Cross(ab)).WithMagnitude(10/SS.GW.scale);
+
+ LineDrawOrGetDistance(m.Minus(n), m.Plus(n));
+}
+
+void Constraint::DoEqualRadiusTicks(hEntity he) {
+ Entity *circ = SK.GetEntity(he);
+
+ Vector center = SK.GetEntity(circ->point[0])->PointGetNum();
+ double r = circ->CircleGetRadiusNum();
+ Quaternion q = circ->Normal()->NormalGetNum();
+ Vector u = q.RotationU(), v = q.RotationV();
+
+ double theta;
+ if(circ->type == Entity::CIRCLE) {
+ theta = PI/2;
+ } else if(circ->type == Entity::ARC_OF_CIRCLE) {
+ double thetaa, thetab, dtheta;
+ circ->ArcGetAngles(&thetaa, &thetab, &dtheta);
+ theta = thetaa + dtheta/2;
+ } else oops();
+
+ Vector d = u.ScaledBy(cos(theta)).Plus(v.ScaledBy(sin(theta)));
+ d = d.ScaledBy(r);
+ Vector p = center.Plus(d);
+ Vector tick = d.WithMagnitude(10/SS.GW.scale);
+ LineDrawOrGetDistance(p.Plus(tick), p.Minus(tick));
+}
+
+void Constraint::DoArcForAngle(Vector a0, Vector da, Vector b0, Vector db,
+ Vector offset, Vector *ref, bool trim)
+{
+ Vector gr = SS.GW.projRight.ScaledBy(1.0);
+ Vector gu = SS.GW.projUp.ScaledBy(1.0);
+
+ if(workplane.v != Entity::FREE_IN_3D.v) {
+ a0 = a0.ProjectInto(workplane);
+ b0 = b0.ProjectInto(workplane);
+ da = da.ProjectVectorInto(workplane);
+ db = db.ProjectVectorInto(workplane);
+ }
+
+ double px = 1.0 / SS.GW.scale;
+ Vector a1 = a0.Plus(da);
+ Vector b1 = b0.Plus(db);
+
+ bool skew;
+ Vector pi = Vector::AtIntersectionOfLines(a0, a0.Plus(da),
+ b0, b0.Plus(db), &skew);
+
+ if(!skew) {
+ *ref = pi.Plus(offset);
+ // We draw in a coordinate system centered at the intersection point.
+ // One basis vector is da, and the other is normal to da and in
+ // the plane that contains our lines (so normal to its normal).
+ da = da.WithMagnitude(1);
+ db = db.WithMagnitude(1);
+
+ Vector norm = da.Cross(db);
+
+ Vector dna = norm.Cross(da).WithMagnitude(1.0);
+ Vector dnb = norm.Cross(db).WithMagnitude(1.0);
+
+ // da and db magnitudes are 1.0
+ double thetaf = acos(da.Dot(db));
+
+ // Calculate median
+ Vector m = da.ScaledBy(cos(thetaf/2)).Plus(
+ dna.ScaledBy(sin(thetaf/2)));
+ Vector rm = (*ref).Minus(pi);
+
+ // Test which side we have to place an arc
+ if(m.Dot(rm) < 0) {
+ da = da.ScaledBy(-1); dna = dna.ScaledBy(-1);
+ db = db.ScaledBy(-1); dnb = dnb.ScaledBy(-1);
+ }
+
+ double rda = rm.Dot(da), rdna = rm.Dot(dna);
+
+ // Introduce minimal arc radius in pixels
+ double r = max(sqrt(rda*rda + rdna*rdna), 15.0 * px);
+
+ hStyle hs = disp.style;
+ if(hs.v == 0) hs.v = Style::CONSTRAINT;
+ double th = Style::TextHeight(hs);
+ double swidth = ssglStrWidth(Label(), th) + 4.0 * px;
+ double sheight = ssglStrCapHeight(th) + 8.0 * px;
+ double textR = sqrt(swidth * swidth + sheight * sheight) / 2.0;
+ *ref = pi.Plus(rm.WithMagnitude(std::max(rm.Magnitude(), 15 * px + textR)));
+
+ // Arrow points
+ Vector apa = da. ScaledBy(r).Plus(pi);
+ Vector apb = da. ScaledBy(r*cos(thetaf)).Plus(
+ dna.ScaledBy(r*sin(thetaf))).Plus(pi);
+
+ double arrowW = 13 * px;
+ double arrowA = 18.0 * PI / 180.0;
+ bool arrowVisible = apb.Minus(apa).Magnitude() > 2.5 * arrowW;
+ // Arrow reversing indicator
+ bool arrowRev = false;
+
+ // The minimal extension length in angular representation
+ double extAngle = 18 * px / r;
+
+ // Arc additional angle
+ double addAngle = 0.0;
+ // Arc start angle
+ double startAngle = 0.0;
+
+ // Arc extension to db.
+ // We have just enlarge angle value.
+ if(HasLabel() && rm.Dot(dnb) > 0.0) {
+ // rm direction projected to plane with u = da, v = dna
+ Vector rmp = da.ScaledBy(rda).Plus(dna.ScaledBy(rdna)).WithMagnitude(1.0);
+ // rmp and db magnitudes are 1.0
+ addAngle = std::max(acos(rmp.Dot(db)), extAngle);
+
+ if(arrowVisible) {
+ startAngle = -extAngle;
+ addAngle += extAngle;
+ arrowRev = true;
+ }
+ }
+
+ // Arc extension to da.
+ // We are enlarge angle value and rewrite basis to align along rm projection.
+ if(HasLabel() && rm.Dot(dna) < 0.0) {
+ // rm direction projected to plane with u = da, v = dna
+ Vector rmp = da.ScaledBy(rda).Plus(dna.ScaledBy(rdna)).WithMagnitude(1.0);
+ // rmp and da magnitudes are 1.0
+ startAngle = -std::max(acos(rmp.Dot(da)), extAngle);
+ addAngle = -startAngle;
+
+ if(arrowVisible) {
+ addAngle += extAngle;
+ arrowRev = true;
+ }
+ }
+
+ Vector prev;
+ int n = 30;
+ for(int i = 0; i <= n; i++) {
+ double theta = startAngle + (i*(thetaf + addAngle))/n;
+ Vector p = da.ScaledBy(r*cos(theta)).Plus(
+ dna.ScaledBy(r*sin(theta))).Plus(pi);
+ if(i > 0) {
+ if(trim) {
+ DoLineTrimmedAgainstBox(*ref, prev, p, false, gr, gu, swidth, sheight);
+ } else {
+ LineDrawOrGetDistance(prev, p);
+ }
+ }
+ prev = p;
+ }
+
+ DoLineExtend(a0, a1, apa, 5.0 * px);
+ DoLineExtend(b0, b1, apb, 5.0 * px);
+
+ // Draw arrows only when we have enough space.
+ if(arrowVisible) {
+ double angleCorr = arrowW / (2.0 * r);
+ if(arrowRev) {
+ dna = dna.ScaledBy(-1.0);
+ angleCorr = -angleCorr;
+ }
+ DoArrow(apa, dna, norm, arrowW, arrowA, angleCorr);
+ DoArrow(apb, dna, norm, arrowW, arrowA, thetaf + PI - angleCorr);
+ }
+ } else {
+ // The lines are skew; no wonderful way to illustrate that.
+ *ref = a0.Plus(b0);
+ *ref = (*ref).ScaledBy(0.5).Plus(disp.offset);
+ gu = gu.WithMagnitude(1);
+ Vector trans =
+ (*ref).Plus(gu.ScaledBy(-1.5*ssglStrCapHeight(Style::DefaultTextHeight())));
+ ssglWriteTextRefCenter("angle between skew lines", Style::DefaultTextHeight(),
+ trans, gr.WithMagnitude(px), gu.WithMagnitude(px), LineCallback, this);
+ }
+}
+
+bool Constraint::IsVisible() const {
+ if(!SS.GW.showConstraints) return false;
+ Group *g = SK.GetGroup(group);
+ // If the group is hidden, then the constraints are hidden and not
+ // able to be selected.
+ if(!(g->visible)) return false;
+ // And likewise if the group is not the active group; except for comments
+ // with an assigned style.
+ if(g->h.v != SS.GW.activeGroup.v && !(type == COMMENT && disp.style.v)) {
+ return false;
+ }
+ if(disp.style.v) {
+ Style *s = Style::Get(disp.style);
+ if(!s->visible) return false;
+ }
+ return true;
+}
+
+bool Constraint::DoLineExtend(Vector p0, Vector p1, Vector pt, double salient) {
+ Vector dir = p1.Minus(p0);
+ double k = dir.Dot(pt.Minus(p0)) / dir.Dot(dir);
+ Vector ptOnLine = p0.Plus(dir.ScaledBy(k));
+
+ // Draw projection line.
+ LineDrawOrGetDistance(pt, ptOnLine);
+
+ // Calculate salient direction.
+ Vector sd = dir.WithMagnitude(1.0).ScaledBy(salient);
+
+ Vector from;
+ Vector to;
+
+ if(k < 0.0) {
+ from = p0;
+ to = ptOnLine.Minus(sd);
+ } else if(k > 1.0) {
+ from = p1;
+ to = ptOnLine.Plus(sd);
+ } else {
+ return false;
+ }
+
+ // Draw extension line.
+ LineDrawOrGetDistance(from, to);
+ return true;
+}
+
+void Constraint::DrawOrGetDistance(Vector *labelPos) {
+
+ if(!IsVisible()) return;
+
+ // Unit vectors that describe our current view of the scene. One pixel
+ // long, not one actual unit.
+ Vector gr = SS.GW.projRight.ScaledBy(1/SS.GW.scale);
+ Vector gu = SS.GW.projUp.ScaledBy(1/SS.GW.scale);
+ Vector gn = (gr.Cross(gu)).WithMagnitude(1/SS.GW.scale);
+
+ switch(type) {
+ case PT_PT_DISTANCE: {
+ Vector ap = SK.GetEntity(ptA)->PointGetNum();
+ Vector bp = SK.GetEntity(ptB)->PointGetNum();
+
+ if(workplane.v != Entity::FREE_IN_3D.v) {
+ DoProjectedPoint(&ap);
+ DoProjectedPoint(&bp);
+ }
+
+ Vector ref = ((ap.Plus(bp)).ScaledBy(0.5)).Plus(disp.offset);
+
+ DoLineWithArrows(ref, ap, bp, false);
+ DoLabel(ref, labelPos, gr, gu);
+ break;
+ }
+
+ case PROJ_PT_DISTANCE: {
+ Vector ap = SK.GetEntity(ptA)->PointGetNum(),
+ bp = SK.GetEntity(ptB)->PointGetNum(),
+ dp = (bp.Minus(ap)),
+ pp = SK.GetEntity(entityA)->VectorGetNum();
+
+ Vector ref = ((ap.Plus(bp)).ScaledBy(0.5)).Plus(disp.offset);
+
+ pp = pp.WithMagnitude(1);
+ double d = dp.Dot(pp);
+ Vector bpp = ap.Plus(pp.ScaledBy(d));
+ StippledLine(ap, bpp);
+ StippledLine(bp, bpp);
+
+ DoLineWithArrows(ref, ap, bpp, false);
+ DoLabel(ref, labelPos, gr, gu);
+ break;
+ }
+
+ case PT_FACE_DISTANCE:
+ case PT_PLANE_DISTANCE: {
+ Vector pt = SK.GetEntity(ptA)->PointGetNum();
+ Entity *enta = SK.GetEntity(entityA);
+ Vector n, p;
+ if(type == PT_PLANE_DISTANCE) {
+ n = enta->Normal()->NormalN();
+ p = enta->WorkplaneGetOffset();
+ } else {
+ n = enta->FaceGetNormalNum();
+ p = enta->FaceGetPointNum();
+ }
+
+ double d = (p.Minus(pt)).Dot(n);
+ Vector closest = pt.Plus(n.WithMagnitude(d));
+
+ Vector ref = ((closest.Plus(pt)).ScaledBy(0.5)).Plus(disp.offset);
+
+ if(!pt.Equals(closest)) {
+ DoLineWithArrows(ref, pt, closest, true);
+ }
+
+ DoLabel(ref, labelPos, gr, gu);
+ break;
+ }
+
+ case PT_LINE_DISTANCE: {
+ Vector pt = SK.GetEntity(ptA)->PointGetNum();
+ Entity *line = SK.GetEntity(entityA);
+ Vector lA = SK.GetEntity(line->point[0])->PointGetNum();
+ Vector lB = SK.GetEntity(line->point[1])->PointGetNum();
+ Vector dl = lB.Minus(lA);
+
+ if(workplane.v != Entity::FREE_IN_3D.v) {
+ lA = lA.ProjectInto(workplane);
+ lB = lB.ProjectInto(workplane);
+ DoProjectedPoint(&pt);
+ }
+
+ // Find the closest point on the line
+ Vector closest = pt.ClosestPointOnLine(lA, dl);
+
+ Vector ref = ((closest.Plus(pt)).ScaledBy(0.5)).Plus(disp.offset);
+ DoLabel(ref, labelPos, gr, gu);
+
+ if(!pt.Equals(closest)) {
+ DoLineWithArrows(ref, pt, closest, true);
+
+ // Extensions to line
+ double pixels = 1.0 / SS.GW.scale;
+ Vector refClosest = ref.ClosestPointOnLine(lA, dl);
+ double ddl = dl.Dot(dl);
+ if(fabs(ddl) > LENGTH_EPS * LENGTH_EPS) {
+ double t = refClosest.Minus(lA).Dot(dl) / ddl;
+ if(t < 0.0) {
+ LineDrawOrGetDistance(refClosest.Minus(dl.WithMagnitude(10.0 * pixels)), lA);
+ } else if(t > 1.0) {
+ LineDrawOrGetDistance(refClosest.Plus(dl.WithMagnitude(10.0 * pixels)), lB);
+ }
+ }
+ }
+
+ if(workplane.v != Entity::FREE_IN_3D.v) {
+ // Draw the projection marker from the closest point on the
+ // projected line to the projected point on the real line.
+ Vector lAB = (lA.Minus(lB));
+ double t = (lA.Minus(closest)).DivPivoting(lAB);
+
+ Vector lA = SK.GetEntity(line->point[0])->PointGetNum();
+ Vector lB = SK.GetEntity(line->point[1])->PointGetNum();
+
+ Vector c2 = (lA.ScaledBy(1-t)).Plus(lB.ScaledBy(t));
+ DoProjectedPoint(&c2);
+ }
+ break;
+ }
+
+ case DIAMETER: {
+ Entity *circle = SK.GetEntity(entityA);
+ Vector center = SK.GetEntity(circle->point[0])->PointGetNum();
+ Quaternion q = SK.GetEntity(circle->normal)->NormalGetNum();
+ Vector n = q.RotationN().WithMagnitude(1);
+ double r = circle->CircleGetRadiusNum();
+
+ Vector ref = center.Plus(disp.offset);
+ // Force the label into the same plane as the circle.
+ ref = ref.Minus(n.ScaledBy(n.Dot(ref) - n.Dot(center)));
+
+ Vector mark = ref.Minus(center);
+ mark = mark.WithMagnitude(mark.Magnitude()-r);
+ DoLineTrimmedAgainstBox(ref, ref, ref.Minus(mark));
+
+ Vector topLeft;
+ DoLabel(ref, &topLeft, gr, gu);
+ if(labelPos) *labelPos = topLeft;
+ break;
+ }
+
+ case POINTS_COINCIDENT: {
+ if(!dogd.drawing) {
+ for(int i = 0; i < 2; i++) {
+ Vector p = SK.GetEntity(i == 0 ? ptA : ptB)-> PointGetNum();
+ Point2d pp = SS.GW.ProjectPoint(p);
+ // The point is selected within a radius of 7, from the
+ // same center; so if the point is visible, then this
+ // constraint cannot be selected. But that's okay.
+ dogd.dmin = min(dogd.dmin, pp.DistanceTo(dogd.mp) - 3);
+ dogd.refp = p;
+ }
+ break;
+ }
+
+ if(dogd.drawing) {
+ // Let's adjust the color of this constraint to have the same
+ // rough luma as the point color, so that the constraint does not
+ // stand out in an ugly way.
+ RgbaColor cd = Style::Color(Style::DATUM),
+ cc = Style::Color(Style::CONSTRAINT);
+ // convert from 8-bit color to a vector
+ Vector vd = Vector::From(cd.redF(), cd.greenF(), cd.blueF()),
+ vc = Vector::From(cc.redF(), cc.greenF(), cc.blueF());
+ // and scale the constraint color to have the same magnitude as
+ // the datum color, maybe a bit dimmer
+ vc = vc.WithMagnitude(vd.Magnitude()*0.9);
+ // and set the color to that.
+ ssglColorRGB(RGBf(vc.x, vc.y, vc.z));
+
+ for(int a = 0; a < 2; a++) {
+ Vector r = SS.GW.projRight.ScaledBy((a+1)/SS.GW.scale);
+ Vector d = SS.GW.projUp.ScaledBy((2-a)/SS.GW.scale);
+ for(int i = 0; i < 2; i++) {
+ Vector p = SK.GetEntity(i == 0 ? ptA : ptB)-> PointGetNum();
+ glBegin(GL_QUADS);
+ ssglVertex3v(p.Plus (r).Plus (d));
+ ssglVertex3v(p.Plus (r).Minus(d));
+ ssglVertex3v(p.Minus(r).Minus(d));
+ ssglVertex3v(p.Minus(r).Plus (d));
+ glEnd();
+ }
+
+ }
+ }
+ break;
+ }
+
+ case PT_ON_CIRCLE:
+ case PT_ON_LINE:
+ case PT_ON_FACE:
+ case PT_IN_PLANE: {
+ double s = 8/SS.GW.scale;
+ Vector p = SK.GetEntity(ptA)->PointGetNum();
+ Vector r, d;
+ if(type == PT_ON_FACE) {
+ Vector n = SK.GetEntity(entityA)->FaceGetNormalNum();
+ r = n.Normal(0);
+ d = n.Normal(1);
+ } else if(type == PT_IN_PLANE) {
+ EntityBase *n = SK.GetEntity(entityA)->Normal();
+ r = n->NormalU();
+ d = n->NormalV();
+ } else {
+ r = gr;
+ d = gu;
+ s *= (6.0/8); // draw these a little smaller
+ }
+ r = r.WithMagnitude(s); d = d.WithMagnitude(s);
+ LineDrawOrGetDistance(p.Plus (r).Plus (d), p.Plus (r).Minus(d));
+ LineDrawOrGetDistance(p.Plus (r).Minus(d), p.Minus(r).Minus(d));
+ LineDrawOrGetDistance(p.Minus(r).Minus(d), p.Minus(r).Plus (d));
+ LineDrawOrGetDistance(p.Minus(r).Plus (d), p.Plus (r).Plus (d));
+ break;
+ }
+
+ case WHERE_DRAGGED: {
+ Vector p = SK.GetEntity(ptA)->PointGetNum(),
+ u = p.Plus(gu.WithMagnitude(8/SS.GW.scale)).Plus(
+ gr.WithMagnitude(8/SS.GW.scale)),
+ uu = u.Minus(gu.WithMagnitude(5/SS.GW.scale)),
+ ur = u.Minus(gr.WithMagnitude(5/SS.GW.scale));
+ // Draw four little crop marks, uniformly spaced (by ninety
+ // degree rotations) around the point.
+ int i;
+ for(i = 0; i < 4; i++) {
+ LineDrawOrGetDistance(u, uu);
+ LineDrawOrGetDistance(u, ur);
+ u = u.RotatedAbout(p, gn, PI/2);
+ ur = ur.RotatedAbout(p, gn, PI/2);
+ uu = uu.RotatedAbout(p, gn, PI/2);
+ }
+ break;
+ }
+
+ case SAME_ORIENTATION: {
+ for(int i = 0; i < 2; i++) {
+ Entity *e = SK.GetEntity(i == 0 ? entityA : entityB);
+ Quaternion q = e->NormalGetNum();
+ Vector n = q.RotationN().WithMagnitude(25/SS.GW.scale);
+ Vector u = q.RotationU().WithMagnitude(6/SS.GW.scale);
+ Vector p = SK.GetEntity(e->point[0])->PointGetNum();
+ p = p.Plus(n.WithMagnitude(10/SS.GW.scale));
+
+ LineDrawOrGetDistance(p.Plus(u), p.Minus(u).Plus(n));
+ LineDrawOrGetDistance(p.Minus(u), p.Plus(u).Plus(n));
+ }
+ break;
+ }
+
+ case EQUAL_ANGLE: {
+ Vector ref;
+ Entity *a = SK.GetEntity(entityA);
+ Entity *b = SK.GetEntity(entityB);
+ Entity *c = SK.GetEntity(entityC);
+ Entity *d = SK.GetEntity(entityD);
+
+ Vector a0 = a->VectorGetStartPoint();
+ Vector b0 = b->VectorGetStartPoint();
+ Vector c0 = c->VectorGetStartPoint();
+ Vector d0 = d->VectorGetStartPoint();
+ Vector da = a->VectorGetNum();
+ Vector db = b->VectorGetNum();
+ Vector dc = c->VectorGetNum();
+ Vector dd = d->VectorGetNum();
+
+ if(other) {
+ a0 = a0.Plus(da);
+ da = da.ScaledBy(-1);
+ }
+
+ DoArcForAngle(a0, da, b0, db,
+ da.WithMagnitude(40/SS.GW.scale), &ref, /*trim=*/false);
+ DoArcForAngle(c0, dc, d0, dd,
+ dc.WithMagnitude(40/SS.GW.scale), &ref, /*trim=*/false);
+
+ break;
+ }
+
+ case ANGLE: {
+ Entity *a = SK.GetEntity(entityA);
+ Entity *b = SK.GetEntity(entityB);
+
+ Vector a0 = a->VectorGetStartPoint();
+ Vector b0 = b->VectorGetStartPoint();
+ Vector da = a->VectorGetNum();
+ Vector db = b->VectorGetNum();
+ if(other) {
+ a0 = a0.Plus(da);
+ da = da.ScaledBy(-1);
+ }
+
+ Vector ref;
+ DoArcForAngle(a0, da, b0, db, disp.offset, &ref, /*trim=*/true);
+ DoLabel(ref, labelPos, gr, gu);
+ break;
+ }
+
+ case PERPENDICULAR: {
+ Vector u = Vector::From(0, 0, 0), v = Vector::From(0, 0, 0);
+ Vector rn, ru;
+ if(workplane.v == Entity::FREE_IN_3D.v) {
+ rn = gn;
+ ru = gu;
+ } else {
+ EntityBase *normal = SK.GetEntity(workplane)->Normal();
+ rn = normal->NormalN();
+ ru = normal->NormalV(); // ru meaning r_up, not u/v
+ }
+
+ for(int i = 0; i < 2; i++) {
+ Entity *e = SK.GetEntity(i == 0 ? entityA : entityB);
+
+ if(i == 0) {
+ // Calculate orientation of perpendicular sign only
+ // once, so that it's the same both times it's drawn
+ u = e->VectorGetNum();
+ u = u.WithMagnitude(16/SS.GW.scale);
+ v = (rn.Cross(u)).WithMagnitude(16/SS.GW.scale);
+ // a bit of bias to stop it from flickering between the
+ // two possibilities
+ if(fabs(u.Dot(ru)) < fabs(v.Dot(ru)) + LENGTH_EPS) {
+ swap(u, v);
+ }
+ if(u.Dot(ru) < 0) u = u.ScaledBy(-1);
+ }
+
+ Vector p = e->VectorGetRefPoint();
+ Vector s = p.Plus(u).Plus(v);
+ LineDrawOrGetDistance(s, s.Plus(v));
+
+ Vector m = s.Plus(v.ScaledBy(0.5));
+ LineDrawOrGetDistance(m, m.Plus(u));
+ }
+ break;
+ }
+
+ case CURVE_CURVE_TANGENT:
+ case CUBIC_LINE_TANGENT:
+ case ARC_LINE_TANGENT: {
+ Vector textAt, u, v;
+
+ if(type == ARC_LINE_TANGENT) {
+ Entity *arc = SK.GetEntity(entityA);
+ Entity *norm = SK.GetEntity(arc->normal);
+ Vector c = SK.GetEntity(arc->point[0])->PointGetNum();
+ Vector p =
+ SK.GetEntity(arc->point[other ? 2 : 1])->PointGetNum();
+ Vector r = p.Minus(c);
+ textAt = p.Plus(r.WithMagnitude(14/SS.GW.scale));
+ u = norm->NormalU();
+ v = norm->NormalV();
+ } else if(type == CUBIC_LINE_TANGENT) {
+ Vector n;
+ if(workplane.v == Entity::FREE_IN_3D.v) {
+ u = gr;
+ v = gu;
+ n = gn;
+ } else {
+ EntityBase *wn = SK.GetEntity(workplane)->Normal();
+ u = wn->NormalU();
+ v = wn->NormalV();
+ n = wn->NormalN();
+ }
+
+ Entity *cubic = SK.GetEntity(entityA);
+ Vector p = other ? cubic->CubicGetFinishNum() :
+ cubic->CubicGetStartNum();
+ Vector dir = SK.GetEntity(entityB)->VectorGetNum();
+ Vector out = n.Cross(dir);
+ textAt = p.Plus(out.WithMagnitude(14/SS.GW.scale));
+ } else {
+ Vector n, dir;
+ EntityBase *wn = SK.GetEntity(workplane)->Normal();
+ u = wn->NormalU();
+ v = wn->NormalV();
+ n = wn->NormalN();
+ EntityBase *eA = SK.GetEntity(entityA);
+ // Big pain; we have to get a vector tangent to the curve
+ // at the shared point, which could be from either a cubic
+ // or an arc.
+ if(other) {
+ textAt = eA->EndpointFinish();
+ if(eA->type == Entity::CUBIC) {
+ dir = eA->CubicGetFinishTangentNum();
+ } else {
+ dir = SK.GetEntity(eA->point[0])->PointGetNum().Minus(
+ SK.GetEntity(eA->point[2])->PointGetNum());
+ dir = n.Cross(dir);
+ }
+ } else {
+ textAt = eA->EndpointStart();
+ if(eA->type == Entity::CUBIC) {
+ dir = eA->CubicGetStartTangentNum();
+ } else {
+ dir = SK.GetEntity(eA->point[0])->PointGetNum().Minus(
+ SK.GetEntity(eA->point[1])->PointGetNum());
+ dir = n.Cross(dir);
+ }
+ }
+ dir = n.Cross(dir);
+ textAt = textAt.Plus(dir.WithMagnitude(14/SS.GW.scale));
+ }
+
+ if(dogd.drawing) {
+ ssglWriteTextRefCenter("T", Style::DefaultTextHeight(),
+ textAt, u, v, LineCallback, this);
+ } else {
+ dogd.refp = textAt;
+ Point2d ref = SS.GW.ProjectPoint(dogd.refp);
+ dogd.dmin = min(dogd.dmin, ref.DistanceTo(dogd.mp)-10);
+ }
+ break;
+ }
+
+ case PARALLEL: {
+ for(int i = 0; i < 2; i++) {
+ Entity *e = SK.GetEntity(i == 0 ? entityA : entityB);
+ Vector n = e->VectorGetNum();
+ n = n.WithMagnitude(25/SS.GW.scale);
+ Vector u = (gn.Cross(n)).WithMagnitude(4/SS.GW.scale);
+ Vector p = e->VectorGetRefPoint();
+
+ LineDrawOrGetDistance(p.Plus(u), p.Plus(u).Plus(n));
+ LineDrawOrGetDistance(p.Minus(u), p.Minus(u).Plus(n));
+ }
+ break;
+ }
+
+ case EQUAL_RADIUS: {
+ for(int i = 0; i < 2; i++) {
+ DoEqualRadiusTicks(i == 0 ? entityA : entityB);
+ }
+ break;
+ }
+
+ case EQUAL_LINE_ARC_LEN: {
+ Entity *line = SK.GetEntity(entityA);
+ DoEqualLenTicks(
+ SK.GetEntity(line->point[0])->PointGetNum(),
+ SK.GetEntity(line->point[1])->PointGetNum(),
+ gn);
+
+ DoEqualRadiusTicks(entityB);
+ break;
+ }
+
+ case LENGTH_RATIO:
+ case LENGTH_DIFFERENCE:
+ case EQUAL_LENGTH_LINES: {
+ Vector a, b = Vector::From(0, 0, 0);
+ for(int i = 0; i < 2; i++) {
+ Entity *e = SK.GetEntity(i == 0 ? entityA : entityB);
+ a = SK.GetEntity(e->point[0])->PointGetNum();
+ b = SK.GetEntity(e->point[1])->PointGetNum();
+
+ if(workplane.v != Entity::FREE_IN_3D.v) {
+ DoProjectedPoint(&a);
+ DoProjectedPoint(&b);
+ }
+
+ DoEqualLenTicks(a, b, gn);
+ }
+ if((type == LENGTH_RATIO) || (type == LENGTH_DIFFERENCE)) {
+ Vector ref = ((a.Plus(b)).ScaledBy(0.5)).Plus(disp.offset);
+ DoLabel(ref, labelPos, gr, gu);
+ }
+ break;
+ }
+
+ case EQ_LEN_PT_LINE_D: {
+ Entity *forLen = SK.GetEntity(entityA);
+ Vector a = SK.GetEntity(forLen->point[0])->PointGetNum(),
+ b = SK.GetEntity(forLen->point[1])->PointGetNum();
+ if(workplane.v != Entity::FREE_IN_3D.v) {
+ DoProjectedPoint(&a);
+ DoProjectedPoint(&b);
+ }
+ DoEqualLenTicks(a, b, gn);
+
+ Entity *ln = SK.GetEntity(entityB);
+ Vector la = SK.GetEntity(ln->point[0])->PointGetNum(),
+ lb = SK.GetEntity(ln->point[1])->PointGetNum();
+ Vector pt = SK.GetEntity(ptA)->PointGetNum();
+ if(workplane.v != Entity::FREE_IN_3D.v) {
+ DoProjectedPoint(&pt);
+ la = la.ProjectInto(workplane);
+ lb = lb.ProjectInto(workplane);
+ }
+
+ Vector closest = pt.ClosestPointOnLine(la, lb.Minus(la));
+ LineDrawOrGetDistance(pt, closest);
+ DoEqualLenTicks(pt, closest, gn);
+ break;
+ }
+
+ case EQ_PT_LN_DISTANCES: {
+ for(int i = 0; i < 2; i++) {
+ Entity *ln = SK.GetEntity(i == 0 ? entityA : entityB);
+ Vector la = SK.GetEntity(ln->point[0])->PointGetNum(),
+ lb = SK.GetEntity(ln->point[1])->PointGetNum();
+ Entity *pte = SK.GetEntity(i == 0 ? ptA : ptB);
+ Vector pt = pte->PointGetNum();
+
+ if(workplane.v != Entity::FREE_IN_3D.v) {
+ DoProjectedPoint(&pt);
+ la = la.ProjectInto(workplane);
+ lb = lb.ProjectInto(workplane);
+ }
+
+ Vector closest = pt.ClosestPointOnLine(la, lb.Minus(la));
+
+ LineDrawOrGetDistance(pt, closest);
+ DoEqualLenTicks(pt, closest, gn);
+ }
+ break;
+ }
+
+ {
+ case SYMMETRIC:
+ Vector n;
+ n = SK.GetEntity(entityA)->Normal()->NormalN(); goto s;
+ case SYMMETRIC_HORIZ:
+ n = SK.GetEntity(workplane)->Normal()->NormalU(); goto s;
+ case SYMMETRIC_VERT:
+ n = SK.GetEntity(workplane)->Normal()->NormalV(); goto s;
+ case SYMMETRIC_LINE: {
+ Entity *ln = SK.GetEntity(entityA);
+ Vector la = SK.GetEntity(ln->point[0])->PointGetNum(),
+ lb = SK.GetEntity(ln->point[1])->PointGetNum();
+ la = la.ProjectInto(workplane);
+ lb = lb.ProjectInto(workplane);
+ n = lb.Minus(la);
+ Vector nw = SK.GetEntity(workplane)->Normal()->NormalN();
+ n = n.RotatedAbout(nw, PI/2);
+ goto s;
+ }
+s:
+ Vector a = SK.GetEntity(ptA)->PointGetNum();
+ Vector b = SK.GetEntity(ptB)->PointGetNum();
+
+ for(int i = 0; i < 2; i++) {
+ Vector tail = (i == 0) ? a : b;
+ Vector d = (i == 0) ? b : a;
+ d = d.Minus(tail);
+ // Project the direction in which the arrow is drawn normal
+ // to the symmetry plane; for projected symmetry constraints,
+ // they might not be in the same direction, even when the
+ // constraint is fully solved.
+ d = n.ScaledBy(d.Dot(n));
+ d = d.WithMagnitude(20/SS.GW.scale);
+ Vector tip = tail.Plus(d);
+
+ LineDrawOrGetDistance(tail, tip);
+ d = d.WithMagnitude(9/SS.GW.scale);
+ LineDrawOrGetDistance(tip, tip.Minus(d.RotatedAbout(gn, 0.6)));
+ LineDrawOrGetDistance(tip, tip.Minus(d.RotatedAbout(gn, -0.6)));
+ }
+ break;
+ }
+
+ case AT_MIDPOINT:
+ case HORIZONTAL:
+ case VERTICAL:
+ if(entityA.v) {
+ Vector r, u, n;
+ if(workplane.v == Entity::FREE_IN_3D.v) {
+ r = gr; u = gu; n = gn;
+ } else {
+ r = SK.GetEntity(workplane)->Normal()->NormalU();
+ u = SK.GetEntity(workplane)->Normal()->NormalV();
+ n = r.Cross(u);
+ }
+ // For "at midpoint", this branch is always taken.
+ Entity *e = SK.GetEntity(entityA);
+ Vector a = SK.GetEntity(e->point[0])->PointGetNum();
+ Vector b = SK.GetEntity(e->point[1])->PointGetNum();
+ Vector m = (a.ScaledBy(0.5)).Plus(b.ScaledBy(0.5));
+ Vector offset = (a.Minus(b)).Cross(n);
+ offset = offset.WithMagnitude(13/SS.GW.scale);
+ // Draw midpoint constraint on other side of line, so that
+ // a line can be midpoint and horizontal at same time.
+ if(type == AT_MIDPOINT) offset = offset.ScaledBy(-1);
+
+ if(dogd.drawing) {
+ const char *s = (type == HORIZONTAL) ? "H" : (
+ (type == VERTICAL) ? "V" : (
+ (type == AT_MIDPOINT) ? "M" : NULL));
+
+ ssglWriteTextRefCenter(s, Style::DefaultTextHeight(),
+ m.Plus(offset), r, u, LineCallback, this);
+ } else {
+ dogd.refp = m.Plus(offset);
+ Point2d ref = SS.GW.ProjectPoint(dogd.refp);
+ dogd.dmin = min(dogd.dmin, ref.DistanceTo(dogd.mp)-10);
+ }
+ } else {
+ Vector a = SK.GetEntity(ptA)->PointGetNum();
+ Vector b = SK.GetEntity(ptB)->PointGetNum();
+
+ Entity *w = SK.GetEntity(workplane);
+ Vector cu = w->Normal()->NormalU();
+ Vector cv = w->Normal()->NormalV();
+ Vector cn = w->Normal()->NormalN();
+
+ int i;
+ for(i = 0; i < 2; i++) {
+ Vector o = (i == 0) ? a : b;
+ Vector oo = (i == 0) ? a.Minus(b) : b.Minus(a);
+ Vector d = (type == HORIZONTAL) ? cu : cv;
+ if(oo.Dot(d) < 0) d = d.ScaledBy(-1);
+
+ Vector dp = cn.Cross(d);
+ d = d.WithMagnitude(14/SS.GW.scale);
+ Vector c = o.Minus(d);
+ LineDrawOrGetDistance(o, c);
+ d = d.WithMagnitude(3/SS.GW.scale);
+ dp = dp.WithMagnitude(2/SS.GW.scale);
+ if(dogd.drawing) {
+ glBegin(GL_QUADS);
+ ssglVertex3v((c.Plus(d)).Plus(dp));
+ ssglVertex3v((c.Minus(d)).Plus(dp));
+ ssglVertex3v((c.Minus(d)).Minus(dp));
+ ssglVertex3v((c.Plus(d)).Minus(dp));
+ glEnd();
+ } else {
+ Point2d ref = SS.GW.ProjectPoint(c);
+ dogd.dmin = min(dogd.dmin, ref.DistanceTo(dogd.mp)-6);
+ }
+ }
+ }
+ break;
+
+ case COMMENT: {
+ if(dogd.drawing && disp.style.v) {
+ ssglLineWidth(Style::Width(disp.style));
+ ssglColorRGB(Style::Color(disp.style));
+ }
+ Vector u, v;
+ if(workplane.v == Entity::FREE_IN_3D.v) {
+ u = gr;
+ v = gu;
+ } else {
+ EntityBase *norm = SK.GetEntity(workplane)->Normal();
+ u = norm->NormalU();
+ v = norm->NormalV();
+ }
+ DoLabel(disp.offset, labelPos, u, v);
+ break;
+ }
+
+ default: oops();
+ }
+}
+
+void Constraint::Draw(void) {
+ dogd.drawing = true;
+ dogd.sel = NULL;
+ hStyle hs = GetStyle();
+
+ ssglLineWidth(Style::Width(hs));
+ ssglColorRGB(Style::Color(hs));
+
+ DrawOrGetDistance(NULL);
+}
+
+double Constraint::GetDistance(Point2d mp) {
+ dogd.drawing = false;
+ dogd.sel = NULL;
+ dogd.mp = mp;
+ dogd.dmin = 1e12;
+
+ DrawOrGetDistance(NULL);
+
+ return dogd.dmin;
+}
+
+Vector Constraint::GetLabelPos(void) {
+ dogd.drawing = false;
+ dogd.sel = NULL;
+ dogd.mp.x = 0; dogd.mp.y = 0;
+ dogd.dmin = 1e12;
+
+ Vector p;
+ DrawOrGetDistance(&p);
+ return p;
+}
+
+Vector Constraint::GetReferencePos(void) {
+ dogd.drawing = false;
+ dogd.sel = NULL;
+
+ dogd.refp = SS.GW.offset.ScaledBy(-1);
+ DrawOrGetDistance(NULL);
+
+ return dogd.refp;
+}
+
+void Constraint::GetEdges(SEdgeList *sel) {
+ dogd.drawing = true;
+ dogd.sel = sel;
+ DrawOrGetDistance(NULL);
+ dogd.sel = NULL;
+}
+
+bool Constraint::IsStylable() {
+ if(type == COMMENT) return true;
+ return false;
+}
+
+hStyle Constraint::GetStyle() const {
+ if(disp.style.v != 0) return disp.style;
+ return { Style::CONSTRAINT };
+}
+
+bool Constraint::HasLabel() {
+ switch(type) {
+ case COMMENT:
+ case PT_PT_DISTANCE:
+ case PT_PLANE_DISTANCE:
+ case PT_LINE_DISTANCE:
+ case PT_FACE_DISTANCE:
+ case PROJ_PT_DISTANCE:
+ case LENGTH_RATIO:
+ case LENGTH_DIFFERENCE:
+ case DIAMETER:
+ case ANGLE:
+ return true;
+
+ default:
+ return false;
+ }
+}
--- /dev/null
+//-----------------------------------------------------------------------------
+// Draw a representation of an entity on-screen, in the case of curves up
+// to our chord tolerance, or return the distance from the user's mouse pointer
+// to the entity for selection.
+//
+// Copyright 2008-2013 Jonathan Westhues.
+//-----------------------------------------------------------------------------
+#include "solvespace.h"
+
+std::string Entity::DescriptionString(void) {
+ if(h.isFromRequest()) {
+ Request *r = SK.GetRequest(h.request());
+ return r->DescriptionString();
+ } else {
+ Group *g = SK.GetGroup(h.group());
+ return g->DescriptionString();
+ }
+}
+
+void Entity::LineDrawOrGetDistance(Vector a, Vector b, bool maybeFat, int data) {
+ if(dogd.drawing) {
+ // Draw lines from active group in front of those from previous
+ ssglDepthRangeOffset((group.v == SS.GW.activeGroup.v) ? 4 : 3);
+ // Narrow lines are drawn as lines, but fat lines must be drawn as
+ // filled polygons, to get the line join style right.
+ ssglStippledLine(a, b, dogd.lineWidth, dogd.stippleType, dogd.stippleScale, maybeFat);
+ ssglDepthRangeOffset(0);
+ } else {
+ Point2d ap = SS.GW.ProjectPoint(a);
+ Point2d bp = SS.GW.ProjectPoint(b);
+
+ double d = dogd.mp.DistanceToLine(ap, bp.Minus(ap), true);
+ // A little bit easier to select in the active group
+ if(group.v == SS.GW.activeGroup.v) d -= 1;
+ if(d < dogd.dmin) {
+ dogd.dmin = d;
+ dogd.data = data;
+ }
+ }
+ dogd.refp = (a.Plus(b)).ScaledBy(0.5);
+}
+
+void Entity::DrawAll(bool drawAsHidden) {
+ // This handles points as a special case, because I seem to be able
+ // to get a huge speedup that way, by consolidating stuff to gl.
+ int i;
+ if(SS.GW.showPoints) {
+ double s = 3.5/SS.GW.scale;
+ Vector r = SS.GW.projRight.ScaledBy(s);
+ Vector d = SS.GW.projUp.ScaledBy(s);
+ ssglColorRGB(Style::Color(Style::DATUM));
+ ssglDepthRangeOffset(6);
+ glBegin(GL_QUADS);
+ for(i = 0; i < SK.entity.n; i++) {
+ Entity *e = &(SK.entity.elem[i]);
+ if(!e->IsPoint()) continue;
+ if(!(SK.GetGroup(e->group)->IsVisible())) continue;
+ if(e->forceHidden) continue;
+
+ Vector v = e->PointGetNum();
+
+ // If we're analyzing the sketch to show the degrees of freedom,
+ // then we draw big colored squares over the points that are
+ // free to move.
+ bool free = false;
+ if(e->type == POINT_IN_3D) {
+ Param *px = SK.GetParam(e->param[0]),
+ *py = SK.GetParam(e->param[1]),
+ *pz = SK.GetParam(e->param[2]);
+
+ free = (px->free) || (py->free) || (pz->free);
+ } else if(e->type == POINT_IN_2D) {
+ Param *pu = SK.GetParam(e->param[0]),
+ *pv = SK.GetParam(e->param[1]);
+
+ free = (pu->free) || (pv->free);
+ }
+ if(free) {
+ Vector re = r.ScaledBy(2.5), de = d.ScaledBy(2.5);
+
+ ssglColorRGB(Style::Color(Style::ANALYZE));
+ ssglVertex3v(v.Plus (re).Plus (de));
+ ssglVertex3v(v.Plus (re).Minus(de));
+ ssglVertex3v(v.Minus(re).Minus(de));
+ ssglVertex3v(v.Minus(re).Plus (de));
+ ssglColorRGB(Style::Color(Style::DATUM));
+ }
+
+ ssglVertex3v(v.Plus (r).Plus (d));
+ ssglVertex3v(v.Plus (r).Minus(d));
+ ssglVertex3v(v.Minus(r).Minus(d));
+ ssglVertex3v(v.Minus(r).Plus (d));
+ }
+ glEnd();
+ ssglDepthRangeOffset(0);
+ }
+
+ for(i = 0; i < SK.entity.n; i++) {
+ Entity *e = &(SK.entity.elem[i]);
+ if(e->IsPoint()) {
+ continue; // already handled
+ }
+ e->Draw(drawAsHidden);
+ }
+}
+
+void Entity::Draw(bool drawAsHidden) {
+ hStyle hs = Style::ForEntity(h);
+ dogd.lineWidth = Style::Width(hs);
+ if(drawAsHidden) {
+ dogd.stippleType = Style::PatternType({ Style::HIDDEN_EDGE });
+ dogd.stippleScale = Style::StippleScaleMm({ Style::HIDDEN_EDGE });
+ } else {
+ dogd.stippleType = Style::PatternType(hs);
+ dogd.stippleScale = Style::StippleScaleMm(hs);
+ }
+ ssglLineWidth((float)dogd.lineWidth);
+ ssglColorRGB(Style::Color(hs));
+
+ dogd.drawing = true;
+ DrawOrGetDistance();
+}
+
+void Entity::GenerateEdges(SEdgeList *el, bool includingConstruction) {
+ if(construction && !includingConstruction) return;
+
+ SBezierList *sbl = GetOrGenerateBezierCurves();
+
+ int i, j;
+ for(i = 0; i < sbl->l.n; i++) {
+ SBezier *sb = &(sbl->l.elem[i]);
+
+ List<Vector> lv = {};
+ sb->MakePwlInto(&lv);
+ for(j = 1; j < lv.n; j++) {
+ el->AddEdge(lv.elem[j-1], lv.elem[j], style.v, i);
+ }
+ lv.Clear();
+ }
+
+}
+
+SBezierList *Entity::GetOrGenerateBezierCurves() {
+ if(beziers.l.n == 0)
+ GenerateBezierCurves(&beziers);
+ return &beziers;
+}
+
+SEdgeList *Entity::GetOrGenerateEdges() {
+ if(edges.l.n != 0) {
+ if(EXACT(edgesChordTol == SS.ChordTolMm()))
+ return &edges;
+ edges.l.Clear();
+ }
+ if(edges.l.n == 0)
+ GenerateEdges(&edges, /*includingConstruction=*/true);
+ edgesChordTol = SS.ChordTolMm();
+ return &edges;
+}
+
+BBox Entity::GetOrGenerateScreenBBox(bool *hasBBox) {
+ SBezierList *sbl = GetOrGenerateBezierCurves();
+
+ // We don't bother with bounding boxes for normals, workplanes, etc.
+ *hasBBox = (IsPoint() || sbl->l.n > 0);
+ if(!*hasBBox) return {};
+
+ if(screenBBoxValid)
+ return screenBBox;
+
+ if(IsPoint()) {
+ Vector proj = SS.GW.ProjectPoint3(PointGetNum());
+ screenBBox = BBox::From(proj, proj);
+ } else if(sbl->l.n > 0) {
+ Vector first = SS.GW.ProjectPoint3(sbl->l.elem[0].ctrl[0]);
+ screenBBox = BBox::From(first, first);
+ for(int i = 0; i < sbl->l.n; i++) {
+ SBezier *sb = &sbl->l.elem[i];
+ for(int i = 0; i <= sb->deg; i++) {
+ screenBBox.Include(SS.GW.ProjectPoint3(sb->ctrl[i]));
+ }
+ }
+ } else oops();
+
+ // Enlarge the bounding box to consider selection radius.
+ screenBBox.minp.x -= SELECTION_RADIUS;
+ screenBBox.minp.y -= SELECTION_RADIUS;
+ screenBBox.maxp.x += SELECTION_RADIUS;
+ screenBBox.maxp.y += SELECTION_RADIUS;
+
+ screenBBoxValid = true;
+ return screenBBox;
+}
+
+double Entity::GetDistance(Point2d mp) {
+ dogd.drawing = false;
+ dogd.mp = mp;
+ dogd.dmin = 1e12;
+
+ DrawOrGetDistance();
+
+ return dogd.dmin;
+}
+
+Vector Entity::GetReferencePos(void) {
+ dogd.drawing = false;
+
+ dogd.refp = SS.GW.offset.ScaledBy(-1);
+ DrawOrGetDistance();
+
+ return dogd.refp;
+}
+
+bool Entity::IsStylable() {
+ if(IsPoint()) return false;
+ if(IsWorkplane()) return false;
+ if(IsNormal()) return false;
+ return true;
+}
+
+bool Entity::IsVisible(void) {
+ Group *g = SK.GetGroup(group);
+
+ if(g->h.v == Group::HGROUP_REFERENCES.v && IsNormal()) {
+ // The reference normals are always shown
+ return true;
+ }
+ if(!(g->IsVisible())) return false;
+
+ // Don't check if points are hidden; this gets called only for
+ // selected or hovered points, and those should always be shown.
+ if(IsNormal() && !SS.GW.showNormals) return false;
+
+ if(!SS.GW.showWorkplanes) {
+ if(IsWorkplane() && !h.isFromRequest()) {
+ if(g->h.v != SS.GW.activeGroup.v) {
+ // The group-associated workplanes are hidden outside
+ // their group.
+ return false;
+ }
+ }
+ }
+
+ if(style.v) {
+ Style *s = Style::Get(style);
+ if(!s->visible) return false;
+ }
+
+ if(forceHidden) return false;
+
+ return true;
+}
+
+void Entity::CalculateNumerical(bool forExport) {
+ if(IsPoint()) actPoint = PointGetNum();
+ if(IsNormal()) actNormal = NormalGetNum();
+ if(type == DISTANCE || type == DISTANCE_N_COPY) {
+ actDistance = DistanceGetNum();
+ }
+ if(IsFace()) {
+ actPoint = FaceGetPointNum();
+ Vector n = FaceGetNormalNum();
+ actNormal = Quaternion::From(0, n.x, n.y, n.z);
+ }
+ if(forExport) {
+ // Visibility in copied linked entities follows source file
+ actVisible = IsVisible();
+ } else {
+ // Copied entities within a file are always visible
+ actVisible = true;
+ }
+}
+
+bool Entity::PointIsFromReferences(void) {
+ return h.request().IsFromReferences();
+}
+
+//-----------------------------------------------------------------------------
+// Compute a cubic, second derivative continuous, interpolating spline. Same
+// routine for periodic splines (in a loop) or open splines (with specified
+// end tangents).
+//-----------------------------------------------------------------------------
+void Entity::ComputeInterpolatingSpline(SBezierList *sbl, bool periodic) {
+ static const int MAX_N = BandedMatrix::MAX_UNKNOWNS;
+ int ep = extraPoints;
+
+ // The number of unknowns to solve for.
+ int n = periodic ? 3 + ep : ep;
+ if(n >= MAX_N) oops();
+ // The number of on-curve points, one more than the number of segments.
+ int pts = periodic ? 4 + ep : 2 + ep;
+
+ int i, j, a;
+
+ // The starting and finishing control points that define our end tangents
+ // (if the spline isn't periodic), and the on-curve points.
+ Vector ctrl_s = Vector::From(0, 0, 0);
+ Vector ctrl_f = Vector::From(0, 0, 0);
+ Vector pt[MAX_N+4];
+ if(periodic) {
+ for(i = 0; i < ep + 3; i++) {
+ pt[i] = SK.GetEntity(point[i])->PointGetNum();
+ }
+ pt[i++] = SK.GetEntity(point[0])->PointGetNum();
+ } else {
+ ctrl_s = SK.GetEntity(point[1])->PointGetNum();
+ ctrl_f = SK.GetEntity(point[ep+2])->PointGetNum();
+ j = 0;
+ pt[j++] = SK.GetEntity(point[0])->PointGetNum();
+ for(i = 2; i <= ep + 1; i++) {
+ pt[j++] = SK.GetEntity(point[i])->PointGetNum();
+ }
+ pt[j++] = SK.GetEntity(point[ep+3])->PointGetNum();
+ }
+
+ // The unknowns that we will be solving for, a set for each coordinate.
+ double Xx[MAX_N], Xy[MAX_N], Xz[MAX_N];
+ // For a cubic Bezier section f(t) as t goes from 0 to 1,
+ // f' (0) = 3*(P1 - P0)
+ // f' (1) = 3*(P3 - P2)
+ // f''(0) = 6*(P0 - 2*P1 + P2)
+ // f''(1) = 6*(P3 - 2*P2 + P1)
+ for(a = 0; a < 3; a++) {
+ BandedMatrix bm = {};
+ bm.n = n;
+
+ for(i = 0; i < n; i++) {
+ int im, it, ip;
+ if(periodic) {
+ im = WRAP(i - 1, n);
+ it = i;
+ ip = WRAP(i + 1, n);
+ } else {
+ im = i;
+ it = i + 1;
+ ip = i + 2;
+ }
+ // All of these are expressed in terms of a constant part, and
+ // of X[i-1], X[i], and X[i+1]; so let these be the four
+ // components of that vector;
+ Vector4 A, B, C, D, E;
+ // The on-curve interpolated point
+ C = Vector4::From((pt[it]).Element(a), 0, 0, 0);
+ // control point one back, C - X[i]
+ B = C.Plus(Vector4::From(0, 0, -1, 0));
+ // control point one forward, C + X[i]
+ D = C.Plus(Vector4::From(0, 0, 1, 0));
+ // control point two back
+ if(i == 0 && !periodic) {
+ A = Vector4::From(ctrl_s.Element(a), 0, 0, 0);
+ } else {
+ // pt[im] + X[i-1]
+ A = Vector4::From(pt[im].Element(a), 1, 0, 0);
+ }
+ // control point two forward
+ if(i == (n - 1) && !periodic) {
+ E = Vector4::From(ctrl_f.Element(a), 0, 0, 0);
+ } else {
+ // pt[ip] - X[i+1]
+ E = Vector4::From((pt[ip]).Element(a), 0, 0, -1);
+ }
+ // Write the second derivatives of each segment, dropping constant
+ Vector4 fprev_pp = (C.Minus(B.ScaledBy(2))).Plus(A),
+ fnext_pp = (C.Minus(D.ScaledBy(2))).Plus(E),
+ eq = fprev_pp.Minus(fnext_pp);
+
+ bm.B[i] = -eq.w;
+ if(periodic) {
+ bm.A[i][WRAP(i-2, n)] = eq.x;
+ bm.A[i][WRAP(i-1, n)] = eq.y;
+ bm.A[i][i] = eq.z;
+ } else {
+ // The wrapping would work, except when n = 1 and everything
+ // wraps to zero...
+ if(i > 0) bm.A[i][i - 1] = eq.x;
+ bm.A[i][i] = eq.y;
+ if(i < (n-1)) bm.A[i][i + 1] = eq.z;
+ }
+ }
+ bm.Solve();
+ double *X = (a == 0) ? Xx :
+ (a == 1) ? Xy :
+ Xz;
+ memcpy(X, bm.X, n*sizeof(double));
+ }
+
+ for(i = 0; i < pts - 1; i++) {
+ Vector p0, p1, p2, p3;
+ if(periodic) {
+ p0 = pt[i];
+ int iw = WRAP(i - 1, n);
+ p1 = p0.Plus(Vector::From(Xx[iw], Xy[iw], Xz[iw]));
+ } else if(i == 0) {
+ p0 = pt[0];
+ p1 = ctrl_s;
+ } else {
+ p0 = pt[i];
+ p1 = p0.Plus(Vector::From(Xx[i-1], Xy[i-1], Xz[i-1]));
+ }
+ if(periodic) {
+ p3 = pt[i+1];
+ int iw = WRAP(i, n);
+ p2 = p3.Minus(Vector::From(Xx[iw], Xy[iw], Xz[iw]));
+ } else if(i == (pts - 2)) {
+ p3 = pt[pts-1];
+ p2 = ctrl_f;
+ } else {
+ p3 = pt[i+1];
+ p2 = p3.Minus(Vector::From(Xx[i], Xy[i], Xz[i]));
+ }
+ SBezier sb = SBezier::From(p0, p1, p2, p3);
+ sbl->l.Add(&sb);
+ }
+}
+
+void Entity::GenerateBezierCurves(SBezierList *sbl) {
+ SBezier sb;
+
+ int i = sbl->l.n;
+
+ switch(type) {
+ case LINE_SEGMENT: {
+ Vector a = SK.GetEntity(point[0])->PointGetNum();
+ Vector b = SK.GetEntity(point[1])->PointGetNum();
+ sb = SBezier::From(a, b);
+ sb.entity = h.v;
+ sbl->l.Add(&sb);
+ break;
+ }
+ case CUBIC:
+ ComputeInterpolatingSpline(sbl, false);
+ break;
+
+ case CUBIC_PERIODIC:
+ ComputeInterpolatingSpline(sbl, true);
+ break;
+
+ case CIRCLE:
+ case ARC_OF_CIRCLE: {
+ Vector center = SK.GetEntity(point[0])->PointGetNum();
+ Quaternion q = SK.GetEntity(normal)->NormalGetNum();
+ Vector u = q.RotationU(), v = q.RotationV();
+ double r = CircleGetRadiusNum();
+ double thetaa, thetab, dtheta;
+
+ if(r < LENGTH_EPS) {
+ // If a circle or an arc gets dragged through zero radius,
+ // then we just don't generate anything.
+ break;
+ }
+
+ if(type == CIRCLE) {
+ thetaa = 0;
+ thetab = 2*PI;
+ dtheta = 2*PI;
+ } else {
+ ArcGetAngles(&thetaa, &thetab, &dtheta);
+ }
+ int i, n;
+ if(dtheta > (3*PI/2 + 0.01)) {
+ n = 4;
+ } else if(dtheta > (PI + 0.01)) {
+ n = 3;
+ } else if(dtheta > (PI/2 + 0.01)) {
+ n = 2;
+ } else {
+ n = 1;
+ }
+ dtheta /= n;
+
+ for(i = 0; i < n; i++) {
+ double s, c;
+
+ c = cos(thetaa);
+ s = sin(thetaa);
+ // The start point of the curve, and the tangent vector at
+ // that start point.
+ Vector p0 = center.Plus(u.ScaledBy( r*c)).Plus(v.ScaledBy(r*s)),
+ t0 = u.ScaledBy(-r*s). Plus(v.ScaledBy(r*c));
+
+ thetaa += dtheta;
+
+ c = cos(thetaa);
+ s = sin(thetaa);
+ Vector p2 = center.Plus(u.ScaledBy( r*c)).Plus(v.ScaledBy(r*s)),
+ t2 = u.ScaledBy(-r*s). Plus(v.ScaledBy(r*c));
+
+ // The control point must lie on both tangents.
+ Vector p1 = Vector::AtIntersectionOfLines(p0, p0.Plus(t0),
+ p2, p2.Plus(t2),
+ NULL);
+
+ SBezier sb = SBezier::From(p0, p1, p2);
+ sb.weight[1] = cos(dtheta/2);
+ sbl->l.Add(&sb);
+ }
+ break;
+ }
+
+ case TTF_TEXT: {
+ Vector topLeft = SK.GetEntity(point[0])->PointGetNum();
+ Vector botLeft = SK.GetEntity(point[1])->PointGetNum();
+ Vector n = Normal()->NormalN();
+ Vector v = topLeft.Minus(botLeft);
+ Vector u = (v.Cross(n)).WithMagnitude(v.Magnitude());
+
+ SS.fonts.PlotString(font, str, sbl, botLeft, u, v);
+ break;
+ }
+
+ default:
+ // Not a problem, points and normals and such don't generate curves
+ break;
+ }
+
+ // Record our style for all of the Beziers that we just created.
+ for(; i < sbl->l.n; i++) {
+ sbl->l.elem[i].auxA = style.v;
+ }
+}
+
+void Entity::DrawOrGetDistance(void) {
+ // If we're about to perform hit testing on an entity, consider
+ // whether the pointer is inside its bounding box first.
+ if(!dogd.drawing) {
+ bool hasBBox;
+ BBox box = GetOrGenerateScreenBBox(&hasBBox);
+ if(hasBBox && !box.Contains(dogd.mp))
+ return;
+ }
+
+ if(!IsVisible()) return;
+
+ switch(type) {
+ case POINT_N_COPY:
+ case POINT_N_TRANS:
+ case POINT_N_ROT_TRANS:
+ case POINT_N_ROT_AA:
+ case POINT_IN_3D:
+ case POINT_IN_2D: {
+ Vector v = PointGetNum();
+ dogd.refp = v;
+
+ if(dogd.drawing) {
+ double s = 3.5;
+ Vector r = SS.GW.projRight.ScaledBy(s/SS.GW.scale);
+ Vector d = SS.GW.projUp.ScaledBy(s/SS.GW.scale);
+
+ ssglColorRGB(Style::Color(Style::DATUM));
+ ssglDepthRangeOffset(6);
+ glBegin(GL_QUADS);
+ ssglVertex3v(v.Plus (r).Plus (d));
+ ssglVertex3v(v.Plus (r).Minus(d));
+ ssglVertex3v(v.Minus(r).Minus(d));
+ ssglVertex3v(v.Minus(r).Plus (d));
+ glEnd();
+ ssglDepthRangeOffset(0);
+ } else {
+ Point2d pp = SS.GW.ProjectPoint(v);
+ dogd.dmin = pp.DistanceTo(dogd.mp) - 6;
+ }
+ break;
+ }
+
+ case NORMAL_N_COPY:
+ case NORMAL_N_ROT:
+ case NORMAL_N_ROT_AA:
+ case NORMAL_IN_3D:
+ case NORMAL_IN_2D: {
+ int i;
+ for(i = 0; i < 2; i++) {
+ if(i == 0 && !SS.GW.showNormals) {
+ // When the normals are hidden, we will continue to show
+ // the coordinate axes at the bottom left corner, but
+ // not at the origin.
+ continue;
+ }
+
+ hRequest hr = h.request();
+ // Always draw the x, y, and z axes in red, green, and blue;
+ // brighter for the ones at the bottom left of the screen,
+ // dimmer for the ones at the model origin.
+ int f = (i == 0 ? 100 : 255);
+ if(hr.v == Request::HREQUEST_REFERENCE_XY.v) {
+ if(dogd.drawing)
+ ssglColorRGB(RGBi(0, 0, f));
+ } else if(hr.v == Request::HREQUEST_REFERENCE_YZ.v) {
+ if(dogd.drawing)
+ ssglColorRGB(RGBi(f, 0, 0));
+ } else if(hr.v == Request::HREQUEST_REFERENCE_ZX.v) {
+ if(dogd.drawing)
+ ssglColorRGB(RGBi(0, f, 0));
+ } else {
+ if(dogd.drawing)
+ ssglColorRGB(Style::Color(Style::NORMALS));
+ if(i > 0) break;
+ }
+
+ Quaternion q = NormalGetNum();
+ Vector tail;
+ if(i == 0) {
+ tail = SK.GetEntity(point[0])->PointGetNum();
+ if(dogd.drawing)
+ ssglLineWidth(1);
+ } else {
+ // Draw an extra copy of the x, y, and z axes, that's
+ // always in the corner of the view and at the front.
+ // So those are always available, perhaps useful.
+ double s = SS.GW.scale;
+ double h = 60 - SS.GW.height/2;
+ double w = 60 - SS.GW.width/2;
+ tail = SS.GW.projRight.ScaledBy(w/s).Plus(
+ SS.GW.projUp. ScaledBy(h/s)).Minus(SS.GW.offset);
+ if(dogd.drawing) {
+ ssglDepthRangeLockToFront(true);
+ ssglLineWidth(2);
+ }
+ }
+
+ Vector v = (q.RotationN()).WithMagnitude(50/SS.GW.scale);
+ Vector tip = tail.Plus(v);
+ LineDrawOrGetDistance(tail, tip);
+
+ v = v.WithMagnitude(12/SS.GW.scale);
+ Vector axis = q.RotationV();
+ LineDrawOrGetDistance(tip,tip.Minus(v.RotatedAbout(axis, 0.6)));
+ LineDrawOrGetDistance(tip,tip.Minus(v.RotatedAbout(axis,-0.6)));
+ }
+ if(dogd.drawing)
+ ssglDepthRangeLockToFront(false);
+ break;
+ }
+
+ case DISTANCE:
+ case DISTANCE_N_COPY:
+ // These are used only as data structures, nothing to display.
+ break;
+
+ case WORKPLANE: {
+ Vector p;
+ p = SK.GetEntity(point[0])->PointGetNum();
+
+ Vector u = Normal()->NormalU();
+ Vector v = Normal()->NormalV();
+
+ double s = (min(SS.GW.width, SS.GW.height))*0.45/SS.GW.scale;
+
+ Vector us = u.ScaledBy(s);
+ Vector vs = v.ScaledBy(s);
+
+ Vector pp = p.Plus (us).Plus (vs);
+ Vector pm = p.Plus (us).Minus(vs);
+ Vector mm = p.Minus(us).Minus(vs), mm2 = mm;
+ Vector mp = p.Minus(us).Plus (vs);
+
+ if(dogd.drawing) {
+ ssglLineWidth(1);
+ ssglColorRGB(Style::Color(Style::NORMALS));
+ glEnable(GL_LINE_STIPPLE);
+ glLineStipple(3, 0x1111);
+ }
+
+ if(!h.isFromRequest()) {
+ mm = mm.Plus(v.ScaledBy(70/SS.GW.scale));
+ mm2 = mm2.Plus(u.ScaledBy(70/SS.GW.scale));
+ LineDrawOrGetDistance(mm2, mm);
+ }
+ LineDrawOrGetDistance(pp, pm);
+ LineDrawOrGetDistance(pm, mm2);
+ LineDrawOrGetDistance(mp, mm);
+ LineDrawOrGetDistance(pp, mp);
+
+ if(dogd.drawing)
+ glDisable(GL_LINE_STIPPLE);
+
+ std::string str = DescriptionString().substr(5);
+ double th = Style::DefaultTextHeight();
+ if(dogd.drawing) {
+ Vector o = mm2.Plus(u.ScaledBy(3/SS.GW.scale)).Plus(
+ v.ScaledBy(3/SS.GW.scale));
+ ssglWriteText(str, th, o, u, v, NULL, NULL);
+ } else {
+ Vector pos = mm2.Plus(u.ScaledBy(ssglStrWidth(str, th)/2)).Plus(
+ v.ScaledBy(ssglStrCapHeight(th)/2));
+ Point2d pp = SS.GW.ProjectPoint(pos);
+ dogd.dmin = min(dogd.dmin, pp.DistanceTo(dogd.mp) - 10);
+ // If a line lies in a plane, then select the line, not
+ // the plane.
+ dogd.dmin += 3;
+ }
+ break;
+ }
+
+ case LINE_SEGMENT:
+ case CIRCLE:
+ case ARC_OF_CIRCLE:
+ case CUBIC:
+ case CUBIC_PERIODIC:
+ case TTF_TEXT:
+ // Nothing but the curve(s).
+ break;
+
+ case FACE_NORMAL_PT:
+ case FACE_XPROD:
+ case FACE_N_ROT_TRANS:
+ case FACE_N_TRANS:
+ case FACE_N_ROT_AA:
+ // Do nothing; these are drawn with the triangle mesh
+ break;
+
+ default:
+ oops();
+ }
+
+ // And draw the curves; generate the rational polynomial curves for
+ // everything, then piecewise linearize them, and display those.
+ SEdgeList *sel = GetOrGenerateEdges();
+ dogd.data = -1;
+ for(int i = 0; i < sel->l.n; i++) {
+ SEdge *se = &(sel->l.elem[i]);
+ LineDrawOrGetDistance(se->a, se->b, true, se->auxB);
+ }
+}
+
--- /dev/null
+//-----------------------------------------------------------------------------
+// Data structures used frequently in the program, various kinds of vectors
+// (of real numbers, not symbolic algebra stuff) and our templated lists.
+//
+// Copyright 2008-2013 Jonathan Westhues.
+//-----------------------------------------------------------------------------
+#ifndef __DSC_H
+#define __DSC_H
+
+#include "solvespace.h"
+
+class Vector;
+class Vector4;
+class Point2d;
+class hEntity;
+class hParam;
+
+class Quaternion {
+public:
+ // a + (vx)*i + (vy)*j + (vz)*k
+ double w, vx, vy, vz;
+
+ static const Quaternion IDENTITY;
+
+ static Quaternion From(double w, double vx, double vy, double vz);
+ static Quaternion From(hParam w, hParam vx, hParam vy, hParam vz);
+ static Quaternion From(Vector u, Vector v);
+ static Quaternion From(Vector axis, double dtheta);
+
+ Quaternion Plus(Quaternion b);
+ Quaternion Minus(Quaternion b);
+ Quaternion ScaledBy(double s);
+ double Magnitude(void);
+ Quaternion WithMagnitude(double s);
+
+ // Call a rotation matrix [ u' v' n' ]'; this returns the first and
+ // second rows, where that matrix is generated by this quaternion
+ Vector RotationU(void);
+ Vector RotationV(void);
+ Vector RotationN(void);
+ Vector Rotate(Vector p);
+
+ Quaternion ToThe(double p);
+ Quaternion Inverse(void);
+ Quaternion Times(Quaternion b);
+ Quaternion Mirror(void);
+};
+
+class Vector {
+public:
+ double x, y, z;
+
+ static Vector From(double x, double y, double z);
+ static Vector From(hParam x, hParam y, hParam z);
+ static Vector AtIntersectionOfPlanes(Vector n1, double d1,
+ Vector n2, double d2);
+ static Vector AtIntersectionOfLines(Vector a0, Vector a1,
+ Vector b0, Vector b1,
+ bool *skew,
+ double *pa=NULL, double *pb=NULL);
+ static Vector AtIntersectionOfPlaneAndLine(Vector n, double d,
+ Vector p0, Vector p1,
+ bool *parallel);
+ static Vector AtIntersectionOfPlanes(Vector na, double da,
+ Vector nb, double db,
+ Vector nc, double dc, bool *parallel);
+ static void ClosestPointBetweenLines(Vector pa, Vector da,
+ Vector pb, Vector db,
+ double *ta, double *tb);
+
+ double Element(int i);
+ bool Equals(Vector v, double tol=LENGTH_EPS);
+ bool EqualsExactly(Vector v);
+ Vector Plus(Vector b);
+ Vector Minus(Vector b);
+ Vector Negated(void);
+ Vector Cross(Vector b);
+ double DirectionCosineWith(Vector b);
+ double Dot(Vector b);
+ Vector Normal(int which);
+ Vector RotatedAbout(Vector orig, Vector axis, double theta);
+ Vector RotatedAbout(Vector axis, double theta);
+ Vector DotInToCsys(Vector u, Vector v, Vector n);
+ Vector ScaleOutOfCsys(Vector u, Vector v, Vector n);
+ double DistanceToLine(Vector p0, Vector dp);
+ bool OnLineSegment(Vector a, Vector b, double tol=LENGTH_EPS);
+ Vector ClosestPointOnLine(Vector p0, Vector dp);
+ double Magnitude(void);
+ double MagSquared(void);
+ Vector WithMagnitude(double s);
+ Vector ScaledBy(double s);
+ Vector ProjectInto(hEntity wrkpl);
+ Vector ProjectVectorInto(hEntity wrkpl);
+ double DivPivoting(Vector delta);
+ Vector ClosestOrtho(void);
+ void MakeMaxMin(Vector *maxv, Vector *minv);
+ Vector ClampWithin(double minv, double maxv);
+ static bool BoundingBoxesDisjoint(Vector amax, Vector amin,
+ Vector bmax, Vector bmin);
+ static bool BoundingBoxIntersectsLine(Vector amax, Vector amin,
+ Vector p0, Vector p1, bool segment);
+ bool OutsideAndNotOn(Vector maxv, Vector minv);
+ Vector InPerspective(Vector u, Vector v, Vector n,
+ Vector origin, double cameraTan);
+ Point2d Project2d(Vector u, Vector v);
+ Point2d ProjectXy(void);
+ Vector4 Project4d(void);
+};
+
+class Vector4 {
+public:
+ double w, x, y, z;
+
+ static Vector4 From(double w, double x, double y, double z);
+ static Vector4 From(double w, Vector v3);
+ static Vector4 Blend(Vector4 a, Vector4 b, double t);
+
+ Vector4 Plus(Vector4 b);
+ Vector4 Minus(Vector4 b);
+ Vector4 ScaledBy(double s);
+ Vector PerspectiveProject(void);
+};
+
+class Point2d {
+public:
+ double x, y;
+
+ static Point2d From(double x, double y);
+
+ Point2d Plus(const Point2d &b) const;
+ Point2d Minus(const Point2d &b) const;
+ Point2d ScaledBy(double s) const;
+ double DivPivoting(Point2d delta) const;
+ double Dot(Point2d p) const;
+ double DistanceTo(const Point2d &p) const;
+ double DistanceToLine(const Point2d &p0, const Point2d &dp, bool segment) const;
+ double Magnitude(void) const;
+ double MagSquared(void) const;
+ Point2d WithMagnitude(double v) const;
+ Point2d Normal(void) const;
+ bool Equals(Point2d v, double tol=LENGTH_EPS) const;
+};
+
+// A simple list
+template <class T>
+class List {
+public:
+ T *elem;
+ int n;
+ int elemsAllocated;
+
+ void AllocForOneMore(void) {
+ if(n >= elemsAllocated) {
+ elemsAllocated = (elemsAllocated + 32)*2;
+ T *newElem = (T *)MemAlloc((size_t)elemsAllocated*sizeof(elem[0]));
+ for(int i = 0; i < n; i++) {
+ new(&newElem[i]) T(std::move(elem[i]));
+ elem[i].~T();
+ }
+ MemFree(elem);
+ elem = newElem;
+ }
+ }
+
+ void Add(T *t) {
+ AllocForOneMore();
+ new(&elem[n++]) T(*t);
+ }
+
+ void AddToBeginning(T *t) {
+ AllocForOneMore();
+ new(&elem[n]) T();
+ std::move_backward(elem, elem + 1, elem + n + 1);
+ elem[0] = *t;
+ n++;
+ }
+
+ T *First(void) {
+ return (n == 0) ? NULL : &(elem[0]);
+ }
+ T *NextAfter(T *prev) {
+ if(!prev) return NULL;
+ if(prev - elem == (n - 1)) return NULL;
+ return prev + 1;
+ }
+
+ void ClearTags(void) {
+ int i;
+ for(i = 0; i < n; i++) {
+ elem[i].tag = 0;
+ }
+ }
+
+ void Clear(void) {
+ for(int i = 0; i < n; i++)
+ elem[i].~T();
+ if(elem) MemFree(elem);
+ elem = NULL;
+ n = elemsAllocated = 0;
+ }
+
+ void RemoveTagged(void) {
+ int src, dest;
+ dest = 0;
+ for(src = 0; src < n; src++) {
+ if(elem[src].tag) {
+ // this item should be deleted
+ } else {
+ if(src != dest) {
+ elem[dest] = elem[src];
+ }
+ dest++;
+ }
+ }
+ for(int i = dest; i < n; i++)
+ elem[i].~T();
+ n = dest;
+ // and elemsAllocated is untouched, because we didn't resize
+ }
+
+ void RemoveLast(int cnt) {
+ if(n < cnt) oops();
+ for(int i = n - cnt; i < n; i++)
+ elem[i].~T();
+ n -= cnt;
+ // and elemsAllocated is untouched, same as in RemoveTagged
+ }
+
+ void Reverse(void) {
+ int i;
+ for(i = 0; i < (n/2); i++) {
+ swap(elem[i], elem[(n-1)-i]);
+ }
+ }
+};
+
+// A list, where each element has an integer identifier. The list is kept
+// sorted by that identifier, and items can be looked up in log n time by
+// id.
+template <class T, class H>
+class IdList {
+public:
+ T *elem;
+ int n;
+ int elemsAllocated;
+
+ uint32_t MaximumId(void) {
+ uint32_t id = 0;
+
+ int i;
+ for(i = 0; i < n; i++) {
+ id = max(id, elem[i].h.v);
+ }
+ return id;
+ }
+
+ H AddAndAssignId(T *t) {
+ t->h.v = (MaximumId() + 1);
+ Add(t);
+
+ return t->h;
+ }
+
+ void Add(T *t) {
+ if(n >= elemsAllocated) {
+ elemsAllocated = (elemsAllocated + 32)*2;
+ T *newElem = (T *)MemAlloc((size_t)elemsAllocated*sizeof(elem[0]));
+ for(int i = 0; i < n; i++) {
+ new(&newElem[i]) T(std::move(elem[i]));
+ elem[i].~T();
+ }
+ MemFree(elem);
+ elem = newElem;
+ }
+
+ int first = 0, last = n;
+ // We know that we must insert within the closed interval [first,last]
+ while(first != last) {
+ int mid = (first + last)/2;
+ H hm = elem[mid].h;
+ if(hm.v > t->h.v) {
+ last = mid;
+ } else if(hm.v < t->h.v) {
+ first = mid + 1;
+ } else {
+ dbp("can't insert in list; is handle %d not unique?", t->h.v);
+ oops();
+ }
+ }
+
+ int i = first;
+ new(&elem[n]) T();
+ std::move_backward(elem + i, elem + n, elem + n + 1);
+ elem[i] = *t;
+ n++;
+ }
+
+ T *FindById(H h) {
+ T *t = FindByIdNoOops(h);
+ if(!t) {
+ dbp("failed to look up item %08x, searched %d items", h.v, n);
+ oops();
+ }
+ return t;
+ }
+
+ int IndexOf(H h) {
+ int first = 0, last = n-1;
+ while(first <= last) {
+ int mid = (first + last)/2;
+ H hm = elem[mid].h;
+ if(hm.v > h.v) {
+ last = mid-1; // and first stays the same
+ } else if(hm.v < h.v) {
+ first = mid+1; // and last stays the same
+ } else {
+ return mid;
+ }
+ }
+ return -1;
+ }
+
+ T *FindByIdNoOops(H h) {
+ int first = 0, last = n-1;
+ while(first <= last) {
+ int mid = (first + last)/2;
+ H hm = elem[mid].h;
+ if(hm.v > h.v) {
+ last = mid-1; // and first stays the same
+ } else if(hm.v < h.v) {
+ first = mid+1; // and last stays the same
+ } else {
+ return &(elem[mid]);
+ }
+ }
+ return NULL;
+ }
+
+ T *First(void) {
+ return (n == 0) ? NULL : &(elem[0]);
+ }
+ T *NextAfter(T *prev) {
+ if(!prev) return NULL;
+ if(prev - elem == (n - 1)) return NULL;
+ return prev + 1;
+ }
+
+ void ClearTags(void) {
+ int i;
+ for(i = 0; i < n; i++) {
+ elem[i].tag = 0;
+ }
+ }
+
+ void Tag(H h, int tag) {
+ int i;
+ for(i = 0; i < n; i++) {
+ if(elem[i].h.v == h.v) {
+ elem[i].tag = tag;
+ }
+ }
+ }
+
+ void RemoveTagged(void) {
+ int src, dest;
+ dest = 0;
+ for(src = 0; src < n; src++) {
+ if(elem[src].tag) {
+ // this item should be deleted
+ } else {
+ if(src != dest) {
+ elem[dest] = elem[src];
+ }
+ dest++;
+ }
+ }
+ for(int i = dest; i < n; i++)
+ elem[i].~T();
+ n = dest;
+ // and elemsAllocated is untouched, because we didn't resize
+ }
+ void RemoveById(H h) {
+ ClearTags();
+ FindById(h)->tag = 1;
+ RemoveTagged();
+ }
+
+ void MoveSelfInto(IdList<T,H> *l) {
+ l->Clear();
+ *l = *this;
+ elemsAllocated = n = 0;
+ elem = NULL;
+ }
+
+ void DeepCopyInto(IdList<T,H> *l) {
+ l->Clear();
+ l->elem = (T *)MemAlloc(elemsAllocated * sizeof(elem[0]));
+ for(int i = 0; i < n; i++)
+ new(&l->elem[i]) T(elem[i]);
+ l->elemsAllocated = elemsAllocated;
+ l->n = n;
+ }
+
+ void Clear(void) {
+ for(int i = 0; i < n; i++) {
+ elem[i].Clear();
+ elem[i].~T();
+ }
+ elemsAllocated = n = 0;
+ if(elem) MemFree(elem);
+ elem = NULL;
+ }
+
+};
+
+class BandedMatrix {
+public:
+ enum {
+ MAX_UNKNOWNS = 16,
+ RIGHT_OF_DIAG = 1,
+ LEFT_OF_DIAG = 2
+ };
+
+ double A[MAX_UNKNOWNS][MAX_UNKNOWNS];
+ double B[MAX_UNKNOWNS];
+ double X[MAX_UNKNOWNS];
+ int n;
+
+ void Solve(void);
+};
+
+#define RGBi(r, g, b) RgbaColor::From((r), (g), (b))
+#define RGBf(r, g, b) RgbaColor::FromFloat((float)(r), (float)(g), (float)(b))
+
+// Note: sizeof(class RgbaColor) should be exactly 4
+//
+class RgbaColor {
+public:
+ uint8_t red, green, blue, alpha;
+
+ float redF(void) const { return (float)red / 255.0f; }
+ float greenF(void) const { return (float)green / 255.0f; }
+ float blueF(void) const { return (float)blue / 255.0f; }
+ float alphaF(void) const { return (float)alpha / 255.0f; }
+
+ bool Equals(RgbaColor c) const {
+ return
+ c.red == red &&
+ c.green == green &&
+ c.blue == blue &&
+ c.alpha == alpha;
+ }
+
+ uint32_t ToPackedIntBGRA(void) const {
+ return
+ blue |
+ (uint32_t)(green << 8) |
+ (uint32_t)(red << 16) |
+ (uint32_t)((255 - alpha) << 24);
+ }
+
+ uint32_t ToPackedInt(void) const {
+ return
+ red |
+ (uint32_t)(green << 8) |
+ (uint32_t)(blue << 16) |
+ (uint32_t)((255 - alpha) << 24);
+ }
+
+ uint32_t ToARGB32(void) const {
+ return
+ blue |
+ (uint32_t)(green << 8) |
+ (uint32_t)(red << 16) |
+ (uint32_t)(alpha << 24);
+ }
+
+ static RgbaColor From(int r, int g, int b, int a = 255) {
+ RgbaColor c;
+ c.red = (uint8_t)r;
+ c.green = (uint8_t)g;
+ c.blue = (uint8_t)b;
+ c.alpha = (uint8_t)a;
+ return c;
+ }
+
+ static RgbaColor FromFloat(float r, float g, float b, float a = 1.0) {
+ return From(
+ (int)(255.1f * r),
+ (int)(255.1f * g),
+ (int)(255.1f * b),
+ (int)(255.1f * a));
+ }
+
+ static RgbaColor FromPackedInt(uint32_t rgba) {
+ return From(
+ (int)((rgba) & 0xff),
+ (int)((rgba >> 8) & 0xff),
+ (int)((rgba >> 16) & 0xff),
+ (int)(255 - ((rgba >> 24) & 0xff)));
+ }
+
+ static RgbaColor FromPackedIntBGRA(uint32_t bgra) {
+ return From(
+ (int)((bgra >> 16) & 0xff),
+ (int)((bgra >> 8) & 0xff),
+ (int)((bgra) & 0xff),
+ (int)(255 - ((bgra >> 24) & 0xff)));
+ }
+
+};
+
+class BBox {
+public:
+ Vector minp;
+ Vector maxp;
+
+ static BBox From(const Vector &p0, const Vector &p1);
+
+ Vector GetOrigin();
+ Vector GetExtents();
+
+ void Include(const Vector &v, double r = 0.0);
+ bool Overlaps(BBox &b1);
+ bool Contains(const Point2d &p);
+};
+
+#endif
--- /dev/null
+//-----------------------------------------------------------------------------
+// The implementation of our entities in the symbolic algebra system, methods
+// to return a symbolic representation of the entity (line by its endpoints,
+// circle by center and radius, etc.).
+//
+// Copyright 2008-2013 Jonathan Westhues.
+//-----------------------------------------------------------------------------
+#include "solvespace.h"
+
+const hEntity EntityBase::FREE_IN_3D = { 0 };
+const hEntity EntityBase::NO_ENTITY = { 0 };
+
+bool EntityBase::HasVector(void) {
+ switch(type) {
+ case LINE_SEGMENT:
+ case NORMAL_IN_3D:
+ case NORMAL_IN_2D:
+ case NORMAL_N_COPY:
+ case NORMAL_N_ROT:
+ case NORMAL_N_ROT_AA:
+ return true;
+
+ default:
+ return false;
+ }
+}
+
+ExprVector EntityBase::VectorGetExprs(void) {
+ switch(type) {
+ case LINE_SEGMENT:
+ return (SK.GetEntity(point[0])->PointGetExprs()).Minus(
+ SK.GetEntity(point[1])->PointGetExprs());
+
+ case NORMAL_IN_3D:
+ case NORMAL_IN_2D:
+ case NORMAL_N_COPY:
+ case NORMAL_N_ROT:
+ case NORMAL_N_ROT_AA:
+ return NormalExprsN();
+
+ default: oops();
+ }
+}
+
+Vector EntityBase::VectorGetNum(void) {
+ switch(type) {
+ case LINE_SEGMENT:
+ return (SK.GetEntity(point[0])->PointGetNum()).Minus(
+ SK.GetEntity(point[1])->PointGetNum());
+
+ case NORMAL_IN_3D:
+ case NORMAL_IN_2D:
+ case NORMAL_N_COPY:
+ case NORMAL_N_ROT:
+ case NORMAL_N_ROT_AA:
+ return NormalN();
+
+ default: oops();
+ }
+}
+
+Vector EntityBase::VectorGetRefPoint(void) {
+ switch(type) {
+ case LINE_SEGMENT:
+ return ((SK.GetEntity(point[0])->PointGetNum()).Plus(
+ SK.GetEntity(point[1])->PointGetNum())).ScaledBy(0.5);
+
+ case NORMAL_IN_3D:
+ case NORMAL_IN_2D:
+ case NORMAL_N_COPY:
+ case NORMAL_N_ROT:
+ case NORMAL_N_ROT_AA:
+ return SK.GetEntity(point[0])->PointGetNum();
+
+ default: oops();
+ }
+}
+
+Vector EntityBase::VectorGetStartPoint(void) {
+ switch(type) {
+ case LINE_SEGMENT:
+ return SK.GetEntity(point[1])->PointGetNum();
+
+ case NORMAL_IN_3D:
+ case NORMAL_IN_2D:
+ case NORMAL_N_COPY:
+ case NORMAL_N_ROT:
+ case NORMAL_N_ROT_AA:
+ return SK.GetEntity(point[0])->PointGetNum();
+
+ default: oops();
+ }
+}
+
+bool EntityBase::IsCircle(void) {
+ return (type == CIRCLE) || (type == ARC_OF_CIRCLE);
+}
+
+Expr *EntityBase::CircleGetRadiusExpr(void) {
+ if(type == CIRCLE) {
+ return SK.GetEntity(distance)->DistanceGetExpr();
+ } else if(type == ARC_OF_CIRCLE) {
+ return Constraint::Distance(workplane, point[0], point[1]);
+ } else oops();
+}
+
+double EntityBase::CircleGetRadiusNum(void) {
+ if(type == CIRCLE) {
+ return SK.GetEntity(distance)->DistanceGetNum();
+ } else if(type == ARC_OF_CIRCLE) {
+ Vector c = SK.GetEntity(point[0])->PointGetNum();
+ Vector pa = SK.GetEntity(point[1])->PointGetNum();
+ return (pa.Minus(c)).Magnitude();
+ } else oops();
+}
+
+void EntityBase::ArcGetAngles(double *thetaa, double *thetab, double *dtheta) {
+ if(type != ARC_OF_CIRCLE) oops();
+
+ Quaternion q = Normal()->NormalGetNum();
+ Vector u = q.RotationU(), v = q.RotationV();
+
+ Vector c = SK.GetEntity(point[0])->PointGetNum();
+ Vector pa = SK.GetEntity(point[1])->PointGetNum();
+ Vector pb = SK.GetEntity(point[2])->PointGetNum();
+
+ Point2d c2 = c.Project2d(u, v);
+ Point2d pa2 = (pa.Project2d(u, v)).Minus(c2);
+ Point2d pb2 = (pb.Project2d(u, v)).Minus(c2);
+
+ *thetaa = atan2(pa2.y, pa2.x);
+ *thetab = atan2(pb2.y, pb2.x);
+ *dtheta = *thetab - *thetaa;
+ // If the endpoints are coincident, call it a full arc, not a zero arc;
+ // useful concept to have when splitting
+ while(*dtheta < 1e-6) *dtheta += 2*PI;
+ while(*dtheta > (2*PI)) *dtheta -= 2*PI;
+}
+
+Vector EntityBase::CubicGetStartNum(void) {
+ return SK.GetEntity(point[0])->PointGetNum();
+}
+Vector EntityBase::CubicGetFinishNum(void) {
+ return SK.GetEntity(point[3+extraPoints])->PointGetNum();
+}
+ExprVector EntityBase::CubicGetStartTangentExprs(void) {
+ ExprVector pon = SK.GetEntity(point[0])->PointGetExprs(),
+ poff = SK.GetEntity(point[1])->PointGetExprs();
+ return (pon.Minus(poff));
+}
+ExprVector EntityBase::CubicGetFinishTangentExprs(void) {
+ ExprVector pon = SK.GetEntity(point[3+extraPoints])->PointGetExprs(),
+ poff = SK.GetEntity(point[2+extraPoints])->PointGetExprs();
+ return (pon.Minus(poff));
+}
+Vector EntityBase::CubicGetStartTangentNum(void) {
+ Vector pon = SK.GetEntity(point[0])->PointGetNum(),
+ poff = SK.GetEntity(point[1])->PointGetNum();
+ return (pon.Minus(poff));
+}
+Vector EntityBase::CubicGetFinishTangentNum(void) {
+ Vector pon = SK.GetEntity(point[3+extraPoints])->PointGetNum(),
+ poff = SK.GetEntity(point[2+extraPoints])->PointGetNum();
+ return (pon.Minus(poff));
+}
+
+bool EntityBase::IsWorkplane(void) {
+ return (type == WORKPLANE);
+}
+
+ExprVector EntityBase::WorkplaneGetOffsetExprs(void) {
+ return SK.GetEntity(point[0])->PointGetExprs();
+}
+
+Vector EntityBase::WorkplaneGetOffset(void) {
+ return SK.GetEntity(point[0])->PointGetNum();
+}
+
+void EntityBase::WorkplaneGetPlaneExprs(ExprVector *n, Expr **dn) {
+ if(type == WORKPLANE) {
+ *n = Normal()->NormalExprsN();
+
+ ExprVector p0 = SK.GetEntity(point[0])->PointGetExprs();
+ // The plane is n dot (p - p0) = 0, or
+ // n dot p - n dot p0 = 0
+ // so dn = n dot p0
+ *dn = p0.Dot(*n);
+ } else {
+ oops();
+ }
+}
+
+bool EntityBase::IsDistance(void) {
+ return (type == DISTANCE) ||
+ (type == DISTANCE_N_COPY);
+}
+double EntityBase::DistanceGetNum(void) {
+ if(type == DISTANCE) {
+ return SK.GetParam(param[0])->val;
+ } else if(type == DISTANCE_N_COPY) {
+ return numDistance;
+ } else oops();
+}
+Expr *EntityBase::DistanceGetExpr(void) {
+ if(type == DISTANCE) {
+ return Expr::From(param[0]);
+ } else if(type == DISTANCE_N_COPY) {
+ return Expr::From(numDistance);
+ } else oops();
+}
+void EntityBase::DistanceForceTo(double v) {
+ if(type == DISTANCE) {
+ (SK.GetParam(param[0]))->val = v;
+ } else if(type == DISTANCE_N_COPY) {
+ // do nothing, it's locked
+ } else oops();
+}
+
+EntityBase *EntityBase::Normal(void) {
+ return SK.GetEntity(normal);
+}
+
+bool EntityBase::IsPoint(void) {
+ switch(type) {
+ case POINT_IN_3D:
+ case POINT_IN_2D:
+ case POINT_N_COPY:
+ case POINT_N_TRANS:
+ case POINT_N_ROT_TRANS:
+ case POINT_N_ROT_AA:
+ return true;
+
+ default:
+ return false;
+ }
+}
+
+bool EntityBase::IsNormal(void) {
+ switch(type) {
+ case NORMAL_IN_3D:
+ case NORMAL_IN_2D:
+ case NORMAL_N_COPY:
+ case NORMAL_N_ROT:
+ case NORMAL_N_ROT_AA:
+ return true;
+
+ default: return false;
+ }
+}
+
+Quaternion EntityBase::NormalGetNum(void) {
+ Quaternion q;
+ switch(type) {
+ case NORMAL_IN_3D:
+ q = Quaternion::From(param[0], param[1], param[2], param[3]);
+ break;
+
+ case NORMAL_IN_2D: {
+ EntityBase *wrkpl = SK.GetEntity(workplane);
+ EntityBase *norm = SK.GetEntity(wrkpl->normal);
+ q = norm->NormalGetNum();
+ break;
+ }
+ case NORMAL_N_COPY:
+ q = numNormal;
+ break;
+
+ case NORMAL_N_ROT:
+ q = Quaternion::From(param[0], param[1], param[2], param[3]);
+ q = q.Times(numNormal);
+ break;
+
+ case NORMAL_N_ROT_AA: {
+ q = GetAxisAngleQuaternion(0);
+ q = q.Times(numNormal);
+ break;
+ }
+
+ default: oops();
+ }
+ return q;
+}
+
+void EntityBase::NormalForceTo(Quaternion q) {
+ switch(type) {
+ case NORMAL_IN_3D:
+ SK.GetParam(param[0])->val = q.w;
+ SK.GetParam(param[1])->val = q.vx;
+ SK.GetParam(param[2])->val = q.vy;
+ SK.GetParam(param[3])->val = q.vz;
+ break;
+
+ case NORMAL_IN_2D:
+ case NORMAL_N_COPY:
+ // There's absolutely nothing to do; these are locked.
+ break;
+ case NORMAL_N_ROT: {
+ Quaternion qp = q.Times(numNormal.Inverse());
+
+ SK.GetParam(param[0])->val = qp.w;
+ SK.GetParam(param[1])->val = qp.vx;
+ SK.GetParam(param[2])->val = qp.vy;
+ SK.GetParam(param[3])->val = qp.vz;
+ break;
+ }
+
+ case NORMAL_N_ROT_AA:
+ // Not sure if I'll bother implementing this one
+ break;
+
+ default: oops();
+ }
+}
+
+Vector EntityBase::NormalU(void) {
+ return NormalGetNum().RotationU();
+}
+Vector EntityBase::NormalV(void) {
+ return NormalGetNum().RotationV();
+}
+Vector EntityBase::NormalN(void) {
+ return NormalGetNum().RotationN();
+}
+
+ExprVector EntityBase::NormalExprsU(void) {
+ return NormalGetExprs().RotationU();
+}
+ExprVector EntityBase::NormalExprsV(void) {
+ return NormalGetExprs().RotationV();
+}
+ExprVector EntityBase::NormalExprsN(void) {
+ return NormalGetExprs().RotationN();
+}
+
+ExprQuaternion EntityBase::NormalGetExprs(void) {
+ ExprQuaternion q;
+ switch(type) {
+ case NORMAL_IN_3D:
+ q = ExprQuaternion::From(param[0], param[1], param[2], param[3]);
+ break;
+
+ case NORMAL_IN_2D: {
+ EntityBase *wrkpl = SK.GetEntity(workplane);
+ EntityBase *norm = SK.GetEntity(wrkpl->normal);
+ q = norm->NormalGetExprs();
+ break;
+ }
+ case NORMAL_N_COPY:
+ q = ExprQuaternion::From(numNormal);
+ break;
+
+ case NORMAL_N_ROT: {
+ ExprQuaternion orig = ExprQuaternion::From(numNormal);
+ q = ExprQuaternion::From(param[0], param[1], param[2], param[3]);
+
+ q = q.Times(orig);
+ break;
+ }
+
+ case NORMAL_N_ROT_AA: {
+ ExprQuaternion orig = ExprQuaternion::From(numNormal);
+ q = GetAxisAngleQuaternionExprs(0);
+ q = q.Times(orig);
+ break;
+ }
+
+ default: oops();
+ }
+ return q;
+}
+
+void EntityBase::PointForceTo(Vector p) {
+ switch(type) {
+ case POINT_IN_3D:
+ SK.GetParam(param[0])->val = p.x;
+ SK.GetParam(param[1])->val = p.y;
+ SK.GetParam(param[2])->val = p.z;
+ break;
+
+ case POINT_IN_2D: {
+ EntityBase *c = SK.GetEntity(workplane);
+ p = p.Minus(c->WorkplaneGetOffset());
+ SK.GetParam(param[0])->val = p.Dot(c->Normal()->NormalU());
+ SK.GetParam(param[1])->val = p.Dot(c->Normal()->NormalV());
+ break;
+ }
+
+ case POINT_N_TRANS: {
+ if(timesApplied == 0) break;
+ Vector trans = (p.Minus(numPoint)).ScaledBy(1.0/timesApplied);
+ SK.GetParam(param[0])->val = trans.x;
+ SK.GetParam(param[1])->val = trans.y;
+ SK.GetParam(param[2])->val = trans.z;
+ break;
+ }
+
+ case POINT_N_ROT_TRANS: {
+ // Force only the translation; leave the rotation unchanged. But
+ // remember that we're working with respect to the rotated
+ // point.
+ Vector trans = p.Minus(PointGetQuaternion().Rotate(numPoint));
+ SK.GetParam(param[0])->val = trans.x;
+ SK.GetParam(param[1])->val = trans.y;
+ SK.GetParam(param[2])->val = trans.z;
+ break;
+ }
+
+ case POINT_N_ROT_AA: {
+ // Force only the angle; the axis and center of rotation stay
+ Vector offset = Vector::From(param[0], param[1], param[2]);
+ Vector normal = Vector::From(param[4], param[5], param[6]);
+ Vector u = normal.Normal(0), v = normal.Normal(1);
+ Vector po = p.Minus(offset), numo = numPoint.Minus(offset);
+ double thetap = atan2(v.Dot(po), u.Dot(po));
+ double thetan = atan2(v.Dot(numo), u.Dot(numo));
+ double thetaf = (thetap - thetan);
+ double thetai = (SK.GetParam(param[3])->val)*timesApplied*2;
+ double dtheta = thetaf - thetai;
+ // Take the smallest possible change in the actual step angle,
+ // in order to avoid jumps when you cross from +pi to -pi
+ while(dtheta < -PI) dtheta += 2*PI;
+ while(dtheta > PI) dtheta -= 2*PI;
+ SK.GetParam(param[3])->val = (thetai + dtheta)/(timesApplied*2);
+ break;
+ }
+
+ case POINT_N_COPY:
+ // Nothing to do; it's a static copy
+ break;
+
+ default: oops();
+ }
+}
+
+Vector EntityBase::PointGetNum(void) {
+ Vector p;
+ switch(type) {
+ case POINT_IN_3D:
+ p = Vector::From(param[0], param[1], param[2]);
+ break;
+
+ case POINT_IN_2D: {
+ EntityBase *c = SK.GetEntity(workplane);
+ Vector u = c->Normal()->NormalU();
+ Vector v = c->Normal()->NormalV();
+ p = u.ScaledBy(SK.GetParam(param[0])->val);
+ p = p.Plus(v.ScaledBy(SK.GetParam(param[1])->val));
+ p = p.Plus(c->WorkplaneGetOffset());
+ break;
+ }
+
+ case POINT_N_TRANS: {
+ Vector trans = Vector::From(param[0], param[1], param[2]);
+ p = numPoint.Plus(trans.ScaledBy(timesApplied));
+ break;
+ }
+
+ case POINT_N_ROT_TRANS: {
+ Vector offset = Vector::From(param[0], param[1], param[2]);
+ Quaternion q = PointGetQuaternion();
+ p = q.Rotate(numPoint);
+ p = p.Plus(offset);
+ break;
+ }
+
+ case POINT_N_ROT_AA: {
+ Vector offset = Vector::From(param[0], param[1], param[2]);
+ Quaternion q = PointGetQuaternion();
+ p = numPoint.Minus(offset);
+ p = q.Rotate(p);
+ p = p.Plus(offset);
+ break;
+ }
+
+ case POINT_N_COPY:
+ p = numPoint;
+ break;
+
+ default: oops();
+ }
+ return p;
+}
+
+ExprVector EntityBase::PointGetExprs(void) {
+ ExprVector r;
+ switch(type) {
+ case POINT_IN_3D:
+ r = ExprVector::From(param[0], param[1], param[2]);
+ break;
+
+ case POINT_IN_2D: {
+ EntityBase *c = SK.GetEntity(workplane);
+ ExprVector u = c->Normal()->NormalExprsU();
+ ExprVector v = c->Normal()->NormalExprsV();
+ r = c->WorkplaneGetOffsetExprs();
+ r = r.Plus(u.ScaledBy(Expr::From(param[0])));
+ r = r.Plus(v.ScaledBy(Expr::From(param[1])));
+ break;
+ }
+ case POINT_N_TRANS: {
+ ExprVector orig = ExprVector::From(numPoint);
+ ExprVector trans = ExprVector::From(param[0], param[1], param[2]);
+ r = orig.Plus(trans.ScaledBy(Expr::From(timesApplied)));
+ break;
+ }
+ case POINT_N_ROT_TRANS: {
+ ExprVector orig = ExprVector::From(numPoint);
+ ExprVector trans = ExprVector::From(param[0], param[1], param[2]);
+ ExprQuaternion q =
+ ExprQuaternion::From(param[3], param[4], param[5], param[6]);
+ orig = q.Rotate(orig);
+ r = orig.Plus(trans);
+ break;
+ }
+ case POINT_N_ROT_AA: {
+ ExprVector orig = ExprVector::From(numPoint);
+ ExprVector trans = ExprVector::From(param[0], param[1], param[2]);
+ ExprQuaternion q = GetAxisAngleQuaternionExprs(3);
+ orig = orig.Minus(trans);
+ orig = q.Rotate(orig);
+ r = orig.Plus(trans);
+ break;
+ }
+ case POINT_N_COPY:
+ r = ExprVector::From(numPoint);
+ break;
+
+ default: oops();
+ }
+ return r;
+}
+
+void EntityBase::PointGetExprsInWorkplane(hEntity wrkpl, Expr **u, Expr **v) {
+ if(type == POINT_IN_2D && workplane.v == wrkpl.v) {
+ // They want our coordinates in the form that we've written them,
+ // very nice.
+ *u = Expr::From(param[0]);
+ *v = Expr::From(param[1]);
+ } else {
+ // Get the offset and basis vectors for this weird exotic csys.
+ EntityBase *w = SK.GetEntity(wrkpl);
+ ExprVector wp = w->WorkplaneGetOffsetExprs();
+ ExprVector wu = w->Normal()->NormalExprsU();
+ ExprVector wv = w->Normal()->NormalExprsV();
+
+ // Get our coordinates in three-space, and project them into that
+ // coordinate system.
+ ExprVector ev = PointGetExprs();
+ ev = ev.Minus(wp);
+ *u = ev.Dot(wu);
+ *v = ev.Dot(wv);
+ }
+}
+
+void EntityBase::PointForceQuaternionTo(Quaternion q) {
+ if(type != POINT_N_ROT_TRANS) oops();
+
+ SK.GetParam(param[3])->val = q.w;
+ SK.GetParam(param[4])->val = q.vx;
+ SK.GetParam(param[5])->val = q.vy;
+ SK.GetParam(param[6])->val = q.vz;
+}
+
+Quaternion EntityBase::GetAxisAngleQuaternion(int param0) {
+ Quaternion q;
+ double theta = timesApplied*SK.GetParam(param[param0+0])->val;
+ double s = sin(theta), c = cos(theta);
+ q.w = c;
+ q.vx = s*SK.GetParam(param[param0+1])->val;
+ q.vy = s*SK.GetParam(param[param0+2])->val;
+ q.vz = s*SK.GetParam(param[param0+3])->val;
+ return q;
+}
+
+ExprQuaternion EntityBase::GetAxisAngleQuaternionExprs(int param0) {
+ ExprQuaternion q;
+
+ Expr *theta = Expr::From(timesApplied)->Times(
+ Expr::From(param[param0+0]));
+ Expr *c = theta->Cos(), *s = theta->Sin();
+ q.w = c;
+ q.vx = s->Times(Expr::From(param[param0+1]));
+ q.vy = s->Times(Expr::From(param[param0+2]));
+ q.vz = s->Times(Expr::From(param[param0+3]));
+ return q;
+}
+
+Quaternion EntityBase::PointGetQuaternion(void) {
+ Quaternion q;
+
+ if(type == POINT_N_ROT_AA) {
+ q = GetAxisAngleQuaternion(3);
+ } else if(type == POINT_N_ROT_TRANS) {
+ q = Quaternion::From(param[3], param[4], param[5], param[6]);
+ } else oops();
+
+ return q;
+}
+
+bool EntityBase::IsFace(void) {
+ switch(type) {
+ case FACE_NORMAL_PT:
+ case FACE_XPROD:
+ case FACE_N_ROT_TRANS:
+ case FACE_N_TRANS:
+ case FACE_N_ROT_AA:
+ return true;
+ default:
+ return false;
+ }
+}
+
+ExprVector EntityBase::FaceGetNormalExprs(void) {
+ ExprVector r;
+ if(type == FACE_NORMAL_PT) {
+ Vector v = Vector::From(numNormal.vx, numNormal.vy, numNormal.vz);
+ r = ExprVector::From(v.WithMagnitude(1));
+ } else if(type == FACE_XPROD) {
+ ExprVector vc = ExprVector::From(param[0], param[1], param[2]);
+ ExprVector vn =
+ ExprVector::From(numNormal.vx, numNormal.vy, numNormal.vz);
+ r = vc.Cross(vn);
+ r = r.WithMagnitude(Expr::From(1.0));
+ } else if(type == FACE_N_ROT_TRANS) {
+ // The numerical normal vector gets the rotation; the numerical
+ // normal has magnitude one, and the rotation doesn't change that,
+ // so there's no need to fix it up.
+ r = ExprVector::From(numNormal.vx, numNormal.vy, numNormal.vz);
+ ExprQuaternion q =
+ ExprQuaternion::From(param[3], param[4], param[5], param[6]);
+ r = q.Rotate(r);
+ } else if(type == FACE_N_TRANS) {
+ r = ExprVector::From(numNormal.vx, numNormal.vy, numNormal.vz);
+ } else if(type == FACE_N_ROT_AA) {
+ r = ExprVector::From(numNormal.vx, numNormal.vy, numNormal.vz);
+ ExprQuaternion q = GetAxisAngleQuaternionExprs(3);
+ r = q.Rotate(r);
+ } else oops();
+ return r;
+}
+
+Vector EntityBase::FaceGetNormalNum(void) {
+ Vector r;
+ if(type == FACE_NORMAL_PT) {
+ r = Vector::From(numNormal.vx, numNormal.vy, numNormal.vz);
+ } else if(type == FACE_XPROD) {
+ Vector vc = Vector::From(param[0], param[1], param[2]);
+ Vector vn = Vector::From(numNormal.vx, numNormal.vy, numNormal.vz);
+ r = vc.Cross(vn);
+ } else if(type == FACE_N_ROT_TRANS) {
+ // The numerical normal vector gets the rotation
+ r = Vector::From(numNormal.vx, numNormal.vy, numNormal.vz);
+ Quaternion q = Quaternion::From(param[3], param[4], param[5], param[6]);
+ r = q.Rotate(r);
+ } else if(type == FACE_N_TRANS) {
+ r = Vector::From(numNormal.vx, numNormal.vy, numNormal.vz);
+ } else if(type == FACE_N_ROT_AA) {
+ r = Vector::From(numNormal.vx, numNormal.vy, numNormal.vz);
+ Quaternion q = GetAxisAngleQuaternion(3);
+ r = q.Rotate(r);
+ } else oops();
+ return r.WithMagnitude(1);
+}
+
+ExprVector EntityBase::FaceGetPointExprs(void) {
+ ExprVector r;
+ if(type == FACE_NORMAL_PT) {
+ r = SK.GetEntity(point[0])->PointGetExprs();
+ } else if(type == FACE_XPROD) {
+ r = ExprVector::From(numPoint);
+ } else if(type == FACE_N_ROT_TRANS) {
+ // The numerical point gets the rotation and translation.
+ ExprVector trans = ExprVector::From(param[0], param[1], param[2]);
+ ExprQuaternion q =
+ ExprQuaternion::From(param[3], param[4], param[5], param[6]);
+ r = ExprVector::From(numPoint);
+ r = q.Rotate(r);
+ r = r.Plus(trans);
+ } else if(type == FACE_N_TRANS) {
+ ExprVector trans = ExprVector::From(param[0], param[1], param[2]);
+ r = ExprVector::From(numPoint);
+ r = r.Plus(trans.ScaledBy(Expr::From(timesApplied)));
+ } else if(type == FACE_N_ROT_AA) {
+ ExprVector trans = ExprVector::From(param[0], param[1], param[2]);
+ ExprQuaternion q = GetAxisAngleQuaternionExprs(3);
+ r = ExprVector::From(numPoint);
+ r = r.Minus(trans);
+ r = q.Rotate(r);
+ r = r.Plus(trans);
+ } else oops();
+ return r;
+}
+
+Vector EntityBase::FaceGetPointNum(void) {
+ Vector r;
+ if(type == FACE_NORMAL_PT) {
+ r = SK.GetEntity(point[0])->PointGetNum();
+ } else if(type == FACE_XPROD) {
+ r = numPoint;
+ } else if(type == FACE_N_ROT_TRANS) {
+ // The numerical point gets the rotation and translation.
+ Vector trans = Vector::From(param[0], param[1], param[2]);
+ Quaternion q = Quaternion::From(param[3], param[4], param[5], param[6]);
+ r = q.Rotate(numPoint);
+ r = r.Plus(trans);
+ } else if(type == FACE_N_TRANS) {
+ Vector trans = Vector::From(param[0], param[1], param[2]);
+ r = numPoint.Plus(trans.ScaledBy(timesApplied));
+ } else if(type == FACE_N_ROT_AA) {
+ Vector trans = Vector::From(param[0], param[1], param[2]);
+ Quaternion q = GetAxisAngleQuaternion(3);
+ r = numPoint.Minus(trans);
+ r = q.Rotate(r);
+ r = r.Plus(trans);
+ } else oops();
+ return r;
+}
+
+bool EntityBase::HasEndpoints(void) {
+ return (type == LINE_SEGMENT) ||
+ (type == CUBIC) ||
+ (type == ARC_OF_CIRCLE);
+}
+Vector EntityBase::EndpointStart() {
+ if(type == LINE_SEGMENT) {
+ return SK.GetEntity(point[0])->PointGetNum();
+ } else if(type == CUBIC) {
+ return CubicGetStartNum();
+ } else if(type == ARC_OF_CIRCLE) {
+ return SK.GetEntity(point[1])->PointGetNum();
+ } else {
+ oops();
+ }
+}
+Vector EntityBase::EndpointFinish() {
+ if(type == LINE_SEGMENT) {
+ return SK.GetEntity(point[1])->PointGetNum();
+ } else if(type == CUBIC) {
+ return CubicGetFinishNum();
+ } else if(type == ARC_OF_CIRCLE) {
+ return SK.GetEntity(point[2])->PointGetNum();
+ } else {
+ oops();
+ }
+}
+
+void EntityBase::AddEq(IdList<Equation,hEquation> *l, Expr *expr, int index) {
+ Equation eq;
+ eq.e = expr;
+ eq.h = h.equation(index);
+ l->Add(&eq);
+}
+
+void EntityBase::GenerateEquations(IdList<Equation,hEquation> *l) {
+ switch(type) {
+ case NORMAL_IN_3D: {
+ ExprQuaternion q = NormalGetExprs();
+ AddEq(l, (q.Magnitude())->Minus(Expr::From(1)), 0);
+ break;
+ }
+ case ARC_OF_CIRCLE: {
+ // If this is a copied entity, with its point already fixed
+ // with respect to each other, then we don't want to generate
+ // the distance constraint!
+ if(SK.GetEntity(point[0])->type != POINT_IN_2D) break;
+
+ // If the two endpoints of the arc are constrained coincident
+ // (to make a complete circle), then our distance constraint
+ // would be redundant and therefore overconstrain things.
+ int i;
+ for(i = 0; i < SK.constraint.n; i++) {
+ ConstraintBase *c = &(SK.constraint.elem[i]);
+ if(c->group.v != group.v) continue;
+ if(c->type != Constraint::POINTS_COINCIDENT) continue;
+
+ if((c->ptA.v == point[1].v && c->ptB.v == point[2].v) ||
+ (c->ptA.v == point[2].v && c->ptB.v == point[1].v))
+ {
+ break;
+ }
+ }
+ if(i < SK.constraint.n) break;
+
+ Expr *ra = Constraint::Distance(workplane, point[0], point[1]);
+ Expr *rb = Constraint::Distance(workplane, point[0], point[2]);
+ AddEq(l, ra->Minus(rb), 0);
+ break;
+ }
+ default:;
+ // Most entities do not generate equations.
+ }
+}
+
--- /dev/null
+//-----------------------------------------------------------------------------
+// The 2d vector output stuff that isn't specific to any particular file
+// format: getting the appropriate lines and curves, performing hidden line
+// removal, calculating bounding boxes, and so on. Also raster and triangle
+// mesh output.
+//
+// Copyright 2008-2013 Jonathan Westhues.
+//-----------------------------------------------------------------------------
+#include "solvespace.h"
+#ifndef WIN32
+#include <unix/gloffscreen.h>
+#endif
+#include <png.h>
+
+void SolveSpaceUI::ExportSectionTo(const std::string &filename) {
+ Vector gn = (SS.GW.projRight).Cross(SS.GW.projUp);
+ gn = gn.WithMagnitude(1);
+
+ Group *g = SK.GetGroup(SS.GW.activeGroup);
+ g->GenerateDisplayItems();
+ if(g->displayMesh.IsEmpty()) {
+ Error("No solid model present; draw one with extrudes and revolves, "
+ "or use Export 2d View to export bare lines and curves.");
+ return;
+ }
+
+ // The plane in which the exported section lies; need this because we'll
+ // reorient from that plane into the xy plane before exporting.
+ Vector origin, u, v, n;
+ double d;
+
+ SS.GW.GroupSelection();
+#define gs (SS.GW.gs)
+ if((gs.n == 0 && g->activeWorkplane.v != Entity::FREE_IN_3D.v)) {
+ Entity *wrkpl = SK.GetEntity(g->activeWorkplane);
+ origin = wrkpl->WorkplaneGetOffset();
+ n = wrkpl->Normal()->NormalN();
+ u = wrkpl->Normal()->NormalU();
+ v = wrkpl->Normal()->NormalV();
+ } else if(gs.n == 1 && gs.faces == 1) {
+ Entity *face = SK.GetEntity(gs.entity[0]);
+ origin = face->FaceGetPointNum();
+ n = face->FaceGetNormalNum();
+ if(n.Dot(gn) < 0) n = n.ScaledBy(-1);
+ u = n.Normal(0);
+ v = n.Normal(1);
+ } else if(gs.n == 3 && gs.vectors == 2 && gs.points == 1) {
+ Vector ut = SK.GetEntity(gs.entity[0])->VectorGetNum(),
+ vt = SK.GetEntity(gs.entity[1])->VectorGetNum();
+ ut = ut.WithMagnitude(1);
+ vt = vt.WithMagnitude(1);
+
+ if(fabs(SS.GW.projUp.Dot(vt)) < fabs(SS.GW.projUp.Dot(ut))) {
+ swap(ut, vt);
+ }
+ if(SS.GW.projRight.Dot(ut) < 0) ut = ut.ScaledBy(-1);
+ if(SS.GW.projUp. Dot(vt) < 0) vt = vt.ScaledBy(-1);
+
+ origin = SK.GetEntity(gs.point[0])->PointGetNum();
+ n = ut.Cross(vt);
+ u = ut.WithMagnitude(1);
+ v = (n.Cross(u)).WithMagnitude(1);
+ } else {
+ Error("Bad selection for export section. Please select:\n\n"
+ " * nothing, with an active workplane "
+ "(workplane is section plane)\n"
+ " * a face (section plane through face)\n"
+ " * a point and two line segments "
+ "(plane through point and parallel to lines)\n");
+ return;
+ }
+ SS.GW.ClearSelection();
+
+ n = n.WithMagnitude(1);
+ d = origin.Dot(n);
+
+ SEdgeList el = {};
+ SBezierList bl = {};
+
+ // If there's a mesh, then grab the edges from it.
+ g->runningMesh.MakeEdgesInPlaneInto(&el, n, d);
+
+ // If there's a shell, then grab the edges and possibly Beziers.
+ g->runningShell.MakeSectionEdgesInto(n, d,
+ &el,
+ (SS.exportPwlCurves || fabs(SS.exportOffset) > LENGTH_EPS) ? NULL : &bl);
+
+ // All of these are solid model edges, so use the appropriate style.
+ SEdge *se;
+ for(se = el.l.First(); se; se = el.l.NextAfter(se)) {
+ se->auxA = Style::SOLID_EDGE;
+ }
+ SBezier *sb;
+ for(sb = bl.l.First(); sb; sb = bl.l.NextAfter(sb)) {
+ sb->auxA = Style::SOLID_EDGE;
+ }
+
+ el.CullExtraneousEdges();
+ bl.CullIdenticalBeziers();
+
+ // And write the edges.
+ VectorFileWriter *out = VectorFileWriter::ForFile(filename);
+ if(out) {
+ // parallel projection (no perspective), and no mesh
+ ExportLinesAndMesh(&el, &bl, NULL,
+ u, v, n, origin, 0,
+ out);
+ }
+ el.Clear();
+ bl.Clear();
+}
+
+void SolveSpaceUI::ExportViewOrWireframeTo(const std::string &filename, bool wireframe) {
+ int i;
+ SEdgeList edges = {};
+ SBezierList beziers = {};
+
+ VectorFileWriter *out = VectorFileWriter::ForFile(filename);
+ if(!out) return;
+
+ SS.exportMode = true;
+ GenerateAll(GENERATE_ALL);
+
+ SMesh *sm = NULL;
+ if(SS.GW.showShaded || SS.GW.showHdnLines) {
+ Group *g = SK.GetGroup(SS.GW.activeGroup);
+ g->GenerateDisplayItems();
+ sm = &(g->displayMesh);
+ }
+ if(sm && sm->IsEmpty()) {
+ sm = NULL;
+ }
+
+ for(i = 0; i < SK.entity.n; i++) {
+ Entity *e = &(SK.entity.elem[i]);
+ if(!e->IsVisible()) continue;
+ if(e->construction) continue;
+
+ if(SS.exportPwlCurves || sm || fabs(SS.exportOffset) > LENGTH_EPS)
+ {
+ // We will be doing hidden line removal, which we can't do on
+ // exact curves; so we need things broken down to pwls. Same
+ // problem with cutter radius compensation.
+ e->GenerateEdges(&edges);
+ } else {
+ e->GenerateBezierCurves(&beziers);
+ }
+ }
+
+ if(SS.GW.showEdges) {
+ Group *g = SK.GetGroup(SS.GW.activeGroup);
+ g->GenerateDisplayItems();
+ SEdgeList *selr = &(g->displayEdges);
+ SEdge *se;
+ for(se = selr->l.First(); se; se = selr->l.NextAfter(se)) {
+ edges.AddEdge(se->a, se->b, Style::SOLID_EDGE);
+ }
+ }
+
+ if(SS.GW.showConstraints) {
+ if(!out->OutputConstraints(&SK.constraint)) {
+ // The output format cannot represent constraints directly,
+ // so convert them to edges.
+ Constraint *c;
+ for(c = SK.constraint.First(); c; c = SK.constraint.NextAfter(c)) {
+ c->GetEdges(&edges);
+ }
+ }
+ }
+
+ if(wireframe) {
+ Vector u = Vector::From(1.0, 0.0, 0.0),
+ v = Vector::From(0.0, 1.0, 0.0),
+ n = Vector::From(0.0, 0.0, 1.0),
+ origin = Vector::From(0.0, 0.0, 0.0);
+ double cameraTan = 0.0,
+ scale = 1.0;
+
+ out->SetModelviewProjection(u, v, n, origin, cameraTan, scale);
+
+ ExportWireframeCurves(&edges, &beziers, out);
+ } else {
+ Vector u = SS.GW.projRight,
+ v = SS.GW.projUp,
+ n = u.Cross(v),
+ origin = SS.GW.offset.ScaledBy(-1);
+
+ out->SetModelviewProjection(u, v, n, origin,
+ SS.CameraTangent()*SS.GW.scale, SS.exportScale);
+
+ ExportLinesAndMesh(&edges, &beziers, sm,
+ u, v, n, origin, SS.CameraTangent()*SS.GW.scale,
+ out);
+
+ if(!out->HasCanvasSize()) {
+ // These file formats don't have a canvas size, so they just
+ // get exported in the raw coordinate system. So indicate what
+ // that was on-screen.
+ SS.justExportedInfo.showOrigin = true;
+ SS.justExportedInfo.pt = origin;
+ SS.justExportedInfo.u = u;
+ SS.justExportedInfo.v = v;
+ } else {
+ SS.justExportedInfo.showOrigin = false;
+ }
+
+ SS.justExportedInfo.draw = true;
+ InvalidateGraphics();
+ }
+
+ edges.Clear();
+ beziers.Clear();
+}
+
+void SolveSpaceUI::ExportWireframeCurves(SEdgeList *sel, SBezierList *sbl,
+ VectorFileWriter *out)
+{
+ SBezierLoopSetSet sblss = {};
+ SEdge *se;
+ for(se = sel->l.First(); se; se = sel->l.NextAfter(se)) {
+ SBezier sb = SBezier::From(
+ (se->a).ScaledBy(1.0 / SS.exportScale),
+ (se->b).ScaledBy(1.0 / SS.exportScale));
+ sblss.AddOpenPath(&sb);
+ }
+
+ sbl->ScaleSelfBy(1.0/SS.exportScale);
+ SBezier *sb;
+ for(sb = sbl->l.First(); sb; sb = sbl->l.NextAfter(sb)) {
+ sblss.AddOpenPath(sb);
+ }
+
+ out->OutputLinesAndMesh(&sblss, NULL);
+ sblss.Clear();
+}
+
+void SolveSpaceUI::ExportLinesAndMesh(SEdgeList *sel, SBezierList *sbl, SMesh *sm,
+ Vector u, Vector v, Vector n,
+ Vector origin, double cameraTan,
+ VectorFileWriter *out)
+{
+ double s = 1.0 / SS.exportScale;
+
+ // Project into the export plane; so when we're done, z doesn't matter,
+ // and x and y are what goes in the DXF.
+ SEdge *e;
+ for(e = sel->l.First(); e; e = sel->l.NextAfter(e)) {
+ // project into the specified csys, and apply export scale
+ (e->a) = e->a.InPerspective(u, v, n, origin, cameraTan).ScaledBy(s);
+ (e->b) = e->b.InPerspective(u, v, n, origin, cameraTan).ScaledBy(s);
+ }
+
+ SBezier *b;
+ if(sbl) {
+ for(b = sbl->l.First(); b; b = sbl->l.NextAfter(b)) {
+ *b = b->InPerspective(u, v, n, origin, cameraTan);
+ int i;
+ for(i = 0; i <= b->deg; i++) {
+ b->ctrl[i] = (b->ctrl[i]).ScaledBy(s);
+ }
+ }
+ }
+
+ // If cutter radius compensation is requested, then perform it now
+ if(fabs(SS.exportOffset) > LENGTH_EPS) {
+ // assemble those edges into a polygon, and clear the edge list
+ SPolygon sp = {};
+ sel->AssemblePolygon(&sp, NULL);
+ sel->Clear();
+
+ SPolygon compd = {};
+ sp.normal = Vector::From(0, 0, -1);
+ sp.FixContourDirections();
+ sp.OffsetInto(&compd, SS.exportOffset*s);
+ sp.Clear();
+
+ compd.MakeEdgesInto(sel);
+ compd.Clear();
+ }
+
+ // Now the triangle mesh; project, then build a BSP to perform
+ // occlusion testing and generated the shaded surfaces.
+ SMesh smp = {};
+ if(sm) {
+ Vector l0 = (SS.lightDir[0]).WithMagnitude(1),
+ l1 = (SS.lightDir[1]).WithMagnitude(1);
+ STriangle *tr;
+ for(tr = sm->l.First(); tr; tr = sm->l.NextAfter(tr)) {
+ STriangle tt = *tr;
+ tt.a = (tt.a).InPerspective(u, v, n, origin, cameraTan).ScaledBy(s);
+ tt.b = (tt.b).InPerspective(u, v, n, origin, cameraTan).ScaledBy(s);
+ tt.c = (tt.c).InPerspective(u, v, n, origin, cameraTan).ScaledBy(s);
+
+ // And calculate lighting for the triangle
+ Vector n = tt.Normal().WithMagnitude(1);
+ double lighting = SS.ambientIntensity +
+ max(0.0, (SS.lightIntensity[0])*(n.Dot(l0))) +
+ max(0.0, (SS.lightIntensity[1])*(n.Dot(l1)));
+ double r = min(1.0, tt.meta.color.redF() * lighting),
+ g = min(1.0, tt.meta.color.greenF() * lighting),
+ b = min(1.0, tt.meta.color.blueF() * lighting);
+ tt.meta.color = RGBf(r, g, b);
+ smp.AddTriangle(&tt);
+ }
+ }
+
+ SMesh sms = {};
+
+ // We need the mesh for occlusion testing, but if we don't/can't export it,
+ // don't generate it.
+ if(SS.GW.showShaded && out->CanOutputMesh()) {
+ // Use the BSP routines to generate the split triangles in paint order.
+ SBsp3 *bsp = SBsp3::FromMesh(&smp);
+ if(bsp) bsp->GenerateInPaintOrder(&sms);
+ // And cull the back-facing triangles
+ STriangle *tr;
+ sms.l.ClearTags();
+ for(tr = sms.l.First(); tr; tr = sms.l.NextAfter(tr)) {
+ Vector n = tr->Normal();
+ if(n.z < 0) {
+ tr->tag = 1;
+ }
+ }
+ sms.l.RemoveTagged();
+ }
+
+ // And now we perform hidden line removal if requested
+ SEdgeList hlrd = {};
+ if(sm) {
+ SKdNode *root = SKdNode::From(&smp);
+
+ // Generate the edges where a curved surface turns from front-facing
+ // to back-facing.
+ if(SS.GW.showEdges) {
+ root->MakeCertainEdgesInto(sel, SKdNode::TURNING_EDGES,
+ /*coplanarIsInter=*/false, NULL, NULL,
+ GW.showOutlines ? Style::OUTLINE : Style::SOLID_EDGE);
+ }
+
+ root->ClearTags();
+ int cnt = 1234;
+
+ SEdge *se;
+ for(se = sel->l.First(); se; se = sel->l.NextAfter(se)) {
+ if(se->auxA == Style::CONSTRAINT) {
+ // Constraints should not get hidden line removed; they're
+ // always on top.
+ hlrd.AddEdge(se->a, se->b, se->auxA);
+ continue;
+ }
+
+ SEdgeList edges = {};
+ // Split the original edge against the mesh
+ edges.AddEdge(se->a, se->b, se->auxA);
+ root->OcclusionTestLine(*se, &edges, cnt, /*removeHidden=*/!SS.GW.showHdnLines);
+ // the occlusion test splits unnecessarily; so fix those
+ edges.MergeCollinearSegments(se->a, se->b);
+ cnt++;
+ // And add the results to our output
+ SEdge *sen;
+ for(sen = edges.l.First(); sen; sen = edges.l.NextAfter(sen)) {
+ hlrd.AddEdge(sen->a, sen->b, sen->auxA);
+ }
+ edges.Clear();
+ }
+
+ sel = &hlrd;
+ }
+
+ // Clean up: remove overlapping line segments and
+ // segments with zero-length projections.
+ sel->l.ClearTags();
+ for(int i = 0; i < sel->l.n; ++i) {
+ SEdge *sei = &sel->l.elem[i];
+ hStyle hsi = { (uint32_t)sei->auxA };
+ Style *si = Style::Get(hsi);
+ if(sei->tag != 0) continue;
+
+ // Remove segments with zero length projections.
+ Vector ai = sei->a;
+ ai.z = 0.0;
+ Vector bi = sei->b;
+ bi.z = 0.0;
+ Vector di = bi.Minus(ai);
+ if(fabs(di.x) < LENGTH_EPS && fabs(di.y) < LENGTH_EPS) {
+ sei->tag = 1;
+ continue;
+ }
+
+ for(int j = i + 1; j < sel->l.n; ++j) {
+ SEdge *sej = &sel->l.elem[j];
+ if(sej->tag != 0) continue;
+
+ Vector *pAj = &sej->a;
+ Vector *pBj = &sej->b;
+
+ // Remove segments with zero length projections.
+ Vector aj = sej->a;
+ aj.z = 0.0;
+ Vector bj = sej->b;
+ bj.z = 0.0;
+ Vector dj = bj.Minus(aj);
+ if(fabs(dj.x) < LENGTH_EPS && fabs(dj.y) < LENGTH_EPS) {
+ sej->tag = 1;
+ continue;
+ }
+
+ // Skip non-collinear segments.
+ const double eps = 1e-6;
+ if(aj.DistanceToLine(ai, di) > eps) continue;
+ if(bj.DistanceToLine(ai, di) > eps) continue;
+
+ double ta = aj.Minus(ai).Dot(di) / di.Dot(di);
+ double tb = bj.Minus(ai).Dot(di) / di.Dot(di);
+ if(ta > tb) {
+ std::swap(pAj, pBj);
+ std::swap(ta, tb);
+ }
+
+ hStyle hsj = { (uint32_t)sej->auxA };
+ Style *sj = Style::Get(hsj);
+
+ bool canRemoveI = sej->auxA == sei->auxA || si->zIndex < sj->zIndex;
+ bool canRemoveJ = sej->auxA == sei->auxA || sj->zIndex < si->zIndex;
+
+ if(canRemoveJ) {
+ // j-segment inside i-segment
+ if(ta > 0.0 - eps && tb < 1.0 + eps) {
+ sej->tag = 1;
+ continue;
+ }
+
+ // cut segment
+ bool aInside = ta > 0.0 - eps && ta < 1.0 + eps;
+ if(tb > 1.0 - eps && aInside) {
+ *pAj = sei->b;
+ continue;
+ }
+
+ // cut segment
+ bool bInside = tb > 0.0 - eps && tb < 1.0 + eps;
+ if(ta < 0.0 - eps && bInside) {
+ *pBj = sei->a;
+ continue;
+ }
+
+ // split segment
+ if(ta < 0.0 - eps && tb > 1.0 + eps) {
+ sel->AddEdge(sei->b, *pBj, sej->auxA, sej->auxB);
+ *pBj = sei->a;
+ continue;
+ }
+ }
+
+ if(canRemoveI) {
+ // j-segment inside i-segment
+ if(ta < 0.0 + eps && tb > 1.0 - eps) {
+ sei->tag = 1;
+ break;
+ }
+
+ // cut segment
+ bool aInside = ta > 0.0 + eps && ta < 1.0 - eps;
+ if(tb > 1.0 - eps && aInside) {
+ sei->b = *pAj;
+ i--;
+ break;
+ }
+
+ // cut segment
+ bool bInside = tb > 0.0 + eps && tb < 1.0 - eps;
+ if(ta < 0.0 + eps && bInside) {
+ sei->a = *pBj;
+ i--;
+ break;
+ }
+
+ // split segment
+ if(ta > 0.0 + eps && tb < 1.0 - eps) {
+ sel->AddEdge(*pBj, sei->b, sei->auxA, sei->auxB);
+ sei->b = *pAj;
+ i--;
+ break;
+ }
+ }
+ }
+ }
+ sel->l.RemoveTagged();
+
+ // We kept the line segments and Beziers separate until now; but put them
+ // all together, and also project everything into the xy plane, since not
+ // all export targets ignore the z component of the points.
+ for(e = sel->l.First(); e; e = sel->l.NextAfter(e)) {
+ SBezier sb = SBezier::From(e->a, e->b);
+ sb.auxA = e->auxA;
+ sbl->l.Add(&sb);
+ }
+ for(b = sbl->l.First(); b; b = sbl->l.NextAfter(b)) {
+ for(int i = 0; i <= b->deg; i++) {
+ b->ctrl[i].z = 0;
+ }
+ }
+
+ // If possible, then we will assemble these output curves into loops. They
+ // will then get exported as closed paths.
+ SBezierLoopSetSet sblss = {};
+ SBezierList leftovers = {};
+ SSurface srf = SSurface::FromPlane(Vector::From(0, 0, 0),
+ Vector::From(1, 0, 0),
+ Vector::From(0, 1, 0));
+ SPolygon spxyz = {};
+ bool allClosed;
+ SEdge notClosedAt;
+ sbl->l.ClearTags();
+ sblss.FindOuterFacesFrom(sbl, &spxyz, &srf,
+ SS.ExportChordTolMm(),
+ &allClosed, ¬ClosedAt,
+ NULL, NULL,
+ &leftovers);
+ for(b = leftovers.l.First(); b; b = leftovers.l.NextAfter(b)) {
+ sblss.AddOpenPath(b);
+ }
+
+ // Now write the lines and triangles to the output file
+ out->OutputLinesAndMesh(&sblss, &sms);
+
+ leftovers.Clear();
+ spxyz.Clear();
+ sblss.Clear();
+ smp.Clear();
+ sms.Clear();
+ hlrd.Clear();
+}
+
+double VectorFileWriter::MmToPts(double mm) {
+ // 72 points in an inch
+ return (mm/25.4)*72;
+}
+
+VectorFileWriter *VectorFileWriter::ForFile(const std::string &filename) {
+ VectorFileWriter *ret;
+ bool needOpen = true;
+ if(FilenameHasExtension(filename, ".dxf")) {
+ static DxfFileWriter DxfWriter;
+ ret = &DxfWriter;
+ needOpen = false;
+ } else if(FilenameHasExtension(filename, ".ps") || FilenameHasExtension(filename, ".eps")) {
+ static EpsFileWriter EpsWriter;
+ ret = &EpsWriter;
+ } else if(FilenameHasExtension(filename, ".pdf")) {
+ static PdfFileWriter PdfWriter;
+ ret = &PdfWriter;
+ } else if(FilenameHasExtension(filename, ".svg")) {
+ static SvgFileWriter SvgWriter;
+ ret = &SvgWriter;
+ } else if(FilenameHasExtension(filename, ".plt")||FilenameHasExtension(filename, ".hpgl")) {
+ static HpglFileWriter HpglWriter;
+ ret = &HpglWriter;
+ } else if(FilenameHasExtension(filename, ".step")||FilenameHasExtension(filename, ".stp")) {
+ static Step2dFileWriter Step2dWriter;
+ ret = &Step2dWriter;
+ } else if(FilenameHasExtension(filename, ".txt")) {
+ static GCodeFileWriter GCodeWriter;
+ ret = &GCodeWriter;
+ } else {
+ Error("Can't identify output file type from file extension of "
+ "filename '%s'; try "
+ ".step, .stp, .dxf, .svg, .plt, .hpgl, .pdf, .txt, "
+ ".eps, or .ps.",
+ filename.c_str());
+ return NULL;
+ }
+ ret->filename = filename;
+ if(!needOpen) return ret;
+
+ FILE *f = ssfopen(filename, "wb");
+ if(!f) {
+ Error("Couldn't write to '%s'", filename.c_str());
+ return NULL;
+ }
+ ret->f = f;
+ return ret;
+}
+
+void VectorFileWriter::SetModelviewProjection(const Vector &u, const Vector &v, const Vector &n,
+ const Vector &origin, double cameraTan,
+ double scale) {
+ this->u = u;
+ this->v = v;
+ this->n = n;
+ this->origin = origin;
+ this->cameraTan = cameraTan;
+ this->scale = scale;
+}
+
+Vector VectorFileWriter::Transform(Vector &pos) const {
+ return pos.InPerspective(u, v, n, origin, cameraTan).ScaledBy(1.0 / scale);
+}
+
+void VectorFileWriter::OutputLinesAndMesh(SBezierLoopSetSet *sblss, SMesh *sm) {
+ STriangle *tr;
+ SBezier *b;
+
+ // First calculate the bounding box.
+ ptMin = Vector::From(VERY_POSITIVE, VERY_POSITIVE, VERY_POSITIVE);
+ ptMax = Vector::From(VERY_NEGATIVE, VERY_NEGATIVE, VERY_NEGATIVE);
+ if(sm) {
+ for(tr = sm->l.First(); tr; tr = sm->l.NextAfter(tr)) {
+ (tr->a).MakeMaxMin(&ptMax, &ptMin);
+ (tr->b).MakeMaxMin(&ptMax, &ptMin);
+ (tr->c).MakeMaxMin(&ptMax, &ptMin);
+ }
+ }
+ if(sblss) {
+ SBezierLoopSet *sbls;
+ for(sbls = sblss->l.First(); sbls; sbls = sblss->l.NextAfter(sbls)) {
+ SBezierLoop *sbl;
+ for(sbl = sbls->l.First(); sbl; sbl = sbls->l.NextAfter(sbl)) {
+ for(b = sbl->l.First(); b; b = sbl->l.NextAfter(b)) {
+ for(int i = 0; i <= b->deg; i++) {
+ (b->ctrl[i]).MakeMaxMin(&ptMax, &ptMin);
+ }
+ }
+ }
+ }
+ }
+
+ // And now we compute the canvas size.
+ double s = 1.0 / SS.exportScale;
+ if(SS.exportCanvasSizeAuto) {
+ // It's based on the calculated bounding box; we grow it along each
+ // boundary by the specified amount.
+ ptMin.x -= s*SS.exportMargin.left;
+ ptMax.x += s*SS.exportMargin.right;
+ ptMin.y -= s*SS.exportMargin.bottom;
+ ptMax.y += s*SS.exportMargin.top;
+ } else {
+ ptMin.x = -(s*SS.exportCanvas.dx);
+ ptMin.y = -(s*SS.exportCanvas.dy);
+ ptMax.x = ptMin.x + (s*SS.exportCanvas.width);
+ ptMax.y = ptMin.y + (s*SS.exportCanvas.height);
+ }
+
+ StartFile();
+ if(sm && SS.exportShadedTriangles) {
+ for(tr = sm->l.First(); tr; tr = sm->l.NextAfter(tr)) {
+ Triangle(tr);
+ }
+ }
+ if(sblss) {
+ SBezierLoopSet *sbls;
+ for(sbls = sblss->l.First(); sbls; sbls = sblss->l.NextAfter(sbls)) {
+ SBezierLoop *sbl;
+ sbl = sbls->l.First();
+ if(!sbl) continue;
+ b = sbl->l.First();
+ if(!b || !Style::Exportable(b->auxA)) continue;
+
+ hStyle hs = { (uint32_t)b->auxA };
+ Style *stl = Style::Get(hs);
+ double lineWidth = Style::WidthMm(b->auxA)*s;
+ RgbaColor strokeRgb = Style::Color(hs, true);
+ RgbaColor fillRgb = Style::FillColor(hs, true);
+
+ StartPath(strokeRgb, lineWidth, stl->filled, fillRgb, hs);
+ for(sbl = sbls->l.First(); sbl; sbl = sbls->l.NextAfter(sbl)) {
+ for(b = sbl->l.First(); b; b = sbl->l.NextAfter(b)) {
+ Bezier(b);
+ }
+ }
+ FinishPath(strokeRgb, lineWidth, stl->filled, fillRgb, hs);
+ }
+ }
+ FinishAndCloseFile();
+}
+
+void VectorFileWriter::BezierAsPwl(SBezier *sb) {
+ List<Vector> lv = {};
+ sb->MakePwlInto(&lv, SS.ExportChordTolMm());
+ int i;
+ for(i = 1; i < lv.n; i++) {
+ SBezier sb = SBezier::From(lv.elem[i-1], lv.elem[i]);
+ Bezier(&sb);
+ }
+ lv.Clear();
+}
+
+void VectorFileWriter::BezierAsNonrationalCubic(SBezier *sb, int depth) {
+ Vector t0 = sb->TangentAt(0), t1 = sb->TangentAt(1);
+ // The curve is correct, and the first derivatives are correct, at the
+ // endpoints.
+ SBezier bnr = SBezier::From(
+ sb->Start(),
+ sb->Start().Plus(t0.ScaledBy(1.0/3)),
+ sb->Finish().Minus(t1.ScaledBy(1.0/3)),
+ sb->Finish());
+
+ double tol = SS.ExportChordTolMm();
+ // Arbitrary choice, but make it a little finer than pwl tolerance since
+ // it should be easier to achieve that with the smooth curves.
+ tol /= 2;
+
+ bool closeEnough = true;
+ int i;
+ for(i = 1; i <= 3; i++) {
+ double t = i/4.0;
+ Vector p0 = sb->PointAt(t),
+ pn = bnr.PointAt(t);
+ double d = (p0.Minus(pn)).Magnitude();
+ if(d > tol) {
+ closeEnough = false;
+ }
+ }
+
+ if(closeEnough || depth > 3) {
+ Bezier(&bnr);
+ } else {
+ SBezier bef, aft;
+ sb->SplitAt(0.5, &bef, &aft);
+ BezierAsNonrationalCubic(&bef, depth+1);
+ BezierAsNonrationalCubic(&aft, depth+1);
+ }
+}
+
+//-----------------------------------------------------------------------------
+// Export a triangle mesh, in the requested format.
+//-----------------------------------------------------------------------------
+void SolveSpaceUI::ExportMeshTo(const std::string &filename) {
+ SS.exportMode = true;
+ GenerateAll(GENERATE_ALL);
+
+ Group *g = SK.GetGroup(SS.GW.activeGroup);
+ g->GenerateDisplayItems();
+
+ SMesh *m = &(SK.GetGroup(SS.GW.activeGroup)->displayMesh);
+ if(m->IsEmpty()) {
+ Error("Active group mesh is empty; nothing to export.");
+ return;
+ }
+
+ FILE *f = ssfopen(filename, "wb");
+ if(!f) {
+ Error("Couldn't write to '%s'", filename.c_str());
+ return;
+ }
+
+ if(FilenameHasExtension(filename, ".stl")) {
+ ExportMeshAsStlTo(f, m);
+ } else if(FilenameHasExtension(filename, ".obj")) {
+ ExportMeshAsObjTo(f, m);
+ } else if(FilenameHasExtension(filename, ".js") ||
+ FilenameHasExtension(filename, ".html")) {
+ SEdgeList *e = &(SK.GetGroup(SS.GW.activeGroup)->displayEdges);
+ ExportMeshAsThreeJsTo(f, filename, m, e);
+ } else {
+ Error("Can't identify output file type from file extension of "
+ "filename '%s'; try .stl, .obj, .js.", filename.c_str());
+ }
+
+ fclose(f);
+
+ SS.justExportedInfo.showOrigin = false;
+ SS.justExportedInfo.draw = true;
+ InvalidateGraphics();
+}
+
+//-----------------------------------------------------------------------------
+// Export the mesh as an STL file; it should always be vertex-to-vertex and
+// not self-intersecting, so not much to do.
+//-----------------------------------------------------------------------------
+void SolveSpaceUI::ExportMeshAsStlTo(FILE *f, SMesh *sm) {
+ char str[80] = {};
+ strcpy(str, "STL exported mesh");
+ fwrite(str, 1, 80, f);
+
+ uint32_t n = sm->l.n;
+ fwrite(&n, 4, 1, f);
+
+ double s = SS.exportScale;
+ int i;
+ for(i = 0; i < sm->l.n; i++) {
+ STriangle *tr = &(sm->l.elem[i]);
+ Vector n = tr->Normal().WithMagnitude(1);
+ float w;
+ w = (float)n.x; fwrite(&w, 4, 1, f);
+ w = (float)n.y; fwrite(&w, 4, 1, f);
+ w = (float)n.z; fwrite(&w, 4, 1, f);
+ w = (float)((tr->a.x)/s); fwrite(&w, 4, 1, f);
+ w = (float)((tr->a.y)/s); fwrite(&w, 4, 1, f);
+ w = (float)((tr->a.z)/s); fwrite(&w, 4, 1, f);
+ w = (float)((tr->b.x)/s); fwrite(&w, 4, 1, f);
+ w = (float)((tr->b.y)/s); fwrite(&w, 4, 1, f);
+ w = (float)((tr->b.z)/s); fwrite(&w, 4, 1, f);
+ w = (float)((tr->c.x)/s); fwrite(&w, 4, 1, f);
+ w = (float)((tr->c.y)/s); fwrite(&w, 4, 1, f);
+ w = (float)((tr->c.z)/s); fwrite(&w, 4, 1, f);
+ fputc(0, f);
+ fputc(0, f);
+ }
+}
+
+//-----------------------------------------------------------------------------
+// Export the mesh as Wavefront OBJ format. This requires us to reduce all the
+// identical vertices to the same identifier, so do that first.
+//-----------------------------------------------------------------------------
+void SolveSpaceUI::ExportMeshAsObjTo(FILE *f, SMesh *sm) {
+ SPointList spl = {};
+ STriangle *tr;
+ for(tr = sm->l.First(); tr; tr = sm->l.NextAfter(tr)) {
+ spl.IncrementTagFor(tr->a);
+ spl.IncrementTagFor(tr->b);
+ spl.IncrementTagFor(tr->c);
+ }
+
+ // Output all the vertices.
+ SPoint *sp;
+ for(sp = spl.l.First(); sp; sp = spl.l.NextAfter(sp)) {
+ fprintf(f, "v %.10f %.10f %.10f\r\n",
+ sp->p.x / SS.exportScale,
+ sp->p.y / SS.exportScale,
+ sp->p.z / SS.exportScale);
+ }
+
+ // And now all the triangular faces, in terms of those vertices. The
+ // file format counts from 1, not 0.
+ for(tr = sm->l.First(); tr; tr = sm->l.NextAfter(tr)) {
+ fprintf(f, "f %d %d %d\r\n",
+ spl.IndexForPoint(tr->a) + 1,
+ spl.IndexForPoint(tr->b) + 1,
+ spl.IndexForPoint(tr->c) + 1);
+ }
+
+ spl.Clear();
+}
+
+//-----------------------------------------------------------------------------
+// Export the mesh as a JavaScript script, which is compatible with Three.js.
+//-----------------------------------------------------------------------------
+void SolveSpaceUI::ExportMeshAsThreeJsTo(FILE *f, const std::string &filename,
+ SMesh *sm, SEdgeList *sel)
+{
+ SPointList spl = {};
+ STriangle *tr;
+ SEdge *e;
+ Vector bndl, bndh;
+ const char htmlbegin0[] = R"(
+<!DOCTYPE html>
+<html lang="en">
+ <head>
+ <meta charset="utf-8"></meta>
+ <title>Three.js Solvespace Mesh</title>
+ <script src="http://threejs.org/build/three.js"></script>
+ <script src="http://hammerjs.github.io/dist/hammer.js"></script>
+ <style type="text/css">
+ body { margin: 0; overflow: hidden; }
+ </style>
+ </head>
+ <body>
+ <script>
+ </script>
+ <script>
+window.devicePixelRatio = window.devicePixelRatio || 1;
+
+SolvespaceCamera = function(renderWidth, renderHeight, scale, up, right, offset) {
+ THREE.Camera.call(this);
+
+ this.type = 'SolvespaceCamera';
+
+ this.renderWidth = renderWidth;
+ this.renderHeight = renderHeight;
+ this.zoomScale = scale; /* Avoid namespace collision w/ THREE.Object.scale */
+ this.up = up;
+ this.right = right;
+ this.offset = offset;
+ this.depthBias = 0;
+
+ this.updateProjectionMatrix();
+ };
+
+ SolvespaceCamera.prototype = Object.create(THREE.Camera.prototype);
+ SolvespaceCamera.prototype.constructor = SolvespaceCamera;
+ SolvespaceCamera.prototype.updateProjectionMatrix = function() {
+ var temp = new THREE.Matrix4();
+ var offset = new THREE.Matrix4().makeTranslation(this.offset.x, this.offset.y, this.offset.z);
+ // Convert to right handed- do up cross right instead.
+ var n = new THREE.Vector3().crossVectors(this.up, this.right);
+ var rotate = new THREE.Matrix4().makeBasis(this.right, this.up, n);
+ rotate.transpose();
+ /* FIXME: At some point we ended up using row-major.
+ THREE.js wants column major. Scale/depth correct unaffected b/c diagonal
+ matrices remain the same when transposed. makeTranslation also makes
+ a column-major matrix. */
+
+ /* TODO: If we want perspective, we need an additional matrix
+ here which will modify w for perspective divide. */
+ var scale = new THREE.Matrix4().makeScale(2 * this.zoomScale / this.renderWidth,
+ 2 * this.zoomScale / this.renderHeight, this.zoomScale / 30000.0);
+
+ temp.multiply(scale);
+ temp.multiply(rotate);
+ temp.multiply(offset);
+
+ this.projectionMatrix.copy(temp);
+ };
+
+ SolvespaceCamera.prototype.NormalizeProjectionVectors = function() {
+ /* After rotating, up and right may no longer be orthogonal.
+ However, their cross product will produce the correct
+ rotated plane, and we can recover an orthogonal basis. */
+ var n = new THREE.Vector3().crossVectors(this.right, this.up);
+ this.up = new THREE.Vector3().crossVectors(n, this.right);
+ this.right.normalize();
+ this.up.normalize();
+ };
+
+ SolvespaceCamera.prototype.rotate = function(right, up) {
+ var oldRight = new THREE.Vector3().copy(this.right).normalize();
+ var oldUp = new THREE.Vector3().copy(this.up).normalize();
+ this.up.applyAxisAngle(oldRight, up);
+ this.right.applyAxisAngle(oldUp, right);
+ this.NormalizeProjectionVectors();
+ }
+
+ SolvespaceCamera.prototype.offsetProj = function(right, up) {
+ var shift = new THREE.Vector3(right * this.right.x + up * this.up.x,
+ right * this.right.y + up * this.up.y,
+ right * this.right.z + up * this.up.z);
+ this.offset.add(shift);
+ }
+
+ /* Calculate the offset in terms of up and right projection vectors
+ that will preserve the world coordinates of the current mouse position after
+ the zoom. */
+ SolvespaceCamera.prototype.zoomTo = function(x, y, delta) {
+ // Get offset components in world coordinates, in terms of up/right.
+ var projOffsetX = this.offset.dot(this.right);
+ var projOffsetY = this.offset.dot(this.up);
+
+ /* Remove offset before scaling so, that mouse position changes
+ proportionally to the model and independent of current offset. */
+ var centerRightI = x/this.zoomScale - projOffsetX;
+ var centerUpI = y/this.zoomScale - projOffsetY;
+ var zoomFactor;
+
+ /* Zoom 20% every 100 delta. */
+ if(delta < 0) {
+ zoomFactor = (-delta * 0.002 + 1);
+ }
+ else if(delta > 0) {
+ zoomFactor = (delta * (-1.0/600.0) + 1)
+ }
+ else {
+ return;
+ }
+
+ this.zoomScale = this.zoomScale * zoomFactor;
+ var centerRightF = x/this.zoomScale - projOffsetX;
+ var centerUpF = y/this.zoomScale - projOffsetY;
+
+ this.offset.addScaledVector(this.right, centerRightF - centerRightI);
+ this.offset.addScaledVector(this.up, centerUpF - centerUpI);
+ }
+
+
+ SolvespaceControls = function(object, domElement) {
+ var _this = this;
+ this.object = object;
+ this.domElement = ( domElement !== undefined ) ? domElement : document;
+
+ var threePan = new Hammer.Pan({event : 'threepan', pointers : 3, enable : false});
+ var panAfterTap = new Hammer.Pan({event : 'panaftertap', enable : false});
+
+ this.touchControls = new Hammer.Manager(domElement, {
+ recognizers: [
+ [Hammer.Pinch, { enable: true }],
+ [Hammer.Pan],
+ [Hammer.Tap],
+ ]
+ });
+
+ this.touchControls.add(threePan);
+ this.touchControls.add(panAfterTap);
+
+ var changeEvent = {
+ type: 'change'
+ };
+ var startEvent = {
+ type: 'start'
+ };
+ var endEvent = {
+ type: 'end'
+ };
+
+ var _changed = false;
+ var _mouseMoved = false;
+ //var _touchPoints = new Array();
+ var _offsetPrev = new THREE.Vector2(0, 0);
+ var _offsetCur = new THREE.Vector2(0, 0);
+ var _rotatePrev = new THREE.Vector2(0, 0);
+ var _rotateCur = new THREE.Vector2(0, 0);
+
+ // Used during touch events.
+ var _rotateOrig = new THREE.Vector2(0, 0);
+ var _offsetOrig = new THREE.Vector2(0, 0);
+ var _prevScale = 1.0;
+
+ this.handleEvent = function(event) {
+ if (typeof this[event.type] == 'function') {
+ this[event.type](event);
+ }
+ }
+
+ function mousedown(event) {
+ event.preventDefault();
+ event.stopPropagation();
+
+ switch (event.button) {
+ case 0:
+ _rotateCur.set(event.screenX/window.devicePixelRatio, event.screenY/window.devicePixelRatio);
+ _rotatePrev.copy(_rotateCur);
+ document.addEventListener('mousemove', mousemove, false);
+ document.addEventListener('mouseup', mouseup, false);
+ break;
+ case 2:
+ _offsetCur.set(event.screenX/window.devicePixelRatio, event.screenY/window.devicePixelRatio);
+ _offsetPrev.copy(_offsetCur);
+ document.addEventListener('mousemove', mousemove, false);
+ document.addEventListener('mouseup', mouseup, false);
+ break;
+ default:
+ break;
+ }
+ }
+
+ function wheel( event ) {
+ event.preventDefault();
+ /* FIXME: Width and height might not be supported universally, but
+ can be calculated? */
+ var box = _this.domElement.getBoundingClientRect();
+ object.zoomTo(event.clientX - box.width/2 - box.left,
+ -(event.clientY - box.height/2 - box.top), event.deltaY);
+ _changed = true;
+ }
+
+ function mousemove(event) {
+ switch (event.button) {
+ case 0:
+ _rotateCur.set(event.screenX/window.devicePixelRatio, event.screenY/window.devicePixelRatio);
+ var diff = new THREE.Vector2().subVectors(_rotateCur, _rotatePrev)
+ .multiplyScalar(1 / object.zoomScale);
+ object.rotate(-0.3 * Math.PI / 180 * diff.x * object.zoomScale,
+ -0.3 * Math.PI / 180 * diff.y * object.zoomScale);
+ _changed = true;
+ _rotatePrev.copy(_rotateCur);
+ break;
+ case 2:
+ _mouseMoved = true;
+ _offsetCur.set(event.screenX/window.devicePixelRatio, event.screenY/window.devicePixelRatio);
+ var diff = new THREE.Vector2().subVectors(_offsetCur, _offsetPrev)
+ .multiplyScalar(1 / object.zoomScale);
+ object.offsetProj(diff.x, -diff.y);
+ _changed = true;
+ _offsetPrev.copy(_offsetCur)
+ break;
+ }
+ }
+
+
+ function mouseup(event) {
+ /* TODO: Opera mouse gestures will intercept this event, making it
+ possible to have multiple mousedown events consecutively without
+ a corresponding mouseup (so multiple viewports can be rotated/panned
+ simultaneously). Disable mouse gestures for now. */
+ event.preventDefault();
+ event.stopPropagation();
+
+ document.removeEventListener('mousemove', mousemove);
+ document.removeEventListener('mouseup', mouseup);
+
+ _this.dispatchEvent(endEvent);
+ }
+
+ function pan(event) {
+ /* neWcur - prev does not necessarily equal (cur + diff) - prev.
+ Floating point is not associative. */
+ touchDiff = new THREE.Vector2(event.deltaX, event.deltaY);
+ _rotateCur.addVectors(_rotateOrig, touchDiff);
+ incDiff = new THREE.Vector2().subVectors(_rotateCur, _rotatePrev)
+ .multiplyScalar(1 / object.zoomScale);
+ object.rotate(-0.3 * Math.PI / 180 * incDiff.x * object.zoomScale,
+ -0.3 * Math.PI / 180 * incDiff.y * object.zoomScale);
+ _changed = true;
+ _rotatePrev.copy(_rotateCur);
+ }
+
+ function panstart(event) {
+ /* TODO: Dynamically enable pan function? */
+ _rotateOrig.copy(_rotateCur);
+ }
+
+ function pinchstart(event) {
+ _prevScale = event.scale;
+ }
+
+ function pinch(event) {
+ /* FIXME: Width and height might not be supported universally, but
+ can be calculated? */
+ var box = _this.domElement.getBoundingClientRect();
+
+ /* 16.6... pixels chosen heuristically... matches my touchpad. */
+ if (event.scale < _prevScale) {
+ object.zoomTo(event.center.x - box.width/2 - box.left,
+ -(event.center.y - box.height/2 - box.top), 100/6.0);
+ _changed = true;
+ } else if (event.scale > _prevScale) {
+ object.zoomTo(event.center.x - box.width/2 - box.left,
+ -(event.center.y - box.height/2 - box.top), -100/6.0);
+ _changed = true;
+ }
+
+ _prevScale = event.scale;
+ }
+
+ /* A tap will enable panning/disable rotate. */
+ function tap(event) {
+ panAfterTap.set({enable : true});
+ _this.touchControls.get('pan').set({enable : false});
+ }
+
+ function panaftertap(event) {
+ touchDiff = new THREE.Vector2(event.deltaX, event.deltaY);
+ _offsetCur.addVectors(_offsetOrig, touchDiff);
+ incDiff = new THREE.Vector2().subVectors(_offsetCur, _offsetPrev)
+ .multiplyScalar(1 / object.zoomScale);
+ object.offsetProj(incDiff.x, -incDiff.y);
+ _changed = true;
+ _offsetPrev.copy(_offsetCur);
+ }
+
+ function panaftertapstart(event) {
+ _offsetOrig.copy(_offsetCur);
+ }
+
+ function panaftertapend(event) {
+ panAfterTap.set({enable : false});
+ _this.touchControls.get('pan').set({enable : true});
+ }
+
+ function contextmenu(event) {
+ event.preventDefault();
+ }
+
+ this.update = function() {
+ if (_changed) {
+ _this.dispatchEvent(changeEvent);
+ _changed = false;
+ }
+ }
+
+ this.domElement.addEventListener('mousedown', mousedown, false);
+ this.domElement.addEventListener('wheel', wheel, false);
+ this.domElement.addEventListener('contextmenu', contextmenu, false);
+
+ /* Hammer.on wraps addEventListener */
+ // Rotate
+ this.touchControls.on('pan', pan);
+ this.touchControls.on('panstart', panstart);
+
+ // Zoom
+ this.touchControls.on('pinch', pinch);
+ this.touchControls.on('pinchstart', pinchstart);
+
+ //Pan
+ this.touchControls.on('tap', tap);
+ this.touchControls.on('panaftertapstart', panaftertapstart);
+ this.touchControls.on('panaftertap', panaftertap);
+ this.touchControls.on('panaftertapend', panaftertapend);
+ }
+
+ SolvespaceControls.prototype = Object.create(THREE.EventDispatcher.prototype);
+ SolvespaceControls.prototype.constructor = SolvespaceControls;
+
+
+ solvespace = function(obj, params) {
+ var scene, edgeScene, camera, edgeCamera, renderer;
+ var geometry, controls, material, mesh, edges;
+ var width, height;
+ var directionalLightArray = [];
+
+ if (typeof params === "undefined" || !("width" in params)) {
+ width = window.innerWidth;
+ } else {
+ width = params.width;
+ }
+
+ if (typeof params === "undefined" || !("height" in params)) {
+ height = window.innerHeight;
+ } else {
+ height = params.height;
+ }
+
+ width *= window.devicePixelRatio;
+ height *= window.devicePixelRatio;
+
+ domElement = init();
+ render();
+ return domElement;
+
+
+ function init() {
+ scene = new THREE.Scene();
+ edgeScene = new THREE.Scene();
+
+ camera = new SolvespaceCamera(width/window.devicePixelRatio,
+ height/window.devicePixelRatio, 5, new THREE.Vector3(0, 1, 0),
+ new THREE.Vector3(1, 0, 0), new THREE.Vector3(0, 0, 0));
+
+ mesh = createMesh(obj);
+ scene.add(mesh);
+ edges = createEdges(obj);
+ edgeScene.add(edges);
+
+ for (var i = 0; i < obj.lights.d.length; i++) {
+ var lightColor = new THREE.Color(obj.lights.d[i].intensity,
+ obj.lights.d[i].intensity, obj.lights.d[i].intensity);
+ var directionalLight = new THREE.DirectionalLight(lightColor, 1);
+ directionalLight.position.set(obj.lights.d[i].direction[0],
+ obj.lights.d[i].direction[1], obj.lights.d[i].direction[2]);
+ directionalLightArray.push(directionalLight);
+ scene.add(directionalLight);
+ }
+
+ var lightColor = new THREE.Color(obj.lights.a, obj.lights.a, obj.lights.a);
+ var ambientLight = new THREE.AmbientLight(lightColor.getHex());
+ scene.add(ambientLight);
+
+ renderer = new THREE.WebGLRenderer({ antialias: true});
+ renderer.setSize(width, height);
+ renderer.autoClear = false;
+ renderer.domElement.style = "width:"+width/window.devicePixelRatio+"px;height:"+height/window.devicePixelRatio+"px;";
+
+ controls = new SolvespaceControls(camera, renderer.domElement);
+ controls.addEventListener("change", render);
+ controls.addEventListener("change", lightUpdate);
+
+ animate();
+ return renderer.domElement;
+ })";
+ const char htmlbegin1[] = R"(
+ function animate() {
+ requestAnimationFrame(animate);
+ controls.update();
+ }
+
+ function render() {
+ var context = renderer.getContext();
+ camera.updateProjectionMatrix();
+ renderer.clear();
+
+ context.depthRange(0.1, 1);
+ renderer.render(scene, camera);
+
+ context.depthRange(0.1-(2/60000.0), 1-(2/60000.0));
+ renderer.render(edgeScene, camera);
+ }
+
+ function lightUpdate() {
+ var changeBasis = new THREE.Matrix4();
+
+ // The original light positions were in camera space.
+ // Project them into standard space using camera's basis
+ // vectors (up, target, and their cross product).
+ n = new THREE.Vector3().crossVectors(camera.up, camera.right);
+ changeBasis.makeBasis(camera.right, camera.up, n);
+
+ for (var i = 0; i < 2; i++) {
+ var newLightPos = changeBasis.applyToVector3Array(
+ [obj.lights.d[i].direction[0], obj.lights.d[i].direction[1],
+ obj.lights.d[i].direction[2]]);
+ directionalLightArray[i].position.set(newLightPos[0],
+ newLightPos[1], newLightPos[2]);
+ }
+ }
+
+ function createMesh(meshObj) {
+ var geometry = new THREE.Geometry();
+ var materialIndex = 0;
+ var materialList = [];
+ var opacitiesSeen = {};
+
+ for (var i = 0; i < meshObj.points.length; i++) {
+ geometry.vertices.push(new THREE.Vector3(meshObj.points[i][0],
+ meshObj.points[i][1], meshObj.points[i][2]));
+ }
+
+ for (var i = 0; i < meshObj.faces.length; i++) {
+ var currOpacity = ((meshObj.colors[i] & 0xFF000000) >>> 24) / 255.0;
+ if (opacitiesSeen[currOpacity] === undefined) {
+ opacitiesSeen[currOpacity] = materialIndex;
+ materialIndex++;
+ materialList.push(new THREE.MeshLambertMaterial({
+ vertexColors: THREE.FaceColors,
+ opacity: currOpacity,
+ transparent: true,
+ side: THREE.DoubleSide
+ }));
+ }
+
+ geometry.faces.push(new THREE.Face3(meshObj.faces[i][0],
+ meshObj.faces[i][1], meshObj.faces[i][2],
+ [new THREE.Vector3(meshObj.normals[i][0][0],
+ meshObj.normals[i][0][1], meshObj.normals[i][0][2]),
+ new THREE.Vector3(meshObj.normals[i][1][0],
+ meshObj.normals[i][1][1], meshObj.normals[i][1][2]),
+ new THREE.Vector3(meshObj.normals[i][2][0],
+ meshObj.normals[i][2][1], meshObj.normals[i][2][2])],
+ new THREE.Color(meshObj.colors[i] & 0x00FFFFFF),
+ opacitiesSeen[currOpacity]));
+ }
+
+ geometry.computeBoundingSphere();
+ return new THREE.Mesh(geometry, new THREE.MultiMaterial(materialList));
+ }
+
+ function createEdges(meshObj) {
+ var geometry = new THREE.Geometry();
+ var material = new THREE.LineBasicMaterial();
+
+ for (var i = 0; i < meshObj.edges.length; i++) {
+ geometry.vertices.push(new THREE.Vector3(meshObj.edges[i][0][0],
+ meshObj.edges[i][0][1], meshObj.edges[i][0][2]),
+ new THREE.Vector3(meshObj.edges[i][1][0],
+ meshObj.edges[i][1][1], meshObj.edges[i][1][2]));
+ }
+
+ geometry.computeBoundingSphere();
+ return new THREE.LineSegments(geometry, material);
+ }
+ };
+)";
+ const char htmlend[] = R"(
+ document.body.appendChild(solvespace(solvespace_model_%s));
+ </script>
+ </body>
+</html>
+)";
+
+ // A default three.js viewer with OrthographicTrackballControls is
+ // generated as a comment preceding the data.
+
+ // x bounds should be the range of x or y, whichever
+ // is larger, before aspect ratio correction is applied.
+ // y bounds should be the range of x or y, whichever is
+ // larger. No aspect ratio correction is applied.
+ // Near plane should be 1.
+ // Camera's z-position should be the range of z + 1 or the larger of
+ // the x or y bounds, whichever is larger.
+ // Far plane should be at least twice as much as the camera's
+ // z-position.
+ // Edge projection bias should be about 1/500 of the far plane's distance.
+ // Further corrections will be applied to the z-position and far plane in
+ // the default viewer, but the defaults are fine for a model which
+ // only rotates about the world origin.
+
+ sm->GetBounding(&bndh, &bndl);
+ double largerBoundXY = max((bndh.x - bndl.x), (bndh.y - bndl.y));
+ double largerBoundZ = max(largerBoundXY, (bndh.z - bndl.z + 1));
+
+ std::string extension = filename,
+ noExtFilename = filename;
+ size_t dot = noExtFilename.rfind('.');
+ extension.erase(0, dot + 1);
+ noExtFilename.erase(dot);
+
+ std::string baseFilename = noExtFilename;
+ size_t lastSlash = baseFilename.rfind(PATH_SEP);
+ if(lastSlash == std::string::npos) oops();
+ baseFilename.erase(0, lastSlash + 1);
+
+ for(size_t i = 0; i < baseFilename.length(); i++) {
+ if(!isalpha(baseFilename[i]) &&
+ /* also permit UTF-8 */ !((unsigned char)baseFilename[i] >= 0x80))
+ baseFilename[i] = '_';
+ }
+
+ if(extension == "html") {
+ fputs(htmlbegin0, f);
+ fputs(htmlbegin1, f);
+ }
+
+ fprintf(f, "var solvespace_model_%s = {\n"
+ " bounds: {\n"
+ " x: %f, y: %f, near: %f, far: %f, z: %f, edgeBias: %f\n"
+ " },\n",
+ baseFilename.c_str(),
+ largerBoundXY,
+ largerBoundXY,
+ 1.0,
+ largerBoundZ * 2,
+ largerBoundZ,
+ largerBoundZ / 250);
+
+ // Output lighting information.
+ fputs(" lights: {\n"
+ " d: [\n", f);
+
+ // Directional.
+ int lightCount;
+ for(lightCount = 0; lightCount < 2; lightCount++)
+ {
+ fprintf(f, " {\n"
+ " intensity: %f, direction: [%f, %f, %f]\n"
+ " },\n",
+ SS.lightIntensity[lightCount],
+ CO(SS.lightDir[lightCount]));
+ }
+
+ // Global Ambience.
+ fprintf(f, " ],\n"
+ " a: %f\n", SS.ambientIntensity);
+
+ for(tr = sm->l.First(); tr; tr = sm->l.NextAfter(tr)) {
+ spl.IncrementTagFor(tr->a);
+ spl.IncrementTagFor(tr->b);
+ spl.IncrementTagFor(tr->c);
+ }
+
+ // Output all the vertices.
+ SPoint *sp;
+ fputs(" },\n"
+ " points: [\n", f);
+ for(sp = spl.l.First(); sp; sp = spl.l.NextAfter(sp)) {
+ fprintf(f, " [%f, %f, %f],\n",
+ sp->p.x / SS.exportScale,
+ sp->p.y / SS.exportScale,
+ sp->p.z / SS.exportScale);
+ }
+
+ fputs(" ],\n"
+ " faces: [\n", f);
+ // And now all the triangular faces, in terms of those vertices.
+ // This time we count from zero.
+ for(tr = sm->l.First(); tr; tr = sm->l.NextAfter(tr)) {
+ fprintf(f, " [%d, %d, %d],\n",
+ spl.IndexForPoint(tr->a),
+ spl.IndexForPoint(tr->b),
+ spl.IndexForPoint(tr->c));
+ }
+
+ // Output face normals.
+ fputs(" ],\n"
+ " normals: [\n", f);
+ for(tr = sm->l.First(); tr; tr = sm->l.NextAfter(tr)) {
+ fprintf(f, " [[%f, %f, %f], [%f, %f, %f], [%f, %f, %f]],\n",
+ CO(tr->an), CO(tr->bn), CO(tr->cn));
+ }
+
+ fputs(" ],\n"
+ " colors: [\n", f);
+ // Output triangle colors.
+ for(tr = sm->l.First(); tr; tr = sm->l.NextAfter(tr)) {
+ fprintf(f, " 0x%x,\n", tr->meta.color.ToARGB32());
+ }
+
+ fputs(" ],\n"
+ " edges: [\n", f);
+ // Output edges. Assume user's model colors do not obscure white edges.
+ for(e = sel->l.First(); e; e = sel->l.NextAfter(e)) {
+ fprintf(f, " [[%f, %f, %f], [%f, %f, %f]],\n",
+ e->a.x / SS.exportScale,
+ e->a.y / SS.exportScale,
+ e->a.z / SS.exportScale,
+ e->b.x / SS.exportScale,
+ e->b.y / SS.exportScale,
+ e->b.z / SS.exportScale);
+ }
+
+ fputs(" ]\n};\n", f);
+
+ if(extension == "html")
+ fprintf(f, htmlend, baseFilename.c_str());
+
+ spl.Clear();
+}
+
+//-----------------------------------------------------------------------------
+// Export a view of the model as an image; we just take a screenshot, by
+// rendering the view in the usual way and then copying the pixels.
+//-----------------------------------------------------------------------------
+void SolveSpaceUI::ExportAsPngTo(const std::string &filename) {
+ int w = (int)SS.GW.width, h = (int)SS.GW.height;
+ // No guarantee that the back buffer contains anything valid right now,
+ // so repaint the scene. And hide the toolbar too.
+ bool prevShowToolbar = SS.showToolbar;
+ SS.showToolbar = false;
+#ifndef WIN32
+ std::unique_ptr<GLOffscreen> gloffscreen(new GLOffscreen);
+ gloffscreen->begin(w, h);
+#endif
+ SS.GW.Paint();
+ SS.showToolbar = prevShowToolbar;
+
+ FILE *f = ssfopen(filename, "wb");
+ if(!f) goto err;
+
+ png_struct *png_ptr; png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING,
+ NULL, NULL, NULL);
+ if(!png_ptr) goto err;
+
+ png_info *info_ptr; info_ptr = png_create_info_struct(png_ptr);
+ if(!png_ptr) goto err;
+
+ if(setjmp(png_jmpbuf(png_ptr))) goto err;
+
+ png_init_io(png_ptr, f);
+
+ // glReadPixels wants to align things on 4-boundaries, and there's 3
+ // bytes per pixel. As long as the row width is divisible by 4, all
+ // works out.
+ w &= ~3; h &= ~3;
+
+ png_set_IHDR(png_ptr, info_ptr, w, h,
+ 8, PNG_COLOR_TYPE_RGB, PNG_INTERLACE_NONE,
+ PNG_COMPRESSION_TYPE_DEFAULT,PNG_FILTER_TYPE_DEFAULT);
+
+ png_write_info(png_ptr, info_ptr);
+
+ // Get the pixel data from the framebuffer
+ uint8_t *pixels; pixels = (uint8_t *)AllocTemporary(3*w*h);
+ uint8_t **rowptrs; rowptrs = (uint8_t **)AllocTemporary(h*sizeof(uint8_t *));
+ glReadPixels(0, 0, w, h, GL_RGB, GL_UNSIGNED_BYTE, pixels);
+
+ int y;
+ for(y = 0; y < h; y++) {
+ // gl puts the origin at lower left, but png puts it top left
+ rowptrs[y] = pixels + ((h - 1) - y)*(3*w);
+ }
+ png_write_image(png_ptr, rowptrs);
+
+ png_write_end(png_ptr, info_ptr);
+ png_destroy_write_struct(&png_ptr, &info_ptr);
+ fclose(f);
+ return;
+
+err:
+ Error("Error writing PNG file '%s'", filename.c_str());
+ if(f) fclose(f);
+ return;
+}
+
--- /dev/null
+//-----------------------------------------------------------------------------
+// Export a STEP file describing our ratpoly shell.
+//
+// Copyright 2008-2013 Jonathan Westhues.
+//-----------------------------------------------------------------------------
+#include "solvespace.h"
+
+void StepFileWriter::WriteHeader(void) {
+ fprintf(f,
+"ISO-10303-21;\n"
+"HEADER;\n"
+"\n"
+"FILE_DESCRIPTION((''), '2;1');\n"
+"\n"
+"FILE_NAME(\n"
+" 'output_file',\n"
+" '2009-06-07T17:44:47-07:00',\n"
+" (''),\n"
+" (''),\n"
+" 'SolveSpace',\n"
+" '',\n"
+" ''\n"
+");\n"
+"\n"
+"FILE_SCHEMA (('CONFIG_CONTROL_DESIGN'));\n"
+"ENDSEC;\n"
+"\n"
+"DATA;\n"
+"\n"
+"/**********************************************************\n"
+" * This defines the units and tolerances for the file. It\n"
+" * is always the same, independent of the actual data.\n"
+" **********************************************************/\n"
+"#158=(\n"
+"LENGTH_UNIT()\n"
+"NAMED_UNIT(*)\n"
+"SI_UNIT(.MILLI.,.METRE.)\n"
+");\n"
+"#161=(\n"
+"NAMED_UNIT(*)\n"
+"PLANE_ANGLE_UNIT()\n"
+"SI_UNIT($,.RADIAN.)\n"
+");\n"
+"#166=(\n"
+"NAMED_UNIT(*)\n"
+"SI_UNIT($,.STERADIAN.)\n"
+"SOLID_ANGLE_UNIT()\n"
+");\n"
+"#167=UNCERTAINTY_MEASURE_WITH_UNIT(LENGTH_MEASURE(0.001),#158,\n"
+"'DISTANCE_ACCURACY_VALUE',\n"
+"'string');\n"
+"#168=(\n"
+"GEOMETRIC_REPRESENTATION_CONTEXT(3)\n"
+"GLOBAL_UNCERTAINTY_ASSIGNED_CONTEXT((#167))\n"
+"GLOBAL_UNIT_ASSIGNED_CONTEXT((#166,#161,#158))\n"
+"REPRESENTATION_CONTEXT('ID1','3D')\n"
+");\n"
+"#169=SHAPE_REPRESENTATION('',(#170),#168);\n"
+"#170=AXIS2_PLACEMENT_3D('',#173,#171,#172);\n"
+"#171=DIRECTION('',(0.,0.,1.));\n"
+"#172=DIRECTION('',(1.,0.,0.));\n"
+"#173=CARTESIAN_POINT('',(0.,0.,0.));\n"
+"\n"
+ );
+
+ // Start the ID somewhere beyond the header IDs.
+ id = 200;
+}
+void StepFileWriter::WriteProductHeader(void) {
+ fprintf(f,
+ "#175 = SHAPE_DEFINITION_REPRESENTATION(#176, #169);\n"
+ "#176 = PRODUCT_DEFINITION_SHAPE('Version', 'Test Part', #177);\n"
+ "#177 = PRODUCT_DEFINITION('Version', 'Test Part', #182, #178);\n"
+ "#178 = DESIGN_CONTEXT('3D Mechanical Parts', #181, 'design');\n"
+ "#179 = PRODUCT('1', 'Product', 'Test Part', (#180));\n"
+ "#180 = MECHANICAL_CONTEXT('3D Mechanical Parts', #181, 'mechanical');\n"
+ "#181 = APPLICATION_CONTEXT(\n"
+ "'configuration controlled 3d designs of mechanical parts and assemblies');\n"
+ "#182 = PRODUCT_DEFINITION_FORMATION_WITH_SPECIFIED_SOURCE('Version',\n"
+ "'Test Part', #179, .MADE.);\n"
+ "\n"
+ );
+}
+int StepFileWriter::ExportCurve(SBezier *sb) {
+ int i, ret = id;
+
+ fprintf(f, "#%d=(\n", ret);
+ fprintf(f, "BOUNDED_CURVE()\n");
+ fprintf(f, "B_SPLINE_CURVE(%d,(", sb->deg);
+ for(i = 0; i <= sb->deg; i++) {
+ fprintf(f, "#%d", ret + i + 1);
+ if(i != sb->deg) fprintf(f, ",");
+ }
+ fprintf(f, "),.UNSPECIFIED.,.F.,.F.)\n");
+ fprintf(f, "B_SPLINE_CURVE_WITH_KNOTS((%d,%d),",
+ (sb->deg + 1), (sb-> deg + 1));
+ fprintf(f, "(0.000,1.000),.UNSPECIFIED.)\n");
+ fprintf(f, "CURVE()\n");
+ fprintf(f, "GEOMETRIC_REPRESENTATION_ITEM()\n");
+ fprintf(f, "RATIONAL_B_SPLINE_CURVE((");
+ for(i = 0; i <= sb->deg; i++) {
+ fprintf(f, "%.10f", sb->weight[i]);
+ if(i != sb->deg) fprintf(f, ",");
+ }
+ fprintf(f, "))\n");
+ fprintf(f, "REPRESENTATION_ITEM('')\n);\n");
+
+ for(i = 0; i <= sb->deg; i++) {
+ fprintf(f, "#%d=CARTESIAN_POINT('',(%.10f,%.10f,%.10f));\n",
+ id + 1 + i,
+ CO(sb->ctrl[i]));
+ }
+ fprintf(f, "\n");
+
+ id = ret + 1 + (sb->deg + 1);
+ return ret;
+}
+
+int StepFileWriter::ExportCurveLoop(SBezierLoop *loop, bool inner) {
+ if(loop->l.n < 1) oops();
+
+ List<int> listOfTrims = {};
+
+ SBezier *sb = &(loop->l.elem[loop->l.n - 1]);
+
+ // Generate "exactly closed" contours, with the same vertex id for the
+ // finish of a previous edge and the start of the next one. So we need
+ // the finish of the last Bezier in the loop before we start our process.
+ fprintf(f, "#%d=CARTESIAN_POINT('',(%.10f,%.10f,%.10f));\n",
+ id, CO(sb->Finish()));
+ fprintf(f, "#%d=VERTEX_POINT('',#%d);\n", id+1, id);
+ int lastFinish = id + 1, prevFinish = lastFinish;
+ id += 2;
+
+ for(sb = loop->l.First(); sb; sb = loop->l.NextAfter(sb)) {
+ int curveId = ExportCurve(sb);
+
+ int thisFinish;
+ if(loop->l.NextAfter(sb) != NULL) {
+ fprintf(f, "#%d=CARTESIAN_POINT('',(%.10f,%.10f,%.10f));\n",
+ id, CO(sb->Finish()));
+ fprintf(f, "#%d=VERTEX_POINT('',#%d);\n", id+1, id);
+ thisFinish = id + 1;
+ id += 2;
+ } else {
+ thisFinish = lastFinish;
+ }
+
+ fprintf(f, "#%d=EDGE_CURVE('',#%d,#%d,#%d,%s);\n",
+ id, prevFinish, thisFinish, curveId, ".T.");
+ fprintf(f, "#%d=ORIENTED_EDGE('',*,*,#%d,.T.);\n",
+ id+1, id);
+
+ int oe = id+1;
+ listOfTrims.Add(&oe);
+ id += 2;
+
+ prevFinish = thisFinish;
+ }
+
+ fprintf(f, "#%d=EDGE_LOOP('',(", id);
+ int *oe;
+ for(oe = listOfTrims.First(); oe; oe = listOfTrims.NextAfter(oe)) {
+ fprintf(f, "#%d", *oe);
+ if(listOfTrims.NextAfter(oe) != NULL) fprintf(f, ",");
+ }
+ fprintf(f, "));\n");
+
+ int fb = id + 1;
+ fprintf(f, "#%d=%s('',#%d,.T.);\n",
+ fb, inner ? "FACE_BOUND" : "FACE_OUTER_BOUND", id);
+
+ id += 2;
+ listOfTrims.Clear();
+
+ return fb;
+}
+
+void StepFileWriter::ExportSurface(SSurface *ss, SBezierList *sbl) {
+ int i, j, srfid = id;
+
+ // First, we create the untrimmed surface. We always specify a rational
+ // B-spline surface (in fact, just a Bezier surface).
+ fprintf(f, "#%d=(\n", srfid);
+ fprintf(f, "BOUNDED_SURFACE()\n");
+ fprintf(f, "B_SPLINE_SURFACE(%d,%d,(", ss->degm, ss->degn);
+ for(i = 0; i <= ss->degm; i++) {
+ fprintf(f, "(");
+ for(j = 0; j <= ss->degn; j++) {
+ fprintf(f, "#%d", srfid + 1 + j + i*(ss->degn + 1));
+ if(j != ss->degn) fprintf(f, ",");
+ }
+ fprintf(f, ")");
+ if(i != ss->degm) fprintf(f, ",");
+ }
+ fprintf(f, "),.UNSPECIFIED.,.F.,.F.,.F.)\n");
+ fprintf(f, "B_SPLINE_SURFACE_WITH_KNOTS((%d,%d),(%d,%d),",
+ (ss->degm + 1), (ss->degm + 1),
+ (ss->degn + 1), (ss->degn + 1));
+ fprintf(f, "(0.000,1.000),(0.000,1.000),.UNSPECIFIED.)\n");
+ fprintf(f, "GEOMETRIC_REPRESENTATION_ITEM()\n");
+ fprintf(f, "RATIONAL_B_SPLINE_SURFACE((");
+ for(i = 0; i <= ss->degm; i++) {
+ fprintf(f, "(");
+ for(j = 0; j <= ss->degn; j++) {
+ fprintf(f, "%.10f", ss->weight[i][j]);
+ if(j != ss->degn) fprintf(f, ",");
+ }
+ fprintf(f, ")");
+ if(i != ss->degm) fprintf(f, ",");
+ }
+ fprintf(f, "))\n");
+ fprintf(f, "REPRESENTATION_ITEM('')\n");
+ fprintf(f, "SURFACE()\n");
+ fprintf(f, ");\n");
+
+ // The control points for the untrimmed surface.
+ for(i = 0; i <= ss->degm; i++) {
+ for(j = 0; j <= ss->degn; j++) {
+ fprintf(f, "#%d=CARTESIAN_POINT('',(%.10f,%.10f,%.10f));\n",
+ srfid + 1 + j + i*(ss->degn + 1),
+ CO(ss->ctrl[i][j]));
+ }
+ }
+ fprintf(f, "\n");
+
+ id = srfid + 1 + (ss->degm + 1)*(ss->degn + 1);
+
+ // Now we do the trim curves. We must group each outer loop separately
+ // along with its inner faces, so do that now.
+ SBezierLoopSetSet sblss = {};
+ SPolygon spxyz = {};
+ bool allClosed;
+ SEdge notClosedAt;
+ // We specify a surface, so it doesn't check for coplanarity; and we
+ // don't want it to give us any open contours. The polygon and chord
+ // tolerance are required, because they are used to calculate the
+ // contour directions and determine inner vs. outer contours.
+ sblss.FindOuterFacesFrom(sbl, &spxyz, ss,
+ SS.ExportChordTolMm(),
+ &allClosed, ¬ClosedAt,
+ NULL, NULL,
+ NULL);
+
+ // So in our list of SBezierLoopSet, each set contains at least one loop
+ // (the outer boundary), plus any inner loops associated with that outer
+ // loop.
+ SBezierLoopSet *sbls;
+ for(sbls = sblss.l.First(); sbls; sbls = sblss.l.NextAfter(sbls)) {
+ SBezierLoop *loop = sbls->l.First();
+
+ List<int> listOfLoops = {};
+ // Create the face outer boundary from the outer loop.
+ int fob = ExportCurveLoop(loop, false);
+ listOfLoops.Add(&fob);
+
+ // And create the face inner boundaries from any inner loops that
+ // lie within this contour.
+ loop = sbls->l.NextAfter(loop);
+ for(; loop; loop = sbls->l.NextAfter(loop)) {
+ int fib = ExportCurveLoop(loop, true);
+ listOfLoops.Add(&fib);
+ }
+
+ // And now create the face that corresponds to this outer loop
+ // and all of its holes.
+ int advFaceId = id;
+ fprintf(f, "#%d=ADVANCED_FACE('',(", advFaceId);
+ int *fb;
+ for(fb = listOfLoops.First(); fb; fb = listOfLoops.NextAfter(fb)) {
+ fprintf(f, "#%d", *fb);
+ if(listOfLoops.NextAfter(fb) != NULL) fprintf(f, ",");
+ }
+
+ fprintf(f, "),#%d,.T.);\n", srfid);
+ fprintf(f, "\n");
+ advancedFaces.Add(&advFaceId);
+
+ id++;
+ listOfLoops.Clear();
+ }
+ sblss.Clear();
+ spxyz.Clear();
+}
+
+void StepFileWriter::WriteFooter(void) {
+ fprintf(f,
+"\n"
+"ENDSEC;\n"
+"\n"
+"END-ISO-10303-21;\n"
+ );
+}
+
+void StepFileWriter::ExportSurfacesTo(const std::string &filename) {
+ Group *g = SK.GetGroup(SS.GW.activeGroup);
+ SShell *shell = &(g->runningShell);
+
+ if(shell->surface.n == 0) {
+ Error("The model does not contain any surfaces to export.%s",
+ g->runningMesh.l.n > 0 ?
+ "\n\nThe model does contain triangles from a mesh, but "
+ "a triangle mesh cannot be exported as a STEP file. Try "
+ "File -> Export Mesh... instead." : "");
+ return;
+ }
+
+ f = ssfopen(filename, "wb");
+ if(!f) {
+ Error("Couldn't write to '%s'", filename.c_str());
+ return;
+ }
+
+ WriteHeader();
+ WriteProductHeader();
+
+ advancedFaces = {};
+
+ SSurface *ss;
+ for(ss = shell->surface.First(); ss; ss = shell->surface.NextAfter(ss)) {
+ if(ss->trim.n == 0) continue;
+
+ // Get all of the loops of Beziers that trim our surface (with each
+ // Bezier split so that we use the section as t goes from 0 to 1), and
+ // the piecewise linearization of those loops in xyz space.
+ SBezierList sbl = {};
+ ss->MakeSectionEdgesInto(shell, NULL, &sbl);
+
+ // Apply the export scale factor.
+ ss->ScaleSelfBy(1.0/SS.exportScale);
+ sbl.ScaleSelfBy(1.0/SS.exportScale);
+
+ ExportSurface(ss, &sbl);
+
+ sbl.Clear();
+ }
+
+ fprintf(f, "#%d=CLOSED_SHELL('',(", id);
+ int *af;
+ for(af = advancedFaces.First(); af; af = advancedFaces.NextAfter(af)) {
+ fprintf(f, "#%d", *af);
+ if(advancedFaces.NextAfter(af) != NULL) fprintf(f, ",");
+ }
+ fprintf(f, "));\n");
+ fprintf(f, "#%d=MANIFOLD_SOLID_BREP('brep',#%d);\n", id+1, id);
+ fprintf(f, "#%d=ADVANCED_BREP_SHAPE_REPRESENTATION('',(#%d,#170),#168);\n",
+ id+2, id+1);
+ fprintf(f, "#%d=SHAPE_REPRESENTATION_RELATIONSHIP($,$,#169,#%d);\n",
+ id+3, id+2);
+
+ WriteFooter();
+
+ fclose(f);
+ advancedFaces.Clear();
+}
+
+void StepFileWriter::WriteWireframe(void) {
+ fprintf(f, "#%d=GEOMETRIC_CURVE_SET('curves',(", id);
+ int *c;
+ for(c = curves.First(); c; c = curves.NextAfter(c)) {
+ fprintf(f, "#%d", *c);
+ if(curves.NextAfter(c) != NULL) fprintf(f, ",");
+ }
+ fprintf(f, "));\n");
+ fprintf(f, "#%d=GEOMETRICALLY_BOUNDED_WIREFRAME_SHAPE_REPRESENTATION"
+ "('',(#%d,#170),#168);\n", id+1, id);
+ fprintf(f, "#%d=SHAPE_REPRESENTATION_RELATIONSHIP($,$,#169,#%d);\n",
+ id+2, id+1);
+
+ id += 3;
+ curves.Clear();
+}
+
--- /dev/null
+//-----------------------------------------------------------------------------
+// The file format-specific stuff for all of the 2d vector output formats.
+//
+// Copyright 2008-2013 Jonathan Westhues.
+//-----------------------------------------------------------------------------
+#include <libdxfrw.h>
+#include "solvespace.h"
+
+VectorFileWriter::~VectorFileWriter() {
+ // This out-of-line virtual method definition quells the following warning
+ // from Clang++: "'VectorFileWriter' has no out-of-line virtual method
+ // definitions; its vtable will be emitted in every translation unit
+ // [-Wweak-vtables]"
+}
+
+class PolylineBuilder {
+public:
+ struct Edge;
+
+ struct Vertex {
+ Vector pos;
+ std::vector<Edge *> edges;
+
+ bool getNext(hStyle hs, Vertex **next) {
+ auto it = std::find_if(edges.begin(), edges.end(), [&](const Edge *e) {
+ return e->tag == 0 && e->style.v == hs.v;
+ });
+ if(it != edges.end()) {
+ (*it)->tag = 1;
+ *next = (*it)->getOtherVertex(this);
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ size_t countEdgesWithTagAndStyle(int tag, hStyle hs) const {
+ return std::count_if(edges.begin(), edges.end(), [&](const Edge *e) {
+ return e->tag == tag && e->style.v == hs.v;
+ });
+ }
+ };
+
+ struct Edge {
+ Vertex *a;
+ Vertex *b;
+ hStyle style;
+ int tag;
+
+ Vertex *getOtherVertex(Vertex *v) {
+ if(a == v) return b;
+ if(b == v) return a;
+ return NULL;
+ }
+
+ bool getStartAndNext(Vertex **start, Vertex **next, bool loop) {
+ size_t numA = a->countEdgesWithTagAndStyle(0, style);
+ size_t numB = b->countEdgesWithTagAndStyle(0, style);
+
+ if((numA == 1 && numB > 1) || (loop && numA > 1 && numB > 1)) {
+ *start = a;
+ *next = b;
+ return true;
+ }
+
+ if(numA > 1 && numB == 1) {
+ *start = b;
+ *next = a;
+ return true;
+ }
+
+ return false;
+ }
+ };
+
+ struct VectorHash {
+ size_t operator()(const Vector &v) const {
+ static const size_t size = std::numeric_limits<size_t>::max() / 2 - 1;
+ static const double eps = (4.0 * LENGTH_EPS);
+
+ double x = fabs(v.x) / eps;
+ double y = fabs(v.y) / eps;
+
+ size_t xs = size_t(fmod(x, double(size)));
+ size_t ys = size_t(fmod(y, double(size)));
+
+ return ys * size + xs;
+ }
+ };
+
+ struct VectorPred {
+ bool operator()(Vector a, Vector b) const {
+ return a.Equals(b, LENGTH_EPS);
+ }
+ };
+
+ std::unordered_map<Vector, Vertex *, VectorHash, VectorPred> vertices;
+ std::vector<Edge *> edges;
+
+ ~PolylineBuilder() {
+ clear();
+ }
+
+ void clear() {
+ for(Edge *e : edges) {
+ delete e;
+ }
+ edges.clear();
+
+ for(auto &v : vertices) {
+ delete v.second;
+ }
+ vertices.clear();
+ }
+
+ Vertex *addVertex(const Vector &pos) {
+ auto it = vertices.find(pos);
+ if(it != vertices.end()) {
+ return it->second;
+ }
+
+ Vertex *result = new Vertex;
+ result->pos = pos;
+ vertices.emplace(pos, result);
+
+ return result;
+ }
+
+ Edge *addEdge(const Vector &p0, const Vector &p1, int style) {
+ Vertex *v0 = addVertex(p0);
+ Vertex *v1 = addVertex(p1);
+ if(v0 == v1) return NULL;
+
+ Edge *edge = new Edge { v0, v1, hStyle { (uint32_t)style }, 0 };
+ edges.push_back(edge);
+
+ v0->edges.push_back(edge);
+ v1->edges.push_back(edge);
+
+ return edge;
+ }
+};
+
+//-----------------------------------------------------------------------------
+// Routines for DXF export
+//-----------------------------------------------------------------------------
+class DxfWriteInterface : public DRW_Interface {
+ DxfFileWriter *writer;
+ dxfRW *dxf;
+
+ static DRW_Coord toCoord(const Vector &v) {
+ return DRW_Coord(v.x, v.y, v.z);
+ }
+
+ Vector xfrm(Vector v) {
+ return writer->Transform(v);
+ }
+
+public:
+ DxfWriteInterface(DxfFileWriter *w, dxfRW *dxfrw) :
+ writer(w), dxf(dxfrw) {}
+
+ virtual void writeTextstyles() {
+ DRW_Textstyle ts;
+ ts.name = "unicode";
+ ts.font = "unicode";
+ dxf->writeTextstyle(&ts);
+ }
+
+ virtual void writeLayers() {
+ DRW_Layer layer;
+
+ layer.name = "dimensions";
+ dxf->writeLayer(&layer);
+ layer.name = "text";
+ dxf->writeLayer(&layer);
+
+ std::set<uint32_t> usedStyles;
+
+ for(DxfFileWriter::BezierPath &path : writer->paths) {
+ for(SBezier *sb : path.beziers) {
+ usedStyles.insert((uint32_t)sb->auxA);
+ }
+ }
+
+ for(uint32_t v : usedStyles) {
+ Style *s = Style::Get(hStyle{v});
+ layer.name = s->DescriptionString();
+ dxf->writeLayer(&layer);
+ }
+ }
+
+ virtual void writeLTypes() {
+ for(int i = 0; i <= Style::LAST_STIPPLE; i++) {
+ DRW_LType type;
+ // LibreCAD requires the line type to have one of these exact names,
+ // or otherwise it overwrites it with its own (continuous) style.
+ type.name = DxfFileWriter::lineTypeName(i);
+ double sw = 1.0;
+ switch(i) {
+ case Style::STIPPLE_CONTINUOUS:
+ break;
+
+ case Style::STIPPLE_DASH:
+ type.path.push_back(sw);
+ type.path.push_back(-sw);
+ break;
+
+ case Style::STIPPLE_LONG_DASH:
+ type.path.push_back(sw * 2.0);
+ type.path.push_back(-sw);
+ break;
+
+ case Style::STIPPLE_DASH_DOT:
+ type.path.push_back(sw);
+ type.path.push_back(-sw);
+ type.path.push_back(0.0);
+ type.path.push_back(-sw);
+ break;
+
+ case Style::STIPPLE_DOT:
+ type.path.push_back(sw);
+ type.path.push_back(0.0);
+ break;
+
+ case Style::STIPPLE_DASH_DOT_DOT:
+ type.path.push_back(sw);
+ type.path.push_back(-sw);
+ type.path.push_back(0.0);
+ type.path.push_back(-sw);
+ type.path.push_back(0.0);
+ type.path.push_back(-sw);
+ break;
+ }
+ dxf->writeLineType(&type);
+ }
+ }
+
+ void writePolylines() {
+ PolylineBuilder builder;
+
+ for(DxfFileWriter::BezierPath &path : writer->paths) {
+ for(SBezier *sb : path.beziers) {
+ if(sb->deg != 1) continue;
+ builder.addEdge(sb->ctrl[0], sb->ctrl[1], sb->auxA);
+ }
+ }
+
+ bool found;
+ bool loop = false;
+ do {
+ found = false;
+ for(PolylineBuilder::Edge *e : builder.edges) {
+ if(e->tag != 0) continue;
+
+ PolylineBuilder::Vertex *start;
+ PolylineBuilder::Vertex *next;
+ if(!e->getStartAndNext(&start, &next, loop)) continue;
+ found = true;
+ e->tag = 1;
+
+ DRW_Polyline polyline;
+ assignEntityDefaults(&polyline, e->style);
+ polyline.vertlist.push_back(
+ new DRW_Vertex(start->pos.x, start->pos.y, start->pos.z, 0.0));
+ polyline.vertlist.push_back(
+ new DRW_Vertex(next->pos.x, next->pos.y, next->pos.z, 0.0));
+ while(next->getNext(e->style, &next)) {
+ polyline.vertlist.push_back(
+ new DRW_Vertex(next->pos.x, next->pos.y, next->pos.z, 0.0));
+ }
+ dxf->writePolyline(&polyline);
+ }
+
+ if(!found && !loop) {
+ loop = true;
+ found = true;
+ }
+ } while(found);
+
+ for(PolylineBuilder::Edge *e : builder.edges) {
+ if(e->tag != 0) continue;
+ writeLine(e->a->pos, e->b->pos, e->style);
+ }
+ }
+
+ virtual void writeEntities() {
+ writePolylines();
+
+ for(DxfFileWriter::BezierPath &path : writer->paths) {
+ for(SBezier *sb : path.beziers) {
+ if(sb->deg == 1) continue;
+ writeBezier(sb);
+ }
+ }
+
+ if(writer->constraint) {
+ Constraint *c;
+ for(c = writer->constraint->First(); c; c = writer->constraint->NextAfter(c)) {
+ if(!writer->NeedToOutput(c)) continue;
+ switch(c->type) {
+ case Constraint::PT_PT_DISTANCE: {
+ Vector ap = SK.GetEntity(c->ptA)->PointGetNum();
+ Vector bp = SK.GetEntity(c->ptB)->PointGetNum();
+ Vector ref = ((ap.Plus(bp)).ScaledBy(0.5)).Plus(c->disp.offset);
+ writeAlignedDimension(xfrm(ap), xfrm(bp), xfrm(ref),
+ xfrm(ref), c->Label(), c->GetStyle(), c->valA);
+ break;
+ }
+
+ case Constraint::PT_LINE_DISTANCE: {
+ Vector pt = SK.GetEntity(c->ptA)->PointGetNum();
+ Entity *line = SK.GetEntity(c->entityA);
+ Vector lA = SK.GetEntity(line->point[0])->PointGetNum();
+ Vector lB = SK.GetEntity(line->point[1])->PointGetNum();
+ Vector dl = lB.Minus(lA);
+
+ Vector closest = pt.ClosestPointOnLine(lA, dl);
+
+ if(pt.Equals(closest)) break;
+
+ Vector ref = ((closest.Plus(pt)).ScaledBy(0.5)).Plus(c->disp.offset);
+ Vector refClosest = ref.ClosestPointOnLine(lA, dl);
+
+ double ddl = dl.Dot(dl);
+ if(fabs(ddl) > LENGTH_EPS * LENGTH_EPS) {
+ double t = refClosest.Minus(lA).Dot(dl) / ddl;
+ if(t < 0.0) {
+ refClosest = lA;
+ } else if(t > 1.0) {
+ refClosest = lB;
+ }
+ }
+
+ Vector xdl = xfrm(lB).Minus(xfrm(lA));
+ writeLinearDimension(xfrm(pt), xfrm(refClosest), xfrm(ref),
+ xfrm(ref), c->Label(),
+ atan2(xdl.y, xdl.x) / PI * 180.0 + 90.0, 0.0,
+ c->GetStyle(), c->valA);
+ break;
+ }
+
+ case Constraint::DIAMETER: {
+ Entity *circle = SK.GetEntity(c->entityA);
+ Vector center = SK.GetEntity(circle->point[0])->PointGetNum();
+ Quaternion q = SK.GetEntity(circle->normal)->NormalGetNum();
+ Vector n = q.RotationN().WithMagnitude(1);
+ double r = circle->CircleGetRadiusNum();
+
+ Vector ref = center.Plus(c->disp.offset);
+ // Force the label into the same plane as the circle.
+ ref = ref.Minus(n.ScaledBy(n.Dot(ref) - n.Dot(center)));
+
+ Vector rad = ref.Minus(center).WithMagnitude(r);
+ if(/*isRadius*/c->other) {
+ writeRadialDimension(
+ xfrm(center), xfrm(center.Plus(rad)),
+ xfrm(ref), c->Label(), c->GetStyle(), c->valA);
+ } else {
+ writeDiametricDimension(
+ xfrm(center.Minus(rad)), xfrm(center.Plus(rad)),
+ xfrm(ref), c->Label(), c->GetStyle(), c->valA);
+ }
+ break;
+ }
+
+ case Constraint::ANGLE: {
+ Entity *a = SK.GetEntity(c->entityA);
+ Entity *b = SK.GetEntity(c->entityB);
+
+ Vector a0 = a->VectorGetStartPoint();
+ Vector b0 = b->VectorGetStartPoint();
+ Vector da = a->VectorGetNum();
+ Vector db = b->VectorGetNum();
+ if(/*otherAngle*/c->other) {
+ a0 = a0.Plus(da);
+ da = da.ScaledBy(-1);
+ }
+
+ bool skew = false;
+ Vector ref = c->disp.offset;
+ Vector pi = Vector::AtIntersectionOfLines(a0, a0.Plus(da), b0, b0.Plus(db),
+ &skew);
+ if(!skew) ref = pi.Plus(c->disp.offset);
+
+ Vector norm = da.Cross(db);
+ Vector dna = norm.Cross(da).WithMagnitude(1.0);
+
+ double thetaf = acos(da.DirectionCosineWith(db));
+
+ // Calculate median
+ Vector m = da.WithMagnitude(1.0).ScaledBy(cos(thetaf/2)).Plus(
+ dna.ScaledBy(sin(thetaf/2)));
+ Vector rm = ref.Minus(pi);
+
+ // Test which side we have to place an arc
+ if(m.Dot(rm) < 0) {
+ da = da.ScaledBy(-1); dna = dna.ScaledBy(-1);
+ db = db.ScaledBy(-1);
+ }
+
+ Vector bisect = da.WithMagnitude(1.0).ScaledBy(cos(thetaf / 2.0)).Plus(
+ dna.ScaledBy(sin(thetaf / 2.0)));
+
+ ref = pi.Plus(bisect.WithMagnitude(c->disp.offset.Magnitude()));
+
+ // Get lines agian to write exact line.
+ a0 = a->VectorGetStartPoint();
+ b0 = b->VectorGetStartPoint();
+ da = a->VectorGetNum();
+ db = b->VectorGetNum();
+
+ writeAngularDimension(
+ xfrm(a0), xfrm(a0.Plus(da)), xfrm(b0), xfrm(b0.Plus(db)), xfrm(ref),
+ xfrm(ref), c->Label(), c->GetStyle(), c->valA);
+ break;
+ }
+
+ case Constraint::COMMENT: {
+ Style *st = SK.style.FindById(c->GetStyle());
+ writeText(xfrm(c->disp.offset), c->Label(),
+ Style::TextHeight(c->GetStyle()) / SS.GW.scale,
+ st->textAngle, st->textOrigin, c->GetStyle());
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ int findDxfColor(const RgbaColor &src) {
+ int best = 0;
+ double minDist = VERY_POSITIVE;
+ Vector srcv = Vector::From(src.redF(), src.greenF(), src.blueF());
+ for(int i = 1; i < 256; i++) {
+ RgbaColor dst = RGBi(DRW::dxfColors[i][0], DRW::dxfColors[i][1], DRW::dxfColors[i][2]);
+ Vector dstv = Vector::From(dst.redF(), dst.greenF(), dst.blueF());
+ double dist = srcv.Minus(dstv).Magnitude();
+ if(dist < minDist || best == 0) {
+ best = i;
+ minDist = dist;
+ }
+ }
+ return best;
+ }
+
+ void assignEntityDefaults(DRW_Entity *entity, hStyle hs) {
+ Style *s = Style::Get(hs);
+ RgbaColor color = s->Color(hs, true);
+ entity->color24 = color.ToPackedIntBGRA();
+ entity->color = findDxfColor(color);
+ entity->layer = s->DescriptionString();
+ entity->lineType = DxfFileWriter::lineTypeName(s->stippleType);
+ entity->ltypeScale = Style::StippleScaleMm(s->h);
+ entity->setWidthMm(Style::WidthMm(hs.v));
+ }
+
+ void assignDimensionDefaults(DRW_Dimension *dimension, hStyle hs) {
+ assignEntityDefaults(dimension, hs);
+ dimension->layer = "dimensions";
+ }
+
+ void writeLine(const Vector &p0, const Vector &p1, hStyle hs) {
+ DRW_Line line;
+ assignEntityDefaults(&line, hs);
+ line.basePoint = toCoord(p0);
+ line.secPoint = toCoord(p1);
+ dxf->writeLine(&line);
+ }
+
+ void writeArc(const Vector &c, double r, double sa, double ea, hStyle hs) {
+ DRW_Arc arc;
+ assignEntityDefaults(&arc, hs);
+ arc.radious = r;
+ arc.basePoint = toCoord(c);
+ arc.staangle = sa;
+ arc.endangle = ea;
+ dxf->writeArc(&arc);
+ }
+
+ void writeBezierAsPwl(SBezier *sb) {
+ List<Vector> lv = {};
+ sb->MakePwlInto(&lv, SS.ExportChordTolMm());
+ hStyle hs = { (uint32_t)sb->auxA };
+ DRW_Polyline polyline;
+ assignEntityDefaults(&polyline, hs);
+ for(int i = 0; i < lv.n; i++) {
+ Vector *v = &lv.elem[i];
+ DRW_Vertex *vertex = new DRW_Vertex(v->x, v->y, v->z, 0.0);
+ polyline.vertlist.push_back(vertex);
+ }
+ dxf->writePolyline(&polyline);
+ lv.Clear();
+ }
+
+ void makeKnotsFor(DRW_Spline *spline) {
+ // QCad/LibreCAD require this for some reason.
+ if(spline->degree == 3) {
+ spline->nknots = 8;
+ spline->knotslist.push_back(0.0);
+ spline->knotslist.push_back(0.0);
+ spline->knotslist.push_back(0.0);
+ spline->knotslist.push_back(0.0);
+ spline->knotslist.push_back(1.0);
+ spline->knotslist.push_back(1.0);
+ spline->knotslist.push_back(1.0);
+ spline->knotslist.push_back(1.0);
+ } else if(spline->degree == 2) {
+ spline->nknots = 6;
+ spline->knotslist.push_back(0.0);
+ spline->knotslist.push_back(0.0);
+ spline->knotslist.push_back(0.0);
+ spline->knotslist.push_back(1.0);
+ spline->knotslist.push_back(1.0);
+ spline->knotslist.push_back(1.0);
+ } else {
+ oops();
+ }
+ }
+
+ void writeSpline(SBezier *sb) {
+ bool isRational = sb->IsRational();
+ hStyle hs = { (uint32_t)sb->auxA };
+ DRW_Spline spline;
+ assignEntityDefaults(&spline, hs);
+ spline.flags = (isRational) ? 0x04 : 0x08;
+ spline.degree = sb->deg;
+ spline.ncontrol = sb->deg + 1;
+ makeKnotsFor(&spline);
+ for(int i = 0; i <= sb->deg; i++) {
+ spline.controllist.push_back(
+ new DRW_Coord(sb->ctrl[i].x, sb->ctrl[i].y, sb->ctrl[i].z));
+ if(isRational) spline.weightlist.push_back(sb->weight[i]);
+ }
+ dxf->writeSpline(&spline);
+ }
+
+ void writeBezier(SBezier *sb) {
+ hStyle hs = { (uint32_t)sb->auxA };
+ Vector c;
+ Vector n = Vector::From(0.0, 0.0, 1.0);
+ double r;
+
+ if(sb->deg == 1) {
+ // Line
+ writeLine(sb->ctrl[0], sb->ctrl[1], hs);
+ } else if(sb->IsInPlane(n, 0) && sb->IsCircle(n, &c, &r)) {
+ // Circle perpendicular to camera
+ double theta0 = atan2(sb->ctrl[0].y - c.y, sb->ctrl[0].x - c.x);
+ double theta1 = atan2(sb->ctrl[2].y - c.y, sb->ctrl[2].x - c.x);
+ double dtheta = WRAP_SYMMETRIC(theta1 - theta0, 2.0 * PI);
+ if(dtheta < 0.0) swap(theta0, theta1);
+
+ writeArc(c, r, theta0, theta1, hs);
+ } else if(sb->IsRational()) {
+ // Rational bezier
+ // We'd like to export rational beziers exactly, but the resulting DXF
+ // files can only be read by AutoCAD; LibreCAD/QCad simply do not
+ // implement the feature. So, export as piecewise linear for compatiblity.
+ writeBezierAsPwl(sb);
+ } else {
+ // Any other curve
+ writeSpline(sb);
+ }
+ }
+
+ void writeAlignedDimension(Vector def1, Vector def2, Vector dimp,
+ Vector textp, const std::string &text, hStyle hs, double actual) {
+ DRW_DimAligned dim;
+ assignDimensionDefaults(&dim, hs);
+ dim.setDef1Point(toCoord(def1));
+ dim.setDef2Point(toCoord(def2));
+ dim.setDimPoint(toCoord(dimp));
+ dim.setTextPoint(toCoord(textp));
+ dim.setText(text);
+ dim.setActualMeasurement(actual);
+ dxf->writeDimension(&dim);
+ }
+
+ void writeLinearDimension(Vector def1, Vector def2, Vector dimp,
+ Vector textp, const std::string &text,
+ double angle, double oblique, hStyle hs, double actual) {
+ DRW_DimLinear dim;
+ assignDimensionDefaults(&dim, hs);
+ dim.setDef1Point(toCoord(def1));
+ dim.setDef2Point(toCoord(def2));
+ dim.setDimPoint(toCoord(dimp));
+ dim.setTextPoint(toCoord(textp));
+ dim.setText(text);
+ dim.setAngle(angle);
+ dim.setOblique(oblique);
+ dim.setActualMeasurement(actual);
+ dxf->writeDimension(&dim);
+ }
+
+ void writeRadialDimension(Vector center, Vector radius,
+ Vector textp, const std::string &text, hStyle hs, double actual) {
+ DRW_DimRadial dim;
+ assignDimensionDefaults(&dim, hs);
+ dim.setCenterPoint(toCoord(center));
+ dim.setDiameterPoint(toCoord(radius));
+ dim.setTextPoint(toCoord(textp));
+ dim.setText(text);
+ dim.setActualMeasurement(actual);
+ dxf->writeDimension(&dim);
+ }
+
+ void writeDiametricDimension(Vector def1, Vector def2,
+ Vector textp, const std::string &text, hStyle hs, double actual) {
+ DRW_DimDiametric dim;
+ assignDimensionDefaults(&dim, hs);
+ dim.setDiameter1Point(toCoord(def1));
+ dim.setDiameter2Point(toCoord(def2));
+ dim.setTextPoint(toCoord(textp));
+ dim.setText(text);
+ dim.setActualMeasurement(actual);
+ dxf->writeDimension(&dim);
+ }
+
+ void writeAngularDimension(Vector fl1, Vector fl2, Vector sl1, Vector sl2, Vector dimp,
+ Vector textp, const std::string &text, hStyle hs, double actual) {
+ DRW_DimAngular dim;
+ assignDimensionDefaults(&dim, hs);
+ dim.setFirstLine1(toCoord(fl1));
+ dim.setFirstLine2(toCoord(fl2));
+ dim.setSecondLine1(toCoord(sl1));
+ dim.setSecondLine2(toCoord(sl2));
+ dim.setDimPoint(toCoord(dimp));
+ dim.setTextPoint(toCoord(textp));
+ dim.setText(text);
+ dim.setActualMeasurement(actual * PI / 180.0);
+ dxf->writeDimension(&dim);
+ }
+
+ void writeText(Vector textp, const std::string &text,
+ double height, double angle, int origin, hStyle hs) {
+ DRW_Text txt;
+ assignEntityDefaults(&txt, hs);
+ txt.layer = "text";
+ txt.style = "unicode";
+ txt.basePoint = toCoord(textp);
+ txt.secPoint = txt.basePoint;
+ txt.text = text;
+ txt.height = height;
+ txt.angle = angle;
+ txt.alignH = DRW_Text::HCenter;
+ if(origin & Style::ORIGIN_LEFT) {
+ txt.alignH = DRW_Text::HLeft;
+ } else if(origin & Style::ORIGIN_RIGHT) {
+ txt.alignH = DRW_Text::HRight;
+ }
+ txt.alignV = DRW_Text::VMiddle;
+ if(origin & Style::ORIGIN_TOP) {
+ txt.alignV = DRW_Text::VTop;
+ } else if(origin & Style::ORIGIN_BOT) {
+ txt.alignV = DRW_Text::VBaseLine;
+ }
+ dxf->writeText(&txt);
+ }
+};
+
+bool DxfFileWriter::OutputConstraints(IdList<Constraint,hConstraint> *constraint) {
+ this->constraint = constraint;
+ return true;
+}
+
+void DxfFileWriter::StartFile(void) {
+ paths.clear();
+}
+
+void DxfFileWriter::StartPath(RgbaColor strokeRgb, double lineWidth,
+ bool filled, RgbaColor fillRgb, hStyle hs)
+{
+ BezierPath path = {};
+ paths.push_back(path);
+}
+void DxfFileWriter::FinishPath(RgbaColor strokeRgb, double lineWidth,
+ bool filled, RgbaColor fillRgb, hStyle hs)
+{
+}
+
+void DxfFileWriter::Triangle(STriangle *tr) {
+}
+
+void DxfFileWriter::Bezier(SBezier *sb) {
+ paths.back().beziers.push_back(sb);
+}
+
+void DxfFileWriter::FinishAndCloseFile() {
+ dxfRW dxf;
+
+ DxfWriteInterface interface(this, &dxf);
+ std::stringstream stream;
+ dxf.write(stream, &interface, DRW::AC1021, /*bin=*/false);
+ paths.clear();
+ constraint = NULL;
+
+ if(!WriteFile(filename, stream.str())) {
+ Error("Couldn't write to '%s'", filename.c_str());
+ return;
+ }
+}
+
+bool DxfFileWriter::NeedToOutput(Constraint *c) {
+ switch(c->type) {
+ case Constraint::PT_PT_DISTANCE:
+ case Constraint::PT_LINE_DISTANCE:
+ case Constraint::DIAMETER:
+ case Constraint::ANGLE:
+ case Constraint::COMMENT:
+ return c->IsVisible();
+ }
+ return false;
+}
+
+const char *DxfFileWriter::lineTypeName(int stippleType) {
+ switch(stippleType) {
+ case Style::STIPPLE_CONTINUOUS: return "CONTINUOUS";
+ case Style::STIPPLE_DASH: return "DASHED";
+ case Style::STIPPLE_LONG_DASH: return "DASHEDX2";
+ case Style::STIPPLE_DASH_DOT: return "DASHDOT";
+ case Style::STIPPLE_DASH_DOT_DOT: return "DIVIDE";
+ case Style::STIPPLE_DOT: return "DOT";
+ case Style::STIPPLE_FREEHAND: return "CONTINUOUS";
+ case Style::STIPPLE_ZIGZAG: return "CONTINUOUS";
+ }
+
+ return "CONTINUOUS";
+}
+
+//-----------------------------------------------------------------------------
+// Routines for EPS output
+//-----------------------------------------------------------------------------
+
+static std::string MakeStipplePattern(int pattern, double scale, char delimiter,
+ bool inkscapeWorkaround = false) {
+ scale /= 2.0;
+
+ // Inkscape ignores all elements that are exactly zero instead of drawing
+ // them as dots.
+ double zero = inkscapeWorkaround ? 1e-6 : 0;
+
+ std::string result;
+ switch(pattern) {
+ case Style::STIPPLE_CONTINUOUS:
+ case Style::STIPPLE_FREEHAND:
+ case Style::STIPPLE_ZIGZAG:
+ return "";
+
+ case Style::STIPPLE_DASH:
+ result = ssprintf("%.3f_%.3f", scale, scale);
+ break;
+ case Style::STIPPLE_DASH_DOT:
+ result = ssprintf("%.3f_%.3f_%.6f_%.3f",
+ scale, scale * 0.5, zero, scale * 0.5);
+ break;
+ case Style::STIPPLE_DASH_DOT_DOT:
+ result = ssprintf("%.3f_%.3f_%.6f_%.3f_%.6f_%.3f",
+ scale, scale * 0.5, zero,
+ scale * 0.5, scale * 0.5, zero);
+ break;
+ case Style::STIPPLE_DOT:
+ result = ssprintf("%.6f_%.3f", zero, scale * 0.5);
+ break;
+ case Style::STIPPLE_LONG_DASH:
+ result = ssprintf("%.3f_%.3f", scale * 2.0, scale * 0.5);
+ break;
+
+ default:
+ oops();
+ }
+ std::replace(result.begin(), result.end(), '_', delimiter);
+ return result;
+}
+
+void EpsFileWriter::StartFile(void) {
+ fprintf(f,
+"%%!PS-Adobe-2.0\r\n"
+"%%%%Creator: SolveSpace\r\n"
+"%%%%Title: title\r\n"
+"%%%%Pages: 0\r\n"
+"%%%%PageOrder: Ascend\r\n"
+"%%%%BoundingBox: 0 0 %d %d\r\n"
+"%%%%HiResBoundingBox: 0 0 %.3f %.3f\r\n"
+"%%%%EndComments\r\n"
+"\r\n"
+"gsave\r\n"
+"\r\n",
+ (int)ceil(MmToPts(ptMax.x - ptMin.x)),
+ (int)ceil(MmToPts(ptMax.y - ptMin.y)),
+ MmToPts(ptMax.x - ptMin.x),
+ MmToPts(ptMax.y - ptMin.y));
+}
+
+void EpsFileWriter::StartPath(RgbaColor strokeRgb, double lineWidth,
+ bool filled, RgbaColor fillRgb, hStyle hs)
+{
+ fprintf(f, "newpath\r\n");
+ prevPt = Vector::From(VERY_POSITIVE, VERY_POSITIVE, VERY_POSITIVE);
+}
+void EpsFileWriter::FinishPath(RgbaColor strokeRgb, double lineWidth,
+ bool filled, RgbaColor fillRgb, hStyle hs)
+{
+ int pattern = Style::PatternType(hs);
+ double stippleScale = MmToPts(Style::StippleScaleMm(hs));
+
+ fprintf(f, " %.3f setlinewidth\r\n"
+ " %.3f %.3f %.3f setrgbcolor\r\n"
+ " 1 setlinejoin\r\n" // rounded
+ " 1 setlinecap\r\n" // rounded
+ " [%s] 0 setdash\r\n"
+ " gsave stroke grestore\r\n",
+ MmToPts(lineWidth),
+ strokeRgb.redF(), strokeRgb.greenF(), strokeRgb.blueF(),
+ MakeStipplePattern(pattern, stippleScale, ' ').c_str()
+ );
+ if(filled) {
+ fprintf(f, " %.3f %.3f %.3f setrgbcolor\r\n"
+ " gsave fill grestore\r\n",
+ fillRgb.redF(), fillRgb.greenF(), fillRgb.blueF());
+ }
+}
+
+void EpsFileWriter::MaybeMoveTo(Vector st, Vector fi) {
+ if(!prevPt.Equals(st)) {
+ fprintf(f, " %.3f %.3f moveto\r\n",
+ MmToPts(st.x - ptMin.x), MmToPts(st.y - ptMin.y));
+ }
+ prevPt = fi;
+}
+
+void EpsFileWriter::Triangle(STriangle *tr) {
+ fprintf(f,
+"%.3f %.3f %.3f setrgbcolor\r\n"
+"newpath\r\n"
+" %.3f %.3f moveto\r\n"
+" %.3f %.3f lineto\r\n"
+" %.3f %.3f lineto\r\n"
+" closepath\r\n"
+"gsave fill grestore\r\n",
+ tr->meta.color.redF(), tr->meta.color.greenF(), tr->meta.color.blueF(),
+ MmToPts(tr->a.x - ptMin.x), MmToPts(tr->a.y - ptMin.y),
+ MmToPts(tr->b.x - ptMin.x), MmToPts(tr->b.y - ptMin.y),
+ MmToPts(tr->c.x - ptMin.x), MmToPts(tr->c.y - ptMin.y));
+
+ // same issue with cracks, stroke it to avoid them
+ double sw = max(ptMax.x - ptMin.x, ptMax.y - ptMin.y) / 1000;
+ fprintf(f,
+"1 setlinejoin\r\n"
+"1 setlinecap\r\n"
+"%.3f setlinewidth\r\n"
+"gsave stroke grestore\r\n",
+ MmToPts(sw));
+}
+
+void EpsFileWriter::Bezier(SBezier *sb) {
+ Vector c, n = Vector::From(0, 0, 1);
+ double r;
+ if(sb->deg == 1) {
+ MaybeMoveTo(sb->ctrl[0], sb->ctrl[1]);
+ fprintf(f, " %.3f %.3f lineto\r\n",
+ MmToPts(sb->ctrl[1].x - ptMin.x),
+ MmToPts(sb->ctrl[1].y - ptMin.y));
+ } else if(sb->IsCircle(n, &c, &r)) {
+ Vector p0 = sb->ctrl[0], p1 = sb->ctrl[2];
+ double theta0 = atan2(p0.y - c.y, p0.x - c.x),
+ theta1 = atan2(p1.y - c.y, p1.x - c.x),
+ dtheta = WRAP_SYMMETRIC(theta1 - theta0, 2*PI);
+ MaybeMoveTo(p0, p1);
+ fprintf(f,
+" %.3f %.3f %.3f %.3f %.3f %s\r\n",
+ MmToPts(c.x - ptMin.x), MmToPts(c.y - ptMin.y),
+ MmToPts(r),
+ theta0*180/PI, theta1*180/PI,
+ dtheta < 0 ? "arcn" : "arc");
+ } else if(sb->deg == 3 && !sb->IsRational()) {
+ MaybeMoveTo(sb->ctrl[0], sb->ctrl[3]);
+ fprintf(f,
+" %.3f %.3f %.3f %.3f %.3f %.3f curveto\r\n",
+ MmToPts(sb->ctrl[1].x - ptMin.x), MmToPts(sb->ctrl[1].y - ptMin.y),
+ MmToPts(sb->ctrl[2].x - ptMin.x), MmToPts(sb->ctrl[2].y - ptMin.y),
+ MmToPts(sb->ctrl[3].x - ptMin.x), MmToPts(sb->ctrl[3].y - ptMin.y));
+ } else {
+ BezierAsNonrationalCubic(sb);
+ }
+}
+
+void EpsFileWriter::FinishAndCloseFile(void) {
+ fprintf(f,
+"\r\n"
+"grestore\r\n"
+"\r\n");
+ fclose(f);
+}
+
+//-----------------------------------------------------------------------------
+// Routines for PDF output, some extra complexity because we have to generate
+// a correct xref table.
+//-----------------------------------------------------------------------------
+void PdfFileWriter::StartFile(void) {
+ if((ptMax.x - ptMin.x) > 200*25.4 ||
+ (ptMax.y - ptMin.y) > 200*25.4)
+ {
+ Message("PDF page size exceeds 200 by 200 inches; many viewers may "
+ "reject this file.");
+ }
+
+ fprintf(f,
+"%%PDF-1.1\r\n"
+"%%%c%c%c%c\r\n",
+ 0xe2, 0xe3, 0xcf, 0xd3);
+
+ xref[1] = (uint32_t)ftell(f);
+ fprintf(f,
+"1 0 obj\r\n"
+" << /Type /Catalog\r\n"
+" /Outlines 2 0 R\r\n"
+" /Pages 3 0 R\r\n"
+" >>\r\n"
+"endobj\r\n");
+
+ xref[2] = (uint32_t)ftell(f);
+ fprintf(f,
+"2 0 obj\r\n"
+" << /Type /Outlines\r\n"
+" /Count 0\r\n"
+" >>\r\n"
+"endobj\r\n");
+
+ xref[3] = (uint32_t)ftell(f);
+ fprintf(f,
+"3 0 obj\r\n"
+" << /Type /Pages\r\n"
+" /Kids [4 0 R]\r\n"
+" /Count 1\r\n"
+" >>\r\n"
+"endobj\r\n");
+
+ xref[4] = (uint32_t)ftell(f);
+ fprintf(f,
+"4 0 obj\r\n"
+" << /Type /Page\r\n"
+" /Parent 3 0 R\r\n"
+" /MediaBox [0 0 %.3f %.3f]\r\n"
+" /Contents 5 0 R\r\n"
+" /Resources << /ProcSet 7 0 R\r\n"
+" /Font << /F1 8 0 R >>\r\n"
+" >>\r\n"
+" >>\r\n"
+"endobj\r\n",
+ MmToPts(ptMax.x - ptMin.x),
+ MmToPts(ptMax.y - ptMin.y));
+
+ xref[5] = (uint32_t)ftell(f);
+ fprintf(f,
+"5 0 obj\r\n"
+" << /Length 6 0 R >>\r\n"
+"stream\r\n");
+ bodyStart = (uint32_t)ftell(f);
+}
+
+void PdfFileWriter::FinishAndCloseFile(void) {
+ uint32_t bodyEnd = (uint32_t)ftell(f);
+
+ fprintf(f,
+"endstream\r\n"
+"endobj\r\n");
+
+ xref[6] = (uint32_t)ftell(f);
+ fprintf(f,
+"6 0 obj\r\n"
+" %d\r\n"
+"endobj\r\n",
+ bodyEnd - bodyStart);
+
+ xref[7] = (uint32_t)ftell(f);
+ fprintf(f,
+"7 0 obj\r\n"
+" [/PDF /Text]\r\n"
+"endobj\r\n");
+
+ xref[8] = (uint32_t)ftell(f);
+ fprintf(f,
+"8 0 obj\r\n"
+" << /Type /Font\r\n"
+" /Subtype /Type1\r\n"
+" /Name /F1\r\n"
+" /BaseFont /Helvetica\r\n"
+" /Encoding /WinAnsiEncoding\r\n"
+" >>\r\n"
+"endobj\r\n");
+
+ xref[9] = (uint32_t)ftell(f);
+ fprintf(f,
+"9 0 obj\r\n"
+" << /Creator (SolveSpace)\r\n"
+" >>\r\n");
+
+ uint32_t xrefStart = (uint32_t)ftell(f);
+ fprintf(f,
+"xref\r\n"
+"0 10\r\n"
+"0000000000 65535 f\r\n");
+
+ int i;
+ for(i = 1; i <= 9; i++) {
+ fprintf(f, "%010d %05d n\r\n", xref[i], 0);
+ }
+
+ fprintf(f,
+"\r\n"
+"trailer\r\n"
+" << /Size 10\r\n"
+" /Root 1 0 R\r\n"
+" /Info 9 0 R\r\n"
+" >>\r\n"
+"startxref\r\n"
+"%d\r\n"
+"%%%%EOF\r\n",
+ xrefStart);
+
+ fclose(f);
+
+}
+
+void PdfFileWriter::StartPath(RgbaColor strokeRgb, double lineWidth,
+ bool filled, RgbaColor fillRgb, hStyle hs)
+{
+ int pattern = Style::PatternType(hs);
+ double stippleScale = MmToPts(Style::StippleScaleMm(hs));
+
+ fprintf(f, "1 J 1 j " // round endcaps and joins
+ "%.3f w [%s] 0 d "
+ "%.3f %.3f %.3f RG\r\n",
+ MmToPts(lineWidth),
+ MakeStipplePattern(pattern, stippleScale, ' ').c_str(),
+ strokeRgb.redF(), strokeRgb.greenF(), strokeRgb.blueF());
+ if(filled) {
+ fprintf(f, "%.3f %.3f %.3f rg\r\n",
+ fillRgb.redF(), fillRgb.greenF(), fillRgb.blueF());
+ }
+
+ prevPt = Vector::From(VERY_POSITIVE, VERY_POSITIVE, VERY_POSITIVE);
+}
+void PdfFileWriter::FinishPath(RgbaColor strokeRgb, double lineWidth,
+ bool filled, RgbaColor fillRgb, hStyle hs)
+{
+ if(filled) {
+ fprintf(f, "b\r\n");
+ } else {
+ fprintf(f, "S\r\n");
+ }
+}
+
+void PdfFileWriter::MaybeMoveTo(Vector st, Vector fi) {
+ if(!prevPt.Equals(st)) {
+ fprintf(f, "%.3f %.3f m\r\n",
+ MmToPts(st.x - ptMin.x), MmToPts(st.y - ptMin.y));
+ }
+ prevPt = fi;
+}
+
+void PdfFileWriter::Triangle(STriangle *tr) {
+ double sw = max(ptMax.x - ptMin.x, ptMax.y - ptMin.y) / 1000;
+
+ fprintf(f,
+"1 J 1 j\r\n"
+"%.3f %.3f %.3f RG\r\n"
+"%.3f %.3f %.3f rg\r\n"
+"%.3f w\r\n"
+"%.3f %.3f m\r\n"
+"%.3f %.3f l\r\n"
+"%.3f %.3f l\r\n"
+"b\r\n",
+ tr->meta.color.redF(), tr->meta.color.greenF(), tr->meta.color.blueF(),
+ tr->meta.color.redF(), tr->meta.color.greenF(), tr->meta.color.blueF(),
+ MmToPts(sw),
+ MmToPts(tr->a.x - ptMin.x), MmToPts(tr->a.y - ptMin.y),
+ MmToPts(tr->b.x - ptMin.x), MmToPts(tr->b.y - ptMin.y),
+ MmToPts(tr->c.x - ptMin.x), MmToPts(tr->c.y - ptMin.y));
+}
+
+void PdfFileWriter::Bezier(SBezier *sb) {
+ if(sb->deg == 1) {
+ MaybeMoveTo(sb->ctrl[0], sb->ctrl[1]);
+ fprintf(f,
+"%.3f %.3f l\r\n",
+ MmToPts(sb->ctrl[1].x - ptMin.x), MmToPts(sb->ctrl[1].y - ptMin.y));
+ } else if(sb->deg == 3 && !sb->IsRational()) {
+ MaybeMoveTo(sb->ctrl[0], sb->ctrl[3]);
+ fprintf(f,
+"%.3f %.3f %.3f %.3f %.3f %.3f c\r\n",
+ MmToPts(sb->ctrl[1].x - ptMin.x), MmToPts(sb->ctrl[1].y - ptMin.y),
+ MmToPts(sb->ctrl[2].x - ptMin.x), MmToPts(sb->ctrl[2].y - ptMin.y),
+ MmToPts(sb->ctrl[3].x - ptMin.x), MmToPts(sb->ctrl[3].y - ptMin.y));
+ } else {
+ BezierAsNonrationalCubic(sb);
+ }
+}
+
+//-----------------------------------------------------------------------------
+// Routines for SVG output
+//-----------------------------------------------------------------------------
+void SvgFileWriter::StartFile(void) {
+ fprintf(f,
+"<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.0//EN\" "
+ "\"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd\">\r\n"
+"<svg xmlns=\"http://www.w3.org/2000/svg\" "
+ "xmlns:xlink=\"http://www.w3.org/1999/xlink\" "
+ "width='%.3fmm' height='%.3fmm' "
+ "viewBox=\"0 0 %.3f %.3f\">\r\n"
+"\r\n"
+"<title>Exported SVG</title>\r\n"
+"\r\n",
+ (ptMax.x - ptMin.x), (ptMax.y - ptMin.y),
+ (ptMax.x - ptMin.x), (ptMax.y - ptMin.y));
+
+ fprintf(f, "<style><![CDATA[\r\n");
+ fprintf(f, "polygon {\r\n");
+ fprintf(f, "shape-rendering:crispEdges;\r\n");
+ // crispEdges turns of anti-aliasing, which tends to cause hairline
+ // cracks between triangles; but there still is some cracking, so
+ // specify a stroke width too, hope for around a pixel
+ double sw = max(ptMax.x - ptMin.x, ptMax.y - ptMin.y) / 1000;
+ fprintf(f, "stroke-width:%f;\r\n", sw);
+ fprintf(f, "}\r\n");
+ for(int i = 0; i < SK.style.n; i++) {
+ Style *s = &SK.style.elem[i];
+ RgbaColor strokeRgb = Style::Color(s->h, true);
+ int pattern = Style::PatternType(s->h);
+ double stippleScale = Style::StippleScaleMm(s->h);
+
+ fprintf(f, ".s%x {\r\n", s->h.v);
+ fprintf(f, "stroke:#%02x%02x%02x;\r\n", strokeRgb.red, strokeRgb.green, strokeRgb.blue);
+ // don't know why we have to take a half of the width
+ fprintf(f, "stroke-width:%f;\r\n", Style::WidthMm(s->h.v) / 2.0);
+ fprintf(f, "stroke-linecap:round;\r\n");
+ fprintf(f, "stroke-linejoin:round;\r\n");
+ std::string patternStr = MakeStipplePattern(pattern, stippleScale, ',',
+ /*inkscapeWorkaround=*/true);
+ if(!patternStr.empty()) {
+ fprintf(f, "stroke-dasharray:%s;\r\n", patternStr.c_str());
+ }
+ fprintf(f, "fill:none;\r\n");
+ fprintf(f, "}\r\n");
+ }
+ fprintf(f, "]]></style>\r\n");
+}
+
+void SvgFileWriter::StartPath(RgbaColor strokeRgb, double lineWidth,
+ bool filled, RgbaColor fillRgb, hStyle hs)
+{
+ fprintf(f, "<path d='");
+ prevPt = Vector::From(VERY_POSITIVE, VERY_POSITIVE, VERY_POSITIVE);
+}
+void SvgFileWriter::FinishPath(RgbaColor strokeRgb, double lineWidth,
+ bool filled, RgbaColor fillRgb, hStyle hs)
+{
+ std::string fill;
+ if(filled) {
+ fill = ssprintf("fill='#%02x%02x%02x'",
+ fillRgb.red, fillRgb.green, fillRgb.blue);
+ }
+ std::string cls = ssprintf("s%x", hs.v);
+ fprintf(f, "' class='%s' %s/>\r\n", cls.c_str(), fill.c_str());
+}
+
+void SvgFileWriter::MaybeMoveTo(Vector st, Vector fi) {
+ // SVG uses a coordinate system with the origin at top left, +y down
+ if(!prevPt.Equals(st)) {
+ fprintf(f, "M%.3f %.3f ", (st.x - ptMin.x), (ptMax.y - st.y));
+ }
+ prevPt = fi;
+}
+
+void SvgFileWriter::Triangle(STriangle *tr) {
+ fprintf(f,
+"<polygon points='%.3f,%.3f %.3f,%.3f %.3f,%.3f' "
+ "stroke='#%02x%02x%02x' "
+ "fill='#%02x%02x%02x'/>\r\n",
+ (tr->a.x - ptMin.x), (ptMax.y - tr->a.y),
+ (tr->b.x - ptMin.x), (ptMax.y - tr->b.y),
+ (tr->c.x - ptMin.x), (ptMax.y - tr->c.y),
+ tr->meta.color.red, tr->meta.color.green, tr->meta.color.blue,
+ tr->meta.color.red, tr->meta.color.green, tr->meta.color.blue);
+}
+
+void SvgFileWriter::Bezier(SBezier *sb) {
+ Vector c, n = Vector::From(0, 0, 1);
+ double r;
+ if(sb->deg == 1) {
+ MaybeMoveTo(sb->ctrl[0], sb->ctrl[1]);
+ fprintf(f, "L%.3f,%.3f ",
+ (sb->ctrl[1].x - ptMin.x), (ptMax.y - sb->ctrl[1].y));
+ } else if(sb->IsCircle(n, &c, &r)) {
+ Vector p0 = sb->ctrl[0], p1 = sb->ctrl[2];
+ double theta0 = atan2(p0.y - c.y, p0.x - c.x),
+ theta1 = atan2(p1.y - c.y, p1.x - c.x),
+ dtheta = WRAP_SYMMETRIC(theta1 - theta0, 2*PI);
+ // The arc must be less than 180 degrees, or else it couldn't have
+ // been represented as a single rational Bezier. So large-arc-flag
+ // must be false. sweep-flag is determined by the sign of dtheta.
+ // Note that clockwise and counter-clockwise are backwards in SVG's
+ // mirrored csys.
+ MaybeMoveTo(p0, p1);
+ fprintf(f, "A%.3f,%.3f 0 0,%d %.3f,%.3f ",
+ r, r,
+ (dtheta < 0) ? 1 : 0,
+ p1.x - ptMin.x, ptMax.y - p1.y);
+ } else if(!sb->IsRational()) {
+ if(sb->deg == 2) {
+ MaybeMoveTo(sb->ctrl[0], sb->ctrl[2]);
+ fprintf(f, "Q%.3f,%.3f %.3f,%.3f ",
+ sb->ctrl[1].x - ptMin.x, ptMax.y - sb->ctrl[1].y,
+ sb->ctrl[2].x - ptMin.x, ptMax.y - sb->ctrl[2].y);
+ } else if(sb->deg == 3) {
+ MaybeMoveTo(sb->ctrl[0], sb->ctrl[3]);
+ fprintf(f, "C%.3f,%.3f %.3f,%.3f %.3f,%.3f ",
+ sb->ctrl[1].x - ptMin.x, ptMax.y - sb->ctrl[1].y,
+ sb->ctrl[2].x - ptMin.x, ptMax.y - sb->ctrl[2].y,
+ sb->ctrl[3].x - ptMin.x, ptMax.y - sb->ctrl[3].y);
+ }
+ } else {
+ BezierAsNonrationalCubic(sb);
+ }
+}
+
+void SvgFileWriter::FinishAndCloseFile(void) {
+ fprintf(f, "\r\n</svg>\r\n");
+ fclose(f);
+}
+
+//-----------------------------------------------------------------------------
+// Routines for HPGL output
+//-----------------------------------------------------------------------------
+double HpglFileWriter::MmToHpglUnits(double mm) {
+ return mm*40;
+}
+
+void HpglFileWriter::StartFile(void) {
+ fprintf(f, "IN;\r\n");
+ fprintf(f, "SP1;\r\n");
+}
+
+void HpglFileWriter::StartPath(RgbaColor strokeRgb, double lineWidth,
+ bool filled, RgbaColor fillRgb, hStyle hs)
+{
+}
+void HpglFileWriter::FinishPath(RgbaColor strokeRgb, double lineWidth,
+ bool filled, RgbaColor fillRgb, hStyle hs)
+{
+}
+
+void HpglFileWriter::Triangle(STriangle *tr) {
+}
+
+void HpglFileWriter::Bezier(SBezier *sb) {
+ if(sb->deg == 1) {
+ fprintf(f, "PU%d,%d;\r\n",
+ (int)MmToHpglUnits(sb->ctrl[0].x),
+ (int)MmToHpglUnits(sb->ctrl[0].y));
+ fprintf(f, "PD%d,%d;\r\n",
+ (int)MmToHpglUnits(sb->ctrl[1].x),
+ (int)MmToHpglUnits(sb->ctrl[1].y));
+ } else {
+ BezierAsPwl(sb);
+ }
+}
+
+void HpglFileWriter::FinishAndCloseFile(void) {
+ fclose(f);
+}
+
+//-----------------------------------------------------------------------------
+// Routines for G Code output. Slightly complicated by our ability to generate
+// multiple passes, and to specify the feeds and depth; those parameters get
+// set in the configuration screen.
+//-----------------------------------------------------------------------------
+void GCodeFileWriter::StartFile(void) {
+ sel = {};
+}
+void GCodeFileWriter::StartPath(RgbaColor strokeRgb, double lineWidth,
+ bool filled, RgbaColor fillRgb, hStyle hs)
+{
+}
+void GCodeFileWriter::FinishPath(RgbaColor strokeRgb, double lineWidth,
+ bool filled, RgbaColor fillRgb, hStyle hs)
+{
+}
+void GCodeFileWriter::Triangle(STriangle *tr) {
+}
+
+void GCodeFileWriter::Bezier(SBezier *sb) {
+ if(sb->deg == 1) {
+ sel.AddEdge(sb->ctrl[0], sb->ctrl[1]);
+ } else {
+ BezierAsPwl(sb);
+ }
+}
+
+void GCodeFileWriter::FinishAndCloseFile(void) {
+ SPolygon sp = {};
+ sel.AssemblePolygon(&sp, NULL);
+
+ int i;
+ for(i = 0; i < SS.gCode.passes; i++) {
+ double depth = (SS.gCode.depth / SS.gCode.passes)*(i+1);
+
+ SContour *sc;
+ for(sc = sp.l.First(); sc; sc = sp.l.NextAfter(sc)) {
+ if(sc->l.n < 2) continue;
+
+ SPoint *pt = sc->l.First();
+ fprintf(f, "G00 X%s Y%s\r\n",
+ SS.MmToString(pt->p.x).c_str(), SS.MmToString(pt->p.y).c_str());
+ fprintf(f, "G01 Z%s F%s\r\n",
+ SS.MmToString(depth).c_str(), SS.MmToString(SS.gCode.plungeFeed).c_str());
+
+ pt = sc->l.NextAfter(pt);
+ for(; pt; pt = sc->l.NextAfter(pt)) {
+ fprintf(f, "G01 X%s Y%s F%s\r\n",
+ SS.MmToString(pt->p.x).c_str(), SS.MmToString(pt->p.y).c_str(),
+ SS.MmToString(SS.gCode.feed).c_str());
+ }
+ // Move up to a clearance plane 5mm above the work.
+ fprintf(f, "G00 Z%s\r\n",
+ SS.MmToString(SS.gCode.depth < 0 ? +5 : -5).c_str());
+ }
+ }
+
+ sp.Clear();
+ sel.Clear();
+ fclose(f);
+}
+
+
+//-----------------------------------------------------------------------------
+// Routine for STEP output; just a wrapper around the general STEP stuff that
+// can also be used for surfaces or 3d curves.
+//-----------------------------------------------------------------------------
+void Step2dFileWriter::StartFile(void) {
+ sfw = {};
+ sfw.f = f;
+ sfw.WriteHeader();
+}
+
+void Step2dFileWriter::Triangle(STriangle *tr) {
+}
+
+void Step2dFileWriter::StartPath(RgbaColor strokeRgb, double lineWidth,
+ bool filled, RgbaColor fillRgb, hStyle hs)
+{
+}
+void Step2dFileWriter::FinishPath(RgbaColor strokeRgb, double lineWidth,
+ bool filled, RgbaColor fillRgb, hStyle hs)
+{
+}
+
+void Step2dFileWriter::Bezier(SBezier *sb) {
+ int c = sfw.ExportCurve(sb);
+ sfw.curves.Add(&c);
+}
+
+void Step2dFileWriter::FinishAndCloseFile(void) {
+ sfw.WriteWireframe();
+ sfw.WriteFooter();
+ fclose(f);
+}
+
--- /dev/null
+//-----------------------------------------------------------------------------
+// The symbolic algebra system used to write our constraint equations;
+// routines to build expressions in software or from a user-provided string,
+// and to compute the partial derivatives that we'll use when write our
+// Jacobian matrix.
+//
+// Copyright 2008-2013 Jonathan Westhues.
+//-----------------------------------------------------------------------------
+#include "solvespace.h"
+
+ExprVector ExprVector::From(Expr *x, Expr *y, Expr *z) {
+ ExprVector r = { x, y, z};
+ return r;
+}
+
+ExprVector ExprVector::From(Vector vn) {
+ ExprVector ve;
+ ve.x = Expr::From(vn.x);
+ ve.y = Expr::From(vn.y);
+ ve.z = Expr::From(vn.z);
+ return ve;
+}
+
+ExprVector ExprVector::From(hParam x, hParam y, hParam z) {
+ ExprVector ve;
+ ve.x = Expr::From(x);
+ ve.y = Expr::From(y);
+ ve.z = Expr::From(z);
+ return ve;
+}
+
+ExprVector ExprVector::From(double x, double y, double z) {
+ ExprVector ve;
+ ve.x = Expr::From(x);
+ ve.y = Expr::From(y);
+ ve.z = Expr::From(z);
+ return ve;
+}
+
+ExprVector ExprVector::Minus(ExprVector b) {
+ ExprVector r;
+ r.x = x->Minus(b.x);
+ r.y = y->Minus(b.y);
+ r.z = z->Minus(b.z);
+ return r;
+}
+
+ExprVector ExprVector::Plus(ExprVector b) {
+ ExprVector r;
+ r.x = x->Plus(b.x);
+ r.y = y->Plus(b.y);
+ r.z = z->Plus(b.z);
+ return r;
+}
+
+Expr *ExprVector::Dot(ExprVector b) {
+ Expr *r;
+ r = x->Times(b.x);
+ r = r->Plus(y->Times(b.y));
+ r = r->Plus(z->Times(b.z));
+ return r;
+}
+
+ExprVector ExprVector::Cross(ExprVector b) {
+ ExprVector r;
+ r.x = (y->Times(b.z))->Minus(z->Times(b.y));
+ r.y = (z->Times(b.x))->Minus(x->Times(b.z));
+ r.z = (x->Times(b.y))->Minus(y->Times(b.x));
+ return r;
+}
+
+ExprVector ExprVector::ScaledBy(Expr *s) {
+ ExprVector r;
+ r.x = x->Times(s);
+ r.y = y->Times(s);
+ r.z = z->Times(s);
+ return r;
+}
+
+ExprVector ExprVector::WithMagnitude(Expr *s) {
+ Expr *m = Magnitude();
+ return ScaledBy(s->Div(m));
+}
+
+Expr *ExprVector::Magnitude(void) {
+ Expr *r;
+ r = x->Square();
+ r = r->Plus(y->Square());
+ r = r->Plus(z->Square());
+ return r->Sqrt();
+}
+
+Vector ExprVector::Eval(void) {
+ Vector r;
+ r.x = x->Eval();
+ r.y = y->Eval();
+ r.z = z->Eval();
+ return r;
+}
+
+ExprQuaternion ExprQuaternion::From(hParam w, hParam vx, hParam vy, hParam vz) {
+ ExprQuaternion q;
+ q.w = Expr::From(w);
+ q.vx = Expr::From(vx);
+ q.vy = Expr::From(vy);
+ q.vz = Expr::From(vz);
+ return q;
+}
+
+ExprQuaternion ExprQuaternion::From(Expr *w, Expr *vx, Expr *vy, Expr *vz)
+{
+ ExprQuaternion q;
+ q.w = w;
+ q.vx = vx;
+ q.vy = vy;
+ q.vz = vz;
+ return q;
+}
+
+ExprQuaternion ExprQuaternion::From(Quaternion qn) {
+ ExprQuaternion qe;
+ qe.w = Expr::From(qn.w);
+ qe.vx = Expr::From(qn.vx);
+ qe.vy = Expr::From(qn.vy);
+ qe.vz = Expr::From(qn.vz);
+ return qe;
+}
+
+ExprVector ExprQuaternion::RotationU(void) {
+ ExprVector u;
+ Expr *two = Expr::From(2);
+
+ u.x = w->Square();
+ u.x = (u.x)->Plus(vx->Square());
+ u.x = (u.x)->Minus(vy->Square());
+ u.x = (u.x)->Minus(vz->Square());
+
+ u.y = two->Times(w->Times(vz));
+ u.y = (u.y)->Plus(two->Times(vx->Times(vy)));
+
+ u.z = two->Times(vx->Times(vz));
+ u.z = (u.z)->Minus(two->Times(w->Times(vy)));
+
+ return u;
+}
+
+ExprVector ExprQuaternion::RotationV(void) {
+ ExprVector v;
+ Expr *two = Expr::From(2);
+
+ v.x = two->Times(vx->Times(vy));
+ v.x = (v.x)->Minus(two->Times(w->Times(vz)));
+
+ v.y = w->Square();
+ v.y = (v.y)->Minus(vx->Square());
+ v.y = (v.y)->Plus(vy->Square());
+ v.y = (v.y)->Minus(vz->Square());
+
+ v.z = two->Times(w->Times(vx));
+ v.z = (v.z)->Plus(two->Times(vy->Times(vz)));
+
+ return v;
+}
+
+ExprVector ExprQuaternion::RotationN(void) {
+ ExprVector n;
+ Expr *two = Expr::From(2);
+
+ n.x = two->Times( w->Times(vy));
+ n.x = (n.x)->Plus (two->Times(vx->Times(vz)));
+
+ n.y = two->Times(vy->Times(vz));
+ n.y = (n.y)->Minus(two->Times( w->Times(vx)));
+
+ n.z = w->Square();
+ n.z = (n.z)->Minus(vx->Square());
+ n.z = (n.z)->Minus(vy->Square());
+ n.z = (n.z)->Plus (vz->Square());
+
+ return n;
+}
+
+ExprVector ExprQuaternion::Rotate(ExprVector p) {
+ // Express the point in the new basis
+ return (RotationU().ScaledBy(p.x)).Plus(
+ RotationV().ScaledBy(p.y)).Plus(
+ RotationN().ScaledBy(p.z));
+}
+
+ExprQuaternion ExprQuaternion::Times(ExprQuaternion b) {
+ Expr *sa = w, *sb = b.w;
+ ExprVector va = { vx, vy, vz };
+ ExprVector vb = { b.vx, b.vy, b.vz };
+
+ ExprQuaternion r;
+ r.w = (sa->Times(sb))->Minus(va.Dot(vb));
+ ExprVector vr = vb.ScaledBy(sa).Plus(
+ va.ScaledBy(sb).Plus(
+ va.Cross(vb)));
+ r.vx = vr.x;
+ r.vy = vr.y;
+ r.vz = vr.z;
+ return r;
+}
+
+Expr *ExprQuaternion::Magnitude(void) {
+ return ((w ->Square())->Plus(
+ (vx->Square())->Plus(
+ (vy->Square())->Plus(
+ (vz->Square())))))->Sqrt();
+}
+
+
+Expr *Expr::From(hParam p) {
+ Expr *r = AllocExpr();
+ r->op = PARAM;
+ r->parh = p;
+ return r;
+}
+
+Expr *Expr::From(double v) {
+ // Statically allocate common constants.
+ // Note: this is only valid because AllocExpr() uses AllocTemporary(),
+ // and Expr* is never explicitly freed.
+
+ if(v == 0.0) {
+ static Expr zero(0.0);
+ return &zero;
+ }
+
+ if(v == 1.0) {
+ static Expr one(1.0);
+ return &one;
+ }
+
+ if(v == -1.0) {
+ static Expr mone(-1.0);
+ return &mone;
+ }
+
+ if(v == 0.5) {
+ static Expr half(0.5);
+ return ½
+ }
+
+ if(v == -0.5) {
+ static Expr mhalf(-0.5);
+ return &mhalf;
+ }
+
+ Expr *r = AllocExpr();
+ r->op = CONSTANT;
+ r->v = v;
+ return r;
+}
+
+Expr *Expr::AnyOp(int newOp, Expr *b) {
+ Expr *r = AllocExpr();
+ r->op = newOp;
+ r->a = this;
+ r->b = b;
+ return r;
+}
+
+int Expr::Children(void) {
+ switch(op) {
+ case PARAM:
+ case PARAM_PTR:
+ case CONSTANT:
+ return 0;
+
+ case PLUS:
+ case MINUS:
+ case TIMES:
+ case DIV:
+ return 2;
+
+ case NEGATE:
+ case SQRT:
+ case SQUARE:
+ case SIN:
+ case COS:
+ case ASIN:
+ case ACOS:
+ return 1;
+
+ default: oops();
+ }
+}
+
+int Expr::Nodes(void) {
+ switch(Children()) {
+ case 0: return 1;
+ case 1: return 1 + a->Nodes();
+ case 2: return 1 + a->Nodes() + b->Nodes();
+ default: oops();
+ }
+}
+
+Expr *Expr::DeepCopy(void) {
+ Expr *n = AllocExpr();
+ *n = *this;
+ int c = n->Children();
+ if(c > 0) n->a = a->DeepCopy();
+ if(c > 1) n->b = b->DeepCopy();
+ return n;
+}
+
+Expr *Expr::DeepCopyWithParamsAsPointers(IdList<Param,hParam> *firstTry,
+ IdList<Param,hParam> *thenTry)
+{
+ Expr *n = AllocExpr();
+ if(op == PARAM) {
+ // A param that is referenced by its hParam gets rewritten to go
+ // straight in to the parameter table with a pointer, or simply
+ // into a constant if it's already known.
+ Param *p = firstTry->FindByIdNoOops(parh);
+ if(!p) p = thenTry->FindById(parh);
+ if(p->known) {
+ n->op = CONSTANT;
+ n->v = p->val;
+ } else {
+ n->op = PARAM_PTR;
+ n->parp = p;
+ }
+ return n;
+ }
+
+ *n = *this;
+ int c = n->Children();
+ if(c > 0) n->a = a->DeepCopyWithParamsAsPointers(firstTry, thenTry);
+ if(c > 1) n->b = b->DeepCopyWithParamsAsPointers(firstTry, thenTry);
+ return n;
+}
+
+double Expr::Eval(void) {
+ switch(op) {
+ case PARAM: return SK.GetParam(parh)->val;
+ case PARAM_PTR: return parp->val;
+
+ case CONSTANT: return v;
+
+ case PLUS: return a->Eval() + b->Eval();
+ case MINUS: return a->Eval() - b->Eval();
+ case TIMES: return a->Eval() * b->Eval();
+ case DIV: return a->Eval() / b->Eval();
+
+ case NEGATE: return -(a->Eval());
+ case SQRT: return sqrt(a->Eval());
+ case SQUARE: { double r = a->Eval(); return r*r; }
+ case SIN: return sin(a->Eval());
+ case COS: return cos(a->Eval());
+ case ACOS: return acos(a->Eval());
+ case ASIN: return asin(a->Eval());
+
+ default: oops();
+ }
+}
+
+Expr *Expr::PartialWrt(hParam p) {
+ Expr *da, *db;
+
+ switch(op) {
+ case PARAM_PTR: return From(p.v == parp->h.v ? 1 : 0);
+ case PARAM: return From(p.v == parh.v ? 1 : 0);
+
+ case CONSTANT: return From(0.0);
+
+ case PLUS: return (a->PartialWrt(p))->Plus(b->PartialWrt(p));
+ case MINUS: return (a->PartialWrt(p))->Minus(b->PartialWrt(p));
+
+ case TIMES:
+ da = a->PartialWrt(p);
+ db = b->PartialWrt(p);
+ return (a->Times(db))->Plus(b->Times(da));
+
+ case DIV:
+ da = a->PartialWrt(p);
+ db = b->PartialWrt(p);
+ return ((da->Times(b))->Minus(a->Times(db)))->Div(b->Square());
+
+ case SQRT:
+ return (From(0.5)->Div(a->Sqrt()))->Times(a->PartialWrt(p));
+
+ case SQUARE:
+ return (From(2.0)->Times(a))->Times(a->PartialWrt(p));
+
+ case NEGATE: return (a->PartialWrt(p))->Negate();
+ case SIN: return (a->Cos())->Times(a->PartialWrt(p));
+ case COS: return ((a->Sin())->Times(a->PartialWrt(p)))->Negate();
+
+ case ASIN:
+ return (From(1)->Div((From(1)->Minus(a->Square()))->Sqrt()))
+ ->Times(a->PartialWrt(p));
+ case ACOS:
+ return (From(-1)->Div((From(1)->Minus(a->Square()))->Sqrt()))
+ ->Times(a->PartialWrt(p));
+
+ default: oops();
+ }
+}
+
+uint64_t Expr::ParamsUsed(void) {
+ uint64_t r = 0;
+ if(op == PARAM) r |= ((uint64_t)1 << (parh.v % 61));
+ if(op == PARAM_PTR) r |= ((uint64_t)1 << (parp->h.v % 61));
+
+ int c = Children();
+ if(c >= 1) r |= a->ParamsUsed();
+ if(c >= 2) r |= b->ParamsUsed();
+ return r;
+}
+
+bool Expr::DependsOn(hParam p) {
+ if(op == PARAM) return (parh.v == p.v);
+ if(op == PARAM_PTR) return (parp->h.v == p.v);
+
+ int c = Children();
+ if(c == 1) return a->DependsOn(p);
+ if(c == 2) return a->DependsOn(p) || b->DependsOn(p);
+ return false;
+}
+
+bool Expr::Tol(double a, double b) {
+ return fabs(a - b) < 0.001;
+}
+Expr *Expr::FoldConstants(void) {
+ Expr *n = AllocExpr();
+ *n = *this;
+
+ int c = Children();
+ if(c >= 1) n->a = a->FoldConstants();
+ if(c >= 2) n->b = b->FoldConstants();
+
+ switch(op) {
+ case PARAM_PTR:
+ case PARAM:
+ case CONSTANT:
+ break;
+
+ case MINUS:
+ case TIMES:
+ case DIV:
+ case PLUS:
+ // If both ops are known, then we can evaluate immediately
+ if(n->a->op == CONSTANT && n->b->op == CONSTANT) {
+ double nv = n->Eval();
+ n->op = CONSTANT;
+ n->v = nv;
+ break;
+ }
+ // x + 0 = 0 + x = x
+ if(op == PLUS && n->b->op == CONSTANT && Tol(n->b->v, 0)) {
+ *n = *(n->a); break;
+ }
+ if(op == PLUS && n->a->op == CONSTANT && Tol(n->a->v, 0)) {
+ *n = *(n->b); break;
+ }
+ // 1*x = x*1 = x
+ if(op == TIMES && n->b->op == CONSTANT && Tol(n->b->v, 1)) {
+ *n = *(n->a); break;
+ }
+ if(op == TIMES && n->a->op == CONSTANT && Tol(n->a->v, 1)) {
+ *n = *(n->b); break;
+ }
+ // 0*x = x*0 = 0
+ if(op == TIMES && n->b->op == CONSTANT && Tol(n->b->v, 0)) {
+ n->op = CONSTANT; n->v = 0; break;
+ }
+ if(op == TIMES && n->a->op == CONSTANT && Tol(n->a->v, 0)) {
+ n->op = CONSTANT; n->v = 0; break;
+ }
+
+ break;
+
+ case SQRT:
+ case SQUARE:
+ case NEGATE:
+ case SIN:
+ case COS:
+ case ASIN:
+ case ACOS:
+ if(n->a->op == CONSTANT) {
+ double nv = n->Eval();
+ n->op = CONSTANT;
+ n->v = nv;
+ }
+ break;
+
+ default: oops();
+ }
+ return n;
+}
+
+void Expr::Substitute(hParam oldh, hParam newh) {
+ if(op == PARAM_PTR) oops();
+
+ if(op == PARAM && parh.v == oldh.v) {
+ parh = newh;
+ }
+ int c = Children();
+ if(c >= 1) a->Substitute(oldh, newh);
+ if(c >= 2) b->Substitute(oldh, newh);
+}
+
+//-----------------------------------------------------------------------------
+// If the expression references only one parameter that appears in pl, then
+// return that parameter. If no param is referenced, then return NO_PARAMS.
+// If multiple params are referenced, then return MULTIPLE_PARAMS.
+//-----------------------------------------------------------------------------
+const hParam Expr::NO_PARAMS = { 0 };
+const hParam Expr::MULTIPLE_PARAMS = { 1 };
+hParam Expr::ReferencedParams(ParamList *pl) {
+ if(op == PARAM) {
+ if(pl->FindByIdNoOops(parh)) {
+ return parh;
+ } else {
+ return NO_PARAMS;
+ }
+ }
+ if(op == PARAM_PTR) oops();
+
+ int c = Children();
+ if(c == 0) {
+ return NO_PARAMS;
+ } else if(c == 1) {
+ return a->ReferencedParams(pl);
+ } else if(c == 2) {
+ hParam pa, pb;
+ pa = a->ReferencedParams(pl);
+ pb = b->ReferencedParams(pl);
+ if(pa.v == NO_PARAMS.v) {
+ return pb;
+ } else if(pb.v == NO_PARAMS.v) {
+ return pa;
+ } else if(pa.v == pb.v) {
+ return pa; // either, doesn't matter
+ } else {
+ return MULTIPLE_PARAMS;
+ }
+ } else oops();
+}
+
+
+//-----------------------------------------------------------------------------
+// Routines to pretty-print an expression. Mostly for debugging.
+//-----------------------------------------------------------------------------
+
+std::string Expr::Print(void) {
+
+ char c;
+ switch(op) {
+ case PARAM: return ssprintf("param(%08x)", parh.v);
+ case PARAM_PTR: return ssprintf("param(p%08x)", parp->h.v);
+
+ case CONSTANT: return ssprintf("%.3f", v);
+
+ case PLUS: c = '+'; goto p;
+ case MINUS: c = '-'; goto p;
+ case TIMES: c = '*'; goto p;
+ case DIV: c = '/'; goto p;
+p:
+ return "(" + a->Print() + " " + c + " " + b->Print() + ")";
+ break;
+
+ case NEGATE: return "(- " + a->Print() + ")";
+ case SQRT: return "(sqrt " + a->Print() + ")";
+ case SQUARE: return "(square " + a->Print() + ")";
+ case SIN: return "(sin " + a->Print() + ")";
+ case COS: return "(cos " + a->Print() + ")";
+ case ASIN: return "(asin " + a->Print() + ")";
+ case ACOS: return "(acos " + a->Print() + ")";
+
+ default: oops();
+ }
+}
+
+
+//-----------------------------------------------------------------------------
+// A parser; convert a string to an expression. Infix notation, with the
+// usual shift/reduce approach. I had great hopes for user-entered eq
+// constraints, but those don't seem very useful, so right now this is just
+// to provide calculator type functionality wherever numbers are entered.
+//-----------------------------------------------------------------------------
+
+#define MAX_UNPARSED 1024
+static Expr *Unparsed[MAX_UNPARSED];
+static int UnparsedCnt, UnparsedP;
+
+static Expr *Operands[MAX_UNPARSED];
+static int OperandsP;
+
+static Expr *Operators[MAX_UNPARSED];
+static int OperatorsP;
+
+void Expr::PushOperator(Expr *e) {
+ if(OperatorsP >= MAX_UNPARSED) throw "operator stack full!";
+ Operators[OperatorsP++] = e;
+}
+Expr *Expr::TopOperator(void) {
+ if(OperatorsP <= 0) throw "operator stack empty (get top)";
+ return Operators[OperatorsP-1];
+}
+Expr *Expr::PopOperator(void) {
+ if(OperatorsP <= 0) throw "operator stack empty (pop)";
+ return Operators[--OperatorsP];
+}
+void Expr::PushOperand(Expr *e) {
+ if(OperandsP >= MAX_UNPARSED) throw "operand stack full";
+ Operands[OperandsP++] = e;
+}
+Expr *Expr::PopOperand(void) {
+ if(OperandsP <= 0) throw "operand stack empty";
+ return Operands[--OperandsP];
+}
+Expr *Expr::Next(void) {
+ if(UnparsedP >= UnparsedCnt) return NULL;
+ return Unparsed[UnparsedP];
+}
+void Expr::Consume(void) {
+ if(UnparsedP >= UnparsedCnt) throw "no token to consume";
+ UnparsedP++;
+}
+
+int Expr::Precedence(Expr *e) {
+ if(e->op == ALL_RESOLVED) return -1; // never want to reduce this marker
+ if(e->op != BINARY_OP && e->op != UNARY_OP) oops();
+
+ switch(e->c) {
+ case 'q':
+ case 's':
+ case 'c':
+ case 'n': return 30;
+
+ case '*':
+ case '/': return 20;
+
+ case '+':
+ case '-': return 10;
+
+ default: oops();
+ }
+}
+
+void Expr::Reduce(void) {
+ Expr *a, *b;
+
+ Expr *op = PopOperator();
+ Expr *n;
+ int o;
+ switch(op->c) {
+ case '+': o = PLUS; goto c;
+ case '-': o = MINUS; goto c;
+ case '*': o = TIMES; goto c;
+ case '/': o = DIV; goto c;
+c:
+ b = PopOperand();
+ a = PopOperand();
+ n = a->AnyOp(o, b);
+ break;
+
+ case 'n': n = PopOperand()->Negate(); break;
+ case 'q': n = PopOperand()->Sqrt(); break;
+ case 's': n = (PopOperand()->Times(Expr::From(PI/180)))->Sin(); break;
+ case 'c': n = (PopOperand()->Times(Expr::From(PI/180)))->Cos(); break;
+
+ default: oops();
+ }
+ PushOperand(n);
+}
+
+void Expr::ReduceAndPush(Expr *n) {
+ while(Precedence(n) <= Precedence(TopOperator())) {
+ Reduce();
+ }
+ PushOperator(n);
+}
+
+void Expr::Parse(void) {
+ Expr *e = AllocExpr();
+ e->op = ALL_RESOLVED;
+ PushOperator(e);
+
+ for(;;) {
+ Expr *n = Next();
+ if(!n) throw "end of expression unexpected";
+
+ if(n->op == CONSTANT) {
+ PushOperand(n);
+ Consume();
+ } else if(n->op == PAREN && n->c == '(') {
+ Consume();
+ Parse();
+ n = Next();
+ if(n->op != PAREN || n->c != ')') throw "expected: )";
+ Consume();
+ } else if(n->op == UNARY_OP) {
+ PushOperator(n);
+ Consume();
+ continue;
+ } else if(n->op == BINARY_OP && n->c == '-') {
+ // The minus sign is special, because it might be binary or
+ // unary, depending on context.
+ n->op = UNARY_OP;
+ n->c = 'n';
+ PushOperator(n);
+ Consume();
+ continue;
+ } else {
+ throw "expected expression";
+ }
+
+ n = Next();
+ if(n && n->op == BINARY_OP) {
+ ReduceAndPush(n);
+ Consume();
+ } else {
+ break;
+ }
+ }
+
+ while(TopOperator()->op != ALL_RESOLVED) {
+ Reduce();
+ }
+ PopOperator(); // discard the ALL_RESOLVED marker
+}
+
+void Expr::Lex(const char *in) {
+ while(*in) {
+ if(UnparsedCnt >= MAX_UNPARSED) throw "too long";
+
+ char c = *in;
+ if(isdigit(c) || c == '.') {
+ // A number literal
+ char number[70];
+ int len = 0;
+ while((isdigit(*in) || *in == '.') && len < 30) {
+ number[len++] = *in;
+ in++;
+ }
+ number[len++] = '\0';
+ Expr *e = AllocExpr();
+ e->op = CONSTANT;
+ e->v = atof(number);
+ Unparsed[UnparsedCnt++] = e;
+ } else if(isalpha(c) || c == '_') {
+ char name[70];
+ int len = 0;
+ while(isforname(*in) && len < 30) {
+ name[len++] = *in;
+ in++;
+ }
+ name[len++] = '\0';
+
+ Expr *e = AllocExpr();
+ if(strcmp(name, "sqrt")==0) {
+ e->op = UNARY_OP;
+ e->c = 'q';
+ } else if(strcmp(name, "cos")==0) {
+ e->op = UNARY_OP;
+ e->c = 'c';
+ } else if(strcmp(name, "sin")==0) {
+ e->op = UNARY_OP;
+ e->c = 's';
+ } else if(strcmp(name, "pi")==0) {
+ e->op = CONSTANT;
+ e->v = PI;
+ } else {
+ throw "unknown name";
+ }
+ Unparsed[UnparsedCnt++] = e;
+ } else if(strchr("+-*/()", c)) {
+ Expr *e = AllocExpr();
+ e->op = (c == '(' || c == ')') ? PAREN : BINARY_OP;
+ e->c = c;
+ Unparsed[UnparsedCnt++] = e;
+ in++;
+ } else if(isspace(c)) {
+ // Ignore whitespace
+ in++;
+ } else {
+ // This is a lex error.
+ throw "unexpected characters";
+ }
+ }
+}
+
+Expr *Expr::From(const char *in, bool popUpError) {
+ UnparsedCnt = 0;
+ UnparsedP = 0;
+ OperandsP = 0;
+ OperatorsP = 0;
+
+ Expr *r;
+ try {
+ Lex(in);
+ Parse();
+ r = PopOperand();
+ } catch (const char *e) {
+ dbp("exception: parse/lex error: %s", e);
+ if(popUpError) {
+ Error("Not a valid number or expression: '%s'", in);
+ }
+ return NULL;
+ }
+ return r;
+}
+
--- /dev/null
+//-----------------------------------------------------------------------------
+// An expression in our symbolic algebra system, used to write, linearize,
+// and solve our constraint equations.
+//
+// Copyright 2008-2013 Jonathan Westhues.
+//-----------------------------------------------------------------------------
+
+#ifndef __EXPR_H
+#define __EXPR_H
+
+class Expr;
+
+class Expr {
+public:
+
+ enum {
+ // A parameter, by the hParam handle
+ PARAM = 0,
+ // A parameter, by a pointer straight in to the param table (faster,
+ // if we know that the param table won't move around)
+ PARAM_PTR = 1,
+
+ CONSTANT = 20,
+
+ PLUS = 100,
+ MINUS = 101,
+ TIMES = 102,
+ DIV = 103,
+ NEGATE = 104,
+ SQRT = 105,
+ SQUARE = 106,
+ SIN = 107,
+ COS = 108,
+ ASIN = 109,
+ ACOS = 110,
+
+ // Special helpers for when we're parsing an expression from text.
+ // Initially, literals (like a constant number) appear in the same
+ // format as they will in the finished expression, but the operators
+ // are different until the parser fixes things up (and builds the
+ // tree from the flat list that the lexer outputs).
+ ALL_RESOLVED = 1000,
+ PAREN = 1001,
+ BINARY_OP = 1002,
+ UNARY_OP = 1003
+ };
+
+ int op;
+ Expr *a;
+ union {
+ double v;
+ hParam parh;
+ Param *parp;
+ Expr *b;
+
+ // For use while parsing
+ char c;
+ };
+
+ Expr() { }
+ Expr(double val) : op(CONSTANT) { v = val; }
+
+ static inline Expr *AllocExpr(void)
+ { return (Expr *)AllocTemporary(sizeof(Expr)); }
+
+ static Expr *From(hParam p);
+ static Expr *From(double v);
+
+ Expr *AnyOp(int op, Expr *b);
+ inline Expr *Plus (Expr *b_) { return AnyOp(PLUS, b_); }
+ inline Expr *Minus(Expr *b_) { return AnyOp(MINUS, b_); }
+ inline Expr *Times(Expr *b_) { return AnyOp(TIMES, b_); }
+ inline Expr *Div (Expr *b_) { return AnyOp(DIV, b_); }
+
+ inline Expr *Negate(void) { return AnyOp(NEGATE, NULL); }
+ inline Expr *Sqrt (void) { return AnyOp(SQRT, NULL); }
+ inline Expr *Square(void) { return AnyOp(SQUARE, NULL); }
+ inline Expr *Sin (void) { return AnyOp(SIN, NULL); }
+ inline Expr *Cos (void) { return AnyOp(COS, NULL); }
+ inline Expr *ASin (void) { return AnyOp(ASIN, NULL); }
+ inline Expr *ACos (void) { return AnyOp(ACOS, NULL); }
+
+ Expr *PartialWrt(hParam p);
+ double Eval(void);
+ uint64_t ParamsUsed(void);
+ bool DependsOn(hParam p);
+ static bool Tol(double a, double b);
+ Expr *FoldConstants(void);
+ void Substitute(hParam oldh, hParam newh);
+
+ static const hParam NO_PARAMS, MULTIPLE_PARAMS;
+ hParam ReferencedParams(ParamList *pl);
+
+ void ParamsToPointers(void);
+
+ std::string Print(void);
+
+ // number of child nodes: 0 (e.g. constant), 1 (sqrt), or 2 (+)
+ int Children(void);
+ // total number of nodes in the tree
+ int Nodes(void);
+
+ // Make a simple copy
+ Expr *DeepCopy(void);
+ // Make a copy, with the parameters (usually referenced by hParam)
+ // resolved to pointers to the actual value. This speeds things up
+ // considerably.
+ Expr *DeepCopyWithParamsAsPointers(IdList<Param,hParam> *firstTry,
+ IdList<Param,hParam> *thenTry);
+
+ static Expr *From(const char *in, bool popUpError);
+ static void Lex(const char *in);
+ static Expr *Next(void);
+ static void Consume(void);
+
+ static void PushOperator(Expr *e);
+ static Expr *PopOperator(void);
+ static Expr *TopOperator(void);
+ static void PushOperand(Expr *e);
+ static Expr *PopOperand(void);
+
+ static void Reduce(void);
+ static void ReduceAndPush(Expr *e);
+ static int Precedence(Expr *e);
+
+ static int Precedence(int op);
+ static void Parse(void);
+};
+
+class ExprVector {
+public:
+ Expr *x, *y, *z;
+
+ static ExprVector From(Expr *x, Expr *y, Expr *z);
+ static ExprVector From(Vector vn);
+ static ExprVector From(hParam x, hParam y, hParam z);
+ static ExprVector From(double x, double y, double z);
+
+ ExprVector Plus(ExprVector b);
+ ExprVector Minus(ExprVector b);
+ Expr *Dot(ExprVector b);
+ ExprVector Cross(ExprVector b);
+ ExprVector ScaledBy(Expr *s);
+ ExprVector WithMagnitude(Expr *s);
+ Expr *Magnitude(void);
+
+ Vector Eval(void);
+};
+
+class ExprQuaternion {
+public:
+ Expr *w, *vx, *vy, *vz;
+
+ static ExprQuaternion From(Expr *w, Expr *vx, Expr *vy, Expr *vz);
+ static ExprQuaternion From(Quaternion qn);
+ static ExprQuaternion From(hParam w, hParam vx, hParam vy, hParam vz);
+
+ ExprVector RotationU(void);
+ ExprVector RotationV(void);
+ ExprVector RotationN(void);
+
+ ExprVector Rotate(ExprVector p);
+ ExprQuaternion Times(ExprQuaternion b);
+
+ Expr *Magnitude(void);
+};
+
+#endif
+
--- /dev/null
+//-----------------------------------------------------------------------------
+// Routines to write and read our .slvs file format.
+//
+// Copyright 2008-2013 Jonathan Westhues.
+//-----------------------------------------------------------------------------
+#include "solvespace.h"
+
+#define VERSION_STRING "\261\262\263" "SolveSpaceREVa"
+
+static int StrStartsWith(const char *str, const char *start) {
+ return memcmp(str, start, strlen(start)) == 0;
+}
+
+//-----------------------------------------------------------------------------
+// Clear and free all the dynamic memory associated with our currently-loaded
+// sketch. This does not leave the program in an acceptable state (with the
+// references created, and so on), so anyone calling this must fix that later.
+//-----------------------------------------------------------------------------
+void SolveSpaceUI::ClearExisting(void) {
+ UndoClearStack(&redo);
+ UndoClearStack(&undo);
+
+ for(int i = 0; i < SK.groupOrder.n; i++) {
+ Group *g = SK.GetGroup(SK.groupOrder.elem[i]);
+ g->Clear();
+ }
+
+ SK.constraint.Clear();
+ SK.request.Clear();
+ SK.group.Clear();
+ SK.groupOrder.Clear();
+ SK.style.Clear();
+
+ SK.entity.Clear();
+ SK.param.Clear();
+}
+
+hGroup SolveSpaceUI::CreateDefaultDrawingGroup(void) {
+ Group g = {};
+
+ // And an empty group, for the first stuff the user draws.
+ g.visible = true;
+ g.name = "sketch-in-plane";
+ g.type = Group::DRAWING_WORKPLANE;
+ g.subtype = Group::WORKPLANE_BY_POINT_ORTHO;
+ g.order = 1;
+ g.predef.q = Quaternion::From(1, 0, 0, 0);
+ hRequest hr = Request::HREQUEST_REFERENCE_XY;
+ g.predef.origin = hr.entity(1);
+ SK.group.AddAndAssignId(&g);
+ SK.GetGroup(g.h)->activeWorkplane = g.h.entity(0);
+ return g.h;
+}
+
+void SolveSpaceUI::NewFile(void) {
+ ClearExisting();
+
+ // Our initial group, that contains the references.
+ Group g = {};
+ g.visible = true;
+ g.name = "#references";
+ g.type = Group::DRAWING_3D;
+ g.order = 0;
+ g.h = Group::HGROUP_REFERENCES;
+ SK.group.Add(&g);
+
+ // Let's create three two-d coordinate systems, for the coordinate
+ // planes; these are our references, present in every sketch.
+ Request r = {};
+ r.type = Request::WORKPLANE;
+ r.group = Group::HGROUP_REFERENCES;
+ r.workplane = Entity::FREE_IN_3D;
+
+ r.h = Request::HREQUEST_REFERENCE_XY;
+ SK.request.Add(&r);
+
+ r.h = Request::HREQUEST_REFERENCE_YZ;
+ SK.request.Add(&r);
+
+ r.h = Request::HREQUEST_REFERENCE_ZX;
+ SK.request.Add(&r);
+
+ CreateDefaultDrawingGroup();
+}
+
+const SolveSpaceUI::SaveTable SolveSpaceUI::SAVED[] = {
+ { 'g', "Group.h.v", 'x', &(SS.sv.g.h.v) },
+ { 'g', "Group.type", 'd', &(SS.sv.g.type) },
+ { 'g', "Group.order", 'd', &(SS.sv.g.order) },
+ { 'g', "Group.name", 'S', &(SS.sv.g.name) },
+ { 'g', "Group.activeWorkplane.v", 'x', &(SS.sv.g.activeWorkplane.v) },
+ { 'g', "Group.opA.v", 'x', &(SS.sv.g.opA.v) },
+ { 'g', "Group.opB.v", 'x', &(SS.sv.g.opB.v) },
+ { 'g', "Group.valA", 'f', &(SS.sv.g.valA) },
+ { 'g', "Group.valB", 'f', &(SS.sv.g.valB) },
+ { 'g', "Group.valC", 'f', &(SS.sv.g.valB) },
+ { 'g', "Group.color", 'c', &(SS.sv.g.color) },
+ { 'g', "Group.subtype", 'd', &(SS.sv.g.subtype) },
+ { 'g', "Group.skipFirst", 'b', &(SS.sv.g.skipFirst) },
+ { 'g', "Group.meshCombine", 'd', &(SS.sv.g.meshCombine) },
+ { 'g', "Group.forceToMesh", 'd', &(SS.sv.g.forceToMesh) },
+ { 'g', "Group.predef.q.w", 'f', &(SS.sv.g.predef.q.w) },
+ { 'g', "Group.predef.q.vx", 'f', &(SS.sv.g.predef.q.vx) },
+ { 'g', "Group.predef.q.vy", 'f', &(SS.sv.g.predef.q.vy) },
+ { 'g', "Group.predef.q.vz", 'f', &(SS.sv.g.predef.q.vz) },
+ { 'g', "Group.predef.origin.v", 'x', &(SS.sv.g.predef.origin.v) },
+ { 'g', "Group.predef.entityB.v", 'x', &(SS.sv.g.predef.entityB.v) },
+ { 'g', "Group.predef.entityC.v", 'x', &(SS.sv.g.predef.entityC.v) },
+ { 'g', "Group.predef.swapUV", 'b', &(SS.sv.g.predef.swapUV) },
+ { 'g', "Group.predef.negateU", 'b', &(SS.sv.g.predef.negateU) },
+ { 'g', "Group.predef.negateV", 'b', &(SS.sv.g.predef.negateV) },
+ { 'g', "Group.visible", 'b', &(SS.sv.g.visible) },
+ { 'g', "Group.suppress", 'b', &(SS.sv.g.suppress) },
+ { 'g', "Group.relaxConstraints", 'b', &(SS.sv.g.relaxConstraints) },
+ { 'g', "Group.allowRedundant", 'b', &(SS.sv.g.allowRedundant) },
+ { 'g', "Group.allDimsReference", 'b', &(SS.sv.g.allDimsReference) },
+ { 'g', "Group.scale", 'f', &(SS.sv.g.scale) },
+ { 'g', "Group.remap", 'M', &(SS.sv.g.remap) },
+ { 'g', "Group.impFile", 'S', &(SS.sv.g.linkFile) },
+ { 'g', "Group.impFileRel", 'S', &(SS.sv.g.linkFileRel) },
+
+ { 'p', "Param.h.v.", 'x', &(SS.sv.p.h.v) },
+ { 'p', "Param.val", 'f', &(SS.sv.p.val) },
+
+ { 'r', "Request.h.v", 'x', &(SS.sv.r.h.v) },
+ { 'r', "Request.type", 'd', &(SS.sv.r.type) },
+ { 'r', "Request.extraPoints", 'd', &(SS.sv.r.extraPoints) },
+ { 'r', "Request.workplane.v", 'x', &(SS.sv.r.workplane.v) },
+ { 'r', "Request.group.v", 'x', &(SS.sv.r.group.v) },
+ { 'r', "Request.construction", 'b', &(SS.sv.r.construction) },
+ { 'r', "Request.style", 'x', &(SS.sv.r.style) },
+ { 'r', "Request.str", 'S', &(SS.sv.r.str) },
+ { 'r', "Request.font", 'S', &(SS.sv.r.font) },
+
+ { 'e', "Entity.h.v", 'x', &(SS.sv.e.h.v) },
+ { 'e', "Entity.type", 'd', &(SS.sv.e.type) },
+ { 'e', "Entity.construction", 'b', &(SS.sv.e.construction) },
+ { 'e', "Entity.style", 'x', &(SS.sv.e.style) },
+ { 'e', "Entity.str", 'S', &(SS.sv.e.str) },
+ { 'e', "Entity.font", 'S', &(SS.sv.e.font) },
+ { 'e', "Entity.point[0].v", 'x', &(SS.sv.e.point[0].v) },
+ { 'e', "Entity.point[1].v", 'x', &(SS.sv.e.point[1].v) },
+ { 'e', "Entity.point[2].v", 'x', &(SS.sv.e.point[2].v) },
+ { 'e', "Entity.point[3].v", 'x', &(SS.sv.e.point[3].v) },
+ { 'e', "Entity.point[4].v", 'x', &(SS.sv.e.point[4].v) },
+ { 'e', "Entity.point[5].v", 'x', &(SS.sv.e.point[5].v) },
+ { 'e', "Entity.point[6].v", 'x', &(SS.sv.e.point[6].v) },
+ { 'e', "Entity.point[7].v", 'x', &(SS.sv.e.point[7].v) },
+ { 'e', "Entity.point[8].v", 'x', &(SS.sv.e.point[8].v) },
+ { 'e', "Entity.point[9].v", 'x', &(SS.sv.e.point[9].v) },
+ { 'e', "Entity.point[10].v", 'x', &(SS.sv.e.point[10].v) },
+ { 'e', "Entity.point[11].v", 'x', &(SS.sv.e.point[11].v) },
+ { 'e', "Entity.extraPoints", 'd', &(SS.sv.e.extraPoints) },
+ { 'e', "Entity.normal.v", 'x', &(SS.sv.e.normal.v) },
+ { 'e', "Entity.distance.v", 'x', &(SS.sv.e.distance.v) },
+ { 'e', "Entity.workplane.v", 'x', &(SS.sv.e.workplane.v) },
+ { 'e', "Entity.actPoint.x", 'f', &(SS.sv.e.actPoint.x) },
+ { 'e', "Entity.actPoint.y", 'f', &(SS.sv.e.actPoint.y) },
+ { 'e', "Entity.actPoint.z", 'f', &(SS.sv.e.actPoint.z) },
+ { 'e', "Entity.actNormal.w", 'f', &(SS.sv.e.actNormal.w) },
+ { 'e', "Entity.actNormal.vx", 'f', &(SS.sv.e.actNormal.vx) },
+ { 'e', "Entity.actNormal.vy", 'f', &(SS.sv.e.actNormal.vy) },
+ { 'e', "Entity.actNormal.vz", 'f', &(SS.sv.e.actNormal.vz) },
+ { 'e', "Entity.actDistance", 'f', &(SS.sv.e.actDistance) },
+ { 'e', "Entity.actVisible", 'b', &(SS.sv.e.actVisible), },
+
+
+ { 'c', "Constraint.h.v", 'x', &(SS.sv.c.h.v) },
+ { 'c', "Constraint.type", 'd', &(SS.sv.c.type) },
+ { 'c', "Constraint.group.v", 'x', &(SS.sv.c.group.v) },
+ { 'c', "Constraint.workplane.v", 'x', &(SS.sv.c.workplane.v) },
+ { 'c', "Constraint.valA", 'f', &(SS.sv.c.valA) },
+ { 'c', "Constraint.ptA.v", 'x', &(SS.sv.c.ptA.v) },
+ { 'c', "Constraint.ptB.v", 'x', &(SS.sv.c.ptB.v) },
+ { 'c', "Constraint.entityA.v", 'x', &(SS.sv.c.entityA.v) },
+ { 'c', "Constraint.entityB.v", 'x', &(SS.sv.c.entityB.v) },
+ { 'c', "Constraint.entityC.v", 'x', &(SS.sv.c.entityC.v) },
+ { 'c', "Constraint.entityD.v", 'x', &(SS.sv.c.entityD.v) },
+ { 'c', "Constraint.other", 'b', &(SS.sv.c.other) },
+ { 'c', "Constraint.other2", 'b', &(SS.sv.c.other2) },
+ { 'c', "Constraint.reference", 'b', &(SS.sv.c.reference) },
+ { 'c', "Constraint.comment", 'S', &(SS.sv.c.comment) },
+ { 'c', "Constraint.disp.offset.x", 'f', &(SS.sv.c.disp.offset.x) },
+ { 'c', "Constraint.disp.offset.y", 'f', &(SS.sv.c.disp.offset.y) },
+ { 'c', "Constraint.disp.offset.z", 'f', &(SS.sv.c.disp.offset.z) },
+ { 'c', "Constraint.disp.style", 'x', &(SS.sv.c.disp.style) },
+
+ { 's', "Style.h.v", 'x', &(SS.sv.s.h.v) },
+ { 's', "Style.name", 'S', &(SS.sv.s.name) },
+ { 's', "Style.width", 'f', &(SS.sv.s.width) },
+ { 's', "Style.widthAs", 'd', &(SS.sv.s.widthAs) },
+ { 's', "Style.textHeight", 'f', &(SS.sv.s.textHeight) },
+ { 's', "Style.textHeightAs", 'd', &(SS.sv.s.textHeightAs) },
+ { 's', "Style.textAngle", 'f', &(SS.sv.s.textAngle) },
+ { 's', "Style.textOrigin", 'x', &(SS.sv.s.textOrigin) },
+ { 's', "Style.color", 'c', &(SS.sv.s.color) },
+ { 's', "Style.fillColor", 'c', &(SS.sv.s.fillColor) },
+ { 's', "Style.filled", 'b', &(SS.sv.s.filled) },
+ { 's', "Style.visible", 'b', &(SS.sv.s.visible) },
+ { 's', "Style.exportable", 'b', &(SS.sv.s.exportable) },
+ { 's', "Style.stippleType", 'd', &(SS.sv.s.stippleType) },
+ { 's', "Style.stippleScale", 'f', &(SS.sv.s.stippleScale) },
+
+ { 0, NULL, 0, NULL }
+};
+
+struct SAVEDptr {
+ IdList<EntityMap,EntityId> &M() { return *((IdList<EntityMap,EntityId> *)this); }
+ std::string &S() { return *((std::string *)this); }
+ bool &b() { return *((bool *)this); }
+ RgbaColor &c() { return *((RgbaColor *)this); }
+ int &d() { return *((int *)this); }
+ double &f() { return *((double *)this); }
+ uint32_t &x() { return *((uint32_t *)this); }
+};
+
+void SolveSpaceUI::SaveUsingTable(int type) {
+ int i;
+ for(i = 0; SAVED[i].type != 0; i++) {
+ if(SAVED[i].type != type) continue;
+
+ int fmt = SAVED[i].fmt;
+ SAVEDptr *p = (SAVEDptr *)SAVED[i].ptr;
+ // Any items that aren't specified are assumed to be zero
+ if(fmt == 'S' && p->S().empty()) continue;
+ if(fmt == 'd' && p->d() == 0) continue;
+ if(fmt == 'f' && EXACT(p->f() == 0.0)) continue;
+ if(fmt == 'x' && p->x() == 0) continue;
+
+ fprintf(fh, "%s=", SAVED[i].desc);
+ switch(fmt) {
+ case 'S': fprintf(fh, "%s", p->S().c_str()); break;
+ case 'b': fprintf(fh, "%d", p->b() ? 1 : 0); break;
+ case 'c': fprintf(fh, "%08x", p->c().ToPackedInt()); break;
+ case 'd': fprintf(fh, "%d", p->d()); break;
+ case 'f': fprintf(fh, "%.20f", p->f()); break;
+ case 'x': fprintf(fh, "%08x", p->x()); break;
+
+ case 'M': {
+ int j;
+ fprintf(fh, "{\n");
+ for(j = 0; j < p->M().n; j++) {
+ EntityMap *em = &(p->M().elem[j]);
+ fprintf(fh, " %d %08x %d\n",
+ em->h.v, em->input.v, em->copyNumber);
+ }
+ fprintf(fh, "}");
+ break;
+ }
+
+ default: oops();
+ }
+ fprintf(fh, "\n");
+ }
+}
+
+bool SolveSpaceUI::SaveToFile(const std::string &filename) {
+ // Make sure all the entities are regenerated up to date, since they
+ // will be exported. We reload the linked files because that rewrites
+ // the linkFileRel for our possibly-new filename.
+ SS.ScheduleShowTW();
+ SS.ReloadAllImported();
+ SS.GenerateAll(SolveSpaceUI::GENERATE_ALL);
+
+ fh = ssfopen(filename, "wb");
+ if(!fh) {
+ Error("Couldn't write to file '%s'", filename.c_str());
+ return false;
+ }
+
+ fprintf(fh, "%s\n\n\n", VERSION_STRING);
+
+ int i, j;
+ for(i = 0; i < SK.group.n; i++) {
+ sv.g = SK.group.elem[i];
+ SaveUsingTable('g');
+ fprintf(fh, "AddGroup\n\n");
+ }
+
+ for(i = 0; i < SK.param.n; i++) {
+ sv.p = SK.param.elem[i];
+ SaveUsingTable('p');
+ fprintf(fh, "AddParam\n\n");
+ }
+
+ for(i = 0; i < SK.request.n; i++) {
+ sv.r = SK.request.elem[i];
+ SaveUsingTable('r');
+ fprintf(fh, "AddRequest\n\n");
+ }
+
+ for(i = 0; i < SK.entity.n; i++) {
+ (SK.entity.elem[i]).CalculateNumerical(true);
+ sv.e = SK.entity.elem[i];
+ SaveUsingTable('e');
+ fprintf(fh, "AddEntity\n\n");
+ }
+
+ for(i = 0; i < SK.constraint.n; i++) {
+ sv.c = SK.constraint.elem[i];
+ SaveUsingTable('c');
+ fprintf(fh, "AddConstraint\n\n");
+ }
+
+ for(i = 0; i < SK.style.n; i++) {
+ sv.s = SK.style.elem[i];
+ if(sv.s.h.v >= Style::FIRST_CUSTOM) {
+ SaveUsingTable('s');
+ fprintf(fh, "AddStyle\n\n");
+ }
+ }
+
+ // A group will have either a mesh or a shell, but not both; but the code
+ // to print either of those just does nothing if the mesh/shell is empty.
+
+ Group *g = SK.GetGroup(SK.groupOrder.elem[SK.groupOrder.n - 1]);
+ SMesh *m = &g->runningMesh;
+ for(i = 0; i < m->l.n; i++) {
+ STriangle *tr = &(m->l.elem[i]);
+ fprintf(fh, "Triangle %08x %08x "
+ "%.20f %.20f %.20f %.20f %.20f %.20f %.20f %.20f %.20f\n",
+ tr->meta.face, tr->meta.color.ToPackedInt(),
+ CO(tr->a), CO(tr->b), CO(tr->c));
+ }
+
+ SShell *s = &g->runningShell;
+ SSurface *srf;
+ for(srf = s->surface.First(); srf; srf = s->surface.NextAfter(srf)) {
+ fprintf(fh, "Surface %08x %08x %08x %d %d\n",
+ srf->h.v, srf->color.ToPackedInt(), srf->face, srf->degm, srf->degn);
+ for(i = 0; i <= srf->degm; i++) {
+ for(j = 0; j <= srf->degn; j++) {
+ fprintf(fh, "SCtrl %d %d %.20f %.20f %.20f Weight %20.20f\n",
+ i, j, CO(srf->ctrl[i][j]), srf->weight[i][j]);
+ }
+ }
+
+ STrimBy *stb;
+ for(stb = srf->trim.First(); stb; stb = srf->trim.NextAfter(stb)) {
+ fprintf(fh, "TrimBy %08x %d %.20f %.20f %.20f %.20f %.20f %.20f\n",
+ stb->curve.v, stb->backwards ? 1 : 0,
+ CO(stb->start), CO(stb->finish));
+ }
+
+ fprintf(fh, "AddSurface\n");
+ }
+ SCurve *sc;
+ for(sc = s->curve.First(); sc; sc = s->curve.NextAfter(sc)) {
+ fprintf(fh, "Curve %08x %d %d %08x %08x\n",
+ sc->h.v,
+ sc->isExact ? 1 : 0, sc->exact.deg,
+ sc->surfA.v, sc->surfB.v);
+
+ if(sc->isExact) {
+ for(i = 0; i <= sc->exact.deg; i++) {
+ fprintf(fh, "CCtrl %d %.20f %.20f %.20f Weight %.20f\n",
+ i, CO(sc->exact.ctrl[i]), sc->exact.weight[i]);
+ }
+ }
+ SCurvePt *scpt;
+ for(scpt = sc->pts.First(); scpt; scpt = sc->pts.NextAfter(scpt)) {
+ fprintf(fh, "CurvePt %d %.20f %.20f %.20f\n",
+ scpt->vertex ? 1 : 0, CO(scpt->p));
+ }
+
+ fprintf(fh, "AddCurve\n");
+ }
+
+ fclose(fh);
+
+ return true;
+}
+
+void SolveSpaceUI::LoadUsingTable(char *key, char *val) {
+ int i;
+ for(i = 0; SAVED[i].type != 0; i++) {
+ if(strcmp(SAVED[i].desc, key)==0) {
+ SAVEDptr *p = (SAVEDptr *)SAVED[i].ptr;
+ unsigned int u = 0;
+ switch(SAVED[i].fmt) {
+ case 'S': p->S() = val; break;
+ case 'b': p->b() = (atoi(val) != 0); break;
+ case 'd': p->d() = atoi(val); break;
+ case 'f': p->f() = atof(val); break;
+ case 'x': sscanf(val, "%x", &u); p->x()= u; break;
+
+ case 'c':
+ sscanf(val, "%x", &u);
+ p->c() = RgbaColor::FromPackedInt(u);
+ break;
+
+ case 'P':
+ p->S() = val;
+ break;
+
+ case 'M': {
+ // Don't clear this list! When the group gets added, it
+ // makes a shallow copy, so that would result in us
+ // freeing memory that we want to keep around. Just
+ // zero it out so that new memory is allocated.
+ p->M() = {};
+ for(;;) {
+ EntityMap em;
+ char line2[1024];
+ if (fgets(line2, (int)sizeof(line2), fh) == NULL)
+ break;
+ if(sscanf(line2, "%d %x %d", &(em.h.v), &(em.input.v),
+ &(em.copyNumber)) == 3)
+ {
+ p->M().Add(&em);
+ } else {
+ break;
+ }
+ }
+ break;
+ }
+
+ default: oops();
+ }
+ break;
+ }
+ }
+ if(SAVED[i].type == 0) {
+ fileLoadError = true;
+ }
+}
+
+bool SolveSpaceUI::LoadFromFile(const std::string &filename) {
+ allConsistent = false;
+ fileLoadError = false;
+
+ fh = ssfopen(filename, "rb");
+ if(!fh) {
+ Error("Couldn't read from file '%s'", filename.c_str());
+ return false;
+ }
+
+ ClearExisting();
+
+ sv = {};
+ sv.g.scale = 1; // default is 1, not 0; so legacy files need this
+ Style::FillDefaultStyle(&sv.s);
+
+ char line[1024];
+ while(fgets(line, (int)sizeof(line), fh)) {
+ char *s = strchr(line, '\n');
+ if(s) *s = '\0';
+ // We should never get files with \r characters in them, but mailers
+ // will sometimes mangle attachments.
+ s = strchr(line, '\r');
+ if(s) *s = '\0';
+
+ if(*line == '\0') continue;
+
+ char *e = strchr(line, '=');
+ if(e) {
+ *e = '\0';
+ char *key = line, *val = e+1;
+ LoadUsingTable(key, val);
+ } else if(strcmp(line, "AddGroup")==0) {
+ // legacy files have a spurious dependency between linked groups
+ // and their parent groups, remove
+ if(sv.g.type == Group::LINKED)
+ sv.g.opA.v = 0;
+
+ SK.group.Add(&(sv.g));
+ sv.g = {};
+ sv.g.scale = 1; // default is 1, not 0; so legacy files need this
+ } else if(strcmp(line, "AddParam")==0) {
+ // params are regenerated, but we want to preload the values
+ // for initial guesses
+ SK.param.Add(&(sv.p));
+ sv.p = {};
+ } else if(strcmp(line, "AddEntity")==0) {
+ // entities are regenerated
+ } else if(strcmp(line, "AddRequest")==0) {
+ SK.request.Add(&(sv.r));
+ sv.r = {};
+ } else if(strcmp(line, "AddConstraint")==0) {
+ SK.constraint.Add(&(sv.c));
+ sv.c = {};
+ } else if(strcmp(line, "AddStyle")==0) {
+ SK.style.Add(&(sv.s));
+ sv.s = {};
+ Style::FillDefaultStyle(&sv.s);
+ } else if(strcmp(line, VERSION_STRING)==0) {
+ // do nothing, version string
+ } else if(StrStartsWith(line, "Triangle ") ||
+ StrStartsWith(line, "Surface ") ||
+ StrStartsWith(line, "SCtrl ") ||
+ StrStartsWith(line, "TrimBy ") ||
+ StrStartsWith(line, "Curve ") ||
+ StrStartsWith(line, "CCtrl ") ||
+ StrStartsWith(line, "CurvePt ") ||
+ strcmp(line, "AddSurface")==0 ||
+ strcmp(line, "AddCurve")==0)
+ {
+ // ignore the mesh or shell, since we regenerate that
+ } else {
+ fileLoadError = true;
+ }
+ }
+
+ fclose(fh);
+
+ if(fileLoadError) {
+ Error("Unrecognized data in file. This file may be corrupt, or "
+ "from a new version of the program.");
+ // At least leave the program in a non-crashing state.
+ if(SK.group.n == 0) {
+ NewFile();
+ }
+ }
+
+ return true;
+}
+
+bool SolveSpaceUI::LoadEntitiesFromFile(const std::string &filename, EntityList *le,
+ SMesh *m, SShell *sh)
+{
+ SSurface srf = {};
+ SCurve crv = {};
+
+ fh = ssfopen(filename, "rb");
+ if(!fh) return false;
+
+ le->Clear();
+ sv = {};
+
+ char line[1024];
+ while(fgets(line, (int)sizeof(line), fh)) {
+ char *s = strchr(line, '\n');
+ if(s) *s = '\0';
+ // We should never get files with \r characters in them, but mailers
+ // will sometimes mangle attachments.
+ s = strchr(line, '\r');
+ if(s) *s = '\0';
+
+ if(*line == '\0') continue;
+
+ char *e = strchr(line, '=');
+ if(e) {
+ *e = '\0';
+ char *key = line, *val = e+1;
+ LoadUsingTable(key, val);
+ } else if(strcmp(line, "AddGroup")==0) {
+ // Don't leak memory; these get allocated whether we want them
+ // or not.
+ sv.g.remap.Clear();
+ } else if(strcmp(line, "AddParam")==0) {
+
+ } else if(strcmp(line, "AddEntity")==0) {
+ le->Add(&(sv.e));
+ sv.e = {};
+ } else if(strcmp(line, "AddRequest")==0) {
+
+ } else if(strcmp(line, "AddConstraint")==0) {
+
+ } else if(strcmp(line, "AddStyle")==0) {
+
+ } else if(strcmp(line, VERSION_STRING)==0) {
+
+ } else if(StrStartsWith(line, "Triangle ")) {
+ STriangle tr = {};
+ unsigned int rgba = 0;
+ if(sscanf(line, "Triangle %x %x "
+ "%lf %lf %lf %lf %lf %lf %lf %lf %lf",
+ &(tr.meta.face), &rgba,
+ &(tr.a.x), &(tr.a.y), &(tr.a.z),
+ &(tr.b.x), &(tr.b.y), &(tr.b.z),
+ &(tr.c.x), &(tr.c.y), &(tr.c.z)) != 11) {
+ oops();
+ }
+ tr.meta.color = RgbaColor::FromPackedInt((uint32_t)rgba);
+ m->AddTriangle(&tr);
+ } else if(StrStartsWith(line, "Surface ")) {
+ unsigned int rgba = 0;
+ if(sscanf(line, "Surface %x %x %x %d %d",
+ &(srf.h.v), &rgba, &(srf.face),
+ &(srf.degm), &(srf.degn)) != 5) {
+ oops();
+ }
+ srf.color = RgbaColor::FromPackedInt((uint32_t)rgba);
+ } else if(StrStartsWith(line, "SCtrl ")) {
+ int i, j;
+ Vector c;
+ double w;
+ if(sscanf(line, "SCtrl %d %d %lf %lf %lf Weight %lf",
+ &i, &j, &(c.x), &(c.y), &(c.z), &w) != 6)
+ {
+ oops();
+ }
+ srf.ctrl[i][j] = c;
+ srf.weight[i][j] = w;
+ } else if(StrStartsWith(line, "TrimBy ")) {
+ STrimBy stb = {};
+ int backwards;
+ if(sscanf(line, "TrimBy %x %d %lf %lf %lf %lf %lf %lf",
+ &(stb.curve.v), &backwards,
+ &(stb.start.x), &(stb.start.y), &(stb.start.z),
+ &(stb.finish.x), &(stb.finish.y), &(stb.finish.z)) != 8)
+ {
+ oops();
+ }
+ stb.backwards = (backwards != 0);
+ srf.trim.Add(&stb);
+ } else if(strcmp(line, "AddSurface")==0) {
+ sh->surface.Add(&srf);
+ srf = {};
+ } else if(StrStartsWith(line, "Curve ")) {
+ int isExact;
+ if(sscanf(line, "Curve %x %d %d %x %x",
+ &(crv.h.v),
+ &(isExact),
+ &(crv.exact.deg),
+ &(crv.surfA.v), &(crv.surfB.v)) != 5)
+ {
+ oops();
+ }
+ crv.isExact = (isExact != 0);
+ } else if(StrStartsWith(line, "CCtrl ")) {
+ int i;
+ Vector c;
+ double w;
+ if(sscanf(line, "CCtrl %d %lf %lf %lf Weight %lf",
+ &i, &(c.x), &(c.y), &(c.z), &w) != 5)
+ {
+ oops();
+ }
+ crv.exact.ctrl[i] = c;
+ crv.exact.weight[i] = w;
+ } else if(StrStartsWith(line, "CurvePt ")) {
+ SCurvePt scpt;
+ int vertex;
+ if(sscanf(line, "CurvePt %d %lf %lf %lf",
+ &vertex,
+ &(scpt.p.x), &(scpt.p.y), &(scpt.p.z)) != 4)
+ {
+ oops();
+ }
+ scpt.vertex = (vertex != 0);
+ crv.pts.Add(&scpt);
+ } else if(strcmp(line, "AddCurve")==0) {
+ sh->curve.Add(&crv);
+ crv = {};
+ } else {
+ oops();
+ }
+ }
+
+ fclose(fh);
+ return true;
+}
+
+//-----------------------------------------------------------------------------
+// Handling of the relative-absolute path transformations for links
+//-----------------------------------------------------------------------------
+static std::vector<std::string> Split(const std::string &haystack, const std::string &needle)
+{
+ std::vector<std::string> result;
+
+ size_t oldpos = 0, pos = 0;
+ while(true) {
+ oldpos = pos;
+ pos = haystack.find(needle, pos);
+ if(pos == std::string::npos) break;
+ result.push_back(haystack.substr(oldpos, pos - oldpos));
+ pos += needle.length();
+ }
+
+ if(oldpos != haystack.length() - 1)
+ result.push_back(haystack.substr(oldpos));
+
+ return result;
+}
+
+static std::string Join(const std::vector<std::string> &parts, const std::string &separator)
+{
+ bool first = true;
+ std::string result;
+ for(auto &part : parts) {
+ if(!first) result += separator;
+ result += part;
+ first = false;
+ }
+ return result;
+}
+
+static bool PlatformPathEqual(const std::string &a, const std::string &b)
+{
+ // Case-sensitivity is actually per-volume on both Windows and OS X,
+ // but it is extremely tedious to implement and test for little benefit.
+#if defined(WIN32)
+ std::wstring wa = Widen(a), wb = Widen(b);
+ return std::equal(wa.begin(), wa.end(), wb.begin(), /*wb.end(),*/
+ [](wchar_t wca, wchar_t wcb) { return towlower(wca) == towlower(wcb); });
+#elif defined(__APPLE__)
+ return !strcasecmp(a.c_str(), b.c_str());
+#else
+ return a == b;
+#endif
+}
+
+static std::string MakePathRelative(const std::string &base, const std::string &path)
+{
+ std::vector<std::string> baseParts = Split(base, PATH_SEP),
+ pathParts = Split(path, PATH_SEP),
+ resultParts;
+ baseParts.pop_back();
+
+ size_t common;
+ for(common = 0; common < baseParts.size() && common < pathParts.size(); common++) {
+ if(!PlatformPathEqual(baseParts[common], pathParts[common]))
+ break;
+ }
+
+ for(size_t i = common; i < baseParts.size(); i++)
+ resultParts.push_back("..");
+
+ resultParts.insert(resultParts.end(),
+ pathParts.begin() + common, pathParts.end());
+
+ return Join(resultParts, PATH_SEP);
+}
+
+static std::string MakePathAbsolute(const std::string &base, const std::string &path)
+{
+ std::vector<std::string> resultParts = Split(base, PATH_SEP),
+ pathParts = Split(path, PATH_SEP);
+ resultParts.pop_back();
+
+ for(auto &part : pathParts) {
+ if(part == ".") {
+ /* do nothing */
+ } else if(part == "..") {
+ if(resultParts.empty()) oops();
+ resultParts.pop_back();
+ } else {
+ resultParts.push_back(part);
+ }
+ }
+
+ return Join(resultParts, PATH_SEP);
+}
+
+static void PathSepNormalize(std::string &filename)
+{
+ for(size_t i = 0; i < filename.length(); i++) {
+ if(filename[i] == '\\')
+ filename[i] = '/';
+ }
+}
+
+static std::string PathSepPlatformToUNIX(const std::string &filename)
+{
+#if defined(WIN32)
+ std::string result = filename;
+ for(size_t i = 0; i < result.length(); i++) {
+ if(result[i] == '\\')
+ result[i] = '/';
+ }
+ return result;
+#else
+ return filename;
+#endif
+}
+
+static std::string PathSepUNIXToPlatform(const std::string &filename)
+{
+#if defined(WIN32)
+ std::string result = filename;
+ for(size_t i = 0; i < result.length(); i++) {
+ if(result[i] == '/')
+ result[i] = '\\';
+ }
+ return result;
+#else
+ return filename;
+#endif
+}
+
+bool SolveSpaceUI::ReloadAllImported(bool canCancel)
+{
+ std::map<std::string, std::string> linkMap;
+ allConsistent = false;
+
+ int i;
+ for(i = 0; i < SK.group.n; i++) {
+ Group *g = &(SK.group.elem[i]);
+ if(g->type != Group::LINKED) continue;
+
+ if(isalpha(g->linkFile[0]) && g->linkFile[1] == ':') {
+ // Make sure that g->linkFileRel always contains a relative path
+ // in an UNIX format, even after we load an old file which had
+ // the path in Windows format
+ PathSepNormalize(g->linkFileRel);
+ }
+
+ g->impEntity.Clear();
+ g->impMesh.Clear();
+ g->impShell.Clear();
+
+ if(linkMap.count(g->linkFile)) {
+ std::string newPath = linkMap[g->linkFile];
+ if(!newPath.empty())
+ g->linkFile = newPath;
+ }
+
+ // In a newly created group we only have an absolute path.
+ if(!g->linkFileRel.empty()) {
+ std::string rel = PathSepUNIXToPlatform(g->linkFileRel);
+ std::string fromRel = MakePathAbsolute(SS.saveFile, rel);
+ FILE *test = ssfopen(fromRel, "rb");
+ if(test) {
+ fclose(test);
+ // Okay, exists; update the absolute path.
+ g->linkFile = fromRel;
+ } else {
+ // It doesn't exist. Perhaps the file was moved but the tree wasn't, and we
+ // can use the absolute filename to get us back. The relative path will be
+ // updated below.
+ }
+ }
+
+try_load_file:
+ if(LoadEntitiesFromFile(g->linkFile, &(g->impEntity), &(g->impMesh), &(g->impShell)))
+ {
+ if(!SS.saveFile.empty()) {
+ // Record the linked file's name relative to our filename;
+ // if the entire tree moves, then everything will still work
+ std::string rel = MakePathRelative(SS.saveFile, g->linkFile);
+ g->linkFileRel = PathSepPlatformToUNIX(rel);
+ } else {
+ // We're not yet saved, so can't make it absolute.
+ // This will only be used for display purposes, as SS.saveFile
+ // is always nonempty when we are actually writing anything.
+ g->linkFileRel = g->linkFile;
+ }
+ } else if(!linkMap.count(g->linkFile)) {
+ switch(LocateImportedFileYesNoCancel(g->linkFileRel, canCancel)) {
+ case DIALOG_YES: {
+ std::string oldImpFile = g->linkFile;
+ if(!GetOpenFile(&g->linkFile, "", SlvsFileFilter)) {
+ if(canCancel)
+ return false;
+ break;
+ } else {
+ linkMap[oldImpFile] = g->linkFile;
+ goto try_load_file;
+ }
+ }
+
+ case DIALOG_NO:
+ linkMap[g->linkFile] = "";
+ /* Geometry will be pruned by GenerateAll(). */
+ break;
+
+ case DIALOG_CANCEL:
+ return false;
+ }
+ } else {
+ // User was already asked to and refused to locate a missing
+ // linked file.
+ }
+ }
+
+ return true;
+}
+
--- /dev/null
+//-----------------------------------------------------------------------------
+// Generate our model based on its parametric description, by solving each
+// sketch, generating surfaces from the resulting entities, performing any
+// requested surface operations (e.g. Booleans) with our model so far, and
+// then repeating this process for each subsequent group.
+//
+// Copyright 2008-2013 Jonathan Westhues.
+//-----------------------------------------------------------------------------
+#include "solvespace.h"
+
+void SolveSpaceUI::MarkGroupDirtyByEntity(hEntity he) {
+ Entity *e = SK.GetEntity(he);
+ MarkGroupDirty(e->group);
+}
+
+void SolveSpaceUI::MarkGroupDirty(hGroup hg) {
+ int i;
+ bool go = false;
+ for(i = 0; i < SK.groupOrder.n; i++) {
+ Group *g = SK.GetGroup(SK.groupOrder.elem[i]);
+ if(g->h.v == hg.v) {
+ go = true;
+ }
+ if(go) {
+ g->clean = false;
+ }
+ }
+ unsaved = true;
+}
+
+bool SolveSpaceUI::PruneOrphans(void) {
+ int i;
+ for(i = 0; i < SK.request.n; i++) {
+ Request *r = &(SK.request.elem[i]);
+ if(GroupExists(r->group)) continue;
+
+ (deleted.requests)++;
+ SK.request.RemoveById(r->h);
+ return true;
+ }
+
+ for(i = 0; i < SK.constraint.n; i++) {
+ Constraint *c = &(SK.constraint.elem[i]);
+ if(GroupExists(c->group)) continue;
+
+ (deleted.constraints)++;
+ (deleted.nonTrivialConstraints)++;
+
+ SK.constraint.RemoveById(c->h);
+ return true;
+ }
+ return false;
+}
+
+bool SolveSpaceUI::GroupsInOrder(hGroup before, hGroup after) {
+ if(before.v == 0) return true;
+ if(after.v == 0) return true;
+
+ int beforep = -1, afterp = -1;
+ int i;
+ for(i = 0; i < SK.groupOrder.n; i++) {
+ Group *g = SK.GetGroup(SK.groupOrder.elem[i]);
+ if(g->h.v == before.v) beforep = i;
+ if(g->h.v == after.v) afterp = i;
+ }
+ if(beforep < 0 || afterp < 0) return false;
+ if(beforep >= afterp) return false;
+ return true;
+}
+
+bool SolveSpaceUI::GroupExists(hGroup hg) {
+ // A nonexistent group is not acceptable
+ return SK.group.FindByIdNoOops(hg) ? true : false;
+}
+bool SolveSpaceUI::EntityExists(hEntity he) {
+ // A nonexstient entity is acceptable, though, usually just means it
+ // doesn't apply.
+ if(he.v == Entity::NO_ENTITY.v) return true;
+ return SK.entity.FindByIdNoOops(he) ? true : false;
+}
+
+bool SolveSpaceUI::PruneGroups(hGroup hg) {
+ Group *g = SK.GetGroup(hg);
+ if(GroupsInOrder(g->opA, hg) &&
+ EntityExists(g->predef.origin) &&
+ EntityExists(g->predef.entityB) &&
+ EntityExists(g->predef.entityC))
+ {
+ return false;
+ }
+ (deleted.groups)++;
+ SK.group.RemoveById(g->h);
+ return true;
+}
+
+bool SolveSpaceUI::PruneRequests(hGroup hg) {
+ int i;
+ for(i = 0; i < SK.entity.n; i++) {
+ Entity *e = &(SK.entity.elem[i]);
+ if(e->group.v != hg.v) continue;
+
+ if(EntityExists(e->workplane)) continue;
+
+ if(!e->h.isFromRequest()) oops();
+
+ (deleted.requests)++;
+ SK.request.RemoveById(e->h.request());
+ return true;
+ }
+ return false;
+}
+
+bool SolveSpaceUI::PruneConstraints(hGroup hg) {
+ int i;
+ for(i = 0; i < SK.constraint.n; i++) {
+ Constraint *c = &(SK.constraint.elem[i]);
+ if(c->group.v != hg.v) continue;
+
+ if(EntityExists(c->workplane) &&
+ EntityExists(c->ptA) &&
+ EntityExists(c->ptB) &&
+ EntityExists(c->entityA) &&
+ EntityExists(c->entityB) &&
+ EntityExists(c->entityC) &&
+ EntityExists(c->entityD))
+ {
+ continue;
+ }
+
+ (deleted.constraints)++;
+ if(c->type != Constraint::POINTS_COINCIDENT &&
+ c->type != Constraint::HORIZONTAL &&
+ c->type != Constraint::VERTICAL)
+ {
+ (deleted.nonTrivialConstraints)++;
+ }
+
+ SK.constraint.RemoveById(c->h);
+ return true;
+ }
+ return false;
+}
+
+void SolveSpaceUI::GenerateAll(GenerateType type, bool andFindFree, bool genForBBox) {
+ int first, last, i, j;
+
+ SK.groupOrder.Clear();
+ for(int i = 0; i < SK.group.n; i++)
+ SK.groupOrder.Add(&SK.group.elem[i].h);
+ std::sort(&SK.groupOrder.elem[0], &SK.groupOrder.elem[SK.groupOrder.n],
+ [](const hGroup &ha, const hGroup &hb) {
+ return SK.GetGroup(ha)->order < SK.GetGroup(hb)->order;
+ });
+
+ switch(type) {
+ case GENERATE_DIRTY: {
+ first = INT_MAX;
+ last = 0;
+
+ // Start from the first dirty group, and solve until the active group,
+ // since all groups after the active group are hidden.
+ for(i = 0; i < SK.groupOrder.n; i++) {
+ Group *g = SK.GetGroup(SK.groupOrder.elem[i]);
+ if((!g->clean) || !g->IsSolvedOkay()) {
+ first = min(first, i);
+ }
+ if(g->h.v == SS.GW.activeGroup.v) {
+ last = i;
+ }
+ }
+ if(first == INT_MAX || last == 0) {
+ // All clean; so just regenerate the entities, and don't solve anything.
+ first = -1;
+ last = -1;
+ } else {
+ SS.nakedEdges.Clear();
+ }
+ break;
+ }
+
+ case GENERATE_ALL:
+ first = 0;
+ last = INT_MAX;
+ break;
+
+ case GENERATE_REGEN:
+ first = -1;
+ last = -1;
+ break;
+
+ case GENERATE_UNTIL_ACTIVE: {
+ for(i = 0; i < SK.groupOrder.n; i++) {
+ if(SK.groupOrder.elem[i].v == SS.GW.activeGroup.v)
+ break;
+ }
+
+ first = 0;
+ last = i;
+ break;
+ }
+
+ default: oops();
+ }
+
+ // If we're generating entities for display, first we need to find
+ // the bounding box to turn relative chord tolerance to absolute.
+ if(!SS.exportMode && !genForBBox) {
+ GenerateAll(type, andFindFree, /*genForBBox=*/true);
+ BBox box = SK.CalculateEntityBBox(/*includeInvisibles=*/true);
+ Vector size = box.maxp.Minus(box.minp);
+ double maxSize = std::max({ size.x, size.y, size.z });
+ chordTolCalculated = maxSize * chordTol / 100.0;
+ }
+
+ // Remove any requests or constraints that refer to a nonexistent
+ // group; can check those immediately, since we know what the list
+ // of groups should be.
+ while(PruneOrphans())
+ ;
+
+ // Don't lose our numerical guesses when we regenerate.
+ IdList<Param,hParam> prev = {};
+ SK.param.MoveSelfInto(&prev);
+ SK.entity.Clear();
+
+ int64_t inTime = GetMilliseconds();
+
+ bool displayedStatusMessage = false;
+ for(i = 0; i < SK.groupOrder.n; i++) {
+ Group *g = SK.GetGroup(SK.groupOrder.elem[i]);
+
+ int64_t now = GetMilliseconds();
+ // Display the status message if we've taken more than 400 ms, or
+ // if we've taken 200 ms but we're not even halfway done, or if
+ // we've already started displaying the status message.
+ if( (now - inTime > 400) ||
+ ((now - inTime > 200) && i < (SK.groupOrder.n / 2)) ||
+ displayedStatusMessage)
+ {
+ displayedStatusMessage = true;
+ std::string msg = ssprintf("generating group %d/%d", i, SK.groupOrder.n);
+
+ int w, h;
+ GetGraphicsWindowSize(&w, &h);
+ glDrawBuffer(GL_FRONT);
+ glViewport(0, 0, w, h);
+ glLoadIdentity();
+ glTranslated(-1, 1, 0);
+ glScaled(2.0/w, 2.0/h, 1.0);
+ glDisable(GL_DEPTH_TEST);
+
+ double left = 80, top = -20, width = 240, height = 24;
+ glColor3d(0.9, 0.8, 0.8);
+ ssglAxisAlignedQuad(left, left+width, top, top-height);
+ ssglLineWidth(1);
+ glColor3d(0.0, 0.0, 0.0);
+ ssglAxisAlignedLineLoop(left, left+width, top, top-height);
+
+ ssglInitializeBitmapFont();
+ glColor3d(0, 0, 0);
+ glPushMatrix();
+ glTranslated(left+8, top-20, 0);
+ glScaled(1, -1, 1);
+ ssglBitmapText(msg, Vector::From(0, 0, 0));
+ glPopMatrix();
+ glFlush();
+ glDrawBuffer(GL_BACK);
+ }
+
+ // The group may depend on entities or other groups, to define its
+ // workplane geometry or for its operands. Those must already exist
+ // in a previous group, so check them before generating.
+ if(PruneGroups(g->h))
+ goto pruned;
+
+ for(j = 0; j < SK.request.n; j++) {
+ Request *r = &(SK.request.elem[j]);
+ if(r->group.v != g->h.v) continue;
+
+ r->Generate(&(SK.entity), &(SK.param));
+ }
+ g->Generate(&(SK.entity), &(SK.param));
+
+ // The requests and constraints depend on stuff in this or the
+ // previous group, so check them after generating.
+ if(PruneRequests(g->h) || PruneConstraints(g->h))
+ goto pruned;
+
+ // Use the previous values for params that we've seen before, as
+ // initial guesses for the solver.
+ for(j = 0; j < SK.param.n; j++) {
+ Param *newp = &(SK.param.elem[j]);
+ if(newp->known) continue;
+
+ Param *prevp = prev.FindByIdNoOops(newp->h);
+ if(prevp) {
+ newp->val = prevp->val;
+ newp->free = prevp->free;
+ }
+ }
+
+ if(g->h.v == Group::HGROUP_REFERENCES.v) {
+ ForceReferences();
+ g->solved.how = System::SOLVED_OKAY;
+ g->clean = true;
+ } else {
+ if(i >= first && i <= last) {
+ // The group falls inside the range, so really solve it,
+ // and then regenerate the mesh based on the solved stuff.
+ if(genForBBox) {
+ SolveGroupAndReport(g->h, andFindFree);
+ } else {
+ g->GenerateLoops();
+ g->GenerateShellAndMesh();
+ g->clean = true;
+ }
+ } else {
+ // The group falls outside the range, so just assume that
+ // it's good wherever we left it. The mesh is unchanged,
+ // and the parameters must be marked as known.
+ for(j = 0; j < SK.param.n; j++) {
+ Param *newp = &(SK.param.elem[j]);
+
+ Param *prevp = prev.FindByIdNoOops(newp->h);
+ if(prevp) newp->known = true;
+ }
+ }
+ }
+ }
+
+ // And update any reference dimensions with their new values
+ for(i = 0; i < SK.constraint.n; i++) {
+ Constraint *c = &(SK.constraint.elem[i]);
+ if(c->reference) {
+ c->ModifyToSatisfy();
+ }
+ }
+
+ // Make sure the point that we're tracing exists.
+ if(traced.point.v && !SK.entity.FindByIdNoOops(traced.point)) {
+ traced.point = Entity::NO_ENTITY;
+ }
+ // And if we're tracing a point, add its new value to the path
+ if(traced.point.v) {
+ Entity *pt = SK.GetEntity(traced.point);
+ traced.path.AddPoint(pt->PointGetNum());
+ }
+
+ prev.Clear();
+ InvalidateGraphics();
+
+ // Remove nonexistent selection items, for same reason we waited till
+ // the end to put up a dialog box.
+ GW.ClearNonexistentSelectionItems();
+
+ if(deleted.requests > 0 || deleted.constraints > 0 || deleted.groups > 0) {
+ // All sorts of interesting things could have happened; for example,
+ // the active group or active workplane could have been deleted. So
+ // clear all that out.
+ if(deleted.groups > 0) {
+ SS.TW.ClearSuper();
+ }
+ ScheduleShowTW();
+ GW.ClearSuper();
+
+ // People get annoyed if I complain whenever they delete any request,
+ // and I otherwise will, since those always come with pt-coincident
+ // constraints.
+ if(deleted.requests > 0 || deleted.nonTrivialConstraints > 0 ||
+ deleted.groups > 0)
+ {
+ // Don't display any errors until we've regenerated fully. The
+ // sketch is not necessarily in a consistent state until we've
+ // pruned any orphaned etc. objects, and the message loop for the
+ // messagebox could allow us to repaint and crash. But now we must
+ // be fine.
+ Message("Additional sketch elements were deleted, because they "
+ "depend on the element that was just deleted explicitly. "
+ "These include: \n"
+ " %d request%s\n"
+ " %d constraint%s\n"
+ " %d group%s"
+ "%s",
+ deleted.requests, deleted.requests == 1 ? "" : "s",
+ deleted.constraints, deleted.constraints == 1 ? "" : "s",
+ deleted.groups, deleted.groups == 1 ? "" : "s",
+ undo.cnt > 0 ? "\n\nChoose Edit -> Undo to undelete all elements." : "");
+ }
+
+ deleted = {};
+ }
+
+ FreeAllTemporary();
+ allConsistent = true;
+ return;
+
+pruned:
+ // Restore the numerical guesses
+ SK.param.Clear();
+ prev.MoveSelfInto(&(SK.param));
+ // Try again
+ GenerateAll(type, andFindFree, genForBBox);
+}
+
+void SolveSpaceUI::ForceReferences(void) {
+ // Force the values of the parameters that define the three reference
+ // coordinate systems.
+ static const struct {
+ hRequest hr;
+ Quaternion q;
+ } Quat[] = {
+ { Request::HREQUEST_REFERENCE_XY, { 1, 0, 0, 0, } },
+ { Request::HREQUEST_REFERENCE_YZ, { 0.5, 0.5, 0.5, 0.5, } },
+ { Request::HREQUEST_REFERENCE_ZX, { 0.5, -0.5, -0.5, -0.5, } },
+ };
+ for(int i = 0; i < 3; i++) {
+ hRequest hr = Quat[i].hr;
+ Entity *wrkpl = SK.GetEntity(hr.entity(0));
+ // The origin for our coordinate system, always zero
+ Entity *origin = SK.GetEntity(wrkpl->point[0]);
+ origin->PointForceTo(Vector::From(0, 0, 0));
+ SK.GetParam(origin->param[0])->known = true;
+ SK.GetParam(origin->param[1])->known = true;
+ SK.GetParam(origin->param[2])->known = true;
+ // The quaternion that defines the rotation, from the table.
+ Entity *normal = SK.GetEntity(wrkpl->normal);
+ normal->NormalForceTo(Quat[i].q);
+ SK.GetParam(normal->param[0])->known = true;
+ SK.GetParam(normal->param[1])->known = true;
+ SK.GetParam(normal->param[2])->known = true;
+ SK.GetParam(normal->param[3])->known = true;
+ }
+}
+
+void SolveSpaceUI::MarkDraggedParams(void) {
+ sys.dragged.Clear();
+
+ for(int i = -1; i < SS.GW.pending.points.n; i++) {
+ hEntity hp;
+ if(i == -1) {
+ hp = SS.GW.pending.point;
+ } else {
+ hp = SS.GW.pending.points.elem[i];
+ }
+ if(!hp.v) continue;
+
+ // The pending point could be one in a group that has not yet
+ // been processed, in which case the lookup will fail; but
+ // that's not an error.
+ Entity *pt = SK.entity.FindByIdNoOops(hp);
+ if(pt) {
+ switch(pt->type) {
+ case Entity::POINT_N_TRANS:
+ case Entity::POINT_IN_3D:
+ sys.dragged.Add(&(pt->param[0]));
+ sys.dragged.Add(&(pt->param[1]));
+ sys.dragged.Add(&(pt->param[2]));
+ break;
+
+ case Entity::POINT_IN_2D:
+ sys.dragged.Add(&(pt->param[0]));
+ sys.dragged.Add(&(pt->param[1]));
+ break;
+ }
+ }
+ }
+ if(SS.GW.pending.circle.v) {
+ Entity *circ = SK.entity.FindByIdNoOops(SS.GW.pending.circle);
+ if(circ) {
+ Entity *dist = SK.GetEntity(circ->distance);
+ switch(dist->type) {
+ case Entity::DISTANCE:
+ sys.dragged.Add(&(dist->param[0]));
+ break;
+ }
+ }
+ }
+ if(SS.GW.pending.normal.v) {
+ Entity *norm = SK.entity.FindByIdNoOops(SS.GW.pending.normal);
+ if(norm) {
+ switch(norm->type) {
+ case Entity::NORMAL_IN_3D:
+ sys.dragged.Add(&(norm->param[0]));
+ sys.dragged.Add(&(norm->param[1]));
+ sys.dragged.Add(&(norm->param[2]));
+ sys.dragged.Add(&(norm->param[3]));
+ break;
+ // other types are locked, so not draggable
+ }
+ }
+ }
+}
+
+void SolveSpaceUI::SolveGroupAndReport(hGroup hg, bool andFindFree) {
+ SolveGroup(hg, andFindFree);
+
+ Group *g = SK.GetGroup(hg);
+ if(g->solved.how == System::REDUNDANT_OKAY) {
+ // Solve again, in case we lost a degree of freedom because of a numeric error.
+ SolveGroup(hg, andFindFree);
+ }
+
+ bool isOkay = g->solved.how == System::SOLVED_OKAY ||
+ (g->allowRedundant && g->solved.how == System::REDUNDANT_OKAY);
+
+ if(!isOkay || (isOkay && !g->IsSolvedOkay())) {
+ TextWindow::ReportHowGroupSolved(g->h);
+ }
+}
+
+void SolveSpaceUI::SolveGroup(hGroup hg, bool andFindFree) {
+ int i;
+ // Clear out the system to be solved.
+ sys.entity.Clear();
+ sys.param.Clear();
+ sys.eq.Clear();
+ // And generate all the params for requests in this group
+ for(i = 0; i < SK.request.n; i++) {
+ Request *r = &(SK.request.elem[i]);
+ if(r->group.v != hg.v) continue;
+
+ r->Generate(&(sys.entity), &(sys.param));
+ }
+ // And for the group itself
+ Group *g = SK.GetGroup(hg);
+ g->Generate(&(sys.entity), &(sys.param));
+ // Set the initial guesses for all the params
+ for(i = 0; i < sys.param.n; i++) {
+ Param *p = &(sys.param.elem[i]);
+ p->known = false;
+ p->val = SK.GetParam(p->h)->val;
+ }
+
+ MarkDraggedParams();
+ g->solved.remove.Clear();
+ int how = sys.Solve(g, &(g->solved.dof),
+ &(g->solved.remove), true, andFindFree);
+ g->solved.how = how;
+ FreeAllTemporary();
+}
+
+bool SolveSpaceUI::ActiveGroupsOkay() {
+ for(int i = 0; i < SK.groupOrder.n; i++) {
+ Group *g = SK.GetGroup(SK.groupOrder.elem[i]);
+ if(!g->IsSolvedOkay())
+ return false;
+ if(g->h.v == SS.GW.activeGroup.v)
+ break;
+ }
+ return true;
+}
+
--- /dev/null
+//-----------------------------------------------------------------------------
+// Helper functions that ultimately draw stuff with gl.
+//
+// Copyright 2008-2013 Jonathan Westhues.
+//-----------------------------------------------------------------------------
+#include <zlib.h>
+#include "solvespace.h"
+
+namespace SolveSpace {
+
+// A vector font.
+#include "generated/vectorfont.table.h"
+
+// A bitmap font.
+#include "generated/bitmapfont.table.h"
+
+static bool ColorLocked;
+static bool DepthOffsetLocked;
+
+static const VectorGlyph &GetVectorGlyph(char32_t chr) {
+ int first = 0;
+ int last = sizeof(VectorFont) / sizeof(VectorGlyph);
+ while(first <= last) {
+ int mid = (first + last) / 2;
+ char32_t midChr = VectorFont[mid].character;
+ if(midChr > chr) {
+ last = mid - 1; // and first stays the same
+ continue;
+ }
+ if(midChr < chr) {
+ first = mid + 1; // and last stays the same
+ continue;
+ }
+ return VectorFont[mid];
+ }
+ return GetVectorGlyph(0xfffd); // replacement character
+}
+
+// Internally and in the UI, the vector font is sized using cap height.
+#define FONT_SCALE(h) ((h)/(double)FONT_CAP_HEIGHT)
+double ssglStrCapHeight(double h)
+{
+ return FONT_CAP_HEIGHT * FONT_SCALE(h) / SS.GW.scale;
+}
+double ssglStrFontSize(double h)
+{
+ return FONT_SIZE * FONT_SCALE(h) / SS.GW.scale;
+}
+double ssglStrWidth(const std::string &str, double h)
+{
+ int width = 0;
+ for(char32_t chr : ReadUTF8(str)) {
+ const VectorGlyph &glyph = GetVectorGlyph(chr);
+ if(glyph.baseCharacter != 0) {
+ const VectorGlyph &baseGlyph = GetVectorGlyph(glyph.baseCharacter);
+ width += max(glyph.advanceWidth, baseGlyph.advanceWidth);
+ } else {
+ width += glyph.advanceWidth;
+ }
+ }
+ return width * FONT_SCALE(h) / SS.GW.scale;
+}
+void ssglWriteTextRefCenter(const std::string &str, double h, Vector t, Vector u, Vector v,
+ ssglLineFn *fn, void *fndata)
+{
+ u = u.WithMagnitude(1);
+ v = v.WithMagnitude(1);
+
+ double scale = FONT_SCALE(h)/SS.GW.scale;
+ double fh = ssglStrCapHeight(h);
+ double fw = ssglStrWidth(str, h);
+
+ t = t.Plus(u.ScaledBy(-fw/2));
+ t = t.Plus(v.ScaledBy(-fh/2));
+
+ // Apply additional offset to get an exact center alignment.
+ t = t.Plus(v.ScaledBy(-4608*scale));
+
+ ssglWriteText(str, h, t, u, v, fn, fndata);
+}
+
+void ssglLineWidth(GLfloat width) {
+ // Intel GPUs with Mesa on *nix render thin lines poorly.
+ static bool workaroundChecked, workaroundEnabled;
+ if(!workaroundChecked) {
+ // ssglLineWidth can be called before GL is initialized
+ if(glGetString(GL_VENDOR)) {
+ workaroundChecked = true;
+ if(!strcmp((char*)glGetString(GL_VENDOR), "Intel Open Source Technology Center"))
+ workaroundEnabled = true;
+ }
+ }
+
+ if(workaroundEnabled && width < 1.6f)
+ width = 1.6f;
+
+ glLineWidth(width);
+}
+
+static void LineDrawCallback(void *fndata, Vector a, Vector b)
+{
+ ssglLineWidth(1);
+ glBegin(GL_LINES);
+ ssglVertex3v(a);
+ ssglVertex3v(b);
+ glEnd();
+}
+
+Vector pixelAlign(Vector v) {
+ v = SS.GW.ProjectPoint3(v);
+ v.x = floor(v.x) + 0.5;
+ v.y = floor(v.y) + 0.5;
+ v = SS.GW.UnProjectPoint3(v);
+ return v;
+}
+
+int ssglDrawCharacter(const VectorGlyph &glyph, Vector t, Vector o, Vector u, Vector v,
+ double scale, ssglLineFn *fn, void *fndata, bool gridFit) {
+ int advanceWidth = glyph.advanceWidth;
+
+ if(glyph.baseCharacter != 0) {
+ const VectorGlyph &baseGlyph = GetVectorGlyph(glyph.baseCharacter);
+ int baseWidth = ssglDrawCharacter(baseGlyph, t, o, u, v, scale, fn, fndata, gridFit);
+ advanceWidth = max(glyph.advanceWidth, baseWidth);
+ }
+
+ int actualWidth, offsetX;
+ if(gridFit) {
+ o.x += glyph.leftSideBearing;
+ offsetX = glyph.leftSideBearing;
+ actualWidth = glyph.boundingWidth;
+ if(actualWidth == 0) {
+ // Dot, "i", etc.
+ actualWidth = 1;
+ }
+ } else {
+ offsetX = 0;
+ actualWidth = advanceWidth;
+ }
+
+ Vector tt = t;
+ tt = tt.Plus(u.ScaledBy(o.x * scale));
+ tt = tt.Plus(v.ScaledBy(o.y * scale));
+
+ Vector tu = tt;
+ tu = tu.Plus(u.ScaledBy(actualWidth * scale));
+
+ Vector tv = tt;
+ tv = tv.Plus(v.ScaledBy(FONT_CAP_HEIGHT * scale));
+
+ if(gridFit) {
+ tt = pixelAlign(tt);
+ tu = pixelAlign(tu);
+ tv = pixelAlign(tv);
+ }
+
+ tu = tu.Minus(tt).ScaledBy(1.0 / actualWidth);
+ tv = tv.Minus(tt).ScaledBy(1.0 / FONT_CAP_HEIGHT);
+
+ const int16_t *data = glyph.data;
+ bool pen_up = true;
+ Vector prevp;
+ while(true) {
+ int16_t x = *data++;
+ int16_t y = *data++;
+
+ if(x == PEN_UP && y == PEN_UP) {
+ if(pen_up) break;
+ pen_up = true;
+ } else {
+ Vector p = tt;
+ p = p.Plus(tu.ScaledBy(x - offsetX));
+ p = p.Plus(tv.ScaledBy(y));
+ if(!pen_up) fn(fndata, prevp, p);
+ prevp = p;
+ pen_up = false;
+ }
+ }
+
+ return advanceWidth;
+}
+
+void ssglWriteText(const std::string &str, double h, Vector t, Vector u, Vector v,
+ ssglLineFn *fn, void *fndata)
+{
+ if(!fn) fn = LineDrawCallback;
+ u = u.WithMagnitude(1);
+ v = v.WithMagnitude(1);
+
+ // Perform grid-fitting only when the text is parallel to the view plane.
+ bool gridFit = !SS.exportMode && u.Equals(SS.GW.projRight) && v.Equals(SS.GW.projUp);
+
+ double scale = FONT_SCALE(h) / SS.GW.scale;
+ Vector o = { 3840.0, 3840.0, 0.0 };
+ for(char32_t chr : ReadUTF8(str)) {
+ const VectorGlyph &glyph = GetVectorGlyph(chr);
+ o.x += ssglDrawCharacter(glyph, t, o, u, v, scale, fn, fndata, gridFit);
+ }
+}
+
+void ssglVertex3v(Vector u)
+{
+ glVertex3f((GLfloat)u.x, (GLfloat)u.y, (GLfloat)u.z);
+}
+
+void ssglAxisAlignedQuad(double l, double r, double t, double b, bool lone)
+{
+ if(lone) glBegin(GL_QUADS);
+ glVertex2d(l, t);
+ glVertex2d(l, b);
+ glVertex2d(r, b);
+ glVertex2d(r, t);
+ if(lone) glEnd();
+}
+
+void ssglAxisAlignedLineLoop(double l, double r, double t, double b)
+{
+ glBegin(GL_LINE_LOOP);
+ glVertex2d(l, t);
+ glVertex2d(l, b);
+ glVertex2d(r, b);
+ glVertex2d(r, t);
+ glEnd();
+}
+
+static void FatLineEndcap(Vector p, Vector u, Vector v)
+{
+ // A table of cos and sin of (pi*i/10 + pi/2), as i goes from 0 to 10
+ static const double Circle[11][2] = {
+ { 0.0000, 1.0000 },
+ { -0.3090, 0.9511 },
+ { -0.5878, 0.8090 },
+ { -0.8090, 0.5878 },
+ { -0.9511, 0.3090 },
+ { -1.0000, 0.0000 },
+ { -0.9511, -0.3090 },
+ { -0.8090, -0.5878 },
+ { -0.5878, -0.8090 },
+ { -0.3090, -0.9511 },
+ { 0.0000, -1.0000 },
+ };
+ glBegin(GL_TRIANGLE_FAN);
+ for(int i = 0; i <= 10; i++) {
+ double c = Circle[i][0], s = Circle[i][1];
+ ssglVertex3v(p.Plus(u.ScaledBy(c)).Plus(v.ScaledBy(s)));
+ }
+ glEnd();
+}
+
+void ssglLine(const Vector &a, const Vector &b, double pixelWidth, bool maybeFat) {
+ if(!maybeFat || pixelWidth <= 3.0) {
+ glBegin(GL_LINES);
+ ssglVertex3v(a);
+ ssglVertex3v(b);
+ glEnd();
+ } else {
+ ssglFatLine(a, b, pixelWidth / SS.GW.scale);
+ }
+}
+
+void ssglPoint(Vector p, double pixelSize)
+{
+ if(/*!maybeFat || */pixelSize <= 3.0) {
+ glBegin(GL_LINES);
+ Vector u = SS.GW.projRight.WithMagnitude(pixelSize / SS.GW.scale / 2.0);
+ ssglVertex3v(p.Minus(u));
+ ssglVertex3v(p.Plus(u));
+ glEnd();
+ } else {
+ Vector u = SS.GW.projRight.WithMagnitude(pixelSize / SS.GW.scale / 2.0);
+ Vector v = SS.GW.projUp.WithMagnitude(pixelSize / SS.GW.scale / 2.0);
+
+ FatLineEndcap(p, u, v);
+ FatLineEndcap(p, u.ScaledBy(-1.0), v);
+ }
+}
+
+void ssglStippledLine(Vector a, Vector b, double width,
+ int stippleType, double stippleScale, bool maybeFat)
+{
+ const char *stipplePattern;
+ switch(stippleType) {
+ case Style::STIPPLE_CONTINUOUS: ssglLine(a, b, width, maybeFat); return;
+ case Style::STIPPLE_DASH: stipplePattern = "- "; break;
+ case Style::STIPPLE_LONG_DASH: stipplePattern = "_ "; break;
+ case Style::STIPPLE_DASH_DOT: stipplePattern = "-."; break;
+ case Style::STIPPLE_DASH_DOT_DOT: stipplePattern = "-.."; break;
+ case Style::STIPPLE_DOT: stipplePattern = "."; break;
+ case Style::STIPPLE_FREEHAND: stipplePattern = "~"; break;
+ case Style::STIPPLE_ZIGZAG: stipplePattern = "~__"; break;
+ default: oops();
+ }
+ ssglStippledLine(a, b, width, stipplePattern, stippleScale, maybeFat);
+}
+
+void ssglStippledLine(Vector a, Vector b, double width,
+ const char *stipplePattern, double stippleScale, bool maybeFat)
+{
+ if(stipplePattern == NULL || *stipplePattern == 0) oops();
+
+ Vector dir = b.Minus(a);
+ double len = dir.Magnitude();
+ dir = dir.WithMagnitude(1.0);
+
+ const char *si = stipplePattern;
+ double end = len;
+ double ss = stippleScale / 2.0;
+ do {
+ double start = end;
+ switch(*si) {
+ case ' ':
+ end -= 1.0 * ss;
+ break;
+
+ case '-':
+ start = max(start - 0.5 * ss, 0.0);
+ end = max(start - 2.0 * ss, 0.0);
+ if(start == end) break;
+ ssglLine(a.Plus(dir.ScaledBy(start)), a.Plus(dir.ScaledBy(end)), width, maybeFat);
+ end = max(end - 0.5 * ss, 0.0);
+ break;
+
+ case '_':
+ end = max(end - 4.0 * ss, 0.0);
+ ssglLine(a.Plus(dir.ScaledBy(start)), a.Plus(dir.ScaledBy(end)), width, maybeFat);
+ break;
+
+ case '.':
+ end = max(end - 0.5 * ss, 0.0);
+ if(end == 0.0) break;
+ ssglPoint(a.Plus(dir.ScaledBy(end)), width);
+ end = max(end - 0.5 * ss, 0.0);
+ break;
+
+ case '~': {
+ Vector ab = b.Minus(a);
+ Vector gn = (SS.GW.projRight).Cross(SS.GW.projUp);
+ Vector abn = (ab.Cross(gn)).WithMagnitude(1);
+ abn = abn.Minus(gn.ScaledBy(gn.Dot(abn)));
+ double pws = 2.0 * width / SS.GW.scale;
+
+ end = max(end - 0.5 * ss, 0.0);
+ Vector aa = a.Plus(dir.ScaledBy(start));
+ Vector bb = a.Plus(dir.ScaledBy(end))
+ .Plus(abn.ScaledBy(pws * (start - end) / (0.5 * ss)));
+ ssglLine(aa, bb, width, maybeFat);
+ if(end == 0.0) break;
+
+ start = end;
+ end = max(end - 1.0 * ss, 0.0);
+ aa = a.Plus(dir.ScaledBy(end))
+ .Plus(abn.ScaledBy(pws))
+ .Minus(abn.ScaledBy(2.0 * pws * (start - end) / ss));
+ ssglLine(bb, aa, width, maybeFat);
+ if(end == 0.0) break;
+
+ start = end;
+ end = max(end - 0.5 * ss, 0.0);
+ bb = a.Plus(dir.ScaledBy(end))
+ .Minus(abn.ScaledBy(pws))
+ .Plus(abn.ScaledBy(pws * (start - end) / (0.5 * ss)));
+ ssglLine(aa, bb, width, maybeFat);
+ break;
+ }
+
+ default: oops();
+ }
+ if(*(++si) == 0) si = stipplePattern;
+ } while(end > 0.0);
+}
+
+void ssglFatLine(Vector a, Vector b, double width)
+{
+ if(a.EqualsExactly(b)) return;
+ // The half-width of the line we're drawing.
+ double hw = width / 2;
+ Vector ab = b.Minus(a);
+ Vector gn = (SS.GW.projRight).Cross(SS.GW.projUp);
+ Vector abn = (ab.Cross(gn)).WithMagnitude(1);
+ abn = abn.Minus(gn.ScaledBy(gn.Dot(abn)));
+ // So now abn is normal to the projection of ab into the screen, so the
+ // line will always have constant thickness as the view is rotated.
+
+ abn = abn.WithMagnitude(hw);
+ ab = gn.Cross(abn);
+ ab = ab. WithMagnitude(hw);
+
+ // The body of a line is a quad
+ glBegin(GL_QUADS);
+ ssglVertex3v(a.Minus(abn));
+ ssglVertex3v(b.Minus(abn));
+ ssglVertex3v(b.Plus (abn));
+ ssglVertex3v(a.Plus (abn));
+ glEnd();
+ // And the line has two semi-circular end caps.
+ FatLineEndcap(a, ab, abn);
+ FatLineEndcap(b, ab.ScaledBy(-1), abn);
+}
+
+
+void ssglLockColorTo(RgbaColor rgb)
+{
+ ColorLocked = false;
+ glColor3d(rgb.redF(), rgb.greenF(), rgb.blueF());
+ ColorLocked = true;
+}
+
+void ssglUnlockColor(void)
+{
+ ColorLocked = false;
+}
+
+void ssglColorRGB(RgbaColor rgb)
+{
+ // Is there a bug in some graphics drivers where this is not equivalent
+ // to glColor3d? There seems to be...
+ ssglColorRGBa(rgb, 1.0);
+}
+
+void ssglColorRGBa(RgbaColor rgb, double a)
+{
+ if(!ColorLocked) glColor4d(rgb.redF(), rgb.greenF(), rgb.blueF(), a);
+}
+
+static void Stipple(bool forSel)
+{
+ static bool Init;
+ const int BYTES = (32*32)/8;
+ static GLubyte HoverMask[BYTES];
+ static GLubyte SelMask[BYTES];
+ if(!Init) {
+ int x, y;
+ for(x = 0; x < 32; x++) {
+ for(y = 0; y < 32; y++) {
+ int i = y*4 + x/8, b = x % 8;
+ int ym = y % 4, xm = x % 4;
+ for(int k = 0; k < 2; k++) {
+ if(xm >= 1 && xm <= 2 && ym >= 1 && ym <= 2) {
+ (k == 0 ? SelMask : HoverMask)[i] |= (0x80 >> b);
+ }
+ ym = (ym + 2) % 4; xm = (xm + 2) % 4;
+ }
+ }
+ }
+ Init = true;
+ }
+
+ glEnable(GL_POLYGON_STIPPLE);
+ if(forSel) {
+ glPolygonStipple(SelMask);
+ } else {
+ glPolygonStipple(HoverMask);
+ }
+}
+
+static void StippleTriangle(STriangle *tr, bool s, RgbaColor rgb)
+{
+ glEnd();
+ glDisable(GL_LIGHTING);
+ ssglColorRGB(rgb);
+ Stipple(s);
+ glBegin(GL_TRIANGLES);
+ ssglVertex3v(tr->a);
+ ssglVertex3v(tr->b);
+ ssglVertex3v(tr->c);
+ glEnd();
+ glEnable(GL_LIGHTING);
+ glDisable(GL_POLYGON_STIPPLE);
+ glBegin(GL_TRIANGLES);
+}
+
+void ssglFillMesh(bool useSpecColor, RgbaColor specColor,
+ SMesh *m, uint32_t h, uint32_t s1, uint32_t s2)
+{
+ RgbaColor rgbHovered = Style::Color(Style::HOVERED),
+ rgbSelected = Style::Color(Style::SELECTED);
+
+ glEnable(GL_NORMALIZE);
+ bool hasMaterial = false;
+ RgbaColor prevColor;
+ glBegin(GL_TRIANGLES);
+ for(int i = 0; i < m->l.n; i++) {
+ STriangle *tr = &(m->l.elem[i]);
+
+ RgbaColor color;
+ if(useSpecColor) {
+ color = specColor;
+ } else {
+ color = tr->meta.color;
+ }
+ if(!hasMaterial || !color.Equals(prevColor)) {
+ GLfloat mpf[] = { color.redF(), color.greenF(), color.blueF(), color.alphaF() };
+ glEnd();
+ glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, mpf);
+ prevColor = color;
+ hasMaterial = true;
+ glBegin(GL_TRIANGLES);
+ }
+
+ if(tr->an.EqualsExactly(Vector::From(0, 0, 0))) {
+ // Compute the normal from the vertices
+ Vector n = tr->Normal();
+ glNormal3d(n.x, n.y, n.z);
+ ssglVertex3v(tr->a);
+ ssglVertex3v(tr->b);
+ ssglVertex3v(tr->c);
+ } else {
+ // Use the exact normals that are specified
+ glNormal3d((tr->an).x, (tr->an).y, (tr->an).z);
+ ssglVertex3v(tr->a);
+
+ glNormal3d((tr->bn).x, (tr->bn).y, (tr->bn).z);
+ ssglVertex3v(tr->b);
+
+ glNormal3d((tr->cn).x, (tr->cn).y, (tr->cn).z);
+ ssglVertex3v(tr->c);
+ }
+
+ if((s1 != 0 && tr->meta.face == s1) ||
+ (s2 != 0 && tr->meta.face == s2))
+ {
+ StippleTriangle(tr, true, rgbSelected);
+ }
+ if(h != 0 && tr->meta.face == h) {
+ StippleTriangle(tr, false, rgbHovered);
+ }
+ }
+ glEnd();
+}
+
+static void SSGL_CALLBACK Vertex(Vector *p)
+{
+ ssglVertex3v(*p);
+}
+void ssglFillPolygon(SPolygon *p)
+{
+ GLUtesselator *gt = gluNewTess();
+ gluTessCallback(gt, GLU_TESS_BEGIN, (ssglCallbackFptr *)glBegin);
+ gluTessCallback(gt, GLU_TESS_END, (ssglCallbackFptr *)glEnd);
+ gluTessCallback(gt, GLU_TESS_VERTEX, (ssglCallbackFptr *)Vertex);
+
+ ssglTesselatePolygon(gt, p);
+
+ gluDeleteTess(gt);
+}
+
+static void SSGL_CALLBACK Combine(double coords[3], void *vertexData[4],
+ float weight[4], void **outData)
+{
+ Vector *n = (Vector *)AllocTemporary(sizeof(Vector));
+ n->x = coords[0];
+ n->y = coords[1];
+ n->z = coords[2];
+
+ *outData = n;
+}
+void ssglTesselatePolygon(GLUtesselator *gt, SPolygon *p)
+{
+ int i, j;
+
+ gluTessCallback(gt, GLU_TESS_COMBINE, (ssglCallbackFptr *)Combine);
+ gluTessProperty(gt, GLU_TESS_WINDING_RULE, GLU_TESS_WINDING_ODD);
+
+ Vector normal = p->normal;
+ glNormal3d(normal.x, normal.y, normal.z);
+ gluTessNormal(gt, normal.x, normal.y, normal.z);
+
+ gluTessBeginPolygon(gt, NULL);
+ for(i = 0; i < p->l.n; i++) {
+ SContour *sc = &(p->l.elem[i]);
+ gluTessBeginContour(gt);
+ for(j = 0; j < (sc->l.n-1); j++) {
+ SPoint *sp = &(sc->l.elem[j]);
+ double ap[3];
+ ap[0] = sp->p.x;
+ ap[1] = sp->p.y;
+ ap[2] = sp->p.z;
+ gluTessVertex(gt, ap, &(sp->p));
+ }
+ gluTessEndContour(gt);
+ }
+ gluTessEndPolygon(gt);
+}
+
+void ssglDebugPolygon(SPolygon *p)
+{
+ int i, j;
+ ssglLineWidth(2);
+ glPointSize(7);
+ glDisable(GL_DEPTH_TEST);
+ for(i = 0; i < p->l.n; i++) {
+ SContour *sc = &(p->l.elem[i]);
+ for(j = 0; j < (sc->l.n-1); j++) {
+ Vector a = (sc->l.elem[j]).p;
+ Vector b = (sc->l.elem[j+1]).p;
+
+ ssglLockColorTo(RGBi(0, 0, 255));
+ Vector d = (a.Minus(b)).WithMagnitude(-0);
+ glBegin(GL_LINES);
+ ssglVertex3v(a.Plus(d));
+ ssglVertex3v(b.Minus(d));
+ glEnd();
+ ssglLockColorTo(RGBi(255, 0, 0));
+ glBegin(GL_POINTS);
+ ssglVertex3v(a.Plus(d));
+ ssglVertex3v(b.Minus(d));
+ glEnd();
+ }
+ }
+}
+
+void ssglDrawEdges(SEdgeList *el, bool endpointsToo, hStyle hs)
+{
+ double lineWidth = Style::Width(hs);
+ int stippleType = Style::PatternType(hs);
+ double stippleScale = Style::StippleScaleMm(hs);
+ ssglLineWidth(float(lineWidth));
+ ssglColorRGB(Style::Color(hs));
+
+ SEdge *se;
+ for(se = el->l.First(); se; se = el->l.NextAfter(se)) {
+ ssglStippledLine(se->a, se->b, lineWidth, stippleType, stippleScale,
+ /*maybeFat=*/true);
+ }
+
+ if(endpointsToo) {
+ glPointSize(12);
+ glBegin(GL_POINTS);
+ for(se = el->l.First(); se; se = el->l.NextAfter(se)) {
+ ssglVertex3v(se->a);
+ ssglVertex3v(se->b);
+ }
+ glEnd();
+ }
+}
+
+void ssglDrawOutlines(SOutlineList *sol, Vector projDir, hStyle hs)
+{
+ double lineWidth = Style::Width(hs);
+ int stippleType = Style::PatternType(hs);
+ double stippleScale = Style::StippleScaleMm(hs);
+ ssglLineWidth((float)lineWidth);
+ ssglColorRGB(Style::Color(hs));
+
+ sol->FillOutlineTags(projDir);
+ for(SOutline *so = sol->l.First(); so; so = sol->l.NextAfter(so)) {
+ if(!so->tag) continue;
+ ssglStippledLine(so->a, so->b, lineWidth, stippleType, stippleScale,
+ /*maybeFat=*/true);
+ }
+}
+
+void ssglDebugMesh(SMesh *m)
+{
+ int i;
+ ssglLineWidth(1);
+ glPointSize(7);
+ ssglDepthRangeOffset(1);
+ ssglUnlockColor();
+ glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
+ ssglColorRGBa(RGBi(0, 255, 0), 1.0);
+ glBegin(GL_TRIANGLES);
+ for(i = 0; i < m->l.n; i++) {
+ STriangle *t = &(m->l.elem[i]);
+ if(t->tag) continue;
+
+ ssglVertex3v(t->a);
+ ssglVertex3v(t->b);
+ ssglVertex3v(t->c);
+ }
+ glEnd();
+ ssglDepthRangeOffset(0);
+ glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
+}
+
+void ssglMarkPolygonNormal(SPolygon *p)
+{
+ Vector tail = Vector::From(0, 0, 0);
+ int i, j, cnt = 0;
+ // Choose some reasonable center point.
+ for(i = 0; i < p->l.n; i++) {
+ SContour *sc = &(p->l.elem[i]);
+ for(j = 0; j < (sc->l.n-1); j++) {
+ SPoint *sp = &(sc->l.elem[j]);
+ tail = tail.Plus(sp->p);
+ cnt++;
+ }
+ }
+ if(cnt == 0) return;
+ tail = tail.ScaledBy(1.0/cnt);
+
+ Vector gn = SS.GW.projRight.Cross(SS.GW.projUp);
+ Vector tip = tail.Plus((p->normal).WithMagnitude(40/SS.GW.scale));
+ Vector arrow = (p->normal).WithMagnitude(15/SS.GW.scale);
+
+ glColor3d(1, 1, 0);
+ glBegin(GL_LINES);
+ ssglVertex3v(tail);
+ ssglVertex3v(tip);
+ ssglVertex3v(tip);
+ ssglVertex3v(tip.Minus(arrow.RotatedAbout(gn, 0.6)));
+ ssglVertex3v(tip);
+ ssglVertex3v(tip.Minus(arrow.RotatedAbout(gn, -0.6)));
+ glEnd();
+ glEnable(GL_LIGHTING);
+}
+
+void ssglDepthRangeOffset(int units)
+{
+ if(!DepthOffsetLocked) {
+ // The size of this step depends on the resolution of the Z buffer; for
+ // a 16-bit buffer, this should be fine.
+ double d = units/60000.0;
+ glDepthRange(0.1-d, 1-d);
+ }
+}
+
+void ssglDepthRangeLockToFront(bool yes)
+{
+ if(yes) {
+ DepthOffsetLocked = true;
+ glDepthRange(0, 0);
+ } else {
+ DepthOffsetLocked = false;
+ ssglDepthRangeOffset(0);
+ }
+}
+
+const int BitmapFontChunkSize = 64 * 64;
+static bool BitmapFontChunkInitialized[0x10000 / BitmapFontChunkSize];
+static int BitmapFontCurrentChunk = -1;
+
+static void CreateBitmapFontChunk(const uint8_t *source, size_t sourceLength,
+ int textureIndex)
+{
+ // Place the font in our texture in a two-dimensional grid.
+ // The maximum texture size that is reasonably supported is 1024x1024.
+ const size_t fontTextureSize = BitmapFontChunkSize*16*16;
+ uint8_t *fontTexture = (uint8_t *)malloc(fontTextureSize),
+ *mappedTexture = (uint8_t *)malloc(fontTextureSize);
+
+ z_stream stream;
+ stream.zalloc = Z_NULL;
+ stream.zfree = Z_NULL;
+ stream.opaque = Z_NULL;
+ if(inflateInit(&stream) != Z_OK)
+ oops();
+
+ stream.next_in = (Bytef *)source;
+ stream.avail_in = sourceLength;
+ stream.next_out = fontTexture;
+ stream.avail_out = fontTextureSize;
+ if(inflate(&stream, Z_NO_FLUSH) != Z_STREAM_END)
+ oops();
+ if(stream.avail_out != 0)
+ oops();
+
+ inflateEnd(&stream);
+
+ for(int a = 0; a < BitmapFontChunkSize; a++) {
+ int row = a / 64, col = a % 64;
+
+ for(int i = 0; i < 16; i++) {
+ memcpy(mappedTexture + row*64*16*16 + col*16 + i*64*16,
+ fontTexture + a*16*16 + i*16,
+ 16);
+ }
+ }
+
+ free(fontTexture);
+
+ glBindTexture(GL_TEXTURE_2D, textureIndex);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
+ glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA,
+ 16*64, 64*16,
+ 0,
+ GL_ALPHA, GL_UNSIGNED_BYTE,
+ mappedTexture);
+
+ free(mappedTexture);
+}
+
+static void SwitchToBitmapFontChunkFor(char32_t chr)
+{
+ int plane = chr / BitmapFontChunkSize,
+ textureIndex = TEXTURE_BITMAP_FONT + plane;
+
+ if(BitmapFontCurrentChunk != textureIndex) {
+ glEnd();
+
+ if(!BitmapFontChunkInitialized[plane]) {
+ CreateBitmapFontChunk(CompressedFontTexture[plane].data,
+ CompressedFontTexture[plane].length,
+ textureIndex);
+ BitmapFontChunkInitialized[plane] = true;
+ } else {
+ glBindTexture(GL_TEXTURE_2D, textureIndex);
+ }
+
+ BitmapFontCurrentChunk = textureIndex;
+
+ glBegin(GL_QUADS);
+ }
+}
+
+void ssglInitializeBitmapFont()
+{
+ memset(BitmapFontChunkInitialized, 0, sizeof(BitmapFontChunkInitialized));
+ BitmapFontCurrentChunk = -1;
+}
+
+int ssglBitmapCharWidth(char32_t chr) {
+ if(!CodepointProperties[chr].exists)
+ chr = 0xfffd; // replacement character
+
+ return CodepointProperties[chr].isWide ? 2 : 1;
+}
+
+void ssglBitmapCharQuad(char32_t chr, double x, double y)
+{
+ int w, h;
+
+ if(!CodepointProperties[chr].exists)
+ chr = 0xfffd; // replacement character
+
+ h = 16;
+ if(chr >= 0xe000 && chr <= 0xefff) {
+ // Special character, like a checkbox or a radio button
+ w = 16;
+ x -= 3;
+ } else if(CodepointProperties[chr].isWide) {
+ // Wide (usually CJK or reserved) character
+ w = 16;
+ } else {
+ // Normal character
+ w = 8;
+ }
+
+ if(chr != ' ' && chr != 0) {
+ int n = chr % BitmapFontChunkSize;
+ int row = n / 64, col = n % 64;
+ double s0 = col/64.0,
+ s1 = (col+1)/64.0,
+ t0 = row/64.0,
+ t1 = t0 + (w/16.0)/64;
+
+ SwitchToBitmapFontChunkFor(chr);
+
+ glTexCoord2d(s1, t0);
+ glVertex2d(x, y);
+
+ glTexCoord2d(s1, t1);
+ glVertex2d(x + w, y);
+
+ glTexCoord2d(s0, t1);
+ glVertex2d(x + w, y - h);
+
+ glTexCoord2d(s0, t0);
+ glVertex2d(x, y - h);
+ }
+}
+
+void ssglBitmapText(const std::string &str, Vector p)
+{
+ glEnable(GL_TEXTURE_2D);
+ glBegin(GL_QUADS);
+ for(char32_t chr : ReadUTF8(str)) {
+ ssglBitmapCharQuad(chr, p.x, p.y);
+ p.x += 8 * ssglBitmapCharWidth(chr);
+ }
+ glEnd();
+ glDisable(GL_TEXTURE_2D);
+}
+
+void ssglDrawPixelsWithTexture(uint8_t *data, int w, int h)
+{
+#define MAX_DIM 32
+ static uint8_t Texture[MAX_DIM*MAX_DIM*3];
+ int i, j;
+ if(w > MAX_DIM || h > MAX_DIM) oops();
+
+ for(i = 0; i < w; i++) {
+ for(j = 0; j < h; j++) {
+ Texture[(j*MAX_DIM + i)*3 + 0] = data[(j*w + i)*3 + 0];
+ Texture[(j*MAX_DIM + i)*3 + 1] = data[(j*w + i)*3 + 1];
+ Texture[(j*MAX_DIM + i)*3 + 2] = data[(j*w + i)*3 + 2];
+ }
+ }
+
+ glBindTexture(GL_TEXTURE_2D, TEXTURE_DRAW_PIXELS);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
+ glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
+
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, MAX_DIM, MAX_DIM, 0,
+ GL_RGB, GL_UNSIGNED_BYTE, Texture);
+
+ glEnable(GL_TEXTURE_2D);
+ glBegin(GL_QUADS);
+ glTexCoord2d(0, 0);
+ glVertex2d(0, h);
+
+ glTexCoord2d(((double)w)/MAX_DIM, 0);
+ glVertex2d(w, h);
+
+ glTexCoord2d(((double)w)/MAX_DIM, ((double)h)/MAX_DIM);
+ glVertex2d(w, 0);
+
+ glTexCoord2d(0, ((double)h)/MAX_DIM);
+ glVertex2d(0, 0);
+ glEnd();
+ glDisable(GL_TEXTURE_2D);
+}
+
+};
--- /dev/null
+//-----------------------------------------------------------------------------
+// Top-level implementation of the program's main window, in which a graphical
+// representation of the model is drawn and edited by the user.
+//
+// Copyright 2008-2013 Jonathan Westhues.
+//-----------------------------------------------------------------------------
+#include "solvespace.h"
+#include "config.h"
+
+#define mView (&GraphicsWindow::MenuView)
+#define mEdit (&GraphicsWindow::MenuEdit)
+#define mClip (&GraphicsWindow::MenuClipboard)
+#define mReq (&GraphicsWindow::MenuRequest)
+#define mCon (&Constraint::MenuConstrain)
+#define mFile (&SolveSpaceUI::MenuFile)
+#define mGrp (&Group::MenuGroup)
+#define mAna (&SolveSpaceUI::MenuAnalyze)
+#define mHelp (&SolveSpaceUI::MenuHelp)
+#define DEL DELETE_KEY
+#define ESC ESCAPE_KEY
+#define S SHIFT_MASK
+#define C CTRL_MASK
+#define F(k) (FUNCTION_KEY_BASE+(k))
+#define TN MENU_ITEM_NORMAL
+#define TC MENU_ITEM_CHECK
+#define TR MENU_ITEM_RADIO
+const GraphicsWindow::MenuEntry GraphicsWindow::menu[] = {
+//level
+// label id accel ty fn
+{ 0, "&File", 0, 0, TN, NULL },
+{ 1, "&New", MNU_NEW, C|'N', TN, mFile },
+{ 1, "&Open...", MNU_OPEN, C|'O', TN, mFile },
+{ 1, "Open &Recent", MNU_OPEN_RECENT, 0, TN, mFile },
+{ 1, "&Save", MNU_SAVE, C|'S', TN, mFile },
+{ 1, "Save &As...", MNU_SAVE_AS, 0, TN, mFile },
+{ 1, NULL, 0, 0, TN, NULL },
+{ 1, "Export &Image...", MNU_EXPORT_PNG, 0, TN, mFile },
+{ 1, "Export 2d &View...", MNU_EXPORT_VIEW, 0, TN, mFile },
+{ 1, "Export 2d &Section...", MNU_EXPORT_SECTION, 0, TN, mFile },
+{ 1, "Export 3d &Wireframe...", MNU_EXPORT_WIREFRAME, 0, TN, mFile },
+{ 1, "Export Triangle &Mesh...", MNU_EXPORT_MESH, 0, TN, mFile },
+{ 1, "Export &Surfaces...", MNU_EXPORT_SURFACES,0, TN, mFile },
+{ 1, "Im&port...", MNU_IMPORT ,0, TN, mFile },
+#ifndef __APPLE__
+{ 1, NULL, 0, 0, TN, NULL },
+{ 1, "E&xit", MNU_EXIT, C|'Q', TN, mFile },
+#endif
+
+{ 0, "&Edit", 0, 0, TN, NULL },
+{ 1, "&Undo", MNU_UNDO, C|'Z', TN, mEdit },
+{ 1, "&Redo", MNU_REDO, C|'Y', TN, mEdit },
+{ 1, "Re&generate All", MNU_REGEN_ALL, ' ', TN, mEdit },
+{ 1, NULL, 0, 0, TN, NULL },
+{ 1, "Snap Selection to &Grid", MNU_SNAP_TO_GRID, '.', TN, mEdit },
+{ 1, "Rotate Imported &90°", MNU_ROTATE_90, '9', TN, mEdit },
+{ 1, NULL, 0, 0, TN, NULL },
+{ 1, "Cu&t", MNU_CUT, C|'X', TN, mClip },
+{ 1, "&Copy", MNU_COPY, C|'C', TN, mClip },
+{ 1, "&Paste", MNU_PASTE, C|'V', TN, mClip },
+{ 1, "Paste &Transformed...", MNU_PASTE_TRANSFORM,C|'T', TN, mClip },
+{ 1, "&Delete", MNU_DELETE, DEL, TN, mClip },
+{ 1, NULL, 0, 0, TN, NULL },
+{ 1, "Select &Edge Chain", MNU_SELECT_CHAIN, C|'E', TN, mEdit },
+{ 1, "Select &All", MNU_SELECT_ALL, C|'A', TN, mEdit },
+{ 1, "&Unselect All", MNU_UNSELECT_ALL, ESC, TN, mEdit },
+
+{ 0, "&View", 0, 0, TN, NULL },
+{ 1, "Zoom &In", MNU_ZOOM_IN, '+', TN, mView },
+{ 1, "Zoom &Out", MNU_ZOOM_OUT, '-', TN, mView },
+{ 1, "Zoom To &Fit", MNU_ZOOM_TO_FIT, 'F', TN, mView },
+{ 1, NULL, 0, 0, TN, NULL },
+{ 1, "Align View to &Workplane", MNU_ONTO_WORKPLANE, 'W', TN, mView },
+{ 1, "Nearest &Ortho View", MNU_NEAREST_ORTHO, F(2), TN, mView },
+{ 1, "Nearest &Isometric View", MNU_NEAREST_ISO, F(3), TN, mView },
+{ 1, "&Center View At Point", MNU_CENTER_VIEW, F(4), TN, mView },
+{ 1, NULL, 0, 0, TN, NULL },
+{ 1, "Show Snap &Grid", MNU_SHOW_GRID, '>', TC, mView },
+{ 1, "Use &Perspective Projection", MNU_PERSPECTIVE_PROJ,'`', TC, mView },
+{ 1, NULL, 0, 0, TN, NULL },
+#if defined(__APPLE__)
+{ 1, "Show Menu &Bar", MNU_SHOW_MENU_BAR, C|F(12), TC, mView },
+#endif
+{ 1, "Show &Toolbar", MNU_SHOW_TOOLBAR, 0, TC, mView },
+{ 1, "Show Property Bro&wser", MNU_SHOW_TEXT_WND, '\t', TC, mView },
+{ 1, NULL, 0, 0, TN, NULL },
+{ 1, "Dimensions in &Inches", MNU_UNITS_INCHES, 0, TR, mView },
+{ 1, "Dimensions in &Millimeters", MNU_UNITS_MM, 0, TR, mView },
+#if defined(HAVE_GTK) || defined(__APPLE__)
+{ 1, NULL, 0, 0, TN, NULL },
+{ 1, "&Full Screen", MNU_FULL_SCREEN, C|F(11), TC, mView },
+#endif
+
+{ 0, "&New Group", 0, 0, TN, NULL },
+{ 1, "Sketch In &3d", MNU_GROUP_3D, S|'3', TN, mGrp },
+{ 1, "Sketch In New &Workplane", MNU_GROUP_WRKPL, S|'W', TN, mGrp },
+{ 1, NULL, 0, 0, TN, NULL },
+{ 1, "Step &Translating", MNU_GROUP_TRANS, S|'T', TN, mGrp },
+{ 1, "Step &Rotating", MNU_GROUP_ROT, S|'R', TN, mGrp },
+{ 1, NULL, 0, 0, TN, NULL },
+{ 1, "E&xtrude", MNU_GROUP_EXTRUDE, S|'X', TN, mGrp },
+{ 1, "&Lathe", MNU_GROUP_LATHE, S|'L', TN, mGrp },
+{ 1, NULL, 0, 0, TN, NULL },
+{ 1, "Link / Assemble...", MNU_GROUP_LINK, S|'I', TN, mGrp },
+{ 1, "Link Recent", MNU_GROUP_RECENT, 0, TN, mGrp },
+
+{ 0, "&Sketch", 0, 0, TN, NULL },
+{ 1, "In &Workplane", MNU_SEL_WORKPLANE, '2', TR, mReq },
+{ 1, "Anywhere In &3d", MNU_FREE_IN_3D, '3', TR, mReq },
+{ 1, NULL, 0, 0, TN, NULL },
+{ 1, "Datum &Point", MNU_DATUM_POINT, 'P', TN, mReq },
+{ 1, "&Workplane", MNU_WORKPLANE, 0, TN, mReq },
+{ 1, NULL, 0, 0, TN, NULL },
+{ 1, "Line &Segment", MNU_LINE_SEGMENT, 'S', TN, mReq },
+{ 1, "C&onstruction Line Segment", MNU_CONSTR_SEGMENT, S|'S', TN, mReq },
+{ 1, "&Rectangle", MNU_RECTANGLE, 'R', TN, mReq },
+{ 1, "&Circle", MNU_CIRCLE, 'C', TN, mReq },
+{ 1, "&Arc of a Circle", MNU_ARC, 'A', TN, mReq },
+{ 1, "&Bezier Cubic Spline", MNU_CUBIC, 'B', TN, mReq },
+{ 1, NULL, 0, 0, TN, NULL },
+{ 1, "&Text in TrueType Font", MNU_TTF_TEXT, 'T', TN, mReq },
+{ 1, NULL, 0, 0, TN, NULL },
+{ 1, "To&ggle Construction", MNU_CONSTRUCTION, 'G', TN, mReq },
+{ 1, "Tangent &Arc at Point", MNU_TANGENT_ARC, S|'A', TN, mReq },
+{ 1, "Split Curves at &Intersection", MNU_SPLIT_CURVES, 'I', TN, mReq },
+
+{ 0, "&Constrain", 0, 0, TN, NULL },
+{ 1, "&Distance / Diameter", MNU_DISTANCE_DIA, 'D', TN, mCon },
+{ 1, "Re&ference Dimension", MNU_REF_DISTANCE, S|'D', TN, mCon },
+{ 1, "A&ngle", MNU_ANGLE, 'N', TN, mCon },
+{ 1, "Reference An&gle", MNU_REF_ANGLE, S|'N', TN, mCon },
+{ 1, "Other S&upplementary Angle", MNU_OTHER_ANGLE, 'U', TN, mCon },
+{ 1, "Toggle R&eference Dim", MNU_REFERENCE, 'E', TN, mCon },
+{ 1, NULL, 0, 0, TN, NULL },
+{ 1, "&Horizontal", MNU_HORIZONTAL, 'H', TN, mCon },
+{ 1, "&Vertical", MNU_VERTICAL, 'V', TN, mCon },
+{ 1, NULL, 0, 0, TN, NULL },
+{ 1, "&On Point / Curve / Plane", MNU_ON_ENTITY, 'O', TN, mCon },
+{ 1, "E&qual Length / Radius / Angle", MNU_EQUAL, 'Q', TN, mCon },
+{ 1, "Length Ra&tio", MNU_RATIO, 'Z', TN, mCon },
+{ 1, "Length Diff&erence", MNU_DIFFERENCE, 'J', TN, mCon },
+{ 1, "At &Midpoint", MNU_AT_MIDPOINT, 'M', TN, mCon },
+{ 1, "S&ymmetric", MNU_SYMMETRIC, 'Y', TN, mCon },
+{ 1, "Para&llel / Tangent", MNU_PARALLEL, 'L', TN, mCon },
+{ 1, "&Perpendicular", MNU_PERPENDICULAR, '[', TN, mCon },
+{ 1, "Same Orient&ation", MNU_ORIENTED_SAME, 'X', TN, mCon },
+{ 1, "Lock Point Where &Dragged", MNU_WHERE_DRAGGED, ']', TN, mCon },
+{ 1, NULL, 0, 0, TN, NULL },
+{ 1, "Comment", MNU_COMMENT, ';', TN, mCon },
+
+{ 0, "&Analyze", 0, 0, TN, NULL },
+{ 1, "Measure &Volume", MNU_VOLUME, C|S|'V', TN, mAna },
+{ 1, "Measure &Area", MNU_AREA, C|S|'A', TN, mAna },
+{ 1, "Show &Interfering Parts", MNU_INTERFERENCE, C|S|'I', TN, mAna },
+{ 1, "Show &Naked Edges", MNU_NAKED_EDGES, C|S|'N', TN, mAna },
+{ 1, NULL, 0, 0, TN, NULL },
+{ 1, "Show Degrees of &Freedom", MNU_SHOW_DOF, C|S|'F', TN, mAna },
+{ 1, NULL, 0, 0, TN, NULL },
+{ 1, "&Trace Point", MNU_TRACE_PT, C|S|'T', TN, mAna },
+{ 1, "&Stop Tracing...", MNU_STOP_TRACING, C|S|'S', TN, mAna },
+{ 1, "Step &Dimension...", MNU_STEP_DIM, C|S|'D', TN, mAna },
+
+{ 0, "&Help", 0, 0, TN, NULL },
+{ 1, "&Website / Manual", MNU_WEBSITE, 0, TN, mHelp },
+#ifndef __APPLE__
+{ 1, "&About", MNU_ABOUT, 0, TN, mHelp },
+#endif
+
+{ -1, 0, 0, 0, TN, 0 }
+};
+
+#undef DEL
+#undef ESC
+#undef S
+#undef C
+#undef F
+#undef TN
+#undef TC
+#undef TR
+
+std::string SolveSpace::MakeAcceleratorLabel(int accel) {
+ if(!accel) return "";
+
+ std::string label;
+ if(accel & GraphicsWindow::CTRL_MASK) {
+ label += "Ctrl+";
+ }
+ if(accel & GraphicsWindow::SHIFT_MASK) {
+ label += "Shift+";
+ }
+ if(accel >= GraphicsWindow::FUNCTION_KEY_BASE + 1 &&
+ accel <= GraphicsWindow::FUNCTION_KEY_BASE + 12) {
+ label += ssprintf("F%d", accel - GraphicsWindow::FUNCTION_KEY_BASE);
+ } else if(accel == '\t') {
+ label += "Tab";
+ } else if(accel == ' ') {
+ label += "Space";
+ } else if(accel == GraphicsWindow::ESCAPE_KEY) {
+ label += "Esc";
+ } else if(accel == GraphicsWindow::DELETE_KEY) {
+ label += "Del";
+ } else {
+ label += (char)(accel & 0xff);
+ }
+ return label;
+}
+
+void GraphicsWindow::Init(void) {
+ scale = 5;
+ offset = Vector::From(0, 0, 0);
+ projRight = Vector::From(1, 0, 0);
+ projUp = Vector::From(0, 1, 0);
+
+ // Make sure those are valid; could get a mouse move without a mouse
+ // down if someone depresses the button, then drags into our window.
+ orig.projRight = projRight;
+ orig.projUp = projUp;
+
+ // And with the last group active
+ activeGroup = SK.groupOrder.elem[SK.groupOrder.n - 1];
+ SK.GetGroup(activeGroup)->Activate();
+
+ showWorkplanes = false;
+ showNormals = true;
+ showPoints = true;
+ showConstraints = true;
+ showHdnLines = false;
+ showShaded = true;
+ showEdges = true;
+ showMesh = false;
+ showOutlines = false;
+
+ showTextWindow = true;
+ ShowTextWindow(showTextWindow);
+
+ showSnapGrid = false;
+ context.active = false;
+
+ // Do this last, so that all the menus get updated correctly.
+ ClearSuper();
+}
+
+void GraphicsWindow::AnimateOntoWorkplane(void) {
+ if(!LockedInWorkplane()) return;
+
+ Entity *w = SK.GetEntity(ActiveWorkplane());
+ Quaternion quatf = w->Normal()->NormalGetNum();
+ Vector offsetf = (SK.GetEntity(w->point[0])->PointGetNum()).ScaledBy(-1);
+
+ AnimateOnto(quatf, offsetf);
+}
+
+void GraphicsWindow::AnimateOnto(Quaternion quatf, Vector offsetf) {
+ // Get our initial orientation and translation.
+ Quaternion quat0 = Quaternion::From(projRight, projUp);
+ Vector offset0 = offset;
+
+ // Make sure we take the shorter of the two possible paths.
+ double mp = (quatf.Minus(quat0)).Magnitude();
+ double mm = (quatf.Plus(quat0)).Magnitude();
+ if(mp > mm) {
+ quatf = quatf.ScaledBy(-1);
+ mp = mm;
+ }
+ double mo = (offset0.Minus(offsetf)).Magnitude()*scale;
+
+ // Animate transition, unless it's a tiny move.
+ int32_t dt = (mp < 0.01 && mo < 10) ? (-20) :
+ (int32_t)(100 + 1000*mp + 0.4*mo);
+ // Don't ever animate for longer than 2000 ms; we can get absurdly
+ // long translations (as measured in pixels) if the user zooms out, moves,
+ // and then zooms in again.
+ if(dt > 2000) dt = 2000;
+ int64_t tn, t0 = GetMilliseconds();
+ double s = 0;
+ Quaternion dq = quatf.Times(quat0.Inverse());
+ do {
+ offset = (offset0.ScaledBy(1 - s)).Plus(offsetf.ScaledBy(s));
+ Quaternion quat = (dq.ToThe(s)).Times(quat0);
+ quat = quat.WithMagnitude(1);
+
+ projRight = quat.RotationU();
+ projUp = quat.RotationV();
+ PaintGraphics();
+
+ tn = GetMilliseconds();
+ s = (tn - t0)/((double)dt);
+ } while((tn - t0) < dt);
+
+ projRight = quatf.RotationU();
+ projUp = quatf.RotationV();
+ offset = offsetf;
+ InvalidateGraphics();
+ // If the view screen is open, then we need to refresh it.
+ SS.ScheduleShowTW();
+}
+
+void GraphicsWindow::HandlePointForZoomToFit(Vector p, Point2d *pmax, Point2d *pmin,
+ double *wmin, bool usePerspective)
+{
+ double w;
+ Vector pp = ProjectPoint4(p, &w);
+ // If usePerspective is true, then we calculate a perspective projection of the point.
+ // If not, then we do a parallel projection regardless of the current
+ // scale factor.
+ if(usePerspective) {
+ pp = pp.ScaledBy(1.0/w);
+ }
+
+ pmax->x = max(pmax->x, pp.x);
+ pmax->y = max(pmax->y, pp.y);
+ pmin->x = min(pmin->x, pp.x);
+ pmin->y = min(pmin->y, pp.y);
+ *wmin = min(*wmin, w);
+}
+void GraphicsWindow::LoopOverPoints(const std::vector<Entity *> &entities,
+ const std::vector<hEntity> &faces,
+ Point2d *pmax, Point2d *pmin, double *wmin,
+ bool usePerspective, bool includeMesh) {
+
+ int i, j;
+ for(Entity *e : entities) {
+ if(e->IsPoint()) {
+ HandlePointForZoomToFit(e->PointGetNum(), pmax, pmin, wmin, usePerspective);
+ } else if(e->type == Entity::CIRCLE) {
+ // Lots of entities can extend outside the bbox of their points,
+ // but circles are particularly bad. We want to get things halfway
+ // reasonable without the mesh, because a zoom to fit is used to
+ // set the zoom level to set the chord tol.
+ double r = e->CircleGetRadiusNum();
+ Vector c = SK.GetEntity(e->point[0])->PointGetNum();
+ Quaternion q = SK.GetEntity(e->normal)->NormalGetNum();
+ for(j = 0; j < 4; j++) {
+ Vector p = (j == 0) ? (c.Plus(q.RotationU().ScaledBy( r))) :
+ (j == 1) ? (c.Plus(q.RotationU().ScaledBy(-r))) :
+ (j == 2) ? (c.Plus(q.RotationV().ScaledBy( r))) :
+ (c.Plus(q.RotationV().ScaledBy(-r)));
+ HandlePointForZoomToFit(p, pmax, pmin, wmin, usePerspective);
+ }
+ } else {
+ // We have to iterate children points, because we can select entites without points
+ for(int i = 0; i < MAX_POINTS_IN_ENTITY; i++) {
+ if(e->point[i].v == 0) break;
+ Vector p = SK.GetEntity(e->point[i])->PointGetNum();
+ HandlePointForZoomToFit(p, pmax, pmin, wmin, usePerspective);
+ }
+ }
+ }
+
+ if(!includeMesh && faces.empty()) return;
+
+ Group *g = SK.GetGroup(activeGroup);
+ g->GenerateDisplayItems();
+ for(i = 0; i < g->displayMesh.l.n; i++) {
+ STriangle *tr = &(g->displayMesh.l.elem[i]);
+ if(!includeMesh) {
+ bool found = false;
+ for(const hEntity &face : faces) {
+ if(face.v != tr->meta.face) continue;
+ found = true;
+ break;
+ }
+ if(!found) continue;
+ }
+ HandlePointForZoomToFit(tr->a, pmax, pmin, wmin, usePerspective);
+ HandlePointForZoomToFit(tr->b, pmax, pmin, wmin, usePerspective);
+ HandlePointForZoomToFit(tr->c, pmax, pmin, wmin, usePerspective);
+ }
+ if(!includeMesh) return;
+ for(i = 0; i < g->polyLoops.l.n; i++) {
+ SContour *sc = &(g->polyLoops.l.elem[i]);
+ for(j = 0; j < sc->l.n; j++) {
+ HandlePointForZoomToFit(sc->l.elem[j].p, pmax, pmin, wmin, usePerspective);
+ }
+ }
+}
+void GraphicsWindow::ZoomToFit(bool includingInvisibles, bool useSelection) {
+ std::vector<Entity *> entities;
+ std::vector<hEntity> faces;
+
+ if(useSelection) {
+ for(int i = 0; i < selection.n; i++) {
+ Selection *s = &selection.elem[i];
+ if(s->entity.v == 0) continue;
+ Entity *e = SK.entity.FindById(s->entity);
+ if(e->IsFace()) {
+ faces.push_back(e->h);
+ continue;
+ }
+ entities.push_back(e);
+ }
+ }
+
+ bool selectionUsed = !entities.empty() || !faces.empty();
+
+ if(!selectionUsed) {
+ for(int i = 0; i<SK.entity.n; i++) {
+ Entity *e = &(SK.entity.elem[i]);
+ // we don't want to handle separate points, because we will iterate them inside entities.
+ if(e->IsPoint()) continue;
+ if(!includingInvisibles && !e->IsVisible()) continue;
+ entities.push_back(e);
+ }
+ }
+
+ // On the first run, ignore perspective.
+ Point2d pmax = { -1e12, -1e12 }, pmin = { 1e12, 1e12 };
+ double wmin = 1;
+ LoopOverPoints(entities, faces, &pmax, &pmin, &wmin,
+ /*usePerspective=*/false, /*includeMesh=*/!selectionUsed);
+
+ double xm = (pmax.x + pmin.x)/2, ym = (pmax.y + pmin.y)/2;
+ double dx = pmax.x - pmin.x, dy = pmax.y - pmin.y;
+
+ offset = offset.Plus(projRight.ScaledBy(-xm)).Plus(
+ projUp. ScaledBy(-ym));
+
+ // And based on this, we calculate the scale and offset
+ if(EXACT(dx == 0 && dy == 0)) {
+ scale = 5;
+ } else {
+ double scalex = 1e12, scaley = 1e12;
+ if(EXACT(dx != 0)) scalex = 0.9*width /dx;
+ if(EXACT(dy != 0)) scaley = 0.9*height/dy;
+ scale = min(scalex, scaley);
+
+ scale = min(300.0, scale);
+ scale = max(0.003, scale);
+ }
+
+ // Then do another run, considering the perspective.
+ pmax.x = -1e12; pmax.y = -1e12;
+ pmin.x = 1e12; pmin.y = 1e12;
+ wmin = 1;
+ LoopOverPoints(entities, faces, &pmax, &pmin, &wmin,
+ /*usePerspective=*/true, /*includeMesh=*/!selectionUsed);
+
+ // Adjust the scale so that no points are behind the camera
+ if(wmin < 0.1) {
+ double k = SS.CameraTangent();
+ // w = 1+k*scale*z
+ double zmin = (wmin - 1)/(k*scale);
+ // 0.1 = 1 + k*scale*zmin
+ // (0.1 - 1)/(k*zmin) = scale
+ scale = min(scale, (0.1 - 1)/(k*zmin));
+ }
+}
+
+void GraphicsWindow::MenuView(int id) {
+ switch(id) {
+ case MNU_ZOOM_IN:
+ SS.GW.scale *= 1.2;
+ SS.ScheduleShowTW();
+ break;
+
+ case MNU_ZOOM_OUT:
+ SS.GW.scale /= 1.2;
+ SS.ScheduleShowTW();
+ break;
+
+ case MNU_ZOOM_TO_FIT:
+ SS.GW.ZoomToFit(/*includingInvisibles=*/false, /*useSelection=*/true);
+ SS.ScheduleShowTW();
+ break;
+
+ case MNU_SHOW_GRID:
+ SS.GW.showSnapGrid = !SS.GW.showSnapGrid;
+ if(SS.GW.showSnapGrid && !SS.GW.LockedInWorkplane()) {
+ Message("No workplane is active, so the grid will not "
+ "appear.");
+ }
+ SS.GW.EnsureValidActives();
+ InvalidateGraphics();
+ break;
+
+ case MNU_PERSPECTIVE_PROJ:
+ SS.usePerspectiveProj = !SS.usePerspectiveProj;
+ if(SS.cameraTangent < 1e-6) {
+ Error("The perspective factor is set to zero, so the view will "
+ "always be a parallel projection.\n\n"
+ "For a perspective projection, modify the perspective "
+ "factor in the configuration screen. A value around 0.3 "
+ "is typical.");
+ }
+ SS.GW.EnsureValidActives();
+ InvalidateGraphics();
+ break;
+
+ case MNU_ONTO_WORKPLANE:
+ if(SS.GW.LockedInWorkplane()) {
+ SS.GW.AnimateOntoWorkplane();
+ SS.ScheduleShowTW();
+ break;
+ } // if not in 2d mode fall through and use ORTHO logic
+ case MNU_NEAREST_ORTHO:
+ case MNU_NEAREST_ISO: {
+ static const Vector ortho[3] = {
+ Vector::From(1, 0, 0),
+ Vector::From(0, 1, 0),
+ Vector::From(0, 0, 1)
+ };
+ double sqrt2 = sqrt(2.0), sqrt6 = sqrt(6.0);
+ Quaternion quat0 = Quaternion::From(SS.GW.projRight, SS.GW.projUp);
+ Quaternion quatf = quat0;
+ double dmin = 1e10;
+
+ // There are 24 possible views; 3*2*2*2
+ int i, j, negi, negj;
+ for(i = 0; i < 3; i++) {
+ for(j = 0; j < 3; j++) {
+ if(i == j) continue;
+ for(negi = 0; negi < 2; negi++) {
+ for(negj = 0; negj < 2; negj++) {
+ Vector ou = ortho[i], ov = ortho[j];
+ if(negi) ou = ou.ScaledBy(-1);
+ if(negj) ov = ov.ScaledBy(-1);
+ Vector on = ou.Cross(ov);
+
+ Vector u, v;
+ if(id == MNU_NEAREST_ORTHO || id == MNU_ONTO_WORKPLANE) {
+ u = ou;
+ v = ov;
+ } else {
+ u =
+ ou.ScaledBy(1/sqrt2).Plus(
+ on.ScaledBy(-1/sqrt2));
+ v =
+ ou.ScaledBy(-1/sqrt6).Plus(
+ ov.ScaledBy(2/sqrt6).Plus(
+ on.ScaledBy(-1/sqrt6)));
+ }
+
+ Quaternion quatt = Quaternion::From(u, v);
+ double d = min(
+ (quatt.Minus(quat0)).Magnitude(),
+ (quatt.Plus(quat0)).Magnitude());
+ if(d < dmin) {
+ dmin = d;
+ quatf = quatt;
+ }
+ }
+ }
+ }
+ }
+
+ SS.GW.AnimateOnto(quatf, SS.GW.offset);
+ break;
+ }
+
+ case MNU_CENTER_VIEW:
+ SS.GW.GroupSelection();
+ if(SS.GW.gs.n == 1 && SS.GW.gs.points == 1) {
+ Quaternion quat0;
+ // Offset is the selected point, quaternion is same as before
+ Vector pt = SK.GetEntity(SS.GW.gs.point[0])->PointGetNum();
+ quat0 = Quaternion::From(SS.GW.projRight, SS.GW.projUp);
+ SS.GW.AnimateOnto(quat0, pt.ScaledBy(-1));
+ SS.GW.ClearSelection();
+ } else {
+ Error("Select a point; this point will become the center "
+ "of the view on screen.");
+ }
+ break;
+
+ case MNU_SHOW_MENU_BAR:
+ ToggleMenuBar();
+ SS.GW.EnsureValidActives();
+ InvalidateGraphics();
+ break;
+
+ case MNU_SHOW_TOOLBAR:
+ SS.showToolbar = !SS.showToolbar;
+ SS.GW.EnsureValidActives();
+ InvalidateGraphics();
+ break;
+
+ case MNU_SHOW_TEXT_WND:
+ SS.GW.showTextWindow = !SS.GW.showTextWindow;
+ SS.GW.EnsureValidActives();
+ break;
+
+ case MNU_UNITS_INCHES:
+ SS.viewUnits = SolveSpaceUI::UNIT_INCHES;
+ SS.ScheduleShowTW();
+ SS.GW.EnsureValidActives();
+ break;
+
+ case MNU_UNITS_MM:
+ SS.viewUnits = SolveSpaceUI::UNIT_MM;
+ SS.ScheduleShowTW();
+ SS.GW.EnsureValidActives();
+ break;
+
+ case MNU_FULL_SCREEN:
+ ToggleFullScreen();
+ SS.GW.EnsureValidActives();
+ break;
+
+ default: oops();
+ }
+ InvalidateGraphics();
+}
+
+void GraphicsWindow::EnsureValidActives(void) {
+ bool change = false;
+ // The active group must exist, and not be the references.
+ Group *g = SK.group.FindByIdNoOops(activeGroup);
+ if((!g) || (g->h.v == Group::HGROUP_REFERENCES.v)) {
+ int i;
+ for(i = 0; i < SK.groupOrder.n; i++) {
+ if(SK.groupOrder.elem[i].v != Group::HGROUP_REFERENCES.v) {
+ break;
+ }
+ }
+ if(i >= SK.groupOrder.n) {
+ // This can happen if the user deletes all the groups in the
+ // sketch. It's difficult to prevent that, because the last
+ // group might have been deleted automatically, because it failed
+ // a dependency. There needs to be something, so create a plane
+ // drawing group and activate that. They should never be able
+ // to delete the references, though.
+ activeGroup = SS.CreateDefaultDrawingGroup();
+ // We've created the default group, but not the workplane entity;
+ // do it now so that drawing mode isn't switched to "Free in 3d".
+ SS.GenerateAll(SolveSpaceUI::GENERATE_ALL);
+ } else {
+ activeGroup = SK.groupOrder.elem[i];
+ }
+ SK.GetGroup(activeGroup)->Activate();
+ change = true;
+ }
+
+ // The active coordinate system must also exist.
+ if(LockedInWorkplane()) {
+ Entity *e = SK.entity.FindByIdNoOops(ActiveWorkplane());
+ if(e) {
+ hGroup hgw = e->group;
+ if(hgw.v != activeGroup.v && SS.GroupsInOrder(activeGroup, hgw)) {
+ // The active workplane is in a group that comes after the
+ // active group; so any request or constraint will fail.
+ SetWorkplaneFreeIn3d();
+ change = true;
+ }
+ } else {
+ SetWorkplaneFreeIn3d();
+ change = true;
+ }
+ }
+
+ // And update the checked state for various menus
+ bool locked = LockedInWorkplane();
+ RadioMenuById(MNU_FREE_IN_3D, !locked);
+ RadioMenuById(MNU_SEL_WORKPLANE, locked);
+
+ SS.UndoEnableMenus();
+
+ switch(SS.viewUnits) {
+ case SolveSpaceUI::UNIT_MM:
+ case SolveSpaceUI::UNIT_INCHES:
+ break;
+ default:
+ SS.viewUnits = SolveSpaceUI::UNIT_MM;
+ break;
+ }
+ RadioMenuById(MNU_UNITS_MM, SS.viewUnits == SolveSpaceUI::UNIT_MM);
+ RadioMenuById(MNU_UNITS_INCHES, SS.viewUnits == SolveSpaceUI::UNIT_INCHES);
+
+ ShowTextWindow(SS.GW.showTextWindow);
+ CheckMenuById(MNU_SHOW_TEXT_WND, SS.GW.showTextWindow);
+
+#if defined(__APPLE__)
+ CheckMenuById(MNU_SHOW_MENU_BAR, MenuBarIsVisible());
+#endif
+ CheckMenuById(MNU_SHOW_TOOLBAR, SS.showToolbar);
+ CheckMenuById(MNU_PERSPECTIVE_PROJ, SS.usePerspectiveProj);
+ CheckMenuById(MNU_SHOW_GRID, SS.GW.showSnapGrid);
+#if defined(HAVE_GTK) || defined(__APPLE__)
+ CheckMenuById(MNU_FULL_SCREEN, FullScreenIsActive());
+#endif
+
+ if(change) SS.ScheduleShowTW();
+}
+
+void GraphicsWindow::SetWorkplaneFreeIn3d(void) {
+ SK.GetGroup(activeGroup)->activeWorkplane = Entity::FREE_IN_3D;
+}
+hEntity GraphicsWindow::ActiveWorkplane(void) {
+ Group *g = SK.group.FindByIdNoOops(activeGroup);
+ if(g) {
+ return g->activeWorkplane;
+ } else {
+ return Entity::FREE_IN_3D;
+ }
+}
+bool GraphicsWindow::LockedInWorkplane(void) {
+ return (SS.GW.ActiveWorkplane().v != Entity::FREE_IN_3D.v);
+}
+
+void GraphicsWindow::ForceTextWindowShown(void) {
+ if(!showTextWindow) {
+ showTextWindow = true;
+ CheckMenuById(MNU_SHOW_TEXT_WND, true);
+ ShowTextWindow(true);
+ }
+}
+
+void GraphicsWindow::DeleteTaggedRequests(void) {
+ // Rewrite any point-coincident constraints that were affected by this
+ // deletion.
+ Request *r;
+ for(r = SK.request.First(); r; r = SK.request.NextAfter(r)) {
+ if(!r->tag) continue;
+ FixConstraintsForRequestBeingDeleted(r->h);
+ }
+ // and then delete the tagged requests.
+ SK.request.RemoveTagged();
+
+ // An edit might be in progress for the just-deleted item. So
+ // now it's not.
+ HideGraphicsEditControl();
+ SS.TW.HideEditControl();
+ // And clear out the selection, which could contain that item.
+ ClearSuper();
+ // And regenerate to get rid of what it generates, plus anything
+ // that references it (since the regen code checks for that).
+ SS.GenerateAll(SolveSpaceUI::GENERATE_ALL);
+ EnsureValidActives();
+ SS.ScheduleShowTW();
+}
+
+Vector GraphicsWindow::SnapToGrid(Vector p) {
+ if(!LockedInWorkplane()) return p;
+
+ EntityBase *wrkpl = SK.GetEntity(ActiveWorkplane()),
+ *norm = wrkpl->Normal();
+ Vector wo = SK.GetEntity(wrkpl->point[0])->PointGetNum(),
+ wu = norm->NormalU(),
+ wv = norm->NormalV(),
+ wn = norm->NormalN();
+
+ Vector pp = (p.Minus(wo)).DotInToCsys(wu, wv, wn);
+ pp.x = floor((pp.x / SS.gridSpacing) + 0.5)*SS.gridSpacing;
+ pp.y = floor((pp.y / SS.gridSpacing) + 0.5)*SS.gridSpacing;
+ pp.z = 0;
+
+ return pp.ScaleOutOfCsys(wu, wv, wn).Plus(wo);
+}
+
+void GraphicsWindow::MenuEdit(int id) {
+ switch(id) {
+ case MNU_UNSELECT_ALL:
+ SS.GW.GroupSelection();
+ // If there's nothing selected to de-select, and no operation
+ // to cancel, then perhaps they want to return to the home
+ // screen in the text window.
+ if(SS.GW.gs.n == 0 &&
+ SS.GW.gs.constraints == 0 &&
+ SS.GW.pending.operation == 0)
+ {
+ if(!(TextEditControlIsVisible() ||
+ GraphicsEditControlIsVisible()))
+ {
+ if(SS.TW.shown.screen == TextWindow::SCREEN_STYLE_INFO) {
+ SS.TW.GoToScreen(TextWindow::SCREEN_LIST_OF_STYLES);
+ } else {
+ SS.TW.ClearSuper();
+ }
+ }
+ }
+ SS.GW.ClearSuper();
+ SS.TW.HideEditControl();
+ SS.nakedEdges.Clear();
+ SS.justExportedInfo.draw = false;
+ // This clears the marks drawn to indicate which points are
+ // still free to drag.
+ Param *p;
+ for(p = SK.param.First(); p; p = SK.param.NextAfter(p)) {
+ p->free = false;
+ }
+ if(SS.exportMode) {
+ SS.exportMode = false;
+ SS.GenerateAll(SolveSpaceUI::GENERATE_ALL);
+ }
+ break;
+
+ case MNU_SELECT_ALL: {
+ Entity *e;
+ for(e = SK.entity.First(); e; e = SK.entity.NextAfter(e)) {
+ if(e->group.v != SS.GW.activeGroup.v) continue;
+ if(e->IsFace() || e->IsDistance()) continue;
+ if(!e->IsVisible()) continue;
+
+ SS.GW.MakeSelected(e->h);
+ }
+ InvalidateGraphics();
+ SS.ScheduleShowTW();
+ break;
+ }
+
+ case MNU_SELECT_CHAIN: {
+ Entity *e;
+ int newlySelected = 0;
+ bool didSomething;
+ do {
+ didSomething = false;
+ for(e = SK.entity.First(); e; e = SK.entity.NextAfter(e)) {
+ if(e->group.v != SS.GW.activeGroup.v) continue;
+ if(!e->HasEndpoints()) continue;
+ if(!e->IsVisible()) continue;
+
+ Vector st = e->EndpointStart(),
+ fi = e->EndpointFinish();
+
+ bool onChain = false, alreadySelected = false;
+ List<Selection> *ls = &(SS.GW.selection);
+ for(Selection *s = ls->First(); s; s = ls->NextAfter(s)) {
+ if(!s->entity.v) continue;
+ if(s->entity.v == e->h.v) {
+ alreadySelected = true;
+ continue;
+ }
+ Entity *se = SK.GetEntity(s->entity);
+ if(!se->HasEndpoints()) continue;
+
+ Vector sst = se->EndpointStart(),
+ sfi = se->EndpointFinish();
+
+ if(sst.Equals(st) || sst.Equals(fi) ||
+ sfi.Equals(st) || sfi.Equals(fi))
+ {
+ onChain = true;
+ }
+ }
+ if(onChain && !alreadySelected) {
+ SS.GW.MakeSelected(e->h);
+ newlySelected++;
+ didSomething = true;
+ }
+ }
+ } while(didSomething);
+ if(newlySelected == 0) {
+ Error("No additional entities share endpoints with the "
+ "selected entities.");
+ }
+ InvalidateGraphics();
+ SS.ScheduleShowTW();
+ break;
+ }
+
+ case MNU_ROTATE_90: {
+ SS.GW.GroupSelection();
+ Entity *e = NULL;
+ if(SS.GW.gs.n == 1 && SS.GW.gs.points == 1) {
+ e = SK.GetEntity(SS.GW.gs.point[0]);
+ } else if(SS.GW.gs.n == 1 && SS.GW.gs.entities == 1) {
+ e = SK.GetEntity(SS.GW.gs.entity[0]);
+ }
+ SS.GW.ClearSelection();
+
+ hGroup hg = e ? e->group : SS.GW.activeGroup;
+ Group *g = SK.GetGroup(hg);
+ if(g->type != Group::LINKED) {
+ Error("To use this command, select a point or other "
+ "entity from an linked part, or make a link "
+ "group the active group.");
+ break;
+ }
+
+
+ SS.UndoRemember();
+ // Rotate by ninety degrees about the coordinate axis closest
+ // to the screen normal.
+ Vector norm = SS.GW.projRight.Cross(SS.GW.projUp);
+ norm = norm.ClosestOrtho();
+ norm = norm.WithMagnitude(1);
+ Quaternion qaa = Quaternion::From(norm, PI/2);
+
+ g->TransformImportedBy(Vector::From(0, 0, 0), qaa);
+
+ // and regenerate as necessary.
+ SS.MarkGroupDirty(hg);
+ SS.GenerateAll();
+ break;
+ }
+
+ case MNU_SNAP_TO_GRID: {
+ if(!SS.GW.LockedInWorkplane()) {
+ Error("No workplane is active. Select a workplane to define "
+ "the plane for the snap grid.");
+ break;
+ }
+ SS.GW.GroupSelection();
+ if(SS.GW.gs.points == 0 && SS.GW.gs.constraintLabels == 0) {
+ Error("Can't snap these items to grid; select points, "
+ "text comments, or constraints with a label. "
+ "To snap a line, select its endpoints.");
+ break;
+ }
+ SS.UndoRemember();
+
+ List<Selection> *ls = &(SS.GW.selection);
+ for(Selection *s = ls->First(); s; s = ls->NextAfter(s)) {
+ if(s->entity.v) {
+ hEntity hp = s->entity;
+ Entity *ep = SK.GetEntity(hp);
+ if(!ep->IsPoint()) continue;
+
+ Vector p = ep->PointGetNum();
+ ep->PointForceTo(SS.GW.SnapToGrid(p));
+ SS.GW.pending.points.Add(&hp);
+ SS.MarkGroupDirty(ep->group);
+ } else if(s->constraint.v) {
+ Constraint *c = SK.GetConstraint(s->constraint);
+ Vector refp = c->GetReferencePos();
+ c->disp.offset = c->disp.offset.Plus(SS.GW.SnapToGrid(refp).Minus(refp));
+ }
+ }
+ // Regenerate, with these points marked as dragged so that they
+ // get placed as close as possible to our snap grid.
+ SS.GenerateAll();
+ SS.GW.ClearPending();
+
+ SS.GW.ClearSelection();
+ InvalidateGraphics();
+ break;
+ }
+
+ case MNU_UNDO:
+ SS.UndoUndo();
+ break;
+
+ case MNU_REDO:
+ SS.UndoRedo();
+ break;
+
+ case MNU_REGEN_ALL:
+ SS.ReloadAllImported();
+ SS.GenerateAll(SolveSpaceUI::GENERATE_UNTIL_ACTIVE);
+ SS.ScheduleShowTW();
+ break;
+
+ default: oops();
+ }
+}
+
+void GraphicsWindow::MenuRequest(int id) {
+ const char *s;
+ switch(id) {
+ case MNU_SEL_WORKPLANE: {
+ SS.GW.GroupSelection();
+ Group *g = SK.GetGroup(SS.GW.activeGroup);
+
+ if(SS.GW.gs.n == 1 && SS.GW.gs.workplanes == 1) {
+ // A user-selected workplane
+ g->activeWorkplane = SS.GW.gs.entity[0];
+ } else if(g->type == Group::DRAWING_WORKPLANE) {
+ // The group's default workplane
+ g->activeWorkplane = g->h.entity(0);
+ Message("No workplane selected. Activating default workplane "
+ "for this group.");
+ }
+
+ if(!SS.GW.LockedInWorkplane()) {
+ Error("No workplane is selected, and the active group does "
+ "not have a default workplane. Try selecting a "
+ "workplane, or activating a sketch-in-new-workplane "
+ "group.");
+ break;
+ }
+ // Align the view with the selected workplane
+ SS.GW.AnimateOntoWorkplane();
+ SS.GW.ClearSuper();
+ SS.ScheduleShowTW();
+ break;
+ }
+ case MNU_FREE_IN_3D:
+ SS.GW.SetWorkplaneFreeIn3d();
+ SS.GW.EnsureValidActives();
+ SS.ScheduleShowTW();
+ InvalidateGraphics();
+ break;
+
+ case MNU_TANGENT_ARC:
+ SS.GW.GroupSelection();
+ if(SS.GW.gs.n == 1 && SS.GW.gs.points == 1) {
+ SS.GW.MakeTangentArc();
+ } else if(SS.GW.gs.n != 0) {
+ Error("Bad selection for tangent arc at point. Select a "
+ "single point, or select nothing to set up arc "
+ "parameters.");
+ } else {
+ SS.TW.GoToScreen(TextWindow::SCREEN_TANGENT_ARC);
+ SS.GW.ForceTextWindowShown();
+ SS.ScheduleShowTW();
+ InvalidateGraphics(); // repaint toolbar
+ }
+ break;
+
+ case MNU_ARC: s = "click point on arc (draws anti-clockwise)"; goto c;
+ case MNU_DATUM_POINT: s = "click to place datum point"; goto c;
+ case MNU_LINE_SEGMENT: s = "click first point of line segment"; goto c;
+ case MNU_CONSTR_SEGMENT: s = "click first point of construction line segment"; goto c;
+ case MNU_CUBIC: s = "click first point of cubic segment"; goto c;
+ case MNU_CIRCLE: s = "click center of circle"; goto c;
+ case MNU_WORKPLANE: s = "click origin of workplane"; goto c;
+ case MNU_RECTANGLE: s = "click one corner of rectangle"; goto c;
+ case MNU_TTF_TEXT: s = "click top left of text"; goto c;
+c:
+ SS.GW.pending.operation = id;
+ SS.GW.pending.description = s;
+ SS.ScheduleShowTW();
+ InvalidateGraphics(); // repaint toolbar
+ break;
+
+ case MNU_CONSTRUCTION: {
+ SS.UndoRemember();
+ SS.GW.GroupSelection();
+ if(SS.GW.gs.entities == 0) {
+ Error("No entities are selected. Select entities before "
+ "trying to toggle their construction state.");
+ }
+ int i;
+ for(i = 0; i < SS.GW.gs.entities; i++) {
+ hEntity he = SS.GW.gs.entity[i];
+ if(!he.isFromRequest()) continue;
+ Request *r = SK.GetRequest(he.request());
+ r->construction = !(r->construction);
+ SS.MarkGroupDirty(r->group);
+ }
+ SS.GW.ClearSelection();
+ SS.GenerateAll();
+ break;
+ }
+
+ case MNU_SPLIT_CURVES:
+ SS.GW.SplitLinesOrCurves();
+ break;
+
+ default: oops();
+ }
+}
+
+void GraphicsWindow::ClearSuper(void) {
+ HideGraphicsEditControl();
+ ClearPending();
+ ClearSelection();
+ hover.Clear();
+ EnsureValidActives();
+}
+
+void GraphicsWindow::ToggleBool(bool *v) {
+ *v = !*v;
+
+ // The faces are shown as special stippling on the shaded triangle mesh,
+ // so not meaningful to show them and hide the shaded.
+ if(!showShaded) showFaces = false;
+
+ // We might need to regenerate the mesh and edge list, since the edges
+ // wouldn't have been generated if they were previously hidden.
+ if(showEdges) (SK.GetGroup(activeGroup))->displayDirty = true;
+
+ SS.GenerateAll();
+ InvalidateGraphics();
+ SS.ScheduleShowTW();
+}
+
+GraphicsWindow::SuggestedConstraint GraphicsWindow::SuggestLineConstraint(hRequest request) {
+ if(LockedInWorkplane()) {
+ Entity *ptA = SK.GetEntity(request.entity(1)),
+ *ptB = SK.GetEntity(request.entity(2));
+
+ Expr *au, *av, *bu, *bv;
+
+ ptA->PointGetExprsInWorkplane(ActiveWorkplane(), &au, &av);
+ ptB->PointGetExprsInWorkplane(ActiveWorkplane(), &bu, &bv);
+
+ double du = au->Minus(bu)->Eval();
+ double dv = av->Minus(bv)->Eval();
+
+ const double TOLERANCE_RATIO = 0.02;
+ if(fabs(dv) > LENGTH_EPS && fabs(du / dv) < TOLERANCE_RATIO)
+ return SUGGESTED_VERTICAL;
+ else if(fabs(du) > LENGTH_EPS && fabs(dv / du) < TOLERANCE_RATIO)
+ return SUGGESTED_HORIZONTAL;
+ else
+ return SUGGESTED_NONE;
+ } else {
+ return SUGGESTED_NONE;
+ }
+}
--- /dev/null
+//-----------------------------------------------------------------------------
+// Implementation of the Group class, which represents a set of entities and
+// constraints that are solved together, in some cases followed by another
+// operation, like to extrude surfaces from the entities or to step and
+// repeat them parametrically.
+//
+// Copyright 2008-2013 Jonathan Westhues.
+//-----------------------------------------------------------------------------
+#include "solvespace.h"
+
+const hParam Param::NO_PARAM = { 0 };
+#define NO_PARAM (Param::NO_PARAM)
+
+const hGroup Group::HGROUP_REFERENCES = { 1 };
+
+#define gs (SS.GW.gs)
+
+//-----------------------------------------------------------------------------
+// The group structure includes pointers to other dynamically-allocated
+// memory. This clears and frees them all.
+//-----------------------------------------------------------------------------
+void Group::Clear(void) {
+ polyLoops.Clear();
+ bezierLoops.Clear();
+ bezierOpens.Clear();
+ thisMesh.Clear();
+ runningMesh.Clear();
+ thisShell.Clear();
+ runningShell.Clear();
+ displayMesh.Clear();
+ displayEdges.Clear();
+ displayOutlines.Clear();
+ impMesh.Clear();
+ impShell.Clear();
+ impEntity.Clear();
+ // remap is the only one that doesn't get recreated when we regen
+ remap.Clear();
+}
+
+void Group::AddParam(IdList<Param,hParam> *param, hParam hp, double v) {
+ Param pa = {};
+ pa.h = hp;
+ pa.val = v;
+
+ param->Add(&pa);
+}
+
+bool Group::IsVisible(void) {
+ if(!visible) return false;
+ if(SS.GroupsInOrder(SS.GW.activeGroup, h)) return false;
+ return true;
+}
+
+int Group::GetNumConstraints(void) {
+ int num = 0;
+ for(int i = 0; i < SK.constraint.n; i++) {
+ Constraint *c = &SK.constraint.elem[i];
+ if(c->group.v != h.v) continue;
+ num++;
+ }
+ return num;
+}
+
+Vector Group::ExtrusionGetVector() {
+ return Vector::From(h.param(0), h.param(1), h.param(2));
+}
+
+void Group::ExtrusionForceVectorTo(const Vector &v) {
+ SK.GetParam(h.param(0))->val = v.x;
+ SK.GetParam(h.param(1))->val = v.y;
+ SK.GetParam(h.param(2))->val = v.z;
+}
+
+void Group::MenuGroup(int id) {
+ Group g = {};
+ g.visible = true;
+ g.color = RGBi(100, 100, 100);
+ g.scale = 1;
+
+ if(id >= RECENT_LINK && id < (RECENT_LINK + MAX_RECENT)) {
+ g.linkFile = RecentFile[id-RECENT_LINK];
+ id = GraphicsWindow::MNU_GROUP_LINK;
+ }
+
+ SS.GW.GroupSelection();
+
+ switch(id) {
+ case GraphicsWindow::MNU_GROUP_3D:
+ g.type = DRAWING_3D;
+ g.name = "sketch-in-3d";
+ break;
+
+ case GraphicsWindow::MNU_GROUP_WRKPL:
+ g.type = DRAWING_WORKPLANE;
+ g.name = "sketch-in-plane";
+ if(gs.points == 1 && gs.n == 1) {
+ g.subtype = WORKPLANE_BY_POINT_ORTHO;
+
+ Vector u = SS.GW.projRight, v = SS.GW.projUp;
+ u = u.ClosestOrtho();
+ v = v.Minus(u.ScaledBy(v.Dot(u)));
+ v = v.ClosestOrtho();
+
+ g.predef.q = Quaternion::From(u, v);
+ g.predef.origin = gs.point[0];
+ } else if(gs.points == 1 && gs.lineSegments == 2 && gs.n == 3) {
+ g.subtype = WORKPLANE_BY_LINE_SEGMENTS;
+
+ g.predef.origin = gs.point[0];
+ g.predef.entityB = gs.entity[0];
+ g.predef.entityC = gs.entity[1];
+
+ Vector ut = SK.GetEntity(g.predef.entityB)->VectorGetNum();
+ Vector vt = SK.GetEntity(g.predef.entityC)->VectorGetNum();
+ ut = ut.WithMagnitude(1);
+ vt = vt.WithMagnitude(1);
+
+ if(fabs(SS.GW.projUp.Dot(vt)) < fabs(SS.GW.projUp.Dot(ut))) {
+ swap(ut, vt);
+ g.predef.swapUV = true;
+ }
+ if(SS.GW.projRight.Dot(ut) < 0) g.predef.negateU = true;
+ if(SS.GW.projUp. Dot(vt) < 0) g.predef.negateV = true;
+ } else {
+ Error("Bad selection for new sketch in workplane. This "
+ "group can be created with:\n\n"
+ " * a point (orthogonal to coordinate axes, "
+ "through the point)\n"
+ " * a point and two line segments (parallel to the "
+ "lines, through the point)\n");
+ return;
+ }
+ break;
+
+ case GraphicsWindow::MNU_GROUP_EXTRUDE:
+ if(!SS.GW.LockedInWorkplane()) {
+ Error("Select a workplane (Sketch -> In Workplane) before "
+ "extruding. The sketch will be extruded normal to the "
+ "workplane.");
+ return;
+ }
+ g.type = EXTRUDE;
+ g.opA = SS.GW.activeGroup;
+ g.predef.entityB = SS.GW.ActiveWorkplane();
+ g.subtype = ONE_SIDED;
+ g.name = "extrude";
+ break;
+
+ case GraphicsWindow::MNU_GROUP_LATHE:
+ if(gs.points == 1 && gs.vectors == 1 && gs.n == 2) {
+ g.predef.origin = gs.point[0];
+ g.predef.entityB = gs.vector[0];
+ } else if(gs.lineSegments == 1 && gs.n == 1) {
+ g.predef.origin = SK.GetEntity(gs.entity[0])->point[0];
+ g.predef.entityB = gs.entity[0];
+ // since a line segment is a vector
+ } else {
+ Error("Bad selection for new lathe group. This group can "
+ "be created with:\n\n"
+ " * a point and a line segment or normal "
+ "(revolved about an axis parallel to line / "
+ "normal, through point)\n"
+ " * a line segment (revolved about line segment)\n");
+ return;
+ }
+ g.type = LATHE;
+ g.opA = SS.GW.activeGroup;
+ g.name = "lathe";
+ break;
+
+ case GraphicsWindow::MNU_GROUP_ROT: {
+ if(gs.points == 1 && gs.n == 1 && SS.GW.LockedInWorkplane()) {
+ g.predef.origin = gs.point[0];
+ Entity *w = SK.GetEntity(SS.GW.ActiveWorkplane());
+ g.predef.entityB = w->Normal()->h;
+ g.activeWorkplane = w->h;
+ } else if(gs.points == 1 && gs.vectors == 1 && gs.n == 2) {
+ g.predef.origin = gs.point[0];
+ g.predef.entityB = gs.vector[0];
+ } else {
+ Error("Bad selection for new rotation. This group can "
+ "be created with:\n\n"
+ " * a point, while locked in workplane (rotate "
+ "in plane, about that point)\n"
+ " * a point and a line or a normal (rotate about "
+ "an axis through the point, and parallel to "
+ "line / normal)\n");
+ return;
+ }
+ g.type = ROTATE;
+ g.opA = SS.GW.activeGroup;
+ g.valA = 3;
+ g.subtype = ONE_SIDED;
+ g.name = "rotate";
+ break;
+ }
+
+ case GraphicsWindow::MNU_GROUP_TRANS:
+ g.type = TRANSLATE;
+ g.opA = SS.GW.activeGroup;
+ g.valA = 3;
+ g.subtype = ONE_SIDED;
+ g.predef.entityB = SS.GW.ActiveWorkplane();
+ g.activeWorkplane = SS.GW.ActiveWorkplane();
+ g.name = "translate";
+ break;
+
+ case GraphicsWindow::MNU_GROUP_LINK: {
+ g.type = LINKED;
+ if(g.linkFile.empty()) {
+ if(!GetOpenFile(&g.linkFile, "", SlvsFileFilter)) return;
+ }
+
+ // Assign the default name of the group based on the name of
+ // the linked file.
+ std::string groupName = g.linkFile;
+ size_t pos;
+
+ pos = groupName.rfind(PATH_SEP);
+ if(pos != std::string::npos)
+ groupName.erase(0, pos + 1);
+
+ pos = groupName.rfind('.');
+ if(pos != std::string::npos)
+ groupName.erase(pos);
+
+ for(size_t i = 0; i < groupName.length(); i++) {
+ if(!(isalnum(groupName[i]) || (unsigned)groupName[i] >= 0x80)) {
+ // convert punctuation to dashes
+ groupName[i] = '-';
+ }
+ }
+
+ if(groupName.length() > 0) {
+ g.name = groupName;
+ } else {
+ g.name = "link";
+ }
+
+ g.meshCombine = COMBINE_AS_ASSEMBLE;
+ break;
+ }
+
+ default: oops();
+ }
+
+ // Copy color from the previous mesh-contributing group.
+ if(g.IsMeshGroup() && SK.groupOrder.n > 0) {
+ Group *running = SK.GetRunningMeshGroupFor(SS.GW.activeGroup);
+ if(running != NULL) {
+ g.color = running->color;
+ }
+ }
+
+ SS.GW.ClearSelection();
+ SS.UndoRemember();
+
+ bool afterActive = false;
+ for(int i = 0; i < SK.groupOrder.n; i++) {
+ Group *gi = SK.GetGroup(SK.groupOrder.elem[i]);
+ if(afterActive)
+ gi->order += 1;
+ if(gi->h.v == SS.GW.activeGroup.v) {
+ g.order = gi->order + 1;
+ afterActive = true;
+ }
+ }
+
+ SK.group.AddAndAssignId(&g);
+ Group *gg = SK.GetGroup(g.h);
+
+ if(gg->type == LINKED) {
+ SS.ReloadAllImported();
+ }
+ gg->clean = false;
+ SS.GW.activeGroup = gg->h;
+ SS.GenerateAll();
+ if(gg->type == DRAWING_WORKPLANE) {
+ // Can't set the active workplane for this one until after we've
+ // regenerated, because the workplane doesn't exist until then.
+ gg->activeWorkplane = gg->h.entity(0);
+ }
+ gg->Activate();
+ SS.GW.AnimateOntoWorkplane();
+ TextWindow::ScreenSelectGroup(0, gg->h.v);
+ SS.ScheduleShowTW();
+}
+
+void Group::TransformImportedBy(Vector t, Quaternion q) {
+ if(type != LINKED) oops();
+
+ hParam tx, ty, tz, qw, qx, qy, qz;
+ tx = h.param(0);
+ ty = h.param(1);
+ tz = h.param(2);
+ qw = h.param(3);
+ qx = h.param(4);
+ qy = h.param(5);
+ qz = h.param(6);
+
+ Quaternion qg = Quaternion::From(qw, qx, qy, qz);
+ qg = q.Times(qg);
+
+ Vector tg = Vector::From(tx, ty, tz);
+ tg = tg.Plus(t);
+
+ SK.GetParam(tx)->val = tg.x;
+ SK.GetParam(ty)->val = tg.y;
+ SK.GetParam(tz)->val = tg.z;
+
+ SK.GetParam(qw)->val = qg.w;
+ SK.GetParam(qx)->val = qg.vx;
+ SK.GetParam(qy)->val = qg.vy;
+ SK.GetParam(qz)->val = qg.vz;
+}
+
+std::string Group::DescriptionString(void) {
+ if(name.empty()) {
+ return ssprintf("g%03x-(unnamed)", h.v);
+ } else {
+ return ssprintf("g%03x-%s", h.v, name.c_str());
+ }
+}
+
+void Group::Activate(void) {
+ if(type == EXTRUDE || type == LINKED || type == LATHE || type == TRANSLATE || type == ROTATE) {
+ SS.GW.showFaces = true;
+ } else {
+ SS.GW.showFaces = false;
+ }
+ SS.MarkGroupDirty(h); // for good measure; shouldn't be needed
+ SS.ScheduleGenerateAll();
+ SS.ScheduleShowTW();
+}
+
+void Group::Generate(IdList<Entity,hEntity> *entity,
+ IdList<Param,hParam> *param)
+{
+ Vector gn = (SS.GW.projRight).Cross(SS.GW.projUp);
+ Vector gp = SS.GW.projRight.Plus(SS.GW.projUp);
+ Vector gc = (SS.GW.offset).ScaledBy(-1);
+ gn = gn.WithMagnitude(200/SS.GW.scale);
+ gp = gp.WithMagnitude(200/SS.GW.scale);
+ int a, i;
+ switch(type) {
+ case DRAWING_3D:
+ break;
+
+ case DRAWING_WORKPLANE: {
+ Quaternion q;
+ if(subtype == WORKPLANE_BY_LINE_SEGMENTS) {
+ Vector u = SK.GetEntity(predef.entityB)->VectorGetNum();
+ Vector v = SK.GetEntity(predef.entityC)->VectorGetNum();
+ u = u.WithMagnitude(1);
+ Vector n = u.Cross(v);
+ v = (n.Cross(u)).WithMagnitude(1);
+
+ if(predef.swapUV) swap(u, v);
+ if(predef.negateU) u = u.ScaledBy(-1);
+ if(predef.negateV) v = v.ScaledBy(-1);
+ q = Quaternion::From(u, v);
+ } else if(subtype == WORKPLANE_BY_POINT_ORTHO) {
+ // Already given, numerically.
+ q = predef.q;
+ } else oops();
+
+ Entity normal = {};
+ normal.type = Entity::NORMAL_N_COPY;
+ normal.numNormal = q;
+ normal.point[0] = h.entity(2);
+ normal.group = h;
+ normal.h = h.entity(1);
+ entity->Add(&normal);
+
+ Entity point = {};
+ point.type = Entity::POINT_N_COPY;
+ point.numPoint = SK.GetEntity(predef.origin)->PointGetNum();
+ point.group = h;
+ point.h = h.entity(2);
+ entity->Add(&point);
+
+ Entity wp = {};
+ wp.type = Entity::WORKPLANE;
+ wp.normal = normal.h;
+ wp.point[0] = point.h;
+ wp.group = h;
+ wp.h = h.entity(0);
+ entity->Add(&wp);
+ break;
+ }
+
+ case EXTRUDE: {
+ AddParam(param, h.param(0), gn.x);
+ AddParam(param, h.param(1), gn.y);
+ AddParam(param, h.param(2), gn.z);
+ int ai, af;
+ if(subtype == ONE_SIDED) {
+ ai = 0; af = 2;
+ } else if(subtype == TWO_SIDED) {
+ ai = -1; af = 1;
+ } else oops();
+
+ // Get some arbitrary point in the sketch, that will be used
+ // as a reference when defining top and bottom faces.
+ hEntity pt = { 0 };
+ for(i = 0; i < entity->n; i++) {
+ Entity *e = &(entity->elem[i]);
+ if(e->group.v != opA.v) continue;
+
+ if(e->IsPoint()) pt = e->h;
+
+ e->CalculateNumerical(false);
+ hEntity he = e->h; e = NULL;
+ // As soon as I call CopyEntity, e may become invalid! That
+ // adds entities, which may cause a realloc.
+ CopyEntity(entity, SK.GetEntity(he), ai, REMAP_BOTTOM,
+ h.param(0), h.param(1), h.param(2),
+ NO_PARAM, NO_PARAM, NO_PARAM, NO_PARAM,
+ true, false);
+ CopyEntity(entity, SK.GetEntity(he), af, REMAP_TOP,
+ h.param(0), h.param(1), h.param(2),
+ NO_PARAM, NO_PARAM, NO_PARAM, NO_PARAM,
+ true, false);
+ MakeExtrusionLines(entity, he);
+ }
+ // Remapped versions of that arbitrary point will be used to
+ // provide points on the plane faces.
+ MakeExtrusionTopBottomFaces(entity, pt);
+ break;
+ }
+
+ case LATHE: {
+ Vector axis_pos = SK.GetEntity(predef.origin)->PointGetNum();
+ Vector axis_dir = SK.GetEntity(predef.entityB)->VectorGetNum();
+
+ AddParam(param, h.param(0), axis_dir.x);
+ AddParam(param, h.param(1), axis_dir.y);
+ AddParam(param, h.param(2), axis_dir.z);
+
+ // Remapped entity index.
+ int ai = 1;
+
+ for(i = 0; i < entity->n; i++) {
+ Entity *e = &(entity->elem[i]);
+ if(e->group.v != opA.v) continue;
+
+ e->CalculateNumerical(false);
+ hEntity he = e->h;
+
+ // As soon as I call CopyEntity, e may become invalid! That
+ // adds entities, which may cause a realloc.
+ CopyEntity(entity, SK.GetEntity(predef.origin), 0, ai,
+ h.param(0), h.param(1), h.param(2),
+ NO_PARAM, NO_PARAM, NO_PARAM, NO_PARAM,
+ true, false);
+
+ CopyEntity(entity, SK.GetEntity(he), 0, REMAP_LATHE_START,
+ h.param(0), h.param(1), h.param(2),
+ NO_PARAM, NO_PARAM, NO_PARAM, NO_PARAM,
+ true, false);
+
+ CopyEntity(entity, SK.GetEntity(he), 0, REMAP_LATHE_END,
+ h.param(0), h.param(1), h.param(2),
+ NO_PARAM, NO_PARAM, NO_PARAM, NO_PARAM,
+ true, false);
+
+ MakeLatheCircles(entity, param, he, axis_pos, axis_dir, ai);
+ ai++;
+ }
+ break;
+ }
+
+ case TRANSLATE: {
+ // The translation vector
+ AddParam(param, h.param(0), gp.x);
+ AddParam(param, h.param(1), gp.y);
+ AddParam(param, h.param(2), gp.z);
+
+ int n = (int)valA, a0 = 0;
+ if(subtype == ONE_SIDED && skipFirst) {
+ a0++; n++;
+ }
+
+ for(a = a0; a < n; a++) {
+ for(i = 0; i < entity->n; i++) {
+ Entity *e = &(entity->elem[i]);
+ if(e->group.v != opA.v) continue;
+
+ e->CalculateNumerical(false);
+ CopyEntity(entity, e,
+ a*2 - (subtype == ONE_SIDED ? 0 : (n-1)),
+ (a == (n - 1)) ? REMAP_LAST : a,
+ h.param(0), h.param(1), h.param(2),
+ NO_PARAM, NO_PARAM, NO_PARAM, NO_PARAM,
+ true, false);
+ }
+ }
+ break;
+ }
+ case ROTATE: {
+ // The center of rotation
+ AddParam(param, h.param(0), gc.x);
+ AddParam(param, h.param(1), gc.y);
+ AddParam(param, h.param(2), gc.z);
+ // The rotation quaternion
+ AddParam(param, h.param(3), 30*PI/180);
+ AddParam(param, h.param(4), gn.x);
+ AddParam(param, h.param(5), gn.y);
+ AddParam(param, h.param(6), gn.z);
+
+ int n = (int)valA, a0 = 0;
+ if(subtype == ONE_SIDED && skipFirst) {
+ a0++; n++;
+ }
+
+ for(a = a0; a < n; a++) {
+ for(i = 0; i < entity->n; i++) {
+ Entity *e = &(entity->elem[i]);
+ if(e->group.v != opA.v) continue;
+
+ e->CalculateNumerical(false);
+ CopyEntity(entity, e,
+ a*2 - (subtype == ONE_SIDED ? 0 : (n-1)),
+ (a == (n - 1)) ? REMAP_LAST : a,
+ h.param(0), h.param(1), h.param(2),
+ h.param(3), h.param(4), h.param(5), h.param(6),
+ false, true);
+ }
+ }
+ break;
+ }
+ case LINKED:
+ // The translation vector
+ AddParam(param, h.param(0), gp.x);
+ AddParam(param, h.param(1), gp.y);
+ AddParam(param, h.param(2), gp.z);
+ // The rotation quaternion
+ AddParam(param, h.param(3), 1);
+ AddParam(param, h.param(4), 0);
+ AddParam(param, h.param(5), 0);
+ AddParam(param, h.param(6), 0);
+
+ for(i = 0; i < impEntity.n; i++) {
+ Entity *ie = &(impEntity.elem[i]);
+ CopyEntity(entity, ie, 0, 0,
+ h.param(0), h.param(1), h.param(2),
+ h.param(3), h.param(4), h.param(5), h.param(6),
+ false, false);
+ }
+ break;
+
+ default: oops();
+ }
+}
+
+bool Group::IsSolvedOkay() {
+ return this->solved.how == System::SOLVED_OKAY ||
+ (this->allowRedundant && this->solved.how == System::REDUNDANT_OKAY);
+}
+
+void Group::AddEq(IdList<Equation,hEquation> *l, Expr *expr, int index) {
+ Equation eq;
+ eq.e = expr;
+ eq.h = h.equation(index);
+ l->Add(&eq);
+}
+
+void Group::GenerateEquations(IdList<Equation,hEquation> *l) {
+ if(type == LINKED) {
+ // Normalize the quaternion
+ ExprQuaternion q = {
+ Expr::From(h.param(3)),
+ Expr::From(h.param(4)),
+ Expr::From(h.param(5)),
+ Expr::From(h.param(6)) };
+ AddEq(l, (q.Magnitude())->Minus(Expr::From(1)), 0);
+ } else if(type == ROTATE) {
+ // The axis and center of rotation are specified numerically
+#define EC(x) (Expr::From(x))
+#define EP(x) (Expr::From(h.param(x)))
+ ExprVector orig = SK.GetEntity(predef.origin)->PointGetExprs();
+ AddEq(l, (orig.x)->Minus(EP(0)), 0);
+ AddEq(l, (orig.y)->Minus(EP(1)), 1);
+ AddEq(l, (orig.z)->Minus(EP(2)), 2);
+ // param 3 is the angle, which is free
+ Vector axis = SK.GetEntity(predef.entityB)->VectorGetNum();
+ axis = axis.WithMagnitude(1);
+ AddEq(l, (EC(axis.x))->Minus(EP(4)), 3);
+ AddEq(l, (EC(axis.y))->Minus(EP(5)), 4);
+ AddEq(l, (EC(axis.z))->Minus(EP(6)), 5);
+#undef EC
+#undef EP
+ } else if(type == EXTRUDE) {
+ if(predef.entityB.v != Entity::FREE_IN_3D.v) {
+ // The extrusion path is locked along a line, normal to the
+ // specified workplane.
+ Entity *w = SK.GetEntity(predef.entityB);
+ ExprVector u = w->Normal()->NormalExprsU();
+ ExprVector v = w->Normal()->NormalExprsV();
+ ExprVector extruden = {
+ Expr::From(h.param(0)),
+ Expr::From(h.param(1)),
+ Expr::From(h.param(2)) };
+
+ AddEq(l, u.Dot(extruden), 0);
+ AddEq(l, v.Dot(extruden), 1);
+ }
+ } else if(type == TRANSLATE) {
+ if(predef.entityB.v != Entity::FREE_IN_3D.v) {
+ Entity *w = SK.GetEntity(predef.entityB);
+ ExprVector n = w->Normal()->NormalExprsN();
+ ExprVector trans;
+ trans = ExprVector::From(h.param(0), h.param(1), h.param(2));
+
+ // The translation vector is parallel to the workplane
+ AddEq(l, trans.Dot(n), 0);
+ }
+ }
+}
+
+hEntity Group::Remap(hEntity in, int copyNumber) {
+ // A hash table is used to accelerate the search
+ int hash = ((unsigned)(in.v*61 + copyNumber)) % REMAP_PRIME;
+ int i = remapCache[hash];
+ if(i >= 0 && i < remap.n) {
+ EntityMap *em = &(remap.elem[i]);
+ if(em->input.v == in.v && em->copyNumber == copyNumber) {
+ return h.entity(em->h.v);
+ }
+ }
+ // but if we don't find it in the hash table, then linear search
+ for(i = 0; i < remap.n; i++) {
+ EntityMap *em = &(remap.elem[i]);
+ if(em->input.v == in.v && em->copyNumber == copyNumber) {
+ // We already have a mapping for this entity.
+ remapCache[hash] = i;
+ return h.entity(em->h.v);
+ }
+ }
+ // And if we still don't find it, then create a new entry.
+ EntityMap em;
+ em.input = in;
+ em.copyNumber = copyNumber;
+ remap.AddAndAssignId(&em);
+ return h.entity(em.h.v);
+}
+
+void Group::MakeExtrusionLines(IdList<Entity,hEntity> *el, hEntity in) {
+ Entity *ep = SK.GetEntity(in);
+
+ Entity en = {};
+ if(ep->IsPoint()) {
+ // A point gets extruded to form a line segment
+ en.point[0] = Remap(ep->h, REMAP_TOP);
+ en.point[1] = Remap(ep->h, REMAP_BOTTOM);
+ en.group = h;
+ en.construction = ep->construction;
+ en.style = ep->style;
+ en.h = Remap(ep->h, REMAP_PT_TO_LINE);
+ en.type = Entity::LINE_SEGMENT;
+ el->Add(&en);
+ } else if(ep->type == Entity::LINE_SEGMENT) {
+ // A line gets extruded to form a plane face; an endpoint of the
+ // original line is a point in the plane, and the line is in the plane.
+ Vector a = SK.GetEntity(ep->point[0])->PointGetNum();
+ Vector b = SK.GetEntity(ep->point[1])->PointGetNum();
+ Vector ab = b.Minus(a);
+
+ en.param[0] = h.param(0);
+ en.param[1] = h.param(1);
+ en.param[2] = h.param(2);
+ en.numPoint = a;
+ en.numNormal = Quaternion::From(0, ab.x, ab.y, ab.z);
+
+ en.group = h;
+ en.construction = ep->construction;
+ en.style = ep->style;
+ en.h = Remap(ep->h, REMAP_LINE_TO_FACE);
+ en.type = Entity::FACE_XPROD;
+ el->Add(&en);
+ }
+}
+
+void Group::MakeLatheCircles(IdList<Entity,hEntity> *el, IdList<Param,hParam> *param, hEntity in, Vector pt, Vector axis, int ai) {
+ Entity *ep = SK.GetEntity(in);
+
+ Entity en = {};
+ if(ep->IsPoint()) {
+ // A point gets revolved to form an arc.
+ en.point[0] = Remap(predef.origin, ai);
+ en.point[1] = Remap(ep->h, REMAP_LATHE_START);
+ en.point[2] = Remap(ep->h, REMAP_LATHE_END);
+
+ // Get arc center and point on arc.
+ Entity *pc = SK.GetEntity(en.point[0]);
+ Entity *pp = SK.GetEntity(en.point[1]);
+
+ // Project arc point to the revolution axis and use it for arc center.
+ double k = pp->numPoint.Minus(pt).Dot(axis) / axis.Dot(axis);
+ pc->numPoint = pt.Plus(axis.ScaledBy(k));
+
+ // Create arc entity.
+ en.group = h;
+ en.construction = ep->construction;
+ en.style = ep->style;
+ en.h = Remap(ep->h, REMAP_PT_TO_ARC);
+ en.type = Entity::ARC_OF_CIRCLE;
+
+ // Generate a normal.
+ Entity n = {};
+ n.workplane = en.workplane;
+ n.h = Remap(ep->h, REMAP_PT_TO_NORMAL);
+ n.group = en.group;
+ n.style = en.style;
+ n.type = Entity::NORMAL_N_COPY;
+
+ // Create basis for the normal.
+ Vector nu = pp->numPoint.Minus(pc->numPoint).WithMagnitude(1.0);
+ Vector nv = nu.Cross(axis).WithMagnitude(1.0);
+ n.numNormal = Quaternion::From(nv, nu);
+
+ // The point determines where the normal gets displayed on-screen;
+ // it's entirely cosmetic.
+ n.point[0] = en.point[0];
+ el->Add(&n);
+ en.normal = n.h;
+ el->Add(&en);
+ } else if(ep->type == Entity::LINE_SEGMENT) {
+ // An axis-perpendicular line gets revolved to form a face.
+ Vector a = SK.GetEntity(ep->point[0])->PointGetNum();
+ Vector b = SK.GetEntity(ep->point[1])->PointGetNum();
+ Vector u = b.Minus(a).WithMagnitude(1.0);
+
+ // Check for perpendicularity: calculate cosine of the angle
+ // between axis and line direction and check that
+ // cos(angle) == 0 <-> angle == +-90 deg.
+ if(fabs(u.Dot(axis) / axis.Magnitude()) < ANGLE_COS_EPS) {
+ en.param[0] = h.param(0);
+ en.param[1] = h.param(1);
+ en.param[2] = h.param(2);
+ Vector v = axis.Cross(u).WithMagnitude(1.0);
+ Vector n = u.Cross(v);
+ en.numNormal = Quaternion::From(0, n.x, n.y, n.z);
+
+ en.group = h;
+ en.construction = ep->construction;
+ en.style = ep->style;
+ en.h = Remap(ep->h, REMAP_LINE_TO_FACE);
+ en.type = Entity::FACE_NORMAL_PT;
+ en.point[0] = ep->point[0];
+ el->Add(&en);
+ }
+ }
+}
+
+void Group::MakeExtrusionTopBottomFaces(IdList<Entity,hEntity> *el, hEntity pt)
+{
+ if(pt.v == 0) return;
+ Group *src = SK.GetGroup(opA);
+ Vector n = src->polyLoops.normal;
+
+ Entity en = {};
+ en.type = Entity::FACE_NORMAL_PT;
+ en.group = h;
+
+ en.numNormal = Quaternion::From(0, n.x, n.y, n.z);
+ en.point[0] = Remap(pt, REMAP_TOP);
+ en.h = Remap(Entity::NO_ENTITY, REMAP_TOP);
+ el->Add(&en);
+
+ en.point[0] = Remap(pt, REMAP_BOTTOM);
+ en.h = Remap(Entity::NO_ENTITY, REMAP_BOTTOM);
+ el->Add(&en);
+}
+
+void Group::CopyEntity(IdList<Entity,hEntity> *el,
+ Entity *ep, int timesApplied, int remap,
+ hParam dx, hParam dy, hParam dz,
+ hParam qw, hParam qvx, hParam qvy, hParam qvz,
+ bool asTrans, bool asAxisAngle)
+{
+ Entity en = {};
+ en.type = ep->type;
+ en.extraPoints = ep->extraPoints;
+ en.h = Remap(ep->h, remap);
+ en.timesApplied = timesApplied;
+ en.group = h;
+ en.construction = ep->construction;
+ en.style = ep->style;
+ en.str = ep->str;
+ en.font = ep->font;
+
+ switch(ep->type) {
+ case Entity::WORKPLANE:
+ // Don't copy these.
+ return;
+
+ case Entity::POINT_N_COPY:
+ case Entity::POINT_N_TRANS:
+ case Entity::POINT_N_ROT_TRANS:
+ case Entity::POINT_N_ROT_AA:
+ case Entity::POINT_IN_3D:
+ case Entity::POINT_IN_2D:
+ if(asTrans) {
+ en.type = Entity::POINT_N_TRANS;
+ en.param[0] = dx;
+ en.param[1] = dy;
+ en.param[2] = dz;
+ } else {
+ if(asAxisAngle) {
+ en.type = Entity::POINT_N_ROT_AA;
+ } else {
+ en.type = Entity::POINT_N_ROT_TRANS;
+ }
+ en.param[0] = dx;
+ en.param[1] = dy;
+ en.param[2] = dz;
+ en.param[3] = qw;
+ en.param[4] = qvx;
+ en.param[5] = qvy;
+ en.param[6] = qvz;
+ }
+ en.numPoint = (ep->actPoint).ScaledBy(scale);
+ break;
+
+ case Entity::NORMAL_N_COPY:
+ case Entity::NORMAL_N_ROT:
+ case Entity::NORMAL_N_ROT_AA:
+ case Entity::NORMAL_IN_3D:
+ case Entity::NORMAL_IN_2D:
+ if(asTrans) {
+ en.type = Entity::NORMAL_N_COPY;
+ } else {
+ if(asAxisAngle) {
+ en.type = Entity::NORMAL_N_ROT_AA;
+ } else {
+ en.type = Entity::NORMAL_N_ROT;
+ }
+ en.param[0] = qw;
+ en.param[1] = qvx;
+ en.param[2] = qvy;
+ en.param[3] = qvz;
+ }
+ en.numNormal = ep->actNormal;
+ if(scale < 0) en.numNormal = en.numNormal.Mirror();
+
+ en.point[0] = Remap(ep->point[0], remap);
+ break;
+
+ case Entity::DISTANCE_N_COPY:
+ case Entity::DISTANCE:
+ en.type = Entity::DISTANCE_N_COPY;
+ en.numDistance = ep->actDistance*fabs(scale);
+ break;
+
+ case Entity::FACE_NORMAL_PT:
+ case Entity::FACE_XPROD:
+ case Entity::FACE_N_ROT_TRANS:
+ case Entity::FACE_N_TRANS:
+ case Entity::FACE_N_ROT_AA:
+ if(asTrans) {
+ en.type = Entity::FACE_N_TRANS;
+ en.param[0] = dx;
+ en.param[1] = dy;
+ en.param[2] = dz;
+ } else {
+ if(asAxisAngle) {
+ en.type = Entity::FACE_N_ROT_AA;
+ } else {
+ en.type = Entity::FACE_N_ROT_TRANS;
+ }
+ en.param[0] = dx;
+ en.param[1] = dy;
+ en.param[2] = dz;
+ en.param[3] = qw;
+ en.param[4] = qvx;
+ en.param[5] = qvy;
+ en.param[6] = qvz;
+ }
+ en.numPoint = (ep->actPoint).ScaledBy(scale);
+ en.numNormal = (ep->actNormal).ScaledBy(scale);
+ break;
+
+ default: {
+ int i, points;
+ bool hasNormal, hasDistance;
+ EntReqTable::GetEntityInfo(ep->type, ep->extraPoints,
+ NULL, &points, &hasNormal, &hasDistance);
+ for(i = 0; i < points; i++) {
+ en.point[i] = Remap(ep->point[i], remap);
+ }
+ if(hasNormal) en.normal = Remap(ep->normal, remap);
+ if(hasDistance) en.distance = Remap(ep->distance, remap);
+ break;
+ }
+ }
+
+ // If the entity came from an linked file where it was invisible then
+ // ep->actiVisble will be false, and we should hide it. Or if the entity
+ // came from a copy (e.g. step and repeat) of a force-hidden linked
+ // entity, then we also want to hide it.
+ en.forceHidden = (!ep->actVisible) || ep->forceHidden;
+
+ el->Add(&en);
+}
+
--- /dev/null
+//-----------------------------------------------------------------------------
+// Routines to generate our watertight brep shells from the operations
+// and entities specified by the user in each group; templated to work either
+// on an SShell of ratpoly surfaces or on an SMesh of triangles.
+//
+// Copyright 2008-2013 Jonathan Westhues.
+//-----------------------------------------------------------------------------
+#include "solvespace.h"
+
+#define gs (SS.GW.gs)
+
+void Group::AssembleLoops(bool *allClosed,
+ bool *allCoplanar,
+ bool *allNonZeroLen)
+{
+ SBezierList sbl = {};
+
+ int i;
+ for(i = 0; i < SK.entity.n; i++) {
+ Entity *e = &(SK.entity.elem[i]);
+ if(e->group.v != h.v) continue;
+ if(e->construction) continue;
+ if(e->forceHidden) continue;
+
+ e->GenerateBezierCurves(&sbl);
+ }
+
+ SBezier *sb;
+ *allNonZeroLen = true;
+ for(sb = sbl.l.First(); sb; sb = sbl.l.NextAfter(sb)) {
+ for(i = 1; i <= sb->deg; i++) {
+ if(!(sb->ctrl[i]).Equals(sb->ctrl[0])) {
+ break;
+ }
+ }
+ if(i > sb->deg) {
+ // This is a zero-length edge.
+ *allNonZeroLen = false;
+ polyError.errorPointAt = sb->ctrl[0];
+ goto done;
+ }
+ }
+
+ // Try to assemble all these Beziers into loops. The closed loops go into
+ // bezierLoops, with the outer loops grouped with their holes. The
+ // leftovers, if any, go in bezierOpens.
+ bezierLoops.FindOuterFacesFrom(&sbl, &polyLoops, NULL,
+ SS.ChordTolMm(),
+ allClosed, &(polyError.notClosedAt),
+ allCoplanar, &(polyError.errorPointAt),
+ &bezierOpens);
+ done:
+ sbl.Clear();
+}
+
+void Group::GenerateLoops(void) {
+ polyLoops.Clear();
+ bezierLoops.Clear();
+ bezierOpens.Clear();
+
+ if(type == DRAWING_3D || type == DRAWING_WORKPLANE ||
+ type == ROTATE || type == TRANSLATE || type == LINKED)
+ {
+ bool allClosed = false, allCoplanar = false, allNonZeroLen = false;
+ AssembleLoops(&allClosed, &allCoplanar, &allNonZeroLen);
+ if(!allNonZeroLen) {
+ polyError.how = POLY_ZERO_LEN_EDGE;
+ } else if(!allCoplanar) {
+ polyError.how = POLY_NOT_COPLANAR;
+ } else if(!allClosed) {
+ polyError.how = POLY_NOT_CLOSED;
+ } else {
+ polyError.how = POLY_GOOD;
+ // The self-intersecting check is kind of slow, so don't run it
+ // unless requested.
+ if(SS.checkClosedContour) {
+ if(polyLoops.SelfIntersecting(&(polyError.errorPointAt))) {
+ polyError.how = POLY_SELF_INTERSECTING;
+ }
+ }
+ }
+ }
+}
+
+void SShell::RemapFaces(Group *g, int remap) {
+ SSurface *ss;
+ for(ss = surface.First(); ss; ss = surface.NextAfter(ss)){
+ hEntity face = { ss->face };
+ if(face.v == Entity::NO_ENTITY.v) continue;
+
+ face = g->Remap(face, remap);
+ ss->face = face.v;
+ }
+}
+
+void SMesh::RemapFaces(Group *g, int remap) {
+ STriangle *tr;
+ for(tr = l.First(); tr; tr = l.NextAfter(tr)) {
+ hEntity face = { tr->meta.face };
+ if(face.v == Entity::NO_ENTITY.v) continue;
+
+ face = g->Remap(face, remap);
+ tr->meta.face = face.v;
+ }
+}
+
+template<class T>
+void Group::GenerateForStepAndRepeat(T *steps, T *outs) {
+ T workA, workB;
+ workA = {};
+ workB = {};
+ T *soFar = &workA, *scratch = &workB;
+
+ int n = (int)valA, a0 = 0;
+ if(subtype == ONE_SIDED && skipFirst) {
+ a0++; n++;
+ }
+ int a;
+ for(a = a0; a < n; a++) {
+ int ap = a*2 - (subtype == ONE_SIDED ? 0 : (n-1));
+ int remap = (a == (n - 1)) ? REMAP_LAST : a;
+
+ T transd = {};
+ if(type == TRANSLATE) {
+ Vector trans = Vector::From(h.param(0), h.param(1), h.param(2));
+ trans = trans.ScaledBy(ap);
+ transd.MakeFromTransformationOf(steps,
+ trans, Quaternion::IDENTITY, 1.0);
+ } else {
+ Vector trans = Vector::From(h.param(0), h.param(1), h.param(2));
+ double theta = ap * SK.GetParam(h.param(3))->val;
+ double c = cos(theta), s = sin(theta);
+ Vector axis = Vector::From(h.param(4), h.param(5), h.param(6));
+ Quaternion q = Quaternion::From(c, s*axis.x, s*axis.y, s*axis.z);
+ // Rotation is centered at t; so A(x - t) + t = Ax + (t - At)
+ transd.MakeFromTransformationOf(steps,
+ trans.Minus(q.Rotate(trans)), q, 1.0);
+ }
+
+ // We need to rewrite any plane face entities to the transformed ones.
+ transd.RemapFaces(this, remap);
+
+ // And tack this transformed copy on to the return.
+ if(soFar->IsEmpty()) {
+ scratch->MakeFromCopyOf(&transd);
+ } else {
+ scratch->MakeFromUnionOf(soFar, &transd);
+ }
+
+ swap(scratch, soFar);
+ scratch->Clear();
+ transd.Clear();
+ }
+
+ outs->Clear();
+ *outs = *soFar;
+}
+
+template<class T>
+void Group::GenerateForBoolean(T *prevs, T *thiss, T *outs, int how) {
+ // If this group contributes no new mesh, then our running mesh is the
+ // same as last time, no combining required. Likewise if we have a mesh
+ // but it's suppressed.
+ if(thiss->IsEmpty() || suppress) {
+ outs->MakeFromCopyOf(prevs);
+ return;
+ }
+
+ // So our group's shell appears in thisShell. Combine this with the
+ // previous group's shell, using the requested operation.
+ if(how == COMBINE_AS_UNION) {
+ outs->MakeFromUnionOf(prevs, thiss);
+ } else if(how == COMBINE_AS_DIFFERENCE) {
+ outs->MakeFromDifferenceOf(prevs, thiss);
+ } else {
+ outs->MakeFromAssemblyOf(prevs, thiss);
+ }
+}
+
+void Group::GenerateShellAndMesh(void) {
+ bool prevBooleanFailed = booleanFailed;
+ booleanFailed = false;
+
+ Group *srcg = this;
+
+ thisShell.Clear();
+ thisMesh.Clear();
+ runningShell.Clear();
+ runningMesh.Clear();
+
+ // Don't attempt a lathe or extrusion unless the source section is good:
+ // planar and not self-intersecting.
+ bool haveSrc = true;
+ if(type == EXTRUDE || type == LATHE) {
+ Group *src = SK.GetGroup(opA);
+ if(src->polyError.how != POLY_GOOD) {
+ haveSrc = false;
+ }
+ }
+
+ if(type == TRANSLATE || type == ROTATE) {
+ // A step and repeat gets merged against the group's prevous group,
+ // not our own previous group.
+ srcg = SK.GetGroup(opA);
+
+ if(!srcg->suppress) {
+ GenerateForStepAndRepeat<SShell>(&(srcg->thisShell), &thisShell);
+ GenerateForStepAndRepeat<SMesh> (&(srcg->thisMesh), &thisMesh);
+ }
+ } else if(type == EXTRUDE && haveSrc) {
+ Group *src = SK.GetGroup(opA);
+ Vector translate = Vector::From(h.param(0), h.param(1), h.param(2));
+
+ Vector tbot, ttop;
+ if(subtype == ONE_SIDED) {
+ tbot = Vector::From(0, 0, 0); ttop = translate.ScaledBy(2);
+ } else {
+ tbot = translate.ScaledBy(-1); ttop = translate.ScaledBy(1);
+ }
+
+ SBezierLoopSetSet *sblss = &(src->bezierLoops);
+ SBezierLoopSet *sbls;
+ for(sbls = sblss->l.First(); sbls; sbls = sblss->l.NextAfter(sbls)) {
+ int is = thisShell.surface.n;
+ // Extrude this outer contour (plus its inner contours, if present)
+ thisShell.MakeFromExtrusionOf(sbls, tbot, ttop, color);
+
+ // And for any plane faces, annotate the model with the entity for
+ // that face, so that the user can select them with the mouse.
+ Vector onOrig = sbls->point;
+ int i;
+ for(i = is; i < thisShell.surface.n; i++) {
+ SSurface *ss = &(thisShell.surface.elem[i]);
+ hEntity face = Entity::NO_ENTITY;
+
+ Vector p = ss->PointAt(0, 0),
+ n = ss->NormalAt(0, 0).WithMagnitude(1);
+ double d = n.Dot(p);
+
+ if(i == is || i == (is + 1)) {
+ // These are the top and bottom of the shell.
+ if(fabs((onOrig.Plus(ttop)).Dot(n) - d) < LENGTH_EPS) {
+ face = Remap(Entity::NO_ENTITY, REMAP_TOP);
+ ss->face = face.v;
+ }
+ if(fabs((onOrig.Plus(tbot)).Dot(n) - d) < LENGTH_EPS) {
+ face = Remap(Entity::NO_ENTITY, REMAP_BOTTOM);
+ ss->face = face.v;
+ }
+ continue;
+ }
+
+ // So these are the sides
+ if(ss->degm != 1 || ss->degn != 1) continue;
+
+ Entity *e;
+ for(e = SK.entity.First(); e; e = SK.entity.NextAfter(e)) {
+ if(e->group.v != opA.v) continue;
+ if(e->type != Entity::LINE_SEGMENT) continue;
+
+ Vector a = SK.GetEntity(e->point[0])->PointGetNum(),
+ b = SK.GetEntity(e->point[1])->PointGetNum();
+ a = a.Plus(ttop);
+ b = b.Plus(ttop);
+ // Could get taken backwards, so check all cases.
+ if((a.Equals(ss->ctrl[0][0]) && b.Equals(ss->ctrl[1][0])) ||
+ (b.Equals(ss->ctrl[0][0]) && a.Equals(ss->ctrl[1][0])) ||
+ (a.Equals(ss->ctrl[0][1]) && b.Equals(ss->ctrl[1][1])) ||
+ (b.Equals(ss->ctrl[0][1]) && a.Equals(ss->ctrl[1][1])))
+ {
+ face = Remap(e->h, REMAP_LINE_TO_FACE);
+ ss->face = face.v;
+ break;
+ }
+ }
+ }
+ }
+ } else if(type == LATHE && haveSrc) {
+ Group *src = SK.GetGroup(opA);
+
+ Vector pt = SK.GetEntity(predef.origin)->PointGetNum(),
+ axis = SK.GetEntity(predef.entityB)->VectorGetNum();
+ axis = axis.WithMagnitude(1);
+
+ SBezierLoopSetSet *sblss = &(src->bezierLoops);
+ SBezierLoopSet *sbls;
+ for(sbls = sblss->l.First(); sbls; sbls = sblss->l.NextAfter(sbls)) {
+ thisShell.MakeFromRevolutionOf(sbls, pt, axis, color, this);
+ }
+ } else if(type == LINKED) {
+ // The imported shell or mesh are copied over, with the appropriate
+ // transformation applied. We also must remap the face entities.
+ Vector offset = {
+ SK.GetParam(h.param(0))->val,
+ SK.GetParam(h.param(1))->val,
+ SK.GetParam(h.param(2))->val };
+ Quaternion q = {
+ SK.GetParam(h.param(3))->val,
+ SK.GetParam(h.param(4))->val,
+ SK.GetParam(h.param(5))->val,
+ SK.GetParam(h.param(6))->val };
+
+ thisMesh.MakeFromTransformationOf(&impMesh, offset, q, scale);
+ thisMesh.RemapFaces(this, 0);
+
+ thisShell.MakeFromTransformationOf(&impShell, offset, q, scale);
+ thisShell.RemapFaces(this, 0);
+ }
+
+ if(srcg->meshCombine != COMBINE_AS_ASSEMBLE) {
+ thisShell.MergeCoincidentSurfaces();
+ }
+
+ // So now we've got the mesh or shell for this group. Combine it with
+ // the previous group's mesh or shell with the requested Boolean, and
+ // we're done.
+
+ Group *prevg = srcg->RunningMeshGroup();
+
+ if(prevg->runningMesh.IsEmpty() && thisMesh.IsEmpty() && !forceToMesh) {
+ SShell *prevs = &(prevg->runningShell);
+ GenerateForBoolean<SShell>(prevs, &thisShell, &runningShell,
+ srcg->meshCombine);
+
+ if(srcg->meshCombine != COMBINE_AS_ASSEMBLE) {
+ runningShell.MergeCoincidentSurfaces();
+ }
+
+ // If the Boolean failed, then we should note that in the text screen
+ // for this group.
+ booleanFailed = runningShell.booleanFailed;
+ if(booleanFailed != prevBooleanFailed) {
+ SS.ScheduleShowTW();
+ }
+ } else {
+ SMesh prevm, thism;
+ prevm = {};
+ thism = {};
+
+ prevm.MakeFromCopyOf(&(prevg->runningMesh));
+ prevg->runningShell.TriangulateInto(&prevm);
+
+ thism.MakeFromCopyOf(&thisMesh);
+ thisShell.TriangulateInto(&thism);
+
+ SMesh outm = {};
+ GenerateForBoolean<SMesh>(&prevm, &thism, &outm, srcg->meshCombine);
+
+ // And make sure that the output mesh is vertex-to-vertex.
+ SKdNode *root = SKdNode::From(&outm);
+ root->SnapToMesh(&outm);
+ root->MakeMeshInto(&runningMesh);
+
+ outm.Clear();
+ thism.Clear();
+ prevm.Clear();
+ }
+
+ displayDirty = true;
+}
+
+void Group::GenerateDisplayItems(void) {
+ // This is potentially slow (since we've got to triangulate a shell, or
+ // to find the emphasized edges for a mesh), so we will run it only
+ // if its inputs have changed.
+ if(displayDirty) {
+ Group *pg = RunningMeshGroup();
+ if(pg && thisMesh.IsEmpty() && thisShell.IsEmpty()) {
+ // We don't contribute any new solid model in this group, so our
+ // display items are identical to the previous group's; which means
+ // that we can just display those, and stop ourselves from
+ // recalculating for those every time we get a change in this group.
+ //
+ // Note that this can end up recursing multiple times (if multiple
+ // groups that contribute no solid model exist in sequence), but
+ // that's okay.
+ pg->GenerateDisplayItems();
+
+ displayMesh.Clear();
+ displayMesh.MakeFromCopyOf(&(pg->displayMesh));
+
+ displayEdges.Clear();
+ displayOutlines.Clear();
+ if(SS.GW.showEdges) {
+ SEdge *se;
+ SEdgeList *src = &(pg->displayEdges);
+ for(se = src->l.First(); se; se = src->l.NextAfter(se)) {
+ displayEdges.l.Add(se);
+ }
+ displayOutlines.MakeFromCopyOf(&pg->displayOutlines);
+ }
+ } else {
+ // We do contribute new solid model, so we have to triangulate the
+ // shell, and edge-find the mesh.
+ displayMesh.Clear();
+ runningShell.TriangulateInto(&displayMesh);
+ STriangle *t;
+ for(t = runningMesh.l.First(); t; t = runningMesh.l.NextAfter(t)) {
+ STriangle trn = *t;
+ Vector n = trn.Normal();
+ trn.an = n;
+ trn.bn = n;
+ trn.cn = n;
+ displayMesh.AddTriangle(&trn);
+ }
+
+ displayEdges.Clear();
+ displayOutlines.Clear();
+
+ if(SS.GW.showEdges) {
+ if(runningMesh.l.n > 0) {
+ // Triangle mesh only; no shell or emphasized edges.
+ runningMesh.MakeCertainEdgesAndOutlinesInto(
+ &displayEdges, &displayOutlines, SKdNode::EMPHASIZED_EDGES);
+ } else {
+ displayMesh.MakeCertainEdgesAndOutlinesInto(
+ &displayEdges, &displayOutlines, SKdNode::SHARP_EDGES);
+ }
+ }
+ }
+
+ displayDirty = false;
+ }
+}
+
+Group *Group::PreviousGroup(void) {
+ int i;
+ for(i = 0; i < SK.groupOrder.n; i++) {
+ Group *g = SK.GetGroup(SK.groupOrder.elem[i]);
+ if(g->h.v == h.v) break;
+ }
+ if(i == 0 || i >= SK.groupOrder.n) return NULL;
+ return SK.GetGroup(SK.groupOrder.elem[i - 1]);
+}
+
+Group *Group::RunningMeshGroup(void) {
+ if(type == TRANSLATE || type == ROTATE) {
+ return SK.GetGroup(opA)->RunningMeshGroup();
+ } else {
+ return PreviousGroup();
+ }
+}
+
+bool Group::IsMeshGroup() {
+ switch(type) {
+ case Group::EXTRUDE:
+ case Group::LATHE:
+ case Group::ROTATE:
+ case Group::TRANSLATE:
+ return true;
+ }
+ return false;
+}
+
+void Group::DrawDisplayItems(int t) {
+ RgbaColor specColor;
+ bool useSpecColor;
+ if(t == DRAWING_3D || t == DRAWING_WORKPLANE) {
+ // force the color to something dim
+ specColor = Style::Color(Style::DIM_SOLID);
+ useSpecColor = true;
+ } else {
+ useSpecColor = false; // use the model color
+ }
+ // The back faces are drawn in red; should never seem them, since we
+ // draw closed shells, so that's a debugging aid.
+ GLfloat mpb[] = { 1.0f, 0.1f, 0.1f, 1.0f };
+ glMaterialfv(GL_BACK, GL_AMBIENT_AND_DIFFUSE, mpb);
+
+ // When we fill the mesh, we need to know which triangles are selected
+ // or hovered, in order to draw them differently.
+ uint32_t mh = 0, ms1 = 0, ms2 = 0;
+ hEntity he = SS.GW.hover.entity;
+ if(he.v != 0 && SK.GetEntity(he)->IsFace()) {
+ mh = he.v;
+ }
+ SS.GW.GroupSelection();
+ if(gs.faces > 0) ms1 = gs.face[0].v;
+ if(gs.faces > 1) ms2 = gs.face[1].v;
+
+ if(SS.GW.showShaded || SS.GW.showHdnLines) {
+ if(SS.drawBackFaces && !displayMesh.isTransparent) {
+ // For debugging, draw the backs of the triangles in red, so that we
+ // notice when a shell is open
+ glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, 1);
+ } else {
+ glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, 0);
+ }
+
+ // Draw the shaded solid into the depth buffer for hidden line removal,
+ // and if we're actually going to display it, to the color buffer too.
+ glEnable(GL_LIGHTING);
+ if(!SS.GW.showShaded) glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
+ ssglFillMesh(useSpecColor, specColor, &displayMesh, mh, ms1, ms2);
+ if(!SS.GW.showShaded) glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
+ glDisable(GL_LIGHTING);
+ }
+
+ if(SS.GW.showEdges) {
+ Vector projDir = SS.GW.projRight.Cross(SS.GW.projUp);
+
+ glDepthMask(GL_FALSE);
+ if(SS.GW.showHdnLines) {
+ ssglDepthRangeOffset(0);
+ glDepthFunc(GL_GREATER);
+ ssglDrawEdges(&displayEdges, false, { Style::HIDDEN_EDGE });
+ ssglDrawOutlines(&displayOutlines, projDir, { Style::HIDDEN_EDGE });
+ glDepthFunc(GL_LEQUAL);
+ }
+ ssglDepthRangeOffset(2);
+ ssglDrawEdges(&displayEdges, false, { Style::SOLID_EDGE });
+ if(SS.GW.showOutlines) {
+ ssglDrawOutlines(&displayOutlines, projDir, { Style::OUTLINE });
+ } else {
+ ssglDrawOutlines(&displayOutlines, projDir, { Style::SOLID_EDGE });
+ }
+ glDepthMask(GL_TRUE);
+ }
+
+ if(SS.GW.showMesh) ssglDebugMesh(&displayMesh);
+}
+
+void Group::Draw(void) {
+ // Everything here gets drawn whether or not the group is hidden; we
+ // can control this stuff independently, with show/hide solids, edges,
+ // mesh, etc.
+
+ GenerateDisplayItems();
+ DrawDisplayItems(type);
+
+ if(!SS.checkClosedContour) return;
+
+ // And finally show the polygons too, and any errors if it's not possible
+ // to assemble the lines into closed polygons.
+ if(polyError.how == POLY_NOT_CLOSED) {
+ // Report this error only in sketch-in-workplane groups; otherwise
+ // it's just a nuisance.
+ if(type == DRAWING_WORKPLANE) {
+ glDisable(GL_DEPTH_TEST);
+ ssglColorRGBa(Style::Color(Style::DRAW_ERROR), 0.2);
+ ssglLineWidth (Style::Width(Style::DRAW_ERROR));
+ glBegin(GL_LINES);
+ ssglVertex3v(polyError.notClosedAt.a);
+ ssglVertex3v(polyError.notClosedAt.b);
+ glEnd();
+ ssglColorRGB(Style::Color(Style::DRAW_ERROR));
+ ssglWriteText("not closed contour, or not all same style!",
+ Style::DefaultTextHeight(),
+ polyError.notClosedAt.b, SS.GW.projRight, SS.GW.projUp,
+ NULL, NULL);
+ glEnable(GL_DEPTH_TEST);
+ }
+ } else if(polyError.how == POLY_NOT_COPLANAR ||
+ polyError.how == POLY_SELF_INTERSECTING ||
+ polyError.how == POLY_ZERO_LEN_EDGE)
+ {
+ // These errors occur at points, not lines
+ if(type == DRAWING_WORKPLANE) {
+ glDisable(GL_DEPTH_TEST);
+ ssglColorRGB(Style::Color(Style::DRAW_ERROR));
+ const char *msg;
+ if(polyError.how == POLY_NOT_COPLANAR) {
+ msg = "points not all coplanar!";
+ } else if(polyError.how == POLY_SELF_INTERSECTING) {
+ msg = "contour is self-intersecting!";
+ } else {
+ msg = "zero-length edge!";
+ }
+ ssglWriteText(msg, Style::DefaultTextHeight(),
+ polyError.errorPointAt, SS.GW.projRight, SS.GW.projUp,
+ NULL, NULL);
+ glEnable(GL_DEPTH_TEST);
+ }
+ } else {
+ // The contours will get filled in DrawFilledPaths.
+ }
+}
+
+void Group::FillLoopSetAsPolygon(SBezierLoopSet *sbls) {
+ SPolygon sp = {};
+ sbls->MakePwlInto(&sp);
+ ssglDepthRangeOffset(1);
+ ssglFillPolygon(&sp);
+ ssglDepthRangeOffset(0);
+ sp.Clear();
+}
+
+void Group::DrawFilledPaths(void) {
+ SBezierLoopSet *sbls;
+ SBezierLoopSetSet *sblss = &bezierLoops;
+ for(sbls = sblss->l.First(); sbls; sbls = sblss->l.NextAfter(sbls)) {
+ if(sbls->l.n == 0 || sbls->l.elem[0].l.n == 0) continue;
+ // In an assembled loop, all the styles should be the same; so doesn't
+ // matter which one we grab.
+ SBezier *sb = &(sbls->l.elem[0].l.elem[0]);
+ hStyle hs = { (uint32_t)sb->auxA };
+ Style *s = Style::Get(hs);
+ if(s->filled) {
+ // This is a filled loop, where the user specified a fill color.
+ ssglColorRGBa(s->fillColor, 1);
+ FillLoopSetAsPolygon(sbls);
+ } else {
+ if(h.v == SS.GW.activeGroup.v && SS.checkClosedContour &&
+ polyError.how == POLY_GOOD)
+ {
+ // If this is the active group, and we are supposed to check
+ // for closed contours, and we do indeed have a closed and
+ // non-intersecting contour, then fill it dimly.
+ ssglColorRGBa(Style::Color(Style::CONTOUR_FILL), 0.5);
+ ssglDepthRangeOffset(1);
+ FillLoopSetAsPolygon(sbls);
+ ssglDepthRangeOffset(0);
+ }
+ }
+ }
+}
+
--- /dev/null
+//-----------------------------------------------------------------------------
+// Our main() function, and GTK3-specific stuff to set up our windows and
+// otherwise handle our interface to the operating system. Everything
+// outside gtk/... should be standard C++ and OpenGL.
+//
+// Copyright 2015 <whitequark@whitequark.org>
+//-----------------------------------------------------------------------------
+#include <errno.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#include <time.h>
+
+#include <iostream>
+
+#include <json-c/json_object.h>
+#include <json-c/json_util.h>
+
+#include <glibmm/main.h>
+#include <glibmm/convert.h>
+#include <giomm/file.h>
+#include <gdkmm/cursor.h>
+#include <gtkmm/drawingarea.h>
+#include <gtkmm/scrollbar.h>
+#include <gtkmm/entry.h>
+#include <gtkmm/eventbox.h>
+#include <gtkmm/fixed.h>
+#include <gtkmm/adjustment.h>
+#include <gtkmm/separatormenuitem.h>
+#include <gtkmm/menuitem.h>
+#include <gtkmm/checkmenuitem.h>
+#include <gtkmm/radiomenuitem.h>
+#include <gtkmm/radiobuttongroup.h>
+#include <gtkmm/menu.h>
+#include <gtkmm/menubar.h>
+#include <gtkmm/scrolledwindow.h>
+#include <gtkmm/filechooserdialog.h>
+#include <gtkmm/messagedialog.h>
+#include <gtkmm/main.h>
+
+#if HAVE_GTK3
+#include <gtkmm/hvbox.h>
+#else
+#include <gtkmm/box.h>
+#endif
+
+#include <cairomm/xlib_surface.h>
+#include <pangomm/fontdescription.h>
+#include <gdk/gdkx.h>
+#include <fontconfig/fontconfig.h>
+
+#include <GL/glx.h>
+
+#include "solvespace.h"
+#include "config.h"
+#include "../unix/gloffscreen.h"
+
+#ifdef HAVE_SPACEWARE
+#include <spnav.h>
+#endif
+
+namespace SolveSpace {
+/* Settings */
+
+/* Why not just use GSettings? Two reasons. It doesn't allow to easily see
+ whether the setting had the default value, and it requires to install
+ a schema globally. */
+static json_object *settings = NULL;
+
+static std::string CnfPrepare() {
+ // Refer to http://standards.freedesktop.org/basedir-spec/latest/
+
+ std::string dir;
+ if(getenv("XDG_CONFIG_HOME")) {
+ dir = std::string(getenv("XDG_CONFIG_HOME")) + "/solvespace";
+ } else if(getenv("HOME")) {
+ dir = std::string(getenv("HOME")) + "/.config/solvespace";
+ } else {
+ dbp("neither XDG_CONFIG_HOME nor HOME are set");
+ return "";
+ }
+
+ struct stat st;
+ if(stat(dir.c_str(), &st)) {
+ if(errno == ENOENT) {
+ if(mkdir(dir.c_str(), 0777)) {
+ dbp("cannot mkdir %s: %s", dir.c_str(), strerror(errno));
+ return "";
+ }
+ } else {
+ dbp("cannot stat %s: %s", dir.c_str(), strerror(errno));
+ return "";
+ }
+ } else if(!S_ISDIR(st.st_mode)) {
+ dbp("%s is not a directory", dir.c_str());
+ return "";
+ }
+
+ return dir + "/settings.json";
+}
+
+static void CnfLoad() {
+ std::string path = CnfPrepare();
+ if(path.empty())
+ return;
+
+ if(settings)
+ json_object_put(settings); // deallocate
+
+ settings = json_object_from_file(path.c_str());
+ if(!settings) {
+ if(errno != ENOENT)
+ dbp("cannot load settings: %s", strerror(errno));
+
+ settings = json_object_new_object();
+ }
+}
+
+static void CnfSave() {
+ std::string path = CnfPrepare();
+ if(path.empty())
+ return;
+
+ /* json-c <0.12 has the first argument non-const here */
+ if(json_object_to_file_ext((char*) path.c_str(), settings, JSON_C_TO_STRING_PRETTY))
+ dbp("cannot save settings: %s", strerror(errno));
+}
+
+void CnfFreezeInt(uint32_t val, const std::string &key) {
+ struct json_object *jval = json_object_new_int(val);
+ json_object_object_add(settings, key.c_str(), jval);
+ CnfSave();
+}
+
+uint32_t CnfThawInt(uint32_t val, const std::string &key) {
+ struct json_object *jval;
+ if(json_object_object_get_ex(settings, key.c_str(), &jval))
+ return json_object_get_int(jval);
+ else return val;
+}
+
+void CnfFreezeFloat(float val, const std::string &key) {
+ struct json_object *jval = json_object_new_double(val);
+ json_object_object_add(settings, key.c_str(), jval);
+ CnfSave();
+}
+
+float CnfThawFloat(float val, const std::string &key) {
+ struct json_object *jval;
+ if(json_object_object_get_ex(settings, key.c_str(), &jval))
+ return json_object_get_double(jval);
+ else return val;
+}
+
+void CnfFreezeString(const std::string &val, const std::string &key) {
+ struct json_object *jval = json_object_new_string(val.c_str());
+ json_object_object_add(settings, key.c_str(), jval);
+ CnfSave();
+}
+
+std::string CnfThawString(const std::string &val, const std::string &key) {
+ struct json_object *jval;
+ if(json_object_object_get_ex(settings, key.c_str(), &jval))
+ return json_object_get_string(jval);
+ return val;
+}
+
+static void CnfFreezeWindowPos(Gtk::Window *win, const std::string &key) {
+ int x, y, w, h;
+ win->get_position(x, y);
+ win->get_size(w, h);
+
+ CnfFreezeInt(x, key + "_left");
+ CnfFreezeInt(y, key + "_top");
+ CnfFreezeInt(w, key + "_width");
+ CnfFreezeInt(h, key + "_height");
+}
+
+static void CnfThawWindowPos(Gtk::Window *win, const std::string &key) {
+ int x, y, w, h;
+ win->get_position(x, y);
+ win->get_size(w, h);
+
+ x = CnfThawInt(x, key + "_left");
+ y = CnfThawInt(y, key + "_top");
+ w = CnfThawInt(w, key + "_width");
+ h = CnfThawInt(h, key + "_height");
+
+ win->move(x, y);
+ win->resize(w, h);
+}
+
+/* Timers */
+
+int64_t GetMilliseconds(void) {
+ struct timespec ts;
+ clock_gettime(CLOCK_MONOTONIC, &ts);
+ return 1000 * (uint64_t) ts.tv_sec + ts.tv_nsec / 1000000;
+}
+
+static bool TimerCallback() {
+ SS.GW.TimerCallback();
+ SS.TW.TimerCallback();
+ return false;
+}
+
+void SetTimerFor(int milliseconds) {
+ Glib::signal_timeout().connect(&TimerCallback, milliseconds);
+}
+
+static bool AutosaveTimerCallback() {
+ SS.Autosave();
+ return false;
+}
+
+void SetAutosaveTimerFor(int minutes) {
+ Glib::signal_timeout().connect(&AutosaveTimerCallback, minutes * 60 * 1000);
+}
+
+static bool LaterCallback() {
+ SS.DoLater();
+ return false;
+}
+
+void ScheduleLater() {
+ Glib::signal_idle().connect(&LaterCallback);
+}
+
+/* GL wrapper */
+
+#define GL_CHECK() \
+ do { \
+ int err = (int)glGetError(); \
+ if(err) dbp("%s:%d: glGetError() == 0x%X %s", \
+ __FILE__, __LINE__, err, gluErrorString(err)); \
+ } while (0)
+
+class GlWidget : public Gtk::DrawingArea {
+public:
+ GlWidget() : _offscreen(NULL) {
+ _xdisplay = gdk_x11_get_default_xdisplay();
+
+ int glxmajor, glxminor;
+ if(!glXQueryVersion(_xdisplay, &glxmajor, &glxminor)) {
+ dbp("OpenGL is not supported");
+ oops();
+ }
+
+ if(glxmajor < 1 || (glxmajor == 1 && glxminor < 3)) {
+ dbp("GLX version %d.%d is too old; 1.3 required", glxmajor, glxminor);
+ oops();
+ }
+
+ static int fbconfig_attrs[] = {
+ GLX_RENDER_TYPE, GLX_RGBA_BIT,
+ GLX_RED_SIZE, 8,
+ GLX_GREEN_SIZE, 8,
+ GLX_BLUE_SIZE, 8,
+ GLX_DEPTH_SIZE, 24,
+ None
+ };
+ int fbconfig_num = 0;
+ GLXFBConfig *fbconfigs = glXChooseFBConfig(_xdisplay, DefaultScreen(_xdisplay),
+ fbconfig_attrs, &fbconfig_num);
+ if(!fbconfigs || fbconfig_num == 0)
+ oops();
+
+ /* prefer FBConfigs with depth of 32;
+ * Mesa software rasterizer explodes with a BadMatch without this;
+ * without this, Intel on Mesa flickers horribly for some reason.
+ this does not seem to affect other rasterizers (ie NVidia).
+
+ see this Mesa bug:
+ http://lists.freedesktop.org/archives/mesa-dev/2015-January/074693.html */
+ GLXFBConfig fbconfig = fbconfigs[0];
+ for(int i = 0; i < fbconfig_num; i++) {
+ XVisualInfo *visual_info = glXGetVisualFromFBConfig(_xdisplay, fbconfigs[i]);
+ /* some GL visuals, notably on Chromium GL, do not have an associated
+ X visual; this is not an obstacle as we always render offscreen. */
+ if(!visual_info) continue;
+ int depth = visual_info->depth;
+ XFree(visual_info);
+
+ if(depth == 32) {
+ fbconfig = fbconfigs[i];
+ break;
+ }
+ }
+
+ _glcontext = glXCreateNewContext(_xdisplay,
+ fbconfig, GLX_RGBA_TYPE, 0, True);
+ if(!_glcontext) {
+ dbp("cannot create OpenGL context");
+ oops();
+ }
+
+ XFree(fbconfigs);
+
+ /* create a dummy X window to create a rendering context against.
+ we could use a Pbuffer, but some implementations (Chromium GL)
+ don't support these. we could use an existing window, but
+ some implementations (Chromium GL... do you see a pattern?)
+ do really strange things, i.e. draw a black rectangle on
+ the very front of the desktop if you do this. */
+ _xwindow = XCreateSimpleWindow(_xdisplay,
+ XRootWindow(_xdisplay, gdk_x11_get_default_screen()),
+ /*x*/ 0, /*y*/ 0, /*width*/ 1, /*height*/ 1,
+ /*border_width*/ 0, /*border*/ 0, /*background*/ 0);
+ }
+
+ ~GlWidget() {
+ glXMakeCurrent(_xdisplay, None, NULL);
+
+ XDestroyWindow(_xdisplay, _xwindow);
+
+ delete _offscreen;
+
+ glXDestroyContext(_xdisplay, _glcontext);
+ }
+
+protected:
+ /* Draw on a GLX framebuffer object, then read pixels out and draw them on
+ the Cairo context. Slower, but you get to overlay nice widgets. */
+ virtual bool on_draw(const Cairo::RefPtr<Cairo::Context> &cr) {
+ if(!glXMakeCurrent(_xdisplay, _xwindow, _glcontext))
+ oops();
+
+ if(!_offscreen)
+ _offscreen = new GLOffscreen;
+
+ Gdk::Rectangle allocation = get_allocation();
+ if(!_offscreen->begin(allocation.get_width(), allocation.get_height()))
+ oops();
+
+ on_gl_draw();
+ glFlush();
+ GL_CHECK();
+
+ Cairo::RefPtr<Cairo::ImageSurface> surface = Cairo::ImageSurface::create(
+ _offscreen->end(), Cairo::FORMAT_RGB24,
+ allocation.get_width(), allocation.get_height(), allocation.get_width() * 4);
+ cr->set_source(surface, 0, 0);
+ cr->paint();
+ surface->finish();
+
+ return true;
+ }
+
+#ifdef HAVE_GTK2
+ virtual bool on_expose_event(GdkEventExpose *) {
+ return on_draw(get_window()->create_cairo_context());
+ }
+#endif
+
+ virtual void on_gl_draw() = 0;
+
+private:
+ Display *_xdisplay;
+ GLXContext _glcontext;
+ GLOffscreen *_offscreen;
+ ::Window _xwindow;
+};
+
+/* Editor overlay */
+
+class EditorOverlay : public Gtk::Fixed {
+public:
+ EditorOverlay(Gtk::Widget &underlay) : _underlay(underlay) {
+ set_size_request(0, 0);
+
+ add(_underlay);
+
+ _entry.set_no_show_all(true);
+ _entry.set_has_frame(false);
+ add(_entry);
+
+ _entry.signal_activate().
+ connect(sigc::mem_fun(this, &EditorOverlay::on_activate));
+ }
+
+ void start_editing(int x, int y, int font_height, bool is_monospace, int minWidthChars,
+ const std::string &val) {
+ Pango::FontDescription font_desc;
+ font_desc.set_family(is_monospace ? "monospace" : "normal");
+ font_desc.set_absolute_size(font_height * Pango::SCALE);
+
+#ifdef HAVE_GTK3
+ /* For some reason override_font doesn't take screen DPI into
+ account on GTK3 when working with font descriptors specified
+ in absolute sizes; modify_font does on GTK2. */
+ Pango::FontDescription override_font_desc(font_desc);
+ double dpi = get_screen()->get_resolution();
+ override_font_desc.set_size(font_height * 72.0 / dpi * Pango::SCALE);
+ _entry.override_font(override_font_desc);
+#else
+ _entry.modify_font(font_desc);
+#endif
+
+ /* y coordinate denotes baseline */
+ Pango::FontMetrics font_metrics = get_pango_context()->get_metrics(font_desc);
+ y -= font_metrics.get_ascent() / Pango::SCALE;
+
+ Glib::RefPtr<Pango::Layout> layout = Pango::Layout::create(get_pango_context());
+ layout->set_font_description(font_desc);
+ layout->set_text(val + " "); /* avoid scrolling */
+ int width = layout->get_logical_extents().get_width();
+
+#ifdef HAVE_GTK3
+ Gtk::Border border = _entry.get_style_context()->get_padding();
+ move(_entry, x - border.get_left(), y - border.get_top());
+ _entry.set_width_chars(minWidthChars);
+ _entry.set_size_request(width / Pango::SCALE, -1);
+#else
+ /* We need _gtk_entry_effective_inner_border, but it's not
+ in the public API, so emulate its logic. */
+ Gtk::Border border = { 2, 2, 2, 2 }, *style_border;
+ gtk_widget_style_get(GTK_WIDGET(_entry.gobj()), "inner-border",
+ &style_border, NULL);
+ if(style_border) border = *style_border;
+ move(_entry, x - border.left, y - border.top);
+ /* This is what set_width_chars does. */
+ int minWidth = minWidthChars * std::max(font_metrics.get_approximate_digit_width(),
+ font_metrics.get_approximate_char_width());
+ _entry.set_size_request(std::max(width, minWidth) / Pango::SCALE, -1);
+#endif
+
+ _entry.set_text(val);
+ if(!_entry.is_visible()) {
+ _entry.show();
+ _entry.grab_focus();
+ _entry.add_modal_grab();
+ }
+ }
+
+ void stop_editing() {
+ if(_entry.is_visible())
+ _entry.remove_modal_grab();
+ _entry.hide();
+ }
+
+ bool is_editing() const {
+ return _entry.is_visible();
+ }
+
+ sigc::signal<void, Glib::ustring> signal_editing_done() {
+ return _signal_editing_done;
+ }
+
+ Gtk::Entry &get_entry() {
+ return _entry;
+ }
+
+protected:
+ virtual bool on_key_press_event(GdkEventKey *event) {
+ if(event->keyval == GDK_KEY_Escape) {
+ stop_editing();
+ return true;
+ }
+
+ return false;
+ }
+
+ virtual void on_size_allocate(Gtk::Allocation& allocation) {
+ Gtk::Fixed::on_size_allocate(allocation);
+
+ _underlay.size_allocate(allocation);
+ }
+
+ virtual void on_activate() {
+ _signal_editing_done(_entry.get_text());
+ }
+
+private:
+ Gtk::Widget &_underlay;
+ Gtk::Entry _entry;
+ sigc::signal<void, Glib::ustring> _signal_editing_done;
+};
+
+/* Graphics window */
+
+int DeltaYOfScrollEvent(GdkEventScroll *event) {
+#ifdef HAVE_GTK3
+ int delta_y = event->delta_y;
+#else
+ int delta_y = 0;
+#endif
+ if(delta_y == 0) {
+ switch(event->direction) {
+ case GDK_SCROLL_UP:
+ delta_y = -1;
+ break;
+
+ case GDK_SCROLL_DOWN:
+ delta_y = 1;
+ break;
+
+ default:
+ /* do nothing */
+ return false;
+ }
+ }
+
+ return delta_y;
+}
+
+class GraphicsWidget : public GlWidget {
+public:
+ GraphicsWidget() {
+ set_events(Gdk::POINTER_MOTION_MASK |
+ Gdk::BUTTON_PRESS_MASK | Gdk::BUTTON_RELEASE_MASK | Gdk::BUTTON_MOTION_MASK |
+ Gdk::SCROLL_MASK |
+ Gdk::LEAVE_NOTIFY_MASK);
+ set_double_buffered(true);
+ }
+
+protected:
+ virtual bool on_configure_event(GdkEventConfigure *event) {
+ _w = event->width;
+ _h = event->height;
+
+ return GlWidget::on_configure_event(event);;
+ }
+
+ virtual void on_gl_draw() {
+ SS.GW.Paint();
+ }
+
+ virtual bool on_motion_notify_event(GdkEventMotion *event) {
+ int x, y;
+ ij_to_xy(event->x, event->y, x, y);
+
+ SS.GW.MouseMoved(x, y,
+ event->state & GDK_BUTTON1_MASK,
+ event->state & GDK_BUTTON2_MASK,
+ event->state & GDK_BUTTON3_MASK,
+ event->state & GDK_SHIFT_MASK,
+ event->state & GDK_CONTROL_MASK);
+
+ return true;
+ }
+
+ virtual bool on_button_press_event(GdkEventButton *event) {
+ int x, y;
+ ij_to_xy(event->x, event->y, x, y);
+
+ switch(event->button) {
+ case 1:
+ if(event->type == GDK_BUTTON_PRESS)
+ SS.GW.MouseLeftDown(x, y);
+ else if(event->type == GDK_2BUTTON_PRESS)
+ SS.GW.MouseLeftDoubleClick(x, y);
+ break;
+
+ case 2:
+ case 3:
+ SS.GW.MouseMiddleOrRightDown(x, y);
+ break;
+ }
+
+ return true;
+ }
+
+ virtual bool on_button_release_event(GdkEventButton *event) {
+ int x, y;
+ ij_to_xy(event->x, event->y, x, y);
+
+ switch(event->button) {
+ case 1:
+ SS.GW.MouseLeftUp(x, y);
+ break;
+
+ case 3:
+ SS.GW.MouseRightUp(x, y);
+ break;
+ }
+
+ return true;
+ }
+
+ virtual bool on_scroll_event(GdkEventScroll *event) {
+ int x, y;
+ ij_to_xy(event->x, event->y, x, y);
+
+ SS.GW.MouseScroll(x, y, -DeltaYOfScrollEvent(event));
+
+ return true;
+ }
+
+ virtual bool on_leave_notify_event (GdkEventCrossing *) {
+ SS.GW.MouseLeave();
+
+ return true;
+ }
+
+private:
+ int _w, _h;
+ void ij_to_xy(int i, int j, int &x, int &y) {
+ // Convert to xy (vs. ij) style coordinates,
+ // with (0, 0) at center
+ x = i - _w / 2;
+ y = _h / 2 - j;
+ }
+};
+
+class GraphicsWindowGtk : public Gtk::Window {
+public:
+ GraphicsWindowGtk() : _overlay(_widget), _is_fullscreen(false) {
+ set_default_size(900, 600);
+
+ _box.pack_start(_menubar, false, true);
+ _box.pack_start(_overlay, true, true);
+
+ add(_box);
+
+ _overlay.signal_editing_done().
+ connect(sigc::mem_fun(this, &GraphicsWindowGtk::on_editing_done));
+ }
+
+ GraphicsWidget &get_widget() {
+ return _widget;
+ }
+
+ EditorOverlay &get_overlay() {
+ return _overlay;
+ }
+
+ Gtk::MenuBar &get_menubar() {
+ return _menubar;
+ }
+
+ bool is_fullscreen() const {
+ return _is_fullscreen;
+ }
+
+ bool emulate_key_press(GdkEventKey *event) {
+ return on_key_press_event(event);
+ }
+
+protected:
+ virtual void on_show() {
+ Gtk::Window::on_show();
+
+ CnfThawWindowPos(this, "GraphicsWindow");
+ }
+
+ virtual void on_hide() {
+ CnfFreezeWindowPos(this, "GraphicsWindow");
+
+ Gtk::Window::on_hide();
+ }
+
+ virtual bool on_delete_event(GdkEventAny *) {
+ if(!SS.OkayToStartNewFile()) return true;
+ SS.Exit();
+
+ return true;
+ }
+
+ virtual bool on_window_state_event(GdkEventWindowState *event) {
+ _is_fullscreen = event->new_window_state & GDK_WINDOW_STATE_FULLSCREEN;
+
+ /* The event arrives too late for the caller of ToggleFullScreen
+ to notice state change; and it's possible that the WM will
+ refuse our request, so we can't just toggle the saved state */
+ SS.GW.EnsureValidActives();
+
+ return Gtk::Window::on_window_state_event(event);
+ }
+
+ virtual bool on_key_press_event(GdkEventKey *event) {
+ int chr;
+
+ switch(event->keyval) {
+ case GDK_KEY_Escape:
+ chr = GraphicsWindow::ESCAPE_KEY;
+ break;
+
+ case GDK_KEY_Delete:
+ chr = GraphicsWindow::DELETE_KEY;
+ break;
+
+ case GDK_KEY_Tab:
+ chr = '\t';
+ break;
+
+ case GDK_KEY_BackSpace:
+ case GDK_KEY_Back:
+ chr = '\b';
+ break;
+
+ default:
+ if(event->keyval >= GDK_KEY_F1 && event->keyval <= GDK_KEY_F12) {
+ chr = GraphicsWindow::FUNCTION_KEY_BASE + (event->keyval - GDK_KEY_F1);
+ } else {
+ chr = gdk_keyval_to_unicode(event->keyval);
+ }
+ }
+
+ if(event->state & GDK_SHIFT_MASK){
+ chr |= GraphicsWindow::SHIFT_MASK;
+ }
+ if(event->state & GDK_CONTROL_MASK) {
+ chr |= GraphicsWindow::CTRL_MASK;
+ }
+
+ if(chr && SS.GW.KeyDown(chr)) {
+ return true;
+ }
+
+ if(chr == '\t') {
+ // Workaround for https://bugzilla.gnome.org/show_bug.cgi?id=123994.
+ GraphicsWindow::MenuView(GraphicsWindow::MNU_SHOW_TEXT_WND);
+ return true;
+ }
+
+ return Gtk::Window::on_key_press_event(event);
+ }
+
+ virtual void on_editing_done(Glib::ustring value) {
+ SS.GW.EditControlDone(value.c_str());
+ }
+
+private:
+ GraphicsWidget _widget;
+ EditorOverlay _overlay;
+ Gtk::MenuBar _menubar;
+ Gtk::VBox _box;
+
+ bool _is_fullscreen;
+};
+
+std::unique_ptr<GraphicsWindowGtk> GW;
+
+void GetGraphicsWindowSize(int *w, int *h) {
+ Gdk::Rectangle allocation = GW->get_widget().get_allocation();
+ *w = allocation.get_width();
+ *h = allocation.get_height();
+}
+
+void InvalidateGraphics(void) {
+ GW->get_widget().queue_draw();
+}
+
+void PaintGraphics(void) {
+ GW->get_widget().queue_draw();
+ /* Process animation */
+ Glib::MainContext::get_default()->iteration(false);
+}
+
+void SetCurrentFilename(const std::string &filename) {
+ if(!filename.empty()) {
+ GW->set_title("SolveSpace - " + filename);
+ } else {
+ GW->set_title("SolveSpace - (not yet saved)");
+ }
+}
+
+void ToggleFullScreen(void) {
+ if(GW->is_fullscreen())
+ GW->unfullscreen();
+ else
+ GW->fullscreen();
+}
+
+bool FullScreenIsActive(void) {
+ return GW->is_fullscreen();
+}
+
+void ShowGraphicsEditControl(int x, int y, int fontHeight, int minWidthChars,
+ const std::string &val) {
+ Gdk::Rectangle rect = GW->get_widget().get_allocation();
+
+ // Convert to ij (vs. xy) style coordinates,
+ // and compensate for the input widget height due to inverse coord
+ int i, j;
+ i = x + rect.get_width() / 2;
+ j = -y + rect.get_height() / 2;
+
+ GW->get_overlay().start_editing(i, j, fontHeight, /*is_monospace=*/false, minWidthChars, val);
+}
+
+void HideGraphicsEditControl(void) {
+ GW->get_overlay().stop_editing();
+}
+
+bool GraphicsEditControlIsVisible(void) {
+ return GW->get_overlay().is_editing();
+}
+
+/* TODO: removing menubar breaks accelerators. */
+void ToggleMenuBar(void) {
+ GW->get_menubar().set_visible(!GW->get_menubar().is_visible());
+}
+
+bool MenuBarIsVisible(void) {
+ return GW->get_menubar().is_visible();
+}
+
+/* Context menus */
+
+class ContextMenuItem : public Gtk::MenuItem {
+public:
+ static int choice;
+
+ ContextMenuItem(const Glib::ustring &label, int id, bool mnemonic=false) :
+ Gtk::MenuItem(label, mnemonic), _id(id) {
+ }
+
+protected:
+ virtual void on_activate() {
+ Gtk::MenuItem::on_activate();
+
+ if(has_submenu())
+ return;
+
+ choice = _id;
+ }
+
+ /* Workaround for https://bugzilla.gnome.org/show_bug.cgi?id=695488.
+ This is used in addition to on_activate() to catch mouse events.
+ Without on_activate(), it would be impossible to select a menu item
+ via keyboard.
+ This selects the item twice in some cases, but we are idempotent.
+ */
+ virtual bool on_button_press_event(GdkEventButton *event) {
+ if(event->button == 1 && event->type == GDK_BUTTON_PRESS) {
+ on_activate();
+ return true;
+ }
+
+ return Gtk::MenuItem::on_button_press_event(event);
+ }
+
+private:
+ int _id;
+};
+
+int ContextMenuItem::choice = 0;
+
+static Gtk::Menu *context_menu = NULL, *context_submenu = NULL;
+
+void AddContextMenuItem(const char *label, int id) {
+ Gtk::MenuItem *menu_item;
+ if(label)
+ menu_item = new ContextMenuItem(label, id);
+ else
+ menu_item = new Gtk::SeparatorMenuItem();
+
+ if(id == CONTEXT_SUBMENU) {
+ menu_item->set_submenu(*context_submenu);
+ context_submenu = NULL;
+ }
+
+ if(context_submenu) {
+ context_submenu->append(*menu_item);
+ } else {
+ if(!context_menu)
+ context_menu = new Gtk::Menu;
+
+ context_menu->append(*menu_item);
+ }
+}
+
+void CreateContextSubmenu(void) {
+ if(context_submenu) oops();
+
+ context_submenu = new Gtk::Menu;
+}
+
+int ShowContextMenu(void) {
+ if(!context_menu)
+ return -1;
+
+ Glib::RefPtr<Glib::MainLoop> loop = Glib::MainLoop::create();
+ context_menu->signal_deactivate().
+ connect(sigc::mem_fun(loop.operator->(), &Glib::MainLoop::quit));
+
+ ContextMenuItem::choice = -1;
+
+ context_menu->show_all();
+ context_menu->popup(3, GDK_CURRENT_TIME);
+
+ loop->run();
+
+ delete context_menu;
+ context_menu = NULL;
+
+ return ContextMenuItem::choice;
+}
+
+/* Main menu */
+
+template<class MenuItem> class MainMenuItem : public MenuItem {
+public:
+ MainMenuItem(const GraphicsWindow::MenuEntry &entry) :
+ MenuItem(), _entry(entry), _synthetic(false) {
+ Glib::ustring label(_entry.label);
+ for(size_t i = 0; i < label.length(); i++) {
+ if(label[i] == '&')
+ label.replace(i, 1, "_");
+ }
+
+ guint accel_key = 0;
+ Gdk::ModifierType accel_mods = Gdk::ModifierType();
+ switch(_entry.accel) {
+ case GraphicsWindow::DELETE_KEY:
+ accel_key = GDK_KEY_Delete;
+ break;
+
+ case GraphicsWindow::ESCAPE_KEY:
+ accel_key = GDK_KEY_Escape;
+ break;
+
+ case '\t':
+ accel_key = GDK_KEY_Tab;
+ break;
+
+ default:
+ accel_key = _entry.accel & ~(GraphicsWindow::SHIFT_MASK | GraphicsWindow::CTRL_MASK);
+ if(accel_key > GraphicsWindow::FUNCTION_KEY_BASE &&
+ accel_key <= GraphicsWindow::FUNCTION_KEY_BASE + 12)
+ accel_key = GDK_KEY_F1 + (accel_key - GraphicsWindow::FUNCTION_KEY_BASE - 1);
+ else
+ accel_key = gdk_unicode_to_keyval(accel_key);
+
+ if(_entry.accel & GraphicsWindow::SHIFT_MASK)
+ accel_mods |= Gdk::SHIFT_MASK;
+ if(_entry.accel & GraphicsWindow::CTRL_MASK)
+ accel_mods |= Gdk::CONTROL_MASK;
+ }
+
+ MenuItem::set_label(label);
+ MenuItem::set_use_underline(true);
+ if(!(accel_key & 0x01000000))
+ MenuItem::set_accel_key(Gtk::AccelKey(accel_key, accel_mods));
+ }
+
+ void set_active(bool checked) {
+ if(MenuItem::get_active() == checked)
+ return;
+
+ _synthetic = true;
+ MenuItem::set_active(checked);
+ }
+
+protected:
+ virtual void on_activate() {
+ MenuItem::on_activate();
+
+ if(_synthetic)
+ _synthetic = false;
+ else if(!MenuItem::has_submenu() && _entry.fn)
+ _entry.fn(_entry.id);
+ }
+
+private:
+ const GraphicsWindow::MenuEntry &_entry;
+ bool _synthetic;
+};
+
+static std::map<int, Gtk::MenuItem *> main_menu_items;
+
+static void InitMainMenu(Gtk::MenuShell *menu_shell) {
+ Gtk::MenuItem *menu_item = NULL;
+ Gtk::MenuShell *levels[5] = {menu_shell, 0};
+
+ const GraphicsWindow::MenuEntry *entry = &GraphicsWindow::menu[0];
+ int current_level = 0;
+ while(entry->level >= 0) {
+ if(entry->level > current_level) {
+ Gtk::Menu *menu = new Gtk::Menu;
+ menu_item->set_submenu(*menu);
+
+ if((unsigned)entry->level >= sizeof(levels) / sizeof(levels[0]))
+ oops();
+
+ levels[entry->level] = menu;
+ }
+
+ current_level = entry->level;
+
+ if(entry->label) {
+ switch(entry->kind) {
+ case GraphicsWindow::MENU_ITEM_NORMAL:
+ menu_item = new MainMenuItem<Gtk::MenuItem>(*entry);
+ break;
+
+ case GraphicsWindow::MENU_ITEM_CHECK:
+ menu_item = new MainMenuItem<Gtk::CheckMenuItem>(*entry);
+ break;
+
+ case GraphicsWindow::MENU_ITEM_RADIO:
+ MainMenuItem<Gtk::CheckMenuItem> *radio_item =
+ new MainMenuItem<Gtk::CheckMenuItem>(*entry);
+ radio_item->set_draw_as_radio(true);
+ menu_item = radio_item;
+ break;
+ }
+ } else {
+ menu_item = new Gtk::SeparatorMenuItem();
+ }
+
+ levels[entry->level]->append(*menu_item);
+
+ main_menu_items[entry->id] = menu_item;
+
+ ++entry;
+ }
+}
+
+void EnableMenuById(int id, bool enabled) {
+ main_menu_items[id]->set_sensitive(enabled);
+}
+
+void CheckMenuById(int id, bool checked) {
+ ((MainMenuItem<Gtk::CheckMenuItem>*)main_menu_items[id])->set_active(checked);
+}
+
+void RadioMenuById(int id, bool selected) {
+ SolveSpace::CheckMenuById(id, selected);
+}
+
+class RecentMenuItem : public Gtk::MenuItem {
+public:
+ RecentMenuItem(const Glib::ustring& label, int id) :
+ MenuItem(label), _id(id) {
+ }
+
+protected:
+ virtual void on_activate() {
+ if(_id >= RECENT_OPEN && _id < (RECENT_OPEN + MAX_RECENT))
+ SolveSpaceUI::MenuFile(_id);
+ else if(_id >= RECENT_LINK && _id < (RECENT_LINK + MAX_RECENT))
+ Group::MenuGroup(_id);
+ }
+
+private:
+ int _id;
+};
+
+static void RefreshRecentMenu(int id, int base) {
+ Gtk::MenuItem *recent = static_cast<Gtk::MenuItem*>(main_menu_items[id]);
+ recent->unset_submenu();
+
+ Gtk::Menu *menu = new Gtk::Menu;
+ recent->set_submenu(*menu);
+
+ if(std::string(RecentFile[0]).empty()) {
+ Gtk::MenuItem *placeholder = new Gtk::MenuItem("(no recent files)");
+ placeholder->set_sensitive(false);
+ menu->append(*placeholder);
+ } else {
+ for(int i = 0; i < MAX_RECENT; i++) {
+ if(std::string(RecentFile[i]).empty())
+ break;
+
+ RecentMenuItem *item = new RecentMenuItem(RecentFile[i], base + i);
+ menu->append(*item);
+ }
+ }
+
+ menu->show_all();
+}
+
+void RefreshRecentMenus(void) {
+ RefreshRecentMenu(GraphicsWindow::MNU_OPEN_RECENT, RECENT_OPEN);
+ RefreshRecentMenu(GraphicsWindow::MNU_GROUP_RECENT, RECENT_LINK);
+}
+
+/* Save/load */
+
+static std::string ConvertFilters(std::string active, const FileFilter ssFilters[],
+ Gtk::FileChooser *chooser) {
+ for(const FileFilter *ssFilter = ssFilters; ssFilter->name; ssFilter++) {
+#ifdef HAVE_GTK3
+ Glib::RefPtr<Gtk::FileFilter> filter = Gtk::FileFilter::create();
+#else
+ Gtk::FileFilter *filter = new Gtk::FileFilter;
+#endif
+ filter->set_name(ssFilter->name);
+
+ bool is_active = false;
+ std::string desc = "";
+ for(const char *const *ssPattern = ssFilter->patterns; *ssPattern; ssPattern++) {
+ std::string pattern = "*." + std::string(*ssPattern);
+ filter->add_pattern(pattern);
+ filter->add_pattern(Glib::ustring(pattern).uppercase());
+ if(active == "")
+ active = pattern.substr(2);
+ if("*." + active == pattern)
+ is_active = true;
+ if(desc == "")
+ desc = pattern;
+ else
+ desc += ", " + pattern;
+ }
+ filter->set_name(filter->get_name() + " (" + desc + ")");
+
+#ifdef HAVE_GTK3
+ chooser->add_filter(filter);
+ if(is_active)
+ chooser->set_filter(filter);
+#else
+ chooser->add_filter(*filter);
+ if(is_active)
+ chooser->set_filter(*filter);
+#endif
+ }
+
+ return active;
+}
+
+bool GetOpenFile(std::string *filename, const std::string &activeOrEmpty,
+ const FileFilter filters[]) {
+ Gtk::FileChooserDialog chooser(*GW, "SolveSpace - Open File");
+ chooser.set_filename(*filename);
+ chooser.add_button("_Cancel", Gtk::RESPONSE_CANCEL);
+ chooser.add_button("_Open", Gtk::RESPONSE_OK);
+ chooser.set_current_folder(CnfThawString("", "FileChooserPath"));
+
+ ConvertFilters(activeOrEmpty, filters, &chooser);
+
+ if(chooser.run() == Gtk::RESPONSE_OK) {
+ CnfFreezeString(chooser.get_current_folder(), "FileChooserPath");
+ *filename = chooser.get_filename();
+ return true;
+ } else {
+ return false;
+ }
+}
+
+/* Glib::path_get_basename got /removed/ in 3.0?! Come on */
+static std::string Basename(std::string filename) {
+ int slash = filename.rfind('/');
+ if(slash >= 0)
+ return filename.substr(slash + 1, filename.length());
+ return "";
+}
+
+static void ChooserFilterChanged(Gtk::FileChooserDialog *chooser)
+{
+ /* Extract the pattern from the filter. GtkFileFilter doesn't provide
+ any way to list the patterns, so we extract it from the filter name.
+ Gross. */
+ std::string filter_name = chooser->get_filter()->get_name();
+ int lparen = filter_name.rfind('(') + 1;
+ int rdelim = filter_name.find(',', lparen);
+ if(rdelim < 0)
+ rdelim = filter_name.find(')', lparen);
+ if(lparen < 0 || rdelim < 0)
+ oops();
+
+ std::string extension = filter_name.substr(lparen, rdelim - lparen);
+ if(extension == "*")
+ return;
+
+ if(extension.length() > 2 && extension.substr(0, 2) == "*.")
+ extension = extension.substr(2, extension.length() - 2);
+
+ std::string basename = Basename(chooser->get_filename());
+ int dot = basename.rfind('.');
+ if(dot >= 0) {
+ basename.replace(dot + 1, basename.length() - dot - 1, extension);
+ chooser->set_current_name(basename);
+ } else {
+ chooser->set_current_name(basename + "." + extension);
+ }
+}
+
+bool GetSaveFile(std::string *filename, const std::string &activeOrEmpty,
+ const FileFilter filters[]) {
+ Gtk::FileChooserDialog chooser(*GW, "SolveSpace - Save File",
+ Gtk::FILE_CHOOSER_ACTION_SAVE);
+ chooser.set_do_overwrite_confirmation(true);
+ chooser.add_button("_Cancel", Gtk::RESPONSE_CANCEL);
+ chooser.add_button("_Save", Gtk::RESPONSE_OK);
+
+ std::string active = ConvertFilters(activeOrEmpty, filters, &chooser);
+
+ chooser.set_current_folder(CnfThawString("", "FileChooserPath"));
+ chooser.set_current_name(std::string("untitled.") + active);
+
+ /* Gtk's dialog doesn't change the extension when you change the filter,
+ and makes it extremely hard to do so. Gtk is garbage. */
+ chooser.property_filter().signal_changed().
+ connect(sigc::bind(sigc::ptr_fun(&ChooserFilterChanged), &chooser));
+
+ if(chooser.run() == Gtk::RESPONSE_OK) {
+ CnfFreezeString(chooser.get_current_folder(), "FileChooserPath");
+ *filename = chooser.get_filename();
+ return true;
+ } else {
+ return false;
+ }
+}
+
+DialogChoice SaveFileYesNoCancel(void) {
+ Glib::ustring message =
+ "The file has changed since it was last saved.\n"
+ "Do you want to save the changes?";
+ Gtk::MessageDialog dialog(*GW, message, /*use_markup*/ true, Gtk::MESSAGE_QUESTION,
+ Gtk::BUTTONS_NONE, /*is_modal*/ true);
+ dialog.set_title("SolveSpace - Modified File");
+ dialog.add_button("_Save", Gtk::RESPONSE_YES);
+ dialog.add_button("Do_n't Save", Gtk::RESPONSE_NO);
+ dialog.add_button("_Cancel", Gtk::RESPONSE_CANCEL);
+
+ switch(dialog.run()) {
+ case Gtk::RESPONSE_YES:
+ return DIALOG_YES;
+
+ case Gtk::RESPONSE_NO:
+ return DIALOG_NO;
+
+ case Gtk::RESPONSE_CANCEL:
+ default:
+ return DIALOG_CANCEL;
+ }
+}
+
+DialogChoice LoadAutosaveYesNo(void) {
+ Glib::ustring message =
+ "An autosave file is availible for this project.\n"
+ "Do you want to load the autosave file instead?";
+ Gtk::MessageDialog dialog(*GW, message, /*use_markup*/ true, Gtk::MESSAGE_QUESTION,
+ Gtk::BUTTONS_NONE, /*is_modal*/ true);
+ dialog.set_title("SolveSpace - Autosave Available");
+ dialog.add_button("_Load autosave", Gtk::RESPONSE_YES);
+ dialog.add_button("Do_n't Load", Gtk::RESPONSE_NO);
+
+ switch(dialog.run()) {
+ case Gtk::RESPONSE_YES:
+ return DIALOG_YES;
+
+ case Gtk::RESPONSE_NO:
+ default:
+ return DIALOG_NO;
+ }
+}
+
+DialogChoice LocateImportedFileYesNoCancel(const std::string &filename,
+ bool canCancel) {
+ Glib::ustring message =
+ "The linked file " + filename + " is not present.\n"
+ "Do you want to locate it manually?\n"
+ "If you select \"No\", any geometry that depends on "
+ "the missing file will be removed.";
+ Gtk::MessageDialog dialog(*GW, message, /*use_markup*/ true, Gtk::MESSAGE_QUESTION,
+ Gtk::BUTTONS_NONE, /*is_modal*/ true);
+ dialog.set_title("SolveSpace - Missing File");
+ dialog.add_button("_Yes", Gtk::RESPONSE_YES);
+ dialog.add_button("_No", Gtk::RESPONSE_NO);
+ if(canCancel)
+ dialog.add_button("_Cancel", Gtk::RESPONSE_CANCEL);
+
+ switch(dialog.run()) {
+ case Gtk::RESPONSE_YES:
+ return DIALOG_YES;
+
+ case Gtk::RESPONSE_NO:
+ return DIALOG_NO;
+
+ case Gtk::RESPONSE_CANCEL:
+ default:
+ return DIALOG_CANCEL;
+ }
+}
+
+/* Text window */
+
+class TextWidget : public GlWidget {
+public:
+#ifdef HAVE_GTK3
+ TextWidget(Glib::RefPtr<Gtk::Adjustment> adjustment) : _adjustment(adjustment) {
+#else
+ TextWidget(Gtk::Adjustment* adjustment) : _adjustment(adjustment) {
+#endif
+ set_events(Gdk::POINTER_MOTION_MASK | Gdk::BUTTON_PRESS_MASK | Gdk::SCROLL_MASK |
+ Gdk::LEAVE_NOTIFY_MASK);
+ }
+
+ void set_cursor_hand(bool is_hand) {
+ Glib::RefPtr<Gdk::Window> gdkwin = get_window();
+ if(gdkwin) { // returns NULL if not realized
+ Gdk::CursorType type = is_hand ? Gdk::HAND1 : Gdk::ARROW;
+#ifdef HAVE_GTK3
+ gdkwin->set_cursor(Gdk::Cursor::create(type));
+#else
+ gdkwin->set_cursor(Gdk::Cursor(type));
+#endif
+ }
+ }
+
+protected:
+ virtual void on_gl_draw() {
+ SS.TW.Paint();
+ }
+
+ virtual bool on_motion_notify_event(GdkEventMotion *event) {
+ SS.TW.MouseEvent(/*leftClick*/ false,
+ /*leftDown*/ event->state & GDK_BUTTON1_MASK,
+ event->x, event->y);
+
+ return true;
+ }
+
+ virtual bool on_button_press_event(GdkEventButton *event) {
+ SS.TW.MouseEvent(/*leftClick*/ event->type == GDK_BUTTON_PRESS,
+ /*leftDown*/ event->state & GDK_BUTTON1_MASK,
+ event->x, event->y);
+
+ return true;
+ }
+
+ virtual bool on_scroll_event(GdkEventScroll *event) {
+ _adjustment->set_value(_adjustment->get_value() +
+ DeltaYOfScrollEvent(event) * _adjustment->get_page_increment());
+
+ return true;
+ }
+
+ virtual bool on_leave_notify_event (GdkEventCrossing *) {
+ SS.TW.MouseLeave();
+
+ return true;
+ }
+
+private:
+#ifdef HAVE_GTK3
+ Glib::RefPtr<Gtk::Adjustment> _adjustment;
+#else
+ Gtk::Adjustment *_adjustment;
+#endif
+};
+
+class TextWindowGtk : public Gtk::Window {
+public:
+ TextWindowGtk() : _scrollbar(), _widget(_scrollbar.get_adjustment()),
+ _overlay(_widget), _box() {
+ set_type_hint(Gdk::WINDOW_TYPE_HINT_UTILITY);
+ set_skip_taskbar_hint(true);
+ set_skip_pager_hint(true);
+ set_title("SolveSpace - Property Browser");
+ set_default_size(420, 300);
+
+ _box.pack_start(_overlay, true, true);
+ _box.pack_start(_scrollbar, false, true);
+ add(_box);
+
+ _scrollbar.get_adjustment()->signal_value_changed().
+ connect(sigc::mem_fun(this, &TextWindowGtk::on_scrollbar_value_changed));
+
+ _overlay.signal_editing_done().
+ connect(sigc::mem_fun(this, &TextWindowGtk::on_editing_done));
+
+ _overlay.get_entry().signal_motion_notify_event().
+ connect(sigc::mem_fun(this, &TextWindowGtk::on_editor_motion_notify_event));
+ _overlay.get_entry().signal_button_press_event().
+ connect(sigc::mem_fun(this, &TextWindowGtk::on_editor_button_press_event));
+ }
+
+ Gtk::VScrollbar &get_scrollbar() {
+ return _scrollbar;
+ }
+
+ TextWidget &get_widget() {
+ return _widget;
+ }
+
+ EditorOverlay &get_overlay() {
+ return _overlay;
+ }
+
+protected:
+ virtual void on_show() {
+ Gtk::Window::on_show();
+
+ CnfThawWindowPos(this, "TextWindow");
+ }
+
+ virtual void on_hide() {
+ CnfFreezeWindowPos(this, "TextWindow");
+
+ Gtk::Window::on_hide();
+ }
+
+ virtual bool on_delete_event(GdkEventAny *) {
+ /* trigger the action and ignore the request */
+ GraphicsWindow::MenuView(GraphicsWindow::MNU_SHOW_TEXT_WND);
+
+ return false;
+ }
+
+ virtual void on_scrollbar_value_changed() {
+ SS.TW.ScrollbarEvent(_scrollbar.get_adjustment()->get_value());
+ }
+
+ virtual void on_editing_done(Glib::ustring value) {
+ SS.TW.EditControlDone(value.c_str());
+ }
+
+ virtual bool on_editor_motion_notify_event(GdkEventMotion *event) {
+ return _widget.event((GdkEvent*) event);
+ }
+
+ virtual bool on_editor_button_press_event(GdkEventButton *event) {
+ return _widget.event((GdkEvent*) event);
+ }
+
+ virtual bool on_key_press_event(GdkEventKey *event) {
+ if(GW->emulate_key_press(event)) {
+ return true;
+ }
+
+ return Gtk::Window::on_key_press_event(event);
+ }
+
+private:
+ Gtk::VScrollbar _scrollbar;
+ TextWidget _widget;
+ EditorOverlay _overlay;
+ Gtk::HBox _box;
+};
+
+std::unique_ptr<TextWindowGtk> TW;
+
+void ShowTextWindow(bool visible) {
+ if(visible)
+ TW->show();
+ else
+ TW->hide();
+}
+
+void GetTextWindowSize(int *w, int *h) {
+ Gdk::Rectangle allocation = TW->get_widget().get_allocation();
+ *w = allocation.get_width();
+ *h = allocation.get_height();
+}
+
+void InvalidateText(void) {
+ TW->get_widget().queue_draw();
+}
+
+void MoveTextScrollbarTo(int pos, int maxPos, int page) {
+ TW->get_scrollbar().get_adjustment()->configure(pos, 0, maxPos, 1, 10, page);
+}
+
+void SetMousePointerToHand(bool is_hand) {
+ TW->get_widget().set_cursor_hand(is_hand);
+}
+
+void ShowTextEditControl(int x, int y, const std::string &val) {
+ TW->get_overlay().start_editing(x, y, TextWindow::CHAR_HEIGHT, /*is_monospace=*/true, 30, val);
+}
+
+void HideTextEditControl(void) {
+ TW->get_overlay().stop_editing();
+}
+
+bool TextEditControlIsVisible(void) {
+ return TW->get_overlay().is_editing();
+}
+
+/* Miscellanea */
+
+
+void DoMessageBox(const char *message, int rows, int cols, bool error) {
+ Gtk::MessageDialog dialog(*GW, message, /*use_markup*/ true,
+ error ? Gtk::MESSAGE_ERROR : Gtk::MESSAGE_INFO, Gtk::BUTTONS_OK,
+ /*is_modal*/ true);
+ dialog.set_title(error ? "SolveSpace - Error" : "SolveSpace - Message");
+ dialog.run();
+}
+
+void OpenWebsite(const char *url) {
+ gtk_show_uri(Gdk::Screen::get_default()->gobj(), url, GDK_CURRENT_TIME, NULL);
+}
+
+/* fontconfig is already initialized by GTK */
+std::vector<std::string> GetFontFiles() {
+ std::vector<std::string> fonts;
+
+ FcPattern *pat = FcPatternCreate();
+ FcObjectSet *os = FcObjectSetBuild(FC_FILE, (char *)0);
+ FcFontSet *fs = FcFontList(0, pat, os);
+
+ for(int i = 0; i < fs->nfont; i++) {
+ FcChar8 *filenameFC = FcPatternFormat(fs->fonts[i], (const FcChar8*) "%{file}");
+ std::string filename = (char*) filenameFC;
+ fonts.push_back(filename);
+ FcStrFree(filenameFC);
+ }
+
+ FcFontSetDestroy(fs);
+ FcObjectSetDestroy(os);
+ FcPatternDestroy(pat);
+
+ return fonts;
+}
+
+/* Space Navigator support */
+
+#ifdef HAVE_SPACEWARE
+static GdkFilterReturn GdkSpnavFilter(GdkXEvent *gxevent, GdkEvent *, gpointer) {
+ XEvent *xevent = (XEvent*) gxevent;
+
+ spnav_event sev;
+ if(!spnav_x11_event(xevent, &sev))
+ return GDK_FILTER_CONTINUE;
+
+ switch(sev.type) {
+ case SPNAV_EVENT_MOTION:
+ SS.GW.SpaceNavigatorMoved(
+ (double)sev.motion.x,
+ (double)sev.motion.y,
+ (double)sev.motion.z * -1.0,
+ (double)sev.motion.rx * 0.001,
+ (double)sev.motion.ry * 0.001,
+ (double)sev.motion.rz * -0.001,
+ xevent->xmotion.state & ShiftMask);
+ break;
+
+ case SPNAV_EVENT_BUTTON:
+ if(!sev.button.press && sev.button.bnum == 0) {
+ SS.GW.SpaceNavigatorButtonUp();
+ }
+ break;
+ }
+
+ return GDK_FILTER_REMOVE;
+}
+#endif
+
+/* Application lifecycle */
+
+void ExitNow(void) {
+ GW->hide();
+ TW->hide();
+}
+};
+
+int main(int argc, char** argv) {
+ /* It would in principle be possible to judiciously use
+ Glib::filename_{from,to}_utf8, but it's not really worth
+ the effort.
+ The setlocale() call is necessary for Glib::get_charset()
+ to detect the system character set; otherwise it thinks
+ it is always ANSI_X3.4-1968.
+ We set it back to C after all. */
+ setlocale(LC_ALL, "");
+ if(!Glib::get_charset()) {
+ std::cerr << "Sorry, only UTF-8 locales are supported." << std::endl;
+ return 1;
+ }
+ setlocale(LC_ALL, "C");
+
+ /* If we don't do this, gtk_init will set the C standard library
+ locale, and printf will format floats using ",". We will then
+ fail to parse these. Also, many text window lines will become
+ ambiguous. */
+ gtk_disable_setlocale();
+
+ Gtk::Main main(argc, argv);
+
+#ifdef HAVE_SPACEWARE
+ gdk_window_add_filter(NULL, GdkSpnavFilter, NULL);
+#endif
+
+ CnfLoad();
+
+ TW.reset(new TextWindowGtk);
+ GW.reset(new GraphicsWindowGtk);
+ InitMainMenu(&GW->get_menubar());
+ GW->get_menubar().accelerate(*TW);
+ TW->set_transient_for(*GW);
+
+ TW->show_all();
+ GW->show_all();
+
+#ifdef HAVE_SPACEWARE
+#ifdef HAVE_GTK3
+ // We don't care if it can't be opened; just continue without.
+ spnav_x11_open(gdk_x11_get_default_xdisplay(),
+ gdk_x11_window_get_xid(GW->get_window()->gobj()));
+#else
+ spnav_x11_open(gdk_x11_get_default_xdisplay(),
+ GDK_WINDOW_XWINDOW(GW->get_window()->gobj()));
+#endif
+#endif
+
+ SS.Init();
+
+ if(argc >= 2) {
+ if(argc > 2) {
+ std::cerr << "Only the first file passed on command line will be opened."
+ << std::endl;
+ }
+
+ /* Make sure the argument is valid UTF-8. */
+ SS.OpenFile(Glib::ustring(argv[1]));
+ }
+
+ main.run(*GW);
+
+ TW.reset();
+ GW.reset();
+
+ SK.Clear();
+ SS.Clear();
+
+ return 0;
+}
--- /dev/null
+#include "solvespace.h"
+#include "libdxfrw.h"
+#include "libdwgr.h"
+
+#ifdef WIN32
+// Conflicts with DRW::TEXT.
+# undef TEXT
+#endif
+
+namespace SolveSpace {
+
+static std::string ToUpper(std::string str) {
+ std::transform(str.begin(), str.end(), str.begin(), ::toupper);
+ return str;
+}
+
+class DxfReadInterface : public DRW_Interface {
+public:
+ Vector blockX;
+ Vector blockY;
+ Vector blockT;
+
+ void invertXTransform() {
+ blockX.x = -blockX.x;
+ blockY.x = -blockY.x;
+ blockT.x = -blockT.x;
+ }
+
+ void multBlockTransform(double x, double y, double sx, double sy, double angle) {
+ Vector oldX = blockX;
+ Vector oldY = blockY;
+ Vector oldT = blockT;
+
+ Vector newX = Vector::From(sx, 0.0, 0.0).RotatedAbout(Vector::From(0.0, 0.0, 1.0), angle);
+ Vector newY = Vector::From(0.0, sy, 0.0).RotatedAbout(Vector::From(0.0, 0.0, 1.0), angle);
+ Vector newT = Vector::From(x, y, 0.0);
+
+ blockX = oldX.ScaledBy(newX.x).Plus(
+ oldY.ScaledBy(newX.y));
+
+ blockY = oldX.ScaledBy(newY.x).Plus(
+ oldY.ScaledBy(newY.y));
+
+ blockT = oldX.ScaledBy(newT.x).Plus(
+ oldY.ScaledBy(newT.y)).Plus(oldT);
+ }
+
+ void clearBlockTransform() {
+ blockX = Vector::From(1.0, 0.0, 0.0);
+ blockY = Vector::From(0.0, 1.0, 0.0);
+ blockT = Vector::From(0.0, 0.0, 0.0);
+ }
+
+ Vector blockTransform(Vector v) {
+ Vector r = blockT;
+ r = r.Plus(blockX.ScaledBy(v.x));
+ r = r.Plus(blockY.ScaledBy(v.y));
+ return r;
+ }
+
+ void blockTransformArc(Vector *c, Vector *p0, Vector *p1) {
+ bool oldSign = p0->Minus(*c).Cross(p1->Minus(*c)).z > 0.0;
+
+ *c = blockTransform(*c);
+ *p0 = blockTransform(*p0);
+ *p1 = blockTransform(*p1);
+
+ bool newSign = p0->Minus(*c).Cross(p1->Minus(*c)).z > 0.0;
+ if(oldSign != newSign) std::swap(*p0, *p1);
+ }
+
+ Vector toVector(const DRW_Coord &c, bool transform = true) {
+ Vector result = Vector::From(c.x, c.y, 0.0);
+ if(transform) return blockTransform(result);
+ return result;
+ }
+
+ Vector toVector(const DRW_Vertex2D &c) {
+ Vector result = Vector::From(c.x, c.y, 0.0);
+ return blockTransform(result);
+ }
+
+ Vector toVector(const DRW_Vertex &c) {
+ Vector result = Vector::From(c.basePoint.x, c.basePoint.y, 0.0);
+ return blockTransform(result);
+ }
+
+ double angleTo(Vector v0, Vector v1) {
+ Vector d = v1.Minus(v0);
+ double a = atan2(d.y, d.x);
+ return M_PI + remainder(a - M_PI, 2 * M_PI);
+ }
+
+ Vector polar(double radius, double angle) {
+ return Vector::From(radius * cos(angle), radius * sin(angle), 0.0);
+ }
+
+ hRequest createBulge(Vector p0, Vector p1, double bulge) {
+ bool reversed = bulge < 0.0;
+ double alpha = atan(bulge) * 4.0;
+
+ Vector middle = p1.Plus(p0).ScaledBy(0.5);
+ double dist = p1.Minus(p0).Magnitude() / 2.0;
+ double angle = angleTo(p0, p1);
+
+ // alpha can't be 0.0 at this point
+ double radius = fabs(dist / sin(alpha / 2.0));
+ double wu = fabs(radius * radius - dist * dist);
+ double h = sqrt(wu);
+
+ if(bulge > 0.0) {
+ angle += M_PI_2;
+ } else {
+ angle -= M_PI_2;
+ }
+
+ if (fabs(alpha) > M_PI) {
+ h *= -1.0;
+ }
+
+ Vector center = polar(h, angle);
+ center = center.Plus(middle);
+
+ if(reversed) std::swap(p0, p1);
+ blockTransformArc(¢er, &p0, &p1);
+
+ hRequest hr = SS.GW.AddRequest(Request::ARC_OF_CIRCLE, false);
+ SK.GetEntity(hr.entity(1))->PointForceTo(center);
+ SK.GetEntity(hr.entity(2))->PointForceTo(p0);
+ SK.GetEntity(hr.entity(3))->PointForceTo(p1);
+ processPoint(hr.entity(1));
+ processPoint(hr.entity(2));
+ processPoint(hr.entity(3));
+ return hr;
+ }
+
+ struct Block {
+ std::vector<std::unique_ptr<DRW_Entity>> entities;
+ DRW_Block data;
+ };
+
+ unsigned unknownEntities = 0;
+ std::map<std::string, hStyle> styles;
+ std::map<std::string, Block> blocks;
+ std::map<std::string, DRW_Layer> layers;
+ Block *readBlock = NULL;
+ const DRW_Insert *insertInsert = NULL;
+
+ template<class T>
+ bool addPendingBlockEntity(const T &e) {
+ if(readBlock == NULL) return false;
+ readBlock->entities.emplace_back(new T(e));
+ return true;
+ }
+
+ void addEntity(DRW_Entity *e) {
+ switch(e->eType) {
+ case DRW::POINT:
+ addPoint(*static_cast<DRW_Point *>(e));
+ break;
+ case DRW::LINE:
+ addLine(*static_cast<DRW_Line *>(e));
+ break;
+ case DRW::ARC:
+ addArc(*static_cast<DRW_Arc *>(e));
+ break;
+ case DRW::CIRCLE:
+ addCircle(*static_cast<DRW_Circle *>(e));
+ break;
+ case DRW::POLYLINE:
+ addPolyline(*static_cast<DRW_Polyline *>(e));
+ break;
+ case DRW::LWPOLYLINE:
+ addLWPolyline(*static_cast<DRW_LWPolyline *>(e));
+ break;
+ case DRW::SPLINE:
+ addSpline(static_cast<DRW_Spline *>(e));
+ break;
+ case DRW::INSERT:
+ addInsert(*static_cast<DRW_Insert *>(e));
+ break;
+ case DRW::TEXT:
+ addText(*static_cast<DRW_Text *>(e));
+ break;
+ case DRW::MTEXT:
+ addMText(*static_cast<DRW_MText *>(e));
+ break;
+ case DRW::DIMALIGNED:
+ addDimAlign(static_cast<DRW_DimAligned *>(e));
+ break;
+ case DRW::DIMLINEAR:
+ addDimLinear(static_cast<DRW_DimLinear *>(e));
+ break;
+ case DRW::DIMRADIAL:
+ addDimRadial(static_cast<DRW_DimRadial *>(e));
+ break;
+ case DRW::DIMDIAMETRIC:
+ addDimDiametric(static_cast<DRW_DimDiametric *>(e));
+ break;
+ case DRW::DIMANGULAR:
+ addDimAngular(static_cast<DRW_DimAngular *>(e));
+ break;
+ default:
+ unknownEntities++;
+ }
+ }
+
+ int dxfAlignToOrigin(DRW_Text::HAlign alignH, DRW_Text::VAlign alignV) {
+ int origin = 0;
+ switch(alignH) {
+ case DRW_Text::HLeft:
+ origin |= Style::ORIGIN_LEFT;
+ break;
+
+ case DRW_Text::HMiddle:
+ case DRW_Text::HCenter:
+ break;
+
+ case DRW_Text::HRight:
+ origin |= Style::ORIGIN_RIGHT;
+ break;
+
+ case DRW_Text::HAligned:
+ case DRW_Text::HFit:
+ default:
+ origin |= Style::ORIGIN_LEFT;
+ break;
+ }
+
+ switch(alignV) {
+ case DRW_Text::VBaseLine:
+ case DRW_Text::VBottom:
+ origin |= Style::ORIGIN_BOT;
+ break;
+
+ case DRW_Text::VMiddle:
+ break;
+
+ case DRW_Text::VTop:
+ origin |= Style::ORIGIN_TOP;
+ break;
+
+ default:
+ origin |= Style::ORIGIN_BOT;
+ break;
+ }
+
+ return origin;
+ }
+
+ DRW_Layer *getSourceLayer(const DRW_Entity *e) {
+ DRW_Layer *layer = NULL;
+ if(insertInsert != NULL) {
+ std::string l = insertInsert->layer;
+ auto bi = layers.find(l);
+ if(bi != layers.end()) layer = &bi->second;
+ } else {
+ std::string l = e->layer;
+ auto bi = layers.find(l);
+ if(bi != layers.end()) layer = &bi->second;
+ }
+ return layer;
+ }
+
+ int getColor(const DRW_Entity *e) {
+ int col = e->color;
+ if(col == DRW::ColorByBlock) {
+ if(insertInsert != NULL) {
+ col = insertInsert->color;
+ } else {
+ col = 7;
+ }
+ }
+ if(col == DRW::ColorByLayer) {
+ DRW_Layer *layer = getSourceLayer(e);
+ if(layer != NULL) {
+ col = layer->color;
+ } else {
+ col = 7;
+ }
+ }
+ return col;
+ }
+
+ DRW_LW_Conv::lineWidth getLineWidth(const DRW_Entity *e) {
+ DRW_LW_Conv::lineWidth result = e->lWeight;
+ if(result == DRW_LW_Conv::widthByBlock) {
+ if(insertInsert != NULL) {
+ result = insertInsert->lWeight;
+ } else {
+ result = DRW_LW_Conv::widthDefault;
+ }
+ }
+ if(result == DRW_LW_Conv::widthByLayer) {
+ DRW_Layer *layer = getSourceLayer(e);
+ if(layer != NULL) {
+ result = layer->lWeight;
+ } else {
+ result = DRW_LW_Conv::widthDefault;
+ }
+ }
+ return result;
+ }
+
+ std::string getLineType(const DRW_Entity *e) {
+ std::string result = e->lineType;
+ if(result == "BYBLOCK") {
+ if(insertInsert != NULL) {
+ result = ToUpper(insertInsert->lineType);
+ } else {
+ result = "CONTINUOUS";
+ }
+ }
+ if(result == "BYLAYER") {
+ DRW_Layer *layer = getSourceLayer(e);
+ if(layer != NULL) {
+ result = ToUpper(layer->lineType);
+ } else {
+ result = "CONTINUOUS";
+ }
+ }
+ return result;
+ }
+
+ hStyle invisibleStyle() {
+ std::string id = "@dxf-invisible";
+
+ auto si = styles.find(id);
+ if(si != styles.end()) {
+ return si->second;
+ }
+
+ hStyle hs = { Style::CreateCustomStyle(/*rememberForUndo=*/false) };
+ Style *s = Style::Get(hs);
+ s->name = id;
+ s->visible = false;
+
+ styles.emplace(id, hs);
+ return hs;
+ }
+
+ hStyle styleFor(const DRW_Entity *e) {
+ // Color.
+ // TODO: which color to choose: index or RGB one?
+ int col = getColor(e);
+ RgbaColor c = RgbaColor::From(DRW::dxfColors[col][0],
+ DRW::dxfColors[col][1],
+ DRW::dxfColors[col][2]);
+
+ // Line width.
+ DRW_LW_Conv::lineWidth lw = getLineWidth(e);
+ double width = DRW_LW_Conv::lineWidth2dxfInt(e->lWeight) / 100.0;
+ if(width < 0.0) width = 1.0;
+
+ // Line stipple.
+ // TODO: Probably, we can load default autocad patterns and match it with ours.
+ std::string lineType = getLineType(e);
+ int stipple = Style::STIPPLE_CONTINUOUS;
+ for(int i = 0; i <= Style::LAST_STIPPLE; i++) {
+ if(lineType == DxfFileWriter::lineTypeName(i)) {
+ stipple = i;
+ break;
+ }
+ }
+
+ // Text properties.
+ DRW_Text::HAlign alignH = DRW_Text::HLeft;
+ DRW_Text::VAlign alignV = DRW_Text::VBaseLine;
+ double textAngle = 0.0;
+ double textHeight = Style::DefaultTextHeight();
+
+ if(e->eType == DRW::TEXT || e->eType == DRW::MTEXT) {
+ const DRW_Text *text = static_cast<const DRW_Text *>(e);
+ alignH = text->alignH;
+ alignV = text->alignV;
+ textHeight = text->height;
+ textAngle = text->angle;
+ // I have no idea why, but works
+ if(alignH == DRW_Text::HMiddle) {
+ alignV = DRW_Text::VMiddle;
+ }
+ }
+
+ // Unique identifier based on style properties.
+ std::string id = "@dxf";
+ if(lw != DRW_LW_Conv::widthDefault)
+ id += ssprintf("-w%.4g", width);
+ if(lineType != "CONTINUOUS")
+ id += ssprintf("-%s", lineType.c_str());
+ if(c.red != 0 || c.green != 0 || c.blue != 0)
+ id += ssprintf("-#%02x%02x%02x", c.red, c.green, c.blue);
+ if(textHeight != Style::DefaultTextHeight())
+ id += ssprintf("-h%.4g", textHeight);
+ if(textAngle != 0.0)
+ id += ssprintf("-a%.5g", textAngle);
+ if(alignH != DRW_Text::HLeft)
+ id += ssprintf("-oh%d", alignH);
+ if(alignV != DRW_Text::VBaseLine)
+ id += ssprintf("-ov%d", alignV);
+
+ auto si = styles.find(id);
+ if(si != styles.end()) {
+ return si->second;
+ }
+
+ hStyle hs = { Style::CreateCustomStyle(/*rememberForUndo=*/false) };
+ Style *s = Style::Get(hs);
+ if(lw != DRW_LW_Conv::widthDefault) {
+ s->widthAs = Style::UNITS_AS_MM;
+ s->width = width;
+ s->stippleScale = 1.0 + width * 2.0;
+ }
+ s->name = id;
+ s->stippleType = stipple;
+ if(c.red != 0 || c.green != 0 || c.blue != 0) s->color = c;
+ s->textHeightAs = Style::UNITS_AS_MM;
+ s->textHeight = textHeight;
+ s->textAngle = textAngle;
+ s->textOrigin = dxfAlignToOrigin(alignH, alignV);
+
+ styles.emplace(id, hs);
+ return hs;
+ }
+
+ void setStyle(hRequest hr, hStyle hs) {
+ Request *r = SK.GetRequest(hr);
+ r->style = hs;
+ }
+
+ struct VectorHash {
+ size_t operator()(const Vector &v) const {
+ static const size_t size = std::numeric_limits<size_t>::max() / 2 - 1;
+ static const double eps = (4.0 * LENGTH_EPS);
+
+ double x = fabs(v.x) / eps;
+ double y = fabs(v.y) / eps;
+
+ size_t xs = size_t(fmod(x, double(size)));
+ size_t ys = size_t(fmod(y, double(size)));
+
+ return ys * size + xs;
+ }
+ };
+
+ struct VectorPred {
+ bool operator()(Vector a, Vector b) const {
+ return a.Equals(b, LENGTH_EPS);
+ }
+ };
+
+ std::unordered_map<Vector, hEntity, VectorHash, VectorPred> points;
+
+ void processPoint(hEntity he, bool constrain = true) {
+ Entity *e = SK.GetEntity(he);
+ Vector pos = e->PointGetNum();
+ hEntity p = findPoint(pos);
+ if(p.v == he.v) return;
+ if(p.v != Entity::NO_ENTITY.v) {
+ if(constrain) {
+ Constraint::ConstrainCoincident(he, p);
+ }
+ // We don't add point because we already
+ // have point in this position
+ return;
+ }
+ points.emplace(pos, he);
+ }
+
+ hEntity findPoint(const Vector &p) {
+ auto it = points.find(p);
+ if(it == points.end()) return Entity::NO_ENTITY;
+ return it->second;
+ }
+
+ hEntity createOrGetPoint(const Vector &p) {
+ hEntity he = findPoint(p);
+ if(he.v != Entity::NO_ENTITY.v) return he;
+
+ hRequest hr = SS.GW.AddRequest(Request::DATUM_POINT, false);
+ he = hr.entity(0);
+ SK.GetEntity(he)->PointForceTo(p);
+ points.emplace(p, he);
+ return he;
+ }
+
+ hEntity createLine(Vector p0, Vector p1, uint32_t style, bool constrainHV = false) {
+ if(p0.Equals(p1)) return Entity::NO_ENTITY;
+ hRequest hr = SS.GW.AddRequest(Request::LINE_SEGMENT, false);
+ SK.GetEntity(hr.entity(1))->PointForceTo(p0);
+ SK.GetEntity(hr.entity(2))->PointForceTo(p1);
+ processPoint(hr.entity(1));
+ processPoint(hr.entity(2));
+
+ if(constrainHV) {
+ int cType = -1;
+ if(fabs(p0.x - p1.x) < LENGTH_EPS) {
+ cType = Constraint::VERTICAL;
+ }
+ else if(fabs(p0.y - p1.y) < LENGTH_EPS) {
+ cType = Constraint::HORIZONTAL;
+ }
+ if(cType != -1) {
+ Constraint::Constrain(
+ cType,
+ Entity::NO_ENTITY,
+ Entity::NO_ENTITY,
+ hr.entity(0)
+ );
+ }
+ }
+
+ if(style != 0) {
+ Request *r = SK.GetRequest(hr);
+ r->style = hStyle{ style };
+ }
+ return hr.entity(0);
+ }
+
+ hEntity createCircle(const Vector &c, double r, uint32_t style) {
+ hRequest hr = SS.GW.AddRequest(Request::CIRCLE, false);
+ SK.GetEntity(hr.entity(1))->PointForceTo(c);
+ processPoint(hr.entity(1));
+ SK.GetEntity(hr.entity(64))->DistanceForceTo(r);
+ if(style != 0) {
+ Request *r = SK.GetRequest(hr);
+ r->style = hStyle{ style };
+ }
+ return hr.entity(0);
+ }
+
+ virtual void addLayer(const DRW_Layer &data) {
+ layers.emplace(data.name, data);
+ }
+
+ virtual void addBlock(const DRW_Block &data) {
+ readBlock = &blocks[data.name];
+ readBlock->data = data;
+ }
+
+ virtual void endBlock() {
+ readBlock = NULL;
+ }
+
+ virtual void addPoint(const DRW_Point &data) {
+ if(data.space != DRW::ModelSpace) return;
+ if(addPendingBlockEntity<DRW_Point>(data)) return;
+
+ hRequest hr = SS.GW.AddRequest(Request::DATUM_POINT, false);
+ SK.GetEntity(hr.entity(0))->PointForceTo(toVector(data.basePoint));
+ processPoint(hr.entity(0));
+ }
+
+ virtual void addLine(const DRW_Line &data) {
+ if(data.space != DRW::ModelSpace) return;
+ if(addPendingBlockEntity<DRW_Line>(data)) return;
+
+ createLine(toVector(data.basePoint), toVector(data.secPoint), styleFor(&data).v, true);
+ }
+
+ virtual void addArc(const DRW_Arc &data) {
+ if(data.space != DRW::ModelSpace) return;
+ if(addPendingBlockEntity<DRW_Arc>(data)) return;
+
+ hRequest hr = SS.GW.AddRequest(Request::ARC_OF_CIRCLE, false);
+ double r = data.radious;
+ double sa = data.staangle;
+ double ea = data.endangle;
+ Vector c = Vector::From(data.basePoint.x, data.basePoint.y, 0.0);
+ Vector rvs = Vector::From(r * cos(sa), r * sin(sa), data.basePoint.z).Plus(c);
+ Vector rve = Vector::From(r * cos(ea), r * sin(ea), data.basePoint.z).Plus(c);
+
+ if(data.extPoint.z == -1.0) {
+ c.x = -c.x;
+ rvs.x = - rvs.x;
+ rve.x = - rve.x;
+ std::swap(rvs, rve);
+ }
+
+ blockTransformArc(&c, &rvs, &rve);
+
+ SK.GetEntity(hr.entity(1))->PointForceTo(c);
+ SK.GetEntity(hr.entity(2))->PointForceTo(rvs);
+ SK.GetEntity(hr.entity(3))->PointForceTo(rve);
+ processPoint(hr.entity(1));
+ processPoint(hr.entity(2));
+ processPoint(hr.entity(3));
+ setStyle(hr, styleFor(&data));
+ }
+
+ virtual void addCircle(const DRW_Circle &data) {
+ if(data.space != DRW::ModelSpace) return;
+ if(addPendingBlockEntity<DRW_Circle>(data)) return;
+
+ createCircle(toVector(data.basePoint), data.radious, styleFor(&data).v);
+ }
+
+ virtual void addLWPolyline(const DRW_LWPolyline &data) {
+ if(data.space != DRW::ModelSpace) return;
+ if(addPendingBlockEntity<DRW_LWPolyline>(data)) return;
+
+ size_t vNum = data.vertlist.size();
+
+ // Check for closed polyline.
+ if((data.flags & 1) != 1) vNum--;
+
+ // Correct coordinate system for the case where z=-1, as described in
+ // http://paulbourke.net/dataformats/dxf/dxf10.html.
+ bool needSwapX = data.extPoint.z == -1.0;
+
+ for(size_t i = 0; i < vNum; i++) {
+ DRW_Vertex2D c0 = *data.vertlist[i];
+ DRW_Vertex2D c1 = *data.vertlist[(i + 1) % data.vertlist.size()];
+
+ if(needSwapX) {
+ c0.x = -c0.x;
+ c1.x = -c1.x;
+ c0.bulge = -c0.bulge;
+ }
+
+ Vector p0 = Vector::From(c0.x, c0.y, 0.0);
+ Vector p1 = Vector::From(c1.x, c1.y, 0.0);
+ hStyle hs = styleFor(&data);
+
+ if(EXACT(data.vertlist[i]->bulge == 0.0)) {
+ createLine(blockTransform(p0), blockTransform(p1), hs.v, true);
+ } else {
+ hRequest hr = createBulge(p0, p1, c0.bulge);
+ setStyle(hr, hs);
+ }
+ }
+ }
+
+ virtual void addPolyline(const DRW_Polyline &data) {
+ if(data.space != DRW::ModelSpace) return;
+ if(addPendingBlockEntity<DRW_Polyline>(data)) return;
+
+ int vNum = data.vertlist.size();
+
+ // Check for closed polyline.
+ if((data.flags & 1) != 1) vNum--;
+
+ // Correct coordinate system for the case where z=-1, as described in
+ // http://paulbourke.net/dataformats/dxf/dxf10.html.
+ bool needSwapX = data.extPoint.z == -1.0;
+
+ for(int i = 0; i < vNum; i++) {
+ DRW_Coord c0 = data.vertlist[i]->basePoint;
+ DRW_Coord c1 = data.vertlist[(i + 1) % data.vertlist.size()]->basePoint;
+
+ double bulge = data.vertlist[i]->bulge;
+ if(needSwapX) {
+ c0.x = -c0.x;
+ c1.x = -c1.x;
+ bulge = -bulge;
+ }
+
+ Vector p0 = Vector::From(c0.x, c0.y, 0.0);
+ Vector p1 = Vector::From(c1.x, c1.y, 0.0);
+ hStyle hs = styleFor(&data);
+
+ if(EXACT(bulge == 0.0)) {
+ createLine(blockTransform(p0), blockTransform(p1), hs.v, true);
+ } else {
+ hRequest hr = createBulge(p0, p1, bulge);
+ setStyle(hr, hs);
+ }
+ }
+ }
+
+ virtual void addSpline(const DRW_Spline *data) {
+ if(data->space != DRW::ModelSpace) return;
+ if(data->degree != 3) return;
+ if(addPendingBlockEntity<DRW_Spline>(*data)) return;
+
+ hRequest hr = SS.GW.AddRequest(Request::CUBIC, false);
+ for(int i = 0; i < 4; i++) {
+ SK.GetEntity(hr.entity(i + 1))->PointForceTo(toVector(*data->controllist[i]));
+ processPoint(hr.entity(i + 1));
+ }
+ setStyle(hr, styleFor(data));
+ }
+
+ virtual void addInsert(const DRW_Insert &data) {
+ if(data.space != DRW::ModelSpace) return;
+ if(addPendingBlockEntity<DRW_Insert>(data)) return;
+
+ auto bi = blocks.find(data.name);
+ if(bi == blocks.end()) oops();
+ Block *block = &bi->second;
+
+ // Push transform.
+ Vector x = blockX;
+ Vector y = blockY;
+ Vector t = blockT;
+
+ const DRW_Insert *oldInsert = insertInsert;
+ insertInsert = &data;
+
+ if(data.extPoint.z == -1.0) invertXTransform();
+ multBlockTransform(data.basePoint.x, data.basePoint.y, data.xscale, data.yscale, data.angle);
+ for(auto &e : block->entities) {
+ addEntity(&*e);
+ }
+
+ insertInsert = oldInsert;
+
+ // Pop transform.
+ blockX = x;
+ blockY = y;
+ blockT = t;
+ }
+
+ virtual void addMText(const DRW_MText &data) {
+ if(data.space != DRW::ModelSpace) return;
+ if(addPendingBlockEntity<DRW_MText>(data)) return;
+
+ DRW_MText text = data;
+ text.secPoint = text.basePoint;
+ addText(text);
+ }
+
+ virtual void addText(const DRW_Text &data) {
+ if(data.space != DRW::ModelSpace) return;
+ if(addPendingBlockEntity<DRW_Text>(data)) return;
+
+ Constraint c = {};
+ c.group = SS.GW.activeGroup;
+ c.workplane = SS.GW.ActiveWorkplane();
+ c.type = Constraint::COMMENT;
+ if(data.alignH == DRW_Text::HLeft && data.alignV == DRW_Text::VBaseLine) {
+ c.disp.offset = toVector(data.basePoint);
+ } else {
+ c.disp.offset = toVector(data.secPoint);
+ }
+ c.comment = data.text;
+ c.disp.style = styleFor(&data);
+ Constraint::AddConstraint(&c, false);
+ }
+
+ virtual void addDimAlign(const DRW_DimAligned *data) {
+ if(data->space != DRW::ModelSpace) return;
+ if(addPendingBlockEntity<DRW_DimAligned>(*data)) return;
+
+ Vector p0 = toVector(data->getDef1Point());
+ Vector p1 = toVector(data->getDef2Point());
+ Vector p2 = toVector(data->getTextPoint());
+ hConstraint hc = Constraint::Constrain(
+ Constraint::PT_PT_DISTANCE,
+ createOrGetPoint(p0),
+ createOrGetPoint(p1),
+ Entity::NO_ENTITY
+ );
+
+ Constraint *c = SK.GetConstraint(hc);
+ if(data->hasActualMeasurement()) {
+ c->valA = data->getActualMeasurement();
+ } else {
+ c->ModifyToSatisfy();
+ }
+ c->disp.offset = p2.Minus(p0.Plus(p1).ScaledBy(0.5));
+ }
+
+ virtual void addDimLinear(const DRW_DimLinear *data) {
+ if(data->space != DRW::ModelSpace) return;
+ if(addPendingBlockEntity<DRW_DimLinear>(*data)) return;
+
+ Vector p0 = toVector(data->getDef1Point(), false);
+ Vector p1 = toVector(data->getDef2Point(), false);
+ Vector p2 = toVector(data->getTextPoint(), false);
+
+ double angle = data->getAngle() * PI / 180.0;
+ Vector dir = Vector::From(cos(angle), sin(angle), 0.0);
+ Vector p3 = p1.Minus(p1.ClosestPointOnLine(p2, dir)).Plus(p1);
+ if(p1.Minus(p3).Magnitude() < LENGTH_EPS) {
+ p3 = p0.Minus(p0.ClosestPointOnLine(p2, dir)).Plus(p1);
+ }
+
+ Vector p4 = p0.ClosestPointOnLine(p1, p3.Minus(p1)).Plus(p0).ScaledBy(0.5);
+
+ p0 = blockTransform(p0);
+ p1 = blockTransform(p1);
+ p2 = blockTransform(p2);
+ p3 = blockTransform(p3);
+ p4 = blockTransform(p4);
+
+ hConstraint hc = Constraint::Constrain(
+ Constraint::PT_LINE_DISTANCE,
+ createOrGetPoint(p0),
+ Entity::NO_ENTITY,
+ createLine(p1, p3, invisibleStyle().v)
+ );
+
+ Constraint *c = SK.GetConstraint(hc);
+ if(data->hasActualMeasurement()) {
+ c->valA = data->getActualMeasurement();
+ } else {
+ c->ModifyToSatisfy();
+ }
+ c->disp.offset = p2.Minus(p4);
+ }
+
+ virtual void addDimAngular(const DRW_DimAngular *data) {
+ if(data->space != DRW::ModelSpace) return;
+ if(addPendingBlockEntity<DRW_DimAngular>(*data)) return;
+
+ Vector l0p0 = toVector(data->getFirstLine1());
+ Vector l0p1 = toVector(data->getFirstLine2());
+ Vector l1p0 = toVector(data->getSecondLine1());
+ Vector l1p1 = toVector(data->getSecondLine2());
+
+ hConstraint hc = Constraint::Constrain(
+ Constraint::ANGLE,
+ Entity::NO_ENTITY,
+ Entity::NO_ENTITY,
+ createLine(l0p0, l0p1, invisibleStyle().v),
+ createLine(l1p1, l1p0, invisibleStyle().v),
+ /*other=*/false,
+ /*other2=*/false
+ );
+
+ Constraint *c = SK.GetConstraint(hc);
+ c->ModifyToSatisfy();
+ if(data->hasActualMeasurement()) {
+ double actual = data->getActualMeasurement() / PI * 180.0;
+ if(fabs(180.0 - actual - c->valA) < fabs(actual - c->valA)) {
+ c->other = true;
+ }
+ c->valA = actual;
+ }
+
+ bool skew = false;
+ Vector pi = Vector::AtIntersectionOfLines(l0p0, l0p1, l1p0, l1p1, &skew);
+ if(!skew) {
+ c->disp.offset = toVector(data->getTextPoint()).Minus(pi);
+ }
+ }
+
+ hConstraint createDiametric(Vector cp, double r, Vector tp, double actual, bool asRadius = false) {
+ hEntity he = createCircle(cp, r, invisibleStyle().v);
+
+ hConstraint hc = Constraint::Constrain(
+ Constraint::DIAMETER,
+ Entity::NO_ENTITY,
+ Entity::NO_ENTITY,
+ he
+ );
+
+ Constraint *c = SK.GetConstraint(hc);
+ if(actual > 0.0) {
+ c->valA = asRadius ? actual * 2.0 : actual;
+ } else {
+ c->ModifyToSatisfy();
+ }
+ c->disp.offset = tp.Minus(cp);
+ if(asRadius) c->other = true;
+ return hc;
+ }
+
+ virtual void addDimRadial(const DRW_DimRadial *data) {
+ if(data->space != DRW::ModelSpace) return;
+ if(addPendingBlockEntity<DRW_DimRadial>(*data)) return;
+
+ Vector cp = toVector(data->getCenterPoint());
+ Vector dp = toVector(data->getDiameterPoint());
+ Vector tp = toVector(data->getTextPoint());
+ double actual = -1.0;
+ if(data->hasActualMeasurement()) {
+ actual = data->getActualMeasurement();
+ }
+
+ createDiametric(cp, cp.Minus(dp).Magnitude(), tp, actual, /*asRadius=*/true);
+ }
+
+ virtual void addDimDiametric(const DRW_DimDiametric *data) {
+ if(data->space != DRW::ModelSpace) return;
+ if(addPendingBlockEntity<DRW_DimRadial>(*data)) return;
+
+ Vector dp1 = toVector(data->getDiameter1Point());
+ Vector dp2 = toVector(data->getDiameter2Point());
+
+ Vector cp = dp1.Plus(dp2).ScaledBy(0.5);
+ Vector tp = toVector(data->getTextPoint());
+ double actual = -1.0;
+ if(data->hasActualMeasurement()) {
+ actual = data->getActualMeasurement();
+ }
+
+ createDiametric(cp, cp.Minus(dp1).Magnitude(), tp, actual, /*asRadius=*/false);
+ }
+
+ virtual void addDimAngular3P(const DRW_DimAngular3p *data) {
+ if(data->space != DRW::ModelSpace) return;
+ if(addPendingBlockEntity<DRW_DimAngular3p>(*data)) return;
+
+ DRW_DimAngular dim = *static_cast<const DRW_Dimension *>(data);
+ dim.setFirstLine1(data->getVertexPoint());
+ dim.setFirstLine2(data->getFirstLine());
+ dim.setSecondLine1(data->getVertexPoint());
+ dim.setSecondLine2(data->getSecondLine());
+ addDimAngular(&dim);
+ }
+};
+
+void ImportDxf(const std::string &filename) {
+ DxfReadInterface interface;
+ interface.clearBlockTransform();
+
+ std::string data;
+ if(!ReadFile(filename, &data)) {
+ Error("Couldn't read from '%s'", filename.c_str());
+ return;
+ }
+
+ SS.UndoRemember();
+ std::stringstream stream(data);
+ if(!dxfRW().read(stream, &interface, /*ext=*/false)) {
+ Error("Corrupted DXF file.");
+ }
+
+ if(interface.unknownEntities > 0) {
+ Message(ssprintf("%u DXF entities of unknown type were ignored.",
+ interface.unknownEntities).c_str());
+ }
+}
+
+void ImportDwg(const std::string &filename) {
+ DxfReadInterface interface;
+ interface.clearBlockTransform();
+
+ std::string data;
+ if(!ReadFile(filename, &data)) {
+ Error("Couldn't read from '%s'", filename.c_str());
+ return;
+ }
+
+ SS.UndoRemember();
+ std::stringstream stream(data);
+ if(!dwgR().read(stream, &interface, /*ext=*/false)) {
+ Error("Corrupted DWG file.");
+ }
+
+ if(interface.unknownEntities > 0) {
+ Message(ssprintf("%u DWG entities of unknown type were ignored.",
+ interface.unknownEntities).c_str());
+ }
+}
+
+}
--- /dev/null
+//-----------------------------------------------------------------------------
+// A library wrapper around SolveSpace, to permit someone to use its constraint
+// solver without coupling their program too much to SolveSpace's internals.
+//
+// Copyright 2008-2013 Jonathan Westhues.
+//-----------------------------------------------------------------------------
+#include "solvespace.h"
+#define EXPORT_DLL
+#include <slvs.h>
+
+Sketch SolveSpace::SK = {};
+static System SYS;
+
+static int IsInit = 0;
+
+void Group::GenerateEquations(IdList<Equation,hEquation> *) {
+ // Nothing to do for now.
+}
+
+void SolveSpace::CnfFreezeInt(uint32_t, const std::string &)
+{
+ abort();
+}
+
+uint32_t SolveSpace::CnfThawInt(uint32_t, const std::string &)
+{
+ abort();
+ return 0;
+}
+
+void SolveSpace::DoMessageBox(const char *, int, int, bool)
+{
+ abort();
+}
+
+extern "C" {
+
+void Slvs_QuaternionU(double qw, double qx, double qy, double qz,
+ double *x, double *y, double *z)
+{
+ Quaternion q = Quaternion::From(qw, qx, qy, qz);
+ Vector v = q.RotationU();
+ *x = v.x;
+ *y = v.y;
+ *z = v.z;
+}
+
+void Slvs_QuaternionV(double qw, double qx, double qy, double qz,
+ double *x, double *y, double *z)
+{
+ Quaternion q = Quaternion::From(qw, qx, qy, qz);
+ Vector v = q.RotationV();
+ *x = v.x;
+ *y = v.y;
+ *z = v.z;
+}
+
+void Slvs_QuaternionN(double qw, double qx, double qy, double qz,
+ double *x, double *y, double *z)
+{
+ Quaternion q = Quaternion::From(qw, qx, qy, qz);
+ Vector v = q.RotationN();
+ *x = v.x;
+ *y = v.y;
+ *z = v.z;
+}
+
+void Slvs_MakeQuaternion(double ux, double uy, double uz,
+ double vx, double vy, double vz,
+ double *qw, double *qx, double *qy, double *qz)
+{
+ Vector u = Vector::From(ux, uy, uz),
+ v = Vector::From(vx, vy, vz);
+ Quaternion q = Quaternion::From(u, v);
+ *qw = q.w;
+ *qx = q.vx;
+ *qy = q.vy;
+ *qz = q.vz;
+}
+
+void Slvs_Solve(Slvs_System *ssys, Slvs_hGroup shg)
+{
+ if(!IsInit) {
+ InitHeaps();
+ IsInit = 1;
+ }
+
+ int i;
+ for(i = 0; i < ssys->params; i++) {
+ Slvs_Param *sp = &(ssys->param[i]);
+ Param p = {};
+
+ p.h.v = sp->h;
+ p.val = sp->val;
+ SK.param.Add(&p);
+ if(sp->group == shg) {
+ SYS.param.Add(&p);
+ }
+ }
+
+ for(i = 0; i < ssys->entities; i++) {
+ Slvs_Entity *se = &(ssys->entity[i]);
+ EntityBase e = {};
+
+ switch(se->type) {
+case SLVS_E_POINT_IN_3D: e.type = Entity::POINT_IN_3D; break;
+case SLVS_E_POINT_IN_2D: e.type = Entity::POINT_IN_2D; break;
+case SLVS_E_NORMAL_IN_3D: e.type = Entity::NORMAL_IN_3D; break;
+case SLVS_E_NORMAL_IN_2D: e.type = Entity::NORMAL_IN_2D; break;
+case SLVS_E_DISTANCE: e.type = Entity::DISTANCE; break;
+case SLVS_E_WORKPLANE: e.type = Entity::WORKPLANE; break;
+case SLVS_E_LINE_SEGMENT: e.type = Entity::LINE_SEGMENT; break;
+case SLVS_E_CUBIC: e.type = Entity::CUBIC; break;
+case SLVS_E_CIRCLE: e.type = Entity::CIRCLE; break;
+case SLVS_E_ARC_OF_CIRCLE: e.type = Entity::ARC_OF_CIRCLE; break;
+
+default: dbp("bad entity type %d", se->type); return;
+ }
+ e.h.v = se->h;
+ e.group.v = se->group;
+ e.workplane.v = se->wrkpl;
+ e.point[0].v = se->point[0];
+ e.point[1].v = se->point[1];
+ e.point[2].v = se->point[2];
+ e.point[3].v = se->point[3];
+ e.normal.v = se->normal;
+ e.distance.v = se->distance;
+ e.param[0].v = se->param[0];
+ e.param[1].v = se->param[1];
+ e.param[2].v = se->param[2];
+ e.param[3].v = se->param[3];
+
+ SK.entity.Add(&e);
+ }
+
+ for(i = 0; i < ssys->constraints; i++) {
+ Slvs_Constraint *sc = &(ssys->constraint[i]);
+ ConstraintBase c = {};
+
+ int t;
+ switch(sc->type) {
+case SLVS_C_POINTS_COINCIDENT: t = Constraint::POINTS_COINCIDENT; break;
+case SLVS_C_PT_PT_DISTANCE: t = Constraint::PT_PT_DISTANCE; break;
+case SLVS_C_PT_PLANE_DISTANCE: t = Constraint::PT_PLANE_DISTANCE; break;
+case SLVS_C_PT_LINE_DISTANCE: t = Constraint::PT_LINE_DISTANCE; break;
+case SLVS_C_PT_FACE_DISTANCE: t = Constraint::PT_FACE_DISTANCE; break;
+case SLVS_C_PT_IN_PLANE: t = Constraint::PT_IN_PLANE; break;
+case SLVS_C_PT_ON_LINE: t = Constraint::PT_ON_LINE; break;
+case SLVS_C_PT_ON_FACE: t = Constraint::PT_ON_FACE; break;
+case SLVS_C_EQUAL_LENGTH_LINES: t = Constraint::EQUAL_LENGTH_LINES; break;
+case SLVS_C_LENGTH_RATIO: t = Constraint::LENGTH_RATIO; break;
+case SLVS_C_EQ_LEN_PT_LINE_D: t = Constraint::EQ_LEN_PT_LINE_D; break;
+case SLVS_C_EQ_PT_LN_DISTANCES: t = Constraint::EQ_PT_LN_DISTANCES; break;
+case SLVS_C_EQUAL_ANGLE: t = Constraint::EQUAL_ANGLE; break;
+case SLVS_C_EQUAL_LINE_ARC_LEN: t = Constraint::EQUAL_LINE_ARC_LEN; break;
+case SLVS_C_LENGTH_DIFFERENCE: t = Constraint::LENGTH_DIFFERENCE; break;
+case SLVS_C_SYMMETRIC: t = Constraint::SYMMETRIC; break;
+case SLVS_C_SYMMETRIC_HORIZ: t = Constraint::SYMMETRIC_HORIZ; break;
+case SLVS_C_SYMMETRIC_VERT: t = Constraint::SYMMETRIC_VERT; break;
+case SLVS_C_SYMMETRIC_LINE: t = Constraint::SYMMETRIC_LINE; break;
+case SLVS_C_AT_MIDPOINT: t = Constraint::AT_MIDPOINT; break;
+case SLVS_C_HORIZONTAL: t = Constraint::HORIZONTAL; break;
+case SLVS_C_VERTICAL: t = Constraint::VERTICAL; break;
+case SLVS_C_DIAMETER: t = Constraint::DIAMETER; break;
+case SLVS_C_PT_ON_CIRCLE: t = Constraint::PT_ON_CIRCLE; break;
+case SLVS_C_SAME_ORIENTATION: t = Constraint::SAME_ORIENTATION; break;
+case SLVS_C_ANGLE: t = Constraint::ANGLE; break;
+case SLVS_C_PARALLEL: t = Constraint::PARALLEL; break;
+case SLVS_C_PERPENDICULAR: t = Constraint::PERPENDICULAR; break;
+case SLVS_C_ARC_LINE_TANGENT: t = Constraint::ARC_LINE_TANGENT; break;
+case SLVS_C_CUBIC_LINE_TANGENT: t = Constraint::CUBIC_LINE_TANGENT; break;
+case SLVS_C_EQUAL_RADIUS: t = Constraint::EQUAL_RADIUS; break;
+case SLVS_C_PROJ_PT_DISTANCE: t = Constraint::PROJ_PT_DISTANCE; break;
+case SLVS_C_WHERE_DRAGGED: t = Constraint::WHERE_DRAGGED; break;
+case SLVS_C_CURVE_CURVE_TANGENT:t = Constraint::CURVE_CURVE_TANGENT; break;
+
+default: dbp("bad constraint type %d", sc->type); return;
+ }
+
+ c.type = t;
+
+ c.h.v = sc->h;
+ c.group.v = sc->group;
+ c.workplane.v = sc->wrkpl;
+ c.valA = sc->valA;
+ c.ptA.v = sc->ptA;
+ c.ptB.v = sc->ptB;
+ c.entityA.v = sc->entityA;
+ c.entityB.v = sc->entityB;
+ c.entityC.v = sc->entityC;
+ c.entityD.v = sc->entityD;
+ c.other = (sc->other) ? true : false;
+ c.other2 = (sc->other2) ? true : false;
+
+ SK.constraint.Add(&c);
+ }
+
+ for(i = 0; i < (int)arraylen(ssys->dragged); i++) {
+ if(ssys->dragged[i]) {
+ hParam hp = { ssys->dragged[i] };
+ SYS.dragged.Add(&hp);
+ }
+ }
+
+ Group g = {};
+ g.h.v = shg;
+
+ List<hConstraint> bad = {};
+
+ // Now we're finally ready to solve!
+ bool andFindBad = ssys->calculateFaileds ? true : false;
+ int how = SYS.Solve(&g, &(ssys->dof), &bad, andFindBad, false);
+
+ switch(how) {
+ case System::SOLVED_OKAY:
+ ssys->result = SLVS_RESULT_OKAY;
+ break;
+
+ case System::DIDNT_CONVERGE:
+ ssys->result = SLVS_RESULT_DIDNT_CONVERGE;
+ break;
+
+ case System::REDUNDANT_DIDNT_CONVERGE:
+ case System::REDUNDANT_OKAY:
+ ssys->result = SLVS_RESULT_INCONSISTENT;
+ break;
+
+ case System::TOO_MANY_UNKNOWNS:
+ ssys->result = SLVS_RESULT_TOO_MANY_UNKNOWNS;
+ break;
+
+ default: oops();
+ }
+
+ // Write the new parameter values back to our caller.
+ for(i = 0; i < ssys->params; i++) {
+ Slvs_Param *sp = &(ssys->param[i]);
+ hParam hp = { sp->h };
+ sp->val = SK.GetParam(hp)->val;
+ }
+
+ if(ssys->failed) {
+ // Copy over any the list of problematic constraints.
+ for(i = 0; i < ssys->faileds && i < bad.n; i++) {
+ ssys->failed[i] = bad.elem[i].v;
+ }
+ ssys->faileds = bad.n;
+ }
+
+ bad.Clear();
+ SYS.param.Clear();
+ SYS.entity.Clear();
+ SYS.eq.Clear();
+ SYS.dragged.Clear();
+
+ SK.param.Clear();
+ SK.entity.Clear();
+ SK.constraint.Clear();
+
+ FreeAllTemporary();
+}
+
+} /* extern "C" */
--- /dev/null
+//-----------------------------------------------------------------------------
+// Operations on triangle meshes, like our mesh Booleans using the BSP, and
+// the stuff to check for watertightness.
+//
+// Copyright 2008-2013 Jonathan Westhues.
+//-----------------------------------------------------------------------------
+#include "solvespace.h"
+
+#include <set>
+
+void SMesh::Clear(void) {
+ l.Clear();
+}
+
+void SMesh::AddTriangle(STriMeta meta, Vector n, Vector a, Vector b, Vector c) {
+ Vector ab = b.Minus(a), bc = c.Minus(b);
+ Vector np = ab.Cross(bc);
+ if(np.Magnitude() < 1e-10) {
+ // ugh; gl sometimes tesselates to collinear triangles
+ return;
+ }
+ if(np.Dot(n) > 0) {
+ AddTriangle(meta, a, b, c);
+ } else {
+ AddTriangle(meta, c, b, a);
+ }
+}
+void SMesh::AddTriangle(STriMeta meta, Vector a, Vector b, Vector c) {
+ STriangle t = {};
+ t.meta = meta;
+ t.a = a;
+ t.b = b;
+ t.c = c;
+ AddTriangle(&t);
+}
+void SMesh::AddTriangle(STriangle *st) {
+ RgbaColor color = st->meta.color;
+ if(color.ToARGB32() != 0 && color.alpha != 255) isTransparent = true;
+ l.Add(st);
+}
+
+void SMesh::DoBounding(Vector v, Vector *vmax, Vector *vmin) {
+ vmax->x = max(vmax->x, v.x);
+ vmax->y = max(vmax->y, v.y);
+ vmax->z = max(vmax->z, v.z);
+
+ vmin->x = min(vmin->x, v.x);
+ vmin->y = min(vmin->y, v.y);
+ vmin->z = min(vmin->z, v.z);
+}
+void SMesh::GetBounding(Vector *vmax, Vector *vmin) {
+ int i;
+ *vmin = Vector::From( 1e12, 1e12, 1e12);
+ *vmax = Vector::From(-1e12, -1e12, -1e12);
+ for(i = 0; i < l.n; i++) {
+ STriangle *st = &(l.elem[i]);
+ DoBounding(st->a, vmax, vmin);
+ DoBounding(st->b, vmax, vmin);
+ DoBounding(st->c, vmax, vmin);
+ }
+}
+
+//----------------------------------------------------------------------------
+// Report the edges of the boundary of the region(s) of our mesh that lie
+// within the plane n dot p = d.
+//----------------------------------------------------------------------------
+void SMesh::MakeEdgesInPlaneInto(SEdgeList *sel, Vector n, double d) {
+ SMesh m = {};
+ m.MakeFromCopyOf(this);
+
+ // Delete all triangles in the mesh that do not lie in our export plane.
+ m.l.ClearTags();
+ int i;
+ for(i = 0; i < m.l.n; i++) {
+ STriangle *tr = &(m.l.elem[i]);
+
+ if((fabs(n.Dot(tr->a) - d) >= LENGTH_EPS) ||
+ (fabs(n.Dot(tr->b) - d) >= LENGTH_EPS) ||
+ (fabs(n.Dot(tr->c) - d) >= LENGTH_EPS))
+ {
+ tr->tag = 1;
+ }
+ }
+ m.l.RemoveTagged();
+
+ // Select the naked edges in our resulting open mesh.
+ SKdNode *root = SKdNode::From(&m);
+ root->SnapToMesh(&m);
+ root->MakeCertainEdgesInto(sel, SKdNode::NAKED_OR_SELF_INTER_EDGES,
+ false, NULL, NULL);
+
+ m.Clear();
+}
+
+void SMesh::MakeCertainEdgesAndOutlinesInto(SEdgeList *sel, SOutlineList *sol, int type) {
+ SKdNode *root = SKdNode::From(this);
+ root->MakeCertainEdgesInto(sel, type, false, NULL, NULL);
+ root->MakeOutlinesInto(sol);
+}
+
+//-----------------------------------------------------------------------------
+// When we are called, all of the triangles from l.elem[start] to the end must
+// be coplanar. So we try to find a set of fewer triangles that covers the
+// exact same area, in order to reduce the number of triangles in the mesh.
+// We use this after a triangle has been split against the BSP.
+//
+// This is really ugly code; basically it just pastes things together to
+// form convex polygons, merging collinear edges when possible, then
+// triangulates the convex poly.
+//-----------------------------------------------------------------------------
+void SMesh::Simplify(int start) {
+ int maxTriangles = (l.n - start) + 10;
+
+ STriMeta meta = l.elem[start].meta;
+
+ STriangle *tout = (STriangle *)AllocTemporary(maxTriangles*sizeof(*tout));
+ int toutc = 0;
+
+ Vector n = Vector::From(0, 0, 0);
+ Vector *conv = (Vector *)AllocTemporary(maxTriangles*3*sizeof(*conv));
+ int convc = 0;
+
+ int start0 = start;
+
+ int i, j;
+ for(i = start; i < l.n; i++) {
+ STriangle *tr = &(l.elem[i]);
+ if(tr->MinAltitude() < LENGTH_EPS) {
+ tr->tag = 1;
+ } else {
+ tr->tag = 0;
+ }
+ }
+
+ for(;;) {
+ bool didAdd;
+ convc = 0;
+ for(i = start; i < l.n; i++) {
+ STriangle *tr = &(l.elem[i]);
+ if(tr->tag) continue;
+
+ tr->tag = 1;
+ n = (tr->Normal()).WithMagnitude(1);
+ conv[convc++] = tr->a;
+ conv[convc++] = tr->b;
+ conv[convc++] = tr->c;
+
+ start = i+1;
+ break;
+ }
+ if(i >= l.n) break;
+
+ do {
+ didAdd = false;
+
+ for(j = 0; j < convc; j++) {
+ Vector a = conv[WRAP((j-1), convc)],
+ b = conv[j],
+ d = conv[WRAP((j+1), convc)],
+ e = conv[WRAP((j+2), convc)];
+
+ Vector c;
+ for(i = start; i < l.n; i++) {
+ STriangle *tr = &(l.elem[i]);
+ if(tr->tag) continue;
+
+ if((tr->a).Equals(d) && (tr->b).Equals(b)) {
+ c = tr->c;
+ } else if((tr->b).Equals(d) && (tr->c).Equals(b)) {
+ c = tr->a;
+ } else if((tr->c).Equals(d) && (tr->a).Equals(b)) {
+ c = tr->b;
+ } else {
+ continue;
+ }
+ // The vertex at C must be convex; but the others must
+ // be tested
+ Vector ab = b.Minus(a);
+ Vector bc = c.Minus(b);
+ Vector cd = d.Minus(c);
+ Vector de = e.Minus(d);
+
+ double bDot = (ab.Cross(bc)).Dot(n);
+ double dDot = (cd.Cross(de)).Dot(n);
+
+ bDot /= min(ab.Magnitude(), bc.Magnitude());
+ dDot /= min(cd.Magnitude(), de.Magnitude());
+
+ if(fabs(bDot) < LENGTH_EPS && fabs(dDot) < LENGTH_EPS) {
+ conv[WRAP((j+1), convc)] = c;
+ // and remove the vertex at j, which is a dup
+ memmove(conv+j, conv+j+1,
+ (convc - j - 1)*sizeof(conv[0]));
+ convc--;
+ } else if(fabs(bDot) < LENGTH_EPS && dDot > 0) {
+ conv[j] = c;
+ } else if(fabs(dDot) < LENGTH_EPS && bDot > 0) {
+ conv[WRAP((j+1), convc)] = c;
+ } else if(bDot > 0 && dDot > 0) {
+ // conv[j] is unchanged, conv[j+1] goes to [j+2]
+ memmove(conv+j+2, conv+j+1,
+ (convc - j - 1)*sizeof(conv[0]));
+ conv[j+1] = c;
+ convc++;
+ } else {
+ continue;
+ }
+
+ didAdd = true;
+ tr->tag = 1;
+ break;
+ }
+ }
+ } while(didAdd);
+
+ // I need to debug why this is required; sometimes the above code
+ // still generates a convex polygon
+ for(i = 0; i < convc; i++) {
+ Vector a = conv[WRAP((i-1), convc)],
+ b = conv[i],
+ c = conv[WRAP((i+1), convc)];
+ Vector ab = b.Minus(a);
+ Vector bc = c.Minus(b);
+ double bDot = (ab.Cross(bc)).Dot(n);
+ bDot /= min(ab.Magnitude(), bc.Magnitude());
+
+ if(bDot < 0) return; // XXX, shouldn't happen
+ }
+
+ for(i = 0; i < convc - 2; i++) {
+ STriangle tr = STriangle::From(meta, conv[0], conv[i+1], conv[i+2]);
+ if(tr.MinAltitude() > LENGTH_EPS) {
+ tout[toutc++] = tr;
+ }
+ }
+ }
+
+ l.n = start0;
+ for(i = 0; i < toutc; i++) {
+ AddTriangle(&(tout[i]));
+ }
+ FreeTemporary(tout);
+ FreeTemporary(conv);
+}
+
+void SMesh::AddAgainstBsp(SMesh *srcm, SBsp3 *bsp3) {
+ int i;
+
+ for(i = 0; i < srcm->l.n; i++) {
+ STriangle *st = &(srcm->l.elem[i]);
+ int pn = l.n;
+ atLeastOneDiscarded = false;
+ SBsp3::InsertOrCreate(bsp3, st, this);
+ if(!atLeastOneDiscarded && (l.n != (pn+1))) {
+ l.n = pn;
+ if(flipNormal) {
+ AddTriangle(st->meta, st->c, st->b, st->a);
+ } else {
+ AddTriangle(st->meta, st->a, st->b, st->c);
+ }
+ }
+ if(l.n - pn > 1) {
+ Simplify(pn);
+ }
+ }
+}
+
+void SMesh::MakeFromUnionOf(SMesh *a, SMesh *b) {
+ SBsp3 *bspa = SBsp3::FromMesh(a);
+ SBsp3 *bspb = SBsp3::FromMesh(b);
+
+ flipNormal = false;
+ keepCoplanar = false;
+ AddAgainstBsp(b, bspa);
+
+ flipNormal = false;
+ keepCoplanar = true;
+ AddAgainstBsp(a, bspb);
+}
+
+void SMesh::MakeFromDifferenceOf(SMesh *a, SMesh *b) {
+ SBsp3 *bspa = SBsp3::FromMesh(a);
+ SBsp3 *bspb = SBsp3::FromMesh(b);
+
+ flipNormal = true;
+ keepCoplanar = true;
+ AddAgainstBsp(b, bspa);
+
+ flipNormal = false;
+ keepCoplanar = false;
+ AddAgainstBsp(a, bspb);
+}
+
+void SMesh::MakeFromCopyOf(SMesh *a) {
+ int i;
+ for(i = 0; i < a->l.n; i++) {
+ AddTriangle(&(a->l.elem[i]));
+ }
+}
+
+void SMesh::MakeFromAssemblyOf(SMesh *a, SMesh *b) {
+ MakeFromCopyOf(a);
+ MakeFromCopyOf(b);
+}
+
+void SMesh::MakeFromTransformationOf(SMesh *a,
+ Vector trans, Quaternion q, double scale)
+{
+ STriangle *tr;
+ for(tr = a->l.First(); tr; tr = a->l.NextAfter(tr)) {
+ STriangle tt = *tr;
+ tt.a = (tt.a).ScaledBy(scale);
+ tt.b = (tt.b).ScaledBy(scale);
+ tt.c = (tt.c).ScaledBy(scale);
+ if(scale < 0) {
+ // The mirroring would otherwise turn a closed mesh inside out.
+ swap(tt.a, tt.b);
+ }
+ tt.a = (q.Rotate(tt.a)).Plus(trans);
+ tt.b = (q.Rotate(tt.b)).Plus(trans);
+ tt.c = (q.Rotate(tt.c)).Plus(trans);
+ AddTriangle(&tt);
+ }
+}
+
+bool SMesh::IsEmpty(void) {
+ return (l.n == 0);
+}
+
+uint32_t SMesh::FirstIntersectionWith(Point2d mp) {
+ Vector p0 = Vector::From(mp.x, mp.y, 0);
+ Vector gn = Vector::From(0, 0, 1);
+
+ double maxT = -1e12;
+ uint32_t face = 0;
+
+ int i;
+ for(i = 0; i < l.n; i++) {
+ STriangle tr = l.elem[i];
+ tr.a = SS.GW.ProjectPoint3(tr.a);
+ tr.b = SS.GW.ProjectPoint3(tr.b);
+ tr.c = SS.GW.ProjectPoint3(tr.c);
+
+ Vector n = tr.Normal();
+
+ if(n.Dot(gn) < LENGTH_EPS) continue; // back-facing or on edge
+
+ if(tr.ContainsPointProjd(gn, p0)) {
+ // Let our line have the form r(t) = p0 + gn*t
+ double t = -(n.Dot((tr.a).Minus(p0)))/(n.Dot(gn));
+ if(t > maxT) {
+ maxT = t;
+ face = tr.meta.face;
+ }
+ }
+ }
+ return face;
+}
+
+STriangleLl *STriangleLl::Alloc(void)
+ { return (STriangleLl *)AllocTemporary(sizeof(STriangleLl)); }
+SKdNode *SKdNode::Alloc(void)
+ { return (SKdNode *)AllocTemporary(sizeof(SKdNode)); }
+
+SKdNode *SKdNode::From(SMesh *m) {
+ int i;
+ STriangle *tra = (STriangle *)AllocTemporary((m->l.n) * sizeof(*tra));
+
+ for(i = 0; i < m->l.n; i++) {
+ tra[i] = m->l.elem[i];
+ }
+
+ srand(0);
+ int n = m->l.n;
+ while(n > 1) {
+ int k = rand() % n;
+ n--;
+ swap(tra[k], tra[n]);
+ }
+
+ STriangleLl *tll = NULL;
+ for(i = 0; i < m->l.n; i++) {
+ STriangleLl *tn = STriangleLl::Alloc();
+ tn->tri = &(tra[i]);
+ tn->next = tll;
+ tll = tn;
+ }
+
+ return SKdNode::From(tll);
+}
+
+SKdNode *SKdNode::From(STriangleLl *tll) {
+ int which = 0;
+ SKdNode *ret = Alloc();
+
+ int i;
+ int gtc[3] = { 0, 0, 0 }, ltc[3] = { 0, 0, 0 }, allc = 0;
+ double badness[3] = { 0, 0, 0 };
+ double split[3] = { 0, 0, 0 };
+
+ if(!tll) {
+ goto leaf;
+ }
+
+ for(i = 0; i < 3; i++) {
+ int tcnt = 0;
+ STriangleLl *ll;
+ for(ll = tll; ll; ll = ll->next) {
+ split[i] += (ll->tri->a).Element(i);
+ split[i] += (ll->tri->b).Element(i);
+ split[i] += (ll->tri->c).Element(i);
+ tcnt++;
+ }
+ split[i] /= (tcnt*3);
+
+ for(ll = tll; ll; ll = ll->next) {
+ STriangle *tr = ll->tri;
+
+ double a = (tr->a).Element(i),
+ b = (tr->b).Element(i),
+ c = (tr->c).Element(i);
+
+ if(a < split[i] + KDTREE_EPS ||
+ b < split[i] + KDTREE_EPS ||
+ c < split[i] + KDTREE_EPS)
+ {
+ ltc[i]++;
+ }
+ if(a > split[i] - KDTREE_EPS ||
+ b > split[i] - KDTREE_EPS ||
+ c > split[i] - KDTREE_EPS)
+ {
+ gtc[i]++;
+ }
+ if(i == 0) allc++;
+ }
+ badness[i] = pow((double)ltc[i], 4) + pow((double)gtc[i], 4);
+ }
+ if(badness[0] < badness[1] && badness[0] < badness[2]) {
+ which = 0;
+ } else if(badness[1] < badness[2]) {
+ which = 1;
+ } else {
+ which = 2;
+ }
+
+ if(allc < 3 || allc == gtc[which] || allc == ltc[which]) {
+ goto leaf;
+ }
+
+ STriangleLl *ll;
+ STriangleLl *lgt, *llt; lgt = llt = NULL;
+ for(ll = tll; ll; ll = ll->next) {
+ STriangle *tr = ll->tri;
+
+ double a = (tr->a).Element(which),
+ b = (tr->b).Element(which),
+ c = (tr->c).Element(which);
+
+ if(a < split[which] + KDTREE_EPS ||
+ b < split[which] + KDTREE_EPS ||
+ c < split[which] + KDTREE_EPS)
+ {
+ STriangleLl *n = STriangleLl::Alloc();
+ *n = *ll;
+ n->next = llt;
+ llt = n;
+ }
+ if(a > split[which] - KDTREE_EPS ||
+ b > split[which] - KDTREE_EPS ||
+ c > split[which] - KDTREE_EPS)
+ {
+ STriangleLl *n = STriangleLl::Alloc();
+ *n = *ll;
+ n->next = lgt;
+ lgt = n;
+ }
+ }
+
+ ret->which = which;
+ ret->c = split[which];
+ ret->gt = SKdNode::From(lgt);
+ ret->lt = SKdNode::From(llt);
+ return ret;
+
+leaf:
+ ret->tris = tll;
+ return ret;
+}
+
+void SKdNode::ClearTags(void) {
+ if(gt && lt) {
+ gt->ClearTags();
+ lt->ClearTags();
+ } else {
+ STriangleLl *ll;
+ for(ll = tris; ll; ll = ll->next) {
+ ll->tri->tag = 0;
+ }
+ }
+}
+
+void SKdNode::AddTriangle(STriangle *tr) {
+ if(gt && lt) {
+ double ta = (tr->a).Element(which),
+ tb = (tr->b).Element(which),
+ tc = (tr->c).Element(which);
+ if(ta < c + KDTREE_EPS ||
+ tb < c + KDTREE_EPS ||
+ tc < c + KDTREE_EPS)
+ {
+ lt->AddTriangle(tr);
+ }
+ if(ta > c - KDTREE_EPS ||
+ tb > c - KDTREE_EPS ||
+ tc > c - KDTREE_EPS)
+ {
+ gt->AddTriangle(tr);
+ }
+ } else {
+ STriangleLl *tn = STriangleLl::Alloc();
+ tn->tri = tr;
+ tn->next = tris;
+ tris = tn;
+ }
+}
+
+void SKdNode::MakeMeshInto(SMesh *m) {
+ if(gt) gt->MakeMeshInto(m);
+ if(lt) lt->MakeMeshInto(m);
+
+ STriangleLl *ll;
+ for(ll = tris; ll; ll = ll->next) {
+ if(ll->tri->tag) continue;
+
+ m->AddTriangle(ll->tri);
+ ll->tri->tag = 1;
+ }
+}
+
+void SKdNode::ListTrianglesInto(std::vector<STriangle *> *tl) {
+ if(gt) gt->ListTrianglesInto(tl);
+ if(lt) lt->ListTrianglesInto(tl);
+
+ STriangleLl *ll;
+ for(ll = tris; ll; ll = ll->next) {
+ if(ll->tri->tag) continue;
+
+ tl->push_back(ll->tri);
+ ll->tri->tag = 1;
+ }
+}
+
+//-----------------------------------------------------------------------------
+// If any triangles in the mesh have an edge that goes through v (but not
+// a vertex at v), then split those triangles so that they now have a vertex
+// there. The existing triangle is modified, and the new triangle appears
+// in extras.
+//-----------------------------------------------------------------------------
+void SKdNode::SnapToVertex(Vector v, SMesh *extras) {
+ if(gt && lt) {
+ double vc = v.Element(which);
+ if(vc < c + KDTREE_EPS) {
+ lt->SnapToVertex(v, extras);
+ }
+ if(vc > c - KDTREE_EPS) {
+ gt->SnapToVertex(v, extras);
+ }
+ // Nothing bad happens if the triangle to be split appears in both
+ // branches; the first call will split the triangle, so that the
+ // second call will do nothing, because the modified triangle will
+ // already contain v
+ } else {
+ STriangleLl *ll;
+ for(ll = tris; ll; ll = ll->next) {
+ STriangle *tr = ll->tri;
+
+ // Do a cheap bbox test first
+ int k;
+ bool mightHit = true;
+
+ for(k = 0; k < 3; k++) {
+ if((tr->a).Element(k) < v.Element(k) - KDTREE_EPS &&
+ (tr->b).Element(k) < v.Element(k) - KDTREE_EPS &&
+ (tr->c).Element(k) < v.Element(k) - KDTREE_EPS)
+ {
+ mightHit = false;
+ break;
+ }
+ if((tr->a).Element(k) > v.Element(k) + KDTREE_EPS &&
+ (tr->b).Element(k) > v.Element(k) + KDTREE_EPS &&
+ (tr->c).Element(k) > v.Element(k) + KDTREE_EPS)
+ {
+ mightHit = false;
+ break;
+ }
+ }
+ if(!mightHit) continue;
+
+ if(tr->a.Equals(v)) { tr->a = v; continue; }
+ if(tr->b.Equals(v)) { tr->b = v; continue; }
+ if(tr->c.Equals(v)) { tr->c = v; continue; }
+
+ if(v.OnLineSegment(tr->a, tr->b)) {
+ STriangle nt = STriangle::From(tr->meta, tr->a, v, tr->c);
+ extras->AddTriangle(&nt);
+ tr->a = v;
+ continue;
+ }
+ if(v.OnLineSegment(tr->b, tr->c)) {
+ STriangle nt = STriangle::From(tr->meta, tr->b, v, tr->a);
+ extras->AddTriangle(&nt);
+ tr->b = v;
+ continue;
+ }
+ if(v.OnLineSegment(tr->c, tr->a)) {
+ STriangle nt = STriangle::From(tr->meta, tr->c, v, tr->b);
+ extras->AddTriangle(&nt);
+ tr->c = v;
+ continue;
+ }
+ }
+ }
+}
+
+//-----------------------------------------------------------------------------
+// Snap to each vertex of each triangle of the given mesh. If the given mesh
+// is identical to the mesh used to make this kd tree, then the result should
+// be a vertex-to-vertex mesh.
+//-----------------------------------------------------------------------------
+void SKdNode::SnapToMesh(SMesh *m) {
+ int i, j, k;
+ for(i = 0; i < m->l.n; i++) {
+ STriangle *tr = &(m->l.elem[i]);
+ for(j = 0; j < 3; j++) {
+ Vector v = ((j == 0) ? tr->a :
+ ((j == 1) ? tr->b :
+ tr->c));
+
+ SMesh extra = {};
+ SnapToVertex(v, &extra);
+
+ for(k = 0; k < extra.l.n; k++) {
+ STriangle *tra = (STriangle *)AllocTemporary(sizeof(*tra));
+ *tra = extra.l.elem[k];
+ AddTriangle(tra);
+ }
+ extra.Clear();
+ }
+ }
+}
+
+//-----------------------------------------------------------------------------
+// For all the edges in sel, split them against the given triangle, and test
+// them for occlusion. Keep only the visible segments. sel is both our input
+// and our output.
+//-----------------------------------------------------------------------------
+void SKdNode::SplitLinesAgainstTriangle(SEdgeList *sel, STriangle *tr, bool removeHidden) {
+ SEdgeList seln = {};
+
+ Vector tn = tr->Normal().WithMagnitude(1);
+ double td = tn.Dot(tr->a);
+
+ // Consider front-facing triangles only.
+ if(tn.z > LENGTH_EPS) {
+ // If the edge crosses our triangle's plane, then split into above
+ // and below parts. Note that we must preserve auxA, which contains
+ // the style associated with this line.
+ SEdge *se;
+ for(se = sel->l.First(); se; se = sel->l.NextAfter(se)) {
+ double da = (se->a).Dot(tn) - td,
+ db = (se->b).Dot(tn) - td;
+ if((da < -LENGTH_EPS && db > LENGTH_EPS) ||
+ (db < -LENGTH_EPS && da > LENGTH_EPS))
+ {
+ Vector m = Vector::AtIntersectionOfPlaneAndLine(
+ tn, td,
+ se->a, se->b, NULL);
+ seln.AddEdge(m, se->b, se->auxA);
+ se->b = m;
+ }
+ }
+ for(se = seln.l.First(); se; se = seln.l.NextAfter(se)) {
+ sel->AddEdge(se->a, se->b, se->auxA);
+ }
+ seln.Clear();
+
+ for(se = sel->l.First(); se; se = sel->l.NextAfter(se)) {
+ Vector pt = ((se->a).Plus(se->b)).ScaledBy(0.5);
+ if(pt.Dot(tn) - td > -LENGTH_EPS) {
+ // Edge is in front of or on our plane (remember, tn.z > 0)
+ // so it is exempt from further splitting
+ se->auxB = 1;
+ } else {
+ // Edge is behind our plane, needs further splitting
+ se->auxB = 0;
+ }
+ }
+
+ // Considering only the (x, y) coordinates, split the edge against our
+ // triangle.
+ Point2d a = (tr->a).ProjectXy(),
+ b = (tr->b).ProjectXy(),
+ c = (tr->c).ProjectXy();
+
+ Point2d n[3] = { (b.Minus(a)).Normal().WithMagnitude(1),
+ (c.Minus(b)).Normal().WithMagnitude(1),
+ (a.Minus(c)).Normal().WithMagnitude(1) };
+
+ double d[3] = { n[0].Dot(b),
+ n[1].Dot(c),
+ n[2].Dot(a) };
+
+ // Split all of the edges where they intersect the triangle edges
+ int i;
+ for(i = 0; i < 3; i++) {
+ for(se = sel->l.First(); se; se = sel->l.NextAfter(se)) {
+ if(se->auxB) continue;
+
+ Point2d ap = (se->a).ProjectXy(),
+ bp = (se->b).ProjectXy();
+ double da = n[i].Dot(ap) - d[i],
+ db = n[i].Dot(bp) - d[i];
+ if((da < -LENGTH_EPS && db > LENGTH_EPS) ||
+ (db < -LENGTH_EPS && da > LENGTH_EPS))
+ {
+ double dab = (db - da);
+ Vector spl = ((se->a).ScaledBy( db/dab)).Plus(
+ (se->b).ScaledBy(-da/dab));
+ seln.AddEdge(spl, se->b, se->auxA);
+ se->b = spl;
+ }
+ }
+ for(se = seln.l.First(); se; se = seln.l.NextAfter(se)) {
+ // The split pieces are all behind the triangle, since only
+ // edges behind the triangle got split. So their auxB is 0.
+ sel->AddEdge(se->a, se->b, se->auxA, 0);
+ }
+ seln.Clear();
+ }
+
+ for(se = sel->l.First(); se; se = sel->l.NextAfter(se)) {
+ if(se->auxB) {
+ // Lies above or on the triangle plane, so triangle doesn't
+ // occlude it.
+ se->tag = 0;
+ } else {
+ // Test the segment to see if it lies outside the triangle
+ // (i.e., outside wrt at least one edge), and keep it only
+ // then.
+ Point2d pt = ((se->a).Plus(se->b).ScaledBy(0.5)).ProjectXy();
+ se->tag = 1;
+ for(i = 0; i < 3; i++) {
+ // If the test point lies on the boundary of our triangle,
+ // then we still discard the edge.
+ if(n[i].Dot(pt) - d[i] > LENGTH_EPS) se->tag = 0;
+ }
+ }
+ if(!removeHidden && se->tag == 1)
+ se->auxA = Style::HIDDEN_EDGE;
+ }
+ if(removeHidden)
+ sel->l.RemoveTagged();
+ }
+}
+
+//-----------------------------------------------------------------------------
+// Given an edge orig, occlusion test it against our mesh. We output an edge
+// list in sel, containing the visible portions of that edge.
+//-----------------------------------------------------------------------------
+void SKdNode::OcclusionTestLine(SEdge orig, SEdgeList *sel, int cnt, bool removeHidden) {
+ if(gt && lt) {
+ double ac = (orig.a).Element(which),
+ bc = (orig.b).Element(which);
+ // We can ignore triangles that are separated in x or y, but triangles
+ // that are separated in z may still contribute
+ if(ac < c + KDTREE_EPS ||
+ bc < c + KDTREE_EPS ||
+ which == 2)
+ {
+ lt->OcclusionTestLine(orig, sel, cnt, removeHidden);
+ }
+ if(ac > c - KDTREE_EPS ||
+ bc > c - KDTREE_EPS ||
+ which == 2)
+ {
+ gt->OcclusionTestLine(orig, sel, cnt, removeHidden);
+ }
+ } else {
+ STriangleLl *ll;
+ for(ll = tris; ll; ll = ll->next) {
+ STriangle *tr = ll->tri;
+
+ if(tr->tag == cnt) continue;
+
+ SplitLinesAgainstTriangle(sel, tr, removeHidden);
+ tr->tag = cnt;
+ }
+ }
+}
+
+//-----------------------------------------------------------------------------
+// Search the mesh for a triangle with an edge from b to a (i.e., the mate
+// for the edge from a to b), and increment info->count each time that we
+// find one. If a triangle is found, then report whether it is front- or
+// back-facing using info->frontFacing. And regardless of whether a mate is
+// found, report whether the edge intersects the mesh with info->intersectsMesh;
+// if coplanarIsInter then we count the edge as intersecting if it's coplanar
+// with a triangle in the mesh, otherwise not.
+//-----------------------------------------------------------------------------
+void SKdNode::FindEdgeOn(Vector a, Vector b, int cnt, bool coplanarIsInter,
+ EdgeOnInfo *info)
+{
+ if(gt && lt) {
+ double ac = a.Element(which),
+ bc = b.Element(which);
+ if(ac < c + KDTREE_EPS ||
+ bc < c + KDTREE_EPS)
+ {
+ lt->FindEdgeOn(a, b, cnt, coplanarIsInter, info);
+ }
+ if(ac > c - KDTREE_EPS ||
+ bc > c - KDTREE_EPS)
+ {
+ gt->FindEdgeOn(a, b, cnt, coplanarIsInter, info);
+ }
+ return;
+ }
+
+ // We are a leaf node; so we iterate over all the triangles in our
+ // linked list.
+ STriangleLl *ll;
+ for(ll = tris; ll; ll = ll->next) {
+ STriangle *tr = ll->tri;
+
+ if(tr->tag == cnt) continue;
+
+ // Test if this triangle matches up with the given edge
+ if((a.Equals(tr->b) && b.Equals(tr->a)) ||
+ (a.Equals(tr->c) && b.Equals(tr->b)) ||
+ (a.Equals(tr->a) && b.Equals(tr->c)))
+ {
+ info->count++;
+ // Record whether this triangle is front- or back-facing.
+ if(tr->Normal().z > LENGTH_EPS) {
+ info->frontFacing = true;
+ } else {
+ info->frontFacing = false;
+ }
+ // Record the triangle
+ info->tr = tr;
+ // And record which vertexes a and b correspond to
+ info->ai = a.Equals(tr->a) ? 0 : (a.Equals(tr->b) ? 1 : 2);
+ info->bi = b.Equals(tr->a) ? 0 : (b.Equals(tr->b) ? 1 : 2);
+ } else if(((a.Equals(tr->a) && b.Equals(tr->b)) ||
+ (a.Equals(tr->b) && b.Equals(tr->c)) ||
+ (a.Equals(tr->c) && b.Equals(tr->a))))
+ {
+ // It's an edge of this triangle, okay.
+ } else {
+ // Check for self-intersection
+ Vector n = (tr->Normal()).WithMagnitude(1);
+ double d = (tr->a).Dot(n);
+ double pa = a.Dot(n) - d, pb = b.Dot(n) - d;
+ // It's an intersection if neither point lies in-plane,
+ // and the edge crosses the plane (should handle in-plane
+ // intersections separately but don't yet).
+ if((pa < -LENGTH_EPS || pa > LENGTH_EPS) &&
+ (pb < -LENGTH_EPS || pb > LENGTH_EPS) &&
+ (pa*pb < 0))
+ {
+ // The edge crosses the plane of the triangle; now see if
+ // it crosses inside the triangle.
+ if(tr->ContainsPointProjd(b.Minus(a), a)) {
+ if(coplanarIsInter) {
+ info->intersectsMesh = true;
+ } else {
+ Vector p = Vector::AtIntersectionOfPlaneAndLine(
+ n, d, a, b, NULL);
+ Vector ta = tr->a,
+ tb = tr->b,
+ tc = tr->c;
+ if((p.DistanceToLine(ta, tb.Minus(ta)) < LENGTH_EPS) ||
+ (p.DistanceToLine(tb, tc.Minus(tb)) < LENGTH_EPS) ||
+ (p.DistanceToLine(tc, ta.Minus(tc)) < LENGTH_EPS))
+ {
+ // Intersection lies on edge. This happens when
+ // our edge is from a triangle coplanar with
+ // another triangle in the mesh. We don't test
+ // the edge against triangles whose plane contains
+ // that edge, but we do end up testing against
+ // the coplanar triangle's neighbours, which we
+ // will intersect on their edges.
+ } else {
+ info->intersectsMesh = true;
+ }
+ }
+ }
+ }
+ }
+
+ // Ensure that we don't count this triangle twice if it appears
+ // in two buckets of the kd tree.
+ tr->tag = cnt;
+ }
+}
+
+static bool CheckAndAddTrianglePair(std::set<std::pair<STriangle *, STriangle *>> *pairs,
+ STriangle *a, STriangle *b)
+{
+ if(pairs->find(std::make_pair(a, b)) != pairs->end() ||
+ pairs->find(std::make_pair(b, a)) != pairs->end())
+ return true;
+
+ pairs->emplace(a, b);
+ return false;
+}
+
+//-----------------------------------------------------------------------------
+// Pick certain classes of edges out from our mesh. These might be:
+// * naked edges (i.e., edges with no anti-parallel neighbor) and self-
+// intersecting edges (i.e., edges that cross another triangle)
+// * turning edges (i.e., edges where a front-facing triangle joins
+// a back-facing triangle)
+// * emphasized edges (i.e., edges where a triangle from one face joins
+// a triangle from a different face)
+//-----------------------------------------------------------------------------
+void SKdNode::MakeCertainEdgesInto(SEdgeList *sel, int how, bool coplanarIsInter,
+ bool *inter, bool *leaky, int auxA)
+{
+ if(inter) *inter = false;
+ if(leaky) *leaky = false;
+
+ std::vector<STriangle *> tris;
+ ClearTags();
+ ListTrianglesInto(&tris);
+
+ std::set<std::pair<STriangle *, STriangle *>> edgeTris;
+ int cnt = 1234;
+ for(STriangle *tr : tris) {
+ for(int j = 0; j < 3; j++) {
+ Vector a = (j == 0) ? tr->a : ((j == 1) ? tr->b : tr->c);
+ Vector b = (j == 0) ? tr->b : ((j == 1) ? tr->c : tr->a);
+
+ SKdNode::EdgeOnInfo info = {};
+ FindEdgeOn(a, b, cnt, coplanarIsInter, &info);
+
+ switch(how) {
+ case NAKED_OR_SELF_INTER_EDGES:
+ if(info.count != 1) {
+ sel->AddEdge(a, b, auxA);
+ if(leaky) *leaky = true;
+ }
+ if(info.intersectsMesh) {
+ sel->AddEdge(a, b, auxA);
+ if(inter) *inter = true;
+ }
+ break;
+
+ case SELF_INTER_EDGES:
+ if(info.intersectsMesh) {
+ sel->AddEdge(a, b, auxA);
+ if(inter) *inter = true;
+ }
+ break;
+
+ case TURNING_EDGES:
+ if((tr->Normal().z < LENGTH_EPS) &&
+ (info.count == 1) &&
+ info.frontFacing)
+ {
+ if(CheckAndAddTrianglePair(&edgeTris, tr, info.tr))
+ break;
+ // This triangle is back-facing (or on edge), and
+ // this edge has exactly one mate, and that mate is
+ // front-facing. So this is a turning edge.
+ sel->AddEdge(a, b, auxA);
+ }
+ break;
+
+ case EMPHASIZED_EDGES:
+ if(info.count == 1 && tr->meta.face != info.tr->meta.face) {
+ if(CheckAndAddTrianglePair(&edgeTris, tr, info.tr))
+ break;
+ // The two triangles that join at this edge come from
+ // different faces; either really different faces,
+ // or one is from a face and the other is zero (i.e.,
+ // not from a face).
+ sel->AddEdge(a, b, auxA);
+ }
+ break;
+
+ case SHARP_EDGES:
+ if(info.count == 1) {
+ Vector na0 = (j == 0) ? tr->an :
+ ((j == 1) ? tr->bn : tr->cn);
+ Vector nb0 = (j == 0) ? tr->bn :
+ ((j == 1) ? tr->cn : tr->an);
+ Vector na1 = (info.ai == 0) ? info.tr->an :
+ ((info.ai == 1) ? info.tr->bn : info.tr->cn);
+ Vector nb1 = (info.bi == 0) ? info.tr->an :
+ ((info.bi == 1) ? info.tr->bn : info.tr->cn);
+ na0 = na0.WithMagnitude(1.0);
+ nb0 = nb0.WithMagnitude(1.0);
+ na1 = na1.WithMagnitude(1.0);
+ nb1 = nb1.WithMagnitude(1.0);
+ if(!((na0.Equals(na1) && nb0.Equals(nb1)) ||
+ (na0.Equals(nb1) && nb0.Equals(na1)))) {
+ if(CheckAndAddTrianglePair(&edgeTris, tr, info.tr))
+ break;
+ // The two triangles that join at this edge meet at a sharp
+ // angle. This implies they come from different faces.
+ sel->AddEdge(a, b, auxA);
+ }
+ }
+ break;
+
+ default: oops();
+ }
+
+ cnt++;
+ }
+ }
+}
+
+void SKdNode::MakeOutlinesInto(SOutlineList *sol)
+{
+ std::vector<STriangle *> tris;
+ ClearTags();
+ ListTrianglesInto(&tris);
+
+ std::set<std::pair<STriangle *, STriangle *>> edgeTris;
+ int cnt = 1234;
+ for(STriangle *tr : tris) {
+ for(int j = 0; j < 3; j++) {
+ Vector a = (j == 0) ? tr->a : ((j == 1) ? tr->b : tr->c);
+ Vector b = (j == 0) ? tr->b : ((j == 1) ? tr->c : tr->a);
+
+ SKdNode::EdgeOnInfo info = {};
+ FindEdgeOn(a, b, cnt, /*coplanarIsInter=*/false, &info);
+ cnt++;
+ if(info.count != 1) continue;
+ if(CheckAndAddTrianglePair(&edgeTris, tr, info.tr))
+ continue;
+
+ sol->AddEdge(a, b, tr->Normal(), info.tr->Normal());
+ }
+ }
+}
+
+void SOutlineList::Clear() {
+ l.Clear();
+}
+
+void SOutlineList::AddEdge(Vector a, Vector b, Vector nl, Vector nr) {
+ SOutline so = {};
+ so.a = a;
+ so.b = b;
+ so.nl = nl;
+ so.nr = nr;
+ l.Add(&so);
+}
+
+void SOutlineList::FillOutlineTags(Vector projDir) {
+ for(SOutline *so = l.First(); so; so = l.NextAfter(so)) {
+ so->tag = ((so->nl.Dot(projDir) > 0.0) != (so->nr.Dot(projDir) > 0.0));
+ }
+}
+
+void SOutlineList::MakeFromCopyOf(SOutlineList *sol) {
+ for(SOutline *so = sol->l.First(); so; so = sol->l.NextAfter(so)) {
+ l.Add(so);
+ }
+}
--- /dev/null
+//-----------------------------------------------------------------------------
+// User-initiated (not parametric) operations to modify our sketch, by
+// changing the requests, like to round a corner or split curves where they
+// intersect.
+//
+// Copyright 2008-2013 Jonathan Westhues.
+//-----------------------------------------------------------------------------
+#include "solvespace.h"
+
+//-----------------------------------------------------------------------------
+// Replace constraints on oldpt with the same constraints on newpt.
+// Useful when splitting, tangent arcing, or removing bezier points.
+//-----------------------------------------------------------------------------
+void GraphicsWindow::ReplacePointInConstraints(hEntity oldpt, hEntity newpt) {
+ int i;
+ for(i = 0; i < SK.constraint.n; i++) {
+ Constraint *c = &(SK.constraint.elem[i]);
+ if(c->ptA.v == oldpt.v) c->ptA = newpt;
+ if(c->ptB.v == oldpt.v) c->ptB = newpt;
+ }
+}
+
+//-----------------------------------------------------------------------------
+// Remove constraints on hpt. Useful when removing bezier points.
+//-----------------------------------------------------------------------------
+void GraphicsWindow::RemoveConstraintsForPointBeingDeleted(hEntity hpt) {
+ SK.constraint.ClearTags();
+ for(int i = 0; i < SK.constraint.n; i++) {
+ Constraint *c = &(SK.constraint.elem[i]);
+ if(c->ptA.v == hpt.v || c->ptB.v == hpt.v) {
+ c->tag = 1;
+ (SS.deleted.constraints)++;
+ if(c->type != Constraint::POINTS_COINCIDENT &&
+ c->type != Constraint::HORIZONTAL &&
+ c->type != Constraint::VERTICAL)
+ {
+ (SS.deleted.nonTrivialConstraints)++;
+ }
+ }
+ }
+ SK.constraint.RemoveTagged();
+}
+
+//-----------------------------------------------------------------------------
+// Let's say that A is coincident with B, and B is coincident with C. This
+// implies that A is coincident with C; but if we delete B, then both
+// constraints must be deleted too (since they reference B), and A is no
+// longer constrained to C. This routine adds back that constraint.
+//-----------------------------------------------------------------------------
+void GraphicsWindow::FixConstraintsForRequestBeingDeleted(hRequest hr) {
+ Request *r = SK.GetRequest(hr);
+ if(r->group.v != SS.GW.activeGroup.v) return;
+
+ Entity *e;
+ for(e = SK.entity.First(); e; e = SK.entity.NextAfter(e)) {
+ if(!(e->h.isFromRequest())) continue;
+ if(e->h.request().v != hr.v) continue;
+
+ if(e->type != Entity::POINT_IN_2D &&
+ e->type != Entity::POINT_IN_3D)
+ {
+ continue;
+ }
+
+ // This is a point generated by the request being deleted; so fix
+ // the constraints for that.
+ FixConstraintsForPointBeingDeleted(e->h);
+ }
+}
+void GraphicsWindow::FixConstraintsForPointBeingDeleted(hEntity hpt) {
+ List<hEntity> ld = {};
+
+ Constraint *c;
+ SK.constraint.ClearTags();
+ for(c = SK.constraint.First(); c; c = SK.constraint.NextAfter(c)) {
+ if(c->type != Constraint::POINTS_COINCIDENT) continue;
+ if(c->group.v != SS.GW.activeGroup.v) continue;
+
+ if(c->ptA.v == hpt.v) {
+ ld.Add(&(c->ptB));
+ c->tag = 1;
+ }
+ if(c->ptB.v == hpt.v) {
+ ld.Add(&(c->ptA));
+ c->tag = 1;
+ }
+ }
+ // Remove constraints without waiting for regeneration; this way
+ // if another point takes the place of the deleted one (e.g. when
+ // removing control points of a bezier) the constraint doesn't
+ // spuriously move. Similarly, subsequent calls of this function
+ // (if multiple coincident points are getting deleted) will work
+ // correctly.
+ SK.constraint.RemoveTagged();
+
+ // If more than one point was constrained coincident with hpt, then
+ // those two points were implicitly coincident with each other. By
+ // deleting hpt (and all constraints that mention it), we will delete
+ // that relationship. So put it back here now.
+ int i;
+ for(i = 1; i < ld.n; i++) {
+ Constraint::ConstrainCoincident(ld.elem[i-1], ld.elem[i]);
+ }
+ ld.Clear();
+}
+
+//-----------------------------------------------------------------------------
+// A curve by its parametric equation, helper functions for computing tangent
+// arcs by a numerical method.
+//-----------------------------------------------------------------------------
+void GraphicsWindow::ParametricCurve::MakeFromEntity(hEntity he, bool reverse) {
+ *this = {};
+ Entity *e = SK.GetEntity(he);
+ if(e->type == Entity::LINE_SEGMENT) {
+ isLine = true;
+ p0 = e->EndpointStart(),
+ p1 = e->EndpointFinish();
+ if(reverse) {
+ swap(p0, p1);
+ }
+ } else if(e->type == Entity::ARC_OF_CIRCLE) {
+ isLine = false;
+ p0 = SK.GetEntity(e->point[0])->PointGetNum();
+ Vector pe = SK.GetEntity(e->point[1])->PointGetNum();
+ r = (pe.Minus(p0)).Magnitude();
+ e->ArcGetAngles(&theta0, &theta1, &dtheta);
+ if(reverse) {
+ swap(theta0, theta1);
+ dtheta = -dtheta;
+ }
+ EntityBase *wrkpln = SK.GetEntity(e->workplane)->Normal();
+ u = wrkpln->NormalU();
+ v = wrkpln->NormalV();
+ } else {
+ oops();
+ }
+}
+double GraphicsWindow::ParametricCurve::LengthForAuto(void) {
+ if(isLine) {
+ // Allow a third of the line to disappear with auto radius
+ return (p1.Minus(p0)).Magnitude() / 3;
+ } else {
+ // But only a twentieth of the arc; shorter means fewer numerical
+ // problems since the curve is more linear over shorter sections.
+ return (fabs(dtheta)*r)/20;
+ }
+}
+Vector GraphicsWindow::ParametricCurve::PointAt(double t) {
+ if(isLine) {
+ return p0.Plus((p1.Minus(p0)).ScaledBy(t));
+ } else {
+ double theta = theta0 + dtheta*t;
+ return p0.Plus(u.ScaledBy(r*cos(theta)).Plus(v.ScaledBy(r*sin(theta))));
+ }
+}
+Vector GraphicsWindow::ParametricCurve::TangentAt(double t) {
+ if(isLine) {
+ return p1.Minus(p0);
+ } else {
+ double theta = theta0 + dtheta*t;
+ Vector t = u.ScaledBy(-r*sin(theta)).Plus(v.ScaledBy(r*cos(theta)));
+ t = t.ScaledBy(dtheta);
+ return t;
+ }
+}
+hRequest GraphicsWindow::ParametricCurve::CreateRequestTrimmedTo(double t,
+ bool extraConstraints, hEntity orig, hEntity arc, bool arcFinish)
+{
+ hRequest hr;
+ Entity *e;
+ if(isLine) {
+ hr = SS.GW.AddRequest(Request::LINE_SEGMENT, false),
+ e = SK.GetEntity(hr.entity(0));
+ SK.GetEntity(e->point[0])->PointForceTo(PointAt(t));
+ SK.GetEntity(e->point[1])->PointForceTo(PointAt(1));
+ ConstrainPointIfCoincident(e->point[0]);
+ ConstrainPointIfCoincident(e->point[1]);
+ if(extraConstraints) {
+ Constraint::Constrain(Constraint::PT_ON_LINE,
+ hr.entity(1), Entity::NO_ENTITY, orig);
+ }
+ Constraint::Constrain(Constraint::ARC_LINE_TANGENT,
+ Entity::NO_ENTITY, Entity::NO_ENTITY,
+ arc, e->h, arcFinish, false);
+ } else {
+ hr = SS.GW.AddRequest(Request::ARC_OF_CIRCLE, false),
+ e = SK.GetEntity(hr.entity(0));
+ SK.GetEntity(e->point[0])->PointForceTo(p0);
+ if(dtheta > 0) {
+ SK.GetEntity(e->point[1])->PointForceTo(PointAt(t));
+ SK.GetEntity(e->point[2])->PointForceTo(PointAt(1));
+ } else {
+ SK.GetEntity(e->point[2])->PointForceTo(PointAt(t));
+ SK.GetEntity(e->point[1])->PointForceTo(PointAt(1));
+ }
+ ConstrainPointIfCoincident(e->point[0]);
+ ConstrainPointIfCoincident(e->point[1]);
+ ConstrainPointIfCoincident(e->point[2]);
+ // The tangency constraint alone is enough to fully constrain it,
+ // so there's no need for more.
+ Constraint::Constrain(Constraint::CURVE_CURVE_TANGENT,
+ Entity::NO_ENTITY, Entity::NO_ENTITY,
+ arc, e->h, arcFinish, (dtheta < 0));
+ }
+ return hr;
+}
+
+//-----------------------------------------------------------------------------
+// If a point in the same group as hpt, and numerically coincident with hpt,
+// happens to exist, then constrain that point coincident to hpt.
+//-----------------------------------------------------------------------------
+void GraphicsWindow::ParametricCurve::ConstrainPointIfCoincident(hEntity hpt) {
+ Entity *e, *pt;
+ pt = SK.GetEntity(hpt);
+ Vector ev, ptv;
+ ptv = pt->PointGetNum();
+
+ for(e = SK.entity.First(); e; e = SK.entity.NextAfter(e)) {
+ if(e->h.v == pt->h.v) continue;
+ if(!e->IsPoint()) continue;
+ if(e->group.v != pt->group.v) continue;
+ if(e->workplane.v != pt->workplane.v) continue;
+
+ ev = e->PointGetNum();
+ if(!ev.Equals(ptv)) continue;
+
+ Constraint::ConstrainCoincident(hpt, e->h);
+ break;
+ }
+}
+
+//-----------------------------------------------------------------------------
+// A single point must be selected when this function is called. We find two
+// non-construction line segments that join at this point, and create a
+// tangent arc joining them.
+//-----------------------------------------------------------------------------
+void GraphicsWindow::MakeTangentArc(void) {
+ if(!LockedInWorkplane()) {
+ Error("Must be sketching in workplane to create tangent "
+ "arc.");
+ return;
+ }
+
+ // The point corresponding to the vertex to be rounded.
+ Vector pshared = SK.GetEntity(gs.point[0])->PointGetNum();
+ ClearSelection();
+
+ // First, find two requests (that are not construction, and that are
+ // in our group and workplane) that generate entities that have an
+ // endpoint at our vertex to be rounded.
+ int i, c = 0;
+ Entity *ent[2];
+ Request *req[2];
+ hRequest hreq[2];
+ hEntity hent[2];
+ bool pointf[2];
+ for(i = 0; i < SK.request.n; i++) {
+ Request *r = &(SK.request.elem[i]);
+ if(r->group.v != activeGroup.v) continue;
+ if(r->workplane.v != ActiveWorkplane().v) continue;
+ if(r->construction) continue;
+ if(r->type != Request::LINE_SEGMENT &&
+ r->type != Request::ARC_OF_CIRCLE)
+ {
+ continue;
+ }
+
+ Entity *e = SK.GetEntity(r->h.entity(0));
+ Vector ps = e->EndpointStart(),
+ pf = e->EndpointFinish();
+
+ if(ps.Equals(pshared) || pf.Equals(pshared)) {
+ if(c < 2) {
+ // We record the entity and request and their handles,
+ // and whether the vertex to be rounded is the start or
+ // finish of this entity.
+ ent[c] = e;
+ hent[c] = e->h;
+ req[c] = r;
+ hreq[c] = r->h;
+ pointf[c] = (pf.Equals(pshared));
+ }
+ c++;
+ }
+ }
+ if(c != 2) {
+ Error("To create a tangent arc, select a point where two "
+ "non-construction lines or cicles in this group and "
+ "workplane join.");
+ return;
+ }
+
+ Entity *wrkpl = SK.GetEntity(ActiveWorkplane());
+ Vector wn = wrkpl->Normal()->NormalN();
+
+ // Based on these two entities, we make the objects that we'll use to
+ // numerically find the tangent arc.
+ ParametricCurve pc[2];
+ pc[0].MakeFromEntity(ent[0]->h, pointf[0]);
+ pc[1].MakeFromEntity(ent[1]->h, pointf[1]);
+
+ // And thereafter we mustn't touch the entity or req ptrs,
+ // because the new requests/entities we add might force a
+ // realloc.
+ memset(ent, 0, sizeof(ent));
+ memset(req, 0, sizeof(req));
+
+ Vector pinter;
+ double r = 0.0, vv = 0.0;
+ // We now do Newton iterations to find the tangent arc, and its positions
+ // t back along the two curves, starting from shared point of the curves
+ // at t = 0. Lots of iterations helps convergence, and this is still
+ // ~10 ms for everything.
+ int iters = 1000;
+ double t[2] = { 0, 0 }, tp[2];
+ for(i = 0; i < iters + 20; i++) {
+ Vector p0 = pc[0].PointAt(t[0]),
+ p1 = pc[1].PointAt(t[1]),
+ t0 = pc[0].TangentAt(t[0]),
+ t1 = pc[1].TangentAt(t[1]);
+
+ pinter = Vector::AtIntersectionOfLines(p0, p0.Plus(t0),
+ p1, p1.Plus(t1),
+ NULL, NULL, NULL);
+
+ // The sign of vv determines whether shortest distance is
+ // clockwise or anti-clockwise.
+ Vector v = (wn.Cross(t0)).WithMagnitude(1);
+ vv = t1.Dot(v);
+
+ double dot = (t0.WithMagnitude(1)).Dot(t1.WithMagnitude(1));
+ double theta = acos(dot);
+
+ if(SS.tangentArcManual) {
+ r = SS.tangentArcRadius;
+ } else {
+ r = 200/scale;
+ // Set the radius so that no more than one third of the
+ // line segment disappears.
+ r = min(r, pc[0].LengthForAuto()*tan(theta/2));
+ r = min(r, pc[1].LengthForAuto()*tan(theta/2));;
+ }
+ // We are source-stepping the radius, to improve convergence. So
+ // ramp that for most of the iterations, and then do a few at
+ // the end with that constant for polishing.
+ if(i < iters) {
+ r *= 0.1 + 0.9*i/((double)iters);
+ }
+
+ // The distance from the intersection of the lines to the endpoint
+ // of the arc, along each line.
+ double el = r/tan(theta/2);
+
+ // Compute the endpoints of the arc, for each curve
+ Vector pa0 = pinter.Plus(t0.WithMagnitude(el)),
+ pa1 = pinter.Plus(t1.WithMagnitude(el));
+
+ tp[0] = t[0];
+ tp[1] = t[1];
+
+ // And convert those points to parameter values along the curve.
+ t[0] += (pa0.Minus(p0)).DivPivoting(t0);
+ t[1] += (pa1.Minus(p1)).DivPivoting(t1);
+ }
+
+ // Stupid check for convergence, and for an out of range result (as
+ // we would get, for example, if the line is too short to fit the
+ // rounding arc).
+ if(fabs(tp[0] - t[0]) > 1e-3 || fabs(tp[1] - t[1]) > 1e-3 ||
+ t[0] < 0.01 || t[1] < 0.01 ||
+ t[0] > 0.99 || t[1] > 0.99 ||
+ isnan(t[0]) || isnan(t[1]))
+ {
+ Error("Couldn't round this corner. Try a smaller radius, or try "
+ "creating the desired geometry by hand with tangency "
+ "constraints.");
+ return;
+ }
+
+ // Compute the location of the center of the arc
+ Vector center = pc[0].PointAt(t[0]),
+ v0inter = pinter.Minus(center);
+ int a, b;
+ if(vv < 0) {
+ a = 1; b = 2;
+ center = center.Minus(v0inter.Cross(wn).WithMagnitude(r));
+ } else {
+ a = 2; b = 1;
+ center = center.Plus(v0inter.Cross(wn).WithMagnitude(r));
+ }
+
+ SS.UndoRemember();
+
+ hRequest harc = AddRequest(Request::ARC_OF_CIRCLE, false);
+ Entity *earc = SK.GetEntity(harc.entity(0));
+ hEntity hearc = earc->h;
+
+ SK.GetEntity(earc->point[0])->PointForceTo(center);
+ SK.GetEntity(earc->point[a])->PointForceTo(pc[0].PointAt(t[0]));
+ SK.GetEntity(earc->point[b])->PointForceTo(pc[1].PointAt(t[1]));
+
+ earc = NULL;
+
+ pc[0].CreateRequestTrimmedTo(t[0], !SS.tangentArcDeleteOld,
+ hent[0], hearc, (b == 1));
+ pc[1].CreateRequestTrimmedTo(t[1], !SS.tangentArcDeleteOld,
+ hent[1], hearc, (a == 1));
+
+ // Now either make the original entities construction, or delete them
+ // entirely, according to user preference.
+ Request *re;
+ SK.request.ClearTags();
+ for(re = SK.request.First(); re; re = SK.request.NextAfter(re)) {
+ if(re->h.v == hreq[0].v || re->h.v == hreq[1].v) {
+ if(SS.tangentArcDeleteOld) {
+ re->tag = 1;
+ } else {
+ re->construction = true;
+ }
+ }
+ }
+ if(SS.tangentArcDeleteOld) {
+ DeleteTaggedRequests();
+ }
+
+ SS.ScheduleGenerateAll();
+}
+
+hEntity GraphicsWindow::SplitLine(hEntity he, Vector pinter) {
+ // Save the original endpoints, since we're about to delete this entity.
+ Entity *e01 = SK.GetEntity(he);
+ hEntity hep0 = e01->point[0], hep1 = e01->point[1];
+ Vector p0 = SK.GetEntity(hep0)->PointGetNum(),
+ p1 = SK.GetEntity(hep1)->PointGetNum();
+
+ // Add the two line segments this one gets split into.
+ hRequest r0i = AddRequest(Request::LINE_SEGMENT, false),
+ ri1 = AddRequest(Request::LINE_SEGMENT, false);
+ // Don't get entities till after adding, realloc issues
+
+ Entity *e0i = SK.GetEntity(r0i.entity(0)),
+ *ei1 = SK.GetEntity(ri1.entity(0));
+
+ SK.GetEntity(e0i->point[0])->PointForceTo(p0);
+ SK.GetEntity(e0i->point[1])->PointForceTo(pinter);
+ SK.GetEntity(ei1->point[0])->PointForceTo(pinter);
+ SK.GetEntity(ei1->point[1])->PointForceTo(p1);
+
+ ReplacePointInConstraints(hep0, e0i->point[0]);
+ ReplacePointInConstraints(hep1, ei1->point[1]);
+ Constraint::ConstrainCoincident(e0i->point[1], ei1->point[0]);
+ return e0i->point[1];
+}
+
+hEntity GraphicsWindow::SplitCircle(hEntity he, Vector pinter) {
+ Entity *circle = SK.GetEntity(he);
+ if(circle->type == Entity::CIRCLE) {
+ // Start with an unbroken circle, split it into a 360 degree arc.
+ Vector center = SK.GetEntity(circle->point[0])->PointGetNum();
+
+ circle = NULL; // shortly invalid!
+ hRequest hr = AddRequest(Request::ARC_OF_CIRCLE, false);
+
+ Entity *arc = SK.GetEntity(hr.entity(0));
+
+ SK.GetEntity(arc->point[0])->PointForceTo(center);
+ SK.GetEntity(arc->point[1])->PointForceTo(pinter);
+ SK.GetEntity(arc->point[2])->PointForceTo(pinter);
+
+ Constraint::ConstrainCoincident(arc->point[1], arc->point[2]);
+ return arc->point[1];
+ } else {
+ // Start with an arc, break it in to two arcs
+ hEntity hc = circle->point[0],
+ hs = circle->point[1],
+ hf = circle->point[2];
+ Vector center = SK.GetEntity(hc)->PointGetNum(),
+ start = SK.GetEntity(hs)->PointGetNum(),
+ finish = SK.GetEntity(hf)->PointGetNum();
+
+ circle = NULL; // shortly invalid!
+ hRequest hr0 = AddRequest(Request::ARC_OF_CIRCLE, false),
+ hr1 = AddRequest(Request::ARC_OF_CIRCLE, false);
+
+ Entity *arc0 = SK.GetEntity(hr0.entity(0)),
+ *arc1 = SK.GetEntity(hr1.entity(0));
+
+ SK.GetEntity(arc0->point[0])->PointForceTo(center);
+ SK.GetEntity(arc0->point[1])->PointForceTo(start);
+ SK.GetEntity(arc0->point[2])->PointForceTo(pinter);
+
+ SK.GetEntity(arc1->point[0])->PointForceTo(center);
+ SK.GetEntity(arc1->point[1])->PointForceTo(pinter);
+ SK.GetEntity(arc1->point[2])->PointForceTo(finish);
+
+ ReplacePointInConstraints(hs, arc0->point[1]);
+ ReplacePointInConstraints(hf, arc1->point[2]);
+ Constraint::ConstrainCoincident(arc0->point[2], arc1->point[1]);
+ return arc0->point[2];
+ }
+}
+
+hEntity GraphicsWindow::SplitCubic(hEntity he, Vector pinter) {
+ // Save the original endpoints, since we're about to delete this entity.
+ Entity *e01 = SK.GetEntity(he);
+ SBezierList sbl = {};
+ e01->GenerateBezierCurves(&sbl);
+
+ hEntity hep0 = e01->point[0],
+ hep1 = e01->point[3+e01->extraPoints],
+ hep0n = Entity::NO_ENTITY, // the new start point
+ hep1n = Entity::NO_ENTITY, // the new finish point
+ hepin = Entity::NO_ENTITY; // the intersection point
+
+ // The curve may consist of multiple cubic segments. So find which one
+ // contains the intersection point.
+ double t;
+ int i, j;
+ for(i = 0; i < sbl.l.n; i++) {
+ SBezier *sb = &(sbl.l.elem[i]);
+ if(sb->deg != 3) oops();
+
+ sb->ClosestPointTo(pinter, &t, false);
+ if(pinter.Equals(sb->PointAt(t))) {
+ // Split that segment at the intersection.
+ SBezier b0i, bi1, b01 = *sb;
+ b01.SplitAt(t, &b0i, &bi1);
+
+ // Add the two cubic segments this one gets split into.
+ hRequest r0i = AddRequest(Request::CUBIC, false),
+ ri1 = AddRequest(Request::CUBIC, false);
+ // Don't get entities till after adding, realloc issues
+
+ Entity *e0i = SK.GetEntity(r0i.entity(0)),
+ *ei1 = SK.GetEntity(ri1.entity(0));
+
+ for(j = 0; j <= 3; j++) {
+ SK.GetEntity(e0i->point[j])->PointForceTo(b0i.ctrl[j]);
+ }
+ for(j = 0; j <= 3; j++) {
+ SK.GetEntity(ei1->point[j])->PointForceTo(bi1.ctrl[j]);
+ }
+
+ Constraint::ConstrainCoincident(e0i->point[3], ei1->point[0]);
+ if(i == 0) hep0n = e0i->point[0];
+ hep1n = ei1->point[3];
+ hepin = e0i->point[3];
+ } else {
+ hRequest r = AddRequest(Request::CUBIC, false);
+ Entity *e = SK.GetEntity(r.entity(0));
+
+ for(j = 0; j <= 3; j++) {
+ SK.GetEntity(e->point[j])->PointForceTo(sb->ctrl[j]);
+ }
+
+ if(i == 0) hep0n = e->point[0];
+ hep1n = e->point[3];
+ }
+ }
+
+ sbl.Clear();
+
+ ReplacePointInConstraints(hep0, hep0n);
+ ReplacePointInConstraints(hep1, hep1n);
+ return hepin;
+}
+
+hEntity GraphicsWindow::SplitEntity(hEntity he, Vector pinter) {
+ Entity *e = SK.GetEntity(he);
+ int entityType = e->type;
+
+ hEntity ret;
+ if(e->IsCircle()) {
+ ret = SplitCircle(he, pinter);
+ } else if(e->type == Entity::LINE_SEGMENT) {
+ ret = SplitLine(he, pinter);
+ } else if(e->type == Entity::CUBIC || e->type == Entity::CUBIC_PERIODIC) {
+ ret = SplitCubic(he, pinter);
+ } else {
+ Error("Couldn't split this entity; lines, circles, or cubics only.");
+ return Entity::NO_ENTITY;
+ }
+
+ // Finally, delete the request that generated the original entity.
+ int reqType = EntReqTable::GetRequestForEntity(entityType);
+ SK.request.ClearTags();
+ for(int i = 0; i < SK.request.n; i++) {
+ Request *r = &(SK.request.elem[i]);
+ if(r->group.v != activeGroup.v) continue;
+ if(r->type != reqType) continue;
+
+ // If the user wants to keep the old entities around, they can just
+ // mark them construction first.
+ if(he.v == r->h.entity(0).v && !r->construction) {
+ r->tag = 1;
+ break;
+ }
+ }
+ DeleteTaggedRequests();
+
+ return ret;
+}
+
+void GraphicsWindow::SplitLinesOrCurves(void) {
+ if(!LockedInWorkplane()) {
+ Error("Must be sketching in workplane to split.");
+ return;
+ }
+
+ GroupSelection();
+ if(!(gs.n == 2 &&(gs.lineSegments +
+ gs.circlesOrArcs +
+ gs.cubics +
+ gs.periodicCubics) == 2))
+ {
+ Error("Select two entities that intersect each other (e.g. two lines "
+ "or two circles or a circle and a line).");
+ return;
+ }
+
+ hEntity ha = gs.entity[0],
+ hb = gs.entity[1];
+ Entity *ea = SK.GetEntity(ha),
+ *eb = SK.GetEntity(hb);
+
+ // Compute the possibly-rational Bezier curves for each of these entities
+ SBezierList sbla, sblb;
+ sbla = {};
+ sblb = {};
+ ea->GenerateBezierCurves(&sbla);
+ eb->GenerateBezierCurves(&sblb);
+ // and then compute the points where they intersect, based on those curves.
+ SPointList inters = {};
+ sbla.AllIntersectionsWith(&sblb, &inters);
+
+ if(inters.l.n > 0) {
+ Vector pi = Vector::From(0, 0, 0);
+ // If there's multiple points, then take the one closest to the
+ // mouse pointer.
+ double dmin = VERY_POSITIVE;
+ SPoint *sp;
+ for(sp = inters.l.First(); sp; sp = inters.l.NextAfter(sp)) {
+ double d = ProjectPoint(sp->p).DistanceTo(currentMousePosition);
+ if(d < dmin) {
+ dmin = d;
+ pi = sp->p;
+ }
+ }
+
+ SS.UndoRemember();
+ hEntity hia = SplitEntity(ha, pi),
+ hib = SplitEntity(hb, pi);
+ // SplitEntity adds the coincident constraints to join the split halves
+ // of each original entity; and then we add the constraint to join
+ // the two entities together at the split point.
+ if(hia.v && hib.v) {
+ Constraint::ConstrainCoincident(hia, hib);
+ }
+ } else {
+ Error("Can't split; no intersection found.");
+ }
+
+ // All done, clean up and regenerate.
+ inters.Clear();
+ sbla.Clear();
+ sblb.Clear();
+ ClearSelection();
+ SS.ScheduleGenerateAll();
+}
+
--- /dev/null
+//-----------------------------------------------------------------------------
+// Anything relating to mouse, keyboard, or 6-DOF mouse input.
+//
+// Copyright 2008-2013 Jonathan Westhues.
+//-----------------------------------------------------------------------------
+#include "solvespace.h"
+
+void GraphicsWindow::UpdateDraggedPoint(hEntity hp, double mx, double my) {
+ Entity *p = SK.GetEntity(hp);
+ Vector pos = p->PointGetNum();
+ UpdateDraggedNum(&pos, mx, my);
+ p->PointForceTo(pos);
+}
+
+void GraphicsWindow::UpdateDraggedNum(Vector *pos, double mx, double my) {
+ *pos = pos->Plus(projRight.ScaledBy((mx - orig.mouse.x)/scale));
+ *pos = pos->Plus(projUp.ScaledBy((my - orig.mouse.y)/scale));
+}
+
+void GraphicsWindow::AddPointToDraggedList(hEntity hp) {
+ Entity *p = SK.GetEntity(hp);
+ // If an entity and its points are both selected, then its points could
+ // end up in the list twice. This would be bad, because it would move
+ // twice as far as the mouse pointer...
+ List<hEntity> *lhe = &(pending.points);
+ for(hEntity *hee = lhe->First(); hee; hee = lhe->NextAfter(hee)) {
+ if(hee->v == hp.v) {
+ // Exact same point.
+ return;
+ }
+ Entity *pe = SK.GetEntity(*hee);
+ if(pe->type == p->type &&
+ pe->type != Entity::POINT_IN_2D &&
+ pe->type != Entity::POINT_IN_3D &&
+ pe->group.v == p->group.v)
+ {
+ // Transform-type point, from the same group. So it handles the
+ // same unknowns.
+ return;
+ }
+ }
+ pending.points.Add(&hp);
+}
+
+void GraphicsWindow::StartDraggingByEntity(hEntity he) {
+ Entity *e = SK.GetEntity(he);
+ if(e->IsPoint()) {
+ AddPointToDraggedList(e->h);
+ } else if(e->type == Entity::LINE_SEGMENT ||
+ e->type == Entity::ARC_OF_CIRCLE ||
+ e->type == Entity::CUBIC ||
+ e->type == Entity::CUBIC_PERIODIC ||
+ e->type == Entity::CIRCLE ||
+ e->type == Entity::TTF_TEXT)
+ {
+ int pts;
+ EntReqTable::GetEntityInfo(e->type, e->extraPoints,
+ NULL, &pts, NULL, NULL);
+ for(int i = 0; i < pts; i++) {
+ AddPointToDraggedList(e->point[i]);
+ }
+ }
+}
+
+void GraphicsWindow::StartDraggingBySelection(void) {
+ List<Selection> *ls = &(selection);
+ for(Selection *s = ls->First(); s; s = ls->NextAfter(s)) {
+ if(!s->entity.v) continue;
+
+ StartDraggingByEntity(s->entity);
+ }
+ // The user might select a point, and then click it again to start
+ // dragging; but the point just got unselected by that click. So drag
+ // the hovered item too, and they'll always have it.
+ if(hover.entity.v) StartDraggingByEntity(hover.entity);
+}
+
+void GraphicsWindow::MouseMoved(double x, double y, bool leftDown,
+ bool middleDown, bool rightDown, bool shiftDown, bool ctrlDown)
+{
+ if(GraphicsEditControlIsVisible()) return;
+ if(context.active) return;
+
+ SS.extraLine.draw = false;
+
+ if(!orig.mouseDown) {
+ // If someone drags the mouse into our window with the left button
+ // already depressed, then we don't have our starting point; so
+ // don't try.
+ leftDown = false;
+ }
+
+ if(rightDown) {
+ middleDown = true;
+ shiftDown = !shiftDown;
+ }
+
+ if(SS.showToolbar) {
+ if(ToolbarMouseMoved((int)x, (int)y)) {
+ hover.Clear();
+ return;
+ }
+ }
+
+ if(!leftDown && (pending.operation == DRAGGING_POINTS ||
+ pending.operation == DRAGGING_MARQUEE))
+ {
+ ClearPending();
+ InvalidateGraphics();
+ }
+
+ Point2d mp = Point2d::From(x, y);
+ currentMousePosition = mp;
+
+ if(rightDown && orig.mouse.DistanceTo(mp) < 5 && !orig.startedMoving) {
+ // Avoid accidentally panning (or rotating if shift is down) if the
+ // user wants a context menu.
+ return;
+ }
+ orig.startedMoving = true;
+
+ // If the middle button is down, then mouse movement is used to pan and
+ // rotate our view. This wins over everything else.
+ if(middleDown) {
+ hover.Clear();
+
+ double dx = (x - orig.mouse.x) / scale;
+ double dy = (y - orig.mouse.y) / scale;
+
+ if(!(shiftDown || ctrlDown)) {
+ double s = 0.3*(PI/180)*scale; // degrees per pixel
+ projRight = orig.projRight.RotatedAbout(orig.projUp, -s*dx);
+ projUp = orig.projUp.RotatedAbout(orig.projRight, s*dy);
+
+ NormalizeProjectionVectors();
+ } else if(ctrlDown) {
+ double theta = atan2(orig.mouse.y, orig.mouse.x);
+ theta -= atan2(y, x);
+ SS.extraLine.draw = true;
+ SS.extraLine.ptA = UnProjectPoint(Point2d::From(0, 0));
+ SS.extraLine.ptB = UnProjectPoint(mp);
+
+ Vector normal = orig.projRight.Cross(orig.projUp);
+ projRight = orig.projRight.RotatedAbout(normal, theta);
+ projUp = orig.projUp.RotatedAbout(normal, theta);
+
+ NormalizeProjectionVectors();
+ } else {
+ offset.x = orig.offset.x + dx*projRight.x + dy*projUp.x;
+ offset.y = orig.offset.y + dx*projRight.y + dy*projUp.y;
+ offset.z = orig.offset.z + dx*projRight.z + dy*projUp.z;
+ }
+
+ orig.projRight = projRight;
+ orig.projUp = projUp;
+ orig.offset = offset;
+ orig.mouse.x = x;
+ orig.mouse.y = y;
+
+ if(SS.TW.shown.screen == TextWindow::SCREEN_EDIT_VIEW) {
+ if(havePainted) {
+ SS.ScheduleShowTW();
+ }
+ }
+ InvalidateGraphics();
+ havePainted = false;
+ return;
+ }
+
+ if(pending.operation == 0) {
+ double dm = orig.mouse.DistanceTo(mp);
+ // If we're currently not doing anything, then see if we should
+ // start dragging something.
+ if(leftDown && dm > 3) {
+ Entity *e = NULL;
+ if(hover.entity.v) e = SK.GetEntity(hover.entity);
+ if(e && e->type != Entity::WORKPLANE) {
+ Entity *e = SK.GetEntity(hover.entity);
+ if(e->type == Entity::CIRCLE && selection.n <= 1) {
+ // Drag the radius.
+ ClearSelection();
+ pending.circle = hover.entity;
+ pending.operation = DRAGGING_RADIUS;
+ } else if(e->IsNormal()) {
+ ClearSelection();
+ pending.normal = hover.entity;
+ pending.operation = DRAGGING_NORMAL;
+ } else {
+ if(!hoverWasSelectedOnMousedown) {
+ // The user clicked an unselected entity, which
+ // means they're dragging just the hovered thing,
+ // not the full selection. So clear all the selection
+ // except that entity.
+ ClearSelection();
+ MakeSelected(e->h);
+ }
+ StartDraggingBySelection();
+ if(!hoverWasSelectedOnMousedown) {
+ // And then clear the selection again, since they
+ // probably didn't want that selected if they just
+ // were dragging it.
+ ClearSelection();
+ }
+ hover.Clear();
+ pending.operation = DRAGGING_POINTS;
+ }
+ } else if(hover.constraint.v &&
+ SK.GetConstraint(hover.constraint)->HasLabel())
+ {
+ ClearSelection();
+ pending.constraint = hover.constraint;
+ pending.operation = DRAGGING_CONSTRAINT;
+ }
+ if(pending.operation != 0) {
+ // We just started a drag, so remember for the undo before
+ // the drag changes anything.
+ SS.UndoRemember();
+ } else {
+ if(!hover.constraint.v) {
+ // That's just marquee selection, which should not cause
+ // an undo remember.
+ if(dm > 10) {
+ if(hover.entity.v) {
+ // Avoid accidentally selecting workplanes when
+ // starting drags.
+ MakeUnselected(hover.entity, false);
+ hover.Clear();
+ }
+ pending.operation = DRAGGING_MARQUEE;
+ orig.marqueePoint =
+ UnProjectPoint(orig.mouseOnButtonDown);
+ }
+ }
+ }
+ } else {
+ // Otherwise, just hit test and give up; but don't hit test
+ // if the mouse is down, because then the user could hover
+ // a point, mouse down (thus selecting it), and drag, in an
+ // effort to drag the point, but instead hover a different
+ // entity before we move far enough to start the drag.
+ if(!leftDown) {
+ // Hit testing can potentially take a lot of time.
+ // If we haven't painted since last time we highlighted
+ // something, don't hit test again, since this just causes
+ // a lag.
+ if(!havePainted) return;
+ HitTestMakeSelection(mp);
+ }
+ }
+ return;
+ }
+
+ // If the user has started an operation from the menu, but not
+ // completed it, then just do the selection.
+ if(pending.operation < FIRST_PENDING) {
+ HitTestMakeSelection(mp);
+ return;
+ }
+
+ // We're currently dragging something; so do that. But if we haven't
+ // painted since the last time we solved, do nothing, because there's
+ // no sense solving a frame and not displaying it.
+ if(!havePainted) {
+ if(pending.operation == DRAGGING_POINTS && ctrlDown) {
+ SS.extraLine.ptA = UnProjectPoint(orig.mouseOnButtonDown);
+ SS.extraLine.ptB = UnProjectPoint(mp);
+ SS.extraLine.draw = true;
+ }
+ return;
+ }
+
+ havePainted = false;
+ switch(pending.operation) {
+ case DRAGGING_CONSTRAINT: {
+ Constraint *c = SK.constraint.FindById(pending.constraint);
+ UpdateDraggedNum(&(c->disp.offset), x, y);
+ orig.mouse = mp;
+ InvalidateGraphics();
+ break;
+ }
+
+ case DRAGGING_NEW_LINE_POINT:
+ if(!ctrlDown) {
+ SS.GW.pending.suggestion =
+ SS.GW.SuggestLineConstraint(SS.GW.pending.request);
+ } else {
+ SS.GW.pending.suggestion = SUGGESTED_NONE;
+ }
+ case DRAGGING_NEW_POINT:
+ UpdateDraggedPoint(pending.point, x, y);
+ HitTestMakeSelection(mp);
+ SS.MarkGroupDirtyByEntity(pending.point);
+ orig.mouse = mp;
+ InvalidateGraphics();
+ break;
+
+ case DRAGGING_POINTS:
+ if(shiftDown || ctrlDown) {
+ // Edit the rotation associated with a POINT_N_ROT_TRANS,
+ // either within (ctrlDown) or out of (shiftDown) the plane
+ // of the screen. So first get the rotation to apply, in qt.
+ Quaternion qt;
+ if(ctrlDown) {
+ double d = mp.DistanceTo(orig.mouseOnButtonDown);
+ if(d < 25) {
+ // Don't start dragging the position about the normal
+ // until we're a little ways out, to get a reasonable
+ // reference pos
+ orig.mouse = mp;
+ break;
+ }
+ double theta = atan2(orig.mouse.y-orig.mouseOnButtonDown.y,
+ orig.mouse.x-orig.mouseOnButtonDown.x);
+ theta -= atan2(y-orig.mouseOnButtonDown.y,
+ x-orig.mouseOnButtonDown.x);
+
+ Vector gn = projRight.Cross(projUp);
+ qt = Quaternion::From(gn, -theta);
+
+ SS.extraLine.draw = true;
+ SS.extraLine.ptA = UnProjectPoint(orig.mouseOnButtonDown);
+ SS.extraLine.ptB = UnProjectPoint(mp);
+ } else {
+ double dx = -(x - orig.mouse.x);
+ double dy = -(y - orig.mouse.y);
+ double s = 0.3*(PI/180); // degrees per pixel
+ qt = Quaternion::From(projUp, -s*dx).Times(
+ Quaternion::From(projRight, s*dy));
+ }
+ orig.mouse = mp;
+
+ // Now apply this rotation to the points being dragged.
+ List<hEntity> *lhe = &(pending.points);
+ for(hEntity *he = lhe->First(); he; he = lhe->NextAfter(he)) {
+ Entity *e = SK.GetEntity(*he);
+ if(e->type != Entity::POINT_N_ROT_TRANS) {
+ if(ctrlDown) {
+ Vector p = e->PointGetNum();
+ p = p.Minus(SS.extraLine.ptA);
+ p = qt.Rotate(p);
+ p = p.Plus(SS.extraLine.ptA);
+ e->PointForceTo(p);
+ SS.MarkGroupDirtyByEntity(e->h);
+ }
+ continue;
+ }
+
+ Quaternion q = e->PointGetQuaternion();
+ Vector p = e->PointGetNum();
+ q = qt.Times(q);
+ e->PointForceQuaternionTo(q);
+ // Let's rotate about the selected point; so fix up the
+ // translation so that that point didn't move.
+ e->PointForceTo(p);
+ SS.MarkGroupDirtyByEntity(e->h);
+ }
+ } else {
+ List<hEntity> *lhe = &(pending.points);
+ for(hEntity *he = lhe->First(); he; he = lhe->NextAfter(he)) {
+ UpdateDraggedPoint(*he, x, y);
+ SS.MarkGroupDirtyByEntity(*he);
+ }
+ orig.mouse = mp;
+ }
+ break;
+
+ case DRAGGING_NEW_CUBIC_POINT: {
+ UpdateDraggedPoint(pending.point, x, y);
+ HitTestMakeSelection(mp);
+
+ hRequest hr = pending.point.request();
+ if(pending.point.v == hr.entity(4).v) {
+ // The very first segment; dragging final point drags both
+ // tangent points.
+ Vector p0 = SK.GetEntity(hr.entity(1))->PointGetNum(),
+ p3 = SK.GetEntity(hr.entity(4))->PointGetNum(),
+ p1 = p0.ScaledBy(2.0/3).Plus(p3.ScaledBy(1.0/3)),
+ p2 = p0.ScaledBy(1.0/3).Plus(p3.ScaledBy(2.0/3));
+ SK.GetEntity(hr.entity(1+1))->PointForceTo(p1);
+ SK.GetEntity(hr.entity(1+2))->PointForceTo(p2);
+ } else {
+ // A subsequent segment; dragging point drags only final
+ // tangent point.
+ int i = SK.GetEntity(hr.entity(0))->extraPoints;
+ Vector pn = SK.GetEntity(hr.entity(4+i))->PointGetNum(),
+ pnm2 = SK.GetEntity(hr.entity(2+i))->PointGetNum(),
+ pnm1 = (pn.Plus(pnm2)).ScaledBy(0.5);
+ SK.GetEntity(hr.entity(3+i))->PointForceTo(pnm1);
+ }
+
+ orig.mouse = mp;
+ SS.MarkGroupDirtyByEntity(pending.point);
+ break;
+ }
+ case DRAGGING_NEW_ARC_POINT: {
+ UpdateDraggedPoint(pending.point, x, y);
+ HitTestMakeSelection(mp);
+
+ hRequest hr = pending.point.request();
+ Vector ona = SK.GetEntity(hr.entity(2))->PointGetNum();
+ Vector onb = SK.GetEntity(hr.entity(3))->PointGetNum();
+ Vector center = (ona.Plus(onb)).ScaledBy(0.5);
+
+ SK.GetEntity(hr.entity(1))->PointForceTo(center);
+
+ orig.mouse = mp;
+ SS.MarkGroupDirtyByEntity(pending.point);
+ break;
+ }
+ case DRAGGING_NEW_RADIUS:
+ case DRAGGING_RADIUS: {
+ Entity *circle = SK.GetEntity(pending.circle);
+ Vector center = SK.GetEntity(circle->point[0])->PointGetNum();
+ Point2d c2 = ProjectPoint(center);
+ double r = c2.DistanceTo(mp)/scale;
+ SK.GetEntity(circle->distance)->DistanceForceTo(r);
+
+ SS.MarkGroupDirtyByEntity(pending.circle);
+ break;
+ }
+
+ case DRAGGING_NORMAL: {
+ Entity *normal = SK.GetEntity(pending.normal);
+ Vector p = SK.GetEntity(normal->point[0])->PointGetNum();
+ Point2d p2 = ProjectPoint(p);
+
+ Quaternion q = normal->NormalGetNum();
+ Vector u = q.RotationU(), v = q.RotationV();
+
+ if(ctrlDown) {
+ double theta = atan2(orig.mouse.y-p2.y, orig.mouse.x-p2.x);
+ theta -= atan2(y-p2.y, x-p2.x);
+
+ Vector normal = projRight.Cross(projUp);
+ u = u.RotatedAbout(normal, -theta);
+ v = v.RotatedAbout(normal, -theta);
+ } else {
+ double dx = -(x - orig.mouse.x);
+ double dy = -(y - orig.mouse.y);
+ double s = 0.3*(PI/180); // degrees per pixel
+ u = u.RotatedAbout(projUp, -s*dx);
+ u = u.RotatedAbout(projRight, s*dy);
+ v = v.RotatedAbout(projUp, -s*dx);
+ v = v.RotatedAbout(projRight, s*dy);
+ }
+ orig.mouse = mp;
+ normal->NormalForceTo(Quaternion::From(u, v));
+
+ SS.MarkGroupDirtyByEntity(pending.normal);
+ break;
+ }
+
+ case DRAGGING_MARQUEE:
+ orig.mouse = mp;
+ InvalidateGraphics();
+ break;
+
+ default: oops();
+ }
+
+ if(pending.operation != 0 &&
+ pending.operation != DRAGGING_CONSTRAINT &&
+ pending.operation != DRAGGING_MARQUEE)
+ {
+ SS.GenerateAll();
+
+ // Activate degraded mode, and regenerate display items without edges.
+ if(activeGroup.v != 0) {
+ bool showEdges = SS.GW.showEdges;
+ SS.GW.showEdges = false;
+ SK.GetGroup(activeGroup)->GenerateDisplayItems();
+ SS.GW.showEdges = showEdges;
+ isDegraded = true;
+ }
+ }
+}
+
+void GraphicsWindow::ClearPending(void) {
+ pending.points.Clear();
+ pending = {};
+ SS.ScheduleShowTW();
+
+ // If degraded mode was enabled, we need to regenerate again to get edges back.
+ if(isDegraded) {
+ isDegraded = false;
+ SK.GetGroup(activeGroup)->displayDirty = true;
+ }
+}
+
+void GraphicsWindow::MouseMiddleOrRightDown(double x, double y) {
+ if(GraphicsEditControlIsVisible()) return;
+
+ orig.offset = offset;
+ orig.projUp = projUp;
+ orig.projRight = projRight;
+ orig.mouse.x = x;
+ orig.mouse.y = y;
+ orig.startedMoving = false;
+}
+
+void GraphicsWindow::ContextMenuListStyles(void) {
+ CreateContextSubmenu();
+ Style *s;
+ bool empty = true;
+ for(s = SK.style.First(); s; s = SK.style.NextAfter(s)) {
+ if(s->h.v < Style::FIRST_CUSTOM) continue;
+
+ AddContextMenuItem(s->DescriptionString().c_str(), CMNU_FIRST_STYLE + s->h.v);
+ empty = false;
+ }
+
+ if(!empty) AddContextMenuItem(NULL, CONTEXT_SEPARATOR);
+
+ AddContextMenuItem("No Style", CMNU_NO_STYLE);
+ AddContextMenuItem("Newly Created Custom Style...", CMNU_NEW_CUSTOM_STYLE);
+}
+
+void GraphicsWindow::MouseRightUp(double x, double y) {
+ SS.extraLine.draw = false;
+ InvalidateGraphics();
+
+ // Don't show a context menu if the user is right-clicking the toolbar,
+ // or if they are finishing a pan.
+ if(ToolbarMouseMoved((int)x, (int)y)) return;
+ if(orig.startedMoving) return;
+
+ if(context.active) return;
+
+ if(pending.operation == DRAGGING_NEW_LINE_POINT) {
+ if(SS.GW.pending.suggestion != SUGGESTED_NONE) {
+ Constraint::Constrain(SS.GW.pending.suggestion,
+ Entity::NO_ENTITY, Entity::NO_ENTITY, pending.request.entity(0));
+ }
+ }
+
+ if(pending.operation == DRAGGING_NEW_LINE_POINT ||
+ pending.operation == DRAGGING_NEW_CUBIC_POINT)
+ {
+ // Special case; use a right click to stop drawing lines, since
+ // a left click would draw another one. This is quicker and more
+ // intuitive than hitting escape. Likewise for new cubic segments.
+ ClearPending();
+ return;
+ }
+
+ // The current mouse location
+ Vector v = offset.ScaledBy(-1);
+ v = v.Plus(projRight.ScaledBy(x/scale));
+ v = v.Plus(projUp.ScaledBy(y/scale));
+
+ context.active = true;
+
+ if(!hover.IsEmpty()) {
+ MakeSelected(&hover);
+ SS.ScheduleShowTW();
+ }
+ GroupSelection();
+
+ bool itemsSelected = (gs.n > 0 || gs.constraints > 0);
+ int addAfterPoint = -1;
+
+ if(itemsSelected) {
+ if(gs.stylables > 0) {
+ ContextMenuListStyles();
+ AddContextMenuItem("Assign to Style", CONTEXT_SUBMENU);
+ }
+ if(gs.n + gs.constraints == 1) {
+ AddContextMenuItem("Group Info", CMNU_GROUP_INFO);
+ }
+ if(gs.n + gs.constraints == 1 && gs.stylables == 1) {
+ AddContextMenuItem("Style Info", CMNU_STYLE_INFO);
+ }
+ if(gs.withEndpoints > 0) {
+ AddContextMenuItem("Select Edge Chain", CMNU_SELECT_CHAIN);
+ }
+ if(gs.constraints == 1 && gs.n == 0) {
+ Constraint *c = SK.GetConstraint(gs.constraint[0]);
+ if(c->HasLabel() && c->type != Constraint::COMMENT) {
+ AddContextMenuItem("Toggle Reference Dimension",
+ CMNU_REFERENCE_DIM);
+ }
+ if(c->type == Constraint::ANGLE ||
+ c->type == Constraint::EQUAL_ANGLE)
+ {
+ AddContextMenuItem("Other Supplementary Angle",
+ CMNU_OTHER_ANGLE);
+ }
+ }
+ if(gs.constraintLabels > 0 || gs.points > 0) {
+ AddContextMenuItem("Snap to Grid", CMNU_SNAP_TO_GRID);
+ }
+
+
+ if(gs.points == 1 && gs.point[0].isFromRequest()) {
+ Request *r = SK.GetRequest(gs.point[0].request());
+ int index = r->IndexOfPoint(gs.point[0]);
+ if((r->type == Request::CUBIC && (index > 1 && index < r->extraPoints + 2)) ||
+ r->type == Request::CUBIC_PERIODIC) {
+ AddContextMenuItem("Remove Spline Point", CMNU_REMOVE_SPLINE_PT);
+ }
+ }
+ if(gs.entities == 1 && gs.entity[0].isFromRequest()) {
+ Request *r = SK.GetRequest(gs.entity[0].request());
+ if(r->type == Request::CUBIC || r->type == Request::CUBIC_PERIODIC) {
+ Entity *e = SK.GetEntity(gs.entity[0]);
+ e->GetDistance(Point2d::From(x, y));
+ addAfterPoint = e->dogd.data;
+ if(addAfterPoint == -1) oops();
+ // Skip derivative point.
+ if(r->type == Request::CUBIC) addAfterPoint++;
+ AddContextMenuItem("Add Spline Point", CMNU_ADD_SPLINE_PT);
+ }
+ }
+
+ if(gs.points == 1) {
+ Entity *p = SK.GetEntity(gs.point[0]);
+ Constraint *c;
+ IdList<Constraint,hConstraint> *lc = &(SK.constraint);
+ for(c = lc->First(); c; c = lc->NextAfter(c)) {
+ if(c->type != Constraint::POINTS_COINCIDENT) continue;
+ if(c->ptA.v == p->h.v || c->ptB.v == p->h.v) {
+ break;
+ }
+ }
+ if(c) {
+ AddContextMenuItem("Delete Point-Coincident Constraint",
+ CMNU_DEL_COINCIDENT);
+ }
+ }
+ AddContextMenuItem(NULL, CONTEXT_SEPARATOR);
+ if(LockedInWorkplane()) {
+ AddContextMenuItem("Cut", CMNU_CUT_SEL);
+ AddContextMenuItem("Copy", CMNU_COPY_SEL);
+ }
+ }
+
+ if((SS.clipboard.r.n > 0 || SS.clipboard.c.n > 0) && LockedInWorkplane()) {
+ AddContextMenuItem("Paste", CMNU_PASTE);
+ AddContextMenuItem("Paste Transformed...", CMNU_PASTE_XFRM);
+ }
+
+ if(itemsSelected) {
+ AddContextMenuItem("Delete", CMNU_DELETE_SEL);
+ AddContextMenuItem(NULL, CONTEXT_SEPARATOR);
+ AddContextMenuItem("Unselect All", CMNU_UNSELECT_ALL);
+ }
+ // If only one item is selected, then it must be the one that we just
+ // selected from the hovered item; in which case unselect all and hovered
+ // are equivalent.
+ if(!hover.IsEmpty() && selection.n > 1) {
+ AddContextMenuItem("Unselect Hovered", CMNU_UNSELECT_HOVERED);
+ }
+
+ int ret = ShowContextMenu();
+ switch(ret) {
+ case CMNU_UNSELECT_ALL:
+ MenuEdit(MNU_UNSELECT_ALL);
+ break;
+
+ case CMNU_UNSELECT_HOVERED:
+ if(!hover.IsEmpty()) {
+ MakeUnselected(&hover, true);
+ }
+ break;
+
+ case CMNU_SELECT_CHAIN:
+ MenuEdit(MNU_SELECT_CHAIN);
+ break;
+
+ case CMNU_CUT_SEL:
+ MenuClipboard(MNU_CUT);
+ break;
+
+ case CMNU_COPY_SEL:
+ MenuClipboard(MNU_COPY);
+ break;
+
+ case CMNU_PASTE:
+ MenuClipboard(MNU_PASTE);
+ break;
+
+ case CMNU_PASTE_XFRM:
+ MenuClipboard(MNU_PASTE_TRANSFORM);
+ break;
+
+ case CMNU_DELETE_SEL:
+ MenuClipboard(MNU_DELETE);
+ break;
+
+ case CMNU_REFERENCE_DIM:
+ Constraint::MenuConstrain(MNU_REFERENCE);
+ break;
+
+ case CMNU_OTHER_ANGLE:
+ Constraint::MenuConstrain(MNU_OTHER_ANGLE);
+ break;
+
+ case CMNU_DEL_COINCIDENT: {
+ SS.UndoRemember();
+ if(!gs.point[0].v) break;
+ Entity *p = SK.GetEntity(gs.point[0]);
+ if(!p->IsPoint()) break;
+
+ SK.constraint.ClearTags();
+ Constraint *c;
+ for(c = SK.constraint.First(); c; c = SK.constraint.NextAfter(c)) {
+ if(c->type != Constraint::POINTS_COINCIDENT) continue;
+ if(c->ptA.v == p->h.v || c->ptB.v == p->h.v) {
+ c->tag = 1;
+ }
+ }
+ SK.constraint.RemoveTagged();
+ ClearSelection();
+ break;
+ }
+
+ case CMNU_SNAP_TO_GRID:
+ MenuEdit(MNU_SNAP_TO_GRID);
+ break;
+
+ case CMNU_REMOVE_SPLINE_PT: {
+ hRequest hr = gs.point[0].request();
+ Request *r = SK.GetRequest(hr);
+
+ int index = r->IndexOfPoint(gs.point[0]);
+ if(r->extraPoints == 0) oops();
+
+ SS.UndoRemember();
+ Entity *e = SK.GetEntity(r->h.entity(0));
+
+ // First, fix point-coincident constraints involving this point.
+ // Then, remove all other constraints, since they would otherwise
+ // jump to an adjacent one and mess up the bezier after generation.
+ FixConstraintsForPointBeingDeleted(e->point[index]);
+ RemoveConstraintsForPointBeingDeleted(e->point[index]);
+
+ for(int i = index; i < MAX_POINTS_IN_ENTITY - 1; i++) {
+ if(e->point[i + 1].v == 0) break;
+ Entity *p0 = SK.GetEntity(e->point[i]);
+ Entity *p1 = SK.GetEntity(e->point[i + 1]);
+ ReplacePointInConstraints(p1->h, p0->h);
+ p0->PointForceTo(p1->PointGetNum());
+ }
+ r->extraPoints--;
+ SS.MarkGroupDirtyByEntity(gs.point[0]);
+ SS.ScheduleGenerateAll();
+ ClearSelection();
+ break;
+ }
+
+ case CMNU_ADD_SPLINE_PT: {
+ hRequest hr = gs.entity[0].request();
+ Request *r = SK.GetRequest(hr);
+
+ int pointCount = r->extraPoints + ((r->type == Request::CUBIC_PERIODIC) ? 3 : 4);
+ if(pointCount < MAX_POINTS_IN_ENTITY) {
+ SS.UndoRemember();
+ r->extraPoints++;
+ SS.MarkGroupDirtyByEntity(gs.entity[0]);
+ SS.GenerateAll(SolveSpaceUI::GENERATE_REGEN);
+
+ Entity *e = SK.GetEntity(r->h.entity(0));
+ for(int i = MAX_POINTS_IN_ENTITY; i > addAfterPoint + 1; i--) {
+ Entity *p0 = SK.entity.FindByIdNoOops(e->point[i]);
+ if(p0 == NULL) continue;
+ Entity *p1 = SK.GetEntity(e->point[i - 1]);
+ ReplacePointInConstraints(p1->h, p0->h);
+ p0->PointForceTo(p1->PointGetNum());
+ }
+ Entity *p = SK.GetEntity(e->point[addAfterPoint + 1]);
+ p->PointForceTo(v);
+ SS.MarkGroupDirtyByEntity(gs.entity[0]);
+ SS.ScheduleGenerateAll();
+ ClearSelection();
+ } else {
+ Error("Cannot add spline point: maximum number of points reached.");
+ }
+ break;
+ }
+
+ case CMNU_GROUP_INFO: {
+ hGroup hg;
+ if(gs.entities == 1) {
+ hg = SK.GetEntity(gs.entity[0])->group;
+ } else if(gs.points == 1) {
+ hg = SK.GetEntity(gs.point[0])->group;
+ } else if(gs.constraints == 1) {
+ hg = SK.GetConstraint(gs.constraint[0])->group;
+ } else {
+ break;
+ }
+ ClearSelection();
+
+ SS.TW.GoToScreen(TextWindow::SCREEN_GROUP_INFO);
+ SS.TW.shown.group = hg;
+ SS.ScheduleShowTW();
+ ForceTextWindowShown();
+ break;
+ }
+
+ case CMNU_STYLE_INFO: {
+ hStyle hs;
+ if(gs.entities == 1) {
+ hs = Style::ForEntity(gs.entity[0]);
+ } else if(gs.points == 1) {
+ hs = Style::ForEntity(gs.point[0]);
+ } else if(gs.constraints == 1) {
+ hs = SK.GetConstraint(gs.constraint[0])->GetStyle();
+ } else {
+ break;
+ }
+ ClearSelection();
+
+ SS.TW.GoToScreen(TextWindow::SCREEN_STYLE_INFO);
+ SS.TW.shown.style = hs;
+ SS.ScheduleShowTW();
+ ForceTextWindowShown();
+ break;
+ }
+
+ case CMNU_NEW_CUSTOM_STYLE: {
+ uint32_t v = Style::CreateCustomStyle();
+ Style::AssignSelectionToStyle(v);
+ ForceTextWindowShown();
+ break;
+ }
+
+ case CMNU_NO_STYLE:
+ Style::AssignSelectionToStyle(0);
+ break;
+
+ default:
+ if(ret >= CMNU_FIRST_STYLE) {
+ Style::AssignSelectionToStyle(ret - CMNU_FIRST_STYLE);
+ } else {
+ // otherwise it was cancelled, so do nothing
+ contextMenuCancelTime = GetMilliseconds();
+ }
+ break;
+ }
+
+ context.active = false;
+ SS.ScheduleShowTW();
+}
+
+hRequest GraphicsWindow::AddRequest(int type) {
+ return AddRequest(type, true);
+}
+hRequest GraphicsWindow::AddRequest(int type, bool rememberForUndo) {
+ if(rememberForUndo) SS.UndoRemember();
+
+ Request r = {};
+ r.group = activeGroup;
+ Group *g = SK.GetGroup(activeGroup);
+ if(g->type == Group::DRAWING_3D || g->type == Group::DRAWING_WORKPLANE) {
+ r.construction = false;
+ } else {
+ r.construction = true;
+ }
+ r.workplane = ActiveWorkplane();
+ r.type = type;
+ SK.request.AddAndAssignId(&r);
+
+ // We must regenerate the parameters, so that the code that tries to
+ // place this request's entities where the mouse is can do so. But
+ // we mustn't try to solve until reasonable values have been supplied
+ // for these new parameters, or else we'll get a numerical blowup.
+ SS.GenerateAll(SolveSpaceUI::GENERATE_REGEN);
+ SS.MarkGroupDirty(r.group);
+ return r.h;
+}
+
+bool GraphicsWindow::ConstrainPointByHovered(hEntity pt) {
+ if(!hover.entity.v) return false;
+
+ Entity *e = SK.GetEntity(hover.entity);
+ if(e->IsPoint()) {
+ Constraint::ConstrainCoincident(e->h, pt);
+ return true;
+ }
+ if(e->IsCircle()) {
+ Constraint::Constrain(Constraint::PT_ON_CIRCLE,
+ pt, Entity::NO_ENTITY, e->h);
+ return true;
+ }
+ if(e->type == Entity::LINE_SEGMENT) {
+ Constraint::Constrain(Constraint::PT_ON_LINE,
+ pt, Entity::NO_ENTITY, e->h);
+ return true;
+ }
+
+ return false;
+}
+
+void GraphicsWindow::MouseLeftDown(double mx, double my) {
+ orig.mouseDown = true;
+
+ if(GraphicsEditControlIsVisible()) {
+ orig.mouse = Point2d::From(mx, my);
+ orig.mouseOnButtonDown = orig.mouse;
+ HideGraphicsEditControl();
+ return;
+ }
+ SS.TW.HideEditControl();
+
+ if(SS.showToolbar) {
+ if(ToolbarMouseDown((int)mx, (int)my)) return;
+ }
+
+ // This will be clobbered by MouseMoved below.
+ SuggestedConstraint constraintSuggestion = SS.GW.pending.suggestion;
+
+ // Make sure the hover is up to date.
+ MouseMoved(mx, my, false, false, false, false, false);
+ orig.mouse.x = mx;
+ orig.mouse.y = my;
+ orig.mouseOnButtonDown = orig.mouse;
+
+ // The current mouse location
+ Vector v = offset.ScaledBy(-1);
+ v = v.Plus(projRight.ScaledBy(mx/scale));
+ v = v.Plus(projUp.ScaledBy(my/scale));
+
+ hRequest hr = {};
+ hConstraint hc = {};
+ switch(pending.operation) {
+ case MNU_DATUM_POINT:
+ hr = AddRequest(Request::DATUM_POINT);
+ SK.GetEntity(hr.entity(0))->PointForceTo(v);
+ ConstrainPointByHovered(hr.entity(0));
+
+ ClearSuper();
+ break;
+
+ case MNU_LINE_SEGMENT:
+ case MNU_CONSTR_SEGMENT:
+ hr = AddRequest(Request::LINE_SEGMENT);
+ SK.GetRequest(hr)->construction = (pending.operation == MNU_CONSTR_SEGMENT);
+ SK.GetEntity(hr.entity(1))->PointForceTo(v);
+ ConstrainPointByHovered(hr.entity(1));
+
+ ClearSuper();
+
+ pending.operation = DRAGGING_NEW_LINE_POINT;
+ pending.request = hr;
+ pending.point = hr.entity(2);
+ pending.description = "click next point of line, or press Esc";
+ SK.GetEntity(pending.point)->PointForceTo(v);
+ break;
+
+ case MNU_RECTANGLE: {
+ if(!SS.GW.LockedInWorkplane()) {
+ Error("Can't draw rectangle in 3d; select a workplane first.");
+ ClearSuper();
+ break;
+ }
+ hRequest lns[4];
+ int i;
+ SS.UndoRemember();
+ for(i = 0; i < 4; i++) {
+ lns[i] = AddRequest(Request::LINE_SEGMENT, false);
+ }
+ for(i = 0; i < 4; i++) {
+ Constraint::ConstrainCoincident(
+ lns[i].entity(1), lns[(i+1)%4].entity(2));
+ SK.GetEntity(lns[i].entity(1))->PointForceTo(v);
+ SK.GetEntity(lns[i].entity(2))->PointForceTo(v);
+ }
+ for(i = 0; i < 4; i++) {
+ Constraint::Constrain(
+ (i % 2) ? Constraint::HORIZONTAL : Constraint::VERTICAL,
+ Entity::NO_ENTITY, Entity::NO_ENTITY,
+ lns[i].entity(0));
+ }
+ ConstrainPointByHovered(lns[2].entity(1));
+
+ pending.operation = DRAGGING_NEW_POINT;
+ pending.point = lns[1].entity(2);
+ pending.description = "click to place other corner of rectangle";
+ hr = lns[0];
+ break;
+ }
+ case MNU_CIRCLE:
+ hr = AddRequest(Request::CIRCLE);
+ // Centered where we clicked
+ SK.GetEntity(hr.entity(1))->PointForceTo(v);
+ // Normal to the screen
+ SK.GetEntity(hr.entity(32))->NormalForceTo(
+ Quaternion::From(SS.GW.projRight, SS.GW.projUp));
+ // Initial radius zero
+ SK.GetEntity(hr.entity(64))->DistanceForceTo(0);
+
+ ConstrainPointByHovered(hr.entity(1));
+
+ ClearSuper();
+
+ pending.operation = DRAGGING_NEW_RADIUS;
+ pending.circle = hr.entity(0);
+ pending.description = "click to set radius";
+ break;
+
+ case MNU_ARC: {
+ if(!SS.GW.LockedInWorkplane()) {
+ Error("Can't draw arc in 3d; select a workplane first.");
+ ClearPending();
+ break;
+ }
+ hr = AddRequest(Request::ARC_OF_CIRCLE);
+ // This fudge factor stops us from immediately failing to solve
+ // because of the arc's implicit (equal radius) tangent.
+ Vector adj = SS.GW.projRight.WithMagnitude(2/SS.GW.scale);
+ SK.GetEntity(hr.entity(1))->PointForceTo(v.Minus(adj));
+ SK.GetEntity(hr.entity(2))->PointForceTo(v);
+ SK.GetEntity(hr.entity(3))->PointForceTo(v);
+ ConstrainPointByHovered(hr.entity(2));
+
+ ClearSuper();
+
+ pending.operation = DRAGGING_NEW_ARC_POINT;
+ pending.point = hr.entity(3);
+ pending.description = "click to place point";
+ break;
+ }
+ case MNU_CUBIC:
+ hr = AddRequest(Request::CUBIC);
+ SK.GetEntity(hr.entity(1))->PointForceTo(v);
+ SK.GetEntity(hr.entity(2))->PointForceTo(v);
+ SK.GetEntity(hr.entity(3))->PointForceTo(v);
+ SK.GetEntity(hr.entity(4))->PointForceTo(v);
+ ConstrainPointByHovered(hr.entity(1));
+
+ ClearSuper();
+
+ pending.operation = DRAGGING_NEW_CUBIC_POINT;
+ pending.point = hr.entity(4);
+ pending.description = "click next point of cubic, or press Esc";
+ break;
+
+ case MNU_WORKPLANE:
+ if(LockedInWorkplane()) {
+ Error("Sketching in a workplane already; sketch in 3d before "
+ "creating new workplane.");
+ ClearSuper();
+ break;
+ }
+ hr = AddRequest(Request::WORKPLANE);
+ SK.GetEntity(hr.entity(1))->PointForceTo(v);
+ SK.GetEntity(hr.entity(32))->NormalForceTo(
+ Quaternion::From(SS.GW.projRight, SS.GW.projUp));
+ ConstrainPointByHovered(hr.entity(1));
+
+ ClearSuper();
+ break;
+
+ case MNU_TTF_TEXT: {
+ if(!SS.GW.LockedInWorkplane()) {
+ Error("Can't draw text in 3d; select a workplane first.");
+ ClearSuper();
+ break;
+ }
+ hr = AddRequest(Request::TTF_TEXT);
+ Request *r = SK.GetRequest(hr);
+ r->str = "Abc";
+ r->font = "arial.ttf";
+
+ SK.GetEntity(hr.entity(1))->PointForceTo(v);
+ SK.GetEntity(hr.entity(2))->PointForceTo(v);
+
+ pending.operation = DRAGGING_NEW_POINT;
+ pending.point = hr.entity(2);
+ pending.description = "click to place bottom left of text";
+ break;
+ }
+
+ case MNU_COMMENT: {
+ ClearSuper();
+ Constraint c = {};
+ c.group = SS.GW.activeGroup;
+ c.workplane = SS.GW.ActiveWorkplane();
+ c.type = Constraint::COMMENT;
+ c.disp.offset = v;
+ c.comment = "NEW COMMENT -- DOUBLE-CLICK TO EDIT";
+ hc = Constraint::AddConstraint(&c);
+ break;
+ }
+
+ case DRAGGING_RADIUS:
+ case DRAGGING_NEW_POINT:
+ // The MouseMoved event has already dragged it as desired.
+ ClearPending();
+ break;
+
+ case DRAGGING_NEW_ARC_POINT:
+ ConstrainPointByHovered(pending.point);
+ ClearPending();
+ break;
+
+ case DRAGGING_NEW_CUBIC_POINT: {
+ hRequest hr = pending.point.request();
+ Request *r = SK.GetRequest(hr);
+
+ if(hover.entity.v == hr.entity(1).v && r->extraPoints >= 2) {
+ // They want the endpoints coincident, which means a periodic
+ // spline instead.
+ r->type = Request::CUBIC_PERIODIC;
+ // Remove the off-curve control points, which are no longer
+ // needed here; so move [2,ep+1] down, skipping first pt.
+ int i;
+ for(i = 2; i <= r->extraPoints+1; i++) {
+ SK.GetEntity(hr.entity((i-1)+1))->PointForceTo(
+ SK.GetEntity(hr.entity(i+1))->PointGetNum());
+ }
+ // and move ep+3 down by two, skipping both
+ SK.GetEntity(hr.entity((r->extraPoints+1)+1))->PointForceTo(
+ SK.GetEntity(hr.entity((r->extraPoints+3)+1))->PointGetNum());
+ r->extraPoints -= 2;
+ // And we're done.
+ SS.MarkGroupDirty(r->group);
+ SS.ScheduleGenerateAll();
+ ClearPending();
+ break;
+ }
+
+ if(ConstrainPointByHovered(pending.point)) {
+ ClearPending();
+ break;
+ }
+
+ Entity e;
+ if(r->extraPoints >= (int)arraylen(e.point) - 4) {
+ ClearPending();
+ break;
+ }
+
+ (SK.GetRequest(hr)->extraPoints)++;
+ SS.GenerateAll(SolveSpaceUI::GENERATE_REGEN);
+
+ int ep = r->extraPoints;
+ Vector last = SK.GetEntity(hr.entity(3+ep))->PointGetNum();
+
+ SK.GetEntity(hr.entity(2+ep))->PointForceTo(last);
+ SK.GetEntity(hr.entity(3+ep))->PointForceTo(v);
+ SK.GetEntity(hr.entity(4+ep))->PointForceTo(v);
+ pending.point = hr.entity(4+ep);
+ break;
+ }
+
+ case DRAGGING_NEW_LINE_POINT: {
+ // Constrain the line segment horizontal or vertical if close enough
+ if(constraintSuggestion != SUGGESTED_NONE) {
+ Constraint::Constrain(constraintSuggestion,
+ Entity::NO_ENTITY, Entity::NO_ENTITY, pending.request.entity(0));
+ }
+
+ if(hover.entity.v) {
+ Entity *e = SK.GetEntity(hover.entity);
+ if(e->IsPoint()) {
+ hRequest hrl = pending.point.request();
+ Entity *sp = SK.GetEntity(hrl.entity(1));
+ if(( e->PointGetNum()).Equals(
+ (sp->PointGetNum())))
+ {
+ // If we constrained by the hovered point, then we
+ // would create a zero-length line segment. That's
+ // not good, so just stop drawing.
+ ClearPending();
+ break;
+ }
+ }
+ }
+
+ if(ConstrainPointByHovered(pending.point)) {
+ ClearPending();
+ break;
+ }
+
+ // Create a new line segment, so that we continue drawing.
+ hRequest hr = AddRequest(Request::LINE_SEGMENT);
+ SK.GetRequest(hr)->construction = SK.GetRequest(pending.request)->construction;
+ SK.GetEntity(hr.entity(1))->PointForceTo(v);
+ // Displace the second point of the new line segment slightly,
+ // to avoid creating zero-length edge warnings.
+ SK.GetEntity(hr.entity(2))->PointForceTo(
+ v.Plus(projRight.ScaledBy(0.5/scale)));
+
+ // Constrain the line segments to share an endpoint
+ Constraint::ConstrainCoincident(pending.point, hr.entity(1));
+
+ // And drag an endpoint of the new line segment
+ pending.operation = DRAGGING_NEW_LINE_POINT;
+ pending.request = hr;
+ pending.point = hr.entity(2);
+ pending.description = "click next point of line, or press Esc";
+
+ break;
+ }
+
+ case 0:
+ default:
+ ClearPending();
+ if(!hover.IsEmpty()) {
+ hoverWasSelectedOnMousedown = IsSelected(&hover);
+ MakeSelected(&hover);
+ }
+ break;
+ }
+
+ // Activate group with newly created request/constraint
+ Group *g = NULL;
+ if(hr.v != 0) {
+ Request *req = SK.GetRequest(hr);
+ g = SK.GetGroup(req->group);
+ }
+ if(hc.v != 0) {
+ Constraint *c = SK.GetConstraint(hc);
+ g = SK.GetGroup(c->group);
+ }
+ if(g != NULL) {
+ g->visible = true;
+ }
+
+ SS.ScheduleShowTW();
+ InvalidateGraphics();
+}
+
+void GraphicsWindow::MouseLeftUp(double mx, double my) {
+ orig.mouseDown = false;
+ hoverWasSelectedOnMousedown = false;
+
+ switch(pending.operation) {
+ case DRAGGING_POINTS:
+ SS.extraLine.draw = false;
+ // fall through
+ case DRAGGING_CONSTRAINT:
+ case DRAGGING_NORMAL:
+ case DRAGGING_RADIUS:
+ ClearPending();
+ InvalidateGraphics();
+ break;
+
+ case DRAGGING_MARQUEE:
+ SelectByMarquee();
+ ClearPending();
+ InvalidateGraphics();
+ break;
+
+ case 0:
+ // We need to clear the selection here, and not in the mouse down
+ // event, since a mouse down without anything hovered could also
+ // be the start of marquee selection. But don't do that on the
+ // left click to cancel a context menu. The time delay is an ugly
+ // hack.
+ if(hover.IsEmpty() &&
+ (contextMenuCancelTime == 0 ||
+ (GetMilliseconds() - contextMenuCancelTime) > 200))
+ {
+ ClearSelection();
+ }
+ break;
+
+ default:
+ break; // do nothing
+ }
+}
+
+void GraphicsWindow::MouseLeftDoubleClick(double mx, double my) {
+ if(GraphicsEditControlIsVisible()) return;
+ SS.TW.HideEditControl();
+
+ if(hover.constraint.v) {
+ constraintBeingEdited = hover.constraint;
+ ClearSuper();
+
+ Constraint *c = SK.GetConstraint(constraintBeingEdited);
+ if(!c->HasLabel()) {
+ // Not meaningful to edit a constraint without a dimension
+ return;
+ }
+ if(c->reference) {
+ // Not meaningful to edit a reference dimension
+ return;
+ }
+
+ Vector p3 = c->GetLabelPos();
+ Point2d p2 = ProjectPoint(p3);
+
+ std::string editValue;
+ int editMinWidthChar;
+ switch(c->type) {
+ case Constraint::COMMENT:
+ editValue = c->comment;
+ editMinWidthChar = 30;
+ break;
+
+ case Constraint::ANGLE:
+ case Constraint::LENGTH_RATIO:
+ editValue = ssprintf("%.3f", c->valA);
+ editMinWidthChar = 5;
+ break;
+
+ default: {
+ double v = fabs(c->valA);
+
+ // If displayed as radius, also edit as radius.
+ if(c->type == Constraint::DIAMETER && c->other)
+ v /= 2;
+
+ std::string def = SS.MmToString(v);
+ double eps = 1e-12;
+ if(fabs(SS.StringToMm(def) - v) < eps) {
+ // Show value with default number of digits after decimal,
+ // which is at least enough to represent it exactly.
+ editValue = def;
+ } else {
+ // Show value with as many digits after decimal as
+ // required to represent it exactly, up to 10.
+ v /= SS.MmPerUnit();
+ int i;
+ for(i = 0; i <= 10; i++) {
+ editValue = ssprintf("%.*f", i, v);
+ if(fabs(std::stod(editValue) - v) < eps) break;
+ }
+ }
+ editMinWidthChar = 5;
+ break;
+ }
+ }
+ hStyle hs = c->disp.style;
+ if(hs.v == 0) hs.v = Style::CONSTRAINT;
+ ShowGraphicsEditControl((int)p2.x, (int)p2.y,
+ ssglStrFontSize(Style::TextHeight(hs)) * scale,
+ editMinWidthChar, editValue);
+ }
+}
+
+void GraphicsWindow::EditControlDone(const char *s) {
+ HideGraphicsEditControl();
+ Constraint *c = SK.GetConstraint(constraintBeingEdited);
+
+ if(c->type == Constraint::COMMENT) {
+ SS.UndoRemember();
+ c->comment = s;
+ return;
+ }
+
+ Expr *e = Expr::From(s, true);
+ if(e) {
+ SS.UndoRemember();
+
+ switch(c->type) {
+ case Constraint::PROJ_PT_DISTANCE:
+ case Constraint::PT_LINE_DISTANCE:
+ case Constraint::PT_FACE_DISTANCE:
+ case Constraint::PT_PLANE_DISTANCE:
+ case Constraint::LENGTH_DIFFERENCE: {
+ // The sign is not displayed to the user, but this is a signed
+ // distance internally. To flip the sign, the user enters a
+ // negative distance.
+ bool wasNeg = (c->valA < 0);
+ if(wasNeg) {
+ c->valA = -SS.ExprToMm(e);
+ } else {
+ c->valA = SS.ExprToMm(e);
+ }
+ break;
+ }
+ case Constraint::ANGLE:
+ case Constraint::LENGTH_RATIO:
+ // These don't get the units conversion for distance, and
+ // they're always positive
+ c->valA = fabs(e->Eval());
+ break;
+
+ case Constraint::DIAMETER:
+ c->valA = fabs(SS.ExprToMm(e));
+
+ // If displayed and edited as radius, convert back
+ // to diameter
+ if(c->other)
+ c->valA *= 2;
+ break;
+
+ default:
+ // These are always positive, and they get the units conversion.
+ c->valA = fabs(SS.ExprToMm(e));
+ break;
+ }
+ SS.MarkGroupDirty(c->group);
+ SS.GenerateAll();
+ }
+}
+
+bool GraphicsWindow::KeyDown(int c) {
+ if(c == '\b') {
+ // Treat backspace identically to escape.
+ MenuEdit(MNU_UNSELECT_ALL);
+ return true;
+ }
+
+ return false;
+}
+
+void GraphicsWindow::MouseScroll(double x, double y, int delta) {
+ double offsetRight = offset.Dot(projRight);
+ double offsetUp = offset.Dot(projUp);
+
+ double righti = x/scale - offsetRight;
+ double upi = y/scale - offsetUp;
+
+ if(delta > 0) {
+ scale *= 1.2;
+ } else if(delta < 0) {
+ scale /= 1.2;
+ } else return;
+
+ double rightf = x/scale - offsetRight;
+ double upf = y/scale - offsetUp;
+
+ offset = offset.Plus(projRight.ScaledBy(rightf - righti));
+ offset = offset.Plus(projUp.ScaledBy(upf - upi));
+
+ if(SS.TW.shown.screen == TextWindow::SCREEN_EDIT_VIEW) {
+ if(havePainted) {
+ SS.ScheduleShowTW();
+ }
+ }
+ havePainted = false;
+ InvalidateGraphics();
+}
+
+void GraphicsWindow::MouseLeave(void) {
+ // Un-hover everything when the mouse leaves our window, unless there's
+ // currently a context menu shown.
+ if(!context.active) {
+ hover.Clear();
+ toolbarTooltipped = 0;
+ toolbarHovered = 0;
+ PaintGraphics();
+ }
+ SS.extraLine.draw = false;
+}
+
+void GraphicsWindow::SpaceNavigatorMoved(double tx, double ty, double tz,
+ double rx, double ry, double rz,
+ bool shiftDown)
+{
+ if(!havePainted) return;
+ Vector out = projRight.Cross(projUp);
+
+ // rotation vector is axis of rotation, and its magnitude is angle
+ Vector aa = Vector::From(rx, ry, rz);
+ // but it's given with respect to screen projection frame
+ aa = aa.ScaleOutOfCsys(projRight, projUp, out);
+ double aam = aa.Magnitude();
+ if(aam > 0.0) aa = aa.WithMagnitude(1);
+
+ // This can either transform our view, or transform a linked part.
+ GroupSelection();
+ Entity *e = NULL;
+ Group *g = NULL;
+ if(gs.points == 1 && gs.n == 1) e = SK.GetEntity(gs.point [0]);
+ if(gs.entities == 1 && gs.n == 1) e = SK.GetEntity(gs.entity[0]);
+ if(e) g = SK.GetGroup(e->group);
+ if(g && g->type == Group::LINKED && !shiftDown) {
+ // Apply the transformation to a linked part. Gain down the Z
+ // axis, since it's hard to see what you're doing on that one since
+ // it's normal to the screen.
+ Vector t = projRight.ScaledBy(tx/scale).Plus(
+ projUp .ScaledBy(ty/scale).Plus(
+ out .ScaledBy(0.1*tz/scale)));
+ Quaternion q = Quaternion::From(aa, aam);
+
+ // If we go five seconds without SpaceNavigator input, or if we've
+ // switched groups, then consider that a new action and save an undo
+ // point.
+ int64_t now = GetMilliseconds();
+ if(now - lastSpaceNavigatorTime > 5000 ||
+ lastSpaceNavigatorGroup.v != g->h.v)
+ {
+ SS.UndoRemember();
+ }
+
+ g->TransformImportedBy(t, q);
+
+ lastSpaceNavigatorTime = now;
+ lastSpaceNavigatorGroup = g->h;
+ SS.MarkGroupDirty(g->h);
+ SS.ScheduleGenerateAll();
+ } else {
+ // Apply the transformation to the view of the everything. The
+ // x and y components are translation; but z component is scale,
+ // not translation, or else it would do nothing in a parallel
+ // projection
+ offset = offset.Plus(projRight.ScaledBy(tx/scale));
+ offset = offset.Plus(projUp.ScaledBy(ty/scale));
+ scale *= exp(0.001*tz);
+
+ if(aam > 0.0) {
+ projRight = projRight.RotatedAbout(aa, -aam);
+ projUp = projUp. RotatedAbout(aa, -aam);
+ NormalizeProjectionVectors();
+ }
+ }
+
+ havePainted = false;
+ InvalidateGraphics();
+}
+
+void GraphicsWindow::SpaceNavigatorButtonUp(void) {
+ ZoomToFit(/*includingInvisibles=*/false, /*useSelection=*/true);
+ InvalidateGraphics();
+}
+
--- /dev/null
+//-----------------------------------------------------------------------------
+// Operations on polygons (planar, of line segment edges).
+//
+// Copyright 2008-2013 Jonathan Westhues.
+//-----------------------------------------------------------------------------
+#include "solvespace.h"
+
+Vector STriangle::Normal(void) {
+ Vector ab = b.Minus(a), bc = c.Minus(b);
+ return ab.Cross(bc);
+}
+
+double STriangle::MinAltitude(void) {
+ double altA = a.DistanceToLine(b, c.Minus(b)),
+ altB = b.DistanceToLine(c, a.Minus(c)),
+ altC = c.DistanceToLine(a, b.Minus(a));
+
+ return min(altA, min(altB, altC));
+}
+
+bool STriangle::ContainsPoint(Vector p) {
+ Vector n = Normal();
+ if(MinAltitude() < LENGTH_EPS) {
+ // shouldn't happen; zero-area triangle
+ return false;
+ }
+ return ContainsPointProjd(n.WithMagnitude(1), p);
+}
+
+bool STriangle::ContainsPointProjd(Vector n, Vector p) {
+ Vector ab = b.Minus(a), bc = c.Minus(b), ca = a.Minus(c);
+
+ Vector no_ab = n.Cross(ab);
+ if(no_ab.Dot(p) < no_ab.Dot(a) - LENGTH_EPS) return false;
+
+ Vector no_bc = n.Cross(bc);
+ if(no_bc.Dot(p) < no_bc.Dot(b) - LENGTH_EPS) return false;
+
+ Vector no_ca = n.Cross(ca);
+ if(no_ca.Dot(p) < no_ca.Dot(c) - LENGTH_EPS) return false;
+
+ return true;
+}
+
+void STriangle::FlipNormal(void) {
+ swap(a, b);
+ swap(an, bn);
+}
+
+STriangle STriangle::From(STriMeta meta, Vector a, Vector b, Vector c) {
+ STriangle tr = {};
+ tr.meta = meta;
+ tr.a = a;
+ tr.b = b;
+ tr.c = c;
+ return tr;
+}
+
+SEdge SEdge::From(Vector a, Vector b) {
+ SEdge se = {};
+ se.a = a;
+ se.b = b;
+ return se;
+}
+
+bool SEdge::EdgeCrosses(Vector ea, Vector eb, Vector *ppi, SPointList *spl) {
+ Vector d = eb.Minus(ea);
+ double t_eps = LENGTH_EPS/d.Magnitude();
+
+ double t, tthis;
+ bool skew;
+ Vector pi;
+ bool inOrEdge0, inOrEdge1;
+
+ Vector dthis = b.Minus(a);
+ double tthis_eps = LENGTH_EPS/dthis.Magnitude();
+
+ if((ea.Equals(a) && eb.Equals(b)) ||
+ (eb.Equals(a) && ea.Equals(b)))
+ {
+ if(ppi) *ppi = a;
+ if(spl) spl->Add(a);
+ return true;
+ }
+
+ // Can't just test if distance between d and a equals distance between d and b;
+ // they could be on opposite sides, since we don't have the sign.
+ double m = sqrt(d.Magnitude()*dthis.Magnitude());
+ if(sqrt(fabs(d.Dot(dthis))) > (m - LENGTH_EPS)) {
+ // The edges are parallel.
+ if(fabs(a.DistanceToLine(ea, d)) > LENGTH_EPS) {
+ // and not coincident, so can't be interesecting
+ return false;
+ }
+ // The edges are coincident. Make sure that neither endpoint lies
+ // on the other
+ bool inters = false;
+ double t;
+ t = a.Minus(ea).DivPivoting(d);
+ if(t > t_eps && t < (1 - t_eps)) inters = true;
+ t = b.Minus(ea).DivPivoting(d);
+ if(t > t_eps && t < (1 - t_eps)) inters = true;
+ t = ea.Minus(a).DivPivoting(dthis);
+ if(t > tthis_eps && t < (1 - tthis_eps)) inters = true;
+ t = eb.Minus(a).DivPivoting(dthis);
+ if(t > tthis_eps && t < (1 - tthis_eps)) inters = true;
+
+ if(inters) {
+ if(ppi) *ppi = a;
+ if(spl) spl->Add(a);
+ return true;
+ } else {
+ // So coincident but disjoint, okay.
+ return false;
+ }
+ }
+
+ // Lines are not parallel, so look for an intersection.
+ pi = Vector::AtIntersectionOfLines(ea, eb, a, b,
+ &skew,
+ &t, &tthis);
+ if(skew) return false;
+
+ inOrEdge0 = (t > -t_eps) && (t < (1 + t_eps));
+ inOrEdge1 = (tthis > -tthis_eps) && (tthis < (1 + tthis_eps));
+
+ if(inOrEdge0 && inOrEdge1) {
+ if(a.Equals(ea) || b.Equals(ea) ||
+ a.Equals(eb) || b.Equals(eb))
+ {
+ // Not an intersection if we share an endpoint with an edge
+ return false;
+ }
+ // But it's an intersection if a vertex of one edge lies on the
+ // inside of the other (or if they cross away from either's
+ // vertex).
+ if(ppi) *ppi = pi;
+ if(spl) spl->Add(pi);
+ return true;
+ }
+ return false;
+}
+
+void SEdgeList::Clear(void) {
+ l.Clear();
+}
+
+void SEdgeList::AddEdge(Vector a, Vector b, int auxA, int auxB) {
+ SEdge e = {};
+ e.a = a;
+ e.b = b;
+ e.auxA = auxA;
+ e.auxB = auxB;
+ l.Add(&e);
+}
+
+bool SEdgeList::AssembleContour(Vector first, Vector last, SContour *dest,
+ SEdge *errorAt, bool keepDir)
+{
+ int i;
+
+ dest->AddPoint(first);
+ dest->AddPoint(last);
+
+ do {
+ for(i = 0; i < l.n; i++) {
+ SEdge *se = &(l.elem[i]);
+ if(se->tag) continue;
+
+ if(se->a.Equals(last)) {
+ dest->AddPoint(se->b);
+ last = se->b;
+ se->tag = 1;
+ break;
+ }
+ // Don't allow backwards edges if keepDir is true.
+ if(!keepDir && se->b.Equals(last)) {
+ dest->AddPoint(se->a);
+ last = se->a;
+ se->tag = 1;
+ break;
+ }
+ }
+ if(i >= l.n) {
+ // Couldn't assemble a closed contour; mark where.
+ if(errorAt) {
+ errorAt->a = first;
+ errorAt->b = last;
+ }
+ return false;
+ }
+
+ } while(!last.Equals(first));
+
+ return true;
+}
+
+bool SEdgeList::AssemblePolygon(SPolygon *dest, SEdge *errorAt, bool keepDir) {
+ dest->Clear();
+
+ bool allClosed = true;
+ for(;;) {
+ Vector first = Vector::From(0, 0, 0);
+ Vector last = Vector::From(0, 0, 0);
+ int i;
+ for(i = 0; i < l.n; i++) {
+ if(!l.elem[i].tag) {
+ first = l.elem[i].a;
+ last = l.elem[i].b;
+ l.elem[i].tag = 1;
+ break;
+ }
+ }
+ if(i >= l.n) {
+ return allClosed;
+ }
+
+ // Create a new empty contour in our polygon, and finish assembling
+ // into that contour.
+ dest->AddEmptyContour();
+ if(!AssembleContour(first, last, &(dest->l.elem[dest->l.n-1]),
+ errorAt, keepDir))
+ {
+ allClosed = false;
+ }
+ // But continue assembling, even if some of the contours are open
+ }
+}
+
+//-----------------------------------------------------------------------------
+// Test if the specified edge crosses any of the edges in our list. Two edges
+// are not considered to cross if they share an endpoint (within LENGTH_EPS),
+// but they are considered to cross if they are coincident and overlapping.
+// If pi is not NULL, then a crossing is returned in that.
+//-----------------------------------------------------------------------------
+int SEdgeList::AnyEdgeCrossings(Vector a, Vector b,
+ Vector *ppi, SPointList *spl)
+{
+ int cnt = 0;
+ SEdge *se;
+ for(se = l.First(); se; se = l.NextAfter(se)) {
+ if(se->EdgeCrosses(a, b, ppi, spl)) {
+ cnt++;
+ }
+ }
+ return cnt;
+}
+
+//-----------------------------------------------------------------------------
+// Returns true if the intersecting edge list contains an edge that shares
+// an endpoint with one of our edges.
+//-----------------------------------------------------------------------------
+bool SEdgeList::ContainsEdgeFrom(SEdgeList *sel) {
+ SEdge *se;
+ for(se = l.First(); se; se = l.NextAfter(se)) {
+ if(sel->ContainsEdge(se)) return true;
+ }
+ return false;
+}
+bool SEdgeList::ContainsEdge(SEdge *set) {
+ SEdge *se;
+ for(se = l.First(); se; se = l.NextAfter(se)) {
+ if((se->a).Equals(set->a) && (se->b).Equals(set->b)) return true;
+ if((se->b).Equals(set->a) && (se->a).Equals(set->b)) return true;
+ }
+ return false;
+}
+
+//-----------------------------------------------------------------------------
+// Remove unnecessary edges: if two are anti-parallel then remove both, and if
+// two are parallel then remove one.
+//-----------------------------------------------------------------------------
+void SEdgeList::CullExtraneousEdges(void) {
+ l.ClearTags();
+ int i, j;
+ for(i = 0; i < l.n; i++) {
+ SEdge *se = &(l.elem[i]);
+ for(j = i+1; j < l.n; j++) {
+ SEdge *set = &(l.elem[j]);
+ if((set->a).Equals(se->a) && (set->b).Equals(se->b)) {
+ // Two parallel edges exist; so keep only the first one.
+ set->tag = 1;
+ }
+ if((set->a).Equals(se->b) && (set->b).Equals(se->a)) {
+ // Two anti-parallel edges exist; so keep neither.
+ se->tag = 1;
+ set->tag = 1;
+ }
+ }
+ }
+ l.RemoveTagged();
+}
+
+//-----------------------------------------------------------------------------
+// Make a kd-tree of edges. This is used for O(log(n)) implementations of stuff
+// that would naively be O(n).
+//-----------------------------------------------------------------------------
+SKdNodeEdges *SKdNodeEdges::Alloc(void) {
+ SKdNodeEdges *ne = (SKdNodeEdges *)AllocTemporary(sizeof(SKdNodeEdges));
+ *ne = {};
+ return ne;
+}
+SEdgeLl *SEdgeLl::Alloc(void) {
+ SEdgeLl *sell = (SEdgeLl *)AllocTemporary(sizeof(SEdgeLl));
+ *sell = {};
+ return sell;
+}
+SKdNodeEdges *SKdNodeEdges::From(SEdgeList *sel) {
+ SEdgeLl *sell = NULL;
+ SEdge *se;
+ for(se = sel->l.First(); se; se = sel->l.NextAfter(se)) {
+ SEdgeLl *n = SEdgeLl::Alloc();
+ n->se = se;
+ n->next = sell;
+ sell = n;
+ }
+ return SKdNodeEdges::From(sell);
+}
+SKdNodeEdges *SKdNodeEdges::From(SEdgeLl *sell) {
+ SKdNodeEdges *n = SKdNodeEdges::Alloc();
+
+ // Compute the midpoints (just mean, though median would be better) of
+ // each component.
+ Vector ptAve = Vector::From(0, 0, 0);
+ SEdgeLl *flip;
+ int totaln = 0;
+ for(flip = sell; flip; flip = flip->next) {
+ ptAve = ptAve.Plus(flip->se->a);
+ ptAve = ptAve.Plus(flip->se->b);
+ totaln++;
+ }
+ ptAve = ptAve.ScaledBy(1.0 / (2*totaln));
+
+ // For each component, see how it splits.
+ int ltln[3] = { 0, 0, 0 }, gtln[3] = { 0, 0, 0 };
+ double badness[3];
+ for(flip = sell; flip; flip = flip->next) {
+ for(int i = 0; i < 3; i++) {
+ if(flip->se->a.Element(i) < ptAve.Element(i) + KDTREE_EPS ||
+ flip->se->b.Element(i) < ptAve.Element(i) + KDTREE_EPS)
+ {
+ ltln[i]++;
+ }
+ if(flip->se->a.Element(i) > ptAve.Element(i) - KDTREE_EPS ||
+ flip->se->b.Element(i) > ptAve.Element(i) - KDTREE_EPS)
+ {
+ gtln[i]++;
+ }
+ }
+ }
+ for(int i = 0; i < 3; i++) {
+ badness[i] = pow((double)ltln[i], 4) + pow((double)gtln[i], 4);
+ }
+
+ // Choose the least bad coordinate to split along.
+ if(badness[0] < badness[1] && badness[0] < badness[2]) {
+ n->which = 0;
+ } else if(badness[1] < badness[2]) {
+ n->which = 1;
+ } else {
+ n->which = 2;
+ }
+ n->c = ptAve.Element(n->which);
+
+ if(totaln < 3 || totaln == gtln[n->which] || totaln == ltln[n->which]) {
+ n->edges = sell;
+ // and we're a leaf node
+ return n;
+ }
+
+ // Sort the edges according to which side(s) of the split plane they're on.
+ SEdgeLl *gtl = NULL, *ltl = NULL;
+ for(flip = sell; flip; flip = flip->next) {
+ if(flip->se->a.Element(n->which) < n->c + KDTREE_EPS ||
+ flip->se->b.Element(n->which) < n->c + KDTREE_EPS)
+ {
+ SEdgeLl *selln = SEdgeLl::Alloc();
+ selln->se = flip->se;
+ selln->next = ltl;
+ ltl = selln;
+ }
+ if(flip->se->a.Element(n->which) > n->c - KDTREE_EPS ||
+ flip->se->b.Element(n->which) > n->c - KDTREE_EPS)
+ {
+ SEdgeLl *selln = SEdgeLl::Alloc();
+ selln->se = flip->se;
+ selln->next = gtl;
+ gtl = selln;
+ }
+ }
+
+ n->lt = SKdNodeEdges::From(ltl);
+ n->gt = SKdNodeEdges::From(gtl);
+ return n;
+}
+
+int SKdNodeEdges::AnyEdgeCrossings(Vector a, Vector b, int cnt,
+ Vector *pi, SPointList *spl)
+{
+ int inters = 0;
+ if(gt && lt) {
+ if(a.Element(which) < c + KDTREE_EPS ||
+ b.Element(which) < c + KDTREE_EPS)
+ {
+ inters += lt->AnyEdgeCrossings(a, b, cnt, pi, spl);
+ }
+ if(a.Element(which) > c - KDTREE_EPS ||
+ b.Element(which) > c - KDTREE_EPS)
+ {
+ inters += gt->AnyEdgeCrossings(a, b, cnt, pi, spl);
+ }
+ } else {
+ SEdgeLl *sell;
+ for(sell = edges; sell; sell = sell->next) {
+ SEdge *se = sell->se;
+ if(se->tag == cnt) continue;
+ if(se->EdgeCrosses(a, b, pi, spl)) {
+ inters++;
+ }
+ se->tag = cnt;
+ }
+ }
+ return inters;
+}
+
+//-----------------------------------------------------------------------------
+// We have an edge list that contains only collinear edges, maybe with more
+// splits than necessary. Merge any collinear segments that join.
+//-----------------------------------------------------------------------------
+static Vector LineStart, LineDirection;
+static int ByTAlongLine(const void *av, const void *bv)
+{
+ SEdge *a = (SEdge *)av,
+ *b = (SEdge *)bv;
+
+ double ta = (a->a.Minus(LineStart)).DivPivoting(LineDirection),
+ tb = (b->a.Minus(LineStart)).DivPivoting(LineDirection);
+
+ return (ta > tb) ? 1 : -1;
+}
+void SEdgeList::MergeCollinearSegments(Vector a, Vector b) {
+ LineStart = a;
+ LineDirection = b.Minus(a);
+ qsort(l.elem, l.n, sizeof(l.elem[0]), ByTAlongLine);
+
+ l.ClearTags();
+ int i;
+ for(i = 1; i < l.n; i++) {
+ SEdge *prev = &(l.elem[i-1]),
+ *now = &(l.elem[i]);
+
+ if((prev->b).Equals(now->a) && prev->auxA == now->auxA) {
+ // The previous segment joins up to us; so merge it into us.
+ prev->tag = 1;
+ now->a = prev->a;
+ }
+ }
+ l.RemoveTagged();
+}
+
+void SPointList::Clear(void) {
+ l.Clear();
+}
+
+bool SPointList::ContainsPoint(Vector pt) {
+ return (IndexForPoint(pt) >= 0);
+}
+
+int SPointList::IndexForPoint(Vector pt) {
+ int i;
+ for(i = 0; i < l.n; i++) {
+ SPoint *p = &(l.elem[i]);
+ if(pt.Equals(p->p)) {
+ return i;
+ }
+ }
+ // Not found, so return negative to indicate that.
+ return -1;
+}
+
+void SPointList::IncrementTagFor(Vector pt) {
+ SPoint *p;
+ for(p = l.First(); p; p = l.NextAfter(p)) {
+ if(pt.Equals(p->p)) {
+ (p->tag)++;
+ return;
+ }
+ }
+ SPoint pa;
+ pa.p = pt;
+ pa.tag = 1;
+ l.Add(&pa);
+}
+
+void SPointList::Add(Vector pt) {
+ SPoint p = {};
+ p.p = pt;
+ l.Add(&p);
+}
+
+void SContour::AddPoint(Vector p) {
+ SPoint sp;
+ sp.tag = 0;
+ sp.p = p;
+
+ l.Add(&sp);
+}
+
+void SContour::MakeEdgesInto(SEdgeList *el) {
+ int i;
+ for(i = 0; i < (l.n - 1); i++) {
+ el->AddEdge(l.elem[i].p, l.elem[i+1].p);
+ }
+}
+
+void SContour::CopyInto(SContour *dest) {
+ SPoint *sp;
+ for(sp = l.First(); sp; sp = l.NextAfter(sp)) {
+ dest->AddPoint(sp->p);
+ }
+}
+
+void SContour::FindPointWithMinX(void) {
+ SPoint *sp;
+ xminPt = Vector::From(1e10, 1e10, 1e10);
+ for(sp = l.First(); sp; sp = l.NextAfter(sp)) {
+ if(sp->p.x < xminPt.x) {
+ xminPt = sp->p;
+ }
+ }
+}
+
+Vector SContour::ComputeNormal(void) {
+ Vector n = Vector::From(0, 0, 0);
+
+ for(int i = 0; i < l.n - 2; i++) {
+ Vector u = (l.elem[i+1].p).Minus(l.elem[i+0].p).WithMagnitude(1);
+ Vector v = (l.elem[i+2].p).Minus(l.elem[i+1].p).WithMagnitude(1);
+ Vector nt = u.Cross(v);
+ if(nt.Magnitude() > n.Magnitude()) {
+ n = nt;
+ }
+ }
+ return n.WithMagnitude(1);
+}
+
+Vector SContour::AnyEdgeMidpoint(void) {
+ if(l.n < 2) oops();
+ return ((l.elem[0].p).Plus(l.elem[1].p)).ScaledBy(0.5);
+}
+
+bool SContour::IsClockwiseProjdToNormal(Vector n) {
+ // Degenerate things might happen as we draw; doesn't really matter
+ // what we do then.
+ if(n.Magnitude() < 0.01) return true;
+
+ return (SignedAreaProjdToNormal(n) < 0);
+}
+
+double SContour::SignedAreaProjdToNormal(Vector n) {
+ // An arbitrary 2d coordinate system that has n as its normal
+ Vector u = n.Normal(0);
+ Vector v = n.Normal(1);
+
+ double area = 0;
+ for(int i = 0; i < (l.n - 1); i++) {
+ double u0 = (l.elem[i ].p).Dot(u);
+ double v0 = (l.elem[i ].p).Dot(v);
+ double u1 = (l.elem[i+1].p).Dot(u);
+ double v1 = (l.elem[i+1].p).Dot(v);
+
+ area += ((v0 + v1)/2)*(u1 - u0);
+ }
+ return area;
+}
+
+bool SContour::ContainsPointProjdToNormal(Vector n, Vector p) {
+ Vector u = n.Normal(0);
+ Vector v = n.Normal(1);
+
+ double up = p.Dot(u);
+ double vp = p.Dot(v);
+
+ bool inside = false;
+ for(int i = 0; i < (l.n - 1); i++) {
+ double ua = (l.elem[i ].p).Dot(u);
+ double va = (l.elem[i ].p).Dot(v);
+ // The curve needs to be exactly closed; approximation is death.
+ double ub = (l.elem[(i+1)%(l.n-1)].p).Dot(u);
+ double vb = (l.elem[(i+1)%(l.n-1)].p).Dot(v);
+
+ if ((((va <= vp) && (vp < vb)) ||
+ ((vb <= vp) && (vp < va))) &&
+ (up < (ub - ua) * (vp - va) / (vb - va) + ua))
+ {
+ inside = !inside;
+ }
+ }
+
+ return inside;
+}
+
+void SContour::Reverse(void) {
+ l.Reverse();
+}
+
+
+void SPolygon::Clear(void) {
+ int i;
+ for(i = 0; i < l.n; i++) {
+ (l.elem[i]).l.Clear();
+ }
+ l.Clear();
+}
+
+void SPolygon::AddEmptyContour(void) {
+ SContour c = {};
+ l.Add(&c);
+}
+
+void SPolygon::MakeEdgesInto(SEdgeList *el) {
+ int i;
+ for(i = 0; i < l.n; i++) {
+ (l.elem[i]).MakeEdgesInto(el);
+ }
+}
+
+Vector SPolygon::ComputeNormal(void) {
+ if(l.n < 1) return Vector::From(0, 0, 0);
+ return (l.elem[0]).ComputeNormal();
+}
+
+double SPolygon::SignedArea(void) {
+ SContour *sc;
+ double area = 0;
+ // This returns the true area only if the contours are all oriented
+ // correctly, with the holes backwards from the outer contours.
+ for(sc = l.First(); sc; sc = l.NextAfter(sc)) {
+ area += sc->SignedAreaProjdToNormal(normal);
+ }
+ return area;
+}
+
+bool SPolygon::ContainsPoint(Vector p) {
+ return (WindingNumberForPoint(p) % 2) == 1;
+}
+
+int SPolygon::WindingNumberForPoint(Vector p) {
+ int winding = 0;
+ int i;
+ for(i = 0; i < l.n; i++) {
+ SContour *sc = &(l.elem[i]);
+ if(sc->ContainsPointProjdToNormal(normal, p)) {
+ winding++;
+ }
+ }
+ return winding;
+}
+
+void SPolygon::FixContourDirections(void) {
+ // At output, the contour's tag will be 1 if we reversed it, else 0.
+ l.ClearTags();
+
+ // Outside curve looks counterclockwise, projected against our normal.
+ int i, j;
+ for(i = 0; i < l.n; i++) {
+ SContour *sc = &(l.elem[i]);
+ if(sc->l.n < 2) continue;
+ // The contours may not intersect, but they may share vertices; so
+ // testing a vertex for point-in-polygon may fail, but the midpoint
+ // of an edge is okay.
+ Vector pt = (((sc->l.elem[0]).p).Plus(sc->l.elem[1].p)).ScaledBy(0.5);
+
+ sc->timesEnclosed = 0;
+ bool outer = true;
+ for(j = 0; j < l.n; j++) {
+ if(i == j) continue;
+ SContour *sct = &(l.elem[j]);
+ if(sct->ContainsPointProjdToNormal(normal, pt)) {
+ outer = !outer;
+ (sc->timesEnclosed)++;
+ }
+ }
+
+ bool clockwise = sc->IsClockwiseProjdToNormal(normal);
+ if((clockwise && outer) || (!clockwise && !outer)) {
+ sc->Reverse();
+ sc->tag = 1;
+ }
+ }
+}
+
+bool SPolygon::IsEmpty(void) {
+ if(l.n == 0 || l.elem[0].l.n == 0) return true;
+ return false;
+}
+
+Vector SPolygon::AnyPoint(void) {
+ if(IsEmpty()) oops();
+ return l.elem[0].l.elem[0].p;
+}
+
+bool SPolygon::SelfIntersecting(Vector *intersectsAt) {
+ SEdgeList el = {};
+ MakeEdgesInto(&el);
+ SKdNodeEdges *kdtree = SKdNodeEdges::From(&el);
+
+ int cnt = 1;
+ el.l.ClearTags();
+
+ bool ret = false;
+ SEdge *se;
+ for(se = el.l.First(); se; se = el.l.NextAfter(se)) {
+ int inters = kdtree->AnyEdgeCrossings(se->a, se->b, cnt, intersectsAt);
+ if(inters != 1) {
+ ret = true;
+ break;
+ }
+ cnt++;
+ }
+
+ el.Clear();
+ return ret;
+}
+
+//-----------------------------------------------------------------------------
+// Low-quality routines to cutter radius compensate a polygon. Assumes the
+// polygon is in the xy plane, and the contours all go in the right direction
+// with respect to normal (0, 0, -1).
+//-----------------------------------------------------------------------------
+void SPolygon::OffsetInto(SPolygon *dest, double r) {
+ int i;
+ dest->Clear();
+ for(i = 0; i < l.n; i++) {
+ SContour *sc = &(l.elem[i]);
+ dest->AddEmptyContour();
+ sc->OffsetInto(&(dest->l.elem[dest->l.n-1]), r);
+ }
+}
+//-----------------------------------------------------------------------------
+// Calculate the intersection point of two lines. Returns true for success,
+// false if they're parallel.
+//-----------------------------------------------------------------------------
+static bool IntersectionOfLines(double x0A, double y0A, double dxA, double dyA,
+ double x0B, double y0B, double dxB, double dyB,
+ double *xi, double *yi)
+{
+ double A[2][2];
+ double b[2];
+
+ // The line is given to us in the form:
+ // (x(t), y(t)) = (x0, y0) + t*(dx, dy)
+ // so first rewrite it as
+ // (x - x0, y - y0) dot (dy, -dx) = 0
+ // x*dy - x0*dy - y*dx + y0*dx = 0
+ // x*dy - y*dx = (x0*dy - y0*dx)
+
+ // So write the matrix, pre-pivoted.
+ if(fabs(dyA) > fabs(dyB)) {
+ A[0][0] = dyA; A[0][1] = -dxA; b[0] = x0A*dyA - y0A*dxA;
+ A[1][0] = dyB; A[1][1] = -dxB; b[1] = x0B*dyB - y0B*dxB;
+ } else {
+ A[1][0] = dyA; A[1][1] = -dxA; b[1] = x0A*dyA - y0A*dxA;
+ A[0][0] = dyB; A[0][1] = -dxB; b[0] = x0B*dyB - y0B*dxB;
+ }
+
+ // Check the determinant; if it's zero then no solution.
+ if(fabs(A[0][0]*A[1][1] - A[0][1]*A[1][0]) < LENGTH_EPS) {
+ return false;
+ }
+
+ // Solve
+ double v = A[1][0] / A[0][0];
+ A[1][0] -= A[0][0]*v;
+ A[1][1] -= A[0][1]*v;
+ b[1] -= b[0]*v;
+
+ // Back-substitute.
+ *yi = b[1] / A[1][1];
+ *xi = (b[0] - A[0][1]*(*yi)) / A[0][0];
+
+ return true;
+}
+void SContour::OffsetInto(SContour *dest, double r) {
+ int i;
+
+ for(i = 0; i < l.n; i++) {
+ Vector a, b, c;
+ Vector dp, dn;
+ double thetan, thetap;
+
+ a = l.elem[WRAP(i-1, (l.n-1))].p;
+ b = l.elem[WRAP(i, (l.n-1))].p;
+ c = l.elem[WRAP(i+1, (l.n-1))].p;
+
+ dp = a.Minus(b);
+ thetap = atan2(dp.y, dp.x);
+
+ dn = b.Minus(c);
+ thetan = atan2(dn.y, dn.x);
+
+ // A short line segment in a badly-generated polygon might look
+ // okay but screw up our sense of direction.
+ if(dp.Magnitude() < LENGTH_EPS || dn.Magnitude() < LENGTH_EPS) {
+ continue;
+ }
+
+ if(thetan > thetap && (thetan - thetap) > PI) {
+ thetap += 2*PI;
+ }
+ if(thetan < thetap && (thetap - thetan) > PI) {
+ thetan += 2*PI;
+ }
+
+ if(fabs(thetan - thetap) < (1*PI)/180) {
+ Vector p = { b.x - r*sin(thetap), b.y + r*cos(thetap), 0 };
+ dest->AddPoint(p);
+ } else if(thetan < thetap) {
+ // This is an inside corner. We have two edges, Ep and En. Move
+ // out from their intersection by radius, normal to En, and
+ // then draw a line parallel to En. Move out from their
+ // intersection by radius, normal to Ep, and then draw a second
+ // line parallel to Ep. The point that we want to generate is
+ // the intersection of these two lines--it removes as much
+ // material as we can without removing any that we shouldn't.
+ double px0, py0, pdx, pdy;
+ double nx0, ny0, ndx, ndy;
+ double x = 0.0, y = 0.0;
+
+ px0 = b.x - r*sin(thetap);
+ py0 = b.y + r*cos(thetap);
+ pdx = cos(thetap);
+ pdy = sin(thetap);
+
+ nx0 = b.x - r*sin(thetan);
+ ny0 = b.y + r*cos(thetan);
+ ndx = cos(thetan);
+ ndy = sin(thetan);
+
+ IntersectionOfLines(px0, py0, pdx, pdy,
+ nx0, ny0, ndx, ndy,
+ &x, &y);
+
+ dest->AddPoint(Vector::From(x, y, 0));
+ } else {
+ if(fabs(thetap - thetan) < (6*PI)/180) {
+ Vector pp = { b.x - r*sin(thetap),
+ b.y + r*cos(thetap), 0 };
+ dest->AddPoint(pp);
+
+ Vector pn = { b.x - r*sin(thetan),
+ b.y + r*cos(thetan), 0 };
+ dest->AddPoint(pn);
+ } else {
+ double theta;
+ for(theta = thetap; theta <= thetan; theta += (6*PI)/180) {
+ Vector p = { b.x - r*sin(theta),
+ b.y + r*cos(theta), 0 };
+ dest->AddPoint(p);
+ }
+ }
+ }
+ }
+}
+
--- /dev/null
+//-----------------------------------------------------------------------------
+// Anything relating to plane polygons and triangles, and (generally, non-
+// planar) meshes thereof.
+//
+// Copyright 2008-2013 Jonathan Westhues.
+//-----------------------------------------------------------------------------
+
+#ifndef __POLYGON_H
+#define __POLYGON_H
+
+class SPointList;
+class SPolygon;
+class SContour;
+class SMesh;
+class SBsp3;
+class SOutlineList;
+
+class SEdge {
+public:
+ int tag;
+ int auxA, auxB;
+ Vector a, b;
+
+ static SEdge From(Vector a, Vector b);
+ bool EdgeCrosses(Vector a, Vector b, Vector *pi=NULL, SPointList *spl=NULL);
+};
+
+class SEdgeList {
+public:
+ List<SEdge> l;
+
+ void Clear(void);
+ void AddEdge(Vector a, Vector b, int auxA=0, int auxB=0);
+ bool AssemblePolygon(SPolygon *dest, SEdge *errorAt, bool keepDir=false);
+ bool AssembleContour(Vector first, Vector last, SContour *dest,
+ SEdge *errorAt, bool keepDir);
+ int AnyEdgeCrossings(Vector a, Vector b,
+ Vector *pi=NULL, SPointList *spl=NULL);
+ bool ContainsEdgeFrom(SEdgeList *sel);
+ bool ContainsEdge(SEdge *se);
+ void CullExtraneousEdges(void);
+ void MergeCollinearSegments(Vector a, Vector b);
+};
+
+// A kd-tree element needs to go on a side of a node if it's when KDTREE_EPS
+// of the boundary. So increasing this number never breaks anything, but may
+// result in more duplicated elements. So it's conservative to be sloppy here.
+#define KDTREE_EPS (20*LENGTH_EPS)
+
+class SEdgeLl {
+public:
+ SEdge *se;
+ SEdgeLl *next;
+
+ static SEdgeLl *Alloc(void);
+};
+
+class SKdNodeEdges {
+public:
+ int which; // whether c is x, y, or z
+ double c;
+ SKdNodeEdges *gt;
+ SKdNodeEdges *lt;
+
+ SEdgeLl *edges;
+
+ static SKdNodeEdges *From(SEdgeList *sel);
+ static SKdNodeEdges *From(SEdgeLl *sell);
+ static SKdNodeEdges *Alloc(void);
+ int AnyEdgeCrossings(Vector a, Vector b, int cnt,
+ Vector *pi=NULL, SPointList *spl=NULL);
+};
+
+class SPoint {
+public:
+ int tag;
+
+ enum {
+ UNKNOWN = 0,
+ NOT_EAR = 1,
+ EAR = 2
+ };
+ int ear;
+
+ Vector p;
+ Vector auxv;
+};
+
+class SPointList {
+public:
+ List<SPoint> l;
+
+ void Clear(void);
+ bool ContainsPoint(Vector pt);
+ int IndexForPoint(Vector pt);
+ void IncrementTagFor(Vector pt);
+ void Add(Vector pt);
+};
+
+class SContour {
+public:
+ int tag;
+ int timesEnclosed;
+ Vector xminPt;
+ List<SPoint> l;
+
+ void AddPoint(Vector p);
+ void MakeEdgesInto(SEdgeList *el);
+ void Reverse(void);
+ Vector ComputeNormal(void);
+ double SignedAreaProjdToNormal(Vector n);
+ bool IsClockwiseProjdToNormal(Vector n);
+ bool ContainsPointProjdToNormal(Vector n, Vector p);
+ void OffsetInto(SContour *dest, double r);
+ void CopyInto(SContour *dest);
+ void FindPointWithMinX(void);
+ Vector AnyEdgeMidpoint(void);
+
+ bool IsEar(int bp, double scaledEps);
+ bool BridgeToContour(SContour *sc, SEdgeList *el, List<Vector> *vl);
+ void ClipEarInto(SMesh *m, int bp, double scaledEps);
+ void UvTriangulateInto(SMesh *m, SSurface *srf);
+};
+
+typedef struct {
+ uint32_t face;
+ RgbaColor color;
+} STriMeta;
+
+class SPolygon {
+public:
+ List<SContour> l;
+ Vector normal;
+
+ Vector ComputeNormal(void);
+ void AddEmptyContour(void);
+ int WindingNumberForPoint(Vector p);
+ double SignedArea(void);
+ bool ContainsPoint(Vector p);
+ void MakeEdgesInto(SEdgeList *el);
+ void FixContourDirections(void);
+ void Clear(void);
+ bool SelfIntersecting(Vector *intersectsAt);
+ bool IsEmpty(void);
+ Vector AnyPoint(void);
+ void OffsetInto(SPolygon *dest, double r);
+ void UvTriangulateInto(SMesh *m, SSurface *srf);
+ void UvGridTriangulateInto(SMesh *m, SSurface *srf);
+};
+
+class STriangle {
+public:
+ int tag;
+ STriMeta meta;
+ Vector a, b, c;
+ Vector an, bn, cn;
+
+ static STriangle From(STriMeta meta, Vector a, Vector b, Vector c);
+ Vector Normal(void);
+ void FlipNormal(void);
+ double MinAltitude(void);
+ int WindingNumberForPoint(Vector p);
+ bool ContainsPoint(Vector p);
+ bool ContainsPointProjd(Vector n, Vector p);
+};
+
+class SBsp2 {
+public:
+ Vector np; // normal to the plane
+
+ Vector no; // outer normal to the edge
+ double d;
+ SEdge edge;
+
+ SBsp2 *pos;
+ SBsp2 *neg;
+
+ SBsp2 *more;
+
+ enum { POS = 100, NEG = 101, COPLANAR = 200 };
+ void InsertTriangleHow(int how, STriangle *tr, SMesh *m, SBsp3 *bsp3);
+ void InsertTriangle(STriangle *tr, SMesh *m, SBsp3 *bsp3);
+ Vector IntersectionWith(Vector a, Vector b);
+ void InsertEdge(SEdge *nedge, Vector nnp, Vector out);
+ static SBsp2 *InsertOrCreateEdge(SBsp2 *where, SEdge *nedge, Vector nnp, Vector out);
+ static SBsp2 *Alloc(void);
+
+ void DebugDraw(Vector n, double d);
+};
+
+class SBsp3 {
+public:
+ Vector n;
+ double d;
+
+ STriangle tri;
+ SBsp3 *pos;
+ SBsp3 *neg;
+
+ SBsp3 *more;
+
+ SBsp2 *edges;
+
+ static SBsp3 *Alloc(void);
+ static SBsp3 *FromMesh(SMesh *m);
+
+ Vector IntersectionWith(Vector a, Vector b);
+
+ enum { POS = 100, NEG = 101, COPLANAR = 200 };
+ void InsertHow(int how, STriangle *str, SMesh *instead);
+ void Insert(STriangle *str, SMesh *instead);
+ static SBsp3 *InsertOrCreate(SBsp3 *where, STriangle *str, SMesh *instead);
+
+ void InsertConvexHow(int how, STriMeta meta, Vector *vertex, int n,
+ SMesh *instead);
+ SBsp3 *InsertConvex(STriMeta meta, Vector *vertex, int n, SMesh *instead);
+
+ void InsertInPlane(bool pos2, STriangle *tr, SMesh *m);
+
+ void GenerateInPaintOrder(SMesh *m);
+
+ void DebugDraw(void);
+};
+
+class SMesh {
+public:
+ List<STriangle> l;
+
+ bool flipNormal;
+ bool keepCoplanar;
+ bool atLeastOneDiscarded;
+ bool isTransparent;
+
+ void Clear(void);
+ void AddTriangle(STriangle *st);
+ void AddTriangle(STriMeta meta, Vector a, Vector b, Vector c);
+ void AddTriangle(STriMeta meta, Vector n, Vector a, Vector b, Vector c);
+ void DoBounding(Vector v, Vector *vmax, Vector *vmin);
+ void GetBounding(Vector *vmax, Vector *vmin);
+
+ void Simplify(int start);
+
+ void AddAgainstBsp(SMesh *srcm, SBsp3 *bsp3);
+ void MakeFromUnionOf(SMesh *a, SMesh *b);
+ void MakeFromDifferenceOf(SMesh *a, SMesh *b);
+
+ void MakeFromCopyOf(SMesh *a);
+ void MakeFromTransformationOf(SMesh *a,
+ Vector trans, Quaternion q, double scale);
+ void MakeFromAssemblyOf(SMesh *a, SMesh *b);
+
+ void MakeEdgesInPlaneInto(SEdgeList *sel, Vector n, double d);
+ void MakeCertainEdgesAndOutlinesInto(SEdgeList *sel, SOutlineList *sol, int type);
+
+ bool IsEmpty(void);
+ void RemapFaces(Group *g, int remap);
+
+ uint32_t FirstIntersectionWith(Point2d mp);
+};
+
+// A linked list of triangles
+class STriangleLl {
+public:
+ STriangle *tri;
+
+ STriangleLl *next;
+
+ static STriangleLl *Alloc(void);
+};
+
+class SOutline {
+public:
+ int tag;
+ Vector a, b, nl, nr;
+};
+
+class SOutlineList {
+public:
+ List<SOutline> l;
+
+ void Clear();
+ void AddEdge(Vector a, Vector b, Vector nl, Vector nr);
+
+ void MakeFromCopyOf(SOutlineList *ol);
+
+ void FillOutlineTags(Vector projDir);
+};
+
+class SKdNode {
+public:
+ struct EdgeOnInfo {
+ int count;
+ bool frontFacing;
+ bool intersectsMesh;
+ STriangle *tr;
+ int ai;
+ int bi;
+ };
+
+ int which; // whether c is x, y, or z
+ double c;
+
+ SKdNode *gt;
+ SKdNode *lt;
+
+ STriangleLl *tris;
+
+ static SKdNode *Alloc(void);
+ static SKdNode *From(SMesh *m);
+ static SKdNode *From(STriangleLl *tll);
+
+ void AddTriangle(STriangle *tr);
+ void MakeMeshInto(SMesh *m);
+ void ListTrianglesInto(std::vector<STriangle *> *tl);
+ void ClearTags(void);
+
+ void FindEdgeOn(Vector a, Vector b, int cnt, bool coplanarIsInter, EdgeOnInfo *info);
+ enum {
+ NAKED_OR_SELF_INTER_EDGES = 100,
+ SELF_INTER_EDGES = 200,
+ TURNING_EDGES = 300,
+ EMPHASIZED_EDGES = 400,
+ SHARP_EDGES = 500,
+ };
+ void MakeCertainEdgesInto(SEdgeList *sel, int how, bool coplanarIsInter,
+ bool *inter, bool *leaky, int auxA=0);
+ void MakeOutlinesInto(SOutlineList *sel);
+
+ void OcclusionTestLine(SEdge orig, SEdgeList *sel, int cnt, bool removeHidden);
+ void SplitLinesAgainstTriangle(SEdgeList *sel, STriangle *tr, bool removeHidden);
+
+ void SnapToMesh(SMesh *m);
+ void SnapToVertex(Vector v, SMesh *extras);
+};
+
+#endif
+
--- /dev/null
+//-----------------------------------------------------------------------------
+// Implementation of our Request class; a request is a user-created thing
+// that will generate an entity (line, curve) when the sketch is generated,
+// in the same way that other entities are generated automatically, like
+// by an extrude or a step and repeat.
+//
+// Copyright 2008-2013 Jonathan Westhues.
+//-----------------------------------------------------------------------------
+#include "solvespace.h"
+
+const hRequest Request::HREQUEST_REFERENCE_XY = { 1 };
+const hRequest Request::HREQUEST_REFERENCE_YZ = { 2 };
+const hRequest Request::HREQUEST_REFERENCE_ZX = { 3 };
+
+const EntReqTable::TableEntry EntReqTable::Table[] = {
+// request type entity type pts xtra? norml dist description
+{ Request::WORKPLANE, Entity::WORKPLANE, 1, false, true, false, "workplane" },
+{ Request::DATUM_POINT, 0, 1, false, false, false, "datum-point" },
+{ Request::LINE_SEGMENT, Entity::LINE_SEGMENT, 2, false, false, false, "line-segment" },
+{ Request::CUBIC, Entity::CUBIC, 4, true, false, false, "cubic-bezier" },
+{ Request::CUBIC_PERIODIC, Entity::CUBIC_PERIODIC, 3, true, false, false, "periodic-cubic" },
+{ Request::CIRCLE, Entity::CIRCLE, 1, false, true, true, "circle" },
+{ Request::ARC_OF_CIRCLE, Entity::ARC_OF_CIRCLE, 3, false, true, false, "arc-of-circle" },
+{ Request::TTF_TEXT, Entity::TTF_TEXT, 2, false, true, false, "ttf-text" },
+{ 0, 0, 0, false, false, false, 0 },
+};
+
+const char *EntReqTable::DescriptionForRequest(int req) {
+ for(int i = 0; Table[i].reqType; i++) {
+ if(req == Table[i].reqType) {
+ return Table[i].description;
+ }
+ }
+ return "???";
+}
+
+void EntReqTable::CopyEntityInfo(const TableEntry *te, int extraPoints,
+ int *ent, int *req, int *pts, bool *hasNormal, bool *hasDistance)
+{
+ int points = te->points;
+ if(te->useExtraPoints) points += extraPoints;
+
+ if(ent) *ent = te->entType;
+ if(req) *req = te->reqType;
+ if(pts) *pts = points;
+ if(hasNormal) *hasNormal = te->hasNormal;
+ if(hasDistance) *hasDistance = te->hasDistance;
+}
+
+bool EntReqTable::GetRequestInfo(int req, int extraPoints,
+ int *ent, int *pts, bool *hasNormal, bool *hasDistance)
+{
+ for(int i = 0; Table[i].reqType; i++) {
+ const TableEntry *te = &(Table[i]);
+ if(req == te->reqType) {
+ CopyEntityInfo(te, extraPoints,
+ ent, NULL, pts, hasNormal, hasDistance);
+ return true;
+ }
+ }
+ return false;
+}
+
+bool EntReqTable::GetEntityInfo(int ent, int extraPoints,
+ int *req, int *pts, bool *hasNormal, bool *hasDistance)
+{
+ for(int i = 0; Table[i].reqType; i++) {
+ const TableEntry *te = &(Table[i]);
+ if(ent == te->entType) {
+ CopyEntityInfo(te, extraPoints,
+ NULL, req, pts, hasNormal, hasDistance);
+ return true;
+ }
+ }
+ return false;
+}
+
+int EntReqTable::GetRequestForEntity(int ent) {
+ int req = 0;
+ GetEntityInfo(ent, 0, &req, NULL, NULL, NULL);
+ return req;
+}
+
+
+void Request::Generate(IdList<Entity,hEntity> *entity,
+ IdList<Param,hParam> *param)
+{
+ int points = 0;
+ int et = 0;
+ bool hasNormal = false;
+ bool hasDistance = false;
+ int i;
+
+ Entity e = {};
+ EntReqTable::GetRequestInfo(type, extraPoints,
+ &et, &points, &hasNormal, &hasDistance);
+
+ // Generate the entity that's specific to this request.
+ e.type = et;
+ e.extraPoints = extraPoints;
+ e.group = group;
+ e.style = style;
+ e.workplane = workplane;
+ e.construction = construction;
+ e.str = str;
+ e.font = font;
+ e.h = h.entity(0);
+
+ // And generate entities for the points
+ for(i = 0; i < points; i++) {
+ Entity p = {};
+ p.workplane = workplane;
+ // points start from entity 1, except for datum point case
+ p.h = h.entity(i+(et ? 1 : 0));
+ p.group = group;
+ p.style = style;
+
+ if(workplane.v == Entity::FREE_IN_3D.v) {
+ p.type = Entity::POINT_IN_3D;
+ // params for x y z
+ p.param[0] = AddParam(param, h.param(16 + 3*i + 0));
+ p.param[1] = AddParam(param, h.param(16 + 3*i + 1));
+ p.param[2] = AddParam(param, h.param(16 + 3*i + 2));
+ } else {
+ p.type = Entity::POINT_IN_2D;
+ // params for u v
+ p.param[0] = AddParam(param, h.param(16 + 3*i + 0));
+ p.param[1] = AddParam(param, h.param(16 + 3*i + 1));
+ }
+ entity->Add(&p);
+ e.point[i] = p.h;
+ }
+ if(hasNormal) {
+ Entity n = {};
+ n.workplane = workplane;
+ n.h = h.entity(32);
+ n.group = group;
+ n.style = style;
+ if(workplane.v == Entity::FREE_IN_3D.v) {
+ n.type = Entity::NORMAL_IN_3D;
+ n.param[0] = AddParam(param, h.param(32+0));
+ n.param[1] = AddParam(param, h.param(32+1));
+ n.param[2] = AddParam(param, h.param(32+2));
+ n.param[3] = AddParam(param, h.param(32+3));
+ } else {
+ n.type = Entity::NORMAL_IN_2D;
+ // and this is just a copy of the workplane quaternion,
+ // so no params required
+ }
+ if(points < 1) oops();
+ // The point determines where the normal gets displayed on-screen;
+ // it's entirely cosmetic.
+ n.point[0] = e.point[0];
+ entity->Add(&n);
+ e.normal = n.h;
+ }
+ if(hasDistance) {
+ Entity d = {};
+ d.workplane = workplane;
+ d.h = h.entity(64);
+ d.group = group;
+ d.style = style;
+ d.type = Entity::DISTANCE;
+ d.param[0] = AddParam(param, h.param(64));
+ entity->Add(&d);
+ e.distance = d.h;
+ }
+
+ if(et) entity->Add(&e);
+}
+
+std::string Request::DescriptionString(void) {
+ const char *s;
+ if(h.v == Request::HREQUEST_REFERENCE_XY.v) {
+ s = "#XY";
+ } else if(h.v == Request::HREQUEST_REFERENCE_YZ.v) {
+ s = "#YZ";
+ } else if(h.v == Request::HREQUEST_REFERENCE_ZX.v) {
+ s = "#ZX";
+ } else {
+ s = EntReqTable::DescriptionForRequest(type);
+ }
+
+ return ssprintf("r%03x-%s", h.v, s);
+}
+
+int Request::IndexOfPoint(hEntity he) {
+ if(type == DATUM_POINT) {
+ return (he.v == h.entity(0).v) ? 0 : -1;
+ }
+ for(int i = 0; i < MAX_POINTS_IN_ENTITY; i++) {
+ if(he.v == h.entity(i + 1).v) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+hParam Request::AddParam(IdList<Param,hParam> *param, hParam hp) {
+ Param pa = {};
+ pa.h = hp;
+ param->Add(&pa);
+ return hp;
+}
+
--- /dev/null
+//-----------------------------------------------------------------------------
+// The parametric structure of our sketch, in multiple groups, that generate
+// geometric entities and surfaces.
+//
+// Copyright 2008-2013 Jonathan Westhues.
+//-----------------------------------------------------------------------------
+
+#ifndef __SKETCH_H
+#define __SKETCH_H
+
+class hGroup;
+class hRequest;
+class hEntity;
+class hParam;
+class hStyle;
+class hConstraint;
+class hEquation;
+
+class Entity;
+class Param;
+class Equation;
+class Style;
+
+
+// All of the hWhatever handles are a 32-bit ID, that is used to represent
+// some data structure in the sketch.
+class hGroup {
+public:
+ // bits 15: 0 -- group index
+ uint32_t v;
+
+ inline hEntity entity(int i);
+ inline hParam param(int i);
+ inline hEquation equation(int i);
+};
+class hRequest {
+public:
+ // bits 15: 0 -- request index
+ uint32_t v;
+
+ inline hEntity entity(int i);
+ inline hParam param(int i);
+
+ inline bool IsFromReferences(void);
+};
+class hEntity {
+public:
+ // bits 15: 0 -- entity index
+ // 31:16 -- request index
+ uint32_t v;
+
+ inline bool isFromRequest(void);
+ inline hRequest request(void);
+ inline hGroup group(void);
+ inline hEquation equation(int i);
+};
+class hParam {
+public:
+ // bits 15: 0 -- param index
+ // 31:16 -- request index
+ uint32_t v;
+
+ inline hRequest request(void);
+};
+
+class hStyle {
+public:
+ uint32_t v;
+};
+
+
+class EntityId {
+public:
+ uint32_t v; // entity ID, starting from 0
+};
+class EntityMap {
+public:
+ int tag;
+
+ EntityId h;
+ hEntity input;
+ int copyNumber;
+ // (input, copyNumber) gets mapped to ((Request)xxx).entity(h.v)
+
+ void Clear(void) {}
+};
+
+// A set of requests. Every request must have an associated group.
+class Group {
+public:
+ static const hGroup HGROUP_REFERENCES;
+
+ int tag;
+ hGroup h;
+
+ enum {
+ DRAWING_3D = 5000,
+ DRAWING_WORKPLANE = 5001,
+ EXTRUDE = 5100,
+ LATHE = 5101,
+ ROTATE = 5200,
+ TRANSLATE = 5201,
+ LINKED = 5300
+ };
+ int type;
+
+ int order;
+
+ hGroup opA;
+ hGroup opB;
+ bool visible;
+ bool suppress;
+ bool relaxConstraints;
+ bool allowRedundant;
+ bool allDimsReference;
+ double scale;
+
+ bool clean;
+ hEntity activeWorkplane;
+ double valA;
+ double valB;
+ double valC;
+ RgbaColor color;
+
+ struct {
+ int how;
+ int dof;
+ List<hConstraint> remove;
+ } solved;
+
+ enum {
+ // For drawings in 2d
+ WORKPLANE_BY_POINT_ORTHO = 6000,
+ WORKPLANE_BY_LINE_SEGMENTS = 6001,
+ // For extrudes, translates, and rotates
+ ONE_SIDED = 7000,
+ TWO_SIDED = 7001
+ };
+ int subtype;
+
+ bool skipFirst; // for step and repeat ops
+
+ struct {
+ Quaternion q;
+ hEntity origin;
+ hEntity entityB;
+ hEntity entityC;
+ bool swapUV;
+ bool negateU;
+ bool negateV;
+ } predef;
+
+ SPolygon polyLoops;
+ SBezierLoopSetSet bezierLoops;
+ SBezierList bezierOpens;
+ enum {
+ POLY_GOOD = 0,
+ POLY_NOT_CLOSED = 1,
+ POLY_NOT_COPLANAR = 2,
+ POLY_SELF_INTERSECTING = 3,
+ POLY_ZERO_LEN_EDGE = 4
+ };
+ struct {
+ int how;
+ SEdge notClosedAt;
+ Vector errorPointAt;
+ } polyError;
+
+ bool booleanFailed;
+
+ SShell thisShell;
+ SShell runningShell;
+
+ SMesh thisMesh;
+ SMesh runningMesh;
+
+ bool displayDirty;
+ SMesh displayMesh;
+ SEdgeList displayEdges;
+ SOutlineList displayOutlines;
+
+ enum {
+ COMBINE_AS_UNION = 0,
+ COMBINE_AS_DIFFERENCE = 1,
+ COMBINE_AS_ASSEMBLE = 2
+ };
+ int meshCombine;
+
+ bool forceToMesh;
+
+ IdList<EntityMap,EntityId> remap;
+ enum { REMAP_PRIME = 19477 };
+ int remapCache[REMAP_PRIME];
+
+ std::string linkFile;
+ std::string linkFileRel;
+ SMesh impMesh;
+ SShell impShell;
+ EntityList impEntity;
+
+ std::string name;
+
+
+ void Activate(void);
+ std::string DescriptionString(void);
+ void Clear(void);
+
+ static void AddParam(ParamList *param, hParam hp, double v);
+ void Generate(EntityList *entity, ParamList *param);
+ bool IsSolvedOkay();
+ void TransformImportedBy(Vector t, Quaternion q);
+ // When a request generates entities from entities, and the source
+ // entities may have come from multiple requests, it's necessary to
+ // remap the entity ID so that it's still unique. We do this with a
+ // mapping list.
+ enum {
+ REMAP_LAST = 1000,
+ REMAP_TOP = 1001,
+ REMAP_BOTTOM = 1002,
+ REMAP_PT_TO_LINE = 1003,
+ REMAP_LINE_TO_FACE = 1004,
+ REMAP_LATHE_START = 1006,
+ REMAP_LATHE_END = 1007,
+ REMAP_PT_TO_ARC = 1008,
+ REMAP_PT_TO_NORMAL = 1009,
+ };
+ hEntity Remap(hEntity in, int copyNumber);
+ void MakeExtrusionLines(EntityList *el, hEntity in);
+ void MakeLatheCircles(IdList<Entity,hEntity> *el, IdList<Param,hParam> *param, hEntity in, Vector pt, Vector axis, int ai);
+ void MakeExtrusionTopBottomFaces(EntityList *el, hEntity pt);
+ void CopyEntity(EntityList *el,
+ Entity *ep, int timesApplied, int remap,
+ hParam dx, hParam dy, hParam dz,
+ hParam qw, hParam qvx, hParam qvy, hParam qvz,
+ bool asTrans, bool asAxisAngle);
+
+ void AddEq(IdList<Equation,hEquation> *l, Expr *expr, int index);
+ void GenerateEquations(IdList<Equation,hEquation> *l);
+ bool IsVisible(void);
+ int GetNumConstraints();
+ Vector ExtrusionGetVector();
+ void ExtrusionForceVectorTo(const Vector &v);
+
+ // Assembling the curves into loops, and into a piecewise linear polygon
+ // at the same time.
+ void AssembleLoops(bool *allClosed, bool *allCoplanar, bool *allNonZeroLen);
+ void GenerateLoops(void);
+ // And the mesh stuff
+ Group *PreviousGroup(void);
+ Group *RunningMeshGroup(void);
+ bool IsMeshGroup();
+ void GenerateShellAndMesh(void);
+ template<class T> void GenerateForStepAndRepeat(T *steps, T *outs);
+ template<class T> void GenerateForBoolean(T *a, T *b, T *o, int how);
+ void GenerateDisplayItems(void);
+ void DrawDisplayItems(int t);
+ void Draw(void);
+ RgbaColor GetLoopSetFillColor(SBezierLoopSet *sbls,
+ bool *allSame, Vector *errorAt);
+ void FillLoopSetAsPolygon(SBezierLoopSet *sbls);
+ void DrawFilledPaths(void);
+
+ SPolygon GetPolygon(void);
+
+ static void MenuGroup(int id);
+};
+
+// A user request for some primitive or derived operation; for example a
+// line, or a step and repeat.
+class Request {
+public:
+ // Some predefined requests, that are present in every sketch.
+ static const hRequest HREQUEST_REFERENCE_XY;
+ static const hRequest HREQUEST_REFERENCE_YZ;
+ static const hRequest HREQUEST_REFERENCE_ZX;
+
+ int tag;
+ hRequest h;
+
+ // Types of requests
+ enum {
+ WORKPLANE = 100,
+ DATUM_POINT = 101,
+ LINE_SEGMENT = 200,
+ CUBIC = 300,
+ CUBIC_PERIODIC = 301,
+ CIRCLE = 400,
+ ARC_OF_CIRCLE = 500,
+ TTF_TEXT = 600
+ };
+
+ int type;
+ int extraPoints;
+
+ hEntity workplane; // or Entity::FREE_IN_3D
+ hGroup group;
+ hStyle style;
+
+ bool construction;
+ std::string str;
+ std::string font;
+
+ static hParam AddParam(ParamList *param, hParam hp);
+ void Generate(EntityList *entity, ParamList *param);
+
+ std::string DescriptionString(void);
+ int IndexOfPoint(hEntity he);
+
+ void Clear(void) {}
+};
+
+#define MAX_POINTS_IN_ENTITY (12)
+class EntityBase {
+public:
+ int tag;
+ hEntity h;
+
+ static const hEntity FREE_IN_3D;
+ static const hEntity NO_ENTITY;
+
+ enum {
+ POINT_IN_3D = 2000,
+ POINT_IN_2D = 2001,
+ POINT_N_TRANS = 2010,
+ POINT_N_ROT_TRANS = 2011,
+ POINT_N_COPY = 2012,
+ POINT_N_ROT_AA = 2013,
+
+ NORMAL_IN_3D = 3000,
+ NORMAL_IN_2D = 3001,
+ NORMAL_N_COPY = 3010,
+ NORMAL_N_ROT = 3011,
+ NORMAL_N_ROT_AA = 3012,
+
+ DISTANCE = 4000,
+ DISTANCE_N_COPY = 4001,
+
+ FACE_NORMAL_PT = 5000,
+ FACE_XPROD = 5001,
+ FACE_N_ROT_TRANS = 5002,
+ FACE_N_TRANS = 5003,
+ FACE_N_ROT_AA = 5004,
+
+
+ WORKPLANE = 10000,
+ LINE_SEGMENT = 11000,
+ CUBIC = 12000,
+ CUBIC_PERIODIC = 12001,
+ CIRCLE = 13000,
+ ARC_OF_CIRCLE = 14000,
+ TTF_TEXT = 15000
+ };
+
+ int type;
+
+ hGroup group;
+ hEntity workplane; // or Entity::FREE_IN_3D
+
+ // When it comes time to draw an entity, we look here to get the
+ // defining variables.
+ hEntity point[MAX_POINTS_IN_ENTITY];
+ int extraPoints;
+ hEntity normal;
+ hEntity distance;
+ // The only types that have their own params are points, normals,
+ // and directions.
+ hParam param[7];
+
+ // Transformed points/normals/distances have their numerical base
+ Vector numPoint;
+ Quaternion numNormal;
+ double numDistance;
+
+ std::string str;
+ std::string font;
+
+ // For entities that are derived by a transformation, the number of
+ // times to apply the transformation.
+ int timesApplied;
+
+ Quaternion GetAxisAngleQuaternion(int param0);
+ ExprQuaternion GetAxisAngleQuaternionExprs(int param0);
+
+ bool IsCircle(void);
+ Expr *CircleGetRadiusExpr(void);
+ double CircleGetRadiusNum(void);
+ void ArcGetAngles(double *thetaa, double *thetab, double *dtheta);
+
+ bool HasVector(void);
+ ExprVector VectorGetExprs(void);
+ Vector VectorGetNum(void);
+ Vector VectorGetRefPoint(void);
+ Vector VectorGetStartPoint(void);
+
+ // For distances
+ bool IsDistance(void);
+ double DistanceGetNum(void);
+ Expr *DistanceGetExpr(void);
+ void DistanceForceTo(double v);
+
+ bool IsWorkplane(void);
+ // The plane is points P such that P dot (xn, yn, zn) - d = 0
+ void WorkplaneGetPlaneExprs(ExprVector *n, Expr **d);
+ ExprVector WorkplaneGetOffsetExprs(void);
+ Vector WorkplaneGetOffset(void);
+ EntityBase *Normal(void);
+
+ bool IsFace(void);
+ ExprVector FaceGetNormalExprs(void);
+ Vector FaceGetNormalNum(void);
+ ExprVector FaceGetPointExprs(void);
+ Vector FaceGetPointNum(void);
+
+ bool IsPoint(void);
+ // Applies for any of the point types
+ Vector PointGetNum(void);
+ ExprVector PointGetExprs(void);
+ void PointGetExprsInWorkplane(hEntity wrkpl, Expr **u, Expr **v);
+ void PointForceTo(Vector v);
+ // These apply only the POINT_N_ROT_TRANS, which has an assoc rotation
+ Quaternion PointGetQuaternion(void);
+ void PointForceQuaternionTo(Quaternion q);
+
+ bool IsNormal(void);
+ // Applies for any of the normal types
+ Quaternion NormalGetNum(void);
+ ExprQuaternion NormalGetExprs(void);
+ void NormalForceTo(Quaternion q);
+
+ Vector NormalU(void);
+ Vector NormalV(void);
+ Vector NormalN(void);
+ ExprVector NormalExprsU(void);
+ ExprVector NormalExprsV(void);
+ ExprVector NormalExprsN(void);
+
+ Vector CubicGetStartNum(void);
+ Vector CubicGetFinishNum(void);
+ ExprVector CubicGetStartTangentExprs(void);
+ ExprVector CubicGetFinishTangentExprs(void);
+ Vector CubicGetStartTangentNum(void);
+ Vector CubicGetFinishTangentNum(void);
+
+ bool HasEndpoints(void);
+ Vector EndpointStart();
+ Vector EndpointFinish();
+
+ void AddEq(IdList<Equation,hEquation> *l, Expr *expr, int index);
+ void GenerateEquations(IdList<Equation,hEquation> *l);
+
+ void Clear(void) {}
+};
+
+class Entity : public EntityBase {
+public:
+ // Necessary for Entity e = {} to zero-initialize, since
+ // classes with base classes are not aggregates and
+ // the default constructor does not initialize members.
+ //
+ // Note EntityBase({}); without explicitly value-initializing
+ // the base class, MSVC2013 will default-initialize it, leaving
+ // POD members with indeterminate value.
+ Entity() : EntityBase({}), forceHidden(), actPoint(), actNormal(),
+ actDistance(), actVisible(), style(), construction(),
+ beziers(), edges(), edgesChordTol(), screenBBox(), screenBBoxValid(),
+ dogd() {};
+
+ // A linked entity that was hidden in the source file ends up hidden
+ // here too.
+ bool forceHidden;
+
+ // All points/normals/distances have their numerical value; this is
+ // a convenience, to simplify the link/assembly code, so that the
+ // part is entirely described by the entities.
+ Vector actPoint;
+ Quaternion actNormal;
+ double actDistance;
+ // and the shown state also gets saved here, for later import
+ bool actVisible;
+
+ hStyle style;
+ bool construction;
+
+ SBezierList beziers;
+ SEdgeList edges;
+ double edgesChordTol;
+ BBox screenBBox;
+ bool screenBBoxValid;
+
+ // Routines to draw and hit-test the representation of the entity
+ // on-screen.
+ struct {
+ bool drawing;
+ Point2d mp;
+ double dmin;
+ Vector refp;
+ double lineWidth;
+ double stippleScale;
+ int stippleType;
+ int data;
+ } dogd; // state for drawing or getting distance (for hit testing)
+ void LineDrawOrGetDistance(Vector a, Vector b, bool maybeFat=false, int userData = -1);
+ void DrawOrGetDistance(void);
+
+ bool IsStylable();
+ bool IsVisible(void);
+ bool PointIsFromReferences(void);
+
+ void ComputeInterpolatingSpline(SBezierList *sbl, bool periodic);
+ void GenerateBezierCurves(SBezierList *sbl);
+ void GenerateEdges(SEdgeList *el, bool includingConstruction=false);
+
+ static void DrawAll(bool drawAsHidden);
+ void Draw(bool drawAsHidden);
+ double GetDistance(Point2d mp);
+ Vector GetReferencePos(void);
+
+ void CalculateNumerical(bool forExport);
+
+ std::string DescriptionString(void);
+
+ SBezierList *GetOrGenerateBezierCurves();
+ SEdgeList *GetOrGenerateEdges();
+ BBox GetOrGenerateScreenBBox(bool *hasBBox);
+
+ void Clear() {
+ beziers.l.Clear();
+ edges.l.Clear();
+ }
+};
+
+class EntReqTable {
+public:
+ typedef struct {
+ int reqType;
+ int entType;
+ int points;
+ bool useExtraPoints;
+ bool hasNormal;
+ bool hasDistance;
+ const char *description;
+ } TableEntry;
+
+ static const TableEntry Table[];
+
+ static const char *DescriptionForRequest(int req);
+ static void CopyEntityInfo(const TableEntry *te, int extraPoints,
+ int *ent, int *req, int *pts, bool *hasNormal, bool *hasDistance);
+ static bool GetRequestInfo(int req, int extraPoints,
+ int *ent, int *pts, bool *hasNormal, bool *hasDistance);
+ static bool GetEntityInfo(int ent, int extraPoints,
+ int *req, int *pts, bool *hasNormal, bool *hasDistance);
+ static int GetRequestForEntity(int ent);
+};
+
+class Param {
+public:
+ int tag;
+ hParam h;
+
+ double val;
+ bool known;
+ bool free;
+
+ // Used only in the solver
+ hParam substd;
+
+ static const hParam NO_PARAM;
+
+ void Clear(void) {}
+};
+
+
+class hConstraint {
+public:
+ uint32_t v;
+
+ inline hEquation equation(int i);
+};
+
+class ConstraintBase {
+public:
+ int tag;
+ hConstraint h;
+
+ static const hConstraint NO_CONSTRAINT;
+
+ enum {
+ POINTS_COINCIDENT = 20,
+ PT_PT_DISTANCE = 30,
+ PT_PLANE_DISTANCE = 31,
+ PT_LINE_DISTANCE = 32,
+ PT_FACE_DISTANCE = 33,
+ PROJ_PT_DISTANCE = 34,
+ PT_IN_PLANE = 41,
+ PT_ON_LINE = 42,
+ PT_ON_FACE = 43,
+ EQUAL_LENGTH_LINES = 50,
+ LENGTH_RATIO = 51,
+ EQ_LEN_PT_LINE_D = 52,
+ EQ_PT_LN_DISTANCES = 53,
+ EQUAL_ANGLE = 54,
+ EQUAL_LINE_ARC_LEN = 55,
+ LENGTH_DIFFERENCE = 56,
+ SYMMETRIC = 60,
+ SYMMETRIC_HORIZ = 61,
+ SYMMETRIC_VERT = 62,
+ SYMMETRIC_LINE = 63,
+ AT_MIDPOINT = 70,
+ HORIZONTAL = 80,
+ VERTICAL = 81,
+ DIAMETER = 90,
+ PT_ON_CIRCLE = 100,
+ SAME_ORIENTATION = 110,
+ ANGLE = 120,
+ PARALLEL = 121,
+ PERPENDICULAR = 122,
+ ARC_LINE_TANGENT = 123,
+ CUBIC_LINE_TANGENT = 124,
+ CURVE_CURVE_TANGENT = 125,
+ EQUAL_RADIUS = 130,
+ WHERE_DRAGGED = 200,
+
+ COMMENT = 1000
+ };
+
+ int type;
+
+ hGroup group;
+ hEntity workplane;
+
+ // These are the parameters for the constraint.
+ double valA;
+ hEntity ptA;
+ hEntity ptB;
+ hEntity entityA;
+ hEntity entityB;
+ hEntity entityC;
+ hEntity entityD;
+ bool other;
+ bool other2;
+
+ bool reference; // a ref dimension, that generates no eqs
+ std::string comment; // since comments are represented as constraints
+
+ bool HasLabel(void);
+
+ void Generate(IdList<Equation,hEquation> *l);
+ void GenerateReal(IdList<Equation,hEquation> *l);
+ // Some helpers when generating symbolic constraint equations
+ void ModifyToSatisfy(void);
+ void AddEq(IdList<Equation,hEquation> *l, Expr *expr, int index);
+ static Expr *DirectionCosine(hEntity wrkpl, ExprVector ae, ExprVector be);
+ static Expr *Distance(hEntity workplane, hEntity pa, hEntity pb);
+ static Expr *PointLineDistance(hEntity workplane, hEntity pt, hEntity ln);
+ static Expr *PointPlaneDistance(ExprVector p, hEntity plane);
+ static Expr *VectorsParallel(int eq, ExprVector a, ExprVector b);
+ static ExprVector PointInThreeSpace(hEntity workplane, Expr *u, Expr *v);
+
+ void Clear(void) {}
+};
+
+class Constraint : public ConstraintBase {
+public:
+ // See Entity::Entity().
+ Constraint() : ConstraintBase({}), disp(), dogd() {}
+
+ // These define how the constraint is drawn on-screen.
+ struct {
+ Vector offset;
+ hStyle style;
+ } disp;
+
+ // State for drawing or getting distance (for hit testing).
+ struct {
+ bool drawing;
+ Point2d mp;
+ double dmin;
+ Vector refp;
+ SEdgeList *sel;
+ } dogd;
+
+ double GetDistance(Point2d mp);
+ Vector GetLabelPos(void);
+ Vector GetReferencePos(void);
+ void Draw(void);
+ void GetEdges(SEdgeList *sel);
+ bool IsStylable();
+ hStyle GetStyle() const;
+ bool HasLabel();
+
+ void LineDrawOrGetDistance(Vector a, Vector b);
+ bool IsVisible() const;
+ void DrawOrGetDistance(Vector *labelPos);
+ std::string Label(void);
+ bool DoLineExtend(Vector p0, Vector p1, Vector pt, double salient);
+ void DoArcForAngle(Vector a0, Vector da, Vector b0, Vector db,
+ Vector offset, Vector *ref, bool trim);
+ void DoArrow(Vector p, Vector dir, Vector n, double width, double angle, double da);
+ void DoLineWithArrows(Vector ref, Vector a, Vector b, bool onlyOneExt);
+ int DoLineTrimmedAgainstBox(Vector ref, Vector a, Vector b, bool extend, Vector gr, Vector gu, double swidth, double sheight);
+ int DoLineTrimmedAgainstBox(Vector ref, Vector a, Vector b, bool extend = true);
+ void DoLabel(Vector ref, Vector *labelPos, Vector gr, Vector gu);
+ void StippledLine(Vector a, Vector b);
+ void DoProjectedPoint(Vector *p);
+ void DoEqualLenTicks(Vector a, Vector b, Vector gn);
+ void DoEqualRadiusTicks(hEntity he);
+
+ std::string DescriptionString(void);
+
+ static hConstraint AddConstraint(Constraint *c, bool rememberForUndo);
+ static hConstraint AddConstraint(Constraint *c);
+ static void MenuConstrain(int id);
+ static void DeleteAllConstraintsFor(int type, hEntity entityA, hEntity ptA);
+
+ static hConstraint ConstrainCoincident(hEntity ptA, hEntity ptB);
+ static hConstraint Constrain(int type, hEntity ptA, hEntity ptB, hEntity entityA);
+ static hConstraint Constrain(int type, hEntity ptA, hEntity ptB,
+ hEntity entityA, hEntity entityB,
+ bool other, bool other2);
+};
+
+class hEquation {
+public:
+ uint32_t v;
+
+ inline bool isFromConstraint(void);
+ inline hConstraint constraint(void);
+};
+
+class Equation {
+public:
+ int tag;
+ hEquation h;
+
+ Expr *e;
+
+ void Clear(void) {}
+};
+
+
+class Style {
+public:
+ int tag;
+ hStyle h;
+
+ enum {
+ STIPPLE_CONTINUOUS = 0,
+ STIPPLE_DASH = 1,
+ STIPPLE_LONG_DASH = 2,
+ STIPPLE_DASH_DOT = 3,
+ STIPPLE_DASH_DOT_DOT = 4,
+ STIPPLE_DOT = 5,
+ STIPPLE_FREEHAND = 6,
+ STIPPLE_ZIGZAG = 7,
+
+ LAST_STIPPLE = STIPPLE_ZIGZAG
+ };
+
+ enum {
+ // If an entity has no style, then it will be colored according to
+ // whether the group that it's in is active or not, whether it's
+ // construction or not, and so on.
+ NO_STYLE = 0,
+
+ ACTIVE_GRP = 1,
+ CONSTRUCTION = 2,
+ INACTIVE_GRP = 3,
+ DATUM = 4,
+ SOLID_EDGE = 5,
+ CONSTRAINT = 6,
+ SELECTED = 7,
+ HOVERED = 8,
+ CONTOUR_FILL = 9,
+ NORMALS = 10,
+ ANALYZE = 11,
+ DRAW_ERROR = 12,
+ DIM_SOLID = 13,
+ HIDDEN_EDGE = 14,
+ OUTLINE = 15,
+
+ FIRST_CUSTOM = 0x100
+ };
+
+ std::string name;
+
+ enum {
+ UNITS_AS_PIXELS = 0,
+ UNITS_AS_MM = 1
+ };
+ double width;
+ int widthAs;
+ double textHeight;
+ int textHeightAs;
+ enum {
+ ORIGIN_LEFT = 0x01,
+ ORIGIN_RIGHT = 0x02,
+ ORIGIN_BOT = 0x04,
+ ORIGIN_TOP = 0x08
+ };
+ int textOrigin;
+ double textAngle;
+ RgbaColor color;
+ bool filled;
+ RgbaColor fillColor;
+ bool visible;
+ bool exportable;
+ int stippleType;
+ double stippleScale;
+ int zIndex;
+
+ // The default styles, for entities that don't have a style assigned yet,
+ // and for datums and such.
+ typedef struct {
+ hStyle h;
+ const char *cnfPrefix;
+ RgbaColor color;
+ double width;
+ int zIndex;
+ } Default;
+ static const Default Defaults[];
+
+ static std::string CnfColor(const std::string &prefix);
+ static std::string CnfWidth(const std::string &prefix);
+ static std::string CnfTextHeight(const std::string &prefix);
+ static std::string CnfPrefixToName(const std::string &prefix);
+
+ static void CreateAllDefaultStyles(void);
+ static void CreateDefaultStyle(hStyle h);
+ static void FillDefaultStyle(Style *s, const Default *d = NULL, bool factory = false);
+ static void FreezeDefaultStyles(void);
+ static void LoadFactoryDefaults(void);
+
+ static void AssignSelectionToStyle(uint32_t v);
+ static uint32_t CreateCustomStyle(bool rememberForUndo = true);
+
+ static RgbaColor RewriteColor(RgbaColor rgb);
+
+ static Style *Get(hStyle hs);
+ static RgbaColor Color(hStyle hs, bool forExport=false);
+ static RgbaColor FillColor(hStyle hs, bool forExport=false);
+ static float Width(hStyle hs);
+ static RgbaColor Color(int hs, bool forExport=false);
+ static float Width(int hs);
+ static double WidthMm(int hs);
+ static double TextHeight(hStyle hs);
+ static double DefaultTextHeight();
+ static bool Exportable(int hs);
+ static hStyle ForEntity(hEntity he);
+ static int PatternType(hStyle hs);
+ static double StippleScaleMm(hStyle hs);
+
+ std::string DescriptionString(void);
+
+ void Clear(void) {}
+};
+
+
+inline hEntity hGroup::entity(int i)
+ { hEntity r; r.v = 0x80000000 | (v << 16) | (uint32_t)i; return r; }
+inline hParam hGroup::param(int i)
+ { hParam r; r.v = 0x80000000 | (v << 16) | (uint32_t)i; return r; }
+inline hEquation hGroup::equation(int i)
+ { hEquation r; r.v = (v << 16) | 0x80000000 | (uint32_t)i; return r; }
+
+inline bool hRequest::IsFromReferences(void) {
+ if(v == Request::HREQUEST_REFERENCE_XY.v) return true;
+ if(v == Request::HREQUEST_REFERENCE_YZ.v) return true;
+ if(v == Request::HREQUEST_REFERENCE_ZX.v) return true;
+ return false;
+}
+inline hEntity hRequest::entity(int i)
+ { hEntity r; r.v = (v << 16) | (uint32_t)i; return r; }
+inline hParam hRequest::param(int i)
+ { hParam r; r.v = (v << 16) | (uint32_t)i; return r; }
+
+inline bool hEntity::isFromRequest(void)
+ { if(v & 0x80000000) return false; else return true; }
+inline hRequest hEntity::request(void)
+ { hRequest r; r.v = (v >> 16); return r; }
+inline hGroup hEntity::group(void)
+ { hGroup r; r.v = (v >> 16) & 0x3fff; return r; }
+inline hEquation hEntity::equation(int i)
+ { if(i != 0) oops(); hEquation r; r.v = v | 0x40000000; return r; }
+
+inline hRequest hParam::request(void)
+ { hRequest r; r.v = (v >> 16); return r; }
+
+
+inline hEquation hConstraint::equation(int i)
+ { hEquation r; r.v = (v << 16) | (uint32_t)i; return r; }
+
+inline bool hEquation::isFromConstraint(void)
+ { if(v & 0xc0000000) return false; else return true; }
+inline hConstraint hEquation::constraint(void)
+ { hConstraint r; r.v = (v >> 16); return r; }
+
+// The format for entities stored on the clipboard.
+class ClipboardRequest {
+public:
+ int type;
+ int extraPoints;
+ hStyle style;
+ std::string str;
+ std::string font;
+ bool construction;
+
+ Vector point[MAX_POINTS_IN_ENTITY];
+ double distance;
+
+ hEntity oldEnt;
+ hEntity oldPointEnt[MAX_POINTS_IN_ENTITY];
+ hRequest newReq;
+};
+
+#endif
--- /dev/null
+//-----------------------------------------------------------------------------
+// Entry point in to the program, our registry-stored settings and top-level
+// housekeeping when we open, save, and create new files.
+//
+// Copyright 2008-2013 Jonathan Westhues.
+//-----------------------------------------------------------------------------
+#include "solvespace.h"
+#include "config.h"
+
+SolveSpaceUI SolveSpace::SS = {};
+Sketch SolveSpace::SK = {};
+
+std::string SolveSpace::RecentFile[MAX_RECENT] = {};
+
+void SolveSpaceUI::Init() {
+ SS.tangentArcRadius = 10.0;
+
+ // Then, load the registry settings.
+ int i;
+ // Default list of colors for the model material
+ modelColor[0] = CnfThawColor(RGBi(150, 150, 150), "ModelColor_0");
+ modelColor[1] = CnfThawColor(RGBi(100, 100, 100), "ModelColor_1");
+ modelColor[2] = CnfThawColor(RGBi( 30, 30, 30), "ModelColor_2");
+ modelColor[3] = CnfThawColor(RGBi(150, 0, 0), "ModelColor_3");
+ modelColor[4] = CnfThawColor(RGBi( 0, 100, 0), "ModelColor_4");
+ modelColor[5] = CnfThawColor(RGBi( 0, 80, 80), "ModelColor_5");
+ modelColor[6] = CnfThawColor(RGBi( 0, 0, 130), "ModelColor_6");
+ modelColor[7] = CnfThawColor(RGBi( 80, 0, 80), "ModelColor_7");
+ // Light intensities
+ lightIntensity[0] = CnfThawFloat(1.0f, "LightIntensity_0");
+ lightIntensity[1] = CnfThawFloat(0.5f, "LightIntensity_1");
+ ambientIntensity = 0.3; // no setting for that yet
+ // Light positions
+ lightDir[0].x = CnfThawFloat(-1.0f, "LightDir_0_Right" );
+ lightDir[0].y = CnfThawFloat( 1.0f, "LightDir_0_Up" );
+ lightDir[0].z = CnfThawFloat( 0.0f, "LightDir_0_Forward" );
+ lightDir[1].x = CnfThawFloat( 1.0f, "LightDir_1_Right" );
+ lightDir[1].y = CnfThawFloat( 0.0f, "LightDir_1_Up" );
+ lightDir[1].z = CnfThawFloat( 0.0f, "LightDir_1_Forward" );
+
+ exportMode = false;
+ // Chord tolerance
+ chordTol = CnfThawFloat(0.5f, "ChordTolerancePct");
+ // Max pwl segments to generate
+ maxSegments = CnfThawInt(10, "MaxSegments");
+ // Chord tolerance
+ exportChordTol = CnfThawFloat(0.1f, "ExportChordTolerance");
+ // Max pwl segments to generate
+ exportMaxSegments = CnfThawInt(64, "ExportMaxSegments");
+ // View units
+ viewUnits = (Unit)CnfThawInt((uint32_t)UNIT_MM, "ViewUnits");
+ // Number of digits after the decimal point
+ afterDecimalMm = CnfThawInt(2, "AfterDecimalMm");
+ afterDecimalInch = CnfThawInt(3, "AfterDecimalInch");
+ // Camera tangent (determines perspective)
+ cameraTangent = CnfThawFloat(0.3f/1e3f, "CameraTangent");
+ // Grid spacing
+ gridSpacing = CnfThawFloat(5.0f, "GridSpacing");
+ // Export scale factor
+ exportScale = CnfThawFloat(1.0f, "ExportScale");
+ // Export offset (cutter radius comp)
+ exportOffset = CnfThawFloat(0.0f, "ExportOffset");
+ // Rewrite exported colors close to white into black (assuming white bg)
+ fixExportColors = CnfThawBool(true, "FixExportColors");
+ // Draw back faces of triangles (when mesh is leaky/self-intersecting)
+ drawBackFaces = CnfThawBool(true, "DrawBackFaces");
+ // Check that contours are closed and not self-intersecting
+ checkClosedContour = CnfThawBool(true, "CheckClosedContour");
+ // Export shaded triangles in a 2d view
+ exportShadedTriangles = CnfThawBool(true, "ExportShadedTriangles");
+ // Export pwl curves (instead of exact) always
+ exportPwlCurves = CnfThawBool(false, "ExportPwlCurves");
+ // Background color on-screen
+ backgroundColor = CnfThawColor(RGBi(0, 0, 0), "BackgroundColor");
+ // Whether export canvas size is fixed or derived from bbox
+ exportCanvasSizeAuto = CnfThawBool(true, "ExportCanvasSizeAuto");
+ // Margins for automatic canvas size
+ exportMargin.left = CnfThawFloat(5.0f, "ExportMargin_Left");
+ exportMargin.right = CnfThawFloat(5.0f, "ExportMargin_Right");
+ exportMargin.bottom = CnfThawFloat(5.0f, "ExportMargin_Bottom");
+ exportMargin.top = CnfThawFloat(5.0f, "ExportMargin_Top");
+ // Dimensions for fixed canvas size
+ exportCanvas.width = CnfThawFloat(100.0f, "ExportCanvas_Width");
+ exportCanvas.height = CnfThawFloat(100.0f, "ExportCanvas_Height");
+ exportCanvas.dx = CnfThawFloat( 5.0f, "ExportCanvas_Dx");
+ exportCanvas.dy = CnfThawFloat( 5.0f, "ExportCanvas_Dy");
+ // Extra parameters when exporting G code
+ gCode.depth = CnfThawFloat(10.0f, "GCode_Depth");
+ gCode.passes = CnfThawInt(1, "GCode_Passes");
+ gCode.feed = CnfThawFloat(10.0f, "GCode_Feed");
+ gCode.plungeFeed = CnfThawFloat(10.0f, "GCode_PlungeFeed");
+ // Show toolbar in the graphics window
+ showToolbar = CnfThawBool(true, "ShowToolbar");
+ // Recent files menus
+ for(i = 0; i < MAX_RECENT; i++) {
+ RecentFile[i] = CnfThawString("", "RecentFile_" + std::to_string(i));
+ }
+ RefreshRecentMenus();
+ // Autosave timer
+ autosaveInterval = CnfThawInt(5, "AutosaveInterval");
+
+ // The default styles (colors, line widths, etc.) are also stored in the
+ // configuration file, but we will automatically load those as we need
+ // them.
+
+ SetAutosaveTimerFor(autosaveInterval);
+
+ NewFile();
+ AfterNewFile();
+}
+
+bool SolveSpaceUI::LoadAutosaveFor(const std::string &filename) {
+ std::string autosaveFile = filename + AUTOSAVE_SUFFIX;
+
+ FILE *f = ssfopen(autosaveFile, "rb");
+ if(!f)
+ return false;
+ fclose(f);
+
+ if(LoadAutosaveYesNo() == DIALOG_YES) {
+ unsaved = true;
+ return LoadFromFile(autosaveFile);
+ }
+
+ return false;
+}
+
+bool SolveSpaceUI::OpenFile(const std::string &filename) {
+ bool autosaveLoaded = LoadAutosaveFor(filename);
+ bool fileLoaded = autosaveLoaded || LoadFromFile(filename);
+ if(fileLoaded)
+ saveFile = filename;
+ bool success = fileLoaded && ReloadAllImported(/*canCancel=*/true);
+ if(success) {
+ AddToRecentList(filename);
+ } else {
+ saveFile = "";
+ NewFile();
+ }
+ AfterNewFile();
+ unsaved = autosaveLoaded;
+ return success;
+}
+
+void SolveSpaceUI::Exit(void) {
+ // Recent files
+ for(int i = 0; i < MAX_RECENT; i++)
+ CnfFreezeString(RecentFile[i], "RecentFile_" + std::to_string(i));
+ // Model colors
+ for(int i = 0; i < MODEL_COLORS; i++)
+ CnfFreezeColor(modelColor[i], "ModelColor_" + std::to_string(i));
+ // Light intensities
+ CnfFreezeFloat((float)lightIntensity[0], "LightIntensity_0");
+ CnfFreezeFloat((float)lightIntensity[1], "LightIntensity_1");
+ // Light directions
+ CnfFreezeFloat((float)lightDir[0].x, "LightDir_0_Right");
+ CnfFreezeFloat((float)lightDir[0].y, "LightDir_0_Up");
+ CnfFreezeFloat((float)lightDir[0].z, "LightDir_0_Forward");
+ CnfFreezeFloat((float)lightDir[1].x, "LightDir_1_Right");
+ CnfFreezeFloat((float)lightDir[1].y, "LightDir_1_Up");
+ CnfFreezeFloat((float)lightDir[1].z, "LightDir_1_Forward");
+ // Chord tolerance
+ CnfFreezeFloat((float)chordTol, "ChordTolerancePct");
+ // Max pwl segments to generate
+ CnfFreezeInt((uint32_t)maxSegments, "MaxSegments");
+ // Export Chord tolerance
+ CnfFreezeFloat((float)exportChordTol, "ExportChordTolerance");
+ // Export Max pwl segments to generate
+ CnfFreezeInt((uint32_t)exportMaxSegments, "ExportMaxSegments");
+ // View units
+ CnfFreezeInt((uint32_t)viewUnits, "ViewUnits");
+ // Number of digits after the decimal point
+ CnfFreezeInt((uint32_t)afterDecimalMm, "AfterDecimalMm");
+ CnfFreezeInt((uint32_t)afterDecimalInch, "AfterDecimalInch");
+ // Camera tangent (determines perspective)
+ CnfFreezeFloat((float)cameraTangent, "CameraTangent");
+ // Grid spacing
+ CnfFreezeFloat(gridSpacing, "GridSpacing");
+ // Export scale
+ CnfFreezeFloat(exportScale, "ExportScale");
+ // Export offset (cutter radius comp)
+ CnfFreezeFloat(exportOffset, "ExportOffset");
+ // Rewrite exported colors close to white into black (assuming white bg)
+ CnfFreezeBool(fixExportColors, "FixExportColors");
+ // Draw back faces of triangles (when mesh is leaky/self-intersecting)
+ CnfFreezeBool(drawBackFaces, "DrawBackFaces");
+ // Check that contours are closed and not self-intersecting
+ CnfFreezeBool(checkClosedContour, "CheckClosedContour");
+ // Export shaded triangles in a 2d view
+ CnfFreezeBool(exportShadedTriangles, "ExportShadedTriangles");
+ // Export pwl curves (instead of exact) always
+ CnfFreezeBool(exportPwlCurves, "ExportPwlCurves");
+ // Background color on-screen
+ CnfFreezeColor(backgroundColor, "BackgroundColor");
+ // Whether export canvas size is fixed or derived from bbox
+ CnfFreezeBool(exportCanvasSizeAuto, "ExportCanvasSizeAuto");
+ // Margins for automatic canvas size
+ CnfFreezeFloat(exportMargin.left, "ExportMargin_Left");
+ CnfFreezeFloat(exportMargin.right, "ExportMargin_Right");
+ CnfFreezeFloat(exportMargin.bottom, "ExportMargin_Bottom");
+ CnfFreezeFloat(exportMargin.top, "ExportMargin_Top");
+ // Dimensions for fixed canvas size
+ CnfFreezeFloat(exportCanvas.width, "ExportCanvas_Width");
+ CnfFreezeFloat(exportCanvas.height, "ExportCanvas_Height");
+ CnfFreezeFloat(exportCanvas.dx, "ExportCanvas_Dx");
+ CnfFreezeFloat(exportCanvas.dy, "ExportCanvas_Dy");
+ // Extra parameters when exporting G code
+ CnfFreezeFloat(gCode.depth, "GCode_Depth");
+ CnfFreezeInt(gCode.passes, "GCode_Passes");
+ CnfFreezeFloat(gCode.feed, "GCode_Feed");
+ CnfFreezeFloat(gCode.plungeFeed, "GCode_PlungeFeed");
+ // Show toolbar in the graphics window
+ CnfFreezeBool(showToolbar, "ShowToolbar");
+ // Autosave timer
+ CnfFreezeInt(autosaveInterval, "AutosaveInterval");
+
+ // And the default styles, colors and line widths and such.
+ Style::FreezeDefaultStyles();
+
+ ExitNow();
+}
+
+void SolveSpaceUI::ScheduleGenerateAll() {
+ if(!later.scheduled) ScheduleLater();
+ later.scheduled = true;
+ later.generateAll = true;
+}
+
+void SolveSpaceUI::ScheduleShowTW() {
+ if(!later.scheduled) ScheduleLater();
+ later.scheduled = true;
+ later.showTW = true;
+}
+
+void SolveSpaceUI::DoLater(void) {
+ if(later.generateAll) GenerateAll();
+ if(later.showTW) TW.Show();
+ later = {};
+}
+
+double SolveSpaceUI::MmPerUnit(void) {
+ if(viewUnits == UNIT_INCHES) {
+ return 25.4;
+ } else {
+ return 1.0;
+ }
+}
+const char *SolveSpaceUI::UnitName(void) {
+ if(viewUnits == UNIT_INCHES) {
+ return "inch";
+ } else {
+ return "mm";
+ }
+}
+std::string SolveSpaceUI::MmToString(double v) {
+ if(viewUnits == UNIT_INCHES) {
+ return ssprintf("%.*f", afterDecimalInch, v/25.4);
+ } else {
+ return ssprintf("%.*f", afterDecimalMm, v);
+ }
+}
+double SolveSpaceUI::ExprToMm(Expr *e) {
+ return (e->Eval()) * MmPerUnit();
+}
+double SolveSpaceUI::StringToMm(const std::string &str) {
+ return std::stod(str) * MmPerUnit();
+}
+double SolveSpaceUI::ChordTolMm(void) {
+ if(exportMode) return ExportChordTolMm();
+ return chordTolCalculated;
+}
+double SolveSpaceUI::ExportChordTolMm(void) {
+ return exportChordTol / exportScale;
+}
+int SolveSpaceUI::GetMaxSegments(void) {
+ if(exportMode) return exportMaxSegments;
+ return maxSegments;
+}
+int SolveSpaceUI::UnitDigitsAfterDecimal(void) {
+ return (viewUnits == UNIT_INCHES) ? afterDecimalInch : afterDecimalMm;
+}
+void SolveSpaceUI::SetUnitDigitsAfterDecimal(int v) {
+ if(viewUnits == UNIT_INCHES) {
+ afterDecimalInch = v;
+ } else {
+ afterDecimalMm = v;
+ }
+}
+
+double SolveSpaceUI::CameraTangent(void) {
+ if(!usePerspectiveProj) {
+ return 0;
+ } else {
+ return cameraTangent;
+ }
+}
+
+void SolveSpaceUI::AfterNewFile(void) {
+ // Clear out the traced point, which is no longer valid
+ traced.point = Entity::NO_ENTITY;
+ traced.path.l.Clear();
+ // and the naked edges
+ nakedEdges.Clear();
+
+ // Quit export mode
+ justExportedInfo.draw = false;
+ exportMode = false;
+
+ // GenerateAll() expects the view to be valid, because it uses that to
+ // fill in default values for extrusion depths etc. (which won't matter
+ // here, but just don't let it work on garbage)
+ SS.GW.offset = Vector::From(0, 0, 0);
+ SS.GW.projRight = Vector::From(1, 0, 0);
+ SS.GW.projUp = Vector::From(0, 1, 0);
+
+ GenerateAll(GENERATE_REGEN);
+
+ TW.Init();
+ GW.Init();
+
+ unsaved = false;
+
+ int w, h;
+ GetGraphicsWindowSize(&w, &h);
+ GW.width = w;
+ GW.height = h;
+
+ // The triangles haven't been generated yet, but zoom to fit the entities
+ // roughly in the window, since that sets the mesh tolerance. Consider
+ // invisible entities, so we still get something reasonable if the only
+ // thing visible is the not-yet-generated surfaces.
+ GW.ZoomToFit(true);
+
+ GenerateAll(GENERATE_ALL);
+ SS.ScheduleShowTW();
+ // Then zoom to fit again, to fit the triangles
+ GW.ZoomToFit(false);
+
+ // Create all the default styles; they'll get created on the fly anyways,
+ // but can't hurt to do it now.
+ Style::CreateAllDefaultStyles();
+
+ UpdateWindowTitle();
+}
+
+void SolveSpaceUI::RemoveFromRecentList(const std::string &filename) {
+ int src, dest;
+ dest = 0;
+ for(src = 0; src < MAX_RECENT; src++) {
+ if(filename != RecentFile[src]) {
+ if(src != dest) RecentFile[dest] = RecentFile[src];
+ dest++;
+ }
+ }
+ while(dest < MAX_RECENT) RecentFile[dest++].clear();
+ RefreshRecentMenus();
+}
+void SolveSpaceUI::AddToRecentList(const std::string &filename) {
+ RemoveFromRecentList(filename);
+
+ int src;
+ for(src = MAX_RECENT - 2; src >= 0; src--) {
+ RecentFile[src+1] = RecentFile[src];
+ }
+ RecentFile[0] = filename;
+ RefreshRecentMenus();
+}
+
+bool SolveSpaceUI::GetFilenameAndSave(bool saveAs) {
+ std::string prevSaveFile = saveFile;
+
+ if(saveAs || saveFile.empty()) {
+ if(!GetSaveFile(&saveFile, "", SlvsFileFilter)) return false;
+ // need to get new filename directly into saveFile, since that
+ // determines linkFileRel path
+ }
+
+ if(SaveToFile(saveFile)) {
+ AddToRecentList(saveFile);
+ RemoveAutosave();
+ unsaved = false;
+ return true;
+ } else {
+ // don't store an invalid save filename
+ saveFile = prevSaveFile;
+ return false;
+ }
+}
+
+bool SolveSpaceUI::Autosave()
+{
+ SetAutosaveTimerFor(autosaveInterval);
+
+ if(!saveFile.empty() && unsaved)
+ return SaveToFile(saveFile + AUTOSAVE_SUFFIX);
+
+ return false;
+}
+
+void SolveSpaceUI::RemoveAutosave()
+{
+ std::string autosaveFile = saveFile + AUTOSAVE_SUFFIX;
+ ssremove(autosaveFile);
+}
+
+bool SolveSpaceUI::OkayToStartNewFile(void) {
+ if(!unsaved) return true;
+
+ switch(SaveFileYesNoCancel()) {
+ case DIALOG_YES:
+ return GetFilenameAndSave(false);
+
+ case DIALOG_NO:
+ RemoveAutosave();
+ return true;
+
+ case DIALOG_CANCEL:
+ return false;
+
+ default: oops(); break;
+ }
+}
+
+void SolveSpaceUI::UpdateWindowTitle(void) {
+ SetCurrentFilename(saveFile);
+}
+
+static std::string Extension(const std::string &filename) {
+ int dot = filename.rfind('.');
+ if(dot >= 0) {
+ std::string ext = filename.substr(dot + 1, filename.length());
+ std::transform(ext.begin(), ext.end(), ext.begin(), ::tolower);
+ return ext;
+ }
+ return "";
+}
+
+void SolveSpaceUI::MenuFile(int id) {
+ if(id >= RECENT_OPEN && id < (RECENT_OPEN+MAX_RECENT)) {
+ if(!SS.OkayToStartNewFile()) return;
+
+ std::string newFile = RecentFile[id - RECENT_OPEN];
+ SS.OpenFile(newFile);
+ return;
+ }
+
+ switch(id) {
+ case GraphicsWindow::MNU_NEW:
+ if(!SS.OkayToStartNewFile()) break;
+
+ SS.saveFile = "";
+ SS.NewFile();
+ SS.AfterNewFile();
+ break;
+
+ case GraphicsWindow::MNU_OPEN: {
+ if(!SS.OkayToStartNewFile()) break;
+
+ std::string newFile;
+ if(GetOpenFile(&newFile, "", SlvsFileFilter)) {
+ SS.OpenFile(newFile);
+ }
+ break;
+ }
+
+ case GraphicsWindow::MNU_SAVE:
+ SS.GetFilenameAndSave(false);
+ break;
+
+ case GraphicsWindow::MNU_SAVE_AS:
+ SS.GetFilenameAndSave(true);
+ break;
+
+ case GraphicsWindow::MNU_EXPORT_PNG: {
+ std::string exportFile;
+ if(!GetSaveFile(&exportFile, "", PngFileFilter)) break;
+ SS.ExportAsPngTo(exportFile);
+ break;
+ }
+
+ case GraphicsWindow::MNU_EXPORT_VIEW: {
+ std::string exportFile;
+ if(!GetSaveFile(&exportFile, CnfThawString("", "ViewExportFormat"),
+ VectorFileFilter)) break;
+ CnfFreezeString(Extension(exportFile), "ViewExportFormat");
+
+ // If the user is exporting something where it would be
+ // inappropriate to include the constraints, then warn.
+ if(SS.GW.showConstraints &&
+ (FilenameHasExtension(exportFile, ".txt") ||
+ fabs(SS.exportOffset) > LENGTH_EPS))
+ {
+ Message("Constraints are currently shown, and will be exported "
+ "in the toolpath. This is probably not what you want; "
+ "hide them by clicking the link at the top of the "
+ "text window.");
+ }
+
+ SS.ExportViewOrWireframeTo(exportFile, false);
+ break;
+ }
+
+ case GraphicsWindow::MNU_EXPORT_WIREFRAME: {
+ std::string exportFile;
+ if(!GetSaveFile(&exportFile, CnfThawString("", "WireframeExportFormat"),
+ Vector3dFileFilter)) break;
+ CnfFreezeString(Extension(exportFile), "WireframeExportFormat");
+
+ SS.ExportViewOrWireframeTo(exportFile, true);
+ break;
+ }
+
+ case GraphicsWindow::MNU_EXPORT_SECTION: {
+ std::string exportFile;
+ if(!GetSaveFile(&exportFile, CnfThawString("", "SectionExportFormat"),
+ VectorFileFilter)) break;
+ CnfFreezeString(Extension(exportFile), "SectionExportFormat");
+
+ SS.ExportSectionTo(exportFile);
+ break;
+ }
+
+ case GraphicsWindow::MNU_EXPORT_MESH: {
+ std::string exportFile;
+ if(!GetSaveFile(&exportFile, CnfThawString("", "MeshExportFormat"),
+ MeshFileFilter)) break;
+ CnfFreezeString(Extension(exportFile), "MeshExportFormat");
+
+ SS.ExportMeshTo(exportFile);
+ break;
+ }
+
+ case GraphicsWindow::MNU_EXPORT_SURFACES: {
+ std::string exportFile;
+ if(!GetSaveFile(&exportFile, CnfThawString("", "SurfacesExportFormat"),
+ SurfaceFileFilter)) break;
+ CnfFreezeString(Extension(exportFile), "SurfacesExportFormat");
+
+ StepFileWriter sfw = {};
+ sfw.ExportSurfacesTo(exportFile);
+ break;
+ }
+
+ case GraphicsWindow::MNU_IMPORT: {
+ std::string importFile;
+ if(!GetOpenFile(&importFile, CnfThawString("", "ImportFormat"),
+ ImportableFileFilter)) break;
+ CnfFreezeString(Extension(importFile), "ImportFormat");
+
+ if(Extension(importFile) == "dxf") {
+ ImportDxf(importFile);
+ } else if(Extension(importFile) == "dwg") {
+ ImportDwg(importFile);
+ } else {
+ Error("Can't identify file type from file extension of "
+ "filename '%s'; try .dxf or .dwg.", importFile.c_str());
+ }
+
+ SS.GenerateAll(SolveSpaceUI::GENERATE_UNTIL_ACTIVE);
+ SS.ScheduleShowTW();
+ break;
+ }
+
+ case GraphicsWindow::MNU_EXIT:
+ if(!SS.OkayToStartNewFile()) break;
+ SS.Exit();
+ break;
+
+ default: oops();
+ }
+
+ SS.UpdateWindowTitle();
+}
+
+void SolveSpaceUI::MenuAnalyze(int id) {
+ SS.GW.GroupSelection();
+#define gs (SS.GW.gs)
+
+ switch(id) {
+ case GraphicsWindow::MNU_STEP_DIM:
+ if(gs.constraints == 1 && gs.n == 0) {
+ Constraint *c = SK.GetConstraint(gs.constraint[0]);
+ if(c->HasLabel() && !c->reference) {
+ SS.TW.shown.dimFinish = c->valA;
+ SS.TW.shown.dimSteps = 10;
+ SS.TW.shown.dimIsDistance =
+ (c->type != Constraint::ANGLE) &&
+ (c->type != Constraint::LENGTH_RATIO) &&
+ (c->type != Constraint::LENGTH_DIFFERENCE);
+ SS.TW.shown.constraint = c->h;
+ SS.TW.shown.screen = TextWindow::SCREEN_STEP_DIMENSION;
+
+ // The step params are specified in the text window,
+ // so force that to be shown.
+ SS.GW.ForceTextWindowShown();
+
+ SS.ScheduleShowTW();
+ SS.GW.ClearSelection();
+ } else {
+ Error("Constraint must have a label, and must not be "
+ "a reference dimension.");
+ }
+ } else {
+ Error("Bad selection for step dimension; select a constraint.");
+ }
+ break;
+
+ case GraphicsWindow::MNU_NAKED_EDGES: {
+ SS.nakedEdges.Clear();
+
+ Group *g = SK.GetGroup(SS.GW.activeGroup);
+ SMesh *m = &(g->displayMesh);
+ SKdNode *root = SKdNode::From(m);
+ bool inters, leaks;
+ root->MakeCertainEdgesInto(&(SS.nakedEdges),
+ SKdNode::NAKED_OR_SELF_INTER_EDGES, true, &inters, &leaks);
+
+ InvalidateGraphics();
+
+ const char *intersMsg = inters ?
+ "The mesh is self-intersecting (NOT okay, invalid)." :
+ "The mesh is not self-intersecting (okay, valid).";
+ const char *leaksMsg = leaks ?
+ "The mesh has naked edges (NOT okay, invalid)." :
+ "The mesh is watertight (okay, valid).";
+
+ std::string cntMsg = ssprintf("\n\nThe model contains %d triangles, from "
+ "%d surfaces.", g->displayMesh.l.n, g->runningShell.surface.n);
+
+ if(SS.nakedEdges.l.n == 0) {
+ Message("%s\n\n%s\n\nZero problematic edges, good.%s",
+ intersMsg, leaksMsg, cntMsg.c_str());
+ } else {
+ Error("%s\n\n%s\n\n%d problematic edges, bad.%s",
+ intersMsg, leaksMsg, SS.nakedEdges.l.n, cntMsg.c_str());
+ }
+ break;
+ }
+
+ case GraphicsWindow::MNU_INTERFERENCE: {
+ SS.nakedEdges.Clear();
+
+ SMesh *m = &(SK.GetGroup(SS.GW.activeGroup)->displayMesh);
+ SKdNode *root = SKdNode::From(m);
+ bool inters, leaks;
+ root->MakeCertainEdgesInto(&(SS.nakedEdges),
+ SKdNode::SELF_INTER_EDGES, false, &inters, &leaks);
+
+ InvalidateGraphics();
+
+ if(inters) {
+ Error("%d edges interfere with other triangles, bad.",
+ SS.nakedEdges.l.n);
+ } else {
+ Message("The assembly does not interfere, good.");
+ }
+ break;
+ }
+
+ case GraphicsWindow::MNU_VOLUME: {
+ SMesh *m = &(SK.GetGroup(SS.GW.activeGroup)->displayMesh);
+
+ double vol = 0;
+ int i;
+ for(i = 0; i < m->l.n; i++) {
+ STriangle tr = m->l.elem[i];
+
+ // Translate to place vertex A at (x, y, 0)
+ Vector trans = Vector::From(tr.a.x, tr.a.y, 0);
+ tr.a = (tr.a).Minus(trans);
+ tr.b = (tr.b).Minus(trans);
+ tr.c = (tr.c).Minus(trans);
+
+ // Rotate to place vertex B on the y-axis. Depending on
+ // whether the triangle is CW or CCW, C is either to the
+ // right or to the left of the y-axis. This handles the
+ // sign of our normal.
+ Vector u = Vector::From(-tr.b.y, tr.b.x, 0);
+ u = u.WithMagnitude(1);
+ Vector v = Vector::From(tr.b.x, tr.b.y, 0);
+ v = v.WithMagnitude(1);
+ Vector n = Vector::From(0, 0, 1);
+
+ tr.a = (tr.a).DotInToCsys(u, v, n);
+ tr.b = (tr.b).DotInToCsys(u, v, n);
+ tr.c = (tr.c).DotInToCsys(u, v, n);
+
+ n = tr.Normal().WithMagnitude(1);
+
+ // Triangles on edge don't contribute
+ if(fabs(n.z) < LENGTH_EPS) continue;
+
+ // The plane has equation p dot n = a dot n
+ double d = (tr.a).Dot(n);
+ // nx*x + ny*y + nz*z = d
+ // nz*z = d - nx*x - ny*y
+ double A = -n.x/n.z, B = -n.y/n.z, C = d/n.z;
+
+ double mac = tr.c.y/tr.c.x, mbc = (tr.c.y - tr.b.y)/tr.c.x;
+ double xc = tr.c.x, yb = tr.b.y;
+
+ // I asked Maple for
+ // int(int(A*x + B*y +C, y=mac*x..(mbc*x + yb)), x=0..xc);
+ double integral =
+ (1.0/3)*(
+ A*(mbc-mac)+
+ (1.0/2)*B*(mbc*mbc-mac*mac)
+ )*(xc*xc*xc)+
+ (1.0/2)*(A*yb+B*yb*mbc+C*(mbc-mac))*xc*xc+
+ C*yb*xc+
+ (1.0/2)*B*yb*yb*xc;
+
+ vol += integral;
+ }
+
+ std::string msg = ssprintf("The volume of the solid model is:\n\n"" %.3f %s^3",
+ vol / pow(SS.MmPerUnit(), 3),
+ SS.UnitName());
+
+ if(SS.viewUnits == SolveSpaceUI::UNIT_MM) {
+ msg += ssprintf("\n %.2f mL", vol/(10*10*10));
+ }
+ msg += "\n\nCurved surfaces have been approximated as triangles.\n"
+ "This introduces error, typically of around 1%.";
+ Message("%s", msg.c_str());
+ break;
+ }
+
+ case GraphicsWindow::MNU_AREA: {
+ Group *g = SK.GetGroup(SS.GW.activeGroup);
+ if(g->polyError.how != Group::POLY_GOOD) {
+ Error("This group does not contain a correctly-formed "
+ "2d closed area. It is open, not coplanar, or self-"
+ "intersecting.");
+ break;
+ }
+ SEdgeList sel = {};
+ g->polyLoops.MakeEdgesInto(&sel);
+ SPolygon sp = {};
+ sel.AssemblePolygon(&sp, NULL, true);
+ sp.normal = sp.ComputeNormal();
+ sp.FixContourDirections();
+ double area = sp.SignedArea();
+ double scale = SS.MmPerUnit();
+ Message("The area of the region sketched in this group is:\n\n"
+ " %.3f %s^2\n\n"
+ "Curves have been approximated as piecewise linear.\n"
+ "This introduces error, typically of around 1%%.",
+ area / (scale*scale),
+ SS.UnitName());
+ sel.Clear();
+ sp.Clear();
+ break;
+ }
+
+ case GraphicsWindow::MNU_SHOW_DOF:
+ // This works like a normal solve, except that it calculates
+ // which variables are free/bound at the same time.
+ SS.GenerateAll(SolveSpaceUI::GENERATE_ALL, true);
+ break;
+
+ case GraphicsWindow::MNU_TRACE_PT:
+ if(gs.points == 1 && gs.n == 1) {
+ SS.traced.point = gs.point[0];
+ SS.GW.ClearSelection();
+ } else {
+ Error("Bad selection for trace; select a single point.");
+ }
+ break;
+
+ case GraphicsWindow::MNU_STOP_TRACING: {
+ std::string exportFile;
+ if(GetSaveFile(&exportFile, "", CsvFileFilter)) {
+ FILE *f = ssfopen(exportFile, "wb");
+ if(f) {
+ int i;
+ SContour *sc = &(SS.traced.path);
+ for(i = 0; i < sc->l.n; i++) {
+ Vector p = sc->l.elem[i].p;
+ double s = SS.exportScale;
+ fprintf(f, "%.10f, %.10f, %.10f\r\n",
+ p.x/s, p.y/s, p.z/s);
+ }
+ fclose(f);
+ } else {
+ Error("Couldn't write to '%s'", exportFile.c_str());
+ }
+ }
+ // Clear the trace, and stop tracing
+ SS.traced.point = Entity::NO_ENTITY;
+ SS.traced.path.l.Clear();
+ InvalidateGraphics();
+ break;
+ }
+
+ default: oops();
+ }
+}
+
+void SolveSpaceUI::MenuHelp(int id) {
+ switch(id) {
+ case GraphicsWindow::MNU_WEBSITE:
+ OpenWebsite("http://solvespace.com/helpmenu");
+ break;
+
+ case GraphicsWindow::MNU_ABOUT:
+ Message(
+"This is SolveSpace version " PACKAGE_VERSION ".\n"
+"\n"
+"For more information, see http://solvespace.com/\n"
+"\n"
+"SolveSpace is free software: you are free to modify\n"
+"and/or redistribute it under the terms of the GNU\n"
+"General Public License (GPL) version 3 or later.\n"
+"\n"
+"There is NO WARRANTY, to the extent permitted by\n"
+"law. For details, visit http://gnu.org/licenses/\n"
+"\n"
+"© 2008-2016 Jonathan Westhues and other authors.\n"
+);
+ break;
+
+ default: oops();
+ }
+}
+
+void SolveSpaceUI::Clear(void) {
+ sys.Clear();
+ for(int i = 0; i < MAX_UNDO; i++) {
+ if(i < undo.cnt) undo.d[i].Clear();
+ if(i < redo.cnt) redo.d[i].Clear();
+ }
+}
+
+void Sketch::Clear(void) {
+ group.Clear();
+ groupOrder.Clear();
+ constraint.Clear();
+ request.Clear();
+ style.Clear();
+ entity.Clear();
+ param.Clear();
+}
+
+BBox Sketch::CalculateEntityBBox(bool includingInvisible) {
+ BBox box = {};
+ bool first = true;
+ for(int i = 0; i < entity.n; i++) {
+ Entity *e = (Entity *)&entity.elem[i];
+ if(!(e->IsVisible() || includingInvisible)) continue;
+
+ Vector point;
+ double r = 0.0;
+ if(e->IsPoint()) {
+ point = e->PointGetNum();
+ } else {
+ switch(e->type) {
+ case Entity::ARC_OF_CIRCLE:
+ case Entity::CIRCLE:
+ r = e->CircleGetRadiusNum();
+ point = GetEntity(e->point[0])->PointGetNum();
+ break;
+ default: continue;
+ }
+ }
+
+ if(first) {
+ box.minp = point;
+ box.maxp = point;
+ box.Include(point, r);
+ first = false;
+ } else {
+ box.Include(point, r);
+ }
+ }
+ return box;
+}
+
+Group *Sketch::GetRunningMeshGroupFor(hGroup h) {
+ Group *g = GetGroup(h);
+ while(g != NULL) {
+ if(g->IsMeshGroup()) {
+ return g;
+ }
+ g = g->PreviousGroup();
+ }
+ return NULL;
+}
--- /dev/null
+//-----------------------------------------------------------------------------
+// All declarations not grouped specially elsewhere.
+//
+// Copyright 2008-2013 Jonathan Westhues.
+//-----------------------------------------------------------------------------
+
+#ifndef __SOLVESPACE_H
+#define __SOLVESPACE_H
+
+#include <stdint.h>
+#include <stdlib.h>
+#include <ctype.h>
+#include <string.h>
+#include <stdio.h>
+#include <stddef.h>
+#include <stdarg.h>
+#include <math.h>
+#include <limits.h>
+#include <algorithm>
+#include <memory>
+#include <string>
+#include <locale>
+#include <vector>
+#include <unordered_map>
+#include <map>
+#include <set>
+#include <sstream>
+#ifdef WIN32
+# include <windows.h> // required by GL headers
+#endif
+#ifdef __APPLE__
+# include <strings.h> // for strcasecmp in file.cpp
+# include <OpenGL/gl.h>
+# include <OpenGL/glu.h>
+#else
+# include <GL/gl.h>
+# include <GL/glu.h>
+#endif
+
+// We declare these in advance instead of simply using FT_Library
+// (defined as typedef FT_LibraryRec_* FT_Library) because including
+// freetype.h invokes indescribable horrors and we would like to avoid
+// doing that every time we include solvespace.h.
+struct FT_LibraryRec_;
+struct FT_FaceRec_;
+
+// The few floating-point equality comparisons in SolveSpace have been
+// carefully considered, so we disable the -Wfloat-equal warning for them
+#ifdef __clang__
+# define EXACT(expr) \
+ (_Pragma("clang diagnostic push") \
+ _Pragma("clang diagnostic ignored \"-Wfloat-equal\"") \
+ (expr) \
+ _Pragma("clang diagnostic pop"))
+#else
+# define EXACT(expr) (expr)
+#endif
+
+// Debugging functions
+#ifdef NDEBUG
+#define oops() do { dbp("oops at line %d, file %s\n", __LINE__, __FILE__); \
+ exit(-1); } while(0)
+#else
+#define oops() do { dbp("oops at line %d, file %s\n", __LINE__, __FILE__); \
+ abort(); } while(0)
+#endif
+
+#ifndef isnan
+# define isnan(x) (((x) != (x)) || (x > 1e11) || (x < -1e11))
+#endif
+
+namespace SolveSpace {
+
+using std::min;
+using std::max;
+using std::swap;
+
+#if defined(__GNUC__)
+__attribute__((__format__ (__printf__, 1, 2)))
+#endif
+std::string ssprintf(const char *fmt, ...);
+
+inline int WRAP(int v, int n) {
+ // Clamp it to the range [0, n)
+ while(v >= n) v -= n;
+ while(v < 0) v += n;
+ return v;
+}
+inline double WRAP_NOT_0(double v, double n) {
+ // Clamp it to the range (0, n]
+ while(v > n) v -= n;
+ while(v <= 0) v += n;
+ return v;
+}
+inline double WRAP_SYMMETRIC(double v, double n) {
+ // Clamp it to the range (-n/2, n/2]
+ while(v > n/2) v -= n;
+ while(v <= -n/2) v += n;
+ return v;
+}
+
+// Why is this faster than the library function?
+inline double ffabs(double v) { return (v > 0) ? v : (-v); }
+
+#define CO(v) (v).x, (v).y, (v).z
+
+#define ANGLE_COS_EPS (1e-6)
+#define LENGTH_EPS (1e-6)
+#define VERY_POSITIVE (1e10)
+#define VERY_NEGATIVE (-1e10)
+
+#define isforname(c) (isalnum(c) || (c) == '_' || (c) == '-' || (c) == '#')
+
+#if defined(WIN32)
+std::string Narrow(const wchar_t *s);
+std::wstring Widen(const char *s);
+std::string Narrow(const std::wstring &s);
+std::wstring Widen(const std::string &s);
+#endif
+
+inline double Random(double vmax) {
+ return (vmax*rand()) / RAND_MAX;
+}
+
+class Expr;
+class ExprVector;
+class ExprQuaternion;
+class RgbaColor;
+
+//================
+// From the platform-specific code.
+#if defined(WIN32)
+#define PATH_SEP "\\"
+#else
+#define PATH_SEP "/"
+#endif
+
+FILE *ssfopen(const std::string &filename, const char *mode);
+std::fstream ssfstream(const std::string &filename, std::ios_base::openmode mode);
+void ssremove(const std::string &filename);
+
+#define MAX_RECENT 8
+#define RECENT_OPEN (0xf000)
+#define RECENT_LINK (0xf100)
+extern std::string RecentFile[MAX_RECENT];
+void RefreshRecentMenus(void);
+
+enum DialogChoice { DIALOG_YES = 1, DIALOG_NO = -1, DIALOG_CANCEL = 0 };
+DialogChoice SaveFileYesNoCancel(void);
+DialogChoice LoadAutosaveYesNo(void);
+DialogChoice LocateImportedFileYesNoCancel(const std::string &filename,
+ bool canCancel);
+
+#define AUTOSAVE_SUFFIX "~"
+
+struct FileFilter {
+ const char *name;
+ const char *patterns[3];
+};
+
+// SolveSpace native file format
+const FileFilter SlvsFileFilter[] = {
+ { "SolveSpace models", { "slvs" } },
+ { NULL, {} }
+};
+// PNG format bitmap
+const FileFilter PngFileFilter[] = {
+ { "PNG", { "png" } },
+ { NULL, {} }
+};
+// Triangle mesh
+const FileFilter MeshFileFilter[] = {
+ { "STL mesh", { "stl" } },
+ { "Wavefront OBJ mesh", { "obj" } },
+ { "Three.js-compatible mesh, with viewer", { "html" } },
+ { "Three.js-compatible mesh, mesh only", { "js" } },
+ { NULL, {} }
+};
+// NURBS surfaces
+const FileFilter SurfaceFileFilter[] = {
+ { "STEP file", { "step", "stp" } },
+ { NULL, {} }
+};
+// 2d vector (lines and curves) format
+const FileFilter VectorFileFilter[] = {
+ { "PDF file", { "pdf" } },
+ { "Encapsulated PostScript", { "eps", "ps" } },
+ { "Scalable Vector Graphics", { "svg" } },
+ { "STEP file", { "step", "stp" } },
+ { "DXF file (AutoCAD 2007)", { "dxf" } },
+ { "HPGL file", { "plt", "hpgl" } },
+ { "G Code", { "ngc", "txt" } },
+ { NULL, {} }
+};
+// 3d vector (wireframe lines and curves) format
+const FileFilter Vector3dFileFilter[] = {
+ { "STEP file", { "step", "stp" } },
+ { "DXF file (AutoCAD 2007)", { "dxf" } },
+ { NULL, {} }
+};
+// All Importable formats
+const FileFilter ImportableFileFilter[] = {
+ { "AutoCAD DXF and DWG files", { "dxf", "dwg" } },
+ { NULL, {} }
+};
+// Comma-separated value, like a spreadsheet would use
+const FileFilter CsvFileFilter[] = {
+ { "CSV", { "csv" } },
+ { NULL, {} }
+};
+
+bool GetSaveFile(std::string *filename, const std::string &defExtension,
+ const FileFilter filters[]);
+bool GetOpenFile(std::string *filename, const std::string &defExtension,
+ const FileFilter filters[]);
+std::vector<std::string> GetFontFiles();
+
+void OpenWebsite(const char *url);
+
+void CheckMenuById(int id, bool checked);
+void RadioMenuById(int id, bool selected);
+void EnableMenuById(int id, bool enabled);
+
+void ShowGraphicsEditControl(int x, int y, int fontHeight, int minWidthChars,
+ const std::string &str);
+void HideGraphicsEditControl(void);
+bool GraphicsEditControlIsVisible(void);
+void ShowTextEditControl(int x, int y, const std::string &str);
+void HideTextEditControl(void);
+bool TextEditControlIsVisible(void);
+void MoveTextScrollbarTo(int pos, int maxPos, int page);
+
+#define CONTEXT_SUBMENU (-1)
+#define CONTEXT_SEPARATOR (-2)
+void AddContextMenuItem(const char *legend, int id);
+void CreateContextSubmenu(void);
+int ShowContextMenu(void);
+
+void ToggleMenuBar(void);
+bool MenuBarIsVisible(void);
+void ShowTextWindow(bool visible);
+void InvalidateText(void);
+void InvalidateGraphics(void);
+void PaintGraphics(void);
+void ToggleFullScreen(void);
+bool FullScreenIsActive(void);
+void GetGraphicsWindowSize(int *w, int *h);
+void GetTextWindowSize(int *w, int *h);
+int64_t GetMilliseconds(void);
+int64_t GetUnixTime(void);
+
+void dbp(const char *str, ...);
+#define DBPTRI(tri) \
+ dbp("tri: (%.3f %.3f %.3f) (%.3f %.3f %.3f) (%.3f %.3f %.3f)", \
+ CO((tri).a), CO((tri).b), CO((tri).c))
+
+void SetCurrentFilename(const std::string &filename);
+void SetMousePointerToHand(bool yes);
+void DoMessageBox(const char *str, int rows, int cols, bool error);
+void SetTimerFor(int milliseconds);
+void SetAutosaveTimerFor(int minutes);
+void ScheduleLater();
+void ExitNow(void);
+
+void CnfFreezeInt(uint32_t val, const std::string &name);
+void CnfFreezeFloat(float val, const std::string &name);
+void CnfFreezeString(const std::string &val, const std::string &name);
+std::string CnfThawString(const std::string &val, const std::string &name);
+uint32_t CnfThawInt(uint32_t val, const std::string &name);
+float CnfThawFloat(float val, const std::string &name);
+
+void *AllocTemporary(size_t n);
+void FreeTemporary(void *p);
+void FreeAllTemporary(void);
+void *MemAlloc(size_t n);
+void MemFree(void *p);
+void InitHeaps(void);
+void vl(void); // debug function to validate heaps
+
+// End of platform-specific functions
+//================
+
+class Group;
+class SSurface;
+#include "dsc.h"
+#include "polygon.h"
+#include "srf/surface.h"
+
+class Entity;
+class hEntity;
+class Param;
+class hParam;
+typedef IdList<Entity,hEntity> EntityList;
+typedef IdList<Param,hParam> ParamList;
+
+#include "sketch.h"
+#include "ui.h"
+#include "expr.h"
+
+
+// Utility functions that are provided in the platform-independent code.
+class utf8_iterator : std::iterator<std::forward_iterator_tag, char32_t> {
+ const char *p, *n;
+public:
+ utf8_iterator(const char *p) : p(p), n(NULL) {}
+ bool operator==(const utf8_iterator &i) const { return p==i.p; }
+ bool operator!=(const utf8_iterator &i) const { return p!=i.p; }
+ ptrdiff_t operator- (const utf8_iterator &i) const { return p -i.p; }
+ utf8_iterator& operator++() { **this; p=n; n=NULL; return *this; }
+ utf8_iterator operator++(int) { utf8_iterator t(*this); operator++(); return t; }
+ char32_t operator*();
+};
+class ReadUTF8 {
+ const std::string &str;
+public:
+ ReadUTF8(const std::string &str) : str(str) {}
+ utf8_iterator begin() const { return utf8_iterator(&str[0]); }
+ utf8_iterator end() const { return utf8_iterator(&str[str.length()]); }
+};
+
+void ssglLineWidth(GLfloat width);
+void ssglVertex3v(Vector u);
+void ssglAxisAlignedQuad(double l, double r, double t, double b, bool lone = true);
+void ssglAxisAlignedLineLoop(double l, double r, double t, double b);
+#ifdef WIN32
+# define SSGL_CALLBACK __stdcall
+#else
+# define SSGL_CALLBACK
+#endif
+extern "C" { typedef void SSGL_CALLBACK ssglCallbackFptr(void); }
+void ssglTesselatePolygon(GLUtesselator *gt, SPolygon *p);
+void ssglFillPolygon(SPolygon *p);
+void ssglFillMesh(bool useSpecColor, RgbaColor color,
+ SMesh *m, uint32_t h, uint32_t s1, uint32_t s2);
+void ssglDebugPolygon(SPolygon *p);
+void ssglDrawEdges(SEdgeList *l, bool endpointsToo, hStyle hs);
+void ssglDrawOutlines(SOutlineList *l, Vector projDir, hStyle hs);
+void ssglDebugMesh(SMesh *m);
+void ssglMarkPolygonNormal(SPolygon *p);
+typedef void ssglLineFn(void *data, Vector a, Vector b);
+void ssglWriteText(const std::string &str, double h, Vector t, Vector u, Vector v,
+ ssglLineFn *fn, void *fndata);
+void ssglWriteTextRefCenter(const std::string &str, double h, Vector t, Vector u, Vector v,
+ ssglLineFn *fn, void *fndata);
+double ssglStrCapHeight(double h);
+double ssglStrFontSize(double h);
+double ssglStrWidth(const std::string &str, double h);
+void ssglLockColorTo(RgbaColor rgb);
+void ssglStippledLine(Vector a, Vector b, double width,
+ int stippleType, double stippleScale, bool maybeFat);
+void ssglStippledLine(Vector a, Vector b, double width,
+ const char *stipplePattern, double stippleScale, bool maybeFat);
+void ssglFatLine(Vector a, Vector b, double width);
+void ssglUnlockColor(void);
+void ssglColorRGB(RgbaColor rgb);
+void ssglColorRGBa(RgbaColor rgb, double a);
+void ssglDepthRangeOffset(int units);
+void ssglDepthRangeLockToFront(bool yes);
+void ssglDrawPixelsWithTexture(uint8_t *data, int w, int h);
+void ssglInitializeBitmapFont();
+void ssglBitmapText(const std::string &str, Vector p);
+void ssglBitmapCharQuad(char32_t chr, double x, double y);
+int ssglBitmapCharWidth(char32_t chr);
+#define TEXTURE_BACKGROUND_IMG 10
+#define TEXTURE_DRAW_PIXELS 20
+#define TEXTURE_COLOR_PICKER_2D 30
+#define TEXTURE_COLOR_PICKER_1D 40
+#define TEXTURE_BITMAP_FONT 50
+
+
+#define arraylen(x) (sizeof((x))/sizeof((x)[0]))
+#define PI (3.1415926535897931)
+void MakeMatrix(double *mat, double a11, double a12, double a13, double a14,
+ double a21, double a22, double a23, double a24,
+ double a31, double a32, double a33, double a34,
+ double a41, double a42, double a43, double a44);
+std::string MakeAcceleratorLabel(int accel);
+bool FilenameHasExtension(const std::string &str, const char *ext);
+bool ReadFile(const std::string &filename, std::string *data);
+bool WriteFile(const std::string &filename, const std::string &data);
+void Message(const char *str, ...);
+void Error(const char *str, ...);
+void CnfFreezeBool(bool v, const std::string &name);
+void CnfFreezeColor(RgbaColor v, const std::string &name);
+bool CnfThawBool(bool v, const std::string &name);
+RgbaColor CnfThawColor(RgbaColor v, const std::string &name);
+
+class System {
+public:
+ enum { MAX_UNKNOWNS = 1024 };
+
+ EntityList entity;
+ ParamList param;
+ IdList<Equation,hEquation> eq;
+
+ // A list of parameters that are being dragged; these are the ones that
+ // we should put as close as possible to their initial positions.
+ List<hParam> dragged;
+
+ enum {
+ // In general, the tag indicates the subsys that a variable/equation
+ // has been assigned to; these are exceptions for variables:
+ VAR_SUBSTITUTED = 10000,
+ VAR_DOF_TEST = 10001,
+ // and for equations:
+ EQ_SUBSTITUTED = 20000
+ };
+
+ // The system Jacobian matrix
+ struct {
+ // The corresponding equation for each row
+ hEquation eq[MAX_UNKNOWNS];
+
+ // The corresponding parameter for each column
+ hParam param[MAX_UNKNOWNS];
+
+ // We're solving AX = B
+ int m, n;
+ struct {
+ Expr *sym[MAX_UNKNOWNS][MAX_UNKNOWNS];
+ double num[MAX_UNKNOWNS][MAX_UNKNOWNS];
+ } A;
+
+ double scale[MAX_UNKNOWNS];
+
+ // Some helpers for the least squares solve
+ double AAt[MAX_UNKNOWNS][MAX_UNKNOWNS];
+ double Z[MAX_UNKNOWNS];
+
+ double X[MAX_UNKNOWNS];
+
+ struct {
+ Expr *sym[MAX_UNKNOWNS];
+ double num[MAX_UNKNOWNS];
+ } B;
+ } mat;
+
+ static const double RANK_MAG_TOLERANCE, CONVERGE_TOLERANCE;
+ int CalculateRank(void);
+ bool TestRank(void);
+ static bool SolveLinearSystem(double X[], double A[][MAX_UNKNOWNS],
+ double B[], int N);
+ bool SolveLeastSquares(void);
+
+ bool WriteJacobian(int tag);
+ void EvalJacobian(void);
+
+ void WriteEquationsExceptFor(hConstraint hc, Group *g);
+ void FindWhichToRemoveToFixJacobian(Group *g, List<hConstraint> *bad);
+ void SolveBySubstitution(void);
+
+ bool IsDragged(hParam p);
+
+ bool NewtonSolve(int tag);
+
+ enum {
+ SOLVED_OKAY = 0,
+ DIDNT_CONVERGE = 10,
+ REDUNDANT_OKAY = 11,
+ REDUNDANT_DIDNT_CONVERGE = 12,
+ TOO_MANY_UNKNOWNS = 20
+ };
+ int Solve(Group *g, int *dof, List<hConstraint> *bad,
+ bool andFindBad, bool andFindFree);
+
+ void Clear(void);
+};
+
+#include "ttf.h"
+
+class StepFileWriter {
+public:
+ void ExportSurfacesTo(const std::string &filename);
+ void WriteHeader(void);
+ void WriteProductHeader(void);
+ int ExportCurve(SBezier *sb);
+ int ExportCurveLoop(SBezierLoop *loop, bool inner);
+ void ExportSurface(SSurface *ss, SBezierList *sbl);
+ void WriteWireframe(void);
+ void WriteFooter(void);
+
+ List<int> curves;
+ List<int> advancedFaces;
+ FILE *f;
+ int id;
+};
+
+class VectorFileWriter {
+protected:
+ Vector u, v, n, origin;
+ double cameraTan, scale;
+
+public:
+ FILE *f;
+ std::string filename;
+ Vector ptMin, ptMax;
+
+ static double MmToPts(double mm);
+
+ static VectorFileWriter *ForFile(const std::string &filename);
+
+ ~VectorFileWriter();
+
+ void SetModelviewProjection(const Vector &u, const Vector &v, const Vector &n,
+ const Vector &origin, double cameraTan, double scale);
+ Vector Transform(Vector &pos) const;
+
+ void OutputLinesAndMesh(SBezierLoopSetSet *sblss, SMesh *sm);
+
+ void BezierAsPwl(SBezier *sb);
+ void BezierAsNonrationalCubic(SBezier *sb, int depth=0);
+
+ virtual bool OutputConstraints(IdList<Constraint,hConstraint> *) { return false; }
+ virtual bool CanOutputMesh() const { return false; }
+
+ virtual void StartPath( RgbaColor strokeRgb, double lineWidth,
+ bool filled, RgbaColor fillRgb, hStyle hs) = 0;
+ virtual void FinishPath(RgbaColor strokeRgb, double lineWidth,
+ bool filled, RgbaColor fillRgb, hStyle hs) = 0;
+ virtual void Bezier(SBezier *sb) = 0;
+ virtual void Triangle(STriangle *tr) = 0;
+ virtual void StartFile(void) = 0;
+ virtual void FinishAndCloseFile(void) = 0;
+ virtual bool HasCanvasSize(void) = 0;
+};
+class DxfFileWriter : public VectorFileWriter {
+public:
+ struct BezierPath {
+ std::vector<SBezier *> beziers;
+ };
+
+ std::vector<BezierPath> paths;
+ IdList<Constraint,hConstraint> *constraint;
+
+ bool OutputConstraints(IdList<Constraint,hConstraint> *constraint);
+
+ void StartPath( RgbaColor strokeRgb, double lineWidth,
+ bool filled, RgbaColor fillRgb, hStyle hs);
+ void FinishPath(RgbaColor strokeRgb, double lineWidth,
+ bool filled, RgbaColor fillRgb, hStyle hs);
+ void Triangle(STriangle *tr);
+ void Bezier(SBezier *sb);
+ void StartFile(void);
+ void FinishAndCloseFile(void);
+ bool HasCanvasSize(void) { return false; }
+ bool NeedToOutput(Constraint *c);
+
+ static const char *lineTypeName(int stippleType);
+
+};
+class EpsFileWriter : public VectorFileWriter {
+public:
+ Vector prevPt;
+ void MaybeMoveTo(Vector s, Vector f);
+
+ void StartPath( RgbaColor strokeRgb, double lineWidth,
+ bool filled, RgbaColor fillRgb, hStyle hs);
+ void FinishPath(RgbaColor strokeRgb, double lineWidth,
+ bool filled, RgbaColor fillRgb, hStyle hs);
+ void Triangle(STriangle *tr);
+ void Bezier(SBezier *sb);
+ void StartFile(void);
+ void FinishAndCloseFile(void);
+ bool HasCanvasSize(void) { return true; }
+ bool CanOutputMesh() const { return true; }
+};
+class PdfFileWriter : public VectorFileWriter {
+public:
+ uint32_t xref[10];
+ uint32_t bodyStart;
+ Vector prevPt;
+ void MaybeMoveTo(Vector s, Vector f);
+
+ void StartPath( RgbaColor strokeRgb, double lineWidth,
+ bool filled, RgbaColor fillRgb, hStyle hs);
+ void FinishPath(RgbaColor strokeRgb, double lineWidth,
+ bool filled, RgbaColor fillRgb, hStyle hs);
+ void Triangle(STriangle *tr);
+ void Bezier(SBezier *sb);
+ void StartFile(void);
+ void FinishAndCloseFile(void);
+ bool HasCanvasSize(void) { return true; }
+ bool CanOutputMesh() const { return true; }
+};
+class SvgFileWriter : public VectorFileWriter {
+public:
+ Vector prevPt;
+ void MaybeMoveTo(Vector s, Vector f);
+
+ void StartPath( RgbaColor strokeRgb, double lineWidth,
+ bool filled, RgbaColor fillRgb, hStyle hs);
+ void FinishPath(RgbaColor strokeRgb, double lineWidth,
+ bool filled, RgbaColor fillRgb, hStyle hs);
+ void Triangle(STriangle *tr);
+ void Bezier(SBezier *sb);
+ void StartFile(void);
+ void FinishAndCloseFile(void);
+ bool HasCanvasSize(void) { return true; }
+ bool CanOutputMesh() const { return true; }
+};
+class HpglFileWriter : public VectorFileWriter {
+public:
+ static double MmToHpglUnits(double mm);
+ void StartPath( RgbaColor strokeRgb, double lineWidth,
+ bool filled, RgbaColor fillRgb, hStyle hs);
+ void FinishPath(RgbaColor strokeRgb, double lineWidth,
+ bool filled, RgbaColor fillRgb, hStyle hs);
+ void Triangle(STriangle *tr);
+ void Bezier(SBezier *sb);
+ void StartFile(void);
+ void FinishAndCloseFile(void);
+ bool HasCanvasSize(void) { return false; }
+};
+class Step2dFileWriter : public VectorFileWriter {
+ StepFileWriter sfw;
+ void StartPath( RgbaColor strokeRgb, double lineWidth,
+ bool filled, RgbaColor fillRgb, hStyle hs);
+ void FinishPath(RgbaColor strokeRgb, double lineWidth,
+ bool filled, RgbaColor fillRgb, hStyle hs);
+ void Triangle(STriangle *tr);
+ void Bezier(SBezier *sb);
+ void StartFile(void);
+ void FinishAndCloseFile(void);
+ bool HasCanvasSize(void) { return false; }
+};
+class GCodeFileWriter : public VectorFileWriter {
+public:
+ SEdgeList sel;
+ void StartPath( RgbaColor strokeRgb, double lineWidth,
+ bool filled, RgbaColor fillRgb, hStyle hs);
+ void FinishPath(RgbaColor strokeRgb, double lineWidth,
+ bool filled, RgbaColor fillRgb, hStyle hs);
+ void Triangle(STriangle *tr);
+ void Bezier(SBezier *sb);
+ void StartFile(void);
+ void FinishAndCloseFile(void);
+ bool HasCanvasSize(void) { return false; }
+};
+
+#ifdef LIBRARY
+# define ENTITY EntityBase
+# define CONSTRAINT ConstraintBase
+#else
+# define ENTITY Entity
+# define CONSTRAINT Constraint
+#endif
+class Sketch {
+public:
+ // These are user-editable, and define the sketch.
+ IdList<Group,hGroup> group;
+ List<hGroup> groupOrder;
+ IdList<CONSTRAINT,hConstraint> constraint;
+ IdList<Request,hRequest> request;
+ IdList<Style,hStyle> style;
+
+ // These are generated from the above.
+ IdList<ENTITY,hEntity> entity;
+ IdList<Param,hParam> param;
+
+ inline CONSTRAINT *GetConstraint(hConstraint h)
+ { return constraint.FindById(h); }
+ inline ENTITY *GetEntity (hEntity h) { return entity. FindById(h); }
+ inline Param *GetParam (hParam h) { return param. FindById(h); }
+ inline Request *GetRequest(hRequest h) { return request.FindById(h); }
+ inline Group *GetGroup (hGroup h) { return group. FindById(h); }
+ // Styles are handled a bit differently.
+
+ void Clear(void);
+
+ BBox CalculateEntityBBox(bool includingInvisible);
+ Group *GetRunningMeshGroupFor(hGroup h);
+};
+#undef ENTITY
+#undef CONSTRAINT
+
+class SolveSpaceUI {
+public:
+ TextWindow *pTW;
+ TextWindow &TW;
+ GraphicsWindow GW;
+
+ // The state for undo/redo
+ typedef struct {
+ IdList<Group,hGroup> group;
+ List<hGroup> groupOrder;
+ IdList<Request,hRequest> request;
+ IdList<Constraint,hConstraint> constraint;
+ IdList<Param,hParam> param;
+ IdList<Style,hStyle> style;
+ hGroup activeGroup;
+
+ void Clear(void) {
+ group.Clear();
+ request.Clear();
+ constraint.Clear();
+ param.Clear();
+ style.Clear();
+ }
+ } UndoState;
+ enum { MAX_UNDO = 16 };
+ typedef struct {
+ UndoState d[MAX_UNDO];
+ int cnt;
+ int write;
+ } UndoStack;
+ UndoStack undo;
+ UndoStack redo;
+ void UndoEnableMenus(void);
+ void UndoRemember(void);
+ void UndoUndo(void);
+ void UndoRedo(void);
+ void PushFromCurrentOnto(UndoStack *uk);
+ void PopOntoCurrentFrom(UndoStack *uk);
+ void UndoClearState(UndoState *ut);
+ void UndoClearStack(UndoStack *uk);
+
+ // Little bits of extra configuration state
+ enum { MODEL_COLORS = 8 };
+ RgbaColor modelColor[MODEL_COLORS];
+ Vector lightDir[2];
+ double lightIntensity[2];
+ double ambientIntensity;
+ double chordTol;
+ double chordTolCalculated;
+ int maxSegments;
+ double exportChordTol;
+ int exportMaxSegments;
+ double cameraTangent;
+ float gridSpacing;
+ float exportScale;
+ float exportOffset;
+ bool fixExportColors;
+ bool drawBackFaces;
+ bool checkClosedContour;
+ bool showToolbar;
+ RgbaColor backgroundColor;
+ bool exportShadedTriangles;
+ bool exportPwlCurves;
+ bool exportCanvasSizeAuto;
+ bool exportMode;
+ struct {
+ float left;
+ float right;
+ float bottom;
+ float top;
+ } exportMargin;
+ struct {
+ float width;
+ float height;
+ float dx;
+ float dy;
+ } exportCanvas;
+ struct {
+ float depth;
+ int passes;
+ float feed;
+ float plungeFeed;
+ } gCode;
+
+ typedef enum {
+ UNIT_MM = 0,
+ UNIT_INCHES
+ } Unit;
+ Unit viewUnits;
+ int afterDecimalMm;
+ int afterDecimalInch;
+ int autosaveInterval; // in minutes
+
+ std::string MmToString(double v);
+ double ExprToMm(Expr *e);
+ double StringToMm(const std::string &s);
+ const char *UnitName(void);
+ double MmPerUnit(void);
+ int UnitDigitsAfterDecimal(void);
+ void SetUnitDigitsAfterDecimal(int v);
+ double ChordTolMm(void);
+ double ExportChordTolMm(void);
+ int GetMaxSegments(void);
+ bool usePerspectiveProj;
+ double CameraTangent(void);
+
+ // Some stuff relating to the tangent arcs created non-parametrically
+ // as special requests.
+ double tangentArcRadius;
+ bool tangentArcManual;
+ bool tangentArcDeleteOld;
+
+ // The platform-dependent code calls this before entering the msg loop
+ void Init(void);
+ bool OpenFile(const std::string &filename);
+ void Exit(void);
+
+ // File load/save routines, including the additional files that get
+ // loaded when we have link groups.
+ FILE *fh;
+ void AfterNewFile(void);
+ static void RemoveFromRecentList(const std::string &filename);
+ static void AddToRecentList(const std::string &filename);
+ std::string saveFile;
+ bool fileLoadError;
+ bool unsaved;
+ typedef struct {
+ char type;
+ const char *desc;
+ char fmt;
+ void *ptr;
+ } SaveTable;
+ static const SaveTable SAVED[];
+ void SaveUsingTable(int type);
+ void LoadUsingTable(char *key, char *val);
+ struct {
+ Group g;
+ Request r;
+ Entity e;
+ Param p;
+ Constraint c;
+ Style s;
+ } sv;
+ static void MenuFile(int id);
+ bool Autosave();
+ void RemoveAutosave();
+ bool GetFilenameAndSave(bool saveAs);
+ bool OkayToStartNewFile(void);
+ hGroup CreateDefaultDrawingGroup(void);
+ void UpdateWindowTitle(void);
+ void ClearExisting(void);
+ void NewFile(void);
+ bool SaveToFile(const std::string &filename);
+ bool LoadAutosaveFor(const std::string &filename);
+ bool LoadFromFile(const std::string &filename);
+ bool LoadEntitiesFromFile(const std::string &filename, EntityList *le,
+ SMesh *m, SShell *sh);
+ bool ReloadAllImported(bool canCancel=false);
+ // And the various export options
+ void ExportAsPngTo(const std::string &filename);
+ void ExportMeshTo(const std::string &filename);
+ void ExportMeshAsStlTo(FILE *f, SMesh *sm);
+ void ExportMeshAsObjTo(FILE *f, SMesh *sm);
+ void ExportMeshAsThreeJsTo(FILE *f, const std::string &filename,
+ SMesh *sm, SEdgeList *sel);
+ void ExportViewOrWireframeTo(const std::string &filename, bool wireframe);
+ void ExportSectionTo(const std::string &filename);
+ void ExportWireframeCurves(SEdgeList *sel, SBezierList *sbl,
+ VectorFileWriter *out);
+ void ExportLinesAndMesh(SEdgeList *sel, SBezierList *sbl, SMesh *sm,
+ Vector u, Vector v, Vector n, Vector origin,
+ double cameraTan,
+ VectorFileWriter *out);
+
+ static void MenuAnalyze(int id);
+
+ // Additional display stuff
+ struct {
+ SContour path;
+ hEntity point;
+ } traced;
+ SEdgeList nakedEdges;
+ struct {
+ bool draw;
+ Vector ptA;
+ Vector ptB;
+ } extraLine;
+ struct {
+ uint8_t *fromFile;
+ int w, h;
+ int rw, rh;
+ double scale; // pixels per mm
+ Vector origin;
+ } bgImage;
+ struct {
+ bool draw, showOrigin;
+ Vector pt, u, v;
+ } justExportedInfo;
+
+ class Clipboard {
+ public:
+ List<ClipboardRequest> r;
+ List<Constraint> c;
+
+ void Clear(void);
+ bool ContainsEntity(hEntity old);
+ hEntity NewEntityFor(hEntity old);
+ };
+ Clipboard clipboard;
+
+ void MarkGroupDirty(hGroup hg);
+ void MarkGroupDirtyByEntity(hEntity he);
+
+ // Consistency checking on the sketch: stuff with missing dependencies
+ // will get deleted automatically.
+ struct {
+ int requests;
+ int groups;
+ int constraints;
+ int nonTrivialConstraints;
+ } deleted;
+ bool GroupExists(hGroup hg);
+ bool PruneOrphans(void);
+ bool EntityExists(hEntity he);
+ bool GroupsInOrder(hGroup before, hGroup after);
+ bool PruneGroups(hGroup hg);
+ bool PruneRequests(hGroup hg);
+ bool PruneConstraints(hGroup hg);
+
+ enum GenerateType {
+ GENERATE_DIRTY,
+ GENERATE_ALL,
+ GENERATE_REGEN,
+ GENERATE_UNTIL_ACTIVE,
+ };
+
+ void GenerateAll(GenerateType type = GENERATE_DIRTY, bool andFindFree = false,
+ bool genForBBox = false);
+ void SolveGroup(hGroup hg, bool andFindFree);
+ void SolveGroupAndReport(hGroup hg, bool andFindFree);
+ void MarkDraggedParams(void);
+ void ForceReferences(void);
+
+ bool ActiveGroupsOkay(void);
+
+ // The system to be solved.
+ System *pSys;
+ System &sys;
+
+ // All the TrueType fonts in memory
+ TtfFontList fonts;
+
+ // Everything has been pruned, so we know there's no dangling references
+ // to entities that don't exist. Before that, we mustn't try to display
+ // the sketch!
+ bool allConsistent;
+
+ struct {
+ bool scheduled;
+ bool showTW;
+ bool generateAll;
+ } later;
+ void ScheduleShowTW();
+ void ScheduleGenerateAll();
+ void DoLater(void);
+
+ static void MenuHelp(int id);
+
+ void Clear(void);
+
+ // We allocate TW and sys on the heap to work around an MSVC problem
+ // where it puts zero-initialized global data in the binary (~30M of zeroes)
+ // in release builds.
+ SolveSpaceUI()
+ : pTW(new TextWindow({})), TW(*pTW),
+ pSys(new System({})), sys(*pSys) {}
+
+ ~SolveSpaceUI() {
+ delete pTW;
+ delete pSys;
+ }
+};
+
+void ImportDxf(const std::string &file);
+void ImportDwg(const std::string &file);
+
+extern SolveSpaceUI SS;
+extern Sketch SK;
+
+};
+
+#ifndef __OBJC__
+using namespace SolveSpace;
+#endif
+
+#endif
--- /dev/null
+//-----------------------------------------------------------------------------
+// Top-level functions to compute the Boolean union or difference between
+// two shells of rational polynomial surfaces.
+//
+// Copyright 2008-2013 Jonathan Westhues.
+//-----------------------------------------------------------------------------
+#include "solvespace.h"
+
+static int I;
+
+void SShell::MakeFromUnionOf(SShell *a, SShell *b) {
+ MakeFromBoolean(a, b, AS_UNION);
+}
+
+void SShell::MakeFromDifferenceOf(SShell *a, SShell *b) {
+ MakeFromBoolean(a, b, AS_DIFFERENCE);
+}
+
+//-----------------------------------------------------------------------------
+// Take our original pwl curve. Wherever an edge intersects a surface within
+// either agnstA or agnstB, split the piecewise linear element. Then refine
+// the intersection so that it lies on all three relevant surfaces: the
+// intersecting surface, srfA, and srfB. (So the pwl curve should lie at
+// the intersection of srfA and srfB.) Return a new pwl curve with everything
+// split.
+//-----------------------------------------------------------------------------
+static Vector LineStart, LineDirection;
+static int ByTAlongLine(const void *av, const void *bv)
+{
+ SInter *a = (SInter *)av,
+ *b = (SInter *)bv;
+
+ double ta = (a->p.Minus(LineStart)).DivPivoting(LineDirection),
+ tb = (b->p.Minus(LineStart)).DivPivoting(LineDirection);
+
+ return (ta > tb) ? 1 : -1;
+}
+SCurve SCurve::MakeCopySplitAgainst(SShell *agnstA, SShell *agnstB,
+ SSurface *srfA, SSurface *srfB)
+{
+ SCurve ret;
+ ret = *this;
+ ret.pts = {};
+
+ SCurvePt *p = pts.First();
+ if(!p) oops();
+ SCurvePt prev = *p;
+ ret.pts.Add(p);
+ p = pts.NextAfter(p);
+
+ for(; p; p = pts.NextAfter(p)) {
+ List<SInter> il = {};
+
+ // Find all the intersections with the two passed shells
+ if(agnstA)
+ agnstA->AllPointsIntersecting(prev.p, p->p, &il, true, false, true);
+ if(agnstB)
+ agnstB->AllPointsIntersecting(prev.p, p->p, &il, true, false, true);
+
+ if(il.n > 0) {
+ // The intersections were generated by intersecting the pwl
+ // edge against a surface; so they must be refined to lie
+ // exactly on the original curve.
+ il.ClearTags();
+ SInter *pi;
+ for(pi = il.First(); pi; pi = il.NextAfter(pi)) {
+ if(pi->srf == srfA || pi->srf == srfB) {
+ // The edge certainly intersects the surfaces that it
+ // trims (at its endpoints), but those ones don't count.
+ // They are culled later, but no sense calculating them
+ // and they will cause numerical problems (since two
+ // of the three surfaces they're refined to lie on will
+ // be identical, so the matrix will be singular).
+ pi->tag = 1;
+ continue;
+ }
+
+ Point2d puv;
+ (pi->srf)->ClosestPointTo(pi->p, &puv, false);
+
+ // Split the edge if the intersection lies within the surface's
+ // trim curves, or within the chord tol of the trim curve; want
+ // some slop if points are close to edge and pwl is too coarse,
+ // and it doesn't hurt to split unnecessarily.
+ Point2d dummy = { 0, 0 };
+ int c = (pi->srf->bsp) ? pi->srf->bsp->ClassifyPoint(puv, dummy, pi->srf) : SBspUv::OUTSIDE;
+ if(c == SBspUv::OUTSIDE) {
+ double d = VERY_POSITIVE;
+ if(pi->srf->bsp) d = pi->srf->bsp->MinimumDistanceToEdge(puv, pi->srf);
+ if(d > SS.ChordTolMm()) {
+ pi->tag = 1;
+ continue;
+ }
+ }
+
+ // We're keeping the intersection, so actually refine it.
+ (pi->srf)->PointOnSurfaces(srfA, srfB, &(puv.x), &(puv.y));
+ pi->p = (pi->srf)->PointAt(puv);
+ }
+ il.RemoveTagged();
+
+ // And now sort them in order along the line. Note that we must
+ // do that after refining, in case the refining would make two
+ // points switch places.
+ LineStart = prev.p;
+ LineDirection = (p->p).Minus(prev.p);
+ qsort(il.elem, il.n, sizeof(il.elem[0]), ByTAlongLine);
+
+ // And now uses the intersections to generate our split pwl edge(s)
+ Vector prev = Vector::From(VERY_POSITIVE, 0, 0);
+ for(pi = il.First(); pi; pi = il.NextAfter(pi)) {
+ // On-edge intersection will generate same split point for
+ // both surfaces, so don't create zero-length edge.
+ if(!prev.Equals(pi->p)) {
+ SCurvePt scpt;
+ scpt.tag = 0;
+ scpt.p = pi->p;
+ scpt.vertex = true;
+ ret.pts.Add(&scpt);
+ }
+ prev = pi->p;
+ }
+ }
+
+ il.Clear();
+ ret.pts.Add(p);
+ prev = *p;
+ }
+ return ret;
+}
+
+void SShell::CopyCurvesSplitAgainst(bool opA, SShell *agnst, SShell *into) {
+ SCurve *sc;
+ for(sc = curve.First(); sc; sc = curve.NextAfter(sc)) {
+ SCurve scn = sc->MakeCopySplitAgainst(agnst, NULL,
+ surface.FindById(sc->surfA),
+ surface.FindById(sc->surfB));
+ scn.source = opA ? SCurve::FROM_A : SCurve::FROM_B;
+
+ hSCurve hsc = into->curve.AddAndAssignId(&scn);
+ // And note the new ID so that we can rewrite the trims appropriately
+ sc->newH = hsc;
+ }
+}
+
+void SSurface::TrimFromEdgeList(SEdgeList *el, bool asUv) {
+ el->l.ClearTags();
+
+ STrimBy stb = {};
+ for(;;) {
+ // Find an edge, any edge; we'll start from there.
+ SEdge *se;
+ for(se = el->l.First(); se; se = el->l.NextAfter(se)) {
+ if(se->tag) continue;
+ break;
+ }
+ if(!se) break;
+ se->tag = 1;
+ stb.start = se->a;
+ stb.finish = se->b;
+ stb.curve.v = se->auxA;
+ stb.backwards = se->auxB ? true : false;
+
+ // Find adjoining edges from the same curve; those should be
+ // merged into a single trim.
+ bool merged;
+ do {
+ merged = false;
+ for(se = el->l.First(); se; se = el->l.NextAfter(se)) {
+ if(se->tag) continue;
+ if(se->auxA != (int)stb.curve.v) continue;
+ if(( se->auxB && !stb.backwards) ||
+ (!se->auxB && stb.backwards)) continue;
+
+ if((se->a).Equals(stb.finish)) {
+ stb.finish = se->b;
+ se->tag = 1;
+ merged = true;
+ } else if((se->b).Equals(stb.start)) {
+ stb.start = se->a;
+ se->tag = 1;
+ merged = true;
+ }
+ }
+ } while(merged);
+
+ if(asUv) {
+ stb.start = PointAt(stb.start.x, stb.start.y);
+ stb.finish = PointAt(stb.finish.x, stb.finish.y);
+ }
+
+ // And add the merged trim, with xyz (not uv like the polygon) pts
+ trim.Add(&stb);
+ }
+}
+
+static bool KeepRegion(int type, bool opA, int shell, int orig)
+{
+ bool inShell = (shell == SShell::INSIDE),
+ inSame = (shell == SShell::COINC_SAME),
+ inOpp = (shell == SShell::COINC_OPP),
+ inOrig = (orig == SShell::INSIDE);
+
+ bool inFace = inSame || inOpp;
+
+ // If these are correct, then they should be independent of inShell
+ // if inFace is true.
+ if(!inOrig) return false;
+ switch(type) {
+ case SShell::AS_UNION:
+ if(opA) {
+ return (!inShell && !inFace);
+ } else {
+ return (!inShell && !inFace) || inSame;
+ }
+
+ case SShell::AS_DIFFERENCE:
+ if(opA) {
+ return (!inShell && !inFace);
+ } else {
+ return (inShell && !inFace) || inSame;
+ }
+
+ default: oops();
+ }
+}
+static bool KeepEdge(int type, bool opA,
+ int indir_shell, int outdir_shell,
+ int indir_orig, int outdir_orig)
+{
+ bool keepIn = KeepRegion(type, opA, indir_shell, indir_orig),
+ keepOut = KeepRegion(type, opA, outdir_shell, outdir_orig);
+
+ // If the regions to the left and right of this edge are both in or both
+ // out, then this edge is not useful and should be discarded.
+ if(keepIn && !keepOut) return true;
+ return false;
+}
+
+static void TagByClassifiedEdge(int bspclass, int *indir, int *outdir)
+{
+ switch(bspclass) {
+ case SBspUv::INSIDE:
+ *indir = SShell::INSIDE;
+ *outdir = SShell::INSIDE;
+ break;
+
+ case SBspUv::OUTSIDE:
+ *indir = SShell::OUTSIDE;
+ *outdir = SShell::OUTSIDE;
+ break;
+
+ case SBspUv::EDGE_PARALLEL:
+ *indir = SShell::INSIDE;
+ *outdir = SShell::OUTSIDE;
+ break;
+
+ case SBspUv::EDGE_ANTIPARALLEL:
+ *indir = SShell::OUTSIDE;
+ *outdir = SShell::INSIDE;
+ break;
+
+ default:
+ dbp("TagByClassifiedEdge: fail!");
+ *indir = SShell::OUTSIDE;
+ *outdir = SShell::OUTSIDE;
+ break;
+ }
+}
+
+static void DEBUGEDGELIST(SEdgeList *sel, SSurface *surf) {
+ dbp("print %d edges", sel->l.n);
+ SEdge *se;
+ for(se = sel->l.First(); se; se = sel->l.NextAfter(se)) {
+ Vector mid = (se->a).Plus(se->b).ScaledBy(0.5);
+ Vector arrow = (se->b).Minus(se->a);
+ swap(arrow.x, arrow.y);
+ arrow.x *= -1;
+ arrow = arrow.WithMagnitude(0.01);
+ arrow = arrow.Plus(mid);
+
+ SS.nakedEdges.AddEdge(surf->PointAt(se->a.x, se->a.y),
+ surf->PointAt(se->b.x, se->b.y));
+ SS.nakedEdges.AddEdge(surf->PointAt(mid.x, mid.y),
+ surf->PointAt(arrow.x, arrow.y));
+ }
+}
+
+//-----------------------------------------------------------------------------
+// We are given src, with at least one edge, and avoid, a list of points to
+// avoid. We return a chain of edges (that share endpoints), such that no
+// point within the avoid list ever occurs in the middle of a chain. And we
+// delete the edges in that chain from our source list.
+//-----------------------------------------------------------------------------
+void SSurface::FindChainAvoiding(SEdgeList *src, SEdgeList *dest,
+ SPointList *avoid)
+{
+ if(src->l.n < 1) oops();
+ // Start with an arbitrary edge.
+ dest->l.Add(&(src->l.elem[0]));
+ src->l.ClearTags();
+ src->l.elem[0].tag = 1;
+
+ bool added;
+ do {
+ added = false;
+ // The start and finish of the current edge chain
+ Vector s = dest->l.elem[0].a,
+ f = dest->l.elem[dest->l.n - 1].b;
+
+ // We can attach a new edge at the start or finish, as long as that
+ // start or finish point isn't in the list of points to avoid.
+ bool startOkay = !avoid->ContainsPoint(s),
+ finishOkay = !avoid->ContainsPoint(f);
+
+ // Now look for an unused edge that joins at the start or finish of
+ // our chain (if permitted by the avoid list).
+ SEdge *se;
+ for(se = src->l.First(); se; se = src->l.NextAfter(se)) {
+ if(se->tag) continue;
+ if(startOkay && s.Equals(se->b)) {
+ dest->l.AddToBeginning(se);
+ s = se->a;
+ se->tag = 1;
+ startOkay = !avoid->ContainsPoint(s);
+ } else if(finishOkay && f.Equals(se->a)) {
+ dest->l.Add(se);
+ f = se->b;
+ se->tag = 1;
+ finishOkay = !avoid->ContainsPoint(f);
+ } else {
+ continue;
+ }
+
+ added = true;
+ }
+ } while(added);
+
+ src->l.RemoveTagged();
+}
+
+void SSurface::EdgeNormalsWithinSurface(Point2d auv, Point2d buv,
+ Vector *pt,
+ Vector *enin, Vector *enout,
+ Vector *surfn,
+ uint32_t auxA,
+ SShell *shell, SShell *sha, SShell *shb)
+{
+ // the midpoint of the edge
+ Point2d muv = (auv.Plus(buv)).ScaledBy(0.5);
+
+ *pt = PointAt(muv);
+
+ // If this edge just approximates a curve, then refine our midpoint so
+ // so that it actually lies on that curve too. Otherwise stuff like
+ // point-on-face tests will fail, since the point won't actually lie
+ // on the other face.
+ hSCurve hc = { auxA };
+ SCurve *sc = shell->curve.FindById(hc);
+ if(sc->isExact && sc->exact.deg != 1) {
+ double t;
+ sc->exact.ClosestPointTo(*pt, &t, false);
+ *pt = sc->exact.PointAt(t);
+ ClosestPointTo(*pt, &muv);
+ } else if(!sc->isExact) {
+ SSurface *trimmedA = sc->GetSurfaceA(sha, shb),
+ *trimmedB = sc->GetSurfaceB(sha, shb);
+ *pt = trimmedA->ClosestPointOnThisAndSurface(trimmedB, *pt);
+ ClosestPointTo(*pt, &muv);
+ }
+
+ *surfn = NormalAt(muv.x, muv.y);
+
+ // Compute the edge's inner normal in xyz space.
+ Vector ab = (PointAt(auv)).Minus(PointAt(buv)),
+ enxyz = (ab.Cross(*surfn)).WithMagnitude(SS.ChordTolMm());
+ // And based on that, compute the edge's inner normal in uv space. This
+ // vector is perpendicular to the edge in xyz, but not necessarily in uv.
+ Vector tu, tv;
+ TangentsAt(muv.x, muv.y, &tu, &tv);
+ Point2d enuv;
+ enuv.x = enxyz.Dot(tu) / tu.MagSquared();
+ enuv.y = enxyz.Dot(tv) / tv.MagSquared();
+
+ // Compute the inner and outer normals of this edge (within the srf),
+ // in xyz space. These are not necessarily antiparallel, if the
+ // surface is curved.
+ Vector pin = PointAt(muv.Minus(enuv)),
+ pout = PointAt(muv.Plus(enuv));
+ *enin = pin.Minus(*pt),
+ *enout = pout.Minus(*pt);
+}
+
+//-----------------------------------------------------------------------------
+// Trim this surface against the specified shell, in the way that's appropriate
+// for the specified Boolean operation type (and which operand we are). We
+// also need a pointer to the shell that contains our own surface, since that
+// contains our original trim curves.
+//-----------------------------------------------------------------------------
+SSurface SSurface::MakeCopyTrimAgainst(SShell *parent,
+ SShell *sha, SShell *shb,
+ SShell *into,
+ int type)
+{
+ bool opA = (parent == sha);
+ SShell *agnst = opA ? shb : sha;
+
+ SSurface ret;
+ // The returned surface is identical, just the trim curves change
+ ret = *this;
+ ret.trim = {};
+
+ // First, build a list of the existing trim curves; update them to use
+ // the split curves.
+ STrimBy *stb;
+ for(stb = trim.First(); stb; stb = trim.NextAfter(stb)) {
+ STrimBy stn = *stb;
+ stn.curve = (parent->curve.FindById(stn.curve))->newH;
+ ret.trim.Add(&stn);
+ }
+
+ if(type == SShell::AS_DIFFERENCE && !opA) {
+ // The second operand of a Boolean difference gets turned inside out
+ ret.Reverse();
+ }
+
+ // Build up our original trim polygon; remember the coordinates could
+ // be changed if we just flipped the surface normal, and we are using
+ // the split curves (not the original curves).
+ SEdgeList orig = {};
+ ret.MakeEdgesInto(into, &orig, AS_UV);
+ ret.trim.Clear();
+ // which means that we can't necessarily use the old BSP...
+ SBspUv *origBsp = SBspUv::From(&orig, &ret);
+
+ // And now intersect the other shell against us
+ SEdgeList inter = {};
+
+ SSurface *ss;
+ for(ss = agnst->surface.First(); ss; ss = agnst->surface.NextAfter(ss)) {
+ SCurve *sc;
+ for(sc = into->curve.First(); sc; sc = into->curve.NextAfter(sc)) {
+ if(sc->source != SCurve::FROM_INTERSECTION) continue;
+ if(opA) {
+ if(sc->surfA.v != h.v || sc->surfB.v != ss->h.v) continue;
+ } else {
+ if(sc->surfB.v != h.v || sc->surfA.v != ss->h.v) continue;
+ }
+
+ int i;
+ for(i = 1; i < sc->pts.n; i++) {
+ Vector a = sc->pts.elem[i-1].p,
+ b = sc->pts.elem[i].p;
+
+ Point2d auv, buv;
+ ss->ClosestPointTo(a, &(auv.x), &(auv.y));
+ ss->ClosestPointTo(b, &(buv.x), &(buv.y));
+
+ int c = (ss->bsp) ? ss->bsp->ClassifyEdge(auv, buv, ss) : SBspUv::OUTSIDE;
+ if(c != SBspUv::OUTSIDE) {
+ Vector ta = Vector::From(0, 0, 0);
+ Vector tb = Vector::From(0, 0, 0);
+ ret.ClosestPointTo(a, &(ta.x), &(ta.y));
+ ret.ClosestPointTo(b, &(tb.x), &(tb.y));
+
+ Vector tn = ret.NormalAt(ta.x, ta.y);
+ Vector sn = ss->NormalAt(auv.x, auv.y);
+
+ // We are subtracting the portion of our surface that
+ // lies in the shell, so the in-plane edge normal should
+ // point opposite to the surface normal.
+ bool bkwds = true;
+ if((tn.Cross(b.Minus(a))).Dot(sn) < 0) bkwds = !bkwds;
+ if(type == SShell::AS_DIFFERENCE && !opA) bkwds = !bkwds;
+ if(bkwds) {
+ inter.AddEdge(tb, ta, sc->h.v, 1);
+ } else {
+ inter.AddEdge(ta, tb, sc->h.v, 0);
+ }
+ }
+ }
+ }
+ }
+
+ // Record all the points where more than two edges join, which I will call
+ // the choosing points. If two edges join at a non-choosing point, then
+ // they must either both be kept or both be discarded (since that would
+ // otherwise create an open contour).
+ SPointList choosing = {};
+ SEdge *se;
+ for(se = orig.l.First(); se; se = orig.l.NextAfter(se)) {
+ choosing.IncrementTagFor(se->a);
+ choosing.IncrementTagFor(se->b);
+ }
+ for(se = inter.l.First(); se; se = inter.l.NextAfter(se)) {
+ choosing.IncrementTagFor(se->a);
+ choosing.IncrementTagFor(se->b);
+ }
+ SPoint *sp;
+ for(sp = choosing.l.First(); sp; sp = choosing.l.NextAfter(sp)) {
+ if(sp->tag == 2) {
+ sp->tag = 1;
+ } else {
+ sp->tag = 0;
+ }
+ }
+ choosing.l.RemoveTagged();
+
+ // The list of edges to trim our new surface, a combination of edges from
+ // our original and intersecting edge lists.
+ SEdgeList final = {};
+
+ while(orig.l.n > 0) {
+ SEdgeList chain = {};
+ FindChainAvoiding(&orig, &chain, &choosing);
+
+ // Arbitrarily choose an edge within the chain to classify; they
+ // should all be the same, though.
+ se = &(chain.l.elem[chain.l.n/2]);
+
+ Point2d auv = (se->a).ProjectXy(),
+ buv = (se->b).ProjectXy();
+
+ Vector pt, enin, enout, surfn;
+ ret.EdgeNormalsWithinSurface(auv, buv, &pt, &enin, &enout, &surfn,
+ se->auxA, into, sha, shb);
+
+ int indir_shell, outdir_shell, indir_orig, outdir_orig;
+
+ indir_orig = SShell::INSIDE;
+ outdir_orig = SShell::OUTSIDE;
+
+ agnst->ClassifyEdge(&indir_shell, &outdir_shell,
+ ret.PointAt(auv), ret.PointAt(buv), pt,
+ enin, enout, surfn);
+
+ if(KeepEdge(type, opA, indir_shell, outdir_shell,
+ indir_orig, outdir_orig))
+ {
+ for(se = chain.l.First(); se; se = chain.l.NextAfter(se)) {
+ final.AddEdge(se->a, se->b, se->auxA, se->auxB);
+ }
+ }
+ chain.Clear();
+ }
+
+ while(inter.l.n > 0) {
+ SEdgeList chain = {};
+ FindChainAvoiding(&inter, &chain, &choosing);
+
+ // Any edge in the chain, same as above.
+ se = &(chain.l.elem[chain.l.n/2]);
+
+ Point2d auv = (se->a).ProjectXy(),
+ buv = (se->b).ProjectXy();
+
+ Vector pt, enin, enout, surfn;
+ ret.EdgeNormalsWithinSurface(auv, buv, &pt, &enin, &enout, &surfn,
+ se->auxA, into, sha, shb);
+
+ int indir_shell, outdir_shell, indir_orig, outdir_orig;
+
+ int c_this = (origBsp) ? origBsp->ClassifyEdge(auv, buv, &ret) : SBspUv::OUTSIDE;
+ TagByClassifiedEdge(c_this, &indir_orig, &outdir_orig);
+
+ agnst->ClassifyEdge(&indir_shell, &outdir_shell,
+ ret.PointAt(auv), ret.PointAt(buv), pt,
+ enin, enout, surfn);
+
+ if(KeepEdge(type, opA, indir_shell, outdir_shell,
+ indir_orig, outdir_orig))
+ {
+ for(se = chain.l.First(); se; se = chain.l.NextAfter(se)) {
+ final.AddEdge(se->a, se->b, se->auxA, se->auxB);
+ }
+ }
+ chain.Clear();
+ }
+
+ // Cull extraneous edges; duplicates or anti-parallel pairs. In particular,
+ // we can get duplicate edges if our surface intersects the other shell
+ // at an edge, so that both surfaces intersect coincident (and both
+ // generate an intersection edge).
+ final.CullExtraneousEdges();
+
+ // Use our reassembled edges to trim the new surface.
+ ret.TrimFromEdgeList(&final, true);
+
+ SPolygon poly = {};
+ final.l.ClearTags();
+ if(!final.AssemblePolygon(&poly, NULL, true)) {
+ into->booleanFailed = true;
+ dbp("failed: I=%d, avoid=%d", I, choosing.l.n);
+ DEBUGEDGELIST(&final, &ret);
+ }
+ poly.Clear();
+
+ choosing.Clear();
+ final.Clear();
+ inter.Clear();
+ orig.Clear();
+ return ret;
+}
+
+void SShell::CopySurfacesTrimAgainst(SShell *sha, SShell *shb, SShell *into,
+ int type)
+{
+ SSurface *ss;
+ for(ss = surface.First(); ss; ss = surface.NextAfter(ss)) {
+ SSurface ssn;
+ ssn = ss->MakeCopyTrimAgainst(this, sha, shb, into, type);
+ ss->newH = into->surface.AddAndAssignId(&ssn);
+ I++;
+ }
+}
+
+void SShell::MakeIntersectionCurvesAgainst(SShell *agnst, SShell *into) {
+ SSurface *sa;
+ for(sa = surface.First(); sa; sa = surface.NextAfter(sa)) {
+ SSurface *sb;
+ for(sb = agnst->surface.First(); sb; sb = agnst->surface.NextAfter(sb)){
+ // Intersect every surface from our shell against every surface
+ // from agnst; this will add zero or more curves to the curve
+ // list for into.
+ sa->IntersectAgainst(sb, this, agnst, into);
+ }
+ }
+}
+
+void SShell::CleanupAfterBoolean(void) {
+ SSurface *ss;
+ for(ss = surface.First(); ss; ss = surface.NextAfter(ss)) {
+ ss->edges.Clear();
+ }
+}
+
+//-----------------------------------------------------------------------------
+// All curves contain handles to the two surfaces that they trim. After a
+// Boolean or assembly, we must rewrite those handles to refer to the curves
+// by their new IDs.
+//-----------------------------------------------------------------------------
+void SShell::RewriteSurfaceHandlesForCurves(SShell *a, SShell *b) {
+ SCurve *sc;
+ for(sc = curve.First(); sc; sc = curve.NextAfter(sc)) {
+ sc->surfA = sc->GetSurfaceA(a, b)->newH,
+ sc->surfB = sc->GetSurfaceB(a, b)->newH;
+ }
+}
+
+//-----------------------------------------------------------------------------
+// Copy all the surfaces and curves from two different shells into a single
+// shell. The only difficulty is to rewrite all of their handles; we don't
+// look for any surface intersections, so if two objects interfere then the
+// result is just self-intersecting. This is used for assembly, since it's
+// much faster than merging as union.
+//-----------------------------------------------------------------------------
+void SShell::MakeFromAssemblyOf(SShell *a, SShell *b) {
+ booleanFailed = false;
+
+ Vector t = Vector::From(0, 0, 0);
+ Quaternion q = Quaternion::IDENTITY;
+ int i = 0;
+ SShell *ab;
+
+ // First, copy over all the curves. Note which shell (a or b) each curve
+ // came from, but assign it a new ID.
+ SCurve *c, cn;
+ for(i = 0; i < 2; i++) {
+ ab = (i == 0) ? a : b;
+ for(c = ab->curve.First(); c; c = ab->curve.NextAfter(c)) {
+ cn = SCurve::FromTransformationOf(c, t, q, 1.0);
+ cn.source = (i == 0) ? SCurve::FROM_A : SCurve::FROM_B;
+ // surfA and surfB are wrong now, and we can't fix them until
+ // we've assigned IDs to the surfaces. So we'll get that later.
+ c->newH = curve.AddAndAssignId(&cn);
+ }
+ }
+
+ // Likewise copy over all the surfaces.
+ SSurface *s, sn;
+ for(i = 0; i < 2; i++) {
+ ab = (i == 0) ? a : b;
+ for(s = ab->surface.First(); s; s = ab->surface.NextAfter(s)) {
+ sn = SSurface::FromTransformationOf(s, t, q, 1.0, true);
+ // All the trim curve IDs get rewritten; we know the new handles
+ // to the curves since we recorded them in the previous step.
+ STrimBy *stb;
+ for(stb = sn.trim.First(); stb; stb = sn.trim.NextAfter(stb)) {
+ stb->curve = ab->curve.FindById(stb->curve)->newH;
+ }
+ s->newH = surface.AddAndAssignId(&sn);
+ }
+ }
+
+ // Finally, rewrite the surfaces associated with each curve to use the
+ // new handles.
+ RewriteSurfaceHandlesForCurves(a, b);
+}
+
+void SShell::MakeFromBoolean(SShell *a, SShell *b, int type) {
+ booleanFailed = false;
+
+ a->MakeClassifyingBsps(NULL);
+ b->MakeClassifyingBsps(NULL);
+
+ // Copy over all the original curves, splitting them so that a
+ // piecwise linear segment never crosses a surface from the other
+ // shell.
+ a->CopyCurvesSplitAgainst(true, b, this);
+ b->CopyCurvesSplitAgainst(false, a, this);
+
+ // Generate the intersection curves for each surface in A against all
+ // the surfaces in B (which is all of the intersection curves).
+ a->MakeIntersectionCurvesAgainst(b, this);
+
+ SCurve *sc;
+ for(sc = curve.First(); sc; sc = curve.NextAfter(sc)) {
+ SSurface *srfA = sc->GetSurfaceA(a, b),
+ *srfB = sc->GetSurfaceB(a, b);
+
+ sc->RemoveShortSegments(srfA, srfB);
+ }
+
+ // And clean up the piecewise linear things we made as a calculation aid
+ a->CleanupAfterBoolean();
+ b->CleanupAfterBoolean();
+ // Remake the classifying BSPs with the split (and short-segment-removed)
+ // curves
+ a->MakeClassifyingBsps(this);
+ b->MakeClassifyingBsps(this);
+
+ if(b->surface.n == 0 || a->surface.n == 0) {
+ I = 1000000;
+ } else {
+ I = 0;
+ }
+ // Then trim and copy the surfaces
+ a->CopySurfacesTrimAgainst(a, b, this, type);
+ b->CopySurfacesTrimAgainst(a, b, this, type);
+
+ // Now that we've copied the surfaces, we know their new hSurfaces, so
+ // rewrite the curves to refer to the surfaces by their handles in the
+ // result.
+ RewriteSurfaceHandlesForCurves(a, b);
+
+ // And clean up the piecewise linear things we made as a calculation aid
+ a->CleanupAfterBoolean();
+ b->CleanupAfterBoolean();
+}
+
+//-----------------------------------------------------------------------------
+// All of the BSP routines that we use to perform and accelerate polygon ops.
+//-----------------------------------------------------------------------------
+void SShell::MakeClassifyingBsps(SShell *useCurvesFrom) {
+ SSurface *ss;
+ for(ss = surface.First(); ss; ss = surface.NextAfter(ss)) {
+ ss->MakeClassifyingBsp(this, useCurvesFrom);
+ }
+}
+
+void SSurface::MakeClassifyingBsp(SShell *shell, SShell *useCurvesFrom) {
+ SEdgeList el = {};
+
+ MakeEdgesInto(shell, &el, AS_UV, useCurvesFrom);
+ bsp = SBspUv::From(&el, this);
+ el.Clear();
+
+ edges = {};
+ MakeEdgesInto(shell, &edges, AS_XYZ, useCurvesFrom);
+}
+
+SBspUv *SBspUv::Alloc(void) {
+ return (SBspUv *)AllocTemporary(sizeof(SBspUv));
+}
+
+static int ByLength(const void *av, const void *bv)
+{
+ SEdge *a = (SEdge *)av,
+ *b = (SEdge *)bv;
+
+ double la = (a->a).Minus(a->b).Magnitude(),
+ lb = (b->a).Minus(b->b).Magnitude();
+
+ // Sort in descending order, longest first. This improves numerical
+ // stability for the normals.
+ return (la < lb) ? 1 : -1;
+}
+SBspUv *SBspUv::From(SEdgeList *el, SSurface *srf) {
+ SEdgeList work = {};
+
+ SEdge *se;
+ for(se = el->l.First(); se; se = el->l.NextAfter(se)) {
+ work.AddEdge(se->a, se->b, se->auxA, se->auxB);
+ }
+ qsort(work.l.elem, work.l.n, sizeof(work.l.elem[0]), ByLength);
+
+ SBspUv *bsp = NULL;
+ for(se = work.l.First(); se; se = work.l.NextAfter(se)) {
+ bsp = InsertOrCreateEdge(bsp, (se->a).ProjectXy(), (se->b).ProjectXy(), srf);
+ }
+
+ work.Clear();
+ return bsp;
+}
+
+//-----------------------------------------------------------------------------
+// The points in this BSP are in uv space, but we want to apply our tolerances
+// consistently in xyz (i.e., we want to say a point is on-edge if its xyz
+// distance to that edge is less than LENGTH_EPS, irrespective of its distance
+// in uv). So we linearize the surface about the point we're considering and
+// then do the test. That preserves point-on-line relationships, and the only
+// time we care about exact correctness is when we're very close to the line,
+// which is when the linearization is accurate.
+//-----------------------------------------------------------------------------
+void SBspUv::ScalePoints(Point2d *pt, Point2d *a, Point2d *b, SSurface *srf) {
+ Vector tu, tv;
+ srf->TangentsAt(pt->x, pt->y, &tu, &tv);
+ double mu = tu.Magnitude(), mv = tv.Magnitude();
+
+ pt->x *= mu; pt->y *= mv;
+ a ->x *= mu; a ->y *= mv;
+ b ->x *= mu; b ->y *= mv;
+}
+double SBspUv::ScaledSignedDistanceToLine(Point2d pt, Point2d a, Point2d b,
+ SSurface *srf)
+{
+ ScalePoints(&pt, &a, &b, srf);
+
+ Point2d n = ((b.Minus(a)).Normal()).WithMagnitude(1);
+ double d = a.Dot(n);
+
+ return pt.Dot(n) - d;
+}
+double SBspUv::ScaledDistanceToLine(Point2d pt, Point2d a, Point2d b, bool seg,
+ SSurface *srf)
+{
+ ScalePoints(&pt, &a, &b, srf);
+
+ return pt.DistanceToLine(a, b, seg);
+}
+
+SBspUv *SBspUv::InsertOrCreateEdge(SBspUv *where, const Point2d &ea, const Point2d &eb, SSurface *srf) {
+ if(where == NULL) {
+ SBspUv *ret = Alloc();
+ ret->a = ea;
+ ret->b = eb;
+ return ret;
+ }
+ where->InsertEdge(ea, eb, srf);
+ return where;
+}
+
+void SBspUv::InsertEdge(Point2d ea, Point2d eb, SSurface *srf) {
+ double dea = ScaledSignedDistanceToLine(ea, a, b, srf),
+ deb = ScaledSignedDistanceToLine(eb, a, b, srf);
+
+ if(fabs(dea) < LENGTH_EPS && fabs(deb) < LENGTH_EPS) {
+ // Line segment is coincident with this one, store in same node
+ SBspUv *m = Alloc();
+ m->a = ea;
+ m->b = eb;
+ m->more = more;
+ more = m;
+ } else if(fabs(dea) < LENGTH_EPS) {
+ // Point A lies on this lie, but point B does not
+ if(deb > 0) {
+ pos = InsertOrCreateEdge(pos, ea, eb, srf);
+ } else {
+ neg = InsertOrCreateEdge(neg, ea, eb, srf);
+ }
+ } else if(fabs(deb) < LENGTH_EPS) {
+ // Point B lies on this lie, but point A does not
+ if(dea > 0) {
+ pos = InsertOrCreateEdge(pos, ea, eb, srf);
+ } else {
+ neg = InsertOrCreateEdge(neg, ea, eb, srf);
+ }
+ } else if(dea > 0 && deb > 0) {
+ pos = InsertOrCreateEdge(pos, ea, eb, srf);
+ } else if(dea < 0 && deb < 0) {
+ neg = InsertOrCreateEdge(neg, ea, eb, srf);
+ } else {
+ // New edge crosses this one; we need to split.
+ Point2d n = ((b.Minus(a)).Normal()).WithMagnitude(1);
+ double d = a.Dot(n);
+ double t = (d - n.Dot(ea)) / (n.Dot(eb.Minus(ea)));
+ Point2d pi = ea.Plus((eb.Minus(ea)).ScaledBy(t));
+ if(dea > 0) {
+ pos = InsertOrCreateEdge(pos, ea, pi, srf);
+ neg = InsertOrCreateEdge(neg, pi, eb, srf);
+ } else {
+ neg = InsertOrCreateEdge(neg, ea, pi, srf);
+ pos = InsertOrCreateEdge(pos, pi, eb, srf);
+ }
+ }
+ return;
+}
+
+int SBspUv::ClassifyPoint(Point2d p, Point2d eb, SSurface *srf) {
+
+ double dp = ScaledSignedDistanceToLine(p, a, b, srf);
+
+ if(fabs(dp) < LENGTH_EPS) {
+ SBspUv *f = this;
+ while(f) {
+ Point2d ba = (f->b).Minus(f->a);
+ if(ScaledDistanceToLine(p, f->a, ba, true, srf) < LENGTH_EPS) {
+ if(ScaledDistanceToLine(eb, f->a, ba, false, srf) < LENGTH_EPS){
+ if(ba.Dot(eb.Minus(p)) > 0) {
+ return EDGE_PARALLEL;
+ } else {
+ return EDGE_ANTIPARALLEL;
+ }
+ } else {
+ return EDGE_OTHER;
+ }
+ }
+ f = f->more;
+ }
+ // Pick arbitrarily which side to send it down, doesn't matter
+ int c1 = neg ? neg->ClassifyPoint(p, eb, srf) : OUTSIDE;
+ int c2 = pos ? pos->ClassifyPoint(p, eb, srf) : INSIDE;
+ if(c1 != c2) {
+ dbp("MISMATCH: %d %d %08x %08x", c1, c2, neg, pos);
+ }
+ return c1;
+ } else if(dp > 0) {
+ return pos ? pos->ClassifyPoint(p, eb, srf) : INSIDE;
+ } else {
+ return neg ? neg->ClassifyPoint(p, eb, srf) : OUTSIDE;
+ }
+}
+
+int SBspUv::ClassifyEdge(Point2d ea, Point2d eb, SSurface *srf) {
+ int ret = ClassifyPoint((ea.Plus(eb)).ScaledBy(0.5), eb, srf);
+ if(ret == EDGE_OTHER) {
+ // Perhaps the edge is tangent at its midpoint (and we screwed up
+ // somewhere earlier and failed to split it); try a different
+ // point on the edge.
+ ret = ClassifyPoint(ea.Plus((eb.Minus(ea)).ScaledBy(0.294)), eb, srf);
+ }
+ return ret;
+}
+
+double SBspUv::MinimumDistanceToEdge(Point2d p, SSurface *srf) {
+
+ double dn = (neg) ? neg->MinimumDistanceToEdge(p, srf) : VERY_POSITIVE;
+ double dp = (pos) ? pos->MinimumDistanceToEdge(p, srf) : VERY_POSITIVE;
+
+ Point2d as = a, bs = b;
+ ScalePoints(&p, &as, &bs, srf);
+ double d = p.DistanceToLine(as, bs.Minus(as), true);
+
+ return min(d, min(dn, dp));
+}
+
--- /dev/null
+//-----------------------------------------------------------------------------
+// Anything involving curves and sets of curves (except for the real math,
+// which is in ratpoly.cpp).
+//
+// Copyright 2008-2013 Jonathan Westhues.
+//-----------------------------------------------------------------------------
+#include "../solvespace.h"
+
+SBezier SBezier::From(Vector4 p0, Vector4 p1) {
+ SBezier ret = {};
+ ret.deg = 1;
+ ret.weight[0] = p0.w;
+ ret.ctrl [0] = p0.PerspectiveProject();
+ ret.weight[1] = p1.w;
+ ret.ctrl [1] = p1.PerspectiveProject();
+ return ret;
+}
+
+SBezier SBezier::From(Vector4 p0, Vector4 p1, Vector4 p2) {
+ SBezier ret = {};
+ ret.deg = 2;
+ ret.weight[0] = p0.w;
+ ret.ctrl [0] = p0.PerspectiveProject();
+ ret.weight[1] = p1.w;
+ ret.ctrl [1] = p1.PerspectiveProject();
+ ret.weight[2] = p2.w;
+ ret.ctrl [2] = p2.PerspectiveProject();
+ return ret;
+}
+
+SBezier SBezier::From(Vector4 p0, Vector4 p1, Vector4 p2, Vector4 p3) {
+ SBezier ret = {};
+ ret.deg = 3;
+ ret.weight[0] = p0.w;
+ ret.ctrl [0] = p0.PerspectiveProject();
+ ret.weight[1] = p1.w;
+ ret.ctrl [1] = p1.PerspectiveProject();
+ ret.weight[2] = p2.w;
+ ret.ctrl [2] = p2.PerspectiveProject();
+ ret.weight[3] = p3.w;
+ ret.ctrl [3] = p3.PerspectiveProject();
+ return ret;
+}
+
+SBezier SBezier::From(Vector p0, Vector p1) {
+ return SBezier::From(p0.Project4d(),
+ p1.Project4d());
+}
+
+SBezier SBezier::From(Vector p0, Vector p1, Vector p2) {
+ return SBezier::From(p0.Project4d(),
+ p1.Project4d(),
+ p2.Project4d());
+}
+
+SBezier SBezier::From(Vector p0, Vector p1, Vector p2, Vector p3) {
+ return SBezier::From(p0.Project4d(),
+ p1.Project4d(),
+ p2.Project4d(),
+ p3.Project4d());
+}
+
+Vector SBezier::Start(void) {
+ return ctrl[0];
+}
+
+Vector SBezier::Finish(void) {
+ return ctrl[deg];
+}
+
+void SBezier::Reverse(void) {
+ int i;
+ for(i = 0; i < (deg+1)/2; i++) {
+ swap(ctrl[i], ctrl[deg-i]);
+ swap(weight[i], weight[deg-i]);
+ }
+}
+
+void SBezier::ScaleSelfBy(double s) {
+ int i;
+ for(i = 0; i <= deg; i++) {
+ ctrl[i] = ctrl[i].ScaledBy(s);
+ }
+}
+
+void SBezier::GetBoundingProjd(Vector u, Vector orig,
+ double *umin, double *umax)
+{
+ int i;
+ for(i = 0; i <= deg; i++) {
+ double ut = ((ctrl[i]).Minus(orig)).Dot(u);
+ if(ut < *umin) *umin = ut;
+ if(ut > *umax) *umax = ut;
+ }
+}
+
+SBezier SBezier::TransformedBy(Vector t, Quaternion q, double scale) {
+ SBezier ret = *this;
+ int i;
+ for(i = 0; i <= deg; i++) {
+ ret.ctrl[i] = (ret.ctrl[i]).ScaledBy(scale);
+ ret.ctrl[i] = (q.Rotate(ret.ctrl[i])).Plus(t);
+ }
+ return ret;
+}
+
+//-----------------------------------------------------------------------------
+// Does this curve lie entirely within the specified plane? It does if all
+// the control points lie in that plane.
+//-----------------------------------------------------------------------------
+bool SBezier::IsInPlane(Vector n, double d) {
+ int i;
+ for(i = 0; i <= deg; i++) {
+ if(fabs((ctrl[i]).Dot(n) - d) > LENGTH_EPS) {
+ return false;
+ }
+ }
+ return true;
+}
+
+//-----------------------------------------------------------------------------
+// Is this Bezier exactly the arc of a circle, projected along the specified
+// axis? If yes, return that circle's center and radius.
+//-----------------------------------------------------------------------------
+bool SBezier::IsCircle(Vector axis, Vector *center, double *r) {
+ if(deg != 2) return false;
+
+ if(ctrl[1].DistanceToLine(ctrl[0], ctrl[2].Minus(ctrl[0])) < LENGTH_EPS) {
+ // This is almost a line segment. So it's a circle with very large
+ // radius, which is likely to make code that tries to handle circles
+ // blow up. So return false.
+ return false;
+ }
+
+ Vector t0 = (ctrl[0]).Minus(ctrl[1]),
+ t2 = (ctrl[2]).Minus(ctrl[1]),
+ r0 = axis.Cross(t0),
+ r2 = axis.Cross(t2);
+
+ *center = Vector::AtIntersectionOfLines(ctrl[0], (ctrl[0]).Plus(r0),
+ ctrl[2], (ctrl[2]).Plus(r2),
+ NULL, NULL, NULL);
+
+ double rd0 = center->Minus(ctrl[0]).Magnitude(),
+ rd2 = center->Minus(ctrl[2]).Magnitude();
+ if(fabs(rd0 - rd2) > LENGTH_EPS) {
+ return false;
+ }
+ *r = rd0;
+
+ Vector u = r0.WithMagnitude(1),
+ v = (axis.Cross(u)).WithMagnitude(1);
+ Point2d c2 = center->Project2d(u, v),
+ pa2 = (ctrl[0]).Project2d(u, v).Minus(c2),
+ pb2 = (ctrl[2]).Project2d(u, v).Minus(c2);
+
+ double thetaa = atan2(pa2.y, pa2.x), // in fact always zero due to csys
+ thetab = atan2(pb2.y, pb2.x),
+ dtheta = WRAP_NOT_0(thetab - thetaa, 2*PI);
+ if(dtheta > PI) {
+ // Not possible with a second order Bezier arc; so we must have
+ // the points backwards.
+ dtheta = 2*PI - dtheta;
+ }
+
+ if(fabs(weight[1] - cos(dtheta/2)) > LENGTH_EPS) {
+ return false;
+ }
+
+ return true;
+}
+
+bool SBezier::IsRational(void) {
+ int i;
+ for(i = 0; i <= deg; i++) {
+ if(fabs(weight[i] - 1) > LENGTH_EPS) return true;
+ }
+ return false;
+}
+
+//-----------------------------------------------------------------------------
+// Apply a perspective transformation to a rational Bezier curve, calculating
+// the new weights as required.
+//-----------------------------------------------------------------------------
+SBezier SBezier::InPerspective(Vector u, Vector v, Vector n,
+ Vector origin, double cameraTan)
+{
+ Quaternion q = Quaternion::From(u, v);
+ q = q.Inverse();
+ // we want Q*(p - o) = Q*p - Q*o
+ SBezier ret = this->TransformedBy(q.Rotate(origin).ScaledBy(-1), q, 1.0);
+ int i;
+ for(i = 0; i <= deg; i++) {
+ Vector4 ct = Vector4::From(ret.weight[i], ret.ctrl[i]);
+ // so the desired curve, before perspective, is
+ // (x/w, y/w, z/w)
+ // and after perspective is
+ // ((x/w)/(1 - (z/w)*cameraTan, ...
+ // = (x/(w - z*cameraTan), ...
+ // so we want to let w' = w - z*cameraTan
+ ct.w = ct.w - ct.z*cameraTan;
+
+ ret.ctrl[i] = ct.PerspectiveProject();
+ ret.weight[i] = ct.w;
+ }
+ return ret;
+}
+
+bool SBezier::Equals(SBezier *b) {
+ // We just test of identical degree and control points, even though two
+ // curves could still be coincident (even sharing endpoints).
+ if(deg != b->deg) return false;
+ int i;
+ for(i = 0; i <= deg; i++) {
+ if(!(ctrl[i]).Equals(b->ctrl[i])) return false;
+ if(fabs(weight[i] - b->weight[i]) > LENGTH_EPS) return false;
+ }
+ return true;
+}
+
+void SBezierList::Clear(void) {
+ l.Clear();
+}
+
+void SBezierList::ScaleSelfBy(double s) {
+ SBezier *sb;
+ for(sb = l.First(); sb; sb = l.NextAfter(sb)) {
+ sb->ScaleSelfBy(s);
+ }
+}
+
+//-----------------------------------------------------------------------------
+// If our list contains multiple identical Beziers (in either forward or
+// reverse order), then cull them.
+//-----------------------------------------------------------------------------
+void SBezierList::CullIdenticalBeziers(void) {
+ int i, j;
+
+ l.ClearTags();
+ for(i = 0; i < l.n; i++) {
+ SBezier *bi = &(l.elem[i]), bir;
+ bir = *bi;
+ bir.Reverse();
+
+ for(j = i + 1; j < l.n; j++) {
+ SBezier *bj = &(l.elem[j]);
+ if(bj->Equals(bi) ||
+ bj->Equals(&bir))
+ {
+ bi->tag = 1;
+ bj->tag = 1;
+ }
+ }
+ }
+ l.RemoveTagged();
+}
+
+//-----------------------------------------------------------------------------
+// Find all the points where a list of Bezier curves intersects another list
+// of Bezier curves. We do this by intersecting their piecewise linearizations,
+// and then refining any intersections that we find to lie exactly on the
+// curves. So this will screw up on tangencies and stuff, but otherwise should
+// be fine.
+//-----------------------------------------------------------------------------
+void SBezierList::AllIntersectionsWith(SBezierList *sblb, SPointList *spl) {
+ SBezier *sba, *sbb;
+ for(sba = l.First(); sba; sba = l.NextAfter(sba)) {
+ for(sbb = sblb->l.First(); sbb; sbb = sblb->l.NextAfter(sbb)) {
+ sbb->AllIntersectionsWith(sba, spl);
+ }
+ }
+}
+void SBezier::AllIntersectionsWith(SBezier *sbb, SPointList *spl) {
+ SPointList splRaw = {};
+ SEdgeList sea, seb;
+ sea = {};
+ seb = {};
+ this->MakePwlInto(&sea);
+ sbb ->MakePwlInto(&seb);
+ SEdge *se;
+ for(se = sea.l.First(); se; se = sea.l.NextAfter(se)) {
+ // This isn't quite correct, since AnyEdgeCrossings doesn't count
+ // the case where two pairs of line segments intersect at their
+ // vertices. So this isn't robust, although that case isn't very
+ // likely.
+ seb.AnyEdgeCrossings(se->a, se->b, NULL, &splRaw);
+ }
+ SPoint *sp;
+ for(sp = splRaw.l.First(); sp; sp = splRaw.l.NextAfter(sp)) {
+ Vector p = sp->p;
+ if(PointOnThisAndCurve(sbb, &p)) {
+ if(!spl->ContainsPoint(p)) spl->Add(p);
+ }
+ }
+ sea.Clear();
+ seb.Clear();
+ splRaw.Clear();
+}
+
+//-----------------------------------------------------------------------------
+// Find a plane that contains all of the curves in this list. If the curves
+// are all colinear (or coincident, or empty), then that plane is not exactly
+// determined but we choose the additional degree(s) of freedom arbitrarily.
+// Returns true if all the curves are coplanar, otherwise false.
+//-----------------------------------------------------------------------------
+bool SBezierList::GetPlaneContainingBeziers(Vector *p, Vector *u, Vector *v,
+ Vector *notCoplanarAt)
+{
+ Vector pt, ptFar, ptOffLine, dp, n;
+ double farMax, offLineMax;
+ int i;
+ SBezier *sb;
+
+ // Get any point on any Bezier; or an arbitrary point if list is empty.
+ if(l.n > 0) {
+ pt = l.elem[0].Start();
+ } else {
+ pt = Vector::From(0, 0, 0);
+ }
+ ptFar = ptOffLine = pt;
+
+ // Get the point farthest from our arbitrary point.
+ farMax = VERY_NEGATIVE;
+ for(sb = l.First(); sb; sb = l.NextAfter(sb)) {
+ for(i = 0; i <= sb->deg; i++) {
+ double m = (pt.Minus(sb->ctrl[i])).Magnitude();
+ if(m > farMax) {
+ ptFar = sb->ctrl[i];
+ farMax = m;
+ }
+ }
+ }
+ if(ptFar.Equals(pt)) {
+ // The points are all coincident. So neither basis vector matters.
+ *p = pt;
+ *u = Vector::From(1, 0, 0);
+ *v = Vector::From(0, 1, 0);
+ return true;
+ }
+
+ // Get the point farthest from the line between pt and ptFar
+ dp = ptFar.Minus(pt);
+ offLineMax = VERY_NEGATIVE;
+ for(sb = l.First(); sb; sb = l.NextAfter(sb)) {
+ for(i = 0; i <= sb->deg; i++) {
+ double m = (sb->ctrl[i]).DistanceToLine(pt, dp);
+ if(m > offLineMax) {
+ ptOffLine = sb->ctrl[i];
+ offLineMax = m;
+ }
+ }
+ }
+
+ *p = pt;
+ if(offLineMax < LENGTH_EPS) {
+ // The points are all colinear; so choose the second basis vector
+ // arbitrarily.
+ *u = (ptFar.Minus(pt)).WithMagnitude(1);
+ *v = (u->Normal(0)).WithMagnitude(1);
+ } else {
+ // The points actually define a plane.
+ n = (ptFar.Minus(pt)).Cross(ptOffLine.Minus(pt));
+ *u = (n.Normal(0)).WithMagnitude(1);
+ *v = (n.Normal(1)).WithMagnitude(1);
+ }
+
+ // So we have a plane; but check whether all of the points lie in that
+ // plane.
+ n = u->Cross(*v);
+ n = n.WithMagnitude(1);
+ double d = p->Dot(n);
+ for(sb = l.First(); sb; sb = l.NextAfter(sb)) {
+ for(i = 0; i <= sb->deg; i++) {
+ if(fabs(n.Dot(sb->ctrl[i]) - d) > LENGTH_EPS) {
+ if(notCoplanarAt) *notCoplanarAt = sb->ctrl[i];
+ return false;
+ }
+ }
+ }
+ return true;
+}
+
+//-----------------------------------------------------------------------------
+// Assemble curves in sbl into a single loop. The curves may appear in any
+// direction (start to finish, or finish to start), and will be reversed if
+// necessary. The curves in the returned loop are removed from sbl, even if
+// the loop cannot be closed.
+//-----------------------------------------------------------------------------
+SBezierLoop SBezierLoop::FromCurves(SBezierList *sbl,
+ bool *allClosed, SEdge *errorAt)
+{
+ SBezierLoop loop = {};
+
+ if(sbl->l.n < 1) return loop;
+ sbl->l.ClearTags();
+
+ SBezier *first = &(sbl->l.elem[0]);
+ first->tag = 1;
+ loop.l.Add(first);
+ Vector start = first->Start();
+ Vector hanging = first->Finish();
+ int auxA = first->auxA;
+
+ sbl->l.RemoveTagged();
+
+ while(sbl->l.n > 0 && !hanging.Equals(start)) {
+ int i;
+ bool foundNext = false;
+ for(i = 0; i < sbl->l.n; i++) {
+ SBezier *test = &(sbl->l.elem[i]);
+
+ if((test->Finish()).Equals(hanging) && test->auxA == auxA) {
+ test->Reverse();
+ // and let the next test catch it
+ }
+ if((test->Start()).Equals(hanging) && test->auxA == auxA) {
+ test->tag = 1;
+ loop.l.Add(test);
+ hanging = test->Finish();
+ sbl->l.RemoveTagged();
+ foundNext = true;
+ break;
+ }
+ }
+ if(!foundNext) {
+ // The loop completed without finding the hanging edge, so
+ // it's an open loop
+ errorAt->a = hanging;
+ errorAt->b = start;
+ *allClosed = false;
+ return loop;
+ }
+ }
+ if(hanging.Equals(start)) {
+ *allClosed = true;
+ } else {
+ // We ran out of edges without forming a closed loop.
+ errorAt->a = hanging;
+ errorAt->b = start;
+ *allClosed = false;
+ }
+
+ return loop;
+}
+
+void SBezierLoop::Reverse(void) {
+ l.Reverse();
+ SBezier *sb;
+ for(sb = l.First(); sb; sb = l.NextAfter(sb)) {
+ // If we didn't reverse each curve, then the next curve in list would
+ // share your start, not your finish.
+ sb->Reverse();
+ }
+}
+
+void SBezierLoop::GetBoundingProjd(Vector u, Vector orig,
+ double *umin, double *umax)
+{
+ SBezier *sb;
+ for(sb = l.First(); sb; sb = l.NextAfter(sb)) {
+ sb->GetBoundingProjd(u, orig, umin, umax);
+ }
+}
+
+void SBezierLoop::MakePwlInto(SContour *sc, double chordTol) {
+ SBezier *sb;
+ for(sb = l.First(); sb; sb = l.NextAfter(sb)) {
+ sb->MakePwlInto(sc, chordTol);
+ // Avoid double points at join between Beziers; except that
+ // first and last points should be identical.
+ if(l.NextAfter(sb) != NULL) {
+ sc->l.RemoveLast(1);
+ }
+ }
+ // Ensure that it's exactly closed, not just within a numerical tolerance.
+ if((sc->l.elem[sc->l.n - 1].p).Equals(sc->l.elem[0].p)) {
+ sc->l.elem[sc->l.n - 1] = sc->l.elem[0];
+ }
+}
+
+bool SBezierLoop::IsClosed(void) {
+ if(l.n < 1) return false;
+ Vector s = l.elem[0].Start(),
+ f = l.elem[l.n-1].Finish();
+ return s.Equals(f);
+}
+
+
+//-----------------------------------------------------------------------------
+// Assemble the curves in sbl into multiple loops, and piecewise linearize the
+// curves into poly. If we can't close a contour, then we add it to
+// openContours (if that isn't NULL) and keep going; so this works even if the
+// input contains a mix of open and closed curves.
+//-----------------------------------------------------------------------------
+SBezierLoopSet SBezierLoopSet::From(SBezierList *sbl, SPolygon *poly,
+ double chordTol,
+ bool *allClosed, SEdge *errorAt,
+ SBezierList *openContours)
+{
+ SBezierLoopSet ret = {};
+
+ *allClosed = true;
+ while(sbl->l.n > 0) {
+ bool thisClosed;
+ SBezierLoop loop;
+ loop = SBezierLoop::FromCurves(sbl, &thisClosed, errorAt);
+ if(!thisClosed) {
+ // Record open loops in a separate list, if requested.
+ *allClosed = false;
+ if(openContours) {
+ SBezier *sb;
+ for(sb = loop.l.First(); sb; sb = loop.l.NextAfter(sb)) {
+ openContours->l.Add(sb);
+ }
+ }
+ loop.Clear();
+ } else {
+ ret.l.Add(&loop);
+ poly->AddEmptyContour();
+ loop.MakePwlInto(&(poly->l.elem[poly->l.n-1]), chordTol);
+ }
+ }
+
+ poly->normal = poly->ComputeNormal();
+ ret.normal = poly->normal;
+ if(poly->l.n > 0) {
+ ret.point = poly->AnyPoint();
+ } else {
+ ret.point = Vector::From(0, 0, 0);
+ }
+
+ return ret;
+}
+
+void SBezierLoopSet::GetBoundingProjd(Vector u, Vector orig,
+ double *umin, double *umax)
+{
+ SBezierLoop *sbl;
+ for(sbl = l.First(); sbl; sbl = l.NextAfter(sbl)) {
+ sbl->GetBoundingProjd(u, orig, umin, umax);
+ }
+}
+
+//-----------------------------------------------------------------------------
+// Convert all the Beziers into piecewise linear form, and assemble that into
+// a polygon, one contour per loop.
+//-----------------------------------------------------------------------------
+void SBezierLoopSet::MakePwlInto(SPolygon *sp) {
+ SBezierLoop *sbl;
+ for(sbl = l.First(); sbl; sbl = l.NextAfter(sbl)) {
+ sp->AddEmptyContour();
+ sbl->MakePwlInto(&(sp->l.elem[sp->l.n - 1]));
+ }
+}
+
+void SBezierLoopSet::Clear(void) {
+ int i;
+ for(i = 0; i < l.n; i++) {
+ (l.elem[i]).Clear();
+ }
+ l.Clear();
+}
+
+//-----------------------------------------------------------------------------
+// An export helper function. We start with a list of Bezier curves, and
+// assemble them into loops. We find the outer loops, and find the outer loops'
+// inner loops, and group them accordingly.
+//-----------------------------------------------------------------------------
+void SBezierLoopSetSet::FindOuterFacesFrom(SBezierList *sbl, SPolygon *spxyz,
+ SSurface *srfuv,
+ double chordTol,
+ bool *allClosed, SEdge *notClosedAt,
+ bool *allCoplanar, Vector *notCoplanarAt,
+ SBezierList *openContours)
+{
+ SSurface srfPlane;
+ if(!srfuv) {
+ Vector p, u, v;
+ *allCoplanar =
+ sbl->GetPlaneContainingBeziers(&p, &u, &v, notCoplanarAt);
+ if(!*allCoplanar) {
+ // Don't even try to assemble them into loops if they're not
+ // all coplanar.
+ if(openContours) {
+ SBezier *sb;
+ for(sb = sbl->l.First(); sb; sb = sbl->l.NextAfter(sb)) {
+ openContours->l.Add(sb);
+ }
+ }
+ return;
+ }
+ // All the curves lie in a plane through p with basis vectors u and v.
+ srfPlane = SSurface::FromPlane(p, u, v);
+ srfuv = &srfPlane;
+ }
+
+ int i, j;
+ // Assemble the Bezier trim curves into closed loops; we also get the
+ // piecewise linearization of the curves (in the SPolygon spxyz), as a
+ // calculation aid for the loop direction.
+ SBezierLoopSet sbls = SBezierLoopSet::From(sbl, spxyz, chordTol,
+ allClosed, notClosedAt,
+ openContours);
+ if(sbls.l.n != spxyz->l.n) return;
+
+ // Convert the xyz piecewise linear to uv piecewise linear.
+ SPolygon spuv = {};
+ SContour *sc;
+ for(sc = spxyz->l.First(); sc; sc = spxyz->l.NextAfter(sc)) {
+ spuv.AddEmptyContour();
+ SPoint *pt;
+ for(pt = sc->l.First(); pt; pt = sc->l.NextAfter(pt)) {
+ double u, v;
+ srfuv->ClosestPointTo(pt->p, &u, &v);
+ spuv.l.elem[spuv.l.n - 1].AddPoint(Vector::From(u, v, 0));
+ }
+ }
+ spuv.normal = Vector::From(0, 0, 1); // must be, since it's in xy plane now
+
+ static const int OUTER_LOOP = 10;
+ static const int INNER_LOOP = 20;
+ static const int USED_LOOP = 30;
+ // Fix the contour directions; we do this properly, in uv space, so it
+ // works for curved surfaces too (important for STEP export).
+ spuv.FixContourDirections();
+ for(i = 0; i < spuv.l.n; i++) {
+ SContour *contour = &(spuv.l.elem[i]);
+ SBezierLoop *bl = &(sbls.l.elem[i]);
+ if(contour->tag) {
+ // This contour got reversed in the polygon to make the directions
+ // consistent, so the same must be necessary for the Bezier loop.
+ bl->Reverse();
+ }
+ if(contour->IsClockwiseProjdToNormal(spuv.normal)) {
+ bl->tag = INNER_LOOP;
+ } else {
+ bl->tag = OUTER_LOOP;
+ }
+ }
+
+ bool loopsRemaining = true;
+ while(loopsRemaining) {
+ loopsRemaining = false;
+ for(i = 0; i < sbls.l.n; i++) {
+ SBezierLoop *loop = &(sbls.l.elem[i]);
+ if(loop->tag != OUTER_LOOP) continue;
+
+ // Check if this contour contains any outer loops; if it does, then
+ // we should do those "inner outer loops" first; otherwise we
+ // will steal their holes, since their holes also lie inside this
+ // contour.
+ for(j = 0; j < sbls.l.n; j++) {
+ SBezierLoop *outer = &(sbls.l.elem[j]);
+ if(i == j) continue;
+ if(outer->tag != OUTER_LOOP) continue;
+
+ Vector p = spuv.l.elem[j].AnyEdgeMidpoint();
+ if(spuv.l.elem[i].ContainsPointProjdToNormal(spuv.normal, p)) {
+ break;
+ }
+ }
+ if(j < sbls.l.n) {
+ // It does, can't do this one yet.
+ continue;
+ }
+
+ SBezierLoopSet outerAndInners = {};
+ loopsRemaining = true;
+ loop->tag = USED_LOOP;
+ outerAndInners.l.Add(loop);
+ int auxA = 0;
+ if(loop->l.n > 0) auxA = loop->l.elem[0].auxA;
+
+ for(j = 0; j < sbls.l.n; j++) {
+ SBezierLoop *inner = &(sbls.l.elem[j]);
+ if(inner->tag != INNER_LOOP) continue;
+ if(inner->l.n < 1) continue;
+ if(inner->l.elem[0].auxA != auxA) continue;
+
+ Vector p = spuv.l.elem[j].AnyEdgeMidpoint();
+ if(spuv.l.elem[i].ContainsPointProjdToNormal(spuv.normal, p)) {
+ outerAndInners.l.Add(inner);
+ inner->tag = USED_LOOP;
+ }
+ }
+
+ outerAndInners.point = srfuv->PointAt(0, 0);
+ outerAndInners.normal = srfuv->NormalAt(0, 0);
+ l.Add(&outerAndInners);
+ }
+ }
+
+ // If we have poorly-formed loops--for example, overlapping zero-area
+ // stuff--then we can end up with leftovers. We use this function to
+ // group stuff into closed paths for export when possible, so it's bad
+ // to screw up on that stuff. So just add them onto the open curve list.
+ // Very ugly, but better than losing curves.
+ for(i = 0; i < sbls.l.n; i++) {
+ SBezierLoop *loop = &(sbls.l.elem[i]);
+ if(loop->tag == USED_LOOP) continue;
+
+ if(openContours) {
+ SBezier *sb;
+ for(sb = loop->l.First(); sb; sb = loop->l.NextAfter(sb)) {
+ openContours->l.Add(sb);
+ }
+ }
+ loop->Clear();
+ // but don't free the used loops, since we shallow-copied them to
+ // ourself
+ }
+
+ sbls.l.Clear(); // not sbls.Clear(), since that would deep-clear
+ spuv.Clear();
+}
+
+void SBezierLoopSetSet::AddOpenPath(SBezier *sb) {
+ SBezierLoop sbl = {};
+ sbl.l.Add(sb);
+
+ SBezierLoopSet sbls = {};
+ sbls.l.Add(&sbl);
+
+ l.Add(&sbls);
+}
+
+void SBezierLoopSetSet::Clear(void) {
+ SBezierLoopSet *sbls;
+ for(sbls = l.First(); sbls; sbls = l.NextAfter(sbls)) {
+ sbls->Clear();
+ }
+ l.Clear();
+}
+
+SCurve SCurve::FromTransformationOf(SCurve *a,
+ Vector t, Quaternion q, double scale)
+{
+ SCurve ret = {};
+
+ ret.h = a->h;
+ ret.isExact = a->isExact;
+ ret.exact = (a->exact).TransformedBy(t, q, scale);
+ ret.surfA = a->surfA;
+ ret.surfB = a->surfB;
+
+ SCurvePt *p;
+ for(p = a->pts.First(); p; p = a->pts.NextAfter(p)) {
+ SCurvePt pp = *p;
+ pp.p = (pp.p).ScaledBy(scale);
+ pp.p = (q.Rotate(pp.p)).Plus(t);
+ ret.pts.Add(&pp);
+ }
+ return ret;
+}
+
+void SCurve::Clear(void) {
+ pts.Clear();
+}
+
+SSurface *SCurve::GetSurfaceA(SShell *a, SShell *b) {
+ if(source == FROM_A) {
+ return a->surface.FindById(surfA);
+ } else if(source == FROM_B) {
+ return b->surface.FindById(surfA);
+ } else if(source == FROM_INTERSECTION) {
+ return a->surface.FindById(surfA);
+ } else oops();
+}
+
+SSurface *SCurve::GetSurfaceB(SShell *a, SShell *b) {
+ if(source == FROM_A) {
+ return a->surface.FindById(surfB);
+ } else if(source == FROM_B) {
+ return b->surface.FindById(surfB);
+ } else if(source == FROM_INTERSECTION) {
+ return b->surface.FindById(surfB);
+ } else oops();
+}
+
+//-----------------------------------------------------------------------------
+// When we split line segments wherever they intersect a surface, we introduce
+// extra pwl points. This may create very short edges that could be removed
+// without violating the chord tolerance. Those are ugly, and also break
+// stuff in the Booleans. So remove them.
+//-----------------------------------------------------------------------------
+void SCurve::RemoveShortSegments(SSurface *srfA, SSurface *srfB) {
+ // Three, not two; curves are pwl'd to at least two edges (three points)
+ // even if not necessary, to avoid square holes.
+ if(pts.n <= 3) return;
+ pts.ClearTags();
+
+ Vector prev = pts.elem[0].p;
+ int i, a;
+ for(i = 1; i < pts.n - 1; i++) {
+ SCurvePt *sct = &(pts.elem[i]),
+ *scn = &(pts.elem[i+1]);
+ if(sct->vertex) {
+ prev = sct->p;
+ continue;
+ }
+ bool mustKeep = false;
+
+ // We must check against both surfaces; the piecewise linear edge
+ // may have a different chord tolerance in the two surfaces. (For
+ // example, a circle in the surface of a cylinder is just a straight
+ // line, so it always has perfect chord tol, but that circle in
+ // a plane is a circle so it doesn't).
+ for(a = 0; a < 2; a++) {
+ SSurface *srf = (a == 0) ? srfA : srfB;
+ Vector puv, nuv;
+ srf->ClosestPointTo(prev, &(puv.x), &(puv.y));
+ srf->ClosestPointTo(scn->p, &(nuv.x), &(nuv.y));
+
+ if(srf->ChordToleranceForEdge(nuv, puv) > SS.ChordTolMm()) {
+ mustKeep = true;
+ }
+ }
+
+ if(mustKeep) {
+ prev = sct->p;
+ } else {
+ sct->tag = 1;
+ // and prev is unchanged, since there's no longer any point
+ // in between
+ }
+ }
+
+ pts.RemoveTagged();
+}
+
+STrimBy STrimBy::EntireCurve(SShell *shell, hSCurve hsc, bool backwards) {
+ STrimBy stb = {};
+ stb.curve = hsc;
+ SCurve *sc = shell->curve.FindById(hsc);
+
+ if(backwards) {
+ stb.finish = sc->pts.elem[0].p;
+ stb.start = sc->pts.elem[sc->pts.n - 1].p;
+ stb.backwards = true;
+ } else {
+ stb.start = sc->pts.elem[0].p;
+ stb.finish = sc->pts.elem[sc->pts.n - 1].p;
+ stb.backwards = false;
+ }
+
+ return stb;
+}
+
--- /dev/null
+//-----------------------------------------------------------------------------
+// Routines to merge multiple coincident surfaces (each with their own trim
+// curves) into a single surface, with all of the trim curves.
+//
+// Copyright 2008-2013 Jonathan Westhues.
+//-----------------------------------------------------------------------------
+#include "../solvespace.h"
+
+void SShell::MergeCoincidentSurfaces(void) {
+ surface.ClearTags();
+
+ int i, j;
+ SSurface *si, *sj;
+
+ for(i = 0; i < surface.n; i++) {
+ si = &(surface.elem[i]);
+ if(si->tag) continue;
+ // Let someone else clean up the empty surfaces; we can certainly merge
+ // them, but we don't know how to calculate a reasonable bounding box.
+ if(si->trim.n == 0) continue;
+ // And for now we handle only coincident planes, so no sense wasting
+ // time on other surfaces.
+ if(si->degm != 1 || si->degn != 1) continue;
+
+ SEdgeList sel = {};
+ si->MakeEdgesInto(this, &sel, SSurface::AS_XYZ);
+
+ bool mergedThisTime, merged = false;
+ do {
+ mergedThisTime = false;
+
+ for(j = i + 1; j < surface.n; j++) {
+ sj = &(surface.elem[j]);
+ if(sj->tag) continue;
+ if(!sj->CoincidentWith(si, true)) continue;
+ if(!sj->color.Equals(si->color)) continue;
+ // But we do merge surfaces with different face entities, since
+ // otherwise we'd hardly ever merge anything.
+
+ // This surface is coincident. But let's not merge coincident
+ // surfaces if they contain disjoint contours; that just makes
+ // the bounding box tests less effective, and possibly things
+ // less robust.
+ SEdgeList tel = {};
+ sj->MakeEdgesInto(this, &tel, SSurface::AS_XYZ);
+ if(!sel.ContainsEdgeFrom(&tel)) {
+ tel.Clear();
+ continue;
+ }
+ tel.Clear();
+
+ sj->tag = 1;
+ merged = true;
+ mergedThisTime = true;
+ sj->MakeEdgesInto(this, &sel, SSurface::AS_XYZ);
+ sj->trim.Clear();
+
+ // All the references to this surface get replaced with the
+ // new srf
+ SCurve *sc;
+ for(sc = curve.First(); sc; sc = curve.NextAfter(sc)) {
+ if(sc->surfA.v == sj->h.v) sc->surfA = si->h;
+ if(sc->surfB.v == sj->h.v) sc->surfB = si->h;
+ }
+ }
+
+ // If this iteration merged a contour onto ours, then we have to
+ // go through the surfaces again; that might have made a new
+ // surface touch us.
+ } while(mergedThisTime);
+
+ if(merged) {
+ sel.CullExtraneousEdges();
+ si->trim.Clear();
+ si->TrimFromEdgeList(&sel, false);
+
+ // And we must choose control points such that all the trims lie
+ // with u and v in [0, 1], so that the bbox tests work.
+ Vector u, v, n;
+ si->TangentsAt(0.5, 0.5, &u, &v);
+ u = u.WithMagnitude(1);
+ v = v.WithMagnitude(1);
+ n = si->NormalAt(0.5, 0.5).WithMagnitude(1);
+ v = (n.Cross(u)).WithMagnitude(1);
+
+ double umax = VERY_NEGATIVE, umin = VERY_POSITIVE,
+ vmax = VERY_NEGATIVE, vmin = VERY_POSITIVE;
+ SEdge *se;
+ for(se = sel.l.First(); se; se = sel.l.NextAfter(se)) {
+ double ut = (se->a).Dot(u), vt = (se->a).Dot(v);
+ umax = max(umax, ut);
+ vmax = max(vmax, vt);
+ umin = min(umin, ut);
+ vmin = min(vmin, vt);
+ }
+
+ // An interesting problem here; the real curve could extend
+ // slightly beyond the bounding box of the piecewise linear
+ // bits. Not a problem for us, but some apps won't import STEP
+ // in that case. So give a bit of extra room; in theory just
+ // a chord tolerance, but more can't hurt.
+ double muv = max((umax - umin), (vmax - vmin));
+ double tol = muv/50 + 3*SS.ChordTolMm();
+ umax += tol;
+ vmax += tol;
+ umin -= tol;
+ vmin -= tol;
+
+ // We move in the +v direction as v goes from 0 to 1, and in the
+ // +u direction as u goes from 0 to 1. So our normal ends up
+ // pointed the same direction.
+ double nt = (si->ctrl[0][0]).Dot(n);
+ si->ctrl[0][0] =
+ Vector::From(umin, vmin, nt).ScaleOutOfCsys(u, v, n);
+ si->ctrl[0][1] =
+ Vector::From(umin, vmax, nt).ScaleOutOfCsys(u, v, n);
+ si->ctrl[1][1] =
+ Vector::From(umax, vmax, nt).ScaleOutOfCsys(u, v, n);
+ si->ctrl[1][0] =
+ Vector::From(umax, vmin, nt).ScaleOutOfCsys(u, v, n);
+ }
+ sel.Clear();
+ }
+
+ surface.RemoveTagged();
+}
+
--- /dev/null
+//-----------------------------------------------------------------------------
+// Math on rational polynomial surfaces and curves, typically in Bezier
+// form. Evaluate, root-find (by Newton's methods), evaluate derivatives,
+// and so on.
+//
+// Copyright 2008-2013 Jonathan Westhues.
+//-----------------------------------------------------------------------------
+#include "../solvespace.h"
+
+// Converge it to better than LENGTH_EPS; we want two points, each
+// independently projected into uv and back, to end up equal with the
+// LENGTH_EPS. Best case that requires LENGTH_EPS/2, but more is better
+// and convergence should be fast by now.
+#define RATPOLY_EPS (LENGTH_EPS/(1e2))
+
+double SolveSpace::Bernstein(int k, int deg, double t)
+{
+ if(k > deg || k < 0) return 0;
+
+ switch(deg) {
+ case 0:
+ return 1;
+
+ case 1:
+ if(k == 0) {
+ return (1 - t);
+ } else if(k == 1) {
+ return t;
+ }
+ break;
+
+ case 2:
+ if(k == 0) {
+ return (1 - t)*(1 - t);
+ } else if(k == 1) {
+ return 2*(1 - t)*t;
+ } else if(k == 2) {
+ return t*t;
+ }
+ break;
+
+ case 3:
+ if(k == 0) {
+ return (1 - t)*(1 - t)*(1 - t);
+ } else if(k == 1) {
+ return 3*(1 - t)*(1 - t)*t;
+ } else if(k == 2) {
+ return 3*(1 - t)*t*t;
+ } else if(k == 3) {
+ return t*t*t;
+ }
+ break;
+ }
+ oops();
+}
+
+double SolveSpace::BernsteinDerivative(int k, int deg, double t)
+{
+ switch(deg) {
+ case 0:
+ return 0;
+
+ case 1:
+ if(k == 0) {
+ return -1;
+ } else if(k == 1) {
+ return 1;
+ }
+ break;
+
+ case 2:
+ if(k == 0) {
+ return -2 + 2*t;
+ } else if(k == 1) {
+ return 2 - 4*t;
+ } else if(k == 2) {
+ return 2*t;
+ }
+ break;
+
+ case 3:
+ if(k == 0) {
+ return -3 + 6*t - 3*t*t;
+ } else if(k == 1) {
+ return 3 - 12*t + 9*t*t;
+ } else if(k == 2) {
+ return 6*t - 9*t*t;
+ } else if(k == 3) {
+ return 3*t*t;
+ }
+ break;
+ }
+ oops();
+}
+
+Vector SBezier::PointAt(double t) {
+ Vector pt = Vector::From(0, 0, 0);
+ double d = 0;
+
+ int i;
+ for(i = 0; i <= deg; i++) {
+ double B = Bernstein(i, deg, t);
+ pt = pt.Plus(ctrl[i].ScaledBy(B*weight[i]));
+ d += weight[i]*B;
+ }
+ pt = pt.ScaledBy(1.0/d);
+ return pt;
+}
+
+Vector SBezier::TangentAt(double t) {
+ Vector pt = Vector::From(0, 0, 0), pt_p = Vector::From(0, 0, 0);
+ double d = 0, d_p = 0;
+
+ int i;
+ for(i = 0; i <= deg; i++) {
+ double B = Bernstein(i, deg, t),
+ Bp = BernsteinDerivative(i, deg, t);
+
+ pt = pt.Plus(ctrl[i].ScaledBy(B*weight[i]));
+ d += weight[i]*B;
+
+ pt_p = pt_p.Plus(ctrl[i].ScaledBy(Bp*weight[i]));
+ d_p += weight[i]*Bp;
+ }
+
+ // quotient rule; f(t) = n(t)/d(t), so f' = (n'*d - n*d')/(d^2)
+ Vector ret;
+ ret = (pt_p.ScaledBy(d)).Minus(pt.ScaledBy(d_p));
+ ret = ret.ScaledBy(1.0/(d*d));
+ return ret;
+}
+
+void SBezier::ClosestPointTo(Vector p, double *t, bool converge) {
+ int i;
+ double minDist = VERY_POSITIVE;
+ *t = 0;
+ double res = (deg <= 2) ? 7.0 : 20.0;
+ for(i = 0; i < (int)res; i++) {
+ double tryt = (i/res);
+
+ Vector tryp = PointAt(tryt);
+ double d = (tryp.Minus(p)).Magnitude();
+ if(d < minDist) {
+ *t = tryt;
+ minDist = d;
+ }
+ }
+
+ Vector p0;
+ for(i = 0; i < (converge ? 15 : 5); i++) {
+ p0 = PointAt(*t);
+ if(p0.Equals(p, RATPOLY_EPS)) {
+ return;
+ }
+
+ Vector dp = TangentAt(*t);
+ Vector pc = p.ClosestPointOnLine(p0, dp);
+ *t += (pc.Minus(p0)).DivPivoting(dp);
+ }
+ if(converge) {
+ dbp("didn't converge (closest point on bezier curve)");
+ }
+}
+
+bool SBezier::PointOnThisAndCurve(SBezier *sbb, Vector *p) {
+ double ta, tb;
+ this->ClosestPointTo(*p, &ta, false);
+ sbb ->ClosestPointTo(*p, &tb, false);
+
+ int i;
+ for(i = 0; i < 20; i++) {
+ Vector pa = this->PointAt(ta),
+ pb = sbb ->PointAt(tb),
+ da = this->TangentAt(ta),
+ db = sbb ->TangentAt(tb);
+
+ if(pa.Equals(pb, RATPOLY_EPS)) {
+ *p = pa;
+ return true;
+ }
+
+ double tta, ttb;
+ Vector::ClosestPointBetweenLines(pa, da, pb, db, &tta, &ttb);
+ ta += tta;
+ tb += ttb;
+ }
+ return false;
+}
+
+void SBezier::SplitAt(double t, SBezier *bef, SBezier *aft) {
+ Vector4 ct[4];
+ int i;
+ for(i = 0; i <= deg; i++) {
+ ct[i] = Vector4::From(weight[i], ctrl[i]);
+ }
+
+ switch(deg) {
+ case 1: {
+ Vector4 cts = Vector4::Blend(ct[0], ct[1], t);
+ *bef = SBezier::From(ct[0], cts);
+ *aft = SBezier::From(cts, ct[1]);
+ break;
+ }
+ case 2: {
+ Vector4 ct01 = Vector4::Blend(ct[0], ct[1], t),
+ ct12 = Vector4::Blend(ct[1], ct[2], t),
+ cts = Vector4::Blend(ct01, ct12, t);
+
+ *bef = SBezier::From(ct[0], ct01, cts);
+ *aft = SBezier::From(cts, ct12, ct[2]);
+ break;
+ }
+ case 3: {
+ Vector4 ct01 = Vector4::Blend(ct[0], ct[1], t),
+ ct12 = Vector4::Blend(ct[1], ct[2], t),
+ ct23 = Vector4::Blend(ct[2], ct[3], t),
+ ct01_12 = Vector4::Blend(ct01, ct12, t),
+ ct12_23 = Vector4::Blend(ct12, ct23, t),
+ cts = Vector4::Blend(ct01_12, ct12_23, t);
+
+ *bef = SBezier::From(ct[0], ct01, ct01_12, cts);
+ *aft = SBezier::From(cts, ct12_23, ct23, ct[3]);
+ break;
+ }
+ default: oops();
+ }
+}
+
+void SBezier::MakePwlInto(SEdgeList *sel, double chordTol) {
+ List<Vector> lv = {};
+ MakePwlInto(&lv, chordTol);
+ int i;
+ for(i = 1; i < lv.n; i++) {
+ sel->AddEdge(lv.elem[i-1], lv.elem[i]);
+ }
+ lv.Clear();
+}
+void SBezier::MakePwlInto(List<SCurvePt> *l, double chordTol) {
+ List<Vector> lv = {};
+ MakePwlInto(&lv, chordTol);
+ int i;
+ for(i = 0; i < lv.n; i++) {
+ SCurvePt scpt;
+ scpt.tag = 0;
+ scpt.p = lv.elem[i];
+ scpt.vertex = (i == 0) || (i == (lv.n - 1));
+ l->Add(&scpt);
+ }
+ lv.Clear();
+}
+void SBezier::MakePwlInto(SContour *sc, double chordTol) {
+ List<Vector> lv = {};
+ MakePwlInto(&lv, chordTol);
+ int i;
+ for(i = 0; i < lv.n; i++) {
+ sc->AddPoint(lv.elem[i]);
+ }
+ lv.Clear();
+}
+void SBezier::MakePwlInto(List<Vector> *l, double chordTol) {
+ if(EXACT(chordTol == 0)) {
+ // Use the default chord tolerance.
+ chordTol = SS.ChordTolMm();
+ }
+ l->Add(&(ctrl[0]));
+ if(deg == 1) {
+ l->Add(&(ctrl[1]));
+ } else {
+ // Never do fewer than one intermediate point; people seem to get
+ // unhappy when their circles turn into squares, but maybe less
+ // unhappy with octagons.
+ MakePwlInitialWorker(l, 0.0, 0.5, chordTol);
+ MakePwlInitialWorker(l, 0.5, 1.0, chordTol);
+ }
+}
+void SBezier::MakePwlWorker(List<Vector> *l, double ta, double tb, double chordTol)
+{
+ Vector pa = PointAt(ta);
+ Vector pb = PointAt(tb);
+
+ Vector pm = PointAt((ta + tb) / 2.0);
+ double d = pm.DistanceToLine(pa, pb.Minus(pa));
+
+ double step = 1.0/SS.GetMaxSegments();
+ if((tb - ta) < step || d < chordTol) {
+ // A previous call has already added the beginning of our interval.
+ l->Add(&pb);
+ } else {
+ double tm = (ta + tb) / 2;
+ MakePwlWorker(l, ta, tm, chordTol);
+ MakePwlWorker(l, tm, tb, chordTol);
+ }
+}
+void SBezier::MakePwlInitialWorker(List<Vector> *l, double ta, double tb, double chordTol)
+{
+ Vector pa = PointAt(ta);
+ Vector pb = PointAt(tb);
+
+ double tm1 = ta + (tb - ta) * 0.25;
+ double tm2 = ta + (tb - ta) * 0.5;
+ double tm3 = ta + (tb - ta) * 0.75;
+
+ Vector pm1 = PointAt(tm1);
+ Vector pm2 = PointAt(tm2);
+ Vector pm3 = PointAt(tm3);
+ Vector dir = pb.Minus(pa);
+
+ double d = max({
+ pm1.DistanceToLine(pa, dir),
+ pm2.DistanceToLine(pa, dir),
+ pm3.DistanceToLine(pa, dir)
+ });
+
+ double step = 1.0/SS.GetMaxSegments();
+ if((tb - ta) < step || d < chordTol) {
+ // A previous call has already added the beginning of our interval.
+ l->Add(&pb);
+ } else {
+ double tm = (ta + tb) / 2;
+ MakePwlWorker(l, ta, tm, chordTol);
+ MakePwlWorker(l, tm, tb, chordTol);
+ }
+}
+
+Vector SSurface::PointAt(Point2d puv) {
+ return PointAt(puv.x, puv.y);
+}
+Vector SSurface::PointAt(double u, double v) {
+ Vector num = Vector::From(0, 0, 0);
+ double den = 0;
+
+ int i, j;
+ for(i = 0; i <= degm; i++) {
+ for(j = 0; j <= degn; j++) {
+ double Bi = Bernstein(i, degm, u),
+ Bj = Bernstein(j, degn, v);
+
+ num = num.Plus(ctrl[i][j].ScaledBy(Bi*Bj*weight[i][j]));
+ den += weight[i][j]*Bi*Bj;
+ }
+ }
+ num = num.ScaledBy(1.0/den);
+ return num;
+}
+
+void SSurface::TangentsAt(double u, double v, Vector *tu, Vector *tv) {
+ Vector num = Vector::From(0, 0, 0),
+ num_u = Vector::From(0, 0, 0),
+ num_v = Vector::From(0, 0, 0);
+ double den = 0,
+ den_u = 0,
+ den_v = 0;
+
+ int i, j;
+ for(i = 0; i <= degm; i++) {
+ for(j = 0; j <= degn; j++) {
+ double Bi = Bernstein(i, degm, u),
+ Bj = Bernstein(j, degn, v),
+ Bip = BernsteinDerivative(i, degm, u),
+ Bjp = BernsteinDerivative(j, degn, v);
+
+ num = num.Plus(ctrl[i][j].ScaledBy(Bi*Bj*weight[i][j]));
+ den += weight[i][j]*Bi*Bj;
+
+ num_u = num_u.Plus(ctrl[i][j].ScaledBy(Bip*Bj*weight[i][j]));
+ den_u += weight[i][j]*Bip*Bj;
+
+ num_v = num_v.Plus(ctrl[i][j].ScaledBy(Bi*Bjp*weight[i][j]));
+ den_v += weight[i][j]*Bi*Bjp;
+ }
+ }
+ // quotient rule; f(t) = n(t)/d(t), so f' = (n'*d - n*d')/(d^2)
+ *tu = ((num_u.ScaledBy(den)).Minus(num.ScaledBy(den_u)));
+ *tu = tu->ScaledBy(1.0/(den*den));
+
+ *tv = ((num_v.ScaledBy(den)).Minus(num.ScaledBy(den_v)));
+ *tv = tv->ScaledBy(1.0/(den*den));
+}
+
+Vector SSurface::NormalAt(Point2d puv) {
+ return NormalAt(puv.x, puv.y);
+}
+Vector SSurface::NormalAt(double u, double v) {
+ Vector tu, tv;
+ TangentsAt(u, v, &tu, &tv);
+ return tu.Cross(tv);
+}
+
+void SSurface::ClosestPointTo(Vector p, Point2d *puv, bool converge) {
+ ClosestPointTo(p, &(puv->x), &(puv->y), converge);
+}
+void SSurface::ClosestPointTo(Vector p, double *u, double *v, bool converge) {
+ // A few special cases first; when control points are coincident the
+ // derivative goes to zero at the conrol points, and would result in
+ // nonconvergence. We avoid that here, and also guarantee a consistent
+ // (u, v) (of the infinitely many possible in one parameter).
+ if(p.Equals(ctrl[0] [0] )) { *u = 0; *v = 0; return; }
+ if(p.Equals(ctrl[degm][0] )) { *u = 1; *v = 0; return; }
+ if(p.Equals(ctrl[degm][degn])) { *u = 1; *v = 1; return; }
+ if(p.Equals(ctrl[0] [degn])) { *u = 0; *v = 1; return; }
+
+ // And planes are trivial, so don't waste time iterating over those.
+ if(degm == 1 && degn == 1) {
+ Vector orig = ctrl[0][0],
+ bu = (ctrl[1][0]).Minus(orig),
+ bv = (ctrl[0][1]).Minus(orig);
+ if((ctrl[1][1]).Equals(orig.Plus(bu).Plus(bv))) {
+ Vector dp = p.Minus(orig);
+ *u = dp.Dot(bu) / bu.MagSquared();
+ *v = dp.Dot(bv) / bv.MagSquared();
+ return;
+ }
+ }
+
+ // Try whatever the previous guess was. This is likely to do something
+ // good if we're working our way along a curve or something else where
+ // we project successive points that are close to each other; something
+ // like a 20% speedup empirically.
+ if(converge) {
+ double ut = cached.x, vt = cached.y;
+ if(ClosestPointNewton(p, &ut, &vt, converge)) {
+ cached.x = *u = ut;
+ cached.y = *v = vt;
+ return;
+ }
+ }
+
+ // Search for a reasonable initial guess
+ int i, j;
+ double minDist = VERY_POSITIVE;
+ int res = (max(degm, degn) == 2) ? 7 : 20;
+ for(i = 0; i < res; i++) {
+ for(j = 0; j < res; j++) {
+ double tryu = (i + 0.5)/res, tryv = (j + 0.5)/res;
+
+ Vector tryp = PointAt(tryu, tryv);
+ double d = (tryp.Minus(p)).Magnitude();
+ if(d < minDist) {
+ *u = tryu;
+ *v = tryv;
+ minDist = d;
+ }
+ }
+ }
+
+ if(ClosestPointNewton(p, u, v, converge)) {
+ cached.x = *u;
+ cached.y = *v;
+ return;
+ }
+
+ // If we failed to converge, then at least don't return NaN.
+ if(isnan(*u) || isnan(*v)) {
+ *u = *v = 0;
+ }
+}
+
+bool SSurface::ClosestPointNewton(Vector p, double *u, double *v, bool converge)
+{
+ // Initial guess is in u, v; refine by Newton iteration.
+ Vector p0 = Vector::From(0, 0, 0);
+ for(int i = 0; i < (converge ? 25 : 5); i++) {
+ p0 = PointAt(*u, *v);
+ if(converge) {
+ if(p0.Equals(p, RATPOLY_EPS)) {
+ return true;
+ }
+ }
+
+ Vector tu, tv;
+ TangentsAt(*u, *v, &tu, &tv);
+
+ // Project the point into a plane through p0, with basis tu, tv; a
+ // second-order thing would converge faster but needs second
+ // derivatives.
+ Vector dp = p.Minus(p0);
+ double du = dp.Dot(tu), dv = dp.Dot(tv);
+ *u += du / (tu.MagSquared());
+ *v += dv / (tv.MagSquared());
+ }
+
+ if(converge) {
+ dbp("didn't converge");
+ dbp("have %.3f %.3f %.3f", CO(p0));
+ dbp("want %.3f %.3f %.3f", CO(p));
+ dbp("distance = %g", (p.Minus(p0)).Magnitude());
+ }
+ return false;
+}
+
+bool SSurface::PointIntersectingLine(Vector p0, Vector p1, double *u, double *v)
+{
+ int i;
+ for(i = 0; i < 15; i++) {
+ Vector pi, p, tu, tv;
+ p = PointAt(*u, *v);
+ TangentsAt(*u, *v, &tu, &tv);
+
+ Vector n = (tu.Cross(tv)).WithMagnitude(1);
+ double d = p.Dot(n);
+
+ bool parallel;
+ pi = Vector::AtIntersectionOfPlaneAndLine(n, d, p0, p1, ¶llel);
+ if(parallel) break;
+
+ // Check for convergence
+ if(pi.Equals(p, RATPOLY_EPS)) return true;
+
+ // Adjust our guess and iterate
+ Vector dp = pi.Minus(p);
+ double du = dp.Dot(tu), dv = dp.Dot(tv);
+ *u += du / (tu.MagSquared());
+ *v += dv / (tv.MagSquared());
+ }
+// dbp("didn't converge (surface intersecting line)");
+ return false;
+}
+
+Vector SSurface::ClosestPointOnThisAndSurface(SSurface *srf2, Vector p) {
+ // This is untested.
+ int i, j;
+ Point2d puv[2];
+ SSurface *srf[2] = { this, srf2 };
+
+ for(j = 0; j < 2; j++) {
+ (srf[j])->ClosestPointTo(p, &(puv[j]), false);
+ }
+
+ for(i = 0; i < 10; i++) {
+ Vector tu[2], tv[2], cp[2], n[2];
+ double d[2];
+
+ for(j = 0; j < 2; j++) {
+ (srf[j])->TangentsAt(puv[j].x, puv[j].y, &(tu[j]), &(tv[j]));
+
+ cp[j] = (srf[j])->PointAt(puv[j]);
+
+ n[j] = ((tu[j]).Cross(tv[j])).WithMagnitude(1);
+ d[j] = (n[j]).Dot(cp[j]);
+ }
+
+ if((cp[0]).Equals(cp[1], RATPOLY_EPS)) break;
+
+ Vector p0 = Vector::AtIntersectionOfPlanes(n[0], d[0], n[1], d[1]),
+ dp = (n[0]).Cross(n[1]);
+
+ Vector pc = p.ClosestPointOnLine(p0, dp);
+
+ // Adjust our guess and iterate
+ for(j = 0; j < 2; j++) {
+ Vector dc = pc.Minus(cp[j]);
+ double du = dc.Dot(tu[j]), dv = dc.Dot(tv[j]);
+ puv[j].x += du / ((tu[j]).MagSquared());
+ puv[j].y += dv / ((tv[j]).MagSquared());
+ }
+ }
+ if(i >= 10) {
+ dbp("this and srf, didn't converge, d=%g",
+ (puv[0].Minus(puv[1])).Magnitude());
+ }
+
+ // If this converged, then the two points are actually equal.
+ return ((srf[0])->PointAt(puv[0])).Plus(
+ ((srf[1])->PointAt(puv[1]))).ScaledBy(0.5);
+}
+
+void SSurface::PointOnSurfaces(SSurface *s1, SSurface *s2,
+ double *up, double *vp)
+{
+ double u[3] = { *up, 0, 0 }, v[3] = { *vp, 0, 0 };
+ SSurface *srf[3] = { this, s1, s2 };
+
+ // Get initial guesses for (u, v) in the other surfaces
+ Vector p = PointAt(*u, *v);
+ (srf[1])->ClosestPointTo(p, &(u[1]), &(v[1]), false);
+ (srf[2])->ClosestPointTo(p, &(u[2]), &(v[2]), false);
+
+ int i, j;
+ for(i = 0; i < 20; i++) {
+ // Approximate each surface by a plane
+ Vector p[3], tu[3], tv[3], n[3];
+ double d[3];
+ for(j = 0; j < 3; j++) {
+ p[j] = (srf[j])->PointAt(u[j], v[j]);
+ (srf[j])->TangentsAt(u[j], v[j], &(tu[j]), &(tv[j]));
+ n[j] = ((tu[j]).Cross(tv[j])).WithMagnitude(1);
+ d[j] = (n[j]).Dot(p[j]);
+ }
+
+ // If a = b and b = c, then does a = c? No, it doesn't.
+ if((p[0]).Equals(p[1], RATPOLY_EPS) &&
+ (p[1]).Equals(p[2], RATPOLY_EPS) &&
+ (p[2]).Equals(p[0], RATPOLY_EPS))
+ {
+ *up = u[0];
+ *vp = v[0];
+ return;
+ }
+
+ bool parallel;
+ Vector pi = Vector::AtIntersectionOfPlanes(n[0], d[0],
+ n[1], d[1],
+ n[2], d[2], ¶llel);
+ if(parallel) break;
+
+ for(j = 0; j < 3; j++) {
+ Vector dp = pi.Minus(p[j]);
+ double du = dp.Dot(tu[j]), dv = dp.Dot(tv[j]);
+ u[j] += du / (tu[j]).MagSquared();
+ v[j] += dv / (tv[j]).MagSquared();
+ }
+ }
+ dbp("didn't converge (three surfaces intersecting)");
+}
+
--- /dev/null
+//-----------------------------------------------------------------------------
+// Routines for ray-casting: intersecting a line segment or an infinite line
+// with a surface or shell. Ray-casting against a shell is used for point-in-
+// shell testing, and the intersection of edge line segments against surfaces
+// is used to get rough surface-curve intersections, which are later refined
+// numerically.
+//
+// Copyright 2008-2013 Jonathan Westhues.
+//-----------------------------------------------------------------------------
+#include "solvespace.h"
+
+// Dot product tolerance for perpendicular; this is on the direction cosine,
+// so it's about 0.001 degrees.
+const double SShell::DOTP_TOL = 1e-5;
+
+extern int FLAG;
+
+
+double SSurface::DepartureFromCoplanar(void) {
+ int i, j;
+ int ia, ja, ib = 0, jb = 0, ic = 0, jc = 0;
+ double best;
+
+ // Grab three points to define a plane; first choose (0, 0) arbitrarily.
+ ia = ja = 0;
+ // Then the point farthest from pt a.
+ best = VERY_NEGATIVE;
+ for(i = 0; i <= degm; i++) {
+ for(j = 0; j <= degn; j++) {
+ if(i == ia && j == ja) continue;
+
+ double dist = (ctrl[i][j]).Minus(ctrl[ia][ja]).Magnitude();
+ if(dist > best) {
+ best = dist;
+ ib = i;
+ jb = j;
+ }
+ }
+ }
+ // Then biggest magnitude of ab cross ac.
+ best = VERY_NEGATIVE;
+ for(i = 0; i <= degm; i++) {
+ for(j = 0; j <= degn; j++) {
+ if(i == ia && j == ja) continue;
+ if(i == ib && j == jb) continue;
+
+ double mag =
+ ((ctrl[ia][ja].Minus(ctrl[ib][jb]))).Cross(
+ (ctrl[ia][ja].Minus(ctrl[i ][j ]))).Magnitude();
+ if(mag > best) {
+ best = mag;
+ ic = i;
+ jc = j;
+ }
+ }
+ }
+
+ Vector n = ((ctrl[ia][ja].Minus(ctrl[ib][jb]))).Cross(
+ (ctrl[ia][ja].Minus(ctrl[ic][jc])));
+ n = n.WithMagnitude(1);
+ double d = (ctrl[ia][ja]).Dot(n);
+
+ // Finally, calculate the deviation from each point to the plane.
+ double farthest = VERY_NEGATIVE;
+ for(i = 0; i <= degm; i++) {
+ for(j = 0; j <= degn; j++) {
+ double dist = fabs(n.Dot(ctrl[i][j]) - d);
+ if(dist > farthest) {
+ farthest = dist;
+ }
+ }
+ }
+ return farthest;
+}
+
+void SSurface::WeightControlPoints(void) {
+ int i, j;
+ for(i = 0; i <= degm; i++) {
+ for(j = 0; j <= degn; j++) {
+ ctrl[i][j] = (ctrl[i][j]).ScaledBy(weight[i][j]);
+ }
+ }
+}
+void SSurface::UnWeightControlPoints(void) {
+ int i, j;
+ for(i = 0; i <= degm; i++) {
+ for(j = 0; j <= degn; j++) {
+ ctrl[i][j] = (ctrl[i][j]).ScaledBy(1.0/weight[i][j]);
+ }
+ }
+}
+void SSurface::CopyRowOrCol(bool row, int this_ij, SSurface *src, int src_ij) {
+ if(row) {
+ int j;
+ for(j = 0; j <= degn; j++) {
+ ctrl [this_ij][j] = src->ctrl [src_ij][j];
+ weight[this_ij][j] = src->weight[src_ij][j];
+ }
+ } else {
+ int i;
+ for(i = 0; i <= degm; i++) {
+ ctrl [i][this_ij] = src->ctrl [i][src_ij];
+ weight[i][this_ij] = src->weight[i][src_ij];
+ }
+ }
+}
+void SSurface::BlendRowOrCol(bool row, int this_ij, SSurface *a, int a_ij,
+ SSurface *b, int b_ij)
+{
+ if(row) {
+ int j;
+ for(j = 0; j <= degn; j++) {
+ Vector c = (a->ctrl [a_ij][j]).Plus(b->ctrl [b_ij][j]);
+ double w = (a->weight[a_ij][j] + b->weight[b_ij][j]);
+ ctrl [this_ij][j] = c.ScaledBy(0.5);
+ weight[this_ij][j] = w / 2;
+ }
+ } else {
+ int i;
+ for(i = 0; i <= degm; i++) {
+ Vector c = (a->ctrl [i][a_ij]).Plus(b->ctrl [i][b_ij]);
+ double w = (a->weight[i][a_ij] + b->weight[i][b_ij]);
+ ctrl [i][this_ij] = c.ScaledBy(0.5);
+ weight[i][this_ij] = w / 2;
+ }
+ }
+}
+void SSurface::SplitInHalf(bool byU, SSurface *sa, SSurface *sb) {
+ sa->degm = sb->degm = degm;
+ sa->degn = sb->degn = degn;
+
+ // by de Casteljau's algorithm in a projective space; so we must work
+ // on points (w*x, w*y, w*z, w)
+ WeightControlPoints();
+
+ switch(byU ? degm : degn) {
+ case 1:
+ sa->CopyRowOrCol (byU, 0, this, 0);
+ sb->CopyRowOrCol (byU, 1, this, 1);
+
+ sa->BlendRowOrCol(byU, 1, this, 0, this, 1);
+ sb->BlendRowOrCol(byU, 0, this, 0, this, 1);
+ break;
+
+ case 2:
+ sa->CopyRowOrCol (byU, 0, this, 0);
+ sb->CopyRowOrCol (byU, 2, this, 2);
+
+ sa->BlendRowOrCol(byU, 1, this, 0, this, 1);
+ sb->BlendRowOrCol(byU, 1, this, 1, this, 2);
+
+ sa->BlendRowOrCol(byU, 2, sa, 1, sb, 1);
+ sb->BlendRowOrCol(byU, 0, sa, 1, sb, 1);
+ break;
+
+ case 3: {
+ SSurface st;
+ st.degm = degm; st.degn = degn;
+
+ sa->CopyRowOrCol (byU, 0, this, 0);
+ sb->CopyRowOrCol (byU, 3, this, 3);
+
+ sa->BlendRowOrCol(byU, 1, this, 0, this, 1);
+ sb->BlendRowOrCol(byU, 2, this, 2, this, 3);
+ st. BlendRowOrCol(byU, 0, this, 1, this, 2); // scratch var
+
+ sa->BlendRowOrCol(byU, 2, sa, 1, &st, 0);
+ sb->BlendRowOrCol(byU, 1, sb, 2, &st, 0);
+
+ sa->BlendRowOrCol(byU, 3, sa, 2, sb, 1);
+ sb->BlendRowOrCol(byU, 0, sa, 2, sb, 1);
+ break;
+ }
+
+ default: oops();
+ }
+
+ sa->UnWeightControlPoints();
+ sb->UnWeightControlPoints();
+ UnWeightControlPoints();
+}
+
+//-----------------------------------------------------------------------------
+// Find all points where the indicated finite (if segment) or infinite (if not
+// segment) line intersects our surface. Report them in uv space in the list.
+// We first do a bounding box check; if the line doesn't intersect, then we're
+// done. If it does, then we check how small our surface is. If it's big,
+// then we subdivide into quarters and recurse. If it's small, then we refine
+// by Newton's method and record the point.
+//-----------------------------------------------------------------------------
+void SSurface::AllPointsIntersectingUntrimmed(Vector a, Vector b,
+ int *cnt, int *level,
+ List<Inter> *l, bool segment,
+ SSurface *sorig)
+{
+ // Test if the line intersects our axis-aligned bounding box; if no, then
+ // no possibility of an intersection
+ if(LineEntirelyOutsideBbox(a, b, segment)) return;
+
+ if(*cnt > 2000) {
+ dbp("!!! too many subdivisions (level=%d)!", *level);
+ dbp("degm = %d degn = %d", degm, degn);
+ return;
+ }
+ (*cnt)++;
+
+ // If we might intersect, and the surface is small, then switch to Newton
+ // iterations.
+ if(DepartureFromCoplanar() < 0.2*SS.ChordTolMm()) {
+ Vector p = (ctrl[0 ][0 ]).Plus(
+ ctrl[0 ][degn]).Plus(
+ ctrl[degm][0 ]).Plus(
+ ctrl[degm][degn]).ScaledBy(0.25);
+ Inter inter;
+ sorig->ClosestPointTo(p, &(inter.p.x), &(inter.p.y), false);
+ if(sorig->PointIntersectingLine(a, b, &(inter.p.x), &(inter.p.y))) {
+ Vector p = sorig->PointAt(inter.p.x, inter.p.y);
+ // Debug check, verify that the point lies in both surfaces
+ // (which it ought to, since the surfaces should be coincident)
+ double u, v;
+ ClosestPointTo(p, &u, &v);
+ l->Add(&inter);
+ } else {
+ // Might not converge if line is almost tangent to surface...
+ }
+ return;
+ }
+
+ // But the surface is big, so split it, alternating by u and v
+ SSurface surf0, surf1;
+ SplitInHalf((*level & 1) == 0, &surf0, &surf1);
+
+ int nextLevel = (*level) + 1;
+ (*level) = nextLevel;
+ surf0.AllPointsIntersectingUntrimmed(a, b, cnt, level, l, segment, sorig);
+ (*level) = nextLevel;
+ surf1.AllPointsIntersectingUntrimmed(a, b, cnt, level, l, segment, sorig);
+}
+
+//-----------------------------------------------------------------------------
+// Find all points where a line through a and b intersects our surface, and
+// add them to the list. If seg is true then report only intersections that
+// lie within the finite line segment (not including the endpoints); otherwise
+// we work along the infinite line. And we report either just intersections
+// inside the trim curve, or any intersection with u, v in [0, 1]. And we
+// either disregard or report tangent points.
+//-----------------------------------------------------------------------------
+void SSurface::AllPointsIntersecting(Vector a, Vector b,
+ List<SInter> *l,
+ bool seg, bool trimmed, bool inclTangent)
+{
+ if(LineEntirelyOutsideBbox(a, b, seg)) return;
+
+ Vector ba = b.Minus(a);
+ double bam = ba.Magnitude();
+
+ List<Inter> inters = {};
+
+ // All the intersections between the line and the surface; either special
+ // cases that we can quickly solve in closed form, or general numerical.
+ Vector center, axis, start, finish;
+ double radius;
+ if(degm == 1 && degn == 1) {
+ // Against a plane, easy.
+ Vector n = NormalAt(0, 0).WithMagnitude(1);
+ double d = n.Dot(PointAt(0, 0));
+ // Trim to line segment now if requested, don't generate points that
+ // would just get discarded later.
+ if(!seg ||
+ (n.Dot(a) > d + LENGTH_EPS && n.Dot(b) < d - LENGTH_EPS) ||
+ (n.Dot(b) > d + LENGTH_EPS && n.Dot(a) < d - LENGTH_EPS))
+ {
+ Vector p = Vector::AtIntersectionOfPlaneAndLine(n, d, a, b, NULL);
+ Inter inter;
+ ClosestPointTo(p, &(inter.p.x), &(inter.p.y));
+ inters.Add(&inter);
+ }
+ } else if(IsCylinder(&axis, ¢er, &radius, &start, &finish)) {
+ // This one can be solved in closed form too.
+ Vector ab = b.Minus(a);
+ if(axis.Cross(ab).Magnitude() < LENGTH_EPS) {
+ // edge is parallel to axis of cylinder, no intersection points
+ return;
+ }
+ // A coordinate system centered at the center of the circle, with
+ // the edge under test horizontal
+ Vector u, v, n = axis.WithMagnitude(1);
+ u = (ab.Minus(n.ScaledBy(ab.Dot(n)))).WithMagnitude(1);
+ v = n.Cross(u);
+ Point2d ap = (a.Minus(center)).DotInToCsys(u, v, n).ProjectXy(),
+ bp = (b.Minus(center)).DotInToCsys(u, v, n).ProjectXy(),
+ sp = (start. Minus(center)).DotInToCsys(u, v, n).ProjectXy(),
+ fp = (finish.Minus(center)).DotInToCsys(u, v, n).ProjectXy();
+
+ double thetas = atan2(sp.y, sp.x), thetaf = atan2(fp.y, fp.x);
+
+ Point2d ip[2];
+ int ip_n = 0;
+ if(fabs(fabs(ap.y) - radius) < LENGTH_EPS) {
+ // tangent
+ if(inclTangent) {
+ ip[0] = Point2d::From(0, ap.y);
+ ip_n = 1;
+ }
+ } else if(fabs(ap.y) < radius) {
+ // two intersections
+ double xint = sqrt(radius*radius - ap.y*ap.y);
+ ip[0] = Point2d::From(-xint, ap.y);
+ ip[1] = Point2d::From( xint, ap.y);
+ ip_n = 2;
+ }
+ int i;
+ for(i = 0; i < ip_n; i++) {
+ double t = (ip[i].Minus(ap)).DivPivoting(bp.Minus(ap));
+ // This is a point on the circle; but is it on the arc?
+ Point2d pp = ap.Plus((bp.Minus(ap)).ScaledBy(t));
+ double theta = atan2(pp.y, pp.x);
+ double dp = WRAP_SYMMETRIC(theta - thetas, 2*PI),
+ df = WRAP_SYMMETRIC(thetaf - thetas, 2*PI);
+ double tol = LENGTH_EPS/radius;
+
+ if((df > 0 && ((dp < -tol) || (dp > df + tol))) ||
+ (df < 0 && ((dp > tol) || (dp < df - tol))))
+ {
+ continue;
+ }
+
+ Vector p = a.Plus((b.Minus(a)).ScaledBy(t));
+
+ Inter inter;
+ ClosestPointTo(p, &(inter.p.x), &(inter.p.y));
+ inters.Add(&inter);
+ }
+ } else {
+ // General numerical solution by subdivision, fallback
+ int cnt = 0, level = 0;
+ AllPointsIntersectingUntrimmed(a, b, &cnt, &level, &inters, seg, this);
+ }
+
+ // Remove duplicate intersection points
+ inters.ClearTags();
+ int i, j;
+ for(i = 0; i < inters.n; i++) {
+ for(j = i + 1; j < inters.n; j++) {
+ if(inters.elem[i].p.Equals(inters.elem[j].p)) {
+ inters.elem[j].tag = 1;
+ }
+ }
+ }
+ inters.RemoveTagged();
+
+ for(i = 0; i < inters.n; i++) {
+ Point2d puv = inters.elem[i].p;
+
+ // Make sure the point lies within the finite line segment
+ Vector pxyz = PointAt(puv.x, puv.y);
+ double t = (pxyz.Minus(a)).DivPivoting(ba);
+ if(seg && (t > 1 - LENGTH_EPS/bam || t < LENGTH_EPS/bam)) {
+ continue;
+ }
+
+ // And that it lies inside our trim region
+ Point2d dummy = { 0, 0 };
+ int c = (bsp) ? bsp->ClassifyPoint(puv, dummy, this) : SBspUv::OUTSIDE;
+ if(trimmed && c == SBspUv::OUTSIDE) {
+ continue;
+ }
+
+ // It does, so generate the intersection
+ SInter si;
+ si.p = pxyz;
+ si.surfNormal = NormalAt(puv.x, puv.y);
+ si.pinter = puv;
+ si.srf = this;
+ si.onEdge = (c != SBspUv::INSIDE);
+ l->Add(&si);
+ }
+
+ inters.Clear();
+}
+
+void SShell::AllPointsIntersecting(Vector a, Vector b,
+ List<SInter> *il,
+ bool seg, bool trimmed, bool inclTangent)
+{
+ SSurface *ss;
+ for(ss = surface.First(); ss; ss = surface.NextAfter(ss)) {
+ ss->AllPointsIntersecting(a, b, il, seg, trimmed, inclTangent);
+ }
+}
+
+
+
+int SShell::ClassifyRegion(Vector edge_n, Vector inter_surf_n,
+ Vector edge_surf_n)
+{
+ double dot = inter_surf_n.DirectionCosineWith(edge_n);
+ if(fabs(dot) < DOTP_TOL) {
+ // The edge's surface and the edge-on-face surface
+ // are coincident. Test the edge's surface normal
+ // to see if it's with same or opposite normals.
+ if(inter_surf_n.Dot(edge_surf_n) > 0) {
+ return COINC_SAME;
+ } else {
+ return COINC_OPP;
+ }
+ } else if(dot > 0) {
+ return OUTSIDE;
+ } else {
+ return INSIDE;
+ }
+}
+
+//-----------------------------------------------------------------------------
+// Does the given point lie on our shell? There are many cases; inside and
+// outside are obvious, but then there's all the edge-on-edge and edge-on-face
+// possibilities.
+//
+// To calculate, we intersect a ray through p with our shell, and classify
+// using the closest intersection point. If the ray hits a surface on edge,
+// then just reattempt in a different random direction.
+//-----------------------------------------------------------------------------
+bool SShell::ClassifyEdge(int *indir, int *outdir,
+ Vector ea, Vector eb,
+ Vector p,
+ Vector edge_n_in, Vector edge_n_out, Vector surf_n)
+{
+ List<SInter> l = {};
+
+ srand(0);
+
+ // First, check for edge-on-edge
+ int edge_inters = 0;
+ Vector inter_surf_n[2], inter_edge_n[2];
+ SSurface *srf;
+ for(srf = surface.First(); srf; srf = surface.NextAfter(srf)) {
+ if(srf->LineEntirelyOutsideBbox(ea, eb, true)) continue;
+
+ SEdgeList *sel = &(srf->edges);
+ SEdge *se;
+ for(se = sel->l.First(); se; se = sel->l.NextAfter(se)) {
+ if((ea.Equals(se->a) && eb.Equals(se->b)) ||
+ (eb.Equals(se->a) && ea.Equals(se->b)) ||
+ p.OnLineSegment(se->a, se->b))
+ {
+ if(edge_inters < 2) {
+ // Edge-on-edge case
+ Point2d pm;
+ srf->ClosestPointTo(p, &pm, false);
+ // A vector normal to the surface, at the intersection point
+ inter_surf_n[edge_inters] = srf->NormalAt(pm);
+ // A vector normal to the intersecting edge (but within the
+ // intersecting surface) at the intersection point, pointing
+ // out.
+ inter_edge_n[edge_inters] =
+ (inter_surf_n[edge_inters]).Cross((se->b).Minus((se->a)));
+ }
+
+ edge_inters++;
+ }
+ }
+ }
+
+ if(edge_inters == 2) {
+ // TODO, make this use the appropriate curved normals
+ double dotp[2];
+ for(int i = 0; i < 2; i++) {
+ dotp[i] = edge_n_out.DirectionCosineWith(inter_surf_n[i]);
+ }
+
+ if(fabs(dotp[1]) < DOTP_TOL) {
+ swap(dotp[0], dotp[1]);
+ swap(inter_surf_n[0], inter_surf_n[1]);
+ swap(inter_edge_n[0], inter_edge_n[1]);
+ }
+
+ int coinc = (surf_n.Dot(inter_surf_n[0])) > 0 ? COINC_SAME : COINC_OPP;
+
+ if(fabs(dotp[0]) < DOTP_TOL && fabs(dotp[1]) < DOTP_TOL) {
+ // This is actually an edge on face case, just that the face
+ // is split into two pieces joining at our edge.
+ *indir = coinc;
+ *outdir = coinc;
+ } else if(fabs(dotp[0]) < DOTP_TOL && dotp[1] > DOTP_TOL) {
+ if(edge_n_out.Dot(inter_edge_n[0]) > 0) {
+ *indir = coinc;
+ *outdir = OUTSIDE;
+ } else {
+ *indir = INSIDE;
+ *outdir = coinc;
+ }
+ } else if(fabs(dotp[0]) < DOTP_TOL && dotp[1] < -DOTP_TOL) {
+ if(edge_n_out.Dot(inter_edge_n[0]) > 0) {
+ *indir = coinc;
+ *outdir = INSIDE;
+ } else {
+ *indir = OUTSIDE;
+ *outdir = coinc;
+ }
+ } else if(dotp[0] > DOTP_TOL && dotp[1] > DOTP_TOL) {
+ *indir = INSIDE;
+ *outdir = OUTSIDE;
+ } else if(dotp[0] < -DOTP_TOL && dotp[1] < -DOTP_TOL) {
+ *indir = OUTSIDE;
+ *outdir = INSIDE;
+ } else {
+ // Edge is tangent to the shell at shell's edge, so can't be
+ // a boundary of the surface.
+ return false;
+ }
+ return true;
+ }
+
+ if(edge_inters != 0) dbp("bad, edge_inters=%d", edge_inters);
+
+ // Next, check for edge-on-surface. The ray-casting for edge-inside-shell
+ // would catch this too, but test separately, for speed (since many edges
+ // are on surface) and for numerical stability, so we don't pick up
+ // the additional error from the line intersection.
+
+ for(srf = surface.First(); srf; srf = surface.NextAfter(srf)) {
+ if(srf->LineEntirelyOutsideBbox(ea, eb, true)) continue;
+
+ Point2d puv;
+ srf->ClosestPointTo(p, &(puv.x), &(puv.y), false);
+ Vector pp = srf->PointAt(puv);
+
+ if((pp.Minus(p)).Magnitude() > LENGTH_EPS) continue;
+ Point2d dummy = { 0, 0 };
+ int c = (srf->bsp) ? srf->bsp->ClassifyPoint(puv, dummy, srf) : SBspUv::OUTSIDE;
+ if(c == SBspUv::OUTSIDE) continue;
+
+ // Edge-on-face (unless edge-on-edge above superceded)
+ Point2d pin, pout;
+ srf->ClosestPointTo(p.Plus(edge_n_in), &pin, false);
+ srf->ClosestPointTo(p.Plus(edge_n_out), &pout, false);
+
+ Vector surf_n_in = srf->NormalAt(pin),
+ surf_n_out = srf->NormalAt(pout);
+
+ *indir = ClassifyRegion(edge_n_in, surf_n_in, surf_n);
+ *outdir = ClassifyRegion(edge_n_out, surf_n_out, surf_n);
+ return true;
+ }
+
+ // Edge is not on face or on edge; so it's either inside or outside
+ // the shell, and we'll determine which by raycasting.
+ int cnt = 0;
+ for(;;) {
+ // Cast a ray in a random direction (two-sided so that we test if
+ // the point lies on a surface, but use only one side for in/out
+ // testing)
+ Vector ray = Vector::From(Random(1), Random(1), Random(1));
+
+ AllPointsIntersecting(
+ p.Minus(ray), p.Plus(ray), &l, false, true, false);
+
+ // no intersections means it's outside
+ *indir = OUTSIDE;
+ *outdir = OUTSIDE;
+ double dmin = VERY_POSITIVE;
+ bool onEdge = false;
+ edge_inters = 0;
+
+ SInter *si;
+ for(si = l.First(); si; si = l.NextAfter(si)) {
+ double t = ((si->p).Minus(p)).DivPivoting(ray);
+ if(t*ray.Magnitude() < -LENGTH_EPS) {
+ // wrong side, doesn't count
+ continue;
+ }
+
+ double d = ((si->p).Minus(p)).Magnitude();
+
+ // We actually should never hit this case; it should have been
+ // handled above.
+ if(d < LENGTH_EPS && si->onEdge) {
+ edge_inters++;
+ }
+
+ if(d < dmin) {
+ dmin = d;
+ // Edge does not lie on surface; either strictly inside
+ // or strictly outside
+ if((si->surfNormal).Dot(ray) > 0) {
+ *indir = INSIDE;
+ *outdir = INSIDE;
+ } else {
+ *indir = OUTSIDE;
+ *outdir = OUTSIDE;
+ }
+ onEdge = si->onEdge;
+ }
+ }
+ l.Clear();
+
+ // If the point being tested lies exactly on an edge of the shell,
+ // then our ray always lies on edge, and that's okay. Otherwise
+ // try again in a different random direction.
+ if(!onEdge) break;
+ if(cnt++ > 5) {
+ dbp("can't find a ray that doesn't hit on edge!");
+ dbp("on edge = %d, edge_inters = %d", onEdge, edge_inters);
+ SS.nakedEdges.AddEdge(ea, eb);
+ break;
+ }
+ }
+
+ return true;
+}
+
--- /dev/null
+//-----------------------------------------------------------------------------
+// Anything involving surfaces and sets of surfaces (i.e., shells); except
+// for the real math, which is in ratpoly.cpp.
+//
+// Copyright 2008-2013 Jonathan Westhues.
+//-----------------------------------------------------------------------------
+#include "../solvespace.h"
+
+SSurface SSurface::FromExtrusionOf(SBezier *sb, Vector t0, Vector t1) {
+ SSurface ret = {};
+
+ ret.degm = sb->deg;
+ ret.degn = 1;
+
+ int i;
+ for(i = 0; i <= ret.degm; i++) {
+ ret.ctrl[i][0] = (sb->ctrl[i]).Plus(t0);
+ ret.weight[i][0] = sb->weight[i];
+
+ ret.ctrl[i][1] = (sb->ctrl[i]).Plus(t1);
+ ret.weight[i][1] = sb->weight[i];
+ }
+
+ return ret;
+}
+
+bool SSurface::IsExtrusion(SBezier *of, Vector *alongp) {
+ int i;
+
+ if(degn != 1) return false;
+
+ Vector along = (ctrl[0][1]).Minus(ctrl[0][0]);
+ for(i = 0; i <= degm; i++) {
+ if((fabs(weight[i][1] - weight[i][0]) < LENGTH_EPS) &&
+ ((ctrl[i][1]).Minus(ctrl[i][0])).Equals(along))
+ {
+ continue;
+ }
+ return false;
+ }
+
+ // yes, we are a surface of extrusion; copy the original curve and return
+ if(of) {
+ for(i = 0; i <= degm; i++) {
+ of->weight[i] = weight[i][0];
+ of->ctrl[i] = ctrl[i][0];
+ }
+ of->deg = degm;
+ *alongp = along;
+ }
+ return true;
+}
+
+bool SSurface::IsCylinder(Vector *axis, Vector *center, double *r,
+ Vector *start, Vector *finish)
+{
+ SBezier sb;
+ if(!IsExtrusion(&sb, axis)) return false;
+ if(!sb.IsCircle(*axis, center, r)) return false;
+
+ *start = sb.ctrl[0];
+ *finish = sb.ctrl[2];
+ return true;
+}
+
+SSurface SSurface::FromRevolutionOf(SBezier *sb, Vector pt, Vector axis,
+ double thetas, double thetaf)
+{
+ SSurface ret = {};
+
+
+ ret.degm = sb->deg;
+ ret.degn = 2;
+
+ double dtheta = fabs(WRAP_SYMMETRIC(thetaf - thetas, 2*PI));
+
+ // We now wish to revolve the curve about the z axis
+ int i;
+ for(i = 0; i <= ret.degm; i++) {
+ Vector p = sb->ctrl[i];
+
+ Vector ps = p.RotatedAbout(pt, axis, thetas),
+ pf = p.RotatedAbout(pt, axis, thetaf);
+
+ Vector ct;
+ if(ps.Equals(pf)) {
+ // Degenerate case: a control point lies on the axis of revolution,
+ // so we get three coincident control points.
+ ct = ps;
+ } else {
+ // Normal case, the control point sweeps out a circle.
+ Vector c = ps.ClosestPointOnLine(pt, axis);
+
+ Vector rs = ps.Minus(c),
+ rf = pf.Minus(c);
+
+ Vector ts = axis.Cross(rs),
+ tf = axis.Cross(rf);
+
+ ct = Vector::AtIntersectionOfLines(ps, ps.Plus(ts),
+ pf, pf.Plus(tf),
+ NULL, NULL, NULL);
+ }
+
+ ret.ctrl[i][0] = ps;
+ ret.ctrl[i][1] = ct;
+ ret.ctrl[i][2] = pf;
+
+ ret.weight[i][0] = sb->weight[i];
+ ret.weight[i][1] = sb->weight[i]*cos(dtheta/2);
+ ret.weight[i][2] = sb->weight[i];
+ }
+
+ return ret;
+}
+
+SSurface SSurface::FromPlane(Vector pt, Vector u, Vector v) {
+ SSurface ret = {};
+
+ ret.degm = 1;
+ ret.degn = 1;
+
+ ret.weight[0][0] = ret.weight[0][1] = 1;
+ ret.weight[1][0] = ret.weight[1][1] = 1;
+
+ ret.ctrl[0][0] = pt;
+ ret.ctrl[0][1] = pt.Plus(u);
+ ret.ctrl[1][0] = pt.Plus(v);
+ ret.ctrl[1][1] = pt.Plus(v).Plus(u);
+
+ return ret;
+}
+
+SSurface SSurface::FromTransformationOf(SSurface *a,
+ Vector t, Quaternion q, double scale,
+ bool includingTrims)
+{
+ SSurface ret = {};
+
+ ret.h = a->h;
+ ret.color = a->color;
+ ret.face = a->face;
+
+ ret.degm = a->degm;
+ ret.degn = a->degn;
+ int i, j;
+ for(i = 0; i <= 3; i++) {
+ for(j = 0; j <= 3; j++) {
+ ret.ctrl[i][j] = a->ctrl[i][j];
+ ret.ctrl[i][j] = (ret.ctrl[i][j]).ScaledBy(scale);
+ ret.ctrl[i][j] = (q.Rotate(ret.ctrl[i][j])).Plus(t);
+
+ ret.weight[i][j] = a->weight[i][j];
+ }
+ }
+
+ if(includingTrims) {
+ STrimBy *stb;
+ for(stb = a->trim.First(); stb; stb = a->trim.NextAfter(stb)) {
+ STrimBy n = *stb;
+ n.start = n.start.ScaledBy(scale);
+ n.finish = n.finish.ScaledBy(scale);
+ n.start = (q.Rotate(n.start)) .Plus(t);
+ n.finish = (q.Rotate(n.finish)).Plus(t);
+ ret.trim.Add(&n);
+ }
+ }
+
+ if(scale < 0) {
+ // If we mirror every surface of a shell, then it will end up inside
+ // out. So fix that here.
+ ret.Reverse();
+ }
+
+ return ret;
+}
+
+void SSurface::GetAxisAlignedBounding(Vector *ptMax, Vector *ptMin) {
+ *ptMax = Vector::From(VERY_NEGATIVE, VERY_NEGATIVE, VERY_NEGATIVE);
+ *ptMin = Vector::From(VERY_POSITIVE, VERY_POSITIVE, VERY_POSITIVE);
+
+ int i, j;
+ for(i = 0; i <= degm; i++) {
+ for(j = 0; j <= degn; j++) {
+ (ctrl[i][j]).MakeMaxMin(ptMax, ptMin);
+ }
+ }
+}
+
+bool SSurface::LineEntirelyOutsideBbox(Vector a, Vector b, bool segment) {
+ Vector amax, amin;
+ GetAxisAlignedBounding(&amax, &amin);
+ if(!Vector::BoundingBoxIntersectsLine(amax, amin, a, b, segment)) {
+ // The line segment could fail to intersect the bbox, but lie entirely
+ // within it and intersect the surface.
+ if(a.OutsideAndNotOn(amax, amin) && b.OutsideAndNotOn(amax, amin)) {
+ return true;
+ }
+ }
+ return false;
+}
+
+//-----------------------------------------------------------------------------
+// Generate the piecewise linear approximation of the trim stb, which applies
+// to the curve sc.
+//-----------------------------------------------------------------------------
+void SSurface::MakeTrimEdgesInto(SEdgeList *sel, int flags,
+ SCurve *sc, STrimBy *stb)
+{
+ Vector prev = Vector::From(0, 0, 0);
+ bool inCurve = false, empty = true;
+ double u = 0, v = 0;
+
+ int i, first, last, increment;
+ if(stb->backwards) {
+ first = sc->pts.n - 1;
+ last = 0;
+ increment = -1;
+ } else {
+ first = 0;
+ last = sc->pts.n - 1;
+ increment = 1;
+ }
+ for(i = first; i != (last + increment); i += increment) {
+ Vector tpt, *pt = &(sc->pts.elem[i].p);
+
+ if(flags & AS_UV) {
+ ClosestPointTo(*pt, &u, &v);
+ tpt = Vector::From(u, v, 0);
+ } else {
+ tpt = *pt;
+ }
+
+ if(inCurve) {
+ sel->AddEdge(prev, tpt, sc->h.v, stb->backwards);
+ empty = false;
+ }
+
+ prev = tpt; // either uv or xyz, depending on flags
+
+ if(pt->Equals(stb->start)) inCurve = true;
+ if(pt->Equals(stb->finish)) inCurve = false;
+ }
+ if(inCurve) dbp("trim was unterminated");
+ if(empty) dbp("trim was empty");
+}
+
+//-----------------------------------------------------------------------------
+// Generate all of our trim curves, in piecewise linear form. We can do
+// so in either uv or xyz coordinates. And if requested, then we can use
+// the split curves from useCurvesFrom instead of the curves in our own
+// shell.
+//-----------------------------------------------------------------------------
+void SSurface::MakeEdgesInto(SShell *shell, SEdgeList *sel, int flags,
+ SShell *useCurvesFrom)
+{
+ STrimBy *stb;
+ for(stb = trim.First(); stb; stb = trim.NextAfter(stb)) {
+ SCurve *sc = shell->curve.FindById(stb->curve);
+
+ // We have the option to use the curves from another shell; this
+ // is relevant when generating the coincident edges while doing the
+ // Booleans, since the curves from the output shell will be split
+ // against any intersecting surfaces (and the originals aren't).
+ if(useCurvesFrom) {
+ sc = useCurvesFrom->curve.FindById(sc->newH);
+ }
+
+ MakeTrimEdgesInto(sel, flags, sc, stb);
+ }
+}
+
+//-----------------------------------------------------------------------------
+// Compute the exact tangent to the intersection curve between two surfaces,
+// by taking the cross product of the surface normals. We choose the direction
+// of this tangent so that its dot product with dir is positive.
+//-----------------------------------------------------------------------------
+Vector SSurface::ExactSurfaceTangentAt(Vector p, SSurface *srfA, SSurface *srfB,
+ Vector dir)
+{
+ Point2d puva, puvb;
+ srfA->ClosestPointTo(p, &puva);
+ srfB->ClosestPointTo(p, &puvb);
+ Vector ts = (srfA->NormalAt(puva)).Cross(
+ (srfB->NormalAt(puvb)));
+ ts = ts.WithMagnitude(1);
+ if(ts.Dot(dir) < 0) {
+ ts = ts.ScaledBy(-1);
+ }
+ return ts;
+}
+
+//-----------------------------------------------------------------------------
+// Report our trim curves. If a trim curve is exact and sbl is not null, then
+// add its exact form to sbl. Otherwise, add its piecewise linearization to
+// sel.
+//-----------------------------------------------------------------------------
+void SSurface::MakeSectionEdgesInto(SShell *shell,
+ SEdgeList *sel, SBezierList *sbl)
+{
+ STrimBy *stb;
+ for(stb = trim.First(); stb; stb = trim.NextAfter(stb)) {
+ SCurve *sc = shell->curve.FindById(stb->curve);
+ SBezier *sb = &(sc->exact);
+
+ if(sbl && sc->isExact && (sb->deg != 1 || !sel)) {
+ double ts, tf;
+ if(stb->backwards) {
+ sb->ClosestPointTo(stb->start, &tf);
+ sb->ClosestPointTo(stb->finish, &ts);
+ } else {
+ sb->ClosestPointTo(stb->start, &ts);
+ sb->ClosestPointTo(stb->finish, &tf);
+ }
+ SBezier junk_bef, keep_aft;
+ sb->SplitAt(ts, &junk_bef, &keep_aft);
+ // In the kept piece, the range that used to go from ts to 1
+ // now goes from 0 to 1; so rescale tf appropriately.
+ tf = (tf - ts)/(1 - ts);
+
+ SBezier keep_bef, junk_aft;
+ keep_aft.SplitAt(tf, &keep_bef, &junk_aft);
+
+ sbl->l.Add(&keep_bef);
+ } else if(sbl && !sel && !sc->isExact) {
+ // We must approximate this trim curve, as piecewise cubic sections.
+ SSurface *srfA = shell->surface.FindById(sc->surfA),
+ *srfB = shell->surface.FindById(sc->surfB);
+
+ Vector s = stb->backwards ? stb->finish : stb->start,
+ f = stb->backwards ? stb->start : stb->finish;
+
+ int sp, fp;
+ for(sp = 0; sp < sc->pts.n; sp++) {
+ if(s.Equals(sc->pts.elem[sp].p)) break;
+ }
+ if(sp >= sc->pts.n) return;
+ for(fp = sp; fp < sc->pts.n; fp++) {
+ if(f.Equals(sc->pts.elem[fp].p)) break;
+ }
+ if(fp >= sc->pts.n) return;
+ // So now the curve we want goes from elem[sp] to elem[fp]
+
+ while(sp < fp) {
+ // Initially, we'll try approximating the entire trim curve
+ // as a single Bezier segment
+ int fpt = fp;
+
+ for(;;) {
+ // So construct a cubic Bezier with the correct endpoints
+ // and tangents for the current span.
+ Vector st = sc->pts.elem[sp].p,
+ ft = sc->pts.elem[fpt].p,
+ sf = ft.Minus(st);
+ double m = sf.Magnitude() / 3;
+
+ Vector stan = ExactSurfaceTangentAt(st, srfA, srfB, sf),
+ ftan = ExactSurfaceTangentAt(ft, srfA, srfB, sf);
+
+ SBezier sb = SBezier::From(st,
+ st.Plus (stan.WithMagnitude(m)),
+ ft.Minus(ftan.WithMagnitude(m)),
+ ft);
+
+ // And test how much this curve deviates from the
+ // intermediate points (if any).
+ int i;
+ bool tooFar = false;
+ for(i = sp + 1; i <= (fpt - 1); i++) {
+ Vector p = sc->pts.elem[i].p;
+ double t;
+ sb.ClosestPointTo(p, &t, false);
+ Vector pp = sb.PointAt(t);
+ if((pp.Minus(p)).Magnitude() > SS.ChordTolMm()/2) {
+ tooFar = true;
+ break;
+ }
+ }
+
+ if(tooFar) {
+ // Deviates by too much, so try a shorter span
+ fpt--;
+ continue;
+ } else {
+ // Okay, so use this piece and break.
+ sbl->l.Add(&sb);
+ break;
+ }
+ }
+
+ // And continue interpolating, starting wherever the curve
+ // we just generated finishes.
+ sp = fpt;
+ }
+ } else {
+ if(sel) MakeTrimEdgesInto(sel, AS_XYZ, sc, stb);
+ }
+ }
+}
+
+void SSurface::TriangulateInto(SShell *shell, SMesh *sm) {
+ SEdgeList el = {};
+
+ MakeEdgesInto(shell, &el, AS_UV);
+
+ SPolygon poly = {};
+ if(el.AssemblePolygon(&poly, NULL, true)) {
+ int i, start = sm->l.n;
+ if(degm == 1 && degn == 1) {
+ // A surface with curvature along one direction only; so
+ // choose the triangulation with chords that lie as much
+ // as possible within the surface. And since the trim curves
+ // have been pwl'd to within the desired chord tol, that will
+ // produce a surface good to within roughly that tol.
+ //
+ // If this is just a plane (degree (1, 1)) then the triangulation
+ // code will notice that, and not bother checking chord tols.
+ poly.UvTriangulateInto(sm, this);
+ } else {
+ // A surface with compound curvature. So we must overlay a
+ // two-dimensional grid, and triangulate around that.
+ poly.UvGridTriangulateInto(sm, this);
+ }
+
+ STriMeta meta = { face, color };
+ for(i = start; i < sm->l.n; i++) {
+ STriangle *st = &(sm->l.elem[i]);
+ st->meta = meta;
+ if(st->meta.color.alpha != 255) sm->isTransparent = true;
+ st->an = NormalAt(st->a.x, st->a.y);
+ st->bn = NormalAt(st->b.x, st->b.y);
+ st->cn = NormalAt(st->c.x, st->c.y);
+ st->a = PointAt(st->a.x, st->a.y);
+ st->b = PointAt(st->b.x, st->b.y);
+ st->c = PointAt(st->c.x, st->c.y);
+ // Works out that my chosen contour direction is inconsistent with
+ // the triangle direction, sigh.
+ st->FlipNormal();
+ }
+ } else {
+ dbp("failed to assemble polygon to trim nurbs surface in uv space");
+ }
+
+ el.Clear();
+ poly.Clear();
+}
+
+//-----------------------------------------------------------------------------
+// Reverse the parametrisation of one of our dimensions, which flips the
+// normal. We therefore must reverse all our trim curves too. The uv
+// coordinates change, but trim curves are stored as xyz so nothing happens
+//-----------------------------------------------------------------------------
+void SSurface::Reverse(void) {
+ int i, j;
+ for(i = 0; i < (degm+1)/2; i++) {
+ for(j = 0; j <= degn; j++) {
+ swap(ctrl[i][j], ctrl[degm-i][j]);
+ swap(weight[i][j], weight[degm-i][j]);
+ }
+ }
+
+ STrimBy *stb;
+ for(stb = trim.First(); stb; stb = trim.NextAfter(stb)) {
+ stb->backwards = !stb->backwards;
+ swap(stb->start, stb->finish);
+ }
+}
+
+void SSurface::ScaleSelfBy(double s) {
+ int i, j;
+ for(i = 0; i <= degm; i++) {
+ for(j = 0; j <= degn; j++) {
+ ctrl[i][j] = ctrl[i][j].ScaledBy(s);
+ }
+ }
+}
+
+void SSurface::Clear(void) {
+ trim.Clear();
+}
+
+typedef struct {
+ hSCurve hc;
+ hSSurface hs;
+} TrimLine;
+
+void SShell::MakeFromExtrusionOf(SBezierLoopSet *sbls, Vector t0, Vector t1, RgbaColor color)
+{
+ // Make the extrusion direction consistent with respect to the normal
+ // of the sketch we're extruding.
+ if((t0.Minus(t1)).Dot(sbls->normal) < 0) {
+ swap(t0, t1);
+ }
+
+ // Define a coordinate system to contain the original sketch, and get
+ // a bounding box in that csys
+ Vector n = sbls->normal.ScaledBy(-1);
+ Vector u = n.Normal(0), v = n.Normal(1);
+ Vector orig = sbls->point;
+ double umax = 1e-10, umin = 1e10;
+ sbls->GetBoundingProjd(u, orig, &umin, &umax);
+ double vmax = 1e-10, vmin = 1e10;
+ sbls->GetBoundingProjd(v, orig, &vmin, &vmax);
+ // and now fix things up so that all u and v lie between 0 and 1
+ orig = orig.Plus(u.ScaledBy(umin));
+ orig = orig.Plus(v.ScaledBy(vmin));
+ u = u.ScaledBy(umax - umin);
+ v = v.ScaledBy(vmax - vmin);
+
+ // So we can now generate the top and bottom surfaces of the extrusion,
+ // planes within a translated (and maybe mirrored) version of that csys.
+ SSurface s0, s1;
+ s0 = SSurface::FromPlane(orig.Plus(t0), u, v);
+ s0.color = color;
+ s1 = SSurface::FromPlane(orig.Plus(t1).Plus(u), u.ScaledBy(-1), v);
+ s1.color = color;
+ hSSurface hs0 = surface.AddAndAssignId(&s0),
+ hs1 = surface.AddAndAssignId(&s1);
+
+ // Now go through the input curves. For each one, generate its surface
+ // of extrusion, its two translated trim curves, and one trim line. We
+ // go through by loops so that we can assign the lines correctly.
+ SBezierLoop *sbl;
+ for(sbl = sbls->l.First(); sbl; sbl = sbls->l.NextAfter(sbl)) {
+ SBezier *sb;
+ List<TrimLine> trimLines = {};
+
+ for(sb = sbl->l.First(); sb; sb = sbl->l.NextAfter(sb)) {
+ // Generate the surface of extrusion of this curve, and add
+ // it to the list
+ SSurface ss = SSurface::FromExtrusionOf(sb, t0, t1);
+ ss.color = color;
+ hSSurface hsext = surface.AddAndAssignId(&ss);
+
+ // Translate the curve by t0 and t1 to produce two trim curves
+ SCurve sc = {};
+ sc.isExact = true;
+ sc.exact = sb->TransformedBy(t0, Quaternion::IDENTITY, 1.0);
+ (sc.exact).MakePwlInto(&(sc.pts));
+ sc.surfA = hs0;
+ sc.surfB = hsext;
+ hSCurve hc0 = curve.AddAndAssignId(&sc);
+
+ sc = {};
+ sc.isExact = true;
+ sc.exact = sb->TransformedBy(t1, Quaternion::IDENTITY, 1.0);
+ (sc.exact).MakePwlInto(&(sc.pts));
+ sc.surfA = hs1;
+ sc.surfB = hsext;
+ hSCurve hc1 = curve.AddAndAssignId(&sc);
+
+ STrimBy stb0, stb1;
+ // The translated curves trim the flat top and bottom surfaces.
+ stb0 = STrimBy::EntireCurve(this, hc0, false);
+ stb1 = STrimBy::EntireCurve(this, hc1, true);
+ (surface.FindById(hs0))->trim.Add(&stb0);
+ (surface.FindById(hs1))->trim.Add(&stb1);
+
+ // The translated curves also trim the surface of extrusion.
+ stb0 = STrimBy::EntireCurve(this, hc0, true);
+ stb1 = STrimBy::EntireCurve(this, hc1, false);
+ (surface.FindById(hsext))->trim.Add(&stb0);
+ (surface.FindById(hsext))->trim.Add(&stb1);
+
+ // And form the trim line
+ Vector pt = sb->Finish();
+ sc = {};
+ sc.isExact = true;
+ sc.exact = SBezier::From(pt.Plus(t0), pt.Plus(t1));
+ (sc.exact).MakePwlInto(&(sc.pts));
+ hSCurve hl = curve.AddAndAssignId(&sc);
+ // save this for later
+ TrimLine tl;
+ tl.hc = hl;
+ tl.hs = hsext;
+ trimLines.Add(&tl);
+ }
+
+ int i;
+ for(i = 0; i < trimLines.n; i++) {
+ TrimLine *tl = &(trimLines.elem[i]);
+ SSurface *ss = surface.FindById(tl->hs);
+
+ TrimLine *tlp = &(trimLines.elem[WRAP(i-1, trimLines.n)]);
+
+ STrimBy stb;
+ stb = STrimBy::EntireCurve(this, tl->hc, true);
+ ss->trim.Add(&stb);
+ stb = STrimBy::EntireCurve(this, tlp->hc, false);
+ ss->trim.Add(&stb);
+
+ (curve.FindById(tl->hc))->surfA = ss->h;
+ (curve.FindById(tlp->hc))->surfB = ss->h;
+ }
+ trimLines.Clear();
+ }
+}
+
+
+typedef struct {
+ hSSurface d[4];
+} Revolved;
+
+void SShell::MakeFromRevolutionOf(SBezierLoopSet *sbls, Vector pt, Vector axis, RgbaColor color, Group *group)
+{
+ SBezierLoop *sbl;
+
+ int i0 = surface.n, i;
+
+ // Normalize the axis direction so that the direction of revolution
+ // ends up parallel to the normal of the sketch, on the side of the
+ // axis where the sketch is.
+ Vector pto;
+ double md = VERY_NEGATIVE;
+ for(sbl = sbls->l.First(); sbl; sbl = sbls->l.NextAfter(sbl)) {
+ SBezier *sb;
+ for(sb = sbl->l.First(); sb; sb = sbl->l.NextAfter(sb)) {
+ // Choose the point farthest from the axis; we'll get garbage
+ // if we choose a point that lies on the axis, for example.
+ // (And our surface will be self-intersecting if the sketch
+ // spans the axis, so don't worry about that.)
+ Vector p = sb->Start();
+ double d = p.DistanceToLine(pt, axis);
+ if(d > md) {
+ md = d;
+ pto = p;
+ }
+ }
+ }
+ Vector ptc = pto.ClosestPointOnLine(pt, axis),
+ up = (pto.Minus(ptc)).WithMagnitude(1),
+ vp = (sbls->normal).Cross(up);
+ if(vp.Dot(axis) < 0) {
+ axis = axis.ScaledBy(-1);
+ }
+
+ // Now we actually build and trim the surfaces.
+ for(sbl = sbls->l.First(); sbl; sbl = sbls->l.NextAfter(sbl)) {
+ int i, j;
+ SBezier *sb;
+ List<Revolved> hsl = {};
+
+ for(sb = sbl->l.First(); sb; sb = sbl->l.NextAfter(sb)) {
+ Revolved revs;
+ for(j = 0; j < 4; j++) {
+ if(sb->deg == 1 &&
+ (sb->ctrl[0]).DistanceToLine(pt, axis) < LENGTH_EPS &&
+ (sb->ctrl[1]).DistanceToLine(pt, axis) < LENGTH_EPS)
+ {
+ // This is a line on the axis of revolution; it does
+ // not contribute a surface.
+ revs.d[j].v = 0;
+ } else {
+ SSurface ss = SSurface::FromRevolutionOf(sb, pt, axis,
+ (PI/2)*j,
+ (PI/2)*(j+1));
+ ss.color = color;
+ if(sb->entity != 0) {
+ hEntity he;
+ he.v = sb->entity;
+ hEntity hface = group->Remap(he, Group::REMAP_LINE_TO_FACE);
+ if(SK.entity.FindByIdNoOops(hface) != NULL) {
+ ss.face = hface.v;
+ }
+ }
+ revs.d[j] = surface.AddAndAssignId(&ss);
+ }
+ }
+ hsl.Add(&revs);
+ }
+
+ for(i = 0; i < sbl->l.n; i++) {
+ Revolved revs = hsl.elem[i],
+ revsp = hsl.elem[WRAP(i-1, sbl->l.n)];
+
+ sb = &(sbl->l.elem[i]);
+
+ for(j = 0; j < 4; j++) {
+ SCurve sc;
+ Quaternion qs = Quaternion::From(axis, (PI/2)*j);
+ // we want Q*(x - p) + p = Q*x + (p - Q*p)
+ Vector ts = pt.Minus(qs.Rotate(pt));
+
+ // If this input curve generate a surface, then trim that
+ // surface with the rotated version of the input curve.
+ if(revs.d[j].v) {
+ sc = {};
+ sc.isExact = true;
+ sc.exact = sb->TransformedBy(ts, qs, 1.0);
+ (sc.exact).MakePwlInto(&(sc.pts));
+ sc.surfA = revs.d[j];
+ sc.surfB = revs.d[WRAP(j-1, 4)];
+
+ hSCurve hcb = curve.AddAndAssignId(&sc);
+
+ STrimBy stb;
+ stb = STrimBy::EntireCurve(this, hcb, true);
+ (surface.FindById(sc.surfA))->trim.Add(&stb);
+ stb = STrimBy::EntireCurve(this, hcb, false);
+ (surface.FindById(sc.surfB))->trim.Add(&stb);
+ }
+
+ // And if this input curve and the one after it both generated
+ // surfaces, then trim both of those by the appropriate
+ // circle.
+ if(revs.d[j].v && revsp.d[j].v) {
+ SSurface *ss = surface.FindById(revs.d[j]);
+
+ sc = {};
+ sc.isExact = true;
+ sc.exact = SBezier::From(ss->ctrl[0][0],
+ ss->ctrl[0][1],
+ ss->ctrl[0][2]);
+ sc.exact.weight[1] = ss->weight[0][1];
+ (sc.exact).MakePwlInto(&(sc.pts));
+ sc.surfA = revs.d[j];
+ sc.surfB = revsp.d[j];
+
+ hSCurve hcc = curve.AddAndAssignId(&sc);
+
+ STrimBy stb;
+ stb = STrimBy::EntireCurve(this, hcc, false);
+ (surface.FindById(sc.surfA))->trim.Add(&stb);
+ stb = STrimBy::EntireCurve(this, hcc, true);
+ (surface.FindById(sc.surfB))->trim.Add(&stb);
+ }
+ }
+ }
+
+ hsl.Clear();
+ }
+
+ for(i = i0; i < surface.n; i++) {
+ SSurface *srf = &(surface.elem[i]);
+
+ // Revolution of a line; this is potentially a plane, which we can
+ // rewrite to have degree (1, 1).
+ if(srf->degm == 1 && srf->degn == 2) {
+ // close start, far start, far finish
+ Vector cs, fs, ff;
+ double d0, d1;
+ d0 = (srf->ctrl[0][0]).DistanceToLine(pt, axis);
+ d1 = (srf->ctrl[1][0]).DistanceToLine(pt, axis);
+
+ if(d0 > d1) {
+ cs = srf->ctrl[1][0];
+ fs = srf->ctrl[0][0];
+ ff = srf->ctrl[0][2];
+ } else {
+ cs = srf->ctrl[0][0];
+ fs = srf->ctrl[1][0];
+ ff = srf->ctrl[1][2];
+ }
+
+ // origin close, origin far
+ Vector oc = cs.ClosestPointOnLine(pt, axis),
+ of = fs.ClosestPointOnLine(pt, axis);
+
+ if(oc.Equals(of)) {
+ // This is a plane, not a (non-degenerate) cone.
+ Vector oldn = srf->NormalAt(0.5, 0.5);
+
+ Vector u = fs.Minus(of), v;
+
+ v = (axis.Cross(u)).WithMagnitude(1);
+
+ double vm = (ff.Minus(of)).Dot(v);
+ v = v.ScaledBy(vm);
+
+ srf->degm = 1;
+ srf->degn = 1;
+ srf->ctrl[0][0] = of;
+ srf->ctrl[0][1] = of.Plus(u);
+ srf->ctrl[1][0] = of.Plus(v);
+ srf->ctrl[1][1] = of.Plus(u).Plus(v);
+ srf->weight[0][0] = 1;
+ srf->weight[0][1] = 1;
+ srf->weight[1][0] = 1;
+ srf->weight[1][1] = 1;
+
+ if(oldn.Dot(srf->NormalAt(0.5, 0.5)) < 0) {
+ swap(srf->ctrl[0][0], srf->ctrl[1][0]);
+ swap(srf->ctrl[0][1], srf->ctrl[1][1]);
+ }
+ continue;
+ }
+
+ if(fabs(d0 - d1) < LENGTH_EPS) {
+ // This is a cylinder; so transpose it so that we'll recognize
+ // it as a surface of extrusion.
+ SSurface sn = *srf;
+
+ // Transposing u and v flips the normal, so reverse u to
+ // flip it again and put it back where we started.
+ sn.degm = 2;
+ sn.degn = 1;
+ int dm, dn;
+ for(dm = 0; dm <= 1; dm++) {
+ for(dn = 0; dn <= 2; dn++) {
+ sn.ctrl [dn][dm] = srf->ctrl [1-dm][dn];
+ sn.weight[dn][dm] = srf->weight[1-dm][dn];
+ }
+ }
+
+ *srf = sn;
+ continue;
+ }
+ }
+
+ }
+
+}
+
+void SShell::MakeFromCopyOf(SShell *a) {
+ MakeFromTransformationOf(a,
+ Vector::From(0, 0, 0), Quaternion::IDENTITY, 1.0);
+}
+
+void SShell::MakeFromTransformationOf(SShell *a,
+ Vector t, Quaternion q, double scale)
+{
+ booleanFailed = false;
+
+ SSurface *s;
+ for(s = a->surface.First(); s; s = a->surface.NextAfter(s)) {
+ SSurface n;
+ n = SSurface::FromTransformationOf(s, t, q, scale, true);
+ surface.Add(&n); // keeping the old ID
+ }
+
+ SCurve *c;
+ for(c = a->curve.First(); c; c = a->curve.NextAfter(c)) {
+ SCurve n;
+ n = SCurve::FromTransformationOf(c, t, q, scale);
+ curve.Add(&n); // keeping the old ID
+ }
+}
+
+void SShell::MakeEdgesInto(SEdgeList *sel) {
+ SSurface *s;
+ for(s = surface.First(); s; s = surface.NextAfter(s)) {
+ s->MakeEdgesInto(this, sel, SSurface::AS_XYZ);
+ }
+}
+
+void SShell::MakeSectionEdgesInto(Vector n, double d,
+ SEdgeList *sel, SBezierList *sbl)
+{
+ SSurface *s;
+ for(s = surface.First(); s; s = surface.NextAfter(s)) {
+ if(s->CoincidentWithPlane(n, d)) {
+ s->MakeSectionEdgesInto(this, sel, sbl);
+ }
+ }
+}
+
+void SShell::TriangulateInto(SMesh *sm) {
+ SSurface *s;
+ for(s = surface.First(); s; s = surface.NextAfter(s)) {
+ s->TriangulateInto(this, sm);
+ }
+}
+
+bool SShell::IsEmpty(void) {
+ return (surface.n == 0);
+}
+
+void SShell::Clear(void) {
+ SSurface *s;
+ for(s = surface.First(); s; s = surface.NextAfter(s)) {
+ s->Clear();
+ }
+ surface.Clear();
+
+ SCurve *c;
+ for(c = curve.First(); c; c = curve.NextAfter(c)) {
+ c->Clear();
+ }
+ curve.Clear();
+}
+
--- /dev/null
+//-----------------------------------------------------------------------------
+// Functions relating to rational polynomial surfaces, which are trimmed by
+// curves (either rational polynomial curves, or piecewise linear
+// approximations to curves of intersection that can't be represented
+// exactly in ratpoly form), and assembled into watertight shells.
+//
+// Copyright 2008-2013 Jonathan Westhues.
+//-----------------------------------------------------------------------------
+
+#ifndef __SURFACE_H
+#define __SURFACE_H
+
+// Utility functions, Bernstein polynomials of order 1-3 and their derivatives.
+double Bernstein(int k, int deg, double t);
+double BernsteinDerivative(int k, int deg, double t);
+
+class SSurface;
+class SCurvePt;
+
+// Utility data structure, a two-dimensional BSP to accelerate polygon
+// operations.
+class SBspUv {
+public:
+ Point2d a, b;
+
+ SBspUv *pos;
+ SBspUv *neg;
+
+ SBspUv *more;
+
+ enum {
+ INSIDE = 100,
+ OUTSIDE = 200,
+ EDGE_PARALLEL = 300,
+ EDGE_ANTIPARALLEL = 400,
+ EDGE_OTHER = 500
+ };
+
+ static SBspUv *Alloc(void);
+ static SBspUv *From(SEdgeList *el, SSurface *srf);
+
+ void ScalePoints(Point2d *pt, Point2d *a, Point2d *b, SSurface *srf);
+ double ScaledSignedDistanceToLine(Point2d pt, Point2d a, Point2d b,
+ SSurface *srf);
+ double ScaledDistanceToLine(Point2d pt, Point2d a, Point2d b, bool seg,
+ SSurface *srf);
+
+ void InsertEdge(Point2d a, Point2d b, SSurface *srf);
+ static SBspUv *InsertOrCreateEdge(SBspUv *where, const Point2d &ea, const Point2d &eb, SSurface *srf);
+ int ClassifyPoint(Point2d p, Point2d eb, SSurface *srf);
+ int ClassifyEdge(Point2d ea, Point2d eb, SSurface *srf);
+ double MinimumDistanceToEdge(Point2d p, SSurface *srf);
+};
+
+// Now the data structures to represent a shell of trimmed rational polynomial
+// surfaces.
+
+class SShell;
+
+class hSSurface {
+public:
+ uint32_t v;
+};
+
+class hSCurve {
+public:
+ uint32_t v;
+};
+
+// Stuff for rational polynomial curves, of degree one to three. These are
+// our inputs, and are also calculated for certain exact surface-surface
+// intersections.
+class SBezier {
+public:
+ int tag;
+ int auxA, auxB;
+
+ int deg;
+ Vector ctrl[4];
+ double weight[4];
+ uint32_t entity;
+
+ Vector PointAt(double t);
+ Vector TangentAt(double t);
+ void ClosestPointTo(Vector p, double *t, bool converge=true);
+ void SplitAt(double t, SBezier *bef, SBezier *aft);
+ bool PointOnThisAndCurve(SBezier *sbb, Vector *p);
+
+ Vector Start(void);
+ Vector Finish(void);
+ bool Equals(SBezier *b);
+ void MakePwlInto(SEdgeList *sel, double chordTol=0);
+ void MakePwlInto(List<SCurvePt> *l, double chordTol=0);
+ void MakePwlInto(SContour *sc, double chordTol=0);
+ void MakePwlInto(List<Vector> *l, double chordTol=0);
+ void MakePwlWorker(List<Vector> *l, double ta, double tb, double chordTol);
+ void MakePwlInitialWorker(List<Vector> *l, double ta, double tb, double chordTol);
+
+ void AllIntersectionsWith(SBezier *sbb, SPointList *spl);
+ void GetBoundingProjd(Vector u, Vector orig, double *umin, double *umax);
+ void Reverse(void);
+
+ bool IsInPlane(Vector n, double d);
+ bool IsCircle(Vector axis, Vector *center, double *r);
+ bool IsRational(void);
+
+ SBezier TransformedBy(Vector t, Quaternion q, double scale);
+ SBezier InPerspective(Vector u, Vector v, Vector n,
+ Vector origin, double cameraTan);
+ void ScaleSelfBy(double s);
+
+ static SBezier From(Vector p0, Vector p1, Vector p2, Vector p3);
+ static SBezier From(Vector p0, Vector p1, Vector p2);
+ static SBezier From(Vector p0, Vector p1);
+ static SBezier From(Vector4 p0, Vector4 p1, Vector4 p2, Vector4 p3);
+ static SBezier From(Vector4 p0, Vector4 p1, Vector4 p2);
+ static SBezier From(Vector4 p0, Vector4 p1);
+};
+
+class SBezierList {
+public:
+ List<SBezier> l;
+
+ void Clear(void);
+ void ScaleSelfBy(double s);
+ void CullIdenticalBeziers(void);
+ void AllIntersectionsWith(SBezierList *sblb, SPointList *spl);
+ bool GetPlaneContainingBeziers(Vector *p, Vector *u, Vector *v,
+ Vector *notCoplanarAt);
+};
+
+class SBezierLoop {
+public:
+ int tag;
+ List<SBezier> l;
+
+ inline void Clear(void) { l.Clear(); }
+ bool IsClosed(void);
+ void Reverse(void);
+ void MakePwlInto(SContour *sc, double chordTol=0);
+ void GetBoundingProjd(Vector u, Vector orig, double *umin, double *umax);
+
+ static SBezierLoop FromCurves(SBezierList *spcl,
+ bool *allClosed, SEdge *errorAt);
+};
+
+class SBezierLoopSet {
+public:
+ List<SBezierLoop> l;
+ Vector normal;
+ Vector point;
+
+ static SBezierLoopSet From(SBezierList *spcl, SPolygon *poly,
+ double chordTol,
+ bool *allClosed, SEdge *errorAt,
+ SBezierList *openContours);
+
+ void GetBoundingProjd(Vector u, Vector orig, double *umin, double *umax);
+ void MakePwlInto(SPolygon *sp);
+ void Clear(void);
+};
+
+class SBezierLoopSetSet {
+public:
+ List<SBezierLoopSet> l;
+
+ void FindOuterFacesFrom(SBezierList *sbl, SPolygon *spxyz, SSurface *srfuv,
+ double chordTol,
+ bool *allClosed, SEdge *notClosedAt,
+ bool *allCoplanar, Vector *notCoplanarAt,
+ SBezierList *openContours);
+ void AddOpenPath(SBezier *sb);
+ void Clear(void);
+};
+
+// Stuff for the surface trim curves: piecewise linear
+class SCurvePt {
+public:
+ int tag;
+ Vector p;
+ bool vertex;
+};
+
+class SCurve {
+public:
+ hSCurve h;
+
+ // In a Boolean, C = A op B. The curves in A and B get copied into C, and
+ // therefore must get new hSCurves assigned. For the curves in A and B,
+ // we use newH to record their new handle in C.
+ hSCurve newH;
+ enum {
+ FROM_A = 100,
+ FROM_B = 200,
+ FROM_INTERSECTION = 300
+ };
+ int source;
+
+ bool isExact;
+ SBezier exact;
+
+ List<SCurvePt> pts;
+
+ hSSurface surfA;
+ hSSurface surfB;
+
+ static SCurve FromTransformationOf(SCurve *a, Vector t, Quaternion q,
+ double scale);
+ SCurve MakeCopySplitAgainst(SShell *agnstA, SShell *agnstB,
+ SSurface *srfA, SSurface *srfB);
+ void RemoveShortSegments(SSurface *srfA, SSurface *srfB);
+ SSurface *GetSurfaceA(SShell *a, SShell *b);
+ SSurface *GetSurfaceB(SShell *a, SShell *b);
+
+ void Clear(void);
+};
+
+// A segment of a curve by which a surface is trimmed: indicates which curve,
+// by its handle, and the starting and ending points of our segment of it.
+// The vector out points out of the surface; it, the surface outer normal,
+// and a tangent to the beginning of the curve are all orthogonal.
+class STrimBy {
+public:
+ hSCurve curve;
+ bool backwards;
+ // If a trim runs backwards, then start and finish still correspond to
+ // the actual start and finish, but they appear in reverse order in
+ // the referenced curve.
+ Vector start;
+ Vector finish;
+
+ static STrimBy EntireCurve(SShell *shell, hSCurve hsc, bool bkwds);
+};
+
+// An intersection point between a line and a surface
+class SInter {
+public:
+ int tag;
+ Vector p;
+ SSurface *srf;
+ Point2d pinter;
+ Vector surfNormal; // of the intersecting surface, at pinter
+ bool onEdge; // pinter is on edge of trim poly
+};
+
+// A rational polynomial surface in Bezier form.
+class SSurface {
+public:
+ int tag;
+ hSSurface h;
+
+ // Same as newH for the curves; record what a surface gets renamed to
+ // when I copy things over.
+ hSSurface newH;
+
+ RgbaColor color;
+ uint32_t face;
+
+ int degm, degn;
+ Vector ctrl[4][4];
+ double weight[4][4];
+
+ List<STrimBy> trim;
+
+ // For testing whether a point (u, v) on the surface lies inside the trim
+ SBspUv *bsp;
+ SEdgeList edges;
+
+ // For caching our initial (u, v) when doing Newton iterations to project
+ // a point into our surface.
+ Point2d cached;
+
+ static SSurface FromExtrusionOf(SBezier *spc, Vector t0, Vector t1);
+ static SSurface FromRevolutionOf(SBezier *sb, Vector pt, Vector axis,
+ double thetas, double thetaf);
+ static SSurface FromPlane(Vector pt, Vector u, Vector v);
+ static SSurface FromTransformationOf(SSurface *a, Vector t, Quaternion q,
+ double scale,
+ bool includingTrims);
+ void ScaleSelfBy(double s);
+
+ void EdgeNormalsWithinSurface(Point2d auv, Point2d buv,
+ Vector *pt, Vector *enin, Vector *enout,
+ Vector *surfn,
+ uint32_t auxA,
+ SShell *shell, SShell *sha, SShell *shb);
+ void FindChainAvoiding(SEdgeList *src, SEdgeList *dest, SPointList *avoid);
+ SSurface MakeCopyTrimAgainst(SShell *parent, SShell *a, SShell *b,
+ SShell *into, int type);
+ void TrimFromEdgeList(SEdgeList *el, bool asUv);
+ void IntersectAgainst(SSurface *b, SShell *agnstA, SShell *agnstB,
+ SShell *into);
+ void AddExactIntersectionCurve(SBezier *sb, SSurface *srfB,
+ SShell *agnstA, SShell *agnstB, SShell *into);
+
+ typedef struct {
+ int tag;
+ Point2d p;
+ } Inter;
+ void WeightControlPoints(void);
+ void UnWeightControlPoints(void);
+ void CopyRowOrCol(bool row, int this_ij, SSurface *src, int src_ij);
+ void BlendRowOrCol(bool row, int this_ij, SSurface *a, int a_ij,
+ SSurface *b, int b_ij);
+ double DepartureFromCoplanar(void);
+ void SplitInHalf(bool byU, SSurface *sa, SSurface *sb);
+ void AllPointsIntersecting(Vector a, Vector b,
+ List<SInter> *l,
+ bool seg, bool trimmed, bool inclTangent);
+ void AllPointsIntersectingUntrimmed(Vector a, Vector b,
+ int *cnt, int *level,
+ List<Inter> *l, bool segment,
+ SSurface *sorig);
+
+ void ClosestPointTo(Vector p, Point2d *puv, bool converge=true);
+ void ClosestPointTo(Vector p, double *u, double *v, bool converge=true);
+ bool ClosestPointNewton(Vector p, double *u, double *v, bool converge=true);
+
+ bool PointIntersectingLine(Vector p0, Vector p1, double *u, double *v);
+ Vector ClosestPointOnThisAndSurface(SSurface *srf2, Vector p);
+ void PointOnSurfaces(SSurface *s1, SSurface *s2, double *u, double *v);
+ Vector PointAt(double u, double v);
+ Vector PointAt(Point2d puv);
+ void TangentsAt(double u, double v, Vector *tu, Vector *tv);
+ Vector NormalAt(Point2d puv);
+ Vector NormalAt(double u, double v);
+ bool LineEntirelyOutsideBbox(Vector a, Vector b, bool segment);
+ void GetAxisAlignedBounding(Vector *ptMax, Vector *ptMin);
+ bool CoincidentWithPlane(Vector n, double d);
+ bool CoincidentWith(SSurface *ss, bool sameNormal);
+ bool IsExtrusion(SBezier *of, Vector *along);
+ bool IsCylinder(Vector *axis, Vector *center, double *r,
+ Vector *start, Vector *finish);
+
+ void TriangulateInto(SShell *shell, SMesh *sm);
+
+ // these are intended as bitmasks, even though there's just one now
+ enum {
+ AS_UV = 0x01,
+ AS_XYZ = 0x00
+ };
+ void MakeTrimEdgesInto(SEdgeList *sel, int flags, SCurve *sc, STrimBy *stb);
+ void MakeEdgesInto(SShell *shell, SEdgeList *sel, int flags,
+ SShell *useCurvesFrom=NULL);
+
+ Vector ExactSurfaceTangentAt(Vector p, SSurface *srfA, SSurface *srfB,
+ Vector dir);
+ void MakeSectionEdgesInto(SShell *shell, SEdgeList *sel, SBezierList *sbl);
+ void MakeClassifyingBsp(SShell *shell, SShell *useCurvesFrom);
+ double ChordToleranceForEdge(Vector a, Vector b);
+ void MakeTriangulationGridInto(List<double> *l, double vs, double vf,
+ bool swapped);
+ Vector PointAtMaybeSwapped(double u, double v, bool swapped);
+
+ void Reverse(void);
+ void Clear(void);
+};
+
+class SShell {
+public:
+ IdList<SCurve,hSCurve> curve;
+ IdList<SSurface,hSSurface> surface;
+
+ bool booleanFailed;
+
+ void MakeFromExtrusionOf(SBezierLoopSet *sbls, Vector t0, Vector t1,
+ RgbaColor color);
+ void MakeFromRevolutionOf(SBezierLoopSet *sbls, Vector pt, Vector axis,
+ RgbaColor color, Group *group);
+
+ void MakeFromUnionOf(SShell *a, SShell *b);
+ void MakeFromDifferenceOf(SShell *a, SShell *b);
+ enum {
+ AS_UNION = 10,
+ AS_DIFFERENCE = 11,
+ AS_INTERSECT = 12
+ };
+ void MakeFromBoolean(SShell *a, SShell *b, int type);
+ void CopyCurvesSplitAgainst(bool opA, SShell *agnst, SShell *into);
+ void CopySurfacesTrimAgainst(SShell *sha, SShell *shb, SShell *into,
+ int type);
+ void MakeIntersectionCurvesAgainst(SShell *against, SShell *into);
+ void MakeClassifyingBsps(SShell *useCurvesFrom);
+ void AllPointsIntersecting(Vector a, Vector b, List<SInter> *il,
+ bool seg, bool trimmed, bool inclTangent);
+ void MakeCoincidentEdgesInto(SSurface *proto, bool sameNormal,
+ SEdgeList *el, SShell *useCurvesFrom);
+ void RewriteSurfaceHandlesForCurves(SShell *a, SShell *b);
+ void CleanupAfterBoolean(void);
+
+ // Definitions when classifying regions of a surface; it is either inside,
+ // outside, or coincident (with parallel or antiparallel normal) with a
+ // shell.
+ enum {
+ INSIDE = 100,
+ OUTSIDE = 200,
+ COINC_SAME = 300,
+ COINC_OPP = 400
+ };
+ static const double DOTP_TOL;
+ int ClassifyRegion(Vector edge_n, Vector inter_surf_n, Vector edge_surf_n);
+ bool ClassifyEdge(int *indir, int *outdir,
+ Vector ea, Vector eb,
+ Vector p,
+ Vector edge_n_in, Vector edge_n_out, Vector surf_n);
+
+ void MakeFromCopyOf(SShell *a);
+ void MakeFromTransformationOf(SShell *a,
+ Vector trans, Quaternion q, double scale);
+ void MakeFromAssemblyOf(SShell *a, SShell *b);
+ void MergeCoincidentSurfaces(void);
+
+ void TriangulateInto(SMesh *sm);
+ void MakeEdgesInto(SEdgeList *sel);
+ void MakeSectionEdgesInto(Vector n, double d,
+ SEdgeList *sel, SBezierList *sbl);
+ bool IsEmpty(void);
+ void RemapFaces(Group *g, int remap);
+ void Clear(void);
+};
+
+#endif
+
--- /dev/null
+//-----------------------------------------------------------------------------
+// How to intersect two surfaces, to get some type of curve. This is either
+// an exact special case (e.g., two planes to make a line), or a numerical
+// thing.
+//
+// Copyright 2008-2013 Jonathan Westhues.
+//-----------------------------------------------------------------------------
+#include "solvespace.h"
+
+extern int FLAG;
+
+void SSurface::AddExactIntersectionCurve(SBezier *sb, SSurface *srfB,
+ SShell *agnstA, SShell *agnstB, SShell *into)
+{
+ SCurve sc = {};
+ // Important to keep the order of (surfA, surfB) consistent; when we later
+ // rewrite the identifiers, we rewrite surfA from A and surfB from B.
+ sc.surfA = h;
+ sc.surfB = srfB->h;
+ sc.exact = *sb;
+ sc.isExact = true;
+
+ // Now we have to piecewise linearize the curve. If there's already an
+ // identical curve in the shell, then follow that pwl exactly, otherwise
+ // calculate from scratch.
+ SCurve split, *existing = NULL, *se;
+ SBezier sbrev = *sb;
+ sbrev.Reverse();
+ bool backwards = false;
+ for(se = into->curve.First(); se; se = into->curve.NextAfter(se)) {
+ if(se->isExact) {
+ if(sb->Equals(&(se->exact))) {
+ existing = se;
+ break;
+ }
+ if(sbrev.Equals(&(se->exact))) {
+ existing = se;
+ backwards = true;
+ break;
+ }
+ }
+ }
+ if(existing) {
+ SCurvePt *v;
+ for(v = existing->pts.First(); v; v = existing->pts.NextAfter(v)) {
+ sc.pts.Add(v);
+ }
+ if(backwards) sc.pts.Reverse();
+ split = sc;
+ sc = {};
+ } else {
+ sb->MakePwlInto(&(sc.pts));
+ // and split the line where it intersects our existing surfaces
+ split = sc.MakeCopySplitAgainst(agnstA, agnstB, this, srfB);
+ sc.Clear();
+ }
+
+ // Test if the curve lies entirely outside one of the
+ SCurvePt *scpt;
+ bool withinA = false, withinB = false;
+ for(scpt = split.pts.First(); scpt; scpt = split.pts.NextAfter(scpt)) {
+ double tol = 0.01;
+ Point2d puv;
+ ClosestPointTo(scpt->p, &puv);
+ if(puv.x > -tol && puv.x < 1 + tol &&
+ puv.y > -tol && puv.y < 1 + tol)
+ {
+ withinA = true;
+ }
+ srfB->ClosestPointTo(scpt->p, &puv);
+ if(puv.x > -tol && puv.x < 1 + tol &&
+ puv.y > -tol && puv.y < 1 + tol)
+ {
+ withinB = true;
+ }
+ // Break out early, no sense wasting time if we already have the answer.
+ if(withinA && withinB) break;
+ }
+ if(!(withinA && withinB)) {
+ // Intersection curve lies entirely outside one of the surfaces, so
+ // it's fake.
+ split.Clear();
+ return;
+ }
+
+#if 0
+ if(sb->deg == 2) {
+ dbp(" ");
+ SCurvePt *prev = NULL, *v;
+ dbp("split.pts.n = %d", split.pts.n);
+ for(v = split.pts.First(); v; v = split.pts.NextAfter(v)) {
+ if(prev) {
+ Vector e = (prev->p).Minus(v->p).WithMagnitude(0);
+ SS.nakedEdges.AddEdge((prev->p).Plus(e), (v->p).Minus(e));
+ }
+ prev = v;
+ }
+ }
+#endif // 0
+ // Nothing should be generating zero-len edges.
+ if((sb->Start()).Equals(sb->Finish())) oops();
+
+ split.source = SCurve::FROM_INTERSECTION;
+ into->curve.AddAndAssignId(&split);
+}
+
+void SSurface::IntersectAgainst(SSurface *b, SShell *agnstA, SShell *agnstB,
+ SShell *into)
+{
+ Vector amax, amin, bmax, bmin;
+ GetAxisAlignedBounding(&amax, &amin);
+ b->GetAxisAlignedBounding(&bmax, &bmin);
+
+ if(Vector::BoundingBoxesDisjoint(amax, amin, bmax, bmin)) {
+ // They cannot possibly intersect, no curves to generate
+ return;
+ }
+
+ Vector alongt, alongb;
+ SBezier oft, ofb;
+ bool isExtdt = this->IsExtrusion(&oft, &alongt),
+ isExtdb = b->IsExtrusion(&ofb, &alongb);
+
+ if(degm == 1 && degn == 1 && b->degm == 1 && b->degn == 1) {
+ // Line-line intersection; it's a plane or nothing.
+ Vector na = NormalAt(0, 0).WithMagnitude(1),
+ nb = b->NormalAt(0, 0).WithMagnitude(1);
+ double da = na.Dot(PointAt(0, 0)),
+ db = nb.Dot(b->PointAt(0, 0));
+
+ Vector dl = na.Cross(nb);
+ if(dl.Magnitude() < LENGTH_EPS) return; // parallel planes
+ dl = dl.WithMagnitude(1);
+ Vector p = Vector::AtIntersectionOfPlanes(na, da, nb, db);
+
+ // Trim it to the region 0 <= {u,v} <= 1 for each plane; not strictly
+ // necessary, since line will be split and excess edges culled, but
+ // this improves speed and robustness.
+ int i;
+ double tmax = VERY_POSITIVE, tmin = VERY_NEGATIVE;
+ for(i = 0; i < 2; i++) {
+ SSurface *s = (i == 0) ? this : b;
+ Vector tu, tv;
+ s->TangentsAt(0, 0, &tu, &tv);
+
+ double up, vp, ud, vd;
+ s->ClosestPointTo(p, &up, &vp);
+ ud = (dl.Dot(tu)) / tu.MagSquared();
+ vd = (dl.Dot(tv)) / tv.MagSquared();
+
+ // so u = up + t*ud
+ // v = vp + t*vd
+ if(ud > LENGTH_EPS) {
+ tmin = max(tmin, -up/ud);
+ tmax = min(tmax, (1 - up)/ud);
+ } else if(ud < -LENGTH_EPS) {
+ tmax = min(tmax, -up/ud);
+ tmin = max(tmin, (1 - up)/ud);
+ } else {
+ if(up < -LENGTH_EPS || up > 1 + LENGTH_EPS) {
+ // u is constant, and outside [0, 1]
+ tmax = VERY_NEGATIVE;
+ }
+ }
+ if(vd > LENGTH_EPS) {
+ tmin = max(tmin, -vp/vd);
+ tmax = min(tmax, (1 - vp)/vd);
+ } else if(vd < -LENGTH_EPS) {
+ tmax = min(tmax, -vp/vd);
+ tmin = max(tmin, (1 - vp)/vd);
+ } else {
+ if(vp < -LENGTH_EPS || vp > 1 + LENGTH_EPS) {
+ // v is constant, and outside [0, 1]
+ tmax = VERY_NEGATIVE;
+ }
+ }
+ }
+
+ if(tmax > tmin + LENGTH_EPS) {
+ SBezier bezier = SBezier::From(p.Plus(dl.ScaledBy(tmin)),
+ p.Plus(dl.ScaledBy(tmax)));
+ AddExactIntersectionCurve(&bezier, b, agnstA, agnstB, into);
+ }
+ } else if((degm == 1 && degn == 1 && isExtdb) ||
+ (b->degm == 1 && b->degn == 1 && isExtdt))
+ {
+ // The intersection between a plane and a surface of extrusion
+ SSurface *splane, *sext;
+ if(degm == 1 && degn == 1) {
+ splane = this;
+ sext = b;
+ } else {
+ splane = b;
+ sext = this;
+ }
+
+ Vector n = splane->NormalAt(0, 0).WithMagnitude(1), along;
+ double d = n.Dot(splane->PointAt(0, 0));
+ SBezier bezier;
+ (void)sext->IsExtrusion(&bezier, &along);
+
+ if(fabs(n.Dot(along)) < LENGTH_EPS) {
+ // Direction of extrusion is parallel to plane; so intersection
+ // is zero or more lines. Build a line within the plane, and
+ // normal to the direction of extrusion, and intersect that line
+ // against the surface; each intersection point corresponds to
+ // a line.
+ Vector pm, alu, p0, dp;
+ // a point halfway along the extrusion
+ pm = ((sext->ctrl[0][0]).Plus(sext->ctrl[0][1])).ScaledBy(0.5);
+ alu = along.WithMagnitude(1);
+ dp = (n.Cross(along)).WithMagnitude(1);
+ // n, alu, and dp form an orthogonal csys; set n component to
+ // place it on the plane, alu component to lie halfway along
+ // extrusion, and dp component doesn't matter so zero
+ p0 = n.ScaledBy(d).Plus(alu.ScaledBy(pm.Dot(alu)));
+
+ List<SInter> inters = {};
+ sext->AllPointsIntersecting(
+ p0, p0.Plus(dp), &inters, false, false, true);
+
+ SInter *si;
+ for(si = inters.First(); si; si = inters.NextAfter(si)) {
+ Vector al = along.ScaledBy(0.5);
+ SBezier bezier;
+ bezier = SBezier::From((si->p).Minus(al), (si->p).Plus(al));
+ AddExactIntersectionCurve(&bezier, b, agnstA, agnstB, into);
+ }
+
+ inters.Clear();
+ } else {
+ // Direction of extrusion is not parallel to plane; so
+ // intersection is projection of extruded curve into our plane.
+ int i;
+ for(i = 0; i <= bezier.deg; i++) {
+ Vector p0 = bezier.ctrl[i],
+ p1 = p0.Plus(along);
+
+ bezier.ctrl[i] =
+ Vector::AtIntersectionOfPlaneAndLine(n, d, p0, p1, NULL);
+ }
+
+ AddExactIntersectionCurve(&bezier, b, agnstA, agnstB, into);
+ }
+ } else if(isExtdt && isExtdb &&
+ sqrt(fabs(alongt.Dot(alongb))) >
+ sqrt(alongt.Magnitude() * alongb.Magnitude()) - LENGTH_EPS)
+ {
+ // Two surfaces of extrusion along the same axis. So they might
+ // intersect along some number of lines parallel to the axis.
+ Vector axis = alongt.WithMagnitude(1);
+
+ List<SInter> inters = {};
+ List<Vector> lv = {};
+
+ double a_axis0 = ( ctrl[0][0]).Dot(axis),
+ a_axis1 = ( ctrl[0][1]).Dot(axis),
+ b_axis0 = (b->ctrl[0][0]).Dot(axis),
+ b_axis1 = (b->ctrl[0][1]).Dot(axis);
+
+ if(a_axis0 > a_axis1) swap(a_axis0, a_axis1);
+ if(b_axis0 > b_axis1) swap(b_axis0, b_axis1);
+
+ double ab_axis0 = max(a_axis0, b_axis0),
+ ab_axis1 = min(a_axis1, b_axis1);
+
+ if(fabs(ab_axis0 - ab_axis1) < LENGTH_EPS) {
+ // The line would be zero-length
+ return;
+ }
+
+ Vector axis0 = axis.ScaledBy(ab_axis0),
+ axis1 = axis.ScaledBy(ab_axis1),
+ axisc = (axis0.Plus(axis1)).ScaledBy(0.5);
+
+ oft.MakePwlInto(&lv);
+
+ int i;
+ for(i = 0; i < lv.n - 1; i++) {
+ Vector pa = lv.elem[i], pb = lv.elem[i+1];
+ pa = pa.Minus(axis.ScaledBy(pa.Dot(axis)));
+ pb = pb.Minus(axis.ScaledBy(pb.Dot(axis)));
+ pa = pa.Plus(axisc);
+ pb = pb.Plus(axisc);
+
+ b->AllPointsIntersecting(pa, pb, &inters, true, false, false);
+ }
+
+ SInter *si;
+ for(si = inters.First(); si; si = inters.NextAfter(si)) {
+ Vector p = (si->p).Minus(axis.ScaledBy((si->p).Dot(axis)));
+ double ub, vb;
+ b->ClosestPointTo(p, &ub, &vb, true);
+ SSurface plane;
+ plane = SSurface::FromPlane(p, axis.Normal(0), axis.Normal(1));
+
+ b->PointOnSurfaces(this, &plane, &ub, &vb);
+
+ p = b->PointAt(ub, vb);
+
+ SBezier bezier;
+ bezier = SBezier::From(p.Plus(axis0), p.Plus(axis1));
+ AddExactIntersectionCurve(&bezier, b, agnstA, agnstB, into);
+ }
+
+ inters.Clear();
+ lv.Clear();
+ } else {
+ // Try intersecting the surfaces numerically, by a marching algorithm.
+ // First, we find all the intersections between a surface and the
+ // boundary of the other surface.
+ SPointList spl = {};
+ int a;
+ for(a = 0; a < 2; a++) {
+ SShell *shA = (a == 0) ? agnstA : agnstB;
+ SSurface *srfA = (a == 0) ? this : b,
+ *srfB = (a == 0) ? b : this;
+
+ SEdgeList el = {};
+ srfA->MakeEdgesInto(shA, &el, AS_XYZ, NULL);
+
+ SEdge *se;
+ for(se = el.l.First(); se; se = el.l.NextAfter(se)) {
+ List<SInter> lsi = {};
+
+ srfB->AllPointsIntersecting(se->a, se->b, &lsi,
+ true, true, false);
+ if(lsi.n == 0) continue;
+
+ // Find the other surface that this curve trims.
+ hSCurve hsc = { (uint32_t)se->auxA };
+ SCurve *sc = shA->curve.FindById(hsc);
+ hSSurface hother = (sc->surfA.v == srfA->h.v) ?
+ sc->surfB : sc->surfA;
+ SSurface *other = shA->surface.FindById(hother);
+
+ SInter *si;
+ for(si = lsi.First(); si; si = lsi.NextAfter(si)) {
+ Vector p = si->p;
+ double u, v;
+ srfB->ClosestPointTo(p, &u, &v);
+ srfB->PointOnSurfaces(srfA, other, &u, &v);
+ p = srfB->PointAt(u, v);
+ if(!spl.ContainsPoint(p)) {
+ SPoint sp;
+ sp.p = p;
+ // We also need the edge normal, so that we know in
+ // which direction to march.
+ srfA->ClosestPointTo(p, &u, &v);
+ Vector n = srfA->NormalAt(u, v);
+ sp.auxv = n.Cross((se->b).Minus(se->a));
+ sp.auxv = (sp.auxv).WithMagnitude(1);
+
+ spl.l.Add(&sp);
+ }
+ }
+ lsi.Clear();
+ }
+
+ el.Clear();
+ }
+
+ while(spl.l.n >= 2) {
+ SCurve sc = {};
+ sc.surfA = h;
+ sc.surfB = b->h;
+ sc.isExact = false;
+ sc.source = SCurve::FROM_INTERSECTION;
+
+ Vector start = spl.l.elem[0].p,
+ startv = spl.l.elem[0].auxv;
+ spl.l.ClearTags();
+ spl.l.elem[0].tag = 1;
+ spl.l.RemoveTagged();
+
+ // Our chord tolerance is whatever the user specified
+ double maxtol = SS.ChordTolMm();
+ int maxsteps = max(300, SS.GetMaxSegments()*3);
+
+ // The curve starts at our starting point.
+ SCurvePt padd = {};
+ padd.vertex = true;
+ padd.p = start;
+ sc.pts.Add(&padd);
+
+ Point2d pa, pb;
+ Vector np, npc = Vector::From(0, 0, 0);
+ bool fwd = false;
+ // Better to start with a too-small step, so that we don't miss
+ // features of the curve entirely.
+ double tol, step = maxtol;
+ for(a = 0; a < maxsteps; a++) {
+ ClosestPointTo(start, &pa);
+ b->ClosestPointTo(start, &pb);
+
+ Vector na = NormalAt(pa).WithMagnitude(1),
+ nb = b->NormalAt(pb).WithMagnitude(1);
+
+ if(a == 0) {
+ Vector dp = nb.Cross(na);
+ if(dp.Dot(startv) < 0) {
+ // We want to march in the more inward direction.
+ fwd = true;
+ } else {
+ fwd = false;
+ }
+ }
+
+ int i;
+ for(i = 0; i < 20; i++) {
+ Vector dp = nb.Cross(na);
+ if(!fwd) dp = dp.ScaledBy(-1);
+ dp = dp.WithMagnitude(step);
+
+ np = start.Plus(dp);
+ npc = ClosestPointOnThisAndSurface(b, np);
+ tol = (npc.Minus(np)).Magnitude();
+
+ if(tol > maxtol*0.8) {
+ step *= 0.90;
+ } else {
+ step /= 0.90;
+ }
+
+ if((tol < maxtol) && (tol > maxtol/2)) {
+ // If we meet the chord tolerance test, and we're
+ // not too fine, then we break out.
+ break;
+ }
+ }
+
+ SPoint *sp;
+ for(sp = spl.l.First(); sp; sp = spl.l.NextAfter(sp)) {
+ if((sp->p).OnLineSegment(start, npc, 2*SS.ChordTolMm())) {
+ sp->tag = 1;
+ a = maxsteps;
+ npc = sp->p;
+ }
+ }
+
+ padd.p = npc;
+ padd.vertex = (a == maxsteps);
+ sc.pts.Add(&padd);
+
+ start = npc;
+ }
+
+ spl.l.RemoveTagged();
+
+ // And now we split and insert the curve
+ SCurve split = sc.MakeCopySplitAgainst(agnstA, agnstB, this, b);
+ sc.Clear();
+ into->curve.AddAndAssignId(&split);
+ }
+ spl.Clear();
+ }
+}
+
+//-----------------------------------------------------------------------------
+// Are two surfaces coincident, with the same (or with opposite) normals?
+// Currently handles planes only.
+//-----------------------------------------------------------------------------
+bool SSurface::CoincidentWith(SSurface *ss, bool sameNormal) {
+ if(degm != 1 || degn != 1) return false;
+ if(ss->degm != 1 || ss->degn != 1) return false;
+
+ Vector p = ctrl[0][0];
+ Vector n = NormalAt(0, 0).WithMagnitude(1);
+ double d = n.Dot(p);
+
+ if(!ss->CoincidentWithPlane(n, d)) return false;
+
+ Vector n2 = ss->NormalAt(0, 0);
+ if(sameNormal) {
+ if(n2.Dot(n) < 0) return false;
+ } else {
+ if(n2.Dot(n) > 0) return false;
+ }
+
+ return true;
+}
+
+bool SSurface::CoincidentWithPlane(Vector n, double d) {
+ if(degm != 1 || degn != 1) return false;
+ if(fabs(n.Dot(ctrl[0][0]) - d) > LENGTH_EPS) return false;
+ if(fabs(n.Dot(ctrl[0][1]) - d) > LENGTH_EPS) return false;
+ if(fabs(n.Dot(ctrl[1][0]) - d) > LENGTH_EPS) return false;
+ if(fabs(n.Dot(ctrl[1][1]) - d) > LENGTH_EPS) return false;
+
+ return true;
+}
+
+//-----------------------------------------------------------------------------
+// In our shell, find all surfaces that are coincident with the prototype
+// surface (with same or opposite normal, as specified), and copy all of
+// their trim polygons into el. The edges are returned in uv coordinates for
+// the prototype surface.
+//-----------------------------------------------------------------------------
+void SShell::MakeCoincidentEdgesInto(SSurface *proto, bool sameNormal,
+ SEdgeList *el, SShell *useCurvesFrom)
+{
+ SSurface *ss;
+ for(ss = surface.First(); ss; ss = surface.NextAfter(ss)) {
+ if(proto->CoincidentWith(ss, sameNormal)) {
+ ss->MakeEdgesInto(this, el, SSurface::AS_XYZ, useCurvesFrom);
+ }
+ }
+
+ SEdge *se;
+ for(se = el->l.First(); se; se = el->l.NextAfter(se)) {
+ double ua, va, ub, vb;
+ proto->ClosestPointTo(se->a, &ua, &va);
+ proto->ClosestPointTo(se->b, &ub, &vb);
+
+ if(sameNormal) {
+ se->a = Vector::From(ua, va, 0);
+ se->b = Vector::From(ub, vb, 0);
+ } else {
+ // Flip normal, so flip all edge directions
+ se->b = Vector::From(ua, va, 0);
+ se->a = Vector::From(ub, vb, 0);
+ }
+ }
+}
+
--- /dev/null
+//-----------------------------------------------------------------------------
+// Triangulate a surface. If the surface is curved, then we first superimpose
+// a grid of quads, with spacing to achieve our chord tolerance. We then
+// proceed by ear-clipping; the resulting mesh should be watertight and not
+// awful numerically, but has no special properties (Delaunay, etc.).
+//
+// Copyright 2008-2013 Jonathan Westhues.
+//-----------------------------------------------------------------------------
+#include "../solvespace.h"
+
+void SPolygon::UvTriangulateInto(SMesh *m, SSurface *srf) {
+ if(l.n <= 0) return;
+
+ //int64_t in = GetMilliseconds();
+
+ normal = Vector::From(0, 0, 1);
+
+ while(l.n > 0) {
+ FixContourDirections();
+ l.ClearTags();
+
+ // Find a top-level contour, and start with that. Then build bridges
+ // in order to merge all its islands into a single contour.
+ SContour *top;
+ for(top = l.First(); top; top = l.NextAfter(top)) {
+ if(top->timesEnclosed == 0) {
+ break;
+ }
+ }
+ if(!top) {
+ dbp("polygon has no top-level contours?");
+ return;
+ }
+
+ // Start with the outer contour
+ SContour merged = {};
+ top->tag = 1;
+ top->CopyInto(&merged);
+ (merged.l.n)--;
+
+ // List all of the edges, for testing whether bridges work.
+ SEdgeList el = {};
+ top->MakeEdgesInto(&el);
+ List<Vector> vl = {};
+
+ // And now find all of its holes. Note that we will also find any
+ // outer contours that lie entirely within this contour, and any
+ // holes for those contours. But that's okay, because we can merge
+ // those too.
+ SContour *sc;
+ for(sc = l.First(); sc; sc = l.NextAfter(sc)) {
+ if(sc->timesEnclosed != 1) continue;
+ if(sc->l.n < 2) continue;
+
+ // Test the midpoint of an edge. Our polygon may not be self-
+ // intersecting, but two contours may share a vertex; so a
+ // vertex could be on the edge of another polygon, in which
+ // case ContainsPointProjdToNormal returns indeterminate.
+ Vector tp = sc->AnyEdgeMidpoint();
+ if(top->ContainsPointProjdToNormal(normal, tp)) {
+ sc->tag = 2;
+ sc->MakeEdgesInto(&el);
+ sc->FindPointWithMinX();
+ }
+ }
+
+// dbp("finished finding holes: %d ms", (int)(GetMilliseconds() - in));
+ for(;;) {
+ double xmin = 1e10;
+ SContour *scmin = NULL;
+
+ for(sc = l.First(); sc; sc = l.NextAfter(sc)) {
+ if(sc->tag != 2) continue;
+
+ if(sc->xminPt.x < xmin) {
+ xmin = sc->xminPt.x;
+ scmin = sc;
+ }
+ }
+ if(!scmin) break;
+
+ if(!merged.BridgeToContour(scmin, &el, &vl)) {
+ dbp("couldn't merge our hole");
+ return;
+ }
+// dbp(" bridged to contour: %d ms", (int)(GetMilliseconds() - in));
+ scmin->tag = 3;
+ }
+// dbp("finished merging holes: %d ms", (int)(GetMilliseconds() - in));
+
+ merged.UvTriangulateInto(m, srf);
+// dbp("finished ear clippping: %d ms", (int)(GetMilliseconds() - in));
+ merged.l.Clear();
+ el.Clear();
+ vl.Clear();
+
+ // Careful, need to free the points within the contours, and not just
+ // the contours themselves. This was a tricky memory leak.
+ for(sc = l.First(); sc; sc = l.NextAfter(sc)) {
+ if(sc->tag) {
+ sc->l.Clear();
+ }
+ }
+ l.RemoveTagged();
+ }
+}
+
+bool SContour::BridgeToContour(SContour *sc,
+ SEdgeList *avoidEdges, List<Vector> *avoidPts)
+{
+ int i, j;
+
+ // Start looking for a bridge on our new hole near its leftmost (min x)
+ // point.
+ int sco = 0;
+ for(i = 0; i < (sc->l.n - 1); i++) {
+ if((sc->l.elem[i].p).EqualsExactly(sc->xminPt)) {
+ sco = i;
+ }
+ }
+
+ // And start looking on our merged contour at whichever point is nearest
+ // to the leftmost point of the new segment.
+ int thiso = 0;
+ double dmin = 1e10;
+ for(i = 0; i < l.n; i++) {
+ Vector p = l.elem[i].p;
+ double d = (p.Minus(sc->xminPt)).MagSquared();
+ if(d < dmin) {
+ dmin = d;
+ thiso = i;
+ }
+ }
+
+ int thisp, scp;
+
+ Vector a, b, *f;
+
+ // First check if the contours share a point; in that case we should
+ // merge them there, without a bridge.
+ for(i = 0; i < l.n; i++) {
+ thisp = WRAP(i+thiso, l.n);
+ a = l.elem[thisp].p;
+
+ for(f = avoidPts->First(); f; f = avoidPts->NextAfter(f)) {
+ if(f->Equals(a)) break;
+ }
+ if(f) continue;
+
+ for(j = 0; j < (sc->l.n - 1); j++) {
+ scp = WRAP(j+sco, (sc->l.n - 1));
+ b = sc->l.elem[scp].p;
+
+ if(a.Equals(b)) {
+ goto haveEdge;
+ }
+ }
+ }
+
+ // If that fails, look for a bridge that does not intersect any edges.
+ for(i = 0; i < l.n; i++) {
+ thisp = WRAP(i+thiso, l.n);
+ a = l.elem[thisp].p;
+
+ for(f = avoidPts->First(); f; f = avoidPts->NextAfter(f)) {
+ if(f->Equals(a)) break;
+ }
+ if(f) continue;
+
+ for(j = 0; j < (sc->l.n - 1); j++) {
+ scp = WRAP(j+sco, (sc->l.n - 1));
+ b = sc->l.elem[scp].p;
+
+ for(f = avoidPts->First(); f; f = avoidPts->NextAfter(f)) {
+ if(f->Equals(b)) break;
+ }
+ if(f) continue;
+
+ if(avoidEdges->AnyEdgeCrossings(a, b) > 0) {
+ // doesn't work, bridge crosses an existing edge
+ } else {
+ goto haveEdge;
+ }
+ }
+ }
+
+ // Tried all the possibilities, didn't find an edge
+ return false;
+
+haveEdge:
+ SContour merged = {};
+ for(i = 0; i < l.n; i++) {
+ merged.AddPoint(l.elem[i].p);
+ if(i == thisp) {
+ // less than or equal; need to duplicate the join point
+ for(j = 0; j <= (sc->l.n - 1); j++) {
+ int jp = WRAP(j + scp, (sc->l.n - 1));
+ merged.AddPoint((sc->l.elem[jp]).p);
+ }
+ // and likewise duplicate join point for the outer curve
+ merged.AddPoint(l.elem[i].p);
+ }
+ }
+
+ // and future bridges mustn't cross our bridge, and it's tricky to get
+ // things right if two bridges come from the same point
+ avoidEdges->AddEdge(a, b);
+ avoidPts->Add(&a);
+ avoidPts->Add(&b);
+
+ l.Clear();
+ l = merged.l;
+ return true;
+}
+
+bool SContour::IsEar(int bp, double scaledEps) {
+ int ap = WRAP(bp-1, l.n),
+ cp = WRAP(bp+1, l.n);
+
+ STriangle tr = {};
+ tr.a = l.elem[ap].p;
+ tr.b = l.elem[bp].p;
+ tr.c = l.elem[cp].p;
+
+ if((tr.a).Equals(tr.c)) {
+ // This is two coincident and anti-parallel edges. Zero-area, so
+ // won't generate a real triangle, but we certainly can clip it.
+ return true;
+ }
+
+ Vector n = Vector::From(0, 0, -1);
+ if((tr.Normal()).Dot(n) < scaledEps) {
+ // This vertex is reflex, or between two collinear edges; either way,
+ // it's not an ear.
+ return false;
+ }
+
+ // Accelerate with an axis-aligned bounding box test
+ Vector maxv = tr.a, minv = tr.a;
+ (tr.b).MakeMaxMin(&maxv, &minv);
+ (tr.c).MakeMaxMin(&maxv, &minv);
+
+ int i;
+ for(i = 0; i < l.n; i++) {
+ if(i == ap || i == bp || i == cp) continue;
+
+ Vector p = l.elem[i].p;
+ if(p.OutsideAndNotOn(maxv, minv)) continue;
+
+ // A point on the edge of the triangle is considered to be inside,
+ // and therefore makes it a non-ear; but a point on the vertex is
+ // "outside", since that's necessary to make bridges work.
+ if(p.EqualsExactly(tr.a)) continue;
+ if(p.EqualsExactly(tr.b)) continue;
+ if(p.EqualsExactly(tr.c)) continue;
+
+ if(tr.ContainsPointProjd(n, p)) {
+ return false;
+ }
+ }
+ return true;
+}
+
+void SContour::ClipEarInto(SMesh *m, int bp, double scaledEps) {
+ int ap = WRAP(bp-1, l.n),
+ cp = WRAP(bp+1, l.n);
+
+ STriangle tr = {};
+ tr.a = l.elem[ap].p;
+ tr.b = l.elem[bp].p;
+ tr.c = l.elem[cp].p;
+ if(tr.Normal().MagSquared() < scaledEps*scaledEps) {
+ // A vertex with more than two edges will cause us to generate
+ // zero-area triangles, which must be culled.
+ } else {
+ m->AddTriangle(&tr);
+ }
+
+ // By deleting the point at bp, we may change the ear-ness of the points
+ // on either side.
+ l.elem[ap].ear = SPoint::UNKNOWN;
+ l.elem[cp].ear = SPoint::UNKNOWN;
+
+ l.ClearTags();
+ l.elem[bp].tag = 1;
+ l.RemoveTagged();
+}
+
+void SContour::UvTriangulateInto(SMesh *m, SSurface *srf) {
+ Vector tu, tv;
+ srf->TangentsAt(0.5, 0.5, &tu, &tv);
+ double s = sqrt(tu.MagSquared() + tv.MagSquared());
+ // We would like to apply our tolerances in xyz; but that would be a lot
+ // of work, so at least scale the epsilon semi-reasonably. That's
+ // perfect for square planes, less perfect for anything else.
+ double scaledEps = LENGTH_EPS / s;
+
+ int i;
+ // Clean the original contour by removing any zero-length edges.
+ l.ClearTags();
+ for(i = 1; i < l.n; i++) {
+ if((l.elem[i].p).Equals(l.elem[i-1].p)) {
+ l.elem[i].tag = 1;
+ }
+ }
+ l.RemoveTagged();
+
+ // Now calculate the ear-ness of each vertex
+ for(i = 0; i < l.n; i++) {
+ (l.elem[i]).ear = IsEar(i, scaledEps) ? SPoint::EAR : SPoint::NOT_EAR;
+ }
+
+ bool toggle = false;
+ while(l.n > 3) {
+ // Some points may have changed ear-ness, so recalculate
+ for(i = 0; i < l.n; i++) {
+ if(l.elem[i].ear == SPoint::UNKNOWN) {
+ (l.elem[i]).ear = IsEar(i, scaledEps) ?
+ SPoint::EAR : SPoint::NOT_EAR;
+ }
+ }
+
+ int bestEar = -1;
+ double bestChordTol = VERY_POSITIVE;
+ // Alternate the starting position so we generate strip-like
+ // triangulations instead of fan-like
+ toggle = !toggle;
+ int offset = toggle ? -1 : 0;
+ for(i = 0; i < l.n; i++) {
+ int ear = WRAP(i+offset, l.n);
+ if(l.elem[ear].ear == SPoint::EAR) {
+ if(srf->degm == 1 && srf->degn == 1) {
+ // This is a plane; any ear is a good ear.
+ bestEar = ear;
+ break;
+ }
+ // If we are triangulating a curved surface, then try to
+ // clip ears that have a small chord tolerance from the
+ // surface.
+ Vector prev = l.elem[WRAP((i+offset-1), l.n)].p,
+ next = l.elem[WRAP((i+offset+1), l.n)].p;
+ double tol = srf->ChordToleranceForEdge(prev, next);
+ if(tol < bestChordTol - scaledEps) {
+ bestEar = ear;
+ bestChordTol = tol;
+ }
+ if(bestChordTol < 0.1*SS.ChordTolMm()) {
+ break;
+ }
+ }
+ }
+ if(bestEar < 0) {
+ dbp("couldn't find an ear! fail");
+ return;
+ }
+ ClipEarInto(m, bestEar, scaledEps);
+ }
+
+ ClipEarInto(m, 0, scaledEps); // add the last triangle
+}
+
+double SSurface::ChordToleranceForEdge(Vector a, Vector b) {
+ Vector as = PointAt(a.x, a.y), bs = PointAt(b.x, b.y);
+
+ double worst = VERY_NEGATIVE;
+ int i;
+ for(i = 1; i <= 3; i++) {
+ Vector p = a. Plus((b. Minus(a )).ScaledBy(i/4.0)),
+ ps = as.Plus((bs.Minus(as)).ScaledBy(i/4.0));
+
+ Vector pps = PointAt(p.x, p.y);
+ worst = max(worst, (pps.Minus(ps)).MagSquared());
+ }
+ return sqrt(worst);
+}
+
+Vector SSurface::PointAtMaybeSwapped(double u, double v, bool swapped) {
+ if(swapped) {
+ return PointAt(v, u);
+ } else {
+ return PointAt(u, v);
+ }
+}
+
+void SSurface::MakeTriangulationGridInto(List<double> *l, double vs, double vf,
+ bool swapped)
+{
+ double worst = 0;
+
+ // Try piecewise linearizing four curves, at u = 0, 1/3, 2/3, 1; choose
+ // the worst chord tolerance of any of those.
+ int i;
+ for(i = 0; i <= 3; i++) {
+ double u = i/3.0;
+
+ // This chord test should be identical to the one in SBezier::MakePwl
+ // to make the piecewise linear edges line up with the grid more or
+ // less.
+ Vector ps = PointAtMaybeSwapped(u, vs, swapped),
+ pf = PointAtMaybeSwapped(u, vf, swapped);
+
+ double vm1 = (2*vs + vf) / 3,
+ vm2 = (vs + 2*vf) / 3;
+
+ Vector pm1 = PointAtMaybeSwapped(u, vm1, swapped),
+ pm2 = PointAtMaybeSwapped(u, vm2, swapped);
+
+ worst = max(worst, pm1.DistanceToLine(ps, pf.Minus(ps)));
+ worst = max(worst, pm2.DistanceToLine(ps, pf.Minus(ps)));
+ }
+
+ double step = 1.0/SS.GetMaxSegments();
+ if((vf - vs) < step || worst < SS.ChordTolMm()) {
+ l->Add(&vf);
+ } else {
+ MakeTriangulationGridInto(l, vs, (vs+vf)/2, swapped);
+ MakeTriangulationGridInto(l, (vs+vf)/2, vf, swapped);
+ }
+}
+
+void SPolygon::UvGridTriangulateInto(SMesh *mesh, SSurface *srf) {
+ SEdgeList orig = {};
+ MakeEdgesInto(&orig);
+
+ SEdgeList holes = {};
+
+ normal = Vector::From(0, 0, 1);
+ FixContourDirections();
+
+ // Build a rectangular grid, with horizontal and vertical lines in the
+ // uv plane. The spacing of these lines is adaptive, so calculate that.
+ List<double> li, lj;
+ li = {};
+ lj = {};
+ double v = 0;
+ li.Add(&v);
+ srf->MakeTriangulationGridInto(&li, 0, 1, true);
+ lj.Add(&v);
+ srf->MakeTriangulationGridInto(&lj, 0, 1, false);
+
+ // Now iterate over each quad in the grid. If it's outside the polygon,
+ // or if it intersects the polygon, then we discard it. Otherwise we
+ // generate two triangles in the mesh, and cut it out of our polygon.
+ int i, j;
+ for(i = 0; i < (li.n - 1); i++) {
+ for(j = 0; j < (lj.n - 1); j++) {
+ double us = li.elem[i], uf = li.elem[i+1],
+ vs = lj.elem[j], vf = lj.elem[j+1];
+
+ Vector a = Vector::From(us, vs, 0),
+ b = Vector::From(us, vf, 0),
+ c = Vector::From(uf, vf, 0),
+ d = Vector::From(uf, vs, 0);
+
+ if(orig.AnyEdgeCrossings(a, b, NULL) ||
+ orig.AnyEdgeCrossings(b, c, NULL) ||
+ orig.AnyEdgeCrossings(c, d, NULL) ||
+ orig.AnyEdgeCrossings(d, a, NULL))
+ {
+ continue;
+ }
+
+ // There's no intersections, so it doesn't matter which point
+ // we decide to test.
+ if(!this->ContainsPoint(a)) {
+ continue;
+ }
+
+ // Add the quad to our mesh
+ STriangle tr = {};
+ tr.a = a;
+ tr.b = b;
+ tr.c = c;
+ mesh->AddTriangle(&tr);
+ tr.a = a;
+ tr.b = c;
+ tr.c = d;
+ mesh->AddTriangle(&tr);
+
+ holes.AddEdge(a, b);
+ holes.AddEdge(b, c);
+ holes.AddEdge(c, d);
+ holes.AddEdge(d, a);
+ }
+ }
+
+ holes.CullExtraneousEdges();
+ SPolygon hp = {};
+ holes.AssemblePolygon(&hp, NULL, true);
+
+ SContour *sc;
+ for(sc = hp.l.First(); sc; sc = hp.l.NextAfter(sc)) {
+ l.Add(sc);
+ }
+
+ orig.Clear();
+ holes.Clear();
+ li.Clear();
+ lj.Clear();
+ hp.l.Clear();
+
+ UvTriangulateInto(mesh, srf);
+}
+
+
--- /dev/null
+//-----------------------------------------------------------------------------
+// Implementation of a cosmetic line style, which determines the color and
+// other appearance of a line or curve on-screen and in exported files. Some
+// styles are predefined, and others can be created by the user.
+//
+// Copyright 2008-2013 Jonathan Westhues.
+//-----------------------------------------------------------------------------
+#include "solvespace.h"
+#include <png.h>
+
+#define DEFAULT_TEXT_HEIGHT 11.5
+
+const Style::Default Style::Defaults[] = {
+ { { ACTIVE_GRP }, "ActiveGrp", RGBf(1.0, 1.0, 1.0), 1.5, 4 },
+ { { CONSTRUCTION }, "Construction", RGBf(0.1, 0.7, 0.1), 1.5, 0 },
+ { { INACTIVE_GRP }, "InactiveGrp", RGBf(0.5, 0.3, 0.0), 1.5, 3 },
+ { { DATUM }, "Datum", RGBf(0.0, 0.8, 0.0), 1.5, 0 },
+ { { SOLID_EDGE }, "SolidEdge", RGBf(0.8, 0.8, 0.8), 1.0, 2 },
+ { { CONSTRAINT }, "Constraint", RGBf(1.0, 0.1, 1.0), 1.0, 0 },
+ { { SELECTED }, "Selected", RGBf(1.0, 0.0, 0.0), 1.5, 0 },
+ { { HOVERED }, "Hovered", RGBf(1.0, 1.0, 0.0), 1.5, 0 },
+ { { CONTOUR_FILL }, "ContourFill", RGBf(0.0, 0.1, 0.1), 1.0, 0 },
+ { { NORMALS }, "Normals", RGBf(0.0, 0.4, 0.4), 1.0, 0 },
+ { { ANALYZE }, "Analyze", RGBf(0.0, 1.0, 1.0), 1.0, 0 },
+ { { DRAW_ERROR }, "DrawError", RGBf(1.0, 0.0, 0.0), 8.0, 0 },
+ { { DIM_SOLID }, "DimSolid", RGBf(0.1, 0.1, 0.1), 1.0, 0 },
+ { { HIDDEN_EDGE }, "HiddenEdge", RGBf(0.8, 0.8, 0.8), 2.0, 1 },
+ { { OUTLINE }, "Outline", RGBf(0.8, 0.8, 0.8), 3.0, 5 },
+ { { 0 }, NULL, RGBf(0.0, 0.0, 0.0), 0.0, 0 }
+};
+
+std::string Style::CnfColor(const std::string &prefix) {
+ return "Style_" + prefix + "_Color";
+}
+std::string Style::CnfWidth(const std::string &prefix) {
+ return "Style_" + prefix + "_Width";
+}
+std::string Style::CnfTextHeight(const std::string &prefix) {
+ return "Style_" + prefix + "_TextHeight";
+}
+
+std::string Style::CnfPrefixToName(const std::string &prefix) {
+ std::string name = "#def-";
+
+ for(size_t i = 0; i < prefix.length(); i++) {
+ if(isupper(prefix[i]) && i != 0)
+ name += '-';
+ name += tolower(prefix[i]);
+ }
+
+ return name;
+}
+
+void Style::CreateAllDefaultStyles(void) {
+ const Default *d;
+ for(d = &(Defaults[0]); d->h.v; d++) {
+ (void)Get(d->h);
+ }
+}
+
+void Style::CreateDefaultStyle(hStyle h) {
+ bool isDefaultStyle = true;
+ const Default *d;
+ for(d = &(Defaults[0]); d->h.v; d++) {
+ if(d->h.v == h.v) break;
+ }
+ if(!d->h.v) {
+ // Not a default style; so just create it the same as our default
+ // active group entity style.
+ d = &(Defaults[0]);
+ isDefaultStyle = false;
+ }
+
+ Style ns = {};
+ FillDefaultStyle(&ns, d);
+ ns.h = h;
+ if(isDefaultStyle) {
+ ns.name = CnfPrefixToName(d->cnfPrefix);
+ } else {
+ ns.name = "new-custom-style";
+ }
+
+ SK.style.Add(&ns);
+}
+
+void Style::FillDefaultStyle(Style *s, const Default *d, bool factory) {
+ if(d == NULL) d = &Defaults[0];
+ s->color = (factory) ? d->color : CnfThawColor(d->color, CnfColor(d->cnfPrefix));
+ s->width = (factory) ? d->width : CnfThawFloat((float)(d->width), CnfWidth(d->cnfPrefix));
+ s->widthAs = UNITS_AS_PIXELS;
+ s->textHeight = (factory) ? DEFAULT_TEXT_HEIGHT
+ : CnfThawFloat(DEFAULT_TEXT_HEIGHT, CnfTextHeight(d->cnfPrefix));
+ s->textHeightAs = UNITS_AS_PIXELS;
+ s->textOrigin = 0;
+ s->textAngle = 0;
+ s->visible = true;
+ s->exportable = true;
+ s->filled = false;
+ s->fillColor = RGBf(0.3, 0.3, 0.3);
+ s->stippleType = (d->h.v == Style::HIDDEN_EDGE) ? Style::STIPPLE_DASH
+ : Style::STIPPLE_CONTINUOUS;
+ s->stippleScale = 15.0;
+ s->zIndex = d->zIndex;
+}
+
+void Style::LoadFactoryDefaults(void) {
+ const Default *d;
+ for(d = &(Defaults[0]); d->h.v; d++) {
+ Style *s = Get(d->h);
+ FillDefaultStyle(s, d, /*factory=*/true);
+ }
+ SS.backgroundColor = RGBi(0, 0, 0);
+ if(SS.bgImage.fromFile) MemFree(SS.bgImage.fromFile);
+ SS.bgImage.fromFile = NULL;
+}
+
+void Style::FreezeDefaultStyles(void) {
+ const Default *d;
+ for(d = &(Defaults[0]); d->h.v; d++) {
+ CnfFreezeColor(Color(d->h), CnfColor(d->cnfPrefix));
+ CnfFreezeFloat((float)Width(d->h), CnfWidth(d->cnfPrefix));
+ CnfFreezeFloat((float)TextHeight(d->h), CnfTextHeight(d->cnfPrefix));
+ }
+}
+
+uint32_t Style::CreateCustomStyle(bool rememberForUndo) {
+ if(rememberForUndo) SS.UndoRemember();
+ uint32_t vs = max((uint32_t)Style::FIRST_CUSTOM, SK.style.MaximumId() + 1);
+ hStyle hs = { vs };
+ (void)Style::Get(hs);
+ return hs.v;
+}
+
+void Style::AssignSelectionToStyle(uint32_t v) {
+ bool showError = false;
+ SS.GW.GroupSelection();
+
+ SS.UndoRemember();
+ int i;
+ for(i = 0; i < SS.GW.gs.entities; i++) {
+ hEntity he = SS.GW.gs.entity[i];
+ Entity *e = SK.GetEntity(he);
+ if(!e->IsStylable()) continue;
+
+ if(!he.isFromRequest()) {
+ showError = true;
+ continue;
+ }
+
+ hRequest hr = he.request();
+ Request *r = SK.GetRequest(hr);
+ r->style.v = v;
+ SS.MarkGroupDirty(r->group);
+ }
+ for(i = 0; i < SS.GW.gs.constraints; i++) {
+ hConstraint hc = SS.GW.gs.constraint[i];
+ Constraint *c = SK.GetConstraint(hc);
+ if(!c->IsStylable()) continue;
+
+ c->disp.style.v = v;
+ }
+
+ if(showError) {
+ Error("Can't assign style to an entity that's derived from another "
+ "entity; try assigning a style to this entity's parent.");
+ }
+
+ SS.GW.ClearSelection();
+ InvalidateGraphics();
+ SS.ScheduleGenerateAll();
+
+ // And show that style's info screen in the text window.
+ SS.TW.GoToScreen(TextWindow::SCREEN_STYLE_INFO);
+ SS.TW.shown.style.v = v;
+ SS.ScheduleShowTW();
+}
+
+//-----------------------------------------------------------------------------
+// Look up a style by its handle. If that style does not exist, then create
+// the style, according to our table of default styles.
+//-----------------------------------------------------------------------------
+Style *Style::Get(hStyle h) {
+ if(h.v == 0) h.v = ACTIVE_GRP;
+
+ Style *s = SK.style.FindByIdNoOops(h);
+ if(s) {
+ // It exists, good.
+ return s;
+ } else {
+ // It doesn't exist; so we should create it and then return that.
+ CreateDefaultStyle(h);
+ return SK.style.FindById(h);
+ }
+}
+
+//-----------------------------------------------------------------------------
+// A couple of wrappers, so that I can call these functions with either an
+// hStyle or with the integer corresponding to that hStyle.v.
+//-----------------------------------------------------------------------------
+RgbaColor Style::Color(int s, bool forExport) {
+ hStyle hs = { (uint32_t)s };
+ return Color(hs, forExport);
+}
+float Style::Width(int s) {
+ hStyle hs = { (uint32_t)s };
+ return Width(hs);
+}
+
+//-----------------------------------------------------------------------------
+// If a color is almost white, then we can rewrite it to black, just so that
+// it won't disappear on file formats with a light background.
+//-----------------------------------------------------------------------------
+RgbaColor Style::RewriteColor(RgbaColor rgbin) {
+ Vector rgb = Vector::From(rgbin.redF(), rgbin.greenF(), rgbin.blueF());
+ rgb = rgb.Minus(Vector::From(1, 1, 1));
+ if(rgb.Magnitude() < 0.4 && SS.fixExportColors) {
+ // This is an almost-white color in a default style, which is
+ // good for the default on-screen view (black bg) but probably
+ // not desired in the exported files, which typically are shown
+ // against white backgrounds.
+ return RGBi(0, 0, 0);
+ } else {
+ return rgbin;
+ }
+}
+
+//-----------------------------------------------------------------------------
+// Return the stroke color associated with our style as 8-bit RGB.
+//-----------------------------------------------------------------------------
+RgbaColor Style::Color(hStyle h, bool forExport) {
+ Style *s = Get(h);
+ if(forExport) {
+ return RewriteColor(s->color);
+ } else {
+ return s->color;
+ }
+}
+
+//-----------------------------------------------------------------------------
+// Return the fill color associated with our style as 8-bit RGB.
+//-----------------------------------------------------------------------------
+RgbaColor Style::FillColor(hStyle h, bool forExport) {
+ Style *s = Get(h);
+ if(forExport) {
+ return RewriteColor(s->fillColor);
+ } else {
+ return s->fillColor;
+ }
+}
+
+//-----------------------------------------------------------------------------
+// Return the width associated with our style in pixels..
+//-----------------------------------------------------------------------------
+float Style::Width(hStyle h) {
+ double r = 1.0;
+ Style *s = Get(h);
+ if(s->widthAs == UNITS_AS_MM) {
+ r = s->width * SS.GW.scale;
+ } else if(s->widthAs == UNITS_AS_PIXELS) {
+ r = s->width;
+ }
+ // This returns a float because ssglLineWidth expects a float, avoid casts.
+ return (float)r;
+}
+
+//-----------------------------------------------------------------------------
+// Return the width associated with our style in millimeters..
+//-----------------------------------------------------------------------------
+double Style::WidthMm(int hs) {
+ double widthpx = Width(hs);
+ return widthpx / SS.GW.scale;
+}
+
+//-----------------------------------------------------------------------------
+// Return the associated text height, in pixels.
+//-----------------------------------------------------------------------------
+double Style::TextHeight(hStyle hs) {
+ Style *s = Get(hs);
+ if(s->textHeightAs == UNITS_AS_MM) {
+ return s->textHeight * SS.GW.scale;
+ } else /* s->textHeightAs == UNITS_AS_PIXELS */ {
+ return s->textHeight;
+ }
+}
+
+double Style::DefaultTextHeight() {
+ hStyle hs { Style::CONSTRAINT };
+ return TextHeight(hs);
+}
+
+//-----------------------------------------------------------------------------
+// Should lines and curves from this style appear in the output file? Only
+// if it's both shown and exportable.
+//-----------------------------------------------------------------------------
+bool Style::Exportable(int si) {
+ hStyle hs = { (uint32_t)si };
+ Style *s = Get(hs);
+ return (s->exportable) && (s->visible);
+}
+
+//-----------------------------------------------------------------------------
+// Return the appropriate style for our entity. If the entity has a style
+// explicitly assigned, then it's that style. Otherwise it's the appropriate
+// default style.
+//-----------------------------------------------------------------------------
+hStyle Style::ForEntity(hEntity he) {
+ Entity *e = SK.GetEntity(he);
+ // If the entity has a special style, use that. If that style doesn't
+ // exist yet, then it will get created automatically later.
+ if(e->style.v != 0) {
+ return e->style;
+ }
+
+ // Otherwise, we use the default rules.
+ hStyle hs;
+ if(e->group.v != SS.GW.activeGroup.v) {
+ hs.v = INACTIVE_GRP;
+ } else if(e->construction) {
+ hs.v = CONSTRUCTION;
+ } else {
+ hs.v = ACTIVE_GRP;
+ }
+ return hs;
+}
+
+int Style::PatternType(hStyle hs) {
+ Style *s = Get(hs);
+ return s->stippleType;
+}
+
+double Style::StippleScaleMm(hStyle hs) {
+ Style *s = Get(hs);
+ if(s->widthAs == UNITS_AS_MM) {
+ return s->stippleScale;
+ } else if(s->widthAs == UNITS_AS_PIXELS) {
+ return s->stippleScale / SS.GW.scale;
+ }
+ return 1.0;
+}
+
+std::string Style::DescriptionString(void) {
+ if(name.empty()) {
+ return ssprintf("s%03x-(unnamed)", h.v);
+ } else {
+ return ssprintf("s%03x-%s", h.v, name.c_str());
+ }
+}
+
+
+void TextWindow::ScreenShowListOfStyles(int link, uint32_t v) {
+ SS.TW.GoToScreen(SCREEN_LIST_OF_STYLES);
+}
+void TextWindow::ScreenShowStyleInfo(int link, uint32_t v) {
+ SS.TW.GoToScreen(SCREEN_STYLE_INFO);
+ SS.TW.shown.style.v = v;
+}
+
+void TextWindow::ScreenLoadFactoryDefaultStyles(int link, uint32_t v) {
+ Style::LoadFactoryDefaults();
+ SS.TW.GoToScreen(SCREEN_LIST_OF_STYLES);
+}
+
+void TextWindow::ScreenCreateCustomStyle(int link, uint32_t v) {
+ Style::CreateCustomStyle();
+}
+
+void TextWindow::ScreenChangeBackgroundColor(int link, uint32_t v) {
+ RgbaColor rgb = SS.backgroundColor;
+ SS.TW.ShowEditControlWithColorPicker(3, rgb);
+ SS.TW.edit.meaning = EDIT_BACKGROUND_COLOR;
+}
+
+static int RoundUpToPowerOfTwo(int v)
+{
+ int i;
+ for(i = 0; i < 31; i++) {
+ int vt = (1 << i);
+ if(vt >= v) {
+ return vt;
+ }
+ }
+ return 0;
+}
+
+void TextWindow::ScreenBackgroundImage(int link, uint32_t v) {
+ if(SS.bgImage.fromFile) MemFree(SS.bgImage.fromFile);
+ SS.bgImage.fromFile = NULL;
+
+ if(link == 'l') {
+ FILE *f = NULL;
+ png_struct *png_ptr = NULL;
+ png_info *info_ptr = NULL;
+
+ std::string importFile;
+ if(!GetOpenFile(&importFile, "", PngFileFilter)) goto err;
+ f = ssfopen(importFile, "rb");
+ if(!f) goto err;
+
+ uint8_t header[8];
+ if (fread(header, 1, 8, f) != 8)
+ goto err;
+ if(png_sig_cmp(header, 0, 8)) goto err;
+
+ png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING,
+ NULL, NULL, NULL);
+ if(!png_ptr) goto err;
+
+ info_ptr = png_create_info_struct(png_ptr);
+ if(!info_ptr) goto err;
+
+ if(setjmp(png_jmpbuf(png_ptr))) goto err;
+
+ png_init_io(png_ptr, f);
+ png_set_sig_bytes(png_ptr, 8);
+
+ png_read_png(png_ptr, info_ptr,
+ PNG_TRANSFORM_EXPAND | PNG_TRANSFORM_STRIP_ALPHA, NULL);
+
+ int w; w = (int)png_get_image_width(png_ptr, info_ptr);
+ int h; h = (int)png_get_image_height(png_ptr, info_ptr);
+ uint8_t **rows; rows = png_get_rows(png_ptr, info_ptr);
+
+ // Round to next-highest powers of two, since the textures require
+ // that. And round up to 4, to guarantee 32-bit alignment.
+ int rw; rw = max(4, RoundUpToPowerOfTwo(w));
+ int rh; rh = max(4, RoundUpToPowerOfTwo(h));
+
+ SS.bgImage.fromFile = (uint8_t *)MemAlloc(rw*rh*3);
+ {for(int i = 0; i < h; i++) {
+ memcpy(SS.bgImage.fromFile + ((h - 1) - i)*(rw*3), rows[i], w*3);
+ }}
+ SS.bgImage.w = w;
+ SS.bgImage.h = h;
+ SS.bgImage.rw = rw;
+ SS.bgImage.rh = rh;
+ SS.bgImage.scale = SS.GW.scale;
+ SS.bgImage.origin = SS.GW.offset.ScaledBy(-1);
+
+err:
+ if(png_ptr) png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
+ if(f) fclose(f);
+ }
+ SS.ScheduleShowTW();
+}
+
+void TextWindow::ScreenChangeBackgroundImageScale(int link, uint32_t v) {
+ SS.TW.edit.meaning = EDIT_BACKGROUND_IMG_SCALE;
+ SS.TW.ShowEditControl(10, ssprintf("%.3f", SS.bgImage.scale * SS.MmPerUnit()));
+}
+
+void TextWindow::ShowListOfStyles(void) {
+ Printf(true, "%Ft color style-name");
+
+ bool darkbg = false;
+ Style *s;
+ for(s = SK.style.First(); s; s = SK.style.NextAfter(s)) {
+ Printf(false, "%Bp %Bz %Bp %Fl%Ll%f%D%s%E",
+ darkbg ? 'd' : 'a',
+ &s->color,
+ darkbg ? 'd' : 'a',
+ ScreenShowStyleInfo, s->h.v,
+ s->DescriptionString().c_str());
+
+ darkbg = !darkbg;
+ }
+
+ Printf(true, " %Fl%Ll%fcreate a new custom style%E",
+ &ScreenCreateCustomStyle);
+
+ Printf(false, "");
+
+ RgbaColor rgb = SS.backgroundColor;
+ Printf(false, "%Ft background color (r, g, b)%E");
+ Printf(false, "%Ba %@, %@, %@ %Fl%D%f%Ll[change]%E",
+ rgb.redF(), rgb.greenF(), rgb.blueF(),
+ top[rows-1] + 2, &ScreenChangeBackgroundColor);
+
+ Printf(false, "");
+ Printf(false, "%Ft background bitmap image%E");
+ if(SS.bgImage.fromFile) {
+ Printf(false, "%Ba %Ftwidth:%E %dpx %Ftheight:%E %dpx",
+ SS.bgImage.w, SS.bgImage.h);
+
+ Printf(false, " %Ftscale:%E %# px/%s %Fl%Ll%f%D[change]%E",
+ SS.bgImage.scale*SS.MmPerUnit(),
+ SS.UnitName(),
+ &ScreenChangeBackgroundImageScale, top[rows-1] + 2);
+
+ Printf(false, "%Ba %Fl%Lc%fclear background image%E",
+ &ScreenBackgroundImage);
+ } else {
+ Printf(false, "%Ba none - %Fl%Ll%fload background image%E",
+ &ScreenBackgroundImage);
+ Printf(false, " (bottom left will be center of view)");
+ }
+
+ Printf(false, "");
+ Printf(false, " %Fl%Ll%fload factory defaults%E",
+ &ScreenLoadFactoryDefaultStyles);
+}
+
+
+void TextWindow::ScreenChangeStyleName(int link, uint32_t v) {
+ hStyle hs = { v };
+ Style *s = Style::Get(hs);
+ SS.TW.ShowEditControl(12, s->name);
+ SS.TW.edit.style = hs;
+ SS.TW.edit.meaning = EDIT_STYLE_NAME;
+}
+
+void TextWindow::ScreenDeleteStyle(int link, uint32_t v) {
+ SS.UndoRemember();
+ hStyle hs = { v };
+ Style *s = SK.style.FindByIdNoOops(hs);
+ if(s) {
+ SK.style.RemoveById(hs);
+ // And it will get recreated automatically if something is still using
+ // the style, so no need to do anything else.
+ }
+ SS.TW.GoToScreen(SCREEN_LIST_OF_STYLES);
+ InvalidateGraphics();
+}
+
+void TextWindow::ScreenChangeStylePatternType(int link, uint32_t v) {
+ hStyle hs = { v };
+ Style *s = Style::Get(hs);
+ s->stippleType = link - 1;
+}
+
+void TextWindow::ScreenChangeStyleMetric(int link, uint32_t v) {
+ hStyle hs = { v };
+ Style *s = Style::Get(hs);
+ double val;
+ int units, meaning, col;
+ switch(link) {
+ case 't':
+ val = s->textHeight;
+ units = s->textHeightAs;
+ col = 10;
+ meaning = EDIT_STYLE_TEXT_HEIGHT;
+ break;
+
+ case 's':
+ val = s->stippleScale;
+ units = s->widthAs;
+ col = 17;
+ meaning = EDIT_STYLE_STIPPLE_PERIOD;
+ break;
+
+ case 'w':
+ case 'W':
+ val = s->width;
+ units = s->widthAs;
+ col = 9;
+ meaning = EDIT_STYLE_WIDTH;
+ break;
+
+ default: oops();
+ }
+
+ std::string edit_value;
+ if(units == Style::UNITS_AS_PIXELS) {
+ edit_value = ssprintf("%.2f", val);
+ } else {
+ edit_value = SS.MmToString(val);
+ }
+ SS.TW.ShowEditControl(col, edit_value);
+ SS.TW.edit.style = hs;
+ SS.TW.edit.meaning = meaning;
+}
+
+void TextWindow::ScreenChangeStyleTextAngle(int link, uint32_t v) {
+ hStyle hs = { v };
+ Style *s = Style::Get(hs);
+ SS.TW.ShowEditControl(9, ssprintf("%.2f", s->textAngle));
+ SS.TW.edit.style = hs;
+ SS.TW.edit.meaning = EDIT_STYLE_TEXT_ANGLE;
+}
+
+void TextWindow::ScreenChangeStyleColor(int link, uint32_t v) {
+ hStyle hs = { v };
+ Style *s = Style::Get(hs);
+ // Same function used for stroke and fill colors
+ int em;
+ RgbaColor rgb;
+ if(link == 's') {
+ em = EDIT_STYLE_COLOR;
+ rgb = s->color;
+ } else if(link == 'f') {
+ em = EDIT_STYLE_FILL_COLOR;
+ rgb = s->fillColor;
+ } else {
+ oops();
+ }
+ SS.TW.ShowEditControlWithColorPicker(13, rgb);
+ SS.TW.edit.style = hs;
+ SS.TW.edit.meaning = em;
+}
+
+void TextWindow::ScreenChangeStyleYesNo(int link, uint32_t v) {
+ SS.UndoRemember();
+ hStyle hs = { v };
+ Style *s = Style::Get(hs);
+ switch(link) {
+ // Units for the width
+ case 'w':
+ if(s->widthAs != Style::UNITS_AS_MM) {
+ s->widthAs = Style::UNITS_AS_MM;
+ s->width /= SS.GW.scale;
+ s->stippleScale /= SS.GW.scale;
+ }
+ break;
+ case 'W':
+ if(s->widthAs != Style::UNITS_AS_PIXELS) {
+ s->widthAs = Style::UNITS_AS_PIXELS;
+ s->width *= SS.GW.scale;
+ s->stippleScale *= SS.GW.scale;
+ }
+ break;
+
+ // Units for the height
+ case 'g':
+ if(s->textHeightAs != Style::UNITS_AS_MM) {
+ s->textHeightAs = Style::UNITS_AS_MM;
+ s->textHeight /= SS.GW.scale;
+ }
+ break;
+
+ case 'G':
+ if(s->textHeightAs != Style::UNITS_AS_PIXELS) {
+ s->textHeightAs = Style::UNITS_AS_PIXELS;
+ s->textHeight *= SS.GW.scale;
+ }
+ break;
+
+ case 'e':
+ s->exportable = !(s->exportable);
+ break;
+
+ case 'v':
+ s->visible = !(s->visible);
+ break;
+
+ case 'f':
+ s->filled = !(s->filled);
+ break;
+
+ // Horizontal text alignment
+ case 'L':
+ s->textOrigin |= Style::ORIGIN_LEFT;
+ s->textOrigin &= ~Style::ORIGIN_RIGHT;
+ break;
+ case 'H':
+ s->textOrigin &= ~Style::ORIGIN_LEFT;
+ s->textOrigin &= ~Style::ORIGIN_RIGHT;
+ break;
+ case 'R':
+ s->textOrigin &= ~Style::ORIGIN_LEFT;
+ s->textOrigin |= Style::ORIGIN_RIGHT;
+ break;
+
+ // Vertical text alignment
+ case 'B':
+ s->textOrigin |= Style::ORIGIN_BOT;
+ s->textOrigin &= ~Style::ORIGIN_TOP;
+ break;
+ case 'V':
+ s->textOrigin &= ~Style::ORIGIN_BOT;
+ s->textOrigin &= ~Style::ORIGIN_TOP;
+ break;
+ case 'T':
+ s->textOrigin &= ~Style::ORIGIN_BOT;
+ s->textOrigin |= Style::ORIGIN_TOP;
+ break;
+ }
+ InvalidateGraphics();
+}
+
+bool TextWindow::EditControlDoneForStyles(const char *str) {
+ Style *s;
+ switch(edit.meaning) {
+ case EDIT_STYLE_STIPPLE_PERIOD:
+ case EDIT_STYLE_TEXT_HEIGHT:
+ case EDIT_STYLE_WIDTH: {
+ SS.UndoRemember();
+ s = Style::Get(edit.style);
+
+ double v;
+ int units = (edit.meaning == EDIT_STYLE_TEXT_HEIGHT) ?
+ s->textHeightAs : s->widthAs;
+ if(units == Style::UNITS_AS_MM) {
+ v = SS.StringToMm(str);
+ } else {
+ v = atof(str);
+ }
+ v = max(0.0, v);
+ if(edit.meaning == EDIT_STYLE_TEXT_HEIGHT) {
+ s->textHeight = v;
+ } else if(edit.meaning == EDIT_STYLE_STIPPLE_PERIOD) {
+ s->stippleScale = v;
+ } else {
+ s->width = v;
+ }
+ break;
+ }
+ case EDIT_STYLE_TEXT_ANGLE:
+ SS.UndoRemember();
+ s = Style::Get(edit.style);
+ s->textAngle = WRAP_SYMMETRIC(atof(str), 360);
+ break;
+
+ case EDIT_BACKGROUND_COLOR:
+ case EDIT_STYLE_FILL_COLOR:
+ case EDIT_STYLE_COLOR: {
+ Vector rgb;
+ if(sscanf(str, "%lf, %lf, %lf", &rgb.x, &rgb.y, &rgb.z)==3) {
+ rgb = rgb.ClampWithin(0, 1);
+ if(edit.meaning == EDIT_STYLE_COLOR) {
+ SS.UndoRemember();
+ s = Style::Get(edit.style);
+ s->color = RGBf(rgb.x, rgb.y, rgb.z);
+ } else if(edit.meaning == EDIT_STYLE_FILL_COLOR) {
+ SS.UndoRemember();
+ s = Style::Get(edit.style);
+ s->fillColor = RGBf(rgb.x, rgb.y, rgb.z);
+ } else {
+ SS.backgroundColor = RGBf(rgb.x, rgb.y, rgb.z);
+ }
+ } else {
+ Error("Bad format: specify color as r, g, b");
+ }
+ break;
+ }
+ case EDIT_STYLE_NAME:
+ if(!*str) {
+ Error("Style name cannot be empty");
+ } else {
+ SS.UndoRemember();
+ s = Style::Get(edit.style);
+ s->name = str;
+ }
+ break;
+
+ case EDIT_BACKGROUND_IMG_SCALE: {
+ Expr *e = Expr::From(str, true);
+ if(e) {
+ double ev = e->Eval();
+ if(ev < 0.001 || isnan(ev)) {
+ Error("Scale must not be zero or negative!");
+ } else {
+ SS.bgImage.scale = ev / SS.MmPerUnit();
+ }
+ }
+ break;
+ }
+ default: return false;
+ }
+ return true;
+}
+
+void TextWindow::ShowStyleInfo(void) {
+ Printf(true, "%Fl%f%Ll(back to list of styles)%E", &ScreenShowListOfStyles);
+
+ Style *s = Style::Get(shown.style);
+
+ if(s->h.v < Style::FIRST_CUSTOM) {
+ Printf(true, "%FtSTYLE %E%s ", s->DescriptionString().c_str());
+ } else {
+ Printf(true, "%FtSTYLE %E%s "
+ "[%Fl%Ll%D%frename%E/%Fl%Ll%D%fdel%E]",
+ s->DescriptionString().c_str(),
+ s->h.v, &ScreenChangeStyleName,
+ s->h.v, &ScreenDeleteStyle);
+ }
+ Printf(true, "%Ft line stroke style%E");
+ Printf(false, "%Ba %Ftcolor %E%Bz %Ba (%@, %@, %@) %D%f%Ls%Fl[change]%E",
+ &s->color,
+ s->color.redF(), s->color.greenF(), s->color.blueF(),
+ s->h.v, ScreenChangeStyleColor);
+
+ // The line width, and its units
+ if(s->widthAs == Style::UNITS_AS_PIXELS) {
+ Printf(false, " %Ftwidth%E %@ %D%f%Lp%Fl[change]%E",
+ s->width,
+ s->h.v, &ScreenChangeStyleMetric,
+ (s->h.v < Style::FIRST_CUSTOM) ? 'w' : 'W');
+ } else {
+ Printf(false, " %Ftwidth%E %s %D%f%Lp%Fl[change]%E",
+ SS.MmToString(s->width).c_str(),
+ s->h.v, &ScreenChangeStyleMetric,
+ (s->h.v < Style::FIRST_CUSTOM) ? 'w' : 'W');
+ }
+
+ if(s->h.v >= Style::FIRST_CUSTOM) {
+ if(s->widthAs == Style::UNITS_AS_PIXELS) {
+ Printf(false, "%Ba %Ftstipple width%E %@ %D%f%Lp%Fl[change]%E",
+ s->stippleScale,
+ s->h.v, &ScreenChangeStyleMetric, 's');
+ } else {
+ Printf(false, "%Ba %Ftstipple width%E %s %D%f%Lp%Fl[change]%E",
+ SS.MmToString(s->stippleScale).c_str(),
+ s->h.v, &ScreenChangeStyleMetric, 's');
+ }
+ }
+
+ bool widthpx = (s->widthAs == Style::UNITS_AS_PIXELS);
+ if(s->h.v < Style::FIRST_CUSTOM) {
+ Printf(false," %Ftin units of %Fdpixels%E");
+ } else {
+ Printf(false,"%Ba %Ftin units of %Fd"
+ "%D%f%LW%s pixels%E "
+ "%D%f%Lw%s %s",
+ s->h.v, &ScreenChangeStyleYesNo,
+ widthpx ? RADIO_TRUE : RADIO_FALSE,
+ s->h.v, &ScreenChangeStyleYesNo,
+ !widthpx ? RADIO_TRUE : RADIO_FALSE,
+ SS.UnitName());
+ }
+
+ Printf(false,"%Ba %Ftstipple type:%E");
+
+ const size_t patternCount = Style::LAST_STIPPLE + 1;
+ const char *patternsSource[patternCount] = {
+ "___________",
+ "- - - - - -",
+ "__ __ __ __",
+ "-.-.-.-.-.-",
+ "..-..-..-..",
+ "...........",
+ "~~~~~~~~~~~",
+ "__~__~__~__"
+ };
+ std::string patterns[patternCount];
+
+ for(int i = 0; i <= Style::LAST_STIPPLE; i++) {
+ const char *str = patternsSource[i];
+ do {
+ switch(*str) {
+ case ' ': patterns[i] += " "; break;
+ case '.': patterns[i] += "\xEE\x80\x84"; break;
+ case '_': patterns[i] += "\xEE\x80\x85"; break;
+ case '-': patterns[i] += "\xEE\x80\x86"; break;
+ case '~': patterns[i] += "\xEE\x80\x87"; break;
+ default: oops();
+ }
+ } while(*(++str));
+ }
+
+ for(int i = 0; i <= Style::LAST_STIPPLE; i++) {
+ const char *radio = s->stippleType == i ? RADIO_TRUE : RADIO_FALSE;
+ Printf(false, "%Bp %D%f%Lp%s %s%E",
+ (i % 2 == 0) ? 'd' : 'a',
+ s->h.v, &ScreenChangeStylePatternType,
+ i + 1, radio, patterns[i].c_str());
+ }
+
+ if(s->h.v >= Style::FIRST_CUSTOM) {
+ // The fill color, and whether contours are filled
+
+ Printf(false, "");
+ Printf(false, "%Ft contour fill style%E");
+ Printf(false,
+ "%Ba %Ftcolor %E%Bz %Ba (%@, %@, %@) %D%f%Lf%Fl[change]%E",
+ &s->fillColor,
+ s->fillColor.redF(), s->fillColor.greenF(), s->fillColor.blueF(),
+ s->h.v, ScreenChangeStyleColor);
+
+ Printf(false, "%Bd %D%f%Lf%s contours are filled%E",
+ s->h.v, &ScreenChangeStyleYesNo,
+ s->filled ? CHECK_TRUE : CHECK_FALSE);
+ }
+
+ // The text height, and its units
+ Printf(false, "");
+ Printf(false, "%Ft text style%E");
+
+ if(s->textHeightAs == Style::UNITS_AS_PIXELS) {
+ Printf(false, "%Ba %Ftheight %E%@ %D%f%Lt%Fl%s%E",
+ s->textHeight,
+ s->h.v, &ScreenChangeStyleMetric,
+ "[change]");
+ } else {
+ Printf(false, "%Ba %Ftheight %E%s %D%f%Lt%Fl%s%E",
+ SS.MmToString(s->textHeight).c_str(),
+ s->h.v, &ScreenChangeStyleMetric,
+ "[change]");
+ }
+
+ bool textHeightpx = (s->textHeightAs == Style::UNITS_AS_PIXELS);
+ if(s->h.v < Style::FIRST_CUSTOM) {
+ Printf(false,"%Bd %Ftin units of %Fdpixels");
+ } else {
+ Printf(false,"%Bd %Ftin units of %Fd"
+ "%D%f%LG%s pixels%E "
+ "%D%f%Lg%s %s",
+ s->h.v, &ScreenChangeStyleYesNo,
+ textHeightpx ? RADIO_TRUE : RADIO_FALSE,
+ s->h.v, &ScreenChangeStyleYesNo,
+ !textHeightpx ? RADIO_TRUE : RADIO_FALSE,
+ SS.UnitName());
+ }
+
+ if(s->h.v >= Style::FIRST_CUSTOM) {
+ Printf(false, "%Ba %Ftangle %E%@ %D%f%Ll%Fl[change]%E",
+ s->textAngle,
+ s->h.v, &ScreenChangeStyleTextAngle);
+
+ Printf(false, "");
+ Printf(false, "%Ft text comment alignment%E");
+ bool neither;
+ neither = !(s->textOrigin & (Style::ORIGIN_LEFT | Style::ORIGIN_RIGHT));
+ Printf(false, "%Ba "
+ "%D%f%LL%s left%E "
+ "%D%f%LH%s center%E "
+ "%D%f%LR%s right%E ",
+ s->h.v, &ScreenChangeStyleYesNo,
+ (s->textOrigin & Style::ORIGIN_LEFT) ? RADIO_TRUE : RADIO_FALSE,
+ s->h.v, &ScreenChangeStyleYesNo,
+ neither ? RADIO_TRUE : RADIO_FALSE,
+ s->h.v, &ScreenChangeStyleYesNo,
+ (s->textOrigin & Style::ORIGIN_RIGHT) ? RADIO_TRUE : RADIO_FALSE);
+
+ neither = !(s->textOrigin & (Style::ORIGIN_BOT | Style::ORIGIN_TOP));
+ Printf(false, "%Bd "
+ "%D%f%LB%s bottom%E "
+ "%D%f%LV%s center%E "
+ "%D%f%LT%s top%E ",
+ s->h.v, &ScreenChangeStyleYesNo,
+ (s->textOrigin & Style::ORIGIN_BOT) ? RADIO_TRUE : RADIO_FALSE,
+ s->h.v, &ScreenChangeStyleYesNo,
+ neither ? RADIO_TRUE : RADIO_FALSE,
+ s->h.v, &ScreenChangeStyleYesNo,
+ (s->textOrigin & Style::ORIGIN_TOP) ? RADIO_TRUE : RADIO_FALSE);
+ }
+
+ if(s->h.v >= Style::FIRST_CUSTOM) {
+ Printf(false, "");
+
+ Printf(false, " %Fd%D%f%Lv%s show these objects on screen%E",
+ s->h.v, &ScreenChangeStyleYesNo,
+ s->visible ? CHECK_TRUE : CHECK_FALSE);
+
+ Printf(false, " %Fd%D%f%Le%s export these objects%E",
+ s->h.v, &ScreenChangeStyleYesNo,
+ s->exportable ? CHECK_TRUE : CHECK_FALSE);
+
+ Printf(false, "");
+ Printf(false, "To assign lines or curves to this style,");
+ Printf(false, "right-click them on the drawing.");
+ }
+}
+
+void TextWindow::ScreenAssignSelectionToStyle(int link, uint32_t v) {
+ Style::AssignSelectionToStyle(v);
+}
+
--- /dev/null
+//-----------------------------------------------------------------------------
+// Once we've written our constraint equations in the symbolic algebra system,
+// these routines linearize them, and solve by a modified Newton's method.
+// This also contains the routines to detect non-convergence or inconsistency,
+// and report diagnostics to the user.
+//
+// Copyright 2008-2013 Jonathan Westhues.
+//-----------------------------------------------------------------------------
+#include "solvespace.h"
+
+// This tolerance is used to determine whether two (linearized) constraints
+// are linearly dependent. If this is too small, then we will attempt to
+// solve truly inconsistent systems and fail. But if it's too large, then
+// we will give up on legitimate systems like a skinny right angle triangle by
+// its hypotenuse and long side.
+const double System::RANK_MAG_TOLERANCE = 1e-4;
+
+// The solver will converge all unknowns to within this tolerance. This must
+// always be much less than LENGTH_EPS, and in practice should be much less.
+const double System::CONVERGE_TOLERANCE = (LENGTH_EPS/(1e2));
+
+bool System::WriteJacobian(int tag) {
+ int a, i, j;
+
+ j = 0;
+ for(a = 0; a < param.n; a++) {
+ if(j >= MAX_UNKNOWNS) return false;
+
+ Param *p = &(param.elem[a]);
+ if(p->tag != tag) continue;
+ mat.param[j] = p->h;
+ j++;
+ }
+ mat.n = j;
+
+ i = 0;
+ for(a = 0; a < eq.n; a++) {
+ if(i >= MAX_UNKNOWNS) return false;
+
+ Equation *e = &(eq.elem[a]);
+ if(e->tag != tag) continue;
+
+ mat.eq[i] = e->h;
+ Expr *f = e->e->DeepCopyWithParamsAsPointers(¶m, &(SK.param));
+ f = f->FoldConstants();
+
+ // Hash table (61 bits) to accelerate generation of zero partials.
+ uint64_t scoreboard = f->ParamsUsed();
+ for(j = 0; j < mat.n; j++) {
+ Expr *pd;
+ if(scoreboard & ((uint64_t)1 << (mat.param[j].v % 61)) &&
+ f->DependsOn(mat.param[j]))
+ {
+ pd = f->PartialWrt(mat.param[j]);
+ pd = pd->FoldConstants();
+ pd = pd->DeepCopyWithParamsAsPointers(¶m, &(SK.param));
+ } else {
+ pd = Expr::From(0.0);
+ }
+ mat.A.sym[i][j] = pd;
+ }
+ mat.B.sym[i] = f;
+ i++;
+ }
+ mat.m = i;
+
+ return true;
+}
+
+void System::EvalJacobian(void) {
+ int i, j;
+ for(i = 0; i < mat.m; i++) {
+ for(j = 0; j < mat.n; j++) {
+ mat.A.num[i][j] = (mat.A.sym[i][j])->Eval();
+ }
+ }
+}
+
+bool System::IsDragged(hParam p) {
+ hParam *pp;
+ for(pp = dragged.First(); pp; pp = dragged.NextAfter(pp)) {
+ if(p.v == pp->v) return true;
+ }
+ return false;
+}
+
+void System::SolveBySubstitution(void) {
+ int i;
+ for(i = 0; i < eq.n; i++) {
+ Equation *teq = &(eq.elem[i]);
+ Expr *tex = teq->e;
+
+ if(tex->op == Expr::MINUS &&
+ tex->a->op == Expr::PARAM &&
+ tex->b->op == Expr::PARAM)
+ {
+ hParam a = tex->a->parh;
+ hParam b = tex->b->parh;
+ if(!(param.FindByIdNoOops(a) && param.FindByIdNoOops(b))) {
+ // Don't substitute unless they're both solver params;
+ // otherwise it's an equation that can be solved immediately,
+ // or an error to flag later.
+ continue;
+ }
+
+ if(IsDragged(a)) {
+ // A is being dragged, so A should stay, and B should go
+ hParam t = a;
+ a = b;
+ b = t;
+ }
+
+ int j;
+ for(j = 0; j < eq.n; j++) {
+ Equation *req = &(eq.elem[j]);
+ (req->e)->Substitute(a, b); // A becomes B, B unchanged
+ }
+ for(j = 0; j < param.n; j++) {
+ Param *rp = &(param.elem[j]);
+ if(rp->substd.v == a.v) {
+ rp->substd = b;
+ }
+ }
+ Param *ptr = param.FindById(a);
+ ptr->tag = VAR_SUBSTITUTED;
+ ptr->substd = b;
+
+ teq->tag = EQ_SUBSTITUTED;
+ }
+ }
+}
+
+//-----------------------------------------------------------------------------
+// Calculate the rank of the Jacobian matrix, by Gram-Schimdt orthogonalization
+// in place. A row (~equation) is considered to be all zeros if its magnitude
+// is less than the tolerance RANK_MAG_TOLERANCE.
+//-----------------------------------------------------------------------------
+int System::CalculateRank(void) {
+ // Actually work with magnitudes squared, not the magnitudes
+ double rowMag[MAX_UNKNOWNS] = {};
+ double tol = RANK_MAG_TOLERANCE*RANK_MAG_TOLERANCE;
+
+ int i, iprev, j;
+ int rank = 0;
+
+ for(i = 0; i < mat.m; i++) {
+ // Subtract off this row's component in the direction of any
+ // previous rows
+ for(iprev = 0; iprev < i; iprev++) {
+ if(rowMag[iprev] <= tol) continue; // ignore zero rows
+
+ double dot = 0;
+ for(j = 0; j < mat.n; j++) {
+ dot += (mat.A.num[iprev][j]) * (mat.A.num[i][j]);
+ }
+ for(j = 0; j < mat.n; j++) {
+ mat.A.num[i][j] -= (dot/rowMag[iprev])*mat.A.num[iprev][j];
+ }
+ }
+ // Our row is now normal to all previous rows; calculate the
+ // magnitude of what's left
+ double mag = 0;
+ for(j = 0; j < mat.n; j++) {
+ mag += (mat.A.num[i][j]) * (mat.A.num[i][j]);
+ }
+ if(mag > tol) {
+ rank++;
+ }
+ rowMag[i] = mag;
+ }
+
+ return rank;
+}
+
+bool System::TestRank(void) {
+ EvalJacobian();
+ return CalculateRank() == mat.m;
+}
+
+bool System::SolveLinearSystem(double X[], double A[][MAX_UNKNOWNS],
+ double B[], int n)
+{
+ // Gaussian elimination, with partial pivoting. It's an error if the
+ // matrix is singular, because that means two constraints are
+ // equivalent.
+ int i, j, ip, jp, imax = 0;
+ double max, temp;
+
+ for(i = 0; i < n; i++) {
+ // We are trying eliminate the term in column i, for rows i+1 and
+ // greater. First, find a pivot (between rows i and N-1).
+ max = 0;
+ for(ip = i; ip < n; ip++) {
+ if(ffabs(A[ip][i]) > max) {
+ imax = ip;
+ max = ffabs(A[ip][i]);
+ }
+ }
+ // Don't give up on a singular matrix unless it's really bad; the
+ // assumption code is responsible for identifying that condition,
+ // so we're not responsible for reporting that error.
+ if(ffabs(max) < 1e-20) continue;
+
+ // Swap row imax with row i
+ for(jp = 0; jp < n; jp++) {
+ swap(A[i][jp], A[imax][jp]);
+ }
+ swap(B[i], B[imax]);
+
+ // For rows i+1 and greater, eliminate the term in column i.
+ for(ip = i+1; ip < n; ip++) {
+ temp = A[ip][i]/A[i][i];
+
+ for(jp = i; jp < n; jp++) {
+ A[ip][jp] -= temp*(A[i][jp]);
+ }
+ B[ip] -= temp*B[i];
+ }
+ }
+
+ // We've put the matrix in upper triangular form, so at this point we
+ // can solve by back-substitution.
+ for(i = n - 1; i >= 0; i--) {
+ if(ffabs(A[i][i]) < 1e-20) continue;
+
+ temp = B[i];
+ for(j = n - 1; j > i; j--) {
+ temp -= X[j]*A[i][j];
+ }
+ X[i] = temp / A[i][i];
+ }
+
+ return true;
+}
+
+bool System::SolveLeastSquares(void) {
+ int r, c, i;
+
+ // Scale the columns; this scale weights the parameters for the least
+ // squares solve, so that we can encourage the solver to make bigger
+ // changes in some parameters, and smaller in others.
+ for(c = 0; c < mat.n; c++) {
+ if(IsDragged(mat.param[c])) {
+ // It's least squares, so this parameter doesn't need to be all
+ // that big to get a large effect.
+ mat.scale[c] = 1/20.0;
+ } else {
+ mat.scale[c] = 1;
+ }
+ for(r = 0; r < mat.m; r++) {
+ mat.A.num[r][c] *= mat.scale[c];
+ }
+ }
+
+ // Write A*A'
+ for(r = 0; r < mat.m; r++) {
+ for(c = 0; c < mat.m; c++) { // yes, AAt is square
+ double sum = 0;
+ for(i = 0; i < mat.n; i++) {
+ sum += mat.A.num[r][i]*mat.A.num[c][i];
+ }
+ mat.AAt[r][c] = sum;
+ }
+ }
+
+ if(!SolveLinearSystem(mat.Z, mat.AAt, mat.B.num, mat.m)) return false;
+
+ // And multiply that by A' to get our solution.
+ for(c = 0; c < mat.n; c++) {
+ double sum = 0;
+ for(i = 0; i < mat.m; i++) {
+ sum += mat.A.num[i][c]*mat.Z[i];
+ }
+ mat.X[c] = sum * mat.scale[c];
+ }
+ return true;
+}
+
+bool System::NewtonSolve(int tag) {
+
+ int iter = 0;
+ bool converged = false;
+ int i;
+
+ // Evaluate the functions at our operating point.
+ for(i = 0; i < mat.m; i++) {
+ mat.B.num[i] = (mat.B.sym[i])->Eval();
+ }
+ do {
+ // And evaluate the Jacobian at our initial operating point.
+ EvalJacobian();
+
+ if(!SolveLeastSquares()) break;
+
+ // Take the Newton step;
+ // J(x_n) (x_{n+1} - x_n) = 0 - F(x_n)
+ for(i = 0; i < mat.n; i++) {
+ Param *p = param.FindById(mat.param[i]);
+ p->val -= mat.X[i];
+ if(isnan(p->val)) {
+ // Very bad, and clearly not convergent
+ return false;
+ }
+ }
+
+ // Re-evalute the functions, since the params have just changed.
+ for(i = 0; i < mat.m; i++) {
+ mat.B.num[i] = (mat.B.sym[i])->Eval();
+ }
+ // Check for convergence
+ converged = true;
+ for(i = 0; i < mat.m; i++) {
+ if(isnan(mat.B.num[i])) {
+ return false;
+ }
+ if(ffabs(mat.B.num[i]) > CONVERGE_TOLERANCE) {
+ converged = false;
+ break;
+ }
+ }
+ } while(iter++ < 50 && !converged);
+
+ return converged;
+}
+
+void System::WriteEquationsExceptFor(hConstraint hc, Group *g) {
+ int i;
+ // Generate all the equations from constraints in this group
+ for(i = 0; i < SK.constraint.n; i++) {
+ ConstraintBase *c = &(SK.constraint.elem[i]);
+ if(c->group.v != g->h.v) continue;
+ if(c->h.v == hc.v) continue;
+
+ if(c->HasLabel() && c->type != Constraint::COMMENT &&
+ g->allDimsReference)
+ {
+ // When all dimensions are reference, we adjust them to display
+ // the correct value, and then don't generate any equations.
+ c->ModifyToSatisfy();
+ continue;
+ }
+ if(g->relaxConstraints && c->type != Constraint::POINTS_COINCIDENT) {
+ // When the constraints are relaxed, we keep only the point-
+ // coincident constraints, and the constraints generated by
+ // the entities and groups.
+ continue;
+ }
+
+ c->Generate(&eq);
+ }
+ // And the equations from entities
+ for(i = 0; i < SK.entity.n; i++) {
+ EntityBase *e = &(SK.entity.elem[i]);
+ if(e->group.v != g->h.v) continue;
+
+ e->GenerateEquations(&eq);
+ }
+ // And from the groups themselves
+ g->GenerateEquations(&eq);
+}
+
+void System::FindWhichToRemoveToFixJacobian(Group *g, List<hConstraint> *bad) {
+ int a, i;
+
+ for(a = 0; a < 2; a++) {
+ for(i = 0; i < SK.constraint.n; i++) {
+ ConstraintBase *c = &(SK.constraint.elem[i]);
+ if(c->group.v != g->h.v) continue;
+ if((c->type == Constraint::POINTS_COINCIDENT && a == 0) ||
+ (c->type != Constraint::POINTS_COINCIDENT && a == 1))
+ {
+ // Do the constraints in two passes: first everything but
+ // the point-coincident constraints, then only those
+ // constraints (so they appear last in the list).
+ continue;
+ }
+
+ param.ClearTags();
+ eq.Clear();
+ WriteEquationsExceptFor(c->h, g);
+ eq.ClearTags();
+
+ // It's a major speedup to solve the easy ones by substitution here,
+ // and that doesn't break anything.
+ SolveBySubstitution();
+
+ WriteJacobian(0);
+ EvalJacobian();
+
+ int rank = CalculateRank();
+ if(rank == mat.m) {
+ // We fixed it by removing this constraint
+ bad->Add(&(c->h));
+ }
+ }
+ }
+}
+
+int System::Solve(Group *g, int *dof, List<hConstraint> *bad,
+ bool andFindBad, bool andFindFree)
+{
+ WriteEquationsExceptFor(Constraint::NO_CONSTRAINT, g);
+
+ int i;
+ bool rankOk;
+
+/*
+ dbp("%d equations", eq.n);
+ for(i = 0; i < eq.n; i++) {
+ dbp(" %.3f = %s = 0", eq.elem[i].e->Eval(), eq.elem[i].e->Print());
+ }
+ dbp("%d parameters", param.n);
+ for(i = 0; i < param.n; i++) {
+ dbp(" param %08x at %.3f", param.elem[i].h.v, param.elem[i].val);
+ } */
+
+ // All params and equations are assigned to group zero.
+ param.ClearTags();
+ eq.ClearTags();
+
+ SolveBySubstitution();
+
+ // Before solving the big system, see if we can find any equations that
+ // are soluble alone. This can be a huge speedup. We don't know whether
+ // the system is consistent yet, but if it isn't then we'll catch that
+ // later.
+ int alone = 1;
+ for(i = 0; i < eq.n; i++) {
+ Equation *e = &(eq.elem[i]);
+ if(e->tag != 0) continue;
+
+ hParam hp = e->e->ReferencedParams(¶m);
+ if(hp.v == Expr::NO_PARAMS.v) continue;
+ if(hp.v == Expr::MULTIPLE_PARAMS.v) continue;
+
+ Param *p = param.FindById(hp);
+ if(p->tag != 0) continue; // let rank test catch inconsistency
+
+ e->tag = alone;
+ p->tag = alone;
+ WriteJacobian(alone);
+ if(!NewtonSolve(alone)) {
+ // Failed to converge, bail out early
+ goto didnt_converge;
+ }
+ alone++;
+ }
+
+ // Now write the Jacobian for what's left, and do a rank test; that
+ // tells us if the system is inconsistently constrained.
+ if(!WriteJacobian(0)) {
+ return System::TOO_MANY_UNKNOWNS;
+ }
+
+ rankOk = TestRank();
+
+ // And do the leftovers as one big system
+ if(!NewtonSolve(0)) {
+ goto didnt_converge;
+ }
+
+ rankOk = TestRank();
+ if(!rankOk) {
+ if(!g->allowRedundant) {
+ if(andFindBad) FindWhichToRemoveToFixJacobian(g, bad);
+ }
+ } else {
+ // This is not the full Jacobian, but any substitutions or single-eq
+ // solves removed one equation and one unknown, therefore no effect
+ // on the number of DOF.
+ if(dof) *dof = mat.n - mat.m;
+
+ // If requested, find all the free (unbound) variables. This might be
+ // more than the number of degrees of freedom. Don't always do this,
+ // because the display would get annoying and it's slow.
+ for(i = 0; i < param.n; i++) {
+ Param *p = &(param.elem[i]);
+ p->free = false;
+
+ if(andFindFree) {
+ if(p->tag == 0) {
+ p->tag = VAR_DOF_TEST;
+ WriteJacobian(0);
+ EvalJacobian();
+ int rank = CalculateRank();
+ if(rank == mat.m) {
+ p->free = true;
+ }
+ p->tag = 0;
+ }
+ }
+ }
+ }
+ // System solved correctly, so write the new values back in to the
+ // main parameter table.
+ for(i = 0; i < param.n; i++) {
+ Param *p = &(param.elem[i]);
+ double val;
+ if(p->tag == VAR_SUBSTITUTED) {
+ val = param.FindById(p->substd)->val;
+ } else {
+ val = p->val;
+ }
+ Param *pp = SK.GetParam(p->h);
+ pp->val = val;
+ pp->known = true;
+ pp->free = p->free;
+ }
+ return rankOk ? System::SOLVED_OKAY : System::REDUNDANT_OKAY;
+
+didnt_converge:
+ SK.constraint.ClearTags();
+ for(i = 0; i < eq.n; i++) {
+ if(ffabs(mat.B.num[i]) > CONVERGE_TOLERANCE || isnan(mat.B.num[i])) {
+ // This constraint is unsatisfied.
+ if(!mat.eq[i].isFromConstraint()) continue;
+
+ hConstraint hc = mat.eq[i].constraint();
+ ConstraintBase *c = SK.constraint.FindByIdNoOops(hc);
+ if(!c) continue;
+ // Don't double-show constraints that generated multiple
+ // unsatisfied equations
+ if(!c->tag) {
+ bad->Add(&(c->h));
+ c->tag = 1;
+ }
+ }
+ }
+
+ return rankOk ? System::DIDNT_CONVERGE : System::REDUNDANT_DIDNT_CONVERGE;
+}
+
+void System::Clear(void) {
+ entity.Clear();
+ param.Clear();
+ eq.Clear();
+ dragged.Clear();
+}
--- /dev/null
+//-----------------------------------------------------------------------------
+// The text-based browser window, used to view the structure of the model by
+// groups and for other similar purposes.
+//
+// Copyright 2008-2013 Jonathan Westhues.
+//-----------------------------------------------------------------------------
+#include "solvespace.h"
+
+//-----------------------------------------------------------------------------
+// A navigation bar that always appears at the top of the window, with a
+// link to bring us back home.
+//-----------------------------------------------------------------------------
+void TextWindow::ScreenHome(int link, uint32_t v) {
+ SS.TW.GoToScreen(SCREEN_LIST_OF_GROUPS);
+}
+void TextWindow::ShowHeader(bool withNav) {
+ ClearScreen();
+
+ const char *header;
+ std::string desc;
+ if(SS.GW.LockedInWorkplane()) {
+ header = "in plane: ";
+ desc = SK.GetEntity(SS.GW.ActiveWorkplane())->DescriptionString();
+ } else {
+ header = "drawing / constraining in 3d";
+ desc = "";
+ }
+
+ // Navigation buttons
+ if(withNav) {
+ Printf(false, " %Fl%Lh%fhome%E %Ft%s%E%s",
+ (&TextWindow::ScreenHome), header, desc.c_str());
+ } else {
+ Printf(false, " %Ft%s%E%s", header, desc.c_str());
+ }
+
+ // Leave space for the icons that are painted here.
+ Printf(false, "");
+ Printf(false, "");
+}
+
+//-----------------------------------------------------------------------------
+// The screen that shows a list of every group in the sketch, with options
+// to hide or show them, and to view them in detail. This is our home page.
+//-----------------------------------------------------------------------------
+void TextWindow::ScreenSelectGroup(int link, uint32_t v) {
+ SS.TW.GoToScreen(SCREEN_GROUP_INFO);
+ SS.TW.shown.group.v = v;
+}
+void TextWindow::ScreenToggleGroupShown(int link, uint32_t v) {
+ hGroup hg = { v };
+ Group *g = SK.GetGroup(hg);
+ g->visible = !(g->visible);
+ // If a group was just shown, then it might not have been generated
+ // previously, so regenerate.
+ SS.GenerateAll();
+}
+void TextWindow::ScreenShowGroupsSpecial(int link, uint32_t v) {
+ bool state = link == 's';
+ for(int i = 0; i < SK.groupOrder.n; i++) {
+ Group *g = SK.GetGroup(SK.groupOrder.elem[i]);
+ g->visible = state;
+ }
+}
+void TextWindow::ScreenActivateGroup(int link, uint32_t v) {
+ SS.GW.activeGroup.v = v;
+ SK.GetGroup(SS.GW.activeGroup)->Activate();
+ SS.GW.ClearSuper();
+}
+void TextWindow::ReportHowGroupSolved(hGroup hg) {
+ SS.GW.ClearSuper();
+ SS.TW.GoToScreen(SCREEN_GROUP_SOLVE_INFO);
+ SS.TW.shown.group.v = hg.v;
+ SS.ScheduleShowTW();
+}
+void TextWindow::ScreenHowGroupSolved(int link, uint32_t v) {
+ if(SS.GW.activeGroup.v != v) {
+ ScreenActivateGroup(link, v);
+ }
+ SS.TW.GoToScreen(SCREEN_GROUP_SOLVE_INFO);
+ SS.TW.shown.group.v = v;
+}
+void TextWindow::ScreenShowConfiguration(int link, uint32_t v) {
+ SS.TW.GoToScreen(SCREEN_CONFIGURATION);
+}
+void TextWindow::ScreenShowEditView(int link, uint32_t v) {
+ SS.TW.GoToScreen(SCREEN_EDIT_VIEW);
+}
+void TextWindow::ScreenGoToWebsite(int link, uint32_t v) {
+ OpenWebsite("http://solvespace.com/txtlink");
+}
+void TextWindow::ShowListOfGroups(void) {
+ const char *radioTrue = " " RADIO_TRUE " ",
+ *radioFalse = " " RADIO_FALSE " ",
+ *checkTrue = " " CHECK_TRUE " ",
+ *checkFalse = " " CHECK_FALSE " ";
+
+ Printf(true, "%Ft active");
+ Printf(false, "%Ft shown ok group-name%E");
+ int i;
+ bool afterActive = false;
+ for(i = 0; i < SK.groupOrder.n; i++) {
+ Group *g = SK.GetGroup(SK.groupOrder.elem[i]);
+ std::string s = g->DescriptionString();
+ bool active = (g->h.v == SS.GW.activeGroup.v);
+ bool shown = g->visible;
+ bool ok = g->IsSolvedOkay();
+ bool ref = (g->h.v == Group::HGROUP_REFERENCES.v);
+ Printf(false, "%Bp%Fd "
+ "%Ft%s%Fb%D%f%Ll%s%E "
+ "%Fb%s%D%f%Ll%s%E "
+ "%Fp%D%f%s%Ll%s%E "
+ "%Fl%Ll%D%f%s",
+ // Alternate between light and dark backgrounds, for readability
+ (i & 1) ? 'd' : 'a',
+ // Link that activates the group
+ ref ? " " : "",
+ g->h.v, (&TextWindow::ScreenActivateGroup),
+ ref ? "" : (active ? radioTrue : radioFalse),
+ // Link that hides or shows the group
+ afterActive ? " - " : "",
+ g->h.v, (&TextWindow::ScreenToggleGroupShown),
+ afterActive ? "" : (shown ? checkTrue : checkFalse),
+ // Link to the errors, if a problem occured while solving
+ ok ? 's' : 'x', g->h.v, (&TextWindow::ScreenHowGroupSolved),
+ ok ? "ok" : "",
+ ok ? "" : "NO",
+ // Link to a screen that gives more details on the group
+ g->h.v, (&TextWindow::ScreenSelectGroup), s.c_str());
+
+ if(active) afterActive = true;
+ }
+
+ Printf(true, " %Fl%Ls%fshow all%E / %Fl%Lh%fhide all%E",
+ &(TextWindow::ScreenShowGroupsSpecial),
+ &(TextWindow::ScreenShowGroupsSpecial));
+ Printf(true, " %Fl%Ls%fline styles%E /"
+ " %Fl%Ls%fview%E /"
+ " %Fl%Ls%fconfiguration%E",
+ &(TextWindow::ScreenShowListOfStyles),
+ &(TextWindow::ScreenShowEditView),
+ &(TextWindow::ScreenShowConfiguration));
+}
+
+
+//-----------------------------------------------------------------------------
+// The screen that shows information about a specific group, and allows the
+// user to edit various things about it.
+//-----------------------------------------------------------------------------
+void TextWindow::ScreenHoverConstraint(int link, uint32_t v) {
+ if(!SS.GW.showConstraints) return;
+
+ hConstraint hc = { v };
+ Constraint *c = SK.GetConstraint(hc);
+ if(c->group.v != SS.GW.activeGroup.v) {
+ // Only constraints in the active group are visible
+ return;
+ }
+ SS.GW.hover.Clear();
+ SS.GW.hover.constraint = hc;
+ SS.GW.hover.emphasized = true;
+}
+void TextWindow::ScreenHoverRequest(int link, uint32_t v) {
+ SS.GW.hover.Clear();
+ hRequest hr = { v };
+ SS.GW.hover.entity = hr.entity(0);
+ SS.GW.hover.emphasized = true;
+}
+void TextWindow::ScreenSelectConstraint(int link, uint32_t v) {
+ SS.GW.ClearSelection();
+ GraphicsWindow::Selection sel = {};
+ sel.constraint.v = v;
+ SS.GW.selection.Add(&sel);
+}
+void TextWindow::ScreenSelectRequest(int link, uint32_t v) {
+ SS.GW.ClearSelection();
+ GraphicsWindow::Selection sel = {};
+ hRequest hr = { v };
+ sel.entity = hr.entity(0);
+ SS.GW.selection.Add(&sel);
+}
+
+void TextWindow::ScreenChangeGroupOption(int link, uint32_t v) {
+ SS.UndoRemember();
+ Group *g = SK.GetGroup(SS.TW.shown.group);
+
+ switch(link) {
+ case 's': g->subtype = Group::ONE_SIDED; break;
+ case 'S': g->subtype = Group::TWO_SIDED; break;
+
+ case 'k': g->skipFirst = true; break;
+ case 'K': g->skipFirst = false; break;
+
+ case 'c':
+ // When an extrude group is first created, it's positioned for a union
+ // extrusion. If no constraints were added, flip it when we switch between
+ // union and difference modes to avoid manual work doing the smae.
+ if(g->meshCombine != (int)v && g->GetNumConstraints() == 0 &&
+ (v == Group::COMBINE_AS_DIFFERENCE ||
+ g->meshCombine == Group::COMBINE_AS_DIFFERENCE)) {
+ g->ExtrusionForceVectorTo(g->ExtrusionGetVector().Negated());
+ }
+ g->meshCombine = v;
+ break;
+
+ case 'P': g->suppress = !(g->suppress); break;
+
+ case 'r': g->relaxConstraints = !(g->relaxConstraints); break;
+
+ case 'e': g->allowRedundant = !(g->allowRedundant); break;
+
+ case 'v': g->visible = !(g->visible); break;
+
+ case 'd': g->allDimsReference = !(g->allDimsReference); break;
+
+ case 'f': g->forceToMesh = !(g->forceToMesh); break;
+ }
+
+ SS.MarkGroupDirty(g->h);
+ SS.GenerateAll();
+ SS.GW.ClearSuper();
+}
+
+void TextWindow::ScreenColor(int link, uint32_t v) {
+ SS.UndoRemember();
+
+ Group *g = SK.GetGroup(SS.TW.shown.group);
+ SS.TW.ShowEditControlWithColorPicker(3, g->color);
+ SS.TW.edit.meaning = EDIT_GROUP_COLOR;
+}
+void TextWindow::ScreenOpacity(int link, uint32_t v) {
+ Group *g = SK.GetGroup(SS.TW.shown.group);
+
+ SS.TW.ShowEditControl(11, ssprintf("%.2f", g->color.alphaF()));
+ SS.TW.edit.meaning = EDIT_GROUP_OPACITY;
+ SS.TW.edit.group.v = g->h.v;
+}
+void TextWindow::ScreenChangeExprA(int link, uint32_t v) {
+ Group *g = SK.GetGroup(SS.TW.shown.group);
+
+ SS.TW.ShowEditControl(10, ssprintf("%d", (int)g->valA));
+ SS.TW.edit.meaning = EDIT_TIMES_REPEATED;
+ SS.TW.edit.group.v = v;
+}
+void TextWindow::ScreenChangeGroupName(int link, uint32_t v) {
+ Group *g = SK.GetGroup(SS.TW.shown.group);
+ SS.TW.ShowEditControl(12, g->DescriptionString().substr(5));
+ SS.TW.edit.meaning = EDIT_GROUP_NAME;
+ SS.TW.edit.group.v = v;
+}
+void TextWindow::ScreenChangeGroupScale(int link, uint32_t v) {
+ Group *g = SK.GetGroup(SS.TW.shown.group);
+
+ SS.TW.ShowEditControl(13, ssprintf("%.3f", g->scale));
+ SS.TW.edit.meaning = EDIT_GROUP_SCALE;
+ SS.TW.edit.group.v = v;
+}
+void TextWindow::ScreenDeleteGroup(int link, uint32_t v) {
+ SS.UndoRemember();
+
+ hGroup hg = SS.TW.shown.group;
+ if(hg.v == SS.GW.activeGroup.v) {
+ SS.GW.activeGroup = SK.GetGroup(SS.GW.activeGroup)->PreviousGroup()->h;
+ }
+
+ // Reset the text window, since we're displaying information about
+ // the group that's about to get deleted.
+ SS.TW.ClearSuper();
+
+ // This is a major change, so let's re-solve everything.
+ SK.group.RemoveById(hg);
+ SS.GenerateAll(SolveSpaceUI::GENERATE_ALL);
+
+ // Reset the graphics window. This will also recreate the default
+ // group if it was removed.
+ SS.GW.ClearSuper();
+}
+void TextWindow::ShowGroupInfo(void) {
+ Group *g = SK.GetGroup(shown.group);
+ const char *s = "???";
+
+ if(shown.group.v == Group::HGROUP_REFERENCES.v) {
+ Printf(true, "%FtGROUP %E%s", g->DescriptionString().c_str());
+ goto list_items;
+ } else {
+ Printf(true, "%FtGROUP %E%s [%Fl%Ll%D%frename%E/%Fl%Ll%D%fdel%E]",
+ g->DescriptionString().c_str(),
+ g->h.v, &TextWindow::ScreenChangeGroupName,
+ g->h.v, &TextWindow::ScreenDeleteGroup);
+ }
+
+ if(g->type == Group::LATHE) {
+ Printf(true, " %Ftlathe plane sketch");
+ } else if(g->type == Group::EXTRUDE || g->type == Group::ROTATE ||
+ g->type == Group::TRANSLATE)
+ {
+ if(g->type == Group::EXTRUDE) {
+ s = "extrude plane sketch";
+ } else if(g->type == Group::TRANSLATE) {
+ s = "translate original sketch";
+ } else if(g->type == Group::ROTATE) {
+ s = "rotate original sketch";
+ }
+ Printf(true, " %Ft%s%E", s);
+
+ bool one = (g->subtype == Group::ONE_SIDED);
+ Printf(false,
+ "%Ba %f%Ls%Fd%s one-sided%E "
+ "%f%LS%Fd%s two-sided%E",
+ &TextWindow::ScreenChangeGroupOption,
+ one ? RADIO_TRUE : RADIO_FALSE,
+ &TextWindow::ScreenChangeGroupOption,
+ !one ? RADIO_TRUE : RADIO_FALSE);
+
+ if(g->type == Group::ROTATE || g->type == Group::TRANSLATE) {
+ if(g->subtype == Group::ONE_SIDED) {
+ bool skip = g->skipFirst;
+ Printf(false,
+ "%Bd %Ftstart %f%LK%Fd%s with original%E "
+ "%f%Lk%Fd%s with copy #1%E",
+ &ScreenChangeGroupOption,
+ !skip ? RADIO_TRUE : RADIO_FALSE,
+ &ScreenChangeGroupOption,
+ skip ? RADIO_TRUE : RADIO_FALSE);
+ }
+
+ int times = (int)(g->valA);
+ Printf(false, "%Bp %Ftrepeat%E %d time%s %Fl%Ll%D%f[change]%E",
+ (g->subtype == Group::ONE_SIDED) ? 'a' : 'd',
+ times, times == 1 ? "" : "s",
+ g->h.v, &TextWindow::ScreenChangeExprA);
+ }
+ } else if(g->type == Group::LINKED) {
+ Printf(true, " %Ftlink geometry from file%E");
+ Printf(false, "%Ba '%s'", g->linkFileRel.c_str());
+ Printf(false, "%Bd %Ftscaled by%E %# %Fl%Ll%f%D[change]%E",
+ g->scale,
+ &TextWindow::ScreenChangeGroupScale, g->h.v);
+ } else if(g->type == Group::DRAWING_3D) {
+ Printf(true, " %Ftsketch in 3d%E");
+ } else if(g->type == Group::DRAWING_WORKPLANE) {
+ Printf(true, " %Ftsketch in new workplane%E");
+ } else {
+ Printf(true, "???");
+ }
+ Printf(false, "");
+
+ if(g->type == Group::EXTRUDE ||
+ g->type == Group::LATHE ||
+ g->type == Group::LINKED)
+ {
+ bool un = (g->meshCombine == Group::COMBINE_AS_UNION);
+ bool diff = (g->meshCombine == Group::COMBINE_AS_DIFFERENCE);
+ bool asy = (g->meshCombine == Group::COMBINE_AS_ASSEMBLE);
+ bool asa = (g->type == Group::LINKED);
+
+ Printf(false, " %Ftsolid model as");
+ Printf(false, "%Ba %f%D%Lc%Fd%s union%E "
+ "%f%D%Lc%Fd%s difference%E "
+ "%f%D%Lc%Fd%s%s%E ",
+ &TextWindow::ScreenChangeGroupOption,
+ Group::COMBINE_AS_UNION,
+ un ? RADIO_TRUE : RADIO_FALSE,
+ &TextWindow::ScreenChangeGroupOption,
+ Group::COMBINE_AS_DIFFERENCE,
+ diff ? RADIO_TRUE : RADIO_FALSE,
+ &TextWindow::ScreenChangeGroupOption,
+ Group::COMBINE_AS_ASSEMBLE,
+ asa ? (asy ? RADIO_TRUE : RADIO_FALSE) : " ",
+ asa ? " assemble" : "");
+
+ if(g->type == Group::EXTRUDE ||
+ g->type == Group::LATHE)
+ {
+ Printf(false,
+ "%Bd %Ftcolor %E%Bz %Bd (%@, %@, %@) %f%D%Lf%Fl[change]%E",
+ &g->color,
+ g->color.redF(), g->color.greenF(), g->color.blueF(),
+ ScreenColor, top[rows-1] + 2);
+ Printf(false, "%Bd %Ftopacity%E %@ %f%Lf%Fl[change]%E",
+ g->color.alphaF(),
+ &TextWindow::ScreenOpacity);
+ } else if(g->type == Group::LINKED) {
+ Printf(false, " %Fd%f%LP%s suppress this group's solid model",
+ &TextWindow::ScreenChangeGroupOption,
+ g->suppress ? CHECK_TRUE : CHECK_FALSE);
+ }
+
+ Printf(false, "");
+ }
+
+ Printf(false, " %f%Lv%Fd%s show entities from this group",
+ &TextWindow::ScreenChangeGroupOption,
+ g->visible ? CHECK_TRUE : CHECK_FALSE);
+
+ Group *pg; pg = g->PreviousGroup();
+ if(pg && pg->runningMesh.IsEmpty() && g->thisMesh.IsEmpty()) {
+ Printf(false, " %f%Lf%Fd%s force NURBS surfaces to triangle mesh",
+ &TextWindow::ScreenChangeGroupOption,
+ g->forceToMesh ? CHECK_TRUE : CHECK_FALSE);
+ } else {
+ Printf(false, " (model already forced to triangle mesh)");
+ }
+
+ Printf(true, " %f%Lr%Fd%s relax constraints and dimensions",
+ &TextWindow::ScreenChangeGroupOption,
+ g->relaxConstraints ? CHECK_TRUE : CHECK_FALSE);
+
+ Printf(false, " %f%Le%Fd%s allow redundant constraints",
+ &TextWindow::ScreenChangeGroupOption,
+ g->allowRedundant ? CHECK_TRUE : CHECK_FALSE);
+
+ Printf(false, " %f%Ld%Fd%s treat all dimensions as reference",
+ &TextWindow::ScreenChangeGroupOption,
+ g->allDimsReference ? CHECK_TRUE : CHECK_FALSE);
+
+ if(g->booleanFailed) {
+ Printf(false, "");
+ Printf(false, "The Boolean operation failed. It may be ");
+ Printf(false, "possible to fix the problem by choosing ");
+ Printf(false, "'force NURBS surfaces to triangle mesh'.");
+ }
+
+list_items:
+ Printf(false, "");
+ Printf(false, "%Ft requests in group");
+
+ int i, a = 0;
+ for(i = 0; i < SK.request.n; i++) {
+ Request *r = &(SK.request.elem[i]);
+
+ if(r->group.v == shown.group.v) {
+ std::string s = r->DescriptionString();
+ Printf(false, "%Bp %Fl%Ll%D%f%h%s%E",
+ (a & 1) ? 'd' : 'a',
+ r->h.v, (&TextWindow::ScreenSelectRequest),
+ &(TextWindow::ScreenHoverRequest), s.c_str());
+ a++;
+ }
+ }
+ if(a == 0) Printf(false, "%Ba (none)");
+
+ a = 0;
+ Printf(false, "");
+ Printf(false, "%Ft constraints in group (%d DOF)", g->solved.dof);
+ for(i = 0; i < SK.constraint.n; i++) {
+ Constraint *c = &(SK.constraint.elem[i]);
+
+ if(c->group.v == shown.group.v) {
+ std::string s = c->DescriptionString();
+ Printf(false, "%Bp %Fl%Ll%D%f%h%s%E %s",
+ (a & 1) ? 'd' : 'a',
+ c->h.v, (&TextWindow::ScreenSelectConstraint),
+ (&TextWindow::ScreenHoverConstraint), s.c_str(),
+ c->reference ? "(ref)" : "");
+ a++;
+ }
+ }
+ if(a == 0) Printf(false, "%Ba (none)");
+}
+
+//-----------------------------------------------------------------------------
+// The screen that's displayed when the sketch fails to solve. A report of
+// what failed, and (if the problem is a singular Jacobian) a list of
+// constraints that could be removed to fix it.
+//-----------------------------------------------------------------------------
+void TextWindow::ScreenAllowRedundant(int link, uint32_t v) {
+ SS.UndoRemember();
+
+ Group *g = SK.GetGroup(SS.TW.shown.group);
+ g->allowRedundant = true;
+ SS.GenerateAll();
+
+ SS.TW.shown.screen = SCREEN_GROUP_INFO;
+ SS.TW.Show();
+}
+void TextWindow::ShowGroupSolveInfo(void) {
+ Group *g = SK.GetGroup(shown.group);
+ if(g->IsSolvedOkay()) {
+ // Go back to the default group info screen
+ shown.screen = SCREEN_GROUP_INFO;
+ Show();
+ return;
+ }
+
+ Printf(true, "%FtGROUP %E%s", g->DescriptionString().c_str());
+ switch(g->solved.how) {
+ case System::DIDNT_CONVERGE:
+ Printf(true, "%FxSOLVE FAILED!%Fd unsolvable constraints");
+ Printf(true, "the following constraints are incompatible");
+ break;
+
+ case System::REDUNDANT_DIDNT_CONVERGE:
+ Printf(true, "%FxSOLVE FAILED!%Fd unsolvable constraints");
+ Printf(true, "the following constraints are unsatisfied");
+ break;
+
+ case System::REDUNDANT_OKAY:
+ Printf(true, "%FxSOLVE FAILED!%Fd redundant constraints");
+ Printf(true, "remove any one of these to fix it");
+ break;
+
+ case System::TOO_MANY_UNKNOWNS:
+ Printf(true, "Too many unknowns in a single group!");
+ return;
+ }
+
+ for(int i = 0; i < g->solved.remove.n; i++) {
+ hConstraint hc = g->solved.remove.elem[i];
+ Constraint *c = SK.constraint.FindByIdNoOops(hc);
+ if(!c) continue;
+
+ Printf(false, "%Bp %Fl%Ll%D%f%h%s%E",
+ (i & 1) ? 'd' : 'a',
+ c->h.v, (&TextWindow::ScreenSelectConstraint),
+ (&TextWindow::ScreenHoverConstraint),
+ c->DescriptionString().c_str());
+ }
+
+ Printf(true, "It may be possible to fix the problem ");
+ Printf(false, "by selecting Edit -> Undo.");
+
+ if(g->solved.how == System::REDUNDANT_OKAY) {
+ Printf(true, "It is possible to suppress this error ");
+ Printf(false, "by %Fl%f%Llallowing redundant constraints%E in ",
+ &TextWindow::ScreenAllowRedundant);
+ Printf(false, "this group.");
+ }
+}
+
+//-----------------------------------------------------------------------------
+// When we're stepping a dimension. User specifies the finish value, and
+// how many steps to take in between current and finish, re-solving each
+// time.
+//-----------------------------------------------------------------------------
+void TextWindow::ScreenStepDimFinish(int link, uint32_t v) {
+ SS.TW.edit.meaning = EDIT_STEP_DIM_FINISH;
+ std::string edit_value;
+ if(SS.TW.shown.dimIsDistance) {
+ edit_value = SS.MmToString(SS.TW.shown.dimFinish);
+ } else {
+ edit_value = ssprintf("%.3f", SS.TW.shown.dimFinish);
+ }
+ SS.TW.ShowEditControl(12, edit_value);
+}
+void TextWindow::ScreenStepDimSteps(int link, uint32_t v) {
+ SS.TW.edit.meaning = EDIT_STEP_DIM_STEPS;
+ SS.TW.ShowEditControl(12, ssprintf("%d", SS.TW.shown.dimSteps));
+}
+void TextWindow::ScreenStepDimGo(int link, uint32_t v) {
+ hConstraint hc = SS.TW.shown.constraint;
+ Constraint *c = SK.constraint.FindByIdNoOops(hc);
+ if(c) {
+ SS.UndoRemember();
+ double start = c->valA, finish = SS.TW.shown.dimFinish;
+ int i, n = SS.TW.shown.dimSteps;
+ for(i = 1; i <= n; i++) {
+ c = SK.GetConstraint(hc);
+ c->valA = start + ((finish - start)*i)/n;
+ SS.MarkGroupDirty(c->group);
+ SS.GenerateAll();
+ if(!SS.ActiveGroupsOkay()) {
+ // Failed to solve, so quit
+ break;
+ }
+ PaintGraphics();
+ }
+ }
+ InvalidateGraphics();
+ SS.TW.GoToScreen(SCREEN_LIST_OF_GROUPS);
+}
+void TextWindow::ShowStepDimension(void) {
+ Constraint *c = SK.constraint.FindByIdNoOops(shown.constraint);
+ if(!c) {
+ shown.screen = SCREEN_LIST_OF_GROUPS;
+ Show();
+ return;
+ }
+
+ Printf(true, "%FtSTEP DIMENSION%E %s", c->DescriptionString().c_str());
+
+ if(shown.dimIsDistance) {
+ Printf(true, "%Ba %Ftstart%E %s", SS.MmToString(c->valA).c_str());
+ Printf(false, "%Bd %Ftfinish%E %s %Fl%Ll%f[change]%E",
+ SS.MmToString(shown.dimFinish).c_str(), &ScreenStepDimFinish);
+ } else {
+ Printf(true, "%Ba %Ftstart%E %@", c->valA);
+ Printf(false, "%Bd %Ftfinish%E %@ %Fl%Ll%f[change]%E",
+ shown.dimFinish, &ScreenStepDimFinish);
+ }
+ Printf(false, "%Ba %Ftsteps%E %d %Fl%Ll%f%D[change]%E",
+ shown.dimSteps, &ScreenStepDimSteps);
+
+ Printf(true, " %Fl%Ll%fstep dimension now%E", &ScreenStepDimGo);
+
+ Printf(true, "(or %Fl%Ll%fcancel operation%E)", &ScreenHome);
+}
+
+//-----------------------------------------------------------------------------
+// When we're creating tangent arcs (as requests, not as some parametric
+// thing). User gets to specify the radius, and whether the old untrimmed
+// curves are kept or deleted.
+//-----------------------------------------------------------------------------
+void TextWindow::ScreenChangeTangentArc(int link, uint32_t v) {
+ switch(link) {
+ case 'r': {
+ SS.TW.edit.meaning = EDIT_TANGENT_ARC_RADIUS;
+ SS.TW.ShowEditControl(3, SS.MmToString(SS.tangentArcRadius));
+ break;
+ }
+
+ case 'a': SS.tangentArcManual = !SS.tangentArcManual; break;
+ case 'd': SS.tangentArcDeleteOld = !SS.tangentArcDeleteOld; break;
+ }
+}
+void TextWindow::ShowTangentArc(void) {
+ Printf(true, "%FtTANGENT ARC PARAMETERS%E");
+
+ Printf(true, "%Ft radius of created arc%E");
+ if(SS.tangentArcManual) {
+ Printf(false, "%Ba %s %Fl%Lr%f[change]%E",
+ SS.MmToString(SS.tangentArcRadius).c_str(),
+ &(TextWindow::ScreenChangeTangentArc));
+ } else {
+ Printf(false, "%Ba automatic");
+ }
+
+ Printf(false, "");
+ Printf(false, " %Fd%f%La%s choose radius automatically%E",
+ &ScreenChangeTangentArc,
+ !SS.tangentArcManual ? CHECK_TRUE : CHECK_FALSE);
+ Printf(false, " %Fd%f%Ld%s delete original entities afterward%E",
+ &ScreenChangeTangentArc,
+ SS.tangentArcDeleteOld ? CHECK_TRUE : CHECK_FALSE);
+
+ Printf(false, "");
+ Printf(false, "To create a tangent arc at a point,");
+ Printf(false, "select that point and then choose");
+ Printf(false, "Sketch -> Tangent Arc at Point.");
+ Printf(true, "(or %Fl%Ll%fback to home screen%E)", &ScreenHome);
+}
+
+//-----------------------------------------------------------------------------
+// The edit control is visible, and the user just pressed enter.
+//-----------------------------------------------------------------------------
+void TextWindow::EditControlDone(const char *s) {
+ edit.showAgain = false;
+
+ switch(edit.meaning) {
+ case EDIT_TIMES_REPEATED: {
+ Expr *e = Expr::From(s, true);
+ if(e) {
+ SS.UndoRemember();
+
+ double ev = e->Eval();
+ if((int)ev < 1) {
+ Error("Can't repeat fewer than 1 time.");
+ break;
+ }
+ if((int)ev > 999) {
+ Error("Can't repeat more than 999 times.");
+ break;
+ }
+
+ Group *g = SK.GetGroup(edit.group);
+ g->valA = ev;
+
+ if(g->type == Group::ROTATE) {
+ int i, c = 0;
+ for(i = 0; i < SK.constraint.n; i++) {
+ if(SK.constraint.elem[i].group.v == g->h.v) c++;
+ }
+ // If the group does not contain any constraints, then
+ // set the numerical guess to space the copies uniformly
+ // over one rotation. Don't touch the guess if we're
+ // already constrained, because that would break
+ // convergence.
+ if(c == 0) {
+ double copies = (g->skipFirst) ? (ev + 1) : ev;
+ SK.GetParam(g->h.param(3))->val = PI/(2*copies);
+ }
+ }
+
+ SS.MarkGroupDirty(g->h);
+ SS.ScheduleGenerateAll();
+ }
+ break;
+ }
+ case EDIT_GROUP_NAME: {
+ if(!*s) {
+ Error("Group name cannot be empty");
+ } else {
+ SS.UndoRemember();
+
+ Group *g = SK.GetGroup(edit.group);
+ g->name = s;
+ }
+ break;
+ }
+ case EDIT_GROUP_SCALE: {
+ Expr *e = Expr::From(s, true);
+ if(e) {
+ double ev = e->Eval();
+ if(fabs(ev) < 1e-6) {
+ Error("Scale cannot be zero.");
+ } else {
+ Group *g = SK.GetGroup(edit.group);
+ g->scale = ev;
+ SS.MarkGroupDirty(g->h);
+ SS.ScheduleGenerateAll();
+ }
+ }
+ break;
+ }
+ case EDIT_GROUP_COLOR: {
+ Vector rgb;
+ if(sscanf(s, "%lf, %lf, %lf", &rgb.x, &rgb.y, &rgb.z)==3) {
+ rgb = rgb.ClampWithin(0, 1);
+
+ Group *g = SK.group.FindByIdNoOops(SS.TW.shown.group);
+ if(!g) break;
+ g->color = RGBf(rgb.x, rgb.y, rgb.z);
+
+ SS.MarkGroupDirty(g->h);
+ SS.ScheduleGenerateAll();
+ SS.GW.ClearSuper();
+ } else {
+ Error("Bad format: specify color as r, g, b");
+ }
+ break;
+ }
+ case EDIT_GROUP_OPACITY: {
+ Expr *e = Expr::From(s, true);
+ if(e) {
+ double alpha = e->Eval();
+ if(alpha < 0 || alpha > 1) {
+ Error("Opacity must be between zero and one.");
+ } else {
+ Group *g = SK.GetGroup(edit.group);
+ g->color.alpha = (int)(255.1f * alpha);
+ SS.MarkGroupDirty(g->h);
+ SS.ScheduleGenerateAll();
+ SS.GW.ClearSuper();
+ }
+ }
+ break;
+ }
+ case EDIT_TTF_TEXT: {
+ SS.UndoRemember();
+ Request *r = SK.request.FindByIdNoOops(edit.request);
+ if(r) {
+ r->str = s;
+ SS.MarkGroupDirty(r->group);
+ SS.ScheduleGenerateAll();
+ }
+ break;
+ }
+ case EDIT_STEP_DIM_FINISH: {
+ Expr *e = Expr::From(s, true);
+ if(!e) {
+ break;
+ }
+ if(shown.dimIsDistance) {
+ shown.dimFinish = SS.ExprToMm(e);
+ } else {
+ shown.dimFinish = e->Eval();
+ }
+ break;
+ }
+ case EDIT_STEP_DIM_STEPS:
+ shown.dimSteps = min(300, max(1, atoi(s)));
+ break;
+
+ case EDIT_TANGENT_ARC_RADIUS: {
+ Expr *e = Expr::From(s, true);
+ if(!e) break;
+ if(e->Eval() < LENGTH_EPS) {
+ Error("Radius cannot be zero or negative.");
+ break;
+ }
+ SS.tangentArcRadius = SS.ExprToMm(e);
+ break;
+ }
+
+ default: {
+ int cnt = 0;
+ if(EditControlDoneForStyles(s)) cnt++;
+ if(EditControlDoneForConfiguration(s)) cnt++;
+ if(EditControlDoneForPaste(s)) cnt++;
+ if(EditControlDoneForView(s)) cnt++;
+ if(cnt > 1) {
+ // The identifiers were somehow assigned not uniquely?
+ oops();
+ }
+ break;
+ }
+ }
+ InvalidateGraphics();
+ SS.ScheduleShowTW();
+
+ if(!edit.showAgain) {
+ HideEditControl();
+ edit.meaning = EDIT_NOTHING;
+ }
+}
+
--- /dev/null
+//-----------------------------------------------------------------------------
+// Helper functions for the text-based browser window.
+//
+// Copyright 2008-2013 Jonathan Westhues.
+//-----------------------------------------------------------------------------
+#include "solvespace.h"
+#include "generated/icons.h"
+
+const TextWindow::Color TextWindow::fgColors[] = {
+ { 'd', RGBi(255, 255, 255) },
+ { 'l', RGBi(100, 100, 255) },
+ { 't', RGBi(255, 200, 0) },
+ { 'h', RGBi( 90, 90, 90) },
+ { 's', RGBi( 40, 255, 40) },
+ { 'm', RGBi(200, 200, 0) },
+ { 'r', RGBi( 0, 0, 0) },
+ { 'x', RGBi(255, 20, 20) },
+ { 'i', RGBi( 0, 255, 255) },
+ { 'g', RGBi(160, 160, 160) },
+ { 'b', RGBi(200, 200, 200) },
+ { 0, RGBi( 0, 0, 0) }
+};
+const TextWindow::Color TextWindow::bgColors[] = {
+ { 'd', RGBi( 0, 0, 0) },
+ { 't', RGBi( 34, 15, 15) },
+ { 'a', RGBi( 25, 25, 25) },
+ { 'r', RGBi(255, 255, 255) },
+ { 0, RGBi( 0, 0, 0) }
+};
+
+bool TextWindow::SPACER = false;
+TextWindow::HideShowIcon TextWindow::hideShowIcons[] = {
+ { &(SS.GW.showWorkplanes), Icon_workplane, "workplanes from inactive groups"},
+ { &(SS.GW.showNormals), Icon_normal, "normals" },
+ { &(SS.GW.showPoints), Icon_point, "points" },
+ { &(SS.GW.showConstraints), Icon_constraint, "constraints and dimensions" },
+ { &(SS.GW.showFaces), Icon_faces, "XXX - special cased" },
+ { &SPACER, 0, 0 },
+ { &(SS.GW.showShaded), Icon_shaded, "shaded view of solid model" },
+ { &(SS.GW.showEdges), Icon_edges, "edges of solid model" },
+ { &(SS.GW.showOutlines), Icon_outlines, "outline of solid model" },
+ { &(SS.GW.showMesh), Icon_mesh, "triangle mesh of solid model" },
+ { &SPACER, 0, 0 },
+ { &(SS.GW.showHdnLines), Icon_hidden_lines, "hidden lines" },
+ { 0, 0, 0 }
+};
+
+void TextWindow::MakeColorTable(const Color *in, float *out) {
+ int i;
+ for(i = 0; in[i].c != 0; i++) {
+ int c = in[i].c;
+ if(c < 0 || c > 255) oops();
+ out[c*3 + 0] = in[i].color.redF();
+ out[c*3 + 1] = in[i].color.greenF();
+ out[c*3 + 2] = in[i].color.blueF();
+ }
+}
+
+void TextWindow::Init(void) {
+ ClearSuper();
+}
+
+void TextWindow::ClearSuper(void) {
+ HideEditControl();
+
+ // Cannot use *this = {} here because TextWindow instances
+ // are 2.4MB long; this causes stack overflows in prologue
+ // when built with MSVC, even with optimizations.
+ memset(this, 0, sizeof(*this));
+
+ MakeColorTable(fgColors, fgColorTable);
+ MakeColorTable(bgColors, bgColorTable);
+
+ ClearScreen();
+ Show();
+}
+
+void TextWindow::HideEditControl(void) {
+ editControl.colorPicker.show = false;
+ HideTextEditControl();
+}
+
+void TextWindow::ShowEditControl(int col, const std::string &str, int halfRow) {
+ if(halfRow < 0) halfRow = top[hoveredRow];
+ editControl.halfRow = halfRow;
+ editControl.col = col;
+
+ int x = LEFT_MARGIN + CHAR_WIDTH*col;
+ int y = (halfRow - SS.TW.scrollPos)*(LINE_HEIGHT/2);
+
+ ShowTextEditControl(x, y + 18, str);
+}
+
+void TextWindow::ShowEditControlWithColorPicker(int col, RgbaColor rgb)
+{
+ SS.ScheduleShowTW();
+
+ editControl.colorPicker.show = true;
+ editControl.colorPicker.rgb = rgb;
+ editControl.colorPicker.h = 0;
+ editControl.colorPicker.s = 0;
+ editControl.colorPicker.v = 1;
+ ShowEditControl(col, ssprintf("%.2f, %.2f, %.2f", rgb.redF(), rgb.greenF(), rgb.blueF()));
+}
+
+void TextWindow::ClearScreen(void) {
+ int i, j;
+ for(i = 0; i < MAX_ROWS; i++) {
+ for(j = 0; j < MAX_COLS; j++) {
+ text[i][j] = ' ';
+ meta[i][j].fg = 'd';
+ meta[i][j].bg = 'd';
+ meta[i][j].link = NOT_A_LINK;
+ }
+ top[i] = i*2;
+ }
+ rows = 0;
+}
+
+void TextWindow::Printf(bool halfLine, const char *fmt, ...) {
+ va_list vl;
+ va_start(vl, fmt);
+
+ if(rows >= MAX_ROWS) return;
+
+ int r, c;
+ r = rows;
+ top[r] = (r == 0) ? 0 : (top[r-1] + (halfLine ? 3 : 2));
+ rows++;
+
+ for(c = 0; c < MAX_COLS; c++) {
+ text[r][c] = ' ';
+ meta[r][c].link = NOT_A_LINK;
+ }
+
+ char fg = 'd';
+ char bg = 'd';
+ RgbaColor bgRgb = RGBi(0, 0, 0);
+ int link = NOT_A_LINK;
+ uint32_t data = 0;
+ LinkFunction *f = NULL, *h = NULL;
+
+ c = 0;
+ while(*fmt) {
+ char buf[1024];
+
+ if(*fmt == '%') {
+ fmt++;
+ if(*fmt == '\0') goto done;
+ strcpy(buf, "");
+ switch(*fmt) {
+ case 'd': {
+ int v = va_arg(vl, int);
+ sprintf(buf, "%d", v);
+ break;
+ }
+ case 'x': {
+ unsigned int v = va_arg(vl, unsigned int);
+ sprintf(buf, "%08x", v);
+ break;
+ }
+ case '@': {
+ double v = va_arg(vl, double);
+ sprintf(buf, "%.2f", v);
+ break;
+ }
+ case '2': {
+ double v = va_arg(vl, double);
+ sprintf(buf, "%s%.2f", v < 0 ? "" : " ", v);
+ break;
+ }
+ case '3': {
+ double v = va_arg(vl, double);
+ sprintf(buf, "%s%.3f", v < 0 ? "" : " ", v);
+ break;
+ }
+ case '#': {
+ double v = va_arg(vl, double);
+ sprintf(buf, "%.3f", v);
+ break;
+ }
+ case 's': {
+ char *s = va_arg(vl, char *);
+ memcpy(buf, s, min(sizeof(buf), strlen(s)+1));
+ break;
+ }
+ case 'c': {
+ // 'char' is promoted to 'int' when passed through '...'
+ int v = va_arg(vl, int);
+ if(v == 0) {
+ strcpy(buf, "");
+ } else {
+ sprintf(buf, "%c", v);
+ }
+ break;
+ }
+ case 'E':
+ fg = 'd';
+ // leave the background, though
+ link = NOT_A_LINK;
+ data = 0;
+ f = NULL;
+ h = NULL;
+ break;
+
+ case 'F':
+ case 'B': {
+ char cc = fmt[1]; // color code
+ RgbaColor *rgbPtr = NULL;
+ switch(cc) {
+ case 0: goto done; // truncated directive
+ case 'p': cc = (char)va_arg(vl, int); break;
+ case 'z': rgbPtr = va_arg(vl, RgbaColor *); break;
+ }
+ if(*fmt == 'F') {
+ fg = cc;
+ } else {
+ bg = cc;
+ if(rgbPtr) bgRgb = *rgbPtr;
+ }
+ fmt++;
+ break;
+ }
+ case 'L':
+ if(fmt[1] == '\0') goto done;
+ fmt++;
+ if(*fmt == 'p') {
+ link = va_arg(vl, int);
+ } else {
+ link = *fmt;
+ }
+ break;
+
+ case 'f':
+ f = va_arg(vl, LinkFunction *);
+ break;
+
+ case 'h':
+ h = va_arg(vl, LinkFunction *);
+ break;
+
+ case 'D': {
+ unsigned int v = va_arg(vl, unsigned int);
+ data = (uint32_t)v;
+ break;
+ }
+ case '%':
+ strcpy(buf, "%");
+ break;
+ }
+ } else {
+ utf8_iterator it2(fmt), it1 = it2++;
+ strncpy(buf, fmt, it2 - it1);
+ buf[it2 - it1] = '\0';
+ }
+
+ for(utf8_iterator it(buf); *it; ++it) {
+ for(int i = 0; i < ssglBitmapCharWidth(*it); i++) {
+ if(c >= MAX_COLS) goto done;
+ text[r][c] = (i == 0) ? *it : ' ';
+ meta[r][c].fg = fg;
+ meta[r][c].bg = bg;
+ meta[r][c].bgRgb = bgRgb;
+ meta[r][c].link = link;
+ meta[r][c].data = data;
+ meta[r][c].f = f;
+ meta[r][c].h = h;
+ c++;
+ }
+ }
+
+ fmt++;
+ }
+ while(c < MAX_COLS) {
+ meta[r][c].fg = fg;
+ meta[r][c].bg = bg;
+ meta[r][c].bgRgb = bgRgb;
+ c++;
+ }
+
+done:
+ va_end(vl);
+}
+
+#define gs (SS.GW.gs)
+void TextWindow::Show(void) {
+ if(!(SS.GW.pending.operation)) SS.GW.ClearPending();
+
+ SS.GW.GroupSelection();
+
+ // Make sure these tests agree with test used to draw indicator line on
+ // main list of groups screen.
+ if(SS.GW.pending.description) {
+ // A pending operation (that must be completed with the mouse in
+ // the graphics window) will preempt our usual display.
+ HideEditControl();
+ ShowHeader(false);
+ Printf(false, "");
+ Printf(false, "%s", SS.GW.pending.description);
+ Printf(true, "%Fl%f%Ll(cancel operation)%E",
+ &TextWindow::ScreenUnselectAll);
+ } else if((gs.n > 0 || gs.constraints > 0) &&
+ shown.screen != SCREEN_PASTE_TRANSFORMED)
+ {
+ if(edit.meaning != EDIT_TTF_TEXT) HideEditControl();
+ ShowHeader(false);
+ DescribeSelection();
+ } else {
+ if(edit.meaning == EDIT_TTF_TEXT) HideEditControl();
+ ShowHeader(true);
+ switch(shown.screen) {
+ default:
+ shown.screen = SCREEN_LIST_OF_GROUPS;
+ // fall through
+ case SCREEN_LIST_OF_GROUPS: ShowListOfGroups(); break;
+ case SCREEN_GROUP_INFO: ShowGroupInfo(); break;
+ case SCREEN_GROUP_SOLVE_INFO: ShowGroupSolveInfo(); break;
+ case SCREEN_CONFIGURATION: ShowConfiguration(); break;
+ case SCREEN_STEP_DIMENSION: ShowStepDimension(); break;
+ case SCREEN_LIST_OF_STYLES: ShowListOfStyles(); break;
+ case SCREEN_STYLE_INFO: ShowStyleInfo(); break;
+ case SCREEN_PASTE_TRANSFORMED: ShowPasteTransformed(); break;
+ case SCREEN_EDIT_VIEW: ShowEditView(); break;
+ case SCREEN_TANGENT_ARC: ShowTangentArc(); break;
+ }
+ }
+ Printf(false, "");
+
+ // Make sure there's room for the color picker
+ if(editControl.colorPicker.show) {
+ int pickerHeight = 25;
+ int halfRow = editControl.halfRow;
+ if(top[rows-1] - halfRow < pickerHeight && rows < MAX_ROWS) {
+ rows++;
+ top[rows-1] = halfRow + pickerHeight;
+ }
+ }
+
+ InvalidateText();
+}
+
+void TextWindow::TimerCallback(void)
+{
+ tooltippedIcon = hoveredIcon;
+ InvalidateText();
+}
+
+void TextWindow::DrawOrHitTestIcons(int how, double mx, double my)
+{
+ int width, height;
+ GetTextWindowSize(&width, &height);
+
+ int x = 20, y = 33 + LINE_HEIGHT;
+ y -= scrollPos*(LINE_HEIGHT/2);
+
+ if(how == PAINT) {
+ double grey = 30.0/255;
+ double top = y - 28, bot = y + 4;
+ glColor4d(grey, grey, grey, 1.0);
+ ssglAxisAlignedQuad(0, width, top, bot);
+ }
+
+ HideShowIcon *oldHovered = hoveredIcon;
+ if(how != PAINT) {
+ hoveredIcon = NULL;
+ }
+
+ HideShowIcon *hsi;
+ for(hsi = &(hideShowIcons[0]); hsi->var; hsi++) {
+ if(hsi->var == &SPACER) {
+ // Draw a darker-grey spacer in between the groups of icons.
+ if(how == PAINT) {
+ int l = x, r = l + 4,
+ t = y, b = t - 24;
+ glColor4d(0.17, 0.17, 0.17, 1);
+ ssglAxisAlignedQuad(l, r, t, b);
+ }
+ x += 12;
+ continue;
+ }
+
+ if(how == PAINT) {
+ glPushMatrix();
+ glTranslated(x, y-24, 0);
+ // Only thing that matters about the color is the alpha,
+ // should be one for no transparency
+ glColor3d(0, 0, 0);
+ ssglDrawPixelsWithTexture(hsi->icon, 24, 24);
+ glPopMatrix();
+
+ if(hsi == hoveredIcon) {
+ glColor4d(1, 1, 0, 0.3);
+ ssglAxisAlignedQuad(x - 2, x + 26, y + 2, y - 26);
+ }
+ if(!*(hsi->var)) {
+ glColor4d(1, 0, 0, 0.6);
+ glLineWidth(2);
+ int s = 0, f = 24;
+ glBegin(GL_LINES);
+ glVertex2d(x+s, y-s);
+ glVertex2d(x+f, y-f);
+ glVertex2d(x+s, y-f);
+ glVertex2d(x+f, y-s);
+ glEnd();
+ }
+ } else {
+ if(mx > x - 2 && mx < x + 26 &&
+ my < y + 2 && my > y - 26)
+ {
+ // The mouse is hovered over this icon, so do the tooltip
+ // stuff.
+ if(hsi != tooltippedIcon) {
+ oldMousePos = Point2d::From(mx, my);
+ }
+ if(hsi != oldHovered || how == CLICK) {
+ SetTimerFor(1000);
+ }
+ hoveredIcon = hsi;
+ if(how == CLICK) {
+ SS.GW.ToggleBool(hsi->var);
+ }
+ }
+ }
+
+ x += 32;
+ }
+
+ if(how != PAINT && hoveredIcon != oldHovered) {
+ InvalidateText();
+ }
+
+ if(tooltippedIcon) {
+ if(how == PAINT) {
+ std::string str;
+
+ if(tooltippedIcon->icon == Icon_faces) {
+ if(SS.GW.showFaces) {
+ str = "Don't make faces selectable with mouse";
+ } else {
+ str = "Make faces selectable with mouse";
+ }
+ } else {
+ str = ssprintf("%s %s", *(tooltippedIcon->var) ? "Hide" : "Show",
+ tooltippedIcon->tip);
+ }
+
+ double ox = oldMousePos.x, oy = oldMousePos.y - LINE_HEIGHT;
+ ox += 3;
+ oy -= 3;
+ int tw = (str.length() + 1)*(CHAR_WIDTH - 1);
+ ox = min(ox, (double) (width - 25) - tw);
+ oy = max(oy, 5.0);
+
+ ssglInitializeBitmapFont();
+ glLineWidth(1);
+ glColor4d(1.0, 1.0, 0.6, 1.0);
+ ssglAxisAlignedQuad(ox, ox+tw, oy, oy+LINE_HEIGHT);
+ glColor4d(0.0, 0.0, 0.0, 1.0);
+ ssglAxisAlignedLineLoop(ox, ox+tw, oy, oy+LINE_HEIGHT);
+
+ glColor4d(0, 0, 0, 1);
+ ssglBitmapText(str, Vector::From(ox+5, oy-3+LINE_HEIGHT, 0));
+ } else {
+ if(!hoveredIcon ||
+ (hoveredIcon != tooltippedIcon))
+ {
+ tooltippedIcon = NULL;
+ InvalidateGraphics();
+ }
+ // And if we're hovered, then we've set a timer that will cause
+ // us to show the tool tip later.
+ }
+ }
+}
+
+//----------------------------------------------------------------------------
+// Given (x, y, z) = (h, s, v) in [0,6), [0,1], [0,1], return (x, y, z) =
+// (r, g, b) all in [0, 1].
+//----------------------------------------------------------------------------
+Vector TextWindow::HsvToRgb(Vector hsv) {
+ if(hsv.x >= 6) hsv.x -= 6;
+
+ Vector rgb;
+ double hmod2 = hsv.x;
+ while(hmod2 >= 2) hmod2 -= 2;
+ double x = (1 - fabs(hmod2 - 1));
+ if(hsv.x < 1) {
+ rgb = Vector::From(1, x, 0);
+ } else if(hsv.x < 2) {
+ rgb = Vector::From(x, 1, 0);
+ } else if(hsv.x < 3) {
+ rgb = Vector::From(0, 1, x);
+ } else if(hsv.x < 4) {
+ rgb = Vector::From(0, x, 1);
+ } else if(hsv.x < 5) {
+ rgb = Vector::From(x, 0, 1);
+ } else {
+ rgb = Vector::From(1, 0, x);
+ }
+ double c = hsv.y*hsv.z;
+ double m = 1 - hsv.z;
+ rgb = rgb.ScaledBy(c);
+ rgb = rgb.Plus(Vector::From(m, m, m));
+
+ return rgb;
+}
+
+uint8_t *TextWindow::HsvPattern2d(void) {
+ static uint8_t Texture[256*256*3];
+ static bool Init;
+
+ if(!Init) {
+ int i, j, p;
+ p = 0;
+ for(i = 0; i < 256; i++) {
+ for(j = 0; j < 256; j++) {
+ Vector hsv = Vector::From(6.0*i/255.0, 1.0*j/255.0, 1);
+ Vector rgb = HsvToRgb(hsv);
+ rgb = rgb.ScaledBy(255);
+ Texture[p++] = (uint8_t)rgb.x;
+ Texture[p++] = (uint8_t)rgb.y;
+ Texture[p++] = (uint8_t)rgb.z;
+ }
+ }
+ Init = true;
+ }
+ return Texture;
+}
+
+uint8_t *TextWindow::HsvPattern1d(double h, double s) {
+ static uint8_t Texture[256*4];
+
+ int i, p;
+ p = 0;
+ for(i = 0; i < 256; i++) {
+ Vector hsv = Vector::From(6*h, s, 1.0*(255 - i)/255.0);
+ Vector rgb = HsvToRgb(hsv);
+ rgb = rgb.ScaledBy(255);
+ Texture[p++] = (uint8_t)rgb.x;
+ Texture[p++] = (uint8_t)rgb.y;
+ Texture[p++] = (uint8_t)rgb.z;
+ // Needs a padding byte, to make things four-aligned
+ p++;
+ }
+ return Texture;
+}
+
+void TextWindow::ColorPickerDone(void) {
+ RgbaColor rgb = editControl.colorPicker.rgb;
+ EditControlDone(ssprintf("%.2f, %.2f, %.3f", rgb.redF(), rgb.greenF(), rgb.blueF()).c_str());
+}
+
+bool TextWindow::DrawOrHitTestColorPicker(int how, bool leftDown,
+ double x, double y)
+{
+ bool mousePointerAsHand = false;
+
+ if(how == HOVER && !leftDown) {
+ editControl.colorPicker.picker1dActive = false;
+ editControl.colorPicker.picker2dActive = false;
+ }
+
+ if(!editControl.colorPicker.show) return false;
+ if(how == CLICK || (how == HOVER && leftDown)) InvalidateText();
+
+ static const RgbaColor BaseColor[12] = {
+ RGBi(255, 0, 0),
+ RGBi( 0, 255, 0),
+ RGBi( 0, 0, 255),
+
+ RGBi( 0, 255, 255),
+ RGBi(255, 0, 255),
+ RGBi(255, 255, 0),
+
+ RGBi(255, 127, 0),
+ RGBi(255, 0, 127),
+ RGBi( 0, 255, 127),
+ RGBi(127, 255, 0),
+ RGBi(127, 0, 255),
+ RGBi( 0, 127, 255),
+ };
+
+ int width, height;
+ GetTextWindowSize(&width, &height);
+
+ int px = LEFT_MARGIN + CHAR_WIDTH*editControl.col;
+ int py = (editControl.halfRow - SS.TW.scrollPos)*(LINE_HEIGHT/2);
+
+ py += LINE_HEIGHT + 5;
+
+ static const int WIDTH = 16, HEIGHT = 12;
+ static const int PITCH = 18, SIZE = 15;
+
+ px = min(px, width - (WIDTH*PITCH + 40));
+
+ int pxm = px + WIDTH*PITCH + 11,
+ pym = py + HEIGHT*PITCH + 7;
+
+ int bw = 6;
+ if(how == PAINT) {
+ glColor4d(0.2, 0.2, 0.2, 1);
+ ssglAxisAlignedQuad(px, pxm+bw, py, pym+bw);
+ glColor4d(0.0, 0.0, 0.0, 1);
+ ssglAxisAlignedQuad(px+(bw/2), pxm+(bw/2), py+(bw/2), pym+(bw/2));
+ } else {
+ if(x < px || x > pxm+(bw/2) ||
+ y < py || y > pym+(bw/2))
+ {
+ return false;
+ }
+ }
+ px += (bw/2);
+ py += (bw/2);
+
+ int i, j;
+ for(i = 0; i < WIDTH/2; i++) {
+ for(j = 0; j < HEIGHT; j++) {
+ Vector rgb;
+ RgbaColor d;
+ if(i == 0 && j < 8) {
+ d = SS.modelColor[j];
+ rgb = Vector::From(d.redF(), d.greenF(), d.blueF());
+ } else if(i == 0) {
+ double a = (j - 8.0)/3.0;
+ rgb = Vector::From(a, a, a);
+ } else {
+ d = BaseColor[j];
+ rgb = Vector::From(d.redF(), d.greenF(), d.blueF());
+ if(i >= 2 && i <= 4) {
+ double a = (i == 2) ? 0.2 : (i == 3) ? 0.3 : 0.4;
+ rgb = rgb.Plus(Vector::From(a, a, a));
+ }
+ if(i >= 5 && i <= 7) {
+ double a = (i == 5) ? 0.7 : (i == 6) ? 0.4 : 0.18;
+ rgb = rgb.ScaledBy(a);
+ }
+ }
+
+ rgb = rgb.ClampWithin(0, 1);
+ int sx = px + 5 + PITCH*(i + 8) + 4, sy = py + 5 + PITCH*j;
+
+ if(how == PAINT) {
+ glColor4d(CO(rgb), 1);
+ ssglAxisAlignedQuad(sx, sx+SIZE, sy, sy+SIZE);
+ } else if(how == CLICK) {
+ if(x >= sx && x <= sx+SIZE && y >= sy && y <= sy+SIZE) {
+ editControl.colorPicker.rgb = RGBf(rgb.x, rgb.y, rgb.z);
+ ColorPickerDone();
+ }
+ } else if(how == HOVER) {
+ if(x >= sx && x <= sx+SIZE && y >= sy && y <= sy+SIZE) {
+ mousePointerAsHand = true;
+ }
+ }
+ }
+ }
+
+ int hxm, hym;
+ int hx = px + 5, hy = py + 5;
+ hxm = hx + PITCH*7 + SIZE;
+ hym = hy + PITCH*2 + SIZE;
+ if(how == PAINT) {
+ ssglColorRGB(editControl.colorPicker.rgb);
+ ssglAxisAlignedQuad(hx, hxm, hy, hym);
+ } else if(how == CLICK) {
+ if(x >= hx && x <= hxm && y >= hy && y <= hym) {
+ ColorPickerDone();
+ }
+ } else if(how == HOVER) {
+ if(x >= hx && x <= hxm && y >= hy && y <= hym) {
+ mousePointerAsHand = true;
+ }
+ }
+
+ hy += PITCH*3;
+
+ hxm = hx + PITCH*7 + SIZE;
+ hym = hy + PITCH*1 + SIZE;
+ // The one-dimensional thing to pick the color's value
+ if(how == PAINT) {
+ glBindTexture(GL_TEXTURE_2D, TEXTURE_COLOR_PICKER_1D);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
+ glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
+
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 1, 256, 0,
+ GL_RGB, GL_UNSIGNED_BYTE,
+ HsvPattern1d(editControl.colorPicker.h,
+ editControl.colorPicker.s));
+
+ glEnable(GL_TEXTURE_2D);
+ glBegin(GL_QUADS);
+ glTexCoord2d(0, 0);
+ glVertex2d(hx, hy);
+
+ glTexCoord2d(1, 0);
+ glVertex2d(hx, hym);
+
+ glTexCoord2d(1, 1);
+ glVertex2d(hxm, hym);
+
+ glTexCoord2d(0, 1);
+ glVertex2d(hxm, hy);
+ glEnd();
+ glDisable(GL_TEXTURE_2D);
+
+ double cx = hx+(hxm-hx)*(1 - editControl.colorPicker.v);
+ glColor4d(0, 0, 0, 1);
+ glLineWidth(1);
+ glBegin(GL_LINES);
+ glVertex2d(cx, hy);
+ glVertex2d(cx, hym);
+ glEnd();
+ } else if(how == CLICK ||
+ (how == HOVER && leftDown && editControl.colorPicker.picker1dActive))
+ {
+ if(x >= hx && x <= hxm && y >= hy && y <= hym) {
+ editControl.colorPicker.v = 1 - (x - hx)/(hxm - hx);
+
+ Vector rgb = HsvToRgb(Vector::From(
+ 6*editControl.colorPicker.h,
+ editControl.colorPicker.s,
+ editControl.colorPicker.v));
+ editControl.colorPicker.rgb = RGBf(rgb.x, rgb.y, rgb.z);
+
+ editControl.colorPicker.picker1dActive = true;
+ }
+ }
+ // and advance our vertical position
+ hy += PITCH*2;
+
+ hxm = hx + PITCH*7 + SIZE;
+ hym = hy + PITCH*6 + SIZE;
+ // Two-dimensional thing to pick a color by hue and saturation
+ if(how == PAINT) {
+ glBindTexture(GL_TEXTURE_2D, TEXTURE_COLOR_PICKER_2D);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
+ glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
+
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 256, 256, 0,
+ GL_RGB, GL_UNSIGNED_BYTE, HsvPattern2d());
+
+ glEnable(GL_TEXTURE_2D);
+ glBegin(GL_QUADS);
+ glTexCoord2d(0, 0);
+ glVertex2d(hx, hy);
+
+ glTexCoord2d(1, 0);
+ glVertex2d(hx, hym);
+
+ glTexCoord2d(1, 1);
+ glVertex2d(hxm, hym);
+
+ glTexCoord2d(0, 1);
+ glVertex2d(hxm, hy);
+ glEnd();
+ glDisable(GL_TEXTURE_2D);
+
+ glColor4d(1, 1, 1, 1);
+ glLineWidth(1);
+ double cx = hx+(hxm-hx)*editControl.colorPicker.h,
+ cy = hy+(hym-hy)*editControl.colorPicker.s;
+ glBegin(GL_LINES);
+ glVertex2d(cx - 5, cy);
+ glVertex2d(cx + 4, cy);
+ glVertex2d(cx, cy - 5);
+ glVertex2d(cx, cy + 4);
+ glEnd();
+ } else if(how == CLICK ||
+ (how == HOVER && leftDown && editControl.colorPicker.picker2dActive))
+ {
+ if(x >= hx && x <= hxm && y >= hy && y <= hym) {
+ double h = (x - hx)/(hxm - hx),
+ s = (y - hy)/(hym - hy);
+ editControl.colorPicker.h = h;
+ editControl.colorPicker.s = s;
+
+ Vector rgb = HsvToRgb(Vector::From(
+ 6*editControl.colorPicker.h,
+ editControl.colorPicker.s,
+ editControl.colorPicker.v));
+ editControl.colorPicker.rgb = RGBf(rgb.x, rgb.y, rgb.z);
+
+ editControl.colorPicker.picker2dActive = true;
+ }
+ }
+
+ SetMousePointerToHand(mousePointerAsHand);
+ return true;
+}
+
+void TextWindow::Paint(void) {
+ int width, height;
+ GetTextWindowSize(&width, &height);
+
+ // We would like things pixel-exact, to avoid shimmering.
+ glViewport(0, 0, width, height);
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ glClearColor(0, 0, 0, 1);
+ glClear(GL_COLOR_BUFFER_BIT);
+ glColor3d(1, 1, 1);
+
+ glTranslated(-1, 1, 0);
+ glScaled(2.0/width, -2.0/height, 1);
+ // Make things round consistently, avoiding exact integer boundary
+ glTranslated(-0.1, -0.1, 0);
+
+ halfRows = height / (LINE_HEIGHT/2);
+
+ int bottom = top[rows-1] + 2;
+ scrollPos = min(scrollPos, bottom - halfRows);
+ scrollPos = max(scrollPos, 0);
+
+ // Let's set up the scroll bar first
+ MoveTextScrollbarTo(scrollPos, top[rows - 1] + 1, halfRows);
+
+ // Create the bitmap font that we're going to use.
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ glEnable(GL_BLEND);
+
+ // Now paint the window.
+ int r, c, a;
+ for(a = 0; a < 2; a++) {
+ if(a == 0) {
+ glBegin(GL_QUADS);
+ } else if(a == 1) {
+ glEnable(GL_TEXTURE_2D);
+ ssglInitializeBitmapFont();
+ glBegin(GL_QUADS);
+ }
+
+ for(r = 0; r < rows; r++) {
+ int ltop = top[r];
+ if(ltop < (scrollPos-1)) continue;
+ if(ltop > scrollPos+halfRows) break;
+
+ for(c = 0; c < min((width/CHAR_WIDTH)+1, (int) MAX_COLS); c++) {
+ int x = LEFT_MARGIN + c*CHAR_WIDTH;
+ int y = (ltop-scrollPos)*(LINE_HEIGHT/2) + 4;
+
+ int fg = meta[r][c].fg;
+ int bg = meta[r][c].bg;
+ RgbaColor bgRgb = meta[r][c].bgRgb;
+
+ // On the first pass, all the background quads; on the next
+ // pass, all the foreground (i.e., font) quads.
+ if(a == 0) {
+ int bh = LINE_HEIGHT, adj = -2;
+ if(bg == 'z') {
+ glColor3f(bgRgb.redF(), bgRgb.greenF(), bgRgb.blueF());
+ bh = CHAR_HEIGHT;
+ adj += 2;
+ } else {
+ glColor3fv(&(bgColorTable[bg*3]));
+ }
+
+ if(bg != 'd') {
+ // Move the quad down a bit, so that the descenders
+ // still have the correct background.
+ y += adj;
+ ssglAxisAlignedQuad(x, x + CHAR_WIDTH, y, y + bh, false);
+ y -= adj;
+ }
+ } else if(a == 1) {
+ glColor3fv(&(fgColorTable[fg*3]));
+ ssglBitmapCharQuad(text[r][c], x, y + CHAR_HEIGHT);
+
+ // If this is a link and it's hovered, then draw the
+ // underline
+ if(meta[r][c].link && meta[r][c].link != 'n' &&
+ (r == hoveredRow && c == hoveredCol))
+ {
+ int cs = c, cf = c;
+ while(cs >= 0 && meta[r][cs].link &&
+ meta[r][cs].f == meta[r][c].f &&
+ meta[r][cs].data == meta[r][c].data)
+ {
+ cs--;
+ }
+ cs++;
+
+ while( meta[r][cf].link &&
+ meta[r][cf].f == meta[r][c].f &&
+ meta[r][cf].data == meta[r][c].data)
+ {
+ cf++;
+ }
+
+ // But don't underline checkboxes or radio buttons
+ while(((text[r][cs] >= 0xe000 && text[r][cs] <= 0xefff) ||
+ text[r][cs] == ' ') &&
+ cs < cf)
+ {
+ cs++;
+ }
+
+ glEnd();
+
+ // Always use the color of the rightmost character
+ // in the link, so that underline is consistent color
+ fg = meta[r][cf-1].fg;
+ glColor3fv(&(fgColorTable[fg*3]));
+ glDisable(GL_TEXTURE_2D);
+ glLineWidth(1);
+ glBegin(GL_LINES);
+ int yp = y + CHAR_HEIGHT;
+ glVertex2d(LEFT_MARGIN + cs*CHAR_WIDTH, yp);
+ glVertex2d(LEFT_MARGIN + cf*CHAR_WIDTH, yp);
+ glEnd();
+
+ glEnable(GL_TEXTURE_2D);
+ glBegin(GL_QUADS);
+ }
+ }
+ }
+ }
+
+ glEnd();
+ glDisable(GL_TEXTURE_2D);
+ }
+
+ // The line to indicate the column of radio buttons that indicates the
+ // active group.
+ SS.GW.GroupSelection();
+ // Make sure this test agrees with test to determine which screen is drawn
+ if(!SS.GW.pending.description && gs.n == 0 && gs.constraints == 0 &&
+ shown.screen == SCREEN_LIST_OF_GROUPS)
+ {
+ int x = 29, y = 70 + LINE_HEIGHT;
+ y -= scrollPos*(LINE_HEIGHT/2);
+
+ glLineWidth(1);
+ glColor3fv(&(fgColorTable['t'*3]));
+ glBegin(GL_LINES);
+ glVertex2d(x, y);
+ glVertex2d(x, y+40);
+ glEnd();
+ }
+
+ // The header has some icons that are drawn separately from the text
+ DrawOrHitTestIcons(PAINT, 0, 0);
+
+ // And we may show a color picker for certain editable fields
+ DrawOrHitTestColorPicker(PAINT, false, 0, 0);
+}
+
+void TextWindow::MouseEvent(bool leftClick, bool leftDown, double x, double y) {
+ if(TextEditControlIsVisible() || GraphicsEditControlIsVisible()) {
+ if(DrawOrHitTestColorPicker(leftClick ? CLICK : HOVER, leftDown, x, y))
+ {
+ return;
+ }
+
+ if(leftClick) {
+ HideEditControl();
+ HideGraphicsEditControl();
+ } else {
+ SetMousePointerToHand(false);
+ }
+ return;
+ }
+
+ DrawOrHitTestIcons(leftClick ? CLICK : HOVER, x, y);
+
+ GraphicsWindow::Selection ps = SS.GW.hover;
+ SS.GW.hover.Clear();
+
+ int prevHoveredRow = hoveredRow,
+ prevHoveredCol = hoveredCol;
+ hoveredRow = 0;
+ hoveredCol = 0;
+
+ // Find the corresponding character in the text buffer
+ int c = (int)((x - LEFT_MARGIN) / CHAR_WIDTH);
+ int hh = (LINE_HEIGHT)/2;
+ y += scrollPos*hh;
+ int r;
+ for(r = 0; r < rows; r++) {
+ if(y >= top[r]*hh && y <= (top[r]+2)*hh) {
+ break;
+ }
+ }
+ if(r < 0 || c < 0 || r >= rows || c >= MAX_COLS) {
+ SetMousePointerToHand(false);
+ goto done;
+ }
+
+ hoveredRow = r;
+ hoveredCol = c;
+
+#define META (meta[r][c])
+ if(leftClick) {
+ if(META.link && META.f) {
+ (META.f)(META.link, META.data);
+ Show();
+ InvalidateGraphics();
+ }
+ } else {
+ if(META.link) {
+ SetMousePointerToHand(true);
+ if(META.h) {
+ (META.h)(META.link, META.data);
+ }
+ } else {
+ SetMousePointerToHand(false);
+ }
+ }
+#undef META
+
+done:
+ if((!ps.Equals(&(SS.GW.hover))) ||
+ prevHoveredRow != hoveredRow ||
+ prevHoveredCol != hoveredCol)
+ {
+ InvalidateGraphics();
+ InvalidateText();
+ }
+}
+
+void TextWindow::MouseLeave(void) {
+ tooltippedIcon = NULL;
+ hoveredIcon = NULL;
+ hoveredRow = 0;
+ hoveredCol = 0;
+ InvalidateText();
+}
+
+void TextWindow::ScrollbarEvent(int newPos) {
+ if(TextEditControlIsVisible())
+ return;
+
+ int bottom = top[rows-1] + 2;
+ newPos = min(newPos, bottom - halfRows);
+ newPos = max(newPos, 0);
+
+ if(newPos != scrollPos) {
+ scrollPos = newPos;
+ MoveTextScrollbarTo(scrollPos, top[rows - 1] + 1, halfRows);
+ InvalidateText();
+ }
+}
+
--- /dev/null
+//-----------------------------------------------------------------------------
+// The toolbar that appears at the top left of the graphics window, where the
+// user can select icons with the mouse, to perform operations equivalent to
+// selecting a menu item or using a keyboard shortcut.
+//
+// Copyright 2008-2013 Jonathan Westhues.
+//-----------------------------------------------------------------------------
+#include "solvespace.h"
+#include "generated/icons.h"
+
+static uint8_t SPACER[1];
+static const struct {
+ uint8_t *image;
+ int menu;
+ const char *tip;
+} Toolbar[] = {
+ { Icon_line, GraphicsWindow::MNU_LINE_SEGMENT, "Sketch line segment" },
+ { Icon_rectangle, GraphicsWindow::MNU_RECTANGLE, "Sketch rectangle" },
+ { Icon_circle, GraphicsWindow::MNU_CIRCLE, "Sketch circle" },
+ { Icon_arc, GraphicsWindow::MNU_ARC, "Sketch arc of a circle" },
+ { Icon_text, GraphicsWindow::MNU_TTF_TEXT, "Sketch curves from text in a TrueType font" },
+ { Icon_tangent_arc, GraphicsWindow::MNU_TANGENT_ARC, "Create tangent arc at selected point" },
+ { Icon_bezier, GraphicsWindow::MNU_CUBIC, "Sketch cubic Bezier spline" },
+ { Icon_point, GraphicsWindow::MNU_DATUM_POINT, "Sketch datum point" },
+ { Icon_construction, GraphicsWindow::MNU_CONSTRUCTION, "Toggle construction" },
+ { Icon_trim, GraphicsWindow::MNU_SPLIT_CURVES, "Split lines / curves where they intersect" },
+ { SPACER, 0, 0 },
+
+ { Icon_length, GraphicsWindow::MNU_DISTANCE_DIA, "Constrain distance / diameter / length" },
+ { Icon_angle, GraphicsWindow::MNU_ANGLE, "Constrain angle" },
+ { Icon_horiz, GraphicsWindow::MNU_HORIZONTAL, "Constrain to be horizontal" },
+ { Icon_vert, GraphicsWindow::MNU_VERTICAL, "Constrain to be vertical" },
+ { Icon_parallel, GraphicsWindow::MNU_PARALLEL, "Constrain to be parallel or tangent" },
+ { Icon_perpendicular, GraphicsWindow::MNU_PERPENDICULAR, "Constrain to be perpendicular" },
+ { Icon_pointonx, GraphicsWindow::MNU_ON_ENTITY, "Constrain point on line / curve / plane / point" },
+ { Icon_symmetric, GraphicsWindow::MNU_SYMMETRIC, "Constrain symmetric" },
+ { Icon_equal, GraphicsWindow::MNU_EQUAL, "Constrain equal length / radius / angle" },
+ { Icon_same_orientation,GraphicsWindow::MNU_ORIENTED_SAME, "Constrain normals in same orientation" },
+ { Icon_other_supp, GraphicsWindow::MNU_OTHER_ANGLE, "Other supplementary angle" },
+ { Icon_ref, GraphicsWindow::MNU_REFERENCE, "Toggle reference dimension" },
+ { SPACER, 0, 0 },
+
+ { Icon_extrude, GraphicsWindow::MNU_GROUP_EXTRUDE, "New group extruding active sketch" },
+ { Icon_lathe, GraphicsWindow::MNU_GROUP_LATHE, "New group rotating active sketch" },
+ { Icon_step_rotate, GraphicsWindow::MNU_GROUP_ROT, "New group step and repeat rotating" },
+ { Icon_step_translate, GraphicsWindow::MNU_GROUP_TRANS, "New group step and repeat translating" },
+ { Icon_sketch_in_plane, GraphicsWindow::MNU_GROUP_WRKPL, "New group in new workplane (thru given entities)" },
+ { Icon_sketch_in_3d, GraphicsWindow::MNU_GROUP_3D, "New group in 3d" },
+ { Icon_assemble, GraphicsWindow::MNU_GROUP_LINK, "New group linking / assembling file" },
+ { SPACER, 0, 0 },
+
+ { Icon_in3d, GraphicsWindow::MNU_NEAREST_ISO, "Nearest isometric view" },
+ { Icon_ontoworkplane, GraphicsWindow::MNU_ONTO_WORKPLANE, "Align view to active workplane" },
+ { NULL, 0, 0 }
+};
+
+void GraphicsWindow::ToolbarDraw(void) {
+ ToolbarDrawOrHitTest(0, 0, true, NULL);
+}
+
+bool GraphicsWindow::ToolbarMouseMoved(int x, int y) {
+ x += ((int)width/2);
+ y += ((int)height/2);
+
+ int nh = 0;
+ bool withinToolbar = ToolbarDrawOrHitTest(x, y, false, &nh);
+ if(!withinToolbar) nh = 0;
+
+ if(nh != toolbarTooltipped) {
+ // Don't let the tool tip move around if the mouse moves within the
+ // same item.
+ toolbarMouseX = x;
+ toolbarMouseY = y;
+ toolbarTooltipped = 0;
+ }
+
+ if(nh != toolbarHovered) {
+ toolbarHovered = nh;
+ SetTimerFor(1000);
+ PaintGraphics();
+ }
+ // So if we moved off the toolbar, then toolbarHovered is now equal to
+ // zero, so it doesn't matter if the tool tip timer expires. And if
+ // we moved from one item to another, we reset the timer, so also okay.
+ return withinToolbar;
+}
+
+bool GraphicsWindow::ToolbarMouseDown(int x, int y) {
+ x += ((int)width/2);
+ y += ((int)height/2);
+
+ int nh = -1;
+ bool withinToolbar = ToolbarDrawOrHitTest(x, y, false, &nh);
+ // They might have clicked within the toolbar, but not on a button.
+ if(withinToolbar && nh >= 0) {
+ for(int i = 0; SS.GW.menu[i].level >= 0; i++) {
+ if(nh == SS.GW.menu[i].id) {
+ (SS.GW.menu[i].fn)((GraphicsWindow::MenuId)SS.GW.menu[i].id);
+ break;
+ }
+ }
+ }
+ return withinToolbar;
+}
+
+bool GraphicsWindow::ToolbarDrawOrHitTest(int mx, int my,
+ bool paint, int *menuHit)
+{
+ int i;
+ int x = 17, y = (int)(height - 52);
+
+ int fudge = 8;
+ int h = 32*16 + 3*16 + fudge;
+ int aleft = 0, aright = 66, atop = y+16+fudge/2, abot = y+16-h;
+
+ bool withinToolbar =
+ (mx >= aleft && mx <= aright && my <= atop && my >= abot);
+
+ if(!paint && !withinToolbar) {
+ // This gets called every MouseMove event, so return quickly.
+ return false;
+ }
+
+ if(paint) {
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ glTranslated(-1, -1, 0);
+ glScaled(2.0/width, 2.0/height, 0);
+ glDisable(GL_LIGHTING);
+
+ double c = 30.0/255;
+ glColor4d(c, c, c, 1.0);
+ ssglAxisAlignedQuad(aleft, aright, atop, abot);
+ }
+
+ struct {
+ bool show;
+ const char *str;
+ } toolTip = { false, NULL };
+
+ bool leftpos = true;
+ for(i = 0; Toolbar[i].image; i++) {
+ if(Toolbar[i].image == SPACER) {
+ if(!leftpos) {
+ leftpos = true;
+ y -= 32;
+ x -= 32;
+ }
+ y -= 16;
+
+ if(paint) {
+ // Draw a separator bar in a slightly different color.
+ int divw = 30, divh = 2;
+ glColor4d(0.17, 0.17, 0.17, 1);
+ x += 16;
+ y += 24;
+ ssglAxisAlignedQuad(x+divw, x-divw, y+divh, y-divh);
+ x -= 16;
+ y -= 24;
+ }
+
+ continue;
+ }
+
+ if(paint) {
+ glRasterPos2i(x - 12, y - 12);
+ glDrawPixels(24, 24, GL_RGB, GL_UNSIGNED_BYTE, Toolbar[i].image);
+
+ if(toolbarHovered == Toolbar[i].menu ||
+ pending.operation == Toolbar[i].menu) {
+ // Highlight the hovered or pending item.
+ glColor4d(1, 1, 0, 0.3);
+ int boxhw = 15;
+ ssglAxisAlignedQuad(x+boxhw, x-boxhw, y+boxhw, y-boxhw);
+ }
+
+ if(toolbarTooltipped == Toolbar[i].menu) {
+ // Display the tool tip for this item; postpone till later
+ // so that no one draws over us. Don't need position since
+ // that's just wherever the mouse is.
+ toolTip.show = true;
+ toolTip.str = Toolbar[i].tip;
+ }
+ } else {
+ int boxhw = 16;
+ if(mx < (x+boxhw) && mx > (x - boxhw) &&
+ my < (y+boxhw) && my > (y - boxhw))
+ {
+ if(menuHit) *menuHit = Toolbar[i].menu;
+ }
+ }
+
+ if(leftpos) {
+ x += 32;
+ leftpos = false;
+ } else {
+ x -= 32;
+ y -= 32;
+ leftpos = true;
+ }
+ }
+
+ if(paint) {
+ // Do this last so that nothing can draw over it.
+ if(toolTip.show) {
+ ssglInitializeBitmapFont();
+ std::string str = toolTip.str;
+
+ for(i = 0; SS.GW.menu[i].level >= 0; i++) {
+ if(toolbarTooltipped == SS.GW.menu[i].id) {
+ std::string accel = MakeAcceleratorLabel(SS.GW.menu[i].accel);
+ if(!accel.empty()) {
+ str += ssprintf(" (%s)", accel.c_str());
+ }
+ break;
+ }
+ }
+
+ int tw = str.length() * (SS.TW.CHAR_WIDTH - 1) + 10,
+ th = SS.TW.LINE_HEIGHT + 2;
+
+ double ox = toolbarMouseX + 3, oy = toolbarMouseY + 3;
+ glLineWidth(1);
+ glColor4d(1.0, 1.0, 0.6, 1.0);
+ ssglAxisAlignedQuad(ox, ox+tw, oy, oy+th);
+ glColor4d(0.0, 0.0, 0.0, 1.0);
+ ssglAxisAlignedLineLoop(ox, ox+tw, oy, oy+th);
+
+ glColor4d(0, 0, 0, 1);
+ glPushMatrix();
+ glTranslated(ox+5, oy+3, 0);
+ glScaled(1, -1, 1);
+ ssglBitmapText(str, Vector::From(0, 0, 0));
+ glPopMatrix();
+ }
+ ssglDepthRangeLockToFront(false);
+ }
+
+ return withinToolbar;
+}
+
+void GraphicsWindow::TimerCallback(void) {
+ SS.GW.toolbarTooltipped = SS.GW.toolbarHovered;
+ PaintGraphics();
+}
+
--- /dev/null
+//-----------------------------------------------------------------------------
+// Routines to read a TrueType font as vector outlines, and generate them
+// as entities, since they're always representable as either lines or
+// quadratic Bezier curves.
+//
+// Copyright 2016 whitequark, Peter Barfuss.
+//-----------------------------------------------------------------------------
+#include <ft2build.h>
+#include FT_FREETYPE_H
+#include FT_OUTLINE_H
+#include FT_ADVANCES_H
+
+/* Yecch. Irritatingly, you need to do this nonsense to get the error string table,
+ since nobody thought to put this exact function into FreeType itsself. */
+#undef __FTERRORS_H__
+#define FT_ERRORDEF(e, v, s) { (e), (s) },
+#define FT_ERROR_START_LIST
+#define FT_ERROR_END_LIST { 0, NULL }
+
+struct ft_error {
+ int err;
+ const char *str;
+};
+
+static const struct ft_error ft_errors[] = {
+#include FT_ERRORS_H
+};
+
+extern "C" const char *ft_error_string(int err) {
+ const struct ft_error *e;
+ for(e = ft_errors; e->str; e++)
+ if(e->err == err)
+ return e->str;
+ return "Unknown error";
+}
+
+/* Okay, we're done with that. */
+#undef FT_ERRORDEF
+#undef FT_ERROR_START_LIST
+#undef FT_ERROR_END_LIST
+
+#include "solvespace.h"
+
+//-----------------------------------------------------------------------------
+// Get the list of available font filenames, and load the name for each of
+// them. Only that, though, not the glyphs too.
+//-----------------------------------------------------------------------------
+TtfFontList::TtfFontList() {
+ FT_Init_FreeType(&fontLibrary);
+}
+
+TtfFontList::~TtfFontList() {
+ FT_Done_FreeType(fontLibrary);
+}
+
+void TtfFontList::LoadAll() {
+ if(loaded) return;
+
+ for(const std::string &font : GetFontFiles()) {
+ TtfFont tf = {};
+ tf.fontFile = font;
+ if(tf.LoadFromFile(fontLibrary))
+ l.Add(&tf);
+ }
+
+ // Sort fonts according to their actual name, not filename.
+ std::sort(&l.elem[0], &l.elem[l.n],
+ [](const TtfFont &a, const TtfFont &b) { return a.name < b.name; });
+
+ // Filter out fonts with the same family and style name. This is not
+ // strictly necessarily the exact same font, but it will almost always be.
+ TtfFont *it = std::unique(&l.elem[0], &l.elem[l.n],
+ [](const TtfFont &a, const TtfFont &b) { return a.name == b.name; });
+ l.RemoveLast(&l.elem[l.n] - it);
+
+ // TODO: identify fonts by their name and not filename, which may change
+ // between OSes.
+
+ loaded = true;
+}
+
+void TtfFontList::PlotString(const std::string &font, const std::string &str,
+ SBezierList *sbl, Vector origin, Vector u, Vector v)
+{
+ LoadAll();
+
+ TtfFont *tf = std::find_if(&l.elem[0], &l.elem[l.n],
+ [&](const TtfFont &tf) { return tf.FontFileBaseName() == font; });
+
+ if(!str.empty() && tf != &l.elem[l.n]) {
+ if(tf->fontFace == NULL) {
+ tf->LoadFromFile(fontLibrary, /*nameOnly=*/false);
+ }
+ tf->PlotString(str, sbl, origin, u, v);
+ } else {
+ // No text or no font; so draw a big X for an error marker.
+ SBezier sb;
+ sb = SBezier::From(origin, origin.Plus(u).Plus(v));
+ sbl->l.Add(&sb);
+ sb = SBezier::From(origin.Plus(v), origin.Plus(u));
+ sbl->l.Add(&sb);
+ }
+}
+
+//-----------------------------------------------------------------------------
+// Return the basename of our font filename; that's how the requests and
+// entities that reference us will store it.
+//-----------------------------------------------------------------------------
+std::string TtfFont::FontFileBaseName() const {
+ std::string baseName = fontFile;
+ size_t pos = baseName.rfind(PATH_SEP);
+ if(pos != std::string::npos)
+ return baseName.erase(0, pos + 1);
+ return "";
+}
+
+//-----------------------------------------------------------------------------
+// Load a TrueType font into memory. We care about the curves that define
+// the letter shapes, and about the mappings that determine which glyph goes
+// with which character.
+//-----------------------------------------------------------------------------
+bool TtfFont::LoadFromFile(FT_Library fontLibrary, bool nameOnly) {
+ FT_Open_Args args = {};
+ args.flags = FT_OPEN_PATHNAME;
+ args.pathname = &fontFile[0]; // FT_String is char* for historical reasons
+
+ // We don't use ssfopen() here to let freetype do its own memory management.
+ // This is OK because on Linux/OS X we just delegate to fopen and on Windows
+ // we only look into C:\Windows\Fonts, which has a known short path.
+ if(int fterr = FT_Open_Face(fontLibrary, &args, 0, &fontFace)) {
+ dbp("freetype: loading font from file '%s' failed: %s",
+ fontFile.c_str(), ft_error_string(fterr));
+ return false;
+ }
+
+ if(int fterr = FT_Select_Charmap(fontFace, FT_ENCODING_UNICODE)) {
+ dbp("freetype: loading unicode CMap for file '%s' failed: %s",
+ fontFile.c_str(), ft_error_string(fterr));
+ FT_Done_Face(fontFace);
+ fontFace = NULL;
+ return false;
+ }
+
+ name = std::string(fontFace->family_name) +
+ " (" + std::string(fontFace->style_name) + ")";
+
+ if(nameOnly) {
+ FT_Done_Face(fontFace);
+ fontFace = NULL;
+ return true;
+ }
+
+ // We always ask Freetype to give us a unit size character.
+ // It uses fixed point; put the unit size somewhere in the middle of the dynamic
+ // range of its 26.6 fixed point type, and adjust the factors so that the unit
+ // matches cap height.
+ FT_Size_RequestRec sizeRequest;
+ sizeRequest.type = FT_SIZE_REQUEST_TYPE_REAL_DIM;
+ sizeRequest.width = 1 << 16;
+ sizeRequest.height = 1 << 16;
+ sizeRequest.horiResolution = 128;
+ sizeRequest.vertResolution = 128;
+ if(int fterr = FT_Request_Size(fontFace, &sizeRequest)) {
+ dbp("freetype: cannot set character size: %s",
+ ft_error_string(fterr));
+ FT_Done_Face(fontFace);
+ fontFace = NULL;
+ return false;
+ }
+
+ char chr = 'A';
+ uint32_t gid = FT_Get_Char_Index(fontFace, 'A');
+ if (gid == 0) {
+ dbp("freetype: CID-to-GID mapping for CID 0x%04x failed: %s; using CID as GID",
+ chr, ft_error_string(gid));
+ gid = chr;
+ }
+
+ if(gid) {
+ if(int fterr = FT_Load_Glyph(fontFace, gid, FT_LOAD_NO_BITMAP | FT_LOAD_NO_HINTING)) {
+ dbp("freetype: cannot load glyph for GID 0x%04x: %s",
+ gid, ft_error_string(fterr));
+ FT_Done_Face(fontFace);
+ fontFace = NULL;
+ return false;
+ }
+
+ FT_BBox bbox;
+ FT_Outline_Get_CBox(&fontFace->glyph->outline, &bbox);
+ capHeight = (double)bbox.yMax;
+ }
+
+ return true;
+}
+
+typedef struct OutlineData {
+ Vector origin, u, v; // input parameters
+ SBezierList *beziers; // output bezier list
+ float factor; // ratio between freetype and solvespace coordinates
+ FT_Pos bx; // x offset of the current glyph
+ FT_Pos px, py; // current point
+} OutlineData;
+
+static Vector Transform(OutlineData *data, FT_Pos x, FT_Pos y) {
+ Vector r = data->origin;
+ r = r.Plus(data->u.ScaledBy((float)(data->bx + x) * data->factor));
+ r = r.Plus(data->v.ScaledBy((float)y * data->factor));
+ return r;
+}
+
+static int MoveTo(const FT_Vector *p, void *cc)
+{
+ OutlineData *data = (OutlineData *) cc;
+ data->px = p->x;
+ data->py = p->y;
+ return 0;
+}
+
+static int LineTo(const FT_Vector *p, void *cc)
+{
+ OutlineData *data = (OutlineData *) cc;
+ SBezier sb = SBezier::From(
+ Transform(data, data->px, data->py),
+ Transform(data, p->x, p->y));
+ data->beziers->l.Add(&sb);
+ data->px = p->x;
+ data->py = p->y;
+ return 0;
+}
+
+static int ConicTo(const FT_Vector *c, const FT_Vector *p, void *cc)
+{
+ OutlineData *data = (OutlineData *) cc;
+ SBezier sb = SBezier::From(
+ Transform(data, data->px, data->py),
+ Transform(data, c->x, c->y),
+ Transform(data, p->x, p->y));
+ data->beziers->l.Add(&sb);
+ data->px = p->x;
+ data->py = p->y;
+ return 0;
+}
+
+static int CubicTo(const FT_Vector *c1, const FT_Vector *c2, const FT_Vector *p, void *cc)
+{
+ OutlineData *data = (OutlineData *) cc;
+ SBezier sb = SBezier::From(
+ Transform(data, data->px, data->py),
+ Transform(data, c1->x, c1->y),
+ Transform(data, c2->x, c2->y),
+ Transform(data, p->x, p->y));
+ data->beziers->l.Add(&sb);
+ data->px = p->x;
+ data->py = p->y;
+ return 0;
+}
+
+void TtfFont::PlotString(const std::string &str,
+ SBezierList *sbl, Vector origin, Vector u, Vector v)
+{
+ if(fontFace == NULL) oops();
+
+ FT_Outline_Funcs outlineFuncs;
+ outlineFuncs.move_to = MoveTo;
+ outlineFuncs.line_to = LineTo;
+ outlineFuncs.conic_to = ConicTo;
+ outlineFuncs.cubic_to = CubicTo;
+ outlineFuncs.shift = 0;
+ outlineFuncs.delta = 0;
+
+ FT_Pos dx = 0;
+ for(char32_t cid : ReadUTF8(str)) {
+ uint32_t gid = FT_Get_Char_Index(fontFace, cid);
+ if (gid == 0) {
+ dbp("freetype: CID-to-GID mapping for CID 0x%04x failed: %s; using CID as GID",
+ cid, ft_error_string(gid));
+ gid = cid;
+ }
+
+ /*
+ * Stupid hacks:
+ * - if we want fake-bold, use FT_Outline_Embolden(). This actually looks
+ * quite good.
+ * - if we want fake-italic, apply a shear transform [1 s s 1 0 0] here using
+ * FT_Set_Transform. This looks decent at small font sizes and bad at larger
+ * ones, antialiasing mitigates this considerably though.
+ */
+ if(int fterr = FT_Load_Glyph(fontFace, gid, FT_LOAD_NO_BITMAP | FT_LOAD_NO_HINTING)) {
+ dbp("freetype: cannot load glyph for GID 0x%04x: %s",
+ gid, ft_error_string(fterr));
+ return;
+ }
+
+ /* A point that has x = xMin should be plotted at (dx0 + lsb); fix up
+ * our x-position so that the curve-generating code will put stuff
+ * at the right place.
+ *
+ * There's no point in getting the glyph BBox here - not only can it be
+ * needlessly slow sometimes, but because we're about to render a single glyph,
+ * what we want actually *is* the CBox.
+ *
+ * This is notwithstanding that this makes extremely little sense, this
+ * looks like a workaround for either mishandling the start glyph on a line,
+ * or as a really hacky pseudo-track-kerning (in which case it works better than
+ * one would expect! especially since most fonts don't set track kerning).
+ */
+ FT_BBox cbox;
+ FT_Outline_Get_CBox(&fontFace->glyph->outline, &cbox);
+ FT_Pos bx = dx - cbox.xMin;
+ // Yes, this is what FreeType calls left-side bearing.
+ // Then interchangeably uses that with "left-side bearing". Sigh.
+ bx += fontFace->glyph->metrics.horiBearingX;
+
+ OutlineData data = {};
+ data.origin = origin;
+ data.u = u;
+ data.v = v;
+ data.beziers = sbl;
+ data.factor = 1.0 / capHeight;
+ data.bx = bx;
+ if(int fterr = FT_Outline_Decompose(&fontFace->glyph->outline, &outlineFuncs, &data)) {
+ dbp("freetype: bezier decomposition failed (gid %d): %s",
+ gid, ft_error_string(fterr));
+ }
+
+ // And we're done, so advance our position by the requested advance
+ // width, plus the user-requested extra advance.
+ dx += fontFace->glyph->advance.x;
+ }
+}
--- /dev/null
+//-----------------------------------------------------------------------------
+// Routines to read a TrueType font as vector outlines, and generate them
+// as entities, since they're always representable as either lines or
+// quadratic Bezier curves.
+//
+// Copyright 2016 whitequark, Peter Barfuss.
+//-----------------------------------------------------------------------------
+
+#ifndef __TTF_H
+#define __TTF_H
+
+class TtfFont {
+public:
+ std::string fontFile;
+ std::string name;
+ FT_FaceRec_ *fontFace;
+ double capHeight;
+
+ std::string FontFileBaseName() const;
+ bool LoadFromFile(FT_LibraryRec_ *fontLibrary, bool nameOnly = true);
+
+ void PlotString(const std::string &str,
+ SBezierList *sbl, Vector origin, Vector u, Vector v);
+};
+
+class TtfFontList {
+public:
+ FT_LibraryRec_ *fontLibrary;
+ bool loaded;
+ List<TtfFont> l;
+
+ TtfFontList();
+ ~TtfFontList();
+
+ void LoadAll();
+
+ void PlotString(const std::string &font, const std::string &str,
+ SBezierList *sbl, Vector origin, Vector u, Vector v);
+};
+
+#endif
--- /dev/null
+//-----------------------------------------------------------------------------
+// Declarations relating to our user interface, in both the graphics and
+// text browser window.
+//
+// Copyright 2008-2013 Jonathan Westhues.
+//-----------------------------------------------------------------------------
+
+#ifndef __UI_H
+#define __UI_H
+
+class TextWindow {
+public:
+ enum {
+ MAX_COLS = 100,
+ MIN_COLS = 45,
+ MAX_ROWS = 2000
+ };
+
+ typedef struct {
+ char c;
+ RgbaColor color;
+ } Color;
+ static const Color fgColors[];
+ static const Color bgColors[];
+
+ float bgColorTable[256*3];
+ float fgColorTable[256*3];
+
+ enum {
+ CHAR_WIDTH = 9,
+ CHAR_HEIGHT = 16,
+ LINE_HEIGHT = 20,
+ LEFT_MARGIN = 6,
+ };
+
+#define CHECK_FALSE "\xEE\x80\x80" // U+E000
+#define CHECK_TRUE "\xEE\x80\x81"
+#define RADIO_FALSE "\xEE\x80\x82"
+#define RADIO_TRUE "\xEE\x80\x83"
+
+ int scrollPos; // The scrollbar position, in half-row units
+ int halfRows; // The height of our window, in half-row units
+
+ uint32_t text[MAX_ROWS][MAX_COLS];
+ typedef void LinkFunction(int link, uint32_t v);
+ enum { NOT_A_LINK = 0 };
+ struct {
+ char fg;
+ char bg;
+ RgbaColor bgRgb;
+ int link;
+ uint32_t data;
+ LinkFunction *f;
+ LinkFunction *h;
+ } meta[MAX_ROWS][MAX_COLS];
+ int hoveredRow, hoveredCol;
+
+
+ int top[MAX_ROWS]; // in half-line units, or -1 for unused
+ int rows;
+
+ // The row of icons at the top of the text window, to hide/show things
+ typedef struct {
+ bool *var;
+ uint8_t *icon;
+ const char *tip;
+ } HideShowIcon;
+ static HideShowIcon hideShowIcons[];
+ static bool SPACER;
+
+ // These are called by the platform-specific code.
+ void Paint(void);
+ void MouseEvent(bool isClick, bool leftDown, double x, double y);
+ void MouseScroll(double x, double y, int delta);
+ void MouseLeave(void);
+ void ScrollbarEvent(int newPos);
+
+ enum {
+ PAINT = 0,
+ HOVER = 1,
+ CLICK = 2
+ };
+ void DrawOrHitTestIcons(int how, double mx, double my);
+ void TimerCallback(void);
+ Point2d oldMousePos;
+ HideShowIcon *hoveredIcon, *tooltippedIcon;
+
+ Vector HsvToRgb(Vector hsv);
+ uint8_t *HsvPattern2d(void);
+ uint8_t *HsvPattern1d(double h, double s);
+ void ColorPickerDone(void);
+ bool DrawOrHitTestColorPicker(int how, bool leftDown, double x, double y);
+
+ void Init(void);
+ void MakeColorTable(const Color *in, float *out);
+ void Printf(bool half, const char *fmt, ...);
+ void ClearScreen(void);
+
+ void Show(void);
+
+ // State for the screen that we are showing in the text window.
+ enum {
+ SCREEN_LIST_OF_GROUPS = 0,
+ SCREEN_GROUP_INFO = 1,
+ SCREEN_GROUP_SOLVE_INFO = 2,
+ SCREEN_CONFIGURATION = 3,
+ SCREEN_STEP_DIMENSION = 4,
+ SCREEN_LIST_OF_STYLES = 5,
+ SCREEN_STYLE_INFO = 6,
+ SCREEN_PASTE_TRANSFORMED = 7,
+ SCREEN_EDIT_VIEW = 8,
+ SCREEN_TANGENT_ARC = 9
+ };
+ typedef struct {
+ int screen;
+
+ hGroup group;
+ hStyle style;
+
+ hConstraint constraint;
+ bool dimIsDistance;
+ double dimFinish;
+ int dimSteps;
+
+ struct {
+ int times;
+ Vector trans;
+ double theta;
+ Vector origin;
+ double scale;
+ } paste;
+ } ShownState;
+ ShownState shown;
+
+ enum {
+ EDIT_NOTHING = 0,
+ // For multiple groups
+ EDIT_TIMES_REPEATED = 1,
+ EDIT_GROUP_NAME = 2,
+ EDIT_GROUP_SCALE = 3,
+ EDIT_GROUP_COLOR = 4,
+ EDIT_GROUP_OPACITY = 5,
+ // For the configuraiton screen
+ EDIT_LIGHT_DIRECTION = 100,
+ EDIT_LIGHT_INTENSITY = 101,
+ EDIT_COLOR = 102,
+ EDIT_CHORD_TOLERANCE = 103,
+ EDIT_MAX_SEGMENTS = 104,
+ EDIT_CAMERA_TANGENT = 105,
+ EDIT_GRID_SPACING = 106,
+ EDIT_DIGITS_AFTER_DECIMAL = 107,
+ EDIT_EXPORT_SCALE = 108,
+ EDIT_EXPORT_OFFSET = 109,
+ EDIT_CANVAS_SIZE = 110,
+ EDIT_G_CODE_DEPTH = 120,
+ EDIT_G_CODE_PASSES = 121,
+ EDIT_G_CODE_FEED = 122,
+ EDIT_G_CODE_PLUNGE_FEED = 123,
+ EDIT_AUTOSAVE_INTERVAL = 124,
+ // For TTF text
+ EDIT_TTF_TEXT = 300,
+ // For the step dimension screen
+ EDIT_STEP_DIM_FINISH = 400,
+ EDIT_STEP_DIM_STEPS = 401,
+ // For the styles stuff
+ EDIT_STYLE_WIDTH = 500,
+ EDIT_STYLE_TEXT_HEIGHT = 501,
+ EDIT_STYLE_TEXT_ANGLE = 502,
+ EDIT_STYLE_COLOR = 503,
+ EDIT_STYLE_FILL_COLOR = 504,
+ EDIT_STYLE_NAME = 505,
+ EDIT_BACKGROUND_COLOR = 506,
+ EDIT_BACKGROUND_IMG_SCALE = 507,
+ EDIT_STYLE_STIPPLE_PERIOD = 508,
+ // For paste transforming
+ EDIT_PASTE_TIMES_REPEATED = 600,
+ EDIT_PASTE_ANGLE = 601,
+ EDIT_PASTE_SCALE = 602,
+ // For view
+ EDIT_VIEW_SCALE = 700,
+ EDIT_VIEW_ORIGIN = 701,
+ EDIT_VIEW_PROJ_RIGHT = 702,
+ EDIT_VIEW_PROJ_UP = 703,
+ // For tangent arc
+ EDIT_TANGENT_ARC_RADIUS = 800
+ };
+ struct {
+ bool showAgain;
+ int meaning;
+ int i;
+ hGroup group;
+ hRequest request;
+ hStyle style;
+ } edit;
+
+ static void ReportHowGroupSolved(hGroup hg);
+
+ struct {
+ int halfRow;
+ int col;
+
+ struct {
+ RgbaColor rgb;
+ double h, s, v;
+ bool show;
+ bool picker1dActive;
+ bool picker2dActive;
+ } colorPicker;
+ } editControl;
+
+ void HideEditControl(void);
+ void ShowEditControl(int col, const std::string &str, int halfRow = -1);
+ void ShowEditControlWithColorPicker(int col, RgbaColor rgb);
+
+ void ClearSuper(void);
+
+ void ShowHeader(bool withNav);
+ // These are self-contained screens, that show some information about
+ // the sketch.
+ void ShowListOfGroups(void);
+ void ShowGroupInfo(void);
+ void ShowGroupSolveInfo(void);
+ void ShowConfiguration(void);
+ void ShowListOfStyles(void);
+ void ShowStyleInfo(void);
+ void ShowStepDimension(void);
+ void ShowPasteTransformed(void);
+ void ShowEditView(void);
+ void ShowTangentArc(void);
+ // Special screen, based on selection
+ void DescribeSelection(void);
+
+ void GoToScreen(int screen);
+
+ // All of these are callbacks from the GUI code; first from when
+ // we're describing an entity
+ static void ScreenEditTtfText(int link, uint32_t v);
+ static void ScreenSetTtfFont(int link, uint32_t v);
+ static void ScreenUnselectAll(int link, uint32_t v);
+
+ // when we're describing a constraint
+ static void ScreenConstraintShowAsRadius(int link, uint32_t v);
+
+ // and the rest from the stuff in textscreens.cpp
+ static void ScreenSelectGroup(int link, uint32_t v);
+ static void ScreenActivateGroup(int link, uint32_t v);
+ static void ScreenToggleGroupShown(int link, uint32_t v);
+ static void ScreenHowGroupSolved(int link, uint32_t v);
+ static void ScreenShowGroupsSpecial(int link, uint32_t v);
+ static void ScreenDeleteGroup(int link, uint32_t v);
+
+ static void ScreenHoverConstraint(int link, uint32_t v);
+ static void ScreenHoverRequest(int link, uint32_t v);
+ static void ScreenSelectRequest(int link, uint32_t v);
+ static void ScreenSelectConstraint(int link, uint32_t v);
+
+ static void ScreenChangeGroupOption(int link, uint32_t v);
+ static void ScreenColor(int link, uint32_t v);
+ static void ScreenOpacity(int link, uint32_t v);
+
+ static void ScreenShowListOfStyles(int link, uint32_t v);
+ static void ScreenShowStyleInfo(int link, uint32_t v);
+ static void ScreenDeleteStyle(int link, uint32_t v);
+ static void ScreenChangeStylePatternType(int link, uint32_t v);
+ static void ScreenChangeStyleYesNo(int link, uint32_t v);
+ static void ScreenCreateCustomStyle(int link, uint32_t v);
+ static void ScreenLoadFactoryDefaultStyles(int link, uint32_t v);
+ static void ScreenAssignSelectionToStyle(int link, uint32_t v);
+ static void ScreenBackgroundImage(int link, uint32_t v);
+
+ static void ScreenShowConfiguration(int link, uint32_t v);
+ static void ScreenShowEditView(int link, uint32_t v);
+ static void ScreenGoToWebsite(int link, uint32_t v);
+
+ static void ScreenChangeFixExportColors(int link, uint32_t v);
+ static void ScreenChangeBackFaces(int link, uint32_t v);
+ static void ScreenChangeCheckClosedContour(int link, uint32_t v);
+ static void ScreenChangePwlCurves(int link, uint32_t v);
+ static void ScreenChangeCanvasSizeAuto(int link, uint32_t v);
+ static void ScreenChangeCanvasSize(int link, uint32_t v);
+ static void ScreenChangeShadedTriangles(int link, uint32_t v);
+
+ static void ScreenAllowRedundant(int link, uint32_t v);
+
+ static void ScreenStepDimSteps(int link, uint32_t v);
+ static void ScreenStepDimFinish(int link, uint32_t v);
+ static void ScreenStepDimGo(int link, uint32_t v);
+
+ static void ScreenChangeTangentArc(int link, uint32_t v);
+
+ static void ScreenPasteTransformed(int link, uint32_t v);
+
+ static void ScreenHome(int link, uint32_t v);
+
+ // These ones do stuff with the edit control
+ static void ScreenChangeExprA(int link, uint32_t v);
+ static void ScreenChangeGroupName(int link, uint32_t v);
+ static void ScreenChangeGroupScale(int link, uint32_t v);
+ static void ScreenChangeLightDirection(int link, uint32_t v);
+ static void ScreenChangeLightIntensity(int link, uint32_t v);
+ static void ScreenChangeColor(int link, uint32_t v);
+ static void ScreenChangeChordTolerance(int link, uint32_t v);
+ static void ScreenChangeMaxSegments(int link, uint32_t v);
+ static void ScreenChangeExportChordTolerance(int link, uint32_t v);
+ static void ScreenChangeExportMaxSegments(int link, uint32_t v);
+ static void ScreenChangeCameraTangent(int link, uint32_t v);
+ static void ScreenChangeGridSpacing(int link, uint32_t v);
+ static void ScreenChangeDigitsAfterDecimal(int link, uint32_t v);
+ static void ScreenChangeExportScale(int link, uint32_t v);
+ static void ScreenChangeExportOffset(int link, uint32_t v);
+ static void ScreenChangeGCodeParameter(int link, uint32_t v);
+ static void ScreenChangeAutosaveInterval(int link, uint32_t v);
+ static void ScreenChangeStyleName(int link, uint32_t v);
+ static void ScreenChangeStyleMetric(int link, uint32_t v);
+ static void ScreenChangeStyleTextAngle(int link, uint32_t v);
+ static void ScreenChangeStyleColor(int link, uint32_t v);
+ static void ScreenChangeBackgroundColor(int link, uint32_t v);
+ static void ScreenChangeBackgroundImageScale(int link, uint32_t v);
+ static void ScreenChangePasteTransformed(int link, uint32_t v);
+ static void ScreenChangeViewScale(int link, uint32_t v);
+ static void ScreenChangeViewOrigin(int link, uint32_t v);
+ static void ScreenChangeViewProjection(int link, uint32_t v);
+
+ bool EditControlDoneForStyles(const char *s);
+ bool EditControlDoneForConfiguration(const char *s);
+ bool EditControlDoneForPaste(const char *s);
+ bool EditControlDoneForView(const char *s);
+ void EditControlDone(const char *s);
+};
+
+#define SELECTION_RADIUS 10.0
+
+class GraphicsWindow {
+public:
+ void Init(void);
+
+ // This table describes the top-level menus in the graphics winodw.
+ typedef enum {
+ // File
+ MNU_NEW = 100,
+ MNU_OPEN,
+ MNU_OPEN_RECENT,
+ MNU_SAVE,
+ MNU_SAVE_AS,
+ MNU_EXPORT_PNG,
+ MNU_EXPORT_MESH,
+ MNU_EXPORT_SURFACES,
+ MNU_EXPORT_VIEW,
+ MNU_EXPORT_SECTION,
+ MNU_EXPORT_WIREFRAME,
+ MNU_IMPORT,
+ MNU_EXIT,
+ // View
+ MNU_ZOOM_IN,
+ MNU_ZOOM_OUT,
+ MNU_ZOOM_TO_FIT,
+ MNU_SHOW_GRID,
+ MNU_PERSPECTIVE_PROJ,
+ MNU_ONTO_WORKPLANE,
+ MNU_NEAREST_ORTHO,
+ MNU_NEAREST_ISO,
+ MNU_CENTER_VIEW,
+ MNU_SHOW_MENU_BAR,
+ MNU_SHOW_TOOLBAR,
+ MNU_SHOW_TEXT_WND,
+ MNU_UNITS_INCHES,
+ MNU_UNITS_MM,
+ MNU_FULL_SCREEN,
+ // Edit
+ MNU_UNDO,
+ MNU_REDO,
+ MNU_CUT,
+ MNU_COPY,
+ MNU_PASTE,
+ MNU_PASTE_TRANSFORM,
+ MNU_DELETE,
+ MNU_SELECT_CHAIN,
+ MNU_SELECT_ALL,
+ MNU_SNAP_TO_GRID,
+ MNU_ROTATE_90,
+ MNU_UNSELECT_ALL,
+ MNU_REGEN_ALL,
+ // Request
+ MNU_SEL_WORKPLANE,
+ MNU_FREE_IN_3D,
+ MNU_DATUM_POINT,
+ MNU_WORKPLANE,
+ MNU_LINE_SEGMENT,
+ MNU_CONSTR_SEGMENT,
+ MNU_CIRCLE,
+ MNU_ARC,
+ MNU_RECTANGLE,
+ MNU_CUBIC,
+ MNU_TTF_TEXT,
+ MNU_SPLIT_CURVES,
+ MNU_TANGENT_ARC,
+ MNU_CONSTRUCTION,
+ // Group
+ MNU_GROUP_3D,
+ MNU_GROUP_WRKPL,
+ MNU_GROUP_EXTRUDE,
+ MNU_GROUP_LATHE,
+ MNU_GROUP_ROT,
+ MNU_GROUP_TRANS,
+ MNU_GROUP_LINK,
+ MNU_GROUP_RECENT,
+ // Constrain
+ MNU_DISTANCE_DIA,
+ MNU_REF_DISTANCE,
+ MNU_ANGLE,
+ MNU_REF_ANGLE,
+ MNU_OTHER_ANGLE,
+ MNU_REFERENCE,
+ MNU_EQUAL,
+ MNU_RATIO,
+ MNU_DIFFERENCE,
+ MNU_ON_ENTITY,
+ MNU_SYMMETRIC,
+ MNU_AT_MIDPOINT,
+ MNU_HORIZONTAL,
+ MNU_VERTICAL,
+ MNU_PARALLEL,
+ MNU_PERPENDICULAR,
+ MNU_ORIENTED_SAME,
+ MNU_WHERE_DRAGGED,
+ MNU_COMMENT,
+ // Analyze
+ MNU_VOLUME,
+ MNU_AREA,
+ MNU_INTERFERENCE,
+ MNU_NAKED_EDGES,
+ MNU_SHOW_DOF,
+ MNU_TRACE_PT,
+ MNU_STOP_TRACING,
+ MNU_STEP_DIM,
+ // Help,
+ MNU_WEBSITE,
+ MNU_ABOUT
+ } MenuId;
+ typedef void MenuHandler(int id);
+ enum {
+ ESCAPE_KEY = 27,
+ DELETE_KEY = 127,
+ FUNCTION_KEY_BASE = 0xf0
+ };
+ enum {
+ SHIFT_MASK = 0x100,
+ CTRL_MASK = 0x200
+ };
+ enum MenuItemKind {
+ MENU_ITEM_NORMAL = 0,
+ MENU_ITEM_CHECK,
+ MENU_ITEM_RADIO
+ };
+ typedef struct {
+ int level; // 0 == on menu bar, 1 == one level down
+ const char *label; // or NULL for a separator
+ int id; // unique ID
+ int accel; // keyboard accelerator
+ MenuItemKind kind;
+ MenuHandler *fn;
+ } MenuEntry;
+ static const MenuEntry menu[];
+ static void MenuView(int id);
+ static void MenuEdit(int id);
+ static void MenuRequest(int id);
+ void DeleteSelection(void);
+ void CopySelection(void);
+ void PasteClipboard(Vector trans, double theta, double scale);
+ static void MenuClipboard(int id);
+
+ // The width and height (in pixels) of the window.
+ double width, height;
+ // These parameters define the map from 2d screen coordinates to the
+ // coordinates of the 3d sketch points. We will use an axonometric
+ // projection.
+ Vector offset;
+ Vector projRight;
+ Vector projUp;
+ double scale;
+ struct {
+ bool mouseDown;
+ Vector offset;
+ Vector projRight;
+ Vector projUp;
+ Point2d mouse;
+ Point2d mouseOnButtonDown;
+ Vector marqueePoint;
+ bool startedMoving;
+ } orig;
+ // We need to detect when the projection is changed to invalidate
+ // caches for drawn items.
+ struct {
+ Vector offset;
+ Vector projRight;
+ Vector projUp;
+ double scale;
+ } cached;
+
+ // Most recent mouse position, updated every time the mouse moves.
+ Point2d currentMousePosition;
+
+ // When the user is dragging a point, don't solve multiple times without
+ // allowing a paint in between. The extra solves are wasted if they're
+ // not displayed.
+ bool havePainted;
+ // Similarly, don't draw edges and outlines, since that's too slow
+ // for real-time dragging.
+ bool isDegraded;
+
+ // Some state for the context menu.
+ struct {
+ bool active;
+ } context;
+
+ void NormalizeProjectionVectors(void);
+ Point2d ProjectPoint(Vector p);
+ Vector ProjectPoint3(Vector p);
+ Vector ProjectPoint4(Vector p, double *w);
+ Vector UnProjectPoint(Point2d p);
+ Vector UnProjectPoint3(Vector p);
+ void AnimateOnto(Quaternion quatf, Vector offsetf);
+ void AnimateOntoWorkplane(void);
+ Vector VectorFromProjs(Vector rightUpForward);
+ void HandlePointForZoomToFit(Vector p, Point2d *pmax, Point2d *pmin,
+ double *wmin, bool usePerspective);
+ void LoopOverPoints(const std::vector<Entity *> &entity, const std::vector<hEntity> &faces, Point2d *pmax, Point2d *pmin,
+ double *wmin, bool usePerspective, bool includeMesh);
+ void ZoomToFit(bool includingInvisibles, bool useSelection = false);
+
+ hGroup activeGroup;
+ void EnsureValidActives(void);
+ bool LockedInWorkplane(void);
+ void SetWorkplaneFreeIn3d(void);
+ hEntity ActiveWorkplane(void);
+ void ForceTextWindowShown(void);
+
+ // Operations that must be completed by doing something with the mouse
+ // are noted here. These occupy the same space as the menu ids.
+ enum {
+ FIRST_PENDING = 0x0f000000,
+ DRAGGING_POINTS = 0x0f000000,
+ DRAGGING_NEW_POINT = 0x0f000001,
+ DRAGGING_NEW_LINE_POINT = 0x0f000002,
+ DRAGGING_NEW_CUBIC_POINT = 0x0f000003,
+ DRAGGING_NEW_ARC_POINT = 0x0f000004,
+ DRAGGING_CONSTRAINT = 0x0f000005,
+ DRAGGING_RADIUS = 0x0f000006,
+ DRAGGING_NORMAL = 0x0f000007,
+ DRAGGING_NEW_RADIUS = 0x0f000008,
+ DRAGGING_MARQUEE = 0x0f000009
+ };
+
+ enum SuggestedConstraint {
+ SUGGESTED_NONE = 0,
+ SUGGESTED_HORIZONTAL = Constraint::HORIZONTAL,
+ SUGGESTED_VERTICAL = Constraint::VERTICAL,
+ };
+
+ struct {
+ int operation;
+
+ hRequest request;
+ hEntity point;
+ List<hEntity> points;
+ hEntity circle;
+ hEntity normal;
+ hConstraint constraint;
+
+ const char *description;
+
+ SuggestedConstraint suggestion;
+ } pending;
+ void ClearPending(void);
+ // The constraint that is being edited with the on-screen textbox.
+ hConstraint constraintBeingEdited;
+
+ SuggestedConstraint SuggestLineConstraint(hRequest lineSegment);
+
+ Vector SnapToGrid(Vector p);
+ bool ConstrainPointByHovered(hEntity pt);
+ void DeleteTaggedRequests(void);
+ hRequest AddRequest(int type, bool rememberForUndo);
+ hRequest AddRequest(int type);
+
+ class ParametricCurve {
+ public:
+ bool isLine; // else circle
+ Vector p0, p1;
+ Vector u, v;
+ double r, theta0, theta1, dtheta;
+
+ void MakeFromEntity(hEntity he, bool reverse);
+ Vector PointAt(double t);
+ Vector TangentAt(double t);
+ double LengthForAuto(void);
+
+ hRequest CreateRequestTrimmedTo(double t, bool extraConstraints,
+ hEntity orig, hEntity arc, bool arcFinish);
+ void ConstrainPointIfCoincident(hEntity hpt);
+ };
+ void MakeTangentArc(void);
+ void SplitLinesOrCurves(void);
+ hEntity SplitEntity(hEntity he, Vector pinter);
+ hEntity SplitLine(hEntity he, Vector pinter);
+ hEntity SplitCircle(hEntity he, Vector pinter);
+ hEntity SplitCubic(hEntity he, Vector pinter);
+ void ReplacePointInConstraints(hEntity oldpt, hEntity newpt);
+ void RemoveConstraintsForPointBeingDeleted(hEntity hpt);
+ void FixConstraintsForRequestBeingDeleted(hRequest hr);
+ void FixConstraintsForPointBeingDeleted(hEntity hpt);
+
+ // The current selection.
+ class Selection {
+ public:
+ int tag;
+
+ hEntity entity;
+ hConstraint constraint;
+ bool emphasized;
+
+ void Draw(void);
+
+ void Clear(void);
+ bool IsEmpty(void);
+ bool Equals(Selection *b);
+ bool HasEndpoints(void);
+ };
+ Selection hover;
+ bool hoverWasSelectedOnMousedown;
+ List<Selection> selection;
+ void HitTestMakeSelection(Point2d mp);
+ void ClearSelection(void);
+ void ClearNonexistentSelectionItems(void);
+ struct {
+ std::vector<hEntity> point;
+ std::vector<hEntity> entity;
+ std::vector<hEntity> anyNormal;
+ std::vector<hEntity> vector;
+ std::vector<hEntity> face;
+ std::vector<hConstraint> constraint;
+ int points;
+ int entities;
+ int workplanes;
+ int faces;
+ int lineSegments;
+ int circlesOrArcs;
+ int arcs;
+ int cubics;
+ int periodicCubics;
+ int anyNormals;
+ int vectors;
+ int constraints;
+ int stylables;
+ int constraintLabels;
+ int withEndpoints;
+ int n;
+ } gs;
+ void GroupSelection(void);
+ bool IsSelected(Selection *s);
+ bool IsSelected(hEntity he);
+ void MakeSelected(hEntity he);
+ void MakeSelected(hConstraint hc);
+ void MakeSelected(Selection *s);
+ void MakeUnselected(hEntity he, bool coincidentPointTrick);
+ void MakeUnselected(Selection *s, bool coincidentPointTrick);
+ void SelectByMarquee(void);
+ void ClearSuper(void);
+
+ enum {
+ CMNU_UNSELECT_ALL = 0x100,
+ CMNU_UNSELECT_HOVERED = 0x101,
+ CMNU_CUT_SEL = 0x102,
+ CMNU_COPY_SEL = 0x103,
+ CMNU_PASTE = 0x104,
+ CMNU_PASTE_XFRM = 0x105,
+ CMNU_DELETE_SEL = 0x106,
+ CMNU_SELECT_CHAIN = 0x107,
+ CMNU_NEW_CUSTOM_STYLE = 0x110,
+ CMNU_NO_STYLE = 0x111,
+ CMNU_GROUP_INFO = 0x120,
+ CMNU_STYLE_INFO = 0x121,
+ CMNU_REFERENCE_DIM = 0x130,
+ CMNU_OTHER_ANGLE = 0x131,
+ CMNU_DEL_COINCIDENT = 0x132,
+ CMNU_SNAP_TO_GRID = 0x140,
+ CMNU_REMOVE_SPLINE_PT = 0x141,
+ CMNU_ADD_SPLINE_PT = 0x142,
+ CMNU_FIRST_STYLE = 0x40000000
+ };
+ void ContextMenuListStyles(void);
+ int64_t contextMenuCancelTime;
+
+ // The toolbar, in toolbar.cpp
+ bool ToolbarDrawOrHitTest(int x, int y, bool paint, int *menuHit);
+ void ToolbarDraw(void);
+ bool ToolbarMouseMoved(int x, int y);
+ bool ToolbarMouseDown(int x, int y);
+ static void TimerCallback(void);
+ int toolbarHovered;
+ int toolbarTooltipped;
+ int toolbarMouseX, toolbarMouseY;
+
+ // This sets what gets displayed.
+ bool showWorkplanes;
+ bool showNormals;
+ bool showPoints;
+ bool showConstraints;
+ bool showTextWindow;
+ bool showShaded;
+ bool showEdges;
+ bool showOutlines;
+ bool showFaces;
+ bool showMesh;
+ bool showHdnLines;
+ void ToggleBool(bool *v);
+
+ bool showSnapGrid;
+
+ void AddPointToDraggedList(hEntity hp);
+ void StartDraggingByEntity(hEntity he);
+ void StartDraggingBySelection(void);
+ void UpdateDraggedNum(Vector *pos, double mx, double my);
+ void UpdateDraggedPoint(hEntity hp, double mx, double my);
+
+ // These are called by the platform-specific code.
+ void Paint(void);
+ void MouseMoved(double x, double y, bool leftDown, bool middleDown,
+ bool rightDown, bool shiftDown, bool ctrlDown);
+ void MouseLeftDown(double x, double y);
+ void MouseLeftUp(double x, double y);
+ void MouseLeftDoubleClick(double x, double y);
+ void MouseMiddleOrRightDown(double x, double y);
+ void MouseRightUp(double x, double y);
+ void MouseScroll(double x, double y, int delta);
+ void MouseLeave(void);
+ bool KeyDown(int c);
+ void EditControlDone(const char *s);
+
+ int64_t lastSpaceNavigatorTime;
+ hGroup lastSpaceNavigatorGroup;
+ void SpaceNavigatorMoved(double tx, double ty, double tz,
+ double rx, double ry, double rz, bool shiftDown);
+ void SpaceNavigatorButtonUp(void);
+};
+
+
+#endif
--- /dev/null
+//-----------------------------------------------------------------------------
+// The user-visible undo/redo operation; whenever they change something, we
+// record our state and push it on a stack, and we pop the stack when they
+// select undo.
+//
+// Copyright 2008-2013 Jonathan Westhues.
+//-----------------------------------------------------------------------------
+#include "solvespace.h"
+
+void SolveSpaceUI::UndoRemember(void) {
+ unsaved = true;
+ PushFromCurrentOnto(&undo);
+ UndoClearStack(&redo);
+ UndoEnableMenus();
+}
+
+void SolveSpaceUI::UndoUndo(void) {
+ if(undo.cnt <= 0) return;
+
+ PushFromCurrentOnto(&redo);
+ PopOntoCurrentFrom(&undo);
+ UndoEnableMenus();
+}
+
+void SolveSpaceUI::UndoRedo(void) {
+ if(redo.cnt <= 0) return;
+
+ PushFromCurrentOnto(&undo);
+ PopOntoCurrentFrom(&redo);
+ UndoEnableMenus();
+}
+
+void SolveSpaceUI::UndoEnableMenus(void) {
+ EnableMenuById(GraphicsWindow::MNU_UNDO, undo.cnt > 0);
+ EnableMenuById(GraphicsWindow::MNU_REDO, redo.cnt > 0);
+}
+
+void SolveSpaceUI::PushFromCurrentOnto(UndoStack *uk) {
+ int i;
+
+ if(uk->cnt == MAX_UNDO) {
+ UndoClearState(&(uk->d[uk->write]));
+ // And then write in to this one again
+ } else {
+ (uk->cnt)++;
+ }
+
+ UndoState *ut = &(uk->d[uk->write]);
+ *ut = {};
+ for(i = 0; i < SK.group.n; i++) {
+ Group *src = &(SK.group.elem[i]);
+ Group dest = *src;
+ // And then clean up all the stuff that needs to be a deep copy,
+ // and zero out all the dynamic stuff that will get regenerated.
+ dest.clean = false;
+ dest.solved = {};
+ dest.polyLoops = {};
+ dest.bezierLoops = {};
+ dest.bezierOpens = {};
+ dest.polyError = {};
+ dest.thisMesh = {};
+ dest.runningMesh = {};
+ dest.thisShell = {};
+ dest.runningShell = {};
+ dest.displayMesh = {};
+ dest.displayEdges = {};
+ dest.displayOutlines = {};
+
+ dest.remap = {};
+ src->remap.DeepCopyInto(&(dest.remap));
+
+ dest.impMesh = {};
+ dest.impShell = {};
+ dest.impEntity = {};
+ ut->group.Add(&dest);
+ }
+ for(i = 0; i < SK.groupOrder.n; i++) {
+ ut->groupOrder.Add(&(SK.groupOrder.elem[i]));
+ }
+ for(i = 0; i < SK.request.n; i++) {
+ ut->request.Add(&(SK.request.elem[i]));
+ }
+ for(i = 0; i < SK.constraint.n; i++) {
+ Constraint *src = &(SK.constraint.elem[i]);
+ Constraint dest = *src;
+ dest.dogd = {};
+ ut->constraint.Add(&dest);
+ }
+ for(i = 0; i < SK.param.n; i++) {
+ ut->param.Add(&(SK.param.elem[i]));
+ }
+ for(i = 0; i < SK.style.n; i++) {
+ ut->style.Add(&(SK.style.elem[i]));
+ }
+ ut->activeGroup = SS.GW.activeGroup;
+
+ uk->write = WRAP(uk->write + 1, MAX_UNDO);
+}
+
+void SolveSpaceUI::PopOntoCurrentFrom(UndoStack *uk) {
+ int i;
+
+ if(uk->cnt <= 0) oops();
+ (uk->cnt)--;
+ uk->write = WRAP(uk->write - 1, MAX_UNDO);
+
+ UndoState *ut = &(uk->d[uk->write]);
+
+ // Free everything in the main copy of the program before replacing it
+ for(i = 0; i < SK.groupOrder.n; i++) {
+ Group *g = SK.GetGroup(SK.groupOrder.elem[i]);
+ g->Clear();
+ }
+ SK.group.Clear();
+ SK.groupOrder.Clear();
+ SK.request.Clear();
+ SK.constraint.Clear();
+ SK.param.Clear();
+ SK.style.Clear();
+
+ // And then do a shallow copy of the state from the undo list
+ ut->group.MoveSelfInto(&(SK.group));
+ for(i = 0; i < ut->groupOrder.n; i++)
+ SK.groupOrder.Add(&ut->groupOrder.elem[i]);
+ ut->request.MoveSelfInto(&(SK.request));
+ ut->constraint.MoveSelfInto(&(SK.constraint));
+ ut->param.MoveSelfInto(&(SK.param));
+ ut->style.MoveSelfInto(&(SK.style));
+ SS.GW.activeGroup = ut->activeGroup;
+
+ // No need to free it, since a shallow copy was made above
+ *ut = {};
+
+ // And reset the state everywhere else in the program, since the
+ // sketch just changed a lot.
+ SS.GW.ClearSuper();
+ SS.TW.ClearSuper();
+ SS.ReloadAllImported();
+ SS.GenerateAll(SolveSpaceUI::GENERATE_ALL);
+ SS.ScheduleShowTW();
+
+ // Activate the group that was active before.
+ Group *activeGroup = SK.GetGroup(SS.GW.activeGroup);
+ activeGroup->Activate();
+}
+
+void SolveSpaceUI::UndoClearStack(UndoStack *uk) {
+ while(uk->cnt > 0) {
+ uk->write = WRAP(uk->write - 1, MAX_UNDO);
+ (uk->cnt)--;
+ UndoClearState(&(uk->d[uk->write]));
+ }
+ *uk = {}; // for good measure
+}
+
+void SolveSpaceUI::UndoClearState(UndoState *ut) {
+ int i;
+ for(i = 0; i < ut->group.n; i++) {
+ Group *g = &(ut->group.elem[i]);
+
+ g->remap.Clear();
+ }
+ ut->group.Clear();
+ ut->request.Clear();
+ ut->constraint.Clear();
+ ut->param.Clear();
+ ut->style.Clear();
+ *ut = {};
+}
+
--- /dev/null
+//-----------------------------------------------------------------------------
+// Offscreen rendering in OpenGL using framebuffer objects.
+//
+// Copyright 2015 <whitequark@whitequark.org>
+//-----------------------------------------------------------------------------
+#ifdef __APPLE__
+#include <OpenGL/GL.h>
+#else
+#include <GL/glew.h>
+#endif
+
+#include "gloffscreen.h"
+#include "solvespace.h"
+
+GLOffscreen::GLOffscreen() : _pixels(NULL), _pixels_inv(NULL), _width(0), _height(0) {
+#ifndef __APPLE__
+ if(glewInit() != GLEW_OK)
+ oops();
+#endif
+
+ if(!GL_EXT_framebuffer_object)
+ oops();
+
+ glGenFramebuffersEXT(1, &_framebuffer);
+ glGenRenderbuffersEXT(1, &_color_renderbuffer);
+ glGenRenderbuffersEXT(1, &_depth_renderbuffer);
+}
+
+GLOffscreen::~GLOffscreen() {
+ delete[] _pixels;
+ delete[] _pixels_inv;
+ glDeleteRenderbuffersEXT(1, &_depth_renderbuffer);
+ glDeleteRenderbuffersEXT(1, &_color_renderbuffer);
+ glDeleteFramebuffersEXT(1, &_framebuffer);
+}
+
+bool GLOffscreen::begin(int width, int height) {
+ if(_width != width || _height != height) {
+ delete[] _pixels;
+ delete[] _pixels_inv;
+
+ _pixels = new uint32_t[width * height * 4];
+ _pixels_inv = new uint32_t[width * height * 4];
+
+ _width = width;
+ _height = height;
+ }
+
+ glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, _framebuffer);
+
+ glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, _color_renderbuffer);
+ glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_RGBA8, _width, _height);
+ glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT,
+ GL_RENDERBUFFER_EXT, _color_renderbuffer);
+
+ glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, _depth_renderbuffer);
+ glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT24, _width, _height);
+ glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT,
+ GL_RENDERBUFFER_EXT, _depth_renderbuffer);
+
+ if(glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT) == GL_FRAMEBUFFER_COMPLETE_EXT)
+ return true;
+
+ glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
+ return false;
+}
+
+uint8_t *GLOffscreen::end(bool flip) {
+#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
+ glReadPixels(0, 0, _width, _height,
+ GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, _pixels_inv);
+#else
+ glReadPixels(0, 0, _width, _height,
+ GL_BGRA, GL_UNSIGNED_INT_8_8_8_8, _pixels_inv);
+#endif
+
+ if(flip) {
+ /* in OpenGL coordinates, bottom is zero Y */
+ for(int i = 0; i < _height; i++)
+ memcpy(&_pixels[_width * i], &_pixels_inv[_width * (_height - i - 1)], _width * 4);
+ }
+
+ glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
+
+ return (uint8_t*) (flip ? _pixels : _pixels_inv);
+}
--- /dev/null
+//-----------------------------------------------------------------------------
+// Offscreen rendering in OpenGL using framebuffer objects.
+//
+// Copyright 2015 <whitequark@whitequark.org>
+//-----------------------------------------------------------------------------
+#ifndef __GLOFFSCREEN_H
+#define __GLOFFSCREEN_H
+
+#include <stdint.h>
+
+class GLOffscreen {
+public:
+ /* these allocate and deallocate OpenGL resources.
+ an OpenGL context /must/ be current. */
+ GLOffscreen();
+ ~GLOffscreen();
+
+ /* prepare for drawing a frame of specified size.
+ returns true if OpenGL likes our configuration, false
+ otherwise. if it returns false, the OpenGL state is restored. */
+ bool begin(int width, int height);
+
+ /* get pixels out of the frame and restore OpenGL state.
+ the pixel format is ARGB32 with top row at index 0 if
+ flip is true and bottom row at index 0 if flip is false.
+ the returned array is valid until the next call to begin() */
+ uint8_t *end(bool flip = true);
+
+private:
+ unsigned int _framebuffer;
+ unsigned int _color_renderbuffer, _depth_renderbuffer;
+ uint32_t *_pixels, *_pixels_inv;
+ int _width, _height;
+};
+
+#endif
--- /dev/null
+/* XPM */
+static char *solvespace_16x16[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 5 1 ",
+" c black",
+". c #1ED500",
+"X c #DE00D6",
+"o c #CBCBCB",
+"O c None",
+/* pixels */
+"OOO OOOOOOOOOOOO",
+"OOO OOOOOOOOOOOO",
+"OOO OOOOOOOOOOOO",
+"OOO OOOOOXOOOOOO",
+"OOO OOOOOXoOOOOO",
+"OOO OOOOOXoOOOOO",
+"OOO OOOOOXoOOOOO",
+"OOO OOOOOXoOOOOO",
+"OOO OOOOOXoOOOOO",
+"OOO OOXXXXXXXOOO",
+"OOO OOOoooooooOO",
+"OO...OOOOOOOOOOO",
+" ... ",
+"OO...OOOOOOOOOOO",
+"OOO OOOOOOOOOOOO",
+"OOO OOOOOOOOOOOO"
+};
--- /dev/null
+/* XPM */
+static char *solvespace_24x24[] = {
+/* columns rows colors chars-per-pixel */
+"24 24 5 1 ",
+" c black",
+". c #1ED500",
+"X c #DE00D6",
+"o c #CBCBCB",
+"O c None",
+/* pixels */
+"OOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOO OOOOOOOOOOOOOOOO",
+"OOOOOOO OOOOOOOOOOOOOOOO",
+"OOOOOOO OOOOOOOOOOOOOOOO",
+"OOOOOOO OOOOOXOOOOOOOOOO",
+"OOOOOOO OOOOOXoOOOOOOOOO",
+"OOOOOOO OOOOOXoOOOOOOOOO",
+"OOOOOOO OOOOOXoOOOOOOOOO",
+"OOOOOOO OOOOOXoOOOOOOOOO",
+"OOOOOOO OOOOOXoOOOOOOOOO",
+"OOOOOOO OOXXXXXXXOOOOOOO",
+"OOOOOOO OOOoooooooOOOOOO",
+"OOOOOO...OOOOOOOOOOOOOOO",
+"OOOO ... OOOO",
+"OOOOOO...OOOOOOOOOOOOOOO",
+"OOOOOOO OOOOOOOOOOOOOOOO",
+"OOOOOOO OOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOO"
+};
--- /dev/null
+/* XPM */
+static char *solvespace_32x32[] = {
+/* columns rows colors chars-per-pixel */
+"32 32 5 1 ",
+" c black",
+". c #1ED500",
+"X c #DE00D6",
+"o c #CBCBCB",
+"O c None",
+/* pixels */
+"OOOOOO OOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOO OOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOO OOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOO OOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOO OOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOO OOOOOOOOOXXOOOOOOOOOOOOO",
+"OOOOOO OOOOOOOOOXXoOOOOOOOOOOOO",
+"OOOOOO OOOOOOOOOXXoOOOOOOOOOOOO",
+"OOOOOO OOOOOOOOOXXoOOOOOOOOOOOO",
+"OOOOOO OOOOOOOOOXXoOOOOOOOOOOOO",
+"OOOOOO OOOOOOOOOXXoOOOOOOOOOOOO",
+"OOOOOO OOOOOOOOOXXoOOOOOOOOOOOO",
+"OOOOOO OOOOOOOOOXXoOOOOOOOOOOOO",
+"OOOOOO OOOOOOOOOXXoOOOOOOOOOOOO",
+"OOOOOO OOOOOOOOOXXoOOOOOOOOOOOO",
+"OOOOOO OOOOOOOOOXXoOOOOOOOOOOOO",
+"OOOOOO OOOOXXXXXXXXXXXXOOOOOOOO",
+"OOOOOO OOOOXXXXXXXXXXXXOOOOOOOO",
+"OOOOOO OOOOOooooooooooooOOOOOOO",
+"OOOOOO OOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOO OOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOO OOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOO......OOOOOOOOOOOOOOOOOOOOOO",
+"OOOO......OOOOOOOOOOOOOOOOOOOOOO",
+" ...... ",
+" ...... ",
+"OOOO......OOOOOOOOOOOOOOOOOOOOOO",
+"OOOO......OOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOO OOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOO OOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOO OOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOO OOOOOOOOOOOOOOOOOOOOOOOO"
+};
--- /dev/null
+/* XPM */
+static char *solvespace_48x48[] = {
+/* columns rows colors chars-per-pixel */
+"48 48 5 1 ",
+" c black",
+". c #1ED500",
+"X c #DE00D6",
+"o c #CBCBCB",
+"O c None",
+/* pixels */
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOO OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOO OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOO OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOO OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOO OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOO OOOOOOOOOXXOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOO OOOOOOOOOXXoOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOO OOOOOOOOOXXoOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOO OOOOOOOOOXXoOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOO OOOOOOOOOXXoOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOO OOOOOOOOOXXoOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOO OOOOOOOOOXXoOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOO OOOOOOOOOXXoOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOO OOOOOOOOOXXoOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOO OOOOOOOOOXXoOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOO OOOOOOOOOXXoOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOO OOOOXXXXXXXXXXXXOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOO OOOOXXXXXXXXXXXXOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOO OOOOOooooooooooooOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOO OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOO OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOO OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOO......OOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOO......OOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOO ...... OOOOOOOO",
+"OOOOOOOO ...... OOOOOOOO",
+"OOOOOOOOOOOO......OOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOO......OOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOO OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOO OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOO OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOO OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO"
+};
--- /dev/null
+[Desktop Entry]
+Version=1.0
+Name=SolveSpace
+Comment=A parametric 2d/3d CAD
+Exec=/usr/bin/solvespace
+Icon=solvespace
+Type=Application
+Categories=Graphics
+Keywords=parametric;cad;2d;3d;
--- /dev/null
+//-----------------------------------------------------------------------------
+// Utility functions used by the Unix port. Notably, our memory allocation;
+// we use two separate allocators, one for long-lived stuff and one for
+// stuff that gets freed after every regeneration of the model, to save us
+// the trouble of freeing the latter explicitly.
+//
+// Copyright 2008-2013 Jonathan Westhues.
+// Copyright 2013 Daniel Richard G. <skunk@iSKUNK.ORG>
+//-----------------------------------------------------------------------------
+#include <time.h>
+
+#include "solvespace.h"
+
+namespace SolveSpace {
+
+void dbp(const char *str, ...)
+{
+ va_list f;
+ static char buf[1024*50];
+ va_start(f, str);
+ vsnprintf(buf, sizeof(buf), str, f);
+ va_end(f);
+
+ fputs(buf, stderr);
+ fputc('\n', stderr);
+}
+
+FILE *ssfopen(const std::string &filename, const char *mode)
+{
+ if(filename.length() != strlen(filename.c_str())) oops();
+ return fopen(filename.c_str(), mode);
+}
+
+void ssremove(const std::string &filename)
+{
+ if(filename.length() != strlen(filename.c_str())) oops();
+ remove(filename.c_str());
+}
+
+int64_t GetUnixTime(void)
+{
+ time_t ret;
+ time(&ret);
+ return (int64_t)ret;
+}
+
+//-----------------------------------------------------------------------------
+// A separate heap, on which we allocate expressions. Maybe a bit faster,
+// since fragmentation is less of a concern, and it also makes it possible
+// to be sloppy with our memory management, and just free everything at once
+// at the end.
+//-----------------------------------------------------------------------------
+
+typedef struct _AllocTempHeader AllocTempHeader;
+
+typedef struct _AllocTempHeader {
+ AllocTempHeader *prev;
+ AllocTempHeader *next;
+} AllocTempHeader;
+
+static AllocTempHeader *Head = NULL;
+
+void *AllocTemporary(size_t n)
+{
+ AllocTempHeader *h =
+ (AllocTempHeader *)malloc(n + sizeof(AllocTempHeader));
+ h->prev = NULL;
+ h->next = Head;
+ if(Head) Head->prev = h;
+ Head = h;
+ memset(&h[1], 0, n);
+ return (void *)&h[1];
+}
+
+void FreeTemporary(void *p)
+{
+ AllocTempHeader *h = (AllocTempHeader *)p - 1;
+ if(h->prev) {
+ h->prev->next = h->next;
+ } else {
+ Head = h->next;
+ }
+ if(h->next) h->next->prev = h->prev;
+ free(h);
+}
+
+void FreeAllTemporary(void)
+{
+ AllocTempHeader *h = Head;
+ while(h) {
+ AllocTempHeader *f = h;
+ h = h->next;
+ free(f);
+ }
+ Head = NULL;
+}
+
+void *MemAlloc(size_t n) {
+ void *p = malloc(n);
+ if(!p) oops();
+ return p;
+}
+
+void MemFree(void *p) {
+ free(p);
+}
+
+void InitHeaps(void) {
+ /* nothing to do */
+}
+
+};
--- /dev/null
+//-----------------------------------------------------------------------------
+// Utility functions, mostly various kinds of vector math (working on real
+// numbers, not working on quantities in the symbolic algebra system).
+//
+// Copyright 2008-2013 Jonathan Westhues.
+//-----------------------------------------------------------------------------
+#include "solvespace.h"
+
+std::string SolveSpace::ssprintf(const char *fmt, ...)
+{
+ va_list va;
+
+ va_start(va, fmt);
+ int size = vsnprintf(NULL, 0, fmt, va);
+ if(size < 0) oops();
+ va_end(va);
+
+ std::string result;
+ result.resize(size);
+
+ va_start(va, fmt);
+ vsnprintf(&result[0], size + 1, fmt, va);
+ va_end(va);
+
+ return result;
+}
+
+char32_t utf8_iterator::operator*()
+{
+ const uint8_t *it = (const uint8_t*) this->p;
+ char32_t result = *it;
+
+ if((result & 0x80) != 0) {
+ unsigned int mask = 0x40;
+
+ do {
+ result <<= 6;
+ unsigned int c = (*++it);
+ mask <<= 5;
+ result += c - 0x80;
+ } while((result & mask) != 0);
+
+ result &= mask - 1;
+ }
+
+ this->n = (const char*) (it + 1);
+ return result;
+}
+
+bool SolveSpace::FilenameHasExtension(const std::string &str, const char *ext)
+{
+ int i, ls = str.length(), le = strlen(ext);
+
+ if(ls < le) return false;
+
+ for(i = 0; i < le; i++) {
+ if(tolower(ext[le-i-1]) != tolower(str[ls-i-1])) {
+ return false;
+ }
+ }
+ return true;
+}
+
+bool SolveSpace::ReadFile(const std::string &filename, std::string *data)
+{
+ FILE *f = ssfopen(filename.c_str(), "rb");
+ if(f == NULL)
+ return false;
+
+ fseek(f, 0, SEEK_END);
+ data->resize(ftell(f));
+ fseek(f, 0, SEEK_SET);
+ fread(&(*data)[0], 1, data->size(), f);
+ fclose(f);
+
+ return true;
+}
+
+bool SolveSpace::WriteFile(const std::string &filename, const std::string &data)
+{
+ FILE *f = ssfopen(filename.c_str(), "wb");
+ if(f == NULL)
+ return false;
+
+ fwrite(&data[0], 1, data.size(), f);
+ fclose(f);
+
+ return true;
+}
+
+void SolveSpace::MakeMatrix(double *mat,
+ double a11, double a12, double a13, double a14,
+ double a21, double a22, double a23, double a24,
+ double a31, double a32, double a33, double a34,
+ double a41, double a42, double a43, double a44)
+{
+ mat[ 0] = a11;
+ mat[ 1] = a21;
+ mat[ 2] = a31;
+ mat[ 3] = a41;
+ mat[ 4] = a12;
+ mat[ 5] = a22;
+ mat[ 6] = a32;
+ mat[ 7] = a42;
+ mat[ 8] = a13;
+ mat[ 9] = a23;
+ mat[10] = a33;
+ mat[11] = a43;
+ mat[12] = a14;
+ mat[13] = a24;
+ mat[14] = a34;
+ mat[15] = a44;
+}
+
+//-----------------------------------------------------------------------------
+// Word-wrap the string for our message box appropriately, and then display
+// that string.
+//-----------------------------------------------------------------------------
+static void DoStringForMessageBox(const char *str, va_list f, bool error)
+{
+ char inBuf[1024*50];
+ vsprintf(inBuf, str, f);
+
+ char outBuf[1024*50];
+ int i = 0, j = 0, len = 0, longestLen = 47;
+ int rows = 0, cols = 0;
+
+ // Count the width of the longest line that starts with spaces; those
+ // are list items, that should not be split in the middle.
+ bool listLine = false;
+ while(inBuf[i]) {
+ if(inBuf[i] == '\r') {
+ // ignore these
+ } else if(inBuf[i] == ' ' && len == 0) {
+ listLine = true;
+ } else if(inBuf[i] == '\n') {
+ if(listLine) longestLen = max(longestLen, len);
+ len = 0;
+ } else {
+ len++;
+ }
+ i++;
+ }
+ if(listLine) longestLen = max(longestLen, len);
+
+ // Word wrap according to our target line length longestLen.
+ len = 0;
+ i = 0;
+ while(inBuf[i]) {
+ if(inBuf[i] == '\r') {
+ // ignore these
+ } else if(inBuf[i] == '\n') {
+ outBuf[j++] = '\n';
+ if(len == 0) rows++;
+ len = 0;
+ } else if(inBuf[i] == ' ' && len > longestLen) {
+ outBuf[j++] = '\n';
+ len = 0;
+ } else {
+ outBuf[j++] = inBuf[i];
+ // Count rows when we draw the first character; so an empty
+ // row doesn't end up counting.
+ if(len == 0) rows++;
+ len++;
+ }
+ cols = max(cols, len);
+ i++;
+ }
+ outBuf[j++] = '\0';
+
+ // And then display the text with our actual longest line length.
+ DoMessageBox(outBuf, rows, cols, error);
+}
+void SolveSpace::Error(const char *str, ...)
+{
+ va_list f;
+ va_start(f, str);
+ DoStringForMessageBox(str, f, true);
+ va_end(f);
+}
+void SolveSpace::Message(const char *str, ...)
+{
+ va_list f;
+ va_start(f, str);
+ DoStringForMessageBox(str, f, false);
+ va_end(f);
+}
+
+void SolveSpace::CnfFreezeBool(bool v, const std::string &name)
+ { CnfFreezeInt(v ? 1 : 0, name); }
+
+void SolveSpace::CnfFreezeColor(RgbaColor v, const std::string &name)
+ { CnfFreezeInt(v.ToPackedInt(), name); }
+
+bool SolveSpace::CnfThawBool(bool v, const std::string &name)
+ { return CnfThawInt(v ? 1 : 0, name) != 0; }
+
+RgbaColor SolveSpace::CnfThawColor(RgbaColor v, const std::string &name)
+ { return RgbaColor::FromPackedInt(CnfThawInt(v.ToPackedInt(), name)); }
+
+//-----------------------------------------------------------------------------
+// Solve a mostly banded matrix. In a given row, there are LEFT_OF_DIAG
+// elements to the left of the diagonal element, and RIGHT_OF_DIAG elements to
+// the right (so that the total band width is LEFT_OF_DIAG + RIGHT_OF_DIAG + 1).
+// There also may be elements in the last two columns of any row. We solve
+// without pivoting.
+//-----------------------------------------------------------------------------
+void BandedMatrix::Solve(void) {
+ int i, ip, j, jp;
+ double temp;
+
+ // Reduce the matrix to upper triangular form.
+ for(i = 0; i < n; i++) {
+ for(ip = i+1; ip < n && ip <= (i + LEFT_OF_DIAG); ip++) {
+ temp = A[ip][i]/A[i][i];
+
+ for(jp = i; jp < (n - 2) && jp <= (i + RIGHT_OF_DIAG); jp++) {
+ A[ip][jp] -= temp*(A[i][jp]);
+ }
+ A[ip][n-2] -= temp*(A[i][n-2]);
+ A[ip][n-1] -= temp*(A[i][n-1]);
+
+ B[ip] -= temp*B[i];
+ }
+ }
+
+ // And back-substitute.
+ for(i = n - 1; i >= 0; i--) {
+ temp = B[i];
+
+ if(i < n-1) temp -= X[n-1]*A[i][n-1];
+ if(i < n-2) temp -= X[n-2]*A[i][n-2];
+
+ for(j = min(n - 3, i + RIGHT_OF_DIAG); j > i; j--) {
+ temp -= X[j]*A[i][j];
+ }
+ X[i] = temp / A[i][i];
+ }
+}
+
+const Quaternion Quaternion::IDENTITY = { 1, 0, 0, 0 };
+
+Quaternion Quaternion::From(double w, double vx, double vy, double vz) {
+ Quaternion q;
+ q.w = w;
+ q.vx = vx;
+ q.vy = vy;
+ q.vz = vz;
+ return q;
+}
+
+Quaternion Quaternion::From(hParam w, hParam vx, hParam vy, hParam vz) {
+ Quaternion q;
+ q.w = SK.GetParam(w )->val;
+ q.vx = SK.GetParam(vx)->val;
+ q.vy = SK.GetParam(vy)->val;
+ q.vz = SK.GetParam(vz)->val;
+ return q;
+}
+
+Quaternion Quaternion::From(Vector axis, double dtheta) {
+ Quaternion q;
+ double c = cos(dtheta / 2), s = sin(dtheta / 2);
+ axis = axis.WithMagnitude(s);
+ q.w = c;
+ q.vx = axis.x;
+ q.vy = axis.y;
+ q.vz = axis.z;
+ return q;
+}
+
+Quaternion Quaternion::From(Vector u, Vector v)
+{
+ Vector n = u.Cross(v);
+
+ Quaternion q;
+ double s, tr = 1 + u.x + v.y + n.z;
+ if(tr > 1e-4) {
+ s = 2*sqrt(tr);
+ q.w = s/4;
+ q.vx = (v.z - n.y)/s;
+ q.vy = (n.x - u.z)/s;
+ q.vz = (u.y - v.x)/s;
+ } else {
+ if(u.x > v.y && u.x > n.z) {
+ s = 2*sqrt(1 + u.x - v.y - n.z);
+ q.w = (v.z - n.y)/s;
+ q.vx = s/4;
+ q.vy = (u.y + v.x)/s;
+ q.vz = (n.x + u.z)/s;
+ } else if(v.y > n.z) {
+ s = 2*sqrt(1 - u.x + v.y - n.z);
+ q.w = (n.x - u.z)/s;
+ q.vx = (u.y + v.x)/s;
+ q.vy = s/4;
+ q.vz = (v.z + n.y)/s;
+ } else {
+ s = 2*sqrt(1 - u.x - v.y + n.z);
+ q.w = (u.y - v.x)/s;
+ q.vx = (n.x + u.z)/s;
+ q.vy = (v.z + n.y)/s;
+ q.vz = s/4;
+ }
+ }
+
+ return q.WithMagnitude(1);
+}
+
+Quaternion Quaternion::Plus(Quaternion b) {
+ Quaternion q;
+ q.w = w + b.w;
+ q.vx = vx + b.vx;
+ q.vy = vy + b.vy;
+ q.vz = vz + b.vz;
+ return q;
+}
+
+Quaternion Quaternion::Minus(Quaternion b) {
+ Quaternion q;
+ q.w = w - b.w;
+ q.vx = vx - b.vx;
+ q.vy = vy - b.vy;
+ q.vz = vz - b.vz;
+ return q;
+}
+
+Quaternion Quaternion::ScaledBy(double s) {
+ Quaternion q;
+ q.w = w*s;
+ q.vx = vx*s;
+ q.vy = vy*s;
+ q.vz = vz*s;
+ return q;
+}
+
+double Quaternion::Magnitude(void) {
+ return sqrt(w*w + vx*vx + vy*vy + vz*vz);
+}
+
+Quaternion Quaternion::WithMagnitude(double s) {
+ return ScaledBy(s/Magnitude());
+}
+
+Vector Quaternion::RotationU(void) {
+ Vector v;
+ v.x = w*w + vx*vx - vy*vy - vz*vz;
+ v.y = 2*w *vz + 2*vx*vy;
+ v.z = 2*vx*vz - 2*w *vy;
+ return v;
+}
+
+Vector Quaternion::RotationV(void) {
+ Vector v;
+ v.x = 2*vx*vy - 2*w*vz;
+ v.y = w*w - vx*vx + vy*vy - vz*vz;
+ v.z = 2*w*vx + 2*vy*vz;
+ return v;
+}
+
+Vector Quaternion::RotationN(void) {
+ Vector v;
+ v.x = 2*w*vy + 2*vx*vz;
+ v.y = 2*vy*vz - 2*w*vx;
+ v.z = w*w - vx*vx - vy*vy + vz*vz;
+ return v;
+}
+
+Vector Quaternion::Rotate(Vector p) {
+ // Express the point in the new basis
+ return (RotationU().ScaledBy(p.x)).Plus(
+ RotationV().ScaledBy(p.y)).Plus(
+ RotationN().ScaledBy(p.z));
+}
+
+Quaternion Quaternion::Inverse(void) {
+ Quaternion r;
+ r.w = w;
+ r.vx = -vx;
+ r.vy = -vy;
+ r.vz = -vz;
+ return r.WithMagnitude(1); // not that the normalize should be reqd
+}
+
+Quaternion Quaternion::ToThe(double p) {
+ // Avoid division by zero, or arccos of something not in its domain
+ if(w >= (1 - 1e-6)) {
+ return From(1, 0, 0, 0);
+ } else if(w <= (-1 + 1e-6)) {
+ return From(-1, 0, 0, 0);
+ }
+
+ Quaternion r;
+ Vector axis = Vector::From(vx, vy, vz);
+ double theta = acos(w); // okay, since magnitude is 1, so -1 <= w <= 1
+ theta *= p;
+ r.w = cos(theta);
+ axis = axis.WithMagnitude(sin(theta));
+ r.vx = axis.x;
+ r.vy = axis.y;
+ r.vz = axis.z;
+ return r;
+}
+
+Quaternion Quaternion::Times(Quaternion b) {
+ double sa = w, sb = b.w;
+ Vector va = { vx, vy, vz };
+ Vector vb = { b.vx, b.vy, b.vz };
+
+ Quaternion r;
+ r.w = sa*sb - va.Dot(vb);
+ Vector vr = vb.ScaledBy(sa).Plus(
+ va.ScaledBy(sb).Plus(
+ va.Cross(vb)));
+ r.vx = vr.x;
+ r.vy = vr.y;
+ r.vz = vr.z;
+ return r;
+}
+
+Quaternion Quaternion::Mirror(void) {
+ Vector u = RotationU(),
+ v = RotationV();
+ u = u.ScaledBy(-1);
+ v = v.ScaledBy(-1);
+ return Quaternion::From(u, v);
+}
+
+
+Vector Vector::From(double x, double y, double z) {
+ Vector v;
+ v.x = x; v.y = y; v.z = z;
+ return v;
+}
+
+Vector Vector::From(hParam x, hParam y, hParam z) {
+ Vector v;
+ v.x = SK.GetParam(x)->val;
+ v.y = SK.GetParam(y)->val;
+ v.z = SK.GetParam(z)->val;
+ return v;
+}
+
+double Vector::Element(int i) {
+ switch(i) {
+ case 0: return x;
+ case 1: return y;
+ case 2: return z;
+ default: oops();
+ }
+}
+
+bool Vector::Equals(Vector v, double tol) {
+ // Quick axis-aligned tests before going further
+ double dx = v.x - x; if(dx < -tol || dx > tol) return false;
+ double dy = v.y - y; if(dy < -tol || dy > tol) return false;
+ double dz = v.z - z; if(dz < -tol || dz > tol) return false;
+
+ return (this->Minus(v)).MagSquared() < tol*tol;
+}
+
+bool Vector::EqualsExactly(Vector v) {
+ return EXACT(x == v.x &&
+ y == v.y &&
+ z == v.z);
+}
+
+Vector Vector::Plus(Vector b) {
+ Vector r;
+
+ r.x = x + b.x;
+ r.y = y + b.y;
+ r.z = z + b.z;
+
+ return r;
+}
+
+Vector Vector::Minus(Vector b) {
+ Vector r;
+
+ r.x = x - b.x;
+ r.y = y - b.y;
+ r.z = z - b.z;
+
+ return r;
+}
+
+Vector Vector::Negated(void) {
+ Vector r;
+
+ r.x = -x;
+ r.y = -y;
+ r.z = -z;
+
+ return r;
+}
+
+Vector Vector::Cross(Vector b) {
+ Vector r;
+
+ r.x = -(z*b.y) + (y*b.z);
+ r.y = (z*b.x) - (x*b.z);
+ r.z = -(y*b.x) + (x*b.y);
+
+ return r;
+}
+
+double Vector::Dot(Vector b) {
+ return (x*b.x + y*b.y + z*b.z);
+}
+
+double Vector::DirectionCosineWith(Vector b) {
+ Vector a = this->WithMagnitude(1);
+ b = b.WithMagnitude(1);
+ return a.Dot(b);
+}
+
+Vector Vector::Normal(int which) {
+ Vector n;
+
+ // Arbitrarily choose one vector that's normal to us, pivoting
+ // appropriately.
+ double xa = fabs(x), ya = fabs(y), za = fabs(z);
+ if(this->Equals(Vector::From(0, 0, 1))) {
+ // Make DXFs exported in the XY plane work nicely...
+ n = Vector::From(1, 0, 0);
+ } else if(xa < ya && xa < za) {
+ n.x = 0;
+ n.y = z;
+ n.z = -y;
+ } else if(ya < za) {
+ n.x = -z;
+ n.y = 0;
+ n.z = x;
+ } else {
+ n.x = y;
+ n.y = -x;
+ n.z = 0;
+ }
+
+ if(which == 0) {
+ // That's the vector we return.
+ } else if(which == 1) {
+ n = this->Cross(n);
+ } else oops();
+
+ n = n.WithMagnitude(1);
+
+ return n;
+}
+
+Vector Vector::RotatedAbout(Vector orig, Vector axis, double theta) {
+ Vector r = this->Minus(orig);
+ r = r.RotatedAbout(axis, theta);
+ return r.Plus(orig);
+}
+
+Vector Vector::RotatedAbout(Vector axis, double theta) {
+ double c = cos(theta);
+ double s = sin(theta);
+
+ axis = axis.WithMagnitude(1);
+
+ Vector r;
+
+ r.x = (x)*(c + (1 - c)*(axis.x)*(axis.x)) +
+ (y)*((1 - c)*(axis.x)*(axis.y) - s*(axis.z)) +
+ (z)*((1 - c)*(axis.x)*(axis.z) + s*(axis.y));
+
+ r.y = (x)*((1 - c)*(axis.y)*(axis.x) + s*(axis.z)) +
+ (y)*(c + (1 - c)*(axis.y)*(axis.y)) +
+ (z)*((1 - c)*(axis.y)*(axis.z) - s*(axis.x));
+
+ r.z = (x)*((1 - c)*(axis.z)*(axis.x) - s*(axis.y)) +
+ (y)*((1 - c)*(axis.z)*(axis.y) + s*(axis.x)) +
+ (z)*(c + (1 - c)*(axis.z)*(axis.z));
+
+ return r;
+}
+
+Vector Vector::DotInToCsys(Vector u, Vector v, Vector n) {
+ Vector r = {
+ this->Dot(u),
+ this->Dot(v),
+ this->Dot(n)
+ };
+ return r;
+}
+
+Vector Vector::ScaleOutOfCsys(Vector u, Vector v, Vector n) {
+ Vector r = u.ScaledBy(x).Plus(
+ v.ScaledBy(y).Plus(
+ n.ScaledBy(z)));
+ return r;
+}
+
+Vector Vector::InPerspective(Vector u, Vector v, Vector n,
+ Vector origin, double cameraTan)
+{
+ Vector r = this->Minus(origin);
+ r = r.DotInToCsys(u, v, n);
+ // yes, minus; we are assuming a csys where u cross v equals n, backwards
+ // from the display stuff
+ double w = (1 - r.z*cameraTan);
+ r = r.ScaledBy(1/w);
+
+ return r;
+}
+
+double Vector::DistanceToLine(Vector p0, Vector dp) {
+ double m = dp.Magnitude();
+ return ((this->Minus(p0)).Cross(dp)).Magnitude() / m;
+}
+
+bool Vector::OnLineSegment(Vector a, Vector b, double tol) {
+ if(this->Equals(a, tol) || this->Equals(b, tol)) return true;
+
+ Vector d = b.Minus(a);
+
+ double m = d.MagSquared();
+ double distsq = ((this->Minus(a)).Cross(d)).MagSquared() / m;
+
+ if(distsq >= tol*tol) return false;
+
+ double t = (this->Minus(a)).DivPivoting(d);
+ // On-endpoint already tested
+ if(t < 0 || t > 1) return false;
+ return true;
+}
+
+Vector Vector::ClosestPointOnLine(Vector p0, Vector dp) {
+ dp = dp.WithMagnitude(1);
+ // this, p0, and (p0+dp) define a plane; the min distance is in
+ // that plane, so calculate its normal
+ Vector pn = (this->Minus(p0)).Cross(dp);
+ // The minimum distance line is in that plane, perpendicular
+ // to the line
+ Vector n = pn.Cross(dp);
+
+ // Calculate the actual distance
+ double d = (dp.Cross(p0.Minus(*this))).Magnitude();
+ return this->Plus(n.WithMagnitude(d));
+}
+
+double Vector::MagSquared(void) {
+ return x*x + y*y + z*z;
+}
+
+double Vector::Magnitude(void) {
+ return sqrt(x*x + y*y + z*z);
+}
+
+Vector Vector::ScaledBy(double v) {
+ Vector r;
+
+ r.x = x * v;
+ r.y = y * v;
+ r.z = z * v;
+
+ return r;
+}
+
+Vector Vector::WithMagnitude(double v) {
+ double m = Magnitude();
+ if(EXACT(m == 0)) {
+ // We can do a zero vector with zero magnitude, but not any other cases.
+ if(fabs(v) > 1e-100) {
+ dbp("Vector::WithMagnitude(%g) of zero vector!", v);
+ }
+ return From(0, 0, 0);
+ } else {
+ return ScaledBy(v/m);
+ }
+}
+
+Vector Vector::ProjectVectorInto(hEntity wrkpl) {
+ EntityBase *w = SK.GetEntity(wrkpl);
+ Vector u = w->Normal()->NormalU();
+ Vector v = w->Normal()->NormalV();
+
+ double up = this->Dot(u);
+ double vp = this->Dot(v);
+
+ return (u.ScaledBy(up)).Plus(v.ScaledBy(vp));
+}
+
+Vector Vector::ProjectInto(hEntity wrkpl) {
+ EntityBase *w = SK.GetEntity(wrkpl);
+ Vector p0 = w->WorkplaneGetOffset();
+
+ Vector f = this->Minus(p0);
+
+ return p0.Plus(f.ProjectVectorInto(wrkpl));
+}
+
+Point2d Vector::Project2d(Vector u, Vector v) {
+ Point2d p;
+ p.x = this->Dot(u);
+ p.y = this->Dot(v);
+ return p;
+}
+
+Point2d Vector::ProjectXy(void) {
+ Point2d p;
+ p.x = x;
+ p.y = y;
+ return p;
+}
+
+Vector4 Vector::Project4d(void) {
+ return Vector4::From(1, x, y, z);
+}
+
+double Vector::DivPivoting(Vector delta) {
+ double mx = fabs(delta.x), my = fabs(delta.y), mz = fabs(delta.z);
+
+ if(mx > my && mx > mz) {
+ return x/delta.x;
+ } else if(my > mz) {
+ return y/delta.y;
+ } else {
+ return z/delta.z;
+ }
+}
+
+Vector Vector::ClosestOrtho(void) {
+ double mx = fabs(x), my = fabs(y), mz = fabs(z);
+
+ if(mx > my && mx > mz) {
+ return From((x > 0) ? 1 : -1, 0, 0);
+ } else if(my > mz) {
+ return From(0, (y > 0) ? 1 : -1, 0);
+ } else {
+ return From(0, 0, (z > 0) ? 1 : -1);
+ }
+}
+
+Vector Vector::ClampWithin(double minv, double maxv) {
+ Vector ret = *this;
+
+ if(ret.x < minv) ret.x = minv;
+ if(ret.y < minv) ret.y = minv;
+ if(ret.z < minv) ret.z = minv;
+
+ if(ret.x > maxv) ret.x = maxv;
+ if(ret.y > maxv) ret.y = maxv;
+ if(ret.z > maxv) ret.z = maxv;
+
+ return ret;
+}
+
+void Vector::MakeMaxMin(Vector *maxv, Vector *minv) {
+ maxv->x = max(maxv->x, x);
+ maxv->y = max(maxv->y, y);
+ maxv->z = max(maxv->z, z);
+
+ minv->x = min(minv->x, x);
+ minv->y = min(minv->y, y);
+ minv->z = min(minv->z, z);
+}
+
+bool Vector::OutsideAndNotOn(Vector maxv, Vector minv) {
+ return (x > maxv.x + LENGTH_EPS) || (x < minv.x - LENGTH_EPS) ||
+ (y > maxv.y + LENGTH_EPS) || (y < minv.y - LENGTH_EPS) ||
+ (z > maxv.z + LENGTH_EPS) || (z < minv.z - LENGTH_EPS);
+}
+
+bool Vector::BoundingBoxesDisjoint(Vector amax, Vector amin,
+ Vector bmax, Vector bmin)
+{
+ int i;
+ for(i = 0; i < 3; i++) {
+ if(amax.Element(i) < bmin.Element(i) - LENGTH_EPS) return true;
+ if(amin.Element(i) > bmax.Element(i) + LENGTH_EPS) return true;
+ }
+ return false;
+}
+
+bool Vector::BoundingBoxIntersectsLine(Vector amax, Vector amin,
+ Vector p0, Vector p1, bool segment)
+{
+ Vector dp = p1.Minus(p0);
+ double lp = dp.Magnitude();
+ dp = dp.ScaledBy(1.0/lp);
+
+ int i, a;
+ for(i = 0; i < 3; i++) {
+ int j = WRAP(i+1, 3), k = WRAP(i+2, 3);
+ if(lp*fabs(dp.Element(i)) < LENGTH_EPS) continue; // parallel to plane
+
+ for(a = 0; a < 2; a++) {
+ double d = (a == 0) ? amax.Element(i) : amin.Element(i);
+ // n dot (p0 + t*dp) = d
+ // (n dot p0) + t * (n dot dp) = d
+ double t = (d - p0.Element(i)) / dp.Element(i);
+ Vector p = p0.Plus(dp.ScaledBy(t));
+
+ if(segment && (t < -LENGTH_EPS || t > (lp+LENGTH_EPS))) continue;
+
+ if(p.Element(j) > amax.Element(j) + LENGTH_EPS) continue;
+ if(p.Element(k) > amax.Element(k) + LENGTH_EPS) continue;
+
+ if(p.Element(j) < amin.Element(j) - LENGTH_EPS) continue;
+ if(p.Element(k) < amin.Element(k) - LENGTH_EPS) continue;
+
+ return true;
+ }
+ }
+
+ return false;
+}
+
+Vector Vector::AtIntersectionOfPlanes(Vector n1, double d1,
+ Vector n2, double d2)
+{
+ double det = (n1.Dot(n1))*(n2.Dot(n2)) -
+ (n1.Dot(n2))*(n1.Dot(n2));
+ double c1 = (d1*n2.Dot(n2) - d2*n1.Dot(n2))/det;
+ double c2 = (d2*n1.Dot(n1) - d1*n1.Dot(n2))/det;
+
+ return (n1.ScaledBy(c1)).Plus(n2.ScaledBy(c2));
+}
+
+void Vector::ClosestPointBetweenLines(Vector a0, Vector da,
+ Vector b0, Vector db,
+ double *ta, double *tb)
+{
+ // Make a semi-orthogonal coordinate system from those directions;
+ // note that dna and dnb need not be perpendicular.
+ Vector dn = da.Cross(db); // normal to both
+ Vector dna = dn.Cross(da); // normal to da
+ Vector dnb = dn.Cross(db); // normal to db
+
+ // At the intersection of the lines
+ // a0 + pa*da = b0 + pb*db (where pa, pb are scalar params)
+ // So dot this equation against dna and dnb to get two equations
+ // to solve for da and db
+ *tb = ((a0.Minus(b0)).Dot(dna))/(db.Dot(dna));
+ *ta = -((a0.Minus(b0)).Dot(dnb))/(da.Dot(dnb));
+}
+
+Vector Vector::AtIntersectionOfLines(Vector a0, Vector a1,
+ Vector b0, Vector b1,
+ bool *skew,
+ double *parama, double *paramb)
+{
+ Vector da = a1.Minus(a0), db = b1.Minus(b0);
+
+ double pa, pb;
+ Vector::ClosestPointBetweenLines(a0, da, b0, db, &pa, &pb);
+
+ if(parama) *parama = pa;
+ if(paramb) *paramb = pb;
+
+ // And from either of those, we get the intersection point.
+ Vector pi = a0.Plus(da.ScaledBy(pa));
+
+ if(skew) {
+ // Check if the intersection points on each line are actually
+ // coincident...
+ if(pi.Equals(b0.Plus(db.ScaledBy(pb)))) {
+ *skew = false;
+ } else {
+ *skew = true;
+ }
+ }
+ return pi;
+}
+
+Vector Vector::AtIntersectionOfPlaneAndLine(Vector n, double d,
+ Vector p0, Vector p1,
+ bool *parallel)
+{
+ Vector dp = p1.Minus(p0);
+
+ if(fabs(n.Dot(dp)) < LENGTH_EPS) {
+ if(parallel) *parallel = true;
+ return Vector::From(0, 0, 0);
+ }
+
+ if(parallel) *parallel = false;
+
+ // n dot (p0 + t*dp) = d
+ // (n dot p0) + t * (n dot dp) = d
+ double t = (d - n.Dot(p0)) / (n.Dot(dp));
+
+ return p0.Plus(dp.ScaledBy(t));
+}
+
+static double det2(double a1, double b1,
+ double a2, double b2)
+{
+ return (a1*b2) - (b1*a2);
+}
+static double det3(double a1, double b1, double c1,
+ double a2, double b2, double c2,
+ double a3, double b3, double c3)
+{
+ return a1*det2(b2, c2, b3, c3) -
+ b1*det2(a2, c2, a3, c3) +
+ c1*det2(a2, b2, a3, b3);
+}
+Vector Vector::AtIntersectionOfPlanes(Vector na, double da,
+ Vector nb, double db,
+ Vector nc, double dc,
+ bool *parallel)
+{
+ double det = det3(na.x, na.y, na.z,
+ nb.x, nb.y, nb.z,
+ nc.x, nc.y, nc.z);
+ if(fabs(det) < 1e-10) { // arbitrary tolerance, not so good
+ *parallel = true;
+ return Vector::From(0, 0, 0);
+ }
+ *parallel = false;
+
+ double detx = det3(da, na.y, na.z,
+ db, nb.y, nb.z,
+ dc, nc.y, nc.z);
+
+ double dety = det3(na.x, da, na.z,
+ nb.x, db, nb.z,
+ nc.x, dc, nc.z);
+
+ double detz = det3(na.x, na.y, da,
+ nb.x, nb.y, db,
+ nc.x, nc.y, dc );
+
+ return Vector::From(detx/det, dety/det, detz/det);
+}
+
+Vector4 Vector4::From(double w, double x, double y, double z) {
+ Vector4 ret;
+ ret.w = w;
+ ret.x = x;
+ ret.y = y;
+ ret.z = z;
+ return ret;
+}
+
+Vector4 Vector4::From(double w, Vector v) {
+ return Vector4::From(w, w*v.x, w*v.y, w*v.z);
+}
+
+Vector4 Vector4::Blend(Vector4 a, Vector4 b, double t) {
+ return (a.ScaledBy(1 - t)).Plus(b.ScaledBy(t));
+}
+
+Vector4 Vector4::Plus(Vector4 b) {
+ return Vector4::From(w + b.w, x + b.x, y + b.y, z + b.z);
+}
+
+Vector4 Vector4::Minus(Vector4 b) {
+ return Vector4::From(w - b.w, x - b.x, y - b.y, z - b.z);
+}
+
+Vector4 Vector4::ScaledBy(double s) {
+ return Vector4::From(w*s, x*s, y*s, z*s);
+}
+
+Vector Vector4::PerspectiveProject(void) {
+ return Vector::From(x / w, y / w, z / w);
+}
+
+Point2d Point2d::From(double x, double y) {
+ return { x, y };
+}
+
+Point2d Point2d::Plus(const Point2d &b) const {
+ return { x + b.x, y + b.y };
+}
+
+Point2d Point2d::Minus(const Point2d &b) const {
+ return { x - b.x, y - b.y };
+}
+
+Point2d Point2d::ScaledBy(double s) const {
+ return { x * s, y * s };
+}
+
+double Point2d::DivPivoting(Point2d delta) const {
+ if(fabs(delta.x) > fabs(delta.y)) {
+ return x/delta.x;
+ } else {
+ return y/delta.y;
+ }
+}
+
+double Point2d::MagSquared(void) const {
+ return x*x + y*y;
+}
+
+double Point2d::Magnitude(void) const {
+ return sqrt(x*x + y*y);
+}
+
+Point2d Point2d::WithMagnitude(double v) const {
+ double m = Magnitude();
+ if(m < 1e-20) {
+ dbp("!!! WithMagnitude() of zero vector");
+ return { v, 0 };
+ }
+ return { x * v / m, y * v / m };
+}
+
+double Point2d::DistanceTo(const Point2d &p) const {
+ double dx = x - p.x;
+ double dy = y - p.y;
+ return sqrt(dx*dx + dy*dy);
+}
+
+double Point2d::Dot(Point2d p) const {
+ return x*p.x + y*p.y;
+}
+
+double Point2d::DistanceToLine(const Point2d &p0, const Point2d &dp, bool segment) const {
+ double m = dp.x*dp.x + dp.y*dp.y;
+ if(m < LENGTH_EPS*LENGTH_EPS) return VERY_POSITIVE;
+
+ // Let our line be p = p0 + t*dp, for a scalar t from 0 to 1
+ double t = (dp.x*(x - p0.x) + dp.y*(y - p0.y))/m;
+
+ if((t < 0 || t > 1) && segment) {
+ // The closest point is one of the endpoints; determine which.
+ double d0 = DistanceTo(p0);
+ double d1 = DistanceTo(p0.Plus(dp));
+
+ return min(d1, d0);
+ } else {
+ Point2d closest = p0.Plus(dp.ScaledBy(t));
+ return DistanceTo(closest);
+ }
+}
+
+Point2d Point2d::Normal(void) const {
+ return { y, -x };
+}
+
+bool Point2d::Equals(Point2d v, double tol) const {
+ double dx = v.x - x; if(dx < -tol || dx > tol) return false;
+ double dy = v.y - y; if(dy < -tol || dy > tol) return false;
+
+ return (this->Minus(v)).MagSquared() < tol*tol;
+}
+
+BBox BBox::From(const Vector &p0, const Vector &p1) {
+ BBox bbox;
+ bbox.minp.x = min(p0.x, p1.x);
+ bbox.minp.y = min(p0.y, p1.y);
+ bbox.minp.z = min(p0.z, p1.z);
+
+ bbox.maxp.x = max(p0.x, p1.x);
+ bbox.maxp.y = max(p0.y, p1.y);
+ bbox.maxp.z = max(p0.z, p1.z);
+ return bbox;
+}
+
+Vector BBox::GetOrigin() { return minp.Plus(maxp.Minus(minp)).ScaledBy(0.5); }
+Vector BBox::GetExtents() { return maxp.Minus(minp).ScaledBy(0.5); }
+
+void BBox::Include(const Vector &v, double r) {
+ minp.x = min(minp.x, v.x - r);
+ minp.y = min(minp.y, v.y - r);
+ minp.z = min(minp.z, v.z - r);
+
+ maxp.x = max(maxp.x, v.x + r);
+ maxp.y = max(maxp.y, v.y + r);
+ maxp.z = max(maxp.z, v.z + r);
+}
+
+bool BBox::Overlaps(BBox &b1) {
+
+ Vector t = b1.GetOrigin().Minus(GetOrigin());
+ Vector e = b1.GetExtents().Plus(GetExtents());
+
+ return fabs(t.x) < e.x && fabs(t.y) < e.y && fabs(t.z) < e.z;
+}
+
+bool BBox::Contains(const Point2d &p) {
+ return p.x >= minp.x && p.y >= minp.y && p.x <= maxp.x && p.y <= maxp.y;
+}
--- /dev/null
+//-----------------------------------------------------------------------------
+// The View menu, stuff to snap to certain special vews of the model, and to
+// display our current view of the model to the user.
+//
+// Copyright 2008-2013 Jonathan Westhues.
+//-----------------------------------------------------------------------------
+#include "solvespace.h"
+
+void TextWindow::ShowEditView(void) {
+ Printf(true, "%Ft3D VIEW PARAMETERS%E");
+
+ Printf(true, "%Bd %Ftoverall scale factor%E");
+ Printf(false, "%Ba %# px/%s %Fl%Ll%f[edit]%E",
+ SS.GW.scale * SS.MmPerUnit(),
+ SS.UnitName(),
+ &ScreenChangeViewScale);
+ Printf(false, "");
+
+ Printf(false, "%Bd %Ftorigin (maps to center of screen)%E");
+ Printf(false, "%Ba (%s, %s, %s) %Fl%Ll%f[edit]%E",
+ SS.MmToString(-SS.GW.offset.x).c_str(),
+ SS.MmToString(-SS.GW.offset.y).c_str(),
+ SS.MmToString(-SS.GW.offset.z).c_str(),
+ &ScreenChangeViewOrigin);
+ Printf(false, "");
+
+ Vector n = (SS.GW.projRight).Cross(SS.GW.projUp);
+ Printf(false, "%Bd %Ftprojection onto screen%E");
+ Printf(false, "%Ba %Ftright%E (%3, %3, %3) %Fl%Ll%f[edit]%E",
+ CO(SS.GW.projRight),
+ &ScreenChangeViewProjection);
+ Printf(false, "%Bd %Ftup%E (%3, %3, %3)", CO(SS.GW.projUp));
+ Printf(false, "%Ba %Ftout%E (%3, %3, %3)", CO(n));
+ Printf(false, "");
+
+ Printf(false, "The perspective may be changed in the");
+ Printf(false, "configuration screen.");
+}
+
+void TextWindow::ScreenChangeViewScale(int link, uint32_t v) {
+ SS.TW.edit.meaning = EDIT_VIEW_SCALE;
+ SS.TW.ShowEditControl(3, ssprintf("%.3f", SS.GW.scale * SS.MmPerUnit()));
+}
+
+void TextWindow::ScreenChangeViewOrigin(int link, uint32_t v) {
+ std::string edit_value =
+ ssprintf("%s, %s, %s",
+ SS.MmToString(-SS.GW.offset.x).c_str(),
+ SS.MmToString(-SS.GW.offset.y).c_str(),
+ SS.MmToString(-SS.GW.offset.z).c_str());
+
+ SS.TW.edit.meaning = EDIT_VIEW_ORIGIN;
+ SS.TW.ShowEditControl(3, edit_value);
+}
+
+void TextWindow::ScreenChangeViewProjection(int link, uint32_t v) {
+ std::string edit_value =
+ ssprintf("%.3f, %.3f, %.3f", CO(SS.GW.projRight));
+ SS.TW.edit.meaning = EDIT_VIEW_PROJ_RIGHT;
+ SS.TW.ShowEditControl(10, edit_value);
+}
+
+bool TextWindow::EditControlDoneForView(const char *s) {
+ switch(edit.meaning) {
+ case EDIT_VIEW_SCALE: {
+ Expr *e = Expr::From(s, true);
+ if(e) {
+ double v = e->Eval() / SS.MmPerUnit();
+ if(v > LENGTH_EPS) {
+ SS.GW.scale = v;
+ } else {
+ Error("Scale cannot be zero or negative.");
+ }
+ }
+ break;
+ }
+
+ case EDIT_VIEW_ORIGIN: {
+ Vector pt;
+ if(sscanf(s, "%lf, %lf, %lf", &pt.x, &pt.y, &pt.z) == 3) {
+ pt = pt.ScaledBy(SS.MmPerUnit());
+ SS.GW.offset = pt.ScaledBy(-1);
+ } else {
+ Error("Bad format: specify x, y, z");
+ }
+ break;
+ }
+
+ case EDIT_VIEW_PROJ_RIGHT:
+ case EDIT_VIEW_PROJ_UP: {
+ Vector pt;
+ if(sscanf(s, "%lf, %lf, %lf", &pt.x, &pt.y, &pt.z) != 3) {
+ Error("Bad format: specify x, y, z");
+ break;
+ }
+ if(edit.meaning == EDIT_VIEW_PROJ_RIGHT) {
+ SS.GW.projRight = pt;
+ SS.GW.NormalizeProjectionVectors();
+ edit.meaning = EDIT_VIEW_PROJ_UP;
+ HideEditControl();
+ ShowEditControl(10, ssprintf("%.3f, %.3f, %.3f", CO(SS.GW.projUp)),
+ editControl.halfRow + 2);
+ edit.showAgain = true;
+ } else {
+ SS.GW.projUp = pt;
+ SS.GW.NormalizeProjectionVectors();
+ }
+ break;
+ }
+
+ default:
+ return false;
+ }
+ return true;
+}
+
--- /dev/null
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
+<assemblyIdentity
+ version="1.0.0.0"
+ processorArchitecture="X86"
+ name="JonathanWesthues.3dCAD.SolveSpace"
+ type="win32"
+/>
+<description>Parametric 3d CAD tool.</description>
+<dependency>
+ <dependentAssembly>
+ <assemblyIdentity
+ type="win32"
+ name="Microsoft.Windows.Common-Controls"
+ version="6.0.0.0"
+ processorArchitecture="X86"
+ publicKeyToken="6595b64144ccf1df"
+ language="*"
+ />
+ </dependentAssembly>
+</dependency>
+</assembly>
--- /dev/null
+
+// we need a manifest if we want visual styles; put in numbers since somethings a bit screwy
+// with my SDK install (I don't think I've got *.rh right)
+1 24 "manifest.xml"
+
+4000 ICON "icon.ico"
--- /dev/null
+//-----------------------------------------------------------------------------
+// Our WinMain() functions, and Win32-specific stuff to set up our windows
+// and otherwise handle our interface to the operating system. Everything
+// outside win32/... should be standard C++ and gl.
+//
+// Copyright 2008-2013 Jonathan Westhues.
+//-----------------------------------------------------------------------------
+#include <time.h>
+#include <windows.h>
+#include <shellapi.h>
+#include <commctrl.h>
+#include <commdlg.h>
+
+#include "solvespace.h"
+#include "config.h"
+
+#ifdef HAVE_SPACEWARE
+# include <si.h>
+# include <siapp.h>
+# undef uint32_t // thanks but no thanks
+#endif
+
+HINSTANCE Instance;
+
+HWND TextWnd;
+HWND TextWndScrollBar;
+HWND TextEditControl;
+HGLRC TextGl;
+
+HWND GraphicsWnd;
+HGLRC GraphicsGl;
+HWND GraphicsEditControl;
+static struct {
+ int x, y;
+} LastMousePos;
+
+HMENU SubMenus[100];
+HMENU RecentOpenMenu, RecentImportMenu;
+
+HMENU ContextMenu, ContextSubmenu;
+
+int ClientIsSmallerBy;
+
+HFONT FixedFont;
+
+#ifdef HAVE_SPACEWARE
+// The 6-DOF input device.
+SiHdl SpaceNavigator = SI_NO_HANDLE;
+#endif
+
+//-----------------------------------------------------------------------------
+// Routines to display message boxes on screen. Do our own, instead of using
+// MessageBox, because that is not consistent from version to version and
+// there's word wrap problems.
+//-----------------------------------------------------------------------------
+
+HWND MessageWnd, OkButton;
+bool MessageDone;
+int MessageWidth, MessageHeight;
+const char *MessageString;
+
+static LRESULT CALLBACK MessageProc(HWND hwnd, UINT msg, WPARAM wParam,
+ LPARAM lParam)
+{
+ switch (msg) {
+ case WM_COMMAND:
+ if((HWND)lParam == OkButton && wParam == BN_CLICKED) {
+ MessageDone = true;
+ }
+ break;
+
+ case WM_CLOSE:
+ case WM_DESTROY:
+ MessageDone = true;
+ break;
+
+ case WM_PAINT: {
+ PAINTSTRUCT ps;
+ HDC hdc = BeginPaint(hwnd, &ps);
+ SelectObject(hdc, FixedFont);
+ SetTextColor(hdc, 0x000000);
+ SetBkMode(hdc, TRANSPARENT);
+ RECT rc;
+ SetRect(&rc, 10, 10, MessageWidth, MessageHeight);
+ std::wstring text = Widen(MessageString);
+ DrawText(hdc, text.c_str(), text.length(), &rc, DT_LEFT | DT_WORDBREAK);
+ EndPaint(hwnd, &ps);
+ break;
+ }
+
+ default:
+ return DefWindowProc(hwnd, msg, wParam, lParam);
+ }
+
+ return 1;
+}
+
+HWND CreateWindowClient(DWORD exStyle, const wchar_t *className, const wchar_t *windowName,
+ DWORD style, int x, int y, int width, int height, HWND parent,
+ HMENU menu, HINSTANCE instance, void *param)
+{
+ HWND h = CreateWindowExW(exStyle, className, windowName, style, x, y,
+ width, height, parent, menu, instance, param);
+
+ RECT r;
+ GetClientRect(h, &r);
+ width = width - (r.right - width);
+ height = height - (r.bottom - height);
+
+ SetWindowPos(h, HWND_TOP, x, y, width, height, 0);
+
+ return h;
+}
+
+void SolveSpace::DoMessageBox(const char *str, int rows, int cols, bool error)
+{
+ EnableWindow(GraphicsWnd, false);
+ EnableWindow(TextWnd, false);
+
+ // Register the window class for our dialog.
+ WNDCLASSEX wc = {};
+ wc.cbSize = sizeof(wc);
+ wc.style = CS_BYTEALIGNCLIENT | CS_BYTEALIGNWINDOW | CS_OWNDC;
+ wc.lpfnWndProc = (WNDPROC)MessageProc;
+ wc.hInstance = Instance;
+ wc.hbrBackground = (HBRUSH)COLOR_BTNSHADOW;
+ wc.lpszClassName = L"MessageWnd";
+ wc.lpszMenuName = NULL;
+ wc.hCursor = LoadCursor(NULL, IDC_ARROW);
+ wc.hIcon = (HICON)LoadImage(Instance, MAKEINTRESOURCE(4000),
+ IMAGE_ICON, 32, 32, 0);
+ wc.hIconSm = (HICON)LoadImage(Instance, MAKEINTRESOURCE(4000),
+ IMAGE_ICON, 16, 16, 0);
+ RegisterClassEx(&wc);
+
+ // Create the window.
+ MessageString = str;
+ RECT r;
+ GetWindowRect(GraphicsWnd, &r);
+ const char *title = error ? "SolveSpace - Error" : "SolveSpace - Message";
+ int width = cols*SS.TW.CHAR_WIDTH + 20,
+ height = rows*SS.TW.LINE_HEIGHT + 60;
+ MessageWidth = width;
+ MessageHeight = height;
+ MessageWnd = CreateWindowClient(0, L"MessageWnd", Widen(title).c_str(),
+ WS_OVERLAPPED | WS_SYSMENU,
+ r.left + 100, r.top + 100, width, height, NULL, NULL, Instance, NULL);
+
+ OkButton = CreateWindowExW(0, WC_BUTTON, L"OK",
+ WS_CHILD | WS_TABSTOP | WS_CLIPSIBLINGS | WS_VISIBLE | BS_DEFPUSHBUTTON,
+ (width - 70)/2, rows*SS.TW.LINE_HEIGHT + 20,
+ 70, 25, MessageWnd, NULL, Instance, NULL);
+ SendMessage(OkButton, WM_SETFONT, (WPARAM)FixedFont, true);
+
+ ShowWindow(MessageWnd, true);
+ SetFocus(OkButton);
+
+ MSG msg;
+ DWORD ret;
+ MessageDone = false;
+ while((ret = GetMessage(&msg, NULL, 0, 0)) != 0 && !MessageDone) {
+ if((msg.message == WM_KEYDOWN &&
+ (msg.wParam == VK_RETURN ||
+ msg.wParam == VK_ESCAPE)) ||
+ (msg.message == WM_KEYUP &&
+ (msg.wParam == VK_SPACE)))
+ {
+ MessageDone = true;
+ break;
+ }
+
+ TranslateMessage(&msg);
+ DispatchMessage(&msg);
+ }
+
+ MessageString = NULL;
+ EnableWindow(TextWnd, true);
+ EnableWindow(GraphicsWnd, true);
+ SetForegroundWindow(GraphicsWnd);
+ DestroyWindow(MessageWnd);
+}
+
+void SolveSpace::AddContextMenuItem(const char *label, int id)
+{
+ if(!ContextMenu) ContextMenu = CreatePopupMenu();
+
+ if(id == CONTEXT_SUBMENU) {
+ AppendMenuW(ContextMenu, MF_STRING | MF_POPUP,
+ (UINT_PTR)ContextSubmenu, Widen(label).c_str());
+ ContextSubmenu = NULL;
+ } else {
+ HMENU m = ContextSubmenu ? ContextSubmenu : ContextMenu;
+ if(id == CONTEXT_SEPARATOR) {
+ AppendMenuW(m, MF_SEPARATOR, 0, L"");
+ } else {
+ AppendMenuW(m, MF_STRING, id, Widen(label).c_str());
+ }
+ }
+}
+
+void SolveSpace::CreateContextSubmenu(void)
+{
+ ContextSubmenu = CreatePopupMenu();
+}
+
+int SolveSpace::ShowContextMenu(void)
+{
+ POINT p;
+ GetCursorPos(&p);
+ int r = TrackPopupMenu(ContextMenu,
+ TPM_RIGHTBUTTON | TPM_RETURNCMD | TPM_TOPALIGN,
+ p.x, p.y, 0, GraphicsWnd, NULL);
+
+ DestroyMenu(ContextMenu);
+ ContextMenu = NULL;
+ return r;
+}
+
+void CALLBACK TimerCallback(HWND hwnd, UINT msg, UINT_PTR id, DWORD time)
+{
+ // The timer is periodic, so needs to be killed explicitly.
+ KillTimer(GraphicsWnd, 1);
+ SS.GW.TimerCallback();
+ SS.TW.TimerCallback();
+}
+void SolveSpace::SetTimerFor(int milliseconds)
+{
+ SetTimer(GraphicsWnd, 1, milliseconds, TimerCallback);
+}
+
+void SolveSpace::ScheduleLater()
+{
+}
+
+static void CALLBACK AutosaveCallback(HWND hwnd, UINT msg, UINT_PTR id, DWORD time)
+{
+ KillTimer(GraphicsWnd, 1);
+ SS.Autosave();
+}
+
+void SolveSpace::SetAutosaveTimerFor(int minutes)
+{
+ SetTimer(GraphicsWnd, 2, minutes * 60 * 1000, AutosaveCallback);
+}
+
+static void GetWindowSize(HWND hwnd, int *w, int *h)
+{
+ RECT r;
+ GetClientRect(hwnd, &r);
+ *w = r.right - r.left;
+ *h = r.bottom - r.top;
+}
+void SolveSpace::GetGraphicsWindowSize(int *w, int *h)
+{
+ GetWindowSize(GraphicsWnd, w, h);
+}
+void SolveSpace::GetTextWindowSize(int *w, int *h)
+{
+ GetWindowSize(TextWnd, w, h);
+}
+
+void SolveSpace::OpenWebsite(const char *url) {
+ ShellExecuteW(GraphicsWnd, L"open", Widen(url).c_str(), NULL, NULL, SW_SHOWNORMAL);
+}
+
+void SolveSpace::ExitNow(void) {
+ PostQuitMessage(0);
+}
+
+//-----------------------------------------------------------------------------
+// Helpers so that we can read/write registry keys from the platform-
+// independent code.
+//-----------------------------------------------------------------------------
+inline int CLAMP(int v, int a, int b) {
+ // Clamp it to the range [a, b]
+ if(v <= a) return a;
+ if(v >= b) return b;
+ return v;
+}
+
+static HKEY GetRegistryKey()
+{
+ HKEY Software;
+ if(RegOpenKeyExW(HKEY_CURRENT_USER, L"Software", 0,
+ KEY_ALL_ACCESS, &Software) != ERROR_SUCCESS)
+ return NULL;
+
+ HKEY SolveSpace;
+ if(RegCreateKeyExW(Software, L"SolveSpace", 0, NULL, 0,
+ KEY_ALL_ACCESS, NULL, &SolveSpace, NULL) != ERROR_SUCCESS)
+ return NULL;
+
+ RegCloseKey(Software);
+
+ return SolveSpace;
+}
+
+void SolveSpace::CnfFreezeInt(uint32_t val, const std::string &name)
+{
+ HKEY SolveSpace = GetRegistryKey();
+ RegSetValueExW(SolveSpace, &Widen(name)[0], 0,
+ REG_DWORD, (const BYTE*) &val, sizeof(DWORD));
+ RegCloseKey(SolveSpace);
+}
+void SolveSpace::CnfFreezeFloat(float val, const std::string &name)
+{
+ static_assert(sizeof(float) == sizeof(DWORD),
+ "sizes of float and DWORD must match");
+ HKEY SolveSpace = GetRegistryKey();
+ RegSetValueExW(SolveSpace, &Widen(name)[0], 0,
+ REG_DWORD, (const BYTE*) &val, sizeof(DWORD));
+ RegCloseKey(SolveSpace);
+}
+void SolveSpace::CnfFreezeString(const std::string &str, const std::string &name)
+{
+ HKEY SolveSpace = GetRegistryKey();
+ std::wstring strW = Widen(str);
+ RegSetValueExW(SolveSpace, &Widen(name)[0], 0,
+ REG_SZ, (const BYTE*) &strW[0], (strW.length() + 1) * 2);
+ RegCloseKey(SolveSpace);
+}
+static void FreezeWindowPos(HWND hwnd, const std::string &name)
+{
+ RECT r;
+ GetWindowRect(hwnd, &r);
+ CnfFreezeInt(r.left, name + "_left");
+ CnfFreezeInt(r.right, name + "_right");
+ CnfFreezeInt(r.top, name + "_top");
+ CnfFreezeInt(r.bottom, name + "_bottom");
+
+ CnfFreezeInt(IsZoomed(hwnd), name + "_maximized");
+}
+
+uint32_t SolveSpace::CnfThawInt(uint32_t val, const std::string &name)
+{
+ HKEY SolveSpace = GetRegistryKey();
+ DWORD type, newval, len = sizeof(DWORD);
+ LONG result = RegQueryValueEx(SolveSpace, &Widen(name)[0], NULL,
+ &type, (BYTE*) &newval, &len);
+ RegCloseKey(SolveSpace);
+
+ if(result == ERROR_SUCCESS && type == REG_DWORD)
+ return newval;
+ else
+ return val;
+}
+float SolveSpace::CnfThawFloat(float val, const std::string &name)
+{
+ HKEY SolveSpace = GetRegistryKey();
+ DWORD type, len = sizeof(DWORD);
+ float newval;
+ LONG result = RegQueryValueExW(SolveSpace, &Widen(name)[0], NULL,
+ &type, (BYTE*) &newval, &len);
+ RegCloseKey(SolveSpace);
+
+ if(result == ERROR_SUCCESS && type == REG_DWORD)
+ return newval;
+ else
+ return val;
+}
+std::string SolveSpace::CnfThawString(const std::string &val, const std::string &name)
+{
+ HKEY SolveSpace = GetRegistryKey();
+ DWORD type, len;
+ if(RegQueryValueExW(SolveSpace, &Widen(name)[0], NULL,
+ &type, NULL, &len) != ERROR_SUCCESS || type != REG_SZ) {
+ RegCloseKey(SolveSpace);
+ return val;
+ }
+
+ std::wstring newval;
+ newval.resize(len / 2 - 1);
+ if(RegQueryValueExW(SolveSpace, &Widen(name)[0], NULL,
+ NULL, (BYTE*) &newval[0], &len) != ERROR_SUCCESS) {
+ RegCloseKey(SolveSpace);
+ return val;
+ }
+
+ RegCloseKey(SolveSpace);
+ return Narrow(newval);
+}
+static void ThawWindowPos(HWND hwnd, const std::string &name)
+{
+ RECT r;
+ GetWindowRect(hwnd, &r);
+ r.left = CnfThawInt(r.left, name + "_left");
+ r.right = CnfThawInt(r.right, name + "_right");
+ r.top = CnfThawInt(r.top, name + "_top");
+ r.bottom = CnfThawInt(r.bottom, name + "_bottom");
+
+ HMONITOR hMonitor = MonitorFromRect(&r, MONITOR_DEFAULTTONEAREST);;
+ MONITORINFO mi;
+ mi.cbSize = sizeof(mi);
+ GetMonitorInfo(hMonitor, &mi);
+
+ // If it somehow ended up off-screen, then put it back.
+ RECT dr = mi.rcMonitor;
+ r.left = CLAMP(r.left, dr.left, dr.right);
+ r.right = CLAMP(r.right, dr.left, dr.right);
+ r.top = CLAMP(r.top, dr.top, dr.bottom);
+ r.bottom = CLAMP(r.bottom, dr.top, dr.bottom);
+ MoveWindow(hwnd, r.left, r.top, r.right - r.left, r.bottom - r.top, TRUE);
+
+ if(CnfThawInt(FALSE, name + "_maximized"))
+ ShowWindow(hwnd, SW_MAXIMIZE);
+}
+
+void SolveSpace::SetCurrentFilename(const std::string &filename) {
+ if(!filename.empty()) {
+ SetWindowTextW(GraphicsWnd, Widen("SolveSpace - " + filename).c_str());
+ } else {
+ SetWindowTextW(GraphicsWnd, L"SolveSpace - (not yet saved)");
+ }
+}
+
+void SolveSpace::SetMousePointerToHand(bool yes) {
+ SetCursor(LoadCursor(NULL, yes ? IDC_HAND : IDC_ARROW));
+}
+
+static void PaintTextWnd(HDC hdc)
+{
+ wglMakeCurrent(GetDC(TextWnd), TextGl);
+
+ SS.TW.Paint();
+ SwapBuffers(GetDC(TextWnd));
+
+ // Leave the graphics window context active, except when we're painting
+ // this text window.
+ wglMakeCurrent(GetDC(GraphicsWnd), GraphicsGl);
+}
+
+void SolveSpace::MoveTextScrollbarTo(int pos, int maxPos, int page)
+{
+ SCROLLINFO si = {};
+ si.cbSize = sizeof(si);
+ si.fMask = SIF_DISABLENOSCROLL | SIF_ALL;
+ si.nMin = 0;
+ si.nMax = maxPos;
+ si.nPos = pos;
+ si.nPage = page;
+ SetScrollInfo(TextWndScrollBar, SB_CTL, &si, true);
+}
+
+void HandleTextWindowScrollBar(WPARAM wParam, LPARAM lParam)
+{
+ int maxPos, minPos, pos;
+ GetScrollRange(TextWndScrollBar, SB_CTL, &minPos, &maxPos);
+ pos = GetScrollPos(TextWndScrollBar, SB_CTL);
+
+ switch(LOWORD(wParam)) {
+ case SB_LINEUP: pos--; break;
+ case SB_PAGEUP: pos -= 4; break;
+
+ case SB_LINEDOWN: pos++; break;
+ case SB_PAGEDOWN: pos += 4; break;
+
+ case SB_TOP: pos = 0; break;
+
+ case SB_BOTTOM: pos = maxPos; break;
+
+ case SB_THUMBTRACK:
+ case SB_THUMBPOSITION: pos = HIWORD(wParam); break;
+ }
+
+ SS.TW.ScrollbarEvent(pos);
+}
+
+static void MouseWheel(int thisDelta) {
+ static int DeltaAccum;
+ int delta = 0;
+ // Handle mouse deltas of less than 120 (like from an un-detented mouse
+ // wheel) correctly, even though no one ever uses those.
+ DeltaAccum += thisDelta;
+ while(DeltaAccum >= 120) {
+ DeltaAccum -= 120;
+ delta += 120;
+ }
+ while(DeltaAccum <= -120) {
+ DeltaAccum += 120;
+ delta -= 120;
+ }
+ if(delta == 0) return;
+
+ POINT pt;
+ GetCursorPos(&pt);
+ HWND hw = WindowFromPoint(pt);
+
+ // Make the mousewheel work according to which window the mouse is
+ // over, not according to which window is active.
+ bool inTextWindow;
+ if(hw == TextWnd) {
+ inTextWindow = true;
+ } else if(hw == GraphicsWnd) {
+ inTextWindow = false;
+ } else if(GetForegroundWindow() == TextWnd) {
+ inTextWindow = true;
+ } else {
+ inTextWindow = false;
+ }
+
+ if(inTextWindow) {
+ int i;
+ for(i = 0; i < abs(delta/40); i++) {
+ HandleTextWindowScrollBar(delta > 0 ? SB_LINEUP : SB_LINEDOWN, 0);
+ }
+ } else {
+ SS.GW.MouseScroll(LastMousePos.x, LastMousePos.y, delta);
+ }
+}
+
+LRESULT CALLBACK TextWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
+{
+ switch (msg) {
+ case WM_ERASEBKGND:
+ break;
+
+ case WM_CLOSE:
+ case WM_DESTROY:
+ SolveSpaceUI::MenuFile(GraphicsWindow::MNU_EXIT);
+ break;
+
+ case WM_PAINT: {
+ // Actually paint the text window, with gl.
+ PaintTextWnd(GetDC(TextWnd));
+ // And then just make Windows happy.
+ PAINTSTRUCT ps;
+ HDC hdc = BeginPaint(hwnd, &ps);
+ EndPaint(hwnd, &ps);
+ break;
+ }
+
+ case WM_SIZING: {
+ RECT *r = (RECT *)lParam;
+ int hc = (r->bottom - r->top) - ClientIsSmallerBy;
+ int extra = hc % (SS.TW.LINE_HEIGHT/2);
+ switch(wParam) {
+ case WMSZ_BOTTOM:
+ case WMSZ_BOTTOMLEFT:
+ case WMSZ_BOTTOMRIGHT:
+ r->bottom -= extra;
+ break;
+
+ case WMSZ_TOP:
+ case WMSZ_TOPLEFT:
+ case WMSZ_TOPRIGHT:
+ r->top += extra;
+ break;
+ }
+ int tooNarrow = (SS.TW.MIN_COLS*SS.TW.CHAR_WIDTH) -
+ (r->right - r->left);
+ if(tooNarrow >= 0) {
+ switch(wParam) {
+ case WMSZ_RIGHT:
+ case WMSZ_BOTTOMRIGHT:
+ case WMSZ_TOPRIGHT:
+ r->right += tooNarrow;
+ break;
+
+ case WMSZ_LEFT:
+ case WMSZ_BOTTOMLEFT:
+ case WMSZ_TOPLEFT:
+ r->left -= tooNarrow;
+ break;
+ }
+ }
+ break;
+ }
+
+ case WM_MOUSELEAVE:
+ SS.TW.MouseLeave();
+ break;
+
+ case WM_LBUTTONDOWN:
+ case WM_MOUSEMOVE: {
+ // We need this in order to get the WM_MOUSELEAVE
+ TRACKMOUSEEVENT tme = {};
+ tme.cbSize = sizeof(tme);
+ tme.dwFlags = TME_LEAVE;
+ tme.hwndTrack = TextWnd;
+ TrackMouseEvent(&tme);
+
+ // And process the actual message
+ int x = LOWORD(lParam);
+ int y = HIWORD(lParam);
+ SS.TW.MouseEvent(msg == WM_LBUTTONDOWN, wParam & MK_LBUTTON, x, y);
+ break;
+ }
+
+ case WM_SIZE: {
+ RECT r;
+ GetWindowRect(TextWndScrollBar, &r);
+ int sw = r.right - r.left;
+ GetClientRect(hwnd, &r);
+ MoveWindow(TextWndScrollBar, r.right - sw, r.top, sw,
+ (r.bottom - r.top), true);
+ // If the window is growing, then the scrollbar position may
+ // be moving, so it's as if we're dragging the scrollbar.
+ HandleTextWindowScrollBar((WPARAM)-1, -1);
+ InvalidateRect(TextWnd, NULL, false);
+ break;
+ }
+
+ case WM_MOUSEWHEEL:
+ MouseWheel(GET_WHEEL_DELTA_WPARAM(wParam));
+ break;
+
+ case WM_VSCROLL:
+ HandleTextWindowScrollBar(wParam, lParam);
+ break;
+
+ default:
+ return DefWindowProc(hwnd, msg, wParam, lParam);
+ }
+
+ return 1;
+}
+
+static std::string EditControlText(HWND hwnd)
+{
+ std::wstring result;
+ result.resize(GetWindowTextLength(hwnd));
+ GetWindowTextW(hwnd, &result[0], result.length() + 1);
+ return Narrow(result);
+}
+
+static bool ProcessKeyDown(WPARAM wParam)
+{
+ if(GraphicsEditControlIsVisible() && wParam != VK_ESCAPE) {
+ if(wParam == VK_RETURN) {
+ SS.GW.EditControlDone(EditControlText(GraphicsEditControl).c_str());
+ return true;
+ } else {
+ return false;
+ }
+ }
+ if(TextEditControlIsVisible() && wParam != VK_ESCAPE) {
+ if(wParam == VK_RETURN) {
+ SS.TW.EditControlDone(EditControlText(TextEditControl).c_str());
+ } else {
+ return false;
+ }
+ }
+
+ int c;
+ switch(wParam) {
+ case VK_OEM_PLUS: c = '+'; break;
+ case VK_OEM_MINUS: c = '-'; break;
+ case VK_ESCAPE: c = 27; break;
+ case VK_OEM_1: c = ';'; break;
+ case VK_OEM_3: c = '`'; break;
+ case VK_OEM_4: c = '['; break;
+ case VK_OEM_6: c = ']'; break;
+ case VK_OEM_5: c = '\\'; break;
+ case VK_OEM_PERIOD: c = '.'; break;
+ case VK_SPACE: c = ' '; break;
+ case VK_DELETE: c = 127; break;
+ case VK_TAB: c = '\t'; break;
+
+ case VK_BROWSER_BACK:
+ case VK_BACK: c = '\b'; break;
+
+ case VK_F1:
+ case VK_F2:
+ case VK_F3:
+ case VK_F4:
+ case VK_F5:
+ case VK_F6:
+ case VK_F7:
+ case VK_F8:
+ case VK_F9:
+ case VK_F10:
+ case VK_F11:
+ case VK_F12: c = ((int)wParam - VK_F1) + 0xf1; break;
+
+ // These overlap with some character codes that I'm using, so
+ // don't let them trigger by accident.
+ case VK_F16:
+ case VK_INSERT:
+ case VK_EXECUTE:
+ case VK_APPS:
+ case VK_LWIN:
+ case VK_RWIN: return false;
+
+ default:
+ c = (int)wParam;
+ break;
+ }
+ if(GetAsyncKeyState(VK_SHIFT) & 0x8000) c |= GraphicsWindow::SHIFT_MASK;
+ if(GetAsyncKeyState(VK_CONTROL) & 0x8000) c |= GraphicsWindow::CTRL_MASK;
+
+ switch(c) {
+ case GraphicsWindow::SHIFT_MASK | '.': c = '>'; break;
+ }
+
+ for(int i = 0; SS.GW.menu[i].level >= 0; i++) {
+ if(c == SS.GW.menu[i].accel) {
+ (SS.GW.menu[i].fn)((GraphicsWindow::MenuId)SS.GW.menu[i].id);
+ break;
+ }
+ }
+
+ if(SS.GW.KeyDown(c)) return true;
+
+ // No accelerator; process the key as normal.
+ return false;
+}
+
+void SolveSpace::ToggleMenuBar(void)
+{
+ // Implement me
+}
+bool SolveSpace::MenuBarIsVisible(void)
+{
+ // Implement me
+ return true;
+}
+
+void SolveSpace::ShowTextWindow(bool visible)
+{
+ ShowWindow(TextWnd, visible ? SW_SHOWNOACTIVATE : SW_HIDE);
+}
+
+static void CreateGlContext(HWND hwnd, HGLRC *glrc)
+{
+ HDC hdc = GetDC(hwnd);
+
+ PIXELFORMATDESCRIPTOR pfd = {};
+ int pixelFormat;
+
+ pfd.nSize = sizeof(PIXELFORMATDESCRIPTOR);
+ pfd.nVersion = 1;
+ pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL |
+ PFD_DOUBLEBUFFER;
+ pfd.dwLayerMask = PFD_MAIN_PLANE;
+ pfd.iPixelType = PFD_TYPE_RGBA;
+ pfd.cColorBits = 32;
+ pfd.cDepthBits = 24;
+ pfd.cAccumBits = 0;
+ pfd.cStencilBits = 0;
+
+ pixelFormat = ChoosePixelFormat(hdc, &pfd);
+ if(!pixelFormat) oops();
+
+ if(!SetPixelFormat(hdc, pixelFormat, &pfd)) oops();
+
+ *glrc = wglCreateContext(hdc);
+ wglMakeCurrent(hdc, *glrc);
+}
+
+void SolveSpace::PaintGraphics(void)
+{
+ SS.GW.Paint();
+ SwapBuffers(GetDC(GraphicsWnd));
+}
+void SolveSpace::InvalidateGraphics(void)
+{
+ InvalidateRect(GraphicsWnd, NULL, false);
+}
+
+void SolveSpace::ToggleFullScreen(void)
+{
+ // Implement me
+}
+bool SolveSpace::FullScreenIsActive(void)
+{
+ // Implement me
+ return false;
+}
+
+int64_t SolveSpace::GetMilliseconds(void)
+{
+ LARGE_INTEGER t, f;
+ QueryPerformanceCounter(&t);
+ QueryPerformanceFrequency(&f);
+ LONGLONG d = t.QuadPart/(f.QuadPart/1000);
+ return (int64_t)d;
+}
+
+int64_t SolveSpace::GetUnixTime(void)
+{
+#ifdef __MINGW32__
+ time_t ret;
+ time(&ret);
+#else
+ __time64_t ret;
+ _time64(&ret);
+#endif
+ return (int64_t)ret;
+}
+
+void SolveSpace::InvalidateText(void)
+{
+ InvalidateRect(TextWnd, NULL, false);
+}
+
+static void ShowEditControl(HWND h, int x, int y, int fontHeight, int minWidthChars,
+ bool isMonospace, const std::wstring &s) {
+ static HFONT hf;
+ if(hf) DeleteObject(hf);
+ hf = CreateFontW(-fontHeight, 0, 0, 0,
+ FW_REGULAR, false, false, false, ANSI_CHARSET,
+ OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
+ DEFAULT_QUALITY, FF_DONTCARE, isMonospace ? L"Lucida Console" : L"Arial");
+ if(hf) SendMessage(h, WM_SETFONT, (WPARAM)hf, false);
+ else SendMessage(h, WM_SETFONT, (WPARAM)(HFONT)GetStockObject(SYSTEM_FONT), false);
+ SendMessage(h, EM_SETMARGINS, EC_LEFTMARGIN|EC_RIGHTMARGIN, 0);
+
+ HDC hdc = GetDC(h);
+ TEXTMETRICW tm;
+ SIZE ts;
+ SelectObject(hdc, hf);
+ GetTextMetrics(hdc, &tm);
+ GetTextExtentPoint32W(hdc, s.c_str(), s.length(), &ts);
+ ReleaseDC(h, hdc);
+
+ RECT rc;
+ rc.left = x;
+ rc.top = y - tm.tmAscent;
+ // Add one extra char width to avoid scrolling.
+ rc.right = x + std::max(tm.tmAveCharWidth * minWidthChars,
+ ts.cx + tm.tmAveCharWidth);
+ rc.bottom = y + tm.tmDescent;
+
+ AdjustWindowRectEx(&rc, 0, false, WS_EX_CLIENTEDGE);
+ MoveWindow(h, rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top, true);
+ ShowWindow(h, SW_SHOW);
+ if(!s.empty()) {
+ SendMessage(h, WM_SETTEXT, 0, (LPARAM)s.c_str());
+ SendMessage(h, EM_SETSEL, 0, s.length());
+ SetFocus(h);
+ }
+}
+void SolveSpace::ShowTextEditControl(int x, int y, const std::string &str)
+{
+ if(GraphicsEditControlIsVisible()) return;
+
+ ShowEditControl(TextEditControl, x, y, TextWindow::CHAR_HEIGHT, 30,
+ /*isMonospace=*/true, Widen(str));
+}
+void SolveSpace::HideTextEditControl(void)
+{
+ ShowWindow(TextEditControl, SW_HIDE);
+}
+bool SolveSpace::TextEditControlIsVisible(void)
+{
+ return IsWindowVisible(TextEditControl) ? true : false;
+}
+void SolveSpace::ShowGraphicsEditControl(int x, int y, int fontHeight, int minWidthChars,
+ const std::string &str)
+{
+ if(GraphicsEditControlIsVisible()) return;
+
+ RECT r;
+ GetClientRect(GraphicsWnd, &r);
+ x = x + (r.right - r.left)/2;
+ y = (r.bottom - r.top)/2 - y;
+
+ ShowEditControl(GraphicsEditControl, x, y, fontHeight, minWidthChars,
+ /*isMonospace=*/false, Widen(str));
+}
+void SolveSpace::HideGraphicsEditControl(void)
+{
+ ShowWindow(GraphicsEditControl, SW_HIDE);
+}
+bool SolveSpace::GraphicsEditControlIsVisible(void)
+{
+ return IsWindowVisible(GraphicsEditControl) ? true : false;
+}
+
+LRESULT CALLBACK GraphicsWndProc(HWND hwnd, UINT msg, WPARAM wParam,
+ LPARAM lParam)
+{
+ switch (msg) {
+ case WM_ERASEBKGND:
+ break;
+
+ case WM_SIZE:
+ InvalidateRect(GraphicsWnd, NULL, false);
+ break;
+
+ case WM_PAINT: {
+ // Actually paint the window, with gl.
+ PaintGraphics();
+ // And make Windows happy.
+ PAINTSTRUCT ps;
+ HDC hdc = BeginPaint(hwnd, &ps);
+ EndPaint(hwnd, &ps);
+ break;
+ }
+
+ case WM_MOUSELEAVE:
+ SS.GW.MouseLeave();
+ break;
+
+ case WM_MOUSEMOVE:
+ case WM_LBUTTONDOWN:
+ case WM_LBUTTONUP:
+ case WM_LBUTTONDBLCLK:
+ case WM_RBUTTONDOWN:
+ case WM_RBUTTONUP:
+ case WM_MBUTTONDOWN: {
+ int x = LOWORD(lParam);
+ int y = HIWORD(lParam);
+
+ // We need this in order to get the WM_MOUSELEAVE
+ TRACKMOUSEEVENT tme = {};
+ tme.cbSize = sizeof(tme);
+ tme.dwFlags = TME_LEAVE;
+ tme.hwndTrack = GraphicsWnd;
+ TrackMouseEvent(&tme);
+
+ // Convert to xy (vs. ij) style coordinates, with (0, 0) at center
+ RECT r;
+ GetClientRect(GraphicsWnd, &r);
+ x = x - (r.right - r.left)/2;
+ y = (r.bottom - r.top)/2 - y;
+
+ LastMousePos.x = x;
+ LastMousePos.y = y;
+
+ if(msg == WM_LBUTTONDOWN) {
+ SS.GW.MouseLeftDown(x, y);
+ } else if(msg == WM_LBUTTONUP) {
+ SS.GW.MouseLeftUp(x, y);
+ } else if(msg == WM_LBUTTONDBLCLK) {
+ SS.GW.MouseLeftDoubleClick(x, y);
+ } else if(msg == WM_MBUTTONDOWN || msg == WM_RBUTTONDOWN) {
+ SS.GW.MouseMiddleOrRightDown(x, y);
+ } else if(msg == WM_RBUTTONUP) {
+ SS.GW.MouseRightUp(x, y);
+ } else if(msg == WM_MOUSEMOVE) {
+ SS.GW.MouseMoved(x, y,
+ !!(wParam & MK_LBUTTON),
+ !!(wParam & MK_MBUTTON),
+ !!(wParam & MK_RBUTTON),
+ !!(wParam & MK_SHIFT),
+ !!(wParam & MK_CONTROL));
+ } else {
+ oops();
+ }
+ break;
+ }
+ case WM_MOUSEWHEEL:
+ MouseWheel(GET_WHEEL_DELTA_WPARAM(wParam));
+ break;
+
+ case WM_COMMAND: {
+ if(HIWORD(wParam) == 0) {
+ int id = LOWORD(wParam);
+ if((id >= RECENT_OPEN && id < (RECENT_OPEN + MAX_RECENT))) {
+ SolveSpaceUI::MenuFile(id);
+ break;
+ }
+ if((id >= RECENT_LINK && id < (RECENT_LINK + MAX_RECENT))) {
+ Group::MenuGroup(id);
+ break;
+ }
+ int i;
+ for(i = 0; SS.GW.menu[i].level >= 0; i++) {
+ if(id == SS.GW.menu[i].id) {
+ (SS.GW.menu[i].fn)((GraphicsWindow::MenuId)id);
+ break;
+ }
+ }
+ if(SS.GW.menu[i].level < 0) oops();
+ }
+ break;
+ }
+
+ case WM_CLOSE:
+ case WM_DESTROY:
+ SolveSpaceUI::MenuFile(GraphicsWindow::MNU_EXIT);
+ return 1;
+
+ default:
+ return DefWindowProc(hwnd, msg, wParam, lParam);
+ }
+
+ return 1;
+}
+
+//-----------------------------------------------------------------------------
+// Common dialog routines, to open or save a file.
+//-----------------------------------------------------------------------------
+static std::string ConvertFilters(const FileFilter ssFilters[]) {
+ std::string filter;
+ for(const FileFilter *ssFilter = ssFilters; ssFilter->name; ssFilter++) {
+ std::string desc, patterns;
+ for(const char *const *ssPattern = ssFilter->patterns; *ssPattern; ssPattern++) {
+ std::string pattern = "*." + std::string(*ssPattern);
+ if(desc == "")
+ desc = pattern;
+ else
+ desc += ", " + pattern;
+ if(patterns == "")
+ patterns = pattern;
+ else
+ patterns += ";" + pattern;
+ }
+ filter += std::string(ssFilter->name) + " (" + desc + ")" + '\0';
+ filter += patterns + '\0';
+ }
+ filter += '\0';
+ return filter;
+}
+
+static bool OpenSaveFile(bool isOpen, std::string *filename, const std::string &defExtension,
+ const FileFilter filters[]) {
+ // UNC paths may be as long as 32767 characters.
+ // Unfortunately, the Get*FileName API does not provide any way to use it
+ // except with a preallocated buffer of fixed size, so we use something
+ // reasonably large.
+ const int len = 32768;
+ wchar_t filenameC[len] = {};
+ wcsncpy(filenameC, Widen(*filename).c_str(), len - 1);
+
+ std::wstring selPatternW = Widen(ConvertFilters(filters));
+ std::wstring defExtensionW = Widen(defExtension);
+
+ OPENFILENAME ofn = {};
+ ofn.lStructSize = sizeof(ofn);
+ ofn.hInstance = Instance;
+ ofn.hwndOwner = GraphicsWnd;
+ ofn.lpstrFilter = selPatternW.c_str();
+ ofn.lpstrDefExt = defExtensionW.c_str();
+ ofn.lpstrFile = filenameC;
+ ofn.nMaxFile = len;
+ ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;
+
+ EnableWindow(GraphicsWnd, false);
+ EnableWindow(TextWnd, false);
+
+ BOOL r;
+ if(isOpen) {
+ r = GetOpenFileNameW(&ofn);
+ } else {
+ r = GetSaveFileNameW(&ofn);
+ }
+
+ EnableWindow(TextWnd, true);
+ EnableWindow(GraphicsWnd, true);
+ SetForegroundWindow(GraphicsWnd);
+
+ if(r) *filename = Narrow(filenameC);
+ return r ? true : false;
+}
+
+bool SolveSpace::GetOpenFile(std::string *filename, const std::string &defExtension,
+ const FileFilter filters[])
+{
+ return OpenSaveFile(true, filename, defExtension, filters);
+}
+
+bool SolveSpace::GetSaveFile(std::string *filename, const std::string &defExtension,
+ const FileFilter filters[])
+{
+ return OpenSaveFile(false, filename, defExtension, filters);
+}
+
+DialogChoice SolveSpace::SaveFileYesNoCancel(void)
+{
+ EnableWindow(GraphicsWnd, false);
+ EnableWindow(TextWnd, false);
+
+ int r = MessageBoxW(GraphicsWnd,
+ L"The file has changed since it was last saved.\n\n"
+ L"Do you want to save the changes?", L"SolveSpace",
+ MB_YESNOCANCEL | MB_ICONWARNING);
+
+ EnableWindow(TextWnd, true);
+ EnableWindow(GraphicsWnd, true);
+ SetForegroundWindow(GraphicsWnd);
+
+ switch(r) {
+ case IDYES:
+ return DIALOG_YES;
+ case IDNO:
+ return DIALOG_NO;
+ case IDCANCEL:
+ default:
+ return DIALOG_CANCEL;
+ }
+}
+
+DialogChoice SolveSpace::LoadAutosaveYesNo(void)
+{
+ EnableWindow(GraphicsWnd, false);
+ EnableWindow(TextWnd, false);
+
+ int r = MessageBoxW(GraphicsWnd,
+ L"An autosave file is availible for this project.\n\n"
+ L"Do you want to load the autosave file instead?", L"SolveSpace",
+ MB_YESNO | MB_ICONWARNING);
+
+ EnableWindow(TextWnd, true);
+ EnableWindow(GraphicsWnd, true);
+ SetForegroundWindow(GraphicsWnd);
+
+ switch (r) {
+ case IDYES:
+ return DIALOG_YES;
+ case IDNO:
+ default:
+ return DIALOG_NO;
+ }
+}
+
+DialogChoice SolveSpace::LocateImportedFileYesNoCancel(const std::string &filename,
+ bool canCancel) {
+ EnableWindow(GraphicsWnd, false);
+ EnableWindow(TextWnd, false);
+
+ std::string message =
+ "The linked file " + filename + " is not present.\n\n"
+ "Do you want to locate it manually?\n\n"
+ "If you select \"No\", any geometry that depends on "
+ "the missing file will be removed.";
+
+ int r = MessageBoxW(GraphicsWnd, Widen(message).c_str(), L"SolveSpace",
+ (canCancel ? MB_YESNOCANCEL : MB_YESNO) | MB_ICONWARNING);
+
+ EnableWindow(TextWnd, true);
+ EnableWindow(GraphicsWnd, true);
+ SetForegroundWindow(GraphicsWnd);
+
+ switch(r) {
+ case IDYES:
+ return DIALOG_YES;
+ case IDNO:
+ return DIALOG_NO;
+ case IDCANCEL:
+ default:
+ return DIALOG_CANCEL;
+ }
+}
+
+std::vector<std::string> SolveSpace::GetFontFiles() {
+ std::vector<std::string> fonts;
+
+ std::wstring fontsDir(MAX_PATH, '\0');
+ fontsDir.resize(GetWindowsDirectoryW(&fontsDir[0], fontsDir.length()));
+ fontsDir += L"\\fonts\\";
+
+ WIN32_FIND_DATA wfd;
+ HANDLE h = FindFirstFileW((fontsDir + L"*").c_str(), &wfd);
+ while(h != INVALID_HANDLE_VALUE) {
+ fonts.push_back(Narrow(fontsDir) + Narrow(wfd.cFileName));
+ if(!FindNextFileW(h, &wfd)) break;
+ }
+
+ return fonts;
+}
+
+static void MenuById(int id, bool yes, bool check)
+{
+ int i;
+ int subMenu = -1;
+
+ for(i = 0; SS.GW.menu[i].level >= 0; i++) {
+ if(SS.GW.menu[i].level == 0) subMenu++;
+
+ if(SS.GW.menu[i].id == id) {
+ if(subMenu < 0) oops();
+ if(subMenu >= (int)arraylen(SubMenus)) oops();
+
+ if(check) {
+ CheckMenuItem(SubMenus[subMenu], id,
+ yes ? MF_CHECKED : MF_UNCHECKED);
+ } else {
+ EnableMenuItem(SubMenus[subMenu], id,
+ yes ? MF_ENABLED : MF_GRAYED);
+ }
+ return;
+ }
+ }
+ oops();
+}
+void SolveSpace::CheckMenuById(int id, bool checked)
+{
+ MenuById(id, checked, true);
+}
+void SolveSpace::RadioMenuById(int id, bool selected)
+{
+ // Windows does not natively support radio-button menu items
+ MenuById(id, selected, true);
+}
+void SolveSpace::EnableMenuById(int id, bool enabled)
+{
+ MenuById(id, enabled, false);
+}
+static void DoRecent(HMENU m, int base)
+{
+ while(DeleteMenu(m, 0, MF_BYPOSITION))
+ ;
+ int i, c = 0;
+ for(i = 0; i < MAX_RECENT; i++) {
+ if(!RecentFile[i].empty()) {
+ AppendMenuW(m, MF_STRING, base + i, Widen(RecentFile[i]).c_str());
+ c++;
+ }
+ }
+ if(c == 0) AppendMenuW(m, MF_STRING | MF_GRAYED, 0, L"(no recent files)");
+}
+void SolveSpace::RefreshRecentMenus(void)
+{
+ DoRecent(RecentOpenMenu, RECENT_OPEN);
+ DoRecent(RecentImportMenu, RECENT_LINK);
+}
+
+HMENU CreateGraphicsWindowMenus(void)
+{
+ HMENU top = CreateMenu();
+ HMENU m = 0;
+
+ int i;
+ int subMenu = 0;
+
+ for(i = 0; SS.GW.menu[i].level >= 0; i++) {
+ std::string label;
+ if(SS.GW.menu[i].label) {
+ std::string accel = MakeAcceleratorLabel(SS.GW.menu[i].accel);
+ const char *sep = accel.empty() ? "" : "\t";
+ label = ssprintf("%s%s%s", SS.GW.menu[i].label, sep, accel.c_str());
+ }
+
+ if(SS.GW.menu[i].level == 0) {
+ m = CreateMenu();
+ AppendMenuW(top, MF_STRING | MF_POPUP, (UINT_PTR)m, Widen(label).c_str());
+ if(subMenu >= (int)arraylen(SubMenus)) oops();
+ SubMenus[subMenu] = m;
+ subMenu++;
+ } else if(SS.GW.menu[i].level == 1) {
+ if(SS.GW.menu[i].id == GraphicsWindow::MNU_OPEN_RECENT) {
+ RecentOpenMenu = CreateMenu();
+ AppendMenuW(m, MF_STRING | MF_POPUP,
+ (UINT_PTR)RecentOpenMenu, Widen(label).c_str());
+ } else if(SS.GW.menu[i].id == GraphicsWindow::MNU_GROUP_RECENT) {
+ RecentImportMenu = CreateMenu();
+ AppendMenuW(m, MF_STRING | MF_POPUP,
+ (UINT_PTR)RecentImportMenu, Widen(label).c_str());
+ } else if(SS.GW.menu[i].label) {
+ AppendMenuW(m, MF_STRING, SS.GW.menu[i].id, Widen(label).c_str());
+ } else {
+ AppendMenuW(m, MF_SEPARATOR, SS.GW.menu[i].id, L"");
+ }
+ } else oops();
+ }
+ RefreshRecentMenus();
+
+ return top;
+}
+
+static void CreateMainWindows(void)
+{
+ WNDCLASSEX wc = {};
+
+ wc.cbSize = sizeof(wc);
+
+ // The graphics window, where the sketch is drawn and shown.
+ wc.style = CS_BYTEALIGNCLIENT | CS_BYTEALIGNWINDOW | CS_OWNDC |
+ CS_DBLCLKS;
+ wc.lpfnWndProc = (WNDPROC)GraphicsWndProc;
+ wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
+ wc.lpszClassName = L"GraphicsWnd";
+ wc.lpszMenuName = NULL;
+ wc.hCursor = LoadCursor(NULL, IDC_ARROW);
+ wc.hIcon = (HICON)LoadImage(Instance, MAKEINTRESOURCE(4000),
+ IMAGE_ICON, 32, 32, 0);
+ wc.hIconSm = (HICON)LoadImage(Instance, MAKEINTRESOURCE(4000),
+ IMAGE_ICON, 16, 16, 0);
+ if(!RegisterClassEx(&wc)) oops();
+
+ HMENU top = CreateGraphicsWindowMenus();
+ GraphicsWnd = CreateWindowExW(0, L"GraphicsWnd",
+ L"SolveSpace (not yet saved)",
+ WS_OVERLAPPED | WS_THICKFRAME | WS_CLIPCHILDREN | WS_MAXIMIZEBOX |
+ WS_MINIMIZEBOX | WS_SYSMENU | WS_SIZEBOX | WS_CLIPSIBLINGS,
+ 50, 50, 900, 600, NULL, top, Instance, NULL);
+ if(!GraphicsWnd) oops();
+
+ GraphicsEditControl = CreateWindowExW(WS_EX_CLIENTEDGE, WC_EDIT, L"",
+ WS_CHILD | ES_AUTOHSCROLL | WS_TABSTOP | WS_CLIPSIBLINGS,
+ 50, 50, 100, 21, GraphicsWnd, NULL, Instance, NULL);
+
+ // The text window, with a comand line and some textual information
+ // about the sketch.
+ wc.style &= ~CS_DBLCLKS;
+ wc.lpfnWndProc = (WNDPROC)TextWndProc;
+ wc.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
+ wc.lpszClassName = L"TextWnd";
+ wc.hCursor = NULL;
+ if(!RegisterClassEx(&wc)) oops();
+
+ // We get the desired Alt+Tab behaviour by specifying that the text
+ // window is a child of the graphics window.
+ TextWnd = CreateWindowExW(0,
+ L"TextWnd", L"SolveSpace - Property Browser", WS_THICKFRAME | WS_CLIPCHILDREN,
+ 650, 500, 420, 300, GraphicsWnd, (HMENU)NULL, Instance, NULL);
+ if(!TextWnd) oops();
+
+ TextWndScrollBar = CreateWindowExW(0, WC_SCROLLBAR, L"", WS_CHILD |
+ SBS_VERT | SBS_LEFTALIGN | WS_VISIBLE | WS_CLIPSIBLINGS,
+ 200, 100, 100, 100, TextWnd, NULL, Instance, NULL);
+ // Force the scrollbar to get resized to the window,
+ TextWndProc(TextWnd, WM_SIZE, 0, 0);
+
+ TextEditControl = CreateWindowExW(WS_EX_CLIENTEDGE, WC_EDIT, L"",
+ WS_CHILD | ES_AUTOHSCROLL | WS_TABSTOP | WS_CLIPSIBLINGS,
+ 50, 50, 100, 21, TextWnd, NULL, Instance, NULL);
+
+ // Now that all our windows exist, set up gl contexts.
+ CreateGlContext(TextWnd, &TextGl);
+ CreateGlContext(GraphicsWnd, &GraphicsGl);
+
+ RECT r, rc;
+ GetWindowRect(TextWnd, &r);
+ GetClientRect(TextWnd, &rc);
+ ClientIsSmallerBy = (r.bottom - r.top) - (rc.bottom - rc.top);
+}
+
+#ifdef HAVE_SPACEWARE
+//-----------------------------------------------------------------------------
+// Test if a message comes from the SpaceNavigator device. If yes, dispatch
+// it appropriately and return true. Otherwise, do nothing and return false.
+//-----------------------------------------------------------------------------
+static bool ProcessSpaceNavigatorMsg(MSG *msg) {
+ if(SpaceNavigator == SI_NO_HANDLE) return false;
+
+ SiGetEventData sged;
+ SiSpwEvent sse;
+
+ SiGetEventWinInit(&sged, msg->message, msg->wParam, msg->lParam);
+ int ret = SiGetEvent(SpaceNavigator, 0, &sged, &sse);
+ if(ret == SI_NOT_EVENT) return false;
+ // So the device is a SpaceNavigator event, or a SpaceNavigator error.
+
+ if(ret == SI_IS_EVENT) {
+ if(sse.type == SI_MOTION_EVENT) {
+ // The Z axis translation and rotation are both
+ // backwards in the default mapping.
+ double tx = sse.u.spwData.mData[SI_TX]*1.0,
+ ty = sse.u.spwData.mData[SI_TY]*1.0,
+ tz = -sse.u.spwData.mData[SI_TZ]*1.0,
+ rx = sse.u.spwData.mData[SI_RX]*0.001,
+ ry = sse.u.spwData.mData[SI_RY]*0.001,
+ rz = -sse.u.spwData.mData[SI_RZ]*0.001;
+ SS.GW.SpaceNavigatorMoved(tx, ty, tz, rx, ry, rz,
+ !!(GetAsyncKeyState(VK_SHIFT) & 0x8000));
+ } else if(sse.type == SI_BUTTON_EVENT) {
+ int button;
+ button = SiButtonReleased(&sse);
+ if(button == SI_APP_FIT_BUTTON) SS.GW.SpaceNavigatorButtonUp();
+ }
+ }
+ return true;
+}
+#endif // HAVE_SPACEWARE
+
+//-----------------------------------------------------------------------------
+// Entry point into the program.
+//-----------------------------------------------------------------------------
+int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
+ LPSTR lpCmdLine, INT nCmdShow)
+{
+ Instance = hInstance;
+
+ InitCommonControls();
+
+ // A monospaced font
+ FixedFont = CreateFontW(SS.TW.CHAR_HEIGHT, SS.TW.CHAR_WIDTH, 0, 0,
+ FW_REGULAR, false,
+ false, false, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
+ DEFAULT_QUALITY, FF_DONTCARE, L"Lucida Console");
+ if(!FixedFont)
+ FixedFont = (HFONT)GetStockObject(SYSTEM_FONT);
+
+ // Create the root windows: one for control, with text, and one for
+ // the graphics
+ CreateMainWindows();
+
+ ThawWindowPos(TextWnd, "TextWnd");
+ ThawWindowPos(GraphicsWnd, "GraphicsWnd");
+
+ ShowWindow(TextWnd, SW_SHOWNOACTIVATE);
+ ShowWindow(GraphicsWnd, SW_SHOW);
+
+ glClearColor(0, 0, 0, 1);
+ glClear(GL_COLOR_BUFFER_BIT);
+ SwapBuffers(GetDC(GraphicsWnd));
+ glClearColor(0, 0, 0, 1);
+ glClear(GL_COLOR_BUFFER_BIT);
+ SwapBuffers(GetDC(GraphicsWnd));
+
+ // Create the heaps for all dynamic memory (AllocTemporary, MemAlloc)
+ InitHeaps();
+
+ // Pull out the Unicode command line.
+ int argc;
+ LPWSTR *argv = CommandLineToArgvW(GetCommandLineW(), &argc);
+
+ // A filename may have been specified on the command line; if so, then
+ // strip any quotation marks, and make it absolute.
+ std::wstring filenameRel, filename;
+ if(argc >= 2) {
+ filenameRel = argv[1];
+ if(filenameRel[0] == L'\"' && filenameRel[filenameRel.length() - 1] == L'\"') {
+ filenameRel.erase(0, 1);
+ filenameRel.erase(filenameRel.length() - 1, 1);
+ }
+
+ DWORD len = GetFullPathNameW(&filenameRel[0], 0, NULL, NULL);
+ filename.resize(len - 1);
+ GetFullPathNameW(&filenameRel[0], len, &filename[0], NULL);
+ }
+
+#ifdef HAVE_SPACEWARE
+ // Initialize the SpaceBall, if present. Test if the driver is running
+ // first, to avoid a long timeout if it's not.
+ HWND swdc = FindWindowW(L"SpaceWare Driver Class", NULL);
+ if(swdc != NULL) {
+ SiOpenData sod;
+ SiInitialize();
+ SiOpenWinInit(&sod, GraphicsWnd);
+ SpaceNavigator =
+ SiOpen("GraphicsWnd", SI_ANY_DEVICE, SI_NO_MASK, SI_EVENT, &sod);
+ SiSetUiMode(SpaceNavigator, SI_UI_NO_CONTROLS);
+ }
+#endif
+
+ // Call in to the platform-independent code, and let them do their init
+ SS.Init();
+ if(!filename.empty())
+ SS.OpenFile(Narrow(filename));
+
+ // And now it's the message loop. All calls in to the rest of the code
+ // will be from the wndprocs.
+ MSG msg;
+ DWORD ret;
+ while((ret = GetMessage(&msg, NULL, 0, 0)) != 0) {
+#ifdef HAVE_SPACEWARE
+ // Is it a message from the six degree of freedom input device?
+ if(ProcessSpaceNavigatorMsg(&msg)) goto done;
+#endif
+
+ // A message from the keyboard, which should be processed as a keyboard
+ // accelerator?
+ if(msg.message == WM_KEYDOWN) {
+ if(ProcessKeyDown(msg.wParam)) goto done;
+ }
+ if(msg.message == WM_SYSKEYDOWN && msg.hwnd == TextWnd) {
+ // If the user presses the Alt key when the text window has focus,
+ // then that should probably go to the graphics window instead.
+ SetForegroundWindow(GraphicsWnd);
+ }
+
+ // None of the above; so just a normal message to process.
+ TranslateMessage(&msg);
+ DispatchMessage(&msg);
+done:
+ SS.DoLater();
+ }
+
+#ifdef HAVE_SPACEWARE
+ if(swdc != NULL) {
+ if(SpaceNavigator != SI_NO_HANDLE) SiClose(SpaceNavigator);
+ SiTerminate();
+ }
+#endif
+
+ // Write everything back to the registry
+ FreezeWindowPos(TextWnd, "TextWnd");
+ FreezeWindowPos(GraphicsWnd, "GraphicsWnd");
+
+ // Free the memory we've used; anything that remains is a leak.
+ SK.Clear();
+ SS.Clear();
+
+ return 0;
+}
--- /dev/null
+//-----------------------------------------------------------------------------
+// Utility functions that depend on Win32. Notably, our memory allocation;
+// we use two separate allocators, one for long-lived stuff and one for
+// stuff that gets freed after every regeneration of the model, to save us
+// the trouble of freeing the latter explicitly.
+//
+// Copyright 2008-2013 Jonathan Westhues.
+//-----------------------------------------------------------------------------
+#include "solvespace.h"
+
+namespace SolveSpace {
+static HANDLE PermHeap, TempHeap;
+
+void dbp(const char *str, ...)
+{
+ va_list f;
+ static char buf[1024*50];
+ va_start(f, str);
+ _vsnprintf(buf, sizeof(buf), str, f);
+ va_end(f);
+
+ // The native version of OutputDebugString, unlike most others,
+ // is OutputDebugStringA.
+ OutputDebugStringA(buf);
+}
+
+std::string Narrow(const wchar_t *in)
+{
+ std::string out;
+ DWORD len = WideCharToMultiByte(CP_UTF8, 0, in, -1, NULL, 0, NULL, NULL);
+ out.resize(len - 1);
+ if(!WideCharToMultiByte(CP_UTF8, 0, in, -1, &out[0], len, NULL, NULL))
+ oops();
+ return out;
+}
+
+std::string Narrow(const std::wstring &in)
+{
+ if(in == L"") return "";
+
+ std::string out;
+ out.resize(WideCharToMultiByte(CP_UTF8, 0, &in[0], in.length(), NULL, 0, NULL, NULL));
+ if(!WideCharToMultiByte(CP_UTF8, 0, &in[0], in.length(),
+ &out[0], out.length(), NULL, NULL))
+ oops();
+ return out;
+}
+
+std::wstring Widen(const char *in)
+{
+ std::wstring out;
+ DWORD len = MultiByteToWideChar(CP_UTF8, 0, in, -1, NULL, 0);
+ out.resize(len - 1);
+ if(!MultiByteToWideChar(CP_UTF8, 0, in, -1, &out[0], len))
+ oops();
+ return out;
+}
+
+std::wstring Widen(const std::string &in)
+{
+ if(in == "") return L"";
+
+ std::wstring out;
+ out.resize(MultiByteToWideChar(CP_UTF8, 0, &in[0], in.length(), NULL, 0));
+ if(!MultiByteToWideChar(CP_UTF8, 0, &in[0], in.length(), &out[0], out.length()))
+ oops();
+ return out;
+}
+
+static std::string MakeUNCFilename(const std::string &filename)
+{
+ // Prepend \\?\ UNC prefix unless already an UNC path.
+ // We never try to fopen paths that are not absolute or
+ // contain separators inappropriate for the platform;
+ // thus, it is always safe to prepend this prefix.
+ std::string uncFilename = filename;
+ if(uncFilename.substr(0, 2) != "\\\\")
+ uncFilename = "\\\\?\\" + uncFilename;
+ return uncFilename;
+}
+
+FILE *ssfopen(const std::string &filename, const char *mode)
+{
+ if(filename.length() != strlen(filename.c_str())) oops();
+ return _wfopen(Widen(MakeUNCFilename(filename)).c_str(), Widen(mode).c_str());
+}
+
+void ssremove(const std::string &filename)
+{
+ if(filename.length() != strlen(filename.c_str())) oops();
+ _wremove(Widen(filename).c_str());
+}
+
+//-----------------------------------------------------------------------------
+// A separate heap, on which we allocate expressions. Maybe a bit faster,
+// since no fragmentation issues whatsoever, and it also makes it possible
+// to be sloppy with our memory management, and just free everything at once
+// at the end.
+//-----------------------------------------------------------------------------
+void *AllocTemporary(size_t n)
+{
+ void *v = HeapAlloc(TempHeap, HEAP_NO_SERIALIZE | HEAP_ZERO_MEMORY, n);
+ if(!v) oops();
+ return v;
+}
+void FreeTemporary(void *p) {
+ HeapFree(TempHeap, HEAP_NO_SERIALIZE, p);
+}
+void FreeAllTemporary(void)
+{
+ if(TempHeap) HeapDestroy(TempHeap);
+ TempHeap = HeapCreate(HEAP_NO_SERIALIZE, 1024*1024*20, 0);
+ // This is a good place to validate, because it gets called fairly
+ // often.
+ vl();
+}
+
+void *MemAlloc(size_t n) {
+ void *p = HeapAlloc(PermHeap, HEAP_NO_SERIALIZE | HEAP_ZERO_MEMORY, n);
+ if(!p) oops();
+ return p;
+}
+void MemFree(void *p) {
+ HeapFree(PermHeap, HEAP_NO_SERIALIZE, p);
+}
+
+void vl(void) {
+ if(!HeapValidate(TempHeap, HEAP_NO_SERIALIZE, NULL)) oops();
+ if(!HeapValidate(PermHeap, HEAP_NO_SERIALIZE, NULL)) oops();
+}
+
+void InitHeaps(void) {
+ // Create the heap used for long-lived stuff (that gets freed piecewise).
+ PermHeap = HeapCreate(HEAP_NO_SERIALIZE, 1024*1024*20, 0);
+ // Create the heap that we use to store Exprs and other temp stuff.
+ FreeAllTemporary();
+}
+}
--- /dev/null
+include_directories(
+ ${PNG_INCLUDE_DIRS})
+
+link_directories(
+ ${PNG_LIBRARY_DIRS})
+
+add_executable(png2c
+ png2c.cpp)
+
+target_link_libraries(png2c
+ ${PNG_LIBRARIES})
+
+add_executable(unifont2c
+ unifont2c.cpp)
+
+target_link_libraries(unifont2c
+ ${PNG_LIBRARIES} ${ZLIB_LIBRARIES})
+
+add_executable(lff2c
+ lff2c.cpp)
+
+target_link_libraries(lff2c
+ ${ZLIB_LIBRARIES})
--- /dev/null
+#define _USE_MATH_DEFINES
+#include <zlib.h>
+#include <cmath>
+#include <cctype>
+#include <algorithm>
+#include <vector>
+#include <string>
+#include <map>
+#include <iostream>
+#include <fstream>
+#include <sstream>
+
+#define TOLERANCE 1e-6
+
+double correctAngle(double a) {
+ return M_PI + remainder(a - M_PI, 2 * M_PI);
+}
+
+struct Point {
+ double x;
+ double y;
+
+ Point operator+(const Point &o) const { return { x + o.x, y + o.y }; }
+ Point operator-(const Point &o) const { return { x - o.x, y - o.y }; }
+ Point operator*(const Point &o) const { return { x * o.x, y * o.y }; }
+ Point operator/(const Point &o) const { return { x / o.x, y / o.y }; }
+
+ Point operator*(double k) const { return { x * k, y * k }; }
+ Point operator/(double k) const { return { x / k, y / k }; }
+
+ double length() const{
+ return sqrt(x * x + y * y);
+ }
+
+ double angle() const {
+ return correctAngle(atan2(y, x));
+ }
+
+ double distanceTo(const Point &v) const {
+ return (*this - v).length();
+ }
+
+ double angleTo(const Point &v) const {
+ return (v - *this).angle();
+ }
+
+ static Point polar(double radius, double angle) {
+ return { radius * cos(angle), radius * sin(angle) };
+ }
+
+ bool operator==(const Point &o) const { return x == o.x && y == o.y; }
+ bool operator!=(const Point &o) const { return x != o.x || y != o.y; }
+
+};
+
+struct Curve {
+ std::vector<Point> points;
+};
+
+struct Glyph {
+ char32_t character;
+ char32_t baseCharacter;
+ std::vector<Curve> curves;
+
+ void getHorizontalBounds(double *rminx, double *rmaxx) const {
+ double minx = 0;
+ double maxx = 0;
+ if(!curves.empty()) {
+ minx = curves[0].points[0].x;
+ maxx = minx;
+ for(const Curve &c : curves) {
+ for(const Point &p : c.points) {
+ maxx = std::max(maxx, p.x);
+ minx = std::min(minx, p.x);
+ }
+ }
+ }
+ if(rminx) *rminx = minx;
+ if(rmaxx) *rmaxx = maxx;
+ }
+
+ void getVerticalBounds(double *rminy, double *rmaxy) const {
+ double miny = 0;
+ double maxy = 0;
+ if(!curves.empty()) {
+ miny = curves[0].points[0].y;
+ maxy = miny;
+ for(const Curve &c : curves) {
+ for(const Point &p : c.points) {
+ maxy = std::max(maxy, p.y);
+ miny = std::min(miny, p.y);
+ }
+ }
+ }
+ if(rminy) *rminy = miny;
+ if(rmaxy) *rmaxy = maxy;
+ }
+
+ void getHorizontalMetrics(double *leftSideBearing, double *boundingWidth) const {
+ double minx, maxx;
+ getHorizontalBounds(&minx, &maxx);
+ *leftSideBearing = minx;
+ *boundingWidth = maxx - minx;
+ }
+
+ bool operator<(const Glyph &o) const { return character < o.character; }
+};
+
+struct Font {
+ double letterSpacing;
+ double wordSpacing;
+ std::vector<Glyph> glyphs;
+
+ const Glyph &findGlyph(char32_t character) {
+ return *std::find_if(glyphs.begin(), glyphs.end(),
+ [&](const Glyph &g) { return g.character == character; });
+ }
+
+ void getGlyphBound(double *rminw, double *rminh, double *rmaxw, double *rmaxh) {
+ if(glyphs.empty()) {
+ *rminw = 0.0;
+ *rmaxw = 0.0;
+ *rminh = 0.0;
+ *rmaxh = 0.0;
+ return;
+ }
+
+ glyphs[0].getHorizontalBounds(rminw, rmaxw);
+ glyphs[0].getVerticalBounds(rminh, rmaxh);
+ for(const Glyph &g : glyphs) {
+ double minw, minh, maxw, maxh;
+ g.getHorizontalBounds(&minw, &maxw);
+ g.getVerticalBounds(&minh, &maxh);
+ *rminw = std::min(*rminw, minw);
+ *rminh = std::min(*rminh, minh);
+ *rmaxw = std::max(*rmaxw, maxw);
+ *rmaxh = std::max(*rmaxh, maxh);
+ }
+ }
+
+ void createArc(Curve &curve, const Point &cp, double radius,
+ double a1, double a2, bool reversed) {
+ if (radius < 1e-6) return;
+
+ double aSign = 1.0;
+ if(reversed) {
+ if(a1 <= a2 + TOLERANCE) a1 += 2.0 * M_PI;
+ aSign = -1.0;
+ } else {
+ if(a2 <= a1 + TOLERANCE) a2 += 2.0 * M_PI;
+ }
+
+ // Angle Step (rad)
+ double da = fabs(a2 - a1);
+ int numPoints = 8;
+ double aStep = aSign * da / double(numPoints);
+
+ for(int i = 0; i <= numPoints; i++) {
+ curve.points.push_back(cp + Point::polar(radius, a1 + aStep * i));
+ }
+ }
+
+ void createBulge(const Point &v, double bulge, Curve &curve) {
+ bool reversed = bulge < 0.0;
+ double alpha = atan(bulge) * 4.0;
+ Point &point = curve.points.back();
+
+ Point middle = (point + v) / 2.0;
+ double dist = point.distanceTo(v) / 2.0;
+ double angle = point.angleTo(v);
+
+ // alpha can't be 0.0 at this point
+ double radius = fabs(dist / sin(alpha / 2.0));
+ double wu = fabs(radius*radius - dist*dist);
+ double h = sqrt(wu);
+
+ if(bulge > 0.0) {
+ angle += M_PI_2;
+ } else {
+ angle -= M_PI_2;
+ }
+
+ if (fabs(alpha) > M_PI) {
+ h *= -1.0;
+ }
+
+ Point center = Point::polar(h, angle);
+ center = center + middle;
+
+ double a1 = center.angleTo(point);
+ double a2 = center.angleTo(v);
+ createArc(curve, center, radius, a1, a2, reversed);
+ }
+
+ void readLff(const std::string &path) {
+ gzFile lfffont = gzopen(path.c_str(), "rb");
+ if(!lfffont) {
+ std::cerr << path << ": gzopen failed" << std::endl;
+ std::exit(1);
+ }
+
+ // Read line by line until we find a new letter:
+ Glyph *currentGlyph = nullptr;
+ while(!gzeof(lfffont)) {
+ std::string line;
+ do {
+ char buf[128] = {0};
+ if(!gzgets(lfffont, buf, sizeof(buf)))
+ break;
+ line += buf;
+ } while(line.back() != '\n');
+
+ if(line.empty() || line[0] == '\n') {
+ continue;
+ } else if(line[0] == '#') {
+ // This is comment or metadata.
+ std::istringstream ss(line.substr(1));
+
+ std::vector<std::string> tokens;
+ while(!ss.eof()) {
+ std::string token;
+ std::getline(ss, token, ':');
+ std::istringstream(token) >> token; // trim
+ if(!token.empty())
+ tokens.push_back(token);
+ }
+
+ // If not in form of "a:b" then it's not metadata, just a comment.
+ if (tokens.size() != 2)
+ continue;
+
+ std::string &identifier = tokens[0];
+ std::string &value = tokens[1];
+
+ std::transform(identifier.begin(), identifier.end(), identifier.begin(),
+ ::tolower);
+ if (identifier == "letterspacing") {
+ std::istringstream(value) >> letterSpacing;
+ } else if (identifier == "wordspacing") {
+ std::istringstream(value) >> wordSpacing;
+ } else if (identifier == "linespacingfactor") {
+ /* don't care */
+ } else if (identifier == "author") {
+ /* don't care */
+ } else if (identifier == "name") {
+ /* don't care */
+ } else if (identifier == "license") {
+ /* don't care */
+ } else if (identifier == "encoding") {
+ /* don't care */
+ } else if (identifier == "created") {
+ /* don't care */
+ }
+ } else if(line[0] == '[') {
+ // This is a glyph.
+ size_t closingPos;
+ char32_t chr = std::stoi(line.substr(1), &closingPos, 16);;
+ if(line[closingPos + 1] != ']') {
+ std::cerr << "unrecognized character number: " << line << std::endl;
+ currentGlyph = nullptr;
+ continue;
+ }
+
+ glyphs.emplace_back();
+ currentGlyph = &glyphs.back();
+ currentGlyph->character = chr;
+ currentGlyph->baseCharacter = 0;
+ } else if(currentGlyph != nullptr) {
+ if (line[0] == 'C') {
+ // This is a reference to another glyph.
+ currentGlyph->baseCharacter = std::stoi(line.substr(1), nullptr, 16);
+ } else {
+ // This is a series of curves.
+ currentGlyph->curves.emplace_back();
+ Curve &curve = currentGlyph->curves.back();
+
+ std::stringstream ss(line);
+ while (!ss.eof()) {
+ std::string vertex;
+ std::getline(ss, vertex, ';');
+
+ std::stringstream ssv(vertex);
+ std::string coord;
+ Point p;
+
+ if(!std::getline(ssv, coord, ',')) continue;
+ p.x = std::stod(coord);
+
+ if(!std::getline(ssv, coord, ',')) continue;
+ p.y = std::stod(coord);
+
+ if(!std::getline(ssv, coord, ',') || coord[0] != 'A') {
+ // This is just a point.
+ curve.points.push_back(p);
+ } else {
+ // This is a point with a bulge.
+ double bulge = std::stod(coord.substr(1));
+ createBulge(p, bulge, curve);
+ }
+ }
+ }
+ } else {
+ std::cerr << "unrecognized line: " << line << std::endl;
+ }
+ }
+ gzclose(lfffont);
+ }
+
+ void writeCppHeader(const std::string &hName) {
+ std::sort(glyphs.begin(), glyphs.end());
+
+ std::ofstream ts(hName, std::ios::out);
+
+ double minX, minY, maxX, maxY;
+ getGlyphBound(&minX, &minY, &maxX, &maxY);
+
+ double size = 32766.0;
+ double scale = size / std::max({ fabs(maxX), fabs(minX), fabs(maxY), fabs(minY) });
+
+ double capHeight, ascender, descender;
+ findGlyph('A').getVerticalBounds(nullptr, &capHeight);
+ findGlyph('h').getVerticalBounds(nullptr, &ascender);
+ findGlyph('p').getVerticalBounds(&descender, nullptr);
+
+ // We use tabs for indentation here to make compilation slightly faster
+ ts <<
+ "/**** This is a generated file - do not edit ****/\n\n"
+ "#ifndef __VECTORFONT_TABLE_H\n"
+ "#define __VECTORFONT_TABLE_H\n"
+ "\n"
+ "#define PEN_UP 32767\n"
+ "#define UP PEN_UP\n"
+ "\n"
+ "#define FONT_CAP_HEIGHT ((int16_t)" << (int)floor(capHeight * scale) << ")\n" <<
+ "#define FONT_ASCENDER ((int16_t)" << (int)floor(ascender * scale) << ")\n" <<
+ "#define FONT_DESCENDER ((int16_t)" << (int)floor(descender * scale) << ")\n" <<
+ "#define FONT_SIZE (FONT_ASCENDER-FONT_DESCENDER)\n"
+ "\n"
+ "struct VectorGlyph {\n"
+ "\tchar32_t character;\n"
+ "\tchar32_t baseCharacter;\n"
+ "\tint leftSideBearing;\n"
+ "\tint boundingWidth;\n"
+ "\tint advanceWidth;\n"
+ "\tconst int16_t *data;\n"
+ "};\n"
+ "\n"
+ "const int16_t VectorFontData[] = {\n"
+ "\tUP, UP,\n";
+
+ std::map<char32_t, size_t> glyphIndexes;
+ size_t index = 2;
+ for(const Glyph &g : glyphs) {
+ ts << "\t// U+" << std::hex << g.character << std::dec << "\n";
+ glyphIndexes[g.character] = index;
+ for(const Curve &c : g.curves) {
+ for(const Point &p : c.points) {
+ ts << "\t" << (int)floor(p.x * scale) << ", " <<
+ (int)floor(p.y * scale) << ",\n";
+ index += 2;
+ }
+ ts << "\tUP, UP,\n";
+ index += 2;
+ }
+ ts << "\tUP, UP,\n"; // end-of-glyph marker
+ index += 2;
+ }
+
+ ts <<
+ "};\n"
+ "\n"
+ "const VectorGlyph VectorFont[] = {\n"
+ "\t// U+20\n"
+ "\t{ 32, 0, 0, 0, " << (int)floor(wordSpacing * scale) << ", &VectorFontData[0] },\n";
+
+ for(const Glyph &g : glyphs) {
+ double leftSideBearing, boundingWidth;
+ g.getHorizontalMetrics(&leftSideBearing, &boundingWidth);
+
+ ts << "\t// U+" << std::hex << g.character << std::dec << "\n";
+ ts << "\t{ " << g.character << ", "
+ << g.baseCharacter << ", "
+ << (int)floor(leftSideBearing * scale) << ", "
+ << (int)floor(boundingWidth * scale) << ", "
+ << (int)floor((leftSideBearing + boundingWidth +
+ letterSpacing) * scale) << ", ";
+ ts << "&VectorFontData[" << glyphIndexes[g.character] << "] },\n";
+ }
+
+ ts <<
+ "};\n"
+ "\n"
+ "#undef UP\n"
+ "\n"
+ "#endif\n";
+ }
+};
+
+int main(int argc, char** argv) {
+ if(argc != 3) {
+ std::cerr << "Usage: " << argv[0] << " <header out> <lff in>\n" << std::endl;
+ return 1;
+ }
+
+ Font font;
+ font.readLff(argv[2]);
+ font.writeCppHeader(argv[1]);
+
+ return 0;
+}
--- /dev/null
+#include <stdio.h>
+#include <ctype.h>
+#include <stdlib.h>
+#include <string.h>
+#include <png.h>
+
+#define die(msg) do { fprintf(stderr, "%s\n", msg); abort(); } while(0)
+
+void write_png(FILE *out, const char *filename) {
+ FILE *fp = fopen(filename, "rb");
+ if (!fp)
+ die("png fopen failed");
+
+ png_byte header[8] = {};
+ if(fread(header, 1, 8, fp) != 8)
+ die("png fread failed");
+
+ if(png_sig_cmp(header, 0, 8))
+ die("png_sig_cmp failed");
+
+ png_structp png = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
+ if(!png)
+ die("png_create_read_struct failed");
+
+ png_set_expand(png);
+ png_set_strip_alpha(png);
+
+ png_infop png_info = png_create_info_struct(png);
+ if (!png_info)
+ die("png_create_info_struct failed");
+
+ if (setjmp(png_jmpbuf(png)))
+ die("png_init_io failed");
+
+ png_init_io(png, fp);
+ png_set_sig_bytes(png, 8);
+
+ png_read_info(png, png_info);
+
+ int width = png_get_image_width(png, png_info);
+ int height = png_get_image_height(png, png_info);
+ if(width != 24 || height != 24)
+ die("not a 24x24 png");
+
+ png_read_update_info(png, png_info);
+
+ if (setjmp(png_jmpbuf(png)))
+ die("png_read_image failed");
+
+ png_bytepp image = (png_bytepp) malloc(sizeof(png_bytep) * height);
+ for (int y = 0; y < height; y++)
+ image[y] = (png_bytep) malloc(png_get_rowbytes(png, png_info));
+
+ png_read_image(png, (png_bytepp) image);
+
+ for(int y = height - 1; y >= 0; y--) {
+ for(int x = 0; x < (int)png_get_rowbytes(png, png_info); x += 3) {
+ unsigned char r = image[y][x + 0],
+ g = image[y][x + 1],
+ b = image[y][x + 2];
+
+ if(r + g + b < 11)
+ r = g = b = 30;
+ fprintf(out, " 0x%02x, 0x%02x, 0x%02x,\n", r, g, b);
+ }
+ }
+
+ for (int y = 0; y < height; y++)
+ free(image[y]);
+ free(image);
+
+ fclose(fp);
+
+ png_destroy_read_struct(&png, &png_info, NULL);
+}
+
+int main(int argc, char** argv) {
+ if(argc < 3) {
+ fprintf(stderr, "Usage: %s <source out> <header out> <png in>...\n",
+ argv[0]);
+ return 1;
+ }
+
+ FILE *source = fopen(argv[1], "wt");
+ if(!source)
+ die("source fopen failed");
+
+ FILE *header = fopen(argv[2], "wt");
+ if(!header)
+ die("header fopen failed");
+
+ fprintf(source, "/**** This is a generated file - do not edit ****/\n\n");
+ fprintf(header, "/**** This is a generated file - do not edit ****/\n\n");
+
+ for(int i = 3; i < argc; i++) {
+ const char *filename = argv[i];
+ const char *basename = strrchr(filename, '/'); /* cmake uses / even on Windows */
+ if(basename == NULL) {
+ basename = filename;
+ } else {
+ basename++; // skip separator
+ }
+
+ char *stemname = (char*) calloc(strlen(basename), 1);
+ strncpy(stemname, basename, strchr(basename, '.') - basename);
+ for(size_t j = 0; j < strlen(stemname); j++) {
+ if(!isalnum(stemname[j]))
+ stemname[j] = '_';
+ }
+
+ fprintf(header, "extern unsigned char Icon_%s[24*24*3];\n", stemname);
+
+ fprintf(source, "unsigned char Icon_%s[24*24*3] = {\n", stemname);
+ write_png(source, filename);
+ fprintf(source, "};\n\n");
+
+ free(stemname);
+ }
+
+ fclose(source);
+ fclose(header);
+}
--- /dev/null
+#include <stdio.h>
+#include <ctype.h>
+#include <stdlib.h>
+#include <zlib.h>
+#include <png.h>
+
+#define die(msg) do { fprintf(stderr, "%s\n", msg); abort(); } while(0)
+
+#ifdef NDEBUG
+#define COMPRESSION_LEVEL 9
+#else
+#define COMPRESSION_LEVEL 5
+#endif
+
+unsigned short* read_png(const char *filename) {
+ FILE *fp = fopen(filename, "rb");
+ if (!fp)
+ die("png fopen failed");
+
+ png_byte header[8] = {};
+ if(fread(header, 1, 8, fp) != 8)
+ die("png fread failed");
+
+ if(png_sig_cmp(header, 0, 8))
+ die("png_sig_cmp failed");
+
+ png_structp png = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
+ if(!png)
+ die("png_create_read_struct failed");
+
+ png_set_expand(png);
+ png_set_strip_alpha(png);
+
+ png_infop png_info = png_create_info_struct(png);
+ if (!png_info)
+ die("png_create_info_struct failed");
+
+ if (setjmp(png_jmpbuf(png)))
+ die("png_init_io failed");
+
+ png_init_io(png, fp);
+ png_set_sig_bytes(png, 8);
+
+ png_read_info(png, png_info);
+
+ int width = png_get_image_width(png, png_info);
+ int height = png_get_image_height(png, png_info);
+ if(width != 16 || height != 16)
+ die("not a 16x16 png");
+
+ png_read_update_info(png, png_info);
+
+ if (setjmp(png_jmpbuf(png)))
+ die("png_read_image failed");
+
+ png_bytepp image = (png_bytepp) malloc(sizeof(png_bytep) * height);
+ for (int y = 0; y < height; y++)
+ image[y] = (png_bytep) malloc(png_get_rowbytes(png, png_info));
+
+ png_read_image(png, (png_bytepp) image);
+
+ unsigned short *glyph = (unsigned short *) calloc(16, 2);
+
+ for(int y = 0; y < height; y++) {
+ for(int x = 0; x < (int)png_get_rowbytes(png, png_info); x += 3) {
+ unsigned char r = image[y][x + 0],
+ g = image[y][x + 1],
+ b = image[y][x + 2];
+
+ if(r + g + b >= 11) {
+ glyph[y] |= 1 << (width - x / 3);
+ }
+ }
+ }
+
+ for (int y = 0; y < height; y++)
+ free(image[y]);
+ free(image);
+
+ fclose(fp);
+
+ png_destroy_read_struct(&png, &png_info, NULL);
+
+ return glyph;
+}
+
+const static unsigned short replacement[16] = {
+ 0xAAAA, 0xAAAA, 0xAAAA, 0xAAAA,
+ 0xAAAA, 0xAAAA, 0xAAAA, 0xAAAA,
+ 0xAAAA, 0xAAAA, 0xAAAA, 0xAAAA,
+ 0xAAAA, 0xAAAA, 0xAAAA, 0xAAAA,
+};
+
+struct CodepointProperties {
+ bool exists:1;
+ bool isWide:1;
+};
+
+int main(int argc, char** argv) {
+ if(argc < 3) {
+ fprintf(stderr, "Usage: %s <header/source out> <unifont.hex> <png glyph>...\n"
+ " where <png glyph>s are mapped into private use area\n"
+ " starting at U+E000.\n",
+ argv[0]);
+ return 1;
+ }
+
+ const int codepoint_count = 0x10000;
+ unsigned short **font =
+ (unsigned short **)calloc(sizeof(unsigned short*), codepoint_count);
+ CodepointProperties *properties =
+ (CodepointProperties *)calloc(sizeof(CodepointProperties), codepoint_count);
+
+ const int private_start = 0xE000;
+ for(int i = 3; i < argc; i++) {
+ int codepoint = private_start + i - 3;
+ font[codepoint] = read_png(argv[i]);
+ properties[codepoint].exists = true;
+ }
+
+ gzFile unifont = gzopen(argv[2], "rb");
+ if(!unifont)
+ die("unifont fopen failed");
+
+ while(1) {
+ char buf[100];
+ if(!gzgets(unifont, buf, sizeof(buf))){
+ if(gzeof(unifont)) {
+ break;
+ } else {
+ die("unifont gzgets failed");
+ }
+ }
+
+ unsigned short codepoint;
+ unsigned short *glyph = (unsigned short *) calloc(32, 1);
+ bool isWide;
+ if( sscanf(buf, "%4hx:%4hx%4hx%4hx%4hx%4hx%4hx%4hx%4hx"
+ "%4hx%4hx%4hx%4hx%4hx%4hx%4hx%4hx\n",
+ &codepoint,
+ &glyph[0], &glyph[1], &glyph[2], &glyph[3],
+ &glyph[4], &glyph[5], &glyph[6], &glyph[7],
+ &glyph[8], &glyph[9], &glyph[10], &glyph[11],
+ &glyph[12], &glyph[13], &glyph[14], &glyph[15]) == 17) {
+ /* read 16x16 character */
+ isWide = true;
+ } else if(sscanf(buf, "%4hx:%2hx%2hx%2hx%2hx%2hx%2hx%2hx%2hx"
+ "%2hx%2hx%2hx%2hx%2hx%2hx%2hx%2hx\n",
+ &codepoint,
+ &glyph[0], &glyph[1], &glyph[2], &glyph[3],
+ &glyph[4], &glyph[5], &glyph[6], &glyph[7],
+ &glyph[8], &glyph[9], &glyph[10], &glyph[11],
+ &glyph[12], &glyph[13], &glyph[14], &glyph[15]) == 17) {
+ /* read 8x16 character */
+ for(int i = 0; i < 16; i++)
+ glyph[i] <<= 8;
+ isWide = false;
+ } else {
+ die("parse unifont character");
+ }
+
+ font[codepoint] = glyph;
+ properties[codepoint].exists = true;
+ properties[codepoint].isWide = isWide;
+ }
+
+ gzclose(unifont);
+
+ FILE *source = fopen(argv[1], "wt");
+ if(!source)
+ die("source fopen failed");
+
+ const int chunk_size = 64 * 64,
+ chunks = codepoint_count / chunk_size;
+
+ const int chunk_input_size = chunk_size * 16 * 16;
+ unsigned int chunk_output_size[chunks] = {};
+
+ unsigned char *chunk_data = (unsigned char *)calloc(1, chunk_input_size);
+ unsigned int chunk_data_index;
+
+ fprintf(source, "/**** This is a generated file - do not edit ****/\n\n");
+
+ for(int chunk_index = 0; chunk_index < chunks; chunk_index++) {
+ chunk_data_index = 0;
+
+ const int chunk_start = chunk_index * chunk_size;
+ for(int codepoint = chunk_start; codepoint < chunk_start + chunk_size; codepoint++) {
+ const unsigned short *glyph = font[codepoint] != NULL ? font[codepoint] : replacement;
+ for(int x = 15; x >= 0; x--) {
+ for(int y = 0; y < 16; y++) {
+ chunk_data[chunk_data_index++] = (glyph[y] & (1 << x)) ? 0xff : 0;
+ }
+ }
+
+ if(font[codepoint] != NULL)
+ free(font[codepoint]);
+ }
+
+ fprintf(source, "static const uint8_t CompressedFontTextureChunk%d[] = {\n",
+ chunk_start / chunk_size);
+
+ z_stream stream;
+ stream.zalloc = Z_NULL;
+ stream.zfree = Z_NULL;
+ stream.opaque = Z_NULL;
+ if(deflateInit(&stream, COMPRESSION_LEVEL) != Z_OK)
+ die("deflateInit failed");
+
+ stream.next_in = chunk_data;
+ stream.avail_in = chunk_input_size;
+
+ do {
+ unsigned char compressed_chunk_data[16384] = {};
+ stream.next_out = compressed_chunk_data;
+ stream.avail_out = sizeof(compressed_chunk_data);
+ deflate(&stream, Z_FINISH);
+
+ chunk_output_size[chunk_index] += sizeof(compressed_chunk_data) - stream.avail_out;
+ for(size_t i = 0; i < sizeof(compressed_chunk_data) - stream.avail_out; i += 16) {
+ unsigned char *d = &compressed_chunk_data[i];
+ fprintf(source, " %3d, %3d, %3d, %3d, %3d, %3d, %3d, %3d, "
+ "%3d, %3d, %3d, %3d, %3d, %3d, %3d, %3d,\n",
+ d[ 0], d[ 1], d[ 2], d[ 3], d[ 4], d[ 5], d[ 6], d[ 7],
+ d[ 8], d[ 9], d[10], d[11], d[12], d[13], d[14], d[15]);
+ }
+ } while(stream.avail_out == 0);
+
+ deflateEnd(&stream);
+
+ fprintf(source, "};\n\n");
+ }
+
+ free(chunk_data);
+ free(font);
+
+ fprintf(source, "static const struct {\n"
+ " size_t length;"
+ " const uint8_t *data;"
+ "} CompressedFontTexture[%d] = {\n", chunks);
+ for(int i = 0; i < chunks; i++) {
+ fprintf(source, " { %d, CompressedFontTextureChunk%d },\n",
+ chunk_output_size[i], i);
+ }
+ fprintf(source, "};\n\n");
+
+ fprintf(source, "struct GlyphProperties {\n"
+ " bool exists:1;\n"
+ " bool isWide:1;\n"
+ "} CodepointProperties[%d] = {\n", codepoint_count);
+ for(int i = 0; i < codepoint_count; i++) {
+ fprintf(source, " { %s, %s },\n",
+ properties[i].exists ? "true" : "false",
+ properties[i].isWide ? "true" : "false");
+ }
+ fprintf(source, "};\n");
+
+ free(properties);
+
+ fclose(source);
+}
--- /dev/null
+O(n*log(n)) assembly of edges into contours
+fix anti-aliased edge bug with filled contours
+crude DXF, HPGL import
+a request to import a plane thing
+make export assemble only contours in same group
+rotation of model view works about z of first point under cursor
+a way to kill a slow operation
+
+-----
+rounding, as a special group
+associative entities from solid model, as a special group
+better level of detail
+some kind of import
+faster triangulation
+loop detection
+IGES export
+incremental regen of entities
+
+